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  }