feat: allow to ignore volumes during reconciliation

This commit is contained in:
Benjamin Herbert 2025-05-05 13:21:41 +02:00
parent 8a66d658eb
commit 2a21ee7c2c
No known key found for this signature in database
3 changed files with 60 additions and 0 deletions

View File

@ -400,6 +400,10 @@ type JenkinsMaster struct {
// Defaults to 30 seconds. // Defaults to 30 seconds.
// +optional // +optional
TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty"` TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty"`
// IgnoredVolumes defines the list of volume names that should be excluded from processing or consideration.
// +optional
IgnoredVolumes []string `json:"ignoredVolumes,omitempty"`
} }
// Service defines Kubernetes service attributes // Service defines Kubernetes service attributes

View File

@ -160,6 +160,47 @@ func TestCompareVolumes(t *testing.T) {
assert.True(t, got) assert.True(t, got)
}) })
t.Run("different - additional workspace identity volume", func(t *testing.T) {
jenkins := &v1alpha2.Jenkins{
Spec: v1alpha2.JenkinsSpec{
Master: v1alpha2.JenkinsMaster{},
},
}
pod := corev1.Pod{
Spec: corev1.PodSpec{
ServiceAccountName: "service-account-name",
Volumes: append(resources.GetJenkinsMasterPodBaseVolumes(jenkins), corev1.Volume{Name: "azure-identity-token"}),
},
}
reconciler := New(configuration.Configuration{Jenkins: jenkins}, client.JenkinsAPIConnectionSettings{})
got := reconciler.compareVolumes(pod)
assert.False(t, got)
})
t.Run("additional workspace identity volume but ignored", func(t *testing.T) {
jenkins := &v1alpha2.Jenkins{
Spec: v1alpha2.JenkinsSpec{
Master: v1alpha2.JenkinsMaster{
IgnoredVolumes: []string{"azure-identity-token"},
},
},
}
pod := corev1.Pod{
Spec: corev1.PodSpec{
ServiceAccountName: "service-account-name",
Volumes: append(resources.GetJenkinsMasterPodBaseVolumes(jenkins), corev1.Volume{Name: "azure-identity-token"}),
},
}
reconciler := New(configuration.Configuration{Jenkins: jenkins}, client.JenkinsAPIConnectionSettings{})
got := reconciler.compareVolumes(pod)
assert.True(t, got)
})
} }
func TestJenkinsBaseConfigurationReconciler_verifyPlugins(t *testing.T) { func TestJenkinsBaseConfigurationReconciler_verifyPlugins(t *testing.T) {

View File

@ -294,6 +294,11 @@ func CompareContainerVolumeMounts(expected corev1.Container, actual corev1.Conta
func (r *JenkinsBaseConfigurationReconciler) compareVolumes(actualPod corev1.Pod) bool { func (r *JenkinsBaseConfigurationReconciler) compareVolumes(actualPod corev1.Pod) bool {
var toCompare []corev1.Volume var toCompare []corev1.Volume
for _, volume := range actualPod.Spec.Volumes { for _, volume := range actualPod.Spec.Volumes {
if r.isVolumeIgnored(volume.Name) {
continue
}
// filter out service account // filter out service account
if strings.HasPrefix(volume.Name, actualPod.Spec.ServiceAccountName) { if strings.HasPrefix(volume.Name, actualPod.Spec.ServiceAccountName) {
continue continue
@ -421,3 +426,13 @@ func (r *JenkinsBaseConfigurationReconciler) ensureBaseConfiguration(jenkinsClie
}) })
return reconcile.Result{Requeue: requeue}, err return reconcile.Result{Requeue: requeue}, err
} }
// isVolumeIgnored checks if the given volume name is in the list of ignored volumes
func (r *JenkinsBaseConfigurationReconciler) isVolumeIgnored(volumeName string) bool {
for _, ignoredVolume := range r.Jenkins.Spec.Master.IgnoredVolumes {
if ignoredVolume == volumeName {
return true
}
}
return false
}