package main import ( "fmt" "log" "os" "os/exec" "strings" "github.com/alecthomas/template" ) var HELM_BIN = "/bin/helm" var KUBECONFIG = "/root/.kube/kubeconfig" var CONFIG = "/root/.kube/config" type ( // Config maps the params we need to run Helm Config struct { APIServer string `json:"api_server"` Token string `json:"token"` HelmCommand []string `json:"helm_command"` SkipTLSVerify bool `json:"tls_skip_verify"` Namespace string `json:"namespace"` Release string `json:"release"` Chart string `json:"chart"` Values string `json:"values"` Debug bool `json:"debug"` DryRun bool `json:"dry_run"` Secrets []string `json:"secrets"` } // Plugin default Plugin struct { Config Config } ) func setHelmCommand(p *Plugin) { upgrade := make([]string, 2) upgrade[0] = "upgrade" upgrade[1] = "--install" if p.Config.Release != "" { upgrade = append(upgrade, p.Config.Release) } upgrade = append(upgrade, p.Config.Chart) if p.Config.Values != "" { upgrade = append(upgrade, "--set") upgrade = append(upgrade, p.Config.Values) } if p.Config.DryRun { upgrade = append(upgrade, "--dry-run") } if p.Config.Debug { upgrade = append(upgrade, "--debug") } p.Config.HelmCommand = upgrade } // Exec default method func (p *Plugin) Exec() error { if p.Config.APIServer == "" { return fmt.Errorf("Error: API Server is needed to deploy.") } if p.Config.Token == "" { return fmt.Errorf("Error: Token is needed to deploy.") } initialiseKubeconfig(&p.Config, KUBECONFIG, CONFIG) fmt.Println(p) init := make([]string, 1) init[0] = "init" err := runCommand(init) if err != nil { return fmt.Errorf("Error running helm comand: " + strings.Join(init[:], " ")) } setHelmCommand(p) if p.Config.Debug { log.Println("helm comand: " + strings.Join(p.Config.HelmCommand[:], " ")) } err = runCommand(p.Config.HelmCommand) if err != nil { return fmt.Errorf("Error running helm comand: " + strings.Join(p.Config.HelmCommand[:], " ")) } return nil } func initialiseKubeconfig(params *Config, source string, target string) error { t, _ := template.ParseFiles(source) f, err := os.Create(target) err = t.Execute(f, params) f.Close() return err } func runCommand(params []string) error { cmd := new(exec.Cmd) cmd = exec.Command(HELM_BIN, params...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() return err } func resolveSecrets(p *Plugin) { fmt.Printf("len: %d \n", len(p.Config.Secrets)) if len(p.Config.Secrets) > 0 { for _, secret := range p.Config.Secrets { fmt.Printf("secret: %s \n", secret) if strings.Contains(p.Config.Values, secret) { envval := os.Getenv(secret) fmt.Printf("secret: %s - %s \n", secret, envval) p.Config.Values = strings.Replace(p.Config.Values, secret, envval, -1) } } } fmt.Println(p) }