Instead of being dependent on a system service that
various distributions may not enable or configure correctly
or they do so via patches just use a known to work default
logging mechanism (and if distros want to change this, that
is fine, but at least the built-in one will work reliably).
The test in decode_binary for six.text_type was incorrect as that includes
unicode type in Python 2 which should actually be decoded.
When the type is string_types we now properly check only for basestring and
str in Python 2 and Python 3 respectively and return the given blob without
making an attempt to decode.
If device has no partition table, the first line of output from `sgdisk
-p <device>` will be "Creating new GPT entries.", instead of something
like "Disk /dev/sdb: 266338304 sectors, 127.0 GiB".
Also, protect against localized output by adjusting subp calls that
parse sgdisk output to set LANG=C.
The end result of all of these changes is to get mounts managed by
cloud-init to occur only after cloud-init.service is done. We need to do
that so that filesystems that are set up by cloud-init (in disk_setup)
do not get mounted by stale entries in /etc/fstab before
the setup occurs.
This can occur in 2 ways:
a.) new instance with old /etc/fstab
b.) same instance where disk needs adjusting (Azure resize will re-format
the ephemeral disk).
The list of changes here is:
- move mounts and disk_setup module to cloud-init.service rather
than config. cloud-init.service runs earlier in boot so it
can get those mount points done earlier.
- on systemd add 'x-systemd.requires=cloud-init.service' to fstab options
- cloud-init-local.service: add Before=basic.target
- cloud-init.service:
- extend After, Before, and Wants to multiple lines rather than one
long line.
- sort consistently with cloud-init-local.service
- add DefaultDependencies=no
- add Before=default.target
- add Conflicts=shutdown.target
systemd: put cloud-init.target After multi-user.target
When we moved cloud-final.service to run After multi-user.target it
caused a dependency loop (as cloud-init.target was still implied to be
Before multi-user.target).
journalctl would either show:
cloud-init.target: Breaking ordering cycle by deleting job
cloud-final.service/start
or
multi-user.target: Breaking ordering cycle by deleting job
cloud-init.target/start
The fix here is to clearly state that cloud-init.target is also
After multi-user.target