| package appmanager |
| |
| import ( |
| "bytes" |
| "context" |
| "text/template" |
| |
| apiv1 "k8s.io/api/core/v1" |
| metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
| "k8s.io/apimachinery/pkg/util/yaml" |
| "k8s.io/client-go/kubernetes" |
| |
| "github.com/golang/glog" |
| ) |
| |
| type Launcher interface { |
| Launch(ns, tmpl string, args map[string]interface{}) error |
| } |
| |
| type k8sLauncher struct { |
| client *kubernetes.Clientset |
| } |
| |
| func NewK8sLauncher(client *kubernetes.Clientset) Launcher { |
| return &k8sLauncher{client} |
| } |
| |
| func (k *k8sLauncher) Launch(ns, tmpl string, args map[string]interface{}) error { |
| pod, err := renderTemplate(tmpl, args) |
| if err != nil { |
| return err |
| } |
| pods := k.client.CoreV1().Pods(ns) |
| resp, err := pods.Create(context.TODO(), pod, metav1.CreateOptions{}) |
| if err != nil { |
| return err |
| } |
| glog.Infof("Pod created: %s", resp) |
| return nil |
| } |
| |
| func renderTemplate(tmpl string, args map[string]interface{}) (*apiv1.Pod, error) { |
| t, err := template.New("action").Parse(tmpl) |
| if err != nil { |
| return nil, err |
| } |
| var b bytes.Buffer |
| if err := t.Execute(&b, args); err != nil { |
| return nil, err |
| } |
| var pod apiv1.Pod |
| dec := yaml.NewYAMLOrJSONDecoder(&b, 100) |
| if err := dec.Decode(&pod); err != nil { |
| return nil, err |
| } |
| return &pod, nil |
| } |