blob: ede5fafa5dd09a1a20abd9aa4135d31caa6213fe [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"`
giolekva30036e72020-05-13 22:00:40 +040020 Type string `yaml:"type"`
giolekvaa4a153b2020-05-12 11:49:53 +040021}
22
23type HelmChart struct {
24 Chart
25 chartDir string
giolekvab1f19ee2020-05-16 11:31:20 +040026 Schema Schema
27 Triggers Triggers
28 Actions Actions
giolekvaa4a153b2020-05-12 11:49:53 +040029 Yamls []string
30}
31
32func HelmChartFromDir(chartDir string) (*HelmChart, error) {
33 var chart HelmChart
34 chart.chartDir = chartDir
giolekvab1f19ee2020-05-16 11:31:20 +040035 err := FromYamlFile(path.Join(chartDir, "Chart.yaml"), &chart.Chart)
giolekvaa4a153b2020-05-12 11:49:53 +040036 if err != nil {
37 return nil, err
38 }
giolekvab1f19ee2020-05-16 11:31:20 +040039 err = FromYamlFile(path.Join(chartDir, "Schema.yaml"), &chart.Schema)
giolekva06eb1642020-05-13 15:32:59 +040040 if err != nil && !os.IsNotExist(err) {
giolekvaa4a153b2020-05-12 11:49:53 +040041 return nil, err
42 }
giolekvab1f19ee2020-05-16 11:31:20 +040043 err = FromYamlFile(path.Join(chartDir, "Triggers.yaml"), &chart.Triggers)
giolekva6d464592020-05-13 20:12:18 +040044 if err != nil && !os.IsNotExist(err) {
45 return nil, err
46 }
giolekvab1f19ee2020-05-16 11:31:20 +040047 err = FromYamlFile(path.Join(chartDir, "Actions.yaml"), &chart.Actions)
48 if err != nil && !os.IsNotExist(err) {
49 return nil, err
50 }
giolekvaa4a153b2020-05-12 11:49:53 +040051 return &chart, nil
52}
53
54func HelmChartFromTar(chartTar string) (*HelmChart, error) {
55 if !strings.HasSuffix(chartTar, ".tar.gz") {
56 return nil, errors.New("Expected .tar.gz file")
57 }
58 dir := filepath.Dir(chartTar)
59 archive := filepath.Base(chartTar)
giolekvaebea5822020-05-12 20:52:19 +040060 if err := syscall.Chdir(dir); err != nil {
giolekvaa4a153b2020-05-12 11:49:53 +040061 return nil, err
62 }
giolekvaebea5822020-05-12 20:52:19 +040063 cmd := exec.Command("tar", "-xvf", archive)
64 var stdout strings.Builder
65 var stderr strings.Builder
66 cmd.Stdout = &stdout
67 cmd.Stderr = &stderr
68 if err := cmd.Run(); err != nil {
giolekvaebea5822020-05-12 20:52:19 +040069 return nil, errors.New(stderr.String())
70 }
71 glog.Info(stdout.String())
72 glog.Info(dir)
73 return HelmChartFromDir(dir)
giolekvaa4a153b2020-05-12 11:49:53 +040074}
75
76func (h *HelmChart) Install(
77 helmBin string,
78 values map[string]string) error {
79 namespace := fmt.Sprintf("app-%s", h.Chart.Name)
80 cmd := generateHelmInstallCmd(helmBin, h.chartDir, namespace, values)
81 glog.Info(cmd.String())
82 var stdout strings.Builder
83 var stderr strings.Builder
84 cmd.Stdout = &stdout
85 cmd.Stderr = &stderr
86 err := cmd.Run()
87 if err != nil {
88 return errors.New(stderr.String())
89 }
90 glog.Info(stdout.String())
91 return nil
92}
93
94func generateHelmInstallCmd(
95 helmBin string,
96 archive string,
97 namespace string,
98 values map[string]string) *exec.Cmd {
99 cmd := exec.Command(helmBin)
100 cmd.Args = append(cmd.Args, "install")
101 cmd.Args = append(cmd.Args, fmt.Sprintf("--namespace=%s", namespace))
102 cmd.Args = append(cmd.Args, "--generate-name")
103 cmd.Args = append(cmd.Args, fmt.Sprintf("%s", archive))
104 // TODO(giolekva): validate values
105 for key, value := range values {
106 cmd.Args = append(cmd.Args, fmt.Sprintf("--set=%s=%s", key, value))
107 }
108 return cmd
109}
110
111func ChartFromYaml(str string) (*Chart, error) {
112 var s Chart
113 err := yaml.Unmarshal([]byte(str), &s)
114 if err != nil {
115 return nil, err
116 }
117 return &s, nil
118}
119
120func ReadChart(chartFile string) (*Chart, error) {
121 f, err := os.Open(chartFile)
122 if err != nil {
123 return nil, err
124 }
125 defer f.Close()
126 b, err := ioutil.ReadAll(f)
127 if err != nil {
128 return nil, err
129 }
130 return ChartFromYaml(string(b))
131}