Skip to content

Commit

Permalink
fixup! feat: NonAdminBackup sync controller
Browse files Browse the repository at this point in the history
Signed-off-by: Mateus Oliveira <[email protected]>
  • Loading branch information
mateusoliveira43 committed Jan 29, 2025
1 parent f9713c5 commit db30aeb
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 431 deletions.
2 changes: 2 additions & 0 deletions internal/common/constant/constant.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ const (
NarOriginNACUUIDLabel = v1alpha1.OadpOperatorLabel + "-nar-origin-nacuuid"
NabslOriginNACUUIDLabel = v1alpha1.OadpOperatorLabel + "-nabsl-origin-nacuuid"

NabSyncLabel = "openshift.io/oadp-nab-synced-from-nacuuid"

NabOriginNameAnnotation = v1alpha1.OadpOperatorLabel + "-nab-origin-name"
NabOriginNamespaceAnnotation = v1alpha1.OadpOperatorLabel + "-nab-origin-namespace"
NarOriginNameAnnotation = v1alpha1.OadpOperatorLabel + "-nar-origin-name"
Expand Down
19 changes: 0 additions & 19 deletions internal/common/function/function.go
Original file line number Diff line number Diff line change
Expand Up @@ -602,22 +602,3 @@ func checkLabelAnnotationValueIsValid(labelsOrAnnotations map[string]string, key
func GetLogger(ctx context.Context, obj client.Object, key string) logr.Logger {
return log.FromContext(ctx).WithValues(key, types.NamespacedName{Name: obj.GetName(), Namespace: obj.GetNamespace()})
}

// TODO remove
func GetVeleroBackupStorageLocationByLabel(ctx context.Context, clientInstance client.Client, namespace string, labelValue string) (*velerov1.BackupStorageLocation, error) {
bslList := &velerov1.BackupStorageLocationList{}

// Call the generic ListLabeledObjectsInNamespace function
if err := ListObjectsByLabel(ctx, clientInstance, namespace, "openshift.io/oadp-nabsl-origin-nacuuid", labelValue, bslList); err != nil {
return nil, err
}

switch len(bslList.Items) {
case 0:
return nil, nil // No matching VeleroBackupStorageLocation found
case 1:
return &bslList.Items[0], nil // Found 1 matching VeleroBackupStorageLocation
default:
return nil, fmt.Errorf("multiple VeleroBackupStorageLocation objects found with label %s=%s in namespace '%s'", velerov1.StorageLocationLabel, labelValue, namespace)
}
}
4 changes: 2 additions & 2 deletions internal/controller/nonadminbackup_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func (r *NonAdminBackupReconciler) Reconcile(ctx context.Context, req ctrl.Reque
return ctrl.Result{}, err
}

_, syncBackup := nab.Labels["openshift.io/oadp-nab-synced-from-nacuuid"]
_, syncBackup := nab.Labels[constant.NabSyncLabel]

// Determine which path to take
var reconcileSteps []nonAdminBackupReconcileStepFunction
Expand Down Expand Up @@ -566,7 +566,7 @@ func (r *NonAdminBackupReconciler) setBackupUUIDInStatus(ctx context.Context, lo

if nab.Status.VeleroBackup == nil || nab.Status.VeleroBackup.NACUUID == constant.EmptyString {
var veleroBackupNACUUID string
if value, ok := nab.Labels["openshift.io/oadp-nab-synced-from-nacuuid"]; ok {
if value, ok := nab.Labels[constant.NabSyncLabel]; ok {
veleroBackupNACUUID = value
} else {
veleroBackupNACUUID = function.GenerateNacObjectUUID(nab.Namespace, nab.Name)
Expand Down
70 changes: 68 additions & 2 deletions internal/controller/nonadminbackupstoragelocation_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ package controller

import (
"context"
"fmt"
"reflect"
"time"

"github.com/go-logr/logr"
velerov1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
Expand All @@ -29,6 +31,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"k8s.io/utils/ptr"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
Expand Down Expand Up @@ -56,10 +59,13 @@ type NonAdminBackupStorageLocationReconciler struct {
Scheme *runtime.Scheme
EnforcedBslSpec *velerov1.BackupStorageLocationSpec
OADPNamespace string
SyncPeriod time.Duration
}

type naBSLReconcileStepFunction func(ctx context.Context, logger logr.Logger, nabsl *nacv1alpha1.NonAdminBackupStorageLocation) (bool, error)

var previousBackupSyncRun *time.Time

// +kubebuilder:rbac:groups=velero.io,resources=backupstoragelocations,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=velero.io,resources=backupstoragelocations/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;update;patch;delete
Expand All @@ -72,7 +78,7 @@ type naBSLReconcileStepFunction func(ctx context.Context, logger logr.Logger, na
// move the current state of the cluster closer to the desired state.
func (r *NonAdminBackupStorageLocationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := log.FromContext(ctx)
logger.V(1).Info("NonAdminBackup Reconcile start")
logger.V(1).Info("NonAdminBackupStorageLocation Reconcile start")

// Get the NonAdminBackupStorageLocation object
nabsl := &nacv1alpha1.NonAdminBackupStorageLocation{}
Expand Down Expand Up @@ -123,7 +129,67 @@ func (r *NonAdminBackupStorageLocationReconciler) Reconcile(ctx context.Context,
}
}

logger.V(1).Info("NonAdminBackup Reconcile exit")
if previousBackupSyncRun == nil || time.Now().After(previousBackupSyncRun.Add(r.SyncPeriod)) {
previousBackupSyncRun = ptr.To(time.Now())
logger.V(1).Info("NonAdminBackup Synchronization start")

var veleroBackupList velerov1.BackupList
labelSelector := client.MatchingLabels(function.GetNonAdminLabels())

if err := r.List(ctx, &veleroBackupList, client.InNamespace(r.OADPNamespace), labelSelector); err != nil {
return ctrl.Result{}, err
}

var backupsToSync []velerov1.Backup
var possibleBackupsToSync []velerov1.Backup
for _, backup := range veleroBackupList.Items {
if backup.Status.CompletionTimestamp != nil &&
backup.Annotations[constant.NabOriginNamespaceAnnotation] == nabsl.Namespace &&
backup.Spec.StorageLocation == nabsl.Name {
possibleBackupsToSync = append(possibleBackupsToSync, backup)
}
}
logger.V(1).Info(fmt.Sprintf("%v possible Backup(s) to be synced to NonAdminBackupStorageLocation namespace", len(possibleBackupsToSync)))

for _, backup := range possibleBackupsToSync {
nab := &nacv1alpha1.NonAdminBackup{}
err := r.Get(ctx, types.NamespacedName{
Namespace: backup.Annotations[constant.NabOriginNamespaceAnnotation],
Name: backup.Annotations[constant.NabOriginNameAnnotation],
}, nab)
if err != nil {
if apierrors.IsNotFound(err) {
backupsToSync = append(backupsToSync, backup)
continue
}
logger.Error(err, "Unable to fetch NonAdminBackup")
return ctrl.Result{}, err
}
}
logger.V(1).Info(fmt.Sprintf("%v Backup(s) to sync to NonAdminBackupStorageLocation namespace", len(backupsToSync)))
for _, backup := range backupsToSync {
nab := &nacv1alpha1.NonAdminBackup{
ObjectMeta: metav1.ObjectMeta{
Name: backup.Annotations[constant.NabOriginNameAnnotation],
Namespace: backup.Annotations[constant.NabOriginNamespaceAnnotation],
// TODO sync operation does not preserve labels
Labels: map[string]string{
constant.NabSyncLabel: backup.Labels[constant.NabOriginNACUUIDLabel],
},
},
Spec: nacv1alpha1.NonAdminBackupSpec{
BackupSpec: &backup.Spec,
},
}
nab.Spec.BackupSpec.StorageLocation = nabsl.Name
r.Create(ctx, nab)

Check failure on line 185 in internal/controller/nonadminbackupstoragelocation_controller.go

View workflow job for this annotation

GitHub Actions / golang-check

Error return value of `r.Create` is not checked (errcheck)
}

logger.V(1).Info("NonAdminBackup Synchronization exit")
return ctrl.Result{RequeueAfter: r.SyncPeriod}, nil
}

logger.V(1).Info("NonAdminBackupStorageLocation Reconcile exit")
return ctrl.Result{}, nil
}

Expand Down
237 changes: 0 additions & 237 deletions internal/controller/sync_controller.go

This file was deleted.

Loading

0 comments on commit db30aeb

Please sign in to comment.