pkg/controller/jenkins_folder/chain/trigger_build_job_provision.go (82 lines of code) (raw):

package chain import ( "context" "encoding/json" "errors" "fmt" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" jenkinsApi "github.com/epam/edp-jenkins-operator/v2/pkg/apis/v2/v1" jenkinsClient "github.com/epam/edp-jenkins-operator/v2/pkg/client/jenkins" "github.com/epam/edp-jenkins-operator/v2/pkg/controller/jenkins_folder/chain/handler" "github.com/epam/edp-jenkins-operator/v2/pkg/service/platform" "github.com/epam/edp-jenkins-operator/v2/pkg/util/consts" plutil "github.com/epam/edp-jenkins-operator/v2/pkg/util/platform" ) type TriggerBuildJobProvision struct { next handler.JenkinsFolderHandler client client.Client ps platform.PlatformService } func (h TriggerBuildJobProvision) ServeRequest(jf *jenkinsApi.JenkinsFolder) error { log.V(2).Info("start triggering job provision") if err := h.triggerBuildJobProvision(jf); err != nil { if setStatusErr := h.setStatus(jf, consts.StatusFailed); setStatusErr != nil { return fmt.Errorf("failed to update %v JobFolder status: %w", jf.Name, setStatusErr) } return fmt.Errorf("failed to trigger job provision build: %w", err) } if err := h.setStatus(jf, consts.StatusFinished); err != nil { return fmt.Errorf("failed to update %v JobFolder status: %w", jf.Name, err) } return nextServeOrNil(h.next, jf) } func (h TriggerBuildJobProvision) setStatus(jf *jenkinsApi.JenkinsFolder, status string) error { jf.Status = jenkinsApi.JenkinsFolderStatus{ Available: true, LastTimeUpdated: metav1.NewTime(time.Now()), Status: status, } return h.updateStatus(jf) } func (h TriggerBuildJobProvision) updateStatus(jf *jenkinsApi.JenkinsFolder) error { if err := h.client.Status().Update(context.TODO(), jf); err != nil { if err := h.client.Update(context.TODO(), jf); err != nil { return fmt.Errorf("failed to update client: %w", err) } } return nil } func (h TriggerBuildJobProvision) initGoJenkinsClient(jf *jenkinsApi.JenkinsFolder) (*jenkinsClient.JenkinsClient, error) { j, err := plutil.GetJenkinsInstanceOwner(h.client, jf.Name, jf.Namespace, jf.Spec.OwnerName, jf.GetOwnerReferences()) if err != nil { return nil, fmt.Errorf("failed to get owner jenkins for jenkins folder %v: %w", jf.Name, err) } log.Info("Jenkins instance has been received", "name", j.Name) jClient, err := jenkinsClient.InitGoJenkinsClient(j, h.ps) if err != nil { return nil, fmt.Errorf("failed to init GoJenkinsClient: %w", err) } return jClient, nil } func (h TriggerBuildJobProvision) triggerBuildJobProvision(jf *jenkinsApi.JenkinsFolder) error { if jf.Spec.Job == nil { return errors.New("failed to start to build - job field is empty in spec") } log.V(2).Info("start triggering build job", "name", jf.Spec.Job.Name) jc, err := h.initGoJenkinsClient(jf) if err != nil { return fmt.Errorf("failed to create gojenkins client: %w", err) } var jpc map[string]string if err = json.Unmarshal([]byte(jf.Spec.Job.Config), &jpc); err != nil { return fmt.Errorf("failed to Unmarshal %v: %w", []byte(jf.Spec.Job.Config), err) } bn, err := jc.BuildJob(jf.Spec.Job.Name, jpc) if err != nil { return fmt.Errorf("failed to build job provisioning: %w", err) } log.Info("end triggering build job", "name", jf.Spec.Job.Name, "with BUILD_ID", *bn) return nil }