github.com/verrazzano/verrazzano@v1.7.1/tools/vz/pkg/internal/util/cluster/rancher/provisioningclusters.go (about)

     1  // Copyright (c) 2023, 2024, Oracle and/or its affiliates.
     2  // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
     3  
     4  package rancher
     5  
     6  import (
     7  	"fmt"
     8  	"path/filepath"
     9  
    10  	"github.com/verrazzano/verrazzano/tools/vz/pkg/internal/util/files"
    11  	"github.com/verrazzano/verrazzano/tools/vz/pkg/internal/util/report"
    12  	corev1 "k8s.io/api/core/v1"
    13  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    14  )
    15  
    16  const provisioningClusterResource = "cluster.provisioning.cattle.io"
    17  
    18  // Minimal definition that only contains the fields that will be analyzed
    19  type provisioningClusterList struct {
    20  	metav1.TypeMeta `json:",inline"`
    21  	metav1.ListMeta `json:"metadata,omitempty"`
    22  	Items           []provisioningCluster `json:"items"`
    23  }
    24  type provisioningCluster struct {
    25  	metav1.TypeMeta   `json:",inline"`
    26  	metav1.ObjectMeta `json:"metadata,omitempty"`
    27  	Status            provisioningStatus `json:"status,omitempty"`
    28  }
    29  type provisioningStatus struct {
    30  	Conditions []cattleCondition `json:"conditions,omitempty"`
    31  	Ready      bool              `json:"ready,omitempty"`
    32  }
    33  
    34  // AnalyzeProvisioningClusters - analyze the status of Rancher provisioning clusters resources
    35  func AnalyzeProvisioningClusters(clusterRoot string, namespace string, issueReporter *report.IssueReporter) error {
    36  	resourceRoot := clusterRoot
    37  	if len(namespace) != 0 {
    38  		resourceRoot = filepath.Join(clusterRoot, namespace)
    39  	}
    40  
    41  	list := &provisioningClusterList{}
    42  	err := files.UnmarshallFileInClusterRoot(resourceRoot, fmt.Sprintf("%s.json", provisioningClusterResource), list)
    43  	if err != nil {
    44  		return err
    45  	}
    46  
    47  	for _, cluster := range list.Items {
    48  		err = analyzeProvisioningCluster(clusterRoot, cluster, issueReporter)
    49  		if err != nil {
    50  			return err
    51  		}
    52  	}
    53  
    54  	return nil
    55  }
    56  
    57  // analyzeProvisioningCluster - analyze a single Rancher provisioning cluster and report any issues
    58  func analyzeProvisioningCluster(clusterRoot string, cluster provisioningCluster, issueReporter *report.IssueReporter) error {
    59  
    60  	var messages []string
    61  	var subMessage string
    62  	for _, condition := range cluster.Status.Conditions {
    63  		if condition.Status != corev1.ConditionTrue {
    64  			switch condition.Type {
    65  			case "Waiting":
    66  				subMessage = "is waiting"
    67  			case "Created":
    68  				subMessage = "is not created"
    69  			case "Provisioned":
    70  				subMessage = "is not provisioned"
    71  			case "BackingNamespaceCreated":
    72  				subMessage = "backing namespace not created"
    73  			case "DefaultProjectCreated":
    74  				subMessage = "default project not created"
    75  			case "SystemProjectCreated":
    76  				subMessage = "system project not created"
    77  			case "InitialRolesPopulated":
    78  				subMessage = "initial roles not populated"
    79  			case "CreatorMadeOwner":
    80  				subMessage = "creator not made owner"
    81  			case "Connected":
    82  				subMessage = "is not connected"
    83  			case "NoDiskPressure":
    84  				subMessage = "has disk pressure"
    85  			case "NoMemoryPressure":
    86  				subMessage = "has memory pressure"
    87  			case "SecretsMigrated":
    88  				subMessage = "secrets not migrated"
    89  			case "ServiceAccountSecretsMigrated":
    90  				subMessage = "service account secrets not migrated"
    91  			case "RKESecretsMigrated":
    92  				subMessage = "RKE secrets not migrated"
    93  			case "SystemAccountCreated":
    94  				subMessage = "system account not created"
    95  			case "AgentDeployed":
    96  				subMessage = "agent not deployed"
    97  			case "Ready":
    98  				subMessage = "is not ready"
    99  			case "ServiceAccountMigrated":
   100  				subMessage = "service account not migrated"
   101  			case "GlobalAdminsSynced":
   102  				subMessage = "global admins not synced"
   103  			default:
   104  				continue
   105  			}
   106  			// Add a message for the issue
   107  			reason := ""
   108  			msg := ""
   109  			if len(condition.Reason) > 0 {
   110  				reason = fmt.Sprintf(", reason is %q", condition.Reason)
   111  			}
   112  			if len(condition.Message) > 0 {
   113  				msg = fmt.Sprintf(", message is %q", condition.Message)
   114  			}
   115  			message := fmt.Sprintf("\t%s%s%s", subMessage, reason, msg)
   116  			messages = append([]string{message}, messages...)
   117  		}
   118  	}
   119  
   120  	if !cluster.Status.Ready {
   121  		messages = append([]string{"\tis not ready"}, messages...)
   122  	}
   123  
   124  	if len(messages) > 0 {
   125  		messages = append([]string{fmt.Sprintf("Rancher %s resource %q in namespace %s", provisioningClusterResource, cluster.Name, cluster.Namespace)}, messages...)
   126  		issueReporter.AddKnownIssueMessagesFiles(report.RancherIssues, clusterRoot, messages, []string{})
   127  	}
   128  
   129  	return nil
   130  }