Skip to content

Commit 49a59d7

Browse files
authored
Merge pull request #1329 from iciclespider/master
Implement back end raw port test container using python.
2 parents eb9b6d6 + fd405e8 commit 49a59d7

File tree

2 files changed

+101
-11
lines changed

2 files changed

+101
-11
lines changed

kubernetes/e2e_test/port_server.py

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/usr/bin/env python
2+
3+
import select
4+
import socketserver
5+
import sys
6+
import threading
7+
import time
8+
9+
10+
class PortServer:
11+
def __init__(self, port):
12+
self.port = port
13+
self.server = socketserver.ThreadingTCPServer(('0.0.0.0', port), self.handler)
14+
self.server.daemon_threads = True
15+
self.thread = threading.Thread(target=self.server.serve_forever,
16+
name='Port %s Server' % port)
17+
self.thread.daemon = True
18+
self.thread.start()
19+
20+
21+
def handler(self, request, address, server):
22+
threading.current_thread().name = 'Port %s Handler' % self.port
23+
rlist = [request]
24+
echo = b''
25+
while True:
26+
r, w, _x = select.select(rlist, [request] if echo else [], [])
27+
if r:
28+
data = request.recv(1024)
29+
if not data:
30+
break
31+
echo += data
32+
if w:
33+
echo = echo[request.send(echo):]
34+
35+
36+
if __name__ == '__main__':
37+
ports = []
38+
for port in sys.argv[1:]:
39+
ports.append(PortServer(int(port)))
40+
time.sleep(10 * 60)
41+

kubernetes/e2e_test/test_client.py

+60-11
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# under the License.
1414

1515
import json
16+
import os
1617
import select
1718
import socket
1819
import time
@@ -167,17 +168,64 @@ def test_portforward_raw(self):
167168
client = api_client.ApiClient(configuration=self.config)
168169
api = core_v1_api.CoreV1Api(client)
169170

171+
with open(os.path.join(os.path.dirname(__file__), 'port_server.py')) as fh:
172+
port_server_py = fh.read()
170173
name = 'portforward-raw-' + short_uuid()
171-
pod_manifest = manifest_with_command(
172-
name,
173-
' '.join((
174-
'((while true;do nc -l -p 1234 -e /bin/cat; done)&);',
175-
'((while true;do nc -l -p 1235 -e /bin/cat; done)&);',
176-
'sleep 60',
177-
))
174+
resp = api.create_namespaced_config_map(
175+
body={
176+
'apiVersion': 'v1',
177+
'kind': 'ConfigMap',
178+
'metadata': {
179+
'name': name,
180+
},
181+
'data': {
182+
'port-server.py': port_server_py,
183+
}
184+
},
185+
namespace='default',
186+
)
187+
resp = api.create_namespaced_pod(
188+
body={
189+
'apiVersion': 'v1',
190+
'kind': 'Pod',
191+
'metadata': {
192+
'name': name
193+
},
194+
'spec': {
195+
'containers': [
196+
{
197+
'name': 'port-server',
198+
'image': 'python',
199+
'command': [
200+
'/opt/port-server.py', '1234', '1235',
201+
],
202+
'volumeMounts': [
203+
{
204+
'name': 'port-server',
205+
'mountPath': '/opt',
206+
'readOnly': True,
207+
},
208+
],
209+
'startupProbe': {
210+
'tcpSocket': {
211+
'port': 1234,
212+
},
213+
},
214+
},
215+
],
216+
'volumes': [
217+
{
218+
'name': 'port-server',
219+
'configMap': {
220+
'name': name,
221+
'defaultMode': 0o777,
222+
},
223+
},
224+
],
225+
},
226+
},
227+
namespace='default',
178228
)
179-
resp = api.create_namespaced_pod(body=pod_manifest,
180-
namespace='default')
181229
self.assertEqual(name, resp.metadata.name)
182230
self.assertTrue(resp.status.phase)
183231

@@ -189,6 +237,7 @@ def test_portforward_raw(self):
189237
if resp.status.phase != 'Pending':
190238
break
191239
time.sleep(1)
240+
self.assertEqual(resp.status.phase, 'Running')
192241

193242
pf = portforward(api.connect_get_namespaced_pod_portforward,
194243
name, 'default',
@@ -251,8 +300,8 @@ def test_portforward_raw(self):
251300
self.assertIsNone(pf.error(1234))
252301
self.assertIsNone(pf.error(1235))
253302

254-
resp = api.delete_namespaced_pod(name=name, body={},
255-
namespace='default')
303+
resp = api.delete_namespaced_pod(name=name, namespace='default')
304+
resp = api.delete_namespaced_config_map(name=name, namespace='default')
256305

257306
def test_portforward_http(self):
258307
client = api_client.ApiClient(configuration=self.config)

0 commit comments

Comments
 (0)