From: Chris Alfonso Date: Thu, 19 Apr 2012 23:24:28 +0000 (-0400) Subject: Adding instance creation test X-Git-Tag: 2014.1~1938^2~4 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=2af14f5abf1e57b3b9a27362f63ad7bb85b25be1;p=openstack-build%2Fheat-build.git Adding instance creation test --- diff --git a/heat/engine/resources.py b/heat/engine/resources.py index 4ca18d5b..43866665 100644 --- a/heat/engine/resources.py +++ b/heat/engine/resources.py @@ -35,7 +35,6 @@ from heat.db import api as db_api from heat.common.config import HeatEngineConfigOpts logger = logging.getLogger('heat.engine.resources') - # If ../heat/__init__.py exists, add ../ to Python search path, so that # it will override what happens to be installed in /usr/(local/)lib/python... possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), @@ -520,6 +519,33 @@ class Instance(Resource): logger.info('%s.GetAtt(%s) == %s' % (self.name, key, res)) return unicode(res) + def _build_userdata(self, userdata): + # Build mime multipart data blob for cloudinit userdata + mime_blob = MIMEMultipart() + fp = open('%s/%s' % (cloudinit_path, 'config'), 'r') + msg = MIMEText(fp.read(), _subtype='cloud-config') + fp.close() + msg.add_header('Content-Disposition', 'attachment', + filename='cloud-config') + mime_blob.attach(msg) + + fp = open('%s/%s' % (cloudinit_path, 'part-handler.py'), 'r') + msg = MIMEText(fp.read(), _subtype='part-handler') + fp.close() + msg.add_header('Content-Disposition', 'attachment', + filename='part-handler.py') + mime_blob.attach(msg) + + msg = MIMEText(json.dumps(self.t['Metadata']), + _subtype='x-cfninitdata') + msg.add_header('Content-Disposition', 'attachment', + filename='cfn-init-data') + mime_blob.attach(msg) + + msg = MIMEText(userdata, _subtype='x-shellscript') + msg.add_header('Content-Disposition', 'attachment', filename='startup') + return mime_blob.attach(msg) + def create(self): def _null_callback(p, n, out): """ @@ -531,7 +557,6 @@ class Instance(Resource): return self.state_set(self.CREATE_IN_PROGRESS) Resource.create(self) - props = self.t['Properties'] if not 'KeyName' in props: raise exception.UserParameterMissing(key='KeyName') @@ -574,36 +599,12 @@ class Instance(Resource): if o.name == flavor: flavor_id = o.id - # Build mime multipart data blob for cloudinit userdata - mime_blob = MIMEMultipart() - fp = open('%s/%s' % (cloudinit_path, 'config'), 'r') - msg = MIMEText(fp.read(), _subtype='cloud-config') - fp.close() - msg.add_header('Content-Disposition', 'attachment', - filename='cloud-config') - mime_blob.attach(msg) - - fp = open('%s/%s' % (cloudinit_path, 'part-handler.py'), 'r') - msg = MIMEText(fp.read(), _subtype='part-handler') - fp.close() - msg.add_header('Content-Disposition', 'attachment', - filename='part-handler.py') - mime_blob.attach(msg) - - msg = MIMEText(json.dumps(self.t['Metadata']), - _subtype='x-cfninitdata') - msg.add_header('Content-Disposition', 'attachment', - filename='cfn-init-data') - mime_blob.attach(msg) - - msg = MIMEText(userdata, _subtype='x-shellscript') - msg.add_header('Content-Disposition', 'attachment', filename='startup') - mime_blob.attach(msg) + server_userdata = self._build_userdata(userdata) server = self.nova().servers.create(name=self.name, image=image_id, flavor=flavor_id, key_name=key_name, security_groups=security_groups, - userdata=mime_blob.as_string()) + userdata=server_userdata) while server.status == 'BUILD': server.get() eventlet.sleep(1) diff --git a/heat/tests/test_resources.py b/heat/tests/test_resources.py index c8f88412..ccb6e2ea 100644 --- a/heat/tests/test_resources.py +++ b/heat/tests/test_resources.py @@ -21,7 +21,7 @@ from heat.engine import parser class ResourcesTest(unittest.TestCase): def setUp(self): self.m = mox.Mox() - self.cs = fakes.FakeClient() + self.fc = fakes.FakeClient() def tearDown(self): self.m.UnsetStubs() @@ -42,18 +42,30 @@ class ResourcesTest(unittest.TestCase): stack).AndReturn(None) self.m.StubOutWithMock(resources.Instance, 'nova') - resources.Instance.nova().AndReturn(self.cs) - resources.Instance.nova().AndReturn(self.cs) - resources.Instance.nova().AndReturn(self.cs) - resources.Instance.nova().AndReturn(self.cs) + resources.Instance.nova().AndReturn(self.fc) + resources.Instance.nova().AndReturn(self.fc) + resources.Instance.nova().AndReturn(self.fc) + resources.Instance.nova().AndReturn(self.fc) + + #Need to find an easier way + userdata = t['Resources']['WebServer']['Properties']['UserData'] - - print self.cs.flavors.list()[0].name self.m.ReplayAll() + + t['Resources']['WebServer']['Properties']['ImageId'] = 'CentOS 5.2' t['Resources']['WebServer']['Properties']['InstanceType'] = '256 MB Server' instance = resources.Instance('test_resource_name',\ t['Resources']['WebServer'], stack) + + server_userdata = instance._build_userdata(json.dumps(userdata)) + self.m.StubOutWithMock(self.fc.servers, 'create') + self.fc.servers.create(image=1, flavor=1, key_name='test',\ + name='test_resource_name', security_groups=None,\ + userdata=server_userdata).\ + AndReturn(self.fc.servers.list()[1]) + self.m.ReplayAll() + instance.itype_oflavor['256 MB Server'] = '256 MB Server' instance.create()