summaryrefslogtreecommitdiff
path: root/keystoneclient
diff options
context:
space:
mode:
authorMaho Koshiya <koshiya.maho@po.ntts.co.jp>2016-09-03 09:13:37 +0900
committerdineshbhor <dinesh.bhor@nttdata.com>2018-03-26 01:55:58 -0700
commitd3ea00e6d85a2dce09851fc9b05d67cdb6266ecd (patch)
treed440b86bc67650c267104079a18fbfea1f2ce1fe /keystoneclient
parentb2e9caee38ca66147552a8f677468becf812e16e (diff)
downloadpython-keystoneclient-d3ea00e6d85a2dce09851fc9b05d67cdb6266ecd.tar.gz
Add return-request-id-to-caller function(v3)
Added return-request-id-to-caller function to resources and resource managers in the following files. * keystoneclient/v3/projects.py The methods in the resource class and resource manager return a wrapper class that has 'request_ids' property. The caller can get request ids of the callee via the property. NOTE: Remaining resources from the V3 package are already covered in the base patch: https://review.openstack.org/#/c/329913/ Change-Id: I0133d51cfadc02e2dd926b8b0419b2e1dd0fa92a Co-authored-by: Ankit Agrawal <ankit11.agrawal@nttdata.com> Co-authored-by: Dinesh Bhor <dinesh.bhor@nttdata.com> Implements: blueprint return-request-id-to-caller
Diffstat (limited to 'keystoneclient')
-rw-r--r--keystoneclient/tests/unit/v3/test_projects.py73
-rw-r--r--keystoneclient/v3/projects.py16
2 files changed, 87 insertions, 2 deletions
diff --git a/keystoneclient/tests/unit/v3/test_projects.py b/keystoneclient/tests/unit/v3/test_projects.py
index 8933bbf..fd91bac 100644
--- a/keystoneclient/tests/unit/v3/test_projects.py
+++ b/keystoneclient/tests/unit/v3/test_projects.py
@@ -10,12 +10,17 @@
# License for the specific language governing permissions and limitations
# under the License.
+import fixtures
+import requests
import uuid
from keystoneauth1 import exceptions as ksa_exceptions
+from keystoneauth1.identity import v3
+from keystoneauth1 import session
from keystoneclient import exceptions as ksc_exceptions
from keystoneclient.tests.unit.v3 import utils
+from keystoneclient.v3 import client
from keystoneclient.v3 import projects
@@ -395,3 +400,71 @@ class ProjectTests(utils.ClientTestCase, utils.CrudTests):
"name": project_id}
]}
return ret
+
+
+class ProjectsRequestIdTests(utils.TestCase):
+
+ url = "/projects"
+ resp = requests.Response()
+ TEST_REQUEST_ID = uuid.uuid4().hex
+ resp.headers['x-openstack-request-id'] = TEST_REQUEST_ID
+
+ def setUp(self):
+ super(ProjectsRequestIdTests, self).setUp()
+ auth = v3.Token(auth_url='http://127.0.0.1:5000',
+ token=self.TEST_TOKEN)
+ session_ = session.Session(auth=auth)
+ self.client = client.Client(session=session_,
+ include_metadata='True')._adapter
+ self.mgr = projects.ProjectManager(self.client)
+ self.mgr.resource_class = projects.Project
+
+ def _mock_request_method(self, method=None, body=None):
+ return self.useFixture(fixtures.MockPatchObject(
+ self.client, method, autospec=True,
+ return_value=(self.resp, body))
+ ).mock
+
+ def test_get_project(self):
+ body = {"project": {"name": "admin"}}
+ get_mock = self._mock_request_method(method='get', body=body)
+
+ response = self.mgr.get(project='admin')
+ self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID)
+ get_mock.assert_called_once_with(self.url + '/admin')
+
+ def test_create_project(self):
+ body = {"project": {"name": "admin", "domain": "admin"}}
+ post_mock = self._mock_request_method(method='post', body=body)
+
+ response = self.mgr.create('admin', 'admin')
+ self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID)
+ post_mock.assert_called_once_with(self.url, body={'project': {
+ 'name': 'admin', 'enabled': True, 'domain_id': 'admin'}})
+
+ def test_list_project(self):
+ body = {"projects": [{"name": "admin"}, {"name": "admin"}]}
+ get_mock = self._mock_request_method(method='get', body=body)
+
+ returned_list = self.mgr.list()
+ self.assertEqual(returned_list.request_ids[0], self.TEST_REQUEST_ID)
+ get_mock.assert_called_once_with(self.url + '?')
+
+ def test_update_project(self):
+ body = {"project": {"name": "admin"}}
+ patch_mock = self._mock_request_method(method='patch', body=body)
+
+ put_mock = self._mock_request_method(method='put', body=body)
+
+ response = self.mgr.update("admin", domain='demo')
+ self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID)
+ patch_mock.assert_called_once_with(self.url + '/admin', body={
+ 'project': {'domain_id': 'demo'}})
+ self.assertFalse(put_mock.called)
+
+ def test_delete_project(self):
+ get_mock = self._mock_request_method(method='delete')
+
+ _, resp = self.mgr.delete("admin")
+ self.assertEqual(resp.request_ids[0], self.TEST_REQUEST_ID)
+ get_mock.assert_called_once_with(self.url + '/admin')
diff --git a/keystoneclient/v3/projects.py b/keystoneclient/v3/projects.py
index 79f8c93..aa94293 100644
--- a/keystoneclient/v3/projects.py
+++ b/keystoneclient/v3/projects.py
@@ -136,9 +136,21 @@ class ProjectManager(base.CrudManager):
domain_id=base.getid(domain),
fallback_to_auth=True,
**kwargs)
- for p in projects:
+
+ base_response = None
+ list_data = projects
+ if self.client.include_metadata:
+ base_response = projects
+ list_data = projects.data
+ base_response.data = list_data
+
+ for p in list_data:
p.tags = self._encode_tags(getattr(p, 'tags', []))
- return projects
+
+ if self.client.include_metadata:
+ base_response.data = list_data
+
+ return base_response if self.client.include_metadata else list_data
def _check_not_parents_as_ids_and_parents_as_list(self, parents_as_ids,
parents_as_list):