pkg/controller/jenkins_folder/chain/put_cd_pipeline_folder.go (101 lines of code) (raw):
package chain
import (
"context"
"fmt"
"strings"
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
cdPipeApi "github.com/epam/edp-cd-pipeline-operator/v2/pkg/apis/edp/v1"
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 PutCDPipelineJenkinsFolder struct {
next handler.JenkinsFolderHandler
client client.Client
ps platform.PlatformService
scheme *runtime.Scheme
}
func (h PutCDPipelineJenkinsFolder) ServeRequest(jf *jenkinsApi.JenkinsFolder) error {
log.V(2).Info("start creating cd pipeline folder in Jenkins", "name", jf.Name)
if err := h.tryToSetCDPipelineOwnerRef(jf); err != nil {
return fmt.Errorf("failed to set owner reference: %w", err)
}
jc, err := h.initGoJenkinsClient(jf)
if err != nil {
return fmt.Errorf("failed to create gojenkins client: %w", err)
}
if err := jc.CreateFolder(jf.Name); err != nil {
return fmt.Errorf("failed to create %v Jenkins folder: %w", jf.Name, err)
}
if err := h.setStatus(jf, consts.StatusFinished); err != nil {
return fmt.Errorf("failed to update JobFolder \"%s\" status: %w", jf.Name, err)
}
log.Info("folder has been created in Jenkins", "name", jf.Name)
return nextServeOrNil(h.next, jf)
}
func (h PutCDPipelineJenkinsFolder) getCdPipeline(name, namespace string) (*cdPipeApi.CDPipeline, error) {
namespacedName := types.NamespacedName{
Namespace: namespace,
Name: name,
}
cdPipeline := &cdPipeApi.CDPipeline{}
if err := h.client.Get(context.TODO(), namespacedName, cdPipeline); err != nil {
return nil, fmt.Errorf("failed to get CDPipeline: %w", err)
}
return cdPipeline, nil
}
func (h PutCDPipelineJenkinsFolder) tryToSetCDPipelineOwnerRef(jf *jenkinsApi.JenkinsFolder) error {
ow := plutil.GetOwnerReference(consts.CDPipelineKind, jf.GetOwnerReferences())
if ow != nil {
log.V(2).Info("cd pipeline owner ref already exists", "jenkins folder", jf.Name)
return nil
}
pn := strings.ReplaceAll(jf.Name, "-cd-pipeline", "")
p, err := h.getCdPipeline(pn, jf.Namespace)
if err != nil {
return fmt.Errorf("failed to get CD Pipeline %v from cluster: %w", pn, err)
}
if err = controllerutil.SetControllerReference(p, jf, h.scheme); err != nil {
return fmt.Errorf("failed to set jenkins owner ref: %w", err)
}
if err = h.client.Update(context.TODO(), jf); err != nil {
return fmt.Errorf("failed to update jenkins job %v: %w", pn, err)
}
return nil
}
func (h PutCDPipelineJenkinsFolder) 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)
jenkinsCl, err := jenkinsClient.InitGoJenkinsClient(j, h.ps)
if err != nil {
return nil, fmt.Errorf("failed to init Jenkins Client: %w", err)
}
return jenkinsCl, nil
}
func (h PutCDPipelineJenkinsFolder) 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 PutCDPipelineJenkinsFolder) 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 JenkinsFolder: %w", err)
}
}
return nil
}