mirror of
https://github.com/vmware-tanzu/velero.git
synced 2025-12-23 06:15:21 +00:00
Fix GetResourceWithLabel's bug: labels were not applied. Add workOS for deployment and pod creationg. Add OS label for select node. Enlarge the context timeout to 10 minutes. 5 min is not enough for Windows. Enlarge the Kibishii test context to 15 minutes for Windows. Signed-off-by: Xun Jiang <xun.jiang@broadcom.com>
153 lines
3.1 KiB
Go
153 lines
3.1 KiB
Go
package common
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
WorkerOSLinux string = "linux"
|
|
WorkerOSWindows string = "windows"
|
|
)
|
|
|
|
const (
|
|
DefaultBSLName string = "default"
|
|
AdditionalBSLName string = "add-bsl"
|
|
)
|
|
|
|
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 := ""
|
|
parts := make([]string, 0, len(labels))
|
|
|
|
for key, value := range labels {
|
|
strings.Join([]string{labelStr, key + "=" + value}, ",")
|
|
parts = append(parts, key+"="+value)
|
|
}
|
|
labelStr = strings.Join(parts, ",")
|
|
|
|
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)
|
|
}
|