functional: Add '_create_server' helper

This is a *very* common pattern. Centralize it. Only a few users are
added for now, but we can migrate more later (it's rather tedious work).

Change-Id: I84c58de90dad6d86271767363aef90ddac0f1730
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
Stephen Finucane 2019-08-16 17:06:44 +01:00
parent 824bc358c2
commit 5b36d8c054
17 changed files with 106 additions and 199 deletions

View File

@ -50,27 +50,6 @@ class TestDatabaseArchive(test_servers.ServersTestBase):
'sqlite version too old for reliable SQLA foreign_keys')
engine.connect().execute("PRAGMA foreign_keys = ON")
def _create_server(self):
"""Creates a minimal test server via the compute API
Ensures the server is created and can be retrieved from the compute API
and waits for it to be ACTIVE.
:returns: created server (dict)
"""
# Create a server
server = self._build_server()
created_server = self.api.post_server({'server': server})
self.assertTrue(created_server['id'])
created_server_id = created_server['id']
# Check it's there
found_server = self.api.get_server(created_server_id)
self.assertEqual(created_server_id, found_server['id'])
found_server = self._wait_for_state_change(found_server, 'ACTIVE')
return found_server
def test_archive_deleted_rows(self):
# Boots a server, deletes it, and then tries to archive it.
server = self._create_server()

View File

@ -321,6 +321,36 @@ class InstanceHelperMixin(object):
return server
def _create_server(self, name=None, image_uuid=None, flavor_id=None,
networks=None, az=None, host=None,
expected_state='ACTIVE', api=None):
"""Build and submit a request to the server create API.
:param name: A name for the server.
:param image_uuid: The ID of an existing image.
:param flavor_id: The ID of an existing flavor.
:param networks: A dict of networks to attach or a string of 'none' or
'auto'.
:param az: The name of the availability zone the instance should
request.
:param host: The host to boot the instance on. Requires API
microversion 2.74 or greater.
:param expected_state: The expected end state.
:param api: An API client to create the server with; defaults to
'self.api'
:returns: The response from the API containing the created server.
"""
# if forcing the server onto a host, we have to use the admin API
if not api:
api = self.api if not az else getattr(self, 'admin_api', self.api)
body = self._build_server(
name, image_uuid, flavor_id, networks, az, host)
server = api.post_server({'server': body})
return self._wait_for_state_change(server, expected_state)
def _delete_server(self, server):
"""Delete a server."""
self.api.delete_server(server['id'])

View File

