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  }