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