mirror of
https://github.com/vmware-tanzu/velero.git
synced 2026-05-28 18:10:23 +00:00
PVB and PVR used to print related pod namespace in output. In v1.17, the behavior changed. Use backup or restore name to filter them. Shorten the timeout context from 1h to 5m, because AWS was not covered anymore. Remove an used if branch for vSphere. Signed-off-by: Xun Jiang <xun.jiang@broadcom.com>
145 lines
2.9 KiB
Go
145 lines
2.9 KiB
Go
package common
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
WorkerOSLinux string = "linux"
|
|
WorkerOSWindows string = "windows"
|
|
)
|
|
|
|
type OsCommandLine struct {
|
|
Cmd string
|
|
Args []string
|
|
}
|
|
|
|
func GetListByCmdPipes(ctx context.Context, cmdLines []*OsCommandLine) ([]string, error) {
|
|
var buf bytes.Buffer
|
|
var err error
|
|
var cmds []*exec.Cmd
|
|
|
|
for _, cmdline := range cmdLines {
|
|
cmd := exec.Command(cmdline.Cmd, cmdline.Args...)
|
|
cmds = append(cmds, cmd)
|
|
}
|
|
fmt.Println(cmds)
|
|
for i := 0; i < len(cmds); i++ {
|
|
if i == len(cmds)-1 {
|
|
break
|
|
}
|
|
cmds[i+1].Stdin, err = cmds[i].StdoutPipe()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
cmds[len(cmds)-1].Stdout = &buf
|
|
for i := len(cmds) - 1; i >= 0; i-- {
|
|
_ = cmds[i].Start()
|
|
if i == 0 {
|
|
_ = cmds[i].Run()
|
|
}
|
|
}
|
|
for i := 1; i < len(cmds); i++ {
|
|
_ = cmds[i].Wait()
|
|
}
|
|
|
|
scanner := bufio.NewScanner(&buf)
|
|
var ret []string
|
|
for scanner.Scan() {
|
|
fmt.Printf("line: %s\n", scanner.Text())
|
|
ret = append(ret, scanner.Text())
|
|
}
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetResourceWithLabel(ctx context.Context, namespace, resourceName string, labels map[string]string) ([]string, error) {
|
|
labelStr := ""
|
|
|
|
for key, value := range labels {
|
|
strings.Join([]string{labelStr, key + "=" + value}, ",")
|
|
}
|
|
|
|
cmds := []*OsCommandLine{}
|
|
cmd := &OsCommandLine{
|
|
Cmd: "kubectl",
|
|
Args: []string{"get", resourceName, "--no-headers", "-n", namespace, "-l", labelStr},
|
|
}
|
|
cmds = append(cmds, cmd)
|
|
|
|
cmd = &OsCommandLine{
|
|
Cmd: "awk",
|
|
Args: []string{"{print $1}"},
|
|
}
|
|
cmds = append(cmds, cmd)
|
|
|
|
return GetListByCmdPipes(ctx, cmds)
|
|
}
|
|
|
|
func CMDExecWithOutput(checkCMD *exec.Cmd) (*[]byte, error) {
|
|
stdoutPipe, err := checkCMD.StdoutPipe()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
jsonBuf := make([]byte, 128*1024) // If the YAML is bigger than 64K, there's probably something bad happening
|
|
|
|
err = checkCMD.Start()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
bytesRead, err := io.ReadFull(stdoutPipe, jsonBuf)
|
|
|
|
if err != nil && err != io.ErrUnexpectedEOF {
|
|
return nil, err
|
|
}
|
|
if bytesRead == len(jsonBuf) {
|
|
return nil, errors.New("yaml returned bigger than max allowed")
|
|
}
|
|
|
|
jsonBuf = jsonBuf[0:bytesRead]
|
|
err = checkCMD.Wait()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &jsonBuf, err
|
|
}
|
|
|
|
func WriteToFile(content, fileName string) error {
|
|
file, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE, 0666)
|
|
if err != nil {
|
|
fmt.Println("fail to open file", err)
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
write := bufio.NewWriter(file)
|
|
_, err = write.WriteString(content)
|
|
if err != nil {
|
|
fmt.Println("fail to WriteString file", err)
|
|
return err
|
|
}
|
|
err = write.Flush()
|
|
if err != nil {
|
|
fmt.Println("fail to Flush file", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
func CreateFileContent(namespace, podName, volume string) string {
|
|
return fmt.Sprintf("ns-%s pod-%s volume-%s", namespace, podName, volume)
|
|
}
|