Make create_server use **kwargs
As we discussed on http://lists.openstack.org/pipermail/openstack-dev/2015-July/068864.html All http POST/PUT methods need to contain **kwargs as their arguments. This patch makes create_server use **kwargs. Partially implements blueprint consistent-service-method-names Change-Id: I4b9effc2c68f6a5336eee249ff76686aca8a8480
This commit is contained in:
@@ -221,7 +221,8 @@ class FlavorsAdminTestJSON(base.BaseV2ComputeAdminTest):
|
||||
# Verify flavor is not used by other user
|
||||
self.assertRaises(lib_exc.BadRequest,
|
||||
self.os.servers_client.create_server,
|
||||
'test', self.image_ref, flavor['id'])
|
||||
name='test', imageRef=self.image_ref,
|
||||
flavorRef=flavor['id'])
|
||||
|
||||
@test.idempotent_id('b345b196-bfbd-4231-8ac1-6d7fe15ff3a3')
|
||||
def test_list_public_flavor_with_other_user(self):
|
||||
|
||||
@@ -111,7 +111,8 @@ class ServersAdminTestJSON(base.BaseV2ComputeAdminTest):
|
||||
image_id = self.image_ref
|
||||
network = self.get_tenant_network()
|
||||
network_kwargs = fixed_network.set_networks_kwarg(network)
|
||||
test_server = self.client.create_server(name, image_id, flavor,
|
||||
test_server = self.client.create_server(name=name, imageRef=image_id,
|
||||
flavorRef=flavor,
|
||||
**network_kwargs)['server']
|
||||
self.addCleanup(self.client.delete_server, test_server['id'])
|
||||
waiters.wait_for_server_status(self.client,
|
||||
@@ -198,5 +199,5 @@ class ServersAdminTestJSON(base.BaseV2ComputeAdminTest):
|
||||
hints = {
|
||||
'same_host': self.s1_id
|
||||
}
|
||||
self.create_test_server(sched_hints=hints,
|
||||
self.create_test_server(scheduler_hints=hints,
|
||||
wait_until='ACTIVE')
|
||||
|
||||
@@ -55,4 +55,4 @@ class AbsoluteLimitsNegativeTestJSON(base.BaseV2ComputeTest):
|
||||
# A 403 Forbidden or 413 Overlimit (old behaviour) exception
|
||||
# will be raised when out of quota
|
||||
self.assertRaises((lib_exc.Forbidden, lib_exc.OverLimit),
|
||||
self.create_test_server, meta=meta_data)
|
||||
self.create_test_server, metadata=meta_data)
|
||||
|
||||
@@ -58,7 +58,7 @@ class ServersTestJSON(base.BaseV2ComputeTest):
|
||||
validatable=True,
|
||||
wait_until='ACTIVE',
|
||||
name=cls.name,
|
||||
meta=cls.meta,
|
||||
metadata=cls.meta,
|
||||
accessIPv4=cls.accessIPv4,
|
||||
accessIPv6=cls.accessIPv6,
|
||||
personality=personality,
|
||||
@@ -150,7 +150,7 @@ class ServersTestJSON(base.BaseV2ComputeTest):
|
||||
group_id)
|
||||
|
||||
hints = {'group': group_id}
|
||||
server = self.create_test_server(sched_hints=hints,
|
||||
server = self.create_test_server(scheduler_hints=hints,
|
||||
wait_until='ACTIVE')
|
||||
|
||||
# Check a server is in the group
|
||||
|
||||
@@ -28,7 +28,7 @@ class ServerMetadataTestJSON(base.BaseV2ComputeTest):
|
||||
@classmethod
|
||||
def resource_setup(cls):
|
||||
super(ServerMetadataTestJSON, cls).resource_setup()
|
||||
server = cls.create_test_server(meta={}, wait_until='ACTIVE')
|
||||
server = cls.create_test_server(metadata={}, wait_until='ACTIVE')
|
||||
cls.server_id = server['id']
|
||||
|
||||
def setUp(self):
|
||||
|
||||
@@ -32,7 +32,7 @@ class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest):
|
||||
def resource_setup(cls):
|
||||
super(ServerMetadataNegativeTestJSON, cls).resource_setup()
|
||||
cls.tenant_id = cls.client.tenant_id
|
||||
server = cls.create_test_server(meta={}, wait_until='ACTIVE')
|
||||
server = cls.create_test_server(metadata={}, wait_until='ACTIVE')
|
||||
|
||||
cls.server_id = server['id']
|
||||
|
||||
@@ -48,7 +48,7 @@ class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest):
|
||||
meta = {key: 'data1'}
|
||||
self.assertRaises((lib_exc.BadRequest, lib_exc.OverLimit),
|
||||
self.create_test_server,
|
||||
meta=meta)
|
||||
metadata=meta)
|
||||
|
||||
# no teardown - all creates should fail
|
||||
|
||||
@@ -59,7 +59,7 @@ class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest):
|
||||
meta = {'': 'data1'}
|
||||
self.assertRaises(lib_exc.BadRequest,
|
||||
self.create_test_server,
|
||||
meta=meta)
|
||||
metadata=meta)
|
||||
|
||||
@test.attr(type=['negative'])
|
||||
@test.idempotent_id('4d9cd7a3-2010-4b41-b8fe-3bbf0b169466')
|
||||
|
||||
@@ -236,7 +236,7 @@ class ServersNegativeTestJSON(base.BaseV2ComputeTest):
|
||||
metadata = {'a': 'b' * 260}
|
||||
self.assertRaises((lib_exc.BadRequest, lib_exc.OverLimit),
|
||||
self.create_test_server,
|
||||
meta=metadata)
|
||||
metadata=metadata)
|
||||
|
||||
@test.attr(type=['negative'])
|
||||
@test.idempotent_id('aa8eed43-e2cb-4ebf-930b-da14f6a21d81')
|
||||
|
||||
@@ -181,7 +181,8 @@ class AuthorizationTestJSON(base.BaseV2ComputeTest):
|
||||
def test_create_server_with_unauthorized_image(self):
|
||||
# Server creation with another user's image should fail
|
||||
self.assertRaises(lib_exc.BadRequest, self.alt_client.create_server,
|
||||
'test', self.image['id'], self.flavor_ref)
|
||||
name='test', imageRef=self.image['id'],
|
||||
flavorRef=self.flavor_ref)
|
||||
|
||||
@test.idempotent_id('acf8724b-142b-4044-82c3-78d31a533f24')
|
||||
def test_create_server_fails_when_tenant_incorrect(self):
|
||||
@@ -193,8 +194,8 @@ class AuthorizationTestJSON(base.BaseV2ComputeTest):
|
||||
auth_data=self.client.auth_provider.auth_data
|
||||
)
|
||||
self.assertRaises(lib_exc.BadRequest,
|
||||
self.alt_client.create_server, 'test',
|
||||
self.image['id'], self.flavor_ref)
|
||||
self.alt_client.create_server, name='test',
|
||||
imageRef=self.image['id'], flavorRef=self.flavor_ref)
|
||||
|
||||
@test.idempotent_id('f03d1ded-7fd4-4d29-bc13-e2391f29c625')
|
||||
def test_create_keypair_in_analt_user_tenant(self):
|
||||
|
||||
@@ -869,7 +869,8 @@ def create_servers(servers):
|
||||
kwargs['networks'] = [{'uuid': get_net_id(network)}
|
||||
for network in server['networks']]
|
||||
body = client.servers.create_server(
|
||||
server['name'], image_id, flavor_id, **kwargs)['server']
|
||||
name=server['name'], imageRef=image_id, flavorRef=flavor_id,
|
||||
**kwargs)['server']
|
||||
server_id = body['id']
|
||||
client.servers.wait_for_server_status(server_id, 'ACTIVE')
|
||||
# create security group(s) after server spawning
|
||||
|
||||
@@ -51,8 +51,8 @@ def create_test_server(clients, validatable=False, validation_resources=None,
|
||||
else:
|
||||
name = data_utils.rand_name(__name__ + "-instance")
|
||||
|
||||
flavor = kwargs.get('flavor', CONF.compute.flavor_ref)
|
||||
image_id = kwargs.get('image_id', CONF.compute.image_ref)
|
||||
flavor = kwargs.pop('flavor', CONF.compute.flavor_ref)
|
||||
image_id = kwargs.pop('image_id', CONF.compute.image_ref)
|
||||
|
||||
kwargs = fixed_network.set_networks_kwarg(
|
||||
tenant_network, kwargs) or {}
|
||||
@@ -85,7 +85,8 @@ def create_test_server(clients, validatable=False, validation_resources=None,
|
||||
if wait_until is None:
|
||||
wait_until = 'ACTIVE'
|
||||
|
||||
body = clients.servers_client.create_server(name, image_id, flavor,
|
||||
body = clients.servers_client.create_server(name=name, imageRef=image_id,
|
||||
flavorRef=flavor,
|
||||
**kwargs)
|
||||
|
||||
# handle the case of multiple servers
|
||||
|
||||
@@ -178,7 +178,8 @@ class ScenarioTest(tempest.test.BaseTestCase):
|
||||
|
||||
LOG.debug("Creating a server (name: %s, image: %s, flavor: %s)",
|
||||
name, image, flavor)
|
||||
server = self.servers_client.create_server(name, image, flavor,
|
||||
server = self.servers_client.create_server(name=name, imageRef=image,
|
||||
flavorRef=flavor,
|
||||
**create_kwargs)['server']
|
||||
if wait_on_delete:
|
||||
self.addCleanup(waiters.wait_for_server_termination,
|
||||
@@ -1073,7 +1074,10 @@ class NetworkScenarioTest(ScenarioTest):
|
||||
|
||||
def create_server(self, name=None, image=None, flavor=None,
|
||||
wait_on_boot=True, wait_on_delete=True,
|
||||
create_kwargs=None):
|
||||
network_client=None, create_kwargs=None):
|
||||
if network_client is None:
|
||||
network_client = self.network_client
|
||||
|
||||
vnic_type = CONF.network.port_vnic_type
|
||||
|
||||
# If vnic_type is configured create port for
|
||||
@@ -1084,19 +1088,16 @@ class NetworkScenarioTest(ScenarioTest):
|
||||
create_port_body = {'binding:vnic_type': vnic_type,
|
||||
'namestart': 'port-smoke'}
|
||||
if create_kwargs:
|
||||
net_client = create_kwargs.get("network_client",
|
||||
self.network_client)
|
||||
|
||||
# Convert security group names to security group ids
|
||||
# to pass to create_port
|
||||
if create_kwargs.get('security_groups'):
|
||||
security_groups = net_client.list_security_groups().get(
|
||||
'security_groups')
|
||||
security_groups = network_client.list_security_groups(
|
||||
).get('security_groups')
|
||||
sec_dict = dict([(s['name'], s['id'])
|
||||
for s in security_groups])
|
||||
|
||||
sec_groups_names = [s['name'] for s in create_kwargs[
|
||||
'security_groups']]
|
||||
sec_groups_names = [s['name'] for s in create_kwargs.get(
|
||||
'security_groups')]
|
||||
security_groups_ids = [sec_dict[s]
|
||||
for s in sec_groups_names]
|
||||
|
||||
@@ -1104,15 +1105,14 @@ class NetworkScenarioTest(ScenarioTest):
|
||||
create_port_body[
|
||||
'security_groups'] = security_groups_ids
|
||||
networks = create_kwargs.get('networks')
|
||||
else:
|
||||
net_client = self.network_client
|
||||
|
||||
# If there are no networks passed to us we look up
|
||||
# for the tenant's private networks and create a port
|
||||
# if there is only one private network. The same behaviour
|
||||
# as we would expect when passing the call to the clients
|
||||
# with no networks
|
||||
if not networks:
|
||||
networks = net_client.list_networks(filters={
|
||||
networks = network_client.list_networks(filters={
|
||||
'router:external': False})
|
||||
self.assertEqual(1, len(networks),
|
||||
"There is more than one"
|
||||
@@ -1120,7 +1120,7 @@ class NetworkScenarioTest(ScenarioTest):
|
||||
for net in networks:
|
||||
net_id = net['uuid']
|
||||
port = self._create_port(network_id=net_id,
|
||||
client=net_client,
|
||||
client=network_client,
|
||||
**create_port_body)
|
||||
ports.append({'port': port.id})
|
||||
if ports:
|
||||
|
||||
@@ -99,9 +99,9 @@ class TestLargeOpsScenario(manager.ScenarioTest):
|
||||
create_kwargs = fixed_network.set_networks_kwarg(network,
|
||||
create_kwargs)
|
||||
self.servers_client.create_server(
|
||||
name,
|
||||
self.image,
|
||||
flavor_id,
|
||||
name=name,
|
||||
imageRef=self.image,
|
||||
flavorRef=flavor_id,
|
||||
**create_kwargs)
|
||||
# needed because of bug 1199788
|
||||
params = {'name': name}
|
||||
|
||||
@@ -244,10 +244,12 @@ class TestSecurityGroupsBasicOps(manager.NetworkScenarioTest):
|
||||
{'uuid': tenant.network.id},
|
||||
],
|
||||
'key_name': tenant.keypair['name'],
|
||||
'security_groups': security_groups_names,
|
||||
'network_client': tenant.manager.network_client
|
||||
'security_groups': security_groups_names
|
||||
}
|
||||
server = self.create_server(name=name, create_kwargs=create_kwargs)
|
||||
server = self.create_server(
|
||||
name=name,
|
||||
network_client=tenant.manager.network_client,
|
||||
create_kwargs=create_kwargs)
|
||||
self.assertEqual(
|
||||
sorted([s['name'] for s in security_groups]),
|
||||
sorted([s['name'] for s in server['security_groups']]))
|
||||
|
||||
@@ -91,8 +91,8 @@ class InputScenarioUtils(object):
|
||||
def test_create_server_metadata(self):
|
||||
name = rand_name('instance')
|
||||
self.servers_client.create_server(name=name,
|
||||
flavor_ref=self.flavor_ref,
|
||||
image_ref=self.image_ref)
|
||||
flavorRef=self.flavor_ref,
|
||||
imageRef=self.image_ref)
|
||||
"""
|
||||
validchars = "-_.{ascii}{digit}".format(ascii=string.ascii_letters,
|
||||
digit=string.digits)
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import copy
|
||||
|
||||
from oslo_serialization import jsonutils as json
|
||||
from six.moves.urllib import parse as urllib
|
||||
|
||||
@@ -29,59 +31,28 @@ class ServersClient(service_client.ServiceClient):
|
||||
auth_provider, service, region, **kwargs)
|
||||
self.enable_instance_password = enable_instance_password
|
||||
|
||||
def create_server(self, name, image_ref, flavor_ref, **kwargs):
|
||||
def create_server(self, **kwargs):
|
||||
"""
|
||||
Creates an instance of a server.
|
||||
name (Required): The name of the server.
|
||||
image_ref (Required): Reference to the image used to build the server.
|
||||
flavor_ref (Required): The flavor used to build the server.
|
||||
Following optional keyword arguments are accepted:
|
||||
adminPass: Sets the initial root password.
|
||||
key_name: Key name of keypair that was created earlier.
|
||||
meta: A dictionary of values to be used as metadata.
|
||||
personality: A list of dictionaries for files to be injected into
|
||||
the server.
|
||||
security_groups: A list of security group dicts.
|
||||
networks: A list of network dicts with UUID and fixed_ip.
|
||||
user_data: User data for instance.
|
||||
availability_zone: Availability zone in which to launch instance.
|
||||
accessIPv4: The IPv4 access address for the server.
|
||||
accessIPv6: The IPv6 access address for the server.
|
||||
min_count: Count of minimum number of instances to launch.
|
||||
max_count: Count of maximum number of instances to launch.
|
||||
disk_config: Determines if user or admin controls disk configuration.
|
||||
return_reservation_id: Enable/Disable the return of reservation id
|
||||
block_device_mapping: Block device mapping for the server.
|
||||
block_device_mapping_v2: Block device mapping V2 for the server.
|
||||
Most parameters except the following are passed to the API without
|
||||
any changes.
|
||||
:param disk_config: The name is changed to OS-DCF:diskConfig
|
||||
:param scheduler_hints: The name is changed to os:scheduler_hints and
|
||||
the parameter is set in the same level as the parameter 'server'.
|
||||
"""
|
||||
post_body = {
|
||||
'name': name,
|
||||
'imageRef': image_ref,
|
||||
'flavorRef': flavor_ref
|
||||
}
|
||||
body = copy.deepcopy(kwargs)
|
||||
if body.get('disk_config'):
|
||||
body['OS-DCF:diskConfig'] = body.pop('disk_config')
|
||||
|
||||
for option in ['personality', 'adminPass', 'key_name',
|
||||
'security_groups', 'networks', 'user_data',
|
||||
'availability_zone', 'accessIPv4', 'accessIPv6',
|
||||
'min_count', 'max_count', ('metadata', 'meta'),
|
||||
('OS-DCF:diskConfig', 'disk_config'),
|
||||
'return_reservation_id', 'block_device_mapping',
|
||||
'block_device_mapping_v2']:
|
||||
if isinstance(option, tuple):
|
||||
post_param = option[0]
|
||||
key = option[1]
|
||||
else:
|
||||
post_param = option
|
||||
key = option
|
||||
value = kwargs.get(key)
|
||||
if value is not None:
|
||||
post_body[post_param] = value
|
||||
hints = None
|
||||
if body.get('scheduler_hints'):
|
||||
hints = {'os:scheduler_hints': body.pop('scheduler_hints')}
|
||||
|
||||
post_body = {'server': post_body}
|
||||
post_body = {'server': body}
|
||||
|
||||
if 'sched_hints' in kwargs:
|
||||
hints = {'os:scheduler_hints': kwargs.get('sched_hints')}
|
||||
if hints:
|
||||
post_body = dict(post_body.items() + hints.items())
|
||||
|
||||
post_body = json.dumps(post_body)
|
||||
resp, body = self.post('servers', post_body)
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ class ServerCreateDestroyTest(stressaction.StressAction):
|
||||
name = data_utils.rand_name("instance")
|
||||
self.logger.info("creating %s" % name)
|
||||
server = self.manager.servers_client.create_server(
|
||||
name, self.image, self.flavor)['server']
|
||||
name=name, imageRef=self.image, flavorRef=self.flavor)['server']
|
||||
server_id = server['id']
|
||||
waiters.wait_for_server_status(self.manager.servers_client, server_id,
|
||||
'ACTIVE')
|
||||
|
||||
@@ -75,8 +75,8 @@ class FloatingStress(stressaction.StressAction):
|
||||
self.logger.info("creating %s" % name)
|
||||
vm_args = self.vm_extra_args.copy()
|
||||
vm_args['security_groups'] = [self.sec_grp]
|
||||
server = servers_client.create_server(name, self.image,
|
||||
self.flavor,
|
||||
server = servers_client.create_server(name=name, imageRef=self.image,
|
||||
flavorRef=self.flavor,
|
||||
**vm_args)['server']
|
||||
self.server_id = server['id']
|
||||
if self.wait_after_vm_create:
|
||||
|
||||
@@ -39,7 +39,7 @@ class VolumeAttachDeleteTest(stressaction.StressAction):
|
||||
vm_name = data_utils.rand_name("instance")
|
||||
self.logger.info("creating vm: %s" % vm_name)
|
||||
server = self.manager.servers_client.create_server(
|
||||
vm_name, self.image, self.flavor)['server']
|
||||
name=vm_name, imageRef=self.image, flavorRef=self.flavor)['server']
|
||||
server_id = server['id']
|
||||
waiters.wait_for_server_status(self.manager.servers_client, server_id,
|
||||
'ACTIVE')
|
||||
|
||||
@@ -39,8 +39,8 @@ class VolumeVerifyStress(stressaction.StressAction):
|
||||
vm_args = self.vm_extra_args.copy()
|
||||
vm_args['security_groups'] = [self.sec_grp]
|
||||
vm_args['key_name'] = self.key['name']
|
||||
server = servers_client.create_server(name, self.image,
|
||||
self.flavor,
|
||||
server = servers_client.create_server(name=name, imageRef=self.image,
|
||||
flavorRef=self.flavor,
|
||||
**vm_args)['server']
|
||||
self.server_id = server['id']
|
||||
waiters.wait_for_server_status(self.manager.servers_client,
|
||||
|
||||
Reference in New Issue
Block a user