forked from rancher/rancher
-
Notifications
You must be signed in to change notification settings - Fork 0
/
traverse.go
133 lines (125 loc) · 4.07 KB
/
traverse.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package manager
import (
"encoding/base64"
"fmt"
"strconv"
"strings"
"github.com/rancher/rancher/pkg/catalog/helm"
"github.com/rancher/types/apis/management.cattle.io/v3"
"github.com/sirupsen/logrus"
"gopkg.in/yaml.v2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func traverseFiles(repoPath string, catalog *v3.Catalog) ([]v3.Template, []error, error) {
index, err := helm.LoadIndex(repoPath)
if err != nil {
return nil, nil, err
}
newHelmVersionCommits := map[string]v3.VersionCommits{}
var templates []v3.Template
var errors []error
for chart, metadata := range index.IndexFile.Entries {
newHelmVersionCommits[chart] = v3.VersionCommits{
Value: map[string]string{},
}
existingHelmVersionCommits := map[string]string{}
if catalog.Status.HelmVersionCommits[chart].Value != nil {
existingHelmVersionCommits = catalog.Status.HelmVersionCommits[chart].Value
}
keywords := map[string]struct{}{}
// comparing version commit with the previous commit to detect if a template has been changed.
hasChanged := false
for _, version := range metadata {
newHelmVersionCommits[chart].Value[version.Version] = version.Digest
if digest, ok := existingHelmVersionCommits[version.Version]; !ok || digest != version.Digest {
hasChanged = true
}
}
if !hasChanged {
logrus.Debugf("chart %s has not been changed. Skipping generating templates for it", chart)
continue
}
template := v3.Template{
ObjectMeta: metav1.ObjectMeta{
Name: chart,
},
}
template.Spec.Description = metadata[0].Description
template.Spec.DefaultVersion = metadata[0].Version
if len(metadata[0].Sources) > 0 {
template.Spec.ProjectURL = metadata[0].Sources[0]
}
iconData, iconFilename, err := helm.Icon(metadata)
if err != nil {
errors = append(errors, err)
}
template.Spec.Icon = iconData
template.Spec.IconFilename = iconFilename
template.Spec.Base = HelmTemplateBaseType
template.Spec.FolderName = chart
template.Spec.DisplayName = chart
var versions []v3.TemplateVersionSpec
for _, version := range metadata {
v := v3.TemplateVersionSpec{
Version: version.Version,
}
for _, k := range version.Keywords {
keywords[k] = struct{}{}
}
files, err := helm.FetchFiles(version, version.URLs)
if err != nil {
errors = append(errors, err)
continue
}
var filesToAdd []v3.File
for _, file := range files {
if strings.EqualFold(fmt.Sprintf("%s/%s", chart, "readme.md"), file.Name) {
contents, err := base64.StdEncoding.DecodeString(file.Contents)
if err != nil {
return nil, nil, err
}
v.Readme = string(contents)
continue
}
if strings.EqualFold(fmt.Sprintf("%s/%s", chart, "questions.yml"), file.Name) {
var value questionYml
contents, err := base64.StdEncoding.DecodeString(file.Contents)
if err != nil {
return nil, nil, err
}
if err := yaml.Unmarshal([]byte(contents), &value); err != nil {
return nil, nil, err
}
v.Questions = value.Questions
}
filesToAdd = append(filesToAdd, file)
}
v.Files = filesToAdd
v.UpgradeVersionLinks = map[string]string{}
for _, versionSpec := range template.Spec.Versions {
if showUpgradeLinks(v.Version, versionSpec.Version, versionSpec.UpgradeFrom) {
revision := versionSpec.Version
if v.Revision != nil {
revision = strconv.Itoa(*versionSpec.Revision)
}
v.UpgradeVersionLinks[versionSpec.Version] = fmt.Sprintf("%s-%s", template.Name, revision)
}
}
v.ExternalID = fmt.Sprintf("catalog://?catalog=%s&base=%s&template=%s&version=%s", catalog.Name, template.Spec.Base, template.Spec.FolderName, v.Version)
versions = append(versions, v)
}
var categories []string
for k := range keywords {
categories = append(categories, k)
}
template.Spec.Categories = categories
template.Spec.Versions = versions
template.Spec.CatalogID = catalog.Name
templates = append(templates, template)
}
catalog.Status.HelmVersionCommits = newHelmVersionCommits
return templates, nil, nil
}
type questionYml struct {
Questions []v3.Question `yaml:"questions,omitempty"`
}