]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Rename rackspace server ImageName, Flavor, UserData.
authorSteve Baker <sbaker@redhat.com>
Sun, 28 Jul 2013 21:23:54 +0000 (09:23 +1200)
committerSteve Baker <sbaker@redhat.com>
Thu, 1 Aug 2013 22:56:29 +0000 (10:56 +1200)
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

heat/engine/resources/rackspace/cloud_server.py
heat/tests/test_rackspace_cloud_server.py

index 4f7d2a1dc82c1431df3c3b4860a0c18b306423d5..044a187389f7f19cf50d20891f1adccbef2262a9 100644 (file)
@@ -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,
index f562f33752eb9d8f9e78874decd79f35e7005745..0f7991f411adc98d2449d352d628032ad5ec5b76 100644 (file)
@@ -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)