From 7f87745dc7804343d46c65d8f164f70f7a238166 Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Thu, 25 Feb 2016 13:13:09 -0700 Subject: [PATCH] feat(chart_upload): add chart_upload.go Also removed the now unused deploy subpackage and fixed the makefile accordingly. --- Makefile | 16 ++++--- cmd/helm/chart_upload.go | 99 ++++++++++++++++++++++++++++++++++++++++ deploy/deploy.go | 26 ----------- 3 files changed, 108 insertions(+), 33 deletions(-) create mode 100644 cmd/helm/chart_upload.go delete mode 100644 deploy/deploy.go diff --git a/Makefile b/Makefile index da844291f..d1529767b 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,9 @@ endif BIN_DIR := bin DIST_DIR := _dist -GO_PACKAGES := cmd/helm dm deploy format kubectl +#GO_PACKAGES := cmd/helm dm format kubectl +GO_DIRS ?= $(shell glide nv -x ) +GO_PKGS ?= $(shell glide nv) MAIN_GO := github.com/deis/helm-dm/cmd/helm HELM_BIN := helm-dm PATH_WITH_HELM = PATH="$(shell pwd)/$(BIN_DIR)/helm:$(PATH)" @@ -44,19 +46,19 @@ install: build install -m 755 bin/${HELM_BIN} ${DESTDIR}/usr/local/bin/${HELM_BIN} quicktest: - $(PATH_WITH_HELM) go test -short $(addprefix ./,$(GO_PACKAGES)) + $(PATH_WITH_HELM) go test -short ${GO_PKGS} test: test-style - $(PATH_WITH_HELM) go test -v -cover $(addprefix ./,$(GO_PACKAGES)) + $(PATH_WITH_HELM) go test -v -cover ${GO_PKGS} test-style: - @if [ $(shell gofmt -e -l -s $(GO_PACKAGES)) ]; then \ - echo "gofmt check failed:"; gofmt -e -d -s $(GO_PACKAGES); exit 1; \ + @if [ $(shell gofmt -e -l -s $(GO_DIRS)) ]; then \ + echo "gofmt check failed:"; gofmt -e -d -s $(GO_DIRS); exit 1; \ fi - @for i in . $(GO_PACKAGES); do \ + @for i in . $(GO_DIRS); do \ golint $$i; \ done - @for i in . $(GO_PACKAGES); do \ + @for i in . $(GO_DIRS); do \ go vet github.com/deis/helm-dm/$$i; \ done diff --git a/cmd/helm/chart_upload.go b/cmd/helm/chart_upload.go new file mode 100644 index 000000000..5e5933af4 --- /dev/null +++ b/cmd/helm/chart_upload.go @@ -0,0 +1,99 @@ +package main + +import ( + "errors" + "fmt" + "os" + "regexp" + "strings" + + "github.com/aokoli/goutils" + "github.com/codegangsta/cli" + "github.com/deis/helm-dm/format" + "github.com/kubernetes/deployment-manager/chart" +) + +func uploadChart(c *cli.Context) error { + args := c.Args() + if len(args) < 1 { + format.Err("First argument, filename, is required. Try 'helm deploy --help'") + os.Exit(1) + } + + cname := c.String("name") + fname := args[0] + + if fname == "" { + return errors.New("A filename must be specified. For a tar archive, this is the name of the root template in the archive.") + } + + _, err := doUpload(fname, cname, c) + return err +} +func doUpload(filename, cname string, cxt *cli.Context) (string, error) { + + fi, err := os.Stat(filename) + if err != nil { + return "", err + } + + if fi.IsDir() { + format.Info("Chart is directory") + c, err := chart.LoadDir(filename) + if err != nil { + return "", err + } + if cname == "" { + cname = genName(c.Chartfile().Name) + } + + // TODO: Is it better to generate the file in temp dir like this, or + // just put it in the CWD? + //tdir, err := ioutil.TempDir("", "helm-") + //if err != nil { + //format.Warn("Could not create temporary directory. Using .") + //tdir = "." + //} else { + //defer os.RemoveAll(tdir) + //} + tdir := "." + tfile, err := chart.Save(c, tdir) + if err != nil { + return "", err + } + filename = tfile + } else if cname == "" { + n, _, e := parseTarName(filename) + if e != nil { + return "", e + } + cname = n + } + + // TODO: Add a version build metadata on the chart. + + if cxt.Bool("dry-run") { + format.Info("Prepared deploy %q using file %q", cname, filename) + return "", nil + } + + c := client(cxt) + return c.PostChart(filename, cname) +} + +func genName(pname string) string { + s, _ := goutils.RandomAlphaNumeric(8) + return fmt.Sprintf("%s-%s", pname, s) +} + +func parseTarName(name string) (string, string, error) { + tnregexp := regexp.MustCompile(chart.TarNameRegex) + if strings.HasSuffix(name, ".tgz") { + name = strings.TrimSuffix(name, ".tgz") + } + v := tnregexp.FindStringSubmatch(name) + if v == nil { + return name, "", fmt.Errorf("invalid name %s", name) + } + return v[1], v[2], nil +} diff --git a/deploy/deploy.go b/deploy/deploy.go deleted file mode 100644 index a29b2b275..000000000 --- a/deploy/deploy.go +++ /dev/null @@ -1,26 +0,0 @@ -package deploy - -import ( - "os" - - "github.com/kubernetes/deployment-manager/common" -) - -// Deployment describes a deployment of a package. -type Deployment struct { - // Name is the Deployment name. Autogenerated if empty. - Name string - // Filename is the filename for the base deployment. - Filename string - // Imports is a list of imported files. - Imports []string - // Properties to pass into the template. - Properties map[string]interface{} - // Input is a file containing templates. It may be os.Stdin. - Input *os.File - // Repository is the location of the templates. - Repository string - - // The template, typically generated by the Deployment. - Template *common.Template -}