blob: aeed5b793a79525c9f6ee824831751003e21d1ae [file] [log] [blame]
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
}