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
}