Implement back end raw port test container using python.

This commit is contained in:
Patrick J. McNerthney 2020-11-22 10:15:47 -10:00
parent eb9b6d609e
commit fd405e813d
2 changed files with 101 additions and 11 deletions

View File

@ -0,0 +1,41 @@
#!/usr/bin/env python
import select
import socketserver
import sys
import threading
import time
class PortServer:
def __init__(self, port):
self.port = port
self.server = socketserver.ThreadingTCPServer(('0.0.0.0', port), self.handler)
self.server.daemon_threads = True
self.thread = threading.Thread(target=self.server.serve_forever,
name='Port %s Server' % port)
self.thread.daemon = True
self.thread.start()
def handler(self, request, address, server):
threading.current_thread().name = 'Port %s Handler' % self.port
rlist = [request]
echo = b''
while True:
r, w, _x = select.select(rlist, [request] if echo else [], [])
if r:
data = request.recv(1024)
if not data:
break
echo += data
if w:
echo = echo[request.send(echo):]
if __name__ == '__main__':
ports = []
for port in sys.argv[1:]:
ports.append(PortServer(int(port)))
time.sleep(10 * 60)

View File

@ -13,6 +13,7 @@
# under the License.
import json
import os
import select
import socket
import time
@ -167,17 +168,64 @@ class TestClient(unittest.TestCase):
client = api_client.ApiClient(configuration=self.config)
api = core_v1_api.CoreV1Api(client)
with open(os.path.join(os.path.dirname(__file__), 'port_server.py')) as fh:
port_server_py = fh.read()
name = 'portforward-raw-' + short_uuid()
pod_manifest = manifest_with_command(
name,
' '.join((
'((while true;do nc -l -p 1234 -e /bin/cat; done)&);',
'((while true;do nc -l -p 1235 -e /bin/cat; done)&);',
'sleep 60',
))
resp = api.create_namespaced_config_map(
body={
'apiVersion': 'v1',
'kind': 'ConfigMap',
'metadata': {
'name': name,
},
'data': {
'port-server.py': port_server_py,
}
},
namespace='default',
)
resp = api.create_namespaced_pod(
body={
'apiVersion': 'v1',
'kind': 'Pod',
'metadata': {
'name': name
},
'spec': {
'containers': [
{
'name': 'port-server',
'image': 'python',
'command': [
'/opt/port-server.py', '1234', '1235',
],
'volumeMounts': [
{
'name': 'port-server',
'mountPath': '/opt',
'readOnly': True,
},
],
'startupProbe': {
'tcpSocket': {
'port': 1234,
},
},
},
],
'volumes': [
{
'name': 'port-server',
'configMap': {
'name': name,
'defaultMode': 0o777,
},
},
],
},
},
namespace='default',
)
resp = api.create_namespaced_pod(body=pod_manifest,
namespace='default')
self.assertEqual(name, resp.metadata.name)
self.assertTrue(resp.status.phase)
@ -189,6 +237,7 @@ class TestClient(unittest.TestCase):
if resp.status.phase != 'Pending':
break
time.sleep(1)
self.assertEqual(resp.status.phase, 'Running')
pf = portforward(api.connect_get_namespaced_pod_portforward,
name, 'default',
@ -251,8 +300,8 @@ class TestClient(unittest.TestCase):
self.assertIsNone(pf.error(1234))
self.assertIsNone(pf.error(1235))
resp = api.delete_namespaced_pod(name=name, body={},
namespace='default')
resp = api.delete_namespaced_pod(name=name, namespace='default')
resp = api.delete_namespaced_config_map(name=name, namespace='default')
def test_portforward_http(self):
client = api_client.ApiClient(configuration=self.config)