Skip to content

Commit dc57952

Browse files
Merge pull request #20703 from smarterclayton/router_tolerance
Make the router tests tolerate multiple namespaces
2 parents e576e5e + 3cb3cab commit dc57952

File tree

11 files changed

+106
-90
lines changed

11 files changed

+106
-90
lines changed

test/extended/images/append.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package images
22

33
import (
4-
"fmt"
54
"strings"
65

76
"github.com/MakeNowJust/heredoc"
@@ -23,12 +22,8 @@ func cliPodWithPullSecret(cli *exutil.CLI, shell string) *kapiv1.Pod {
2322
o.Expect(sa.ImagePullSecrets).NotTo(o.BeEmpty())
2423
pullSecretName := sa.ImagePullSecrets[0].Name
2524

26-
// best effort to get the format string for the release
27-
router, err := cli.AdminAppsClient().AppsV1().DeploymentConfigs("default").Get("router", metav1.GetOptions{})
28-
if err != nil {
29-
g.Fail(fmt.Sprintf("Unable to find router in order to query format string: %v", err))
30-
}
31-
cliImage := strings.Replace(router.Spec.Template.Spec.Containers[0].Image, "haproxy-router", "cli", 1)
25+
format, _ := exutil.FindImageFormatString(cli)
26+
cliImage := strings.Replace(format, "${component}", "cli", -1)
3227

3328
return &kapiv1.Pod{
3429
ObjectMeta: metav1.ObjectMeta{

test/extended/router/config_manager.go

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package router
22

33
import (
44
"fmt"
5-
"os"
65
"strings"
76
"time"
87

@@ -44,19 +43,10 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
4443
g.BeforeEach(func() {
4544
ns = oc.Namespace()
4645

47-
image := os.Getenv("OS_IMAGE_PREFIX")
48-
if len(image) == 0 {
49-
image = "openshift/origin"
50-
}
51-
image += "-haproxy-router"
52-
53-
if dc, err := oc.AdminAppsClient().AppsV1().DeploymentConfigs("default").Get("router", metav1.GetOptions{}); err == nil {
54-
if len(dc.Spec.Template.Spec.Containers) > 0 && dc.Spec.Template.Spec.Containers[0].Image != "" {
55-
image = dc.Spec.Template.Spec.Containers[0].Image
56-
}
57-
}
46+
routerImage, _ := exutil.FindImageFormatString(oc)
47+
routerImage = strings.Replace(routerImage, "${component}", "haproxy-router", -1)
5848

59-
err := oc.AsAdmin().Run("new-app").Args("-f", configPath, "-p", "IMAGE="+image).Execute()
49+
err := oc.AsAdmin().Run("new-app").Args("-f", configPath, "-p", "IMAGE="+routerImage).Execute()
6050
o.Expect(err).NotTo(o.HaveOccurred())
6151
})
6252

test/extended/router/headers.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
2828
)
2929

3030
g.BeforeEach(func() {
31-
svc, err := oc.AdminKubeClient().Core().Services("default").Get("router", metav1.GetOptions{})
31+
var err error
32+
routerIP, err = waitForRouterServiceIP(oc)
3233
if kapierrs.IsNotFound(err) {
3334
g.Skip("no router installed on the cluster")
3435
return
3536
}
3637
o.Expect(err).NotTo(o.HaveOccurred())
37-
routerIP = svc.Spec.ClusterIP
3838
})
3939

4040
g.Describe("The HAProxy router", func() {

test/extended/router/metrics.go

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
3434
)
3535

3636
g.BeforeEach(func() {
37-
dc, err := oc.AdminAppsClient().AppsV1().DeploymentConfigs("default").Get("router", metav1.GetOptions{})
37+
template, _, err := exutil.GetRouterPodTemplate(oc)
3838
if kapierrs.IsNotFound(err) {
3939
g.Skip("no router installed on the cluster")
4040
return
4141
}
4242
o.Expect(err).NotTo(o.HaveOccurred())
43-
env := dc.Spec.Template.Spec.Containers[0].Env
43+
env := template.Spec.Containers[0].Env
4444
username, password = findEnvVar(env, "STATS_USERNAME"), findEnvVar(env, "STATS_PASSWORD")
4545
statsPortString := findEnvVar(env, "STATS_PORT")
4646
hasMetrics = len(findEnvVar(env, "ROUTER_METRICS_TYPE")) > 0
@@ -58,16 +58,7 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
5858
}
5959
}
6060

61-
// wait for the router endpoints to show up
62-
err = wait.PollImmediate(2*time.Second, 120*time.Second, func() (bool, error) {
63-
epts, err := oc.AdminKubeClient().CoreV1().Endpoints("default").Get("router", metav1.GetOptions{})
64-
o.Expect(err).NotTo(o.HaveOccurred())
65-
if len(epts.Subsets) == 0 || len(epts.Subsets[0].Addresses) == 0 {
66-
return false, nil
67-
}
68-
host = epts.Subsets[0].Addresses[0].IP
69-
return true, nil
70-
})
61+
host, err = waitForFirstRouterEndpointIP(oc)
7162
o.Expect(err).NotTo(o.HaveOccurred())
7263

7364
ns = oc.KubeFramework().Namespace.Name

test/extended/router/reencrypt.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,14 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
3939
oc = exutil.NewCLI("router-reencrypt", exutil.KubeConfigPath())
4040

4141
g.BeforeEach(func() {
42-
svc, err := oc.AdminKubeClient().Core().Services("default").Get("router", metav1.GetOptions{})
42+
var err error
43+
ip, err = waitForRouterServiceIP(oc)
4344
if kapierrs.IsNotFound(err) {
4445
g.Skip("no router installed on the cluster")
4546
return
4647
}
4748
o.Expect(err).NotTo(o.HaveOccurred())
48-
ip = svc.Spec.ClusterIP
49+
4950
ns = oc.KubeFramework().Namespace.Name
5051
})
5152

@@ -79,3 +80,23 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
7980
})
8081
})
8182
})
83+
84+
func waitForRouterServiceIP(oc *exutil.CLI) (string, error) {
85+
_, ns, err := exutil.GetRouterPodTemplate(oc)
86+
if err != nil {
87+
return "", err
88+
}
89+
90+
// wait for the service to show up
91+
var host string
92+
err = wait.PollImmediate(2*time.Second, 60*time.Second, func() (bool, error) {
93+
svc, err := oc.AdminKubeClient().CoreV1().Services(ns).Get("router", metav1.GetOptions{})
94+
if kapierrs.IsNotFound(err) {
95+
return false, nil
96+
}
97+
o.Expect(err).NotTo(o.HaveOccurred())
98+
host = svc.Spec.ClusterIP
99+
return true, nil
100+
})
101+
return host, err
102+
}

