blob: 78828226e603213e116c28a39b76b62bf3ed7a0f [file] [log] [blame]
giolekvaa4a153b2020-05-12 11:49:53 +04001package appmanager
2
3import (
4 "errors"
5 "fmt"
6 "io/ioutil"
7 "os"
8 "os/exec"
9 "path"
10 "path/filepath"
11 "strings"
giolekvaebea5822020-05-12 20:52:19 +040012 "syscall"
giolekvaa4a153b2020-05-12 11:49:53 +040013
14 "github.com/golang/glog"
15 "gopkg.in/yaml.v2"
16)
17
18type Chart struct {
19 Name string `yaml:"name"`
20}
21
22type HelmChart struct {
23 Chart
24 chartDir string
25 Schema *Schema
26 Yamls []string
27}
28
29func HelmChartFromDir(chartDir string) (*HelmChart, error) {
30 var chart HelmChart
31 chart.chartDir = chartDir
32 c, err := ReadChart(path.Join(chartDir, "Chart.yaml"))
33 if err != nil {
34 return nil, err
35 }
36 chart.Chart = *c
37 schema, err := ReadSchema(path.Join(chartDir, "Schema.yaml"))
38 if err != nil && os.IsNotExist(err) {
39 return nil, err
40 }
41 chart.Schema = schema
42 return &chart, nil
43}
44
45func HelmChartFromTar(chartTar string) (*HelmChart, error) {
46 if !strings.HasSuffix(chartTar, ".tar.gz") {
47 return nil, errors.New("Expected .tar.gz file")
48 }
49 dir := filepath.Dir(chartTar)
50 archive := filepath.Base(chartTar)
giolekvaebea5822020-05-12 20:52:19 +040051 if err := syscall.Chdir(dir); err != nil {
giolekvaa4a153b2020-05-12 11:49:53 +040052 return nil, err
53 }
giolekvaebea5822020-05-12 20:52:19 +040054 cmd := exec.Command("tar", "-xvf", archive)
55 var stdout strings.Builder
56 var stderr strings.Builder
57 cmd.Stdout = &stdout
58 cmd.Stderr = &stderr
59 if err := cmd.Run(); err != nil {
60 glog.Info("-----")
61 return nil, errors.New(stderr.String())
62 }
63 glog.Info(stdout.String())
64 glog.Info(dir)
65 return HelmChartFromDir(dir)
giolekvaa4a153b2020-05-12 11:49:53 +040066}
67
68func (h *HelmChart) Install(
69 helmBin string,
70 values map[string]string) error {
71 namespace := fmt.Sprintf("app-%s", h.Chart.Name)
72 cmd := generateHelmInstallCmd(helmBin, h.chartDir, namespace, values)
73 glog.Info(cmd.String())
74 var stdout strings.Builder
75 var stderr strings.Builder
76 cmd.Stdout = &stdout
77 cmd.Stderr = &stderr
78 err := cmd.Run()
79 if err != nil {
80 return errors.New(stderr.String())
81 }
82 glog.Info(stdout.String())
83 return nil
84}
85
86func generateHelmInstallCmd(
87 helmBin string,
88 archive string,
89 namespace string,
90 values map[string]string) *exec.Cmd {
91 cmd := exec.Command(helmBin)
92 cmd.Args = append(cmd.Args, "install")
93 cmd.Args = append(cmd.Args, fmt.Sprintf("--namespace=%s", namespace))
94 cmd.Args = append(cmd.Args, "--generate-name")
95 cmd.Args = append(cmd.Args, fmt.Sprintf("%s", archive))
96 // TODO(giolekva): validate values
97 for key, value := range values {
98 cmd.Args = append(cmd.Args, fmt.Sprintf("--set=%s=%s", key, value))
99 }
100 return cmd
101}
102
103func ChartFromYaml(str string) (*Chart, error) {
104 var s Chart
105 err := yaml.Unmarshal([]byte(str), &s)
106 if err != nil {
107 return nil, err
108 }
109 return &s, nil
110}
111
112func ReadChart(chartFile string) (*Chart, error) {
113 f, err := os.Open(chartFile)
114 if err != nil {
115 return nil, err
116 }
117 defer f.Close()
118 b, err := ioutil.ReadAll(f)
119 if err != nil {
120 return nil, err
121 }
122 return ChartFromYaml(string(b))
123}