Add the /moon/auth/tokens API 31/12631/1
authorasteroide <thomas.duval@orange.com>
Mon, 25 Apr 2016 09:25:28 +0000 (11:25 +0200)
committerasteroide <thomas.duval@orange.com>
Mon, 25 Apr 2016 09:25:28 +0000 (11:25 +0200)
Change-Id: I4c0dd7c0e3f4dcae8d122c466cf93ac28d7c37f6

keystone-moon/doc/source/extensions/moon/moon_api.rst
keystone-moon/keystone/contrib/moon/controllers.py
keystone-moon/keystone/contrib/moon/routers.py
keystone-moon/keystone/tests/moon/func/test_func_moon_auth.py [new file with mode: 0644]

index f2546d4..6925d6b 100644 (file)
@@ -3,12 +3,12 @@ Moon API
 
 Here are Moon API with some examples of posted data and returned data.
 
-All requests must be prefexied by /v3/OS-MOON.
+All requests must be prefexied by /moon/v3/OS-MOON.
 
 Authz
 -----
 
-**GET     /authz/{tenant_id}/{subject_k_id}/{object_name}/{action_name}**
+**GET     /moon/authz/{tenant_id}/{subject_k_id}/{object_name}/{action_name}**
   Authorization API.
 
 .. code-block:: json
@@ -24,7 +24,7 @@ Intra-Extension API
 Configuration
 ~~~~~~~~~~~~~
 
-**GET     /configuration/templates**
+**GET     /moon/configuration/templates**
 
     List all policy templates.
 
@@ -38,7 +38,7 @@ Configuration
                }
 
 
-**GET     /configuration/aggregation_algorithms**
+**GET     /moon/configuration/aggregation_algorithms**
 
     List all aggregation algorithms.
 
@@ -52,7 +52,7 @@ Configuration
                }
 
 
-**GET     /configuration/sub_meta_rule_algorithms**
+**GET     /moon/configuration/sub_meta_rule_algorithms**
 
     List all sub meta rule algorithms.
 
@@ -69,7 +69,7 @@ Configuration
 Tenants
 ~~~~~~~
 
-**GET     /tenants**
+**GET     /moon/tenants**
 
     List all tenants.
 
@@ -85,7 +85,7 @@ Tenants
                }
 
 
-**POST    /tenants**
+**POST    /moon/tenants**
 
     Add a tenant.
 
@@ -107,7 +107,7 @@ Tenants
                }
 
 
-**POST    /tenants/{tenant_id}**
+**POST    /moon/tenants/{tenant_id}**
 
     Show information of one tenant.
 
@@ -123,7 +123,7 @@ Tenants
                }
 
 
-**POST    /tenants/{tenant_id}**
+**POST    /moon/tenants/{tenant_id}**
 
     Modify a tenant.
 
@@ -145,7 +145,7 @@ Tenants
                }
 
 
-**DELETE  /tenants/{tenant_id}**
+**DELETE  /moon/tenants/{tenant_id}**
 
     Delete a tenant.
 
@@ -157,7 +157,7 @@ Tenants
 Intra-Extension
 ~~~~~~~~~~~~~~~
 
-**GET     /intra_extensions/init**
+**GET     /moon/intra_extensions/init**
 
     Initialize the root Intra_Extension (if needed).
 
@@ -166,7 +166,7 @@ Intra-Extension
                return = {}
 
 
-**GET     /intra_extensions**
+**GET     /moon/intra_extensions**
 
     List all Intra_Extensions.
 
@@ -180,7 +180,7 @@ Intra-Extension
                }
 
 
-**POST    /intra_extensions**
+**POST    /moon/intra_extensions**
 
     Create a new Intra_Extension.
 