test/extended/router/router.go

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,25 +42,14 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
4242
oc = exutil.NewCLI("router-stress", exutil.KubeConfigPath())
4343

4444
g.BeforeEach(func() {
45-
_, err := oc.AdminAppsClient().AppsV1().DeploymentConfigs("default").Get("router", metav1.GetOptions{})
45+
var err error
46+
host, err = waitForFirstRouterEndpointIP(oc)
4647
if kapierrs.IsNotFound(err) {
4748
g.Skip("no router installed on the cluster")
4849
return
4950
}
5051
o.Expect(err).NotTo(o.HaveOccurred())
5152

52-
// wait for the router endpoints to show up
53-
err = wait.PollImmediate(2*time.Second, 120*time.Second, func() (bool, error) {
54-
epts, err := oc.AdminKubeClient().CoreV1().Endpoints("default").Get("router", metav1.GetOptions{})
55-
o.Expect(err).NotTo(o.HaveOccurred())
56-
if len(epts.Subsets) == 0 || len(epts.Subsets[0].Addresses) == 0 {
57-
return false, nil
58-
}
59-
host = epts.Subsets[0].Addresses[0].IP
60-
return true, nil
61-
})
62-
o.Expect(err).NotTo(o.HaveOccurred())
63-
6453
ns = oc.KubeFramework().Namespace.Name
6554
})
6655

@@ -106,3 +95,23 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
10695
})
10796
})
10897
})
98+
99+
func waitForFirstRouterEndpointIP(oc *exutil.CLI) (string, error) {
100+
_, ns, err := exutil.GetRouterPodTemplate(oc)
101+
if err != nil {
102+
return "", err
103+
}
104+
105+
// wait for at least one router endpoint to be up router endpoints to show up
106+
var host string
107+
err = wait.PollImmediate(2*time.Second, 120*time.Second, func() (bool, error) {
108+
epts, err := oc.AdminKubeClient().CoreV1().Endpoints(ns).Get("router", metav1.GetOptions{})
109+
o.Expect(err).NotTo(o.HaveOccurred())
110+
if len(epts.Subsets) == 0 || len(epts.Subsets[0].Addresses) == 0 {
111+
return false, nil
112+
}
113+
host = epts.Subsets[0].Addresses[0].IP
114+
return true, nil
115+
})
116+
return host, err
117+
}

