Add swagger support for Rest API 27/42427/1
authorLinda Wang <wangwulin@huawei.com>
Tue, 12 Sep 2017 07:37:19 +0000 (07:37 +0000)
committerMorgan Richomme <morgan.richomme@orange.com>
Tue, 19 Sep 2017 14:46:07 +0000 (14:46 +0000)
JIRA: FUNCTEST-854

Change-Id: Ic010604d3ba0cc46092cf2a1ae8bb41afa73c920
Signed-off-by: Linda Wang <wangwulin@huawei.com>
(cherry picked from commit b621b6b4b70299a60ad3e26ed6b04450f84b603e)

20 files changed:
functest/api/resources/v1/creds.py
functest/api/resources/v1/envs.py
functest/api/resources/v1/tasks.py
functest/api/resources/v1/testcases.py
functest/api/resources/v1/tiers.py
functest/api/server.py
functest/api/swagger/creds.yaml [new file with mode: 0644]
functest/api/swagger/creds_action.yaml [new file with mode: 0644]
functest/api/swagger/envs.yaml [new file with mode: 0644]
functest/api/swagger/envs_action.yaml [new file with mode: 0644]
functest/api/swagger/task.yaml [new file with mode: 0644]
functest/api/swagger/task_log.yaml [new file with mode: 0644]
functest/api/swagger/testcase.yaml [new file with mode: 0644]
functest/api/swagger/testcase_run.yaml [new file with mode: 0644]
functest/api/swagger/testcases.yaml [new file with mode: 0644]
functest/api/swagger/testcases_in_tier.yaml [new file with mode: 0644]
functest/api/swagger/tier.yaml [new file with mode: 0644]
functest/api/swagger/tiers.yaml [new file with mode: 0644]
requirements.txt
upper-constraints.txt

index 45e4559..f445017 100644 (file)
@@ -13,8 +13,11 @@ Resources to handle openstack related requests
 
 import collections
 import logging
+import pkg_resources
+import socket
 
 from flask import jsonify
+from flasgger.utils import swag_from
 
 from functest.api.base import ApiResource
 from functest.api.common import api_utils
@@ -24,16 +27,26 @@ from functest.utils.constants import CONST
 
 LOGGER = logging.getLogger(__name__)
 
+ADDRESS = socket.gethostbyname(socket.gethostname())
+ENDPOINT_CREDS = ('http://{}:5000/api/v1/functest/openstack'.format(ADDRESS))
+
 
 class V1Creds(ApiResource):
     """ V1Creds Resource class"""
 
+    @swag_from(
+        pkg_resources.resource_filename('functest', 'api/swagger/creds.yaml'),
+        endpoint='{0}/credentials'.format(ENDPOINT_CREDS))
     def get(self):  # pylint: disable=no-self-use
         """ Get credentials """
         os_utils.source_credentials(CONST.__getattribute__('openstack_creds'))
         credentials_show = OpenStack.show_credentials()
         return jsonify(credentials_show)
 
+    @swag_from(
+        pkg_resources.resource_filename('functest',
+                                        'api/swagger/creds_action.yaml'),
+        endpoint='{0}/action'.format(ENDPOINT_CREDS))
     def post(self):
         """ Used to handle post request """
         return self._dispatch_post()
