notebooks/workspaces/controller/internal/helper/helper.go

101 lines
2.6 KiB
Go

package helper
import (
"reflect"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
)
// CopyStatefulSetFields updates a target StatefulSet with the fields from a desired StatefulSet, returning true if an update is required.
func CopyStatefulSetFields(desired *appsv1.StatefulSet, target *appsv1.StatefulSet) bool {
requireUpdate := false
// copy `metadata.labels`
for k, v := range target.Labels {
if desired.Labels[k] != v {
requireUpdate = true
}
}
target.Labels = desired.Labels
// copy `metadata.annotations`
for k, v := range target.Annotations {
if desired.Annotations[k] != v {
requireUpdate = true
}
}
target.Annotations = desired.Annotations
// copy `spec.replicas`
if *desired.Spec.Replicas != *target.Spec.Replicas {
*target.Spec.Replicas = *desired.Spec.Replicas
requireUpdate = true
}
// copy `spec.selector`
//
// TODO: confirm if StatefulSets support updates to the selector
// if not, we might need to recreate the StatefulSet
//
if !reflect.DeepEqual(target.Spec.Selector, desired.Spec.Selector) {
target.Spec.Selector = desired.Spec.Selector
requireUpdate = true
}
// copy `spec.template`
//
// TODO: confirm if there is a problem with doing the update at the `spec.template` level
// or if only `spec.template.spec` should be updated
//
if !reflect.DeepEqual(target.Spec.Template, desired.Spec.Template) {
target.Spec.Template = desired.Spec.Template
requireUpdate = true
}
return requireUpdate
}
// CopyServiceFields updates a target Service with the fields from a desired Service, returning true if an update is required.
func CopyServiceFields(desired *corev1.Service, target *corev1.Service) bool {
requireUpdate := false
// copy `metadata.labels`
for k, v := range target.Labels {
if desired.Labels[k] != v {
requireUpdate = true
}
}
target.Labels = desired.Labels
// copy `metadata.annotations`
for k, v := range target.Annotations {
if desired.Annotations[k] != v {
requireUpdate = true
}
}
target.Annotations = desired.Annotations
// NOTE: we don't copy the entire `spec` because we can't overwrite the `spec.clusterIp` and similar fields
// copy `spec.ports`
if !reflect.DeepEqual(target.Spec.Ports, desired.Spec.Ports) {
target.Spec.Ports = desired.Spec.Ports
requireUpdate = true
}
// copy `spec.selector`
if !reflect.DeepEqual(target.Spec.Selector, desired.Spec.Selector) {
target.Spec.Selector = desired.Spec.Selector
requireUpdate = true
}
// copy `spec.type`
if target.Spec.Type != desired.Spec.Type {
target.Spec.Type = desired.Spec.Type
requireUpdate = true
}
return requireUpdate
}