test/extended/router/scoped.go

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package router
33
import (
44
"fmt"
55
"net/http"
6-
"os"
76
"strconv"
87
"strings"
98
"time"
@@ -51,19 +50,10 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
5150
g.BeforeEach(func() {
5251
ns = oc.Namespace()
5352

54-
image := os.Getenv("OS_IMAGE_PREFIX")
55-
if len(image) == 0 {
56-
image = "openshift/origin"
57-
}
58-
image += "-haproxy-router"
59-
60-
if dc, err := oc.AdminAppsClient().AppsV1().DeploymentConfigs("default").Get("router", metav1.GetOptions{}); err == nil {
61-
if len(dc.Spec.Template.Spec.Containers) > 0 && dc.Spec.Template.Spec.Containers[0].Image != "" {
62-
image = dc.Spec.Template.Spec.Containers[0].Image
63-
}
64-
}
53+
routerImage, _ := exutil.FindImageFormatString(oc)
54+
routerImage = strings.Replace(routerImage, "${component}", "haproxy-router", -1)
6555

66-
err := oc.AsAdmin().Run("new-app").Args("-f", configPath, "-p", "IMAGE="+image).Execute()
56+
err := oc.AsAdmin().Run("new-app").Args("-f", configPath, "-p", "IMAGE="+routerImage).Execute()
6757
o.Expect(err).NotTo(o.HaveOccurred())
6858
})
6959

test/extended/router/stress.go

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package router
33
import (
44
"bytes"
55
"fmt"
6-
"os"
76
"strings"
87
"text/tabwriter"
98
"time"
@@ -14,7 +13,6 @@ import (
1413
corev1 "k8s.io/api/core/v1"
1514
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
1615
rbacv1 "k8s.io/api/rbac/v1"
17-
kapierrs "k8s.io/apimachinery/pkg/api/errors"
1816
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1917
"k8s.io/apimachinery/pkg/types"
2018
"k8s.io/apimachinery/pkg/util/intstr"
@@ -52,20 +50,10 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
5250
g.BeforeEach(func() {
5351
ns = oc.Namespace()
5452

55-
dc, err := oc.AdminAppsClient().AppsV1().DeploymentConfigs("default").Get("router", metav1.GetOptions{})
56-
if kapierrs.IsNotFound(err) {
57-
g.Skip("no router installed on the cluster")
58-
imagePrefix := os.Getenv("OS_IMAGE_PREFIX")
59-
if len(imagePrefix) == 0 {
60-
imagePrefix = "openshift/origin"
61-
}
62-
routerImage = imagePrefix + "-haproxy-router:latest"
63-
return
64-
}
65-
o.Expect(err).NotTo(o.HaveOccurred())
66-
routerImage = dc.Spec.Template.Spec.Containers[0].Image
53+
routerImage, _ = exutil.FindImageFormatString(oc)
54+
routerImage = strings.Replace(routerImage, "${component}", "haproxy-router", -1)
6755

68-
_, err = oc.AdminKubeClient().Rbac().RoleBindings(ns).Create(&rbacv1.RoleBinding{
56+
_, err := oc.AdminKubeClient().Rbac().RoleBindings(ns).Create(&rbacv1.RoleBinding{
6957
ObjectMeta: metav1.ObjectMeta{
7058
Name: "router",
7159
},

test/extended/router/unprivileged.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package router
33
import (
44
"fmt"
55
"net/http"
6-
"os"
6+
"strings"
77
"time"
88

99
g "github.com/onsi/ginkgo"
@@ -40,20 +40,19 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
4040

4141
g.BeforeEach(func() {
4242
ns = oc.Namespace()
43-
imagePrefix := os.Getenv("OS_IMAGE_PREFIX")
44-
if len(imagePrefix) == 0 {
45-
imagePrefix = "openshift/origin"
46-
}
43+
44+
routerImage, _ := exutil.FindImageFormatString(oc)
45+
routerImage = strings.Replace(routerImage, "${component}", "haproxy-router", -1)
46+
4747
err := oc.AsAdmin().Run("new-app").Args("-f", configPath,
48-
`-p=IMAGE=`+imagePrefix+`-haproxy-router`,
48+
`-p=IMAGE=`+routerImage,
4949
`-p=SCOPE=["--name=test-unprivileged", "--namespace=$(POD_NAMESPACE)", "--loglevel=4", "--labels=select=first", "--update-status=false"]`,
5050
).Execute()
5151
o.Expect(err).NotTo(o.HaveOccurred())
5252
})
5353

5454
g.Describe("The HAProxy router", func() {
5555
g.It("should run even if it has no access to update status", func() {
56-
g.Skip("test temporarily disabled")
5756

5857
ns := oc.KubeFramework().Namespace.Name
5958
execPodName := exutil.CreateExecPodOrFail(oc.AdminKubeClient().CoreV1(), ns, "execpod")

test/extended/router/weighted.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"encoding/csv"
55
"fmt"
66
"net/http"
7-
"os"
87
"strconv"
98
"strings"
109
"time"
@@ -27,11 +26,9 @@ var _ = g.Describe("[Conformance][Area:Networking][Feature:Router]", func() {
2726
)
2827

2928
g.BeforeEach(func() {
30-
imagePrefix := os.Getenv("OS_IMAGE_PREFIX")
31-
if len(imagePrefix) == 0 {
32-
imagePrefix = "openshift/origin"
33-
}
34-
err := oc.AsAdmin().Run("new-app").Args("-f", configPath, "-p", "IMAGE="+imagePrefix+"-haproxy-router").Execute()
29+
routerImage, _ := exutil.FindImageFormatString(oc)
30+
routerImage = strings.Replace(routerImage, "${component}", "haproxy-router", -1)
31+
err := oc.AsAdmin().Run("new-app").Args("-f", configPath, "-p", "IMAGE="+routerImage).Execute()
3532
o.Expect(err).NotTo(o.HaveOccurred())
3633
})
3734

test/extended/util/framework.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2525
"k8s.io/apimachinery/pkg/fields"
2626
"k8s.io/apimachinery/pkg/labels"
27+
"k8s.io/apimachinery/pkg/runtime/schema"
2728
"k8s.io/apimachinery/pkg/selection"
2829
"k8s.io/apimachinery/pkg/util/uuid"
2930
"k8s.io/apimachinery/pkg/util/wait"
@@ -1411,3 +1412,38 @@ func WaitForUserBeAuthorized(oc *CLI, user, verb, resource string) error {
14111412
return false, err
14121413
})
14131414
}
1415+
1416+
// GetRouterPodTemplate finds the router pod template across different namespaces,
1417+
// helping to mitigate the transition from the default namespace to an operator
1418+
// namespace.
1419+
func GetRouterPodTemplate(oc *CLI) (*corev1.PodTemplateSpec, string, error) {
1420+
appsclient := oc.AdminAppsClient().AppsV1()
1421+
k8sappsclient := oc.AdminKubeClient().AppsV1()
1422+
for _, ns := range []string{"default", "openshift-ingress", "tectonic-ingress"} {
1423+
dc, err := appsclient.DeploymentConfigs(ns).Get("router", metav1.GetOptions{})
1424+
if err == nil {
1425+
return dc.Spec.Template, ns, nil
1426+
}
1427+
if !errors.IsNotFound(err) {
1428+
return nil, "", err
1429+
}
1430+
deploy, err := k8sappsclient.Deployments(ns).Get("router", metav1.GetOptions{})
1431+
if err == nil {
1432+
return &deploy.Spec.Template, ns, nil
1433+
}
1434+
if !errors.IsNotFound(err) {
1435+
return nil, "", err
1436+
}
1437+
}
1438+
return nil, "", errors.NewNotFound(schema.GroupResource{Group: "apps.openshift.io", Resource: "deploymentconfigs"}, "router")
1439+
}
1440+
1441+
func FindImageFormatString(oc *CLI) (string, bool) {
1442+
// the router is expected to be on all clusters
1443+
// TODO: switch this to read from the global config
1444+
template, _, err := GetRouterPodTemplate(oc)
1445+
if err == nil {
1446+
return strings.Replace(template.Spec.Containers[0].Image, "haproxy-router", "${component}", -1), true
1447+
}
1448+
return "openshift/origin-${component}:latest", false
1449+
}

0 commit comments

Comments
 (0)