Merge "Add create/delete resource class"

This commit is contained in:
Zuul 2018-10-18 17:59:02 +00:00 committed by Gerrit Code Review
commit 44bc4383ab
3 changed files with 118 additions and 0 deletions

View File

@ -285,3 +285,52 @@ class TestPlacementClient(tests.TestCase):
'interface': 'public'},
headers={'accept': 'application/json'},
microversion=PLACEMENT_MICROVERSION, raise_exc=False)
@mock.patch('keystoneauth1.session.Session.request')
def test_create_reservation_class(self, kss_req):
rc_name = 'abc-def'
kss_req.return_value = fake_requests.FakeResponse(200)
self.client.create_reservation_class(rc_name)
expected_url = '/resource_classes'
kss_req.assert_called_once_with(
expected_url, 'POST',
endpoint_filter={'service_type': 'placement',
'interface': 'public'},
json={'name': 'CUSTOM_RESERVATION_ABC_DEF'},
headers={'accept': 'application/json'},
microversion=PLACEMENT_MICROVERSION, raise_exc=False)
@mock.patch('keystoneauth1.session.Session.request')
def test_create_reservation_class_fail(self, kss_req):
rc_name = 'abc-def'
kss_req.return_value = fake_requests.FakeResponse(400)
self.assertRaises(
exceptions.ResourceClassCreationFailed,
self.client.create_reservation_class, rc_name)
@mock.patch('keystoneauth1.session.Session.request')
def test_delete_reservation_class(self, kss_req):
rc_name = 'abc-def'
kss_req.return_value = fake_requests.FakeResponse(200)
self.client.delete_reservation_class(rc_name)
expected_url = '/resource_classes/CUSTOM_RESERVATION_ABC_DEF'
kss_req.assert_called_once_with(
expected_url, 'DELETE',
endpoint_filter={'service_type': 'placement',
'interface': 'public'},
headers={'accept': 'application/json'},
microversion=PLACEMENT_MICROVERSION, raise_exc=False)
@mock.patch('keystoneauth1.session.Session.request')
def test_delete_reservation_class_fail(self, kss_req):
rc_name = 'CUSTOM_RESERVATION_abc-def'
kss_req.return_value = fake_requests.FakeResponse(400)
self.assertRaises(
exceptions.ResourceClassDeletionFailed,
self.client.delete_reservation_class, rc_name)

View File

@ -25,3 +25,11 @@ class ResourceProviderCreationFailed(exceptions.BlazarException):
class ResourceProviderDeletionFailed(exceptions.BlazarException):
msg_fmt = _("Failed to delete resource provider %(uuid)s")
class ResourceClassCreationFailed(exceptions.BlazarException):
msg_fmt = _("Failed to create resource class '%(resource_class)s'")
class ResourceClassDeletionFailed(exceptions.BlazarException):
msg_fmt = _("Failed to delete resource class '%(resource_class)s'")

View File

@ -194,3 +194,64 @@ class BlazarPlacementClient(object):
rp = self.get_resource_provider(rp_name)
rp_uuid = rp['uuid']
self.delete_resource_provider(rp_uuid)
def create_resource_class(self, rc_name):
"""Calls the placement API to create a resource class.
:param rc_name: string name of the resource class to create. This
shall be something like "CUSTOM_RESERVATION_{uuid}".
:raises: ResourceClassCreationFailed error.
"""
url = '/resource_classes'
payload = {'name': rc_name}
resp = self.post(url, payload)
if resp:
LOG.info("Created resource class %s", rc_name)
return
msg = ("Failed to create resource class with placement API for "
"%(rc_name)s. Got %(status_code)d: %(err_text)s.")
args = {
'rc_name': rc_name,
'status_code': resp.status_code,
'err_text': resp.text,
}
LOG.error(msg, args)
raise exceptions.ResourceClassCreationFailed(resource_class=rc_name)
def delete_resource_class(self, rc_name):
"""Calls the placement API to delete a resource class.
:param rc_name: string name of the resource class to delete. This
shall be something like "CUSTOM_RESERVATION_{uuid}"
:raises: ResourceClassDeletionFailed error.
"""
url = '/resource_classes/%s' % rc_name
resp = self.delete(url)
if resp:
LOG.info("Deleted resource class %s", rc_name)
return
msg = ("Failed to delete resource class with placement API for "
"%(rc_name)s. Got %(status_code)d: %(err_text)s.")
args = {
'rc_name': rc_name,
'status_code': resp.status_code,
'err_text': resp.text,
}
LOG.error(msg, args)
raise exceptions.ResourceClassDeletionFailed(resource_class=rc_name)
def create_reservation_class(self, reservation_uuid):
"""Create the reservation class from the given reservation uuid"""
# Placement API doesn't accept resource classes with lower characters
# and "-"(hyphen) in its name. We should translate the uuid here.
reservation_uuid = reservation_uuid.upper().replace("-", "_")
rc_name = 'CUSTOM_RESERVATION_' + reservation_uuid
self.create_resource_class(rc_name)
def delete_reservation_class(self, reservation_uuid):
"""Delete the reservation class from the given reservation uuid"""
# Placement API doesn't accept resource classes with lower characters
# and "-"(hyphen) in its name. We should translate the uuid here.
reservation_uuid = reservation_uuid.upper().replace("-", "_")
rc_name = 'CUSTOM_RESERVATION_' + reservation_uuid
self.delete_resource_class(rc_name)