diff options
Diffstat (limited to 'tests/mmkubernetes_test_server.py')
-rw-r--r-- | tests/mmkubernetes_test_server.py | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/tests/mmkubernetes_test_server.py b/tests/mmkubernetes_test_server.py new file mode 100644 index 0000000..3f8c384 --- /dev/null +++ b/tests/mmkubernetes_test_server.py @@ -0,0 +1,165 @@ +# Used by the mmkubernetes tests +# This is a simple http server which responds to kubernetes api requests +# and responds with kubernetes api server responses +# added 2018-04-06 by richm, released under ASL 2.0 +import os +import json +import sys + +try: + from http.server import HTTPServer, BaseHTTPRequestHandler +except ImportError: + from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler + +ns_template = '''{{ + "kind": "Namespace", + "apiVersion": "v1", + "metadata": {{ + "name": "{namespace_name}", + "selfLink": "/api/v1/namespaces/{namespace_name}", + "uid": "{namespace_name}-id", + "resourceVersion": "2988", + "creationTimestamp": "2018-04-09T21:56:39Z", + "labels": {{ + "label.1.key":"label 1 value", + "label.2.key":"label 2 value", + "label.with.empty.value":"" + }}, + "annotations": {{ + "k8s.io/description": "", + "k8s.io/display-name": "", + "k8s.io/node-selector": "", + "k8s.io/sa.scc.mcs": "s0:c9,c4", + "k8s.io/sa.scc.supplemental-groups": "1000080000/10000", + "k8s.io/sa.scc.uid-range": "1000080000/10000", + "quota.k8s.io/cluster-resource-override-enabled": "false" + }} + }}, + "spec": {{ + "finalizers": [ + "openshift.io/origin", + "kubernetes" + ] + }}, + "status": {{ + "phase": "Active" + }} +}}''' + +pod_template = '''{{ + "kind": "Pod", + "apiVersion": "v1", + "metadata": {{ + "name": "{pod_name}", + "generateName": "{pod_name}-prefix", + "namespace": "{namespace_name}", + "selfLink": "/api/v1/namespaces/{namespace_name}/pods/{pod_name}", + "uid": "{pod_name}-id", + "resourceVersion": "3486", + "creationTimestamp": "2018-04-09T21:56:39Z", + "labels": {{ + "component": "{pod_name}-component", + "deployment": "{pod_name}-deployment", + "deploymentconfig": "{pod_name}-dc", + "custom.label": "{pod_name}-label-value", + "label.with.empty.value":"" + }}, + "annotations": {{ + "k8s.io/deployment-config.latest-version": "1", + "k8s.io/deployment-config.name": "{pod_name}-dc", + "k8s.io/deployment.name": "{pod_name}-deployment", + "k8s.io/custom.name": "custom value", + "annotation.with.empty.value":"" + }} + }}, + "status": {{ + "phase": "Running", + "hostIP": "172.18.4.32", + "podIP": "10.128.0.14", + "startTime": "2018-04-09T21:57:39Z" + }} +}}''' + +err_template = '''{{ + "kind": "Status", + "apiVersion": "v1", + "metadata": {{ + + }}, + "status": "Failure", + "message": "{kind} \\\"{objectname}\\\" {err}", + "reason": "{reason}", + "details": {{ + "name": "{objectname}", + "kind": "{kind}" + }}, + "code": {code} +}}''' + +is_busy = False + +class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): + + def do_GET(self): + # "http://localhost:18443/api/v1/namespaces/namespace-name2" + # parse url - either /api/v1/namespaces/$ns_name + # or + # /api/v1/namespaces/$ns_name/pods/$pod_name + global is_busy + comps = self.path.split('/') + status = 400 + if len(comps) >= 5 and comps[1] == 'api' and comps[2] == 'v1' and comps[3] == 'namespaces': + resp = None + hsh = {'namespace_name':comps[4],'objectname':comps[4],'kind':'namespace'} + if len(comps) == 5: # namespace + resp_template = ns_template + status = 200 + elif len(comps) == 7 and comps[5] == 'pods': # pod + hsh['pod_name'] = comps[6] + hsh['kind'] = 'pods' + hsh['objectname'] = hsh['pod_name'] + resp_template = pod_template + status = 200 + else: + resp = '{{"error":"do not recognize {0}"}}'.format(self.path) + if hsh['objectname'].endswith('not-found'): + status = 404 + hsh['reason'] = 'NotFound' + hsh['err'] = 'not found' + resp_template = err_template + elif hsh['objectname'].endswith('busy'): + is_busy = not is_busy + if is_busy: + status = 429 + hsh['reason'] = 'Busy' + hsh['err'] = 'server is too busy' + resp_template = err_template + elif hsh['objectname'].endswith('error'): + status = 500 + hsh['reason'] = 'Error' + hsh['err'] = 'server is failing' + resp_template = err_template + if not resp: + hsh['code'] = status + resp = resp_template.format(**hsh) + else: + resp = '{{"error":"do not recognize {0}"}}'.format(self.path) + if not status == 200: + self.log_error(resp) + self.send_response(status) + self.end_headers() + self.wfile.write(json.dumps(json.loads(resp), separators=(',',':')).encode()) + +port = int(sys.argv[1]) + +httpd = HTTPServer(('localhost', port), SimpleHTTPRequestHandler) + +# write "started" to file named in argv[3] +with open(sys.argv[3], "w") as ff: + ff.write("started\n") + +# write pid to file named in argv[2] +with open(sys.argv[2], "w") as ff: + ff.write('{0}\n'.format(os.getpid())) + +httpd.serve_forever() |