Code refactoring
This commit is contained in:
		
							parent
							
								
									a6a85bcbf0
								
							
						
					
					
						commit
						d07ebcd507
					
				|  | @ -36,12 +36,6 @@ spec: | ||||||
|     repositoryUrl: https://github.com/VirtusLab/jenkins-operator-e2e.git |     repositoryUrl: https://github.com/VirtusLab/jenkins-operator-e2e.git | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| Create Jenkins Custom Resource: |  | ||||||
| 
 |  | ||||||
| ```bash |  | ||||||
| kubectl create -f deploy/crds/virtuslab_v1alpha1_jenkins_cr.yaml |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| Watch Jenkins instance being created: | Watch Jenkins instance being created: | ||||||
| 
 | 
 | ||||||
| ```bash | ```bash | ||||||
|  | @ -115,9 +109,6 @@ spec: | ||||||
| 
 | 
 | ||||||
| Jenkins operator will automatically configure and trigger Seed Job Pipeline for all entries from `Jenkins.spec.seedJobs`. | Jenkins operator will automatically configure and trigger Seed Job Pipeline for all entries from `Jenkins.spec.seedJobs`. | ||||||
| 
 | 
 | ||||||
| [job-dsl]:https://github.com/jenkinsci/job-dsl-plugin |  | ||||||
| [ssh-credentials]:https://github.com/jenkinsci/ssh-credentials-plugin |  | ||||||
| 
 |  | ||||||
| ## Install Plugins | ## Install Plugins | ||||||
| 
 | 
 | ||||||
| ## Configure Authorization | ## Configure Authorization | ||||||
|  | @ -125,3 +116,6 @@ Jenkins operator will automatically configure and trigger Seed Job Pipeline for | ||||||
| ## Configure Backup & Restore | ## Configure Backup & Restore | ||||||
| 
 | 
 | ||||||
| ## Debugging | ## Debugging | ||||||
|  | 
 | ||||||
|  | [job-dsl]:https://github.com/jenkinsci/job-dsl-plugin | ||||||
|  | [ssh-credentials]:https://github.com/jenkinsci/ssh-credentials-plugin | ||||||
|  | @ -27,7 +27,13 @@ kubectl create -f deploy/role_binding.yaml | ||||||
| kubectl create -f deploy/operator.yaml | kubectl create -f deploy/operator.yaml | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| Now **jenkins-operator** should be up and running within `default` namespace. | Watch **jenkins-operator** instance being created: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | kubectl get pods -w | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Now **jenkins-operator** should be up and running in `default` namespace. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -34,12 +34,32 @@ type JenkinsStatus struct { | ||||||
| 	Builds                         []Build      `json:"builds,omitempty"` | 	Builds                         []Build      `json:"builds,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // BuildStatus defines type of Jenkins build job status
 | ||||||
|  | type BuildStatus string | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// BuildSuccessStatus - the build had no errors
 | ||||||
|  | 	BuildSuccessStatus BuildStatus = "success" | ||||||
|  | 	// BuildUnstableStatus - the build had some errors but they were not fatal. For example, some tests failed
 | ||||||
|  | 	BuildUnstableStatus BuildStatus = "unstable" | ||||||
|  | 	// BuildNotBuildStatus - this status code is used in a multi-stage build (like maven2) where a problem in earlier stage prevented later stages from building
 | ||||||
|  | 	BuildNotBuildStatus BuildStatus = "not_build" | ||||||
|  | 	// BuildFailureStatus - the build had a fatal error
 | ||||||
|  | 	BuildFailureStatus BuildStatus = "failure" | ||||||
|  | 	// BuildAbortedStatus - the build was manually aborted
 | ||||||
|  | 	BuildAbortedStatus BuildStatus = "aborted" | ||||||
|  | 	// BuildRunningStatus - this is custom build status for running build, not present in jenkins build result
 | ||||||
|  | 	BuildRunningStatus BuildStatus = "running" | ||||||
|  | 	// BuildExpiredStatus - this is custom build status for expired build, not present in jenkins build result
 | ||||||
|  | 	BuildExpiredStatus BuildStatus = "expired" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| // Build defines Jenkins Build status with corresponding metadata
 | // Build defines Jenkins Build status with corresponding metadata
 | ||||||
