LoadFiles loads from in-memory files.
(files []*archive.BufferedFile)
| 70 | |
| 71 | // LoadFiles loads from in-memory files. |
| 72 | func LoadFiles(files []*archive.BufferedFile) (*chart.Chart, error) { |
| 73 | c := new(chart.Chart) |
| 74 | subcharts := make(map[string][]*archive.BufferedFile) |
| 75 | |
| 76 | // do not rely on assumed ordering of files in the chart and crash |
| 77 | // if Chart.yaml was not coming early enough to initialize metadata |
| 78 | for _, f := range files { |
| 79 | c.Raw = append(c.Raw, &common.File{Name: f.Name, ModTime: f.ModTime, Data: f.Data}) |
| 80 | if f.Name == "Chart.yaml" { |
| 81 | if c.Metadata == nil { |
| 82 | c.Metadata = new(chart.Metadata) |
| 83 | } |
| 84 | if err := yaml.Unmarshal(f.Data, c.Metadata); err != nil { |
| 85 | return c, fmt.Errorf("cannot load Chart.yaml: %w", err) |
| 86 | } |
| 87 | // NOTE(bacongobbler): while the chart specification says that APIVersion must be set, |
| 88 | // Helm 2 accepted charts that did not provide an APIVersion in their chart metadata. |
| 89 | // Because of that, if APIVersion is unset, we should assume we're loading a v1 chart. |
| 90 | if c.Metadata.APIVersion == "" { |
| 91 | c.Metadata.APIVersion = chart.APIVersionV1 |
| 92 | } |
| 93 | c.ModTime = f.ModTime |
| 94 | } |
| 95 | } |
| 96 | for _, f := range files { |
| 97 | switch { |
| 98 | case f.Name == "Chart.yaml": |
| 99 | // already processed |
| 100 | continue |
| 101 | case f.Name == "Chart.lock": |
| 102 | c.Lock = new(chart.Lock) |
| 103 | if err := yaml.Unmarshal(f.Data, &c.Lock); err != nil { |
| 104 | return c, fmt.Errorf("cannot load Chart.lock: %w", err) |
| 105 | } |
| 106 | case f.Name == "values.yaml": |
| 107 | values, err := LoadValues(bytes.NewReader(f.Data)) |
| 108 | if err != nil { |
| 109 | return c, fmt.Errorf("cannot load values.yaml: %w", err) |
| 110 | } |
| 111 | c.Values = values |
| 112 | case f.Name == "values.schema.json": |
| 113 | c.Schema = f.Data |
| 114 | c.SchemaModTime = f.ModTime |
| 115 | |
| 116 | // Deprecated: requirements.yaml is deprecated use Chart.yaml. |
| 117 | // We will handle it for you because we are nice people |
| 118 | case f.Name == "requirements.yaml": |
| 119 | if c.Metadata == nil { |
| 120 | c.Metadata = new(chart.Metadata) |
| 121 | } |
| 122 | if c.Metadata.APIVersion != chart.APIVersionV1 { |
| 123 | log.Print("Warning: Dependencies are handled in Chart.yaml since apiVersion \"v2\". We recommend migrating dependencies to Chart.yaml.") |
| 124 | } |
| 125 | if err := yaml.Unmarshal(f.Data, c.Metadata); err != nil { |
| 126 | return c, fmt.Errorf("cannot load requirements.yaml: %w", err) |
| 127 | } |
| 128 | if c.Metadata.APIVersion == chart.APIVersionV1 { |
| 129 | c.Files = append(c.Files, &common.File{Name: f.Name, ModTime: f.ModTime, Data: f.Data}) |
searching dependent graphs…