internal/controller/util.go (81 lines of code) (raw):
package controller
import (
"context"
. "git.jetbrains.team/tch/teamcity-operator/api/v1beta1"
"git.jetbrains.team/tch/teamcity-operator/internal/checkpoint"
"git.jetbrains.team/tch/teamcity-operator/internal/resource"
v1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/types"
"reflect"
)
func getTeamCityObjectE(r *TeamcityReconciler, ctx context.Context, namespacedName types.NamespacedName) (teamcity TeamCity, err error) {
if err := r.Get(ctx, namespacedName, &teamcity); err != nil {
return teamcity, err
}
return teamcity, nil
}
func updateTeamCityObjectStatusE(r *TeamcityReconciler, ctx context.Context, namespacedName types.NamespacedName, state string, status string) (err error) {
var teamcity TeamCity
if teamcity, err = getTeamCityObjectE(r, ctx, namespacedName); err != nil {
return err
}
teamcityStatus := TeamCityStatus{State: state, Message: status}
if !reflect.DeepEqual(teamcity.Status, teamcityStatus) {
teamcity.Status = teamcityStatus
err = r.Status().Update(context.Background(), &teamcity)
if err != nil {
return err
}
}
return nil
}
func getStatefulSetByName(r *TeamcityReconciler, ctx context.Context, namespacedName types.NamespacedName) (statefulSet v1.StatefulSet, error error) {
if err := r.Get(ctx, namespacedName, &statefulSet); err != nil {
return statefulSet, err
}
return statefulSet, nil
}
func isNewestGeneration(r *TeamcityReconciler, ctx context.Context, namespacedName types.NamespacedName) (bool bool, err error) {
var statefulSet v1.StatefulSet
if statefulSet, err = getStatefulSetByName(r, ctx, namespacedName); err != nil {
return false, err
}
if statefulSet.Generation != statefulSet.Status.ObservedGeneration {
return false, nil
}
return true, nil
}
func isNodeUpdateFinished(r *TeamcityReconciler, ctx context.Context, namespacedName types.NamespacedName) (bool bool, err error) {
var statefulSet v1.StatefulSet
if statefulSet, err = getStatefulSetByName(r, ctx, namespacedName); err != nil {
return false, err
}
if statefulSet.Status.CurrentRevision == statefulSet.Status.UpdateRevision && statefulSet.Status.ReadyReplicas == int32(1) {
return true, nil
}
return false, nil
}
func doesNodesUpdateChangeStatefulSetSpec(r *TeamcityReconciler, ctx context.Context, instance *TeamCity) (bool, error) {
for _, node := range instance.GetAllNodes() {
var nodeStatefulSet v1.StatefulSet
if err := r.Get(ctx, node.GetNamespacedNameFromNamespace(instance.Namespace), &nodeStatefulSet); err != nil {
if errors.IsNotFound(err) {
return false, nil
}
return false, err
}
if resource.ChangesRequireNodeStatefulSetRestart(instance, node, &nodeStatefulSet) {
return true, nil
}
}
return false, nil
}
func ongoingZeroDowntimeUpgrade(r *TeamcityReconciler, ctx context.Context, instance *TeamCity) bool {
initialCheckpoint := checkpoint.NewCheckpoint(r.Client, *instance)
_, err := initialCheckpoint.FetchCurrentStageFromCluster(ctx)
if err != nil {
return false
}
return true
}