From: Jason Dunsmore Date: Wed, 24 Jul 2013 20:07:41 +0000 (-0500) Subject: Support any distribution without UserData/MetaData X-Git-Tag: 2014.1~302^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=f28df6ad16bea796bea5713fa3368961f9a1749d;p=openstack-build%2Fheat-build.git Support any distribution without UserData/MetaData 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 --- diff --git a/heat/engine/resources/rackspace/cloud_server.py b/heat/engine/resources/rackspace/cloud_server.py index 2adac132..1b6cd584 100644 --- a/heat/engine/resources/rackspace/cloud_server.py +++ b/heat/engine/resources/rackspace/cloud_server.py @@ -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 diff --git a/heat/tests/test_rackspace_cloud_server.py b/heat/tests/test_rackspace_cloud_server.py index b811b08e..a4087d2c 100644 --- a/heat/tests/test_rackspace_cloud_server.py +++ b/heat/tests/test_rackspace_cloud_server.py @@ -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):