101 lines
2.6 KiB
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
|
|
}
|