@ -70,23 +70,9 @@ class NUMAServersTest(NUMAServersTestBase):
'resource_providers'][0]['uuid']
# Create server
good_server = self._build_server(flavor_id=flavor_id)
post = {'server': good_server}
created_server = self.api.post_server(post)
LOG.debug("created_server: %s", created_server)
self.assertTrue(created_server['id'])
created_server_id = created_server['id']
# Validate that the server has been created
found_server = self.api.get_server(created_server_id)
self.assertEqual(created_server_id, found_server['id'])
# It should also be in the all-servers list
servers = self.api.get_servers()
server_ids = [s['id'] for s in servers]
self.assertIn(created_server_id, server_ids)
created_server = self._create_server(
flavor_id=flavor_id,
expected_state=end_status)
# Validate the quota usage
if filter_called_on_error and end_status == 'ACTIVE':
@ -104,15 +90,13 @@ class NUMAServersTest(NUMAServersTestBase):
else:
self.assertFalse(self.mock_filter.called)
found_server = self._wait_for_state_change(found_server, end_status)
if expected_usage:
compute_usage = self.placement_api.get(
'/resource_providers/%s/usages' % compute_rp_uuid).body[
'usages']
self.assertEqual(expected_usage, compute_usage)
self.addCleanup(self._delete_server, found_server)
self.addCleanup(self._delete_server, created_server)
return created_server
def test_create_server_with_numa_topology(self):
@ -376,12 +360,7 @@ class NUMAServersTest(NUMAServersTestBase):
# Create server
flavor_a_id = self._create_flavor(extra_spec={})
good_server = self._build_server(flavor_id=flavor_a_id)
post = {'server': good_server}
created_server = self.api.post_server(post)
server = self._wait_for_state_change(created_server, 'ACTIVE')
server = self._create_server(flavor_id=flavor_a_id)
original_host = server['OS-EXT-SRV-ATTR:host']
@ -760,16 +739,10 @@ class NUMAServersWithNetworksTest(NUMAServersTestBase):
self.compute = self.start_service('compute', host='test_compute0')
# Create server
good_server = self._build_server(flavor_id=flavor_id)
good_server['networks'] = networks
post = {'server': good_server}
created_server = self.api.post_server(post)
LOG.debug("created_server: %s", created_server)
found_server = self.api.get_server(created_server['id'])
return self._wait_for_state_change(found_server, end_status)
return self._create_server(
flavor_id=flavor_id,
networks=networks,
expected_state=end_status)
def test_create_server_with_single_physnet(self):
extra_spec = {'hw:numa_nodes': '1'}
@ -908,12 +881,9 @@ class NUMAServersWithNetworksTest(NUMAServersTestBase):
{'uuid': base.LibvirtNeutronFixture.network_1['id']},
]
good_server = self._build_server(flavor_id=flavor_id)
good_server['networks'] = networks
post = {'server': good_server}
created_server = self.api.post_server(post)
server = self._wait_for_state_change(created_server, 'ACTIVE')
server = self._create_server(
flavor_id=flavor_id,
networks=networks)
original_host = server['OS-EXT-SRV-ATTR:host']
@ -928,7 +898,7 @@ class NUMAServersWithNetworksTest(NUMAServersTestBase):
'.migrate_disk_and_power_off', return_value='{}'):
self.api.post_server_action(server['id'], {'migrate': None})
server = self._wait_for_state_change(created_server, 'VERIFY_RESIZE')
server = self._wait_for_state_change(server, 'VERIFY_RESIZE')
# We don't bother confirming the resize as we expect this to have
# landed and all we want to know is whether the filter was correct

View File

@ -60,9 +60,6 @@ class RealTimeServersTest(base.ServersTestBase):
'hw:cpu_realtime': 'yes',
'hw:cpu_policy': 'dedicated',
'hw:cpu_realtime_mask': '^1'})
server = self._build_server(flavor_id=flavor_id)
created = self.api.post_server({'server': server})
server = self._create_server(flavor_id=flavor_id)
instance = self._wait_for_state_change(created, 'ACTIVE')
self._delete_server(instance)
self._delete_server(server)

View File

