package aws import ( "context" "fmt" virtuslabv1alpha1 "github.com/VirtusLab/jenkins-operator/pkg/apis/virtuslab/v1alpha1" "github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/configuration/base/resources" "github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/constants" "github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/plugins" "github.com/VirtusLab/jenkins-operator/pkg/log" "github.com/go-logr/logr" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" k8s "sigs.k8s.io/controller-runtime/pkg/client" ) // AmazonS3Backup is a backup strategy where backup is stored in AWS S3 bucket // credentials required to make calls to AWS API are provided by user in backup credentials Kubernetes secret type AmazonS3Backup struct{} // GetRestoreJobXML returns Jenkins restore backup job config XML func (b *AmazonS3Backup) GetRestoreJobXML(jenkins virtuslabv1alpha1.Jenkins) (string, error) { return ` false false false `, nil } // GetBackupJobXML returns Jenkins backup job config XML func (b *AmazonS3Backup) GetBackupJobXML(jenkins virtuslabv1alpha1.Jenkins) (string, error) { return ` false H/60 * * * * false false `, nil } // IsConfigurationValidForBasePhase validates if user provided valid configuration of backup for base phase func (b *AmazonS3Backup) IsConfigurationValidForBasePhase(jenkins virtuslabv1alpha1.Jenkins, logger logr.Logger) bool { if len(jenkins.Spec.BackupAmazonS3.BucketName) == 0 { logger.V(log.VWarn).Info("Bucket name not set in 'spec.backupAmazonS3.bucketName'") return false } if len(jenkins.Spec.BackupAmazonS3.BucketPath) == 0 { logger.V(log.VWarn).Info("Bucket path not set in 'spec.backupAmazonS3.bucketPath'") return false } if len(jenkins.Spec.BackupAmazonS3.Region) == 0 { logger.V(log.VWarn).Info("Region not set in 'spec.backupAmazonS3.region'") return false } return true } // IsConfigurationValidForUserPhase validates if user provided valid configuration of backup for user phase func (b *AmazonS3Backup) IsConfigurationValidForUserPhase(k8sClient k8s.Client, jenkins virtuslabv1alpha1.Jenkins, logger logr.Logger) (bool, error) { backupSecretName := resources.GetBackupCredentialsSecretName(&jenkins) backupSecret := &corev1.Secret{} err := k8sClient.Get(context.TODO(), types.NamespacedName{Namespace: jenkins.Namespace, Name: backupSecretName}, backupSecret) if err != nil { return false, err } if len(backupSecret.Data[constants.BackupAmazonS3SecretSecretKey]) == 0 { logger.V(log.VWarn).Info(fmt.Sprintf("Secret '%s' doesn't contains key: %s", backupSecretName, constants.BackupAmazonS3SecretSecretKey)) return false, nil } if len(backupSecret.Data[constants.BackupAmazonS3SecretAccessKey]) == 0 { logger.V(log.VWarn).Info(fmt.Sprintf("Secret '%s' doesn't contains key: %s", backupSecretName, constants.BackupAmazonS3SecretAccessKey)) return false, nil } return true, nil } // GetRequiredPlugins returns all required Jenkins plugins by this backup strategy func (b *AmazonS3Backup) GetRequiredPlugins() map[string][]plugins.Plugin { return map[string][]plugins.Plugin{ "aws-java-sdk:1.11.457": { plugins.Must(plugins.New(plugins.ApacheComponentsClientPlugin)), plugins.Must(plugins.New(plugins.Jackson2ADIPlugin)), }, } }