mirror of https://github.com/fluxcd/flux2.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.3 KiB
Go
113 lines
2.3 KiB
Go
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"
|
|
"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()
|
|
_ = 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
|
|
}
|