| type Build struct { | type Build struct { | ||||||
| 	Name           string       `json:"name,omitempty"` | 	JobName        string       `json:"jobName,omitempty"` | ||||||
| 	Hash           string       `json:"hash,omitempty"` | 	Hash           string       `json:"hash,omitempty"` | ||||||
| 	Number         int64        `json:"number,omitempty"` | 	Number         int64        `json:"number,omitempty"` | ||||||
| 	Status         string       `json:"status,omitempty"` // from https://javadoc.jenkins-ci.org/hudson/model/Result.html
 | 	Status         BuildStatus  `json:"status,omitempty"` | ||||||
| 	Retires        int          `json:"retries,omitempty"` | 	Retires        int          `json:"retries,omitempty"` | ||||||
| 	CreateTime     *metav1.Time `json:"createTime,omitempty"` | 	CreateTime     *metav1.Time `json:"createTime,omitempty"` | ||||||
| 	LastUpdateTime *metav1.Time `json:"lastUpdateTime,omitempty"` | 	LastUpdateTime *metav1.Time `json:"lastUpdateTime,omitempty"` | ||||||
|  |  | ||||||
|  | @ -38,23 +38,12 @@ func New(k8sClient k8s.Client, jenkinsClient jenkinsclient.Jenkins, logger logr. | ||||||
| func (r *ReconcileUserConfiguration) Reconcile() (*reconcile.Result, error) { | func (r *ReconcileUserConfiguration) Reconcile() (*reconcile.Result, error) { | ||||||
| 	// reconcile seed jobs
 | 	// reconcile seed jobs
 | ||||||
| 	result, err := r.reconcileSeedJobs() | 	result, err := r.reconcileSeedJobs() | ||||||
| 	if err != nil { | 	if err != nil || result != nil { | ||||||
| 		return result, err | 		return result, err | ||||||
| 	} | 	} | ||||||
| 	if result != nil { |  | ||||||
| 		return result, nil |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	// reconcile custom groovy scripts
 | 	// reconcile custom groovy scripts
 | ||||||
| 	result, err = r.reconcileCustomGroovy() | 	return r.reconcileCustomGroovy() | ||||||
| 	if err != nil { |  | ||||||
| 		return result, err |  | ||||||
| 	} |  | ||||||
| 	if result != nil { |  | ||||||
| 		return result, nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil, nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *ReconcileUserConfiguration) reconcileSeedJobs() (*reconcile.Result, error) { | func (r *ReconcileUserConfiguration) reconcileSeedJobs() (*reconcile.Result, error) { | ||||||
|  |  | ||||||
|  | @ -122,6 +122,7 @@ func (s *SeedJobs) privateKeyFromSecret(namespace string, seedJob virtuslabv1alp | ||||||
| 	return "", nil | 	return "", nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // FIXME(antoniaklja) use mask-password plugin for params.PRIVATE_KEY
 | ||||||
| // seedJobConfigXML this is the XML representation of seed job
 | // seedJobConfigXML this is the XML representation of seed job
 | ||||||
| var seedJobConfigXML = ` | var seedJobConfigXML = ` | ||||||
| <flow-definition plugin="workflow-job@2.30"> | <flow-definition plugin="workflow-job@2.30"> | ||||||
|  |  | ||||||
|  | @ -3,12 +3,10 @@ package seedjobs | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"os" |  | ||||||
| 	"testing" | 	"testing" | ||||||
| 
 | 
 | ||||||
| 	virtuslabv1alpha1 "github.com/VirtusLab/jenkins-operator/pkg/apis/virtuslab/v1alpha1" | 	virtuslabv1alpha1 "github.com/VirtusLab/jenkins-operator/pkg/apis/virtuslab/v1alpha1" | ||||||
| 	"github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/client" | 	"github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/client" | ||||||
| 	"github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/jobs" |  | ||||||
| 
 | 
 | ||||||
| 	"github.com/bndr/gojenkins" | 	"github.com/bndr/gojenkins" | ||||||
| 	"github.com/golang/mock/gomock" | 	"github.com/golang/mock/gomock" | ||||||
|  | @ -22,11 +20,6 @@ import ( | ||||||
| 	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" | 	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func TestMain(m *testing.M) { |  | ||||||
| 	virtuslabv1alpha1.SchemeBuilder.AddToScheme(scheme.Scheme) |  | ||||||
| 	os.Exit(m.Run()) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestEnsureSeedJobs(t *testing.T) { | func TestEnsureSeedJobs(t *testing.T) { | ||||||
| 	// given
 | 	// given
 | ||||||
| 	logger := logf.ZapLogger(false) | 	logger := logf.ZapLogger(false) | ||||||
|  | @ -36,10 +29,13 @@ func TestEnsureSeedJobs(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 	jenkinsClient := client.NewMockJenkins(ctrl) | 	jenkinsClient := client.NewMockJenkins(ctrl) | ||||||
| 	fakeClient := fake.NewFakeClient() | 	fakeClient := fake.NewFakeClient() | ||||||
|  | 	err := virtuslabv1alpha1.SchemeBuilder.AddToScheme(scheme.Scheme) | ||||||
|  | 	assert.NoError(t, err) | ||||||
| 
 | 
 | ||||||
| 	jenkins := jenkinsCustomResource() | 	jenkins := jenkinsCustomResource() | ||||||
| 	err := fakeClient.Create(ctx, jenkins) | 	err = fakeClient.Create(ctx, jenkins) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
|  | 	buildNumber := int64(1) | ||||||
| 
 | 
 | ||||||
| 	for reconcileAttempt := 1; reconcileAttempt <= 2; reconcileAttempt++ { | 	for reconcileAttempt := 1; reconcileAttempt <= 2; reconcileAttempt++ { | ||||||
| 		logger.Info(fmt.Sprintf("Reconcile attempt #%d", reconcileAttempt)) | 		logger.Info(fmt.Sprintf("Reconcile attempt #%d", reconcileAttempt)) | ||||||
|  | @ -58,7 +54,7 @@ func TestEnsureSeedJobs(t *testing.T) { | ||||||
| 				GetJob(ConfigureSeedJobsName). | 				GetJob(ConfigureSeedJobsName). | ||||||
| 				Return(&gojenkins.Job{ | 				Return(&gojenkins.Job{ | ||||||
| 					Raw: &gojenkins.JobResponse{ | 					Raw: &gojenkins.JobResponse{ | ||||||
| 						NextBuildNumber: int64(1), | 						NextBuildNumber: buildNumber, | ||||||
| 					}, | 					}, | ||||||
| 				}, nil) | 				}, nil) | ||||||
| 
 | 
 | ||||||
|  | @ -80,7 +76,7 @@ func TestEnsureSeedJobs(t *testing.T) { | ||||||
| 				GetBuild(ConfigureSeedJobsName, gomock.Any()). | 				GetBuild(ConfigureSeedJobsName, gomock.Any()). | ||||||
| 				Return(&gojenkins.Build{ | 				Return(&gojenkins.Build{ | ||||||
| 					Raw: &gojenkins.BuildResponse{ | 					Raw: &gojenkins.BuildResponse{ | ||||||
| 						Result: jobs.SuccessStatus, | 						Result: string(virtuslabv1alpha1.BuildSuccessStatus), | ||||||
| 					}, | 					}, | ||||||
| 				}, nil) | 				}, nil) | ||||||
| 		} | 		} | ||||||
|  | @ -91,15 +87,27 @@ func TestEnsureSeedJobs(t *testing.T) { | ||||||
| 		err = fakeClient.Get(ctx, types.NamespacedName{Name: jenkins.Name, Namespace: jenkins.Namespace}, jenkins) | 		err = fakeClient.Get(ctx, types.NamespacedName{Name: jenkins.Name, Namespace: jenkins.Namespace}, jenkins) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 
 | 
 | ||||||
|  | 		assert.Equal(t, 1, len(jenkins.Status.Builds), "There is one running job") | ||||||
|  | 		build := jenkins.Status.Builds[0] | ||||||
|  | 		assert.Equal(t, buildNumber, build.Number) | ||||||
|  | 		assert.Equal(t, ConfigureSeedJobsName, build.JobName) | ||||||
|  | 		assert.NotNil(t, build.CreateTime) | ||||||
|  | 		assert.NotEmpty(t, build.Hash) | ||||||
|  | 		assert.NotNil(t, build.LastUpdateTime) | ||||||
|  | 		assert.Equal(t, 0, build.Retires) | ||||||
|  | 
 | ||||||
| 		// first run - should create job and schedule build
 | 		// first run - should create job and schedule build
 | ||||||
| 		if reconcileAttempt == 1 { | 		if reconcileAttempt == 1 { | ||||||
| 			assert.False(t, done) | 			assert.False(t, done) | ||||||
|  | 			assert.Equal(t, string(virtuslabv1alpha1.BuildRunningStatus), string(build.Status)) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// second run - should update and finish job
 | 		// second run - should update and finish job
 | ||||||
| 		if reconcileAttempt == 2 { | 		if reconcileAttempt == 2 { | ||||||
| 			assert.True(t, done) | 			assert.True(t, done) | ||||||
|  | 			assert.Equal(t, string(virtuslabv1alpha1.BuildSuccessStatus), string(build.Status)) | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| package theme | package theme | ||||||
| 
 | 
 | ||||||
| // SetThemeGroovyScript it's a groovy script which set custom jenkins theme
 | // SetThemeGroovyScript it's a groovy script which set custom jenkins theme
 | ||||||
|  | // TODO move to base configuration
 | ||||||
| var SetThemeGroovyScript = ` | var SetThemeGroovyScript = ` | ||||||
| import jenkins.* | import jenkins.* | ||||||
| import jenkins.model.* | import jenkins.model.* | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"crypto/x509" | 	"crypto/x509" | ||||||
| 	"encoding/pem" | 	"encoding/pem" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
|  | @ -11,18 +12,17 @@ import ( | ||||||
| 	"github.com/VirtusLab/jenkins-operator/pkg/log" | 	"github.com/VirtusLab/jenkins-operator/pkg/log" | ||||||
| 
 | 
 | ||||||
| 	"k8s.io/api/core/v1" | 	"k8s.io/api/core/v1" | ||||||
|  | 	apierrors "k8s.io/apimachinery/pkg/api/errors" | ||||||
| 	"k8s.io/apimachinery/pkg/types" | 	"k8s.io/apimachinery/pkg/types" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Validate validates Jenkins CR Spec section
 | // Validate validates Jenkins CR Spec section
 | ||||||
| func (r *ReconcileUserConfiguration) Validate(jenkins *virtuslabv1alpha1.Jenkins) bool { | func (r *ReconcileUserConfiguration) Validate(jenkins *virtuslabv1alpha1.Jenkins) (bool, error) { | ||||||
| 	if !r.validateSeedJobs(jenkins) { | 	return r.validateSeedJobs(jenkins) | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
| 	return true |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *ReconcileUserConfiguration) validateSeedJobs(jenkins *virtuslabv1alpha1.Jenkins) bool { | func (r *ReconcileUserConfiguration) validateSeedJobs(jenkins *virtuslabv1alpha1.Jenkins) (bool, error) { | ||||||
|  | 	valid := true | ||||||
| 	if jenkins.Spec.SeedJobs != nil { | 	if jenkins.Spec.SeedJobs != nil { | ||||||
| 		for _, seedJob := range jenkins.Spec.SeedJobs { | 		for _, seedJob := range jenkins.Spec.SeedJobs { | ||||||
| 			logger := r.logger.WithValues("seedJob", fmt.Sprintf("%+v", seedJob)).V(log.VWarn) | 			logger := r.logger.WithValues("seedJob", fmt.Sprintf("%+v", seedJob)).V(log.VWarn) | ||||||
|  | @ -30,14 +30,14 @@ func (r *ReconcileUserConfiguration) validateSeedJobs(jenkins *virtuslabv1alpha1 | ||||||
| 			// validate seed job id is not empty
 | 			// validate seed job id is not empty
 | ||||||
| 			if len(seedJob.ID) == 0 { | 			if len(seedJob.ID) == 0 { | ||||||
| 				logger.Info("seed job id can't be empty") | 				logger.Info("seed job id can't be empty") | ||||||
| 				return false | 				valid = false | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			// validate repository url match private key
 | 			// validate repository url match private key
 | ||||||
| 			if strings.Contains(seedJob.RepositoryURL, "git@") { | 			if strings.Contains(seedJob.RepositoryURL, "git@") { | ||||||
| 				if seedJob.PrivateKey.SecretKeyRef == nil { | 				if seedJob.PrivateKey.SecretKeyRef == nil { | ||||||
| 					logger.Info("private key can't be empty while using ssh repository url") | 					logger.Info("private key can't be empty while using ssh repository url") | ||||||
| 					return false | 					valid = false | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | @ -46,43 +46,44 @@ func (r *ReconcileUserConfiguration) validateSeedJobs(jenkins *virtuslabv1alpha1 | ||||||
| 				deployKeySecret := &v1.Secret{} | 				deployKeySecret := &v1.Secret{} | ||||||
| 				namespaceName := types.NamespacedName{Namespace: jenkins.Namespace, Name: seedJob.PrivateKey.SecretKeyRef.Name} | 				namespaceName := types.NamespacedName{Namespace: jenkins.Namespace, Name: seedJob.PrivateKey.SecretKeyRef.Name} | ||||||
| 				err := r.k8sClient.Get(context.TODO(), namespaceName, deployKeySecret) | 				err := r.k8sClient.Get(context.TODO(), namespaceName, deployKeySecret) | ||||||
| 				//TODO(bantoniak) handle error properly
 | 				if err != nil && apierrors.IsNotFound(err) { | ||||||
| 				if err != nil { | 					logger.Info("secret not found") | ||||||
| 					logger.Info("couldn't read private key secret") | 					valid = false | ||||||
| 					return false | 				} else if err != nil { | ||||||
|  | 					return false, err | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				privateKey := string(deployKeySecret.Data[seedJob.PrivateKey.SecretKeyRef.Key]) | 				privateKey := string(deployKeySecret.Data[seedJob.PrivateKey.SecretKeyRef.Key]) | ||||||
| 				if privateKey == "" { | 				if privateKey == "" { | ||||||
| 					logger.Info("private key is empty") | 					logger.Info("private key is empty") | ||||||
| 					return false | 					valid = false | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				if !validatePrivateKey(privateKey) { | 				if err := validatePrivateKey(privateKey); err != nil { | ||||||
| 					logger.Info("private key is invalid") | 					logger.Info(fmt.Sprintf("private key is invalid: %s", err)) | ||||||
| 					return false | 					valid = false | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return true | 	return valid, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func validatePrivateKey(privateKey string) bool { | func validatePrivateKey(privateKey string) error { | ||||||
| 	block, _ := pem.Decode([]byte(privateKey)) | 	block, _ := pem.Decode([]byte(privateKey)) | ||||||
| 	if block == nil { | 	if block == nil { | ||||||
| 		return false | 		return errors.New("failed to decode PEM block") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) | 	priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	err = priv.Validate() | 	err = priv.Validate() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return true | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -190,9 +190,13 @@ func TestValidateUserConfiguration(t *testing.T) { | ||||||
| 	for _, testingData := range data { | 	for _, testingData := range data { | ||||||
| 		t.Run(fmt.Sprintf("Testing '%s'", testingData.description), func(t *testing.T) { | 		t.Run(fmt.Sprintf("Testing '%s'", testingData.description), func(t *testing.T) { | ||||||
| 			fakeClient := fake.NewFakeClient() | 			fakeClient := fake.NewFakeClient() | ||||||
| 			fakeClient.Create(context.TODO(), testingData.secret) | 			if testingData.secret != nil { | ||||||
|  | 				err := fakeClient.Create(context.TODO(), testingData.secret) | ||||||
|  | 				assert.NoError(t, err) | ||||||
|  | 			} | ||||||
| 			userReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false), nil) | 			userReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false), nil) | ||||||
| 			result := userReconcileLoop.Validate(testingData.jenkins) | 			result, err := userReconcileLoop.Validate(testingData.jenkins) | ||||||
|  | 			assert.NoError(t, err) | ||||||
| 			assert.Equal(t, testingData.expectedResult, result) | 			assert.Equal(t, testingData.expectedResult, result) | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -64,6 +64,8 @@ func (g *Groovy) EnsureGroovyJob(groovyScript string, jenkins *virtuslabv1alpha1 | ||||||
| 	return done, nil | 	return done, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // FIXME(antoniaklja) use mask-password plugin for params.GROOVY_SCRIPT
 | ||||||
|  | // TODO add groovy script name
 | ||||||
| var groovyJobConfigXML = ` | var groovyJobConfigXML = ` | ||||||
| <flow-definition plugin="workflow-job@2.30"> | <flow-definition plugin="workflow-job@2.30"> | ||||||
|   <actions/> |   <actions/> | ||||||
|  | @ -73,7 +75,7 @@ var groovyJobConfigXML = ` | ||||||
|     <hudson.model.ParametersDefinitionProperty> |     <hudson.model.ParametersDefinitionProperty> | ||||||
|       <parameterDefinitions> |       <parameterDefinitions> | ||||||
|         <hudson.model.TextParameterDefinition> |         <hudson.model.TextParameterDefinition> | ||||||
|           <name>GROOVY_SCRIPT</name> |           <name>` + groovyScriptParameterName + `</name> | ||||||
|           <description></description> |           <description></description> | ||||||
|           <defaultValue></defaultValue> |           <defaultValue></defaultValue> | ||||||
|           <trim>false</trim> |           <trim>false</trim> | ||||||
|  |  | ||||||
|  | @ -52,6 +52,7 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// TODO Modify this to be the types you create that are owned by the primary resource
 | ||||||
| 	// Watch for changes to secondary resource Pods and requeue the owner Jenkins
 | 	// Watch for changes to secondary resource Pods and requeue the owner Jenkins
 | ||||||
| 	err = c.Watch(&source.Kind{Type: &corev1.Pod{}}, &handler.EnqueueRequestForOwner{ | 	err = c.Watch(&source.Kind{Type: &corev1.Pod{}}, &handler.EnqueueRequestForOwner{ | ||||||
| 		IsController: true, | 		IsController: true, | ||||||
|  | @ -121,7 +122,11 @@ func (r *ReconcileJenkins) Reconcile(request reconcile.Request) (reconcile.Resul | ||||||
| 
 | 
 | ||||||
| 	// Reconcile user configuration
 | 	// Reconcile user configuration
 | ||||||
| 	userConfiguration := user.New(r.client, jenkinsClient, logger, jenkins) | 	userConfiguration := user.New(r.client, jenkinsClient, logger, jenkins) | ||||||
| 	if !userConfiguration.Validate(jenkins) { | 	valid, err := userConfiguration.Validate(jenkins) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return reconcile.Result{}, err | ||||||
|  | 	} | ||||||
|  | 	if !valid { | ||||||
| 		logger.V(log.VWarn).Info("Validation of user configuration failed, please correct Jenkins CR") | 		logger.V(log.VWarn).Info("Validation of user configuration failed, please correct Jenkins CR") | ||||||
| 		return reconcile.Result{}, nil // don't requeue
 | 		return reconcile.Result{}, nil // don't requeue
 | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -15,26 +15,7 @@ import ( | ||||||
| 	k8s "sigs.k8s.io/controller-runtime/pkg/client" | 	k8s "sigs.k8s.io/controller-runtime/pkg/client" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( |  | ||||||
| 	// SuccessStatus - the build had no errors
 |  | ||||||
| 	SuccessStatus = "success" |  | ||||||
| 	// UnstableStatus - the build had some errors but they were not fatal. For example, some tests failed
 |  | ||||||
| 	UnstableStatus = "unstable" |  | ||||||
| 	// NotBuildStatus - this status code is used in a multi-stage build (like maven2) where a problem in earlier stage prevented later stages from building
 |  | ||||||
| 	NotBuildStatus = "not_build" |  | ||||||
| 	// FailureStatus - the build had a fatal error
 |  | ||||||
| 	FailureStatus = "failure" |  | ||||||
| 	// AbortedStatus - the build was manually aborted
 |  | ||||||
| 	AbortedStatus = "aborted" |  | ||||||
| 	// RunningStatus - this is custom build status for running build, not present in jenkins build result
 |  | ||||||
| 	RunningStatus = "running" |  | ||||||
| 	// ExpiredStatus - this is custom build status for expired build, not present in jenkins build result
 |  | ||||||
| 	ExpiredStatus = "expired" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var ( | var ( | ||||||
| 	// ErrorEmptyJenkinsCR - this is custom error returned when jenkins custom resource is empty
 |  | ||||||
| 	ErrorEmptyJenkinsCR = errors.New("empty jenkins cr") |  | ||||||
| 	// ErrorUnexpectedBuildStatus - this is custom error returned when jenkins build has unexpected status
 | 	// ErrorUnexpectedBuildStatus - this is custom error returned when jenkins build has unexpected status
 | ||||||
| 	ErrorUnexpectedBuildStatus = errors.New("unexpected build status") | 	ErrorUnexpectedBuildStatus = errors.New("unexpected build status") | ||||||
| 	// ErrorBuildFailed - this is custom error returned when jenkins build has failed
 | 	// ErrorBuildFailed - this is custom error returned when jenkins build has failed
 | ||||||
|  | @ -70,47 +51,47 @@ func New(jenkinsClient client.Jenkins, k8sClient k8s.Client, logger logr.Logger) | ||||||
| // entire state is saved in Jenkins.Status.Builds section
 | // entire state is saved in Jenkins.Status.Builds section
 | ||||||
| // function return 'true' when build finished successfully or false when reconciliation loop should requeue this function
 | // function return 'true' when build finished successfully or false when reconciliation loop should requeue this function
 | ||||||
| // preserveStatus determines that build won't be removed from Jenkins.Status.Builds section
 | // preserveStatus determines that build won't be removed from Jenkins.Status.Builds section
 | ||||||
| func (jobs *Jobs) EnsureBuildJob(name, hash string, parameters map[string]string, jenkins *virtuslabv1alpha1.Jenkins, preserveStatus bool) (done bool, err error) { | func (jobs *Jobs) EnsureBuildJob(jobName, hash string, parameters map[string]string, jenkins *virtuslabv1alpha1.Jenkins, preserveStatus bool) (done bool, err error) { | ||||||
| 	jobs.logger.Info(fmt.Sprintf("Ensuring build, name:'%s' hash:'%s'", name, hash)) | 	jobs.logger.Info(fmt.Sprintf("Ensuring build, name:'%s' hash:'%s'", jobName, hash)) | ||||||
| 
 | 
 | ||||||
| 	build, err := jobs.getBuildFromStatus(name, hash, jenkins) | 	build, err := jobs.getBuildFromStatus(jobName, hash, jenkins) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if build != nil { | 	if build != nil { | ||||||
| 		jobs.logger.Info(fmt.Sprintf("Build exists in status, name:'%s' hash:'%s' status: '%s'", name, hash, build.Status)) | 		jobs.logger.Info(fmt.Sprintf("Build exists in status, %+v", build)) | ||||||
| 		switch strings.ToLower(build.Status) { | 		switch build.Status { | ||||||
| 		case SuccessStatus: | 		case virtuslabv1alpha1.BuildSuccessStatus: | ||||||
| 			return jobs.ensureSuccessBuild(*build, jenkins, preserveStatus) | 			return jobs.ensureSuccessBuild(*build, jenkins, preserveStatus) | ||||||
| 		case RunningStatus: | 		case virtuslabv1alpha1.BuildRunningStatus: | ||||||
| 			return jobs.ensureRunningBuild(*build, jenkins, preserveStatus) | 			return jobs.ensureRunningBuild(*build, jenkins, preserveStatus) | ||||||
| 		case UnstableStatus, NotBuildStatus, FailureStatus, AbortedStatus: | 		case virtuslabv1alpha1.BuildUnstableStatus, virtuslabv1alpha1.BuildNotBuildStatus, virtuslabv1alpha1.BuildFailureStatus, virtuslabv1alpha1.BuildAbortedStatus: | ||||||
| 			return jobs.ensureFailedBuild(*build, jenkins, parameters, preserveStatus) | 			return jobs.ensureFailedBuild(*build, jenkins, parameters, preserveStatus) | ||||||
| 		case ExpiredStatus: | 		case virtuslabv1alpha1.BuildExpiredStatus: | ||||||
| 			return jobs.ensureExpiredBuild(*build, jenkins, preserveStatus) | 			return jobs.ensureExpiredBuild(*build, jenkins, preserveStatus) | ||||||
| 		default: | 		default: | ||||||
| 			jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Unexpected build status, name:'%s' hash:'%s' status:'%s'", name, hash, build.Status)) | 			jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Unexpected build status, %+v", build)) | ||||||
| 			return false, ErrorUnexpectedBuildStatus | 			return false, ErrorUnexpectedBuildStatus | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// build is run first time - build job and update status
 | 	// build is run first time - build job and update status
 | ||||||
| 	jobs.logger.Info(fmt.Sprintf("Build doesn't exist, running and updating status, name:'%s' hash:'%s'", name, hash)) | 	jobs.logger.Info(fmt.Sprintf("Build doesn't exist, running and updating status, %+v", build)) | ||||||
| 	created := metav1.Now() | 	created := metav1.Now() | ||||||
| 	newBuild := virtuslabv1alpha1.Build{ | 	newBuild := virtuslabv1alpha1.Build{ | ||||||
| 		Name:       name, | 		JobName:    jobName, | ||||||
| 		Hash:       hash, | 		Hash:       hash, | ||||||
| 		CreateTime: &created, | 		CreateTime: &created, | ||||||
| 	} | 	} | ||||||
| 	return jobs.buildJob(newBuild, parameters, jenkins) | 	return jobs.buildJob(newBuild, parameters, jenkins) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (jobs *Jobs) getBuildFromStatus(name string, hash string, jenkins *virtuslabv1alpha1.Jenkins) (*virtuslabv1alpha1.Build, error) { | func (jobs *Jobs) getBuildFromStatus(jobName string, hash string, jenkins *virtuslabv1alpha1.Jenkins) (*virtuslabv1alpha1.Build, error) { | ||||||
| 	if jenkins != nil { | 	if jenkins != nil { | ||||||
| 		builds := jenkins.Status.Builds | 		builds := jenkins.Status.Builds | ||||||
| 		for _, build := range builds { | 		for _, build := range builds { | ||||||
| 			if build.Name == name && build.Hash == hash { | 			if build.JobName == jobName && build.Hash == hash { | ||||||
| 				return &build, nil | 				return &build, nil | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | @ -119,18 +100,13 @@ func (jobs *Jobs) getBuildFromStatus(name string, hash string, jenkins *virtusla | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (jobs *Jobs) ensureSuccessBuild(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins, preserveStatus bool) (bool, error) { | func (jobs *Jobs) ensureSuccessBuild(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins, preserveStatus bool) (bool, error) { | ||||||
| 	if jenkins == nil { | 	jobs.logger.Info(fmt.Sprintf("Ensuring success build, %+v", build)) | ||||||
| 		jobs.logger.V(log.VWarn).Info("Jenkins CR is empty") |  | ||||||
| 		return false, ErrorEmptyJenkinsCR |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	jobs.logger.Info(fmt.Sprintf("Ensuring success build, name:'%s' hash:'%s'", build.Name, build.Hash)) |  | ||||||
| 
 | 
 | ||||||
| 	if !preserveStatus { | 	if !preserveStatus { | ||||||
| 		err := jobs.removeBuildFromStatus(build, jenkins) | 		err := jobs.removeBuildFromStatus(build, jenkins) | ||||||
| 		jobs.logger.Info(fmt.Sprintf("Removing build from status, name:'%s' hash:'%s'", build.Name, build.Hash)) | 		jobs.logger.Info(fmt.Sprintf("Removing build from status, %+v", build)) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't remove build from status, name:'%s' hash:'%s'", build.Name, build.Hash)) | 			jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't remove build from status, %+v", build)) | ||||||
| 			return false, err | 			return false, err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -138,41 +114,36 @@ func (jobs *Jobs) ensureSuccessBuild(build virtuslabv1alpha1.Build, jenkins *vir | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (jobs *Jobs) ensureRunningBuild(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins, preserveStatus bool) (bool, error) { | func (jobs *Jobs) ensureRunningBuild(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins, preserveStatus bool) (bool, error) { | ||||||
| 	if jenkins == nil { | 	jobs.logger.Info(fmt.Sprintf("Ensuring running build, %+v", build)) | ||||||
| 		jobs.logger.V(log.VWarn).Info("Jenkins CR is empty") |  | ||||||
| 		return false, ErrorEmptyJenkinsCR |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	jobs.logger.Info(fmt.Sprintf("Ensuring running build, name:'%s' hash:'%s'", build.Name, build.Hash)) |  | ||||||
| 	// FIXME (antoniaklja) implement build expiration
 | 	// FIXME (antoniaklja) implement build expiration
 | ||||||
| 
 | 
 | ||||||
| 	jenkinsBuild, err := jobs.jenkinsClient.GetBuild(build.Name, build.Number) | 	jenkinsBuild, err := jobs.jenkinsClient.GetBuild(build.JobName, build.Number) | ||||||
| 	if isNotFoundError(err) { | 	if isNotFoundError(err) { | ||||||
| 		jobs.logger.Info(fmt.Sprintf("Build still running , name:'%s' hash:'%s'", build.Name, build.Hash)) | 		jobs.logger.Info(fmt.Sprintf("Build still running , %+v", build)) | ||||||
| 		return false, nil | 		return false, nil | ||||||
| 	} else if err != nil { | 	} else if err != nil { | ||||||
| 		jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't get jenkins build, name:'%s' number:'%d'", build.Name, build.Number)) | 		jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't get jenkins build, %+v", build)) | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if jenkinsBuild.GetResult() != "" { | 	if jenkinsBuild.GetResult() != "" { | ||||||
| 		build.Status = strings.ToLower(jenkinsBuild.GetResult()) | 		build.Status = virtuslabv1alpha1.BuildStatus(strings.ToLower(jenkinsBuild.GetResult())) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	jobs.logger.Info(fmt.Sprintf("Updating build status, name:'%s' hash:'%s' status:'%s'", build.Name, build.Hash, build.Status)) |  | ||||||
| 	err = jobs.updateBuildStatus(build, jenkins) | 	err = jobs.updateBuildStatus(build, jenkins) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't update build status, name:'%s' hash:'%s'", build.Name, build.Hash)) | 		jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't update build status, %+v", build)) | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if build.Status == SuccessStatus { | 	if build.Status == virtuslabv1alpha1.BuildSuccessStatus { | ||||||
| 		jobs.logger.Info(fmt.Sprintf("Build finished successfully, name:'%s' hash:'%s' status:'%s'", build.Name, build.Hash, build.Status)) | 		jobs.logger.Info(fmt.Sprintf("Build finished successfully, %+v", build)) | ||||||
| 		return true, nil | 		return true, nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if build.Status == FailureStatus || build.Status == UnstableStatus || build.Status == NotBuildStatus || build.Status == AbortedStatus { | 	if build.Status == virtuslabv1alpha1.BuildFailureStatus || build.Status == virtuslabv1alpha1.BuildUnstableStatus || | ||||||
| 		jobs.logger.Info(fmt.Sprintf("Build failed, name:'%s' hash:'%s' status:'%s'", build.Name, build.Hash, build.Status)) | 		build.Status == virtuslabv1alpha1.BuildNotBuildStatus || build.Status == virtuslabv1alpha1.BuildAbortedStatus { | ||||||
|  | 		jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Build failed, %+v", build)) | ||||||
| 		return false, ErrorBuildFailed | 		return false, ErrorBuildFailed | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -180,31 +151,26 @@ func (jobs *Jobs) ensureRunningBuild(build virtuslabv1alpha1.Build, jenkins *vir | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (jobs *Jobs) ensureFailedBuild(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins, parameters map[string]string, preserveStatus bool) (bool, error) { | func (jobs *Jobs) ensureFailedBuild(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins, parameters map[string]string, preserveStatus bool) (bool, error) { | ||||||
| 	if jenkins == nil { | 	jobs.logger.Info(fmt.Sprintf("Ensuring failed build, %+v", build)) | ||||||
| 		jobs.logger.V(log.VWarn).Info("Jenkins CR is empty") |  | ||||||
| 		return false, ErrorEmptyJenkinsCR |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	jobs.logger.Info(fmt.Sprintf("Ensuring failed build, name:'%s' hash:'%s' status: '%s'", build.Name, build.Hash, build.Status)) |  | ||||||
| 
 | 
 | ||||||
| 	if build.Retires < BuildRetires { | 	if build.Retires < BuildRetires { | ||||||
| 		jobs.logger.Info(fmt.Sprintf("Retrying build, name:'%s' hash:'%s' retries: '%d'", build.Name, build.Hash, build.Retires)) | 		jobs.logger.Info(fmt.Sprintf("Retrying build, %+v", build)) | ||||||
| 		build.Retires = build.Retires + 1 | 		build.Retires = build.Retires + 1 | ||||||
| 		_, err := jobs.buildJob(build, parameters, jenkins) | 		_, err := jobs.buildJob(build, parameters, jenkins) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't retry build, name:'%s' hash:'%s'", build.Name, build.Hash)) | 			jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't retry build, %+v", build)) | ||||||
| 			return false, err | 			return false, err | ||||||
| 		} | 		} | ||||||
| 		return false, nil | 		return false, nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	jobs.logger.Info(fmt.Sprintf("The retries limit was reached , name:'%s' hash:'%s' retries: '%d'", build.Name, build.Hash, build.Retires)) | 	jobs.logger.Info(fmt.Sprintf("The retries limit was reached , %+v", build)) | ||||||
| 
 | 
 | ||||||
| 	if !preserveStatus { | 	if !preserveStatus { | ||||||
| 		jobs.logger.Info(fmt.Sprintf("Removing build from status, name:'%s' hash:'%s'", build.Name, build.Hash)) | 		jobs.logger.Info(fmt.Sprintf("Removing build from status, %+v", build)) | ||||||
| 		err := jobs.removeBuildFromStatus(build, jenkins) | 		err := jobs.removeBuildFromStatus(build, jenkins) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't remove build from status, name:'%s' hash:'%s'", build.Name, build.Hash)) | 			jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't remove build from status, %+v", build)) | ||||||
| 			return false, err | 			return false, err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -212,14 +178,9 @@ func (jobs *Jobs) ensureFailedBuild(build virtuslabv1alpha1.Build, jenkins *virt | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (jobs *Jobs) ensureExpiredBuild(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins, preserveStatus bool) (bool, error) { | func (jobs *Jobs) ensureExpiredBuild(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins, preserveStatus bool) (bool, error) { | ||||||
| 	if jenkins == nil { | 	jobs.logger.Info(fmt.Sprintf("Ensuring expired build, %+v", build)) | ||||||
| 		jobs.logger.V(log.VWarn).Info("Jenkins CR is empty") |  | ||||||
| 		return false, ErrorEmptyJenkinsCR |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	jobs.logger.Info(fmt.Sprintf("Ensuring expired build, name:'%s' hash:'%s' status: '%s'", build.Name, build.Hash, build.Status)) | 	jenkinsBuild, err := jobs.jenkinsClient.GetBuild(build.JobName, build.Number) | ||||||
| 
 |  | ||||||
| 	jenkinsBuild, err := jobs.jenkinsClient.GetBuild(build.Name, build.Number) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
|  | @ -229,12 +190,12 @@ func (jobs *Jobs) ensureExpiredBuild(build virtuslabv1alpha1.Build, jenkins *vir | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	jenkinsBuild, err = jobs.jenkinsClient.GetBuild(build.Name, build.Number) | 	jenkinsBuild, err = jobs.jenkinsClient.GetBuild(build.JobName, build.Number) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if jenkinsBuild.GetResult() != AbortedStatus { | 	if virtuslabv1alpha1.BuildStatus(jenkinsBuild.GetResult()) != virtuslabv1alpha1.BuildAbortedStatus { | ||||||
| 		return false, ErrorAbortBuildFailed | 		return false, ErrorAbortBuildFailed | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -246,10 +207,10 @@ func (jobs *Jobs) ensureExpiredBuild(build virtuslabv1alpha1.Build, jenkins *vir | ||||||
| 	// TODO(antoniaklja) clean up k8s resources
 | 	// TODO(antoniaklja) clean up k8s resources
 | ||||||
| 
 | 
 | ||||||
| 	if !preserveStatus { | 	if !preserveStatus { | ||||||
| 		jobs.logger.Info(fmt.Sprintf("Removing build from status, name:'%s' hash:'%s'", build.Name, build.Hash)) | 		jobs.logger.Info(fmt.Sprintf("Removing build from status, %+v", build)) | ||||||
| 		err = jobs.removeBuildFromStatus(build, jenkins) | 		err = jobs.removeBuildFromStatus(build, jenkins) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't remove build from status, name:'%s' hash:'%s'", build.Name, build.Hash)) | 			jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't remove build from status, %+v", build)) | ||||||
| 			return false, err | 			return false, err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -258,13 +219,9 @@ func (jobs *Jobs) ensureExpiredBuild(build virtuslabv1alpha1.Build, jenkins *vir | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (jobs *Jobs) removeBuildFromStatus(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins) error { | func (jobs *Jobs) removeBuildFromStatus(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins) error { | ||||||
| 	if jenkins == nil { |  | ||||||
| 		return ErrorEmptyJenkinsCR |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	builds := make([]virtuslabv1alpha1.Build, len(jenkins.Status.Builds), len(jenkins.Status.Builds)) | 	builds := make([]virtuslabv1alpha1.Build, len(jenkins.Status.Builds), len(jenkins.Status.Builds)) | ||||||
| 	for _, existingBuild := range jenkins.Status.Builds { | 	for _, existingBuild := range jenkins.Status.Builds { | ||||||
| 		if existingBuild.Name != build.Name && existingBuild.Hash != build.Hash { | 		if existingBuild.JobName != build.JobName && existingBuild.Hash != build.Hash { | ||||||
| 			builds = append(builds, existingBuild) | 			builds = append(builds, existingBuild) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -278,49 +235,37 @@ func (jobs *Jobs) removeBuildFromStatus(build virtuslabv1alpha1.Build, jenkins * | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (jobs *Jobs) buildJob(build virtuslabv1alpha1.Build, parameters map[string]string, jenkins *virtuslabv1alpha1.Jenkins) (bool, error) { | func (jobs *Jobs) buildJob(build virtuslabv1alpha1.Build, parameters map[string]string, jenkins *virtuslabv1alpha1.Jenkins) (bool, error) { | ||||||
| 	if jenkins == nil { | 	job, err := jobs.jenkinsClient.GetJob(build.JobName) | ||||||
| 		return false, ErrorEmptyJenkinsCR |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	nextBuildNumber := int64(1) |  | ||||||
| 	job, err := jobs.jenkinsClient.GetJob(build.Name) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		jobs.logger.Info(fmt.Sprintf("Couldn't find jenkins job, name:'%s' hash:'%s'", build.Name, build.Hash)) | 		jobs.logger.Info(fmt.Sprintf("Couldn't find jenkins job, %+v", build)) | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  | 	nextBuildNumber := job.GetDetails().NextBuildNumber | ||||||
|  | 
 | ||||||
|  | 	jobs.logger.Info(fmt.Sprintf("Running build, %+v", build)) | ||||||
|  | 	_, err = jobs.jenkinsClient.BuildJob(build.JobName, parameters) | ||||||
|  | 	if err != nil { | ||||||
|  | 		jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't run build, %+v", build)) | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if job != nil { | 	build.Status = virtuslabv1alpha1.BuildRunningStatus | ||||||
| 		nextBuildNumber = job.GetDetails().NextBuildNumber |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	jobs.logger.Info(fmt.Sprintf("Running build, name:'%s' hash:'%s' number:'%d'", build.Name, build.Hash, nextBuildNumber)) |  | ||||||
| 	_, err = jobs.jenkinsClient.BuildJob(build.Name, parameters) |  | ||||||
| 	if err != nil { |  | ||||||
| 		jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't run build, name:'%s' hash:'%s' number:'%d'", build.Name, build.Hash, nextBuildNumber)) |  | ||||||
| 		return false, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	build.Status = RunningStatus |  | ||||||
| 	build.Number = nextBuildNumber | 	build.Number = nextBuildNumber | ||||||
| 
 | 
 | ||||||
| 	jobs.logger.Info(fmt.Sprintf("Updating build status, name:'%s' hash:'%s' status:'%s' number:'%d'", build.Name, build.Hash, build.Status, build.Number)) |  | ||||||
| 	err = jobs.updateBuildStatus(build, jenkins) | 	err = jobs.updateBuildStatus(build, jenkins) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't update build status, name:'%s' hash:'%s'", build.Name, build.Hash)) | 		jobs.logger.V(log.VWarn).Info(fmt.Sprintf("Couldn't update build status, %+v", build)) | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 	return false, nil | 	return false, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (jobs *Jobs) updateBuildStatus(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins) error { | func (jobs *Jobs) updateBuildStatus(build virtuslabv1alpha1.Build, jenkins *virtuslabv1alpha1.Jenkins) error { | ||||||
| 	if jenkins == nil { | 	jobs.logger.Info(fmt.Sprintf("Updating build status, %+v", build)) | ||||||
| 		return ErrorEmptyJenkinsCR |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// get index of existing build from status if exists
 | 	// get index of existing build from status if exists
 | ||||||
| 	buildIndex := -1 | 	buildIndex := -1 | ||||||
| 	for index, existingBuild := range jenkins.Status.Builds { | 	for index, existingBuild := range jenkins.Status.Builds { | ||||||
| 		if build.Name == existingBuild.Name && build.Hash == existingBuild.Hash { | 		if build.JobName == existingBuild.JobName && build.Hash == existingBuild.Hash { | ||||||
| 			buildIndex = index | 			buildIndex = index | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -5,7 +5,6 @@ import ( | ||||||
| 	"crypto/sha256" | 	"crypto/sha256" | ||||||
| 	"encoding/base64" | 	"encoding/base64" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"os" |  | ||||||
| 	"testing" | 	"testing" | ||||||
| 
 | 
 | ||||||
| 	virtuslabv1alpha1 "github.com/VirtusLab/jenkins-operator/pkg/apis/virtuslab/v1alpha1" | 	virtuslabv1alpha1 "github.com/VirtusLab/jenkins-operator/pkg/apis/virtuslab/v1alpha1" | ||||||
|  | @ -23,11 +22,6 @@ import ( | ||||||
| 	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" | 	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func TestMain(m *testing.M) { |  | ||||||
| 	virtuslabv1alpha1.SchemeBuilder.AddToScheme(scheme.Scheme) |  | ||||||
| 	os.Exit(m.Run()) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestSuccessEnsureJob(t *testing.T) { | func TestSuccessEnsureJob(t *testing.T) { | ||||||
| 	// given
 | 	// given
 | ||||||
| 	ctx := context.TODO() | 	ctx := context.TODO() | ||||||
|  | @ -35,15 +29,17 @@ func TestSuccessEnsureJob(t *testing.T) { | ||||||
| 	ctrl := gomock.NewController(t) | 	ctrl := gomock.NewController(t) | ||||||
| 	defer ctrl.Finish() | 	defer ctrl.Finish() | ||||||
| 
 | 
 | ||||||
| 	buildName := "Test Job" | 	jobName := "Test Job" | ||||||
| 	hash := sha256.New() | 	hash := sha256.New() | ||||||
| 	hash.Write([]byte(buildName)) | 	hash.Write([]byte(jobName)) | ||||||
| 	encodedHash := base64.URLEncoding.EncodeToString(hash.Sum(nil)) | 	encodedHash := base64.URLEncoding.EncodeToString(hash.Sum(nil)) | ||||||
| 
 | 
 | ||||||
| 	// when
 | 	// when
 | ||||||
| 	jenkins := jenkinsCustomResource() | 	jenkins := jenkinsCustomResource() | ||||||
| 	fakeClient := fake.NewFakeClient() | 	fakeClient := fake.NewFakeClient() | ||||||
| 	err := fakeClient.Create(ctx, jenkins) | 	err := virtuslabv1alpha1.SchemeBuilder.AddToScheme(scheme.Scheme) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	err = fakeClient.Create(ctx, jenkins) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 
 | 
 | ||||||
| 	for reconcileAttempt := 1; reconcileAttempt <= 2; reconcileAttempt++ { | 	for reconcileAttempt := 1; reconcileAttempt <= 2; reconcileAttempt++ { | ||||||
|  | @ -54,7 +50,7 @@ func TestSuccessEnsureJob(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 		jenkinsClient. | 		jenkinsClient. | ||||||
| 			EXPECT(). | 			EXPECT(). | ||||||
| 			GetJob(buildName). | 			GetJob(jobName). | ||||||
| 			Return(&gojenkins.Job{ | 			Return(&gojenkins.Job{ | ||||||
| 				Raw: &gojenkins.JobResponse{ | 				Raw: &gojenkins.JobResponse{ | ||||||
| 					NextBuildNumber: buildNumber, | 					NextBuildNumber: buildNumber, | ||||||
|  | @ -63,19 +59,19 @@ func TestSuccessEnsureJob(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 		jenkinsClient. | 		jenkinsClient. | ||||||
| 			EXPECT(). | 			EXPECT(). | ||||||
| 			BuildJob(buildName, gomock.Any()). | 			BuildJob(jobName, gomock.Any()). | ||||||
| 			Return(int64(0), nil).AnyTimes() | 			Return(int64(0), nil).AnyTimes() | ||||||
| 
 | 
 | ||||||
| 		jenkinsClient. | 		jenkinsClient. | ||||||
| 			EXPECT(). | 			EXPECT(). | ||||||
| 			GetBuild(buildName, buildNumber). | 			GetBuild(jobName, buildNumber). | ||||||
| 			Return(&gojenkins.Build{ | 			Return(&gojenkins.Build{ | ||||||
| 				Raw: &gojenkins.BuildResponse{ | 				Raw: &gojenkins.BuildResponse{ | ||||||
| 					Result: SuccessStatus, | 					Result: string(virtuslabv1alpha1.BuildSuccessStatus), | ||||||
| 				}, | 				}, | ||||||
| 			}, nil).AnyTimes() | 			}, nil).AnyTimes() | ||||||
| 
 | 
 | ||||||
| 		done, err := jobs.EnsureBuildJob(buildName, encodedHash, nil, jenkins, true) | 		done, err := jobs.EnsureBuildJob(jobName, encodedHash, nil, jenkins, true) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 
 | 
 | ||||||
| 		err = fakeClient.Get(ctx, types.NamespacedName{Name: jenkins.Name, Namespace: jenkins.Namespace}, jenkins) | 		err = fakeClient.Get(ctx, types.NamespacedName{Name: jenkins.Name, Namespace: jenkins.Namespace}, jenkins) | ||||||
|  | @ -85,7 +81,7 @@ func TestSuccessEnsureJob(t *testing.T) { | ||||||
| 		assert.Equal(t, len(jenkins.Status.Builds), 1) | 		assert.Equal(t, len(jenkins.Status.Builds), 1) | ||||||
| 
 | 
 | ||||||
| 		build := jenkins.Status.Builds[0] | 		build := jenkins.Status.Builds[0] | ||||||
| 		assert.Equal(t, build.Name, buildName) | 		assert.Equal(t, build.JobName, jobName) | ||||||
| 		assert.Equal(t, build.Hash, encodedHash) | 		assert.Equal(t, build.Hash, encodedHash) | ||||||
| 		assert.Equal(t, build.Number, buildNumber) | 		assert.Equal(t, build.Number, buildNumber) | ||||||
| 		assert.Equal(t, build.Retires, 0) | 		assert.Equal(t, build.Retires, 0) | ||||||
|  | @ -95,13 +91,13 @@ func TestSuccessEnsureJob(t *testing.T) { | ||||||
| 		// first run - build should be scheduled and status updated
 | 		// first run - build should be scheduled and status updated
 | ||||||
| 		if reconcileAttempt == 1 { | 		if reconcileAttempt == 1 { | ||||||
| 			assert.False(t, done) | 			assert.False(t, done) | ||||||
| 			assert.Equal(t, build.Status, RunningStatus) | 			assert.Equal(t, build.Status, virtuslabv1alpha1.BuildRunningStatus) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// second run -job should be success and status updated
 | 		// second run -job should be success and status updated
 | ||||||
| 		if reconcileAttempt == 2 { | 		if reconcileAttempt == 2 { | ||||||
| 			assert.True(t, done) | 			assert.True(t, done) | ||||||
| 			assert.Equal(t, build.Status, SuccessStatus) | 			assert.Equal(t, build.Status, virtuslabv1alpha1.BuildSuccessStatus) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -113,9 +109,9 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 	ctrl := gomock.NewController(t) | 	ctrl := gomock.NewController(t) | ||||||
| 	defer ctrl.Finish() | 	defer ctrl.Finish() | ||||||
| 
 | 
 | ||||||
| 	buildName := "Test Job" | 	jobName := "Test Job" | ||||||
| 	hash := sha256.New() | 	hash := sha256.New() | ||||||
| 	hash.Write([]byte(buildName)) | 	hash.Write([]byte(jobName)) | ||||||
| 	encodedHash := base64.URLEncoding.EncodeToString(hash.Sum(nil)) | 	encodedHash := base64.URLEncoding.EncodeToString(hash.Sum(nil)) | ||||||
| 
 | 
 | ||||||
| 	// when
 | 	// when
 | ||||||
|  | @ -133,7 +129,7 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 		if reconcileAttempt == 1 { | 		if reconcileAttempt == 1 { | ||||||
| 			jenkinsClient. | 			jenkinsClient. | ||||||
| 				EXPECT(). | 				EXPECT(). | ||||||
| 				GetJob(buildName). | 				GetJob(jobName). | ||||||
| 				Return(&gojenkins.Job{ | 				Return(&gojenkins.Job{ | ||||||
| 					Raw: &gojenkins.JobResponse{ | 					Raw: &gojenkins.JobResponse{ | ||||||
| 						NextBuildNumber: int64(1), | 						NextBuildNumber: int64(1), | ||||||
|  | @ -142,7 +138,7 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 			jenkinsClient. | 			jenkinsClient. | ||||||
| 				EXPECT(). | 				EXPECT(). | ||||||
| 				BuildJob(buildName, gomock.Any()). | 				BuildJob(jobName, gomock.Any()). | ||||||
| 				Return(int64(0), nil) | 				Return(int64(0), nil) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -150,10 +146,10 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 		if reconcileAttempt == 2 { | 		if reconcileAttempt == 2 { | ||||||
| 			jenkinsClient. | 			jenkinsClient. | ||||||
| 				EXPECT(). | 				EXPECT(). | ||||||
| 				GetBuild(buildName, int64(1)). | 				GetBuild(jobName, int64(1)). | ||||||
| 				Return(&gojenkins.Build{ | 				Return(&gojenkins.Build{ | ||||||
| 					Raw: &gojenkins.BuildResponse{ | 					Raw: &gojenkins.BuildResponse{ | ||||||
| 						Result: FailureStatus, | 						Result: string(virtuslabv1alpha1.BuildFailureStatus), | ||||||
| 					}, | 					}, | ||||||
| 				}, nil) | 				}, nil) | ||||||
| 		} | 		} | ||||||
|  | @ -162,7 +158,7 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 		if reconcileAttempt == 3 { | 		if reconcileAttempt == 3 { | ||||||
| 			jenkinsClient. | 			jenkinsClient. | ||||||
| 				EXPECT(). | 				EXPECT(). | ||||||
| 				GetJob(buildName). | 				GetJob(jobName). | ||||||
| 				Return(&gojenkins.Job{ | 				Return(&gojenkins.Job{ | ||||||
| 					Raw: &gojenkins.JobResponse{ | 					Raw: &gojenkins.JobResponse{ | ||||||
| 						NextBuildNumber: int64(2), | 						NextBuildNumber: int64(2), | ||||||
|  | @ -171,7 +167,7 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 			jenkinsClient. | 			jenkinsClient. | ||||||
| 				EXPECT(). | 				EXPECT(). | ||||||
| 				BuildJob(buildName, gomock.Any()). | 				BuildJob(jobName, gomock.Any()). | ||||||
| 				Return(int64(0), nil) | 				Return(int64(0), nil) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -179,15 +175,15 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 		if reconcileAttempt == 4 { | 		if reconcileAttempt == 4 { | ||||||
| 			jenkinsClient. | 			jenkinsClient. | ||||||
| 				EXPECT(). | 				EXPECT(). | ||||||
| 				GetBuild(buildName, int64(2)). | 				GetBuild(jobName, int64(2)). | ||||||
| 				Return(&gojenkins.Build{ | 				Return(&gojenkins.Build{ | ||||||
| 					Raw: &gojenkins.BuildResponse{ | 					Raw: &gojenkins.BuildResponse{ | ||||||
| 						Result: SuccessStatus, | 						Result: string(virtuslabv1alpha1.BuildSuccessStatus), | ||||||
| 					}, | 					}, | ||||||
| 				}, nil) | 				}, nil) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		done, errEnsureBuildJob := jobs.EnsureBuildJob(buildName, encodedHash, nil, jenkins, true) | 		done, errEnsureBuildJob := jobs.EnsureBuildJob(jobName, encodedHash, nil, jenkins, true) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 
 | 
 | ||||||
| 		err = fakeClient.Get(ctx, types.NamespacedName{Name: jenkins.Name, Namespace: jenkins.Namespace}, jenkins) | 		err = fakeClient.Get(ctx, types.NamespacedName{Name: jenkins.Name, Namespace: jenkins.Namespace}, jenkins) | ||||||
|  | @ -197,7 +193,7 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 		assert.Equal(t, len(jenkins.Status.Builds), 1) | 		assert.Equal(t, len(jenkins.Status.Builds), 1) | ||||||
| 
 | 
 | ||||||
| 		build := jenkins.Status.Builds[0] | 		build := jenkins.Status.Builds[0] | ||||||
| 		assert.Equal(t, build.Name, buildName) | 		assert.Equal(t, build.JobName, jobName) | ||||||
| 		assert.Equal(t, build.Hash, encodedHash) | 		assert.Equal(t, build.Hash, encodedHash) | ||||||
| 
 | 
 | ||||||
| 		assert.NotNil(t, build.CreateTime) | 		assert.NotNil(t, build.CreateTime) | ||||||
|  | @ -208,7 +204,7 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 			assert.NoError(t, errEnsureBuildJob) | 			assert.NoError(t, errEnsureBuildJob) | ||||||
| 			assert.False(t, done) | 			assert.False(t, done) | ||||||
| 			assert.Equal(t, build.Number, int64(1)) | 			assert.Equal(t, build.Number, int64(1)) | ||||||
| 			assert.Equal(t, build.Status, RunningStatus) | 			assert.Equal(t, build.Status, virtuslabv1alpha1.BuildRunningStatus) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// second run - build should be failure and status updated
 | 		// second run - build should be failure and status updated
 | ||||||
|  | @ -216,7 +212,7 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 			assert.Error(t, errEnsureBuildJob) | 			assert.Error(t, errEnsureBuildJob) | ||||||
| 			assert.False(t, done) | 			assert.False(t, done) | ||||||
| 			assert.Equal(t, build.Number, int64(1)) | 			assert.Equal(t, build.Number, int64(1)) | ||||||
| 			assert.Equal(t, build.Status, FailureStatus) | 			assert.Equal(t, build.Status, virtuslabv1alpha1.BuildFailureStatus) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// third run - build should be rescheduled and status updated
 | 		// third run - build should be rescheduled and status updated
 | ||||||
|  | @ -224,7 +220,7 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 			assert.NoError(t, errEnsureBuildJob) | 			assert.NoError(t, errEnsureBuildJob) | ||||||
| 			assert.False(t, done) | 			assert.False(t, done) | ||||||
| 			assert.Equal(t, build.Number, int64(2)) | 			assert.Equal(t, build.Number, int64(2)) | ||||||
| 			assert.Equal(t, build.Status, RunningStatus) | 			assert.Equal(t, build.Status, virtuslabv1alpha1.BuildRunningStatus) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// fourth run - build should be success and status updated
 | 		// fourth run - build should be success and status updated
 | ||||||
|  | @ -232,7 +228,7 @@ func TestEnsureJobWithFailedBuild(t *testing.T) { | ||||||
| 			assert.NoError(t, errEnsureBuildJob) | 			assert.NoError(t, errEnsureBuildJob) | ||||||
| 			assert.True(t, done) | 			assert.True(t, done) | ||||||
| 			assert.Equal(t, build.Number, int64(2)) | 			assert.Equal(t, build.Number, int64(2)) | ||||||
| 			assert.Equal(t, build.Status, SuccessStatus) | 			assert.Equal(t, build.Status, virtuslabv1alpha1.BuildSuccessStatus) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -285,7 +281,7 @@ func TestEnsureJobFailedWithMaxRetries(t *testing.T) { | ||||||
| 				GetBuild(buildName, int64(1)). | 				GetBuild(buildName, int64(1)). | ||||||
| 				Return(&gojenkins.Build{ | 				Return(&gojenkins.Build{ | ||||||
| 					Raw: &gojenkins.BuildResponse{ | 					Raw: &gojenkins.BuildResponse{ | ||||||
| 						Result: FailureStatus, | 						Result: string(virtuslabv1alpha1.BuildFailureStatus), | ||||||
| 					}, | 					}, | ||||||
| 				}, nil) | 				}, nil) | ||||||
| 		} | 		} | ||||||
|  | @ -314,7 +310,7 @@ func TestEnsureJobFailedWithMaxRetries(t *testing.T) { | ||||||
| 				GetBuild(buildName, int64(2)). | 				GetBuild(buildName, int64(2)). | ||||||
| 				Return(&gojenkins.Build{ | 				Return(&gojenkins.Build{ | ||||||
| 					Raw: &gojenkins.BuildResponse{ | 					Raw: &gojenkins.BuildResponse{ | ||||||
| 						Result: FailureStatus, | 						Result: string(virtuslabv1alpha1.BuildFailureStatus), | ||||||
| 					}, | 					}, | ||||||
| 				}, nil) | 				}, nil) | ||||||
| 		} | 		} | ||||||
|  | @ -329,7 +325,7 @@ func TestEnsureJobFailedWithMaxRetries(t *testing.T) { | ||||||
| 		assert.Equal(t, len(jenkins.Status.Builds), 1) | 		assert.Equal(t, len(jenkins.Status.Builds), 1) | ||||||
| 
 | 
 | ||||||
| 		build := jenkins.Status.Builds[0] | 		build := jenkins.Status.Builds[0] | ||||||
| 		assert.Equal(t, build.Name, buildName) | 		assert.Equal(t, build.JobName, buildName) | ||||||
| 		assert.Equal(t, build.Hash, encodedHash) | 		assert.Equal(t, build.Hash, encodedHash) | ||||||
| 
 | 
 | ||||||
| 		assert.NotNil(t, build.CreateTime) | 		assert.NotNil(t, build.CreateTime) | ||||||
|  | @ -341,7 +337,7 @@ func TestEnsureJobFailedWithMaxRetries(t *testing.T) { | ||||||
| 			assert.False(t, done) | 			assert.False(t, done) | ||||||
| 			assert.Equal(t, build.Number, int64(1)) | 			assert.Equal(t, build.Number, int64(1)) | ||||||
| 			assert.Equal(t, build.Retires, 0) | 			assert.Equal(t, build.Retires, 0) | ||||||
| 			assert.Equal(t, build.Status, RunningStatus) | 			assert.Equal(t, build.Status, virtuslabv1alpha1.BuildRunningStatus) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// second run - build should be failure and status updated
 | 		// second run - build should be failure and status updated
 | ||||||
|  | @ -350,7 +346,7 @@ func TestEnsureJobFailedWithMaxRetries(t *testing.T) { | ||||||
| 			assert.False(t, done) | 			assert.False(t, done) | ||||||
| 			assert.Equal(t, build.Number, int64(1)) | 			assert.Equal(t, build.Number, int64(1)) | ||||||
| 			assert.Equal(t, build.Retires, 0) | 			assert.Equal(t, build.Retires, 0) | ||||||
| 			assert.Equal(t, build.Status, FailureStatus) | 			assert.Equal(t, build.Status, virtuslabv1alpha1.BuildFailureStatus) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// third run - build should be rescheduled and status updated
 | 		// third run - build should be rescheduled and status updated
 | ||||||
|  | @ -360,7 +356,7 @@ func TestEnsureJobFailedWithMaxRetries(t *testing.T) { | ||||||
| 			//assert.Equal(t, build.Retires, 1)
 | 			//assert.Equal(t, build.Retires, 1)
 | ||||||
| 			assert.Equal(t, build.Number, int64(2)) | 			assert.Equal(t, build.Number, int64(2)) | ||||||
| 			assert.Equal(t, build.Retires, 1) | 			assert.Equal(t, build.Retires, 1) | ||||||
| 			assert.Equal(t, build.Status, RunningStatus) | 			assert.Equal(t, build.Status, virtuslabv1alpha1.BuildRunningStatus) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// fourth run - build should be failure and status updated
 | 		// fourth run - build should be failure and status updated
 | ||||||
|  | @ -369,7 +365,7 @@ func TestEnsureJobFailedWithMaxRetries(t *testing.T) { | ||||||
| 			assert.False(t, done) | 			assert.False(t, done) | ||||||
| 			assert.Equal(t, build.Number, int64(2)) | 			assert.Equal(t, build.Number, int64(2)) | ||||||
| 			assert.Equal(t, build.Retires, 1) | 			assert.Equal(t, build.Retires, 1) | ||||||
| 			assert.Equal(t, build.Status, FailureStatus) | 			assert.Equal(t, build.Status, virtuslabv1alpha1.BuildFailureStatus) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// fifth run - build should be unrecoverable failed and status updated
 | 		// fifth run - build should be unrecoverable failed and status updated
 | ||||||
|  | @ -378,7 +374,7 @@ func TestEnsureJobFailedWithMaxRetries(t *testing.T) { | ||||||
| 			assert.False(t, done) | 			assert.False(t, done) | ||||||
| 			assert.Equal(t, build.Number, int64(2)) | 			assert.Equal(t, build.Number, int64(2)) | ||||||
| 			assert.Equal(t, build.Retires, 1) | 			assert.Equal(t, build.Retires, 1) | ||||||
| 			assert.Equal(t, build.Status, FailureStatus) | 			assert.Equal(t, build.Status, virtuslabv1alpha1.BuildFailureStatus) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -68,5 +68,5 @@ func verifyJenkinsSeedJobs(t *testing.T, client *gojenkins.Jenkins, jenkins *vir | ||||||
| 	assert.NotEmpty(t, jenkins.Status.Builds) | 	assert.NotEmpty(t, jenkins.Status.Builds) | ||||||
| 	assert.Equal(t, len(jenkins.Status.Builds), 1) | 	assert.Equal(t, len(jenkins.Status.Builds), 1) | ||||||
| 	build := jenkins.Status.Builds[0] | 	build := jenkins.Status.Builds[0] | ||||||
| 	assert.Equal(t, build.Name, seedjobs.ConfigureSeedJobsName) | 	assert.Equal(t, build.JobName, seedjobs.ConfigureSeedJobsName) | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue