add signin web to TestAPI 89/34889/4
authorSerenaFeng <feng.xiaowei@zte.com.cn>
Wed, 17 May 2017 10:31:26 +0000 (18:31 +0800)
committerSerena Feng <feng.xiaowei@zte.com.cn>
Thu, 18 May 2017 01:01:05 +0000 (01:01 +0000)
Change-Id: I4d39a8561c8ebd3238a495e5799fd43fb1a508b9
Signed-off-by: SerenaFeng <feng.xiaowei@zte.com.cn>
12 files changed:
utils/test/testapi/3rd_party/static/testapi-ui/components/home/home.html
utils/test/testapi/3rd_party/static/testapi-ui/config.json
utils/test/testapi/3rd_party/static/testapi-ui/shared/header/header.html
utils/test/testapi/etc/config.ini
utils/test/testapi/opnfv_testapi/router/url_mappings.py
utils/test/testapi/opnfv_testapi/ui/__init__.py [new file with mode: 0644]
utils/test/testapi/opnfv_testapi/ui/auth/__init__.py [new file with mode: 0644]
utils/test/testapi/opnfv_testapi/ui/auth/constants.py [new file with mode: 0644]
utils/test/testapi/opnfv_testapi/ui/auth/handlers.py [new file with mode: 0644]
utils/test/testapi/opnfv_testapi/ui/auth/utils.py [new file with mode: 0644]
utils/test/testapi/opnfv_testapi/ui/root.py [moved from utils/test/testapi/opnfv_testapi/resources/ui_handlers.py with 86% similarity]
utils/test/testapi/requirements.txt

index 04f64d5..47d747f 100644 (file)
@@ -1,6 +1,6 @@
 <div class="jumbotron openstack-intro">
     <div class="pull-right right openstack-intro__logo">
-        <img src="swagger/testapi-ui/assets/img/opnfv-logo.png" alt="OPNFV">
+        <img src="testapi-ui/assets/img/opnfv-logo.png" alt="OPNFV">
     </div>
     <div class="pull-left left openstack-intro__content">
         <h1>Results Collection</h1>
index 78361b8..f2c49e8 100644 (file)
@@ -1,4 +1,4 @@
-<div class="heading"><a ui-sref="home"><img src="swagger/testapi-ui/assets/img/testapi-logo.png" alt="TestAPI"></a>
+<div class="heading"><a ui-sref="home"><img src="testapi-ui/assets/img/testapi-logo.png" alt="TestAPI"></a>
 TestAPI
 </div>
 <nav class="navbar navbar-default" role="navigation" ng-controller="HeaderController as header">
index 77cc6c6..692e488 100644 (file)
@@ -8,6 +8,7 @@ dbname = test_results_collection
 
 [api]
 # Listening port
+url = http://localhost:8000/api/v1
 port = 8000
 # With debug_on set to true, error traces will be shown in HTTP responses
 debug = True
@@ -15,3 +16,52 @@ authenticate = False
 
 [swagger]
 base_url = http://localhost:8000
+
+[ui]
+url = http://localhost:8000
+
+[osid]
+
+# OpenStackID Auth Server URI. (string value)
+openstack_openid_endpoint = https://openstackid.org/accounts/openid2
+
+# OpenStackID logout URI. (string value)
+openid_logout_endpoint = https://openstackid.org/accounts/user/logout
+
+# Interaction mode. Specifies whether Openstack Id IdP may interact
+# with the user to determine the outcome of the request. (string
+# value)
+openid_mode = checkid_setup
+
+# Protocol version. Value identifying the OpenID protocol version
+# being used. This value should be "http://specs.openid.net/auth/2.0".
+# (string value)
+openid_ns = http://specs.openid.net/auth/2.0
+
+# Return endpoint in Refstack's API. Value indicating the endpoint
+# where the user should be returned to after signing in. Openstack Id
+# Idp only supports HTTPS address types. (string value)
+openid_return_to = /api/v1/auth/signin_return
+
+# Claimed identifier. This value must be set to
+# "http://specs.openid.net/auth/2.0/identifier_select". or to user
+# claimed identity (user local identifier or user owned identity [ex:
+# custom html hosted on a owned domain set to html discover]). (string
+# value)
+openid_claimed_id = http://specs.openid.net/auth/2.0/identifier_select
+
+# Alternate identifier. This value must be set to
+# http://specs.openid.net/auth/2.0/identifier_select. (string value)
+openid_identity = http://specs.openid.net/auth/2.0/identifier_select
+
+# Indicates request for user attribute information. This value must be
+# set to "http://openid.net/extensions/sreg/1.1". (string value)
+openid_ns_sreg = http://openid.net/extensions/sreg/1.1
+
+# Comma-separated list of field names which, if absent from the
+# response, will prevent the Consumer from completing the registration
+# without End User interation. The field names are those that are
+# specified in the Response Format, with the "openid.sreg." prefix
+# removed. Valid values include: "country", "email", "firstname",
+# "language", "lastname" (string value)
+openid_sreg_required = email,fullname
index ebe5994..7bd3430 100644 (file)
@@ -15,11 +15,11 @@ from opnfv_testapi.resources import project_handlers
 from opnfv_testapi.resources import result_handlers
 from opnfv_testapi.resources import scenario_handlers
 from opnfv_testapi.resources import testcase_handlers
