summaryrefslogtreecommitdiff
path: root/nova/tests/functional/test_servers.py
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-03-26 10:49:44 +0000
committerGerrit Code Review <review@openstack.org>2020-03-26 10:49:44 +0000
commit1853b1b870ea8c9be6fc3619fcb263d91420c2cb (patch)
treee65577f5112b1a27934475df82235741aa52f681 /nova/tests/functional/test_servers.py
parentdf49ad9b29afcafa847b83df445b6627350721b5 (diff)
parent0c52730f6a138ce3b40efd6a0bd2809b2c41dada (diff)
downloadnova-1853b1b870ea8c9be6fc3619fcb263d91420c2cb.tar.gz
Merge "Add Cyborg device profile groups to request spec."
Diffstat (limited to 'nova/tests/functional/test_servers.py')
-rw-r--r--nova/tests/functional/test_servers.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/nova/tests/functional/test_servers.py b/nova/tests/functional/test_servers.py
index 7f11a353d0..4d97f2c10b 100644
--- a/nova/tests/functional/test_servers.py
+++ b/nova/tests/functional/test_servers.py
@@ -7822,3 +7822,89 @@ class PortResourceRequestReSchedulingTest(
updated_port = self.neutron.show_port(port['id'])['port']
binding_profile = neutronapi.get_binding_profile(updated_port)
self.assertNotIn('allocation', binding_profile)
+
+
+class AcceleratorServerBase(integrated_helpers.ProviderUsageBaseTestCase):
+
+ compute_driver = 'fake.SmallFakeDriver'
+
+ def setUp(self):
+ super(AcceleratorServerBase, self).setUp()
+ self.cyborg = self.useFixture(nova_fixtures.CyborgFixture())
+ # dict of form {$compute_rp_uuid: $device_rp_uuid}
+ self.device_rp_map = {}
+ # self.NUM_HOSTS should be set up by derived classes
+ if not hasattr(self, 'NUM_HOSTS'):
+ self.NUM_HOSTS = 1
+ self._setup_compute_nodes_and_device_rps()
+
+ def _setup_compute_nodes_and_device_rps(self):
+ for i in range(self.NUM_HOSTS):
+ self._start_compute(host='accel_host' + str(i))
+ self.compute_rp_uuids = [
+ rp['uuid'] for rp in self._get_all_providers()
+ if rp['uuid'] == rp['root_provider_uuid']]
+ for index, uuid in enumerate(self.compute_rp_uuids):
+ device_rp_uuid = self._create_device_rp(index, uuid)
+ self.device_rp_map[uuid] = device_rp_uuid
+ self.device_rp_uuids = list(self.device_rp_map.values())
+
+ def _create_device_rp(self, index, compute_rp_uuid,
+ resource='FPGA', res_amt=2):
+ """Created nested RP for a device. There is one per host.
+
+ :param index: Number of the device rp uuid for this setup
+ :param compute_rp_uuid: Resource provider UUID of the host.
+ :param resource: Placement resource name.
+ Assumed to be a standard resource class.
+ :param res_amt: Amount of the resource.
+ :returns: Device RP UUID
+ """
+ resp = self._post_nested_resource_provider(
+ 'FakeDevice' + str(index), parent_rp_uuid=compute_rp_uuid)
+ device_rp_uuid = resp['uuid']
+ inventory = {
+ 'resource_provider_generation': 0,
+ 'inventories': {
+ resource: {
+ 'total': res_amt,
+ 'allocation_ratio': 1.0,
+ 'max_unit': res_amt,
+ 'min_unit': 1,
+ 'reserved': 0,
+ 'step_size': 1,
+ }
+ },
+ }
+ self._update_inventory(device_rp_uuid, inventory)
+ self._create_trait(self.cyborg.trait)
+ self._set_provider_traits(device_rp_uuid, [self.cyborg.trait])
+ return device_rp_uuid
+
+ def _post_nested_resource_provider(self, rp_name, parent_rp_uuid):
+ body = {'name': rp_name, 'parent_provider_uuid': parent_rp_uuid}
+ return self.placement_api.post(
+ url='/resource_providers', version='1.20', body=body).body
+
+ def _create_acc_flavor(self):
+ extra_specs = {'accel:device_profile': self.cyborg.dp_name}
+ flavor_id = self._create_flavor(name='acc.tiny',
+ extra_spec=extra_specs)
+ return flavor_id
+
+
+class AcceleratorServerTest(AcceleratorServerBase):
+ def setUp(self):
+ self.NUM_HOSTS = 1
+ super(AcceleratorServerTest, self).setUp()
+
+ def test_create_server(self):
+ flavor_id = self._create_acc_flavor()
+ server_name = 'accel_server1'
+ self._create_server(
+ server_name, flavor_id=flavor_id,
+ image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
+ networks='none', expected_state='ACTIVE')
+
+ self.cyborg.mock_get_dp.assert_called_once_with(self.cyborg.dp_name)
+ # TODO(Sundar): Add checks for Placement allocations.