]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Support any distribution without UserData/MetaData
authorJason Dunsmore <jasondunsmore@gmail.com>
Wed, 24 Jul 2013 20:07:41 +0000 (15:07 -0500)
committerJason Dunsmore <jasondunsmore@gmail.com>
Fri, 26 Jul 2013 16:11:27 +0000 (11:11 -0500)
A template without UserData or MetaData sections should work with any
distribution, regardless of whether or not a setup script exists for
it in the Cloud Servers resource. The setup script only exists so that
the UserData and MetaData sections will configure the server.

Bug 1204650

Change-Id: Ie795ff63a5a15916c67d96782ea01d604d4768b0

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

index 2adac13278bc730c6812f492a567879155028056..1b6cd584d4b070b43ce3b1418186ccd93a51cb50 100644 (file)
@@ -215,12 +215,22 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel
         except exception.ResourceFailure as ex:
             logger.info(ex.message)
 
+    @property
+    def has_userdata(self):
+        if self.properties['UserData'] 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 not self.script:
-            return {'Error': "Image %s not supported." %
+
+        # It's okay if there's no script, as long as UserData and
+        # MetaData are empty
+        if not self.script and self.has_userdata:
+            return {'Error': "UserData/MetaData are not supported with %s." %
                     self.properties['ImageName']}
 
     def _run_ssh_command(self, command):
@@ -320,16 +330,18 @@ zypper --non-interactive in cloud-init python-boto python-pip gcc python-devel
         if not self._check_active(cookie):
             return False
 
-        # Create heat-script and userdata files on server
-        raw_userdata = self.properties['UserData'] or ''
-        userdata = self._build_userdata(raw_userdata)
-        files = [{'path': "/tmp/userdata", 'data': userdata},
-                 {'path': "/root/heat-script.sh", 'data': self.script}]
-        self._sftp_files(files)
+        if self.has_userdata:
+            # Create heat-script and userdata files on server
+            raw_userdata = self.properties['UserData'] or ''
+            userdata = self._build_userdata(raw_userdata)
+
+            files = [{'path': "/tmp/userdata", 'data': userdata},
+                     {'path': "/root/heat-script.sh", 'data': self.script}]
+            self._sftp_files(files)
 
-        # Connect via SSH and run script
-        command = "bash -ex /root/heat-script.sh > /root/heat-script.log 2>&1"
-        self._run_ssh_command(command)
+            # Connect via SSH and run script
+            cmd = "bash -ex /root/heat-script.sh > /root/heat-script.log 2>&1"
+            self._run_ssh_command(cmd)
 
         return True
 
index b811b08e1317645558073b83699c012d88dd8406..a4087d2c3a34829496530998f25b03e0fc871da3 100644 (file)
@@ -227,9 +227,29 @@ class RackspaceCloudServerTest(HeatTestCase):
         cs = cloud_server.CloudServer('cs_create_image_err',
                                       t['Resources']['WebServer'], stack)
 
-        self.assertEqual({'Error': "Image %s not supported." % 'Slackware'},
+        self.assertEqual({'Error': "UserData/MetaData are not supported with "
+                          "Slackware."},
                          cs.validate())
+        self.m.VerifyAll()
+
+    def test_cs_create_image_name_okay(self):
+        stack_name = 'test_cs_create_image_name_err_stack'
+        (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'] = ''
+
+        # Mock flavors
+        self.m.StubOutWithMock(cloud_server.CloudServer, "flavors")
+        cloud_server.CloudServer.flavors.__contains__('2').AndReturn(True)
+        cloud_server.CloudServer.script = None
+        self.m.ReplayAll()
+
+        cs = cloud_server.CloudServer('cs_create_image_err',
+                                      t['Resources']['WebServer'], stack)
 
+        self.assertEqual(None, cs.validate())
         self.m.VerifyAll()
 
     def test_cs_create_flavor_err(self):