@@ -195,7 +195,7 @@ Intra-Extension
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/**
+**GET     /moon/intra_extensions/{intra_extension_id}/**
 
     Show details about one Intra_Extension.
 
@@ -210,7 +210,7 @@ Intra-Extension
                }
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/**
 
     Delete an Intra_Extension.
 
@@ -222,7 +222,7 @@ Intra-Extension
 Intra-Extension Subjects
 ~~~~~~~~~~~~~~~~~~~~~~~~
 
-**GET     /intra_extensions/{intra_extension_id}/subjects**
+**GET     /moon/intra_extensions/{intra_extension_id}/subjects**
 
     List all subjects.
 
@@ -236,7 +236,7 @@ Intra-Extension Subjects
                }
 
 
-**POST    /intra_extensions/{intra_extension_id}/subjects**
+**POST    /moon/intra_extensions/{intra_extension_id}/subjects**
 
     List all subjects.
 
@@ -256,7 +256,7 @@ Intra-Extension Subjects
                }
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/subjects/{subject_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/subjects/{subject_id}**
 
     Delete a subject.
 
@@ -265,7 +265,7 @@ Intra-Extension Subjects
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/subject_categories**
+**GET     /moon/intra_extensions/{intra_extension_id}/subject_categories**
 
     List all subject categories.
 
@@ -279,7 +279,7 @@ Intra-Extension Subjects
                }
 
 
-**POST    /intra_extensions/{intra_extension_id}/subject_categories**
+**POST    /moon/intra_extensions/{intra_extension_id}/subject_categories**
 
     Add a new subject category.
 
@@ -297,7 +297,7 @@ Intra-Extension Subjects
                }
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/subject_categories/{subject_category_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/subject_categories/{subject_category_id}**
 
     Delete a subject category.
 
@@ -306,7 +306,7 @@ Intra-Extension Subjects
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}**
+**GET     /moon/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}**
 
     List all subject scopes for a specific subject category.
 
@@ -320,7 +320,7 @@ Intra-Extension Subjects
                }
 
 
-**POST    /intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}**
+**POST    /moon/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}**
 
     Add a new subject scope for a specific subject category.
 
@@ -338,7 +338,7 @@ Intra-Extension Subjects
                }
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}/{subject_scope_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}/{subject_scope_id}**
 
     Delete a subject scope.
 
@@ -347,7 +347,7 @@ Intra-Extension Subjects
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/subject_assignments/{subject_id}/{subject_category_id}**
+**GET     /moon/intra_extensions/{intra_extension_id}/subject_assignments/{subject_id}/{subject_category_id}**
 
     List all subject assignments for a subject and for a subject category.
 
@@ -358,7 +358,7 @@ Intra-Extension Subjects
                ]
 
 
-**POST    /intra_extensions/{intra_extension_id}/subject_assignments**
+**POST    /moon/intra_extensions/{intra_extension_id}/subject_assignments**
 
     Add an assignment.
 
@@ -374,7 +374,7 @@ Intra-Extension Subjects
                ]
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/subject_assignments/{subject_id}/{subject_category_id}/{subject_scope_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/subject_assignments/{subject_id}/{subject_category_id}/{subject_scope_id}**
 
     Delete a subject assignment.
 
@@ -386,7 +386,7 @@ Intra-Extension Subjects
 Intra-Extension Objects
 ~~~~~~~~~~~~~~~~~~~~~~~
 
-**GET     /intra_extensions/{intra_extension_id}/objects**
+**GET     /moon/intra_extensions/{intra_extension_id}/objects**
 
     List all objects.
 
@@ -400,7 +400,7 @@ Intra-Extension Objects
                }
 
 
-**POST    /intra_extensions/{intra_extension_id}/objects**
+**POST    /moon/intra_extensions/{intra_extension_id}/objects**
 
     List all objects.
 
@@ -418,7 +418,7 @@ Intra-Extension Objects
                }
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/objects/{object_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/objects/{object_id}**
 
     Delete a object.
 
@@ -427,7 +427,7 @@ Intra-Extension Objects
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/object_categories**
+**GET     /moon/intra_extensions/{intra_extension_id}/object_categories**
 
     List all object categories.
 
@@ -441,7 +441,7 @@ Intra-Extension Objects
                }
 
 
-**POST    /intra_extensions/{intra_extension_id}/object_categories**
+**POST    /moon/intra_extensions/{intra_extension_id}/object_categories**
 
     Add a new object category.
 
@@ -459,7 +459,7 @@ Intra-Extension Objects
                }
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/object_categories/{object_category_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/object_categories/{object_category_id}**
 
     Delete a object category.
 
@@ -468,7 +468,7 @@ Intra-Extension Objects
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}**
+**GET     /moon/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}**
 
     List all object scopes for a specific object category.
 
@@ -482,7 +482,7 @@ Intra-Extension Objects
                }
 
 
-**POST    /intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}**
+**POST    /moon/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}**
 
     Add a new object scope for a specific object category.
 
@@ -500,7 +500,7 @@ Intra-Extension Objects
                }
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}/{object_scope_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}/{object_scope_id}**
 
     Delete a object scope.
 
@@ -509,7 +509,7 @@ Intra-Extension Objects
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/object_assignments/{object_id}/{object_category_id}**
+**GET     /moon/intra_extensions/{intra_extension_id}/object_assignments/{object_id}/{object_category_id}**
 
     List all object assignments for a object and for a object category.
 
@@ -520,7 +520,7 @@ Intra-Extension Objects
                ]
 
 
-**POST    /intra_extensions/{intra_extension_id}/object_assignments**
+**POST    /moon/intra_extensions/{intra_extension_id}/object_assignments**
 
     Add an assignment.
 
@@ -536,7 +536,7 @@ Intra-Extension Objects
                ]
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/object_assignments/{object_id}/{object_category_id}/{object_scope_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/object_assignments/{object_id}/{object_category_id}/{object_scope_id}**
 
     Delete a object assignment.
 
@@ -548,7 +548,7 @@ Intra-Extension Objects
 Intra-Extension Actions
 ~~~~~~~~~~~~~~~~~~~~~~~
 
-**GET     /intra_extensions/{intra_extension_id}/actions**
+**GET     /moon/intra_extensions/{intra_extension_id}/actions**
 
     List all actions.
 
@@ -562,7 +562,7 @@ Intra-Extension Actions
                }
 
 
-**POST    /intra_extensions/{intra_extension_id}/actions**
+**POST    /moon/intra_extensions/{intra_extension_id}/actions**
 
     List all actions.
 
@@ -582,7 +582,7 @@ Intra-Extension Actions
                }
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/actions/{action_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/actions/{action_id}**
 
     Delete a action.
 
@@ -591,7 +591,7 @@ Intra-Extension Actions
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/action_categories**
+**GET     /moon/intra_extensions/{intra_extension_id}/action_categories**
 
     List all action categories.
 
@@ -605,7 +605,7 @@ Intra-Extension Actions
                }
 
 
-**POST    /intra_extensions/{intra_extension_id}/action_categories**
+**POST    /moon/intra_extensions/{intra_extension_id}/action_categories**
 
     Add a new action category.
 
@@ -623,7 +623,7 @@ Intra-Extension Actions
                }
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/action_categories/{action_category_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/action_categories/{action_category_id}**
 
     Delete a action category.
 
@@ -632,7 +632,7 @@ Intra-Extension Actions
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}**
+**GET     /moon/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}**
 
     List all action scopes for a specific action category.
 
@@ -646,7 +646,7 @@ Intra-Extension Actions
                }
 
 
-**POST    /intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}**
+**POST    /moon/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}**
 
     Add a new action scope for a specific action category.
 
@@ -664,7 +664,7 @@ Intra-Extension Actions
                }
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}/{action_scope_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}/{action_scope_id}**
 
     Delete a action scope.
 
@@ -673,7 +673,7 @@ Intra-Extension Actions
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/action_assignments/{action_id}/{action_category_id}**
+**GET     /moon/intra_extensions/{intra_extension_id}/action_assignments/{action_id}/{action_category_id}**
 
     List all action assignments for a action and for a action category.
 
@@ -684,7 +684,7 @@ Intra-Extension Actions
                ]
 
 
-**POST    /intra_extensions/{intra_extension_id}/action_assignments**
+**POST    /moon/intra_extensions/{intra_extension_id}/action_assignments**
 
     Add an assignment.
 
@@ -700,7 +700,7 @@ Intra-Extension Actions
                ]
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/action_assignments/{action_id}/{action_category_id}/{action_scope_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/action_assignments/{action_id}/{action_category_id}/{action_scope_id}**
 
     Delete a action assignment.
 
@@ -712,7 +712,7 @@ Intra-Extension Actions
 Intra-Extension Rules
 ~~~~~~~~~~~~~~~~~~~~~
 
-**GET     /intra_extensions/{intra_extension_id}/aggregation_algorithm**
+**GET     /moon/intra_extensions/{intra_extension_id}/aggregation_algorithm**
 
     List aggregation algorithm for an intra extension.
 
@@ -726,7 +726,7 @@ Intra-Extension Rules
                }
 
 
-**POST    /intra_extensions/{intra_extension_id}/aggregation_algorithm**
+**POST    /moon/intra_extensions/{intra_extension_id}/aggregation_algorithm**
 
     Set the current aggregation algorithm for an intra extension.
 
@@ -744,7 +744,7 @@ Intra-Extension Rules
                }
 
 
-**GET     /intra_extensions/{intra_extension_id}/sub_meta_rules**
+**GET     /moon/intra_extensions/{intra_extension_id}/sub_meta_rules**
 
     Show the current sub meta rules.
 
@@ -766,7 +766,7 @@ Intra-Extension Rules
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}**
+**GET     /moon/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}**
 
     Set the current sub meta rule.
 
@@ -782,7 +782,7 @@ Intra-Extension Rules
                return = {}
 
 
-**GET     /intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}**
+**GET     /moon/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}**
 
     List all rules.
 
@@ -794,7 +794,7 @@ Intra-Extension Rules
                }
 
 
-**POST    /intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}**
+**POST    /moon/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}**
 
     Add a new rule.
 
@@ -809,7 +809,7 @@ Intra-Extension Rules
                return = {}
 
 
-**DELETE  /intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}/{rule_id}**
+**DELETE  /moon/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}/{rule_id}**
 
     Delete a rule.
 
@@ -821,7 +821,7 @@ Intra-Extension Rules
 Logs
 ~~~~
 
-**GET     /logs/{options}**
+**GET     /moon/logs/{options}**
 
     List all logs.
     Options can be:
@@ -842,3 +842,22 @@ Logs
                     "2015-04-15-13:45:23 ..."
                ]
 
+Auth
+~~~~
+
+**POST    /moon/auth/tokens**
+
+    Add a tenant.
+
+.. code-block:: json
+
+               post = {
+                    "username": "name of the user to authenticate",
+                    "password": "password of the user to authenticate"
+               }
+               return = {
+                    "token": "NEW_TOKEN",
+                    "message": "if authentication failed..."
+               }
+
+
index 0abe31b..248aea3 100644 (file)
@@ -4,12 +4,13 @@
 # or at 'http://www.apache.org/licenses/LICENSE-2.0'.
 
 from keystone.common import controller
-from keystone.common import dependency
 from keystone import config
 from keystone.models import token_model
 from keystone.contrib.moon.exception import *
 from oslo_log import log
 from uuid import uuid4
+import requests
+
 
 CONF = config.CONF
 LOG = log.getLogger(__name__)
@@ -831,3 +832,40 @@ class Logs(controller.V3Controller):
         options = kw.get('options', '')
         return self.moonlog_api.get_logs(user_id, options)
 
+
+class MoonAuth(controller.V3Controller):
+
+    def __init__(self):
+        super(MoonAuth, self).__init__()
+
+    def get_token(self, context, **kw):
+        data_auth = {
+            "auth": {
+                "identity": {
+                    "methods": [
+                        "password"
+                    ],
+                    "password": {
+                        "user": {
+                            "domain": {
+                                "id": "Default"
+                            },
+                            "name": kw['username'],
+                            "password": kw['password']
+                        }
+                    }
+                }
+            }
+        }
+
+        req = requests.post("http://localhost:5000/v3/auth/tokens",
+                            json=data_auth,
+                            headers={"Content-Type": "application/json"}
+                            )
+        if req.status_code not in (200, 201):
+            LOG.error(req.text)
+        else:
+            TOKEN = req.headers['X-Subject-Token']
+            return {"token": TOKEN, 'message': ""}
+        return {"token": None, 'message': req.text}
+
index fd821a4..c3bb7df 100644 (file)
@@ -36,6 +36,7 @@ class Routers(wsgi.ComposableRouter):
         intra_ext_controller = controllers.IntraExtensions()
         tenants_controller = controllers.Tenants()
         logs_controller = controllers.Logs()
+        auth_controller = controllers.MoonAuth()
         inter_ext_controller = controllers.InterExtensions()
 
         # Configuration route
@@ -480,6 +481,13 @@ class Routers(wsgi.ComposableRouter):
             action='get_logs',
             conditions=dict(method=['GET']))
 
+        # Auth route
+        mapper.connect(
+            self.PATH_PREFIX+'/auth/tokens',
+            controller=auth_controller,
+            action='get_token',
+            conditions=dict(method=['POST']))
+
         # InterExtensions route
         # mapper.connect(
         #     controller=inter_ext_controller,
diff --git a/keystone-moon/keystone/tests/moon/func/test_func_moon_auth.py b/keystone-moon/keystone/tests/moon/func/test_func_moon_auth.py
new file mode 100644 (file)
index 0000000..5613260
--- /dev/null
@@ -0,0 +1,48 @@
+# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
+# This software is distributed under the terms and conditions of the 'Apache-2.0'
+# license which can be found in the file 'LICENSE' in this package distribution
+# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
+
+import unittest
+import json
+import requests
+
+
+class AuthTest(unittest.TestCase):
+
+    def setUp(self):
+        self.data_auth = {
+            "username": "",
+            "password": ""
+        }
+
+    def tearDown(self):
+        pass
+
+    def test_authz(self):
+        self.data_auth['username'] = 'admin'
+        self.data_auth['password'] = ''
+        req = requests.post("http://localhost:5000/moon/auth/tokens",
+                            json=self.data_auth,
+                            headers={"Content-Type": "application/json"}
+                            )
+        self.assertIn(req.status_code, (200, 201))
+        result = req.json()
+        self.assertIn("token", result.keys())
+        self.assertEqual(result["token"], None)
+
+        self.data_auth['username'] = 'admin'
+        self.data_auth['password'] = 'nomoresecrete'
+        req = requests.post("http://localhost:5000/moon/auth/tokens",
+                            json=self.data_auth,
+                            headers={"Content-Type": "application/json"}
+                            )
+        self.assertIn(req.status_code, (200, 201))
+        result = req.json()
+        self.assertIn("token", result.keys())
+        self.assertNotEqual(result["token"], None)
+
+if __name__ == "__main__":
+    unittest.main()
+
+