Handle different cloud-init versions gracefully
Change loguserdata script to python to allow easy detection of which version of cloud-init installed. Some logging was added to part-handler. Took out injecting the command to touch provision-finished in the user data. This is now handled in loguserdata.py. Note that up until cloud-init version 0.6.0, the user data is not passed to part-handler. This behavior is why it's not possible to log the provisioning process with older versions. (Technically could rely on the redirection support added post 0.6.0, but having a separate file just for provisioning seems beneficial.) fixes bug 1072921 Change-Id: I9005a21bfb74f27208f9195a6e10e1d2b474e91f Signed-off-by: Jeff Peeler <jpeeler@redhat.com>
This commit is contained in:
parent
0d683a1fff
commit
93c3d93ec4
|
@ -9,7 +9,7 @@ include babel.cfg install.sh run_tests.sh tox.ini uninstall.sh
|
||||||
graft templates
|
graft templates
|
||||||
include heat/versioninfo
|
include heat/versioninfo
|
||||||
include heat/cloudinit/config
|
include heat/cloudinit/config
|
||||||
include heat/cloudinit/loguserdata.sh
|
include heat/cloudinit/loguserdata.py
|
||||||
include heat/cloudinit/part-handler.py
|
include heat/cloudinit/part-handler.py
|
||||||
include heat/db/sqlalchemy/migrate_repo/migrate.cfg
|
include heat/db/sqlalchemy/migrate_repo/migrate.cfg
|
||||||
include heat/db/sqlalchemy/migrate_repo/README
|
include heat/db/sqlalchemy/migrate_repo/README
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import cloudinit
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import stat
|
||||||
|
import subprocess
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
path = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
path = cloudinit.get_cpath('data')
|
||||||
|
except AttributeError:
|
||||||
|
# pre 0.6.0 - user data executed via cloudinit, not this helper
|
||||||
|
with open('/var/log/heat-provision.log', 'w') as log:
|
||||||
|
log.write('Unable to log provisioning, need a newer version of'
|
||||||
|
' cloud-init\n')
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
os.chmod(path + '/cfn-userdata', stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
|
||||||
|
|
||||||
|
with open('/var/log/heat-provision.log', 'w') as log:
|
||||||
|
log.write('Provision began: %s\n' % datetime.datetime.now())
|
||||||
|
log.flush()
|
||||||
|
p = subprocess.Popen(path + '/cfn-userdata', stdout=log, stderr=log)
|
||||||
|
p.wait()
|
||||||
|
log.write('Provision done: %s\n' % datetime.datetime.now())
|
||||||
|
if p.returncode:
|
||||||
|
sys.exit(p.returncode)
|
||||||
|
|
||||||
|
with open(cloudinit.get_ipath_cur() + '/provision-finished', 'w') as log:
|
||||||
|
log.write('%s\n' % datetime.datetime.now())
|
|
@ -1,3 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
chmod +x /var/lib/cloud/data/cfn-userdata
|
|
||||||
script -f -c /var/lib/cloud/data/cfn-userdata /var/log/heat-provision.log
|
|
|
@ -1,5 +1,7 @@
|
||||||
#part-handler
|
#part-handler
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
def list_types():
|
def list_types():
|
||||||
return(["text/x-cfninitdata"])
|
return(["text/x-cfninitdata"])
|
||||||
|
@ -11,7 +13,10 @@ def handle_part(data, ctype, filename, payload):
|
||||||
if ctype == "__end__":
|
if ctype == "__end__":
|
||||||
return
|
return
|
||||||
|
|
||||||
|
with open('/var/log/part-handler.log', 'a') as log:
|
||||||
|
timestamp = datetime.datetime.now()
|
||||||
|
log.write('%s filename:%s, ctype:%s\n' % (timestamp, filename, ctype))
|
||||||
|
|
||||||
if ctype == 'text/x-cfninitdata':
|
if ctype == 'text/x-cfninitdata':
|
||||||
f = open('/var/lib/cloud/data/%s' % filename, 'w')
|
with open('/var/lib/cloud/data/%s' % filename, 'w') as f:
|
||||||
f.write(payload)
|
f.write(payload)
|
||||||
f.close()
|
|
||||||
|
|
|
@ -174,8 +174,8 @@ class Instance(resource.Resource):
|
||||||
(read_cloudinit_file('part-handler.py'),
|
(read_cloudinit_file('part-handler.py'),
|
||||||
'part-handler.py'),
|
'part-handler.py'),
|
||||||
(userdata, 'cfn-userdata', 'x-cfninitdata'),
|
(userdata, 'cfn-userdata', 'x-cfninitdata'),
|
||||||
(read_cloudinit_file('loguserdata.sh'),
|
(read_cloudinit_file('loguserdata.py'),
|
||||||
'loguserdata.sh', 'x-shellscript')]
|
'loguserdata.py', 'x-shellscript')]
|
||||||
|
|
||||||
if 'Metadata' in self.t:
|
if 'Metadata' in self.t:
|
||||||
attachments.append((json.dumps(self.metadata),
|
attachments.append((json.dumps(self.metadata),
|
||||||
|
@ -217,7 +217,6 @@ class Instance(resource.Resource):
|
||||||
for sg in self.properties.get('SecurityGroups')]
|
for sg in self.properties.get('SecurityGroups')]
|
||||||
|
|
||||||
userdata = self.properties['UserData'] or ''
|
userdata = self.properties['UserData'] or ''
|
||||||
userdata += '\ntouch /var/lib/cloud/instance/provision-finished\n'
|
|
||||||
flavor = self.properties['InstanceType']
|
flavor = self.properties['InstanceType']
|
||||||
key_name = self.properties['KeyName']
|
key_name = self.properties['KeyName']
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue