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 }