]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Assign rackspace server name from physical_resource_name.
authorSteve Baker <sbaker@redhat.com>
Sun, 28 Jul 2013 20:43:17 +0000 (08:43 +1200)
committerSteve Baker <sbaker@redhat.com>
Tue, 30 Jul 2013 22:56:26 +0000 (10:56 +1200)
The default implementation of physical_resource_name() assigns a name
which includes some context and randomness.

physical_resource_name() is overridden to optionally allow the 'name'
property to specify the physical name. The same technique is used in
OS::Swift::Container, and 'name' matches the property in the underlying
Nova API.

Change-Id: I5769513a4461d5067dca516d0f03e02bb444f379

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

index d87badbaf1d6eae9606d309670df234a8b13ad84..fb53f90aeb2797cc4347802cb0405da1a65199f4 100644 (file)
@@ -30,12 +30,12 @@ logger = logging.getLogger(__name__)
 class CloudServer(instance.Instance):
     """Resource for Rackspace Cloud Servers."""
 
-    properties_schema = {'ServerName': {'Type': 'String', 'Required': True},
-                         'Flavor': {'Type': 'String', 'Required': True},
+    properties_schema = {'Flavor': {'Type': 'String', 'Required': True},
                          'ImageName': {'Type': 'String', 'Required': True},
                          'UserData': {'Type': 'String'},
                          'key_name': {'Type': 'String'},
-                         'Volumes': {'Type': 'List'}}
+                         'Volumes': {'Type': 'List'},
+                         'name': {'Type': 'String'}}
 
     attributes_schema = {'PrivateDnsName': ('Private DNS name of the specified'
                                             ' instance.'),
@@ -146,7 +146,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', 'ServerName')
+    update_allowed_properties = ('Flavor', 'name')
 
     def __init__(self, name, json_snippet, stack):
         super(CloudServer, self).__init__(name, json_snippet, stack)
@@ -155,6 +155,13 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel
                                                        json_snippet,
                                                        stack)
 
+    def physical_resource_name(self):
+        name = self.properties.get('name')
+        if name:
+            return name
+
+        return super(CloudServer, self).physical_resource_name()
+
     def nova(self):
         return self.rs.nova()  # Override the Instance method
 
@@ -310,7 +317,7 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel
 
         # Create server
         client = self.nova().servers
-        server = client.create(self.properties['ServerName'],
+        server = client.create(self.physical_resource_name(),
                                self.image_id,
                                flavor,
                                files=personality_files)
@@ -414,12 +421,12 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel
                                           self.flavor)
             resize(wait_time=1.0)
 
-        # If ServerName is the only update, fail update
-        if prop_diff.keys() == ['ServerName'] and \
+        # If name is the only update, fail update
+        if prop_diff.keys() == ['name'] and \
            tmpl_diff.keys() == ['Properties']:
             raise exception.NotSupported(feature="Cloud Server rename")
         # Other updates were successful, so don't cause update to fail
-        elif 'ServerName' in prop_diff:
+        elif 'name' in prop_diff:
             logger.info("Cloud Server rename not supported.")
 
         return True
index 40124bf2e597e2822d4ba770d924c8b1326bda97..ea3422a0925800278340857b15d363d054fd7f06 100644 (file)
@@ -28,6 +28,7 @@ from heat.engine.resources.rackspace import cloud_server
 from heat.engine.resources.rackspace import rackspace_resource
 from heat.openstack.common import uuidutils
 from heat.tests.common import HeatTestCase
+from heat.tests import utils
 from heat.tests.utils import setup_dummy_db
 
 
@@ -49,7 +50,6 @@ wp_template = '''
       "Type": "Rackspace::Cloud::Server",
       "Properties": {
         "ImageName"      : "Fedora 17 (Beefy Miracle)",
-        "ServerName"     : "Heat test",
         "Flavor"         : "2",
         "UserData"       : "wordpress"
       }
@@ -150,8 +150,6 @@ class RackspaceCloudServerTest(HeatTestCase):
         stack_name = '%s_stack' % name
         (t, stack) = self._setup_test_stack(stack_name)
 
-        server_name = "Heat test"
-        t['Resources']['WebServer']['Properties']['ServerName'] = server_name
         cs_name = 'Fedora 17 (Beefy Miracle)'
         t['Resources']['WebServer']['Properties']['ImageName'] = cs_name
         t['Resources']['WebServer']['Properties']['Flavor'] = '2'
@@ -164,7 +162,8 @@ class RackspaceCloudServerTest(HeatTestCase):
         flavor = t['Resources']['WebServer']['Properties']['Flavor']
 
         self.m.StubOutWithMock(self.fc.servers, 'create')
-        self.fc.servers.create(server_name, "1", flavor,
+        self.fc.servers.create(utils.PhysName(stack_name, cs.name),
+                               "1", flavor,
                                files=mox.IgnoreArg()).AndReturn(return_server)
         return_server.adminPass = "foobar"