From f2eefb1fc903568c429006e6489771b1d274e7b7 Mon Sep 17 00:00:00 2001 From: Jakub Al-Khalili Date: Tue, 27 Aug 2019 09:34:42 +0200 Subject: [PATCH] Improve tests, small improvements --- .../configuration/user/seedjobs/seedjobs.go | 36 +++---- .../user/seedjobs/seedjobs_test.go | 95 +++++++++++++------ 2 files changed, 81 insertions(+), 50 deletions(-) diff --git a/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs.go b/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs.go index 46933f7d..ee0b6628 100644 --- a/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs.go +++ b/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs.go @@ -6,7 +6,7 @@ import ( "encoding/base64" "fmt" "reflect" - + "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" jenkinsclient "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base/resources" @@ -18,6 +18,7 @@ import ( apps "k8s.io/api/apps/v1" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" @@ -37,7 +38,7 @@ const ( JenkinsCredentialTypeLabelName = "jenkins.io/credentials-type" // AgentName is the name of seed job agent - AgentName = "seed-job-agent" + AgentName = "jnlp" ) // SeedJobs defines API for configuring and ensuring Jenkins Seed Jobs and Deploy Keys @@ -72,11 +73,11 @@ func (s *SeedJobs) EnsureSeedJobs(jenkins *v1alpha2.Jenkins) (done bool, err err err := s.k8sClient.Delete(context.TODO(), &appsv1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Namespace: jenkins.Namespace, - Name: fmt.Sprintf("%s-deployment", AgentName), + Name: AgentName, }, }) - if err != nil { + if err != nil && !apierrors.IsNotFound(err) { return false, err } } @@ -103,7 +104,7 @@ func (s *SeedJobs) EnsureSeedJobs(jenkins *v1alpha2.Jenkins) (done bool, err err } // createJob is responsible for creating jenkins job which configures jenkins seed jobs and deploy keys -func (s *SeedJobs) createJobs(jenkins *v1alpha2.Jenkins) (bool, error) { +func (s *SeedJobs) createJobs(jenkins *v1alpha2.Jenkins) (requeue bool, err error) { groovyClient := groovy.New(s.jenkinsClient, s.k8sClient, s.logger, jenkins, "user-groovy", jenkins.Spec.GroovyScripts.Customization) for _, seedJob := range jenkins.Spec.SeedJobs { credentialValue, err := s.credentialValue(jenkins.Namespace, seedJob) @@ -221,25 +222,12 @@ func (s *SeedJobs) isRecreatePodNeeded(jenkins v1alpha2.Jenkins) bool { return false } -// CreateAgent deploys Jenkins agent to Kubernetes cluster +// createAgent deploys Jenkins agent to Kubernetes cluster func (s SeedJobs) createAgent(jenkinsClient jenkinsclient.Jenkins, k8sClient client.Client, jenkinsManifest *v1alpha2.Jenkins, namespace string, agentName string) error { - var exists bool - - nodes, err := jenkinsClient.GetAllNodes() - if err != nil { - return err - } - - if len(nodes) != 0 { - for _, node := range nodes { - if node.GetName() == agentName { - exists = true - } - } - } + _, err := jenkinsClient.GetNode(agentName) // Create node if not exists - if !exists { + if err != nil { _, err = jenkinsClient.CreateNode(agentName, 1, "The jenkins-operator generated agent", "/home/jenkins", agentName) if err != nil { return err @@ -256,7 +244,9 @@ func (s SeedJobs) createAgent(jenkinsClient jenkinsclient.Jenkins, k8sClient cli err = k8sClient.Create(context.TODO(), deployment) if err != nil { err := k8sClient.Update(context.TODO(), deployment) - if err != nil { + if err != nil && apierrors.IsAlreadyExists(err) { + return err + } else if err != nil { return err } } @@ -267,7 +257,7 @@ func (s SeedJobs) createAgent(jenkinsClient jenkinsclient.Jenkins, k8sClient cli func agentDeployment(jenkinsManifest *v1alpha2.Jenkins, namespace string, agentName string, secret string) *apps.Deployment { return &apps.Deployment{ ObjectMeta: metav1.ObjectMeta{ - Name: "jnlp", + Name: agentName, Namespace: namespace, }, Spec: apps.DeploymentSpec{ diff --git a/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs_test.go b/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs_test.go index c4e96395..66e717a8 100644 --- a/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs_test.go +++ b/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs_test.go @@ -3,6 +3,7 @@ package seedjobs import ( "context" "fmt" + "k8s.io/apimachinery/pkg/api/errors" "testing" "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" @@ -16,46 +17,86 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" ) func TestEnsureSeedJobs(t *testing.T) { - // given - logger := logf.ZapLogger(false) - ctrl := gomock.NewController(t) - ctx := context.TODO() - defer ctrl.Finish() + t.Run("happy", func(t *testing.T) { + // given + logger := logf.ZapLogger(false) + ctrl := gomock.NewController(t) + ctx := context.TODO() + defer ctrl.Finish() - jenkinsClient := jenkinsclient.NewMockJenkins(ctrl) - fakeClient := fake.NewFakeClient() - err := v1alpha2.SchemeBuilder.AddToScheme(scheme.Scheme) - assert.NoError(t, err) + jenkinsClient := jenkinsclient.NewMockJenkins(ctrl) + fakeClient := fake.NewFakeClient() + err := v1alpha2.SchemeBuilder.AddToScheme(scheme.Scheme) + assert.NoError(t, err) - jenkins := jenkinsCustomResource() - err = fakeClient.Create(ctx, jenkins) - assert.NoError(t, err) + jenkins := jenkinsCustomResource() + err = fakeClient.Create(ctx, jenkins) + assert.NoError(t, err) - agentName := "seed-job-agent" - secret := "test-secret" - testNode := &gojenkins.Node{ - Raw: &gojenkins.NodeResponse{ - DisplayName: agentName, - }, - } + agentName := "jnlp" + secret := "test-secret" + testNode := &gojenkins.Node{ + Raw: &gojenkins.NodeResponse{ + DisplayName: agentName, + }, + } - jenkinsClient.EXPECT().GetNodeSecret(agentName).Return(secret, nil) - jenkinsClient.EXPECT().GetAllNodes().Return([]*gojenkins.Node{}, nil) - jenkinsClient.EXPECT().CreateNode(agentName, 1, "The jenkins-operator generated agent", "/home/jenkins", agentName).Return(testNode, nil) - jenkinsClient.EXPECT().GetNode(agentName).Return(testNode, nil).AnyTimes() + jenkinsClient.EXPECT().GetNodeSecret(agentName).Return(secret, nil) + jenkinsClient.EXPECT().GetAllNodes().Return([]*gojenkins.Node{}, nil).AnyTimes() + jenkinsClient.EXPECT().CreateNode(agentName, 1, "The jenkins-operator generated agent", "/home/jenkins", agentName).Return(testNode, nil).AnyTimes() + jenkinsClient.EXPECT().GetNode(agentName).Return(testNode, nil).AnyTimes() - jenkinsClient.EXPECT().ExecuteScript(seedJobCreatingGroovyScript(jenkins.Spec.SeedJobs[0])).AnyTimes() + jenkinsClient.EXPECT().ExecuteScript(seedJobCreatingGroovyScript(jenkins.Spec.SeedJobs[0])).AnyTimes() - seedJobClient := New(jenkinsClient, fakeClient, logger) + seedJobClient := New(jenkinsClient, fakeClient, logger) - _, err = seedJobClient.EnsureSeedJobs(jenkins) - assert.NoError(t, err) + _, err = seedJobClient.EnsureSeedJobs(jenkins) + assert.NoError(t, err) + }) + + t.Run("delete pod when no seed jobs", func(t *testing.T) { + // given + ctrl := gomock.NewController(t) + ctx := context.TODO() + defer ctrl.Finish() + + namespace := "test-namespace" + agentName := "test-agent" + secret := "test-secret" + jenkinsCustomRes := jenkinsCustomResource() + jenkinsCustomRes.Spec.SeedJobs = []v1alpha2.SeedJob{} + + jenkinsClient := jenkinsclient.NewMockJenkins(ctrl) + fakeClient := fake.NewFakeClient() + err := v1alpha2.SchemeBuilder.AddToScheme(scheme.Scheme) + assert.NoError(t, err) + + jenkinsClient.EXPECT().GetNode(agentName).AnyTimes() + jenkinsClient.EXPECT().GetNodeSecret(agentName).Return(secret, nil).AnyTimes() + jenkinsClient.EXPECT().GetAllNodes().Return([]*gojenkins.Node{}, nil).AnyTimes() + jenkinsClient.EXPECT().CreateNode(agentName, 1, "The jenkins-operator generated agent", "/home/jenkins", agentName).AnyTimes() + + seedJobsClient := New(jenkinsClient, fakeClient, nil) + + // when + _, err = seedJobsClient.EnsureSeedJobs(jenkinsCustomRes) + assert.NoError(t, err) + + // then + var deployment appsv1.Deployment + err = fakeClient.Get(ctx, types.NamespacedName{Name: agentName, Namespace: namespace}, &deployment) + + if !errors.IsNotFound(err) { + t.Fatal("deployment not removed") + } + }) } func jenkinsCustomResource() *v1alpha2.Jenkins {