package seedjobs import ( virtuslabv1alpha1 "github.com/VirtusLab/jenkins-operator/pkg/apis/virtuslab/v1alpha1" jenkins "github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/client" k8s "sigs.k8s.io/controller-runtime/pkg/client" "context" "fmt" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" ) const ( // ConfigureSeedJobsName this is the fixed seed job name ConfigureSeedJobsName = "Configure Seed Jobs" deployKeyIDParameterName = "DEPLOY_KEY_ID" privateKeyParameterName = "PRIVATE_KEY" repositoryURLParameterName = "REPOSITORY_URL" repositoryBranchParameterName = "REPOSITORY_BRANCH" targetsParameterName = "TARGETS" displayNameParameterName = "SEED_JOB_DISPLAY_NAME" ) // EnsureSeedJobs configures seed job and runs it for every entry from Jenkins.Spec.SeedJobs func EnsureSeedJobs(jenkinsClient jenkins.Jenkins, k8sClient k8s.Client, jenkins *virtuslabv1alpha1.Jenkins) error { err := configureSeedJob(jenkinsClient) if err != nil { return err } err = buildAndVerifySeedJobs(jenkinsClient, k8sClient, jenkins) if err != nil { return err } return nil } func configureSeedJob(jenkinsClient jenkins.Jenkins) error { _, err := jenkinsClient.CreateOrUpdateJob(seedJobConfigXML, ConfigureSeedJobsName) if err != nil { return err } return nil } func buildAndVerifySeedJobs(jenkinsClient jenkins.Jenkins, k8sClient k8s.Client, jenkins *virtuslabv1alpha1.Jenkins) error { seedJobs := jenkins.Spec.SeedJobs for _, seedJob := range seedJobs { privateKey, err := privateKeyFromSecret(k8sClient, jenkins.Namespace, seedJob) if err != nil { return err } err = buildAndVerifySeedJob( jenkinsClient, seedJob.ID, privateKey, seedJob.RepositoryURL, seedJob.RepositoryBranch, seedJob.Targets, fmt.Sprintf("Seed Job from %s", seedJob.ID)) if err != nil { return err } } return nil } func buildAndVerifySeedJob(jenkinsClient jenkins.Jenkins, deployKeyID, privateKey, repositoryURL, repositoryBranch, targets, displayName string) error { // FIXME this function should build job and verify job status when finished (state in cr status) // requeue when job is running and check job status next time options := map[string]string{ deployKeyIDParameterName: deployKeyID, privateKeyParameterName: privateKey, repositoryURLParameterName: repositoryURL, repositoryBranchParameterName: repositoryBranch, targetsParameterName: targets, displayNameParameterName: displayName, } _, err := jenkinsClient.BuildJob(ConfigureSeedJobsName, options) if err != nil { return err } return nil } func privateKeyFromSecret(k8sClient k8s.Client, namespace string, seedJob virtuslabv1alpha1.SeedJob) (string, error) { if seedJob.PrivateKey.SecretKeyRef != nil { deployKeySecret := &v1.Secret{} namespaceName := types.NamespacedName{Namespace: namespace, Name: seedJob.PrivateKey.SecretKeyRef.Name} err := k8sClient.Get(context.TODO(), namespaceName, deployKeySecret) if err != nil { return "", err } return string(deployKeySecret.Data[seedJob.PrivateKey.SecretKeyRef.Key]), nil } return "", nil } // FIXME consider to use mask-password plugin for params.PRIVATE_KEY var seedJobConfigXML = ` false DEPLOY_KEY_ID false PRIVATE_KEY REPOSITORY_URL false REPOSITORY_BRANCH master false SEED_JOB_DISPLAY_NAME false TARGETS cicd/jobs/*.jenkins false false false `