func serviceIsReady()

in gke-deploy/core/resource/ready.go [476:518]


func serviceIsReady(ctx context.Context, obj *Object) (bool, error) {
	serviceType, ok, err := unstructured.NestedString(obj.Object, "spec", "type")
	if err != nil {
		return false, fmt.Errorf("failed to get spec.type field: %v", err)
	}
	if !ok || serviceType == "" {
		return false, nil
	}

	if serviceType == "ClusterIP" || serviceType == "NodePort" || serviceType == "ExternalName" {
		return true, nil
	}

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

	ingress, ok, err := unstructured.NestedSlice(obj.Object, "status", "loadBalancer", "ingress")
	if err != nil {
		return false, fmt.Errorf("failed to get status.loadBalancer.ingress field: %v", err)
	}
	if !ok || len(ingress) == 0 {
		return false, nil
	}
	for _, i := range ingress {
		iMap, ok := i.(map[string]interface{})
		if !ok {
			return false, fmt.Errorf("failed to convert ingress to map")
		}
		ip, ok, err := unstructured.NestedString(iMap, "ip")
		if err != nil {
			return false, fmt.Errorf("failed to get ip field: %v", err)
		}
		if !ok || ip == "" {
			return false, nil
		}
	}
	return true, nil
}