From 56b5e982d9341a414d64d82c8157488bbfd0ef8b Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 2 Nov 2023 15:29:37 +0800 Subject: [PATCH] Remove dependency of generated client part 3 Replace generated discovery client with client-go client. Remove generated client from PVR action. Remove generated client from pkg/cmd directory. Delete velero generate client from client factory. Signed-off-by: Xun Jiang --- changelogs/unreleased/7051-blackpiglet | 1 + pkg/client/factory.go | 17 ---- pkg/client/factory_test.go | 5 - pkg/client/mocks/Factory.go | 39 ++------ pkg/cmd/cli/debug/debug.go | 27 +++--- pkg/cmd/cli/repo/get.go | 14 ++- pkg/cmd/cli/restore/logs.go | 8 +- pkg/cmd/cli/schedule/create.go | 4 +- pkg/cmd/cli/schedule/describe.go | 14 ++- pkg/cmd/cli/schedule/get.go | 14 ++- pkg/cmd/cli/schedule/pause.go | 19 ++-- pkg/cmd/server/plugin/plugin.go | 4 +- pkg/cmd/server/server.go | 13 +-- pkg/discovery/helper_test.go | 47 +++------- pkg/discovery/mocks/Helper.go | 92 ++----------------- pkg/restore/pod_volume_restore_action.go | 24 ++--- pkg/restore/pod_volume_restore_action_test.go | 18 +--- pkg/test/api_server.go | 5 - test/pkg/client/factory.go | 17 ---- 19 files changed, 121 insertions(+), 261 deletions(-) create mode 100644 changelogs/unreleased/7051-blackpiglet diff --git a/changelogs/unreleased/7051-blackpiglet b/changelogs/unreleased/7051-blackpiglet new file mode 100644 index 000000000..5b930f77f --- /dev/null +++ b/changelogs/unreleased/7051-blackpiglet @@ -0,0 +1 @@ +Remove dependency of generated client part 3. \ No newline at end of file diff --git a/pkg/client/factory.go b/pkg/client/factory.go index 5c1ffc545..9ff2040c6 100644 --- a/pkg/client/factory.go +++ b/pkg/client/factory.go @@ -33,7 +33,6 @@ import ( velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" velerov2alpha1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v2alpha1" - clientset "github.com/vmware-tanzu/velero/pkg/generated/clientset/versioned" ) //go:generate mockery --name Factory @@ -42,9 +41,6 @@ import ( type Factory interface { // BindFlags binds common flags (--kubeconfig, --namespace) to the passed-in FlagSet. BindFlags(flags *pflag.FlagSet) - // Client returns a VeleroClient. It uses the following priority to specify the cluster - // configuration: --kubeconfig flag, KUBECONFIG environment variable, in-cluster configuration. - Client() (clientset.Interface, error) // KubeClient returns a Kubernetes client. It uses the following priority to specify the cluster // configuration: --kubeconfig flag, KUBECONFIG environment variable, in-cluster configuration. KubeClient() (kubernetes.Interface, error) @@ -115,19 +111,6 @@ func (f *factory) ClientConfig() (*rest.Config, error) { return Config(f.kubeconfig, f.kubecontext, f.baseName, f.clientQPS, f.clientBurst) } -func (f *factory) Client() (clientset.Interface, error) { - clientConfig, err := f.ClientConfig() - if err != nil { - return nil, err - } - - veleroClient, err := clientset.NewForConfig(clientConfig) - if err != nil { - return nil, errors.WithStack(err) - } - return veleroClient, nil -} - func (f *factory) KubeClient() (kubernetes.Interface, error) { clientConfig, err := f.ClientConfig() if err != nil { diff --git a/pkg/client/factory_test.go b/pkg/client/factory_test.go index 547be6bff..50df1c816 100644 --- a/pkg/client/factory_test.go +++ b/pkg/client/factory_test.go @@ -112,11 +112,6 @@ func TestFactory(t *testing.T) { assert.Equal(t, test.burst, clientConfig.Burst) strings.Contains(clientConfig.UserAgent, test.baseName) - client, _ := f.Client() - _, e := client.Discovery().ServerGroups() - assert.Contains(t, e.Error(), fmt.Sprintf("Get \"%s/api?timeout=", test.expectedHost)) - assert.NotNil(t, client) - kubeClient, _ := f.KubeClient() group := kubeClient.NodeV1().RESTClient().APIVersion().Group assert.NotNil(t, kubeClient) diff --git a/pkg/client/mocks/Factory.go b/pkg/client/mocks/Factory.go index 3bd016047..1bec839cd 100644 --- a/pkg/client/mocks/Factory.go +++ b/pkg/client/mocks/Factory.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.30.1. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks @@ -13,8 +13,6 @@ import ( pkgclient "sigs.k8s.io/controller-runtime/pkg/client" rest "k8s.io/client-go/rest" - - versioned "github.com/vmware-tanzu/velero/pkg/generated/clientset/versioned" ) // Factory is an autogenerated mock type for the Factory type @@ -27,32 +25,6 @@ func (_m *Factory) BindFlags(flags *pflag.FlagSet) { _m.Called(flags) } -// Client provides a mock function with given fields: -func (_m *Factory) Client() (versioned.Interface, error) { - ret := _m.Called() - - var r0 versioned.Interface - var r1 error - if rf, ok := ret.Get(0).(func() (versioned.Interface, error)); ok { - return rf() - } - if rf, ok := ret.Get(0).(func() versioned.Interface); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(versioned.Interface) - } - } - - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // ClientConfig provides a mock function with given fields: func (_m *Factory) ClientConfig() (*rest.Config, error) { ret := _m.Called() @@ -212,12 +184,13 @@ func (_m *Factory) SetClientQPS(_a0 float32) { _m.Called(_a0) } -// NewFactory creates a new instance of Factory. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewFactory(t interface { +type mockConstructorTestingTNewFactory interface { mock.TestingT Cleanup(func()) -}) *Factory { +} + +// NewFactory creates a new instance of Factory. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewFactory(t mockConstructorTestingTNewFactory) *Factory { mock := &Factory{} mock.Mock.Test(t) diff --git a/pkg/cmd/cli/debug/debug.go b/pkg/cmd/cli/debug/debug.go index 7c55c0f58..f54ee9571 100644 --- a/pkg/cmd/cli/debug/debug.go +++ b/pkg/cmd/cli/debug/debug.go @@ -30,9 +30,12 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/vmware-tanzu/crash-diagnostics/exec" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + appsv1 "k8s.io/api/apps/v1" + "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/clientcmd" + ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" + velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" "github.com/vmware-tanzu/velero/pkg/client" "github.com/vmware-tanzu/velero/pkg/cmd" ) @@ -110,30 +113,32 @@ func (o *option) complete(f client.Factory, fs *pflag.FlagSet) error { } func (o *option) validate(f client.Factory) error { - kubeClient, err := f.KubeClient() + crClient, err := f.KubebuilderClient() if err != nil { return err } - l, err := kubeClient.AppsV1().Deployments(o.namespace).List(context.TODO(), metav1.ListOptions{ - LabelSelector: "component=velero", + deploymentList := new(appsv1.DeploymentList) + selector, err := labels.Parse("component=velero") + cmd.CheckError(err) + err = crClient.List(context.TODO(), deploymentList, &ctrlclient.ListOptions{ + Namespace: o.namespace, + LabelSelector: selector, }) if err != nil { return errors.Wrap(err, "failed to check velero deployment") } - if len(l.Items) == 0 { + if len(deploymentList.Items) == 0 { return fmt.Errorf("velero deployment does not exist in namespace: %s", o.namespace) } - veleroClient, err := f.Client() - if err != nil { - return err - } if len(o.backup) > 0 { - if _, err := veleroClient.VeleroV1().Backups(o.namespace).Get(context.TODO(), o.backup, metav1.GetOptions{}); err != nil { + backup := new(velerov1api.Backup) + if err := crClient.Get(context.TODO(), ctrlclient.ObjectKey{Namespace: o.namespace, Name: o.backup}, backup); err != nil { return err } } if len(o.restore) > 0 { - if _, err := veleroClient.VeleroV1().Restores(o.namespace).Get(context.TODO(), o.restore, metav1.GetOptions{}); err != nil { + restore := new(velerov1api.Restore) + if err := crClient.Get(context.TODO(), ctrlclient.ObjectKey{Namespace: o.namespace, Name: o.restore}, restore); err != nil { return err } } diff --git a/pkg/cmd/cli/repo/get.go b/pkg/cmd/cli/repo/get.go index 3a730c103..290e2e2ac 100644 --- a/pkg/cmd/cli/repo/get.go +++ b/pkg/cmd/cli/repo/get.go @@ -21,6 +21,8 @@ import ( "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" "github.com/vmware-tanzu/velero/pkg/client" @@ -38,19 +40,25 @@ func NewGetCommand(f client.Factory, use string) *cobra.Command { err := output.ValidateFlags(c) cmd.CheckError(err) - veleroClient, err := f.Client() + crClient, err := f.KubebuilderClient() cmd.CheckError(err) var repos *api.BackupRepositoryList if len(args) > 0 { repos = new(api.BackupRepositoryList) for _, name := range args { - repo, err := veleroClient.VeleroV1().BackupRepositories(f.Namespace()).Get(context.TODO(), name, metav1.GetOptions{}) + repo := new(api.BackupRepository) + err := crClient.Get(context.TODO(), ctrlclient.ObjectKey{Namespace: f.Namespace(), Name: name}, repo) cmd.CheckError(err) repos.Items = append(repos.Items, *repo) } } else { - repos, err = veleroClient.VeleroV1().BackupRepositories(f.Namespace()).List(context.TODO(), listOptions) + selector := labels.NewSelector() + if listOptions.LabelSelector != "" { + selector, err = labels.Parse(listOptions.LabelSelector) + cmd.CheckError(err) + } + err = crClient.List(context.TODO(), repos, &ctrlclient.ListOptions{LabelSelector: selector}) cmd.CheckError(err) } diff --git a/pkg/cmd/cli/restore/logs.go b/pkg/cmd/cli/restore/logs.go index d721f324d..e88945868 100644 --- a/pkg/cmd/cli/restore/logs.go +++ b/pkg/cmd/cli/restore/logs.go @@ -24,7 +24,7 @@ import ( "github.com/spf13/cobra" apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" "github.com/vmware-tanzu/velero/pkg/client" @@ -49,13 +49,11 @@ func NewLogsCommand(f client.Factory) *cobra.Command { Run: func(c *cobra.Command, args []string) { restoreName := args[0] - veleroClient, err := f.Client() - cmd.CheckError(err) - kbClient, err := f.KubebuilderClient() cmd.CheckError(err) - restore, err := veleroClient.VeleroV1().Restores(f.Namespace()).Get(context.TODO(), restoreName, metav1.GetOptions{}) + restore := new(velerov1api.Restore) + err = kbClient.Get(context.TODO(), ctrlclient.ObjectKey{Namespace: f.Namespace(), Name: restoreName}, restore) if apierrors.IsNotFound(err) { cmd.Exit("Restore %q does not exist.", restoreName) } else if err != nil { diff --git a/pkg/cmd/cli/schedule/create.go b/pkg/cmd/cli/schedule/create.go index 4fc40e814..85f53acc3 100644 --- a/pkg/cmd/cli/schedule/create.go +++ b/pkg/cmd/cli/schedule/create.go @@ -115,7 +115,7 @@ func (o *CreateOptions) Complete(args []string, f client.Factory) error { func (o *CreateOptions) Run(c *cobra.Command, f client.Factory) error { var orders map[string]string - veleroClient, err := f.Client() + crClient, err := f.KubebuilderClient() if err != nil { return err } @@ -171,7 +171,7 @@ func (o *CreateOptions) Run(c *cobra.Command, f client.Factory) error { return err } - _, err = veleroClient.VeleroV1().Schedules(schedule.Namespace).Create(context.TODO(), schedule, metav1.CreateOptions{}) + err = crClient.Create(context.TODO(), schedule) if err != nil { return err } diff --git a/pkg/cmd/cli/schedule/describe.go b/pkg/cmd/cli/schedule/describe.go index b43cad45f..823f2edd1 100644 --- a/pkg/cmd/cli/schedule/describe.go +++ b/pkg/cmd/cli/schedule/describe.go @@ -22,6 +22,8 @@ import ( "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" v1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" "github.com/vmware-tanzu/velero/pkg/client" @@ -36,19 +38,25 @@ func NewDescribeCommand(f client.Factory, use string) *cobra.Command { Use: use + " [NAME1] [NAME2] [NAME...]", Short: "Describe schedules", Run: func(c *cobra.Command, args []string) { - veleroClient, err := f.Client() + crClient, err := f.KubebuilderClient() cmd.CheckError(err) var schedules *v1.ScheduleList if len(args) > 0 { schedules = new(v1.ScheduleList) for _, name := range args { - schedule, err := veleroClient.VeleroV1().Schedules(f.Namespace()).Get(context.TODO(), name, metav1.GetOptions{}) + schedule := new(v1.Schedule) + err := crClient.Get(context.TODO(), ctrlclient.ObjectKey{Namespace: f.Namespace(), Name: name}, schedule) cmd.CheckError(err) schedules.Items = append(schedules.Items, *schedule) } } else { - schedules, err = veleroClient.VeleroV1().Schedules(f.Namespace()).List(context.TODO(), listOptions) + selector := labels.NewSelector() + if listOptions.LabelSelector != "" { + selector, err = labels.Parse(listOptions.LabelSelector) + cmd.CheckError(err) + } + err = crClient.List(context.TODO(), schedules, &ctrlclient.ListOptions{LabelSelector: selector}) cmd.CheckError(err) } diff --git a/pkg/cmd/cli/schedule/get.go b/pkg/cmd/cli/schedule/get.go index 4a20da630..a16ae8fe6 100644 --- a/pkg/cmd/cli/schedule/get.go +++ b/pkg/cmd/cli/schedule/get.go @@ -21,6 +21,8 @@ import ( "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" "github.com/vmware-tanzu/velero/pkg/client" @@ -38,19 +40,25 @@ func NewGetCommand(f client.Factory, use string) *cobra.Command { err := output.ValidateFlags(c) cmd.CheckError(err) - veleroClient, err := f.Client() + crClient, err := f.KubebuilderClient() cmd.CheckError(err) var schedules *api.ScheduleList if len(args) > 0 { schedules = new(api.ScheduleList) for _, name := range args { - schedule, err := veleroClient.VeleroV1().Schedules(f.Namespace()).Get(context.TODO(), name, metav1.GetOptions{}) + schedule := new(api.Schedule) + err := crClient.Get(context.TODO(), ctrlclient.ObjectKey{Name: name, Namespace: f.Namespace()}, schedule) cmd.CheckError(err) schedules.Items = append(schedules.Items, *schedule) } } else { - schedules, err = veleroClient.VeleroV1().Schedules(f.Namespace()).List(context.TODO(), listOptions) + selector := labels.NewSelector() + if listOptions.LabelSelector != "" { + selector, err = labels.Parse(listOptions.LabelSelector) + cmd.CheckError(err) + } + err := crClient.List(context.TODO(), schedules, &ctrlclient.ListOptions{LabelSelector: selector}) cmd.CheckError(err) } diff --git a/pkg/cmd/cli/schedule/pause.go b/pkg/cmd/cli/schedule/pause.go index 541fe6865..decda8260 100644 --- a/pkg/cmd/cli/schedule/pause.go +++ b/pkg/cmd/cli/schedule/pause.go @@ -25,6 +25,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" kubeerrs "k8s.io/apimachinery/pkg/util/errors" + ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" "github.com/vmware-tanzu/velero/pkg/client" @@ -63,7 +64,7 @@ func NewPauseCommand(f client.Factory, use string) *cobra.Command { } func runPause(f client.Factory, o *cli.SelectOptions, paused bool) error { - client, err := f.Client() + crClient, err := f.KubebuilderClient() if err != nil { return err } @@ -75,7 +76,8 @@ func runPause(f client.Factory, o *cli.SelectOptions, paused bool) error { switch { case len(o.Names) > 0: for _, name := range o.Names { - schedule, err := client.VeleroV1().Schedules(f.Namespace()).Get(context.TODO(), name, metav1.GetOptions{}) + schedule := new(velerov1api.Schedule) + err := crClient.Get(context.TODO(), ctrlclient.ObjectKey{Name: name, Namespace: f.Namespace()}, schedule) if err != nil { errs = append(errs, errors.WithStack(err)) continue @@ -83,11 +85,16 @@ func runPause(f client.Factory, o *cli.SelectOptions, paused bool) error { schedules = append(schedules, schedule) } default: - selector := labels.Everything().String() + selector := labels.Everything() if o.Selector.LabelSelector != nil { - selector = o.Selector.String() + convertedSelector, err := metav1.LabelSelectorAsSelector(o.Selector.LabelSelector) + if err != nil { + return errors.WithStack(err) + } + selector = convertedSelector } - res, err := client.VeleroV1().Schedules(f.Namespace()).List(context.TODO(), metav1.ListOptions{ + res := new(velerov1api.ScheduleList) + err := crClient.List(context.TODO(), res, &ctrlclient.ListOptions{ LabelSelector: selector, }) if err != nil { @@ -113,7 +120,7 @@ func runPause(f client.Factory, o *cli.SelectOptions, paused bool) error { continue } schedule.Spec.Paused = paused - if _, err := client.VeleroV1().Schedules(schedule.Namespace).Update(context.TODO(), schedule, metav1.UpdateOptions{}); err != nil { + if err := crClient.Update(context.TODO(), schedule); err != nil { return errors.Wrapf(err, "failed to update schedule %s", schedule.Name) } fmt.Printf("Schedule %s %s successfully\n", schedule.Name, msg) diff --git a/pkg/cmd/server/plugin/plugin.go b/pkg/cmd/server/plugin/plugin.go index 3a4f97107..df1cf9f2d 100644 --- a/pkg/cmd/server/plugin/plugin.go +++ b/pkg/cmd/server/plugin/plugin.go @@ -152,12 +152,12 @@ func newPodVolumeRestoreItemAction(f client.Factory) plugincommon.HandlerInitial return nil, err } - veleroClient, err := f.Client() + crClient, err := f.KubebuilderClient() if err != nil { return nil, err } - return restore.NewPodVolumeRestoreAction(logger, client.CoreV1().ConfigMaps(f.Namespace()), veleroClient.VeleroV1().PodVolumeBackups(f.Namespace())), nil + return restore.NewPodVolumeRestoreAction(logger, client.CoreV1().ConfigMaps(f.Namespace()), crClient), nil } } diff --git a/pkg/cmd/server/server.go b/pkg/cmd/server/server.go index b53214b4d..f8b03f8e3 100644 --- a/pkg/cmd/server/server.go +++ b/pkg/cmd/server/server.go @@ -294,11 +294,6 @@ func newServer(f client.Factory, config serverConfig, logger *logrus.Logger) (*s return nil, err } - veleroClient, err := f.Client() - if err != nil { - return nil, err - } - dynamicClient, err := f.DynamicClient() if err != nil { return nil, err @@ -379,12 +374,18 @@ func newServer(f client.Factory, config serverConfig, logger *logrus.Logger) (*s return nil, err } + var discoveryClient *discovery.DiscoveryClient + if discoveryClient, err = discovery.NewDiscoveryClientForConfig(clientConfig); err != nil { + cancelFunc() + return nil, err + } + s := &server{ namespace: f.Namespace(), metricsAddress: config.metricsAddress, kubeClientConfig: clientConfig, kubeClient: kubeClient, - discoveryClient: veleroClient.Discovery(), + discoveryClient: discoveryClient, dynamicClient: dynamicClient, crClient: crClient, ctx: ctx, diff --git a/pkg/discovery/helper_test.go b/pkg/discovery/helper_test.go index cec92a8f2..3091676a2 100644 --- a/pkg/discovery/helper_test.go +++ b/pkg/discovery/helper_test.go @@ -30,7 +30,6 @@ import ( clientgotesting "k8s.io/client-go/testing" velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" - discoverymocks "github.com/vmware-tanzu/velero/pkg/discovery/mocks" "github.com/vmware-tanzu/velero/pkg/features" velerotest "github.com/vmware-tanzu/velero/pkg/test" "github.com/vmware-tanzu/velero/pkg/util/logging" @@ -548,39 +547,31 @@ func TestHelper_refreshServerPreferredResources(t *testing.T) { } tests := []struct { - name string - isGetResError bool + name string + expectedErr error }{ { - name: "success get preferred resources", + name: "success get preferred resources", + expectedErr: nil, }, { - name: "failed to get preferred resources", - isGetResError: true, + name: "failed to get preferred resources", + expectedErr: errors.New("Failed to discover preferred resources"), }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - fakeClient := discoverymocks.NewServerResourcesInterface(t) - - if tc.isGetResError { - fakeClient.On("ServerPreferredResources").Return(nil, errors.New("Failed to discover preferred resources")) - } else { - fakeClient.On("ServerPreferredResources").Return(apiList, nil) - } + fakeClient := velerotest.NewFakeServerResourcesInterface(apiList, []*metav1.APIGroup{}, map[schema.GroupVersion]error{}, tc.expectedErr) resources, err := refreshServerPreferredResources(fakeClient, logrus.New()) - if tc.isGetResError { + if tc.expectedErr != nil { assert.NotNil(t, err) - assert.Nil(t, resources) } else { assert.Nil(t, err) assert.NotNil(t, resources) } - - fakeClient.AssertExpectations(t) }) } } @@ -612,41 +603,31 @@ func TestHelper_refreshServerGroupsAndResources(t *testing.T) { }, } tests := []struct { - name string - isGetResError bool + name string + expectedErr error }{ { name: "success get service groups and resouorces", }, { - name: "failed to service groups and resouorces", - isGetResError: true, + name: "failed to service groups and resouorces", + expectedErr: errors.New("Failed to discover service groups and resouorces"), }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - fakeClient := discoverymocks.NewServerResourcesInterface(t) - - if tc.isGetResError { - fakeClient.On("ServerGroupsAndResources").Return(nil, nil, errors.New("Failed to discover service groups and resouorces")) - } else { - fakeClient.On("ServerGroupsAndResources").Return(apiGroup, apiList, nil) - } + fakeClient := velerotest.NewFakeServerResourcesInterface(apiList, apiGroup, map[schema.GroupVersion]error{}, tc.expectedErr) serverGroups, serverResources, err := refreshServerGroupsAndResources(fakeClient, logrus.New()) - if tc.isGetResError { + if tc.expectedErr != nil { assert.NotNil(t, err) - assert.Nil(t, serverGroups) - assert.Nil(t, serverResources) } else { assert.Nil(t, err) assert.NotNil(t, serverGroups) assert.NotNil(t, serverResources) } - - fakeClient.AssertExpectations(t) }) } } diff --git a/pkg/discovery/mocks/Helper.go b/pkg/discovery/mocks/Helper.go index f0dbcfc03..3f73f67be 100644 --- a/pkg/discovery/mocks/Helper.go +++ b/pkg/discovery/mocks/Helper.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.30.1. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks @@ -140,12 +140,13 @@ func (_m *Helper) ServerVersion() *version.Info { return r0 } -// NewHelper creates a new instance of Helper. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewHelper(t interface { +type mockConstructorTestingTNewHelper interface { mock.TestingT Cleanup(func()) -}) *Helper { +} + +// NewHelper creates a new instance of Helper. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewHelper(t mockConstructorTestingTNewHelper) *Helper { mock := &Helper{} mock.Mock.Test(t) @@ -153,84 +154,3 @@ func NewHelper(t interface { return mock } - -// serverResourcesInterface is an autogenerated mock type for the serverResourcesInterface type -type serverResourcesInterface struct { - mock.Mock -} - -// ServerGroupsAndResources provides a mock function with given fields: -func (_m *serverResourcesInterface) ServerGroupsAndResources() ([]*v1.APIGroup, []*v1.APIResourceList, error) { - ret := _m.Called() - - var r0 []*v1.APIGroup - var r1 []*v1.APIResourceList - var r2 error - if rf, ok := ret.Get(0).(func() ([]*v1.APIGroup, []*v1.APIResourceList, error)); ok { - return rf() - } - if rf, ok := ret.Get(0).(func() []*v1.APIGroup); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*v1.APIGroup) - } - } - - if rf, ok := ret.Get(1).(func() []*v1.APIResourceList); ok { - r1 = rf() - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).([]*v1.APIResourceList) - } - } - - if rf, ok := ret.Get(2).(func() error); ok { - r2 = rf() - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// ServerPreferredResources provides a mock function with given fields: -func (_m *serverResourcesInterface) ServerPreferredResources() ([]*v1.APIResourceList, error) { - ret := _m.Called() - - var r0 []*v1.APIResourceList - var r1 error - if rf, ok := ret.Get(0).(func() ([]*v1.APIResourceList, error)); ok { - return rf() - } - if rf, ok := ret.Get(0).(func() []*v1.APIResourceList); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*v1.APIResourceList) - } - } - - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -type mockConstructorTestingTnewServerResourcesInterface interface { - mock.TestingT - Cleanup(func()) -} - -// NewServerResourcesInterface creates a new instance of serverResourcesInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewServerResourcesInterface(t mockConstructorTestingTnewServerResourcesInterface) *serverResourcesInterface { - mock := &serverResourcesInterface{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/pkg/restore/pod_volume_restore_action.go b/pkg/restore/pod_volume_restore_action.go index e5d77b18e..af5c2373c 100644 --- a/pkg/restore/pod_volume_restore_action.go +++ b/pkg/restore/pod_volume_restore_action.go @@ -27,11 +27,11 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" corev1client "k8s.io/client-go/kubernetes/typed/core/v1" + ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" veleroimage "github.com/vmware-tanzu/velero/internal/velero" velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" "github.com/vmware-tanzu/velero/pkg/builder" - velerov1client "github.com/vmware-tanzu/velero/pkg/generated/clientset/versioned/typed/velero/v1" "github.com/vmware-tanzu/velero/pkg/label" "github.com/vmware-tanzu/velero/pkg/plugin/framework/common" "github.com/vmware-tanzu/velero/pkg/plugin/velero" @@ -47,16 +47,16 @@ const ( ) type PodVolumeRestoreAction struct { - logger logrus.FieldLogger - client corev1client.ConfigMapInterface - podVolumeBackupClient velerov1client.PodVolumeBackupInterface + logger logrus.FieldLogger + client corev1client.ConfigMapInterface + crClient ctrlclient.Client } -func NewPodVolumeRestoreAction(logger logrus.FieldLogger, client corev1client.ConfigMapInterface, podVolumeBackupClient velerov1client.PodVolumeBackupInterface) *PodVolumeRestoreAction { +func NewPodVolumeRestoreAction(logger logrus.FieldLogger, client corev1client.ConfigMapInterface, crClient ctrlclient.Client) *PodVolumeRestoreAction { return &PodVolumeRestoreAction{ - logger: logger, - client: client, - podVolumeBackupClient: podVolumeBackupClient, + logger: logger, + client: client, + crClient: crClient, } } @@ -86,9 +86,11 @@ func (a *PodVolumeRestoreAction) Execute(input *velero.RestoreItemActionExecuteI log := a.logger.WithField("pod", kube.NamespaceAndName(&pod)) - opts := label.NewListOptionsForBackup(input.Restore.Spec.BackupName) - podVolumeBackupList, err := a.podVolumeBackupClient.List(context.TODO(), opts) - if err != nil { + opts := &ctrlclient.ListOptions{ + LabelSelector: label.NewSelectorForBackup(input.Restore.Spec.BackupName), + } + podVolumeBackupList := new(velerov1api.PodVolumeBackupList) + if err := a.crClient.List(context.TODO(), podVolumeBackupList, opts); err != nil { return nil, errors.WithStack(err) } diff --git a/pkg/restore/pod_volume_restore_action_test.go b/pkg/restore/pod_volume_restore_action_test.go index f57ffdc69..cba4914e5 100644 --- a/pkg/restore/pod_volume_restore_action_test.go +++ b/pkg/restore/pod_volume_restore_action_test.go @@ -17,7 +17,6 @@ limitations under the License. package restore import ( - "context" "sort" "testing" @@ -25,7 +24,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" 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/runtime" "k8s.io/client-go/kubernetes/fake" @@ -34,7 +32,6 @@ import ( velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" "github.com/vmware-tanzu/velero/pkg/builder" "github.com/vmware-tanzu/velero/pkg/buildinfo" - 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/kube" @@ -131,7 +128,7 @@ func TestPodVolumeRestoreActionExecute(t *testing.T) { name string pod *corev1api.Pod podFromBackup *corev1api.Pod - podVolumeBackups []*velerov1api.PodVolumeBackup + podVolumeBackups []runtime.Object want *corev1api.Pod }{ { @@ -179,7 +176,7 @@ func TestPodVolumeRestoreActionExecute(t *testing.T) { builder.WithAnnotations("snapshot.velero.io/not-used", "")). InitContainers(builder.ForContainer("first-container", "").Result()). Result(), - podVolumeBackups: []*velerov1api.PodVolumeBackup{ + podVolumeBackups: []runtime.Object{ builder.ForPodVolumeBackup(veleroNs, "pvb-1"). PodName("my-pod"). PodNamespace("ns-1"). @@ -225,7 +222,7 @@ func TestPodVolumeRestoreActionExecute(t *testing.T) { builder.ForVolume("vol-2").PersistentVolumeClaimSource("pvc-2").Result(), ). Result(), - podVolumeBackups: []*velerov1api.PodVolumeBackup{ + podVolumeBackups: []runtime.Object{ builder.ForPodVolumeBackup(veleroNs, "pvb-1"). PodName("my-pod"). PodNamespace("original-ns"). @@ -259,12 +256,7 @@ func TestPodVolumeRestoreActionExecute(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { clientset := fake.NewSimpleClientset() - clientsetVelero := velerofake.NewSimpleClientset() - - for _, podVolumeBackup := range tc.podVolumeBackups { - _, err := clientsetVelero.VeleroV1().PodVolumeBackups(veleroNs).Create(context.TODO(), podVolumeBackup, metav1.CreateOptions{}) - require.NoError(t, err) - } + crClient := velerotest.NewFakeControllerRuntimeClient(t, tc.podVolumeBackups...) unstructuredPod, err := runtime.DefaultUnstructuredConverter.ToUnstructured(tc.pod) require.NoError(t, err) @@ -294,7 +286,7 @@ func TestPodVolumeRestoreActionExecute(t *testing.T) { a := NewPodVolumeRestoreAction( logrus.StandardLogger(), clientset.CoreV1().ConfigMaps(veleroNs), - clientsetVelero.VeleroV1().PodVolumeBackups(veleroNs), + crClient, ) // method under test diff --git a/pkg/test/api_server.go b/pkg/test/api_server.go index c96f742e8..dd5b0a07a 100644 --- a/pkg/test/api_server.go +++ b/pkg/test/api_server.go @@ -24,14 +24,11 @@ import ( discoveryfake "k8s.io/client-go/discovery/fake" dynamicfake "k8s.io/client-go/dynamic/fake" kubefake "k8s.io/client-go/kubernetes/fake" - - "github.com/vmware-tanzu/velero/pkg/generated/clientset/versioned/fake" ) // APIServer contains in-memory fakes for all of the relevant // Kubernetes API server clients. type APIServer struct { - VeleroClient *fake.Clientset KubeClient *kubefake.Clientset DynamicClient *dynamicfake.FakeDynamicClient DiscoveryClient *DiscoveryClient @@ -43,7 +40,6 @@ func NewAPIServer(t *testing.T) *APIServer { t.Helper() var ( - veleroClient = fake.NewSimpleClientset() kubeClient = kubefake.NewSimpleClientset() dynamicClient = dynamicfake.NewSimpleDynamicClientWithCustomListKinds(runtime.NewScheme(), map[schema.GroupVersionResource]string{ @@ -65,7 +61,6 @@ func NewAPIServer(t *testing.T) *APIServer { ) return &APIServer{ - VeleroClient: veleroClient, KubeClient: kubeClient, DynamicClient: dynamicClient, DiscoveryClient: discoveryClient, diff --git a/test/pkg/client/factory.go b/test/pkg/client/factory.go index 3c0911177..340cba587 100644 --- a/test/pkg/client/factory.go +++ b/test/pkg/client/factory.go @@ -34,16 +34,12 @@ import ( velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" velerov2alpha1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v2alpha1" - clientset "github.com/vmware-tanzu/velero/pkg/generated/clientset/versioned" ) // Factory knows how to create a VeleroClient and Kubernetes client. type Factory interface { // BindFlags binds common flags (--kubeconfig, --namespace) to the passed-in FlagSet. BindFlags(flags *pflag.FlagSet) - // Client returns a VeleroClient. It uses the following priority to specify the cluster - // configuration: --kubeconfig flag, KUBECONFIG environment variable, in-cluster configuration. - Client() (clientset.Interface, error) // KubeClient returns a Kubernetes client. It uses the following priority to specify the cluster // configuration: --kubeconfig flag, KUBECONFIG environment variable, in-cluster configuration. KubeClient() (kubernetes.Interface, error) @@ -114,19 +110,6 @@ func (f *factory) ClientConfig() (*rest.Config, error) { return Config(f.kubeconfig, f.kubecontext, f.baseName, f.clientQPS, f.clientBurst) } -func (f *factory) Client() (clientset.Interface, error) { - clientConfig, err := f.ClientConfig() - if err != nil { - return nil, err - } - - veleroClient, err := clientset.NewForConfig(clientConfig) - if err != nil { - return nil, errors.WithStack(err) - } - return veleroClient, nil -} - func (f *factory) KubeClient() (kubernetes.Interface, error) { clientConfig, err := f.ClientConfig() if err != nil {