From 3c8a29c8fcf7d5752dd6a5fc787b9d753c9bda00 Mon Sep 17 00:00:00 2001 From: Tetsuro Nakamura Date: Sun, 22 Jul 2018 16:29:02 +0900 Subject: [PATCH] Add create/delete reservation provider This patch adds wrapper methods to create/delete blazar reservation provider in the placement client. Change-Id: I1d4d4c5589dd3b5bb62344294627c6eef458baba Blueprint: placement-api --- .../tests/utils/openstack/test_placement.py | 85 +++++++++++++++++++ blazar/utils/openstack/placement.py | 17 ++++ 2 files changed, 102 insertions(+) diff --git a/blazar/tests/utils/openstack/test_placement.py b/blazar/tests/utils/openstack/test_placement.py index 64990eac..9daa0be4 100644 --- a/blazar/tests/utils/openstack/test_placement.py +++ b/blazar/tests/utils/openstack/test_placement.py @@ -200,3 +200,88 @@ class TestPlacementClient(tests.TestCase): self.assertRaises( exceptions.ResourceProviderDeletionFailed, self.client.delete_resource_provider, rp_uuid) + + @mock.patch('keystoneauth1.session.Session.request') + def test_create_reservation_provider(self, kss_req): + host_uuid = uuidutils.generate_uuid() + host_name = "compute-1" + rp_uuid = uuidutils.generate_uuid() + rp_name = "blazar_compute-1" + get_json_mock = { + 'resource_providers': [ + { + 'uuid': host_uuid, + 'name': host_name, + 'generation': 0, + 'parent_provider_uuid': None + } + ] + } + post_json_mock = {'uuid': rp_uuid, + 'name': rp_name, + 'generation': 0, + 'parent_provider_uuid': host_uuid} + mock_call1 = fake_requests.FakeResponse( + 200, content=json.dumps(get_json_mock)) + mock_call2 = fake_requests.FakeResponse( + 200, content=json.dumps(post_json_mock)) + kss_req.side_effect = [mock_call1, mock_call2] + + self.client.create_reservation_provider(host_name) + + expected_url_get = "/resource_providers?name=%s" % host_name + kss_req.assert_any_call( + expected_url_get, 'GET', + endpoint_filter={'service_type': 'placement', + 'interface': 'public'}, + headers={'accept': 'application/json'}, + microversion=PLACEMENT_MICROVERSION, raise_exc=False) + + expected_url_post = "/resource_providers" + kss_req.assert_any_call( + expected_url_post, 'POST', + endpoint_filter={'service_type': 'placement', + 'interface': 'public'}, + json={'name': 'blazar_compute-1', + 'parent_provider_uuid': host_uuid}, + headers={'accept': 'application/json'}, + microversion=PLACEMENT_MICROVERSION, raise_exc=False) + + @mock.patch('keystoneauth1.session.Session.request') + def test_delete_reservation_provider(self, kss_req): + host_uuid = uuidutils.generate_uuid() + host_name = "compute-1" + rp_uuid = uuidutils.generate_uuid() + rp_name = "blazar_compute-1" + get_json_mock = { + 'resource_providers': [ + { + 'uuid': rp_uuid, + 'name': rp_name, + 'generation': 0, + 'parent_provider_uuid': host_uuid + } + ] + } + mock_call1 = fake_requests.FakeResponse( + 200, content=json.dumps(get_json_mock)) + mock_call2 = fake_requests.FakeResponse(200) + kss_req.side_effect = [mock_call1, mock_call2] + + self.client.delete_reservation_provider(host_name) + + expected_url_get = "/resource_providers?name=%s" % rp_name + kss_req.assert_any_call( + expected_url_get, 'GET', + endpoint_filter={'service_type': 'placement', + 'interface': 'public'}, + headers={'accept': 'application/json'}, + microversion=PLACEMENT_MICROVERSION, raise_exc=False) + + expected_url_post = "/resource_providers/%s" % rp_uuid + kss_req.assert_any_call( + expected_url_post, 'DELETE', + endpoint_filter={'service_type': 'placement', + 'interface': 'public'}, + headers={'accept': 'application/json'}, + microversion=PLACEMENT_MICROVERSION, raise_exc=False) diff --git a/blazar/utils/openstack/placement.py b/blazar/utils/openstack/placement.py index 69fbbd44..51a26b1d 100644 --- a/blazar/utils/openstack/placement.py +++ b/blazar/utils/openstack/placement.py @@ -177,3 +177,20 @@ class BlazarPlacementClient(object): } LOG.error(msg, args) raise exceptions.ResourceProviderDeletionFailed(uuid=rp_uuid) + + def create_reservation_provider(self, host_name): + """Create a reservation provider as a child of the given host""" + host_rp = self.get_resource_provider(host_name) + host_uuid = host_rp['uuid'] + rp_name = "blazar_" + host_name + + reservation_rp = self.create_resource_provider( + rp_name, parent_uuid=host_uuid) + return reservation_rp + + def delete_reservation_provider(self, host_name): + """Delete the reservation provider, the child of the given host""" + rp_name = "blazar_" + host_name + rp = self.get_resource_provider(rp_name) + rp_uuid = rp['uuid'] + self.delete_resource_provider(rp_uuid)