blob: e56d5f2bb5926e31c7b4984ee8a8ab1bfbaf93b3 [file] [log] [blame]
package appmanager
import (
"errors"
"fmt"
"os/exec"
"strings"
"github.com/golang/glog"
)
type Unpacker interface {
Unpack(archive string,
namespace string,
releaseRame string,
values map[string]string) (map[string][]string, error)
}
type helmUnpacker struct {
helmBin string
}
func NewHelmUnpacker(helmBin string) Unpacker {
return &helmUnpacker{helmBin}
}
func (h *helmUnpacker) Unpack(
archive string,
namespace string,
releaseName string,
values map[string]string) (map[string][]string, error) {
cmd := h.generateHelmInstallCmd(archive, namespace, releaseName, values)
glog.Info(cmd.String())
var stdout strings.Builder
var stderr strings.Builder
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
return nil, errors.New(stderr.String())
}
return extractTemplates(stdout.String())
}
func (h *helmUnpacker) generateHelmInstallCmd(
archive string,
namespace string,
releaseName string,
values map[string]string) *exec.Cmd {
cmd := exec.Command(h.helmBin)
cmd.Args = append(cmd.Args, "template")
cmd.Args = append(cmd.Args, fmt.Sprintf("--namespace=%s", namespace))
cmd.Args = append(cmd.Args, fmt.Sprintf("%s", releaseName))
cmd.Args = append(cmd.Args, fmt.Sprintf("%s", archive))
// TODO(giolekva): validate values
for key, value := range values {
cmd.Args = append(cmd.Args, fmt.Sprintf("--set=%s=%s", key, value))
}
return cmd
}
func extractTemplates(bundle string) (map[string][]string, error) {
items := strings.Split(bundle, "---")
temps := make(map[string][]string)
for _, item := range items {
if len(item) == 0 {
continue
}
tmp := strings.SplitN(item, "\n", 3)
if len(tmp) != 3 {
return nil, fmt.Errorf("Got invalid template: %s", item)
}
source := tmp[1]
glog.Info(source)
// if !strings.HasPrefix(source, "\n# Source: ") {
// return nil, fmt.Errorf("Got invalid source: %s", item)
// }
sourceItems := strings.Split(source, "/")
glog.Info(sourceItems)
if len(sourceItems) != 3 {
return nil, fmt.Errorf("Got invalid source: %s", item)
}
path := sourceItems[1] + "/" + sourceItems[2]
if _, ok := temps[path]; !ok {
temps[path] = make([]string, 1)
}
temps[path] = append(temps[path], tmp[2])
}
return temps, nil
}