Initial code for pecan framework 23/30223/6
authorHong Hui Xiao <honghui_xiao@yeah.net>
Mon, 5 Feb 2018 07:55:58 +0000 (15:55 +0800)
committerHong Hui Xiao <honghui_xiao@yeah.net>
Thu, 8 Mar 2018 04:02:10 +0000 (12:02 +0800)
This patch introduces pecan framework to multicloud. The number
of processes equals to the number of CPU cores.

The swagger json url has been implemented in this patch.

../api/multicloud/v0/swagger.json

Change-Id: Icd0ebd9f275c2f066295ec3c2723d995d71ef632
Issue-ID: MULTICLOUD-150
Signed-off-by: Hong Hui Xiao <honghui_xiao@yeah.net>
multivimbroker/multivimbroker/api_v2/__init__.py [new file with mode: 0644]
multivimbroker/multivimbroker/api_v2/api_router/__init__.py [new file with mode: 0644]
multivimbroker/multivimbroker/api_v2/api_router/root.py [new file with mode: 0644]
multivimbroker/multivimbroker/api_v2/api_router/v0_controller.py [new file with mode: 0644]
multivimbroker/multivimbroker/api_v2/app.py [new file with mode: 0644]
multivimbroker/multivimbroker/api_v2/service.py [new file with mode: 0644]
multivimbroker/multivimbroker/scripts/__init__.py [new file with mode: 0644]
multivimbroker/multivimbroker/scripts/api.py [new file with mode: 0644]
multivimbroker/multivimbroker/swagger/utils.py [new file with mode: 0644]
multivimbroker/multivimbroker/swagger/views.py

