Initial version of user reconciliation loop and seed jobs

This commit is contained in:
antoniaklja
2018-12-19 22:40:08 +01:00
parent 7e64f2f06e
commit 4c8e61624e
22 changed files with 622 additions and 44 deletions
-12
View File
@@ -5,8 +5,6 @@ import (
"testing"
virtuslabv1alpha1 "github.com/VirtusLab/jenkins-operator/pkg/apis/virtuslab/v1alpha1"
"github.com/bndr/gojenkins"
)
func TestBaseConfiguration(t *testing.T) {
@@ -22,16 +20,6 @@ func TestBaseConfiguration(t *testing.T) {
verifyJenkinsAPIConnection(t, jenkins)
}
func verifyJenkinsAPIConnection(t *testing.T, jenkins *virtuslabv1alpha1.Jenkins) *gojenkins.Jenkins {
client, err := createJenkinsAPIClient(jenkins)
if err != nil {
t.Fatal(err)
}
t.Log("I can establish connection to Jenkins API")
return client
}
func verifyJenkinsMasterPodAttributes(t *testing.T, jenkins *virtuslabv1alpha1.Jenkins) {
jenkinsPod := getJenkinsMasterPod(t, jenkins)
+51
View File
@@ -97,3 +97,54 @@ func createJenkinsCR(t *testing.T, namespace string) *virtuslabv1alpha1.Jenkins
return jenkins
}
func createJenkinsCRWithSeedJob(t *testing.T, namespace string) *virtuslabv1alpha1.Jenkins {
jenkins := &virtuslabv1alpha1.Jenkins{
ObjectMeta: metav1.ObjectMeta{
Name: "e2e",
Namespace: namespace,
},
Spec: virtuslabv1alpha1.JenkinsSpec{
Master: virtuslabv1alpha1.JenkinsMaster{
Image: "jenkins/jenkins",
Annotations: map[string]string{"test": "label"},
Resources: corev1.ResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("1"),
corev1.ResourceMemory: resource.MustParse("1Gi"),
},
Limits: corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("2"),
corev1.ResourceMemory: resource.MustParse("2Gi"),
},
},
},
SeedJobs: []virtuslabv1alpha1.SeedJob{
{
ID: "jenkins-operator-e2e",
Targets: "cicd/jobs/*.jenkins",
Description: "Jenkins Operator e2e tests repository",
RepositoryBranch: "master",
RepositoryURL: "https://github.com/VirtusLab/jenkins-operator-e2e.git",
},
},
},
}
t.Logf("Jenkins CR %+v", *jenkins)
if err := framework.Global.Client.Create(context.TODO(), jenkins, nil); err != nil {
t.Fatal(err)
}
return jenkins
}
func verifyJenkinsAPIConnection(t *testing.T, jenkins *virtuslabv1alpha1.Jenkins) *gojenkins.Jenkins {
client, err := createJenkinsAPIClient(jenkins)
if err != nil {
t.Fatal(err)
}
t.Log("I can establish connection to Jenkins API")
return client
}
+4 -5
View File
@@ -2,13 +2,12 @@ package e2e
import (
"context"
"testing"
"time"
virtuslabv1alpha1 "github.com/VirtusLab/jenkins-operator/pkg/apis/virtuslab/v1alpha1"
"testing"
framework "github.com/operator-framework/operator-sdk/pkg/test"
"k8s.io/apimachinery/pkg/types"
"time"
)
func TestJenkinsMasterPodRestart(t *testing.T) {
@@ -27,8 +26,8 @@ func TestJenkinsMasterPodRestart(t *testing.T) {
func checkBaseConfigurationCompleteTimeIsNotSet(t *testing.T, jenkins *virtuslabv1alpha1.Jenkins) {
jenkinsStatus := &virtuslabv1alpha1.Jenkins{}
namespacedName := types.NamespacedName{Namespace: jenkins.Namespace, Name: jenkins.Name}
err := framework.Global.Client.Get(context.TODO(), namespacedName, jenkinsStatus)
namespaceName := types.NamespacedName{Namespace: jenkins.Namespace, Name: jenkins.Name}
err := framework.Global.Client.Get(context.TODO(), namespaceName, jenkinsStatus)
if err != nil {
t.Fatal(err)
}
+40
View File
@@ -0,0 +1,40 @@
package e2e
import (
"github.com/VirtusLab/jenkins-operator/pkg/controller/jenkins/configuration/user/seedjobs"
"github.com/bndr/gojenkins"
"k8s.io/apimachinery/pkg/util/wait"
"testing"
"time"
)
func TestUserConfiguration(t *testing.T) {
t.Parallel()
namespace, ctx := setupTest(t)
// Deletes test namespace
defer ctx.Cleanup()
jenkins := createJenkinsCRWithSeedJob(t, namespace)
waitForJenkinsUserConfigurationToComplete(t, jenkins)
client := verifyJenkinsAPIConnection(t, jenkins)
verifyJenkinsSeedJobs(t, client)
}
func verifyJenkinsSeedJobs(t *testing.T, client *gojenkins.Jenkins) {
// check if job has been configured and executed successfully
err := wait.Poll(time.Second*10, time.Minute*2, func() (bool, error) {
t.Logf("Attempting to get seed job status '%v'", seedjobs.ConfigureSeedJobsName)
seedJob, err := client.GetJob(seedjobs.ConfigureSeedJobsName)
if err != nil || seedJob == nil {
return false, nil
}
build, err := seedJob.GetLastSuccessfulBuild()
if err != nil || build == nil {
return false, nil
}
return true, nil
})
if err != nil {
t.Fatalf("couldn't get seed job '%v'", err)
}
}
+13 -1
View File
@@ -15,7 +15,7 @@ import (
var (
retryInterval = time.Second * 5
timeout = time.Second * 30
timeout = time.Second * 60
)
// checkConditionFunc is used to check if a condition for the jenkins CR is true
@@ -33,6 +33,18 @@ func waitForJenkinsBaseConfigurationToComplete(t *testing.T, jenkins *virtuslabv
t.Log("Jenkins pod is running")
}
func waitForJenkinsUserConfigurationToComplete(t *testing.T, jenkins *virtuslabv1alpha1.Jenkins) {
t.Log("Waiting for Jenkins user configuration to complete")
_, err := WaitUntilJenkinsConditionTrue(retryInterval, 30, jenkins, func(jenkins *virtuslabv1alpha1.Jenkins) bool {
t.Logf("Current Jenkins status '%+v'", jenkins.Status)
return jenkins.Status.UserConfigurationCompletedTime != nil
})
if err != nil {
t.Fatal(err)
}
t.Log("Jenkins pod is running")
}
// WaitUntilJenkinsConditionTrue retries until the specified condition check becomes true for the jenkins CR
func WaitUntilJenkinsConditionTrue(retryInterval time.Duration, retries int, jenkins *virtuslabv1alpha1.Jenkins, checkCondition checkConditionFunc) (*virtuslabv1alpha1.Jenkins, error) {
jenkinsStatus := &virtuslabv1alpha1.Jenkins{}