@ -67,17 +67,12 @@ class SharedStorageProviderUsageTestCase(
self.assertNotIn("DISK_GB",
self._get_provider_inventory(self.host_uuid))
server_req_body = {
'server': {
'imageRef': '155d900f-4e14-4e4c-a73d-069cbf4541e6',
'flavorRef': '1',
'name': 'test_shared_storage_rp_configuration_with_cn_rp',
'networks': 'none'
}
}
# create server
server = self.api.post_server(server_req_body)
self._wait_for_state_change(server, 'ACTIVE')
self._create_server(
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
flavor_id=1,
networks='none',
)
# get shared_rp and cn_rp usages
shared_rp_usages = self._get_provider_usages(shared_RP['uuid'])
@ -125,17 +120,11 @@ class SharedStorageProviderUsageTestCase(
self.assertNotIn("DISK_GB",
self._get_provider_inventory(self.host_uuid))
server_req_body = {
'server': {
'imageRef': '155d900f-4e14-4e4c-a73d-069cbf4541e6',
'flavorRef': '1',
'name': 'test_shared_storage_rp_configuration_with_cn_rp',
'networks': 'none'
}
}
# create server
server = self.api.post_server(server_req_body)
self._wait_for_state_change(server, 'ACTIVE')
server = self._create_server(
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
flavor_id=1,
networks='none'
)
rebuild_image_ref = (
nova.tests.unit.image.fake.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID)
@ -187,18 +176,14 @@ class SharedStorageProviderUsageTestCase(
# RP as soon as a shared RP with DISK_GB is created in the compute tree
self.assertNotIn("DISK_GB",
self._get_provider_inventory(self.host_uuid))
org_image_id = '155d900f-4e14-4e4c-a73d-069cbf4541e6'
server_req_body = {
'server': {
'imageRef': org_image_id,
'flavorRef': '1',
'name': 'test_shared_storage_rp_configuration_with_cn_rp',
'networks': 'none'
}
}
# create server
server = self.api.post_server(server_req_body)
self._wait_for_state_change(server, 'ACTIVE')
org_image_id = '155d900f-4e14-4e4c-a73d-069cbf4541e6'
server = self._create_server(
image_uuid=org_image_id,
flavor_id=1,
networks='none',
)
rebuild_image_ref = (
nova.tests.unit.image.fake.AUTO_DISK_CONFIG_ENABLED_IMAGE_UUID)

View File

@ -124,15 +124,13 @@ class VPMEMTestBase(integrated_helpers.LibvirtProviderUsageBaseTestCase):
return compute
def _create_server(self, flavor_id, hostname):
server_req = self._build_server(
def _create_server(self, flavor_id, hostname, expected_state):
return super(VPMEMTestBase, self)._create_server(
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
flavor_id=flavor_id,
networks='none')
server_req['availability_zone'] = 'nova:%s' % hostname
LOG.info('booting on %s', hostname)
created_server = self.api.post_server({'server': server_req})
return created_server
networks='none',
az='nova:%s' % hostname,
expected_state=expected_state)
def _delete_server(self, server):
self.api.delete_server(server['id'])
@ -157,24 +155,25 @@ class VPMEMTests(VPMEMTestBase):
cn1_uuid = self._get_provider_uuid_by_host(self.compute1.host)
# Boot two servers with pmem
server1 = self._create_server(self.flavor, self.compute1.host)
self._wait_for_state_change(server1, 'ACTIVE')
server1 = self._create_server(self.flavor, self.compute1.host,
expected_state='ACTIVE')
self._check_vpmem_allocations({'CUSTOM_PMEM_NAMESPACE_SMALL': 1},
server1['id'], cn1_uuid)
server2 = self._create_server(self.flavor, self.compute1.host)
self._wait_for_state_change(server2, 'ACTIVE')
server2 = self._create_server(self.flavor, self.compute1.host,
expected_state='ACTIVE')
self._check_vpmem_allocations({'CUSTOM_PMEM_NAMESPACE_SMALL': 1},
server2['id'], cn1_uuid)
# 'SMALL' VPMEM resource has used up
server3 = self._create_server(self.flavor, self.compute1.host)
self._wait_for_state_change(server3, 'ERROR')
server3 = self._create_server(self.flavor, self.compute1.host,
expected_state='ERROR')
# Delete server2, one 'SMALL' VPMEM will be released
self._delete_server(server2)
self._wait_until_deleted(server2)
server3 = self._create_server(self.flavor, self.compute1.host)
self._wait_for_state_change(server3, 'ACTIVE')
server3 = self._create_server(self.flavor, self.compute1.host,
expected_state='ACTIVE')
self._check_vpmem_allocations({'CUSTOM_PMEM_NAMESPACE_SMALL': 1},
server3['id'], cn1_uuid)
@ -222,8 +221,8 @@ class VPMEMResizeTests(VPMEMTestBase):
cn2_uuid = self._get_provider_uuid_by_host(self.compute2.host)
# Boot one server with pmem, then resize the server
server = self._create_server(self.flavor1, self.compute1.host)
self._wait_for_state_change(server, 'ACTIVE')
server = self._create_server(self.flavor1, self.compute1.host,
expected_state='ACTIVE')
self._check_vpmem_allocations({'CUSTOM_PMEM_NAMESPACE_SMALL': 1},
server['id'], cn1_uuid)
@ -257,8 +256,8 @@ class VPMEMResizeTests(VPMEMTestBase):
cn1_uuid = self._get_provider_uuid_by_host(self.compute1.host)
# Boot one server with pmem, then resize the server
server = self._create_server(self.flavor1, self.compute1.host)
self._wait_for_state_change(server, 'ACTIVE')
server = self._create_server(self.flavor1, self.compute1.host,
expected_state='ACTIVE')
self._check_vpmem_allocations({'CUSTOM_PMEM_NAMESPACE_SMALL': 1},
server['id'], cn1_uuid)

View File

@ -79,16 +79,6 @@ class NonPersistentFieldNotResetTest(
'host3': 'host1'}
return target_host[host]
def _create_server(self):
# Create a server, it doesn't matter on which host it builds.
server = self._build_server(
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
networks='none')
server = self.api.post_server({'server': server})
server = self._wait_for_state_change(server, 'ACTIVE')
return server
def _remove_is_bfv_in_request_spec(self, server_id):
# Now let's hack the RequestSpec.is_bfv field to mimic migrating an
# old instance created before RequestSpec.is_bfv was set in the API,
@ -102,7 +92,9 @@ class NonPersistentFieldNotResetTest(
self.assertNotIn('is_bfv', reqspec)
def test_cold_migrate(self):
server = self._create_server()
server = self._create_server(
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
networks='none')
original_host = server['OS-EXT-SRV-ATTR:host']
target_host = self._get_target_host(original_host)
self._remove_is_bfv_in_request_spec(server['id'])
@ -132,7 +124,9 @@ class NonPersistentFieldNotResetTest(
self.assertIs(reqspec.is_bfv, False)
def test_evacuate(self):
server = self._create_server()
server = self._create_server(
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
networks='none')
original_host = server['OS-EXT-SRV-ATTR:host']
target_host = self._get_target_host(original_host)
self._remove_is_bfv_in_request_spec(server['id'])

View File

@ -46,22 +46,14 @@ class FillVirtualInterfaceListMigration(
fake_image.stub_out_image_service(self)
self.addCleanup(fake_image.FakeImageService_reset)
def _create_server(self):
server = self.api.post_server({
'server': {
'flavorRef': '1',
'name': 'test_fill_vifs_migration',
'networks': [{
'uuid': nova_fixtures.NeutronFixture.network_1['id']
}],
'imageRef': fake_image.get_valid_image_id()
}
})
return self._wait_for_state_change(server, 'ACTIVE')
def test_fill_vifs_migration(self):
# Create a test server.
self._create_server()
self._create_server(
flavor_id=1,
networks=[{
'uuid': nova_fixtures.NeutronFixture.network_1['id'],
}],
)
# Run the online data migration which will create a (soft-deleted)
# marker record.
ctxt = nova_context.get_admin_context()

View File

@ -35,9 +35,7 @@ class DeletedServerAllocationRevertTest(
"""Creates and return a server along with a source host and target
host.
"""
server = self._build_server(networks='none')
server = self.api.post_server({'server': server})
server = self._wait_for_state_change(server, 'ACTIVE')
server = super()._create_server(networks='none')
source_host = server['OS-EXT-SRV-ATTR:host']
target_host = 'host2' if source_host == 'host1' else 'host1'
return server, source_host, target_host

View File

@ -73,11 +73,9 @@ class TestAvailabilityZoneScheduling(
def _create_server(self, name):
# Create a server, it doesn't matter which host it ends up in.
server_body = self._build_server(
server = super(TestAvailabilityZoneScheduling, self)._create_server(
flavor_id=self.flavor1,
networks='none')
server = self.api.post_server({'server': server_body})
server = self._wait_for_state_change(server, 'ACTIVE')
networks='none',)
original_host = server['OS-EXT-SRV-ATTR:host']
# Assert the server has the AZ set (not None or 'nova').
expected_zone = 'zone1' if original_host == 'host1' else 'zone2'

View File

@ -141,7 +141,5 @@ class CrossAZAttachTestCase(test.TestCase,
a noop if there are no volumes in the server create request.
"""
self.flags(cross_az_attach=False, group='cinder')
server = self._build_server(az=self.az)
server = self.api.post_server({'server': server})
server = self._wait_for_state_change(server, 'ACTIVE')
server = self._create_server(az=self.az)
self.assertEqual(self.az, server['OS-EXT-AZ:availability_zone'])

View File

@ -19,27 +19,6 @@ from nova.tests.functional import test_servers
class InstanceActionsTestV2(test_servers.ServersTestBase):
"""Tests Instance Actions API"""
def _create_server(self):
"""Creates a minimal test server via the compute API
Ensures the server is created and can be retrieved from the compute API
and waits for it to be ACTIVE.
:returns: created server (dict)
"""
# Create a server
server = self._build_server()
created_server = self.api.post_server({'server': server})
self.assertTrue(created_server['id'])
created_server_id = created_server['id']
# Check it's there
found_server = self.api.get_server(created_server_id)
self.assertEqual(created_server_id, found_server['id'])
return self._wait_for_state_change(found_server, 'ACTIVE')
def test_get_instance_actions(self):
server = self._create_server()
actions = self.api.get_instance_actions(server['id'])

View File

@ -60,11 +60,10 @@ class TestMultiattachVolumes(integrated_helpers._IntegratedTestBase):
self.assertEqual(volume_id, attachments[0]['volumeId'])
# Now create a second server and attach the same volume to that.
create_req = self._build_server(
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6', flavor_id='1',
server2 = self._create_server(
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
flavor_id='1',
networks='none')
server2 = self.api.post_server({'server': create_req})
self._wait_for_state_change(server2, 'ACTIVE')
# Attach the volume to the second server.
self.api.api_post('/servers/%s/os-volume_attachments' % server2['id'],
{'volumeAttachment': {'volumeId': volume_id}})

View File

@ -68,10 +68,7 @@ class HostStatusPolicyTestCase(test.TestCase,
if networks:
# Starting with microversion 2.37 the networks field is required.
kwargs['networks'] = networks
server = self._build_server(**kwargs)
server = self.api.post_server({'server': server})
server = self._wait_for_state_change(server, 'ACTIVE')
return server
return self._create_server(**kwargs)
@staticmethod
def _get_server(resp):

View File

@ -50,18 +50,12 @@ class MultiCellSchedulerTestCase(test.TestCase,
self.addCleanup(fake_image.FakeImageService_reset)
def _test_create_and_migrate(self, expected_status, az=None):
server = self._build_server(az=az)
post = {'server': server}
# If forcing the server onto a host we have to use the admin API.
api = self.admin_api if az else self.api
created_server = api.post_server(post)
server = self._create_server(az=az)
# Wait for it to finish being created
found_server = self._wait_for_state_change(created_server, 'ACTIVE')
return self.admin_api.api_post(
'/servers/%s/action' % found_server['id'],
'/servers/%s/action' % server['id'],
{'migrate': None},
check_response_status=[expected_status]), found_server
check_response_status=[expected_status]), server
def test_migrate_between_cells(self):
"""Verify that migrating between cells is not allowed.

View File

@ -418,12 +418,10 @@ class ProviderTreeTests(integrated_helpers.ProviderUsageBaseTestCase):
self.assertNotIn('FOO', traits)
def _create_instance(self, flavor):
server_req = self._build_server(
return self._create_server(
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
flavor_id=flavor['id'],
networks='none', az='nova:host1')
inst = self.api.post_server({'server': server_req})
return self._wait_for_state_change(inst, 'ACTIVE')
def test_reshape(self):
"""On startup, virt driver signals it needs to reshape, then does so.

View File

@ -29,8 +29,8 @@ class InterfaceFullstack(test_servers.ServersTestBase):
def test_detach_interface_negative_invalid_state(self):
# Create server with network
created_server = self.api.post_server({'server': self._build_server(
networks=[{'uuid': '3cb9bc59-5699-4588-a4b1-b87f96708bc6'}])})
created_server = self._create_server(
networks=[{'uuid': '3cb9bc59-5699-4588-a4b1-b87f96708bc6'}])
created_server_id = created_server['id']
found_server = self._wait_for_state_change(created_server, 'ACTIVE')