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:
Ken'ichi Ohmichi
2015-09-03 01:13:16 +00:00
parent cf61b5a849
commit f2d436e313
19 changed files with 69 additions and 91 deletions

View File

@@ -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):

View File

@@ -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')

View File

@@ -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)

View File

@@ -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

View File

@@ -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):

View File

@@ -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')

View File

@@ -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')

View File

@@ -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):

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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}

View File

@@ -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']]))

View File

@@ -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)

View File

@@ -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)

View File

@@ -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')

View File

@@ -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:

View File

@@ -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')

View File

@@ -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,