Merge "[CORD-967] Added status codes for unauthorized and forbidden"
diff --git a/main.py b/main.py
index 9c5912c..d394c4e 100755
--- a/main.py
+++ b/main.py
@@ -47,7 +47,8 @@
     internal_host_address=os.environ.get('INTERNAL_HOST_ADDRESS',
                                          get_my_primary_local_ipv4()),
     rest_port=os.environ.get('REST_PORT', 8881),
-    work_dir=os.environ.get('WORK_DIR', '/tmp/chameleon')
+    work_dir=os.environ.get('WORK_DIR', '/tmp/chameleon'),
+    swagger_url=os.environ.get('SWAGGER_URL', '/'),
 )
 
 
@@ -159,6 +160,14 @@
                         default=False,
                         help=_help)
 
+    _help = ('override swagger url (default=%s)'
+             % defs['swagger_url'])
+    parser.add_argument('-S', '--swagger-url',
+                        dest='swagger_url',
+                        action='store',
+                        default=defs['swagger_url'],
+                        help=_help)
+
     args = parser.parse_args()
 
     # post-processing
@@ -227,7 +236,7 @@
             self.grpc_client = yield \
                 GrpcClient(args.consul, args.work_dir, args.grpc_endpoint)
             self.rest_server = yield \
-                WebServer(args.rest_port, args.work_dir, self.grpc_client).start()
+                WebServer(args.rest_port, args.work_dir, args.swagger_url, self.grpc_client).start()
             self.grpc_client.set_reconnect_callback(
                 self.rest_server.reload_generated_routes).start()
             self.log.info('started-internal-services')
diff --git a/web_server/web_server.py b/web_server/web_server.py
index 5cd5c7a..7676b42 100644
--- a/web_server/web_server.py
+++ b/web_server/web_server.py
@@ -37,11 +37,12 @@
 
     app = Klein()
 
-    def __init__(self, port, work_dir, grpc_client):
+    def __init__(self, port, work_dir, swagger_url, grpc_client):
         self.port = port
         self.site = None
         self.work_dir = work_dir
         self.grpc_client = grpc_client
+        self.swagger_url = swagger_url
 
         self.swagger_ui_root_dir = os.path.abspath(
             os.path.join(os.path.dirname(__file__), '../swagger_ui'))
@@ -49,6 +50,26 @@
         self.tcp_port = None
         self.shutting_down = False
 
+        self.add_swagger_routes(self.app, swagger_url)
+
+    def add_swagger_routes(self, app, swagger_url):
+        log.info('Publishing swagger docs at %s' % swagger_url)
+
+        @app.route(swagger_url + '/', branch=True)
+        def static(self, request):
+            try:
+                log.debug(request=request)
+                return File(self.swagger_ui_root_dir)
+            except Exception, e:
+                log.exception('file-not-found', request=request)
+
+        @app.route(swagger_url + '/v1/swagger.json')
+        def swagger_json(self, request):
+            try:
+                return File(os.path.join(self.work_dir, 'swagger.json'))
+            except Exception, e:
+                log.exception('file-not-found', request=request)
+
     @inlineCallbacks
     def start(self):
         log.debug('starting')
@@ -82,25 +103,6 @@
                 m.add_routes(self.app, self.grpc_client)
                 log.info('routes-loaded', module=module_name)
 
-    # static swagger_ui website as landing page (for now)
-
-    @app.route('/', branch=True)
-    def static(self, request):
-        try:
-            log.debug(request=request)
-            return File(self.swagger_ui_root_dir)
-        except Exception, e:
-            log.exception('file-not-found', request=request)
-
-    # static swagger.json file to serve the schema
-
-    @app.route('/v1/swagger.json')
-    def swagger_json(self, request):
-        try:
-            return File(os.path.join(self.work_dir, 'swagger.json'))
-        except Exception, e:
-            log.exception('file-not-found', request=request)
-
     @app.handle_errors(grpc._channel._Rendezvous)
     def grpc_exception(self, request, failure):
         code = failure.value.code()