github.com/verrazzano/verrazzano@v1.7.0/tools/vz/pkg/analysis/internal/util/cluster/rancher/managementclusters.go (about) 1 // Copyright (c) 2023, 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/analysis/internal/util/files" 11 "github.com/verrazzano/verrazzano/tools/vz/pkg/analysis/internal/util/report" 12 corev1 "k8s.io/api/core/v1" 13 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 14 ) 15 16 const managementClusterResource = "cluster.management.cattle.io" 17 18 // Minimal definition that only contains the fields that will be analyzed 19 type managementClusterList struct { 20 metav1.TypeMeta `json:",inline"` 21 metav1.ListMeta `json:"metadata,omitempty"` 22 Items []managementCluster `json:"items"` 23 } 24 type managementCluster struct { 25 metav1.TypeMeta `json:",inline"` 26 metav1.ObjectMeta `json:"metadata,omitempty"` 27 Spec managementClusterSpec `json:"spec"` 28 Status cattleStatus `json:"status,omitempty"` 29 } 30 type managementClusterSpec struct { 31 DisplayName string `json:"displayName,omitempty"` 32 } 33 34 // AnalyzeManagementClusters - analyze the status of Rancher management clusters resources 35 func AnalyzeManagementClusters(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 := &managementClusterList{} 42 err := files.UnmarshallFileInClusterRoot(resourceRoot, fmt.Sprintf("%s.json", managementClusterResource), list) 43 if err != nil { 44 return err 45 } 46 47 for _, cluster := range list.Items { 48 err = analyzeManagementCluster(clusterRoot, cluster, issueReporter) 49 if err != nil { 50 return err 51 } 52 } 53 54 return nil 55 } 56 57 // analyzeManagementCluster - analyze a single Rancher management cluster and report any issues 58 func analyzeManagementCluster(clusterRoot string, cluster managementCluster, 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 "Ready": 66 subMessage = "is not ready" 67 case "Provisioning": 68 subMessage = "is not provisioning" 69 case "Provisioned": 70 subMessage = "is not provisioned" 71 case "Waiting": 72 subMessage = "is waiting" 73 case "Connected": 74 subMessage = "is not connected" 75 case "RKESecretsMigrated": 76 subMessage = "RKE secrets not migrated" 77 case "SecretsMigrated": 78 subMessage = "secrets not migrated" 79 case "NoMemoryPressure": 80 subMessage = "has memory pressure" 81 case "NoDiskPressure": 82 subMessage = "has disk pressure" 83 case "SystemAccountCreated": 84 subMessage = "system account not created" 85 case "SystemProjectCreated": 86 subMessage = "system project not created" 87 case "DefaultProjectCreated": 88 subMessage = "default project not created" 89 case "GlobalAdminsSynced": 90 subMessage = "global admins not synced" 91 case "ServiceAccountMigrated": 92 subMessage = "service account not migrated" 93 case "ServiceAccountSecretsMigrated": 94 subMessage = "service account secrets not migrated" 95 case "AgentDeployed": 96 subMessage = "agent not deployed" 97 case "CreatorMadeOwner": 98 subMessage = "creator not made owner" 99 case "InitialRolesPopulated": 100 subMessage = "initial roles not populated" 101 case "BackingNamespaceCreated": 102 subMessage = "backing namespace not created" 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 len(messages) > 0 { 121 messages = append([]string{fmt.Sprintf("Rancher %s resource %q (displayed as %s)", managementClusterResource, cluster.Name, cluster.Spec.DisplayName)}, messages...) 122 issueReporter.AddKnownIssueMessagesFiles(report.RancherIssues, clusterRoot, messages, []string{}) 123 } 124 125 return nil 126 }