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
 \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
 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
           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
           )\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.
 
 #  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",
 
     ocloud = api.model(
         "OcloudList",
@@ -33,9 +33,6 @@ class OcloudDTO:
 
 class ResourceTypeDTO:
 
 
 class ResourceTypeDTO:
 
-    api = Namespace(
-        "ResourceType", description='Resource type related operations.')
-
     resource_type_get = api.model(
         "ResourceTypeGet",
         {
     resource_type_get = api.model(
         "ResourceTypeGet",
         {
@@ -51,9 +48,6 @@ class ResourceTypeDTO:
 
 class ResourcePoolDTO:
 
 
 class ResourcePoolDTO:
 
-    api = Namespace(
-        "ResourcePool", description='Resource pool related operations.')
-
     resource_pool_get = api.model(
         "ResourcePoolGet",
         {
     resource_pool_get = api.model(
         "ResourcePoolGet",
         {
@@ -69,8 +63,6 @@ class ResourcePoolDTO:
 
 class ResourceDTO:
 
 
 class ResourceDTO:
 
-    api = Namespace("Resource", description='Resource related operations.')
-
     resource_list = api.model(
         "ResourceList",
         {
     resource_list = api.model(
         "ResourceList",
         {
@@ -98,9 +90,6 @@ class ResourceDTO:
 
 class DeploymentManagerDTO:
 
 
 class DeploymentManagerDTO:
 
-    api = Namespace("DeploymentManager",
-                    description='Deployment manager related operations.')
-
     deployment_manager_get = api.model(
         "DeploymentManagerGet",
         {
     deployment_manager_get = api.model(
         "DeploymentManagerGet",
         {
@@ -119,9 +108,6 @@ class DeploymentManagerDTO:
 
 class SubscriptionDTO:
 
 
 class SubscriptionDTO:
 
-    api = Namespace(
-        "Subscription", description='Subscription related operations.')
-
     subscription_get = api.model(
         "SubscriptionGet",
         {
     subscription_get = api.model(
         "SubscriptionGet",
         {
index 92cfd1c..a6f1847 100644 (file)
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
-# from operator import sub
 import uuid
 import uuid
-# from re import sub
 from flask_restx import Resource
 
 from flask_restx import Resource
 
+from o2ims.views import ocloud_view, api
 from o2ims import config
 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
 
 from o2ims.domain.ocloud import Subscription
 from o2ims.views.ocloud_dto import OcloudDTO, ResourceTypeDTO,\
     ResourcePoolDTO, ResourceDTO, DeploymentManagerDTO, SubscriptionDTO
 
+
 apibase = config.get_o2ims_api_base()
 apibase = config.get_o2ims_api_base()
-# api = Namespace("O2IMS", description='IMS')
 
 
 # ----------  OClouds ---------- #
 
 
 # ----------  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
 class OcloudsListRouter(Resource):
     """Ocloud get endpoint
     O2 interface ocloud endpoint
@@ -40,25 +35,22 @@ class OcloudsListRouter(Resource):
 
     ocloud_get = OcloudDTO.ocloud
 
 
     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]
     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 ---------- #
             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
 
 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)
 
     def get(self):
         return ocloud_view.resource_types(uow)
 
@@ -79,139 +71,127 @@ class ResourceTypesListRouter(Resource):
     #     api.abort(405)
 
 
     #     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
 
 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
     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 ---------- #
             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
 
 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)
 
 
     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
 
 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
     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 ---------- #
             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
 
 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)
 
 
     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
 
 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
     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 ---------- #
 
 
 # ----------  DeploymentManagers ---------- #
-api_dm = DeploymentManagerDTO.api
-
-
-@api_dm.route("/deploymentManagers")
+@api.route("/deploymentManagers")
 class DeploymentManagersListRouter(Resource):
 
     model = DeploymentManagerDTO.deployment_manager_get
 
 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)
 
 
     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
 
 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
     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 ---------- #
             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
 
 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)
 
     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):
     def post(self):
-        data = api_sub.payload
+        data = api.payload
         sub_uuid = str(uuid.uuid4())
         subscription = Subscription(
             sub_uuid, data['callback'], data['consumerSubscriptionId'],
         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
 
 
         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
 
 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
     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))
 
             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)
     def delete(self, subscriptionID):
         with uow:
             uow.subscriptions.delete(subscriptionID)
@@ -248,12 +228,8 @@ class SubscriptionGetDelRouter(Resource):
 
 def configure_namespace(app, bus):
 
 
 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
 
     # Set global uow
     global uow