From 17ccdaca1b06e2e77b25dec0757129ec096fad2a Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Tue, 4 Oct 2016 12:13:01 -0600 Subject: [PATCH] fix(chart): Chart.yaml now has an apiVersion field. This is to future-proof charts, and also be consistent with repo and index YAML files. Closes #1264 --- _proto/hapi/chart/metadata.proto | 3 + cmd/helm/create.go | 1 + cmd/helm/create_test.go | 71 ++++++++++++++++++ pkg/chartutil/chartfile.go | 3 + pkg/chartutil/chartfile_test.go | 5 ++ pkg/chartutil/testdata/chartfiletest.yaml | 1 + pkg/chartutil/testdata/frobnitz-1.2.3.tgz | Bin 4017 -> 4025 bytes pkg/chartutil/testdata/frobnitz/Chart.yaml | 1 + .../frobnitz/charts/mariner-4.3.2.tgz | Bin 1025 -> 1031 bytes .../mariner/charts/albatross-0.1.0.tgz | Bin 347 -> 347 bytes pkg/proto/hapi/chart/metadata.pb.go | 40 +++++----- 11 files changed, 106 insertions(+), 19 deletions(-) create mode 100644 cmd/helm/create_test.go diff --git a/_proto/hapi/chart/metadata.proto b/_proto/hapi/chart/metadata.proto index 40c8b40dc..da194e9d3 100644 --- a/_proto/hapi/chart/metadata.proto +++ b/_proto/hapi/chart/metadata.proto @@ -61,4 +61,7 @@ message Metadata { // The URL to an icon file. string icon = 9; + + // The API Version of this chart. + string apiVersion = 10; } diff --git a/cmd/helm/create.go b/cmd/helm/create.go index 9f50be5f7..317e8fd6b 100644 --- a/cmd/helm/create.go +++ b/cmd/helm/create.go @@ -85,6 +85,7 @@ func (c *createCmd) run() error { Name: chartname, Description: "A Helm chart for Kubernetes", Version: "0.1.0", + ApiVersion: chartutil.ApiVersionV1, } _, err := chartutil.Create(cfile, filepath.Dir(c.name)) diff --git a/cmd/helm/create_test.go b/cmd/helm/create_test.go new file mode 100644 index 000000000..5fb2c82a6 --- /dev/null +++ b/cmd/helm/create_test.go @@ -0,0 +1,71 @@ +/* +Copyright 2016 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "io/ioutil" + "os" + "testing" + + "k8s.io/helm/pkg/chartutil" +) + +func TestCreateCmd(t *testing.T) { + cname := "testchart" + // Make a temp dir + tdir, err := ioutil.TempDir("", "helm-create-") + if err != nil { + t.Fatal(err) + } + defer os.Remove(tdir) + + // CD into it + pwd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + if err := os.Chdir(tdir); err != nil { + t.Fatal(err) + } + defer os.Chdir(pwd) + + // Run a create + cmd := newCreateCmd(os.Stdout) + if err := cmd.RunE(cmd, []string{cname}); err != nil { + t.Errorf("Failed to run create: %s", err) + return + } + + // Test that the chart is there + if fi, err := os.Stat(cname); err != nil { + t.Fatalf("no chart directory: %s", err) + } else if !fi.IsDir() { + t.Fatalf("chart is not directory") + } + + c, err := chartutil.LoadDir(cname) + if err != nil { + t.Fatal(err) + } + + if c.Metadata.Name != cname { + t.Errorf("Expected %q name, got %q", cname, c.Metadata.Name) + } + if c.Metadata.ApiVersion != chartutil.ApiVersionV1 { + t.Errorf("Wrong API version: %q", c.Metadata.ApiVersion) + } +} diff --git a/pkg/chartutil/chartfile.go b/pkg/chartutil/chartfile.go index 588670541..3087d81d4 100644 --- a/pkg/chartutil/chartfile.go +++ b/pkg/chartutil/chartfile.go @@ -24,6 +24,9 @@ import ( "k8s.io/helm/pkg/proto/hapi/chart" ) +// APIVersionV1 is the API version number for version 1. +const ApiVersionV1 = "v1" + // UnmarshalChartfile takes raw Chart.yaml data and unmarshals it. func UnmarshalChartfile(data []byte) (*chart.Metadata, error) { y := &chart.Metadata{} diff --git a/pkg/chartutil/chartfile_test.go b/pkg/chartutil/chartfile_test.go index 1b8e800f0..4ccddd3d7 100644 --- a/pkg/chartutil/chartfile_test.go +++ b/pkg/chartutil/chartfile_test.go @@ -39,6 +39,11 @@ func verifyChartfile(t *testing.T, f *chart.Metadata) { t.Fatal("Failed verifyChartfile because f is nil") } + // Api instead of API because it was generated via protobuf. + if f.ApiVersion != ApiVersionV1 { + t.Errorf("Expected API Version %q, got %q", ApiVersionV1, f.ApiVersion) + } + if f.Name != "frobnitz" { t.Errorf("Expected frobnitz, got %s", f.Name) } diff --git a/pkg/chartutil/testdata/chartfiletest.yaml b/pkg/chartutil/testdata/chartfiletest.yaml index b665c61be..7c071c27b 100644 --- a/pkg/chartutil/testdata/chartfiletest.yaml +++ b/pkg/chartutil/testdata/chartfiletest.yaml @@ -1,3 +1,4 @@ +apiVersion: v1 name: frobnitz description: This is a frobnitz. version: "1.2.3" diff --git a/pkg/chartutil/testdata/frobnitz-1.2.3.tgz b/pkg/chartutil/testdata/frobnitz-1.2.3.tgz index 49ec9ca8789a18c5aa67ef1a0bcc34a924f9f134..07b1113649c3fad6538ec8f284eacfd3f49524c5 100644 GIT binary patch literal 4025 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 diff --git a/pkg/chartutil/testdata/frobnitz/Chart.yaml b/pkg/chartutil/testdata/frobnitz/Chart.yaml index b665c61be..7c071c27b 100644 --- a/pkg/chartutil/testdata/frobnitz/Chart.yaml +++ b/pkg/chartutil/testdata/frobnitz/Chart.yaml @@ -1,3 +1,4 @@ +apiVersion: v1 name: frobnitz description: This is a frobnitz. version: "1.2.3" diff --git a/pkg/chartutil/testdata/frobnitz/charts/mariner-4.3.2.tgz b/pkg/chartutil/testdata/frobnitz/charts/mariner-4.3.2.tgz index 4928e7e7af41bd33be43a458f4c9c3a7221fc595..88f255c238b9b53ea02fc4cc1266f94165c8bd41 100644 GIT binary patch literal 1031 zcmV+i1o-6ZtiaDKCZKKh4a;zSOPYc*x1AbX#W7gM<5lo7!M*ugHj(Th!GH9F*ZdSqYaI* zcy)H~k@C=DygM|^=PsGO+u5Dn{m$?EowXn~Y=nb>G9n0quByOqwOlJmO0LZVL`m00 zSym)n0)nVWq7VRTIWMX}$|VrfOR*p!;S`A^5I$!=+AS9QoAc!FquBmWu=4shB_Jkz z8d_%Q$Dq$cQnRk|yFKjukxJMf^jG2~i{P zA}_FL_-|5Bjvy)~q|si62slswpSu2&y!vPUUw#Vuw?i|9O78qQrt^PE)qMR`MOJ0S z%YRJ~BU=Fw&#bC-LAU6a2g?@fg@Z21*G-0@aej!-4;QssS>0a+ap(uzM)ccEJ z5I0C7751}$IF?y&LObqnaozwC6Jq2COKzTlBs8!Khy%jjw(HXK88-cyc2XD=t;icc zmqs=IVJt&R&)NP@n+QrcW|U3+Q)y|XnqyK)4>FQsV<=p$fu4yve79>H_L{|Tmpt|d_z|j+94+bt7{o+{byI@w; zx3h=qHeL7W6SdhpKe=a7RfaowWOGZaxOpJcZ#2)?IPv0$Hh#w~eXBp)d3;M-@0vY3 zM*lb#UA?e*-?LjoZ$96(&}ep2PPNawR1z`{&ar_&u#6zW^TvLWT=1J z{O6jp>1@NnFMF=afaQnVuOFOv>tv>9{=mII-7t7!Mb+|&-F@+8}C1$ z47)?E->j9_p~hX{x1L{4RWIq=bmil}X7}GdeACR6!;QUxuO@d0KUQ0>uc)0p`l|Dk z^Fz?>JmtWTCR-kgADw$+p!!fp&+msO7LBZ5Jn6s>8fX4IE7b7e_U^IXHnjJJk??5K zzH7feJn*nJ@0EtBk8`&(J|lSPvbw;n7fMhDgTY`h7z_r3!C)}X!JozzB5VLC004S+ B3t0dF literal 1025 zcmV+c1pfOUiwFQ!I_y^f1MQc4Y!pQt$1j*vT_1mmq6v0Vv`Rzw_Iaz@V8t3GsR{`g zLeQjhcXM}J_i>$>E1a*!#1gQn#KtBjK>G&>J_4zr#dr`Q8kG7#L5!gIim@ru7$r2u z;?>=~N6JGh@$S$tpSxuCZf9p^_xt;Of3p_EhK+DAP(}nn&{P%pZ7A0Yl9Frl08!F3 zQI-`+lYk&9k|+d#TFylkND&ILyA%sj8cxwj0^xJ^bGyZ2e=|=0K8o%C1S_w9Qvzbj zr=ew*eh&9}gcRkk^%q6W(_d0#O;c3G)juREasUXWU&`5B%r<%A`DH z;QakxRWyb9e@8^l^}|e$c`dAVj!Y(0MvtA zMSx})QtS}o{s#a?NrxEJ!D$^NC`}SQ7(^?el{66_ajf9!F5+KOtPnK_6e_v%=a|a>B{k&huPU-CE1IXjB1p{t zE5R&qH;TcONkJ|G{EdD-D0prbSe!5jaK8{Nop=9z_3l~kL7^y!8Lsyii$UC=iB#CH z1=O+3dK21l|A_M@h?o!~zp&)u3?!j}37`%Ld&h*h;~BR5Gwq}>C|Z#>f36zU_?NL7 zQhLtzf47OCgkwhC0HDcIxWQEUFUaEQ{x6B{hvk1In4IC0m1n7Tad5`_e{tJi@9)}q z8h`ZP&oNd0tFr9B|H*=^ijwN)zt^ATe4gj)cbUxTSB^r#p{rZtGpWXUFItN29Ce zH}89Pi~h#*U5g&uyJG7Vb&L1B-12VcoM#$pH?KYL(jyx#H|n}qzjo~VZG+#1-~P!*WIzrut)Z3cy9YnII`sN`4=BTAsP&sQ z@>%#*N vTXSA%nEW_*J7d#=moBXf+