kubevela/e2e/cli.go

138 lines
3.7 KiB
Go
Raw Normal View History

/*
Copyright 2021 The KubeVela Authors.
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 e2e
2020-07-31 18:26:36 +08:00
import (
"os"
"os/exec"
"path"
"strings"
"time"
"github.com/Netflix/go-expect"
"github.com/hinshun/vt10x"
"github.com/onsi/ginkgo/v2"
2020-09-26 12:58:30 +08:00
"github.com/onsi/gomega"
2020-07-31 18:26:36 +08:00
"github.com/onsi/gomega/gexec"
)
var rudrPath = GetCliBinary()
2020-07-31 18:26:36 +08:00
2022-09-28 10:19:28 +08:00
// GetCliBinary is to build kubevela binary.
func GetCliBinary() string {
2020-07-31 18:26:36 +08:00
cwd, _ := os.Getwd()
return path.Join(cwd, "../..", "./bin")
2020-07-31 18:26:36 +08:00
}
// Exec executes a command
2020-07-31 18:26:36 +08:00
func Exec(cli string) (string, error) {
var output []byte
session, err := asyncExec(cli)
2020-07-31 18:26:36 +08:00
if err != nil {
return string(output), err
}
s := session.Wait(60 * time.Second)
2020-07-31 18:26:36 +08:00
return string(s.Out.Contents()) + string(s.Err.Contents()), nil
}
// ExecAndTerminate executes a long-running command and terminate it after 3s
func ExecAndTerminate(cli string) (string, error) {
var output []byte
session, err := asyncExec(cli)
if err != nil {
return string(output), err
}
Feat: Semantic versioning support for Definitions (#6648) * feature: Add Semantic versioning to KubeVela Definitions Fixes https://github.com/kubevela/kubevela/issues/6435 Fixes https://github.com/kubevela/kubevela/issues/6534 Changes: - Adds an optional "Version" field for all Definition Specs. - Adds the following new validations to Webhooks for Definitions: - Validate the "Version" field follows Semantic versioning. - Dis-allow conflicting versioning fields ( Name annotation, Spec.Version) - Adds the following new validations to Webhooks for Application: - Dis-allow the use of both the "publishVersion" & "autoUpdate" annotations. - Enahnce "multiStageComponentApply" feature to support auto updates. Boy Scout Changes: - Fixes Plugin e2e tests broken by the fix for 6534. - Fixes the dryRun and livediff commands to respect the "-n" namespace flag. - Fixes the Application ValidationWebhook to respect the "-n" namespace flag. Co-authored-by: Rahul Kumar <35751394+bugbounce@users.noreply.github.com> Co-authored-by: Chaitanya Reddy <chaitanyareddy0702@gmail.com> Co-authored-by: Vibhor Chinda <vibhorchinda@gmail.com> Co-authored-by: Shivin Gopalani <gopalanishivin@gmail.com> Signed-off-by: kanchan-dhamane <74534570+kanchan-dhamane@users.noreply.github.com> * feature: Add KEP to define the proposal Signed-off-by: kanchan-dhamane <74534570+kanchan-dhamane@users.noreply.github.com> * fix: Rebase and fix merge conflicts Signed-off-by: kanchan-dhamane <74534570+kanchan-dhamane@users.noreply.github.com> * Fix: Adds unit test cases Signed-off-by: kanchan-dhamane <74534570+kanchan-dhamane@users.noreply.github.com> --------- Signed-off-by: kanchan-dhamane <74534570+kanchan-dhamane@users.noreply.github.com> Co-authored-by: bugbounce <35751394+bugbounce@users.noreply.github.com>
2025-02-03 11:09:28 +08:00
time.Sleep(10 * time.Second)
s := session.Terminate()
return string(s.Out.Contents()) + string(s.Err.Contents()), nil
}
2020-07-31 18:26:36 +08:00
// LongTimeExec executes a long-running command and wait it exits by itself
func LongTimeExec(cli string, timeout time.Duration) (string, error) {
var output []byte
session, err := asyncExec(cli)
if err != nil {
return string(output), err
}
s := session.Wait(timeout)
return string(s.Out.Contents()) + string(s.Err.Contents()), nil
}
func asyncExec(cli string) (*gexec.Session, error) {
c := strings.Fields(cli)
commandName := path.Join(rudrPath, c[0])
command := exec.Command(commandName, c[1:]...)
session, err := gexec.Start(command, ginkgo.GinkgoWriter, ginkgo.GinkgoWriter)
return session, err
}
func LongTimeExecWithEnv(cli string, timeout time.Duration, env []string) (string, error) {
var output []byte
c := strings.Fields(cli)
commandName := path.Join(rudrPath, c[0])
command := exec.Command(commandName, c[1:]...)
command.Env = os.Environ()
command.Env = append(command.Env, env...)
session, err := gexec.Start(command, ginkgo.GinkgoWriter, ginkgo.GinkgoWriter)
if err != nil {
return string(output), err
}
s := session.Wait(timeout)
return string(s.Out.Contents()) + string(s.Err.Contents()), nil
}
// InteractiveExec executes a command with interactive input
func InteractiveExec(cli string, consoleFn func(*expect.Console)) (string, error) {
var output []byte
console, _, err := vt10x.NewVT10XConsole(expect.WithStdout(ginkgo.GinkgoWriter))
gomega.Expect(err).NotTo(gomega.HaveOccurred())
defer console.Close()
doneC := make(chan struct{})
go func() {
defer ginkgo.GinkgoRecover()
defer close(doneC)
consoleFn(console)
}()
c := strings.Fields(cli)
commandName := path.Join(rudrPath, c[0])
command := exec.Command(commandName, c[1:]...)
command.Stdin = console.Tty()
session, err := gexec.Start(command, console.Tty(), console.Tty())
if err != nil {
return string(output), err
}
s := session.Wait(300 * time.Second)
err = console.Tty().Close()
if err != nil {
return string(output), err
}
<-doneC
if err != nil {
return string(output), err
}
return string(s.Out.Contents()) + string(s.Err.Contents()), nil
}
func BeforeSuit() {
// sync capabilities from cluster into local
_, _ = Exec("vela workloads")
}