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 }