diff --git a/pkg/controller/jenkins/groovy/groovy.go b/pkg/controller/jenkins/groovy/groovy.go index 5284f176..ec9823ed 100644 --- a/pkg/controller/jenkins/groovy/groovy.go +++ b/pkg/controller/jenkins/groovy/groovy.go @@ -55,12 +55,22 @@ func (g *Groovy) EnsureSingle(source, name, hash, groovyScript string) (requeue return true, err } - g.jenkins.Status.AppliedGroovyScripts = append(g.jenkins.Status.AppliedGroovyScripts, v1alpha2.AppliedGroovyScript{ + var appliedGroovyScripts []v1alpha2.AppliedGroovyScript + + for _, ags := range g.jenkins.Status.AppliedGroovyScripts { + if ags.ConfigurationType != g.configurationType && ags.Source != source && ags.Name != name { + appliedGroovyScripts = append(appliedGroovyScripts, ags) + } + } + appliedGroovyScripts = append(appliedGroovyScripts, v1alpha2.AppliedGroovyScript{ ConfigurationType: g.configurationType, Source: source, Name: name, Hash: hash, }) + + g.jenkins.Status.AppliedGroovyScripts = appliedGroovyScripts + return true, g.k8sClient.Update(context.TODO(), g.jenkins) } diff --git a/pkg/controller/jenkins/groovy/groovy_test.go b/pkg/controller/jenkins/groovy/groovy_test.go index 14286764..1650020a 100644 --- a/pkg/controller/jenkins/groovy/groovy_test.go +++ b/pkg/controller/jenkins/groovy/groovy_test.go @@ -113,6 +113,70 @@ func TestGroovy_EnsureSingle(t *testing.T) { assert.Equal(t, source, jenkins.Status.AppliedGroovyScripts[0].Source) assert.Equal(t, groovyScriptName, jenkins.Status.AppliedGroovyScripts[0].Name) }) + t.Run("execute script with new version", func(t *testing.T) { + anotherHash := "hash1" + // given + jenkins := &v1alpha2.Jenkins{ + ObjectMeta: metav1.ObjectMeta{ + Name: jenkinsName, + Namespace: namespace, + }, + } + err := v1alpha2.SchemeBuilder.AddToScheme(scheme.Scheme) + require.NoError(t, err) + fakeClient := fake.NewFakeClient() + err = fakeClient.Create(ctx, jenkins) + require.NoError(t, err) + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + jenkinsClient := jenkinsclient.NewMockJenkins(ctrl) + + jenkinsClient.EXPECT().ExecuteScript(groovyScript).Return("logs", nil) + jenkinsClient.EXPECT().ExecuteScript(groovyScript).Return("logs", nil) + jenkinsClient.EXPECT().ExecuteScript(groovyScript).Return("logs", nil) + + groovyClient := New(jenkinsClient, fakeClient, log.Log, jenkins, configurationType, emptyCustomization) + + // when + requeue, err := groovyClient.EnsureSingle(source, groovyScriptName, hash, groovyScript) + + // then + require.NoError(t, err) + assert.True(t, requeue) + err = fakeClient.Get(ctx, types.NamespacedName{Name: jenkins.Name, Namespace: jenkins.Namespace}, jenkins) + require.NoError(t, err) + assert.Equal(t, 1, len(jenkins.Status.AppliedGroovyScripts)) + assert.Equal(t, configurationType, jenkins.Status.AppliedGroovyScripts[0].ConfigurationType) + assert.Equal(t, hash, jenkins.Status.AppliedGroovyScripts[0].Hash) + assert.Equal(t, source, jenkins.Status.AppliedGroovyScripts[0].Source) + assert.Equal(t, groovyScriptName, jenkins.Status.AppliedGroovyScripts[0].Name) + + // Update with new hash + requeue, err = groovyClient.EnsureSingle(source, groovyScriptName, anotherHash, groovyScript) + require.NoError(t, err) + assert.True(t, requeue) + + err = fakeClient.Get(ctx, types.NamespacedName{Name: jenkins.Name, Namespace: jenkins.Namespace}, jenkins) + require.NoError(t, err) + assert.Equal(t, 1, len(jenkins.Status.AppliedGroovyScripts)) + assert.Equal(t, configurationType, jenkins.Status.AppliedGroovyScripts[0].ConfigurationType) + assert.Equal(t, anotherHash, jenkins.Status.AppliedGroovyScripts[0].Hash) + assert.Equal(t, source, jenkins.Status.AppliedGroovyScripts[0].Source) + assert.Equal(t, groovyScriptName, jenkins.Status.AppliedGroovyScripts[0].Name) + + requeue, err = groovyClient.EnsureSingle(source, groovyScriptName, hash, groovyScript) + require.NoError(t, err) + assert.True(t, requeue) + + err = fakeClient.Get(ctx, types.NamespacedName{Name: jenkins.Name, Namespace: jenkins.Namespace}, jenkins) + require.NoError(t, err) + assert.Equal(t, 1, len(jenkins.Status.AppliedGroovyScripts)) + assert.Equal(t, configurationType, jenkins.Status.AppliedGroovyScripts[0].ConfigurationType) + assert.Equal(t, hash, jenkins.Status.AppliedGroovyScripts[0].Hash) + assert.Equal(t, source, jenkins.Status.AppliedGroovyScripts[0].Source) + assert.Equal(t, groovyScriptName, jenkins.Status.AppliedGroovyScripts[0].Name) + }) t.Run("execute script fails", func(t *testing.T) { // given jenkins := &v1alpha2.Jenkins{ diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index 7e0af964..0beae099 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -6,18 +6,18 @@ import ( "testing" "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" - "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/groovy" jenkinsclient "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base/resources" + "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/groovy" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/plugins" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/bndr/gojenkins" - "k8s.io/apimachinery/pkg/api/resource" framework "github.com/operator-framework/operator-sdk/pkg/test" "github.com/stretchr/testify/assert" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func TestConfiguration(t *testing.T) {