volume snapshot
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
package persistentvolumeclaim
|
||||
|
||||
import (
|
||||
snapshotinformer "github.com/kubernetes-csi/external-snapshotter/v2/pkg/client/informers/externalversions"
|
||||
"k8s.io/client-go/informers"
|
||||
"kubesphere.io/kubesphere/pkg/models/resources/v1alpha2"
|
||||
"strconv"
|
||||
@@ -36,11 +37,15 @@ const (
|
||||
)
|
||||
|
||||
type persistentVolumeClaimSearcher struct {
|
||||
informers informers.SharedInformerFactory
|
||||
informers informers.SharedInformerFactory
|
||||
snapshotInformers snapshotinformer.SharedInformerFactory
|
||||
}
|
||||
|
||||
func NewPersistentVolumeClaimSearcher(informers informers.SharedInformerFactory) v1alpha2.Interface {
|
||||
return &persistentVolumeClaimSearcher{informers: informers}
|
||||
func NewPersistentVolumeClaimSearcher(informers informers.SharedInformerFactory, snapshotInformer snapshotinformer.SharedInformerFactory) v1alpha2.Interface {
|
||||
return &persistentVolumeClaimSearcher{
|
||||
informers: informers,
|
||||
snapshotInformers: snapshotInformer,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *persistentVolumeClaimSearcher) Get(namespace, name string) (interface{}, error) {
|
||||
@@ -117,11 +122,12 @@ func (s *persistentVolumeClaimSearcher) Search(namespace string, conditions *par
|
||||
r := make([]interface{}, 0)
|
||||
for _, i := range result {
|
||||
inUse := s.countPods(i.Name, i.Namespace)
|
||||
isSnapshotAllow := s.isSnapshotAllowed(i.GetAnnotations()["volume.beta.kubernetes.io/storage-provisioner"])
|
||||
if i.Annotations == nil {
|
||||
i.Annotations = make(map[string]string)
|
||||
}
|
||||
i.Annotations["kubesphere.io/in-use"] = strconv.FormatBool(inUse)
|
||||
|
||||
i.Annotations["kubesphere.io/allow-snapshot"] = strconv.FormatBool(isSnapshotAllow)
|
||||
r = append(r, i)
|
||||
}
|
||||
return r, nil
|
||||
@@ -142,3 +148,19 @@ func (s *persistentVolumeClaimSearcher) countPods(name, namespace string) bool {
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func (s *persistentVolumeClaimSearcher) isSnapshotAllowed(provisioner string) bool {
|
||||
if len(provisioner) == 0 {
|
||||
return false
|
||||
}
|
||||
volumeSnapshotClasses, err := s.snapshotInformers.Snapshot().V1beta1().VolumeSnapshotClasses().Lister().List(labels.Everything())
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
for _, volumeSnapshotClass := range volumeSnapshotClasses {
|
||||
if volumeSnapshotClass.Driver == provisioner {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ package resource
|
||||
|
||||
import (
|
||||
"github.com/google/go-cmp/cmp"
|
||||
fakesnapshot "github.com/kubernetes-csi/external-snapshotter/v2/pkg/client/clientset/versioned/fake"
|
||||
fakeapp "github.com/kubernetes-sigs/application/pkg/client/clientset/versioned/fake"
|
||||
fakeistio "istio.io/client-go/pkg/clientset/versioned/fake"
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
@@ -215,7 +216,8 @@ func prepare() (informers.InformerFactory, error) {
|
||||
k8sClient := fakek8s.NewSimpleClientset()
|
||||
istioClient := fakeistio.NewSimpleClientset()
|
||||
appClient := fakeapp.NewSimpleClientset()
|
||||
fakeInformerFactory := informers.NewInformerFactories(k8sClient, ksClient, istioClient, appClient)
|
||||
snapshotClient := fakesnapshot.NewSimpleClientset()
|
||||
fakeInformerFactory := informers.NewInformerFactories(k8sClient, ksClient, istioClient, appClient, snapshotClient)
|
||||
|
||||
k8sInformerFactory := fakeInformerFactory.KubernetesSharedInformerFactory()
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ func NewResourceGetter(factory informers.InformerFactory) *ResourceGetter {
|
||||
resourceGetters[v1alpha2.Deployments] = deployment.NewDeploymentSetSearcher(factory.KubernetesSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.Ingresses] = ingress.NewIngressSearcher(factory.KubernetesSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.Jobs] = job.NewJobSearcher(factory.KubernetesSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.PersistentVolumeClaims] = persistentvolumeclaim.NewPersistentVolumeClaimSearcher(factory.KubernetesSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.PersistentVolumeClaims] = persistentvolumeclaim.NewPersistentVolumeClaimSearcher(factory.KubernetesSharedInformerFactory(), factory.SnapshotSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.Secrets] = secret.NewSecretSearcher(factory.KubernetesSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.Services] = service.NewServiceSearcher(factory.KubernetesSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.StatefulSets] = statefulset.NewStatefulSetSearcher(factory.KubernetesSharedInformerFactory())
|
||||
@@ -79,7 +79,7 @@ func NewResourceGetter(factory informers.InformerFactory) *ResourceGetter {
|
||||
resourceGetters[v1alpha2.Nodes] = node.NewNodeSearcher(factory.KubernetesSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.Namespaces] = namespace.NewNamespaceSearcher(factory.KubernetesSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.ClusterRoles] = clusterrole.NewClusterRoleSearcher(factory.KubernetesSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.StorageClasses] = storageclass.NewStorageClassesSearcher(factory.KubernetesSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.StorageClasses] = storageclass.NewStorageClassesSearcher(factory.KubernetesSharedInformerFactory(), factory.SnapshotSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.HorizontalPodAutoscalers] = hpa.NewHpaSearcher(factory.KubernetesSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.S2iBuilders] = s2ibuilder.NewS2iBuilderSearcher(factory.KubeSphereSharedInformerFactory())
|
||||
resourceGetters[v1alpha2.S2iRuns] = s2irun.NewS2iRunSearcher(factory.KubeSphereSharedInformerFactory())
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
package storageclass
|
||||
|
||||
import (
|
||||
snapshotinformer "github.com/kubernetes-csi/external-snapshotter/v2/pkg/client/informers/externalversions"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"k8s.io/api/storage/v1"
|
||||
"k8s.io/apimachinery/pkg/labels"
|
||||
@@ -25,14 +26,19 @@ import (
|
||||
"kubesphere.io/kubesphere/pkg/models/resources/v1alpha2"
|
||||
"kubesphere.io/kubesphere/pkg/server/params"
|
||||
"sort"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type storageClassesSearcher struct {
|
||||
informers informers.SharedInformerFactory
|
||||
informers informers.SharedInformerFactory
|
||||
snapshotInformers snapshotinformer.SharedInformerFactory
|
||||
}
|
||||
|
||||
func NewStorageClassesSearcher(informers informers.SharedInformerFactory) v1alpha2.Interface {
|
||||
return &storageClassesSearcher{informers: informers}
|
||||
func NewStorageClassesSearcher(informers informers.SharedInformerFactory, snapshotInformer snapshotinformer.SharedInformerFactory) v1alpha2.Interface {
|
||||
return &storageClassesSearcher{
|
||||
informers: informers,
|
||||
snapshotInformers: snapshotInformer,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *storageClassesSearcher) Get(namespace, name string) (interface{}, error) {
|
||||
@@ -85,9 +91,11 @@ func (s *storageClassesSearcher) Search(namespace string, conditions *params.Con
|
||||
r := make([]interface{}, 0)
|
||||
for _, i := range result {
|
||||
count := s.countPersistentVolumeClaims(i.Name)
|
||||
isSnapshotAllow := s.isSnapshotAllowed(i.Provisioner)
|
||||
if i.Annotations == nil {
|
||||
i.Annotations = make(map[string]string)
|
||||
i.Annotations["kubesphere.io/pvc-count"] = string(count)
|
||||
i.Annotations["kubesphere.io/allow-snapshot"] = strconv.FormatBool(isSnapshotAllow)
|
||||
}
|
||||
|
||||
r = append(r, i)
|
||||
@@ -110,3 +118,20 @@ func (s *storageClassesSearcher) countPersistentVolumeClaims(name string) int {
|
||||
|
||||
return count
|
||||
}
|
||||
|
||||
func (s *storageClassesSearcher) isSnapshotAllowed(provisioner string) bool {
|
||||
if len(provisioner) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
volumeSnapshotClasses, err := s.snapshotInformers.Snapshot().V1beta1().VolumeSnapshotClasses().Lister().List(labels.Everything())
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
for _, volumeSnapshotClass := range volumeSnapshotClasses {
|
||||
if volumeSnapshotClass.Driver == provisioner {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user