Adjust API level on swagger and set API doc expansion by default 04/7104/1
authorZhang Rong(Jon) <rong.zhang@windriver.com>
Tue, 23 Nov 2021 06:48:27 +0000 (14:48 +0800)
committerZhang Rong(Jon) <rong.zhang@windriver.com>
Tue, 23 Nov 2021 06:51:35 +0000 (14:51 +0800)
1. Combine ocloud namespace to one as o2ims inventory v1 level
2. The base url is defined as O2 interface application
3. Each namespace split by the version of service, like IMS inventory v1 is a namespace
4. Set API doc expansion by default

Signed-off-by: Zhang Rong(Jon) <rong.zhang@windriver.com>
Change-Id: I659b966fdc1e3f7fef33ac8b67515ab0c328ebae

o2ims/entrypoints/flask_application.py
o2ims/views/__init__.py
o2ims/views/ocloud_dto.py
o2ims/views/ocloud_route.py

index 431b2de..c439173 100644 (file)
@@ -23,10 +23,11 @@ from o2dms.views import dms_route
 \r
 # apibase = config.get_o2ims_api_base()\r
 app = Flask(__name__)\r
+app.config.SWAGGER_UI_DOC_EXPANSION = 'list'\r
 api = Api(app, version='1.0.0',\r
-          title='O-Cloud Infrastructure Management Services',\r
+          title='O-Cloud O2 Interface Application',\r
           description='Swagger OpenAPI document for \\r
-          O-Cloud Infrastructure Management Services',\r
+          O-Cloud O2 interface application',\r
           )\r
 bus = bootstrap.bootstrap()\r
 configure_namespace(api, bus)\r
index b514342..f8b4e73 100644 (file)
@@ -1,13 +1,19 @@
-# Copyright (C) 2021 Wind River Systems, Inc.\r
-#\r
-#  Licensed under the Apache License, Version 2.0 (the "License");\r
-#  you may not use this file except in compliance with the License.\r
-#  You may obtain a copy of the License at\r
-#\r
-#      http://www.apache.org/licenses/LICENSE-2.0\r
-#\r
-#  Unless required by applicable law or agreed to in writing, software\r
-#  distributed under the License is distributed on an "AS IS" BASIS,\r
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-#  See the License for the specific language governing permissions and\r
-#  limitations under the License.\r
+# Copyright (C) 2021 Wind River Systems, 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.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+from flask_restx import Namespace
+
+api = Namespace("O2IMS Inventory v1",
+                description='The Inventory version1 of '
+                'O2 Infrastructure Management Services')
index 586de3f..0201451 100644 (file)
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
-from flask_restx import Namespace, fields
+from flask_restx import fields
 
+from o2ims.views import api
 
-class OcloudDTO:
 
