Move Jenkins container properties to spec.master.containers list
This commit is contained in:
parent
e1aba3ed9f
commit
25469b1174
|
|
@ -4,26 +4,37 @@ metadata:
|
||||||
name: example
|
name: example
|
||||||
spec:
|
spec:
|
||||||
master:
|
master:
|
||||||
readinessProbe:
|
containers:
|
||||||
httpGet:
|
- name: jenkins-master
|
||||||
path: /login
|
image: jenkins/jenkins:lts
|
||||||
port: 8080
|
imagePullPolicy: Always
|
||||||
scheme: HTTP
|
livenessProbe:
|
||||||
failureThreshold: 10
|
failureThreshold: 12
|
||||||
initialDelaySeconds: 30
|
httpGet:
|
||||||
periodSeconds: 10
|
path: /login
|
||||||
successThreshold: 1
|
port: http
|
||||||
timeoutSeconds: 5
|
scheme: HTTP
|
||||||
livenessProbe:
|
initialDelaySeconds: 80
|
||||||
httpGet:
|
periodSeconds: 10
|
||||||
path: /login
|
successThreshold: 1
|
||||||
port: 8080
|
timeoutSeconds: 5
|
||||||
scheme: HTTP
|
readinessProbe:
|
||||||
initialDelaySeconds: 35
|
failureThreshold: 3
|
||||||
failureThreshold: 10
|
httpGet:
|
||||||
periodSeconds: 10
|
path: /login
|
||||||
successThreshold: 1
|
port: http
|
||||||
timeoutSeconds: 5
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
timeoutSeconds: 1
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: 1500m
|
||||||
|
memory: 3Gi
|
||||||
|
requests:
|
||||||
|
cpu: "1"
|
||||||
|
memory: 600Mi
|
||||||
seedJobs:
|
seedJobs:
|
||||||
- id: jenkins-operator
|
- id: jenkins-operator
|
||||||
targets: "cicd/jobs/*.jenkins"
|
targets: "cicd/jobs/*.jenkins"
|
||||||
|
|
|
||||||
|
|
@ -47,8 +47,6 @@ type Plugin struct {
|
||||||
// JenkinsMaster defines the Jenkins master pod attributes and plugins,
|
// JenkinsMaster defines the Jenkins master pod attributes and plugins,
|
||||||
// every single change requires Jenkins master pod restart
|
// every single change requires Jenkins master pod restart
|
||||||
type JenkinsMaster struct {
|
type JenkinsMaster struct {
|
||||||
Container //TODO move to containers
|
|
||||||
|
|
||||||
// pod properties
|
// pod properties
|
||||||
Annotations map[string]string `json:"masterAnnotations,omitempty"`
|
Annotations map[string]string `json:"masterAnnotations,omitempty"`
|
||||||
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
|
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
|
||||||
|
|
|
||||||
|
|
@ -170,8 +170,8 @@ func (in *JenkinsList) DeepCopyObject() runtime.Object {
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *JenkinsMaster) DeepCopyInto(out *JenkinsMaster) {
|
func (in *JenkinsMaster) DeepCopyInto(out *JenkinsMaster) {
|
||||||
*out = *in
|
*out = *in
|
||||||
if in.NodeSelector != nil {
|
if in.Annotations != nil {
|
||||||
in, out := &in.NodeSelector, &out.NodeSelector
|
in, out := &in.Annotations, &out.Annotations
|
||||||
*out = make(map[string]string, len(*in))
|
*out = make(map[string]string, len(*in))
|
||||||
for key, val := range *in {
|
for key, val := range *in {
|
||||||
(*out)[key] = val
|
(*out)[key] = val
|
||||||
|
|
|
||||||
|
|
@ -438,8 +438,8 @@ func (r *ReconcileJenkinsBaseConfiguration) isRecreatePodNeeded(currentJenkinsMa
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len(r.jenkins.Spec.Master.Containers) + 1) != len(currentJenkinsMasterPod.Spec.Containers) {
|
if len(r.jenkins.Spec.Master.Containers) != len(currentJenkinsMasterPod.Spec.Containers) {
|
||||||
r.logger.Info(fmt.Sprintf("Jenkins amount of containers has changed to '%+v', recreating pod", len(r.jenkins.Spec.Master.Containers)+1))
|
r.logger.Info(fmt.Sprintf("Jenkins amount of containers has changed to '%+v', recreating pod", len(r.jenkins.Spec.Master.Containers)))
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -194,19 +194,20 @@ func GetJenkinsMasterContainerBaseVolumeMounts() []corev1.VolumeMount {
|
||||||
|
|
||||||
// NewJenkinsMasterContainer returns Jenkins master Kubernetes container
|
// NewJenkinsMasterContainer returns Jenkins master Kubernetes container
|
||||||
func NewJenkinsMasterContainer(jenkins *v1alpha2.Jenkins) corev1.Container {
|
func NewJenkinsMasterContainer(jenkins *v1alpha2.Jenkins) corev1.Container {
|
||||||
|
jenkinsContainer := jenkins.Spec.Master.Containers[0]
|
||||||
envs := GetJenkinsMasterPodBaseEnvs()
|
envs := GetJenkinsMasterPodBaseEnvs()
|
||||||
envs = append(envs, jenkins.Spec.Master.Env...)
|
envs = append(envs, jenkinsContainer.Env...)
|
||||||
|
|
||||||
return corev1.Container{
|
return corev1.Container{
|
||||||
Name: JenkinsMasterContainerName,
|
Name: JenkinsMasterContainerName,
|
||||||
Image: jenkins.Spec.Master.Image,
|
Image: jenkinsContainer.Image,
|
||||||
ImagePullPolicy: jenkins.Spec.Master.ImagePullPolicy,
|
ImagePullPolicy: jenkinsContainer.ImagePullPolicy,
|
||||||
Command: []string{
|
Command: []string{
|
||||||
"bash",
|
"bash",
|
||||||
fmt.Sprintf("%s/%s", jenkinsScriptsVolumePath, initScriptName),
|
fmt.Sprintf("%s/%s", jenkinsScriptsVolumePath, initScriptName),
|
||||||
},
|
},
|
||||||
LivenessProbe: jenkins.Spec.Master.LivenessProbe,
|
LivenessProbe: jenkinsContainer.LivenessProbe,
|
||||||
ReadinessProbe: jenkins.Spec.Master.ReadinessProbe,
|
ReadinessProbe: jenkinsContainer.ReadinessProbe,
|
||||||
Ports: []corev1.ContainerPort{
|
Ports: []corev1.ContainerPort{
|
||||||
{
|
{
|
||||||
Name: httpPortName,
|
Name: httpPortName,
|
||||||
|
|
@ -220,8 +221,8 @@ func NewJenkinsMasterContainer(jenkins *v1alpha2.Jenkins) corev1.Container {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Env: envs,
|
Env: envs,
|
||||||
Resources: jenkins.Spec.Master.Resources,
|
Resources: jenkinsContainer.Resources,
|
||||||
VolumeMounts: append(GetJenkinsMasterContainerBaseVolumeMounts(), jenkins.Spec.Master.VolumeMounts...),
|
VolumeMounts: append(GetJenkinsMasterContainerBaseVolumeMounts(), jenkinsContainer.VolumeMounts...),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -249,7 +250,7 @@ func ConvertJenkinsContainerToKubernetesContainer(container v1alpha2.Container)
|
||||||
func newContainers(jenkins *v1alpha2.Jenkins) (containers []corev1.Container) {
|
func newContainers(jenkins *v1alpha2.Jenkins) (containers []corev1.Container) {
|
||||||
containers = append(containers, NewJenkinsMasterContainer(jenkins))
|
containers = append(containers, NewJenkinsMasterContainer(jenkins))
|
||||||
|
|
||||||
for _, container := range jenkins.Spec.Master.Containers {
|
for _, container := range jenkins.Spec.Master.Containers[1:] {
|
||||||
containers = append(containers, ConvertJenkinsContainerToKubernetesContainer(container))
|
containers = append(containers, ConvertJenkinsContainerToKubernetesContainer(container))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,10 +32,6 @@ func (r *ReconcileJenkinsBaseConfiguration) Validate(jenkins *v1alpha2.Jenkins)
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if !r.validateContainer(jenkins.Spec.Master.Container) {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, container := range jenkins.Spec.Master.Containers {
|
for _, container := range jenkins.Spec.Master.Containers {
|
||||||
if !r.validateContainer(container) {
|
if !r.validateContainer(container) {
|
||||||
return false, nil
|
return false, nil
|
||||||
|
|
@ -205,7 +201,7 @@ func (r *ReconcileJenkinsBaseConfiguration) validateJenkinsMasterPodEnvs() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
valid := true
|
valid := true
|
||||||
for _, userEnv := range r.jenkins.Spec.Master.Env {
|
for _, userEnv := range r.jenkins.Spec.Master.Containers[0].Env {
|
||||||
if _, overriding := baseEnvNames[userEnv.Name]; overriding {
|
if _, overriding := baseEnvNames[userEnv.Name]; overriding {
|
||||||
r.logger.V(log.VWarn).Info(fmt.Sprintf("Jenkins Master pod env '%s' cannot be overridden", userEnv.Name))
|
r.logger.V(log.VWarn).Info(fmt.Sprintf("Jenkins Master pod env '%s' cannot be overridden", userEnv.Name))
|
||||||
valid = false
|
valid = false
|
||||||
|
|
|
||||||
|
|
@ -136,11 +136,13 @@ func TestValidateJenkinsMasterPodEnvs(t *testing.T) {
|
||||||
jenkins := v1alpha2.Jenkins{
|
jenkins := v1alpha2.Jenkins{
|
||||||
Spec: v1alpha2.JenkinsSpec{
|
Spec: v1alpha2.JenkinsSpec{
|
||||||
Master: v1alpha2.JenkinsMaster{
|
Master: v1alpha2.JenkinsMaster{
|
||||||
Container: v1alpha2.Container{
|
Containers: []v1alpha2.Container{
|
||||||
Env: []v1.EnvVar{
|
{
|
||||||
{
|
Env: []v1.EnvVar{
|
||||||
Name: "SOME_VALUE",
|
{
|
||||||
Value: "",
|
Name: "SOME_VALUE",
|
||||||
|
Value: "",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -156,11 +158,13 @@ func TestValidateJenkinsMasterPodEnvs(t *testing.T) {
|
||||||
jenkins := v1alpha2.Jenkins{
|
jenkins := v1alpha2.Jenkins{
|
||||||
Spec: v1alpha2.JenkinsSpec{
|
Spec: v1alpha2.JenkinsSpec{
|
||||||
Master: v1alpha2.JenkinsMaster{
|
Master: v1alpha2.JenkinsMaster{
|
||||||
Container: v1alpha2.Container{
|
Containers: []v1alpha2.Container{
|
||||||
Env: []v1.EnvVar{
|
{
|
||||||
{
|
Env: []v1.EnvVar{
|
||||||
Name: "JENKINS_HOME",
|
{
|
||||||
Value: "",
|
Name: "JENKINS_HOME",
|
||||||
|
Value: "",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -220,7 +224,7 @@ func TestValidateContainerVolumeMounts(t *testing.T) {
|
||||||
}
|
}
|
||||||
baseReconcileLoop := New(nil, nil, logf.ZapLogger(false),
|
baseReconcileLoop := New(nil, nil, logf.ZapLogger(false),
|
||||||
&jenkins, false, false)
|
&jenkins, false, false)
|
||||||
got := baseReconcileLoop.validateContainerVolumeMounts(jenkins.Spec.Master.Container)
|
got := baseReconcileLoop.validateContainerVolumeMounts(v1alpha2.Container{})
|
||||||
assert.Equal(t, true, got)
|
assert.Equal(t, true, got)
|
||||||
})
|
})
|
||||||
t.Run("one extra volume", func(t *testing.T) {
|
t.Run("one extra volume", func(t *testing.T) {
|
||||||
|
|
@ -232,11 +236,13 @@ func TestValidateContainerVolumeMounts(t *testing.T) {
|
||||||
Name: "example",
|
Name: "example",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Container: v1alpha2.Container{
|
Containers: []v1alpha2.Container{
|
||||||
VolumeMounts: []v1.VolumeMount{
|
{
|
||||||
{
|
VolumeMounts: []v1.VolumeMount{
|
||||||
Name: "example",
|
{
|
||||||
MountPath: "/test",
|
Name: "example",
|
||||||
|
MountPath: "/test",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -245,7 +251,7 @@ func TestValidateContainerVolumeMounts(t *testing.T) {
|
||||||
}
|
}
|
||||||
baseReconcileLoop := New(nil, nil, logf.ZapLogger(false),
|
baseReconcileLoop := New(nil, nil, logf.ZapLogger(false),
|
||||||
&jenkins, false, false)
|
&jenkins, false, false)
|
||||||
got := baseReconcileLoop.validateContainerVolumeMounts(jenkins.Spec.Master.Container)
|
got := baseReconcileLoop.validateContainerVolumeMounts(jenkins.Spec.Master.Containers[0])
|
||||||
assert.Equal(t, true, got)
|
assert.Equal(t, true, got)
|
||||||
})
|
})
|
||||||
t.Run("empty mountPath", func(t *testing.T) {
|
t.Run("empty mountPath", func(t *testing.T) {
|
||||||
|
|
@ -257,11 +263,13 @@ func TestValidateContainerVolumeMounts(t *testing.T) {
|
||||||
Name: "example",
|
Name: "example",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Container: v1alpha2.Container{
|
Containers: []v1alpha2.Container{
|
||||||
VolumeMounts: []v1.VolumeMount{
|
{
|
||||||
{
|
VolumeMounts: []v1.VolumeMount{
|
||||||
Name: "example",
|
{
|
||||||
MountPath: "", // empty
|
Name: "example",
|
||||||
|
MountPath: "", // empty
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -270,18 +278,20 @@ func TestValidateContainerVolumeMounts(t *testing.T) {
|
||||||
}
|
}
|
||||||
baseReconcileLoop := New(nil, nil, logf.ZapLogger(false),
|
baseReconcileLoop := New(nil, nil, logf.ZapLogger(false),
|
||||||
&jenkins, false, false)
|
&jenkins, false, false)
|
||||||
got := baseReconcileLoop.validateContainerVolumeMounts(jenkins.Spec.Master.Container)
|
got := baseReconcileLoop.validateContainerVolumeMounts(jenkins.Spec.Master.Containers[0])
|
||||||
assert.Equal(t, false, got)
|
assert.Equal(t, false, got)
|
||||||
})
|
})
|
||||||
t.Run("missing volume", func(t *testing.T) {
|
t.Run("missing volume", func(t *testing.T) {
|
||||||
jenkins := v1alpha2.Jenkins{
|
jenkins := v1alpha2.Jenkins{
|
||||||
Spec: v1alpha2.JenkinsSpec{
|
Spec: v1alpha2.JenkinsSpec{
|
||||||
Master: v1alpha2.JenkinsMaster{
|
Master: v1alpha2.JenkinsMaster{
|
||||||
Container: v1alpha2.Container{
|
Containers: []v1alpha2.Container{
|
||||||
VolumeMounts: []v1.VolumeMount{
|
{
|
||||||
{
|
VolumeMounts: []v1.VolumeMount{
|
||||||
Name: "missing-volume",
|
{
|
||||||
MountPath: "/test",
|
Name: "missing-volume",
|
||||||
|
MountPath: "/test",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -290,7 +300,7 @@ func TestValidateContainerVolumeMounts(t *testing.T) {
|
||||||
}
|
}
|
||||||
baseReconcileLoop := New(nil, nil, logf.ZapLogger(false),
|
baseReconcileLoop := New(nil, nil, logf.ZapLogger(false),
|
||||||
&jenkins, false, false)
|
&jenkins, false, false)
|
||||||
got := baseReconcileLoop.validateContainerVolumeMounts(jenkins.Spec.Master.Container)
|
got := baseReconcileLoop.validateContainerVolumeMounts(jenkins.Spec.Master.Containers[0])
|
||||||
assert.Equal(t, false, got)
|
assert.Equal(t, false, got)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import (
|
||||||
|
|
||||||
"github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2"
|
"github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2"
|
||||||
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client"
|
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client"
|
||||||
|
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base/resources"
|
||||||
|
|
||||||
"github.com/bndr/gojenkins"
|
"github.com/bndr/gojenkins"
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
|
|
@ -120,16 +121,19 @@ func jenkinsCustomResource() *v1alpha2.Jenkins {
|
||||||
Spec: v1alpha2.JenkinsSpec{
|
Spec: v1alpha2.JenkinsSpec{
|
||||||
Master: v1alpha2.JenkinsMaster{
|
Master: v1alpha2.JenkinsMaster{
|
||||||
Annotations: map[string]string{"test": "label"},
|
Annotations: map[string]string{"test": "label"},
|
||||||
Container: v1alpha2.Container{
|
Containers: []v1alpha2.Container{
|
||||||
Image: "jenkins/jenkins",
|
{
|
||||||
Resources: corev1.ResourceRequirements{
|
Name: resources.JenkinsMasterContainerName,
|
||||||
Requests: corev1.ResourceList{
|
Image: "jenkins/jenkins",
|
||||||
corev1.ResourceCPU: resource.MustParse("300m"),
|
Resources: corev1.ResourceRequirements{
|
||||||
corev1.ResourceMemory: resource.MustParse("500Mi"),
|
Requests: corev1.ResourceList{
|
||||||
},
|
corev1.ResourceCPU: resource.MustParse("300m"),
|
||||||
Limits: corev1.ResourceList{
|
corev1.ResourceMemory: resource.MustParse("500Mi"),
|
||||||
corev1.ResourceCPU: resource.MustParse("2"),
|
},
|
||||||
corev1.ResourceMemory: resource.MustParse("2Gi"),
|
Limits: corev1.ResourceList{
|
||||||
|
corev1.ResourceCPU: resource.MustParse("2"),
|
||||||
|
corev1.ResourceMemory: resource.MustParse("2Gi"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import (
|
||||||
|
|
||||||
"github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2"
|
"github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2"
|
||||||
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base"
|
"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/configuration/user"
|
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/user"
|
||||||
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/constants"
|
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/constants"
|
||||||
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/plugins"
|
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/plugins"
|
||||||
|
|
@ -221,21 +222,33 @@ func (r *ReconcileJenkins) buildLogger(jenkinsName string) logr.Logger {
|
||||||
|
|
||||||
func (r *ReconcileJenkins) setDefaults(jenkins *v1alpha2.Jenkins, logger logr.Logger) error {
|
func (r *ReconcileJenkins) setDefaults(jenkins *v1alpha2.Jenkins, logger logr.Logger) error {
|
||||||
changed := false
|
changed := false
|
||||||
if len(jenkins.Spec.Master.Image) == 0 {
|
|
||||||
|
var jenkinsContainer v1alpha2.Container
|
||||||
|
if len(jenkins.Spec.Master.Containers) == 0 {
|
||||||
|
changed = true
|
||||||
|
jenkinsContainer = v1alpha2.Container{Name: resources.JenkinsMasterContainerName}
|
||||||
|
} else {
|
||||||
|
if jenkins.Spec.Master.Containers[0].Name != resources.JenkinsMasterContainerName {
|
||||||
|
return errors.Errorf("first container in spec.master.containers must be Jenkins container with name '%s', please correct CR", resources.JenkinsMasterContainerName)
|
||||||
|
}
|
||||||
|
jenkinsContainer = jenkins.Spec.Master.Containers[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(jenkinsContainer.Image) == 0 {
|
||||||
logger.Info("Setting default Jenkins master image: " + constants.DefaultJenkinsMasterImage)
|
logger.Info("Setting default Jenkins master image: " + constants.DefaultJenkinsMasterImage)
|
||||||
changed = true
|
changed = true
|
||||||
jenkins.Spec.Master.Image = constants.DefaultJenkinsMasterImage
|
jenkinsContainer.Image = constants.DefaultJenkinsMasterImage
|
||||||
jenkins.Spec.Master.ImagePullPolicy = corev1.PullAlways
|
jenkinsContainer.ImagePullPolicy = corev1.PullAlways
|
||||||
}
|
}
|
||||||
if len(jenkins.Spec.Master.ImagePullPolicy) == 0 {
|
if len(jenkinsContainer.ImagePullPolicy) == 0 {
|
||||||
logger.Info(fmt.Sprintf("Setting default Jenkins master image pull policy: %s", corev1.PullAlways))
|
logger.Info(fmt.Sprintf("Setting default Jenkins master image pull policy: %s", corev1.PullAlways))
|
||||||
changed = true
|
changed = true
|
||||||
jenkins.Spec.Master.ImagePullPolicy = corev1.PullAlways
|
jenkinsContainer.ImagePullPolicy = corev1.PullAlways
|
||||||
}
|
}
|
||||||
if jenkins.Spec.Master.ReadinessProbe == nil {
|
if jenkinsContainer.ReadinessProbe == nil {
|
||||||
logger.Info("Setting default Jenkins readinessProbe")
|
logger.Info("Setting default Jenkins readinessProbe")
|
||||||
changed = true
|
changed = true
|
||||||
jenkins.Spec.Master.ReadinessProbe = &corev1.Probe{
|
jenkinsContainer.ReadinessProbe = &corev1.Probe{
|
||||||
Handler: corev1.Handler{
|
Handler: corev1.Handler{
|
||||||
HTTPGet: &corev1.HTTPGetAction{
|
HTTPGet: &corev1.HTTPGetAction{
|
||||||
Path: "/login",
|
Path: "/login",
|
||||||
|
|
@ -246,10 +259,10 @@ func (r *ReconcileJenkins) setDefaults(jenkins *v1alpha2.Jenkins, logger logr.Lo
|
||||||
InitialDelaySeconds: int32(30),
|
InitialDelaySeconds: int32(30),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if jenkins.Spec.Master.LivenessProbe == nil {
|
if jenkinsContainer.LivenessProbe == nil {
|
||||||
logger.Info("Setting default Jenkins livenessProbe")
|
logger.Info("Setting default Jenkins livenessProbe")
|
||||||
changed = true
|
changed = true
|
||||||
jenkins.Spec.Master.LivenessProbe = &corev1.Probe{
|
jenkinsContainer.LivenessProbe = &corev1.Probe{
|
||||||
Handler: corev1.Handler{
|
Handler: corev1.Handler{
|
||||||
HTTPGet: &corev1.HTTPGetAction{
|
HTTPGet: &corev1.HTTPGetAction{
|
||||||
Path: "/login",
|
Path: "/login",
|
||||||
|
|
@ -281,10 +294,10 @@ func (r *ReconcileJenkins) setDefaults(jenkins *v1alpha2.Jenkins, logger logr.Lo
|
||||||
changed = true
|
changed = true
|
||||||
jenkins.Spec.Master.Plugins = []v1alpha2.Plugin{{Name: "simple-theme-plugin", Version: "0.5.1"}}
|
jenkins.Spec.Master.Plugins = []v1alpha2.Plugin{{Name: "simple-theme-plugin", Version: "0.5.1"}}
|
||||||
}
|
}
|
||||||
if isResourceRequirementsNotSet(jenkins.Spec.Master.Resources) {
|
if isResourceRequirementsNotSet(jenkinsContainer.Resources) {
|
||||||
logger.Info("Setting default Jenkins master container resource requirements")
|
logger.Info("Setting default Jenkins master container resource requirements")
|
||||||
changed = true
|
changed = true
|
||||||
jenkins.Spec.Master.Resources = corev1.ResourceRequirements{
|
jenkinsContainer.Resources = corev1.ResourceRequirements{
|
||||||
Requests: corev1.ResourceList{
|
Requests: corev1.ResourceList{
|
||||||
corev1.ResourceCPU: resource.MustParse("1"),
|
corev1.ResourceCPU: resource.MustParse("1"),
|
||||||
corev1.ResourceMemory: resource.MustParse("500Mi"),
|
corev1.ResourceMemory: resource.MustParse("500Mi"),
|
||||||
|
|
@ -319,12 +332,16 @@ func (r *ReconcileJenkins) setDefaults(jenkins *v1alpha2.Jenkins, logger logr.Lo
|
||||||
Port: constants.DefaultSlavePortInt32,
|
Port: constants.DefaultSlavePortInt32,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for i, container := range jenkins.Spec.Master.Containers {
|
if len(jenkins.Spec.Master.Containers) > 1 {
|
||||||
if setDefaultsForContainer(jenkins, i, logger.WithValues("container", container.Name)) {
|
for i, container := range jenkins.Spec.Master.Containers[1:] {
|
||||||
changed = true
|
if setDefaultsForContainer(jenkins, i, logger.WithValues("container", container.Name)) {
|
||||||
|
changed = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jenkins.Spec.Master.Containers = []v1alpha2.Container{jenkinsContainer}
|
||||||
|
|
||||||
if changed {
|
if changed {
|
||||||
return errors.WithStack(r.client.Update(context.TODO(), jenkins))
|
return errors.WithStack(r.client.Update(context.TODO(), jenkins))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import (
|
||||||
|
|
||||||
"github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2"
|
"github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2"
|
||||||
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client"
|
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client"
|
||||||
|
"github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base/resources"
|
||||||
|
|
||||||
"github.com/bndr/gojenkins"
|
"github.com/bndr/gojenkins"
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
|
|
@ -388,16 +389,19 @@ func jenkinsCustomResource() *v1alpha2.Jenkins {
|
||||||
Spec: v1alpha2.JenkinsSpec{
|
Spec: v1alpha2.JenkinsSpec{
|
||||||
Master: v1alpha2.JenkinsMaster{
|
Master: v1alpha2.JenkinsMaster{
|
||||||
Annotations: map[string]string{"test": "label"},
|
Annotations: map[string]string{"test": "label"},
|
||||||
Container: v1alpha2.Container{
|
Containers: []v1alpha2.Container{
|
||||||
Image: "jenkins/jenkins",
|
{
|
||||||
Resources: corev1.ResourceRequirements{
|
Name: resources.JenkinsMasterContainerName,
|
||||||
Requests: corev1.ResourceList{
|
Image: "jenkins/jenkins",
|
||||||
corev1.ResourceCPU: resource.MustParse("300m"),
|
Resources: corev1.ResourceRequirements{
|
||||||
corev1.ResourceMemory: resource.MustParse("500Mi"),
|
Requests: corev1.ResourceList{
|
||||||
},
|
corev1.ResourceCPU: resource.MustParse("300m"),
|
||||||
Limits: corev1.ResourceList{
|
corev1.ResourceMemory: resource.MustParse("500Mi"),
|
||||||
corev1.ResourceCPU: resource.MustParse("2"),
|
},
|
||||||
corev1.ResourceMemory: resource.MustParse("2Gi"),
|
Limits: corev1.ResourceList{
|
||||||
|
corev1.ResourceCPU: resource.MustParse("2"),
|
||||||
|
corev1.ResourceMemory: resource.MustParse("2Gi"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -74,40 +74,41 @@ func createJenkinsCR(t *testing.T, name, namespace string, seedJob *[]v1alpha2.S
|
||||||
Spec: v1alpha2.JenkinsSpec{
|
Spec: v1alpha2.JenkinsSpec{
|
||||||
Master: v1alpha2.JenkinsMaster{
|
Master: v1alpha2.JenkinsMaster{
|
||||||
Annotations: map[string]string{"test": "label"},
|
Annotations: map[string]string{"test": "label"},
|
||||||
Container: v1alpha2.Container{
|
|
||||||
Image: "jenkins/jenkins",
|
|
||||||
Env: []v1.EnvVar{
|
|
||||||
{
|
|
||||||
Name: "TEST_ENV",
|
|
||||||
Value: "test_env_value",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
ReadinessProbe: &corev1.Probe{
|
|
||||||
Handler: corev1.Handler{
|
|
||||||
HTTPGet: &corev1.HTTPGetAction{
|
|
||||||
Path: "/login",
|
|
||||||
Port: intstr.FromString("http"),
|
|
||||||
Scheme: corev1.URISchemeHTTP,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
InitialDelaySeconds: int32(80),
|
|
||||||
TimeoutSeconds: int32(4),
|
|
||||||
FailureThreshold: int32(10),
|
|
||||||
},
|
|
||||||
LivenessProbe: &corev1.Probe{
|
|
||||||
Handler: corev1.Handler{
|
|
||||||
HTTPGet: &corev1.HTTPGetAction{
|
|
||||||
Path: "/login",
|
|
||||||
Port: intstr.FromString("http"),
|
|
||||||
Scheme: corev1.URISchemeHTTP,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
InitialDelaySeconds: int32(80),
|
|
||||||
TimeoutSeconds: int32(4),
|
|
||||||
FailureThreshold: int32(10),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Containers: []v1alpha2.Container{
|
Containers: []v1alpha2.Container{
|
||||||
|
{
|
||||||
|
Name: resources.JenkinsMasterContainerName,
|
||||||
|
Image: "jenkins/jenkins",
|
||||||
|
Env: []v1.EnvVar{
|
||||||
|
{
|
||||||
|
Name: "TEST_ENV",
|
||||||
|
Value: "test_env_value",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ReadinessProbe: &corev1.Probe{
|
||||||
|
Handler: corev1.Handler{
|
||||||
|
HTTPGet: &corev1.HTTPGetAction{
|
||||||
|
Path: "/login",
|
||||||
|
Port: intstr.FromString("http"),
|
||||||
|
Scheme: corev1.URISchemeHTTP,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
InitialDelaySeconds: int32(80),
|
||||||
|
TimeoutSeconds: int32(4),
|
||||||
|
FailureThreshold: int32(10),
|
||||||
|
},
|
||||||
|
LivenessProbe: &corev1.Probe{
|
||||||
|
Handler: corev1.Handler{
|
||||||
|
HTTPGet: &corev1.HTTPGetAction{
|
||||||
|
Path: "/login",
|
||||||
|
Port: intstr.FromString("http"),
|
||||||
|
Scheme: corev1.URISchemeHTTP,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
InitialDelaySeconds: int32(80),
|
||||||
|
TimeoutSeconds: int32(4),
|
||||||
|
FailureThreshold: int32(10),
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "envoyproxy",
|
Name: "envoyproxy",
|
||||||
Image: "envoyproxy/envoy-alpine",
|
Image: "envoyproxy/envoy-alpine",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue