diff --git a/test/function_test.go b/test/function_test.go index 0a746dc3..c7fa57cd 100644 --- a/test/function_test.go +++ b/test/function_test.go @@ -1,12 +1,44 @@ package test import ( + "context" "fmt" + log "github.com/sirupsen/logrus" + "github.com/wencaiwulue/kubevpn/util" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/cli-runtime/pkg/genericclioptions" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" + cmdutil "k8s.io/kubectl/pkg/cmd/util" "net" + "os/exec" + "strings" "testing" "time" ) +var ( + namespace string + clientset *kubernetes.Clientset + restclient *rest.RESTClient + config *rest.Config +) + +func TestPingPodIP(t *testing.T) { + list, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), v1.ListOptions{}) + if err != nil { + t.FailNow() + } + for _, item := range list.Items { + command := exec.Command("ping", "-c", "4", item.Status.PodIP) + command.Run() + if !command.ProcessState.Success() { + t.FailNow() + } + } +} + func TestUDP(t *testing.T) { go func() { server() @@ -77,3 +109,39 @@ func server() { } } } + +func init() { + initClient() + + command := exec.Command("nhctl", "connect", "--workloads=ratings") + c := make(chan struct{}) + _, _, _ = util.RunWithRollingOutWithChecker(command, func(log string) bool { + ok := strings.Contains(log, "dns service ok") + if ok { + c <- struct{}{} + } + return ok + }) + <-c +} + +func initClient() { + var err error + + configFlags := genericclioptions.NewConfigFlags(true).WithDeprecatedPasswordFlag() + configFlags.KubeConfig = &clientcmd.RecommendedHomeFile + f := cmdutil.NewFactory(cmdutil.NewMatchVersionFlags(configFlags)) + + if config, err = f.ToRESTConfig(); err != nil { + log.Fatal(err) + } + if restclient, err = rest.RESTClientFor(config); err != nil { + log.Fatal(err) + } + if clientset, err = kubernetes.NewForConfig(config); err != nil { + log.Fatal(err) + } + if namespace, _, err = f.ToRawKubeConfigLoader().Namespace(); err != nil { + log.Fatal(err) + } +} diff --git a/util/util.go b/util/util.go index c8eccb2b..42cd930e 100644 --- a/util/util.go +++ b/util/util.go @@ -39,6 +39,7 @@ import ( "net" "net/http" "os" + osexec "os/exec" "runtime" "strings" "time" @@ -414,3 +415,42 @@ func RolloutStatus(factory cmdutil.Factory, namespace, workloads string, timeout return err }) } + +func RunWithRollingOutWithChecker(cmd *osexec.Cmd, checker func(log string) bool) (string, string, error) { + stdoutBuf := bytes.NewBuffer(make([]byte, 0)) + stderrBuf := bytes.NewBuffer(make([]byte, 0)) + + stdoutPipe, _ := cmd.StdoutPipe() + stderrPipe, _ := cmd.StderrPipe() + stdout := io.MultiWriter(os.Stdout, stdoutBuf) + stderr := io.MultiWriter(os.Stderr, stderrBuf) + go func() { + _, _ = io.Copy(stdout, stdoutPipe) + }() + go func() { + _, _ = io.Copy(stderr, stderrPipe) + }() + go func() { + if checker != nil { + for { + if checker(stdoutBuf.String()) || checker(stderrBuf.String()) { + break + } + } + } + }() + if err := cmd.Start(); err != nil { + _ = cmd.Process.Kill() + return stdoutBuf.String(), stderrBuf.String(), err + } + _ = cmd.Wait() + var err error + if !cmd.ProcessState.Success() { + err = errors.New("exit code is not 0") + } + + stdoutStr := strings.TrimSpace(stdoutBuf.String()) + stderrStr := strings.TrimSpace(stderrBuf.String()) + + return stdoutStr, stderrStr, err +}