diff --git a/cmd/main.go b/cmd/main.go index 81a03a6d..7fe97a17 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -58,6 +58,7 @@ import ( scopeclient "github.com/kyma-project/cloud-manager/pkg/kcp/scope/client" awsnfsbackupclient "github.com/kyma-project/cloud-manager/pkg/skr/awsnfsvolumebackup/client" awsnfsrestoreclient "github.com/kyma-project/cloud-manager/pkg/skr/awsnfsvolumerestore/client" + //azurerwxvolumebackupclient "github.com/kyma-project/cloud-manager/pkg/skr/azurerwxvolumebackup/client" "github.com/kyma-project/cloud-manager/pkg/util" @@ -262,7 +263,7 @@ func main() { os.Exit(1) } - //if err = cloudresourcescontroller.SetupAzureRwxBackupReconciler(skrRegistry); err != nil { + //if err = cloudresourcescontroller.SetupAzureRwxBackupReconciler(skrRegistry, azurerwxvolumebackupclient.NewClientProvider()); err != nil { // setupLog.Error(err, "unable to create controller", "controller", "AzureRwxVolumeBackup") // os.Exit(1) //} diff --git a/go.mod b/go.mod index bd0673d4..7bc68303 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,8 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v5 v5.2.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.3.0 + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservices v1.6.0 + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v4 v4.1.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis v1.0.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 github.com/aws/aws-sdk-go-v2 v1.32.7 diff --git a/go.sum b/go.sum index 9de869bd..742f9f3e 100644 --- a/go.sum +++ b/go.sum @@ -44,6 +44,10 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v5 v5.2 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v5 v5.2.0/go.mod h1:UmyOatRyQodVpp55Jr5WJmnkmVW4wKfo85uHFmMEjfM= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.3.0 h1:yzrctSl9GMIQ5lHu7jc8olOsGjWDCsBpJhWqfGa/YIM= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.3.0/go.mod h1:GE4m0rnnfwLGX0Y9A9A25Zx5N/90jneT5ABevqzhuFQ= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservices v1.6.0 h1:tyFbORs8iNJGoD4DCRTweqLRCS8PiWqyoj8TqLFZZfo= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservices v1.6.0/go.mod h1:D01KTLlDky2hIhRbX5NjyDb84O6jflookw6b+Gd5h/U= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v4 v4.1.0 h1:9UWpKYKgpzbMlLzAib1NbqJhfS9vfe0vR6JqbOQghkI= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v4 v4.1.0/go.mod h1:yCSotfXkHjUuPsFlZkWxi3lgI/wT8x/alEY7k8PJ+FM= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis v1.0.0 h1:nmpTBgRg1HynngFYICRhceC7s5dmbKN9fJ/XQz/UQ2I= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis v1.0.0/go.mod h1:3yjiOtnkVociBTlF7UZrwAGfJrGaOCsvtVS4HzNajxQ= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= diff --git a/internal/controller/cloud-resources/azurerwxvolumebackup_controller.go b/internal/controller/cloud-resources/azurerwxvolumebackup_controller.go index 94fccc7c..d3714216 100644 --- a/internal/controller/cloud-resources/azurerwxvolumebackup_controller.go +++ b/internal/controller/cloud-resources/azurerwxvolumebackup_controller.go @@ -18,7 +18,9 @@ package cloudresources import ( "context" + azureclient "github.com/kyma-project/cloud-manager/pkg/kcp/provider/azure/client" "github.com/kyma-project/cloud-manager/pkg/skr/azurerwxvolumebackup" + "github.com/kyma-project/cloud-manager/pkg/skr/azurerwxvolumebackup/client" skrruntime "github.com/kyma-project/cloud-manager/pkg/skr/runtime" skrreconciler "github.com/kyma-project/cloud-manager/pkg/skr/runtime/reconcile" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -27,7 +29,9 @@ import ( ctrl "sigs.k8s.io/controller-runtime" ) -type AzureRwxVolumeBackupReconcilerFactory struct{} +type AzureRwxVolumeBackupReconcilerFactory struct { + clientProvider azureclient.ClientProvider[client.Client] +} func (f *AzureRwxVolumeBackupReconcilerFactory) New(args skrreconciler.ReconcilerArguments) reconcile.Reconciler { return &AzureRwxVolumeBackupReconciler{ @@ -57,9 +61,11 @@ func (r *AzureRwxVolumeBackupReconciler) Reconcile(ctx context.Context, req ctrl return r.reconciler.Reconcile(ctx, req) } -func SetupAzureRwxBackupReconciler(reg skrruntime.SkrRegistry) error { +func SetupAzureRwxBackupReconciler(reg skrruntime.SkrRegistry, clientProvider azureclient.ClientProvider[client.Client]) error { return reg.Register(). - WithFactory(&AzureRwxVolumeBackupReconcilerFactory{}). + WithFactory(&AzureRwxVolumeBackupReconcilerFactory{ + clientProvider: clientProvider, + }). For(&cloudresourcesv1beta1.AzureRwxVolumeBackup{}). Complete() } diff --git a/pkg/skr/azurerwxvolumebackup/client/backup.go b/pkg/skr/azurerwxvolumebackup/client/backup.go new file mode 100644 index 00000000..ab657648 --- /dev/null +++ b/pkg/skr/azurerwxvolumebackup/client/backup.go @@ -0,0 +1,30 @@ +package client + +import ( + "context" + "github.com/Azure/azure-sdk-for-go/sdk/azidentity" + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v4" +) + +type BackupClient interface { + TriggerBackup(ctx context.Context) +} + +type backupClient struct { + *armrecoveryservicesbackup.BackupsClient +} + +func NewBackupClient(subscriptionId string, cred *azidentity.ClientSecretCredential) (BackupClient, error) { + + bc, err := armrecoveryservicesbackup.NewBackupsClient(subscriptionId, cred, nil) + + if err != nil { + return nil, err + } + + return backupClient{bc}, nil +} + +func (c backupClient) TriggerBackup(ctx context.Context) { + // TODO: trigger logic here +} diff --git a/pkg/skr/azurerwxvolumebackup/client/client.go b/pkg/skr/azurerwxvolumebackup/client/client.go new file mode 100644 index 00000000..f6d2bb2c --- /dev/null +++ b/pkg/skr/azurerwxvolumebackup/client/client.go @@ -0,0 +1,63 @@ +package client + +import ( + "context" + "github.com/Azure/azure-sdk-for-go/sdk/azidentity" + azureclient "github.com/kyma-project/cloud-manager/pkg/kcp/provider/azure/client" +) + +type Client interface { + VaultClient + BackupClient + ProtectionPoliciesClient + RecoveryPointClient +} + +type client struct { + VaultClient + BackupClient + ProtectionPoliciesClient + RecoveryPointClient +} + +func NewClientProvider() azureclient.ClientProvider[Client] { + + return func(ctx context.Context, clientId, clientSecret, subscriptionId, tenantId string) (Client, error) { + var c Client + cred, err := azidentity.NewClientSecretCredential(tenantId, clientId, clientSecret, &azidentity.ClientSecretCredentialOptions{}) + if err != nil { + return nil, err + } + + vc, err := NewVaultClient(subscriptionId, cred) + if err != nil { + return nil, err + } + + bc, err := NewBackupClient(subscriptionId, cred) + if err != nil { + return nil, err + } + + ppc, err := NewProtectionPoliciesClient(subscriptionId, cred) + if err != nil { + return nil, err + } + + rpc, err := NewRecoveryPointClient(subscriptionId, cred) + if err != nil { + return nil, err + } + + c = client{ + vc, + bc, + ppc, + rpc, + } + + return c, nil + + } + +} diff --git a/pkg/skr/azurerwxvolumebackup/client/protectionPolicies.go b/pkg/skr/azurerwxvolumebackup/client/protectionPolicies.go new file mode 100644 index 00000000..020fe7cc --- /dev/null +++ b/pkg/skr/azurerwxvolumebackup/client/protectionPolicies.go @@ -0,0 +1,35 @@ +package client + +import ( + "context" + "github.com/Azure/azure-sdk-for-go/sdk/azidentity" + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v4" +) + +type ProtectionPoliciesClient interface { + CreateBackupPolicy(ctx context.Context) + DeleteBackupPolicy(ctx context.Context) +} + +type protectionPoliciesClient struct { + *armrecoveryservicesbackup.ProtectionPoliciesClient +} + +func NewProtectionPoliciesClient(subscriptionId string, cred *azidentity.ClientSecretCredential) (ProtectionPoliciesClient, error) { + + ppc, err := armrecoveryservicesbackup.NewProtectionPoliciesClient(subscriptionId, cred, nil) + + if err != nil { + return nil, err + } + + return protectionPoliciesClient{ppc}, nil +} + +func (c protectionPoliciesClient) CreateBackupPolicy(ctx context.Context) { + // TODO: implementation details +} + +func (c protectionPoliciesClient) DeleteBackupPolicy(ctx context.Context) { + // TODO: implementation details +} diff --git a/pkg/skr/azurerwxvolumebackup/client/recoveryPoint.go b/pkg/skr/azurerwxvolumebackup/client/recoveryPoint.go new file mode 100644 index 00000000..d8552278 --- /dev/null +++ b/pkg/skr/azurerwxvolumebackup/client/recoveryPoint.go @@ -0,0 +1,33 @@ +package client + +import ( + "context" + "github.com/Azure/azure-sdk-for-go/sdk/azidentity" + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v4" +) + +type RecoveryPointClient interface { + GetRecoveryPoint(ctx context.Context) + ListRecoveryPoints(ctx context.Context) +} + +type recoveryPointClient struct { + *armrecoveryservicesbackup.RecoveryPointsClient +} + +func NewRecoveryPointClient(subscriptionId string, cred *azidentity.ClientSecretCredential) (RecoveryPointClient, error) { + + rpc, err := armrecoveryservicesbackup.NewRecoveryPointsClient(subscriptionId, cred, nil) + if err != nil { + return nil, err + } + + return recoveryPointClient{rpc}, nil +} + +func (c recoveryPointClient) GetRecoveryPoint(ctx context.Context) { + // TODO: implementation details +} +func (c recoveryPointClient) ListRecoveryPoints(ctx context.Context) { + // TODO: implementation details +} diff --git a/pkg/skr/azurerwxvolumebackup/client/vault.go b/pkg/skr/azurerwxvolumebackup/client/vault.go new file mode 100644 index 00000000..5eeda87e --- /dev/null +++ b/pkg/skr/azurerwxvolumebackup/client/vault.go @@ -0,0 +1,34 @@ +package client + +import ( + "context" + "github.com/Azure/azure-sdk-for-go/sdk/azidentity" + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservices" +) + +type VaultClient interface { + CreateVault(ctx context.Context) + DeleteVault(ctx context.Context) +} + +type vaultClient struct { + *armrecoveryservices.VaultsClient +} + +func NewVaultClient(subscriptionId string, cred *azidentity.ClientSecretCredential) (VaultClient, error) { + + vc, err := armrecoveryservices.NewVaultsClient(subscriptionId, cred, nil) + if err != nil { + return nil, err + } + + return vaultClient{vc}, nil +} + +func (c vaultClient) CreateVault(ctx context.Context) { + // TODO: implementation details +} + +func (c vaultClient) DeleteVault(ctx context.Context) { + // TODO: implementation details +}