index 8020544..65e61c4 100644 (file)
 Resources to handle environment related requests
 """
 
+import pkg_resources
+import socket
+
 import IPy
 from flask import jsonify
+from flasgger.utils import swag_from
 
 from functest.api.base import ApiResource
 from functest.api.common import api_utils
 from functest.cli.commands.cli_env import Env
 import functest.utils.functest_utils as ft_utils
 
+ADDRESS = socket.gethostbyname(socket.gethostname())
+ENDPOINT_ENVS = ('http://{}:5000/api/v1/functest/envs'.format(ADDRESS))
+
 
 class V1Envs(ApiResource):
     """ V1Envs Resource class"""
 
+    @swag_from(
+        pkg_resources.resource_filename('functest', 'api/swagger/envs.yaml'),
+        endpoint=ENDPOINT_ENVS)
     def get(self):  # pylint: disable=no-self-use
         """ Get environment """
         environment_show = Env().show()
         return jsonify(environment_show)
 
+    @swag_from(
+        pkg_resources.resource_filename('functest',
+                                        'api/swagger/envs_action.yaml'),
+        endpoint='{0}/action'.format(ENDPOINT_ENVS))
     def post(self):
         """ Used to handle post request """
         return self._dispatch_post()
index 4921412..6bf625a 100644 (file)
@@ -15,9 +15,11 @@ import errno
 import json
 import logging
 import os
+import pkg_resources
 import uuid
 
 from flask import jsonify
+from flasgger.utils import swag_from
 
 from functest.api.base import ApiResource
 from functest.api.common import api_utils
@@ -31,6 +33,8 @@ LOGGER = logging.getLogger(__name__)
 class V1Task(ApiResource):
     """ V1Task Resource class"""
 
+    @swag_from(pkg_resources.resource_filename(
+        'functest', 'api/swagger/task.yaml'))
     def get(self, task_id):  # pylint: disable=no-self-use
         """ GET the result of the task id """
         try:
@@ -66,6 +70,8 @@ class V1Task(ApiResource):
 class V1TaskLog(ApiResource):
     """ V1TaskLog Resource class"""
 
+    @swag_from(pkg_resources.resource_filename(
+        'functest', 'api/swagger/task_log.yaml'))
     def get(self, task_id):  # pylint: disable=no-self-use
         """ GET the log of the task id """
         try:
index cc2d4e1..b673313 100644 (file)
@@ -14,10 +14,12 @@ Resources to handle testcase related requests
 import logging
 import os
 import pkg_resources
+import socket
 import uuid
 
 import ConfigParser
 from flask import jsonify
+from flasgger.utils import swag_from
 
 from functest.api.base import ApiResource
 from functest.api.common import api_utils, thread
@@ -28,10 +30,16 @@ import functest.utils.functest_utils as ft_utils
 
 LOGGER = logging.getLogger(__name__)
 
+ADDRESS = socket.gethostbyname(socket.gethostname())
+ENDPOINT_TESTCASES = ('http://{}:5000/api/v1/functest/testcases'
+                      .format(ADDRESS))
+
 
 class V1Testcases(ApiResource):
     """ V1Testcases Resource class"""
 
+    @swag_from(pkg_resources.resource_filename(
+        'functest', 'api/swagger/testcases.yaml'))
     def get(self):  # pylint: disable=no-self-use
         """ GET all testcases """
         testcases_list = Testcase().list()
@@ -42,6 +50,10 @@ class V1Testcases(ApiResource):
 class V1Testcase(ApiResource):
     """ V1Testcase Resource class"""
 
+    @swag_from(
+        pkg_resources.resource_filename('functest',
+                                        'api/swagger/testcase.yaml'),
+        endpoint='{0}/<testcase_name>'.format(ENDPOINT_TESTCASES))
     def get(self, testcase_name):  # pylint: disable=no-self-use
         """ GET the info of one testcase"""
         testcase = Testcase().show(testcase_name)
@@ -61,6 +73,10 @@ class V1Testcase(ApiResource):
         result.update({'dependency': dependency_dict})
         return jsonify(result)
 
+    @swag_from(
+        pkg_resources.resource_filename('functest',
+                                        'api/swagger/testcase_run.yaml'),
+        endpoint='{0}/action'.format(ENDPOINT_TESTCASES))
     def post(self):
         """ Used to handle post request """
         return self._dispatch_post()
index b58ab20..523df13 100644 (file)
 Resources to handle tier related requests
 """
 
+import pkg_resources
 import re
 
 from flask import jsonify
+from flasgger.utils import swag_from
 
 from functest.api.base import ApiResource
 from functest.api.common import api_utils
@@ -23,6 +25,8 @@ from functest.cli.commands.cli_tier import Tier
 class V1Tiers(ApiResource):
     """ V1Tiers Resource class """
 
+    @swag_from(pkg_resources.resource_filename(
+        'functest', 'api/swagger/tiers.yaml'))
     def get(self):
         # pylint: disable=no-self-use
         """ GET all tiers """
@@ -43,6 +47,8 @@ class V1Tiers(ApiResource):
 class V1Tier(ApiResource):
     """ V1Tier Resource class """
 
+    @swag_from(pkg_resources.resource_filename(
+        'functest', 'api/swagger/tier.yaml'))
     def get(self, tier_name):  # pylint: disable=no-self-use
         """ GET the info of one tier """
         tier_info = Tier().show(tier_name)
@@ -62,6 +68,8 @@ class V1Tier(ApiResource):
 class V1TestcasesinTier(ApiResource):
     """ V1TestcasesinTier Resource class """
 
+    @swag_from(pkg_resources.resource_filename(
+        'functest', 'api/swagger/testcases_in_tier.yaml'))
     def get(self, tier_name):  # pylint: disable=no-self-use
         """ GET all testcases within given tier """
         tier_info = Tier().show(tier_name)
