mirror of
				https://github.com/fluxcd/flux2.git
				synced 2025-11-01 01:25:53 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			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
 | |
| }
 | 
