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