diff options
author | Joshua Harlow <jxharlow@godaddy.com> | 2016-04-29 20:49:28 -0500 |
---|---|---|
committer | Joshua Harlow <jxharlow@godaddy.com> | 2016-05-09 13:23:37 -0700 |
commit | 315b9a82618e612c0d0c2964cdecea219fe33687 (patch) | |
tree | f2e4b33ccc76c668a68a9ad10768359f6220e878 | |
parent | d5974a05f7aa9b8d5406003f1fb9ac6290fe6f0e (diff) | |
download | oslo-middleware-315b9a82618e612c0d0c2964cdecea219fe33687.tar.gz |
Add a simple __main__ to easily show healthcheck output
Seems like not many people know what the detailed output
of this thing does, so in order to make it easier to see
that add a simple __main__ entrypoint.
Change-Id: Ife3b49c29df7d3558efebb4584971cf69bc8359d
-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): |