Skip to content

Commit

Permalink
Remove dependency of the legacy client code from pkg/cmd directory.
Browse files Browse the repository at this point in the history
Signed-off-by: Xun Jiang <jxun@vmware.com>
  • Loading branch information
Xun Jiang committed Jul 11, 2023
1 parent e54a8af commit 6779436
Show file tree
Hide file tree
Showing 20 changed files with 317 additions and 234 deletions.
1 change: 1 addition & 0 deletions changelogs/unreleased/6469-blackpiglet
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Remove dependency of the legacy client code from pkg/cmd directory
10 changes: 10 additions & 0 deletions pkg/apis/velero/v1/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ limitations under the License.

package v1

import "k8s.io/apimachinery/pkg/runtime/schema"

const (
// DefaultNamespace is the Kubernetes namespace that is used by default for
// the Velero server and API objects.
Expand Down Expand Up @@ -47,3 +49,11 @@ const (
// APIGroupVersionsFeatureFlag is the feature flag string that defines whether or not to handle multiple API Group Versions
APIGroupVersionsFeatureFlag = "EnableAPIGroupVersions"
)

var (
BackupGVR = schema.GroupVersionResource{Group: "velero.io", Version: "v1", Resource: "backups"}
DeleteBackupRequestGVR = schema.GroupVersionResource{Group: "velero.io", Version: "v1", Resource: "deletebackuprequests"}
RestoreGVR = schema.GroupVersionResource{Group: "velero.io", Version: "v1", Resource: "restores"}
ScheduleGVR = schema.GroupVersionResource{Group: "velero.io", Version: "v1", Resource: "schedules"}
VolumeSnapshotLocationGVR = schema.GroupVersionResource{Group: "velero.io", Version: "v1", Resource: "volumesnapshotlocations"}
)
53 changes: 35 additions & 18 deletions pkg/cmd/cli/backup/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ import (
"github.com/spf13/cobra"
"github.com/spf13/pflag"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
kubeerrs "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/dynamic/dynamicinformer"
"k8s.io/client-go/tools/cache"

velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
Expand All @@ -36,8 +40,6 @@ import (
"github.com/vmware-tanzu/velero/pkg/cmd"
"github.com/vmware-tanzu/velero/pkg/cmd/util/flag"
"github.com/vmware-tanzu/velero/pkg/cmd/util/output"
veleroclient "github.com/vmware-tanzu/velero/pkg/generated/clientset/versioned"
v1 "github.com/vmware-tanzu/velero/pkg/generated/informers/externalversions/velero/v1"
"github.com/vmware-tanzu/velero/pkg/util/collections"
)

Expand Down Expand Up @@ -107,7 +109,7 @@ type CreateOptions struct {
CSISnapshotTimeout time.Duration
ItemOperationTimeout time.Duration
ResPoliciesConfigmap string
client veleroclient.Interface
client dynamic.Interface
}

func NewCreateOptions() *CreateOptions {
Expand Down Expand Up @@ -203,7 +205,7 @@ func (o *CreateOptions) Validate(c *cobra.Command, args []string, f client.Facto
}

for _, loc := range o.SnapshotLocations {
if _, err := o.client.VeleroV1().VolumeSnapshotLocations(f.Namespace()).Get(context.TODO(), loc, metav1.GetOptions{}); err != nil {
if _, err := o.client.Resource(velerov1api.VolumeSnapshotLocationGVR).Namespace(f.Namespace()).Get(context.TODO(), loc, metav1.GetOptions{}); err != nil {
return err
}
}
Expand All @@ -216,7 +218,7 @@ func (o *CreateOptions) Complete(args []string, f client.Factory) error {
if len(args) > 0 {
o.Name = args[0]
}
client, err := f.Client()
client, err := f.DynamicClient()
if err != nil {
return err
}
Expand All @@ -238,47 +240,57 @@ func (o *CreateOptions) Run(c *cobra.Command, f client.Factory) error {
fmt.Println("Creating backup from schedule, all other filters are ignored.")
}

var backupInformer cache.SharedIndexInformer
var updates chan *velerov1api.Backup
if o.Wait {
stop := make(chan struct{})
defer close(stop)

updates = make(chan *velerov1api.Backup)

backupInformer = v1.NewBackupInformer(o.client, f.Namespace(), 0, nil)

backupInformer.AddEventHandler(
target := dynamicinformer.NewFilteredDynamicSharedInformerFactory(o.client, 0, f.Namespace(), nil)
target.ForResource(velerov1api.BackupGVR).Informer().AddEventHandler(
cache.FilteringResourceEventHandler{
FilterFunc: func(obj interface{}) bool {
backup, ok := obj.(*velerov1api.Backup)
if !ok {
backup := new(velerov1api.Backup)
err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.(*unstructured.Unstructured).Object, backup)
if err != nil {
return false
}
return backup.Name == o.Name
},
Handler: cache.ResourceEventHandlerFuncs{
UpdateFunc: func(_, obj interface{}) {
backup, ok := obj.(*velerov1api.Backup)
if !ok {
backup := new(velerov1api.Backup)
err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.(*unstructured.Unstructured).Object, backup)
if err != nil {
return
}
updates <- backup
},
DeleteFunc: func(obj interface{}) {
backup, ok := obj.(*velerov1api.Backup)
if !ok {
backup := new(velerov1api.Backup)
err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.(*unstructured.Unstructured).Object, backup)
if err != nil {
return
}
updates <- backup
},
},
},
)
go backupInformer.Run(stop)

target.Start(stop)
if synced := target.WaitForCacheSync(stop); !synced[velerov1api.BackupGVR] {
fmt.Printf("informer for %s hasn't synced\n", velerov1api.BackupGVR.String())
return fmt.Errorf("informer for %s hasn't synced", velerov1api.BackupGVR.String())
}
}

_, err = o.client.VeleroV1().Backups(backup.Namespace).Create(context.TODO(), backup, metav1.CreateOptions{})
backupObjMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(backup)
if err != nil {
return err
}
_, err = o.client.Resource(velerov1api.BackupGVR).Namespace(backup.Namespace).Create(context.TODO(), &unstructured.Unstructured{Object: backupObjMap}, metav1.CreateOptions{})
if err != nil {
return err
}
Expand Down Expand Up @@ -341,7 +353,12 @@ func (o *CreateOptions) BuildBackup(namespace string) (*velerov1api.Backup, erro
var backupBuilder *builder.BackupBuilder

if o.FromSchedule != "" {
schedule, err := o.client.VeleroV1().Schedules(namespace).Get(context.TODO(), o.FromSchedule, metav1.GetOptions{})
obj, err := o.client.Resource(velerov1api.ScheduleGVR).Namespace(namespace).Get(context.TODO(), o.FromSchedule, metav1.GetOptions{})
if err != nil {
return nil, err
}
schedule := new(velerov1api.Schedule)
err = runtime.DefaultUnstructuredConverter.FromUnstructured(obj.UnstructuredContent(), schedule)
if err != nil {
return nil, err
}
Expand Down
Loading

0 comments on commit 6779436

Please sign in to comment.