]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Adding mime_string to the Instance instance and fixing tests
authorChris Alfonso <calfonso@redhat.com>
Thu, 3 May 2012 12:15:08 +0000 (08:15 -0400)
committerChris Alfonso <calfonso@redhat.com>
Thu, 3 May 2012 12:16:41 +0000 (08:16 -0400)
heat/engine/instance.py
heat/tests/test_resources.py

index 412b127dfbdfda5076bbbce79a01eff5d0d1dedf..bd3fc8db444d896da1a0bc7c53bd95f4b29840ae 100644 (file)
@@ -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):
index 3a4f0cdf794ae792add16f3a247509a3a54ccd3f..91358527b4bf97fe2d3f9b618a4a3438d315645e 100644 (file)
@@ -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()