func NewExecHandler()

in internal/execution/handler.go [32:70]


func NewExecHandler() SynthesizerHandle {
	return func(ctx context.Context, s *apiv1.Synthesizer, rl *krmv1.ResourceList) (*krmv1.ResourceList, error) {
		stdin := &bytes.Buffer{}
		stdout := &bytes.Buffer{}

		err := json.NewEncoder(stdin).Encode(rl)
		if err != nil {
			return nil, err
		}

		command := s.Spec.Command
		if len(command) == 0 {
			command = []string{"synthesize"}
		}

		if s.Spec.ExecTimeout != nil {
			var cancel context.CancelFunc
			ctx, cancel = context.WithTimeout(ctx, s.Spec.ExecTimeout.Duration)
			defer cancel()
		}

		cmd := exec.CommandContext(ctx, command[0], command[1:]...)
		cmd.Stdin = stdin
		cmd.Stderr = os.Stdout // logger uses stderr, so use stdout to avoid race condition
		cmd.Stdout = stdout
		err = cmd.Run()
		if err != nil {
			return nil, err
		}

		output := &krmv1.ResourceList{}
		err = json.NewDecoder(stdout).Decode(output)
		if err != nil {
			return nil, err
		}

		return output, nil
	}
}