Fix status update in case of connection errors
This commit is contained in:
parent
468872b7e9
commit
fed013ab6f
11 changed files with 326 additions and 107 deletions
|
|
@ -19,7 +19,11 @@ package framework
|
|||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"os/exec"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
)
|
||||
|
|
@ -31,14 +35,14 @@ func (f *Framework) ExecCommand(pod *v1.Pod, command string) (string, error) {
|
|||
execErr bytes.Buffer
|
||||
)
|
||||
|
||||
args := fmt.Sprintf("kubectl exec --namespace %v %v --container nginx-ingress-controller -- %v", pod.Namespace, pod.Name, command)
|
||||
cmd := exec.Command("/bin/bash", "-c", args)
|
||||
cmd := exec.Command("/bin/bash", "-c", fmt.Sprintf("%v exec --namespace %s %s --container nginx-ingress-controller -- %s", KubectlPath, pod.Namespace, pod.Name, command))
|
||||
cmd.Stdout = &execOut
|
||||
cmd.Stderr = &execErr
|
||||
|
||||
err := cmd.Run()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not execute: %v", err)
|
||||
return "", fmt.Errorf("could not execute '%s %s': %v", cmd.Path, cmd.Args, err)
|
||||
|
||||
}
|
||||
|
||||
if execErr.Len() > 0 {
|
||||
|
|
@ -59,3 +63,51 @@ func (f *Framework) NewIngressController(namespace string) error {
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
var (
|
||||
proxyRegexp = regexp.MustCompile("Starting to serve on .*:([0-9]+)")
|
||||
)
|
||||
|
||||
// KubectlProxy creates a proxy to kubernetes apiserver
|
||||
func (f *Framework) KubectlProxy(port int) (int, *exec.Cmd, error) {
|
||||
cmd := exec.Command("/bin/bash", "-c", fmt.Sprintf("%s proxy --accept-hosts=.* --address=0.0.0.0 --port=%d", KubectlPath, port))
|
||||
stdout, stderr, err := startCmdAndStreamOutput(cmd)
|
||||
if err != nil {
|
||||
return -1, nil, err
|
||||
}
|
||||
|
||||
defer stdout.Close()
|
||||
defer stderr.Close()
|
||||
|
||||
buf := make([]byte, 128)
|
||||
var n int
|
||||
if n, err = stdout.Read(buf); err != nil {
|
||||
return -1, cmd, fmt.Errorf("Failed to read from kubectl proxy stdout: %v", err)
|
||||
}
|
||||
|
||||
output := string(buf[:n])
|
||||
match := proxyRegexp.FindStringSubmatch(output)
|
||||
if len(match) == 2 {
|
||||
if port, err := strconv.Atoi(match[1]); err == nil {
|
||||
return port, cmd, nil
|
||||
}
|
||||
}
|
||||
|
||||
return -1, cmd, fmt.Errorf("Failed to parse port from proxy stdout: %s", output)
|
||||
}
|
||||
|
||||
func startCmdAndStreamOutput(cmd *exec.Cmd) (stdout, stderr io.ReadCloser, err error) {
|
||||
stdout, err = cmd.StdoutPipe()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
stderr, err = cmd.StderrPipe()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
Logf("Asynchronously running '%s'", strings.Join(cmd.Args, " "))
|
||||
err = cmd.Start()
|
||||
return
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,6 +46,11 @@ const (
|
|||
HTTPS RequestScheme = "https"
|
||||
)
|
||||
|
||||
var (
|
||||
// KubectlPath defines the full path of the kubectl binary
|
||||
KubectlPath = "/usr/local/bin/kubectl"
|
||||
)
|
||||
|
||||
// Framework supports common operations used by e2e tests; it will keep a client & a namespace for you.
|
||||
type Framework struct {
|
||||
BaseName string
|
||||
|
|
@ -197,9 +202,8 @@ func (f *Framework) WaitForNginxConfiguration(matcher func(cfg string) bool) err
|
|||
return wait.Poll(Poll, time.Minute*5, f.matchNginxConditions("", matcher))
|
||||
}
|
||||
|
||||
// NginxLogs returns the logs of the nginx ingress controller pod running
|
||||
func (f *Framework) NginxLogs() (string, error) {
|
||||
l, err := f.KubeClientSet.CoreV1().Pods(f.IngressController.Namespace).List(metav1.ListOptions{
|
||||
func nginxLogs(client kubernetes.Interface, namespace string) (string, error) {
|
||||
l, err := client.CoreV1().Pods(namespace).List(metav1.ListOptions{
|
||||
LabelSelector: "app.kubernetes.io/name=ingress-nginx",
|
||||
})
|
||||
if err != nil {
|
||||
|
|
@ -209,7 +213,7 @@ func (f *Framework) NginxLogs() (string, error) {
|
|||
for _, pod := range l.Items {
|
||||
if strings.HasPrefix(pod.GetName(), "nginx-ingress-controller") {
|
||||
if isRunning, err := podRunningReady(&pod); err == nil && isRunning {
|
||||
return f.Logs(&pod)
|
||||
return Logs(&pod)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -217,6 +221,11 @@ func (f *Framework) NginxLogs() (string, error) {
|
|||
return "", fmt.Errorf("no nginx ingress controller pod is running (logs)")
|
||||
}
|
||||
|
||||
// NginxLogs returns the logs of the nginx ingress controller pod running
|
||||
func (f *Framework) NginxLogs() (string, error) {
|
||||
return nginxLogs(f.KubeClientSet, f.IngressController.Namespace)
|
||||
}
|
||||
|
||||
func (f *Framework) matchNginxConditions(name string, matcher func(cfg string) bool) wait.ConditionFunc {
|
||||
return func() (bool, error) {
|
||||
l, err := f.KubeClientSet.CoreV1().Pods(f.IngressController.Namespace).List(metav1.ListOptions{
|
||||
|
|
@ -380,7 +389,7 @@ func UpdateDeployment(kubeClientSet kubernetes.Interface, namespace string, name
|
|||
LabelSelector: fields.SelectorFromSet(fields.Set(deployment.Spec.Template.ObjectMeta.Labels)).String(),
|
||||
})
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "failed to wait for nginx-ingress-controller replica count to be %v", replicas)
|
||||
return errors.Wrapf(err, "waiting for nginx-ingress-controller replica count to be %v", replicas)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ import (
|
|||
)
|
||||
|
||||
// Logs returns the log entries of a given Pod.
|
||||
func (f *Framework) Logs(pod *v1.Pod) (string, error) {
|
||||
func Logs(pod *v1.Pod) (string, error) {
|
||||
var (
|
||||
execOut bytes.Buffer
|
||||
execErr bytes.Buffer
|
||||
|
|
@ -35,14 +35,13 @@ func (f *Framework) Logs(pod *v1.Pod) (string, error) {
|
|||
return "", fmt.Errorf("could not determine which container to use")
|
||||
}
|
||||
|
||||
args := fmt.Sprintf("kubectl logs -n %v %v", pod.Namespace, pod.Name)
|
||||
cmd := exec.Command("/bin/bash", "-c", args)
|
||||
cmd := exec.Command("/bin/bash", "-c", fmt.Sprintf("%v logs --namespace %s %s", KubectlPath, pod.Namespace, pod.Name))
|
||||
cmd.Stdout = &execOut
|
||||
cmd.Stderr = &execErr
|
||||
|
||||
err := cmd.Run()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not execute: %v", err)
|
||||
return "", fmt.Errorf("could not execute '%s %s': %v", cmd.Path, cmd.Args, err)
|
||||
}
|
||||
|
||||
if execErr.Len() > 0 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue