internal/checkpoint/stage.go (91 lines of code) (raw):
package checkpoint
import (
"fmt"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type Stage int64
const (
UpdateInitiated Stage = iota
ReplicaCreated
ReplicaStarting
ReplicaReady
MainShuttingDown
MainReady
UpdateFinished
StageConfigMapKey string = "stage"
StageConfigMapNamePrefix string = "update-checkpoint"
)
const (
StageUpdateInitiated = "update-initiated"
StageReplicaCreated = "replica-created"
StageReplicaStarting = "replica-starting"
StageReplicaReady = "replica-ready"
StageMainShuttingDown = "main-shutting-down"
StageMainReady = "main-ready"
StageUpdateFinished = "update-finished"
)
func NewStage(stage string) Stage {
switch stage {
case StageReplicaCreated:
return ReplicaCreated
case StageReplicaStarting:
return ReplicaStarting
case StageReplicaReady:
return ReplicaReady
case StageMainReady:
return MainReady
case StageMainShuttingDown:
return MainShuttingDown
case StageUpdateFinished:
return UpdateFinished
default:
return UpdateInitiated
}
}
func (s Stage) String() string {
switch s {
case ReplicaCreated:
return StageReplicaCreated
case ReplicaStarting:
return StageReplicaStarting
case ReplicaReady:
return StageReplicaReady
case MainReady:
return StageMainReady
case MainShuttingDown:
return StageMainShuttingDown
case UpdateFinished:
return StageUpdateFinished
default:
return StageUpdateInitiated
}
}
func (s Stage) BuildCheckpointConfigMap(instanceName string, instanceNamespace string) corev1.ConfigMap {
return corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: ConstructCheckpointName(instanceName),
Namespace: instanceNamespace,
},
Data: map[string]string{
StageConfigMapKey: s.String(),
},
}
}
func (s Stage) canChangeStageValue(desired Stage) (bool, error) {
if desired < s || desired-s > 1 {
return false, fmt.Errorf("illegal stage transition: current stage '%s', desired stage '%s', difference must be 0 or 1",
s, desired)
}
return true, nil
}
func ConstructCheckpointName(instanceName string) string {
return fmt.Sprintf("%s-%s", StageConfigMapNamePrefix, instanceName)
}
func GetStageStringValueFromConfigMap(configMap *corev1.ConfigMap) (Stage, error) {
stageStr, ok := configMap.Data[StageConfigMapKey]
if !ok {
return -1, fmt.Errorf("checkpoint ConfigMap is missing %s key", StageConfigMapKey)
}
return NewStage(stageStr), nil
}