From 9f7fd58a3024e9215594a7f5ee08b8e9bf3b7450 Mon Sep 17 00:00:00 2001 From: Chris Alfonso Date: Thu, 3 May 2012 08:15:08 -0400 Subject: [PATCH] Adding mime_string to the Instance instance and fixing tests --- heat/engine/instance.py | 57 +++++++++++--------- heat/tests/test_resources.py | 101 ++++++++++++++++++----------------- 2 files changed, 83 insertions(+), 75 deletions(-) diff --git a/heat/engine/instance.py b/heat/engine/instance.py index 412b127d..bd3fc8db 100644 --- a/heat/engine/instance.py +++ b/heat/engine/instance.py @@ -51,6 +51,7 @@ class Instance(Resource): def __init__(self, name, json_snippet, stack): super(Instance, self).__init__(name, json_snippet, stack) self.ipaddress = '0.0.0.0' + self.mime_string = None if not 'AvailabilityZone' in self.t['Properties']: self.t['Properties']['AvailabilityZone'] = 'nova' @@ -84,32 +85,36 @@ class Instance(Resource): 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') - mime_blob.attach(msg) - return mime_blob.as_string() + if not self.mime_string: + # 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) + self.mime_string = mime_blob.as_string() + + return self.mime_string + def create(self): def _null_callback(p, n, out): diff --git a/heat/tests/test_resources.py b/heat/tests/test_resources.py index 3a4f0cdf..91358527 100644 --- a/heat/tests/test_resources.py +++ b/heat/tests/test_resources.py @@ -11,24 +11,23 @@ from nose.plugins.attrib import attr from nose import with_setup from heat.tests.v1_1 import fakes -from heat.engine import resources -from heat.engine import instance +from heat.engine import instance as instances import heat.db as db_api from heat.engine import parser @attr(tag=['unit', 'resource']) @attr(speed='fast') -class ResourcesTest(unittest.TestCase): +class instancesTest(unittest.TestCase): def setUp(self): self.m = mox.Mox() self.fc = fakes.FakeClient() def tearDown(self): self.m.UnsetStubs() - print "ResourcesTest teardown complete" + print "instancesTest teardown complete" - def test_initialize_instance_from_template(self): + def test_instance_create(self): f = open('../../templates/WordPress_Single_Instance_gold.template') t = json.loads(f.read()) f.close() @@ -43,24 +42,29 @@ class ResourcesTest(unittest.TestCase): db_api.resource_get_by_name_and_stack(None, 'test_resource_name',\ stack).AndReturn(None) - self.m.StubOutWithMock(instance.Instance, 'nova') - instance.Instance.nova().AndReturn(self.fc) - instance.Instance.nova().AndReturn(self.fc) - instance.Instance.nova().AndReturn(self.fc) - instance.Instance.nova().AndReturn(self.fc) - - #Need to find an easier way - userdata = t['Resources']['WebServer']['Properties']['UserData'] + self.m.StubOutWithMock(instances.Instance, 'nova') + instances.Instance.nova().AndReturn(self.fc) + instances.Instance.nova().AndReturn(self.fc) + instances.Instance.nova().AndReturn(self.fc) + instances.Instance.nova().AndReturn(self.fc) self.m.ReplayAll() t['Resources']['WebServer']['Properties']['ImageId'] = 'CentOS 5.2' t['Resources']['WebServer']['Properties']['InstanceType'] = \ '256 MB Server' - inst = instance.Instance('test_resource_name',\ - t['Resources']['WebServer'], stack) - - server_userdata = inst._build_userdata(json.dumps(userdata)) + instance = instances.Instance('test_resource_name',\ + t['Resources']['WebServer'], stack) + + instance.itype_oflavor['256 MB Server'] = '256 MB Server' + instance.stack.resolve_attributes(instance.t) + instance.stack.resolve_joins(instance.t) + instance.stack.resolve_base64(instance.t) + + # need to resolve the template functions + server_userdata = instance._build_userdata(\ + instance.t['Properties']['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,\ @@ -68,18 +72,13 @@ class ResourcesTest(unittest.TestCase): AndReturn(self.fc.servers.list()[1]) self.m.ReplayAll() - inst.itype_oflavor['256 MB Server'] = '256 MB Server' - inst.create() - - self.m.ReplayAll() - - inst.itype_oflavor['256 MB Server'] = '256 MB Server' - inst.create() + instance.itype_oflavor['256 MB Server'] = '256 MB Server' + instance.create() # this makes sure the auto increment worked on instance creation - assert(inst.id > 0) + assert(instance.id > 0) - def test_initialize_instance_from_template_and_delete(self): + def test_instance_create_delete(self): f = open('../../templates/WordPress_Single_Instance_gold.template') t = json.loads(f.read()) f.close() @@ -94,24 +93,29 @@ class ResourcesTest(unittest.TestCase): db_api.resource_get_by_name_and_stack(None, 'test_resource_name',\ stack).AndReturn(None) - self.m.StubOutWithMock(instance.Instance, 'nova') - instance.Instance.nova().AndReturn(self.fc) - instance.Instance.nova().AndReturn(self.fc) - instance.Instance.nova().AndReturn(self.fc) - instance.Instance.nova().AndReturn(self.fc) - - #Need to find an easier way - userdata = t['Resources']['WebServer']['Properties']['UserData'] + self.m.StubOutWithMock(instances.Instance, 'nova') + instances.Instance.nova().AndReturn(self.fc) + instances.Instance.nova().AndReturn(self.fc) + instances.Instance.nova().AndReturn(self.fc) + instances.Instance.nova().AndReturn(self.fc) self.m.ReplayAll() t['Resources']['WebServer']['Properties']['ImageId'] = 'CentOS 5.2' t['Resources']['WebServer']['Properties']['InstanceType'] = \ '256 MB Server' - inst = instance.Instance('test_resource_name',\ - t['Resources']['WebServer'], stack) - - server_userdata = inst._build_userdata(json.dumps(userdata)) + instance = instances.Instance('test_resource_name',\ + t['Resources']['WebServer'], stack) + + instance.itype_oflavor['256 MB Server'] = '256 MB Server' + instance.stack.resolve_attributes(instance.t) + instance.stack.resolve_joins(instance.t) + instance.stack.resolve_base64(instance.t) + + # need to resolve the template functions + server_userdata = instance._build_userdata(\ + instance.t['Properties']['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,\ @@ -119,20 +123,19 @@ class ResourcesTest(unittest.TestCase): AndReturn(self.fc.servers.list()[1]) self.m.ReplayAll() - inst.itype_oflavor['256 MB Server'] = '256 MB Server' - inst.create() + instance.instance_id = 1234 + instance.itype_oflavor['256 MB Server'] = '256 MB Server' + instance.create() - self.m.ReplayAll() - - inst.instance_id = 1234 - inst.itype_oflavor['256 MB Server'] = '256 MB Server' - inst.create() + # this makes sure the auto increment worked on instance creation + + assert(instance.id > 0) - inst.delete() - assert(inst.instance_id == None) - assert(inst.state == inst.DELETE_COMPLETE) + instance.delete() + assert(instance.instance_id == None) + assert(instance.state == instance.DELETE_COMPLETE) - # allows testing of the test directly, shown below + # allows testing of the test directly, shown below if __name__ == '__main__': sys.argv.append(__file__) nose.main() -- 2.45.2