From 4d3f6713301a3885cc4daf8c7a8b52672f3842cc Mon Sep 17 00:00:00 2001 From: Steve Baker Date: Mon, 29 Jul 2013 09:23:54 +1200 Subject: [PATCH] Rename rackspace server ImageName, Flavor, UserData. Justifications for each rename are as follows: - ImageName -> image: the Nova API uses imageRef, however heat does a lookup from image name to id, so 'image' covers either name or id. - Flavor -> flavor: the Nova API uses flavorRef, but in the future heat should be able to do a lookup on the flavor name as well, so calling the attribute 'flavor' will API future-proof that change. - UserData -> user_data: maps directly to Nova API Change-Id: I1327f7b33d744908714dfb7a4caeb6ec306196e7 --- .../resources/rackspace/cloud_server.py | 38 +++++++++---------- heat/tests/test_rackspace_cloud_server.py | 32 ++++++++-------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/heat/engine/resources/rackspace/cloud_server.py b/heat/engine/resources/rackspace/cloud_server.py index 4f7d2a1d..044a1873 100644 --- a/heat/engine/resources/rackspace/cloud_server.py +++ b/heat/engine/resources/rackspace/cloud_server.py @@ -30,9 +30,9 @@ logger = logging.getLogger(__name__) class CloudServer(instance.Instance): """Resource for Rackspace Cloud Servers.""" - properties_schema = {'Flavor': {'Type': 'String', 'Required': True}, - 'ImageName': {'Type': 'String', 'Required': True}, - 'UserData': {'Type': 'String'}, + properties_schema = {'flavor': {'Type': 'String', 'Required': True}, + 'image': {'Type': 'String', 'Required': True}, + 'user_data': {'Type': 'String'}, 'key_name': {'Type': 'String'}, 'Volumes': {'Type': 'List'}, 'name': {'Type': 'String'}} @@ -149,7 +149,7 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel # Template keys supported for handle_update. Properties not # listed here trigger an UpdateReplace update_allowed_keys = ('Metadata', 'Properties') - update_allowed_properties = ('Flavor', 'name') + update_allowed_properties = ('flavor', 'name') def __init__(self, name, json_snippet, stack): super(CloudServer, self).__init__(name, json_snippet, stack) @@ -183,8 +183,8 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel @property def image_id(self): - """Get the image ID corresponding to the ImageName property.""" - image_name = self.properties['ImageName'] + """Get the image ID corresponding to the image property.""" + image_name = self.properties['image'] if image_name in self.__class__._image_id_map: return self.__class__._image_id_map[image_name] else: @@ -236,7 +236,7 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel """Return the IP of the Cloud Server.""" def ip_not_found(): exc = exception.Error("Could not determine the %s IP of %s." % - (ip_type, self.properties['ImageName'])) + (ip_type, self.properties['image'])) raise exception.ResourceFailure(exc) if ip_type not in self.server.addresses: @@ -261,21 +261,21 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel @property def has_userdata(self): - if self.properties['UserData'] or self.metadata != {}: + if self.properties['user_data'] or self.metadata != {}: return True else: return False def validate(self): """Validate user parameters.""" - if self.properties['Flavor'] not in self.flavors: - return {'Error': "Flavor not found."} + if self.properties['flavor'] not in self.flavors: + return {'Error': "flavor not found."} - # It's okay if there's no script, as long as UserData and - # MetaData are empty + # It's okay if there's no script, as long as user_data and + # metadata are empty if not self.script and self.has_userdata: - return {'Error': "UserData/MetaData are not supported with %s." % - self.properties['ImageName']} + return {'Error': "user_data/metadata are not supported with %s." % + self.properties['image']} def _run_ssh_command(self, command): """Run a shell command on the Cloud Server via SSH.""" @@ -313,7 +313,7 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel server and then trigger cloud-init. """ # Retrieve server creation parameters from properties - flavor = self.properties['Flavor'] + flavor = self.properties['flavor'] # Generate SSH public/private keypair if self._private_key is not None: @@ -381,7 +381,7 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel if self.has_userdata: # Create heat-script and userdata files on server - raw_userdata = self.properties['UserData'] or '' + raw_userdata = self.properties['user_data'] or '' userdata = self._build_userdata(raw_userdata) files = [{'path': "/tmp/userdata", 'data': userdata}, @@ -414,7 +414,7 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel def handle_update(self, json_snippet, tmpl_diff, prop_diff): """Try to update a Cloud Server's parameters. - If the Cloud Server's Metadata or Flavor changed, update the + If the Cloud Server's Metadata or flavor changed, update the Cloud Server. If any other parameters changed, re-create the Cloud Server with the new parameters. """ @@ -430,8 +430,8 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel "/root/cfn-userdata.log 2>&1" self._run_ssh_command(command) - if 'Flavor' in prop_diff: - self.flavor = json_snippet['Properties']['Flavor'] + if 'flavor' in prop_diff: + self.flavor = json_snippet['Properties']['flavor'] self.server.resize(self.flavor) resize = scheduler.TaskRunner(self._check_resize, self.server, diff --git a/heat/tests/test_rackspace_cloud_server.py b/heat/tests/test_rackspace_cloud_server.py index f562f337..0f7991f4 100644 --- a/heat/tests/test_rackspace_cloud_server.py +++ b/heat/tests/test_rackspace_cloud_server.py @@ -38,7 +38,7 @@ wp_template = ''' "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "WordPress", "Parameters" : { - "Flavor" : { + "flavor" : { "Description" : "Rackspace Cloud Server flavor", "Type" : "String", "Default" : "2", @@ -50,9 +50,9 @@ wp_template = ''' "WebServer": { "Type": "Rackspace::Cloud::Server", "Properties": { - "ImageName" : "Fedora 17 (Beefy Miracle)", - "Flavor" : "2", - "UserData" : "wordpress" + "image" : "Fedora 17 (Beefy Miracle)", + "flavor" : "2", + "user_data" : "wordpress" } } } @@ -108,7 +108,7 @@ class RackspaceCloudServerTest(HeatTestCase): t = template_format.parse(wp_template) template = parser.Template(t) stack = parser.Stack(dummy_context(), stack_name, template, - environment.Environment({'Flavor': '2'}), + environment.Environment({'flavor': '2'}), stack_id=uuidutils.generate_uuid()) return (t, stack) @@ -152,15 +152,15 @@ class RackspaceCloudServerTest(HeatTestCase): (t, stack) = self._setup_test_stack(stack_name) cs_name = 'Fedora 17 (Beefy Miracle)' - t['Resources']['WebServer']['Properties']['ImageName'] = cs_name - t['Resources']['WebServer']['Properties']['Flavor'] = '2' + t['Resources']['WebServer']['Properties']['image'] = cs_name + t['Resources']['WebServer']['Properties']['flavor'] = '2' cs = cloud_server.CloudServer('%s_name' % name, t['Resources']['WebServer'], stack) cs._private_key = rsa_key cs.t = cs.stack.resolve_runtime_data(cs.t) - flavor = t['Resources']['WebServer']['Properties']['Flavor'] + flavor = t['Resources']['WebServer']['Properties']['flavor'] self.m.StubOutWithMock(self.fc.servers, 'create') self.fc.servers.create(utils.PhysName(stack_name, cs.name), @@ -234,7 +234,7 @@ class RackspaceCloudServerTest(HeatTestCase): (t, stack) = self._setup_test_stack(stack_name) # create a cloud server with non exist image name - t['Resources']['WebServer']['Properties']['ImageName'] = 'Slackware' + t['Resources']['WebServer']['Properties']['image'] = 'Slackware' # Mock flavors self.m.StubOutWithMock(cloud_server.CloudServer, "flavors") @@ -245,7 +245,7 @@ class RackspaceCloudServerTest(HeatTestCase): cs = cloud_server.CloudServer('cs_create_image_err', t['Resources']['WebServer'], stack) - self.assertEqual({'Error': "UserData/MetaData are not supported with " + self.assertEqual({'Error': "user_data/metadata are not supported with " "Slackware."}, cs.validate()) self.m.VerifyAll() @@ -255,8 +255,8 @@ class RackspaceCloudServerTest(HeatTestCase): (t, stack) = self._setup_test_stack(stack_name) # create a cloud server with non exist image name - t['Resources']['WebServer']['Properties']['ImageName'] = 'Slackware' - t['Resources']['WebServer']['Properties']['UserData'] = '' + t['Resources']['WebServer']['Properties']['image'] = 'Slackware' + t['Resources']['WebServer']['Properties']['user_data'] = '' # Mock flavors self.m.StubOutWithMock(cloud_server.CloudServer, "flavors") @@ -271,12 +271,12 @@ class RackspaceCloudServerTest(HeatTestCase): self.m.VerifyAll() def test_cs_create_flavor_err(self): - """validate() should throw an if the Flavor is invalid.""" + """validate() should throw an if the flavor is invalid.""" stack_name = 'test_cs_create_flavor_err_stack' (t, stack) = self._setup_test_stack(stack_name) # create a cloud server with non exist image name - t['Resources']['WebServer']['Properties']['Flavor'] = '1' + t['Resources']['WebServer']['Properties']['flavor'] = '1' # Mock flavors self.m.StubOutWithMock(cloud_server.CloudServer, "flavors") @@ -287,7 +287,7 @@ class RackspaceCloudServerTest(HeatTestCase): cs = cloud_server.CloudServer('cs_create_flavor_err', t['Resources']['WebServer'], stack) - self.assertEqual({'Error': "Flavor not found."}, cs.validate()) + self.assertEqual({'Error': "flavor not found."}, cs.validate()) self.m.VerifyAll() @@ -334,7 +334,7 @@ class RackspaceCloudServerTest(HeatTestCase): cs = self._create_test_cs(return_server, 'test_cs_update') update_template = copy.deepcopy(cs.t) - update_template['Properties']['UserData'] = 'mustreplace' + update_template['Properties']['user_data'] = 'mustreplace' self.assertRaises(resource.UpdateReplace, cs.update, update_template) -- 2.45.2