func replicaSetIsReady()

in gke-deploy/core/resource/ready.go [324:408]


func replicaSetIsReady(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, ok, err := unstructured.NestedInt64(obj.Object, "status", "replicas")
	if err != nil {
		return false, fmt.Errorf("failed to get status.replicas field: %v", err)
	}
	if !ok || statusReplicas != specReplicas {
		return false, nil
	}

	readyReplicas, ok, err := unstructured.NestedInt64(obj.Object, "status", "readyReplicas")
	if err != nil {
		return false, fmt.Errorf("failed to get status.readyReplicas field: %v", err)
	}
	if !ok || readyReplicas != specReplicas {
		return false, nil
	}

	availableReplicas, ok, err := unstructured.NestedInt64(obj.Object, "status", "availableReplicas")
	if err != nil {
		return false, fmt.Errorf("failed to get status.availableReplicas field: %v", err)
	}
	if !ok || 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 true, 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 "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:
			// Skip
		}
	}

	return true, nil
}