Browse code

Bug 1390173 - Test more pod to pod connectivity test combinations

Created 2 isolated and 2 global namespaces on every node, so that pod to pod connectivity
tests can be performed among same/different namespaces, same/different nodes and global/non-global pods.

Ravi Sankar Penta authored on 2016/11/02 09:48:51
Showing 5 changed files
... ...
@@ -18,7 +18,7 @@ import (
18 18
 )
19 19
 
20 20
 func (d *NetworkDiagnostic) CollectNetworkPodLogs() error {
21
-	podList, err := d.getPodList(d.nsName, util.NetworkDiagPodNamePrefix)
21
+	podList, err := d.getPodList(d.nsName1, util.NetworkDiagPodNamePrefix)
22 22
 	if err != nil {
23 23
 		return err
24 24
 	}
... ...
@@ -42,7 +42,7 @@ func (d *NetworkDiagnostic) CollectNetworkInfo(diagsFailed bool) error {
42 42
 		l.LogMaster()
43 43
 	}
44 44
 
45
-	podList, err := d.getPodList(d.nsName, util.NetworkDiagPodNamePrefix)
45
+	podList, err := d.getPodList(d.nsName1, util.NetworkDiagPodNamePrefix)
46 46
 	if err != nil {
47 47
 		return err
48 48
 	}
... ...
@@ -31,11 +31,13 @@ type NetworkDiagnostic struct {
31 31
 	PreventModification bool
32 32
 	LogDir              string
33 33
 
34
-	pluginName   string
35
-	nodes        []kapi.Node
36
-	nsName       string
37
-	globalnsName string
38
-	res          types.DiagnosticResult
34
+	pluginName    string
35
+	nodes         []kapi.Node
36
+	nsName1       string
37
+	nsName2       string
38
+	globalnsName1 string
39
+	globalnsName2 string
40
+	res           types.DiagnosticResult
39 41
 }
40 42
 
41 43
 // Name is part of the Diagnostic interface and just returns name.
... ...
@@ -118,7 +120,7 @@ func (d *NetworkDiagnostic) runNetworkDiagnostic() {
118 118
 		return
119 119
 	}
120 120
 	// Wait for network diagnostic pod completion
121
-	if err := d.waitForNetworkPod(d.nsName, util.NetworkDiagPodNamePrefix, []kapi.PodPhase{kapi.PodSucceeded, kapi.PodFailed}); err != nil {
121
+	if err := d.waitForNetworkPod(d.nsName1, util.NetworkDiagPodNamePrefix, []kapi.PodPhase{kapi.PodSucceeded, kapi.PodFailed}); err != nil {
122 122
 		d.res.Error("DNet2007", err, err.Error())
123 123
 		return
124 124
 	}
... ...
@@ -137,7 +139,7 @@ func (d *NetworkDiagnostic) runNetworkDiagnostic() {
137 137
 	}
138 138
 
139 139
 	// Wait for network diagnostic pod to start
140
-	if err := d.waitForNetworkPod(d.nsName, util.NetworkDiagPodNamePrefix, []kapi.PodPhase{kapi.PodRunning, kapi.PodFailed, kapi.PodSucceeded}); err != nil {
140
+	if err := d.waitForNetworkPod(d.nsName1, util.NetworkDiagPodNamePrefix, []kapi.PodPhase{kapi.PodRunning, kapi.PodFailed, kapi.PodSucceeded}); err != nil {
141 141
 		d.res.Error("DNet2010", err, err.Error())
142 142
 		// Do not bail out here, collect what ever info is available from all valid nodes
143 143
 	}
... ...
@@ -157,7 +159,7 @@ func (d *NetworkDiagnostic) runNetworkPod(command []string) error {
157 157
 		podName := kapi.SimpleNameGenerator.GenerateName(fmt.Sprintf("%s-", util.NetworkDiagPodNamePrefix))
158 158
 
159 159
 		pod := GetNetworkDiagnosticsPod(command, podName, node.Name)
160
-		_, err := d.KubeClient.Pods(d.nsName).Create(pod)
160
+		_, err := d.KubeClient.Pods(d.nsName1).Create(pod)
161 161
 		if err != nil {
162 162
 			return fmt.Errorf("Creating network diagnostic pod %q on node %q with command %q failed: %v", podName, node.Name, strings.Join(command, " "), err)
163 163
 		}
... ...
@@ -20,12 +20,15 @@ import (
20 20
 )
21 21
 
22 22
 func (d *NetworkDiagnostic) TestSetup() error {
23
-	d.nsName = kapi.SimpleNameGenerator.GenerateName(fmt.Sprintf("%s-", util.NetworkDiagNamespacePrefix))
23
+	d.nsName1 = kapi.SimpleNameGenerator.GenerateName(fmt.Sprintf("%s-", util.NetworkDiagNamespacePrefix))
24
+	d.nsName2 = kapi.SimpleNameGenerator.GenerateName(fmt.Sprintf("%s-", util.NetworkDiagNamespacePrefix))
24 25
 
25
-	nsList := []string{d.nsName}
26
+	nsList := []string{d.nsName1, d.nsName2}
26 27
 	if sdnapi.IsOpenShiftMultitenantNetworkPlugin(d.pluginName) {
27
-		d.globalnsName = kapi.SimpleNameGenerator.GenerateName(fmt.Sprintf("%s-", util.NetworkDiagGlobalNamespacePrefix))
28
-		nsList = append(nsList, d.globalnsName)
28
+		d.globalnsName1 = kapi.SimpleNameGenerator.GenerateName(fmt.Sprintf("%s-", util.NetworkDiagGlobalNamespacePrefix))
29
+		nsList = append(nsList, d.globalnsName1)
30
+		d.globalnsName2 = kapi.SimpleNameGenerator.GenerateName(fmt.Sprintf("%s-", util.NetworkDiagGlobalNamespacePrefix))
31
+		nsList = append(nsList, d.globalnsName2)
29 32
 	}
30 33
 
31 34
 	for _, name := range nsList {
... ...
@@ -49,7 +52,7 @@ func (d *NetworkDiagnostic) TestSetup() error {
49 49
 	secret := &kapi.Secret{}
50 50
 	secret.Name = util.NetworkDiagSecretName
51 51
 	secret.Data = map[string][]byte{strings.ToLower(kclientcmd.RecommendedConfigPathEnvVar): kconfigData}
52
-	if _, err = d.KubeClient.Secrets(d.nsName).Create(secret); err != nil {
52
+	if _, err = d.KubeClient.Secrets(d.nsName1).Create(secret); err != nil {
53 53
 		return fmt.Errorf("Creating secret %q failed: %v", secret.Name, err)
54 54
 	}
55 55
 
... ...
@@ -67,8 +70,10 @@ func (d *NetworkDiagnostic) TestSetup() error {
67 67
 
68 68
 func (d *NetworkDiagnostic) Cleanup() {
69 69
 	// Deleting namespaces will delete corresponding service accounts/pods in the namespace automatically.
70
-	d.KubeClient.Namespaces().Delete(d.nsName)
71
-	d.KubeClient.Namespaces().Delete(d.globalnsName)
70
+	d.KubeClient.Namespaces().Delete(d.nsName1)
71
+	d.KubeClient.Namespaces().Delete(d.nsName2)
72
+	d.KubeClient.Namespaces().Delete(d.globalnsName1)
73
+	d.KubeClient.Namespaces().Delete(d.globalnsName2)
72 74
 }
73 75
 
74 76
 func (d *NetworkDiagnostic) getPodList(nsName, prefix string) (*kapi.PodList, error) {
... ...
@@ -92,31 +92,31 @@ func (d CheckPodNetwork) Check() types.DiagnosticResult {
92 92
 
93 93
 func (d CheckPodNetwork) checkDifferentNodePodToPodConnection(localGlobalPods, localNonGlobalPods, nonlocalGlobalPods, nonlocalNonGlobalPods []kapi.Pod) {
94 94
 	// Applicable to flat and multitenant networks
95
-	d.checkConnection(localGlobalPods, nonlocalGlobalPods, fmt.Sprintf("Skipping pod connectivity test for global projects on different nodes. Reason: Couldn't find 2 global pods."))
95
+	d.checkConnection(localGlobalPods, nonlocalGlobalPods, fmt.Sprintf("Skipping pod connectivity test for global projects on different nodes. Reason: Couldn't find 2 global pods."), true)
96 96
 
97 97
 	// Applicable to multitenant network
98 98
 	isMultitenant := (d.vnidMap != nil)
99 99
 	if isMultitenant {
100
-		d.checkConnection(localNonGlobalPods, nonlocalNonGlobalPods, fmt.Sprintf("Skipping pod connectivity test for non-global projects on different nodes. Reason: Couldn't find 2 non-global pods."))
100
+		d.checkConnection(localNonGlobalPods, nonlocalNonGlobalPods, fmt.Sprintf("Skipping pod connectivity test for non-global projects on different nodes. Reason: Couldn't find 2 non-global pods."), true)
101 101
 
102
-		d.checkConnection(localGlobalPods, nonlocalNonGlobalPods, fmt.Sprintf("Skipping pod connectivity test between global to non-global projects on different nodes. Reason: Couldn't find global and/or non-global pod."))
102
+		d.checkConnection(localGlobalPods, nonlocalNonGlobalPods, fmt.Sprintf("Skipping pod connectivity test between global to non-global projects on different nodes. Reason: Couldn't find global and/or non-global pod."), false)
103 103
 	}
104 104
 }
105 105
 
106 106
 func (d CheckPodNetwork) checkSameNodePodToPodConnection(globalPods, nonGlobalPods []kapi.Pod) {
107 107
 	// Applicable to both flat and multitenant networks
108
-	d.checkConnection(globalPods, globalPods, fmt.Sprintf("Skipping pod connectivity test for global projects on the same node. Reason: Couldn't find 2 global pods."))
108
+	d.checkConnection(globalPods, globalPods, fmt.Sprintf("Skipping pod connectivity test for global projects on the same node. Reason: Couldn't find 2 global pods."), true)
109 109
 
110 110
 	// Applicable to multitenant network
111 111
 	isMultitenant := (d.vnidMap != nil)
112 112
 	if isMultitenant {
113
-		d.checkConnection(nonGlobalPods, nonGlobalPods, fmt.Sprintf("Skipping pod connectivity test for non-global projects on the same node. Reason: Couldn't find 2 non-global pods."))
113
+		d.checkConnection(nonGlobalPods, nonGlobalPods, fmt.Sprintf("Skipping pod connectivity test for non-global projects on the same node. Reason: Couldn't find 2 non-global pods."), true)
114 114
 
115
-		d.checkConnection(globalPods, nonGlobalPods, fmt.Sprintf("Skipping pod connectivity test between global to non-global projects on the same node. Reason: Couldn't find global and/or non-global pod."))
115
+		d.checkConnection(globalPods, nonGlobalPods, fmt.Sprintf("Skipping pod connectivity test between global to non-global projects on the same node. Reason: Couldn't find global and/or non-global pod."), false)
116 116
 	}
117 117
 }
118 118
 
119
-func (d CheckPodNetwork) checkConnection(pods1, pods2 []kapi.Pod, warnMsg string) {
119
+func (d CheckPodNetwork) checkConnection(pods1, pods2 []kapi.Pod, warnMsg string, checkSameNamespace bool) {
120 120
 	minCount := 1
121 121
 	if len(pods1) > 0 && len(pods2) > 0 && (pods1[0].UID == pods2[0].UID) {
122 122
 		minCount += 1
... ...
@@ -148,6 +148,13 @@ func (d CheckPodNetwork) checkConnection(pods1, pods2 []kapi.Pod, warnMsg string
148 148
 			}
149 149
 		}
150 150
 	}
151
+
152
+	if checkSameNamespace && !sameNamespace {
153
+		d.res.Warn("DPodNet1010", nil, fmt.Sprintf("Same Namespace: %s", warnMsg))
154
+	}
155
+	if !diffNamespace {
156
+		d.res.Warn("DPodNet1011", nil, fmt.Sprintf("Different namespaces: %s", warnMsg))
157
+	}
151 158
 }
152 159
 
153 160
 // checkPodToPodConnection verifies connection from fromPod to toPod.
... ...
@@ -132,6 +132,13 @@ func (d CheckServiceNetwork) checkConnection(pods []kapi.Pod, services []kapi.Se
132 132
 			}
133 133
 		}
134 134
 	}
135
+
136
+	if !sameNamespace {
137
+		d.res.Warn("DSvcNet1012", nil, fmt.Sprintf("Same Namespace: %s", warnMsg))
138
+	}
139
+	if !diffNamespace {
140
+		d.res.Warn("DSvcNet1013", nil, fmt.Sprintf("Different namespaces: %s", warnMsg))
141
+	}
135 142
 }
136 143
 
137 144
 func getAllServices(kubeClient *kclient.Client) ([]kapi.Service, error) {