summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2013-07-09 02:33:57 -0400
committerScott Moser <smoser@ubuntu.com>2013-07-09 02:33:57 -0400
commita3e7ecd45fcc25736863aa81b73a5d7f14619be1 (patch)
tree710382be5bda570764b79dcd9514cf08734fe247
parent21ea6154ab2aafbe51c7b23fd56e43bd1cc26b00 (diff)
parent1c76b49ccbe0c31187aeea12b0e395774aa90faa (diff)
downloadvyos-cloud-init-a3e7ecd45fcc25736863aa81b73a5d7f14619be1.tar.gz
vyos-cloud-init-a3e7ecd45fcc25736863aa81b73a5d7f14619be1.zip
merge from trunk
-rw-r--r--ChangeLog2
-rw-r--r--cloudinit/handlers/upstart_job.py60
-rw-r--r--tests/unittests/test_builtin_handlers.py2
3 files changed, 53 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 6495a19b..40c8912a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,8 @@
0.7.3:
- fix omnibus chef installer (LP: #1182265) [Chris Wing]
- small fix for OVF datasource for iso transport on non-iso9660 filesystem
+ - determine if upstart version is suitable for
+ 'initctl reload-configuration' (LP: #1124384). If so, then invoke it.
0.7.2:
- add a debian watch file
- add 'sudo' entry to ubuntu's default user (LP: #1080717)
diff --git a/cloudinit/handlers/upstart_job.py b/cloudinit/handlers/upstart_job.py
index edd56527..b3d60d6e 100644
--- a/cloudinit/handlers/upstart_job.py
+++ b/cloudinit/handlers/upstart_job.py
@@ -22,6 +22,7 @@
import os
+import re
from cloudinit import handlers
from cloudinit import log as logging
@@ -66,14 +67,53 @@ class UpstartJobPartHandler(handlers.Handler):
path = os.path.join(self.upstart_dir, filename)
util.write_file(path, payload, 0644)
- # FIXME LATER (LP: #1124384)
- # a bug in upstart means that invoking reload-configuration
- # at this stage in boot causes havoc. So, until that is fixed
- # we will not do that. However, I'd like to be able to easily
- # test to see if this bug is still present in an image with
- # a newer upstart. So, a boot hook could easiliy write this file.
- if os.path.exists("/run/cloud-init-upstart-reload"):
- # if inotify support is not present in the root filesystem
- # (overlayroot) then we need to tell upstart to re-read /etc
-
+ if SUITABLE_UPSTART:
util.subp(["initctl", "reload-configuration"], capture=False)
+
+
+def _has_suitable_upstart():
+ # (LP: #1124384)
+ # a bug in upstart means that invoking reload-configuration
+ # at this stage in boot causes havoc. So, try to determine if upstart
+ # is installed, and reloading configuration is OK.
+ if not os.path.exists("/sbin/initctl"):
+ return False
+ try:
+ (version_out, _err) = util.subp(["initctl", "version"])
+ except:
+ util.logexc(LOG, "initctl version failed")
+ return False
+
+ # expecting 'initctl version' to output something like: init (upstart X.Y)
+ if re.match("upstart 1.[0-7][\)]", version_out):
+ return False
+ if "upstart 0." in version_out:
+ return False
+ elif "upstart 1.8" in version_out:
+ if not os.path.exists("/usr/bin/dpkg-query"):
+ return False
+ try:
+ (dpkg_ver, _err) = util.subp(["dpkg-query",
+ "--showformat=${Version}",
+ "--show", "upstart"], rcs=[0, 1])
+ except Exception:
+ util.logexc(LOG, "dpkg-query failed")
+ return False
+
+ try:
+ util.subp(["dpkg", "--compare-versions", dpkg_ver, "ge", good])
+ print "good version"
+ return True
+ except util.ProcessExecutionError as e:
+ if e.exit_code is 1:
+ pass
+ else:
+ util.logexc(LOG, "dpkg --compare-versions failed [%s]",
+ e.exit_code)
+ except Exception as e:
+ util.logexc(LOG, "dpkg --compare-versions failed")
+ return False
+ else:
+ return True
+
+SUITABLE_UPSTART = _has_suitable_upstart()
diff --git a/tests/unittests/test_builtin_handlers.py b/tests/unittests/test_builtin_handlers.py
index 9cf28215..e25a5144 100644
--- a/tests/unittests/test_builtin_handlers.py
+++ b/tests/unittests/test_builtin_handlers.py
@@ -35,7 +35,6 @@ class TestBuiltins(test_helpers.FilesystemMockingTestCase):
None, None, None)
self.assertEquals(0, len(os.listdir(up_root)))
- @unittest.skip("until LP: #1124384 fixed")
def test_upstart_frequency_single(self):
# files should be written out when frequency is ! per-instance
new_root = self.makeDir()
@@ -47,6 +46,7 @@ class TestBuiltins(test_helpers.FilesystemMockingTestCase):
'upstart_dir': "/etc/upstart",
})
+ upstart_job.SUITABLE_UPSTART = True
util.ensure_dir("/run")
util.ensure_dir("/etc/upstart")