Skip to content

Commit

Permalink
Remove velero generated client, because it's going to be deprecated
Browse files Browse the repository at this point in the history
Signed-off-by: Xun Jiang <[email protected]>
  • Loading branch information
Xun Jiang committed Nov 9, 2023
1 parent 700682b commit e7dd734
Show file tree
Hide file tree
Showing 7 changed files with 118 additions and 115 deletions.
11 changes: 8 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ go 1.21
toolchain go1.21.3

require (
github.com/evanphx/json-patch v5.6.0+incompatible
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0
github.com/pkg/errors v0.9.1
github.com/sirupsen/logrus v1.9.0
Expand All @@ -18,6 +18,11 @@ require (
k8s.io/client-go v0.25.6
)

require (
github.com/google/go-cmp v0.5.9
sigs.k8s.io/controller-runtime v0.12.2
)

require (
cloud.google.com/go v0.110.0 // indirect
cloud.google.com/go/compute v1.19.1 // indirect
Expand Down Expand Up @@ -61,7 +66,6 @@ require (
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/gnostic v0.6.9 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/s2a-go v0.1.2 // indirect
github.com/google/uuid v1.3.0 // indirect
Expand Down Expand Up @@ -102,7 +106,9 @@ require (
github.com/prometheus/common v0.42.0 // indirect
github.com/prometheus/procfs v0.9.0 // indirect
github.com/rs/xid v1.4.0 // indirect
github.com/spf13/afero v1.6.0 // indirect
github.com/spf13/cobra v1.4.0 // indirect
github.com/stretchr/objx v0.5.0 // indirect
github.com/zeebo/blake3 v0.2.3 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/otel v1.14.0 // indirect
Expand Down Expand Up @@ -135,7 +141,6 @@ require (
k8s.io/klog/v2 v2.70.1 // indirect
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect
sigs.k8s.io/controller-runtime v0.12.2 // indirect
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
Expand Down
48 changes: 17 additions & 31 deletions internal/backup/pvc_action.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,27 +18,26 @@ package backup

import (
"context"
"encoding/json"
"fmt"

jsonpatch "github.com/evanphx/json-patch"
snapshotv1api "github.com/kubernetes-csi/external-snapshotter/client/v4/apis/volumesnapshot/v1"
snapshotterClientSet "github.com/kubernetes-csi/external-snapshotter/client/v4/clientset/versioned"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
corev1api "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/kubernetes"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
"sigs.k8s.io/controller-runtime/pkg/client"
crclient "sigs.k8s.io/controller-runtime/pkg/client"

"github.com/vmware-tanzu/velero-plugin-for-csi/internal/util"
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
velerov2alpha1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v2alpha1"
veleroClientSet "github.com/vmware-tanzu/velero/pkg/generated/clientset/versioned"
"github.com/vmware-tanzu/velero/pkg/kuberesource"
"github.com/vmware-tanzu/velero/pkg/label"
"github.com/vmware-tanzu/velero/pkg/plugin/velero"
Expand All @@ -51,7 +50,7 @@ type PVCBackupItemAction struct {
Log logrus.FieldLogger
Client kubernetes.Interface
SnapshotClient snapshotterClientSet.Interface
VeleroClient veleroClientSet.Interface
CRClient crclient.Client
}

// AppliesTo returns information indicating that the PVCBackupItemAction should be invoked to backup PVCs.
Expand Down Expand Up @@ -195,7 +194,7 @@ func (p *PVCBackupItemAction) Execute(item runtime.Unstructured, backup *velerov

dataUploadLog.Info("Starting data upload of backup")

dataUpload, err := createDataUpload(context.Background(), backup, p.VeleroClient, upd, &pvc, operationID)
dataUpload, err := createDataUpload(context.Background(), backup, p.CRClient, upd, &pvc, operationID)
if err != nil {
dataUploadLog.WithError(err).Error("failed to submit DataUpload")
util.DeleteVolumeSnapshotIfAny(context.Background(), p.SnapshotClient, *upd, dataUploadLog)
Expand Down Expand Up @@ -254,7 +253,7 @@ func (p *PVCBackupItemAction) Progress(operationID string, backup *velerov1api.B
return progress, biav2.InvalidOperationIDError(operationID)
}

dataUpload, err := getDataUpload(context.Background(), backup, p.VeleroClient, operationID)
dataUpload, err := getDataUpload(context.Background(), backup, p.CRClient, operationID)
if err != nil {
p.Log.Errorf("fail to get DataUpload for backup %s/%s: %s", backup.Namespace, backup.Name, err.Error())
return progress, err
Expand Down Expand Up @@ -295,13 +294,13 @@ func (p *PVCBackupItemAction) Cancel(operationID string, backup *velerov1api.Bac
return biav2.InvalidOperationIDError(operationID)
}

dataUpload, err := getDataUpload(context.Background(), backup, p.VeleroClient, operationID)
dataUpload, err := getDataUpload(context.Background(), backup, p.CRClient, operationID)
if err != nil {
p.Log.Errorf("fail to get DataUpload for backup %s/%s: %s", backup.Namespace, backup.Name, err.Error())
return err
}

return cancelDataUpload(context.Background(), p.VeleroClient, dataUpload)
return cancelDataUpload(context.Background(), p.CRClient, dataUpload)
}

func newDataUpload(backup *velerov1api.Backup, vs *snapshotv1api.VolumeSnapshot,
Expand Down Expand Up @@ -347,11 +346,11 @@ func newDataUpload(backup *velerov1api.Backup, vs *snapshotv1api.VolumeSnapshot,
return dataUpload
}

func createDataUpload(ctx context.Context, backup *velerov1api.Backup, veleroClient veleroClientSet.Interface,
func createDataUpload(ctx context.Context, backup *velerov1api.Backup, crClient crclient.Client,
vs *snapshotv1api.VolumeSnapshot, pvc *corev1api.PersistentVolumeClaim, operationID string) (*velerov2alpha1.DataUpload, error) {
dataUpload := newDataUpload(backup, vs, pvc, operationID)

dataUpload, err := veleroClient.VeleroV2alpha1().DataUploads(dataUpload.Namespace).Create(ctx, dataUpload, metav1.CreateOptions{})
err := crClient.Create(ctx, dataUpload)
if err != nil {
return nil, errors.Wrap(err, "fail to create DataUpload CR")
}
Expand All @@ -360,10 +359,11 @@ func createDataUpload(ctx context.Context, backup *velerov1api.Backup, veleroCli
}

func getDataUpload(ctx context.Context, backup *velerov1api.Backup,
veleroClient veleroClientSet.Interface, operationID string) (*velerov2alpha1.DataUpload, error) {
listOptions := metav1.ListOptions{LabelSelector: fmt.Sprintf("%s=%s", velerov1api.AsyncOperationIDLabel, operationID)}

dataUploadList, err := veleroClient.VeleroV2alpha1().DataUploads(backup.Namespace).List(context.Background(), listOptions)
crClient crclient.Client, operationID string) (*velerov2alpha1.DataUpload, error) {
dataUploadList := new(velerov2alpha1.DataUploadList)
err := crClient.List(context.Background(), dataUploadList, &crclient.ListOptions{
LabelSelector: labels.SelectorFromSet(map[string]string{velerov1api.AsyncOperationIDLabel: operationID}),
})
if err != nil {
return nil, errors.Wrapf(err, "error to list DataUpload")
}
Expand All @@ -379,27 +379,13 @@ func getDataUpload(ctx context.Context, backup *velerov1api.Backup,
return &dataUploadList.Items[0], nil
}

func cancelDataUpload(ctx context.Context, veleroClient veleroClientSet.Interface,
func cancelDataUpload(ctx context.Context, crClient crclient.Client,
dataUpload *velerov2alpha1.DataUpload) error {
oldData, err := json.Marshal(dataUpload)
if err != nil {
return errors.Wrap(err, "error marshalling original DataUpload")
}

updatedDataUpload := dataUpload.DeepCopy()
updatedDataUpload.Spec.Cancel = true

newData, err := json.Marshal(updatedDataUpload)
if err != nil {
return errors.Wrap(err, "err marshalling updated DataUpload")
}

patchData, err := jsonpatch.CreateMergePatch(oldData, newData)
if err != nil {
return errors.Wrap(err, "error creating patch data for DataUpload")
}

_, err = veleroClient.VeleroV2alpha1().DataUploads(dataUpload.Namespace).Patch(ctx, dataUpload.Name, types.MergePatchType, patchData, metav1.PatchOptions{})
err := crClient.Patch(context.Background(), updatedDataUpload, client.MergeFrom(dataUpload))
if err != nil {
return errors.Wrap(err, "error patch DataUpload")
}
Expand Down
49 changes: 28 additions & 21 deletions internal/backup/pvc_action_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@ package backup

import (
"context"
"fmt"
"testing"
"time"

"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
snapshotv1api "github.com/kubernetes-csi/external-snapshotter/client/v4/apis/volumesnapshot/v1"
v1 "github.com/kubernetes-csi/external-snapshotter/client/v4/apis/volumesnapshot/v1"
snapshotfake "github.com/kubernetes-csi/external-snapshotter/client/v4/clientset/versioned/fake"
Expand All @@ -31,17 +32,19 @@ import (
storagev1 "k8s.io/api/storage/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/kubernetes/fake"
crclient "sigs.k8s.io/controller-runtime/pkg/client"

"github.com/vmware-tanzu/velero-plugin-for-csi/internal/util"
"github.com/vmware-tanzu/velero/pkg/apis/velero/shared"
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
velerov2alpha1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v2alpha1"
"github.com/vmware-tanzu/velero/pkg/builder"
velerofake "github.com/vmware-tanzu/velero/pkg/generated/clientset/versioned/fake"
"github.com/vmware-tanzu/velero/pkg/plugin/velero"
velerotest "github.com/vmware-tanzu/velero/pkg/test"
"github.com/vmware-tanzu/velero/pkg/util/boolptr"
)

Expand Down Expand Up @@ -135,7 +138,7 @@ func TestExecute(t *testing.T) {
t.Run(tc.name, func(*testing.T) {
client := fake.NewSimpleClientset()
snapshotClient := snapshotfake.NewSimpleClientset()
veleroClient := velerofake.NewSimpleClientset()
crClient := velerotest.NewFakeControllerRuntimeClient(t)
logger := logrus.New()
logger.Level = logrus.DebugLevel

Expand All @@ -160,7 +163,7 @@ func TestExecute(t *testing.T) {
Log: logger,
Client: client,
SnapshotClient: snapshotClient,
VeleroClient: veleroClient,
CRClient: crClient,
}

pvcMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&tc.pvc)
Expand Down Expand Up @@ -197,16 +200,17 @@ func TestExecute(t *testing.T) {
}

if tc.expectedDataUpload != nil {
dataUploadList, err := veleroClient.VeleroV2alpha1().DataUploads(tc.backup.Namespace).List(context.Background(), metav1.ListOptions{LabelSelector: fmt.Sprintf("%s=%s", velerov1api.BackupNameLabel, tc.backup.Name)})
dataUploadList := new(velerov2alpha1.DataUploadList)
err := crClient.List(context.Background(), dataUploadList, &crclient.ListOptions{LabelSelector: labels.SelectorFromSet(map[string]string{velerov1api.BackupNameLabel: tc.backup.Name})})
require.NoError(t, err)
require.Equal(t, 1, len(dataUploadList.Items))
require.Equal(t, *tc.expectedDataUpload, dataUploadList.Items[0])
require.True(t, cmp.Equal(tc.expectedDataUpload, &dataUploadList.Items[0], cmpopts.IgnoreFields(velerov2alpha1.DataUpload{}, "ResourceVersion", "Name")))
}

if tc.expectedPVC != nil {
resultPVC := new(corev1.PersistentVolumeClaim)
runtime.DefaultUnstructuredConverter.FromUnstructured(resultUnstructed.UnstructuredContent(), resultPVC)
require.Equal(t, *tc.expectedPVC, *resultPVC)
require.True(t, cmp.Equal(tc.expectedPVC, resultPVC, cmpopts.IgnoreFields(corev1.PersistentVolumeClaim{}, "Annotations")))
}
})
}
Expand All @@ -217,7 +221,7 @@ func TestProgress(t *testing.T) {
tests := []struct {
name string
backup *velerov1api.Backup
dataUpload velerov2alpha1.DataUpload
dataUpload *velerov2alpha1.DataUpload
operationID string
expectedErr string
expectedProgress velero.OperationProgress
Expand All @@ -231,7 +235,7 @@ func TestProgress(t *testing.T) {
{
name: "DataUpload is found",
backup: builder.ForBackup("velero", "test").Result(),
dataUpload: velerov2alpha1.DataUpload{
dataUpload: &velerov2alpha1.DataUpload{
TypeMeta: metav1.TypeMeta{
Kind: "DataUpload",
APIVersion: "v2alpha1",
Expand Down Expand Up @@ -272,24 +276,26 @@ func TestProgress(t *testing.T) {
t.Run(tc.name, func(*testing.T) {
client := fake.NewSimpleClientset()
snapshotClient := snapshotfake.NewSimpleClientset()
veleroClient := velerofake.NewSimpleClientset()
crClient := velerotest.NewFakeControllerRuntimeClient(t)
logger := logrus.New()

pvcBIA := PVCBackupItemAction{
Log: logger,
Client: client,
SnapshotClient: snapshotClient,
VeleroClient: veleroClient,
CRClient: crClient,
}

_, err := veleroClient.VeleroV2alpha1().DataUploads(tc.dataUpload.Namespace).Create(context.Background(), &tc.dataUpload, metav1.CreateOptions{})
require.NoError(t, err)
if tc.dataUpload != nil {
err := crClient.Create(context.Background(), tc.dataUpload)
require.NoError(t, err)
}

progress, err := pvcBIA.Progress(tc.operationID, tc.backup)
if tc.expectedErr != "" {
require.Equal(t, tc.expectedErr, err.Error())
}
require.Equal(t, tc.expectedProgress, progress)
require.True(t, cmp.Equal(tc.expectedProgress, progress, cmpopts.IgnoreFields(velero.OperationProgress{}, "Started", "Updated")))
})
}
}
Expand All @@ -309,7 +315,7 @@ func TestCancel(t *testing.T) {
dataUpload: velerov2alpha1.DataUpload{
TypeMeta: metav1.TypeMeta{
Kind: "DataUpload",
APIVersion: "v2alpha1",
APIVersion: velerov2alpha1.SchemeGroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Namespace: "velero",
Expand All @@ -324,7 +330,7 @@ func TestCancel(t *testing.T) {
expectedDataUpload: velerov2alpha1.DataUpload{
TypeMeta: metav1.TypeMeta{
Kind: "DataUpload",
APIVersion: "v2alpha1",
APIVersion: velerov2alpha1.SchemeGroupVersion.String(),
},
ObjectMeta: metav1.ObjectMeta{
Namespace: "velero",
Expand All @@ -344,28 +350,29 @@ func TestCancel(t *testing.T) {
t.Run(tc.name, func(*testing.T) {
client := fake.NewSimpleClientset()
snapshotClient := snapshotfake.NewSimpleClientset()
veleroClient := velerofake.NewSimpleClientset()
crClient := velerotest.NewFakeControllerRuntimeClient(t)
logger := logrus.New()

pvcBIA := PVCBackupItemAction{
Log: logger,
Client: client,
SnapshotClient: snapshotClient,
VeleroClient: veleroClient,
CRClient: crClient,
}

_, err := veleroClient.VeleroV2alpha1().DataUploads(tc.dataUpload.Namespace).Create(context.Background(), &tc.dataUpload, metav1.CreateOptions{})
err := crClient.Create(context.Background(), &tc.dataUpload)
require.NoError(t, err)

err = pvcBIA.Cancel(tc.operationID, tc.backup)
if tc.expectedErr != nil {
require.Equal(t, err, tc.expectedErr)
}

du, err := veleroClient.VeleroV2alpha1().DataUploads(tc.dataUpload.Namespace).Get(context.Background(), tc.dataUpload.Name, metav1.GetOptions{})
du := new(velerov2alpha1.DataUpload)
err = crClient.Get(context.Background(), crclient.ObjectKey{Namespace: tc.dataUpload.Namespace, Name: tc.dataUpload.Name}, du)
require.NoError(t, err)

require.Equal(t, *du, tc.expectedDataUpload)
require.True(t, cmp.Equal(tc.expectedDataUpload, *du, cmpopts.IgnoreFields(velerov2alpha1.DataUpload{}, "ResourceVersion")))
})
}
}
Loading

0 comments on commit e7dd734

Please sign in to comment.