Merge "Include usage in 'inventory list', 'inventory show'"
This commit is contained in:
commit
499b929e2f
|
@ -26,6 +26,7 @@ from osc_placement import version
|
|||
BASE_URL = '/resource_providers/{uuid}/inventories'
|
||||
PER_CLASS_URL = BASE_URL + '/{resource_class}'
|
||||
RP_BASE_URL = '/resource_providers'
|
||||
USAGES_BASE_URL = '/resource_providers/{uuid}/usages'
|
||||
INVENTORY_FIELDS = {
|
||||
'allocation_ratio': {
|
||||
'type': float,
|
||||
|
@ -372,7 +373,18 @@ class ShowInventory(command.ShowOne):
|
|||
url = PER_CLASS_URL.format(uuid=parsed_args.uuid,
|
||||
resource_class=parsed_args.resource_class)
|
||||
resource = http.request('GET', url).json()
|
||||
return FIELDS, utils.get_dict_properties(resource, FIELDS)
|
||||
|
||||
# TODO(stephenfin): We should just include this information in the
|
||||
# above API. Alternatively, we should add an API to retrieve usage for
|
||||
# a single resource class
|
||||
url = USAGES_BASE_URL.format(uuid=parsed_args.uuid)
|
||||
resources = http.request('GET', url).json()['usages']
|
||||
|
||||
resource['used'] = resources[parsed_args.resource_class]
|
||||
|
||||
fields = FIELDS + ('used', )
|
||||
|
||||
return fields, utils.get_dict_properties(resource, fields)
|
||||
|
||||
|
||||
class ListInventory(command.Lister):
|
||||
|
@ -401,6 +413,14 @@ class ListInventory(command.Lister):
|
|||
for k, v in resources['inventories'].items()
|
||||
]
|
||||
|
||||
fields = ('resource_class', ) + FIELDS
|
||||
# TODO(stephenfin): We should just include this information in the
|
||||
# above API
|
||||
url = USAGES_BASE_URL.format(uuid=parsed_args.uuid)
|
||||
resources = http.request('GET', url).json()['usages']
|
||||
|
||||
for inventory in inventories:
|
||||
inventory['used'] = resources[inventory['resource_class']]
|
||||
|
||||
fields = ('resource_class', ) + FIELDS + ('used', )
|
||||
rows = (utils.get_dict_properties(i, fields) for i in inventories)
|
||||
return fields, rows
|
||||
|
|
|
@ -290,15 +290,28 @@ class BaseTestCase(base.BaseTestCase):
|
|||
cmd = 'resource provider allocation delete ' + consumer_uuid
|
||||
return self.openstack(cmd)
|
||||
|
||||
def resource_inventory_show(self, uuid, resource_class):
|
||||
cmd = 'resource provider inventory show {uuid} {rc}'.format(
|
||||
uuid=uuid, rc=resource_class
|
||||
def resource_inventory_show(
|
||||
self, uuid, resource_class, *, include_used=False,
|
||||
):
|
||||
resource = self.openstack(
|
||||
f'resource provider inventory show {uuid} {resource_class}',
|
||||
use_json=True,
|
||||
)
|
||||
return self.openstack(cmd, use_json=True)
|
||||
if not include_used:
|
||||
del resource['used']
|
||||
|
||||
def resource_inventory_list(self, uuid):
|
||||
return self.openstack('resource provider inventory list ' + uuid,
|
||||
use_json=True)
|
||||
return resource
|
||||
|
||||
def resource_inventory_list(self, uuid, *, include_used=False):
|
||||
resources = self.openstack(
|
||||
f'resource provider inventory list {uuid}',
|
||||
use_json=True,
|
||||
)
|
||||
if not include_used:
|
||||
for resource in resources:
|
||||
del resource['used']
|
||||
|
||||
return resources
|
||||
|
||||
def resource_inventory_delete(self, uuid, resource_class=None):
|
||||
cmd = 'resource provider inventory delete {uuid}'.format(uuid=uuid)
|
||||
|
|
|
@ -27,17 +27,24 @@ class TestInventory(base.BaseTestCase):
|
|||
|
||||
def test_inventory_show(self):
|
||||
rp_uuid = self.rp['uuid']
|
||||
expected = {'min_unit': 1,
|
||||
'max_unit': 12,
|
||||
'reserved': 0,
|
||||
'step_size': 1,
|
||||
'total': 12,
|
||||
'allocation_ratio': 16.0}
|
||||
updates = {
|
||||
'min_unit': 1,
|
||||
'max_unit': 12,
|
||||
'reserved': 0,
|
||||
'step_size': 1,
|
||||
'total': 12,
|
||||
'allocation_ratio': 16.0,
|
||||
}
|
||||
expected = updates.copy()
|
||||
expected['used'] = 0
|
||||
args = ['VCPU:%s=%s' % (k, v) for k, v in updates.items()]
|
||||
|
||||
args = ['VCPU:%s=%s' % (k, v) for k, v in expected.items()]
|
||||
self.resource_inventory_set(rp_uuid, *args)
|
||||
self.assertEqual(expected,
|
||||
self.resource_inventory_show(rp_uuid, 'VCPU'))
|
||||
|
||||
self.assertEqual(
|
||||
expected,
|
||||
self.resource_inventory_show(rp_uuid, 'VCPU', include_used=True),
|
||||
)
|
||||
|
||||
def test_inventory_show_not_found(self):
|
||||
rp_uuid = self.rp['uuid']
|
||||
|
@ -48,6 +55,27 @@ class TestInventory(base.BaseTestCase):
|
|||
self.assertIn('No inventory of class VCPU for {}'.format(rp_uuid),
|
||||
six.text_type(exc))
|
||||
|
||||
def test_inventory_list(self):
|
||||
rp_uuid = self.rp['uuid']
|
||||
updates = {
|
||||
'min_unit': 1,
|
||||
'max_unit': 12,
|
||||
'reserved': 0,
|
||||
'step_size': 1,
|
||||
'total': 12,
|
||||
'allocation_ratio': 16.0,
|
||||
}
|
||||
expected = [updates.copy()]
|
||||
expected[0]['resource_class'] = 'VCPU'
|
||||
expected[0]['used'] = 0
|
||||
args = ['VCPU:%s=%s' % (k, v) for k, v in updates.items()]
|
||||
|
||||
self.resource_inventory_set(rp_uuid, *args)
|
||||
|
||||
self.assertEqual(
|
||||
expected, self.resource_inventory_list(rp_uuid, include_used=True),
|
||||
)
|
||||
|
||||
def test_inventory_delete(self):
|
||||
rp_uuid = self.rp['uuid']
|
||||
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
features:
|
||||
- |
|
||||
The ``openstack resource provider inventory list`` and ``openstack resource
|
||||
provider inventory show`` commands now include a ``used`` column providing
|
||||
summary usage information for the specified resource(s).
|
Loading…
Reference in New Issue