liuhaijun 3f5f28d785 add sheduling agent
Change-Id: I89f35fb3984044c57f10727432755012542f9fd8
2023-11-16 10:55:57 +00:00

93 lines
2.1 KiB
Go

package mrunners
import (
"bytes"
"context"
"fmt"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule-agent/pkg/process-manager/menv"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule-agent/pkg/process-manager/mtmpl"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule-agent/pkg/process-manager/munit"
"os"
"path/filepath"
)
func init() {
Register(munit.KindRender, func(opts RunnerOptions) (runner Runner, err error) {
if err = opts.Unit.RequireFiles(); err != nil {
return
}
runner.Order = 10
runner.Action = &runnerRender{RunnerOptions: opts}
return
})
}
type runnerRender struct {
RunnerOptions
}
func (r *runnerRender) doFile(ctx context.Context, name string, env map[string]string) (err error) {
var buf []byte
if buf, err = os.ReadFile(name); err != nil {
err = fmt.Errorf("failed reading %s: %s", name, err.Error())
return
}
var content []byte
if content, err = mtmpl.Execute(string(buf), map[string]any{
"Env": env,
}); err != nil {
err = fmt.Errorf("failed rendering %s: %s", name, err.Error())
return
}
if !r.Unit.Raw {
content = sanitizeLines(content)
}
if err = os.WriteFile(name, content, 0755); err != nil {
err = fmt.Errorf("failed writing %s: %s", name, err.Error())
return
}
return
}
func (r *runnerRender) Do(ctx context.Context) {
r.Print("controller started")
defer r.Print("controller exited")
env, err := menv.Construct(r.Unit.Env)
if err != nil {
r.Error("failed constructing environments variables: " + err.Error())
return
}
for _, filePattern := range r.Unit.Files {
var names []string
if names, err = filepath.Glob(filePattern); err != nil {
r.Error(fmt.Sprintf("failed globbing: %s: %s", filePattern, err.Error()))
continue
}
for _, name := range names {
if err = r.doFile(ctx, name, env); err == nil {
r.Print("done rendering: " + name)
} else {
r.Error("failed rendering: " + name + ": " + err.Error())
}
}
}
}
func sanitizeLines(s []byte) []byte {
lines := bytes.Split(s, []byte("\n"))
out := &bytes.Buffer{}
for _, line := range lines {
line = bytes.TrimSpace(line)
if len(line) == 0 {
continue
}
out.Write(line)
out.WriteRune('\n')
}
return out.Bytes()
}