diff options
-rw-r--r-- | oslo_middleware/healthcheck/__main__.py | 69 | ||||
-rw-r--r-- | oslo_middleware/tests/test_healthcheck.py | 24 |
2 files changed, 93 insertions, 0 deletions
diff --git a/oslo_middleware/healthcheck/__main__.py b/oslo_middleware/healthcheck/__main__.py new file mode 100644 index 0000000..217fff6 --- /dev/null +++ b/oslo_middleware/healthcheck/__main__.py @@ -0,0 +1,69 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import argparse + +from six.moves import SimpleHTTPServer # noqa +from six.moves import socketserver +import webob + +from oslo_middleware import healthcheck + + +class HttpHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): + def do_GET(self): + @webob.dec.wsgify + def dummy_application(req): + return 'test' + app = healthcheck.Healthcheck(dummy_application, {'detailed': True}) + req = webob.Request.blank("/healthcheck", accept='text/html', + method='GET') + res = req.get_response(app) + self.send_response(res.status_code) + for header_name, header_value in res.headerlist: + self.send_header(header_name, header_value) + self.end_headers() + self.wfile.write(res.body) + self.wfile.close() + + +def positive_int(blob): + value = int(blob) + if value < 0: + msg = "%r is not a positive integer" % blob + raise argparse.ArgumentTypeError(msg) + return value + + +def create_server(port=0): + handler = HttpHandler + server = socketserver.TCPServer(("", port), handler) + return server + + +def main(args=None): + """Runs a basic http server to show healthcheck functionality.""" + parser = argparse.ArgumentParser() + parser.add_argument("-p", "--port", + help="Unused port to run the tiny" + " http server on (or zero to select a" + " random unused port)", + type=positive_int, required=True) + args = parser.parse_args(args=args) + server = create_server(args.port) + print("Serving at port: %s" % server.server_address[1]) + server.serve_forever() + + +if __name__ == '__main__': + main() diff --git a/oslo_middleware/tests/test_healthcheck.py b/oslo_middleware/tests/test_healthcheck.py index 3ffb03f..19fc63a 100644 --- a/oslo_middleware/tests/test_healthcheck.py +++ b/oslo_middleware/tests/test_healthcheck.py @@ -13,12 +13,36 @@ # License for the specific language governing permissions and limitations # under the License. +import threading +import time + import mock from oslotest import base as test_base +import requests import webob.dec import webob.exc from oslo_middleware import healthcheck +from oslo_middleware.healthcheck import __main__ + + +class HealthcheckMainTests(test_base.BaseTestCase): + + def test_startup_response(self): + server = __main__.create_server(0) + th = threading.Thread(target=server.serve_forever) + th.start() + self.addCleanup(server.shutdown) + while True: + try: + r = requests.get("http://%s:%s" % (server.server_address[0], + server.server_address[1])) + except requests.ConnectionError: + # Server hasn't started up yet, try again in a few. + time.sleep(1) + else: + self.assertEqual(200, r.status_code) + break class HealthcheckTests(test_base.BaseTestCase): |