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'
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):
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()
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,\
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()
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,\
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()