|
|
|
/*
|
|
|
|
Copyright 2020 The Flux CD contributors.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"bytes"
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
"text/template"
|
|
|
|
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
|
|
"k8s.io/client-go/tools/clientcmd"
|
|
|
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
|
|
|
|
|
|
helmv2 "github.com/fluxcd/helm-controller/api/v2alpha1"
|
|
|
|
kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1alpha1"
|
|
|
|
sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1"
|
|
|
|
)
|
|
|
|
|
|
|
|
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)
|
|
|
|
_ = helmv2.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
|
|
|
|
}
|
|
|
|
|
|
|
|
func (*Utils) writeFile(content, filename string) error {
|
|
|
|
file, err := os.Create(filename)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
|
|
|
|
_, err = io.WriteString(file, content)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return file.Sync()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (*Utils) copyFile(src, dst string) error {
|
|
|
|
in, err := os.Open(src)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer in.Close()
|
|
|
|
|
|
|
|
out, err := os.Create(dst)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer out.Close()
|
|
|
|
|
|
|
|
_, err = io.Copy(out, in)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return out.Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (*Utils) containsItemString(s []string, e string) bool {
|
|
|
|
for _, a := range s {
|
|
|
|
if a == e {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|