blob: e1cec0b40ca65cc94bc1945a05e6c39553c58296 [file] [log] [blame]
giolekvab1f19ee2020-05-16 11:31:20 +04001package appmanager
2
3import (
4 "bytes"
5 "context"
6 "text/template"
7
8 apiv1 "k8s.io/api/core/v1"
9 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10 "k8s.io/apimachinery/pkg/util/yaml"
11 "k8s.io/client-go/kubernetes"
12
13 "github.com/golang/glog"
14)
15
giolekvadaa85592020-05-16 23:32:02 +040016var leftDelim = "{-{"
17var rightDelim = "}-}"
18
giolekvab1f19ee2020-05-16 11:31:20 +040019type Launcher interface {
20 Launch(ns, tmpl string, args map[string]interface{}) error
21}
22
23type k8sLauncher struct {
24 client *kubernetes.Clientset
25}
26
27func NewK8sLauncher(client *kubernetes.Clientset) Launcher {
28 return &k8sLauncher{client}
29}
30
31func (k *k8sLauncher) Launch(ns, tmpl string, args map[string]interface{}) error {
32 pod, err := renderTemplate(tmpl, args)
33 if err != nil {
34 return err
35 }
36 pods := k.client.CoreV1().Pods(ns)
37 resp, err := pods.Create(context.TODO(), pod, metav1.CreateOptions{})
38 if err != nil {
39 return err
40 }
41 glog.Infof("Pod created: %s", resp)
42 return nil
43}
44
45func renderTemplate(tmpl string, args map[string]interface{}) (*apiv1.Pod, error) {
giolekvadaa85592020-05-16 23:32:02 +040046 t, err := template.New("action").Delims(leftDelim, rightDelim).Parse(tmpl)
giolekvab1f19ee2020-05-16 11:31:20 +040047 if err != nil {
48 return nil, err
49 }
50 var b bytes.Buffer
51 if err := t.Execute(&b, args); err != nil {
52 return nil, err
53 }
54 var pod apiv1.Pod
55 dec := yaml.NewYAMLOrJSONDecoder(&b, 100)
56 if err := dec.Decode(&pod); err != nil {
57 return nil, err
58 }
59 return &pod, nil
60}