diff --git a/multivimbroker/multivimbroker/api_v2/__init__.py b/multivimbroker/multivimbroker/api_v2/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/multivimbroker/multivimbroker/api_v2/api_router/__init__.py b/multivimbroker/multivimbroker/api_v2/api_router/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/multivimbroker/multivimbroker/api_v2/api_router/root.py b/multivimbroker/multivimbroker/api_v2/api_router/root.py
new file mode 100644 (file)
index 0000000..0f98e93
--- /dev/null
@@ -0,0 +1,27 @@
+#    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.
+
+from pecan import rest
+
+from multivimbroker.api_v2.api_router import v0_controller
+
+
+class MultiCloudController(rest.RestController):
+    v0 = v0_controller.V0_Controller()
+
+
+class APIController(rest.RestController):
+    multicloud = MultiCloudController()
+
+
+class RootController(object):
+    api = APIController()
diff --git a/multivimbroker/multivimbroker/api_v2/api_router/v0_controller.py b/multivimbroker/multivimbroker/api_v2/api_router/v0_controller.py
new file mode 100644 (file)
index 0000000..10922e5
--- /dev/null
@@ -0,0 +1,22 @@
+#    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 pecan
+
+from multivimbroker.swagger import utils
+
+
+class V0_Controller(object):
+
+    @pecan.expose('json', route="swagger.json")
+    def swagger_json(self):
+        return utils.get_swagger_json_data()
diff --git a/multivimbroker/multivimbroker/api_v2/app.py b/multivimbroker/multivimbroker/api_v2/app.py
new file mode 100644 (file)
index 0000000..86777ee
--- /dev/null
@@ -0,0 +1,33 @@
+#    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 pecan
+
+
+def setup_app(config=None):
+    app_conf = {
+        'root': "multivimbroker.api_v2.api_router.root.RootController",
+        'modules': ["multivimbroker.api_v2"],
+        'debug': True,
+        # NOTE: By default, guess_content_type_from_ext is True, and Pecan will
+        # strip the file extension from url. For example, ../../swagger.json
+        # will look like ../../swagger to Pecan API router. This makes other
+        # url like ../../swagger.txt get the same API route. Set this to False
+        # to do strict url mapping.
+        'guess_content_type_from_ext': False
+    }
+    app = pecan.make_app(
+        app_conf.pop('root'),
+        **app_conf
+    )
+
+    return app
diff --git a/multivimbroker/multivimbroker/api_v2/service.py b/multivimbroker/multivimbroker/api_v2/service.py
new file mode 100644 (file)
index 0000000..228cc63
--- /dev/null
@@ -0,0 +1,52 @@
+#    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.
+
+from oslo_concurrency import processutils
+from oslo_config import cfg
+from oslo_service import service
+from oslo_service import wsgi
+
+from multivimbroker.api_v2 import app
+
+
+CONF = cfg.CONF
+
+
+class WSGIService(service.ServiceBase):
+    """Provides ability to launch API from wsgi app."""
+
+    def __init__(self):
+        self.app = app.setup_app()
+
+        self.workers = processutils.get_worker_count()
+
+        self.server = wsgi.Server(
+            CONF,
+            "multivimbroker",
+            self.app,
+            # TODO(xiaohhui): these should be configurable.
+            host="0.0.0.0",
+            port="9002",
+            use_ssl=False
+        )
+
+    def start(self):
+        self.server.start()
+
+    def stop(self):
+        self.server.stop()
+
+    def wait(self):
+        self.server.wait()
+
+    def reset(self):
+        self.server.reset()
diff --git a/multivimbroker/multivimbroker/scripts/__init__.py b/multivimbroker/multivimbroker/scripts/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/multivimbroker/multivimbroker/scripts/api.py b/multivimbroker/multivimbroker/scripts/api.py
new file mode 100644 (file)
index 0000000..01b69a2
--- /dev/null
@@ -0,0 +1,35 @@
+#    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 eventlet
+eventlet.monkey_patch()
+
+from oslo_config import cfg # noqa
+from oslo_service import service # noqa
+import sys # noqa
+
+from multivimbroker.api_v2 import service as api_service # noqa
+
+
+def main():
+    try:
+        api_server = api_service.WSGIService()
+        launcher = service.launch(cfg.CONF,
+                                  api_server,
+                                  workers=api_server.workers)
+        launcher.wait()
+    except RuntimeError as excp:
+        sys.stderr.write("ERROR: %s\n" % excp)
+        sys.exit(1)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/multivimbroker/multivimbroker/swagger/utils.py b/multivimbroker/multivimbroker/swagger/utils.py
new file mode 100644 (file)
index 0000000..05c92da
--- /dev/null
@@ -0,0 +1,94 @@
+# Copyright (c) 2017 Wind River Systems, Inc.
+# Copyright (c) 2017-2018 VMware, Inc.
+#
+# 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.
+
+import json
+import os
+
+
+def get_swagger_json_data():
+    json_file = os.path.join(os.path.dirname(__file__),
+                             'multivim.flavor.swagger.json')
+    f = open(json_file)
+    json_data = json.JSONDecoder().decode(f.read())
+    f.close()
+    json_file = os.path.join(os.path.dirname(__file__),
+                             'multivim.image.swagger.json')
+    f = open(json_file)
+    json_data_temp = json.JSONDecoder().decode(f.read())
+    f.close()
+    json_data["paths"].update(json_data_temp["paths"])
+    json_data["definitions"].update(json_data_temp["definitions"])
+    json_file = os.path.join(os.path.dirname(__file__),
+                             'multivim.network.swagger.json')
+    f = open(json_file)
+    json_data_temp = json.JSONDecoder().decode(f.read())
+    f.close()
+    json_data["paths"].update(json_data_temp["paths"])
+    json_data["definitions"].update(json_data_temp["definitions"])
+    json_file = os.path.join(os.path.dirname(__file__),
+                             'multivim.subnet.swagger.json')
+    f = open(json_file)
+    json_data_temp = json.JSONDecoder().decode(f.read())
+    f.close()
+    json_data["paths"].update(json_data_temp["paths"])
+    json_data["definitions"].update(json_data_temp["definitions"])
+    json_file = os.path.join(os.path.dirname(__file__),
+                             'multivim.server.swagger.json')
+    f = open(json_file)
+    json_data_temp = json.JSONDecoder().decode(f.read())
+    f.close()
+    json_data["paths"].update(json_data_temp["paths"])
+    json_data["definitions"].update(json_data_temp["definitions"])
+    json_file = os.path.join(os.path.dirname(__file__),
+                             'multivim.volume.swagger.json')
+    f = open(json_file)
+    json_data_temp = json.JSONDecoder().decode(f.read())
+    f.close()
+    json_data["paths"].update(json_data_temp["paths"])
+    json_data["definitions"].update(json_data_temp["definitions"])
+    json_file = os.path.join(os.path.dirname(__file__),
+                             'multivim.vport.swagger.json')
+    f = open(json_file)
+    json_data_temp = json.JSONDecoder().decode(f.read())
+    f.close()
+    json_data["paths"].update(json_data_temp["paths"])
+    json_data["definitions"].update(json_data_temp["definitions"])
+    json_file = os.path.join(os.path.dirname(__file__),
+                             'multivim.tenant.swagger.json')
+    f = open(json_file)
+    json_data_temp = json.JSONDecoder().decode(f.read())
+    f.close()
+    json_data["paths"].update(json_data_temp["paths"])
+    json_data["definitions"].update(json_data_temp["definitions"])
+    json_file = os.path.join(os.path.dirname(__file__),
+                             'multivim.host.swagger.json')
+    f = open(json_file)
+    json_data_temp = json.JSONDecoder().decode(f.read())
+    f.close()
+    json_data["paths"].update(json_data_temp["paths"])
+    json_data["definitions"].update(json_data_temp["definitions"])
+    json_file = os.path.join(os.path.dirname(__file__),
+                             'multivim.limit.swagger.json')
+    f = open(json_file)
+    json_data_temp = json.JSONDecoder().decode(f.read())
+    f.close()
+    json_data["paths"].update(json_data_temp["paths"])
+    json_data["definitions"].update(json_data_temp["definitions"])
+    json_file = os.path.join(os.path.dirname(__file__),
+                             'multivim.identity.swagger.json')
+    f = open(json_file)
+    json_data_temp = json.JSONDecoder().decode(f.read())
+    f.close()
+    json_data["paths"].update(json_data_temp["paths"])
+    json_data["definitions"].update(json_data_temp["definitions"])
+
+    return json_data
index 00cf297..6897270 100644 (file)
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
-import json
-import logging
-import os
-# import traceback
 
 # from rest_framework import status
 from rest_framework.response import Response
 from rest_framework.views import APIView
 
