diff options
authorRichard Maw <>2015-09-18 09:53:15 (GMT)
committerRichard Maw <>2015-09-18 10:28:24 (GMT)
commitaeeab946dac9100be26756bfd4948f4b52df386e (patch)
parent5407fd1066c3a4e56d34f5db9e8a7c5d71745937 (diff)
install-files: Allow definition of manifests in multiple variables
install-files was initially designed such that if you wanted to install multiple manifests you should put multiple whitespace separated paths in the INSTALL_FILES variable. This is clunky if you want to extend the set of files to install, particularly in cluster deployments with multiple systems, as otherwise you could make use of YAML merge keys. So now, like fstab.configure you can set multple options, by using environment variables that start with INSTALL_FILES. It's also easier to extend the set of install files on the command-line or in the environment this way too, since you don't need to parse the YAML to see what it originally had. Change-Id: I298db7ae9790a536e5a5f32b069d0908012695af
3 files changed, 28 insertions, 6 deletions
diff --git a/extensions/install-essential-files.configure b/extensions/install-essential-files.configure
index 3d33fe0..8314b56 100755
--- a/extensions/install-essential-files.configure
+++ b/extensions/install-essential-files.configure
@@ -27,6 +27,14 @@ import subprocess
import sys
target_root = sys.argv[1]
+# Clear all INSTALL_FILES environment variable options,
+# so we don't end up installing INSTALL_FILES_foo multiple times.
+for var in list(os.environ):
+ if var.startswith("INSTALL_FILES"):
+ del os.environ[var]
+# Force installation of the essential-files manifest
os.environ["INSTALL_FILES"] = "install-files/essential-files/manifest"
-command = os.path.join("extensions/install-files.configure")
+command = "extensions/install-files.configure"
subprocess.check_call([command, target_root])
diff --git a/extensions/install-files.configure b/extensions/install-files.configure
index 64fcecc..782065d 100755
--- a/extensions/install-files.configure
+++ b/extensions/install-files.configure
@@ -16,7 +16,7 @@
''' A Morph configuration extension for adding arbitrary files to a system
-It will read the manifest files specified in the environment variable
+It will read the manifest files specified in environment variables starting
INSTALL_FILES, then use the contens of those files to determine which files
to install into the target system.
@@ -41,12 +41,14 @@ import writeexts
class InstallFilesConfigureExtension(writeexts.Extension):
def process_args(self, args):
- if not 'INSTALL_FILES' in os.environ:
+ if not any(var.startswith('INSTALL_FILES') for var in os.environ):
target_root = args[0]
- manifests = shlex.split(os.environ['INSTALL_FILES'])
- for manifest in manifests:
- self.install_manifest(manifest, target_root)
+ for manifest_var in sorted((var for var in os.environ
+ if var.startswith('INSTALL_FILES'))):
+ manifests = shlex.split(os.environ[manifest_var])
+ for manifest in manifests:
+ self.install_manifest(manifest, target_root)
def install_manifest(self, manifest, target_root):
manifest_dir = os.path.dirname(manifest)
diff --git a/extensions/ b/extensions/
index 991c26c..191e137 100644
--- a/extensions/
+++ b/extensions/
@@ -40,6 +40,18 @@ help: |
INSTALL_FILES: sshkeysfiles/manifest
+ All variables starting INSTALL_FILES are considered, and are processed in
+ alphabetical order, so if INSTALL_FILES, INSTALL_FILES_distbuild and
+ INSTALL_FILES_openstack are given, manifests in INSTALL_FILES are processed
+ before those in INSTALL_FILES_distbuild, followed by INSTALL_FILES_openstack.
+ Multiple manifest files may be given in the same INSTALL_FILES variable,
+ by providing a whitespace separated list.
+ Shell word splitting is supported, so if a manifest's path has spaces in,
+ the path may be shell escaped.
More generally entries in the manifest are formatted as:
[overwrite] <octal mode> <uid decimal> <gid decimal> <filename>