index c6eb0b3..3200c1a 100644 (file)
@@ -20,6 +20,7 @@ import pkg_resources
 
 from flask import Flask
 from flask_restful import Api
+from flasgger import Swagger
 
 from functest.api.base import ApiResource
 from functest.api.common import api_utils
@@ -34,6 +35,7 @@ LOGGER = logging.getLogger(__name__)
 
 APP = Flask(__name__)
 API = Api(APP)
+Swagger(APP)
 
 
 @APP.teardown_request
diff --git a/functest/api/swagger/creds.yaml b/functest/api/swagger/creds.yaml
new file mode 100644 (file)
index 0000000..da3b2d9
--- /dev/null
@@ -0,0 +1,35 @@
+Show credentials
+
+This api offers the interface to show credentials.
+The credentials dict will be returned.
+---
+tags:
+  - Creds
+definitions:
+  Credentials:
+    type: object
+    properties:
+      creds_name:
+          $ref: '#/definitions/Name'
+  Name:
+    type: dict
+responses:
+  200:
+    description: Show credentials
+    schema:
+      $ref: '#/definitions/Credentials'
+    examples:
+      "OS_AUTH_URL": "https://192.16.1.222:5000/v3"
+      "OS_AUTH_VERSION": "3"
+      "OS_CACERT": "/home/opnfv/functest/conf/os_cacert"
+      "OS_ENDPOINT_TYPE": "publicURL"
+      "OS_IDENTITY_API_VERSION": "3"
+      "OS_INTERFACE": "publicURL"
+      "OS_NO_CACHE": "1"
+      "OS_PASSWORD": "990232e0885da343ac805528522d"
+      "OS_PROJECT_DOMAIN_NAME": "Default"
+      "OS_PROJECT_NAME": "admin"
+      "OS_REGION_NAME": "RegionOne"
+      "OS_TENANT_NAME": "admin"
+      "OS_USERNAME": "admin"
+      "OS_USER_DOMAIN_NAME": "Default"
diff --git a/functest/api/swagger/creds_action.yaml b/functest/api/swagger/creds_action.yaml
new file mode 100644 (file)
index 0000000..d67d082
--- /dev/null
@@ -0,0 +1,57 @@
+Update openrc
+
+This api offers the interface to Update openstack.creds.
+
+action: update_openrc
+---
+tags:
+  - Creds
+parameters:
+  - in: body
+    name: body
+    description: this is the input json dict
+    schema:
+      required:
+        - action
+        - args
+      properties:
+        action:
+          type: string
+          description: this is action for creds
+          default: update_openrc
+        args:
+          schema:
+            required:
+              - openrc
+            properties:
+              openrc:
+                type: string
+                description: this is the test case name
+                default:
+                  "OS_AUTH_URL": "http://192.16.1.222:5000/v3"
+                  "OS_ENDPOINT_TYPE": "publicURL"
+                  "OS_IDENTITY_API_VERSION": "3"
+                  "OS_INTERFACE": "publicURL"
+                  "OS_PASSWORD": "admn"
+                  "OS_PROJECT_DOMAIN_NAME": "Default"
+                  "OS_PROJECT_NAME": "admin"
+                  "OS_REGION_NAME": "RegionOne"
+                  "OS_TENANT_NAME": "admin"
+                  "OS_USERNAME": "admin"
+                  "OS_USER_DOMAIN_NAME": "Default"
+definitions:
+  Credentials:
+    type: object
+    properties:
+      creds_name:
+          $ref: '#/definitions/Name'
+  Name:
+    type: dict
+responses:
+  200:
+    description: Update openrc
+    schema:
+      $ref: '#/definitions/Credentials'
+    examples:
+      'status': 0
+      'result': 'Update openrc successfully'
diff --git a/functest/api/swagger/envs.yaml b/functest/api/swagger/envs.yaml
new file mode 100644 (file)
index 0000000..e723deb
--- /dev/null
@@ -0,0 +1,26 @@
+Show environment
+
+This api offers the interface to show environment.
+The environment dict will be returned.
+---
+tags:
+  - Envs
+definitions:
+  Environment:
+    type: object
+    properties:
+      creds_name:
+          $ref: '#/definitions/Name'
+  Name:
+    type: dict
+responses:
+  200:
+    description: Show environment
+    schema:
+      $ref: '#/definitions/Environment'
+    examples:
+      "DEBUG FLAG": "false"
+      "INSTALLER": "compass, 192.168.200.2"
+      "POD": "unknown_pod"
+      "SCENARIO": "os-nosdn-nofeature-noha"
+      "STATUS": "ready"
diff --git a/functest/api/swagger/envs_action.yaml b/functest/api/swagger/envs_action.yaml
new file mode 100644 (file)
index 0000000..1add066
--- /dev/null
@@ -0,0 +1,37 @@
+Prepare environment or Update hosts info
+
+This api offers the interface to prepare environment or update hosts info.
+
+action: prepare
+action: update_hosts
+---
+tags:
+  - Envs
+parameters:
+  - in: body
+    name: body
+    description: this is the input json dict
+    schema:
+      required:
+        - action
+      properties:
+        action:
+          type: string
+          description: this is action for envs
+          default: prepare
+definitions:
+  Environment:
+    type: object
+    properties:
+      creds_name:
+          $ref: '#/definitions/Name'
+  Name:
+    type: dict
+responses:
+  200:
+    description: Prepare environment
+    schema:
+      $ref: '#/definitions/Environment'
+    examples:
+      'status': 0
+      'result': 'Prapare env successfully'
diff --git a/functest/api/swagger/task.yaml b/functest/api/swagger/task.yaml
new file mode 100644 (file)
index 0000000..abf68a0
--- /dev/null
@@ -0,0 +1,38 @@
+Get the result of the specified task
+
+This api offers the interface to get the result of the specified task.
+
+---
+tags:
+  - Tasks
+parameters:
+  - name: task_id
+    description: task id
+    in: path
+    type: string
+    required: true
+definitions:
+  Task:
+    type: object
+    properties:
+      creds_name:
+          $ref: '#/definitions/Result'
+  Result:
+    type: dict
+responses:
+  200:
+    description: Get the result of the specified task
+    schema:
+      $ref: '#/definitions/Task'
+    examples:
+      "result": {
+        "case_name": "vping_ssh",
+        "env_info": {
+            "build_tag": null,
+            "ci_loop": "weekly",
+            "installer": "compass",
+            "scenario": "os-nosdn-nofeature-noha" },
+        "result": "PASS",
+        "task_id": "1a9f3c5d-ce0b-4354-862e-dd08b26fc484"}
+      "status": 2
+
diff --git a/functest/api/swagger/task_log.yaml b/functest/api/swagger/task_log.yaml
new file mode 100644 (file)
index 0000000..adaaaf4
--- /dev/null
@@ -0,0 +1,35 @@
+Get the log of the specified task
+
+This api offers the interface to get the log of the specified task.
+
+---
+tags:
+  - Tasks
+parameters:
+  - name: task_id
+    description: task id
+    in: path
+    type: string
+    required: true
+definitions:
+  Task:
+    type: object
+    properties:
+      creds_name:
+          $ref: '#/definitions/Result'
+  Result:
+    type: dict
+responses:
+  200:
+    description: Get the log of the specified task
+    schema:
+      $ref: '#/definitions/Task'
+    examples:
+      "result": {
+        "data": [
+        "2017-09-14 06:46:26,106 - functest.ci.run_tests - DEBUG - Sourcing the OpenStack RC file... ",
+        "2017-09-14 06:46:26,107 - functest.ci.run_tests - DEBUG - Test args: connection_check ",
+        "2017-09-14 06:46:26,107 - functest.ci.run_tests - INFO - Running test case 'connection_check'... ",
+        "..."]}
+      "status": 2
+
diff --git a/functest/api/swagger/testcase.yaml b/functest/api/swagger/testcase.yaml
new file mode 100644 (file)
index 0000000..70ee1af
--- /dev/null
@@ -0,0 +1,36 @@
+Show the info of one testcase
+
+This api offers the interface to show the detailed info of one testcase.
+The info of one testcase will be returned.
+---
+tags:
+  - Testcases
+parameters:
+  - name: testcase_name
+    description: testcase name
+    in: path
+    type: string
+    required: true
+definitions:
+  Testcases:
+    type: object
+    properties:
+      case_name:
+          $ref: '#/definitions/Tests'
+  Tests:
+    type: dict
+responses:
+  200:
+    description: Show the detailed info of one testcase
+    schema:
+      $ref: '#/definitions/Testcases'
+    examples:
+        "testcase": ""
+        "blocking":
+        "criteria":
+        "dependency": {
+            "installer": "",
+            "scenario": ""
+        }
+        "description": ""
+        "enabled":
diff --git a/functest/api/swagger/testcase_run.yaml b/functest/api/swagger/testcase_run.yaml
new file mode 100644 (file)
index 0000000..d451457
--- /dev/null
@@ -0,0 +1,47 @@
+Run a test case
+
+This api offers the interface to run a test case
+
+action: run_test_case
+---
+tags:
+  - Testcases
+parameters:
+  - in: body
+    name: body
+    description: this is the input json dict
+    schema:
+      required:
+        - action
+        - args
+      properties:
+        action:
+          type: string
+          description: this is action for creds
+          default: run_test_case
+        args:
+          schema:
+            required:
+              - testcase
+            properties:
+              testcase:
+                type: string
+                description: this is the test case name
+                default:
+                  vping_ssh
+definitions:
+  Testcases:
+    type: object
+    properties:
+      creds_name:
+          $ref: '#/definitions/Tests'
+  Tests:
+    type: dict
+responses:
+  200:
+    description: Run a test case
+    schema:
+      $ref: '#/definitions/Testcases'
+    examples:
+      'task_id': '94c8ec94-d873-466f-a205-bf592f31ff5b'
+      'testcase': 'vping_ssh'
diff --git a/functest/api/swagger/testcases.yaml b/functest/api/swagger/testcases.yaml
new file mode 100644 (file)
index 0000000..56d9d71
--- /dev/null
@@ -0,0 +1,22 @@
+List all test cases
+
+This api offers the interface to list all test cases
+The testcases list will be returned
+---
+tags:
+  - Testcases
+definitions:
+  Testcases:
+    type: object
+    properties:
+      creds_name:
+          $ref: '#/definitions/Tests'
+  Tests:
+    type: dict
+responses:
+  200:
+    description: List all test cases
+    schema:
+      $ref: '#/definitions/Testcases'
+    examples:
+      "testcases": []
diff --git a/functest/api/swagger/testcases_in_tier.yaml b/functest/api/swagger/testcases_in_tier.yaml
new file mode 100644 (file)
index 0000000..f645082
--- /dev/null
@@ -0,0 +1,29 @@
+List all testcases within given tier
+
+This api offers the interface to list all testcases within given tier.
+All testcases within given tier will be returned.
+---
+tags:
+  - Tiers
+parameters:
+  - name: tier_name
+    description: tier name
+    in: path
+    type: string
+    required: true
+definitions:
+  Testcases:
+    type: object
+    properties:
+      creds_name:
+          $ref: '#/definitions/Tests'
+  Tests:
+    type: dict
+responses:
+  200:
+    description: List all testcases within given tier
+    schema:
+      $ref: '#/definitions/Testcases'
+    examples:
+        "tier": ""
+        "testcases": []
diff --git a/functest/api/swagger/tier.yaml b/functest/api/swagger/tier.yaml
new file mode 100644 (file)
index 0000000..8616afb
--- /dev/null
@@ -0,0 +1,32 @@
+Show the info of one tier
+
+This api offers the interface to show the detailed info of one tier.
+The info of one tier will be returned.
+---
+tags:
+  - Tiers
+parameters:
+  - name: tier_name
+    description: tier name
+    in: path
+    type: string
+    required: true
+definitions:
+  Tiers:
+    type: object
+    properties:
+      creds_name:
+          $ref: '#/definitions/Name'
+  Name:
+    type: string
+responses:
+  200:
+    description: Show the detailed info of one tier
+    schema:
+      $ref: '#/definitions/Tiers'
+    examples:
+        "tier": ""
+        "ci_loop": ""
+        "description": ""
+        "order":
+        "testcases": []
diff --git a/functest/api/swagger/tiers.yaml b/functest/api/swagger/tiers.yaml
new file mode 100644 (file)
index 0000000..8a71c37
--- /dev/null
@@ -0,0 +1,22 @@
+List all tiers
+
+This api offers the interface to list all tiers.
+The tiers list will be returned.
+---
+tags:
+  - Tiers
+definitions:
+  Tiers:
+    type: object
+    properties:
+      creds_name:
+          $ref: '#/definitions/Tier'
+  Tier:
+    type: dict
+responses:
+  200:
+      description: List all tiers
+      schema:
+          $ref: '#/definitions/Tiers'
+      examples:
+          "tiers": ""
index 650f614..d4a0377 100644 (file)
@@ -22,6 +22,7 @@ cloudify-rest-client
 Flask!=0.11,<1.0,>=0.10 # BSD
 Flask-RESTful>=0.3.5 # BSD
 IPy
+flasgger # MIT
 mock>=2.0 # BSD
 iniparse==0.4
 PrettyTable<0.8,>=0.7.1 # BSD
index f249607..049424e 100644 (file)
@@ -16,3 +16,4 @@ robotframework-sshlibrary===2.1.3;python_version=='2.7'
 IPy===0.83
 os-faults===0.1.10
 ansible===2.3.2.0
+flasgger===0.6.6