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>
graft templates
include heat/versioninfo
include heat/cloudinit/config
-include heat/cloudinit/loguserdata.sh
+include heat/cloudinit/loguserdata.py
include heat/cloudinit/part-handler.py
include heat/db/sqlalchemy/migrate_repo/migrate.cfg
include heat/db/sqlalchemy/migrate_repo/README
--- /dev/null
+#!/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())
+++ /dev/null
-#!/bin/bash
-chmod +x /var/lib/cloud/data/cfn-userdata
-script -f -c /var/lib/cloud/data/cfn-userdata /var/log/heat-provision.log
#part-handler
+import datetime
+
def list_types():
return(["text/x-cfninitdata"])
if ctype == "__end__":
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':
- f = open('/var/lib/cloud/data/%s' % filename, 'w')
- f.write(payload)
- f.close()
+ with open('/var/lib/cloud/data/%s' % filename, 'w') as f:
+ f.write(payload)
(read_cloudinit_file('part-handler.py'),
'part-handler.py'),
(userdata, 'cfn-userdata', 'x-cfninitdata'),
- (read_cloudinit_file('loguserdata.sh'),
- 'loguserdata.sh', 'x-shellscript')]
+ (read_cloudinit_file('loguserdata.py'),
+ 'loguserdata.py', 'x-shellscript')]
if 'Metadata' in self.t:
attachments.append((json.dumps(self.metadata),
for sg in self.properties.get('SecurityGroups')]
userdata = self.properties['UserData'] or ''
- userdata += '\ntouch /var/lib/cloud/instance/provision-finished\n'
flavor = self.properties['InstanceType']
key_name = self.properties['KeyName']