oracle/pkg/k8s/condition.go (149 lines of code) (raw):
// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package k8s
import (
"strings"
"time"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/GoogleCloudPlatform/elcarro-oracle-operator/oracle/api/v1alpha1"
)
const (
// Condition Types
Ready = "Ready"
DatabaseInstanceReady = "DatabaseInstanceReady"
DatabaseInstanceTimeout = "DatabaseInstanceTimeout"
UserReady = "UserReady"
StandbyReady = "StandbyReady"
PauseMode = "Pause"
StandbyDRReady = "StandbyDRReady"
InstanceStopped = "InstanceStopped"
// Condition Reasons
// Backup schedule concurrent policy is relying on the backup ready condition’s reason,
// BackupReady and BackupFailed means backup job is not running and scheduler will continue creating backup.
BackupPending = "BackupPending"
BackupReady = "BackupReady"
BackupInProgress = "BackupInProgress"
BackupDeleting = "BackupDeleting"
BackupFailed = "BackupFailed"
CreateComplete = "CreateComplete"
CreateFailed = "CreateFailed"
CreateInProgress = "CreateInProgress"
CreatePending = "CreatePending"
BootstrapPending = "BootstrapPending"
BootstrapInProgress = "BootstrapInProgress"
ReconcileServices = "ReconcileServices"
RestorePending = "RestorePending"
ResizingInProgress = "ResizingInProgress"
ImportComplete = "ImportComplete"
ImportFailed = "ImportFailed"
ImportInProgress = "ImportInProgress"
ImportPending = "ImportPending"
RestoreComplete = "RestoreComplete"
RestoreFailed = "RestoreFailed"
RestorePreparationInProgress = "RestorePreparationInProgress"
RestorePreparationComplete = "RestorePreparationComplete"
RestoreInProgress = "RestoreInProgress"
PostRestoreBootstrapInProgress = "PostRestoreBootstrapInProgress"
PostRestoreBootstrapComplete = "PostRestoreBootstrapComplete"
PostRestoreDatabasePatchingInProgress = "PostRestoreDatabasePatchingInProgress"
SyncInProgress = "SyncInProgress"
UserOutOfSync = "UserOutOfSync"
SyncComplete = "SyncComplete"
ManuallySetUpStandbyInProgress = "ManuallySetUpStandbyInProgress"
PromoteStandbyInProgress = "PromoteStandbyInProgress"
PromoteStandbyComplete = "PromoteStandbyComplete"
PromoteStandbyFailed = "PromoteStandbyFailed"
DBShutDown = "DBShutdown"
InstanceStoppingInProgress = "InstanceStoppingInProgress"
ExportComplete = "ExportComplete"
ExportFailed = "ExportFailed"
ExportInProgress = "ExportInProgress"
ExportPending = "ExportPending"
ParameterUpdateInProgress = "ParameterUpdateInProgress"
ParameterUpdateComplete = "ParameterUpdateComplete"
ParameterUpdateRollbackInProgress = "ParameterUpdateRollbackInProgress"
StandbyDRInProgress = "StandbyDRInProgress"
StandbyDRVerifyCompleted = "StandbyDRVerifyCompleted"
StandbyDRVerifyFailed = "StandbyDRVerifyFailed"
StandbyDRCreateInProgress = "StandbyDRCreateInProgress"
StandbyDRCreateFailed = "StandbyDRCreateFailed"
StandbyDRCreateCompleted = "StandbyDRCreateCompleted"
StandbyDRSetUpDataGuardFailed = "StandbyDRSetUpDataGuardFailed"
StandbyDRSetUpDataGuardCompleted = "StandbyDRSetUpDataGuardCompleted"
StandbyDRDataGuardReplicationInProgress = "StandbyDRDataGuardReplicationInProgress"
StandbyDRPromoteFailed = "StandbyDRPromoteFailed"
StandbyDRPromoteCompleted = "StandbyDRPromoteCompleted"
StandbyDRBootstrapFailed = "StandbyDRBootstrapFailed"
StandbyDRBootstrapCompleted = "StandbyDRBootstrapCompleted"
PatchingBackupStarted = "PatchingBackupStarted"
PatchingBackupCompleted = "PatchingBackupCompleted"
PatchingBackupFailure = "PatchingBackupFailure"
PatchingRecoveryInProgress = "PatchingRecoveryInProgress"
PatchingRecoveryCompleted = "PatchingRecoveryCompleted"
PatchingRecoveryFailure = "PatchingRecoveryFailure"
DeploymentSetPatchingInProgress = "DeploymentSetPatchingInProgress"
DeploymentSetPatchingRollbackInProgress = "DeploymentSetPatchingRollbackInProgress"
DeploymentSetPatchingFailure = "DeploymentSetPatchingFailure"
DeploymentSetPatchingComplete = "DeploymentSetPatchingComplete"
StatefulSetPatchingInProgress = "StatefulSetPatchingInProgress"
StatefulSetPatchingComplete = "StatefulSetPatchingComplete"
StatefulSetPatchingFailure = "StatefulSetPatchingFailure"
DatabasePatchingInProgress = "DatabasePatchingInProgress"
DatabasePatchingComplete = "DatabasePatchingComplete"
DatabasePatchingFailure = "DatabasePatchingFailure"
NotSupported = "NotSupported"
)
var (
v1Now = func() v1.Time {
return v1.Now().Rfc3339Copy()
}
)
type StatusCond struct {
instanceStatus v1alpha1.InstanceStatus
}
func FindCondition(conditions []v1.Condition, name string) *v1.Condition {
for i, c := range conditions {
if c.Type == name {
return &conditions[i]
}
}
return nil
}
func FindConditionOrFailed(conditions []v1.Condition, name string) (bool, *v1.Condition) {
for i, c := range conditions {
if c.Type == name {
return strings.Contains(c.Reason, "Failed"), &conditions[i]
}
}
return false, nil
}
func ConditionStatusEquals(cond *v1.Condition, status v1.ConditionStatus) bool {
if cond == nil {
return false
}
return cond.Status == status
}
func ConditionReasonEquals(cond *v1.Condition, reason string) bool {
if cond == nil {
return false
}
return cond.Reason == reason
}
func InstanceUpsertCondition(iStatus *v1alpha1.InstanceStatus, name string, status v1.ConditionStatus, reason, message string) *v1.Condition {
iStatus.Conditions = Upsert(iStatus.Conditions, name, status, reason, message)
return FindCondition(iStatus.Conditions, name)
}
func Upsert(conditions []v1.Condition, name string, status v1.ConditionStatus, reason, message string) []v1.Condition {
if cond := FindCondition(conditions, name); cond != nil {
if !ConditionStatusEquals(cond, status) || !ConditionReasonEquals(cond, reason) { // LastTransitionTime refers to the time Status changes
cond.Status = status
cond.Reason = reason
cond.LastTransitionTime = v1Now()
}
cond.Message = message
return conditions
}
cond := v1.Condition{Type: name, Status: status, Reason: reason, Message: message, LastTransitionTime: v1Now()}
conditions = append(conditions, cond)
return conditions
}
func ElapsedTimeFromLastTransitionTime(condition *v1.Condition, roundTo time.Duration) time.Duration {
if condition == nil {
return 0
}
return v1Now().Sub(condition.LastTransitionTime.Time).Round(roundTo)
}