From 2e34bdf9a2a1cfc3428a6ce18d83fb55d8290cb8 Mon Sep 17 00:00:00 2001 From: f10atin9 Date: Thu, 3 Mar 2022 15:55:32 +0800 Subject: [PATCH 1/4] Add "snapshot-count" annotation for volumesnapshotClass Signed-off-by: f10atin9 --- .../volumesnapshotclass.go | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go b/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go index 7e480aac6..e9982a54e 100644 --- a/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go +++ b/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go @@ -17,8 +17,11 @@ limitations under the License. package volumesnapshotclass import ( + "strconv" "strings" + "k8s.io/apimachinery/pkg/labels" + v1 "github.com/kubernetes-csi/external-snapshotter/client/v4/apis/volumesnapshot/v1" "github.com/kubernetes-csi/external-snapshotter/client/v4/informers/externalversions" "k8s.io/apimachinery/pkg/runtime" @@ -53,6 +56,11 @@ func (v *volumeSnapshotClassGetter) List(namespace string, query *query.Query) ( var result []runtime.Object for _, snapshotClass := range all { + count := v.countVolumeSnapshots(snapshotClass.Name) + if snapshotClass.Annotations == nil { + snapshotClass.Annotations = make(map[string]string) + } + snapshotClass.Annotations["kubesphere.io/snapshot-count"] = strconv.Itoa(count) result = append(result, snapshotClass) } @@ -86,3 +94,18 @@ func (v *volumeSnapshotClassGetter) filter(object runtime.Object, filter query.F return v1alpha3.DefaultObjectMetaFilter(snapshotClass.ObjectMeta, filter) } } + +func (v *volumeSnapshotClassGetter) countVolumeSnapshots(name string) int { + snapshots, err := v.informers.Snapshot().V1().VolumeSnapshots().Lister().VolumeSnapshots("").List(labels.Everything()) + if err != nil { + return 0 + } + var count int + + for _, snapshot := range snapshots { + if snapshot.Spec.VolumeSnapshotClassName != nil && *snapshot.Spec.VolumeSnapshotClassName == name { + count++ + } + } + return count +} From 902997b207ed299aebe2ed20332e05fbfa90008d Mon Sep 17 00:00:00 2001 From: f10atin9 Date: Wed, 9 Mar 2022 11:14:26 +0800 Subject: [PATCH 2/4] Fix: add deepcopy Signed-off-by: f10atin9 --- .../v1alpha3/volumesnapshotclass/volumesnapshotclass.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go b/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go index e9982a54e..a2d695731 100644 --- a/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go +++ b/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go @@ -56,6 +56,7 @@ func (v *volumeSnapshotClassGetter) List(namespace string, query *query.Query) ( var result []runtime.Object for _, snapshotClass := range all { + snapshotClass = snapshotClass.DeepCopy() count := v.countVolumeSnapshots(snapshotClass.Name) if snapshotClass.Annotations == nil { snapshotClass.Annotations = make(map[string]string) From d224df444c4523593b9a3703e3193c04d21fc5f4 Mon Sep 17 00:00:00 2001 From: f10atin9 Date: Wed, 9 Mar 2022 14:07:39 +0800 Subject: [PATCH 3/4] Fix: Modified the function to get the list of snapshots in countVolumeSnapshots. Signed-off-by: f10atin9 --- .../v1alpha3/volumesnapshotclass/volumesnapshotclass.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go b/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go index a2d695731..7a00c8fb0 100644 --- a/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go +++ b/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass.go @@ -97,7 +97,7 @@ func (v *volumeSnapshotClassGetter) filter(object runtime.Object, filter query.F } func (v *volumeSnapshotClassGetter) countVolumeSnapshots(name string) int { - snapshots, err := v.informers.Snapshot().V1().VolumeSnapshots().Lister().VolumeSnapshots("").List(labels.Everything()) + snapshots, err := v.informers.Snapshot().V1().VolumeSnapshots().Lister().List(labels.Everything()) if err != nil { return 0 } From d871f0e6ee706ff4dd35b8ec2cf8dc5bfe5227ad Mon Sep 17 00:00:00 2001 From: f10atin9 Date: Wed, 9 Mar 2022 14:59:55 +0800 Subject: [PATCH 4/4] Test: update ListVolumeSnapshotClassTest Signed-off-by: f10atin9 --- .../volumesnapshotclass_test.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass_test.go b/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass_test.go index 26383a113..fe66492ab 100644 --- a/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass_test.go +++ b/pkg/models/resources/v1alpha3/volumesnapshotclass/volumesnapshotclass_test.go @@ -72,6 +72,18 @@ func TestListVolumeSnapshotClass(t *testing.T) { snapshotClass3.CreationTimestamp = v1.NewTime(snapshotClass1.CreationTimestamp.Add(time.Hour * 3)) snapshotClass3.DeletionPolicy = snapshotv1.VolumeSnapshotContentRetain + sc1Expected := snapshotClass1.DeepCopy() + sc1Expected.Annotations = make(map[string]string) + sc1Expected.Annotations["kubesphere.io/snapshot-count"] = "0" + + sc2Expected := snapshotClass2.DeepCopy() + sc2Expected.Annotations = make(map[string]string) + sc2Expected.Annotations["kubesphere.io/snapshot-count"] = "0" + + sc3Expected := snapshotClass3.DeepCopy() + sc3Expected.Annotations = make(map[string]string) + sc3Expected.Annotations["kubesphere.io/snapshot-count"] = "0" + volumeSnapshotClasses := []interface{}{snapshotClass1, snapshotClass2, snapshotClass3} for _, s := range volumeSnapshotClasses { @@ -86,7 +98,7 @@ func TestListVolumeSnapshotClass(t *testing.T) { snapshotClassList, err := getter.List("", query1) Expect(err).To(BeNil()) Expect(snapshotClassList.TotalItems).To(Equal(1)) - Expect(snapshotClassList.Items[0]).To(Equal(snapshotClass1)) + Expect(snapshotClassList.Items[0]).To(Equal(sc1Expected)) }) It("match driver", func() { @@ -95,7 +107,7 @@ func TestListVolumeSnapshotClass(t *testing.T) { snapshotClassList, err := getter.List("", query1) Expect(err).To(BeNil()) Expect(snapshotClassList.TotalItems).To(Equal(1)) - Expect(snapshotClassList.Items[0]).To(Equal(snapshotClass2)) + Expect(snapshotClassList.Items[0]).To(Equal(sc2Expected)) }) It("match deletionPolicy", func() { @@ -104,7 +116,7 @@ func TestListVolumeSnapshotClass(t *testing.T) { snapshotClassList, err := getter.List("", query1) Expect(err).To(BeNil()) Expect(snapshotClassList.TotalItems).To(Equal(1)) - Expect(snapshotClassList.Items[0]).To(Equal(snapshotClass3)) + Expect(snapshotClassList.Items[0]).To(Equal(sc3Expected)) }) })