github.com/verrazzano/verrazzano@v1.7.1/tools/vz/pkg/internal/util/cluster/clusterapi/ocnecontrolplanes.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 clusterapi 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 ocneControlPlanesResource = "ocnecontrolplanes.controlplane.cluster.x-k8s.io" 17 18 // Minimal definition of controlplanes.controlplane.x-k8s.io object that only contains the fields that will be analyzed. 19 type ocneControlPlaneList struct { 20 metav1.TypeMeta `json:",inline"` 21 metav1.ListMeta `json:"metadata,omitempty"` 22 Items []ocneControlPlane `json:"items"` 23 } 24 type ocneControlPlane struct { 25 metav1.TypeMeta `json:",inline"` 26 metav1.ObjectMeta `json:"metadata,omitempty"` 27 Status capiStatus `json:"status,omitempty"` 28 } 29 30 // AnalyzeOCNEControlPlanes handles the checking of the status of cluster-api ocneControlPlane resources. 31 func AnalyzeOCNEControlPlanes(clusterRoot string, namespace string, issueReporter *report.IssueReporter) error { 32 resourceRoot := clusterRoot 33 if len(namespace) != 0 { 34 resourceRoot = filepath.Join(clusterRoot, namespace) 35 } 36 list := &ocneControlPlaneList{} 37 err := files.UnmarshallFileInClusterRoot(resourceRoot, "ocnecontrolplane.controlplane.cluster.x-k8s.io.json", list) 38 if err != nil { 39 return err 40 } 41 42 for _, ocneControlPlane := range list.Items { 43 analyzeOCNEControlPlane(clusterRoot, ocneControlPlane, issueReporter) 44 } 45 46 return nil 47 } 48 49 // analyzeOCNEControlPlane - analyze a single cluster API ocneControlPlane and report any issues 50 func analyzeOCNEControlPlane(clusterRoot string, ocneControlPlane ocneControlPlane, issueReporter *report.IssueReporter) { 51 52 var messages []string 53 var subMessage string 54 for _, condition := range ocneControlPlane.Status.Conditions { 55 if condition.Status != corev1.ConditionTrue { 56 switch condition.Type { 57 case "Available": 58 subMessage = "is not available" 59 case "CertificatesAvailable": 60 subMessage = "certificates are not available" 61 case "MachinesCreated": 62 subMessage = "machines are not created" 63 case "MachinesReady": 64 subMessage = "machines are not ready" 65 case "Resized": 66 subMessage = "is not resized" 67 case "ControlPlaneComponentsHealthy": 68 subMessage = "control plane is not healthy" 69 case "APIServerPodHealthy": 70 subMessage = "kube-apiserver pod is not healthy" 71 case "ControllerManagerPodHealthy": 72 subMessage = "kube-controller-manager pod is not healthy" 73 case "SchedulerPodHealthy": 74 subMessage = "kube-scheduler pod is not healthy" 75 case "EtcdMemberHealthy": 76 subMessage = "member's etcd is not healthy" 77 case "EtcdPodHealthy": 78 subMessage = "pod's etcd is not healthy" 79 case "EtcdClusterHealthy": 80 subMessage = "cluster's etcd is not healthy" 81 case "ModuleOperatorDeployed": 82 subMessage = "Module Operator is not deployed" 83 case "VerrazzanoPlatformOperatorDeployDeployed": 84 subMessage = "Verrazzano Platform Operator is not deployed" 85 case "MachinesSpecUpToDate": 86 subMessage = "machines are not up-to-date" 87 case "Ready": 88 subMessage = "is not ready" 89 default: 90 continue 91 } 92 // Add a message for the issue 93 var message string 94 if len(condition.Reason) == 0 { 95 message = fmt.Sprintf("\t%s", subMessage) 96 } else { 97 message = fmt.Sprintf("\t%s - reason is %s", subMessage, condition.Reason) 98 } 99 messages = append([]string{message}, messages...) 100 101 } 102 } 103 104 if len(messages) > 0 { 105 messages = append([]string{fmt.Sprintf("%q resource %q in namespace %q", ocneControlPlanesResource, ocneControlPlane.Name, ocneControlPlane.Namespace)}, messages...) 106 issueReporter.AddKnownIssueMessagesFiles(report.ClusterAPIClusterIssues, clusterRoot, messages, []string{}) 107 } 108 }