blob: aeed5b793a79525c9f6ee824831751003e21d1ae [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
16type Launcher interface {
17 Launch(ns, tmpl string, args map[string]interface{}) error
18}
19
20type k8sLauncher struct {
21 client *kubernetes.Clientset
22}
23
24func NewK8sLauncher(client *kubernetes.Clientset) Launcher {
25 return &k8sLauncher{client}
26}
27
28func (k *k8sLauncher) Launch(ns, tmpl string, args map[string]interface{}) error {
29 pod, err := renderTemplate(tmpl, args)
30 if err != nil {
31 return err
32 }
33 pods := k.client.CoreV1().Pods(ns)
34 resp, err := pods.Create(context.TODO(), pod, metav1.CreateOptions{})
35 if err != nil {
36 return err
37 }
38 glog.Infof("Pod created: %s", resp)
39 return nil
40}
41
42func renderTemplate(tmpl string, args map[string]interface{}) (*apiv1.Pod, error) {
43 t, err := template.New("action").Parse(tmpl)
44 if err != nil {
45 return nil, err
46 }
47 var b bytes.Buffer
48 if err := t.Execute(&b, args); err != nil {
49 return nil, err
50 }
51 var pod apiv1.Pod
52 dec := yaml.NewYAMLOrJSONDecoder(&b, 100)
53 if err := dec.Decode(&pod); err != nil {
54 return nil, err
55 }
56 return &pod, nil
57}