in gke-deploy/core/resource/ready.go [99:205]
func deploymentIsReady(ctx context.Context, obj *Object) (bool, error) {
generation, ok, err := unstructured.NestedInt64(obj.Object, "metadata", "generation")
if err != nil {
return false, fmt.Errorf("failed to get metadata.generation field: %v", err)
}
if !ok {
return false, nil
}
observedGeneration, ok, err := unstructured.NestedInt64(obj.Object, "status", "observedGeneration")
if err != nil {
return false, fmt.Errorf("failed to get status.observedGeneration field: %v", err)
}
if !ok || observedGeneration != generation {
return false, nil
}
specReplicas, ok, err := unstructured.NestedInt64(obj.Object, "spec", "replicas")
if err != nil {
return false, fmt.Errorf("failed to get spec.replicas field: %v", err)
}
if !ok {
return false, nil
}
statusReplicas, _, err := unstructured.NestedInt64(obj.Object, "status", "replicas")
if err != nil {
return false, fmt.Errorf("failed to get status.replicas field: %v", err)
}
if statusReplicas != specReplicas {
return false, nil
}
readyReplicas, _, err := unstructured.NestedInt64(obj.Object, "status", "readyReplicas")
if err != nil {
return false, fmt.Errorf("failed to get status.readyReplicas field: %v", err)
}
if readyReplicas != specReplicas {
return false, nil
}
availableReplicas, _, err := unstructured.NestedInt64(obj.Object, "status", "availableReplicas")
if err != nil {
return false, fmt.Errorf("failed to get status.availableReplicas field: %v", err)
}
if availableReplicas != specReplicas {
return false, nil
}
conditions, ok, err := unstructured.NestedSlice(obj.Object, "status", "conditions")
if err != nil {
return false, fmt.Errorf("failed to get status.conditions field: %v", err)
}
if !ok || len(conditions) == 0 {
return false, nil
}
for _, c := range conditions {
cMap, ok := c.(map[string]interface{})
if !ok {
return false, fmt.Errorf("failed to convert conditions to map")
}
cType, ok, err := unstructured.NestedString(cMap, "type")
if err != nil {
return false, fmt.Errorf("failed to get type field: %v", err)
}
if !ok || cType == "" {
return false, nil
}
switch cType {
case "Available":
status, ok, err := unstructured.NestedString(cMap, "status")
if err != nil {
return false, fmt.Errorf("failed to get status field: %v", err)
}
if !ok || status != "True" {
return false, nil
}
case "Progressing":
status, ok, err := unstructured.NestedString(cMap, "status")
if err != nil {
return false, fmt.Errorf("failed to get status field: %v", err)
}
if !ok || status == "" {
return false, nil
}
reason, ok, err := unstructured.NestedString(cMap, "reason")
if err != nil {
return false, fmt.Errorf("failed to get reason field: %v", err)
}
if !ok || status != "True" || reason != "NewReplicaSetAvailable" {
return false, nil
}
case "ReplicaFailure":
status, ok, err := unstructured.NestedString(cMap, "status")
if err != nil {
return false, fmt.Errorf("failed to get status field: %v", err)
}
if !ok || status == "True" {
return false, nil
}
default:
return false, nil
}
}
return true, nil
}