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 }