mirror of
https://github.com/paralus/paralus.git
synced 2026-02-14 17:49:51 +00:00
220 lines
5.5 KiB
Go
220 lines
5.5 KiB
Go
package step
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
clusterv2 "github.com/paralus/paralus/proto/types/controller"
|
|
appsv1 "k8s.io/api/apps/v1"
|
|
batchv1 "k8s.io/api/batch/v1"
|
|
corev1 "k8s.io/api/core/v1"
|
|
exv1beta1 "k8s.io/api/extensions/v1beta1"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
)
|
|
|
|
func getExV1Beta1DeploymentState(d *exv1beta1.Deployment) (state clusterv2.StepObjectState, reason string) {
|
|
var available bool
|
|
var progressing bool = true
|
|
var replicasFailure bool
|
|
var progressMessage, availableMessage, replicaFailureMessage string
|
|
|
|
for _, condition := range d.Status.Conditions {
|
|
if condition.Type == exv1beta1.DeploymentAvailable {
|
|
if condition.Status == corev1.ConditionTrue {
|
|
available = true
|
|
}
|
|
availableMessage = condition.Message
|
|
}
|
|
if condition.Type == exv1beta1.DeploymentProgressing {
|
|
if condition.Status != corev1.ConditionTrue {
|
|
progressing = false
|
|
}
|
|
progressMessage = condition.Message
|
|
}
|
|
if condition.Type == exv1beta1.DeploymentReplicaFailure {
|
|
if condition.Status == corev1.ConditionTrue {
|
|
replicasFailure = true
|
|
replicaFailureMessage = condition.Message
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
switch {
|
|
case available && d.Status.UnavailableReplicas == 0:
|
|
state = clusterv2.StepObjectComplete
|
|
reason = availableMessage
|
|
return
|
|
case !progressing || replicasFailure:
|
|
state = clusterv2.StepObjectFailed
|
|
if !progressing {
|
|
reason = progressMessage
|
|
} else {
|
|
reason = replicaFailureMessage
|
|
}
|
|
|
|
return
|
|
default:
|
|
state = clusterv2.StepObjectCreated
|
|
reason = progressMessage
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
func getAppsV1DeploymentState(d *appsv1.Deployment) (state clusterv2.StepObjectState, reason string) {
|
|
|
|
var available bool
|
|
var progressing bool = true
|
|
var replicasFailure bool
|
|
var progressMessage, availableMessage, replicaFailureMessage string
|
|
|
|
for _, condition := range d.Status.Conditions {
|
|
if condition.Type == appsv1.DeploymentAvailable {
|
|
if condition.Status == corev1.ConditionTrue {
|
|
available = true
|
|
}
|
|
availableMessage = condition.Message
|
|
|
|
}
|
|
if condition.Type == appsv1.DeploymentProgressing {
|
|
if condition.Status != corev1.ConditionTrue {
|
|
progressing = false
|
|
}
|
|
progressMessage = condition.Message
|
|
|
|
}
|
|
if condition.Type == appsv1.DeploymentReplicaFailure {
|
|
if condition.Status == corev1.ConditionTrue {
|
|
replicasFailure = true
|
|
replicaFailureMessage = condition.Message
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
switch {
|
|
case available && d.Status.UnavailableReplicas == 0:
|
|
state = clusterv2.StepObjectComplete
|
|
reason = availableMessage
|
|
return
|
|
case !progressing || replicasFailure:
|
|
state = clusterv2.StepObjectFailed
|
|
if !progressing {
|
|
reason = progressMessage
|
|
} else {
|
|
reason = replicaFailureMessage
|
|
}
|
|
|
|
return
|
|
default:
|
|
state = clusterv2.StepObjectCreated
|
|
reason = progressMessage
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func getStatefulSetState(s *appsv1.StatefulSet) (state clusterv2.StepObjectState, reason string) {
|
|
|
|
if s.Status.ReadyReplicas == *s.Spec.Replicas {
|
|
state = clusterv2.StepObjectComplete
|
|
reason = "all required replicas ready"
|
|
return
|
|
}
|
|
// for _, condition := range s.Status.Conditions {
|
|
// if condition.Type
|
|
// }
|
|
|
|
state = clusterv2.StepObjectCreated
|
|
reason = "in progress"
|
|
return
|
|
}
|
|
|
|
func getDaemonSetState(ds *appsv1.DaemonSet) (state clusterv2.StepObjectState, reason string) {
|
|
if ds.Status.DesiredNumberScheduled == ds.Status.NumberReady {
|
|
state = clusterv2.StepObjectComplete
|
|
reason = "all required replicas ready"
|
|
return
|
|
}
|
|
|
|
state = clusterv2.StepObjectCreated
|
|
reason = "in progress"
|
|
return
|
|
}
|
|
|
|
func getJobState(j *batchv1.Job) (state clusterv2.StepObjectState, reason string) {
|
|
for _, condition := range j.Status.Conditions {
|
|
if condition.Type == batchv1.JobComplete {
|
|
if condition.Status == corev1.ConditionTrue {
|
|
state = clusterv2.StepObjectComplete
|
|
reason = condition.Message
|
|
return
|
|
}
|
|
}
|
|
if condition.Type == batchv1.JobFailed {
|
|
if condition.Status == corev1.ConditionTrue {
|
|
state = clusterv2.StepObjectFailed
|
|
reason = condition.Message
|
|
return
|
|
}
|
|
}
|
|
}
|
|
state = clusterv2.StepObjectCreated
|
|
reason = "not completed"
|
|
return
|
|
}
|
|
|
|
// ObjectState returns the object state of runtime object
|
|
func ObjectState(o runtime.Object) (state clusterv2.StepObjectState, reason string) {
|
|
switch o.(type) {
|
|
case *exv1beta1.Deployment:
|
|
d := o.(*exv1beta1.Deployment)
|
|
state, reason = getExV1Beta1DeploymentState(d)
|
|
case *appsv1.Deployment:
|
|
d := o.(*appsv1.Deployment)
|
|
state, reason = getAppsV1DeploymentState(d)
|
|
case *appsv1.StatefulSet:
|
|
s := o.(*appsv1.StatefulSet)
|
|
state, reason = getStatefulSetState(s)
|
|
case *appsv1.DaemonSet:
|
|
ds := o.(*appsv1.DaemonSet)
|
|
state, reason = getDaemonSetState(ds)
|
|
case *batchv1.Job:
|
|
j := o.(*batchv1.Job)
|
|
state, reason = getJobState(j)
|
|
// case *corev1.PersistentVolumeClaim:
|
|
// pvc := o.(*corev1.PersistentVolumeClaim)
|
|
// state, reason = getPersistentVolumeClaimState(pvc)
|
|
default:
|
|
state = clusterv2.StepObjectComplete
|
|
reason = fmt.Sprintf("object type %T not handled", o)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// JobState returns the job state
|
|
func JobState(o runtime.Object) (state clusterv2.StepJobState, reason string) {
|
|
j := o.(*batchv1.Job)
|
|
for _, condition := range j.Status.Conditions {
|
|
if condition.Type == batchv1.JobComplete {
|
|
if condition.Status == corev1.ConditionTrue {
|
|
state = clusterv2.StepJobComplete
|
|
reason = condition.Message
|
|
return
|
|
}
|
|
}
|
|
if condition.Type == batchv1.JobFailed {
|
|
if condition.Status == corev1.ConditionTrue {
|
|
state = clusterv2.StepJobFailed
|
|
reason = condition.Message
|
|
return
|
|
}
|
|
}
|
|
}
|
|
state = clusterv2.StepJobCreated
|
|
reason = "not completed"
|
|
return
|
|
}
|