github.com/verrazzano/verrazzano@v1.7.1/tools/vz/pkg/internal/util/cluster/rancher/fleetclusters.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 fleetClusterResource = "cluster.fleet.cattle.io" 17 18 // Minimal definition that only contains the fields that will be analyzed 19 type fleetClusterList struct { 20 metav1.TypeMeta `json:",inline"` 21 metav1.ListMeta `json:"metadata,omitempty"` 22 Items []fleetCluster `json:"items"` 23 } 24 type fleetCluster struct { 25 metav1.TypeMeta `json:",inline"` 26 metav1.ObjectMeta `json:"metadata,omitempty"` 27 Status fleetClusterStatus `json:"status,omitempty"` 28 } 29 type fleetClusterStatus struct { 30 AgentMigrated bool `json:"agentMigrated,omitempty"` 31 AgentNamespaceMigrated bool `json:"agentNamespaceMigrated,omitempty"` 32 CattleNamespaceMigrated bool `json:"cattleNamespaceMigrated,omitempty"` 33 Conditions []cattleCondition `json:"conditions,omitempty"` 34 } 35 36 // AnalyzeFleetClusters - analyze the status of Rancher fleet clusters resources 37 func AnalyzeFleetClusters(clusterRoot string, namespace string, issueReporter *report.IssueReporter) error { 38 resourceRoot := clusterRoot 39 if len(namespace) != 0 { 40 resourceRoot = filepath.Join(clusterRoot, namespace) 41 } 42 43 list := &fleetClusterList{} 44 err := files.UnmarshallFileInClusterRoot(resourceRoot, fmt.Sprintf("%s.json", fleetClusterResource), list) 45 if err != nil { 46 return err 47 } 48 49 for _, cluster := range list.Items { 50 err = analyzeFleetCluster(clusterRoot, cluster, issueReporter) 51 if err != nil { 52 return err 53 } 54 } 55 56 return nil 57 } 58 59 // analyzeFleetCluster - analyze a single Rancher fleet cluster and report any issues 60 func analyzeFleetCluster(clusterRoot string, cluster fleetCluster, issueReporter *report.IssueReporter) error { 61 62 var messages []string 63 var subMessage string 64 for _, condition := range cluster.Status.Conditions { 65 if condition.Status != corev1.ConditionTrue { 66 switch condition.Type { 67 case "Ready": 68 subMessage = "is not ready" 69 case "Processed": 70 subMessage = "is not processed" 71 case "Imported": 72 subMessage = "is not imported" 73 default: 74 continue 75 } 76 // Add a message for the issue 77 reason := "" 78 msg := "" 79 if len(condition.Reason) > 0 { 80 reason = fmt.Sprintf(", reason is %q", condition.Reason) 81 } 82 if len(condition.Message) > 0 { 83 msg = fmt.Sprintf(", message is %q", condition.Message) 84 } 85 message := fmt.Sprintf("\t%s%s%s", subMessage, reason, msg) 86 messages = append([]string{message}, messages...) 87 } 88 } 89 90 if !cluster.Status.AgentMigrated { 91 messages = append([]string{"\tagent not migrated"}, messages...) 92 } 93 if !cluster.Status.AgentNamespaceMigrated { 94 messages = append([]string{"\tagent namespace not migrated"}, messages...) 95 } 96 if !cluster.Status.CattleNamespaceMigrated { 97 messages = append([]string{"\tcattle namespace not migrated"}, messages...) 98 } 99 100 if len(messages) > 0 { 101 messages = append([]string{fmt.Sprintf("Rancher %s resource %q in namespace %s", fleetClusterResource, cluster.Name, cluster.Namespace)}, messages...) 102 issueReporter.AddKnownIssueMessagesFiles(report.RancherIssues, clusterRoot, messages, []string{}) 103 } 104 105 return nil 106 }