func()

in cmd/resource/kube.go [122:229]


func (c *Clients) CheckPendingResources(r *ReleaseData) (bool, error) {
	log.Printf("Checking pending resources in %s", r.Name)
	var err error
	var errCount int
	var pArray []bool
	if r.Manifest == "" {
		return true, errors.New("Manifest not provided in the request")
	}
	infos, err := c.getManifestDetails(r)
	if err != nil {
		// Retry if resources not found
		// todo: Need to have retry count
		re := regexp.MustCompile("not found")
		if re.MatchString(err.Error()) {
			log.Println(err.Error())
			return true, nil
		}
		return true, err
	}
	for _, info := range infos {
		if errCount >= retryCount*2 {
			return true, fmt.Errorf("couldn't get the resources")
		}
		switch value := kube.AsVersioned(info).(type) {
		case *appsv1.Deployment, *appsv1beta1.Deployment, *appsv1beta2.Deployment, *extensionsv1beta1.Deployment:
			currentDeployment, err := c.ClientSet.AppsV1().Deployments(info.Namespace).Get(context.Background(), info.Name, metav1.GetOptions{})
			if err != nil {
				errCount++
				log.Printf("Warning: Got error getting deployment %s", err.Error())
				continue
			}
			// If paused deployment will never be ready
			if currentDeployment.Spec.Paused {
				continue
			}
			if !deploymentReady(currentDeployment) {
				pArray = append(pArray, false)
			}
		case *corev1.PersistentVolumeClaim:
			if !volumeReady(value) {
				pArray = append(pArray, false)
			}
		case *corev1.Service:
			if !serviceReady(value) {
				pArray = append(pArray, false)
			}
		case *extensionsv1beta1.DaemonSet, *appsv1.DaemonSet, *appsv1beta2.DaemonSet:
			ds, err := c.ClientSet.AppsV1().DaemonSets(info.Namespace).Get(context.Background(), info.Name, metav1.GetOptions{})

			if err != nil {
				log.Printf("Warning: Got error getting daemonset %s", err.Error())
				errCount++
				continue
			}
			if !daemonSetReady(ds) {
				pArray = append(pArray, false)
			}
		case *appsv1.StatefulSet, *appsv1beta1.StatefulSet, *appsv1beta2.StatefulSet:
			sts, err := c.ClientSet.AppsV1().StatefulSets(info.Namespace).Get(context.Background(), info.Name, metav1.GetOptions{})
			if err != nil {
				log.Printf("Warning: Got error getting statefulset %s", err.Error())
				errCount++
				continue
			}
			if !statefulSetReady(sts) {
				pArray = append(pArray, false)
			}
		case *extensionsv1beta1.Ingress:
			if !ingressReady(value) {
				pArray = append(pArray, false)
			}
		case *networkingv1beta1.Ingress:
			if !ingressNReady(value) {
				pArray = append(pArray, false)
			}
		case *apiextv1beta1.CustomResourceDefinition:
			if err := info.Get(); err != nil {
				return false, err
			}
			crd := &apiextv1beta1.CustomResourceDefinition{}
			if err := scheme.Scheme.Convert(info.Object, crd, nil); err != nil {
				log.Printf("Warning: Got error getting CRD %s", err.Error())
				errCount++
				continue
			}
			if !crdBetaReady(crd) {
				pArray = append(pArray, false)
			}
		case *apiextv1.CustomResourceDefinition:
			if err := info.Get(); err != nil {
				return false, err
			}
			crd := &apiextv1.CustomResourceDefinition{}
			if err := scheme.Scheme.Convert(info.Object, crd, nil); err != nil {
				log.Printf("Warning: Got error getting CRD %s", err.Error())
				errCount++
				continue
			}
			if !crdReady(crd) {
				pArray = append(pArray, false)
			}
		}
	}
	if len(pArray) > 0 || errCount != 0 {
		return true, err
	}
	return false, err
}