-# from multivimbroker.pub.exceptions import VimBrokerException
-
-logger = logging.getLogger(__name__)
+from multivimbroker.swagger import utils
 
 
 class SwaggerJsonView(APIView):
     def get(self, request):
-        json_file = os.path.join(os.path.dirname(__file__),
-                                 'multivim.flavor.swagger.json')
-        f = open(json_file)
-        json_data = json.JSONDecoder().decode(f.read())
-        f.close()
-        json_file = os.path.join(os.path.dirname(__file__),
-                                 'multivim.image.swagger.json')
-        f = open(json_file)
-        json_data_temp = json.JSONDecoder().decode(f.read())
-        f.close()
-        json_data["paths"].update(json_data_temp["paths"])
-        json_data["definitions"].update(json_data_temp["definitions"])
-        json_file = os.path.join(os.path.dirname(__file__),
-                                 'multivim.network.swagger.json')
-        f = open(json_file)
-        json_data_temp = json.JSONDecoder().decode(f.read())
-        f.close()
-        json_data["paths"].update(json_data_temp["paths"])
-        json_data["definitions"].update(json_data_temp["definitions"])
-        json_file = os.path.join(os.path.dirname(__file__),
-                                 'multivim.subnet.swagger.json')
-        f = open(json_file)
-        json_data_temp = json.JSONDecoder().decode(f.read())
-        f.close()
-        json_data["paths"].update(json_data_temp["paths"])
-        json_data["definitions"].update(json_data_temp["definitions"])
-        json_file = os.path.join(os.path.dirname(__file__),
-                                 'multivim.server.swagger.json')
-        f = open(json_file)
-        json_data_temp = json.JSONDecoder().decode(f.read())
-        f.close()
-        json_data["paths"].update(json_data_temp["paths"])
-        json_data["definitions"].update(json_data_temp["definitions"])
-        json_file = os.path.join(os.path.dirname(__file__),
-                                 'multivim.volume.swagger.json')
-        f = open(json_file)
-        json_data_temp = json.JSONDecoder().decode(f.read())
-        f.close()
-        json_data["paths"].update(json_data_temp["paths"])
-        json_data["definitions"].update(json_data_temp["definitions"])
-        json_file = os.path.join(os.path.dirname(__file__),
-                                 'multivim.vport.swagger.json')
-        f = open(json_file)
-        json_data_temp = json.JSONDecoder().decode(f.read())
-        f.close()
-        json_data["paths"].update(json_data_temp["paths"])
-        json_data["definitions"].update(json_data_temp["definitions"])
-        json_file = os.path.join(os.path.dirname(__file__),
-                                 'multivim.tenant.swagger.json')
-        f = open(json_file)
-        json_data_temp = json.JSONDecoder().decode(f.read())
-        f.close()
-        json_data["paths"].update(json_data_temp["paths"])
-        json_data["definitions"].update(json_data_temp["definitions"])
-        json_file = os.path.join(os.path.dirname(__file__),
-                                 'multivim.host.swagger.json')
-        f = open(json_file)
-        json_data_temp = json.JSONDecoder().decode(f.read())
-        f.close()
-        json_data["paths"].update(json_data_temp["paths"])
-        json_data["definitions"].update(json_data_temp["definitions"])
-        json_file = os.path.join(os.path.dirname(__file__),
-                                 'multivim.limit.swagger.json')
-        f = open(json_file)
-        json_data_temp = json.JSONDecoder().decode(f.read())
-        f.close()
-        json_data["paths"].update(json_data_temp["paths"])
-        json_data["definitions"].update(json_data_temp["definitions"])
-        #
-        json_file = os.path.join(os.path.dirname(__file__),
-                                 'multivim.identity.swagger.json')
-        f = open(json_file)
-        json_data_temp = json.JSONDecoder().decode(f.read())
-        f.close()
-        json_data["paths"].update(json_data_temp["paths"])
-        json_data["definitions"].update(json_data_temp["definitions"])
-        return Response(json_data)
+        return Response(utils.get_swagger_json_data())