@@ -20,8 +20,10 @@ import (
20
20
21
21
kapi "k8s.io/kubernetes/pkg/api"
22
22
"k8s.io/kubernetes/pkg/api/unversioned"
23
+ kv1 "k8s.io/kubernetes/pkg/api/v1"
23
24
"k8s.io/kubernetes/pkg/apis/extensions"
24
25
"k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
26
+ "k8s.io/kubernetes/pkg/runtime"
25
27
"k8s.io/kubernetes/pkg/util/intstr"
26
28
knet "k8s.io/kubernetes/pkg/util/net"
27
29
"k8s.io/kubernetes/pkg/util/wait"
@@ -37,6 +39,8 @@ import (
37
39
const (
38
40
defaultRouterImage = "openshift/origin-haproxy-router"
39
41
42
+ defaultNamespace = "router-namespace"
43
+
40
44
tcWaitSeconds = 1
41
45
42
46
statsPort = 1936
@@ -1275,13 +1279,20 @@ pgfj+yGLmkUw8JwgGH6xCUbHO+WBUFSlPf+Y50fJeO+OrjqPXAVKeSV3ZCwWjKT4
1275
1279
u3YLAbyW/lHhOCiZu2iAI8AbmXem9lW6Tr7p/97s0w==
1276
1280
-----END RSA PRIVATE KEY-----`
1277
1281
1282
+ // Constants used to default createAndStartRouterContainerExtended
1283
+ const (
1284
+ defaultBindPortsAfterSync = false
1285
+ defaultEnableIngress = false
1286
+ defaultNamespaceLabels = ""
1287
+ )
1288
+
1278
1289
// createAndStartRouterContainer is responsible for deploying the router image in docker. It assumes that all router images
1279
1290
// will use a command line flag that can take --master which points to the master url
1280
1291
func createAndStartRouterContainer (dockerCli * dockerClient.Client , masterIp string , routerStatsPort int , reloadInterval int ) (containerId string , err error ) {
1281
- return createAndStartRouterContainerExtended (dockerCli , masterIp , routerStatsPort , reloadInterval , false , false )
1292
+ return createAndStartRouterContainerExtended (dockerCli , masterIp , routerStatsPort , reloadInterval , defaultBindPortsAfterSync , defaultEnableIngress , defaultNamespaceLabels )
1282
1293
}
1283
1294
1284
- func createAndStartRouterContainerExtended (dockerCli * dockerClient.Client , masterIp string , routerStatsPort int , reloadInterval int , bindPortsAfterSync , enableIngress bool ) (containerId string , err error ) {
1295
+ func createAndStartRouterContainerExtended (dockerCli * dockerClient.Client , masterIp string , routerStatsPort int , reloadInterval int , bindPortsAfterSync , enableIngress bool , namespaceLabels string ) (containerId string , err error ) {
1285
1296
ports := []string {"80" , "443" }
1286
1297
if routerStatsPort > 0 {
1287
1298
ports = append (ports , fmt .Sprintf ("%d" , routerStatsPort ))
@@ -1319,6 +1330,7 @@ func createAndStartRouterContainerExtended(dockerCli *dockerClient.Client, maste
1319
1330
fmt .Sprintf ("DEFAULT_CERTIFICATE=%s\n %s" , defaultCert , defaultKey ),
1320
1331
fmt .Sprintf ("ROUTER_BIND_PORTS_AFTER_SYNC=%s" , strconv .FormatBool (bindPortsAfterSync )),
1321
1332
fmt .Sprintf ("ROUTER_ENABLE_INGRESS=%s" , strconv .FormatBool (enableIngress )),
1333
+ fmt .Sprintf ("NAMESPACE_LABELS=%s" , namespaceLabels ),
1322
1334
}
1323
1335
1324
1336
reloadIntVar := fmt .Sprintf ("RELOAD_INTERVAL=%ds" , reloadInterval )
@@ -1635,7 +1647,7 @@ func TestRouterBindsPortsAfterSync(t *testing.T) {
1635
1647
1636
1648
bindPortsAfterSync := true
1637
1649
reloadInterval := 1
1638
- routerId , err := createAndStartRouterContainerExtended (dockerCli , fakeMasterAndPod .MasterHttpAddr , statsPort , reloadInterval , bindPortsAfterSync , false )
1650
+ routerId , err := createAndStartRouterContainerExtended (dockerCli , fakeMasterAndPod .MasterHttpAddr , statsPort , reloadInterval , bindPortsAfterSync , defaultEnableIngress , defaultNamespaceLabels )
1639
1651
if err != nil {
1640
1652
t .Fatalf ("Error starting container %s : %v" , getRouterImage (), err )
1641
1653
}
@@ -1696,10 +1708,12 @@ func TestRouterBindsPortsAfterSync(t *testing.T) {
1696
1708
1697
1709
type routerIntegrationTest func (* testing.T , * tr.TestHttpService )
1698
1710
1699
- func runRouterTest (t * testing.T , rit routerIntegrationTest ) {
1711
+ func runRouterTest (t * testing.T , rit routerIntegrationTest , enableIngress bool , namespaceNames * []string ) {
1712
+ namespaceLabels , namespaceListResponse := getNamespaceConfig (t , namespaceNames )
1713
+
1700
1714
//create a server which will act as a user deployed application that
1701
1715
//serves http and https as well as act as a master to simulate watches
1702
- fakeMasterAndPod := tr .NewTestHttpService ( )
1716
+ fakeMasterAndPod := tr .NewTestHttpServiceExtended ( namespaceListResponse )
1703
1717
defer fakeMasterAndPod .Stop ()
1704
1718
1705
1719
err := fakeMasterAndPod .Start ()
@@ -1717,10 +1731,8 @@ func runRouterTest(t *testing.T, rit routerIntegrationTest) {
1717
1731
}
1718
1732
1719
1733
reloadInterval := 1
1720
- bindPortsAfterSync := false
1721
- enableIngress := true
1722
1734
routerId , err := createAndStartRouterContainerExtended (
1723
- dockerCli , fakeMasterAndPod .MasterHttpAddr , statsPort , reloadInterval , bindPortsAfterSync , enableIngress )
1735
+ dockerCli , fakeMasterAndPod .MasterHttpAddr , statsPort , reloadInterval , defaultBindPortsAfterSync , enableIngress , namespaceLabels )
1724
1736
1725
1737
if err != nil {
1726
1738
t .Fatalf ("Error starting container %s : %v" , getRouterImage (), err )
@@ -1731,6 +1743,43 @@ func runRouterTest(t *testing.T, rit routerIntegrationTest) {
1731
1743
rit (t , fakeMasterAndPod )
1732
1744
}
1733
1745
1746
+ func getNamespaceConfig (t * testing.T , namespaceNames * []string ) (namespaceLabels , namespaceListResponse string ) {
1747
+ if namespaceNames == nil {
1748
+ return
1749
+ }
1750
+
1751
+ key := "env"
1752
+ value := "testing"
1753
+
1754
+ // If namespace names are provided (event an empty set), ensure
1755
+ // namespace filtering is exercised by adding namespaces for the
1756
+ // provided names with labels that the router will filter on.
1757
+ namespaceLabels = fmt .Sprintf ("%s=%s" , key , value )
1758
+
1759
+ namespaceList := & kapi.NamespaceList {
1760
+ ListMeta : unversioned.ListMeta {
1761
+ ResourceVersion : fmt .Sprintf ("%d" , len (* namespaceNames )),
1762
+ },
1763
+ Items : []kapi.Namespace {},
1764
+ }
1765
+ for _ , name := range * namespaceNames {
1766
+ namespaceList .Items = append (namespaceList .Items , kapi.Namespace {
1767
+ ObjectMeta : kapi.ObjectMeta {
1768
+ Name : name ,
1769
+ Labels : map [string ]string {key : value },
1770
+ },
1771
+ })
1772
+ }
1773
+
1774
+ obj , err := runtime .Encode (kapi .Codecs .LegacyCodec (kv1 .SchemeGroupVersion ), namespaceList )
1775
+ if err != nil {
1776
+ t .Fatalf ("Unexpected error: %v" , err )
1777
+ }
1778
+ namespaceListResponse = string (obj )
1779
+
1780
+ return
1781
+ }
1782
+
1734
1783
// eventString marshals ingress events into a string. A separate
1735
1784
// method is required because ingress uses a different schema version
1736
1785
// (v1beta1) than routes (v1).
@@ -1748,7 +1797,6 @@ func ingressConfiguredRouter(t *testing.T, fakeMasterAndPod *tr.TestHttpService)
1748
1797
1749
1798
routeAddress := getRouteAddress ()
1750
1799
1751
- namespace := "my-namespace"
1752
1800
serviceName := "my-service"
1753
1801
host := "my.host"
1754
1802
path := fmt .Sprintf ("/%s" , fakeMasterAndPod .PodTestPath )
@@ -1758,7 +1806,7 @@ func ingressConfiguredRouter(t *testing.T, fakeMasterAndPod *tr.TestHttpService)
1758
1806
Object : & kapi.Endpoints {
1759
1807
ObjectMeta : kapi.ObjectMeta {
1760
1808
Name : serviceName ,
1761
- Namespace : namespace ,
1809
+ Namespace : defaultNamespace ,
1762
1810
},
1763
1811
Subsets : []kapi.EndpointSubset {httpEndpoint },
1764
1812
},
@@ -1776,7 +1824,7 @@ func ingressConfiguredRouter(t *testing.T, fakeMasterAndPod *tr.TestHttpService)
1776
1824
Object : & kapi.Secret {
1777
1825
ObjectMeta : kapi.ObjectMeta {
1778
1826
Name : secretName ,
1779
- Namespace : namespace ,
1827
+ Namespace : defaultNamespace ,
1780
1828
},
1781
1829
Data : map [string ][]byte {
1782
1830
"tls.crt" : []byte (defaultCert ),
@@ -1791,7 +1839,7 @@ func ingressConfiguredRouter(t *testing.T, fakeMasterAndPod *tr.TestHttpService)
1791
1839
Object : & extensions.Ingress {
1792
1840
ObjectMeta : kapi.ObjectMeta {
1793
1841
Name : "foo" ,
1794
- Namespace : namespace ,
1842
+ Namespace : defaultNamespace ,
1795
1843
},
1796
1844
Spec : extensions.IngressSpec {
1797
1845
TLS : []extensions.IngressTLS {
@@ -1838,9 +1886,15 @@ func ingressConfiguredRouter(t *testing.T, fakeMasterAndPod *tr.TestHttpService)
1838
1886
if err := waitForRoute (url , host , "https" , nil , tr .HelloPodPath ); err != nil {
1839
1887
t .Fatalf ("Error accessing secured ingress configured route: %v" , err )
1840
1888
}
1889
+
1890
+ // TODO check that an ingress in a namespace not targeted by the router does not
1891
+ // result in exposed routes.
1841
1892
}
1842
1893
1843
1894
// TestRouterIngress validates that an ingress resource can configure a router to expose a tls route.
1844
1895
func TestIngressConfiguredRouter (t * testing.T ) {
1845
- runRouterTest (t , ingressConfiguredRouter )
1896
+ enableIngress := true
1897
+ // Enable namespace filtering to allow validation of compatibility with ingress.
1898
+ namespaceNames := []string {defaultNamespace }
1899
+ runRouterTest (t , ingressConfiguredRouter , enableIngress , & namespaceNames )
1846
1900
}
0 commit comments