-    api = Namespace("Ocloud", description='Ocloud related operations.')
+class OcloudDTO:
 
     ocloud = api.model(
         "OcloudList",
@@ -33,9 +33,6 @@ class OcloudDTO:
 
 class ResourceTypeDTO:
 
-    api = Namespace(
-        "ResourceType", description='Resource type related operations.')
-
     resource_type_get = api.model(
         "ResourceTypeGet",
         {
@@ -51,9 +48,6 @@ class ResourceTypeDTO:
 
 class ResourcePoolDTO:
 
-    api = Namespace(
-        "ResourcePool", description='Resource pool related operations.')
-
     resource_pool_get = api.model(
         "ResourcePoolGet",
         {
@@ -69,8 +63,6 @@ class ResourcePoolDTO:
 
 class ResourceDTO:
 
-    api = Namespace("Resource", description='Resource related operations.')
-
     resource_list = api.model(
         "ResourceList",
         {
@@ -98,9 +90,6 @@ class ResourceDTO:
 
 class DeploymentManagerDTO:
 
-    api = Namespace("DeploymentManager",
-                    description='Deployment manager related operations.')
-
     deployment_manager_get = api.model(
         "DeploymentManagerGet",
         {
@@ -119,9 +108,6 @@ class DeploymentManagerDTO:
 
 class SubscriptionDTO:
 
-    api = Namespace(
-        "Subscription", description='Subscription related operations.')
-
     subscription_get = api.model(
         "SubscriptionGet",
         {
index 92cfd1c..a6f1847 100644 (file)
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
-# from operator import sub
 import uuid
-# from re import sub
 from flask_restx import Resource
 
+from o2ims.views import ocloud_view, api
 from o2ims import config
-from o2ims.views import ocloud_view
 from o2ims.domain.ocloud import Subscription
 from o2ims.views.ocloud_dto import OcloudDTO, ResourceTypeDTO,\
     ResourcePoolDTO, ResourceDTO, DeploymentManagerDTO, SubscriptionDTO
 
+
 apibase = config.get_o2ims_api_base()
-# api = Namespace("O2IMS", description='IMS')
 
 
 # ----------  OClouds ---------- #
-api_ocloud = OcloudDTO.api
-
-
-@api_ocloud.route("/")
-@api_ocloud.response(404, 'oCloud not found')
+@api.route("/")
+@api.response(404, 'oCloud not found')
 class OcloudsListRouter(Resource):
     """Ocloud get endpoint
     O2 interface ocloud endpoint
@@ -40,25 +35,22 @@ class OcloudsListRouter(Resource):
 
     ocloud_get = OcloudDTO.ocloud
 
-    @api_ocloud.marshal_with(ocloud_get)
+    @api.marshal_with(ocloud_get)
     def get(self):
         res = ocloud_view.oclouds(uow)
         if len(res) > 0:
             return res[0]
-        api_rt.abort(
+        api.abort(
             404, "oCloud doesn't exist")
 
 
 # ----------  ResourceTypes ---------- #
-api_rt = ResourceTypeDTO.api
-
-
-@api_rt.route("/resourceTypes")
+@api.route("/resourceTypes")
 class ResourceTypesListRouter(Resource):
 
     model = ResourceTypeDTO.resource_type_get
 
-    @api_rt.marshal_list_with(model)
+    @api.marshal_list_with(model)
     def get(self):
         return ocloud_view.resource_types(uow)
 
@@ -79,139 +71,127 @@ class ResourceTypesListRouter(Resource):
     #     api.abort(405)
 
 
-@api_rt.route("/resourceTypes/<resourceTypeID>")
-@api_rt.param('resourceTypeID', 'ID of the resource type')
-@api_rt.response(404, 'Resource type not found')
+@api.route("/resourceTypes/<resourceTypeID>")
+@api.param('resourceTypeID', 'ID of the resource type')
+@api.response(404, 'Resource type not found')
 class ResourceTypeGetRouter(Resource):
 
     model = ResourceTypeDTO.resource_type_get
 
-    @api_rt.doc('Get resource type')
-    @api_rt.marshal_with(model)
+    @api.doc('Get resource type')
+    @api.marshal_with(model)
     def get(self, resourceTypeID):
         result = ocloud_view.resource_type_one(resourceTypeID, uow)
         if result is not None:
             return result
-        api_rt.abort(
+        api.abort(
             404, "Resource type {} doesn't exist".format(resourceTypeID))
 
 
 # ----------  ResourcePools ---------- #
-api_rp = ResourcePoolDTO.api
-
-
-@api_rp.route("/resourcePools")
+@api.route("/resourcePools")
 class ResourcePoolsListRouter(Resource):
 
     model = ResourcePoolDTO.resource_pool_get
 
-    @api_rp.marshal_list_with(model)
+    @api.marshal_list_with(model)
     def get(self):
         return ocloud_view.resource_pools(uow)
 
 
-@api_rp.route("/resourcePools/<resourcePoolID>")
-@api_rp.param('resourcePoolID', 'ID of the resource pool')
-@api_rp.response(404, 'Resource pool not found')
+@api.route("/resourcePools/<resourcePoolID>")
+@api.param('resourcePoolID', 'ID of the resource pool')
+@api.response(404, 'Resource pool not found')
 class ResourcePoolGetRouter(Resource):
 
     model = ResourcePoolDTO.resource_pool_get
 
-    @api_rp.doc('Get resource pool')
-    @api_rp.marshal_with(model)
+    @api.doc('Get resource pool')
+    @api.marshal_with(model)
     def get(self, resourcePoolID):
         result = ocloud_view.resource_pool_one(resourcePoolID, uow)
         if result is not None:
             return result
-        api_rp.abort(
+        api.abort(
             404, "Resource pool {} doesn't exist".format(resourcePoolID))
 
 
 # ----------  Resources ---------- #
-api_res = ResourceDTO.api
-
-
-@api_res.route("/resourcePools/<resourcePoolID>/resources")
-@api_res.param('resourcePoolID', 'ID of the resource pool')
+@api.route("/resourcePools/<resourcePoolID>/resources")
+@api.param('resourcePoolID', 'ID of the resource pool')
 class ResourcesListRouter(Resource):
 
     model = ResourceDTO.resource_list
 
-    @api_res.marshal_list_with(model)
+    @api.marshal_list_with(model)
     def get(self, resourcePoolID):
         return ocloud_view.resources(resourcePoolID, uow)
 
 
-@api_res.route("/resourcePools/<resourcePoolID>/resources/<resourceID>")
-@api_res.param('resourcePoolID', 'ID of the resource pool')
-@api_res.param('resourceID', 'ID of the resource')
-@api_res.response(404, 'Resource not found')
+@api.route("/resourcePools/<resourcePoolID>/resources/<resourceID>")
+@api.param('resourcePoolID', 'ID of the resource pool')
+@api.param('resourceID', 'ID of the resource')
+@api.response(404, 'Resource not found')
 class ResourceGetRouter(Resource):
 
     model = ResourceDTO.resource_get
 
-    @api_res.doc('Get resource')
-    @api_res.marshal_with(model)
+    @api.doc('Get resource')
+    @api.marshal_with(model)
     def get(self, resourcePoolID, resourceID):
         result = ocloud_view.resource_one(resourceID, uow)
         if result is not None:
             return result
-        api_res.abort(404, "Resource {} doesn't exist".format(resourceID))
+        api.abort(404, "Resource {} doesn't exist".format(resourceID))
 
 
 # ----------  DeploymentManagers ---------- #
-api_dm = DeploymentManagerDTO.api
-
-
-@api_dm.route("/deploymentManagers")
+@api.route("/deploymentManagers")
 class DeploymentManagersListRouter(Resource):
 
     model = DeploymentManagerDTO.deployment_manager_get
 
-    @api_dm.marshal_list_with(model)
+    @api.marshal_list_with(model)
     def get(self):
         return ocloud_view.deployment_managers(uow)
 
 
-@api_dm.route("/deploymentManagers/<deploymentManagerID>")
-@api_dm.param('deploymentManagerID', 'ID of the deployment manager')
-@api_dm.response(404, 'Deployment manager not found')
+@api.route("/deploymentManagers/<deploymentManagerID>")
+@api.param('deploymentManagerID', 'ID of the deployment manager')
+@api.response(404, 'Deployment manager not found')
 class DeploymentManagerGetRouter(Resource):
 
     model = DeploymentManagerDTO.deployment_manager_get
 
-    @api_dm.doc('Get deployment manager')
-    @api_dm.marshal_with(model)
+    @api.doc('Get deployment manager')
+    @api.marshal_with(model)
     def get(self, deploymentManagerID):
         result = ocloud_view.deployment_manager_one(
             deploymentManagerID, uow)
         if result is not None:
             return result
-        api_dm.abort(404, "Deployment manager {} doesn't exist".format(
+        api.abort(404, "Deployment manager {} doesn't exist".format(
             deploymentManagerID))
 
 
 # ----------  Subscriptions ---------- #
-api_sub = SubscriptionDTO.api
-
-
-@api_sub.route("/subscriptions")
+@api.route("/subscriptions")
 class SubscriptionsListRouter(Resource):
 
     model = SubscriptionDTO.subscription_get
     expect = SubscriptionDTO.subscription
     post_resp = SubscriptionDTO.subscription_post_resp
 
-    @api_sub.doc('List subscriptions')
-    @api_sub.marshal_list_with(model)
+    @api.doc('List subscriptions')
+    @api.marshal_list_with(model)
     def get(self):
         return ocloud_view.subscriptions(uow)
 
-    @api_sub.doc('Create a subscription')
-    @api_sub.expect(expect)
-    @api_sub.marshal_with(post_resp, code=201)
+    @api.doc('Create a subscription')
+    @api.expect(expect)
+    @api.marshal_with(post_resp, code=201)
     def post(self):
-        data = api_sub.payload
+        data = api.payload
         sub_uuid = str(uuid.uuid4())
         subscription = Subscription(
             sub_uuid, data['callback'], data['consumerSubscriptionId'],
@@ -220,25 +200,25 @@ class SubscriptionsListRouter(Resource):
         return {"subscriptionId": sub_uuid}, 201
 
 
-@api_sub.route("/subscriptions/<subscriptionID>")
-@api_sub.param('subscriptionID', 'ID of the subscription')
-@api_sub.response(404, 'Subscription not found')
+@api.route("/subscriptions/<subscriptionID>")
+@api.param('subscriptionID', 'ID of the subscription')
+@api.response(404, 'Subscription not found')
 class SubscriptionGetDelRouter(Resource):
 
     model = DeploymentManagerDTO.deployment_manager_get
 
-    @api_sub.doc('Get subscription by ID')
-    @api_sub.marshal_with(model)
+    @api.doc('Get subscription by ID')
+    @api.marshal_with(model)
     def get(self, subscriptionID):
         result = ocloud_view.subscription_one(
             subscriptionID, uow)
         if result is not None:
             return result
-        api_sub.abort(404, "Subscription {} doesn't exist".format(
+        api.abort(404, "Subscription {} doesn't exist".format(
             subscriptionID))
 
-    @api_sub.doc('Delete subscription by ID')
-    @api_sub.response(204, 'Subscription deleted')
+    @api.doc('Delete subscription by ID')
+    @api.response(204, 'Subscription deleted')
     def delete(self, subscriptionID):
         with uow:
             uow.subscriptions.delete(subscriptionID)
@@ -248,12 +228,8 @@ class SubscriptionGetDelRouter(Resource):
 
 def configure_namespace(app, bus):
 
-    app.add_namespace(api_ocloud, path=apibase)
-    app.add_namespace(api_rt, path=apibase)
-    app.add_namespace(api_rp, path=apibase)
-    app.add_namespace(api_res, path=apibase)
-    app.add_namespace(api_dm, path=apibase)
-    app.add_namespace(api_sub, path=apibase)
+    api_v1 = api
+    app.add_namespace(api_v1, path=apibase)
 
     # Set global uow
     global uow