-import opnfv_testapi.resources.ui_handlers
+from opnfv_testapi.ui import root
+from opnfv_testapi.ui.auth import handlers as auth_handlers
 
 mappings = [
     # GET /versions => GET API version
-    (r'/', opnfv_testapi.resources.ui_handlers.UIHandler),
     (r"/versions", handlers.VersionHandler),
 
     # few examples:
@@ -54,7 +54,11 @@ mappings = [
     (r"/api/v1/scenarios/([^/]+)", scenario_handlers.ScenarioGURHandler),
 
     # static path
-    (r'/(.*\.(css|png|gif|js|html|json))',
+    (r'/(.*\.(css|png|gif|js|html|json|map))',
      tornado.web.StaticFileHandler,
      {'path': config.Config().static_path}),
+
+    (r'/', root.RootHandler),
+    (r'/api/v1/auth/signin', auth_handlers.SigninHandler),
+    (r'/api/v1/auth/signin_return', auth_handlers.SigninReturnHandler),
 ]
diff --git a/utils/test/testapi/opnfv_testapi/ui/__init__.py b/utils/test/testapi/opnfv_testapi/ui/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/utils/test/testapi/opnfv_testapi/ui/auth/__init__.py b/utils/test/testapi/opnfv_testapi/ui/auth/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/utils/test/testapi/opnfv_testapi/ui/auth/constants.py b/utils/test/testapi/opnfv_testapi/ui/auth/constants.py
new file mode 100644 (file)
index 0000000..ec59751
--- /dev/null
@@ -0,0 +1,14 @@
+# OpenID parameters
+OPENID_MODE = 'openid.mode'
+OPENID_NS = 'openid.ns'
+OPENID_RETURN_TO = 'openid.return_to'
+OPENID_CLAIMED_ID = 'openid.claimed_id'
+OPENID_IDENTITY = 'openid.identity'
+OPENID_REALM = 'openid.realm'
+OPENID_NS_SREG = 'openid.ns.sreg'
+OPENID_NS_SREG_REQUIRED = 'openid.sreg.required'
+OPENID_NS_SREG_EMAIL = 'openid.sreg.email'
+OPENID_NS_SREG_FULLNAME = 'openid.sreg.fullname'
+OPENID_ERROR = 'openid.error'
+
+CSRF_TOKEN = 'csrf_token'
diff --git a/utils/test/testapi/opnfv_testapi/ui/auth/handlers.py b/utils/test/testapi/opnfv_testapi/ui/auth/handlers.py
new file mode 100644 (file)
index 0000000..511952d
--- /dev/null
@@ -0,0 +1,37 @@
+from six.moves.urllib import parse
+
+from opnfv_testapi.common import config
+from opnfv_testapi.resources import handlers
+from opnfv_testapi.ui.auth import constants as const
+from opnfv_testapi.ui.auth import utils
+
+
+CONF = config.Config()
+
+
+class SigninHandler(handlers.GenericApiHandler):
+    def get(self):
+        csrf_token = utils.get_token()
+        return_endpoint = parse.urljoin(CONF.api_url,
+                                        CONF.osid_openid_return_to)
+        return_to = utils.set_query_params(return_endpoint,
+                                           {const.CSRF_TOKEN: csrf_token})
+
+        params = {
+            const.OPENID_MODE: CONF.osid_openid_mode,
+            const.OPENID_NS: CONF.osid_openid_ns,
+            const.OPENID_RETURN_TO: return_to,
+            const.OPENID_CLAIMED_ID: CONF.osid_openid_claimed_id,
+            const.OPENID_IDENTITY: CONF.osid_openid_identity,
+            const.OPENID_REALM: CONF.api_url,
+            const.OPENID_NS_SREG: CONF.osid_openid_ns_sreg,
+            const.OPENID_NS_SREG_REQUIRED: CONF.osid_openid_sreg_required,
+        }
+        url = CONF.osid_openstack_openid_endpoint
+        url = utils.set_query_params(url, params)
+        self.redirect(url=url, permanent=False)
+
+
+class SigninReturnHandler(handlers.GenericApiHandler):
+    def get(self):
+        self.redirect(url=CONF.ui_url)
diff --git a/utils/test/testapi/opnfv_testapi/ui/auth/utils.py b/utils/test/testapi/opnfv_testapi/ui/auth/utils.py
new file mode 100644 (file)
index 0000000..c3912ad
--- /dev/null
@@ -0,0 +1,23 @@
+import random
+import string
+
+from six.moves.urllib import parse
+
+
+def get_token(length=30):
+    """Get random token."""
+    return ''.join(random.choice(string.ascii_lowercase)
+                   for i in range(length))
+
+
+def set_query_params(url, params):
+    """Set params in given query."""
+    url_parts = parse.urlparse(url)
+    url = parse.urlunparse((
+        url_parts.scheme,
+        url_parts.netloc,
+        url_parts.path,
+        url_parts.params,
+        parse.urlencode(params),
+        url_parts.fragment))
+    return url
@@ -2,8 +2,7 @@ from opnfv_testapi.resources.handlers import GenericApiHandler
 from opnfv_testapi.common import config
 
 
-class UIHandler(GenericApiHandler):
-
+class RootHandler(GenericApiHandler):
     def get_template_path(self):
         return config.Config().static_path
 
index ee144d2..955ffc8 100644 (file)
@@ -6,4 +6,5 @@ pbr>=1.6
 setuptools>=16.0
 tornado>=3.1,<=4.3
 epydoc>=0.3.1
+six>=1.9.0
 motor