package main import ( "bufio" "bytes" "context" "fmt" "io" "os" "os/exec" "text/template" kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1alpha1" sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/clientcmd" "sigs.k8s.io/controller-runtime/pkg/client" ) type Utils struct { } type ExecMode string const ( ModeOS ExecMode = "os.stderr|stdout" ModeStderrOS ExecMode = "os.stderr" ModeCapture ExecMode = "capture.stderr|stdout" ) func (*Utils) execCommand(ctx context.Context, mode ExecMode, command string) (string, error) { var stdoutBuf, stderrBuf bytes.Buffer c := exec.CommandContext(ctx, "/bin/sh", "-c", command) if mode == ModeStderrOS { c.Stderr = io.MultiWriter(os.Stderr, &stderrBuf) } if mode == ModeOS { c.Stdout = io.MultiWriter(os.Stdout, &stdoutBuf) c.Stderr = io.MultiWriter(os.Stderr, &stderrBuf) } if mode == ModeStderrOS || mode == ModeOS { if err := c.Run(); err != nil { return "", err } else { return "", nil } } if mode == ModeCapture { c.Stdout = &stdoutBuf c.Stderr = &stderrBuf if err := c.Run(); err != nil { return stderrBuf.String(), err } else { return stdoutBuf.String(), nil } } return "", nil } func (*Utils) execTemplate(obj interface{}, tmpl, filename string) error { t, err := template.New("tmpl").Parse(tmpl) if err != nil { return err } var data bytes.Buffer writer := bufio.NewWriter(&data) if err := t.Execute(writer, obj); err != nil { return err } if err := writer.Flush(); err != nil { return err } file, err := os.Create(filename) if err != nil { return err } defer file.Close() _, err = io.WriteString(file, data.String()) if err != nil { return err } return file.Sync() } func (*Utils) kubeClient(config string) (client.Client, error) { cfg, err := clientcmd.BuildConfigFromFlags("", config) if err != nil { return nil, fmt.Errorf("kubernetes client initialization failed: %w", err) } scheme := runtime.NewScheme() _ = corev1.AddToScheme(scheme) _ = sourcev1.AddToScheme(scheme) _ = kustomizev1.AddToScheme(scheme) kubeClient, err := client.New(cfg, client.Options{ Scheme: scheme, }) if err != nil { return nil, fmt.Errorf("kubernetes client initialization failed: %w", err) } return kubeClient, nil }