summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Coldrick <adam.coldrick@codethink.co.uk>2015-06-02 14:01:55 +0000
committerAdam Coldrick <adam.coldrick@codethink.co.uk>2015-06-02 14:01:55 +0000
commitc6abc426b5857f9b1edd9c72e3094c1e2df8a7bf (patch)
treeeff61e6fe9bb3adcf254c4e86eebca7190c65cce
parent4f43fdd08770c113f7443fecbda43d4316091d4b (diff)
parent02faf51e91a8c55adfbb6d953bca354ab99bf261 (diff)
downloaddefinitions-c6abc426b5857f9b1edd9c72e3094c1e2df8a7bf.tar.gz
Merge branch 'baserock/adamcoldrick/all-exts-in-definitions-v2'
Reviewed-by: Richard Maw <richard.maw@codethink.co.uk>
-rw-r--r--clusters/cephclient.morph4
-rw-r--r--clusters/ci.morph18
-rw-r--r--clusters/example-distbuild-cluster.morph8
-rw-r--r--clusters/example-swift-storage-cluster.morph6
-rw-r--r--clusters/hardware-deployment.morph6
-rw-r--r--clusters/image-package-example.morph4
-rw-r--r--clusters/initramfs-test.morph4
-rw-r--r--clusters/installer-build-system-x86_64.morph8
-rw-r--r--clusters/jetson-upgrade.morph2
-rw-r--r--clusters/mason-openstack.morph4
-rw-r--r--clusters/mason.morph6
-rw-r--r--clusters/minimal-system-armv5l-openbmc-aspeed-deploy.morph2
-rw-r--r--clusters/minimal-system-deploy.morph2
-rw-r--r--clusters/moonshot-m2-armv8b64.morph8
-rw-r--r--clusters/moonshot-pxe-armv8b64.morph4
-rw-r--r--clusters/moonshot-pxe-armv8l64.morph4
-rw-r--r--clusters/openstack-one-node-swift.morph4
-rw-r--r--clusters/openstack-one-node.morph4
-rw-r--r--clusters/openstack-three-node-installer.morph8
-rw-r--r--clusters/openstack-two-node-installer.morph8
-rw-r--r--clusters/release.morph18
-rw-r--r--clusters/sdk-example-cluster.morph4
-rw-r--r--clusters/trove-example.morph4
-rw-r--r--clusters/trove.baserock.org-upgrade.morph2
-rw-r--r--clusters/upgrade-devel.morph2
-rw-r--r--clusters/weston-system-x86_64-generic-deploy.morph4
-rw-r--r--clusters/zookeeper.morph4
-rwxr-xr-xextensions/add-config-files.configure26
-rw-r--r--extensions/busybox-init.configure (renamed from busybox-init.configure)0
-rw-r--r--extensions/ceph.configure (renamed from ceph.configure)0
-rwxr-xr-xextensions/cloud-init.configure (renamed from cloud-init.configure)0
-rwxr-xr-xextensions/distbuild-trove-nfsboot.check150
-rwxr-xr-xextensions/distbuild-trove-nfsboot.write283
-rw-r--r--extensions/distbuild-trove-nfsboot.write.help49
-rw-r--r--extensions/distbuild.configure (renamed from distbuild.configure)0
-rwxr-xr-xextensions/fstab.configure28
-rw-r--r--extensions/hosts (renamed from distbuild/usr/lib/distbuild-setup/ansible/hosts)0
-rwxr-xr-xextensions/hosts.configure48
-rw-r--r--extensions/image-package-example/README (renamed from image-package-example/README)0
-rw-r--r--extensions/image-package-example/common.sh.in (renamed from image-package-example/common.sh.in)0
-rw-r--r--extensions/image-package-example/disk-install.sh.in (renamed from image-package-example/disk-install.sh.in)0
-rw-r--r--extensions/image-package-example/make-disk-image.sh.in (renamed from image-package-example/make-disk-image.sh.in)0
-rwxr-xr-xextensions/image-package.write (renamed from image-package.write)0
-rwxr-xr-xextensions/initramfs.write26
-rw-r--r--extensions/initramfs.write.help55
-rwxr-xr-xextensions/install-essential-files.configure42
-rw-r--r--extensions/install-essential-files.configure.help20
-rwxr-xr-xextensions/install-files.configure134
-rw-r--r--extensions/install-files.configure.help74
-rwxr-xr-xextensions/installer.configure (renamed from installer.configure)0
-rw-r--r--extensions/jffs2.write (renamed from jffs2.write)0
-rw-r--r--extensions/jffs2.write.help (renamed from jffs2.write.help)0
-rwxr-xr-xextensions/kvm.check169
-rwxr-xr-xextensions/kvm.write120
-rw-r--r--extensions/kvm.write.help90
-rw-r--r--extensions/mason.configure (renamed from mason.configure)18
-rw-r--r--extensions/mason/ansible/hosts (renamed from hosts)0
-rw-r--r--extensions/mason/ansible/mason-setup.yml (renamed from mason/ansible/mason-setup.yml)0
-rw-r--r--extensions/mason/httpd.service (renamed from mason/httpd.service)0
-rwxr-xr-xextensions/mason/mason-generator.sh (renamed from mason/mason-generator.sh)0
-rwxr-xr-xextensions/mason/mason-report.sh (renamed from mason/mason-report.sh)0
-rw-r--r--extensions/mason/mason-setup.service (renamed from mason/mason-setup.service)0
-rw-r--r--extensions/mason/mason.service (renamed from mason/mason.service)0
-rwxr-xr-xextensions/mason/mason.sh (renamed from mason/mason.sh)0
-rw-r--r--extensions/mason/mason.timer (renamed from mason/mason.timer)0
-rw-r--r--extensions/mason/os-init-script (renamed from mason/os-init-script)0
-rw-r--r--extensions/mason/share/mason.conf (renamed from mason/share/mason.conf)0
-rw-r--r--extensions/mason/share/os.conf (renamed from mason/share/os.conf)0
-rw-r--r--extensions/moonshot-kernel.configure (renamed from moonshot-kernel.configure)0
-rwxr-xr-xextensions/nfsboot-server.configure (renamed from nfsboot-server.configure)0
-rwxr-xr-xextensions/nfsboot.check95
-rwxr-xr-xextensions/nfsboot.configure30
-rwxr-xr-xextensions/nfsboot.write202
-rw-r--r--extensions/nfsboot.write.help33
-rw-r--r--extensions/openstack-ceilometer.configure (renamed from openstack-ceilometer.configure)0
-rw-r--r--extensions/openstack-cinder.configure (renamed from openstack-cinder.configure)0
-rw-r--r--extensions/openstack-glance.configure (renamed from openstack-glance.configure)0
-rw-r--r--extensions/openstack-ironic.configure (renamed from openstack-ironic.configure)0
-rw-r--r--extensions/openstack-keystone.configure (renamed from openstack-keystone.configure)0
-rw-r--r--extensions/openstack-network.configure (renamed from openstack-network.configure)0
-rw-r--r--extensions/openstack-neutron.configure (renamed from openstack-neutron.configure)0
-rw-r--r--extensions/openstack-nova.configure (renamed from openstack-nova.configure)0
-rw-r--r--extensions/openstack-swift-controller.configure (renamed from openstack-swift-controller.configure)0
-rwxr-xr-xextensions/openstack.check90
-rwxr-xr-xextensions/openstack.write93
-rw-r--r--extensions/openstack.write.help51
-rwxr-xr-xextensions/pxeboot.check (renamed from pxeboot.check)0
-rw-r--r--extensions/pxeboot.write (renamed from pxeboot.write)0
-rw-r--r--extensions/pxeboot.write.help (renamed from pxeboot.write.help)0
-rwxr-xr-xextensions/rawdisk.check53
-rwxr-xr-xextensions/rawdisk.write108
-rw-r--r--extensions/rawdisk.write.help82
-rwxr-xr-xextensions/sdk.write (renamed from sdk.write)0
-rwxr-xr-xextensions/set-hostname.configure26
-rwxr-xr-xextensions/simple-network.configure292
-rwxr-xr-xextensions/ssh-rsync.check64
-rwxr-xr-xextensions/ssh-rsync.write172
-rw-r--r--extensions/ssh-rsync.write.help50
-rwxr-xr-xextensions/sshkeys.configure25
-rwxr-xr-xextensions/strip-gplv3.configure (renamed from strip-gplv3.configure)0
-rw-r--r--extensions/swift-build-rings.yml (renamed from swift-build-rings.yml)0
-rwxr-xr-xextensions/swift-storage-devices-validate.py (renamed from swift-storage-devices-validate.py)0
-rw-r--r--extensions/swift-storage.configure (renamed from swift-storage.configure)0
-rwxr-xr-xextensions/sysroot.check23
-rwxr-xr-xextensions/sysroot.write22
-rwxr-xr-xextensions/tar.check23
-rwxr-xr-xextensions/tar.write20
-rw-r--r--extensions/tar.write.help19
-rwxr-xr-xextensions/trove.configure (renamed from trove.configure)0
-rw-r--r--extensions/trove.configure.help (renamed from trove.configure.help)0
-rw-r--r--extensions/vagrant.configure (renamed from vagrant.configure)0
-rwxr-xr-xextensions/vdaboot.configure33
-rwxr-xr-xextensions/virtualbox-ssh.check36
-rwxr-xr-xextensions/virtualbox-ssh.write211
-rw-r--r--extensions/virtualbox-ssh.write.help135
-rw-r--r--install-files/chef/manifest (renamed from chef/manifest)0
-rwxr-xr-xinstall-files/distbuild/lib/systemd/system-generators/ccache-nfs-mount-generator (renamed from distbuild/lib/systemd/system-generators/ccache-nfs-mount-generator)0
-rw-r--r--install-files/distbuild/manifest (renamed from distbuild/manifest)0
-rw-r--r--install-files/distbuild/usr/lib/distbuild-setup/ansible/distbuild-setup.yml (renamed from distbuild/usr/lib/distbuild-setup/ansible/distbuild-setup.yml)0
-rw-r--r--install-files/distbuild/usr/lib/distbuild-setup/ansible/hosts (renamed from mason/ansible/hosts)0
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/distbuild-setup.service (renamed from distbuild/usr/lib/systemd/system/distbuild-setup.service)0
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/morph-cache-server.service (renamed from distbuild/usr/lib/systemd/system/morph-cache-server.service)0
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/morph-controller-helper.service (renamed from distbuild/usr/lib/systemd/system/morph-controller-helper.service)0
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/morph-controller.service (renamed from distbuild/usr/lib/systemd/system/morph-controller.service)0
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/morph-worker-helper.service (renamed from distbuild/usr/lib/systemd/system/morph-worker-helper.service)0
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/morph-worker.service (renamed from distbuild/usr/lib/systemd/system/morph-worker.service)0
l---------install-files/distbuild/usr/lib/systemd/system/multi-user.target.wants/distbuild-setup.service (renamed from distbuild/usr/lib/systemd/system/multi-user.target.wants/distbuild-setup.service)0
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph-cache-server.conf (renamed from distbuild/usr/share/distbuild-setup/morph-cache-server.conf)0
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph-controller-helper.conf (renamed from distbuild/usr/share/distbuild-setup/morph-controller-helper.conf)0
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph-controller.conf (renamed from distbuild/usr/share/distbuild-setup/morph-controller.conf)0
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph-worker-helper.conf (renamed from distbuild/usr/share/distbuild-setup/morph-worker-helper.conf)0
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph-worker.conf (renamed from distbuild/usr/share/distbuild-setup/morph-worker.conf)0
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph.conf (renamed from distbuild/usr/share/distbuild-setup/morph.conf)0
-rw-r--r--install-files/essential-files/etc/inputrc (renamed from essential-files/etc/inputrc)0
-rw-r--r--install-files/essential-files/etc/os-release (renamed from essential-files/etc/os-release)0
-rw-r--r--install-files/essential-files/etc/profile (renamed from essential-files/etc/profile)0
-rw-r--r--install-files/essential-files/manifest (renamed from essential-files/manifest)0
-rw-r--r--install-files/essential-files/usr/lib/tmpfiles.d/shutdownramfs.conf (renamed from essential-files/usr/lib/tmpfiles.d/shutdownramfs.conf)0
l---------install-files/genivi-devel-system-armv7/etc/morph.conf (renamed from genivi-devel-system-armv7/etc/morph.conf)0
-rw-r--r--install-files/genivi-devel-system-armv7/manifest (renamed from genivi-devel-system-armv7/manifest)0
-rw-r--r--install-files/genivi-devel-system-armv7/src/morph.conf (renamed from genivi-devel-system-armv7/src/morph.conf)0
-rw-r--r--install-files/moonshot/boot/m400-1003.dtb (renamed from moonshot/boot/m400-1003.dtb)bin18063 -> 18063 bytes
-rw-r--r--install-files/moonshot/manifest (renamed from moonshot/manifest)0
-rw-r--r--install-files/openstack/etc/horizon/apache-horizon.conf (renamed from openstack/etc/horizon/apache-horizon.conf)0
-rw-r--r--install-files/openstack/etc/horizon/openstack_dashboard/local_settings.py (renamed from openstack/etc/horizon/openstack_dashboard/local_settings.py)0
-rw-r--r--install-files/openstack/etc/tempest/tempest.conf (renamed from openstack/etc/tempest/tempest.conf)0
-rw-r--r--install-files/openstack/manifest (renamed from openstack/manifest)0
-rw-r--r--install-files/openstack/usr/lib/sysctl.d/neutron.conf (renamed from openstack/usr/lib/sysctl.d/neutron.conf)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/apache-httpd.service (renamed from openstack/usr/lib/systemd/system/apache-httpd.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/iscsi-setup.service (renamed from openstack/usr/lib/systemd/system/iscsi-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-evaluator.service (renamed from openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-evaluator.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-notifier.service (renamed from openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-notifier.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-api.service (renamed from openstack/usr/lib/systemd/system/openstack-ceilometer-api.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-central.service (renamed from openstack/usr/lib/systemd/system/openstack-ceilometer-central.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-collector.service (renamed from openstack/usr/lib/systemd/system/openstack-ceilometer-collector.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-compute.service (renamed from openstack/usr/lib/systemd/system/openstack-ceilometer-compute.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-config-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-ceilometer-config-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-db-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-ceilometer-db-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-notification.service (renamed from openstack/usr/lib/systemd/system/openstack-ceilometer-notification.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-api.service (renamed from openstack/usr/lib/systemd/system/openstack-cinder-api.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-backup.service (renamed from openstack/usr/lib/systemd/system/openstack-cinder-backup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-config-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-cinder-config-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-db-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-cinder-db-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-lv-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-cinder-lv-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-scheduler.service (renamed from openstack/usr/lib/systemd/system/openstack-cinder-scheduler.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-volume.service (renamed from openstack/usr/lib/systemd/system/openstack-cinder-volume.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-glance-api.service (renamed from openstack/usr/lib/systemd/system/openstack-glance-api.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-glance-registry.service (renamed from openstack/usr/lib/systemd/system/openstack-glance-registry.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-glance-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-glance-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-horizon-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-horizon-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ironic-api.service (renamed from openstack/usr/lib/systemd/system/openstack-ironic-api.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ironic-conductor.service (renamed from openstack/usr/lib/systemd/system/openstack-ironic-conductor.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ironic-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-ironic-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-keystone-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-keystone-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-keystone.service (renamed from openstack/usr/lib/systemd/system/openstack-keystone.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-network-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-network-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-config-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-neutron-config-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-db-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-neutron-db-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-dhcp-agent.service (renamed from openstack/usr/lib/systemd/system/openstack-neutron-dhcp-agent.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-l3-agent.service (renamed from openstack/usr/lib/systemd/system/openstack-neutron-l3-agent.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-metadata-agent.service (renamed from openstack/usr/lib/systemd/system/openstack-neutron-metadata-agent.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-ovs-cleanup.service (renamed from openstack/usr/lib/systemd/system/openstack-neutron-ovs-cleanup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-plugin-openvswitch-agent.service (renamed from openstack/usr/lib/systemd/system/openstack-neutron-plugin-openvswitch-agent.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-server.service (renamed from openstack/usr/lib/systemd/system/openstack-neutron-server.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-api.service (renamed from openstack/usr/lib/systemd/system/openstack-nova-api.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-cert.service (renamed from openstack/usr/lib/systemd/system/openstack-nova-cert.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-compute.service (renamed from openstack/usr/lib/systemd/system/openstack-nova-compute.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-conductor.service (renamed from openstack/usr/lib/systemd/system/openstack-nova-conductor.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-config-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-nova-config-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-consoleauth.service (renamed from openstack/usr/lib/systemd/system/openstack-nova-consoleauth.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-db-setup.service (renamed from openstack/usr/lib/systemd/system/openstack-nova-db-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-novncproxy.service (renamed from openstack/usr/lib/systemd/system/openstack-nova-novncproxy.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-scheduler.service (renamed from openstack/usr/lib/systemd/system/openstack-nova-scheduler.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-serialproxy.service (renamed from openstack/usr/lib/systemd/system/openstack-nova-serialproxy.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openvswitch-db-server.service (renamed from openstack/usr/lib/systemd/system/openvswitch-db-server.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openvswitch-setup.service (renamed from openstack/usr/lib/systemd/system/openvswitch-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openvswitch.service (renamed from openstack/usr/lib/systemd/system/openvswitch.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/postgres-server-setup.service (renamed from openstack/usr/lib/systemd/system/postgres-server-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/postgres-server.service (renamed from openstack/usr/lib/systemd/system/postgres-server.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/rabbitmq-server.service (renamed from openstack/usr/lib/systemd/system/rabbitmq-server.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/swift-controller-setup.service (renamed from openstack/usr/lib/systemd/system/swift-controller-setup.service)0
-rw-r--r--install-files/openstack/usr/lib/systemd/system/swift-proxy.service (renamed from openstack/usr/lib/systemd/system/swift-proxy.service)0
-rw-r--r--install-files/openstack/usr/share/openstack/ceilometer-config.yml (renamed from openstack/usr/share/openstack/ceilometer-config.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/ceilometer-db.yml (renamed from openstack/usr/share/openstack/ceilometer-db.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/ceilometer/ceilometer.conf (renamed from openstack/usr/share/openstack/ceilometer/ceilometer.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/cinder-config.yml (renamed from openstack/usr/share/openstack/cinder-config.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/cinder-db.yml (renamed from openstack/usr/share/openstack/cinder-db.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/cinder-lvs.yml (renamed from openstack/usr/share/openstack/cinder-lvs.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/cinder/api-paste.ini (renamed from openstack/usr/share/openstack/cinder/api-paste.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/cinder/cinder.conf (renamed from openstack/usr/share/openstack/cinder/cinder.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/cinder/policy.json (renamed from openstack/usr/share/openstack/cinder/policy.json)0
-rw-r--r--install-files/openstack/usr/share/openstack/extras/00-disable-device.network (renamed from openstack/usr/share/openstack/extras/00-disable-device.network)0
-rw-r--r--install-files/openstack/usr/share/openstack/extras/60-device-dhcp.network (renamed from openstack/usr/share/openstack/extras/60-device-dhcp.network)0
-rw-r--r--install-files/openstack/usr/share/openstack/glance.yml (renamed from openstack/usr/share/openstack/glance.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/glance/glance-api-paste.ini (renamed from openstack/usr/share/openstack/glance/glance-api-paste.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/glance/glance-api.conf (renamed from openstack/usr/share/openstack/glance/glance-api.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/glance/glance-cache.conf (renamed from openstack/usr/share/openstack/glance/glance-cache.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/glance/glance-registry-paste.ini (renamed from openstack/usr/share/openstack/glance/glance-registry-paste.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/glance/glance-registry.conf (renamed from openstack/usr/share/openstack/glance/glance-registry.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/glance/glance-scrubber.conf (renamed from openstack/usr/share/openstack/glance/glance-scrubber.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/glance/logging.conf (renamed from openstack/usr/share/openstack/glance/logging.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/glance/policy.json (renamed from openstack/usr/share/openstack/glance/policy.json)0
-rw-r--r--install-files/openstack/usr/share/openstack/glance/schema-image.json (renamed from openstack/usr/share/openstack/glance/schema-image.json)0
-rw-r--r--install-files/openstack/usr/share/openstack/horizon.yml (renamed from openstack/usr/share/openstack/horizon.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/hosts (renamed from openstack/usr/share/openstack/hosts)0
-rw-r--r--install-files/openstack/usr/share/openstack/ironic.yml (renamed from openstack/usr/share/openstack/ironic.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/ironic/ironic.conf (renamed from openstack/usr/share/openstack/ironic/ironic.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/ironic/policy.json (renamed from openstack/usr/share/openstack/ironic/policy.json)0
-rw-r--r--install-files/openstack/usr/share/openstack/iscsi.yml (renamed from openstack/usr/share/openstack/iscsi.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/keystone.yml (renamed from openstack/usr/share/openstack/keystone.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/keystone/keystone-paste.ini (renamed from openstack/usr/share/openstack/keystone/keystone-paste.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/keystone/keystone.conf (renamed from openstack/usr/share/openstack/keystone/keystone.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/keystone/logging.conf (renamed from openstack/usr/share/openstack/keystone/logging.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/keystone/policy.json (renamed from openstack/usr/share/openstack/keystone/policy.json)0
-rw-r--r--install-files/openstack/usr/share/openstack/network.yml (renamed from openstack/usr/share/openstack/network.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron-config.yml (renamed from openstack/usr/share/openstack/neutron-config.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron-db.yml (renamed from openstack/usr/share/openstack/neutron-db.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/api-paste.ini (renamed from openstack/usr/share/openstack/neutron/api-paste.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/dhcp_agent.ini (renamed from openstack/usr/share/openstack/neutron/dhcp_agent.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/fwaas_driver.ini (renamed from openstack/usr/share/openstack/neutron/fwaas_driver.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/l3_agent.ini (renamed from openstack/usr/share/openstack/neutron/l3_agent.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/lbaas_agent.ini (renamed from openstack/usr/share/openstack/neutron/lbaas_agent.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/metadata_agent.ini (renamed from openstack/usr/share/openstack/neutron/metadata_agent.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/metering_agent.ini (renamed from openstack/usr/share/openstack/neutron/metering_agent.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/neutron.conf (renamed from openstack/usr/share/openstack/neutron/neutron.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/bigswitch/restproxy.ini (renamed from openstack/usr/share/openstack/neutron/plugins/bigswitch/restproxy.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/ca_certs/README (renamed from openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/ca_certs/README)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/host_certs/README (renamed from openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/host_certs/README)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/brocade/brocade.ini (renamed from openstack/usr/share/openstack/neutron/plugins/brocade/brocade.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_cfg_agent.ini (renamed from openstack/usr/share/openstack/neutron/plugins/cisco/cisco_cfg_agent.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_plugins.ini (renamed from openstack/usr/share/openstack/neutron/plugins/cisco/cisco_plugins.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_router_plugin.ini (renamed from openstack/usr/share/openstack/neutron/plugins/cisco/cisco_router_plugin.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_vpn_agent.ini (renamed from openstack/usr/share/openstack/neutron/plugins/cisco/cisco_vpn_agent.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/embrane/heleos_conf.ini (renamed from openstack/usr/share/openstack/neutron/plugins/embrane/heleos_conf.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/hyperv/hyperv_neutron_plugin.ini (renamed from openstack/usr/share/openstack/neutron/plugins/hyperv/hyperv_neutron_plugin.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ibm/sdnve_neutron_plugin.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ibm/sdnve_neutron_plugin.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/linuxbridge/linuxbridge_conf.ini (renamed from openstack/usr/share/openstack/neutron/plugins/linuxbridge/linuxbridge_conf.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/metaplugin/metaplugin.ini (renamed from openstack/usr/share/openstack/neutron/plugins/metaplugin/metaplugin.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/midonet/midonet.ini (renamed from openstack/usr/share/openstack/neutron/plugins/midonet/midonet.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_arista.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_arista.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_brocade.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_brocade.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_cisco.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_cisco.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_fslsdn.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_fslsdn.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_mlnx.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_mlnx.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ncs.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ncs.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_odl.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_odl.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ofa.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ofa.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_sriov.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_sriov.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/mlnx/mlnx_conf.ini (renamed from openstack/usr/share/openstack/neutron/plugins/mlnx/mlnx_conf.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/nec/nec.ini (renamed from openstack/usr/share/openstack/neutron/plugins/nec/nec.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/nuage/nuage_plugin.ini (renamed from openstack/usr/share/openstack/neutron/plugins/nuage/nuage_plugin.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/oneconvergence/nvsdplugin.ini (renamed from openstack/usr/share/openstack/neutron/plugins/oneconvergence/nvsdplugin.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/opencontrail/contrailplugin.ini (renamed from openstack/usr/share/openstack/neutron/plugins/opencontrail/contrailplugin.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/openvswitch/ovs_neutron_plugin.ini (renamed from openstack/usr/share/openstack/neutron/plugins/openvswitch/ovs_neutron_plugin.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/plumgrid/plumgrid.ini (renamed from openstack/usr/share/openstack/neutron/plugins/plumgrid/plumgrid.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ryu/ryu.ini (renamed from openstack/usr/share/openstack/neutron/plugins/ryu/ryu.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/vmware/nsx.ini (renamed from openstack/usr/share/openstack/neutron/plugins/vmware/nsx.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/policy.json (renamed from openstack/usr/share/openstack/neutron/policy.json)0
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/vpn_agent.ini (renamed from openstack/usr/share/openstack/neutron/vpn_agent.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/nova-config.yml (renamed from openstack/usr/share/openstack/nova-config.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/nova-db.yml (renamed from openstack/usr/share/openstack/nova-db.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/nova/api-paste.ini (renamed from openstack/usr/share/openstack/nova/api-paste.ini)0
-rw-r--r--install-files/openstack/usr/share/openstack/nova/cells.json (renamed from openstack/usr/share/openstack/nova/cells.json)0
-rw-r--r--install-files/openstack/usr/share/openstack/nova/logging.conf (renamed from openstack/usr/share/openstack/nova/logging.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/nova/nova-compute.conf (renamed from openstack/usr/share/openstack/nova/nova-compute.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/nova/nova.conf (renamed from openstack/usr/share/openstack/nova/nova.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/nova/policy.json (renamed from openstack/usr/share/openstack/nova/policy.json)0
-rw-r--r--install-files/openstack/usr/share/openstack/openvswitch.yml (renamed from openstack/usr/share/openstack/openvswitch.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/postgres.yml (renamed from openstack/usr/share/openstack/postgres.yml)0
-rw-r--r--install-files/openstack/usr/share/openstack/postgres/pg_hba.conf (renamed from openstack/usr/share/openstack/postgres/pg_hba.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/postgres/postgresql.conf (renamed from openstack/usr/share/openstack/postgres/postgresql.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq-env.conf (renamed from openstack/usr/share/openstack/rabbitmq/rabbitmq-env.conf)0
-rw-r--r--install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq.config (renamed from openstack/usr/share/openstack/rabbitmq/rabbitmq.config)0
-rw-r--r--install-files/openstack/usr/share/openstack/swift-controller.yml (renamed from openstack/usr/share/openstack/swift-controller.yml)0
-rw-r--r--install-files/openstack/usr/share/swift/etc/rsyncd.j2 (renamed from openstack/usr/share/swift/etc/rsyncd.j2)0
-rw-r--r--install-files/openstack/usr/share/swift/etc/swift/proxy-server.j2 (renamed from openstack/usr/share/swift/etc/swift/proxy-server.j2)0
-rw-r--r--install-files/swift/etc/ntp.conf (renamed from swift/etc/ntp.conf)0
-rw-r--r--install-files/swift/manifest (renamed from swift/manifest)0
-rw-r--r--install-files/swift/usr/lib/systemd/system/rsync.service (renamed from swift/usr/lib/systemd/system/rsync.service)0
-rw-r--r--install-files/swift/usr/lib/systemd/system/swift-storage-setup.service (renamed from swift/usr/lib/systemd/system/swift-storage-setup.service)0
-rw-r--r--install-files/swift/usr/lib/systemd/system/swift-storage.service (renamed from swift/usr/lib/systemd/system/swift-storage.service)0
-rw-r--r--install-files/swift/usr/share/swift/etc/rsyncd.j2 (renamed from swift/usr/share/swift/etc/rsyncd.j2)0
-rw-r--r--install-files/swift/usr/share/swift/etc/swift/account-server.j2 (renamed from swift/usr/share/swift/etc/swift/account-server.j2)0
-rw-r--r--install-files/swift/usr/share/swift/etc/swift/container-server.j2 (renamed from swift/usr/share/swift/etc/swift/container-server.j2)0
-rw-r--r--install-files/swift/usr/share/swift/etc/swift/object-server.j2 (renamed from swift/usr/share/swift/etc/swift/object-server.j2)0
-rw-r--r--install-files/swift/usr/share/swift/etc/swift/swift.j2 (renamed from swift/usr/share/swift/etc/swift/swift.j2)0
-rw-r--r--install-files/swift/usr/share/swift/hosts (renamed from swift/usr/share/swift/hosts)0
-rw-r--r--install-files/swift/usr/share/swift/swift-storage.yml (renamed from swift/usr/share/swift/swift-storage.yml)0
-rw-r--r--install-files/vagrant-files/home/vagrant/.ssh/authorized_keys (renamed from vagrant-files/home/vagrant/.ssh/authorized_keys)0
-rw-r--r--install-files/vagrant-files/manifest (renamed from vagrant-files/manifest)0
-rw-r--r--systems/armv7lhf-cross-toolchain-system-x86_32.morph12
-rw-r--r--systems/armv7lhf-cross-toolchain-system-x86_64.morph12
-rw-r--r--systems/base-system-armv7-highbank.morph10
-rw-r--r--systems/base-system-armv7-versatile.morph10
-rw-r--r--systems/base-system-armv7b-highbank.morph10
-rw-r--r--systems/base-system-armv7b-vexpress-tc2.morph10
-rw-r--r--systems/base-system-armv7lhf-highbank.morph10
-rw-r--r--systems/base-system-armv8b64.morph12
-rw-r--r--systems/base-system-armv8l64.morph12
-rw-r--r--systems/base-system-ppc64-generic.morph10
-rw-r--r--systems/base-system-x86_32-generic.morph10
-rw-r--r--systems/base-system-x86_64-generic.morph10
-rw-r--r--systems/build-system-armv5l-openbmc-aspeed.morph12
-rw-r--r--systems/build-system-armv7lhf-highbank.morph18
-rw-r--r--systems/build-system-armv7lhf-jetson.morph18
-rw-r--r--systems/build-system-armv8b64.morph20
-rw-r--r--systems/build-system-armv8l64.morph20
-rw-r--r--systems/build-system-ppc64.morph18
-rw-r--r--systems/build-system-x86_32-chroot.morph18
-rw-r--r--systems/build-system-x86_32.morph18
-rw-r--r--systems/build-system-x86_64-chroot.morph18
-rw-r--r--systems/build-system-x86_64.morph18
-rw-r--r--systems/ceph-service-x86_64-generic.morph14
-rw-r--r--systems/chef-system-x86_64-container.morph (renamed from chef-system-x86_64-container.morph)12
-rw-r--r--systems/cxmanage-system-x86_64-generic.morph12
-rw-r--r--systems/devel-system-armv7-chroot.morph12
-rw-r--r--systems/devel-system-armv7-highbank.morph12
-rw-r--r--systems/devel-system-armv7-versatile.morph12
-rw-r--r--systems/devel-system-armv7-wandboard.morph12
-rw-r--r--systems/devel-system-armv7b-chroot.morph12
-rw-r--r--systems/devel-system-armv7b-highbank.morph12
-rw-r--r--systems/devel-system-armv7lhf-chroot.morph12
-rw-r--r--systems/devel-system-armv7lhf-highbank.morph12
-rw-r--r--systems/devel-system-armv7lhf-jetson.morph12
-rw-r--r--systems/devel-system-armv7lhf-wandboard.morph12
-rw-r--r--systems/devel-system-armv8b64.morph16
-rw-r--r--systems/devel-system-armv8l64.morph18
-rw-r--r--systems/devel-system-ppc64-chroot.morph12
-rw-r--r--systems/devel-system-ppc64-generic.morph12
-rw-r--r--systems/devel-system-x86_32-chroot.morph12
-rw-r--r--systems/devel-system-x86_32-generic.morph14
-rw-r--r--systems/devel-system-x86_64-chroot.morph12
-rw-r--r--systems/devel-system-x86_64-generic.morph16
-rw-r--r--systems/devel-system-x86_64-vagrant.morph14
-rw-r--r--systems/genivi-baseline-system-armv7lhf-jetson.morph14
-rw-r--r--systems/genivi-baseline-system-armv7lhf-versatile.morph14
-rw-r--r--systems/genivi-baseline-system-x86_64-generic.morph12
-rw-r--r--systems/installer-system-armv8b64.morph12
-rw-r--r--systems/installer-system-x86_64.morph10
-rw-r--r--systems/minimal-system-armv5l-openbmc-aspeed.morph12
-rw-r--r--systems/minimal-system-x86_32-generic.morph12
-rw-r--r--systems/minimal-system-x86_64-generic.morph12
-rw-r--r--systems/nodejs-system-x86_64.morph10
-rw-r--r--systems/ocaml-system-x86_64.morph8
-rw-r--r--systems/openstack-system-x86_64.morph34
-rw-r--r--systems/qt4-devel-system-x86_64-generic.morph10
-rw-r--r--systems/qt5-devel-system-x86_64-generic.morph10
-rw-r--r--systems/swift-system-x86_64.morph16
-rw-r--r--systems/trove-system-x86_64.morph14
-rw-r--r--systems/web-system-x86_64-generic.morph10
-rw-r--r--systems/weston-system-armv7lhf-jetson.morph10
-rw-r--r--systems/weston-system-x86_64-generic.morph10
-rw-r--r--systems/xfce-system.morph10
-rw-r--r--systems/zookeeper-client-x86_64.morph12
-rw-r--r--systems/zookeeper-server-x86_64.morph12
376 files changed, 3814 insertions, 512 deletions
diff --git a/clusters/cephclient.morph b/clusters/cephclient.morph
index b4db22e0..2585fbdf 100644
--- a/clusters/cephclient.morph
+++ b/clusters/cephclient.morph
@@ -4,7 +4,7 @@ systems:
- morph: systems/ceph-service-x86_64-generic.morph
deploy:
ceph-node-virtualbox-image:
- type: virtualbox-ssh
+ type: extensions/virtualbox-ssh
SYSTEM: systems/ceph-service-x86_64-generic.morph
location: vbox+ssh://user@machine/ChefNode4/home/user/chefnode4.vdi
# HOST_IPADDR and NETMASK should be set to the IP address and netmask of the virtualbox host on the host-only interface.
@@ -17,4 +17,4 @@ systems:
HOSTNAME: CephNode4
# You must install authorized_keys in chef/root/.ssh/ before this will work.
- INSTALL_FILES: chef/manifest
+ INSTALL_FILES: install-files/chef/manifest
diff --git a/clusters/ci.morph b/clusters/ci.morph
index cb56328c..69b7c76a 100644
--- a/clusters/ci.morph
+++ b/clusters/ci.morph
@@ -9,19 +9,19 @@ systems:
- morph: systems/devel-system-x86_64-generic.morph
deploy:
devel-system-x86_64-generic:
- type: rawdisk
+ type: extensions/rawdisk
location: devel-system-x86_64-generic.img
DISK_SIZE: 4G
- morph: systems/devel-system-x86_32-generic.morph
deploy:
devel-system-x86_32-generic:
- type: rawdisk
+ type: extensions/rawdisk
location: devel-system-x86_32-generic.img
DISK_SIZE: 4G
- morph: systems/build-system-armv7lhf-jetson.morph
deploy:
build-system-armv7lhf-jetson:
- type: rawdisk
+ type: extensions/rawdisk
location: build-system-armv7lhf-jetson.img
DISK_SIZE: 2G
BOOT_DEVICE: "/dev/mmcblk0p1"
@@ -33,14 +33,14 @@ systems:
- morph: systems/weston-system-x86_64-generic.morph
deploy:
weston-system-x86_64-generic:
- type: rawdisk
+ type: extensions/rawdisk
location: weston-system-x86_64-generic.img
DISK_SIZE: 4G
KERNEL_ARGS: vga=788
- morph: systems/weston-system-armv7lhf-jetson.morph
deploy:
weston-system-armv7lhf-jetson:
- type: rawdisk
+ type: extensions/rawdisk
location: weston-system-armv7lhf-jetson.img
DISK_SIZE: 4G
BOOT_DEVICE: "/dev/mmcblk0p1"
@@ -52,14 +52,14 @@ systems:
- morph: systems/genivi-baseline-system-x86_64-generic.morph
deploy:
genivi-baseline-system-x86_64-generic:
- type: rawdisk
+ type: extensions/rawdisk
location: genivi-baseline-system-x86_64-generic.img
DISK_SIZE: 4G
KERNEL_ARGS: vga=788
- morph: systems/genivi-baseline-system-armv7lhf-jetson.morph
deploy:
genivi-baseline-system-armv7lhf-jetson:
- type: rawdisk
+ type: extensions/rawdisk
location: genivi-baseline-system-armv7lhf-jetson.img
DISK_SIZE: 4G
BOOT_DEVICE: "/dev/mmcblk0p1"
@@ -71,10 +71,10 @@ systems:
- morph: systems/openstack-system-x86_64.morph
deploy:
openstack-system-x86_64:
- type: rawdisk
+ type: extensions/rawdisk
location: baserock-openstack-system-x86_64.img
DISK_SIZE: 5G
- INSTALL_FILES: openstack/manifest
+ INSTALL_FILES: install-files/openstack/manifest
HOSTNAME: onenode
RABBITMQ_HOST: onenode
RABBITMQ_PORT: 5672
diff --git a/clusters/example-distbuild-cluster.morph b/clusters/example-distbuild-cluster.morph
index 513c16c5..5208a5ca 100644
--- a/clusters/example-distbuild-cluster.morph
+++ b/clusters/example-distbuild-cluster.morph
@@ -16,22 +16,22 @@ systems:
DISTBUILD_CONTROLLER: false
DISTBUILD_WORKER: true
FSTAB_SRC: LABEL=src /srv/distbuild auto defaults,rw,noatime 0 2
- INSTALL_FILES: distbuild/manifest
+ INSTALL_FILES: install-files/distbuild/manifest
NFSBOOT_CONFIGURE: true
TROVE_ID: $MY_TROVE
WORKER_SSH_KEY: ssh-keys/worker.key
deploy:
build-controller:
- type: nfsboot
+ type: extensions/nfsboot
location: $MY_TROVE
DISTBUILD_CONTROLLER: true
HOSTNAME: build-controller
WORKERS: build-node-1, build-node-2
build-node-1:
- type: nfsboot
+ type: extensions/nfsboot
location: $MY_TROVE
HOSTNAME: build-node-1
build-node-2:
- type: nfsboot
+ type: extensions/nfsboot
location: $MY_TROVE
HOSTNAME: build-node-2
diff --git a/clusters/example-swift-storage-cluster.morph b/clusters/example-swift-storage-cluster.morph
index b1ea784f..e5e7b6ab 100644
--- a/clusters/example-swift-storage-cluster.morph
+++ b/clusters/example-swift-storage-cluster.morph
@@ -3,7 +3,7 @@ kind: cluster
systems:
- morph: systems/swift-system-x86_64.morph
deploy-defaults:
- INSTALL_FILES: swift/manifest
+ INSTALL_FILES: install-files/swift/manifest
CONTROLLER_HOST_ADDRESS: <controller host address>
@@ -39,7 +39,7 @@ systems:
deploy:
node0:
- type: kvm
+ type: extensions/kvm
location: kvm+ssh://user@host/swift-storage-0/home/user/swift-storage-0.img
DISK_SIZE: 10G
RAM_SIZE: 1G
@@ -50,7 +50,7 @@ systems:
MANAGEMENT_INTERFACE_IP_ADDRESS: <node0 management ip>
ATTACH_DISKS: /dev/node0_sdb:/dev/node0_sdc:/dev/node0_sdd
node1:
- type: kvm
+ type: extensions/kvm
location: kvm+ssh://user@host/swift-storage-1/home/user/swift-storage-1.img
DISK_SIZE: 10G
RAM_SIZE: 1G
diff --git a/clusters/hardware-deployment.morph b/clusters/hardware-deployment.morph
index c6b7dce9..674d6587 100644
--- a/clusters/hardware-deployment.morph
+++ b/clusters/hardware-deployment.morph
@@ -8,7 +8,7 @@ systems:
- morph: systems/installer-system-x86_64.morph
deploy:
installer:
- type: pxeboot
+ type: extensions/pxeboot
location: AB:CD:EF:12:34:56:78 #MAC address.
PXEBOOT_MODE: spawn-novlan
PXEBOOT_DEPLOYER_INTERFACE: ens6
@@ -23,7 +23,7 @@ systems:
- morph: systems/build-system-x86_64.morph
deploy:
to-install:
- type: sysroot
+ type: extensions/sysroot
location: /rootfs
INITRAMFS_PATH: boot/initramfs.gz
KERNEL_ARGS: console=ttyS1,9600 console=tty0
@@ -31,5 +31,5 @@ systems:
- morph: systems/initramfs-x86_64.morph
deploy:
initramfs:
- type: initramfs
+ type: extensions/initramfs
location: boot/initramfs.gz
diff --git a/clusters/image-package-example.morph b/clusters/image-package-example.morph
index fd8487e2..ca79ec97 100644
--- a/clusters/image-package-example.morph
+++ b/clusters/image-package-example.morph
@@ -6,7 +6,7 @@ systems:
- morph: systems/base-system-x86_32-generic.morph
deploy:
imgpkg:
- type: image-package
+ type: extensions/image-package
location: image-package-example.tar
BOOTLOADER_BLOBS: /usr/share/syslinux/mbr.bin
- INCLUDE_SCRIPTS: image-package-example/make-disk-image.sh.in:image-package-example/disk-install.sh.in:image-package-example/common.sh.in
+ INCLUDE_SCRIPTS: extensions/image-package-example/make-disk-image.sh.in:extensions/image-package-example/disk-install.sh.in:extensions/image-package-example/common.sh.in
diff --git a/clusters/initramfs-test.morph b/clusters/initramfs-test.morph
index afc94961..dd7d91e1 100644
--- a/clusters/initramfs-test.morph
+++ b/clusters/initramfs-test.morph
@@ -4,7 +4,7 @@ systems:
- morph: systems/base-system-x86_64-generic.morph
deploy:
system:
- type: rawdisk
+ type: extensions/rawdisk
location: initramfs-system-x86_64.img
DISK_SIZE: 1G
HOSTNAME: initramfs-system
@@ -13,5 +13,5 @@ systems:
- morph: systems/initramfs-x86_64.morph
deploy:
initramfs:
- type: initramfs
+ type: extensions/initramfs
location: boot/initramfs.gz
diff --git a/clusters/installer-build-system-x86_64.morph b/clusters/installer-build-system-x86_64.morph
index a9ebcaca..d9a2a28b 100644
--- a/clusters/installer-build-system-x86_64.morph
+++ b/clusters/installer-build-system-x86_64.morph
@@ -24,7 +24,7 @@ systems:
- morph: systems/installer-system-x86_64.morph
deploy:
installer:
- type: rawdisk
+ type: extensions/rawdisk
location: installer-build-system-x86_64.img
KERNEL_ARGS: init=/usr/lib/baserock-installer/installer
DISK_SIZE: 6G
@@ -36,17 +36,17 @@ systems:
- morph: systems/initramfs-x86_64.morph
deploy:
installer-initramfs:
- type: initramfs
+ type: extensions/initramfs
location: boot/initramfs.gz
- morph: systems/build-system-x86_64.morph
deploy:
to-install:
- type: sysroot
+ type: extensions/sysroot
location: /rootfs
INITRAMFS_PATH: boot/initramfs.gz
subsystems:
- morph: systems/initramfs-x86_64.morph
deploy:
to-install-initramfs:
- type: initramfs
+ type: extensions/initramfs
location: boot/initramfs.gz
diff --git a/clusters/jetson-upgrade.morph b/clusters/jetson-upgrade.morph
index 9fd5155b..e6ec97e0 100644
--- a/clusters/jetson-upgrade.morph
+++ b/clusters/jetson-upgrade.morph
@@ -14,5 +14,5 @@ systems:
FSTAB_SRC: LABEL=src /src auto defaults,rw,noatime,nofail 0 2
deploy:
self:
- type: ssh-rsync
+ type: extensions/ssh-rsync
location: root@127.0.0.1
diff --git a/clusters/mason-openstack.morph b/clusters/mason-openstack.morph
index 6ef14888..935e2496 100644
--- a/clusters/mason-openstack.morph
+++ b/clusters/mason-openstack.morph
@@ -10,7 +10,7 @@ systems:
CONTROLLERHOST: controller-hostname
DISTBUILD_CONTROLLER: true
DISTBUILD_WORKER: true
- INSTALL_FILES: distbuild/manifest
+ INSTALL_FILES: install-files/distbuild/manifest
RAM_SIZE: 8G
TROVE_HOST: your-upstream-trove
TROVE_ID: your-upstream-trove-prefix
@@ -18,7 +18,7 @@ systems:
WORKER_SSH_KEY: ssh-keys/worker.key
deploy:
mason-openstack:
- type: openstack
+ type: extensions/openstack
location: openstack-auth-url (eg example.com:5000/v2.0)
DISK_SIZE: 6G
DISTBUILD_CONTROLLER: true
diff --git a/clusters/mason.morph b/clusters/mason.morph
index 9717239d..376cf337 100644
--- a/clusters/mason.morph
+++ b/clusters/mason.morph
@@ -11,7 +11,7 @@ systems:
- morph: systems/trove-system-x86_64.morph
deploy:
red-box-v1-trove:
- type: kvm
+ type: extensions/kvm
location: kvm+ssh://vm-user@vm-host/red-box-v1-trove/vm-path/red-box-v1-trove.img
AUTOSTART: true
DISK_SIZE: 20G
@@ -36,7 +36,7 @@ systems:
CONTROLLERHOST: red-box-v1-controller.example.com
DISTBUILD_CONTROLLER: false
DISTBUILD_WORKER: true
- INSTALL_FILES: distbuild/manifest
+ INSTALL_FILES: install-files/distbuild/manifest
RAM_SIZE: 8G
TROVE_HOST: upstream-trove
TROVE_ID: upstream-trove
@@ -44,7 +44,7 @@ systems:
WORKER_SSH_KEY: ssh_keys/worker.key
deploy:
red-box-v1-controller:
- type: kvm
+ type: extensions/kvm
location: kvm+ssh://vm-user@vm-host/red-box-v1-controller/vm-path/red-box-v1-controller.img
DISK_SIZE: 60G
DISTBUILD_CONTROLLER: true
diff --git a/clusters/minimal-system-armv5l-openbmc-aspeed-deploy.morph b/clusters/minimal-system-armv5l-openbmc-aspeed-deploy.morph
index eea600cf..9647e7a7 100644
--- a/clusters/minimal-system-armv5l-openbmc-aspeed-deploy.morph
+++ b/clusters/minimal-system-armv5l-openbmc-aspeed-deploy.morph
@@ -4,7 +4,7 @@ systems:
- morph: systems/minimal-system-armv5l-openbmc-aspeed.morph
deploy:
minimal-system-armv5l-openbmc-aspeed:
- type: jffs2
+ type: extensions/jffs2
location: minimal-system-armv5l-openbmc-aspeed.img
ROOT_DEVICE: "/dev/mtdblock"
BOOTLOADER_CONFIG_FORMAT: "extlinux"
diff --git a/clusters/minimal-system-deploy.morph b/clusters/minimal-system-deploy.morph
index 06629ffc..cf8de54f 100644
--- a/clusters/minimal-system-deploy.morph
+++ b/clusters/minimal-system-deploy.morph
@@ -6,7 +6,7 @@ systems:
- morph: systems/minimal-system-x86_32-generic.morph
deploy:
vm:
- type: kvm
+ type: extensions/kvm
location: kvm+ssh://192.168.122.1/tiny-x86_32/srv/VMs/tiny-x86_32.img
DISK_SIZE: 512M
HOSTNAME: tiny-x86_32
diff --git a/clusters/moonshot-m2-armv8b64.morph b/clusters/moonshot-m2-armv8b64.morph
index c8e5bc81..c6d62ca2 100644
--- a/clusters/moonshot-m2-armv8b64.morph
+++ b/clusters/moonshot-m2-armv8b64.morph
@@ -8,7 +8,7 @@ systems:
- morph: systems/installer-system-armv8b64.morph
deploy:
installer:
- type: pxeboot
+ type: extensions/pxeboot
location: 14:58:d0:57:7f:42
PXEBOOT_MODE: existing-server
PXEBOOT_CONFIG_TFTP_ADDRESS: sftp://192.168.0.1/srv/nfsboot/tftp/
@@ -38,17 +38,17 @@ systems:
HOSTNAME: installer-system-c31n1
DTB_PATH: boot/m400-1003.dtb
KERNEL_ARGS: console=ttyS0,9600n8r init=/usr/lib/baserock-installer/installer
- INSTALL_FILES: moonshot/manifest
+ INSTALL_FILES: install-files/moonshot/manifest
MOONSHOT_KERNEL: yes
subsystems:
- morph: systems/devel-system-armv8b64.morph
deploy:
to-install:
- type: sysroot
+ type: extensions/sysroot
location: /rootfs
HOSTNAME: baserock-c31n1
DTB_PATH: boot/m400-1003.dtb
- INSTALL_FILES: moonshot/manifest
+ INSTALL_FILES: install-files/moonshot/manifest
MOONSHOT_KERNEL: yes
BOOT_DEVICE: /dev/sda1
ROOT_DEVICE: /dev/sda2
diff --git a/clusters/moonshot-pxe-armv8b64.morph b/clusters/moonshot-pxe-armv8b64.morph
index 2d32efb0..ffee0392 100644
--- a/clusters/moonshot-pxe-armv8b64.morph
+++ b/clusters/moonshot-pxe-armv8b64.morph
@@ -9,7 +9,7 @@ systems:
- morph: systems/devel-system-armv8b64.morph
deploy:
netboot:
- type: pxeboot
+ type: extensions/pxeboot
location: 14:58:d0:57:7f:42
PXEBOOT_MODE: existing-server
PXEBOOT_CONFIG_TFTP_ADDRESS: sftp://192.168.0.1/srv/nfsboot/tftp/
@@ -26,5 +26,5 @@ systems:
HOSTNAME: baserock-c31n1
DTB_PATH: boot/m400-1003.dtb
KERNEL_ARGS: console=ttyS0,9600n8r rw
- INSTALL_FILES: moonshot/manifest
+ INSTALL_FILES: install-files/moonshot/manifest
MOONSHOT_KERNEL: yes
diff --git a/clusters/moonshot-pxe-armv8l64.morph b/clusters/moonshot-pxe-armv8l64.morph
index 3286c72e..62ee92a2 100644
--- a/clusters/moonshot-pxe-armv8l64.morph
+++ b/clusters/moonshot-pxe-armv8l64.morph
@@ -9,7 +9,7 @@ systems:
- morph: systems/devel-system-armv8l64.morph
deploy:
netboot:
- type: pxeboot
+ type: extensions/pxeboot
location: 14:58:d0:57:7f:42
PXEBOOT_MODE: existing-server
PXEBOOT_CONFIG_TFTP_ADDRESS: sftp://192.168.0.1/srv/nfsboot/tftp/
@@ -18,5 +18,5 @@ systems:
DTB_PATH: boot/m400-1003.dtb
HOSTNAME: baserock-m400-node31
MOONSHOT_KERNEL: yes
- INSTALL_FILES: moonshot/manifest
+ INSTALL_FILES: install-files/moonshot/manifest
PXE_INSTALLER: no
diff --git a/clusters/openstack-one-node-swift.morph b/clusters/openstack-one-node-swift.morph
index 588b6e81..de7066d6 100644
--- a/clusters/openstack-one-node-swift.morph
+++ b/clusters/openstack-one-node-swift.morph
@@ -40,10 +40,10 @@ systems:
- morph: systems/openstack-system-x86_64.morph
deploy:
release:
- type: rawdisk
+ type: extensions/rawdisk
location: baserock-openstack-system-x86_64.img
DISK_SIZE: 10G
- INSTALL_FILES: openstack/manifest swift/manifest
+ INSTALL_FILES: install-files/openstack/manifest install-files/swift/manifest
HOSTNAME: onenode
diff --git a/clusters/openstack-one-node.morph b/clusters/openstack-one-node.morph
index 037cd23c..ab12f9b3 100644
--- a/clusters/openstack-one-node.morph
+++ b/clusters/openstack-one-node.morph
@@ -40,10 +40,10 @@ systems:
- morph: systems/openstack-system-x86_64.morph
deploy:
release:
- type: rawdisk
+ type: extensions/rawdisk
location: baserock-openstack-system-x86_64.img
DISK_SIZE: 10G
- INSTALL_FILES: openstack/manifest
+ INSTALL_FILES: install-files/openstack/manifest
HOSTNAME: onenode
diff --git a/clusters/openstack-three-node-installer.morph b/clusters/openstack-three-node-installer.morph
index 6285217a..a316a56c 100644
--- a/clusters/openstack-three-node-installer.morph
+++ b/clusters/openstack-three-node-installer.morph
@@ -59,7 +59,7 @@ systems:
- morph: systems/installer-system-x86_64.morph
deploy:
network-installer: &installer
- type: rawdisk
+ type: extensions/rawdisk
location: installer-openstack-network-x86_64.img
KERNEL_ARGS: init=/usr/lib/baserock-installer/installer
DISK_SIZE: 6G
@@ -72,14 +72,14 @@ systems:
- morph: systems/initramfs-x86_64.morph
deploy:
network-initramfs: &initramfs
- type: initramfs
+ type: extensions/initramfs
location: boot/initramfs.gz
- morph: systems/openstack-system-x86_64.morph
deploy:
network-to-install: &stack-node
- type: sysroot
+ type: extensions/sysroot
location: rootfs
- INSTALL_FILES: openstack/manifest
+ INSTALL_FILES: install-files/openstack/manifest
INITRAMFS_PATH: boot/initramfs.gz
HOSTNAME: threenode-network
diff --git a/clusters/openstack-two-node-installer.morph b/clusters/openstack-two-node-installer.morph
index f05b0e9b..d4f94cfb 100644
--- a/clusters/openstack-two-node-installer.morph
+++ b/clusters/openstack-two-node-installer.morph
@@ -58,7 +58,7 @@ systems:
- morph: systems/installer-system-x86_64.morph
deploy:
controller-installer: &installer
- type: rawdisk
+ type: extensions/rawdisk
location: installer-openstack-controller-x86_64.img
KERNEL_ARGS: init=/usr/lib/baserock-installer/installer
DISK_SIZE: 6G
@@ -71,14 +71,14 @@ systems:
- morph: systems/initramfs-x86_64.morph
deploy:
controller-initramfs: &initramfs
- type: initramfs
+ type: extensions/initramfs
location: boot/initramfs.gz
- morph: systems/openstack-system-x86_64.morph
deploy:
controller-to-install: &stack-node
- type: sysroot
+ type: extensions/sysroot
location: rootfs
- INSTALL_FILES: openstack/manifest
+ INSTALL_FILES: install-files/openstack/manifest
INITRAMFS_PATH: boot/initramfs.gz
HOSTNAME: twonode-controller
diff --git a/clusters/release.morph b/clusters/release.morph
index c5bfffca..1574bde6 100644
--- a/clusters/release.morph
+++ b/clusters/release.morph
@@ -10,23 +10,23 @@ systems:
- morph: systems/build-system-x86_32-chroot.morph
deploy:
build-system-x86_32-chroot:
- type: tar
+ type: extensions/tar
location: build-system-x86_32-chroot.tar
- morph: systems/build-system-x86_32.morph
deploy:
build-system-x86_32:
- type: rawdisk
+ type: extensions/rawdisk
location: build-system-x86_32.img
DISK_SIZE: 6G
- morph: systems/build-system-x86_64-chroot.morph
deploy:
build-system-x86_64-chroot:
- type: tar
+ type: extensions/tar
location: build-system-x86_64-chroot.tar
- morph: systems/build-system-x86_64.morph
deploy:
build-system-x86_64:
- type: rawdisk
+ type: extensions/rawdisk
location: build-system-x86_64.img
DISK_SIZE: 6G
INITRAMFS_PATH: boot/initramfs.gz
@@ -34,12 +34,12 @@ systems:
- morph: systems/initramfs-x86_64.morph
deploy:
initramfs-build-system-x86_64:
- type: initramfs
+ type: extensions/initramfs
location: boot/initramfs.gz
- morph: systems/build-system-armv7lhf-jetson.morph
deploy:
build-system-armv7lhf-jetson:
- type: rawdisk
+ type: extensions/rawdisk
location: build-system-armv7lhf-jetson.img
DISK_SIZE: 2G
BOOT_DEVICE: "/dev/mmcblk0p1"
@@ -51,7 +51,7 @@ systems:
- morph: systems/genivi-baseline-system-x86_64-generic.morph
deploy:
genivi-baseline-system-x86_64-generic:
- type: rawdisk
+ type: extensions/rawdisk
location: genivi-baseline-system-x86_64-generic.img
DISK_SIZE: 4G
KERNEL_ARGS: vga=788
@@ -60,12 +60,12 @@ systems:
- morph: systems/initramfs-x86_64.morph
deploy:
initramfs-genivi-baseline-system-x86_64-generic:
- type: initramfs
+ type: extensions/initramfs
location: boot/initramfs.gz
- morph: systems/genivi-baseline-system-armv7lhf-jetson.morph
deploy:
genivi-baseline-system-armv7lhf-jetson:
- type: rawdisk
+ type: extensions/rawdisk
location: genivi-baseline-system-armv7lhf-jetson.img
DISK_SIZE: 4G
BOOT_DEVICE: "/dev/mmcblk0p1"
diff --git a/clusters/sdk-example-cluster.morph b/clusters/sdk-example-cluster.morph
index 92e4a413..a4413c3b 100644
--- a/clusters/sdk-example-cluster.morph
+++ b/clusters/sdk-example-cluster.morph
@@ -34,7 +34,7 @@ systems:
- morph: systems/armv7lhf-cross-toolchain-system-x86_64.morph
deploy:
sdk:
- type: sdk
+ type: extensions/sdk
location: armv7lhf-cross-toolchain-system-x86_64.sh
PREFIX: /usr
TARGET: armv7lhf-baserock-linux-gnueabi
@@ -42,5 +42,5 @@ systems:
- morph: systems/devel-system-armv7lhf-highbank.morph
deploy:
sysroot:
- type: sysroot
+ type: extensions/sysroot
location: usr/armv7lhf-baserock-linux-gnueabi/sys-root
diff --git a/clusters/trove-example.morph b/clusters/trove-example.morph
index 2812f60e..81b1c901 100644
--- a/clusters/trove-example.morph
+++ b/clusters/trove-example.morph
@@ -50,9 +50,9 @@ systems:
UPSTREAM_TROVE: ''
deploy:
initial:
- type: kvm
+ type: extensions/kvm
location: kvm+ssh://vm-user@vm-host/test-trove/vm-path/test-trove.img
VERSION_LABEL: 1
upgrade:
- type: ssh-rsync
+ type: extensions/ssh-rsync
location: test-trove
diff --git a/clusters/trove.baserock.org-upgrade.morph b/clusters/trove.baserock.org-upgrade.morph
index eaf939e1..e66fd6bc 100644
--- a/clusters/trove.baserock.org-upgrade.morph
+++ b/clusters/trove.baserock.org-upgrade.morph
@@ -13,7 +13,7 @@ systems:
- morph: systems/trove-system-x86_64.morph
deploy:
gbo:
- type: ssh-rsync
+ type: extensions/ssh-rsync
location: root@git.baserock.org
FSTAB_HOME: LABEL=homes /home auto defaults,noatime,rw 0 2
HOSTNAME: firehose1
diff --git a/clusters/upgrade-devel.morph b/clusters/upgrade-devel.morph
index b7ce9bc0..3efbb36a 100644
--- a/clusters/upgrade-devel.morph
+++ b/clusters/upgrade-devel.morph
@@ -35,5 +35,5 @@ systems:
- morph: systems/devel-system-x86_64-generic.morph
deploy:
self:
- type: ssh-rsync
+ type: extensions/ssh-rsync
location: root@127.0.0.1
diff --git a/clusters/weston-system-x86_64-generic-deploy.morph b/clusters/weston-system-x86_64-generic-deploy.morph
index 3a6f29ef..65e35bd7 100644
--- a/clusters/weston-system-x86_64-generic-deploy.morph
+++ b/clusters/weston-system-x86_64-generic-deploy.morph
@@ -10,7 +10,7 @@ systems:
- morph: systems/weston-system-x86_64-generic.morph
deploy:
weston-system-x86_64-generic:
- type: rawdisk
+ type: extensions/rawdisk
location: /weston-system-x86_64-generic.img
DISK_SIZE: 4G
KERNEL_ARGS: vga=788
@@ -19,5 +19,5 @@ systems:
- morph: systems/initramfs-x86_64.morph
deploy:
initramfs:
- type: initramfs
+ type: extensions/initramfs
location: boot/initramfs.gz
diff --git a/clusters/zookeeper.morph b/clusters/zookeeper.morph
index 1153d4b0..cca6db81 100644
--- a/clusters/zookeeper.morph
+++ b/clusters/zookeeper.morph
@@ -4,7 +4,7 @@ systems:
- morph: systems/zookeeper-client-x86_64.morph
deploy:
my-client-system:
- type: kvm
+ type: extensions/kvm
location: kvm+ssh://username@HOSTNAME/machinename/path/to/zookeeper-client.img
DISK_SIZE: 4G
RAM_SIZE: 1G
@@ -13,7 +13,7 @@ systems:
- morph: systems/zookeeper-server-x86_64.morph
deploy:
my-server-system:
- type: kvm
+ type: extensions/kvm
location: kvm+ssh://username@HOSTNAME/machinename/path/to/zookeeper-server.img
DISK_SIZE: 4G
RAM_SIZE: 1G
diff --git a/extensions/add-config-files.configure b/extensions/add-config-files.configure
new file mode 100755
index 00000000..2cf96fd1
--- /dev/null
+++ b/extensions/add-config-files.configure
@@ -0,0 +1,26 @@
+#!/bin/sh
+# Copyright (C) 2013,2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# Copy all files located in $SRC_CONFIG_DIR to the image /etc.
+
+
+set -e
+
+if [ "x${SRC_CONFIG_DIR}" != x ]
+then
+ cp -r "$SRC_CONFIG_DIR"/* "$1/etc/"
+fi
+
diff --git a/busybox-init.configure b/extensions/busybox-init.configure
index c7dba3b9..c7dba3b9 100644
--- a/busybox-init.configure
+++ b/extensions/busybox-init.configure
diff --git a/ceph.configure b/extensions/ceph.configure
index c3cd92d1..c3cd92d1 100644
--- a/ceph.configure
+++ b/extensions/ceph.configure
diff --git a/cloud-init.configure b/extensions/cloud-init.configure
index aa83e0e2..aa83e0e2 100755
--- a/cloud-init.configure
+++ b/extensions/cloud-init.configure
diff --git a/extensions/distbuild-trove-nfsboot.check b/extensions/distbuild-trove-nfsboot.check
new file mode 100755
index 00000000..38c491e5
--- /dev/null
+++ b/extensions/distbuild-trove-nfsboot.check
@@ -0,0 +1,150 @@
+#!/usr/bin/python
+# Copyright (C) 2014-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+'''Preparatory checks for Morph 'distbuild-trove-nfsboot' write extension'''
+
+import cliapp
+import logging
+import os
+
+import morphlib.writeexts
+
+
+class DistbuildTroveNFSBootCheckExtension(morphlib.writeexts.WriteExtension):
+
+ nfsboot_root = '/srv/nfsboot'
+ remote_user = 'root'
+
+ required_vars = [
+ 'DISTBUILD_CONTROLLER',
+ 'DISTBUILD_GIT_SERVER',
+ 'DISTBUILD_SHARED_ARTIFACT_CACHE',
+ 'DISTBUILD_TROVE_ID',
+ 'DISTBUILD_WORKERS',
+ 'DISTBUILD_WORKER_SSH_KEY',
+ ]
+
+ def system_path(self, system_name, version_label=None):
+ if version_label:
+ return os.path.join(self.nfsboot_root, system_name, 'systems',
+ version_label, 'run')
+ else:
+ return os.path.join(self.nfsboot_root, system_name)
+
+ def process_args(self, args):
+ if len(args) != 1:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ nfs_host = args[0]
+ nfs_netloc = '%s@%s' % (self.remote_user, nfs_host)
+
+ version_label = os.getenv('VERSION_LABEL', 'factory')
+
+ missing_vars = [var for var in self.required_vars
+ if not var in os.environ]
+ if missing_vars:
+ raise cliapp.AppException(
+ 'Please set: %s' % ', '.join(missing_vars))
+
+ controllers = os.getenv('DISTBUILD_CONTROLLER').split()
+ workers = os.getenv('DISTBUILD_WORKERS').split()
+
+ if len(controllers) != 1:
+ raise cliapp.AppException('Please specify exactly one controller.')
+
+ if len(workers) == 0:
+ raise cliapp.AppException('Please specify at least one worker.')
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+
+ self.check_good_server(nfs_netloc)
+
+ system_names = set(controllers + workers)
+ for system_name in system_names:
+ if upgrade:
+ self.check_upgradeable(nfs_netloc, system_name, version_label)
+ else:
+ system_path = self.system_path(system_name)
+
+ if self.remote_directory_exists(nfs_netloc, system_path):
+ if self.get_environment_boolean('OVERWRITE') == False:
+ raise cliapp.AppException(
+ 'System %s already exists at %s:%s. Try `morph '
+ 'upgrade` instead of `morph deploy`.' % (
+ system_name, nfs_netloc, system_path))
+
+ def check_good_server(self, netloc):
+ # FIXME: assumes root
+ self.check_ssh_connectivity(netloc.split('@')[-1])
+
+ # Is an NFS server
+ try:
+ cliapp.ssh_runcmd(
+ netloc, ['test', '-e', '/etc/exports'])
+ except cliapp.AppException:
+ raise cliapp.AppException('server %s is not an nfs server'
+ % netloc)
+ try:
+ cliapp.ssh_runcmd(
+ netloc, ['systemctl', 'is-enabled', 'nfs-server.service'])
+
+ except cliapp.AppException:
+ raise cliapp.AppException('server %s does not control its '
+ 'nfs server by systemd' % netloc)
+
+ # TFTP server exports /srv/nfsboot/tftp
+ tftp_root = os.path.join(self.nfsboot_root, 'tftp')
+ try:
+ cliapp.ssh_runcmd(
+ netloc, ['test' , '-d', tftp_root])
+ except cliapp.AppException:
+ raise cliapp.AppException('server %s does not export %s' %
+ (netloc, tftp_root))
+
+ def check_upgradeable(self, nfs_netloc, system_name, version_label):
+ '''Check that there is already a version of the system present.
+
+ Distbuild nodes are stateless, so an upgrade is actually pretty much
+ the same as an initial deployment. This test is just a sanity check.
+
+ '''
+ system_path = self.system_path(system_name)
+ system_version_path = self.system_path(system_name, version_label)
+
+ if not self.remote_directory_exists(nfs_netloc, system_path):
+ raise cliapp.AppException(
+ 'System %s not found at %s:%s, cannot deploy an upgrade.' % (
+ system_name, nfs_netloc, system_path))
+
+ if self.remote_directory_exists(nfs_netloc, system_version_path):
+ if self.get_environment_boolean('OVERWRITE'):
+ pass
+ else:
+ raise cliapp.AppException(
+ 'System %s version %s already exists at %s:%s.' % (
+ system_name, version_label, nfs_netloc,
+ system_version_path))
+
+ def remote_directory_exists(self, nfs_netloc, path):
+ try:
+ cliapp.ssh_runcmd(nfs_netloc, ['test', '-d', path])
+ except cliapp.AppException as e:
+ logging.debug('SSH exception: %s', e)
+ return False
+
+ return True
+
+
+DistbuildTroveNFSBootCheckExtension().run()
diff --git a/extensions/distbuild-trove-nfsboot.write b/extensions/distbuild-trove-nfsboot.write
new file mode 100755
index 00000000..a5a5b094
--- /dev/null
+++ b/extensions/distbuild-trove-nfsboot.write
@@ -0,0 +1,283 @@
+#!/usr/bin/python
+# Copyright (C) 2013-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+'''Morph .write extension for a distbuild network booting off a Trove with NFS.
+
+'''
+
+
+import os
+import sys
+import tempfile
+
+import cliapp
+import morphlib.writeexts
+
+
+class DistbuildTroveNFSBootWriteExtension(morphlib.writeexts.WriteExtension):
+
+ '''Create an NFS root and kernel on TFTP during Morph's deployment.
+
+ See distbuild-trove-nfsboot.help for documentation.
+
+ '''
+
+ nfsboot_root = '/srv/nfsboot'
+ remote_user = 'root'
+
+ def system_path(self, system_name, version_label=None):
+ if version_label:
+ # The 'run' directory is kind of a historical artifact. Baserock
+ # systems that have Btrfs root disks maintain an orig/ and a run/
+ # subvolume, so that one can find changes that have been made at
+ # runtime. For distbuild systems, this isn't necessary because the
+ # root filesystems of the nodes are effectively stateless. However,
+ # existing systems have bootloaders configured to look for the
+ # 'run' directory, so we need to keep creating it.
+ return os.path.join(self.nfsboot_root, system_name, 'systems',
+ version_label, 'run')
+ else:
+ return os.path.join(self.nfsboot_root, system_name)
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ local_system_path, nfs_host = args
+
+ nfs_netloc = '%s@%s' % (self.remote_user, nfs_host)
+
+ version_label = os.getenv('VERSION_LABEL', 'factory')
+
+ controller_name = os.getenv('DISTBUILD_CONTROLLER')
+ worker_names = os.getenv('DISTBUILD_WORKERS').split()
+ system_names = set([controller_name] + worker_names)
+
+ git_server = os.getenv('DISTBUILD_GIT_SERVER')
+ shared_artifact_cache = os.getenv('DISTBUILD_SHARED_ARTIFACT_CACHE')
+ trove_id = os.getenv('DISTBUILD_TROVE_ID')
+ worker_ssh_key_path = os.getenv('DISTBUILD_WORKER_SSH_KEY')
+
+ host_map = self.parse_host_map_string(os.getenv('HOST_MAP', ''))
+
+ kernel_relpath = self.find_kernel(local_system_path)
+
+ copied_rootfs = None
+ for system_name in system_names:
+ remote_system_path = self.system_path(system_name, version_label)
+ if copied_rootfs is None:
+ self.transfer_system(
+ nfs_netloc, local_system_path, remote_system_path)
+ copied_rootfs = remote_system_path
+ else:
+ self.duplicate_remote_system(
+ nfs_netloc, copied_rootfs, remote_system_path)
+
+ for system_name in system_names:
+ remote_system_path = self.system_path(system_name, version_label)
+ self.link_kernel_to_tftpboot_path(
+ nfs_netloc, system_name, version_label, kernel_relpath)
+ self.set_hostname(
+ nfs_netloc, system_name, remote_system_path)
+ self.write_distbuild_config(
+ nfs_netloc, system_name, remote_system_path, git_server,
+ shared_artifact_cache, trove_id, worker_ssh_key_path,
+ controller_name, worker_names, host_map=host_map)
+
+ self.configure_nfs_exports(nfs_netloc, system_names)
+
+ for system_name in system_names:
+ self.update_default_version(nfs_netloc, system_name, version_label)
+
+ def parse_host_map_string(self, host_map_string):
+ '''Parse the HOST_MAP variable
+
+ Returns a dict mapping hostname to value (where value is an IP
+ address, a fully-qualified domain name, an alternate hostname, or
+ whatever).
+
+ '''
+ pairs = host_map_string.split(' ')
+ return morphlib.util.parse_environment_pairs({}, pairs)
+
+ def transfer_system(self, nfs_netloc, local_system_path,
+ remote_system_path):
+ self.status(msg='Copying rootfs to %(nfs_netloc)s',
+ nfs_netloc=nfs_netloc)
+ cliapp.ssh_runcmd(
+ nfs_netloc, ['mkdir', '-p', remote_system_path])
+ # The deployed rootfs may have been created by OSTree, so definitely
+ # don't pass --hard-links to `rsync`.
+ cliapp.runcmd(
+ ['rsync', '--archive', '--delete', '--info=progress2',
+ '--protect-args', '--partial', '--sparse', '--xattrs',
+ local_system_path + '/',
+ '%s:%s' % (nfs_netloc, remote_system_path)], stdout=sys.stdout)
+
+ def duplicate_remote_system(self, nfs_netloc, source_system_path,
+ target_system_path):
+ self.status(msg='Duplicating rootfs to %(target_system_path)s',
+ target_system_path=target_system_path)
+ cliapp.ssh_runcmd(nfs_netloc,
+ ['mkdir', '-p', target_system_path])
+ # We can't pass --info=progress2 here, because it may not be available
+ # in the remote 'rsync'. The --info setting was added in RSync 3.1.0,
+ # old versions of Baserock have RSync 3.0.9. So the user doesn't get
+ # any progress info on stdout for the 'duplicate' stage.
+ cliapp.ssh_runcmd(nfs_netloc,
+ ['rsync', '--archive', '--delete', '--protect-args', '--partial',
+ '--sparse', '--xattrs', source_system_path + '/',
+ target_system_path], stdout=sys.stdout)
+
+ def find_kernel(self, local_system_path):
+ bootdir = os.path.join(local_system_path, 'boot')
+ image_names = ['vmlinuz', 'zImage', 'uImage']
+
+ for name in image_names:
+ try_path = os.path.join(bootdir, name)
+ if os.path.exists(try_path):
+ kernel_path = os.path.relpath(try_path, local_system_path)
+ break
+ else:
+ raise cliapp.AppException(
+ 'Could not find a kernel in the system: none of '
+ '%s found' % ', '.join(image_names))
+ return kernel_path
+
+ def link_kernel_to_tftpboot_path(self, nfs_netloc, system_name,
+ version_label, kernel_relpath):
+ '''Create links for TFTP server for a system's kernel.'''
+
+ remote_system_path = self.system_path(system_name, version_label)
+ kernel_dest = os.path.join(remote_system_path, kernel_relpath)
+
+ self.status(msg='Creating links to %(name)s kernel in tftp directory',
+ name=system_name)
+ tftp_dir = os.path.join(self.nfsboot_root , 'tftp')
+
+ versioned_kernel_name = "%s-%s" % (system_name, version_label)
+ kernel_name = system_name
+
+ cliapp.ssh_runcmd(nfs_netloc,
+ ['ln', '-f', kernel_dest,
+ os.path.join(tftp_dir, versioned_kernel_name)])
+
+ cliapp.ssh_runcmd(nfs_netloc,
+ ['ln', '-sf', versioned_kernel_name,
+ os.path.join(tftp_dir, kernel_name)])
+
+ def set_remote_file_contents(self, nfs_netloc, path, text):
+ with tempfile.NamedTemporaryFile() as f:
+ f.write(text)
+ f.flush()
+ cliapp.runcmd(
+ ['scp', f.name, '%s:%s' % (nfs_netloc, path)])
+
+ def set_hostname(self, nfs_netloc, system_name, system_path):
+ hostname_path = os.path.join(system_path, 'etc', 'hostname')
+ self.set_remote_file_contents(
+ nfs_netloc, hostname_path, system_name + '\n')
+
+ def write_distbuild_config(self, nfs_netloc, system_name, system_path,
+ git_server, shared_artifact_cache, trove_id,
+ worker_ssh_key_path, controller_name,
+ worker_names, host_map = {}):
+ '''Write /etc/distbuild/distbuild.conf on the node.
+
+ This .write extension takes advantage of the 'generic' mode of
+ distbuild.configure. Each node is not configured until first-boot,
+ when distbuild-setup.service runs and configures the node based on the
+ contents of /etc/distbuild/distbuild.conf.
+
+ '''
+ def host(hostname):
+ return host_map.get(hostname, hostname)
+
+ config = {
+ 'ARTIFACT_CACHE_SERVER': host(shared_artifact_cache),
+ 'CONTROLLERHOST': host(controller_name),
+ 'TROVE_HOST': host(git_server),
+ 'TROVE_ID': trove_id,
+ 'DISTBUILD_CONTROLLER': system_name == controller_name,
+ 'DISTBUILD_WORKER': system_name in worker_names,
+ 'WORKERS': ', '.join(map(host, worker_names)),
+ 'WORKER_SSH_KEY': '/etc/distbuild/worker.key',
+ }
+
+ config_text = '\n'.join(
+ '%s: %s' % (key, value) for key, value in config.iteritems())
+ config_text = \
+ '# Generated by distbuild-trove-nfsboot.write\n' + \
+ config_text + '\n'
+ path = os.path.join(system_path, 'etc', 'distbuild')
+ cliapp.ssh_runcmd(
+ nfs_netloc, ['mkdir', '-p', path])
+ cliapp.runcmd(
+ ['scp', worker_ssh_key_path, '%s:%s' % (nfs_netloc, path)])
+ self.set_remote_file_contents(
+ nfs_netloc, os.path.join(path, 'distbuild.conf'), config_text)
+
+ def configure_nfs_exports(self, nfs_netloc, system_names):
+ '''Ensure the Trove is set up to export the NFS roots we need.
+
+ This doesn't handle setting up the TFTP daemon. We assume that is
+ already running.
+
+ '''
+ for system_name in system_names:
+ exported_path = self.system_path(system_name)
+ exports_path = '/etc/exports'
+
+ # Rather ugly SSH hackery follows to ensure each system path is
+ # listed in /etc/exports.
+ try:
+ cliapp.ssh_runcmd(
+ nfs_netloc, ['grep', '-q', exported_path, exports_path])
+ except cliapp.AppException:
+ ip_mask = '*'
+ options = 'rw,no_subtree_check,no_root_squash,async'
+ exports_string = '%s %s(%s)\n' % (exported_path, ip_mask,
+ options)
+ exports_append_sh = '''\
+ set -eu
+ target="$1"
+ temp=$(mktemp)
+ cat "$target" > "$temp"
+ cat >> "$temp"
+ mv "$temp" "$target"
+ '''
+ cliapp.ssh_runcmd(
+ nfs_netloc,
+ ['sh', '-c', exports_append_sh, '--', exports_path],
+ feed_stdin=exports_string)
+
+ cliapp.ssh_runcmd(nfs_netloc,
+ ['systemctl', 'restart', 'nfs-server.service'])
+
+ def update_default_version(self, remote_netloc, system_name,
+ version_label):
+ self.status(msg='Linking \'default\' to %(version)s for %(system)s',
+ version=version_label, system=system_name)
+ system_path = self.system_path(system_name)
+ system_version_path = os.path.join(system_path, 'systems',
+ version_label)
+ default_path = os.path.join(system_path, 'systems', 'default')
+
+ cliapp.ssh_runcmd(remote_netloc,
+ ['ln', '-sfn', system_version_path, default_path])
+
+
+DistbuildTroveNFSBootWriteExtension().run()
diff --git a/extensions/distbuild-trove-nfsboot.write.help b/extensions/distbuild-trove-nfsboot.write.help
new file mode 100644
index 00000000..62f1455c
--- /dev/null
+++ b/extensions/distbuild-trove-nfsboot.write.help
@@ -0,0 +1,49 @@
+# Copyright (C) 2014, 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+help: |
+ Deploy a distbuild network, using a Trove to serve the kernel and rootfs.
+
+ The `location` argument is the hostname of the Trove system.
+
+ The following configuration values must be specified:
+
+ - DISTBUILD_CONTROLLER: hostname of controller system
+ - DISTBUILD_WORKERS: hostnames of each worker system
+ - DISTBUILD_GIT_SERVER: Trove hostname
+ - DISTBUILD_SHARED_ARTIFACT_CACHE: Trove hostname
+ - DISTBUILD_TROVE_ID: Trove ID
+ - DISTBUILD_WORKER_SSH_KEY: SSH key to be used for ssh:// repos
+
+ A note on TROVE_ID: the current distbuild-setup service requires that
+ a single 'Trove ID' is specified. This is used in Morph for expanding
+ keyed URLs. If you set TROVE_ID=foo for example, foo:bar will be expanded
+ to git://$GIT_SERVER/foo, in addition to the standard baserock: and
+ upstream: prefixes that you can use.
+
+ The WORKER_SSH_KEY must be provided, even if you don't need it. The
+ distbuild-setup service could be changed to make it optional.
+
+ The following configuration values are optional:
+
+ - HOST_MAP: a list of key=value pairs mapping hostnames to IP addresses,
+ or fully-qualified domain names. Useful if you
+ cannot rely on hostname resolution working for your deploment.
+
+ The extension will connect to root@location via ssh to copy the kernel and
+ rootfs, and configure the nfs server. It will duplicate the kernel and
+ rootfs once for each node in the distbuild network.
+
+ The deployment mechanism makes assumptions about the bootloader
+ configuration of the target machines.
diff --git a/distbuild.configure b/extensions/distbuild.configure
index 062aaecc..062aaecc 100644
--- a/distbuild.configure
+++ b/extensions/distbuild.configure
diff --git a/extensions/fstab.configure b/extensions/fstab.configure
new file mode 100755
index 00000000..b9154eee
--- /dev/null
+++ b/extensions/fstab.configure
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright © 2013-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# =*= License: GPL-2 =*=
+
+
+import os
+import sys
+
+import morphlib
+
+envvars = {k: v for (k, v) in os.environ.iteritems() if k.startswith('FSTAB_')}
+
+conf_file = os.path.join(sys.argv[1], 'etc/fstab')
+morphlib.util.write_from_dict(conf_file, envvars)
diff --git a/distbuild/usr/lib/distbuild-setup/ansible/hosts b/extensions/hosts
index 5b97818d..5b97818d 100644
--- a/distbuild/usr/lib/distbuild-setup/ansible/hosts
+++ b/extensions/hosts
diff --git a/extensions/hosts.configure b/extensions/hosts.configure
new file mode 100755
index 00000000..6b068d04
--- /dev/null
+++ b/extensions/hosts.configure
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright © 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# =*= License: GPL-2 =*=
+
+
+import os
+import sys
+import socket
+
+import morphlib
+
+def validate(var, line):
+ xs = line.split()
+ if len(xs) == 0:
+ raise morphlib.Error("`%s: %s': line is empty" % (var, line))
+
+ ip = xs[0]
+ hostnames = xs[1:]
+
+ if len(hostnames) == 0:
+ raise morphlib.Error("`%s: %s': missing hostname" % (var, line))
+
+ family = socket.AF_INET6 if ':' in ip else socket.AF_INET
+
+ try:
+ socket.inet_pton(family, ip)
+ except socket.error:
+ raise morphlib.Error("`%s: %s' invalid ip" % (var, ip))
+
+envvars = {k: v for (k, v) in os.environ.iteritems() if k.startswith('HOSTS_')}
+
+conf_file = os.path.join(sys.argv[1], 'etc/hosts')
+morphlib.util.write_from_dict(conf_file, envvars, validate)
diff --git a/image-package-example/README b/extensions/image-package-example/README
index c1322f25..c1322f25 100644
--- a/image-package-example/README
+++ b/extensions/image-package-example/README
diff --git a/image-package-example/common.sh.in b/extensions/image-package-example/common.sh.in
index 9a7389a7..9a7389a7 100644
--- a/image-package-example/common.sh.in
+++ b/extensions/image-package-example/common.sh.in
diff --git a/image-package-example/disk-install.sh.in b/extensions/image-package-example/disk-install.sh.in
index bc8e0e67..bc8e0e67 100644
--- a/image-package-example/disk-install.sh.in
+++ b/extensions/image-package-example/disk-install.sh.in
diff --git a/image-package-example/make-disk-image.sh.in b/extensions/image-package-example/make-disk-image.sh.in
index 61264fa0..61264fa0 100644
--- a/image-package-example/make-disk-image.sh.in
+++ b/extensions/image-package-example/make-disk-image.sh.in
diff --git a/image-package.write b/extensions/image-package.write
index 15ceadcf..15ceadcf 100755
--- a/image-package.write
+++ b/extensions/image-package.write
diff --git a/extensions/initramfs.write b/extensions/initramfs.write
new file mode 100755
index 00000000..1059defa
--- /dev/null
+++ b/extensions/initramfs.write
@@ -0,0 +1,26 @@
+#!/bin/sh
+# Copyright (C) 2014-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# =*= License: GPL-2 =*=
+
+set -e
+
+ROOTDIR="$1"
+INITRAMFS_PATH="$2"
+
+(cd "$ROOTDIR" &&
+ find . -print0 |
+ cpio -0 -H newc -o) |
+ gzip -c | install -D -m644 /dev/stdin "$INITRAMFS_PATH"
diff --git a/extensions/initramfs.write.help b/extensions/initramfs.write.help
new file mode 100644
index 00000000..54d3ae8c
--- /dev/null
+++ b/extensions/initramfs.write.help
@@ -0,0 +1,55 @@
+# Copyright (C) 2014, 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+help: |
+
+ Create an initramfs for a system by taking an existing system and
+ converting it to the appropriate format.
+
+ The system must have a `/init` executable as the userland entry-point.
+ This can have a different path, if `rdinit=$path` is added to
+ the kernel command line. This can be added to the `rawdisk`,
+ `virtualbox-ssh` and `kvm` write extensions with the `KERNEL_CMDLINE`
+ option.
+
+ It is possible to use a ramfs as the final rootfs without a `/init`
+ executable, by setting `root=/dev/mem`, or `rdinit=/sbin/init`,
+ but this is beyond the scope for the `initramfs.write` extension.
+
+ The intended use of initramfs.write is to be part of a nested
+ deployment, so the parent system has an initramfs stored as
+ `/boot/initramfs.gz`. See the following example:
+
+ name: initramfs-test
+ kind: cluster
+ systems:
+ - morph: minimal-system-x86_64-generic
+ deploy:
+ system:
+ type: rawdisk
+ location: initramfs-system-x86_64.img
+ DISK_SIZE: 1G
+ HOSTNAME: initramfs-system
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: initramfs-x86_64
+ deploy:
+ initramfs:
+ type: initramfs
+ location: boot/initramfs.gz
+
+ Parameters:
+
+ * location: the path where the initramfs will be installed (e.g.
+ `boot/initramfs.gz`) in the above example
diff --git a/extensions/install-essential-files.configure b/extensions/install-essential-files.configure
new file mode 100755
index 00000000..cce9a5a5
--- /dev/null
+++ b/extensions/install-essential-files.configure
@@ -0,0 +1,42 @@
+#!/usr/bin/env python2
+# Copyright (C) 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+''' A Morph configuration extension for adding essential files to a system
+
+It will read the manifest files located in essential-files/manifest,
+then use the contens of those files to determine which files
+to install into the target system.
+
+'''
+
+import subprocess
+import os
+
+import cliapp
+
+class InstallEssentialFilesConfigureExtension(cliapp.Application):
+
+ def process_args(self, args):
+ target_root = args[0]
+ os.environ["INSTALL_FILES"] = "install-files/essential-files/manifest"
+ self.install_essential_files(target_root)
+
+ def install_essential_files(self, target_root):
+ command = os.path.join(os.path.dirname(__file__),
+ "install-files.configure")
+ subprocess.check_call([command, target_root])
+
+InstallEssentialFilesConfigureExtension().run()
diff --git a/extensions/install-essential-files.configure.help b/extensions/install-essential-files.configure.help
new file mode 100644
index 00000000..9148aeff
--- /dev/null
+++ b/extensions/install-essential-files.configure.help
@@ -0,0 +1,20 @@
+# Copyright (C) 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+help: |
+ This installs files from the essential-files/ folder in your
+ definitions.git repo, according to essential-files/manifest.
+
+ It wraps the install-files.configure extension. Take a look to that
+ extension help to know more about the format of the manifest file.
diff --git a/extensions/install-files.configure b/extensions/install-files.configure
new file mode 100755
index 00000000..341cce61
--- /dev/null
+++ b/extensions/install-files.configure
@@ -0,0 +1,134 @@
+#!/usr/bin/python
+# Copyright (C) 2013-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+''' A Morph configuration extension for adding arbitrary files to a system
+
+It will read the manifest files specified in the environment variable
+INSTALL_FILES, then use the contens of those files to determine which files
+to install into the target system.
+
+'''
+
+import cliapp
+import os
+import errno
+import re
+import sys
+import shlex
+import shutil
+import stat
+
+try:
+ import jinja2
+ jinja_available = True
+except ImportError:
+ jinja_available = False
+
+class InstallFilesConfigureExtension(cliapp.Application):
+
+ def process_args(self, args):
+ if not 'INSTALL_FILES' in os.environ:
+ return
+ target_root = args[0]
+ manifests = shlex.split(os.environ['INSTALL_FILES'])
+ for manifest in manifests:
+ self.install_manifest(manifest, target_root)
+
+ def install_manifest(self, manifest, target_root):
+ manifest_dir = os.path.dirname(manifest)
+ with open(manifest) as f:
+ entries = f.readlines()
+ for entry in entries:
+ self.install_entry(entry, manifest_dir, target_root)
+
+ def force_symlink(self, source, link_name):
+ try:
+ os.symlink(source, link_name)
+ except OSError as e:
+ if e.errno == errno.EEXIST:
+ os.remove(link_name)
+ os.symlink(source, link_name)
+
+ def install_entry(self, entry, manifest_root, target_root):
+ m = re.match('(template )?(overwrite )?'
+ '([0-7]+) ([0-9]+) ([0-9]+) (\S+)', entry)
+
+ if m:
+ template = m.group(1)
+ overwrite = m.group(2)
+ mode = int(m.group(3), 8) # mode is octal
+ uid = int(m.group(4))
+ gid = int(m.group(5))
+ path = m.group(6)
+ else:
+ raise cliapp.AppException('Invalid manifest entry, '
+ 'format: [template] [overwrite] '
+ '<octal mode> <uid decimal> <gid decimal> <filename>')
+
+ dest_path = os.path.join(target_root, './' + path)
+ if stat.S_ISDIR(mode):
+ if os.path.exists(dest_path) and not overwrite:
+ dest_stat = os.stat(dest_path)
+ if (mode != dest_stat.st_mode
+ or uid != dest_stat.st_uid
+ or gid != dest_stat.st_gid):
+ raise cliapp.AppException('"%s" exists and is not '
+ 'identical to directory '
+ '"%s"' % (dest_path, entry))
+ else:
+ os.mkdir(dest_path, mode)
+ os.chown(dest_path, uid, gid)
+ os.chmod(dest_path, mode)
+
+ elif stat.S_ISLNK(mode):
+ if os.path.lexists(dest_path) and not overwrite:
+ raise cliapp.AppException('Symlink already exists at %s'
+ % dest_path)
+ else:
+ linkdest = os.readlink(os.path.join(manifest_root,
+ './' + path))
+ self.force_symlink(linkdest, dest_path)
+ os.lchown(dest_path, uid, gid)
+
+ elif stat.S_ISREG(mode):
+ if os.path.lexists(dest_path) and not overwrite:
+ raise cliapp.AppException('File already exists at %s'
+ % dest_path)
+ else:
+ if template:
+ if not jinja_available:
+ raise cliapp.AppException(
+ "Failed to install template file `%s': "
+ 'install-files templates require jinja2'
+ % path)
+
+ loader = jinja2.FileSystemLoader(manifest_root)
+ env = jinja2.Environment(loader=loader,
+ keep_trailing_newline=True)
+
+ env.get_template(path).stream(os.environ).dump(dest_path)
+ else:
+ shutil.copyfile(os.path.join(manifest_root, './' + path),
+ dest_path)
+
+ os.chown(dest_path, uid, gid)
+ os.chmod(dest_path, mode)
+
+ else:
+ raise cliapp.AppException('Mode given in "%s" is not a file,'
+ ' symlink or directory' % entry)
+
+InstallFilesConfigureExtension().run()
diff --git a/extensions/install-files.configure.help b/extensions/install-files.configure.help
new file mode 100644
index 00000000..991c26c8
--- /dev/null
+++ b/extensions/install-files.configure.help
@@ -0,0 +1,74 @@
+# Copyright (C) 2014, 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+help: |
+ Install a set of files onto a system
+
+ To use this extension you create a directory of files you want to install
+ onto the target system.
+
+ In this example we want to copy some ssh keys onto a system
+
+ % mkdir sshkeyfiles
+ % mkdir -p sshkeyfiles/root/.ssh
+ % cp id_rsa sshkeyfiles/root/.ssh
+ % cp id_rsa.pub sshkeyfiles/root/.ssh
+
+ Now we need to create a manifest file to set the file modes
+ and persmissions. The manifest file should be created inside the
+ directory that contains the files we're trying to install.
+
+ cat << EOF > sshkeyfiles/manifest
+ 0040755 0 0 /root/.ssh
+ 0100600 0 0 /root/.ssh/id_rsa
+ 0100644 0 0 /root/.ssh/id_rsa.pub
+ EOF
+
+ Then we add the path to our manifest to our cluster morph,
+ this path should be relative to the system definitions repository.
+
+ INSTALL_FILES: sshkeysfiles/manifest
+
+ More generally entries in the manifest are formatted as:
+ [overwrite] <octal mode> <uid decimal> <gid decimal> <filename>
+
+ NOTE: Directories on the target must be created if they do not exist.
+
+ The extension supports files, symlinks and directories.
+
+ For example,
+
+ 0100644 0 0 /etc/issue
+
+ creates a regular file at /etc/issue with 644 permissions,
+ uid 0 and gid 0, if the file doesn't already exist.
+
+ overwrite 0100644 0 0 /etc/issue
+
+ creates a regular file at /etc/issue with 644 permissions,
+ uid 0 and gid 0, if the file already exists it is overwritten.
+
+ 0100755 0 0 /usr/bin/foo
+
+ creates an executable file at /usr/bin/foo
+
+ 0040755 0 0 /etc/foodir
+
+ creates a directory with 755 permissions
+
+ 0120000 0 0 /usr/bin/bar
+
+ creates a symlink at /usr/bin/bar
+
+ NOTE: You will still need to make a symlink in the manifest directory.
diff --git a/installer.configure b/extensions/installer.configure
index a77dc851..a77dc851 100755
--- a/installer.configure
+++ b/extensions/installer.configure
diff --git a/jffs2.write b/extensions/jffs2.write
index 46b69a53..46b69a53 100644
--- a/jffs2.write
+++ b/extensions/jffs2.write
diff --git a/jffs2.write.help b/extensions/jffs2.write.help
index 059a354b..059a354b 100644
--- a/jffs2.write.help
+++ b/extensions/jffs2.write.help
diff --git a/extensions/kvm.check b/extensions/kvm.check
new file mode 100755
index 00000000..67cb3d38
--- /dev/null
+++ b/extensions/kvm.check
@@ -0,0 +1,169 @@
+#!/usr/bin/python
+# Copyright (C) 2014-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+'''Preparatory checks for Morph 'kvm' write extension'''
+
+import cliapp
+import os
+import re
+import urlparse
+
+import morphlib.writeexts
+
+
+class KvmPlusSshCheckExtension(morphlib.writeexts.WriteExtension):
+
+ location_pattern = '^/(?P<guest>[^/]+)(?P<path>/.+)$'
+
+ def process_args(self, args):
+ if len(args) != 1:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ self.require_btrfs_in_deployment_host_kernel()
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if upgrade:
+ raise cliapp.AppException(
+ 'Use the `ssh-rsync` write extension to deploy upgrades to an '
+ 'existing remote system.')
+
+ location = args[0]
+ ssh_host, vm_name, vm_path = self.check_and_parse_location(location)
+
+ self.check_ssh_connectivity(ssh_host)
+ self.check_can_create_file_at_given_path(ssh_host, vm_path)
+ self.check_no_existing_libvirt_vm(ssh_host, vm_name)
+ self.check_extra_disks_exist(ssh_host, self.parse_attach_disks())
+ self.check_virtual_networks_are_started(ssh_host)
+ self.check_host_has_virtinstall(ssh_host)
+
+ def check_and_parse_location(self, location):
+ '''Check and parse the location argument to get relevant data.'''
+
+ x = urlparse.urlparse(location)
+
+ if x.scheme != 'kvm+ssh':
+ raise cliapp.AppException(
+ 'URL schema must be kvm+ssh in %s' % location)
+
+ m = re.match(self.location_pattern, x.path)
+ if not m:
+ raise cliapp.AppException('Cannot parse location %s' % location)
+
+ return x.netloc, m.group('guest'), m.group('path')
+
+ def check_no_existing_libvirt_vm(self, ssh_host, vm_name):
+ try:
+ cliapp.ssh_runcmd(ssh_host,
+ ['virsh', '--connect', 'qemu:///system', 'domstate', vm_name])
+ except cliapp.AppException as e:
+ pass
+ else:
+ raise cliapp.AppException(
+ 'Host %s already has a VM named %s. You can use the ssh-rsync '
+ 'write extension to deploy upgrades to existing machines.' %
+ (ssh_host, vm_name))
+
+ def check_can_create_file_at_given_path(self, ssh_host, vm_path):
+
+ def check_can_write_to_given_path():
+ try:
+ cliapp.ssh_runcmd(ssh_host, ['touch', vm_path])
+ except cliapp.AppException as e:
+ raise cliapp.AppException("Can't write to location %s on %s"
+ % (vm_path, ssh_host))
+ else:
+ cliapp.ssh_runcmd(ssh_host, ['rm', vm_path])
+
+ try:
+ cliapp.ssh_runcmd(ssh_host, ['test', '-e', vm_path])
+ except cliapp.AppException as e:
+ # vm_path doesn't already exist, so let's test we can write
+ check_can_write_to_given_path()
+ else:
+ raise cliapp.AppException('%s already exists on %s'
+ % (vm_path, ssh_host))
+
+ def check_extra_disks_exist(self, ssh_host, filename_list):
+ for filename in filename_list:
+ try:
+ cliapp.ssh_runcmd(ssh_host, ['ls', filename])
+ except cliapp.AppException as e:
+ raise cliapp.AppException('Did not find file %s on host %s' %
+ (filename, ssh_host))
+
+ def check_virtual_networks_are_started(self, ssh_host):
+
+ def check_virtual_network_is_started(network_name):
+ cmd = ['virsh', '-c', 'qemu:///system', 'net-info', network_name]
+ net_info = cliapp.ssh_runcmd(ssh_host, cmd).split('\n')
+
+ def pretty_concat(lines):
+ return '\n'.join(['\t%s' % line for line in lines])
+
+ for line in net_info:
+ m = re.match('^Active:\W*(\w+)\W*', line)
+ if m:
+ break
+ else:
+ raise cliapp.AppException(
+ "Got unexpected output parsing output of `%s':\n%s"
+ % (' '.join(cmd), pretty_concat(net_info)))
+
+ network_active = m.group(1) == 'yes'
+
+ if not network_active:
+ raise cliapp.AppException("Network '%s' is not started"
+ % network_name)
+
+ def name(nic_entry):
+ if ',' in nic_entry:
+ # network=NETWORK_NAME,mac=12:34,model=e1000...
+ return nic_entry[:nic_entry.find(',')].lstrip('network=')
+ else:
+ return nic_entry.lstrip('network=') # NETWORK_NAME
+
+ if 'NIC_CONFIG' in os.environ:
+ nics = os.environ['NIC_CONFIG'].split()
+
+ for n in nics:
+ if not (n.startswith('network=')
+ or n.startswith('bridge=')
+ or n == 'user'):
+ raise cliapp.AppException('malformed NIC_CONFIG: %s\n'
+ " (expected 'bridge=BRIDGE' 'network=NAME'"
+ " or 'user')" % n)
+
+ # --network bridge= is used to specify a bridge
+ # --network user is used to specify a form of NAT
+ # (see the virt-install(1) man page)
+ networks = [name(n) for n in nics if not n.startswith('bridge=')
+ and not n.startswith('user')]
+ else:
+ networks = ['default']
+
+ for network in networks:
+ check_virtual_network_is_started(network)
+
+ def check_host_has_virtinstall(self, ssh_host):
+ try:
+ cliapp.ssh_runcmd(ssh_host, ['which', 'virt-install'])
+ except cliapp.AppException:
+ raise cliapp.AppException(
+ 'virt-install does not seem to be installed on host %s'
+ % ssh_host)
+
+
+KvmPlusSshCheckExtension().run()
diff --git a/extensions/kvm.write b/extensions/kvm.write
new file mode 100755
index 00000000..0d0c095b
--- /dev/null
+++ b/extensions/kvm.write
@@ -0,0 +1,120 @@
+#!/usr/bin/python
+# Copyright (C) 2012-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+'''A Morph deployment write extension for deploying to KVM+libvirt.
+
+See file kvm.write.help for documentation
+
+'''
+
+
+import cliapp
+import os
+import re
+import sys
+import tempfile
+import urlparse
+
+import morphlib.writeexts
+
+
+class KvmPlusSshWriteExtension(morphlib.writeexts.WriteExtension):
+
+ location_pattern = '^/(?P<guest>[^/]+)(?P<path>/.+)$'
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ temp_root, location = args
+ ssh_host, vm_name, vm_path = self.parse_location(location)
+ autostart = self.get_environment_boolean('AUTOSTART')
+
+ fd, raw_disk = tempfile.mkstemp()
+ os.close(fd)
+ self.create_local_system(temp_root, raw_disk)
+
+ try:
+ self.transfer(raw_disk, ssh_host, vm_path)
+ self.create_libvirt_guest(ssh_host, vm_name, vm_path, autostart)
+ except BaseException:
+ sys.stderr.write('Error deploying to libvirt')
+ os.remove(raw_disk)
+ cliapp.ssh_runcmd(ssh_host, ['rm', '-f', vm_path])
+ raise
+ else:
+ os.remove(raw_disk)
+
+ self.status(
+ msg='Virtual machine %(vm_name)s has been created',
+ vm_name=vm_name)
+
+ def parse_location(self, location):
+ '''Parse the location argument to get relevant data.'''
+
+ x = urlparse.urlparse(location)
+ m = re.match('^/(?P<guest>[^/]+)(?P<path>/.+)$', x.path)
+ return x.netloc, m.group('guest'), m.group('path')
+
+ def transfer(self, raw_disk, ssh_host, vm_path):
+ '''Transfer raw disk image to libvirt host.'''
+
+ self.status(msg='Transferring disk image')
+
+ xfer_hole_path = morphlib.util.get_data_path('xfer-hole')
+ recv_hole = morphlib.util.get_data('recv-hole')
+
+ ssh_remote_cmd = [
+ 'sh', '-c', recv_hole, 'dummy-argv0', 'file', vm_path
+ ]
+
+ cliapp.runcmd(
+ ['python', xfer_hole_path, raw_disk],
+ ['ssh', ssh_host] + map(cliapp.shell_quote, ssh_remote_cmd),
+ stdout=None, stderr=None)
+
+ def create_libvirt_guest(self, ssh_host, vm_name, vm_path, autostart):
+ '''Create the libvirt virtual machine.'''
+
+ self.status(msg='Creating libvirt/kvm virtual machine')
+
+ attach_disks = self.parse_attach_disks()
+ attach_opts = []
+ for disk in attach_disks:
+ attach_opts.extend(['--disk', 'path=%s' % disk])
+
+ if 'NIC_CONFIG' in os.environ:
+ nics = os.environ['NIC_CONFIG'].split()
+ for nic in nics:
+ attach_opts.extend(['--network', nic])
+
+ ram_mebibytes = str(self.get_ram_size() / (1024**2))
+
+ vcpu_count = str(self.get_vcpu_count())
+
+ cmdline = ['virt-install', '--connect', 'qemu:///system',
+ '--import', '--name', vm_name, '--vnc',
+ '--ram', ram_mebibytes, '--vcpus', vcpu_count,
+ '--disk', 'path=%s,bus=ide' % vm_path] + attach_opts
+ if not autostart:
+ cmdline += ['--noreboot']
+ cliapp.ssh_runcmd(ssh_host, cmdline)
+
+ if autostart:
+ cliapp.ssh_runcmd(ssh_host,
+ ['virsh', '--connect', 'qemu:///system', 'autostart', vm_name])
+
+KvmPlusSshWriteExtension().run()
diff --git a/extensions/kvm.write.help b/extensions/kvm.write.help
new file mode 100644
index 00000000..812a5309
--- /dev/null
+++ b/extensions/kvm.write.help
@@ -0,0 +1,90 @@
+# Copyright (C) 2014, 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+help: |
+
+ Deploy a Baserock system as a *new* KVM/LibVirt virtual machine.
+
+ Use the `ssh-rsync` write extension to deploy upgrades to an *existing* VM
+
+ Parameters:
+
+ * location: a custom URL scheme of the form `kvm+ssh://HOST/GUEST/PATH`,
+ where:
+ * HOST is the name of the host on which KVM/LibVirt is running
+ * GUEST is the name of the guest VM on that host
+ * PATH is the path to the disk image that should be created,
+ on that host. For example,
+ `kvm+ssh://alice@192.168.122.1/testsys/home/alice/testys.img` where
+ * `alice@192.168.122.1` is the target host as given to ssh,
+ **from within the development host** (which may be
+ different from the target host's normal address);
+ * `testsys` is the name of the new guest VM';
+ * `/home/alice/testys.img` is the pathname of the disk image files
+ on the target host.
+
+ * HOSTNAME=name: the hostname of the **guest** VM within the network into
+ which it is being deployed
+
+ * DISK_SIZE=X: the size of the VM's primary virtual hard disk. `X` should
+ use a suffix of `K`, `M`, or `G` (in upper or lower case) to indicate
+ kilo-, mega-, or gigabytes. For example, `DISK_SIZE=100G` would create a
+ 100 gigabyte disk image. **This parameter is mandatory**.
+
+ * RAM_SIZE=X: The amount of RAM that the virtual machine should allocate
+ for itself from the host. `X` is interpreted in the same was as for
+ DISK_SIZE`, and defaults to `1G`
+
+ * VCPUS=n: the number of virtual CPUs for the VM. Allowed values 1-32. Do
+ not use more CPU cores than you have available physically (real cores, no
+ hyperthreads)
+
+ * INITRAMFS_PATH=path: the location of an initramfs for the bootloader to
+ tell Linux to use, rather than booting the rootfs directly.
+
+ * AUTOSTART=<VALUE>` - boolean. If it is set, the VM will be started when
+ it has been deployed.
+
+ * DTB_PATH=path: **(MANDATORY)** for systems that require a device tree
+ binary - Give the full path (without a leading /) to the location of the
+ DTB in the built system image . The deployment will fail if `path` does
+ not exist.
+
+ * BOOTLOADER_INSTALL=value: the bootloader to be installed
+ **(MANDATORY)** for non-x86 systems
+
+ allowed values =
+ - 'extlinux' (default) - the extlinux bootloader will
+ be installed
+ - 'none' - no bootloader will be installed by `morph deploy`. A
+ bootloader must be installed manually. This value must be used when
+ deploying non-x86 systems such as ARM.
+
+ * BOOTLOADER_CONFIG_FORMAT=value: the bootloader format to be used.
+ If not specified for x86-32 and x86-64 systems, 'extlinux' will be used
+
+ allowed values =
+ - 'extlinux'
+
+ * KERNEL_ARGS=args: optional additional kernel command-line parameters to
+ be appended to the default set. The default set is:
+
+ 'rw init=/sbin/init rootfstype=btrfs \
+ rootflags=subvol=systems/default/run \
+ root=[name or UUID of root filesystem]'
+
+ (See https://www.kernel.org/doc/Documentation/kernel-parameters.txt)
+
+ (See `morph help deploy` for details of how to pass parameters to write
+ extensions)
diff --git a/mason.configure b/extensions/mason.configure
index 1198ebd0..40fdfe46 100644
--- a/mason.configure
+++ b/extensions/mason.configure
@@ -39,19 +39,19 @@ set -e
ROOT="$1"
mkdir -p "$ROOT"/usr/lib/mason
-cp mason/mason.sh "$ROOT"/usr/lib/mason/mason.sh
-cp mason/mason-report.sh "$ROOT"/usr/lib/mason/mason-report.sh
-cp mason/os-init-script "$ROOT"/usr/lib/mason/os-init-script
+cp extensions/mason/mason.sh "$ROOT"/usr/lib/mason/mason.sh
+cp extensions/mason/mason-report.sh "$ROOT"/usr/lib/mason/mason-report.sh
+cp extensions/mason/os-init-script "$ROOT"/usr/lib/mason/os-init-script
-cp mason/mason.timer "$ROOT"/etc/systemd/system/mason.timer
+cp extensions/mason/mason.timer "$ROOT"/etc/systemd/system/mason.timer
-cp mason/mason.service "$ROOT"/etc/systemd/system/mason.service
+cp extensions/mason/mason.service "$ROOT"/etc/systemd/system/mason.service
##########################################################################
# Set up httpd web server
##########################################################################
-cp mason/httpd.service "$ROOT"/etc/systemd/system/httpd.service
+cp extensions/mason/httpd.service "$ROOT"/etc/systemd/system/httpd.service
mkdir -p "$ROOT"/srv/mason
@@ -68,9 +68,9 @@ mkdir -p "$ROOT"/var/mason
mkdir -p "$ROOT/usr/share/mason-setup"
mkdir -p "$ROOT/usr/lib/mason-setup"
-cp mason/share/* "$ROOT/usr/share/mason-setup"
-cp -r mason/ansible "$ROOT/usr/lib/mason-setup/"
-cp mason/mason-setup.service "$ROOT"/etc/systemd/system/mason-setup.service
+cp extensions/mason/share/* "$ROOT/usr/share/mason-setup"
+cp -r extensions/mason/ansible "$ROOT/usr/lib/mason-setup/"
+cp extensions/mason/mason-setup.service "$ROOT"/etc/systemd/system/mason-setup.service
ln -s ../mason-setup.service "$ROOT"/etc/systemd/system/multi-user.target.wants/mason-setup.service
diff --git a/hosts b/extensions/mason/ansible/hosts
index 5b97818d..5b97818d 100644
--- a/hosts
+++ b/extensions/mason/ansible/hosts
diff --git a/mason/ansible/mason-setup.yml b/extensions/mason/ansible/mason-setup.yml
index d1528dbb..d1528dbb 100644
--- a/mason/ansible/mason-setup.yml
+++ b/extensions/mason/ansible/mason-setup.yml
diff --git a/mason/httpd.service b/extensions/mason/httpd.service
index 7572b732..7572b732 100644
--- a/mason/httpd.service
+++ b/extensions/mason/httpd.service
diff --git a/mason/mason-generator.sh b/extensions/mason/mason-generator.sh
index 187db72c..187db72c 100755
--- a/mason/mason-generator.sh
+++ b/extensions/mason/mason-generator.sh
diff --git a/mason/mason-report.sh b/extensions/mason/mason-report.sh
index 9c20b65b..9c20b65b 100755
--- a/mason/mason-report.sh
+++ b/extensions/mason/mason-report.sh
diff --git a/mason/mason-setup.service b/extensions/mason/mason-setup.service
index 60403bde..60403bde 100644
--- a/mason/mason-setup.service
+++ b/extensions/mason/mason-setup.service
diff --git a/mason/mason.service b/extensions/mason/mason.service
index d5c99498..d5c99498 100644
--- a/mason/mason.service
+++ b/extensions/mason/mason.service
diff --git a/mason/mason.sh b/extensions/mason/mason.sh
index dba99dfa..dba99dfa 100755
--- a/mason/mason.sh
+++ b/extensions/mason/mason.sh
diff --git a/mason/mason.timer b/extensions/mason/mason.timer
index 107dff97..107dff97 100644
--- a/mason/mason.timer
+++ b/extensions/mason/mason.timer
diff --git a/mason/os-init-script b/extensions/mason/os-init-script
index 77afb926..77afb926 100644
--- a/mason/os-init-script
+++ b/extensions/mason/os-init-script
diff --git a/mason/share/mason.conf b/extensions/mason/share/mason.conf
index 1295ce84..1295ce84 100644
--- a/mason/share/mason.conf
+++ b/extensions/mason/share/mason.conf
diff --git a/mason/share/os.conf b/extensions/mason/share/os.conf
index 21ef398c..21ef398c 100644
--- a/mason/share/os.conf
+++ b/extensions/mason/share/os.conf
diff --git a/moonshot-kernel.configure b/extensions/moonshot-kernel.configure
index 11d01751..11d01751 100644
--- a/moonshot-kernel.configure
+++ b/extensions/moonshot-kernel.configure
diff --git a/nfsboot-server.configure b/extensions/nfsboot-server.configure
index 9fb48096..9fb48096 100755
--- a/nfsboot-server.configure
+++ b/extensions/nfsboot-server.configure
diff --git a/extensions/nfsboot.check b/extensions/nfsboot.check
new file mode 100755
index 00000000..e273f61c
--- /dev/null
+++ b/extensions/nfsboot.check
@@ -0,0 +1,95 @@
+#!/usr/bin/python
+# Copyright (C) 2014-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+'''Preparatory checks for Morph 'nfsboot' write extension'''
+
+import cliapp
+import os
+
+import morphlib.writeexts
+
+
+class NFSBootCheckExtension(morphlib.writeexts.WriteExtension):
+
+ _nfsboot_root = '/srv/nfsboot'
+
+ def process_args(self, args):
+ if len(args) != 1:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ location = args[0]
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if upgrade:
+ raise cliapp.AppException(
+ 'Upgrading is not currently supported for NFS deployments.')
+
+ hostname = os.environ.get('HOSTNAME', None)
+ if hostname is None:
+ raise cliapp.AppException('You must specify a HOSTNAME.')
+ if hostname == 'baserock':
+ raise cliapp.AppException('It is forbidden to nfsboot a system '
+ 'with hostname "%s"' % hostname)
+
+ self.test_good_server(location)
+
+ version_label = os.getenv('VERSION_LABEL', 'factory')
+ versioned_root = os.path.join(self._nfsboot_root, hostname, 'systems',
+ version_label)
+ if self.version_exists(versioned_root, location):
+ raise cliapp.AppException(
+ 'Root file system for host %s (version %s) already exists on '
+ 'the NFS server %s. Deployment aborted.' % (hostname,
+ version_label, location))
+
+ def test_good_server(self, server):
+ self.check_ssh_connectivity(server)
+
+ # Is an NFS server
+ try:
+ cliapp.ssh_runcmd(
+ 'root@%s' % server, ['test', '-e', '/etc/exports'])
+ except cliapp.AppException:
+ raise cliapp.AppException('server %s is not an nfs server'
+ % server)
+ try:
+ cliapp.ssh_runcmd(
+ 'root@%s' % server, ['systemctl', 'is-enabled',
+ 'nfs-server.service'])
+
+ except cliapp.AppException:
+ raise cliapp.AppException('server %s does not control its '
+ 'nfs server by systemd' % server)
+
+ # TFTP server exports /srv/nfsboot/tftp
+ tftp_root = os.path.join(self._nfsboot_root, 'tftp')
+ try:
+ cliapp.ssh_runcmd(
+ 'root@%s' % server, ['test' , '-d', tftp_root])
+ except cliapp.AppException:
+ raise cliapp.AppException('server %s does not export %s' %
+ (tftp_root, server))
+
+ def version_exists(self, versioned_root, location):
+ try:
+ cliapp.ssh_runcmd('root@%s' % location,
+ ['test', '-d', versioned_root])
+ except cliapp.AppException:
+ return False
+
+ return True
+
+
+NFSBootCheckExtension().run()
diff --git a/extensions/nfsboot.configure b/extensions/nfsboot.configure
new file mode 100755
index 00000000..6a68dc48
--- /dev/null
+++ b/extensions/nfsboot.configure
@@ -0,0 +1,30 @@
+#!/bin/sh
+# Copyright (C) 2013-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# Remove all networking interfaces. On nfsboot systems, eth0 is set up
+# during kernel init, and the normal ifup@eth0.service systemd unit
+# would break the NFS connection and cause the system to hang.
+
+
+set -e
+if [ "$NFSBOOT_CONFIGURE" ]; then
+ # Remove all networking interfaces but loopback
+ cat > "$1/etc/network/interfaces" <<EOF
+auto lo
+iface lo inet loopback
+EOF
+
+fi
diff --git a/extensions/nfsboot.write b/extensions/nfsboot.write
new file mode 100755
index 00000000..d928775e
--- /dev/null
+++ b/extensions/nfsboot.write
@@ -0,0 +1,202 @@
+#!/usr/bin/python
+# Copyright (C) 2013-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+'''A Morph deployment write extension for deploying to an nfsboot server
+
+*** DO NOT USE ***
+- This was written before 'proper' deployment mechanisms were in place
+It is unlikely to work at all and will not work correctly
+
+Use the pxeboot write extension instead
+
+***
+
+
+
+An nfsboot server is defined as a baserock system that has tftp and nfs
+servers running, the tftp server is exporting the contents of
+/srv/nfsboot/tftp/ and the user has sufficient permissions to create nfs roots
+in /srv/nfsboot/nfs/
+
+'''
+
+
+import cliapp
+import os
+import glob
+
+import morphlib.writeexts
+
+
+class NFSBootWriteExtension(morphlib.writeexts.WriteExtension):
+
+ '''Create an NFS root and kernel on TFTP during Morph's deployment.
+
+ The location command line argument is the hostname of the nfsboot server.
+ The user is expected to provide the location argument
+ using the following syntax:
+
+ HOST
+
+ where:
+
+ * HOST is the host of the nfsboot server
+
+ The extension will connect to root@HOST via ssh to copy the kernel and
+ rootfs, and configure the nfs server.
+
+ It requires root because it uses systemd, and reads/writes to /etc.
+
+ '''
+
+ _nfsboot_root = '/srv/nfsboot'
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ temp_root, location = args
+
+ version_label = os.getenv('VERSION_LABEL', 'factory')
+ hostname = os.environ['HOSTNAME']
+
+ versioned_root = os.path.join(self._nfsboot_root, hostname, 'systems',
+ version_label)
+
+ self.copy_rootfs(temp_root, location, versioned_root, hostname)
+ self.copy_kernel(temp_root, location, versioned_root, version_label,
+ hostname)
+ self.configure_nfs(location, hostname)
+
+ def create_local_state(self, location, hostname):
+ statedir = os.path.join(self._nfsboot_root, hostname, 'state')
+ subdirs = [os.path.join(statedir, 'home'),
+ os.path.join(statedir, 'opt'),
+ os.path.join(statedir, 'srv')]
+ cliapp.ssh_runcmd('root@%s' % location,
+ ['mkdir', '-p'] + subdirs)
+
+ def copy_kernel(self, temp_root, location, versioned_root, version,
+ hostname):
+ bootdir = os.path.join(temp_root, 'boot')
+ image_names = ['vmlinuz', 'zImage', 'uImage']
+ for name in image_names:
+ try_path = os.path.join(bootdir, name)
+ if os.path.exists(try_path):
+ kernel_src = try_path
+ break
+ else:
+ raise cliapp.AppException(
+ 'Could not find a kernel in the system: none of '
+ '%s found' % ', '.join(image_names))
+
+ kernel_dest = os.path.join(versioned_root, 'orig', 'kernel')
+ rsync_dest = 'root@%s:%s' % (location, kernel_dest)
+ self.status(msg='Copying kernel')
+ cliapp.runcmd(
+ ['rsync', '-s', kernel_src, rsync_dest])
+
+ # Link the kernel to the right place
+ self.status(msg='Creating links to kernel in tftp directory')
+ tftp_dir = os.path.join(self._nfsboot_root , 'tftp')
+ versioned_kernel_name = "%s-%s" % (hostname, version)
+ kernel_name = hostname
+ try:
+ cliapp.ssh_runcmd('root@%s' % location,
+ ['ln', '-f', kernel_dest,
+ os.path.join(tftp_dir, versioned_kernel_name)])
+
+ cliapp.ssh_runcmd('root@%s' % location,
+ ['ln', '-sf', versioned_kernel_name,
+ os.path.join(tftp_dir, kernel_name)])
+ except cliapp.AppException:
+ raise cliapp.AppException('Could not create symlinks to the '
+ 'kernel at %s in %s on %s'
+ % (kernel_dest, tftp_dir, location))
+
+ def copy_rootfs(self, temp_root, location, versioned_root, hostname):
+ rootfs_src = temp_root + '/'
+ orig_path = os.path.join(versioned_root, 'orig')
+ run_path = os.path.join(versioned_root, 'run')
+
+ self.status(msg='Creating destination directories')
+ try:
+ cliapp.ssh_runcmd('root@%s' % location,
+ ['mkdir', '-p', orig_path, run_path])
+ except cliapp.AppException:
+ raise cliapp.AppException('Could not create dirs %s and %s on %s'
+ % (orig_path, run_path, location))
+
+ self.status(msg='Creating \'orig\' rootfs')
+ cliapp.runcmd(
+ ['rsync', '-asXSPH', '--delete', rootfs_src,
+ 'root@%s:%s' % (location, orig_path)])
+
+ self.status(msg='Creating \'run\' rootfs')
+ try:
+ cliapp.ssh_runcmd('root@%s' % location,
+ ['rm', '-rf', run_path])
+ cliapp.ssh_runcmd('root@%s' % location,
+ ['cp', '-al', orig_path, run_path])
+ cliapp.ssh_runcmd('root@%s' % location,
+ ['rm', '-rf', os.path.join(run_path, 'etc')])
+ cliapp.ssh_runcmd('root@%s' % location,
+ ['cp', '-a', os.path.join(orig_path, 'etc'),
+ os.path.join(run_path, 'etc')])
+ except cliapp.AppException:
+ raise cliapp.AppException('Could not create \'run\' rootfs'
+ ' from \'orig\'')
+
+ self.status(msg='Linking \'default\' to latest system')
+ try:
+ cliapp.ssh_runcmd('root@%s' % location,
+ ['ln', '-sfn', versioned_root,
+ os.path.join(self._nfsboot_root, hostname, 'systems',
+ 'default')])
+ except cliapp.AppException:
+ raise cliapp.AppException('Could not link \'default\' to %s'
+ % versioned_root)
+
+ def configure_nfs(self, location, hostname):
+ exported_path = os.path.join(self._nfsboot_root, hostname)
+ exports_path = '/etc/exports'
+ # If that path is not already exported:
+ try:
+ cliapp.ssh_runcmd(
+ 'root@%s' % location, ['grep', '-q', exported_path,
+ exports_path])
+ except cliapp.AppException:
+ ip_mask = '*'
+ options = 'rw,no_subtree_check,no_root_squash,async'
+ exports_string = '%s %s(%s)\n' % (exported_path, ip_mask, options)
+ exports_append_sh = '''\
+set -eu
+target="$1"
+temp=$(mktemp)
+cat "$target" > "$temp"
+cat >> "$temp"
+mv "$temp" "$target"
+'''
+ cliapp.ssh_runcmd(
+ 'root@%s' % location,
+ ['sh', '-c', exports_append_sh, '--', exports_path],
+ feed_stdin=exports_string)
+ cliapp.ssh_runcmd(
+ 'root@%s' % location, ['systemctl', 'restart',
+ 'nfs-server.service'])
+
+
+NFSBootWriteExtension().run()
diff --git a/extensions/nfsboot.write.help b/extensions/nfsboot.write.help
new file mode 100644
index 00000000..186c479a
--- /dev/null
+++ b/extensions/nfsboot.write.help
@@ -0,0 +1,33 @@
+# Copyright (C) 2014, 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+help: |
+ *** DO NOT USE ***
+ - This was written before 'proper' deployment mechanisms were in place.
+ It is unlikely to work at all, and will not work correctly.
+
+ Use the pxeboot write extension instead
+
+ ***
+ Deploy a system image and kernel to an nfsboot server.
+
+ An nfsboot server is defined as a baserock system that has
+ tftp and nfs servers running, the tftp server is exporting
+ the contents of /srv/nfsboot/tftp/ and the user has sufficient
+ permissions to create nfs roots in /srv/nfsboot/nfs/.
+
+ The `location` argument is the hostname of the nfsboot server.
+
+ The extension will connect to root@HOST via ssh to copy the
+ kernel and rootfs, and configure the nfs server.
diff --git a/openstack-ceilometer.configure b/extensions/openstack-ceilometer.configure
index 9c0b7b6d..9c0b7b6d 100644
--- a/openstack-ceilometer.configure
+++ b/extensions/openstack-ceilometer.configure
diff --git a/openstack-cinder.configure b/extensions/openstack-cinder.configure
index 4c32e11a..4c32e11a 100644
--- a/openstack-cinder.configure
+++ b/extensions/openstack-cinder.configure
diff --git a/openstack-glance.configure b/extensions/openstack-glance.configure
index 5da08895..5da08895 100644
--- a/openstack-glance.configure
+++ b/extensions/openstack-glance.configure
diff --git a/openstack-ironic.configure b/extensions/openstack-ironic.configure
index 962bbcd1..962bbcd1 100644
--- a/openstack-ironic.configure
+++ b/extensions/openstack-ironic.configure
diff --git a/openstack-keystone.configure b/extensions/openstack-keystone.configure
index 6b011b14..6b011b14 100644
--- a/openstack-keystone.configure
+++ b/extensions/openstack-keystone.configure
diff --git a/openstack-network.configure b/extensions/openstack-network.configure
index 10be5a1c..10be5a1c 100644
--- a/openstack-network.configure
+++ b/extensions/openstack-network.configure
diff --git a/openstack-neutron.configure b/extensions/openstack-neutron.configure
index 210222db..210222db 100644
--- a/openstack-neutron.configure
+++ b/extensions/openstack-neutron.configure
diff --git a/openstack-nova.configure b/extensions/openstack-nova.configure
index 213f1852..213f1852 100644
--- a/openstack-nova.configure
+++ b/extensions/openstack-nova.configure
diff --git a/openstack-swift-controller.configure b/extensions/openstack-swift-controller.configure
index 424ab57b..424ab57b 100644
--- a/openstack-swift-controller.configure
+++ b/extensions/openstack-swift-controller.configure
diff --git a/extensions/openstack.check b/extensions/openstack.check
new file mode 100755
index 00000000..a3379763
--- /dev/null
+++ b/extensions/openstack.check
@@ -0,0 +1,90 @@
+#!/usr/bin/python
+# Copyright (C) 2014-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+'''Preparatory checks for Morph 'openstack' write extension'''
+
+import cliapp
+import os
+import urlparse
+import keystoneclient
+
+import morphlib.writeexts
+
+
+class OpenStackCheckExtension(morphlib.writeexts.WriteExtension):
+
+ def process_args(self, args):
+ if len(args) != 1:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ self.require_btrfs_in_deployment_host_kernel()
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if upgrade:
+ raise cliapp.AppException(
+ 'Use the `ssh-rsync` write extension to deploy upgrades to an '
+ 'existing remote system.')
+
+ location = args[0]
+ self.check_location(location)
+
+ self.check_imagename()
+ self.check_openstack_parameters(self._get_auth_parameters(location))
+
+ def _get_auth_parameters(self, location):
+ '''Check the environment variables needed and returns all.
+
+ The environment variables are described in the class documentation.
+ '''
+
+ auth_keys = {'OPENSTACK_USER': 'username',
+ 'OPENSTACK_TENANT': 'tenant_name',
+ 'OPENSTACK_PASSWORD': 'password'}
+
+ for key in auth_keys:
+ if os.environ.get(key, '') == '':
+ raise cliapp.AppException(key + ' was not given')
+
+ auth_params = {auth_keys[key]: os.environ[key] for key in auth_keys}
+ auth_params['auth_url'] = location
+ return auth_params
+
+ def check_imagename(self):
+ if os.environ.get('OPENSTACK_IMAGENAME', '') == '':
+ raise cliapp.AppException('OPENSTACK_IMAGENAME was not given')
+
+ def check_location(self, location):
+ x = urlparse.urlparse(location)
+ if x.scheme not in ['http', 'https']:
+ raise cliapp.AppException('URL schema must be http or https in %s'\
+ % location)
+ if (x.path != '/v2.0' and x.path != '/v2.0/'):
+ raise cliapp.AppException('API version must be v2.0 in %s'\
+ % location)
+
+ def check_openstack_parameters(self, auth_params):
+ ''' Check that we can connect to and authenticate with openstack '''
+
+ self.status(msg='Checking OpenStack credentials...')
+
+ try:
+ keystoneclient.v2_0.Client(**auth_params)
+ except keystoneclient.exceptions.Unauthorized:
+ errmsg = ('Failed to authenticate with OpenStack '
+ '(are your credentials correct?)')
+ raise cliapp.AppException(errmsg)
+
+
+OpenStackCheckExtension().run()
diff --git a/extensions/openstack.write b/extensions/openstack.write
new file mode 100755
index 00000000..67e07c18
--- /dev/null
+++ b/extensions/openstack.write
@@ -0,0 +1,93 @@
+#!/usr/bin/python
+# Copyright (C) 2013-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+'''A Morph deployment write extension for deploying to OpenStack.'''
+
+
+import cliapp
+import os
+import tempfile
+import urlparse
+
+import morphlib.writeexts
+
+
+class OpenStackWriteExtension(morphlib.writeexts.WriteExtension):
+
+ '''See openstack.write.help for documentation'''
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ temp_root, location = args
+
+ os_params = self.get_openstack_parameters()
+
+ fd, raw_disk = tempfile.mkstemp()
+ os.close(fd)
+ self.create_local_system(temp_root, raw_disk)
+ self.status(msg='Temporary disk image has been created at %s'
+ % raw_disk)
+
+ self.set_extlinux_root_to_virtio(raw_disk)
+
+ self.configure_openstack_image(raw_disk, location, os_params)
+
+ def set_extlinux_root_to_virtio(self, raw_disk):
+ '''Re-configures extlinux to use virtio disks'''
+ self.status(msg='Updating extlinux.conf')
+ with self.mount(raw_disk) as mp:
+ path = os.path.join(mp, 'extlinux.conf')
+
+ with open(path) as f:
+ extlinux_conf = f.read()
+
+ extlinux_conf = extlinux_conf.replace('root=/dev/sda',
+ 'root=/dev/vda')
+ with open(path, "w") as f:
+ f.write(extlinux_conf)
+
+ def get_openstack_parameters(self):
+ '''Get the environment variables needed.
+
+ The environment variables are described in the class documentation.
+ '''
+
+ keys = ('OPENSTACK_USER', 'OPENSTACK_TENANT',
+ 'OPENSTACK_IMAGENAME', 'OPENSTACK_PASSWORD')
+ return (os.environ[key] for key in keys)
+
+ def configure_openstack_image(self, raw_disk, auth_url, os_params):
+ '''Configure the image in OpenStack using glance-client'''
+ self.status(msg='Configuring OpenStack image...')
+
+ username, tenant_name, image_name, password = os_params
+ cmdline = ['glance',
+ '--os-username', username,
+ '--os-tenant-name', tenant_name,
+ '--os-password', password,
+ '--os-auth-url', auth_url,
+ 'image-create',
+ '--name=%s' % image_name,
+ '--disk-format=raw',
+ '--container-format', 'bare',
+ '--file', raw_disk]
+ cliapp.runcmd(cmdline)
+
+ self.status(msg='Image configured.')
+
+OpenStackWriteExtension().run()
diff --git a/extensions/openstack.write.help b/extensions/openstack.write.help
new file mode 100644
index 00000000..26983060
--- /dev/null
+++ b/extensions/openstack.write.help
@@ -0,0 +1,51 @@
+# Copyright (C) 2014, 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+help: |
+
+ Deploy a Baserock system as a *new* OpenStack virtual machine.
+ (Use the `ssh-rsync` write extension to deploy upgrades to an *existing*
+ VM)
+
+ Deploys the system to the OpenStack host using python-glanceclient.
+
+ Parameters:
+
+ * location: the authentication url of the OpenStack server using the
+ following syntax:
+
+ http://HOST:PORT/VERSION
+
+ where
+
+ * HOST is the host running OpenStack
+ * PORT is the port which is using OpenStack for authentications.
+ * VERSION is the authentication version of OpenStack (Only v2.0
+ supported)
+
+ * OPENSTACK_USER=username: the username to use in the `--os-username`
+ argument to `glance`.
+
+ * OPENSTACK_TENANT=tenant: the project name to use in the
+ `--os-tenant-name` argument to `glance`.
+
+ * OPENSTACK_IMAGENAME=imagename: the name of the image to use in the
+ `--name` argument to `glance`.
+
+ * OPENSTACK_PASSWORD=password: the password of the OpenStack user. (We
+ recommend passing this on the command-line, rather than setting an
+ environment variable or storing it in a cluster cluster definition file.)
+
+ (See `morph help deploy` for details of how to pass parameters to write
+ extensions)
diff --git a/pxeboot.check b/extensions/pxeboot.check
index 611708a9..611708a9 100755
--- a/pxeboot.check
+++ b/extensions/pxeboot.check
diff --git a/pxeboot.write b/extensions/pxeboot.write
index 3a12ebcc..3a12ebcc 100644
--- a/pxeboot.write
+++ b/extensions/pxeboot.write
diff --git a/pxeboot.write.help b/extensions/pxeboot.write.help
index 7cb78bce..7cb78bce 100644
--- a/pxeboot.write.help
+++ b/extensions/pxeboot.write.help
diff --git a/extensions/rawdisk.check b/extensions/rawdisk.check
new file mode 100755
index 00000000..9be0ce91
--- /dev/null
+++ b/extensions/rawdisk.check
@@ -0,0 +1,53 @@
+#!/usr/bin/python
+# Copyright (C) 2014-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+'''Preparatory checks for Morph 'rawdisk' write extension'''
+
+import cliapp
+
+import morphlib.writeexts
+
+import os
+
+
+class RawdiskCheckExtension(morphlib.writeexts.WriteExtension):
+ def process_args(self, args):
+ if len(args) != 1:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ self.require_btrfs_in_deployment_host_kernel()
+
+ location = args[0]
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if upgrade:
+ if not self.is_device(location):
+ if not os.path.isfile(location):
+ raise cliapp.AppException(
+ 'Cannot upgrade %s: it is not an existing disk image' %
+ location)
+
+ version_label = os.environ.get('VERSION_LABEL')
+ if version_label is None:
+ raise cliapp.AppException(
+ 'VERSION_LABEL was not given. It is required when '
+ 'upgrading an existing system.')
+ else:
+ if not self.is_device(location):
+ if os.path.exists(location):
+ raise cliapp.AppException(
+ 'Target %s already exists. Use `morph upgrade` if you '
+ 'want to update an existing image.' % location)
+
+RawdiskCheckExtension().run()
diff --git a/extensions/rawdisk.write b/extensions/rawdisk.write
new file mode 100755
index 00000000..6f2d45ba
--- /dev/null
+++ b/extensions/rawdisk.write
@@ -0,0 +1,108 @@
+#!/usr/bin/python
+# Copyright (C) 2012-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+'''A Morph deployment write extension for raw disk images.'''
+
+
+import cliapp
+import os
+import sys
+import time
+import tempfile
+
+import morphlib.writeexts
+
+
+class RawDiskWriteExtension(morphlib.writeexts.WriteExtension):
+
+ '''See rawdisk.write.help for documentation'''
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ temp_root, location = args
+ upgrade = self.get_environment_boolean('UPGRADE')
+
+ if upgrade:
+ self.upgrade_local_system(location, temp_root)
+ else:
+ try:
+ if not self.is_device(location):
+ with self.created_disk_image(location):
+ self.format_btrfs(location)
+ self.create_system(temp_root, location)
+ self.status(msg='Disk image has been created at %s' %
+ location)
+ else:
+ self.format_btrfs(location)
+ self.create_system(temp_root, location)
+ self.status(msg='System deployed to %s' % location)
+ except Exception:
+ self.status(msg='Failure to deploy system to %s' %
+ location)
+ raise
+
+ def upgrade_local_system(self, raw_disk, temp_root):
+ self.complete_fstab_for_btrfs_layout(temp_root)
+
+ with self.mount(raw_disk) as mp:
+ version_label = self.get_version_label(mp)
+ self.status(msg='Updating image to a new version with label %s' %
+ version_label)
+
+ version_root = os.path.join(mp, 'systems', version_label)
+ os.mkdir(version_root)
+
+ old_orig = os.path.join(mp, 'systems', 'default', 'orig')
+ new_orig = os.path.join(version_root, 'orig')
+ cliapp.runcmd(
+ ['btrfs', 'subvolume', 'snapshot', old_orig, new_orig])
+
+ cliapp.runcmd(
+ ['rsync', '-a', '--checksum', '--numeric-ids', '--delete',
+ temp_root + os.path.sep, new_orig])
+
+ self.create_run(version_root)
+
+ default_path = os.path.join(mp, 'systems', 'default')
+ if os.path.exists(default_path):
+ os.remove(default_path)
+ else:
+ # we are upgrading and old system that does
+ # not have an updated extlinux config file
+ if self.bootloader_config_is_wanted():
+ self.generate_bootloader_config(mp)
+ self.install_bootloader(mp)
+ os.symlink(version_label, default_path)
+
+ if self.bootloader_config_is_wanted():
+ self.install_kernel(version_root, temp_root)
+
+ def get_version_label(self, mp):
+ version_label = os.environ.get('VERSION_LABEL')
+
+ if version_label is None:
+ raise cliapp.AppException('VERSION_LABEL was not given')
+
+ if os.path.exists(os.path.join(mp, 'systems', version_label)):
+ raise cliapp.AppException('VERSION_LABEL %s already exists'
+ % version_label)
+
+ return version_label
+
+
+RawDiskWriteExtension().run()
diff --git a/extensions/rawdisk.write.help b/extensions/rawdisk.write.help
new file mode 100644
index 00000000..52ed73fb
--- /dev/null
+++ b/extensions/rawdisk.write.help
@@ -0,0 +1,82 @@
+# Copyright (C) 2014, 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+help: |
+
+ Write a system produced by Morph to a physical disk, or to a file that can
+ be used as a virtual disk. The target will be formatted as a single Btrfs
+ partition, with the system image written to a subvolume in /systems, and
+ other subvolumes created for /home, /opt, /root, /srv and /var.
+
+ When written to a physical drive, the drive can be used as the boot device
+ for a 'real' machine.
+
+ When written to a file, the file can be used independently of `morph` to
+ create virtual machines with KVM / libvirt, OpenStack or, after converting
+ it to VDI format, VirtualBox.
+
+ `morph deploy` will fail if the file specified by `location` already
+ exists.
+
+ If used in `morph upgrade`, the rootfs produced by 'morph build' is added
+ to the existing raw disk image or device as an additional btrfs sub-volume.
+ `morph upgrade` will fail if the file specified by `location` does not
+ exist, or is not a Baserock raw disk image. (Most users are unlikely to
+ need or use this functionality: it is useful mainly for developers working
+ on the Baserock tools.)
+
+ Parameters:
+
+ * location: the pathname of the disk image to be created/upgraded, or the
+ path to the physical device.
+
+ * VERSION_LABEL=label - should contain only alpha-numeric
+ characters and the '-' (hyphen) character. Mandatory if being used with
+ `morph update`
+
+ * INITRAMFS_PATH=path: the location of an initramfs for the bootloader to
+ tell Linux to use, rather than booting the rootfs directly.
+
+ * DTB_PATH=path: **(MANDATORY)** for systems that require a device tree
+ binary - Give the full path (without a leading /) to the location of the
+ DTB in the built system image . The deployment will fail if `path` does
+ not exist.
+
+ * BOOTLOADER_INSTALL=value: the bootloader to be installed
+ **(MANDATORY)** for non-x86 systems
+
+ allowed values =
+ - 'extlinux' (default) - the extlinux bootloader will
+ be installed
+ - 'none' - no bootloader will be installed by `morph deploy`. A
+ bootloader must be installed manually. This value must be used when
+ deploying non-x86 systems such as ARM.
+
+ * BOOTLOADER_CONFIG_FORMAT=value: the bootloader format to be used.
+ If not specified for x86-32 and x86-64 systems, 'extlinux' will be used
+
+ allowed values =
+ - 'extlinux'
+
+ * KERNEL_ARGS=args: optional additional kernel command-line parameters to
+ be appended to the default set. The default set is:
+
+ 'rw init=/sbin/init rootfstype=btrfs \
+ rootflags=subvol=systems/default/run \
+ root=[name or UUID of root filesystem]'
+
+ (See https://www.kernel.org/doc/Documentation/kernel-parameters.txt)
+
+ (See `morph help deploy` for details of how to pass parameters to write
+ extensions)
diff --git a/sdk.write b/extensions/sdk.write
index 8d3d2a63..8d3d2a63 100755
--- a/sdk.write
+++ b/extensions/sdk.write
diff --git a/extensions/set-hostname.configure b/extensions/set-hostname.configure
new file mode 100755
index 00000000..4b2424d8
--- /dev/null
+++ b/extensions/set-hostname.configure
@@ -0,0 +1,26 @@
+#!/bin/sh
+# Copyright (C) 2013,2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# Set hostname on system from HOSTNAME.
+
+
+set -e
+
+if [ -n "$HOSTNAME" ]
+then
+ echo "$HOSTNAME" > "$1/etc/hostname"
+fi
+
diff --git a/extensions/simple-network.configure b/extensions/simple-network.configure
new file mode 100755
index 00000000..4a70f311
--- /dev/null
+++ b/extensions/simple-network.configure
@@ -0,0 +1,292 @@
+#!/usr/bin/python
+# Copyright (C) 2013,2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+'''A Morph deployment configuration extension to handle network configutation
+
+This extension prepares /etc/network/interfaces and networkd .network files
+in /etc/systemd/network/ with the interfaces specified during deployment.
+
+If no network configuration is provided, eth0 will be configured for DHCP
+with the hostname of the system in the case of /etc/network/interfaces.
+In the case of networkd, any interface starting by e* will be configured
+for DHCP
+'''
+
+
+import os
+import sys
+import errno
+import cliapp
+
+import morphlib
+
+
+class SimpleNetworkError(morphlib.Error):
+ '''Errors associated with simple network setup'''
+ pass
+
+
+class SimpleNetworkConfigurationExtension(cliapp.Application):
+ '''Configure /etc/network/interfaces and generate networkd .network files
+
+ Reading NETWORK_CONFIG, this extension sets up /etc/network/interfaces
+ and .network files in /etc/systemd/network/.
+ '''
+
+ def process_args(self, args):
+ network_config = os.environ.get("NETWORK_CONFIG")
+
+ self.rename_networkd_chunk_file(args)
+
+ if network_config is None:
+ self.generate_default_network_config(args)
+ else:
+ self.status(msg="Processing NETWORK_CONFIG=%(nc)s",
+ nc=network_config)
+
+ stanzas = self.parse_network_stanzas(network_config)
+
+ self.generate_interfaces_file(args, stanzas)
+ self.generate_networkd_files(args, stanzas)
+
+ def rename_networkd_chunk_file(self, args):
+ """Rename the 10-dchp.network file generated in the systemd chunk
+
+ The systemd chunk will place something in 10-dhcp.network, which will
+ have higher precedence than anything added in this extension (we
+ start at 50-*).
+
+ We should check for that file and rename it instead remove it in
+ case the file is being used by the user.
+
+ Until both the following happen, we should continue to rename that
+ default config file:
+
+ 1. simple-network.configure is always run when systemd is included
+ 2. We've been building systems without systemd including that default
+ networkd config for long enough that nobody should be including
+ that config file.
+ """
+ file_path = os.path.join(args[0], "etc", "systemd", "network",
+ "10-dhcp.network")
+
+ if os.path.isfile(file_path):
+ try:
+ os.rename(file_path, file_path + ".morph")
+ self.status(msg="Renaming networkd file from systemd chunk: \
+ %(f)s to %(f)s.morph", f=file_path)
+ except OSError:
+ pass
+
+ def generate_default_network_config(self, args):
+ """Generate default network config: DHCP in all the interfaces"""
+
+ default_network_config_interfaces = "lo:loopback;" \
+ "eth0:dhcp,hostname=$(hostname)"
+ default_network_config_networkd = "e*:dhcp"
+
+ stanzas_interfaces = self.parse_network_stanzas(
+ default_network_config_interfaces)
+ stanzas_networkd = self.parse_network_stanzas(
+ default_network_config_networkd)
+
+ self.generate_interfaces_file(args, stanzas_interfaces)
+ self.generate_networkd_files(args, stanzas_networkd)
+
+ def generate_interfaces_file(self, args, stanzas):
+ """Generate /etc/network/interfaces file"""
+
+ iface_file = self.generate_iface_file(stanzas)
+
+ directory_path = os.path.join(args[0], "etc", "network")
+ self.make_sure_path_exists(directory_path)
+ file_path = os.path.join(directory_path, "interfaces")
+ with open(file_path, "w") as f:
+ f.write(iface_file)
+
+ def generate_iface_file(self, stanzas):
+ """Generate an interfaces file from the provided stanzas.
+
+ The interfaces will be sorted by name, with loopback sorted first.
+ """
+
+ def cmp_iface_names(a, b):
+ a = a['name']
+ b = b['name']
+ if a == "lo":
+ return -1
+ elif b == "lo":
+ return 1
+ else:
+ return cmp(a,b)
+
+ return "\n".join(self.generate_iface_stanza(stanza)
+ for stanza in sorted(stanzas, cmp=cmp_iface_names))
+
+ def generate_iface_stanza(self, stanza):
+ """Generate an interfaces stanza from the provided data."""
+
+ name = stanza['name']
+ itype = stanza['type']
+ lines = ["auto %s" % name, "iface %s inet %s" % (name, itype)]
+ lines += [" %s %s" % elem for elem in stanza['args'].items()]
+ lines += [""]
+ return "\n".join(lines)
+
+ def generate_networkd_files(self, args, stanzas):
+ """Generate .network files"""
+
+ for i, stanza in enumerate(stanzas, 50):
+ iface_file = self.generate_networkd_file(stanza)
+
+ if iface_file is None:
+ continue
+
+ directory_path = os.path.join(args[0], "etc", "systemd", "network")
+ self.make_sure_path_exists(directory_path)
+ file_path = os.path.join(directory_path,
+ "%s-%s.network" % (i, stanza['name']))
+
+ with open(file_path, "w") as f:
+ f.write(iface_file)
+
+ def generate_networkd_file(self, stanza):
+ """Generate an .network file from the provided data."""
+
+ name = stanza['name']
+ itype = stanza['type']
+ pairs = stanza['args'].items()
+
+ if itype == "loopback":
+ return
+
+ lines = ["[Match]"]
+ lines += ["Name=%s\n" % name]
+ lines += ["[Network]"]
+ if itype == "dhcp":
+ lines += ["DHCP=yes"]
+ else:
+ lines += self.generate_networkd_entries(pairs)
+
+ return "\n".join(lines)
+
+ def generate_networkd_entries(self, pairs):
+ """Generate networkd configuration entries with the other parameters"""
+
+ address = None
+ netmask = None
+ gateway = None
+ dns = None
+ lines = []
+
+ for pair in pairs:
+ if pair[0] == 'address':
+ address = pair[1]
+ elif pair[0] == 'netmask':
+ netmask = pair[1]
+ elif pair[0] == 'gateway':
+ gateway = pair[1]
+ elif pair[0] == 'dns':
+ dns = pair[1]
+
+ if address and netmask:
+ network_suffix = self.convert_net_mask_to_cidr_suffix (netmask);
+ address_line = address + '/' + str(network_suffix)
+ lines += ["Address=%s" % address_line]
+ elif address or netmask:
+ raise Exception('address and netmask must be specified together')
+
+ if gateway:
+ lines += ["Gateway=%s" % gateway]
+
+ if dns:
+ lines += ["DNS=%s" % dns]
+
+ return lines
+
+ def convert_net_mask_to_cidr_suffix(self, mask):
+ """Convert dotted decimal form of a subnet mask to CIDR suffix notation
+
+ For example: 255.255.255.0 -> 24
+ """
+ return sum(bin(int(x)).count('1') for x in mask.split('.'))
+
+ def parse_network_stanzas(self, config):
+ """Parse a network config environment variable into stanzas.
+
+ Network config stanzas are semi-colon separated.
+ """
+
+ return [self.parse_network_stanza(s) for s in config.split(";")]
+
+ def parse_network_stanza(self, stanza):
+ """Parse a network config stanza into name, type and arguments.
+
+ Each stanza is of the form name:type[,arg=value]...
+
+ For example:
+ lo:loopback
+ eth0:dhcp
+ eth1:static,address=10.0.0.1,netmask=255.255.0.0
+ """
+ elements = stanza.split(",")
+ lead = elements.pop(0).split(":")
+ if len(lead) != 2:
+ raise SimpleNetworkError("Stanza '%s' is missing its type" %
+ stanza)
+ iface = lead[0]
+ iface_type = lead[1]
+
+ if iface_type not in ['loopback', 'static', 'dhcp']:
+ raise SimpleNetworkError("Stanza '%s' has unknown interface type"
+ " '%s'" % (stanza, iface_type))
+
+ argpairs = [element.split("=", 1) for element in elements]
+ output_stanza = { "name": iface,
+ "type": iface_type,
+ "args": {} }
+ for argpair in argpairs:
+ if len(argpair) != 2:
+ raise SimpleNetworkError("Stanza '%s' has bad argument '%r'"
+ % (stanza, argpair.pop(0)))
+ if argpair[0] in output_stanza["args"]:
+ raise SimpleNetworkError("Stanza '%s' has repeated argument"
+ " %s" % (stanza, argpair[0]))
+ output_stanza["args"][argpair[0]] = argpair[1]
+
+ return output_stanza
+
+ def make_sure_path_exists(self, path):
+ try:
+ os.makedirs(path)
+ except OSError as e:
+ if e.errno == errno.EEXIST and os.path.isdir(path):
+ pass
+ else:
+ raise SimpleNetworkError("Unable to create directory '%s'"
+ % path)
+
+ def status(self, **kwargs):
+ '''Provide status output.
+
+ The ``msg`` keyword argument is the actual message,
+ the rest are values for fields in the message as interpolated
+ by %.
+
+ '''
+
+ self.output.write('%s\n' % (kwargs['msg'] % kwargs))
+
+SimpleNetworkConfigurationExtension().run()
diff --git a/extensions/ssh-rsync.check b/extensions/ssh-rsync.check
new file mode 100755
index 00000000..c3bdfd29
--- /dev/null
+++ b/extensions/ssh-rsync.check
@@ -0,0 +1,64 @@
+#!/usr/bin/python
+# Copyright (C) 2014-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+'''Preparatory checks for Morph 'ssh-rsync' write extension'''
+
+import cliapp
+
+import os
+
+import morphlib.writeexts
+
+class SshRsyncCheckExtension(morphlib.writeexts.WriteExtension):
+ def process_args(self, args):
+ if len(args) != 1:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if not upgrade:
+ raise cliapp.AppException(
+ 'The ssh-rsync write is for upgrading existing remote '
+ 'Baserock machines. It cannot be used for an initial '
+ 'deployment.')
+
+ if os.environ.get('VERSION_LABEL', '') == '':
+ raise cliapp.AppException(
+ 'A VERSION_LABEL must be set when deploying an upgrade.')
+
+ location = args[0]
+ self.check_ssh_connectivity(location)
+ self.check_is_baserock_system(location)
+
+ # The new system that being deployed as an upgrade must contain
+ # baserock-system-config-sync and system-version-manager. However, the
+ # old system simply needs to have SSH and rsync.
+ self.check_command_exists(location, 'rsync')
+
+ def check_is_baserock_system(self, location):
+ output = cliapp.ssh_runcmd(location, ['sh', '-c',
+ 'test -d /baserock || echo -n dirnotfound'])
+ if output == 'dirnotfound':
+ raise cliapp.AppException('%s is not a baserock system'
+ % location)
+
+ def check_command_exists(self, location, command):
+ test = 'type %s > /dev/null 2>&1 || echo -n cmdnotfound' % command
+ output = cliapp.ssh_runcmd(location, ['sh', '-c', test])
+ if output == 'cmdnotfound':
+ raise cliapp.AppException(
+ "%s does not have %s" % (location, command))
+
+
+SshRsyncCheckExtension().run()
diff --git a/extensions/ssh-rsync.write b/extensions/ssh-rsync.write
new file mode 100755
index 00000000..6d596500
--- /dev/null
+++ b/extensions/ssh-rsync.write
@@ -0,0 +1,172 @@
+#!/usr/bin/python
+# Copyright (C) 2013-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+'''A Morph deployment write extension for upgrading systems over ssh.'''
+
+
+import contextlib
+import cliapp
+import os
+import sys
+import time
+import tempfile
+
+import morphlib.writeexts
+
+
+def ssh_runcmd_ignore_failure(location, command, **kwargs):
+ try:
+ return cliapp.ssh_runcmd(location, command, **kwargs)
+ except cliapp.AppException:
+ pass
+
+
+class SshRsyncWriteExtension(morphlib.writeexts.WriteExtension):
+
+ '''See ssh-rsync.write.help for documentation'''
+
+
+ def find_root_disk(self, location):
+ '''Read /proc/mounts on location to find which device contains "/"'''
+
+ self.status(msg='Finding device that contains "/"')
+ contents = cliapp.ssh_runcmd(location, ['cat', '/proc/mounts'])
+ for line in contents.splitlines():
+ line_words = line.split()
+ if (line_words[1] == '/' and line_words[0] != 'rootfs'):
+ return line_words[0]
+
+ @contextlib.contextmanager
+ def _remote_mount_point(self, location):
+ self.status(msg='Creating remote mount point')
+ remote_mnt = cliapp.ssh_runcmd(location, ['mktemp', '-d']).strip()
+ try:
+ yield remote_mnt
+ finally:
+ self.status(msg='Removing remote mount point')
+ cliapp.ssh_runcmd(location, ['rmdir', remote_mnt])
+
+ @contextlib.contextmanager
+ def _remote_mount(self, location, root_disk, mountpoint):
+ self.status(msg='Mounting root disk')
+ cliapp.ssh_runcmd(location, ['mount', root_disk, mountpoint])
+ try:
+ yield
+ finally:
+ self.status(msg='Unmounting root disk')
+ cliapp.ssh_runcmd(location, ['umount', mountpoint])
+
+ @contextlib.contextmanager
+ def _created_version_root(self, location, remote_mnt, version_label):
+ version_root = os.path.join(remote_mnt, 'systems', version_label)
+ self.status(msg='Creating %(root)s', root=version_root)
+ cliapp.ssh_runcmd(location, ['mkdir', version_root])
+ try:
+ yield version_root
+ except BaseException as e:
+ # catch all, we always want to clean up
+ self.status(msg='Cleaning up %(root)s', root=version_root)
+ ssh_runcmd_ignore_failure(location, ['rmdir', version_root])
+ raise
+
+ def get_old_orig(self, location, remote_mnt):
+ '''Identify which subvolume to snapshot from'''
+
+ # rawdisk upgrades use 'default'
+ return os.path.join(remote_mnt, 'systems', 'default', 'orig')
+
+ @contextlib.contextmanager
+ def _created_orig_subvolume(self, location, remote_mnt, version_root):
+ self.status(msg='Creating "orig" subvolume')
+ old_orig = self.get_old_orig(location, remote_mnt)
+ new_orig = os.path.join(version_root, 'orig')
+ cliapp.ssh_runcmd(location, ['btrfs', 'subvolume', 'snapshot',
+ old_orig, new_orig])
+ try:
+ yield new_orig
+ except BaseException as e:
+ ssh_runcmd_ignore_failure(
+ location, ['btrfs', 'subvolume', 'delete', new_orig])
+ raise
+
+ def populate_remote_orig(self, location, new_orig, temp_root):
+ '''Populate the subvolume version_root/orig on location'''
+
+ self.status(msg='Populating "orig" subvolume')
+ cliapp.runcmd(['rsync', '-as', '--checksum', '--numeric-ids',
+ '--delete', temp_root + os.path.sep,
+ '%s:%s' % (location, new_orig)])
+
+ @contextlib.contextmanager
+ def _deployed_version(self, location, version_label,
+ system_config_sync, system_version_manager):
+ self.status(msg='Calling system-version-manager to deploy upgrade')
+ deployment = os.path.join('/systems', version_label, 'orig')
+ cliapp.ssh_runcmd(location,
+ ['env', 'BASEROCK_SYSTEM_CONFIG_SYNC='+system_config_sync,
+ system_version_manager, 'deploy', deployment])
+ try:
+ yield deployment
+ except BaseException as e:
+ self.status(msg='Cleaning up failed version installation')
+ cliapp.ssh_runcmd(location,
+ [system_version_manager, 'remove', version_label])
+ raise
+
+ def upgrade_remote_system(self, location, temp_root):
+ root_disk = self.find_root_disk(location)
+ uuid = cliapp.ssh_runcmd(location, ['blkid', '-s', 'UUID', '-o',
+ 'value', root_disk]).strip()
+
+ self.complete_fstab_for_btrfs_layout(temp_root, uuid)
+
+ version_label = os.environ['VERSION_LABEL']
+ autostart = self.get_environment_boolean('AUTOSTART')
+
+ with self._remote_mount_point(location) as remote_mnt, \
+ self._remote_mount(location, root_disk, remote_mnt), \
+ self._created_version_root(location, remote_mnt,
+ version_label) as version_root, \
+ self._created_orig_subvolume(location, remote_mnt,
+ version_root) as orig:
+ self.populate_remote_orig(location, orig, temp_root)
+ system_root = os.path.join(remote_mnt, 'systems',
+ version_label, 'orig')
+ config_sync = os.path.join(system_root, 'usr', 'bin',
+ 'baserock-system-config-sync')
+ version_manager = os.path.join(system_root, 'usr', 'bin',
+ 'system-version-manager')
+ with self._deployed_version(location, version_label,
+ config_sync, version_manager):
+ self.status(msg='Setting %(v)s as the new default system',
+ v=version_label)
+ cliapp.ssh_runcmd(location, [version_manager,
+ 'set-default', version_label])
+
+ if autostart:
+ self.status(msg="Rebooting into new system ...")
+ ssh_runcmd_ignore_failure(location, ['reboot'])
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ temp_root, location = args
+
+ self.upgrade_remote_system(location, temp_root)
+
+
+SshRsyncWriteExtension().run()
diff --git a/extensions/ssh-rsync.write.help b/extensions/ssh-rsync.write.help
new file mode 100644
index 00000000..f3f79ed5
--- /dev/null
+++ b/extensions/ssh-rsync.write.help
@@ -0,0 +1,50 @@
+# Copyright (C) 2014, 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+help: |
+
+ Upgrade a Baserock system which is already deployed:
+ - as a KVM/LibVirt, OpenStack or vbox-ssh virtual machine;
+ - on a Jetson board.
+
+ Copies a binary delta over to the target system and arranges for it
+ to be bootable.
+
+ The recommended way to use this extension is by calling `morph upgrade`.
+ Using `morph deploy --upgrade` is deprecated.
+
+ The upgrade will fail if:
+ - no VM is deployed and running at `location`;
+ - the target system is not a Baserock system;
+ - the target's filesystem and its layout are not compatible with that
+ created by `morph deploy`."
+
+ See also the 'Upgrading a Baserock installation' section of the 'Using
+ Baserock` page at wiki.baserock.org
+ http://wiki.baserock.org/devel-with/#index8h2
+
+ Parameters:
+
+ * location: the 'user@hostname' string that will be used by ssh and rsync.
+ 'user' will always be `root` and `hostname` the hostname or address of
+ the system being upgraded.
+
+ * VERSION_LABEL=label - **(MANDATORY)** should contain only alpha-numeric
+ characters and the '-' (hyphen) character.
+
+ * AUTOSTART=<VALUE>` - boolean. If it is set, the VM will be started when
+ it has been deployed.
+
+ (See `morph help deploy` for details of how to pass parameters to write
+ extensions)
diff --git a/extensions/sshkeys.configure b/extensions/sshkeys.configure
new file mode 100755
index 00000000..7a5a8379
--- /dev/null
+++ b/extensions/sshkeys.configure
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# Copyright 2014 Codethink Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+set -e
+
+if [ "$SSHKEYS" ]
+then
+ install -d -m 700 "$1/root/.ssh"
+ echo Adding Key in "$SSHKEYS" to authorized_keys file
+ cat $SSHKEYS >> "$1/root/.ssh/authorized_keys"
+fi
diff --git a/strip-gplv3.configure b/extensions/strip-gplv3.configure
index c08061ad..c08061ad 100755
--- a/strip-gplv3.configure
+++ b/extensions/strip-gplv3.configure
diff --git a/swift-build-rings.yml b/extensions/swift-build-rings.yml
index 1ffe9c37..1ffe9c37 100644
--- a/swift-build-rings.yml
+++ b/extensions/swift-build-rings.yml
diff --git a/swift-storage-devices-validate.py b/extensions/swift-storage-devices-validate.py
index 57ab23d0..57ab23d0 100755
--- a/swift-storage-devices-validate.py
+++ b/extensions/swift-storage-devices-validate.py
diff --git a/swift-storage.configure b/extensions/swift-storage.configure
index 391b392a..391b392a 100644
--- a/swift-storage.configure
+++ b/extensions/swift-storage.configure
diff --git a/extensions/sysroot.check b/extensions/sysroot.check
new file mode 100755
index 00000000..71b35175
--- /dev/null
+++ b/extensions/sysroot.check
@@ -0,0 +1,23 @@
+#!/bin/sh
+# Copyright (C) 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Preparatory checks for Morph 'sysroot' write extension
+
+set -eu
+
+if [ "$UPGRADE" == "yes" ]; then
+ echo >&2 "ERROR: Cannot upgrade a sysroot deployment"
+ exit 1
+fi
diff --git a/extensions/sysroot.write b/extensions/sysroot.write
new file mode 100755
index 00000000..46f1a780
--- /dev/null
+++ b/extensions/sysroot.write
@@ -0,0 +1,22 @@
+#!/bin/sh
+# Copyright (C) 2014,2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# A Morph write extension to deploy to another directory
+
+set -eu
+
+mkdir -p "$2"
+
+cp -a "$1"/* "$2"
diff --git a/extensions/tar.check b/extensions/tar.check
new file mode 100755
index 00000000..f2304d46
--- /dev/null
+++ b/extensions/tar.check
@@ -0,0 +1,23 @@
+#!/bin/sh
+# Copyright (C) 2014-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Preparatory checks for Morph 'tar' write extension
+
+set -eu
+
+if [ "$UPGRADE" == "yes" ]; then
+ echo >&2 "ERROR: Cannot upgrade a tar file deployment."
+ exit 1
+fi
diff --git a/extensions/tar.write b/extensions/tar.write
new file mode 100755
index 00000000..01b545b4
--- /dev/null
+++ b/extensions/tar.write
@@ -0,0 +1,20 @@
+#!/bin/sh
+# Copyright (C) 2013,2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# A Morph write extension to deploy to a .tar file
+
+set -eu
+
+tar -C "$1" -cf "$2" .
diff --git a/extensions/tar.write.help b/extensions/tar.write.help
new file mode 100644
index 00000000..b45c61fa
--- /dev/null
+++ b/extensions/tar.write.help
@@ -0,0 +1,19 @@
+# Copyright (C) 2014, 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+help: |
+ Create a .tar file of the deployed system.
+
+ The `location` argument is a pathname to the .tar file to be
+ created.
diff --git a/trove.configure b/extensions/trove.configure
index f823762c..f823762c 100755
--- a/trove.configure
+++ b/extensions/trove.configure
diff --git a/trove.configure.help b/extensions/trove.configure.help
index c96bdf74..c96bdf74 100644
--- a/trove.configure.help
+++ b/extensions/trove.configure.help
diff --git a/vagrant.configure b/extensions/vagrant.configure
index abc3ea0c..abc3ea0c 100644
--- a/vagrant.configure
+++ b/extensions/vagrant.configure
diff --git a/extensions/vdaboot.configure b/extensions/vdaboot.configure
new file mode 100755
index 00000000..60de925b
--- /dev/null
+++ b/extensions/vdaboot.configure
@@ -0,0 +1,33 @@
+#!/bin/sh
+# Copyright (C) 2013,2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# Change the "/" mount point to /dev/vda to use virtio disks.
+
+set -e
+
+if [ "$OPENSTACK_USER" ]
+then
+ # Modifying fstab
+ if [ -f "$1/etc/fstab" ]
+ then
+ mv "$1/etc/fstab" "$1/etc/fstab.old"
+ awk 'BEGIN {print "/dev/vda / btrfs defaults,rw,noatime 0 1"};
+ $2 != "/" {print $0 };' "$1/etc/fstab.old" > "$1/etc/fstab"
+ rm "$1/etc/fstab.old"
+ else
+ echo "/dev/vda / btrfs defaults,rw,noatime 0 1"> "$1/etc/fstab"
+ fi
+fi
diff --git a/extensions/virtualbox-ssh.check b/extensions/virtualbox-ssh.check
new file mode 100755
index 00000000..a97f3294
--- /dev/null
+++ b/extensions/virtualbox-ssh.check
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+# Copyright (C) 2014-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+'''Preparatory checks for Morph 'virtualbox-ssh' write extension'''
+
+import cliapp
+
+import morphlib.writeexts
+
+
+class VirtualBoxPlusSshCheckExtension(morphlib.writeexts.WriteExtension):
+ def process_args(self, args):
+ if len(args) != 1:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ self.require_btrfs_in_deployment_host_kernel()
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if upgrade:
+ raise cliapp.AppException(
+ 'Use the `ssh-rsync` write extension to deploy upgrades to an '
+ 'existing remote system.')
+
+VirtualBoxPlusSshCheckExtension().run()
diff --git a/extensions/virtualbox-ssh.write b/extensions/virtualbox-ssh.write
new file mode 100755
index 00000000..774f2b4f
--- /dev/null
+++ b/extensions/virtualbox-ssh.write
@@ -0,0 +1,211 @@
+#!/usr/bin/python
+# Copyright (C) 2012-2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+'''A Morph deployment write extension for deploying to VirtualBox via ssh.
+
+VirtualBox is assumed to be running on a remote machine, which is
+accessed over ssh. The machine gets created, but not started.
+
+See file virtualbox-ssh.write.help for documentation
+
+'''
+
+
+import cliapp
+import os
+import re
+import sys
+import time
+import tempfile
+import urlparse
+
+import morphlib.writeexts
+
+
+class VirtualBoxPlusSshWriteExtension(morphlib.writeexts.WriteExtension):
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ temp_root, location = args
+ ssh_host, vm_name, vdi_path = self.parse_location(location)
+ autostart = self.get_environment_boolean('AUTOSTART')
+
+ vagrant = self.get_environment_boolean('VAGRANT')
+
+ fd, raw_disk = tempfile.mkstemp()
+ os.close(fd)
+ self.create_local_system(temp_root, raw_disk)
+
+ try:
+ self.transfer_and_convert_to_vdi(
+ raw_disk, ssh_host, vdi_path)
+ self.create_virtualbox_guest(ssh_host, vm_name, vdi_path,
+ autostart, vagrant)
+ except BaseException:
+ sys.stderr.write('Error deploying to VirtualBox')
+ os.remove(raw_disk)
+ cliapp.ssh_runcmd(ssh_host, ['rm', '-f', vdi_path])
+ raise
+ else:
+ os.remove(raw_disk)
+ self.status(
+ msg='Virtual machine %(vm_name)s has been created',
+ vm_name=vm_name)
+
+ def parse_location(self, location):
+ '''Parse the location argument to get relevant data.'''
+
+ x = urlparse.urlparse(location)
+ if x.scheme != 'vbox+ssh':
+ raise cliapp.AppException(
+ 'URL schema must be vbox+ssh in %s' % location)
+ m = re.match('^/(?P<guest>[^/]+)(?P<path>/.+)$', x.path)
+ if not m:
+ raise cliapp.AppException('Cannot parse location %s' % location)
+ return x.netloc, m.group('guest'), m.group('path')
+
+ def transfer_and_convert_to_vdi(self, raw_disk, ssh_host, vdi_path):
+ '''Transfer raw disk image to VirtualBox host, and convert to VDI.'''
+
+ self.status(msg='Transfer disk and convert to VDI')
+
+ st = os.lstat(raw_disk)
+ xfer_hole_path = morphlib.util.get_data_path('xfer-hole')
+ recv_hole = morphlib.util.get_data('recv-hole')
+
+ ssh_remote_cmd = [
+ 'sh', '-c', recv_hole,
+ 'dummy-argv0', 'vbox', vdi_path, str(st.st_size),
+ ]
+
+ cliapp.runcmd(
+ ['python', xfer_hole_path, raw_disk],
+ ['ssh', ssh_host] + map(cliapp.shell_quote, ssh_remote_cmd),
+ stdout=None, stderr=None)
+
+ def virtualbox_version(self, ssh_host):
+ 'Get the version number of the VirtualBox running on the remote host.'
+
+ # --version gives a build id, which looks something like
+ # 1.2.3r456789, so we need to strip the suffix off and get a tuple
+ # of the (major, minor, patch) version, since comparing with a
+ # tuple is more reliable than a string and more convenient than
+ # comparing against the major, minor and patch numbers directly
+ self.status(msg='Checking version of remote VirtualBox')
+ build_id = cliapp.ssh_runcmd(ssh_host, ['VBoxManage', '--version'])
+ version_string = re.match(r"^([0-9\.]+).*$", build_id.strip()).group(1)
+ return tuple(int(s or '0') for s in version_string.split('.'))
+
+ def create_virtualbox_guest(self, ssh_host, vm_name, vdi_path, autostart,
+ vagrant):
+ '''Create the VirtualBox virtual machine.'''
+
+ self.status(msg='Create VirtualBox virtual machine')
+
+ ram_mebibytes = str(self.get_ram_size() / (1024**2))
+
+ vcpu_count = str(self.get_vcpu_count())
+
+ if not vagrant:
+ hostonly_iface = self.get_host_interface(ssh_host)
+
+ if self.virtualbox_version(ssh_host) < (4, 3, 0):
+ sataportcount_option = '--sataportcount'
+ else:
+ sataportcount_option = '--portcount'
+
+ commands = [
+ ['createvm', '--name', vm_name, '--ostype', 'Linux26_64',
+ '--register'],
+ ['modifyvm', vm_name, '--ioapic', 'on',
+ '--memory', ram_mebibytes, '--cpus', vcpu_count],
+ ['storagectl', vm_name, '--name', 'SATA Controller',
+ '--add', 'sata', '--bootable', 'on', sataportcount_option, '2'],
+ ['storageattach', vm_name, '--storagectl', 'SATA Controller',
+ '--port', '0', '--device', '0', '--type', 'hdd', '--medium',
+ vdi_path],
+ ]
+ if vagrant:
+ commands[1].extend(['--nic1', 'nat',
+ '--natnet1', 'default'])
+ else:
+ commands[1].extend(['--nic1', 'hostonly',
+ '--hostonlyadapter1', hostonly_iface,
+ '--nic2', 'nat', '--natnet2', 'default'])
+
+ attach_disks = self.parse_attach_disks()
+ for device_no, disk in enumerate(attach_disks, 1):
+ cmd = ['storageattach', vm_name,
+ '--storagectl', 'SATA Controller',
+ '--port', str(device_no),
+ '--device', '0',
+ '--type', 'hdd',
+ '--medium', disk]
+ commands.append(cmd)
+
+ if autostart:
+ commands.append(['startvm', vm_name])
+
+ for command in commands:
+ argv = ['VBoxManage'] + command
+ cliapp.ssh_runcmd(ssh_host, argv)
+
+ def get_host_interface(self, ssh_host):
+ host_ipaddr = os.environ.get('HOST_IPADDR')
+ netmask = os.environ.get('NETMASK')
+
+ if host_ipaddr is None:
+ raise cliapp.AppException('HOST_IPADDR was not given')
+
+ if netmask is None:
+ raise cliapp.AppException('NETMASK was not given')
+
+ # 'VBoxManage list hostonlyifs' retrieves a list with the hostonly
+ # interfaces on the host. For each interface, the following lines
+ # are shown on top:
+ #
+ # Name: vboxnet0
+ # GUID: 786f6276-656e-4074-8000-0a0027000000
+ # Dhcp: Disabled
+ # IPAddress: 192.168.100.1
+ #
+ # The following command tries to retrieve the hostonly interface
+ # name (e.g. vboxnet0) associated with the given ip address.
+ iface = None
+ lines = cliapp.ssh_runcmd(ssh_host,
+ ['VBoxManage', 'list', 'hostonlyifs']).splitlines()
+ for i, v in enumerate(lines):
+ if host_ipaddr in v:
+ iface = lines[i-3].split()[1]
+ break
+
+ if iface is None:
+ iface = cliapp.ssh_runcmd(ssh_host,
+ ['VBoxManage', 'hostonlyif', 'create'])
+ # 'VBoxManage hostonlyif create' shows the name of the
+ # created hostonly interface inside single quotes
+ iface = iface[iface.find("'") + 1 : iface.rfind("'")]
+ cliapp.ssh_runcmd(ssh_host,
+ ['VBoxManage', 'hostonlyif',
+ 'ipconfig', iface,
+ '--ip', host_ipaddr,
+ '--netmask', netmask])
+
+ return iface
+
+VirtualBoxPlusSshWriteExtension().run()
diff --git a/extensions/virtualbox-ssh.write.help b/extensions/virtualbox-ssh.write.help
new file mode 100644
index 00000000..2dbf988c
--- /dev/null
+++ b/extensions/virtualbox-ssh.write.help
@@ -0,0 +1,135 @@
+# Copyright (C) 2014, 2015 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+help: |
+
+ Deploy a Baserock system as a *new* VirtualBox virtual machine.
+ (Use the `ssh-rsync` write extension to deploy upgrades to an *existing*
+ VM)
+
+ Connects to HOST via ssh to run VirtualBox's command line management tools.
+
+ Parameters:
+
+ * location: a custom URL scheme of the form `vbox+ssh://HOST/GUEST/PATH`,
+ where:
+ * HOST is the name of the host on which VirtualBox is running
+ * GUEST is the name of the guest VM on that host
+ * PATH is the path to the disk image that should be created,
+ on that host. For example,
+ `vbox+ssh://alice@192.168.122.1/testsys/home/alice/testys.img` where
+ * `alice@192.168.122.1` is the target host as given to ssh,
+ **from within the development host** (which may be
+ different from the target host's normal address);
+ * `testsys` is the name of the new guest VM';
+ * `/home/alice/testys.img` is the pathname of the disk image files
+ on the target host.
+
+ * HOSTNAME=name: the hostname of the **guest** VM within the network into
+ which it is being deployed.
+
+ * DISK_SIZE=X: **(MANDATORY)** the size of the VM's primary virtual hard
+ disk. `X` should use a suffix of `K`, `M`, or `G` (in upper or lower
+ case) to indicate kilo-, mega-, or gigabytes. For example,
+ `DISK_SIZE=100G` would create a 100 gigabyte virtual hard disk.
+
+ * RAM_SIZE=X: The amount of RAM that the virtual machine should allocate
+ for itself from the host. `X` is interpreted in the same as for
+ DISK_SIZE, and defaults to `1G`.
+
+ * VCPUS=n: the number of virtual CPUs for the VM. Allowed values 1-32. Do
+ not use more CPU cores than you have available physically (real cores,
+ no hyperthreads).
+
+ * INITRAMFS_PATH=path: the location of an initramfs for the bootloader to
+ tell Linux to use, rather than booting the rootfs directly.
+
+ * DTB_PATH=path: **(MANDATORY)** for systems that require a device tree
+ binary - Give the full path (without a leading /) to the location of the
+ DTB in the built system image . The deployment will fail if `path` does
+ not exist.
+
+ * BOOTLOADER_INSTALL=value: the bootloader to be installed
+ **(MANDATORY)** for non-x86 systems
+
+ allowed values =
+ - 'extlinux' (default) - the extlinux bootloader will
+ be installed
+ - 'none' - no bootloader will be installed by `morph deploy`. A
+ bootloader must be installed manually. This value must be used when
+ deploying non-x86 systems such as ARM.
+
+ * BOOTLOADER_CONFIG_FORMAT=value: the bootloader format to be used.
+ If not specified for x86-32 and x86-64 systems, 'extlinux' will be used
+
+ allowed values =
+ - 'extlinux'
+
+ * KERNEL_ARGS=args: optional additional kernel command-line parameters to
+ be appended to the default set. The default set is:
+
+ 'rw init=/sbin/init rootfstype=btrfs \
+ rootflags=subvol=systems/default/run \
+ root=[name or UUID of root filesystem]'
+
+ (See https://www.kernel.org/doc/Documentation/kernel-parameters.txt)
+
+ * AUTOSTART=<VALUE> - boolean. If it is set, the VM will be started when
+ it has been deployed.
+
+ * VAGRANT=<VALUE> - boolean. If it is set, then networking is configured
+ so that the VM will work with Vagrant. Otherwise networking is
+ configured to run directly in VirtualBox.
+
+ * HOST_IPADDR=<ip_address> - the IP address of the VM host.
+
+ * NETMASK=<netmask> - the netmask of the VM host.
+
+ * NETWORK_CONFIG=<net_config> - `net_config` is used to set up the VM's
+ network interfaces. It is a string containing semi-colon separated
+ 'stanzas' where each stanza provides information about a network
+ interface. Each stanza is of the form name:type[,arg=value] e.g.
+
+ lo:loopback
+ eth0:dhcp
+ eth1:static,address=10.0.0.1,netmask=255.255.0.0
+
+ An example of the NETWORK_CONFIG parameter (It should be in one line)
+
+ `"lo:loopback;eth0:static,address=192.168.100.2,netmask=255.255.255.0;
+ eth1:dhcp,hostname=$(hostname)"`
+
+ It is useful to configure one interface to use NAT to give the VM access
+ to the outside world and another interface to use the Virtual Box host
+ adapter to allow you to access the Trove from the host machine.
+
+ The NAT interface eth1 is set up to use dhcp, the host-only adapter
+ interface is configured statically.
+
+ Note: you must give the host-only adapter interface an address that lies
+ **on the same network** as the host adapter. So if the host adapter has
+ an IP of 192.168.100.1 eth0 should have an address such as
+ 192.168.100.42.
+
+ The settings of the host adapter, including its IP can be changed either
+ in the VirtualBox manager UI
+ (https://www.virtualbox.org/manual/ch03.html#settings-network)
+ or via the VBoxManage command line
+ (https://www.virtualbox.org/manual/ch08.html#idp57572192)
+
+ See Chapter 6 of the VirtualBox User Manual for more information about
+ virtual networking (https://www.virtualbox.org/manual/ch06.html)
+
+ (See `morph help deploy` for details of how to pass parameters to write
+ extensions)
diff --git a/chef/manifest b/install-files/chef/manifest
index de6cc542..de6cc542 100644
--- a/chef/manifest
+++ b/install-files/chef/manifest
diff --git a/distbuild/lib/systemd/system-generators/ccache-nfs-mount-generator b/install-files/distbuild/lib/systemd/system-generators/ccache-nfs-mount-generator
index 127bc84f..127bc84f 100755
--- a/distbuild/lib/systemd/system-generators/ccache-nfs-mount-generator
+++ b/install-files/distbuild/lib/systemd/system-generators/ccache-nfs-mount-generator
diff --git a/distbuild/manifest b/install-files/distbuild/manifest
index 9363fa85..9363fa85 100644
--- a/distbuild/manifest
+++ b/install-files/distbuild/manifest
diff --git a/distbuild/usr/lib/distbuild-setup/ansible/distbuild-setup.yml b/install-files/distbuild/usr/lib/distbuild-setup/ansible/distbuild-setup.yml
index c3074c63..c3074c63 100644
--- a/distbuild/usr/lib/distbuild-setup/ansible/distbuild-setup.yml
+++ b/install-files/distbuild/usr/lib/distbuild-setup/ansible/distbuild-setup.yml
diff --git a/mason/ansible/hosts b/install-files/distbuild/usr/lib/distbuild-setup/ansible/hosts
index 5b97818d..5b97818d 100644
--- a/mason/ansible/hosts
+++ b/install-files/distbuild/usr/lib/distbuild-setup/ansible/hosts
diff --git a/distbuild/usr/lib/systemd/system/distbuild-setup.service b/install-files/distbuild/usr/lib/systemd/system/distbuild-setup.service
index ec5f5a2d..ec5f5a2d 100644
--- a/distbuild/usr/lib/systemd/system/distbuild-setup.service
+++ b/install-files/distbuild/usr/lib/systemd/system/distbuild-setup.service
diff --git a/distbuild/usr/lib/systemd/system/morph-cache-server.service b/install-files/distbuild/usr/lib/systemd/system/morph-cache-server.service
index f55f3b6d..f55f3b6d 100644
--- a/distbuild/usr/lib/systemd/system/morph-cache-server.service
+++ b/install-files/distbuild/usr/lib/systemd/system/morph-cache-server.service
diff --git a/distbuild/usr/lib/systemd/system/morph-controller-helper.service b/install-files/distbuild/usr/lib/systemd/system/morph-controller-helper.service
index 3f30cbcf..3f30cbcf 100644
--- a/distbuild/usr/lib/systemd/system/morph-controller-helper.service
+++ b/install-files/distbuild/usr/lib/systemd/system/morph-controller-helper.service
diff --git a/distbuild/usr/lib/systemd/system/morph-controller.service b/install-files/distbuild/usr/lib/systemd/system/morph-controller.service
index 1556d232..1556d232 100644
--- a/distbuild/usr/lib/systemd/system/morph-controller.service
+++ b/install-files/distbuild/usr/lib/systemd/system/morph-controller.service
diff --git a/distbuild/usr/lib/systemd/system/morph-worker-helper.service b/install-files/distbuild/usr/lib/systemd/system/morph-worker-helper.service
index 28400701..28400701 100644
--- a/distbuild/usr/lib/systemd/system/morph-worker-helper.service
+++ b/install-files/distbuild/usr/lib/systemd/system/morph-worker-helper.service
diff --git a/distbuild/usr/lib/systemd/system/morph-worker.service b/install-files/distbuild/usr/lib/systemd/system/morph-worker.service
index 90fea404..90fea404 100644
--- a/distbuild/usr/lib/systemd/system/morph-worker.service
+++ b/install-files/distbuild/usr/lib/systemd/system/morph-worker.service
diff --git a/distbuild/usr/lib/systemd/system/multi-user.target.wants/distbuild-setup.service b/install-files/distbuild/usr/lib/systemd/system/multi-user.target.wants/distbuild-setup.service
index 8f06febd..8f06febd 120000
--- a/distbuild/usr/lib/systemd/system/multi-user.target.wants/distbuild-setup.service
+++ b/install-files/distbuild/usr/lib/systemd/system/multi-user.target.wants/distbuild-setup.service
diff --git a/distbuild/usr/share/distbuild-setup/morph-cache-server.conf b/install-files/distbuild/usr/share/distbuild-setup/morph-cache-server.conf
index b9020e7d..b9020e7d 100644
--- a/distbuild/usr/share/distbuild-setup/morph-cache-server.conf
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph-cache-server.conf
diff --git a/distbuild/usr/share/distbuild-setup/morph-controller-helper.conf b/install-files/distbuild/usr/share/distbuild-setup/morph-controller-helper.conf
index 99d38739..99d38739 100644
--- a/distbuild/usr/share/distbuild-setup/morph-controller-helper.conf
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph-controller-helper.conf
diff --git a/distbuild/usr/share/distbuild-setup/morph-controller.conf b/install-files/distbuild/usr/share/distbuild-setup/morph-controller.conf
index c16c0343..c16c0343 100644
--- a/distbuild/usr/share/distbuild-setup/morph-controller.conf
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph-controller.conf
diff --git a/distbuild/usr/share/distbuild-setup/morph-worker-helper.conf b/install-files/distbuild/usr/share/distbuild-setup/morph-worker-helper.conf
index 29d4ef3f..29d4ef3f 100644
--- a/distbuild/usr/share/distbuild-setup/morph-worker-helper.conf
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph-worker-helper.conf
diff --git a/distbuild/usr/share/distbuild-setup/morph-worker.conf b/install-files/distbuild/usr/share/distbuild-setup/morph-worker.conf
index fb382bad..fb382bad 100644
--- a/distbuild/usr/share/distbuild-setup/morph-worker.conf
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph-worker.conf
diff --git a/distbuild/usr/share/distbuild-setup/morph.conf b/install-files/distbuild/usr/share/distbuild-setup/morph.conf
index 29de684c..29de684c 100644
--- a/distbuild/usr/share/distbuild-setup/morph.conf
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph.conf
diff --git a/essential-files/etc/inputrc b/install-files/essential-files/etc/inputrc
index ddee44cd..ddee44cd 100644
--- a/essential-files/etc/inputrc
+++ b/install-files/essential-files/etc/inputrc
diff --git a/essential-files/etc/os-release b/install-files/essential-files/etc/os-release
index b729c75f..b729c75f 100644
--- a/essential-files/etc/os-release
+++ b/install-files/essential-files/etc/os-release
diff --git a/essential-files/etc/profile b/install-files/essential-files/etc/profile
index b306a132..b306a132 100644
--- a/essential-files/etc/profile
+++ b/install-files/essential-files/etc/profile
diff --git a/essential-files/manifest b/install-files/essential-files/manifest
index 2b77c237..2b77c237 100644
--- a/essential-files/manifest
+++ b/install-files/essential-files/manifest
diff --git a/essential-files/usr/lib/tmpfiles.d/shutdownramfs.conf b/install-files/essential-files/usr/lib/tmpfiles.d/shutdownramfs.conf
index 174f1f03..174f1f03 100644
--- a/essential-files/usr/lib/tmpfiles.d/shutdownramfs.conf
+++ b/install-files/essential-files/usr/lib/tmpfiles.d/shutdownramfs.conf
diff --git a/genivi-devel-system-armv7/etc/morph.conf b/install-files/genivi-devel-system-armv7/etc/morph.conf
index 8f384049..8f384049 120000
--- a/genivi-devel-system-armv7/etc/morph.conf
+++ b/install-files/genivi-devel-system-armv7/etc/morph.conf
diff --git a/genivi-devel-system-armv7/manifest b/install-files/genivi-devel-system-armv7/manifest
index 31980633..31980633 100644
--- a/genivi-devel-system-armv7/manifest
+++ b/install-files/genivi-devel-system-armv7/manifest
diff --git a/genivi-devel-system-armv7/src/morph.conf b/install-files/genivi-devel-system-armv7/src/morph.conf
index 76b6fde9..76b6fde9 100644
--- a/genivi-devel-system-armv7/src/morph.conf
+++ b/install-files/genivi-devel-system-armv7/src/morph.conf
diff --git a/moonshot/boot/m400-1003.dtb b/install-files/moonshot/boot/m400-1003.dtb
index d6fd83ee..d6fd83ee 100644
--- a/moonshot/boot/m400-1003.dtb
+++ b/install-files/moonshot/boot/m400-1003.dtb
Binary files differ
diff --git a/moonshot/manifest b/install-files/moonshot/manifest
index dd80fe49..dd80fe49 100644
--- a/moonshot/manifest
+++ b/install-files/moonshot/manifest
diff --git a/openstack/etc/horizon/apache-horizon.conf b/install-files/openstack/etc/horizon/apache-horizon.conf
index ea88897a..ea88897a 100644
--- a/openstack/etc/horizon/apache-horizon.conf
+++ b/install-files/openstack/etc/horizon/apache-horizon.conf
diff --git a/openstack/etc/horizon/openstack_dashboard/local_settings.py b/install-files/openstack/etc/horizon/openstack_dashboard/local_settings.py
index febc3e70..febc3e70 100644
--- a/openstack/etc/horizon/openstack_dashboard/local_settings.py
+++ b/install-files/openstack/etc/horizon/openstack_dashboard/local_settings.py
diff --git a/openstack/etc/tempest/tempest.conf b/install-files/openstack/etc/tempest/tempest.conf
index 05f0eca1..05f0eca1 100644
--- a/openstack/etc/tempest/tempest.conf
+++ b/install-files/openstack/etc/tempest/tempest.conf
diff --git a/openstack/manifest b/install-files/openstack/manifest
index aa4d5430..aa4d5430 100644
--- a/openstack/manifest
+++ b/install-files/openstack/manifest
diff --git a/openstack/usr/lib/sysctl.d/neutron.conf b/install-files/openstack/usr/lib/sysctl.d/neutron.conf
index 644ca116..644ca116 100644
--- a/openstack/usr/lib/sysctl.d/neutron.conf
+++ b/install-files/openstack/usr/lib/sysctl.d/neutron.conf
diff --git a/openstack/usr/lib/systemd/system/apache-httpd.service b/install-files/openstack/usr/lib/systemd/system/apache-httpd.service
index e2a840c6..e2a840c6 100644
--- a/openstack/usr/lib/systemd/system/apache-httpd.service
+++ b/install-files/openstack/usr/lib/systemd/system/apache-httpd.service
diff --git a/openstack/usr/lib/systemd/system/iscsi-setup.service b/install-files/openstack/usr/lib/systemd/system/iscsi-setup.service
index 4cb10045..4cb10045 100644
--- a/openstack/usr/lib/systemd/system/iscsi-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/iscsi-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-evaluator.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-evaluator.service
index 6e3ada59..6e3ada59 100644
--- a/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-evaluator.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-evaluator.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-notifier.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-notifier.service
index 7a3e1c91..7a3e1c91 100644
--- a/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-notifier.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-notifier.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ceilometer-api.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-api.service
index eb0293bf..eb0293bf 100644
--- a/openstack/usr/lib/systemd/system/openstack-ceilometer-api.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-api.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ceilometer-central.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-central.service
index a1bc11ee..a1bc11ee 100644
--- a/openstack/usr/lib/systemd/system/openstack-ceilometer-central.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-central.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ceilometer-collector.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-collector.service
index dafc3ac7..dafc3ac7 100644
--- a/openstack/usr/lib/systemd/system/openstack-ceilometer-collector.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-collector.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ceilometer-compute.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-compute.service
index 9fe8a1e6..9fe8a1e6 100644
--- a/openstack/usr/lib/systemd/system/openstack-ceilometer-compute.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-compute.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ceilometer-config-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-config-setup.service
index c3e809d7..c3e809d7 100644
--- a/openstack/usr/lib/systemd/system/openstack-ceilometer-config-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-config-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ceilometer-db-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-db-setup.service
index 7a785227..7a785227 100644
--- a/openstack/usr/lib/systemd/system/openstack-ceilometer-db-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-db-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ceilometer-notification.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-notification.service
index 6696116e..6696116e 100644
--- a/openstack/usr/lib/systemd/system/openstack-ceilometer-notification.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-notification.service
diff --git a/openstack/usr/lib/systemd/system/openstack-cinder-api.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-api.service
index a284f31d..a284f31d 100644
--- a/openstack/usr/lib/systemd/system/openstack-cinder-api.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-api.service
diff --git a/openstack/usr/lib/systemd/system/openstack-cinder-backup.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-backup.service
index c14e13aa..c14e13aa 100644
--- a/openstack/usr/lib/systemd/system/openstack-cinder-backup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-backup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-cinder-config-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-config-setup.service
index 1c966933..1c966933 100644
--- a/openstack/usr/lib/systemd/system/openstack-cinder-config-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-config-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-cinder-db-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-db-setup.service
index a3c66d67..a3c66d67 100644
--- a/openstack/usr/lib/systemd/system/openstack-cinder-db-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-db-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-cinder-lv-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-lv-setup.service
index 82e9b08d..82e9b08d 100644
--- a/openstack/usr/lib/systemd/system/openstack-cinder-lv-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-lv-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-cinder-scheduler.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-scheduler.service
index f205aaff..f205aaff 100644
--- a/openstack/usr/lib/systemd/system/openstack-cinder-scheduler.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-scheduler.service
diff --git a/openstack/usr/lib/systemd/system/openstack-cinder-volume.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-volume.service
index c56ee693..c56ee693 100644
--- a/openstack/usr/lib/systemd/system/openstack-cinder-volume.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-volume.service
diff --git a/openstack/usr/lib/systemd/system/openstack-glance-api.service b/install-files/openstack/usr/lib/systemd/system/openstack-glance-api.service
index 4c34ff10..4c34ff10 100644
--- a/openstack/usr/lib/systemd/system/openstack-glance-api.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-glance-api.service
diff --git a/openstack/usr/lib/systemd/system/openstack-glance-registry.service b/install-files/openstack/usr/lib/systemd/system/openstack-glance-registry.service
index d53c8b33..d53c8b33 100644
--- a/openstack/usr/lib/systemd/system/openstack-glance-registry.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-glance-registry.service
diff --git a/openstack/usr/lib/systemd/system/openstack-glance-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-glance-setup.service
index 43810797..43810797 100644
--- a/openstack/usr/lib/systemd/system/openstack-glance-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-glance-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-horizon-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-horizon-setup.service
index 9ec3197a..9ec3197a 100644
--- a/openstack/usr/lib/systemd/system/openstack-horizon-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-horizon-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ironic-api.service b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-api.service
index 5a286a95..5a286a95 100644
--- a/openstack/usr/lib/systemd/system/openstack-ironic-api.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-api.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ironic-conductor.service b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-conductor.service
index b3b226e0..b3b226e0 100644
--- a/openstack/usr/lib/systemd/system/openstack-ironic-conductor.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-conductor.service
diff --git a/openstack/usr/lib/systemd/system/openstack-ironic-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-setup.service
index e3a58eb5..e3a58eb5 100644
--- a/openstack/usr/lib/systemd/system/openstack-ironic-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-keystone-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-keystone-setup.service
index db9d0b2b..db9d0b2b 100644
--- a/openstack/usr/lib/systemd/system/openstack-keystone-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-keystone-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-keystone.service b/install-files/openstack/usr/lib/systemd/system/openstack-keystone.service
index 6f6ff644..6f6ff644 100644
--- a/openstack/usr/lib/systemd/system/openstack-keystone.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-keystone.service
diff --git a/openstack/usr/lib/systemd/system/openstack-network-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-network-setup.service
index 021370d9..021370d9 100644
--- a/openstack/usr/lib/systemd/system/openstack-network-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-network-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-neutron-config-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-config-setup.service
index b74f44ab..b74f44ab 100644
--- a/openstack/usr/lib/systemd/system/openstack-neutron-config-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-config-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-neutron-db-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-db-setup.service
index 5d07da2e..5d07da2e 100644
--- a/openstack/usr/lib/systemd/system/openstack-neutron-db-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-db-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-neutron-dhcp-agent.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-dhcp-agent.service
index 9080f3c1..9080f3c1 100644
--- a/openstack/usr/lib/systemd/system/openstack-neutron-dhcp-agent.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-dhcp-agent.service
diff --git a/openstack/usr/lib/systemd/system/openstack-neutron-l3-agent.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-l3-agent.service
index 76efea5c..76efea5c 100644
--- a/openstack/usr/lib/systemd/system/openstack-neutron-l3-agent.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-l3-agent.service
diff --git a/openstack/usr/lib/systemd/system/openstack-neutron-metadata-agent.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-metadata-agent.service
index 20540e4c..20540e4c 100644
--- a/openstack/usr/lib/systemd/system/openstack-neutron-metadata-agent.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-metadata-agent.service
diff --git a/openstack/usr/lib/systemd/system/openstack-neutron-ovs-cleanup.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-ovs-cleanup.service
index f5709028..f5709028 100644
--- a/openstack/usr/lib/systemd/system/openstack-neutron-ovs-cleanup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-ovs-cleanup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-neutron-plugin-openvswitch-agent.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-plugin-openvswitch-agent.service
index 6c579a62..6c579a62 100644
--- a/openstack/usr/lib/systemd/system/openstack-neutron-plugin-openvswitch-agent.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-plugin-openvswitch-agent.service
diff --git a/openstack/usr/lib/systemd/system/openstack-neutron-server.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-server.service
index 6376c3d8..6376c3d8 100644
--- a/openstack/usr/lib/systemd/system/openstack-neutron-server.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-server.service
diff --git a/openstack/usr/lib/systemd/system/openstack-nova-api.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-api.service
index 521353db..521353db 100644
--- a/openstack/usr/lib/systemd/system/openstack-nova-api.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-api.service
diff --git a/openstack/usr/lib/systemd/system/openstack-nova-cert.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-cert.service
index b3733816..b3733816 100644
--- a/openstack/usr/lib/systemd/system/openstack-nova-cert.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-cert.service
diff --git a/openstack/usr/lib/systemd/system/openstack-nova-compute.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-compute.service
index 4f9b8196..4f9b8196 100644
--- a/openstack/usr/lib/systemd/system/openstack-nova-compute.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-compute.service
diff --git a/openstack/usr/lib/systemd/system/openstack-nova-conductor.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-conductor.service
index 4c0d7d43..4c0d7d43 100644
--- a/openstack/usr/lib/systemd/system/openstack-nova-conductor.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-conductor.service
diff --git a/openstack/usr/lib/systemd/system/openstack-nova-config-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-config-setup.service
index df669aa9..df669aa9 100644
--- a/openstack/usr/lib/systemd/system/openstack-nova-config-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-config-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-nova-consoleauth.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-consoleauth.service
index e22780a9..e22780a9 100644
--- a/openstack/usr/lib/systemd/system/openstack-nova-consoleauth.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-consoleauth.service
diff --git a/openstack/usr/lib/systemd/system/openstack-nova-db-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-db-setup.service
index 8e004327..8e004327 100644
--- a/openstack/usr/lib/systemd/system/openstack-nova-db-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-db-setup.service
diff --git a/openstack/usr/lib/systemd/system/openstack-nova-novncproxy.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-novncproxy.service
index 8cbb20fd..8cbb20fd 100644
--- a/openstack/usr/lib/systemd/system/openstack-nova-novncproxy.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-novncproxy.service
diff --git a/openstack/usr/lib/systemd/system/openstack-nova-scheduler.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-scheduler.service
index e89f0d3e..e89f0d3e 100644
--- a/openstack/usr/lib/systemd/system/openstack-nova-scheduler.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-scheduler.service
diff --git a/openstack/usr/lib/systemd/system/openstack-nova-serialproxy.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-serialproxy.service
index 30af8305..30af8305 100644
--- a/openstack/usr/lib/systemd/system/openstack-nova-serialproxy.service
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-serialproxy.service
diff --git a/openstack/usr/lib/systemd/system/openvswitch-db-server.service b/install-files/openstack/usr/lib/systemd/system/openvswitch-db-server.service
index 34a7c812..34a7c812 100644
--- a/openstack/usr/lib/systemd/system/openvswitch-db-server.service
+++ b/install-files/openstack/usr/lib/systemd/system/openvswitch-db-server.service
diff --git a/openstack/usr/lib/systemd/system/openvswitch-setup.service b/install-files/openstack/usr/lib/systemd/system/openvswitch-setup.service
index 8393ebbc..8393ebbc 100644
--- a/openstack/usr/lib/systemd/system/openvswitch-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/openvswitch-setup.service
diff --git a/openstack/usr/lib/systemd/system/openvswitch.service b/install-files/openstack/usr/lib/systemd/system/openvswitch.service
index 113911f6..113911f6 100644
--- a/openstack/usr/lib/systemd/system/openvswitch.service
+++ b/install-files/openstack/usr/lib/systemd/system/openvswitch.service
diff --git a/openstack/usr/lib/systemd/system/postgres-server-setup.service b/install-files/openstack/usr/lib/systemd/system/postgres-server-setup.service
index 202c0636..202c0636 100644
--- a/openstack/usr/lib/systemd/system/postgres-server-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/postgres-server-setup.service
diff --git a/openstack/usr/lib/systemd/system/postgres-server.service b/install-files/openstack/usr/lib/systemd/system/postgres-server.service
index 9e11f26d..9e11f26d 100644
--- a/openstack/usr/lib/systemd/system/postgres-server.service
+++ b/install-files/openstack/usr/lib/systemd/system/postgres-server.service
diff --git a/openstack/usr/lib/systemd/system/rabbitmq-server.service b/install-files/openstack/usr/lib/systemd/system/rabbitmq-server.service
index 1a20f3e4..1a20f3e4 100644
--- a/openstack/usr/lib/systemd/system/rabbitmq-server.service
+++ b/install-files/openstack/usr/lib/systemd/system/rabbitmq-server.service
diff --git a/openstack/usr/lib/systemd/system/swift-controller-setup.service b/install-files/openstack/usr/lib/systemd/system/swift-controller-setup.service
index ccfbcbe6..ccfbcbe6 100644
--- a/openstack/usr/lib/systemd/system/swift-controller-setup.service
+++ b/install-files/openstack/usr/lib/systemd/system/swift-controller-setup.service
diff --git a/openstack/usr/lib/systemd/system/swift-proxy.service b/install-files/openstack/usr/lib/systemd/system/swift-proxy.service
index 7b0a2e17..7b0a2e17 100644
--- a/openstack/usr/lib/systemd/system/swift-proxy.service
+++ b/install-files/openstack/usr/lib/systemd/system/swift-proxy.service
diff --git a/openstack/usr/share/openstack/ceilometer-config.yml b/install-files/openstack/usr/share/openstack/ceilometer-config.yml
index 9850d84d..9850d84d 100644
--- a/openstack/usr/share/openstack/ceilometer-config.yml
+++ b/install-files/openstack/usr/share/openstack/ceilometer-config.yml
diff --git a/openstack/usr/share/openstack/ceilometer-db.yml b/install-files/openstack/usr/share/openstack/ceilometer-db.yml
index 717c7d7d..717c7d7d 100644
--- a/openstack/usr/share/openstack/ceilometer-db.yml
+++ b/install-files/openstack/usr/share/openstack/ceilometer-db.yml
diff --git a/openstack/usr/share/openstack/ceilometer/ceilometer.conf b/install-files/openstack/usr/share/openstack/ceilometer/ceilometer.conf
index b572d40f..b572d40f 100644
--- a/openstack/usr/share/openstack/ceilometer/ceilometer.conf
+++ b/install-files/openstack/usr/share/openstack/ceilometer/ceilometer.conf
diff --git a/openstack/usr/share/openstack/cinder-config.yml b/install-files/openstack/usr/share/openstack/cinder-config.yml
index fd3e2cd0..fd3e2cd0 100644
--- a/openstack/usr/share/openstack/cinder-config.yml
+++ b/install-files/openstack/usr/share/openstack/cinder-config.yml
diff --git a/openstack/usr/share/openstack/cinder-db.yml b/install-files/openstack/usr/share/openstack/cinder-db.yml
index 2a211720..2a211720 100644
--- a/openstack/usr/share/openstack/cinder-db.yml
+++ b/install-files/openstack/usr/share/openstack/cinder-db.yml
diff --git a/openstack/usr/share/openstack/cinder-lvs.yml b/install-files/openstack/usr/share/openstack/cinder-lvs.yml
index 7a91a306..7a91a306 100644
--- a/openstack/usr/share/openstack/cinder-lvs.yml
+++ b/install-files/openstack/usr/share/openstack/cinder-lvs.yml
diff --git a/openstack/usr/share/openstack/cinder/api-paste.ini b/install-files/openstack/usr/share/openstack/cinder/api-paste.ini
index ba922d5f..ba922d5f 100644
--- a/openstack/usr/share/openstack/cinder/api-paste.ini
+++ b/install-files/openstack/usr/share/openstack/cinder/api-paste.ini
diff --git a/openstack/usr/share/openstack/cinder/cinder.conf b/install-files/openstack/usr/share/openstack/cinder/cinder.conf
index a58004b5..a58004b5 100644
--- a/openstack/usr/share/openstack/cinder/cinder.conf
+++ b/install-files/openstack/usr/share/openstack/cinder/cinder.conf
diff --git a/openstack/usr/share/openstack/cinder/policy.json b/install-files/openstack/usr/share/openstack/cinder/policy.json
index 8f3a7b2f..8f3a7b2f 100644
--- a/openstack/usr/share/openstack/cinder/policy.json
+++ b/install-files/openstack/usr/share/openstack/cinder/policy.json
diff --git a/openstack/usr/share/openstack/extras/00-disable-device.network b/install-files/openstack/usr/share/openstack/extras/00-disable-device.network
index 8e2532d0..8e2532d0 100644
--- a/openstack/usr/share/openstack/extras/00-disable-device.network
+++ b/install-files/openstack/usr/share/openstack/extras/00-disable-device.network
diff --git a/openstack/usr/share/openstack/extras/60-device-dhcp.network b/install-files/openstack/usr/share/openstack/extras/60-device-dhcp.network
index 6fdbfd8d..6fdbfd8d 100644
--- a/openstack/usr/share/openstack/extras/60-device-dhcp.network
+++ b/install-files/openstack/usr/share/openstack/extras/60-device-dhcp.network
diff --git a/openstack/usr/share/openstack/glance.yml b/install-files/openstack/usr/share/openstack/glance.yml
index aa7e4c78..aa7e4c78 100644
--- a/openstack/usr/share/openstack/glance.yml
+++ b/install-files/openstack/usr/share/openstack/glance.yml
diff --git a/openstack/usr/share/openstack/glance/glance-api-paste.ini b/install-files/openstack/usr/share/openstack/glance/glance-api-paste.ini
index 86a4cdb1..86a4cdb1 100644
--- a/openstack/usr/share/openstack/glance/glance-api-paste.ini
+++ b/install-files/openstack/usr/share/openstack/glance/glance-api-paste.ini
diff --git a/openstack/usr/share/openstack/glance/glance-api.conf b/install-files/openstack/usr/share/openstack/glance/glance-api.conf
index 39257a6d..39257a6d 100644
--- a/openstack/usr/share/openstack/glance/glance-api.conf
+++ b/install-files/openstack/usr/share/openstack/glance/glance-api.conf
diff --git a/openstack/usr/share/openstack/glance/glance-cache.conf b/install-files/openstack/usr/share/openstack/glance/glance-cache.conf
index 3f2d4603..3f2d4603 100644
--- a/openstack/usr/share/openstack/glance/glance-cache.conf
+++ b/install-files/openstack/usr/share/openstack/glance/glance-cache.conf
diff --git a/openstack/usr/share/openstack/glance/glance-registry-paste.ini b/install-files/openstack/usr/share/openstack/glance/glance-registry-paste.ini
index df403f6e..df403f6e 100644
--- a/openstack/usr/share/openstack/glance/glance-registry-paste.ini
+++ b/install-files/openstack/usr/share/openstack/glance/glance-registry-paste.ini
diff --git a/openstack/usr/share/openstack/glance/glance-registry.conf b/install-files/openstack/usr/share/openstack/glance/glance-registry.conf
index 302f4138..302f4138 100644
--- a/openstack/usr/share/openstack/glance/glance-registry.conf
+++ b/install-files/openstack/usr/share/openstack/glance/glance-registry.conf
diff --git a/openstack/usr/share/openstack/glance/glance-scrubber.conf b/install-files/openstack/usr/share/openstack/glance/glance-scrubber.conf
index cdbfda71..cdbfda71 100644
--- a/openstack/usr/share/openstack/glance/glance-scrubber.conf
+++ b/install-files/openstack/usr/share/openstack/glance/glance-scrubber.conf
diff --git a/openstack/usr/share/openstack/glance/logging.conf b/install-files/openstack/usr/share/openstack/glance/logging.conf
index 7e7f31f0..7e7f31f0 100644
--- a/openstack/usr/share/openstack/glance/logging.conf
+++ b/install-files/openstack/usr/share/openstack/glance/logging.conf
diff --git a/openstack/usr/share/openstack/glance/policy.json b/install-files/openstack/usr/share/openstack/glance/policy.json
index 325f00b2..325f00b2 100644
--- a/openstack/usr/share/openstack/glance/policy.json
+++ b/install-files/openstack/usr/share/openstack/glance/policy.json
diff --git a/openstack/usr/share/openstack/glance/schema-image.json b/install-files/openstack/usr/share/openstack/glance/schema-image.json
index 5aafd6b3..5aafd6b3 100644
--- a/openstack/usr/share/openstack/glance/schema-image.json
+++ b/install-files/openstack/usr/share/openstack/glance/schema-image.json
diff --git a/openstack/usr/share/openstack/horizon.yml b/install-files/openstack/usr/share/openstack/horizon.yml
index 14cea5c5..14cea5c5 100644
--- a/openstack/usr/share/openstack/horizon.yml
+++ b/install-files/openstack/usr/share/openstack/horizon.yml
diff --git a/openstack/usr/share/openstack/hosts b/install-files/openstack/usr/share/openstack/hosts
index 5b97818d..5b97818d 100644
--- a/openstack/usr/share/openstack/hosts
+++ b/install-files/openstack/usr/share/openstack/hosts
diff --git a/openstack/usr/share/openstack/ironic.yml b/install-files/openstack/usr/share/openstack/ironic.yml
index db0a8aa8..db0a8aa8 100644
--- a/openstack/usr/share/openstack/ironic.yml
+++ b/install-files/openstack/usr/share/openstack/ironic.yml
diff --git a/openstack/usr/share/openstack/ironic/ironic.conf b/install-files/openstack/usr/share/openstack/ironic/ironic.conf
index 75c62b8e..75c62b8e 100644
--- a/openstack/usr/share/openstack/ironic/ironic.conf
+++ b/install-files/openstack/usr/share/openstack/ironic/ironic.conf
diff --git a/openstack/usr/share/openstack/ironic/policy.json b/install-files/openstack/usr/share/openstack/ironic/policy.json
index 94ac3a5b..94ac3a5b 100644
--- a/openstack/usr/share/openstack/ironic/policy.json
+++ b/install-files/openstack/usr/share/openstack/ironic/policy.json
diff --git a/openstack/usr/share/openstack/iscsi.yml b/install-files/openstack/usr/share/openstack/iscsi.yml
index b80377ae..b80377ae 100644
--- a/openstack/usr/share/openstack/iscsi.yml
+++ b/install-files/openstack/usr/share/openstack/iscsi.yml
diff --git a/openstack/usr/share/openstack/keystone.yml b/install-files/openstack/usr/share/openstack/keystone.yml
index 330d74d0..330d74d0 100644
--- a/openstack/usr/share/openstack/keystone.yml
+++ b/install-files/openstack/usr/share/openstack/keystone.yml
diff --git a/openstack/usr/share/openstack/keystone/keystone-paste.ini b/install-files/openstack/usr/share/openstack/keystone/keystone-paste.ini
index 46f994c3..46f994c3 100644
--- a/openstack/usr/share/openstack/keystone/keystone-paste.ini
+++ b/install-files/openstack/usr/share/openstack/keystone/keystone-paste.ini
diff --git a/openstack/usr/share/openstack/keystone/keystone.conf b/install-files/openstack/usr/share/openstack/keystone/keystone.conf
index 4e04c81b..4e04c81b 100644
--- a/openstack/usr/share/openstack/keystone/keystone.conf
+++ b/install-files/openstack/usr/share/openstack/keystone/keystone.conf
diff --git a/openstack/usr/share/openstack/keystone/logging.conf b/install-files/openstack/usr/share/openstack/keystone/logging.conf
index 6cb8c425..6cb8c425 100644
--- a/openstack/usr/share/openstack/keystone/logging.conf
+++ b/install-files/openstack/usr/share/openstack/keystone/logging.conf
diff --git a/openstack/usr/share/openstack/keystone/policy.json b/install-files/openstack/usr/share/openstack/keystone/policy.json
index af65205e..af65205e 100644
--- a/openstack/usr/share/openstack/keystone/policy.json
+++ b/install-files/openstack/usr/share/openstack/keystone/policy.json
diff --git a/openstack/usr/share/openstack/network.yml b/install-files/openstack/usr/share/openstack/network.yml
index f99f7f1a..f99f7f1a 100644
--- a/openstack/usr/share/openstack/network.yml
+++ b/install-files/openstack/usr/share/openstack/network.yml
diff --git a/openstack/usr/share/openstack/neutron-config.yml b/install-files/openstack/usr/share/openstack/neutron-config.yml
index 97f4c76e..97f4c76e 100644
--- a/openstack/usr/share/openstack/neutron-config.yml
+++ b/install-files/openstack/usr/share/openstack/neutron-config.yml
diff --git a/openstack/usr/share/openstack/neutron-db.yml b/install-files/openstack/usr/share/openstack/neutron-db.yml
index 91dde6fe..91dde6fe 100644
--- a/openstack/usr/share/openstack/neutron-db.yml
+++ b/install-files/openstack/usr/share/openstack/neutron-db.yml
diff --git a/openstack/usr/share/openstack/neutron/api-paste.ini b/install-files/openstack/usr/share/openstack/neutron/api-paste.ini
index bbcd4152..bbcd4152 100644
--- a/openstack/usr/share/openstack/neutron/api-paste.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/api-paste.ini
diff --git a/openstack/usr/share/openstack/neutron/dhcp_agent.ini b/install-files/openstack/usr/share/openstack/neutron/dhcp_agent.ini
index c6c2b9a7..c6c2b9a7 100644
--- a/openstack/usr/share/openstack/neutron/dhcp_agent.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/dhcp_agent.ini
diff --git a/openstack/usr/share/openstack/neutron/fwaas_driver.ini b/install-files/openstack/usr/share/openstack/neutron/fwaas_driver.ini
index 41f761ab..41f761ab 100644
--- a/openstack/usr/share/openstack/neutron/fwaas_driver.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/fwaas_driver.ini
diff --git a/openstack/usr/share/openstack/neutron/l3_agent.ini b/install-files/openstack/usr/share/openstack/neutron/l3_agent.ini
index 000cd997..000cd997 100644
--- a/openstack/usr/share/openstack/neutron/l3_agent.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/l3_agent.ini
diff --git a/openstack/usr/share/openstack/neutron/lbaas_agent.ini b/install-files/openstack/usr/share/openstack/neutron/lbaas_agent.ini
index 68a2759e..68a2759e 100644
--- a/openstack/usr/share/openstack/neutron/lbaas_agent.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/lbaas_agent.ini
diff --git a/openstack/usr/share/openstack/neutron/metadata_agent.ini b/install-files/openstack/usr/share/openstack/neutron/metadata_agent.ini
index ed238770..ed238770 100644
--- a/openstack/usr/share/openstack/neutron/metadata_agent.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/metadata_agent.ini
diff --git a/openstack/usr/share/openstack/neutron/metering_agent.ini b/install-files/openstack/usr/share/openstack/neutron/metering_agent.ini
index 88826ce7..88826ce7 100644
--- a/openstack/usr/share/openstack/neutron/metering_agent.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/metering_agent.ini
diff --git a/openstack/usr/share/openstack/neutron/neutron.conf b/install-files/openstack/usr/share/openstack/neutron/neutron.conf
index 51de7464..51de7464 100644
--- a/openstack/usr/share/openstack/neutron/neutron.conf
+++ b/install-files/openstack/usr/share/openstack/neutron/neutron.conf
diff --git a/openstack/usr/share/openstack/neutron/plugins/bigswitch/restproxy.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/bigswitch/restproxy.ini
index 256f7855..256f7855 100644
--- a/openstack/usr/share/openstack/neutron/plugins/bigswitch/restproxy.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/bigswitch/restproxy.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/ca_certs/README b/install-files/openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/ca_certs/README
index e7e47a27..e7e47a27 100644
--- a/openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/ca_certs/README
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/ca_certs/README
diff --git a/openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/host_certs/README b/install-files/openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/host_certs/README
index 8f5f5e77..8f5f5e77 100644
--- a/openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/host_certs/README
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/bigswitch/ssl/host_certs/README
diff --git a/openstack/usr/share/openstack/neutron/plugins/brocade/brocade.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/brocade/brocade.ini
index 916e9e5d..916e9e5d 100644
--- a/openstack/usr/share/openstack/neutron/plugins/brocade/brocade.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/brocade/brocade.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_cfg_agent.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_cfg_agent.ini
index d99e8382..d99e8382 100644
--- a/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_cfg_agent.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_cfg_agent.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_plugins.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_plugins.ini
index 17eae737..17eae737 100644
--- a/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_plugins.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_plugins.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_router_plugin.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_router_plugin.ini
index 3ef271d2..3ef271d2 100644
--- a/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_router_plugin.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_router_plugin.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_vpn_agent.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_vpn_agent.ini
index 0aee17eb..0aee17eb 100644
--- a/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_vpn_agent.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/cisco/cisco_vpn_agent.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/embrane/heleos_conf.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/embrane/heleos_conf.ini
index 0ca9b46f..0ca9b46f 100644
--- a/openstack/usr/share/openstack/neutron/plugins/embrane/heleos_conf.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/embrane/heleos_conf.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/hyperv/hyperv_neutron_plugin.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/hyperv/hyperv_neutron_plugin.ini
index 5eeec570..5eeec570 100644
--- a/openstack/usr/share/openstack/neutron/plugins/hyperv/hyperv_neutron_plugin.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/hyperv/hyperv_neutron_plugin.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ibm/sdnve_neutron_plugin.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ibm/sdnve_neutron_plugin.ini
index 0fab5070..0fab5070 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ibm/sdnve_neutron_plugin.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ibm/sdnve_neutron_plugin.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/linuxbridge/linuxbridge_conf.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/linuxbridge/linuxbridge_conf.ini
index 94fe9803..94fe9803 100644
--- a/openstack/usr/share/openstack/neutron/plugins/linuxbridge/linuxbridge_conf.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/linuxbridge/linuxbridge_conf.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/metaplugin/metaplugin.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/metaplugin/metaplugin.ini
index 2b9bfa5e..2b9bfa5e 100644
--- a/openstack/usr/share/openstack/neutron/plugins/metaplugin/metaplugin.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/metaplugin/metaplugin.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/midonet/midonet.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/midonet/midonet.ini
index f2e94052..f2e94052 100644
--- a/openstack/usr/share/openstack/neutron/plugins/midonet/midonet.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/midonet/midonet.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf.ini
index b8097ce2..b8097ce2 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_arista.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_arista.ini
index abaf5bc7..abaf5bc7 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_arista.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_arista.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_brocade.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_brocade.ini
index 67574110..67574110 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_brocade.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_brocade.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_cisco.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_cisco.ini
index 1b69100e..1b69100e 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_cisco.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_cisco.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_fslsdn.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_fslsdn.ini
index 6ee4a4e0..6ee4a4e0 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_fslsdn.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_fslsdn.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_mlnx.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_mlnx.ini
index 46139aed..46139aed 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_mlnx.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_mlnx.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ncs.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ncs.ini
index dbbfcbd2..dbbfcbd2 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ncs.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ncs.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_odl.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_odl.ini
index 9e88c1bb..9e88c1bb 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_odl.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_odl.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ofa.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ofa.ini
index 4a94b987..4a94b987 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ofa.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_ofa.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_sriov.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_sriov.ini
index 9566f54c..9566f54c 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_sriov.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf_sriov.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/mlnx/mlnx_conf.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/mlnx/mlnx_conf.ini
index b1225111..b1225111 100644
--- a/openstack/usr/share/openstack/neutron/plugins/mlnx/mlnx_conf.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/mlnx/mlnx_conf.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/nec/nec.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/nec/nec.ini
index aa4171da..aa4171da 100644
--- a/openstack/usr/share/openstack/neutron/plugins/nec/nec.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/nec/nec.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/nuage/nuage_plugin.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/nuage/nuage_plugin.ini
index aad37bd5..aad37bd5 100644
--- a/openstack/usr/share/openstack/neutron/plugins/nuage/nuage_plugin.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/nuage/nuage_plugin.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/oneconvergence/nvsdplugin.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/oneconvergence/nvsdplugin.ini
index a1c05d97..a1c05d97 100644
--- a/openstack/usr/share/openstack/neutron/plugins/oneconvergence/nvsdplugin.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/oneconvergence/nvsdplugin.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/opencontrail/contrailplugin.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/opencontrail/contrailplugin.ini
index 629f1fc4..629f1fc4 100644
--- a/openstack/usr/share/openstack/neutron/plugins/opencontrail/contrailplugin.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/opencontrail/contrailplugin.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/openvswitch/ovs_neutron_plugin.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
index 9c8e6b58..9c8e6b58 100644
--- a/openstack/usr/share/openstack/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/plumgrid/plumgrid.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/plumgrid/plumgrid.ini
index bfe8062a..bfe8062a 100644
--- a/openstack/usr/share/openstack/neutron/plugins/plumgrid/plumgrid.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/plumgrid/plumgrid.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/ryu/ryu.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ryu/ryu.ini
index 9d9cfa25..9d9cfa25 100644
--- a/openstack/usr/share/openstack/neutron/plugins/ryu/ryu.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ryu/ryu.ini
diff --git a/openstack/usr/share/openstack/neutron/plugins/vmware/nsx.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/vmware/nsx.ini
index baca73b8..baca73b8 100644
--- a/openstack/usr/share/openstack/neutron/plugins/vmware/nsx.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/vmware/nsx.ini
diff --git a/openstack/usr/share/openstack/neutron/policy.json b/install-files/openstack/usr/share/openstack/neutron/policy.json
index e7db4357..e7db4357 100644
--- a/openstack/usr/share/openstack/neutron/policy.json
+++ b/install-files/openstack/usr/share/openstack/neutron/policy.json
diff --git a/openstack/usr/share/openstack/neutron/vpn_agent.ini b/install-files/openstack/usr/share/openstack/neutron/vpn_agent.ini
index c3089df9..c3089df9 100644
--- a/openstack/usr/share/openstack/neutron/vpn_agent.ini
+++ b/install-files/openstack/usr/share/openstack/neutron/vpn_agent.ini
diff --git a/openstack/usr/share/openstack/nova-config.yml b/install-files/openstack/usr/share/openstack/nova-config.yml
index 4f43db39..4f43db39 100644
--- a/openstack/usr/share/openstack/nova-config.yml
+++ b/install-files/openstack/usr/share/openstack/nova-config.yml
diff --git a/openstack/usr/share/openstack/nova-db.yml b/install-files/openstack/usr/share/openstack/nova-db.yml
index e7dc5b10..e7dc5b10 100644
--- a/openstack/usr/share/openstack/nova-db.yml
+++ b/install-files/openstack/usr/share/openstack/nova-db.yml
diff --git a/openstack/usr/share/openstack/nova/api-paste.ini b/install-files/openstack/usr/share/openstack/nova/api-paste.ini
index 2a825a5b..2a825a5b 100644
--- a/openstack/usr/share/openstack/nova/api-paste.ini
+++ b/install-files/openstack/usr/share/openstack/nova/api-paste.ini
diff --git a/openstack/usr/share/openstack/nova/cells.json b/install-files/openstack/usr/share/openstack/nova/cells.json
index cc74930d..cc74930d 100644
--- a/openstack/usr/share/openstack/nova/cells.json
+++ b/install-files/openstack/usr/share/openstack/nova/cells.json
diff --git a/openstack/usr/share/openstack/nova/logging.conf b/install-files/openstack/usr/share/openstack/nova/logging.conf
index 5482a040..5482a040 100644
--- a/openstack/usr/share/openstack/nova/logging.conf
+++ b/install-files/openstack/usr/share/openstack/nova/logging.conf
diff --git a/openstack/usr/share/openstack/nova/nova-compute.conf b/install-files/openstack/usr/share/openstack/nova/nova-compute.conf
index 8d186211..8d186211 100644
--- a/openstack/usr/share/openstack/nova/nova-compute.conf
+++ b/install-files/openstack/usr/share/openstack/nova/nova-compute.conf
diff --git a/openstack/usr/share/openstack/nova/nova.conf b/install-files/openstack/usr/share/openstack/nova/nova.conf
index 43343cdd..43343cdd 100644
--- a/openstack/usr/share/openstack/nova/nova.conf
+++ b/install-files/openstack/usr/share/openstack/nova/nova.conf
diff --git a/openstack/usr/share/openstack/nova/policy.json b/install-files/openstack/usr/share/openstack/nova/policy.json
index cc5b8ea4..cc5b8ea4 100644
--- a/openstack/usr/share/openstack/nova/policy.json
+++ b/install-files/openstack/usr/share/openstack/nova/policy.json
diff --git a/openstack/usr/share/openstack/openvswitch.yml b/install-files/openstack/usr/share/openstack/openvswitch.yml
index 47257f7f..47257f7f 100644
--- a/openstack/usr/share/openstack/openvswitch.yml
+++ b/install-files/openstack/usr/share/openstack/openvswitch.yml
diff --git a/openstack/usr/share/openstack/postgres.yml b/install-files/openstack/usr/share/openstack/postgres.yml
index 5ff9355e..5ff9355e 100644
--- a/openstack/usr/share/openstack/postgres.yml
+++ b/install-files/openstack/usr/share/openstack/postgres.yml
diff --git a/openstack/usr/share/openstack/postgres/pg_hba.conf b/install-files/openstack/usr/share/openstack/postgres/pg_hba.conf
index 78186924..78186924 100644
--- a/openstack/usr/share/openstack/postgres/pg_hba.conf
+++ b/install-files/openstack/usr/share/openstack/postgres/pg_hba.conf
diff --git a/openstack/usr/share/openstack/postgres/postgresql.conf b/install-files/openstack/usr/share/openstack/postgres/postgresql.conf
index 74153385..74153385 100644
--- a/openstack/usr/share/openstack/postgres/postgresql.conf
+++ b/install-files/openstack/usr/share/openstack/postgres/postgresql.conf
diff --git a/openstack/usr/share/openstack/rabbitmq/rabbitmq-env.conf b/install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq-env.conf
index d4c58dae..d4c58dae 100644
--- a/openstack/usr/share/openstack/rabbitmq/rabbitmq-env.conf
+++ b/install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq-env.conf
diff --git a/openstack/usr/share/openstack/rabbitmq/rabbitmq.config b/install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq.config
index 9b93881e..9b93881e 100644
--- a/openstack/usr/share/openstack/rabbitmq/rabbitmq.config
+++ b/install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq.config
diff --git a/openstack/usr/share/openstack/swift-controller.yml b/install-files/openstack/usr/share/openstack/swift-controller.yml
index 690de087..690de087 100644
--- a/openstack/usr/share/openstack/swift-controller.yml
+++ b/install-files/openstack/usr/share/openstack/swift-controller.yml
diff --git a/openstack/usr/share/swift/etc/rsyncd.j2 b/install-files/openstack/usr/share/swift/etc/rsyncd.j2
index c0657665..c0657665 100644
--- a/openstack/usr/share/swift/etc/rsyncd.j2
+++ b/install-files/openstack/usr/share/swift/etc/rsyncd.j2
diff --git a/openstack/usr/share/swift/etc/swift/proxy-server.j2 b/install-files/openstack/usr/share/swift/etc/swift/proxy-server.j2
index dda82d5a..dda82d5a 100644
--- a/openstack/usr/share/swift/etc/swift/proxy-server.j2
+++ b/install-files/openstack/usr/share/swift/etc/swift/proxy-server.j2
diff --git a/swift/etc/ntp.conf b/install-files/swift/etc/ntp.conf
index 54522871..54522871 100644
--- a/swift/etc/ntp.conf
+++ b/install-files/swift/etc/ntp.conf
diff --git a/swift/manifest b/install-files/swift/manifest
index 7fd76206..7fd76206 100644
--- a/swift/manifest
+++ b/install-files/swift/manifest
diff --git a/swift/usr/lib/systemd/system/rsync.service b/install-files/swift/usr/lib/systemd/system/rsync.service
index babcfb46..babcfb46 100644
--- a/swift/usr/lib/systemd/system/rsync.service
+++ b/install-files/swift/usr/lib/systemd/system/rsync.service
diff --git a/swift/usr/lib/systemd/system/swift-storage-setup.service b/install-files/swift/usr/lib/systemd/system/swift-storage-setup.service
index 3df31163..3df31163 100644
--- a/swift/usr/lib/systemd/system/swift-storage-setup.service
+++ b/install-files/swift/usr/lib/systemd/system/swift-storage-setup.service
diff --git a/swift/usr/lib/systemd/system/swift-storage.service b/install-files/swift/usr/lib/systemd/system/swift-storage.service
index dc41d3bc..dc41d3bc 100644
--- a/swift/usr/lib/systemd/system/swift-storage.service
+++ b/install-files/swift/usr/lib/systemd/system/swift-storage.service
diff --git a/swift/usr/share/swift/etc/rsyncd.j2 b/install-files/swift/usr/share/swift/etc/rsyncd.j2
index c0657665..c0657665 100644
--- a/swift/usr/share/swift/etc/rsyncd.j2
+++ b/install-files/swift/usr/share/swift/etc/rsyncd.j2
diff --git a/swift/usr/share/swift/etc/swift/account-server.j2 b/install-files/swift/usr/share/swift/etc/swift/account-server.j2
index d977e295..d977e295 100644
--- a/swift/usr/share/swift/etc/swift/account-server.j2
+++ b/install-files/swift/usr/share/swift/etc/swift/account-server.j2
diff --git a/swift/usr/share/swift/etc/swift/container-server.j2 b/install-files/swift/usr/share/swift/etc/swift/container-server.j2
index d226d016..d226d016 100644
--- a/swift/usr/share/swift/etc/swift/container-server.j2
+++ b/install-files/swift/usr/share/swift/etc/swift/container-server.j2
diff --git a/swift/usr/share/swift/etc/swift/object-server.j2 b/install-files/swift/usr/share/swift/etc/swift/object-server.j2
index 66990be9..66990be9 100644
--- a/swift/usr/share/swift/etc/swift/object-server.j2
+++ b/install-files/swift/usr/share/swift/etc/swift/object-server.j2
diff --git a/swift/usr/share/swift/etc/swift/swift.j2 b/install-files/swift/usr/share/swift/etc/swift/swift.j2
index 6d76215a..6d76215a 100644
--- a/swift/usr/share/swift/etc/swift/swift.j2
+++ b/install-files/swift/usr/share/swift/etc/swift/swift.j2
diff --git a/swift/usr/share/swift/hosts b/install-files/swift/usr/share/swift/hosts
index 5b97818d..5b97818d 100644
--- a/swift/usr/share/swift/hosts
+++ b/install-files/swift/usr/share/swift/hosts
diff --git a/swift/usr/share/swift/swift-storage.yml b/install-files/swift/usr/share/swift/swift-storage.yml
index 62a335ed..62a335ed 100644
--- a/swift/usr/share/swift/swift-storage.yml
+++ b/install-files/swift/usr/share/swift/swift-storage.yml
diff --git a/vagrant-files/home/vagrant/.ssh/authorized_keys b/install-files/vagrant-files/home/vagrant/.ssh/authorized_keys
index 18a9c00f..18a9c00f 100644
--- a/vagrant-files/home/vagrant/.ssh/authorized_keys
+++ b/install-files/vagrant-files/home/vagrant/.ssh/authorized_keys
diff --git a/vagrant-files/manifest b/install-files/vagrant-files/manifest
index 67168341..67168341 100644
--- a/vagrant-files/manifest
+++ b/install-files/vagrant-files/manifest
diff --git a/systems/armv7lhf-cross-toolchain-system-x86_32.morph b/systems/armv7lhf-cross-toolchain-system-x86_32.morph
index 9fe7888a..b0ac9cfe 100644
--- a/systems/armv7lhf-cross-toolchain-system-x86_32.morph
+++ b/systems/armv7lhf-cross-toolchain-system-x86_32.morph
@@ -11,9 +11,9 @@ strata:
- name: cross-tools
morph: strata/cross-tools.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- simple-network
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/armv7lhf-cross-toolchain-system-x86_64.morph b/systems/armv7lhf-cross-toolchain-system-x86_64.morph
index c1de199c..1bd1adc1 100644
--- a/systems/armv7lhf-cross-toolchain-system-x86_64.morph
+++ b/systems/armv7lhf-cross-toolchain-system-x86_64.morph
@@ -11,9 +11,9 @@ strata:
- name: cross-tools
morph: strata/cross-tools.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- simple-network
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/base-system-armv7-highbank.morph b/systems/base-system-armv7-highbank.morph
index ffc5e188..32d773e8 100644
--- a/systems/base-system-armv7-highbank.morph
+++ b/systems/base-system-armv7-highbank.morph
@@ -13,8 +13,8 @@ strata:
- name: bsp-armv7-highbank
morph: strata/bsp-armv7-highbank.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/base-system-armv7-versatile.morph b/systems/base-system-armv7-versatile.morph
index 8de2b35f..4f039c02 100644
--- a/systems/base-system-armv7-versatile.morph
+++ b/systems/base-system-armv7-versatile.morph
@@ -13,8 +13,8 @@ strata:
- name: bsp-armv7-versatile
morph: strata/bsp-armv7-versatile.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/base-system-armv7b-highbank.morph b/systems/base-system-armv7b-highbank.morph
index 23bf4dbf..969967b5 100644
--- a/systems/base-system-armv7b-highbank.morph
+++ b/systems/base-system-armv7b-highbank.morph
@@ -13,8 +13,8 @@ strata:
- name: bsp-armv7b-highbank
morph: strata/bsp-armv7b-highbank.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/base-system-armv7b-vexpress-tc2.morph b/systems/base-system-armv7b-vexpress-tc2.morph
index b06ead7b..cbfedd89 100644
--- a/systems/base-system-armv7b-vexpress-tc2.morph
+++ b/systems/base-system-armv7b-vexpress-tc2.morph
@@ -12,8 +12,8 @@ strata:
- name: bsp-armv7b-vexpress-tc2
morph: strata/bsp-armv7b-vexpress-tc2.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/base-system-armv7lhf-highbank.morph b/systems/base-system-armv7lhf-highbank.morph
index c827f3a2..399931a5 100644
--- a/systems/base-system-armv7lhf-highbank.morph
+++ b/systems/base-system-armv7lhf-highbank.morph
@@ -13,8 +13,8 @@ strata:
- name: bsp-armv7-highbank
morph: strata/bsp-armv7-highbank.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/base-system-armv8b64.morph b/systems/base-system-armv8b64.morph
index 49e7dac7..d23bde9b 100644
--- a/systems/base-system-armv8b64.morph
+++ b/systems/base-system-armv8b64.morph
@@ -14,9 +14,9 @@ strata:
- name: bsp-armv8b64-generic
morph: strata/bsp-armv8b64-generic.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- moonshot-kernel
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/moonshot-kernel
+- extensions/install-essential-files
diff --git a/systems/base-system-armv8l64.morph b/systems/base-system-armv8l64.morph
index 560add69..24104a8b 100644
--- a/systems/base-system-armv8l64.morph
+++ b/systems/base-system-armv8l64.morph
@@ -14,9 +14,9 @@ strata:
- name: bsp-armv8l64-generic
morph: strata/bsp-armv8l64-generic.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- moonshot-kernel
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/moonshot-kernel
+- extensions/install-essential-files
diff --git a/systems/base-system-ppc64-generic.morph b/systems/base-system-ppc64-generic.morph
index 3763cce5..6da852e3 100644
--- a/systems/base-system-ppc64-generic.morph
+++ b/systems/base-system-ppc64-generic.morph
@@ -13,8 +13,8 @@ strata:
- name: bsp-ppc64-generic
morph: strata/bsp-ppc64-generic.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/base-system-x86_32-generic.morph b/systems/base-system-x86_32-generic.morph
index 7ada4052..d89fd913 100644
--- a/systems/base-system-x86_32-generic.morph
+++ b/systems/base-system-x86_32-generic.morph
@@ -12,8 +12,8 @@ strata:
- name: bsp-x86_32-generic
morph: strata/bsp-x86_32-generic.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/base-system-x86_64-generic.morph b/systems/base-system-x86_64-generic.morph
index 796c8185..aa1659b3 100644
--- a/systems/base-system-x86_64-generic.morph
+++ b/systems/base-system-x86_64-generic.morph
@@ -13,8 +13,8 @@ strata:
- name: bsp-x86_64-generic
morph: strata/bsp-x86_64-generic.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/build-system-armv5l-openbmc-aspeed.morph b/systems/build-system-armv5l-openbmc-aspeed.morph
index 4eb0b6e7..7230bbc0 100644
--- a/systems/build-system-armv5l-openbmc-aspeed.morph
+++ b/systems/build-system-armv5l-openbmc-aspeed.morph
@@ -35,9 +35,9 @@ strata:
- name: mtd-utilities
morph: strata/mtd-utilities.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/build-system-armv7lhf-highbank.morph b/systems/build-system-armv7lhf-highbank.morph
index d43ac935..42156d78 100644
--- a/systems/build-system-armv7lhf-highbank.morph
+++ b/systems/build-system-armv7lhf-highbank.morph
@@ -44,12 +44,12 @@ strata:
- name: unionfs-fuse-group
morph: strata/unionfs-fuse-group.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- distbuild
-- fstab
-- mason
-- cloud-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/distbuild
+- extensions/fstab
+- extensions/mason
+- extensions/cloud-init
+- extensions/install-essential-files
diff --git a/systems/build-system-armv7lhf-jetson.morph b/systems/build-system-armv7lhf-jetson.morph
index fa948037..3bdcf9f0 100644
--- a/systems/build-system-armv7lhf-jetson.morph
+++ b/systems/build-system-armv7lhf-jetson.morph
@@ -42,12 +42,12 @@ strata:
- name: ostree-core
morph: strata/ostree-core.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- distbuild
-- fstab
-- mason
-- cloud-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/distbuild
+- extensions/fstab
+- extensions/mason
+- extensions/cloud-init
+- extensions/install-essential-files
diff --git a/systems/build-system-armv8b64.morph b/systems/build-system-armv8b64.morph
index 84495016..aa16f545 100644
--- a/systems/build-system-armv8b64.morph
+++ b/systems/build-system-armv8b64.morph
@@ -45,13 +45,13 @@ strata:
- name: devtools
morph: strata/devtools.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- distbuild
-- fstab
-- mason
-- cloud-init
-- moonshot-kernel
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/distbuild
+- extensions/fstab
+- extensions/mason
+- extensions/cloud-init
+- extensions/moonshot-kernel
+- extensions/install-essential-files
diff --git a/systems/build-system-armv8l64.morph b/systems/build-system-armv8l64.morph
index f79fb76e..e7ddf034 100644
--- a/systems/build-system-armv8l64.morph
+++ b/systems/build-system-armv8l64.morph
@@ -45,13 +45,13 @@ strata:
- name: ostree-core
morph: strata/ostree-core.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- distbuild
-- fstab
-- mason
-- cloud-init
-- moonshot-kernel
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/distbuild
+- extensions/fstab
+- extensions/mason
+- extensions/cloud-init
+- extensions/moonshot-kernel
+- extensions/install-essential-files
diff --git a/systems/build-system-ppc64.morph b/systems/build-system-ppc64.morph
index 38f2e9f3..642df309 100644
--- a/systems/build-system-ppc64.morph
+++ b/systems/build-system-ppc64.morph
@@ -42,12 +42,12 @@ strata:
- name: ostree-core
morph: strata/ostree-core.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- distbuild
-- fstab
-- mason
-- cloud-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/distbuild
+- extensions/fstab
+- extensions/mason
+- extensions/cloud-init
+- extensions/install-essential-files
diff --git a/systems/build-system-x86_32-chroot.morph b/systems/build-system-x86_32-chroot.morph
index f193841f..646ae6a8 100644
--- a/systems/build-system-x86_32-chroot.morph
+++ b/systems/build-system-x86_32-chroot.morph
@@ -42,12 +42,12 @@ strata:
- name: ostree-core
morph: strata/ostree-core.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- distbuild
-- fstab
-- mason
-- cloud-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/distbuild
+- extensions/fstab
+- extensions/mason
+- extensions/cloud-init
+- extensions/install-essential-files
diff --git a/systems/build-system-x86_32.morph b/systems/build-system-x86_32.morph
index a802b64f..c14b54f2 100644
--- a/systems/build-system-x86_32.morph
+++ b/systems/build-system-x86_32.morph
@@ -44,12 +44,12 @@ strata:
- name: ostree-core
morph: strata/ostree-core.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- distbuild
-- fstab
-- mason
-- cloud-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/distbuild
+- extensions/fstab
+- extensions/mason
+- extensions/cloud-init
+- extensions/install-essential-files
diff --git a/systems/build-system-x86_64-chroot.morph b/systems/build-system-x86_64-chroot.morph
index fa54f9d3..82493d1e 100644
--- a/systems/build-system-x86_64-chroot.morph
+++ b/systems/build-system-x86_64-chroot.morph
@@ -42,12 +42,12 @@ strata:
- name: ostree-core
morph: strata/ostree-core.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- distbuild
-- fstab
-- mason
-- cloud-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/distbuild
+- extensions/fstab
+- extensions/mason
+- extensions/cloud-init
+- extensions/install-essential-files
diff --git a/systems/build-system-x86_64.morph b/systems/build-system-x86_64.morph
index 8fe5f91f..4b688555 100644
--- a/systems/build-system-x86_64.morph
+++ b/systems/build-system-x86_64.morph
@@ -44,12 +44,12 @@ strata:
- name: ostree-core
morph: strata/ostree-core.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- distbuild
-- fstab
-- mason
-- cloud-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/distbuild
+- extensions/fstab
+- extensions/mason
+- extensions/cloud-init
+- extensions/install-essential-files
diff --git a/systems/ceph-service-x86_64-generic.morph b/systems/ceph-service-x86_64-generic.morph
index 7431e56a..daaa6957 100644
--- a/systems/ceph-service-x86_64-generic.morph
+++ b/systems/ceph-service-x86_64-generic.morph
@@ -55,10 +55,10 @@ strata:
- name: chef
morph: strata/chef.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- ceph
-- cloud-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/ceph
+- extensions/cloud-init
+- extensions/install-essential-files
diff --git a/chef-system-x86_64-container.morph b/systems/chef-system-x86_64-container.morph
index 3e81c73e..889eabea 100644
--- a/chef-system-x86_64-container.morph
+++ b/systems/chef-system-x86_64-container.morph
@@ -3,12 +3,12 @@ kind: system
arch: x86_64
description: Minimal chef system suitable for running in a container
configuration-extensions:
-- set-hostname
-- simple-network
-- nfsboot
-- install-files
-- busybox-init
-- remove-gcc
+- extensions/set-hostname
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/busybox-init
+- extensions/remove-gcc
strata:
- name: build-essential
morph: strata/build-essential.morph
diff --git a/systems/cxmanage-system-x86_64-generic.morph b/systems/cxmanage-system-x86_64-generic.morph
index aaa0fa81..ed7e8d63 100644
--- a/systems/cxmanage-system-x86_64-generic.morph
+++ b/systems/cxmanage-system-x86_64-generic.morph
@@ -16,9 +16,9 @@ strata:
- name: cxmanage
morph: strata/cxmanage.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv7-chroot.morph b/systems/devel-system-armv7-chroot.morph
index 620d8fb9..d7a06fe9 100644
--- a/systems/devel-system-armv7-chroot.morph
+++ b/systems/devel-system-armv7-chroot.morph
@@ -54,9 +54,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv7-highbank.morph b/systems/devel-system-armv7-highbank.morph
index a92561fe..854edd76 100644
--- a/systems/devel-system-armv7-highbank.morph
+++ b/systems/devel-system-armv7-highbank.morph
@@ -57,9 +57,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv7-versatile.morph b/systems/devel-system-armv7-versatile.morph
index 50588f66..34c9a239 100644
--- a/systems/devel-system-armv7-versatile.morph
+++ b/systems/devel-system-armv7-versatile.morph
@@ -55,9 +55,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv7-wandboard.morph b/systems/devel-system-armv7-wandboard.morph
index e2c9e175..300981f9 100644
--- a/systems/devel-system-armv7-wandboard.morph
+++ b/systems/devel-system-armv7-wandboard.morph
@@ -55,9 +55,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv7b-chroot.morph b/systems/devel-system-armv7b-chroot.morph
index 34bc04f1..4eed73e4 100644
--- a/systems/devel-system-armv7b-chroot.morph
+++ b/systems/devel-system-armv7b-chroot.morph
@@ -46,9 +46,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv7b-highbank.morph b/systems/devel-system-armv7b-highbank.morph
index cddd5ff4..ba5de00b 100644
--- a/systems/devel-system-armv7b-highbank.morph
+++ b/systems/devel-system-armv7b-highbank.morph
@@ -53,9 +53,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv7lhf-chroot.morph b/systems/devel-system-armv7lhf-chroot.morph
index a8d46bd1..d0917fcb 100644
--- a/systems/devel-system-armv7lhf-chroot.morph
+++ b/systems/devel-system-armv7lhf-chroot.morph
@@ -54,9 +54,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv7lhf-highbank.morph b/systems/devel-system-armv7lhf-highbank.morph
index 9722644c..189c2913 100644
--- a/systems/devel-system-armv7lhf-highbank.morph
+++ b/systems/devel-system-armv7lhf-highbank.morph
@@ -60,9 +60,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv7lhf-jetson.morph b/systems/devel-system-armv7lhf-jetson.morph
index e3d1843d..1c39b3ea 100644
--- a/systems/devel-system-armv7lhf-jetson.morph
+++ b/systems/devel-system-armv7lhf-jetson.morph
@@ -58,9 +58,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv7lhf-wandboard.morph b/systems/devel-system-armv7lhf-wandboard.morph
index a47df980..4432f947 100644
--- a/systems/devel-system-armv7lhf-wandboard.morph
+++ b/systems/devel-system-armv7lhf-wandboard.morph
@@ -58,9 +58,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv8b64.morph b/systems/devel-system-armv8b64.morph
index 6c5f23ee..44ff2d53 100644
--- a/systems/devel-system-armv8b64.morph
+++ b/systems/devel-system-armv8b64.morph
@@ -57,11 +57,11 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- simple-network
-- nfsboot
-- install-files
-- cloud-init
-- moonshot-kernel
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/cloud-init
+- extensions/moonshot-kernel
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv8l64.morph b/systems/devel-system-armv8l64.morph
index cd7a1e44..cad71c4e 100644
--- a/systems/devel-system-armv8l64.morph
+++ b/systems/devel-system-armv8l64.morph
@@ -57,12 +57,12 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- simple-network
-- nfsboot
-- install-files
-- cloud-init
-- moonshot-kernel
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/cloud-init
+- extensions/moonshot-kernel
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-ppc64-chroot.morph b/systems/devel-system-ppc64-chroot.morph
index b92073a9..fe437767 100644
--- a/systems/devel-system-ppc64-chroot.morph
+++ b/systems/devel-system-ppc64-chroot.morph
@@ -52,9 +52,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-ppc64-generic.morph b/systems/devel-system-ppc64-generic.morph
index 4d81ff5c..26776429 100644
--- a/systems/devel-system-ppc64-generic.morph
+++ b/systems/devel-system-ppc64-generic.morph
@@ -55,9 +55,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-x86_32-chroot.morph b/systems/devel-system-x86_32-chroot.morph
index 7eb4fc01..bc3872a7 100644
--- a/systems/devel-system-x86_32-chroot.morph
+++ b/systems/devel-system-x86_32-chroot.morph
@@ -54,9 +54,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-x86_32-generic.morph b/systems/devel-system-x86_32-generic.morph
index 1fd44086..952bff79 100644
--- a/systems/devel-system-x86_32-generic.morph
+++ b/systems/devel-system-x86_32-generic.morph
@@ -59,10 +59,10 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- cloud-init
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/cloud-init
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-x86_64-chroot.morph b/systems/devel-system-x86_64-chroot.morph
index 48f23cd0..394201e0 100644
--- a/systems/devel-system-x86_64-chroot.morph
+++ b/systems/devel-system-x86_64-chroot.morph
@@ -56,9 +56,9 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-x86_64-generic.morph b/systems/devel-system-x86_64-generic.morph
index b49964dd..fe56a5de 100644
--- a/systems/devel-system-x86_64-generic.morph
+++ b/systems/devel-system-x86_64-generic.morph
@@ -59,11 +59,11 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- simple-network
-- nfsboot
-- install-files
-- cloud-init
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/cloud-init
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-x86_64-vagrant.morph b/systems/devel-system-x86_64-vagrant.morph
index c6a5f6fe..b8d4d2e7 100644
--- a/systems/devel-system-x86_64-vagrant.morph
+++ b/systems/devel-system-x86_64-vagrant.morph
@@ -57,10 +57,10 @@ strata:
- name: coreutils-common
morph: strata/coreutils-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- vagrant
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/vagrant
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/genivi-baseline-system-armv7lhf-jetson.morph b/systems/genivi-baseline-system-armv7lhf-jetson.morph
index 9306426d..71247d39 100644
--- a/systems/genivi-baseline-system-armv7lhf-jetson.morph
+++ b/systems/genivi-baseline-system-armv7lhf-jetson.morph
@@ -38,10 +38,10 @@ strata:
- name: weston-genivi
morph: strata/weston-genivi.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- strip-gplv3
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/strip-gplv3
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/genivi-baseline-system-armv7lhf-versatile.morph b/systems/genivi-baseline-system-armv7lhf-versatile.morph
index 698230bb..429ca2d8 100644
--- a/systems/genivi-baseline-system-armv7lhf-versatile.morph
+++ b/systems/genivi-baseline-system-armv7lhf-versatile.morph
@@ -36,10 +36,10 @@ strata:
- name: weston-genivi
morph: strata/weston-genivi.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- strip-gplv3
-- fstab
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/strip-gplv3
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/genivi-baseline-system-x86_64-generic.morph b/systems/genivi-baseline-system-x86_64-generic.morph
index f04485bc..6048e078 100644
--- a/systems/genivi-baseline-system-x86_64-generic.morph
+++ b/systems/genivi-baseline-system-x86_64-generic.morph
@@ -40,9 +40,9 @@ strata:
- name: weston-genivi
morph: strata/weston-genivi.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- strip-gplv3
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/strip-gplv3
+- extensions/install-essential-files
diff --git a/systems/installer-system-armv8b64.morph b/systems/installer-system-armv8b64.morph
index 726354c9..f1a83d6d 100644
--- a/systems/installer-system-armv8b64.morph
+++ b/systems/installer-system-armv8b64.morph
@@ -28,9 +28,9 @@ strata:
- name: installer-utils
morph: strata/installer-utils.morph
configuration-extensions:
-- set-hostname
-- install-files
-- fstab
-- installer
-- moonshot-kernel
-- install-essential-files
+- extensions/set-hostname
+- extensions/install-files
+- extensions/fstab
+- extensions/installer
+- extensions/moonshot-kernel
+- extensions/install-essential-files
diff --git a/systems/installer-system-x86_64.morph b/systems/installer-system-x86_64.morph
index 3d0ced5d..e9c4cd94 100644
--- a/systems/installer-system-x86_64.morph
+++ b/systems/installer-system-x86_64.morph
@@ -28,8 +28,8 @@ strata:
- name: installer-utils
morph: strata/installer-utils.morph
configuration-extensions:
-- set-hostname
-- install-files
-- fstab
-- installer
-- install-essential-files
+- extensions/set-hostname
+- extensions/install-files
+- extensions/fstab
+- extensions/installer
+- extensions/install-essential-files
diff --git a/systems/minimal-system-armv5l-openbmc-aspeed.morph b/systems/minimal-system-armv5l-openbmc-aspeed.morph
index fe596057..602e05c7 100644
--- a/systems/minimal-system-armv5l-openbmc-aspeed.morph
+++ b/systems/minimal-system-armv5l-openbmc-aspeed.morph
@@ -12,9 +12,9 @@ strata:
artifacts:
- bsp-armv5l-openbmc-aspeed-runtime
configuration-extensions:
-- set-hostname
-- simple-network
-- nfsboot
-- install-files
-- busybox-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/busybox-init
+- extensions/install-essential-files
diff --git a/systems/minimal-system-x86_32-generic.morph b/systems/minimal-system-x86_32-generic.morph
index 785a72a2..2e9f79c5 100644
--- a/systems/minimal-system-x86_32-generic.morph
+++ b/systems/minimal-system-x86_32-generic.morph
@@ -13,9 +13,9 @@ strata:
artifacts:
- bsp-x86_32-generic-runtime
configuration-extensions:
-- set-hostname
-- simple-network
-- nfsboot
-- install-files
-- busybox-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/busybox-init
+- extensions/install-essential-files
diff --git a/systems/minimal-system-x86_64-generic.morph b/systems/minimal-system-x86_64-generic.morph
index 9da22ec8..afd9460c 100644
--- a/systems/minimal-system-x86_64-generic.morph
+++ b/systems/minimal-system-x86_64-generic.morph
@@ -13,9 +13,9 @@ strata:
artifacts:
- bsp-x86_64-generic-runtime
configuration-extensions:
-- set-hostname
-- simple-network
-- nfsboot
-- install-files
-- busybox-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/busybox-init
+- extensions/install-essential-files
diff --git a/systems/nodejs-system-x86_64.morph b/systems/nodejs-system-x86_64.morph
index d5ebcf30..b758d5bd 100644
--- a/systems/nodejs-system-x86_64.morph
+++ b/systems/nodejs-system-x86_64.morph
@@ -15,8 +15,8 @@ strata:
- name: nodejs
morph: strata/nodejs.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/ocaml-system-x86_64.morph b/systems/ocaml-system-x86_64.morph
index 1903e4d6..9ac35d6f 100644
--- a/systems/ocaml-system-x86_64.morph
+++ b/systems/ocaml-system-x86_64.morph
@@ -14,7 +14,7 @@ strata:
- name: ocaml-language
morph: strata/ocaml-language.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
diff --git a/systems/openstack-system-x86_64.morph b/systems/openstack-system-x86_64.morph
index 8ab38bee..2f700e68 100644
--- a/systems/openstack-system-x86_64.morph
+++ b/systems/openstack-system-x86_64.morph
@@ -66,20 +66,20 @@ strata:
- name: python-tools
morph: strata/python-tools.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- simple-network
-- nfsboot
-- install-files
-- cloud-init
-- hosts
-- openstack-keystone
-- openstack-glance
-- openstack-cinder
-- openstack-nova
-- openstack-network
-- openstack-neutron
-- openstack-ceilometer
-- fstab
-- openstack-ironic
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/cloud-init
+- extensions/hosts
+- extensions/openstack-keystone
+- extensions/openstack-glance
+- extensions/openstack-cinder
+- extensions/openstack-nova
+- extensions/openstack-network
+- extensions/openstack-neutron
+- extensions/openstack-ceilometer
+- extensions/fstab
+- extensions/openstack-ironic
+- extensions/install-essential-files
diff --git a/systems/qt4-devel-system-x86_64-generic.morph b/systems/qt4-devel-system-x86_64-generic.morph
index 15b85f70..c7bad950 100644
--- a/systems/qt4-devel-system-x86_64-generic.morph
+++ b/systems/qt4-devel-system-x86_64-generic.morph
@@ -37,8 +37,8 @@ strata:
- name: enlightenment
morph: strata/enlightenment.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/qt5-devel-system-x86_64-generic.morph b/systems/qt5-devel-system-x86_64-generic.morph
index 3cdce60c..a1f38e9e 100644
--- a/systems/qt5-devel-system-x86_64-generic.morph
+++ b/systems/qt5-devel-system-x86_64-generic.morph
@@ -39,8 +39,8 @@ strata:
- name: enlightenment
morph: strata/enlightenment.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/swift-system-x86_64.morph b/systems/swift-system-x86_64.morph
index 81738558..c959b6f7 100644
--- a/systems/swift-system-x86_64.morph
+++ b/systems/swift-system-x86_64.morph
@@ -24,11 +24,11 @@ strata:
- name: openstack-common
morph: strata/openstack-common.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- simple-network
-- nfsboot
-- install-files
-- fstab
-- swift-storage
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/swift-storage
+- extensions/install-essential-files
diff --git a/systems/trove-system-x86_64.morph b/systems/trove-system-x86_64.morph
index 0a5692f5..efc66b5c 100644
--- a/systems/trove-system-x86_64.morph
+++ b/systems/trove-system-x86_64.morph
@@ -48,10 +48,10 @@ strata:
- name: devtools
morph: strata/devtools.morph
configuration-extensions:
-- set-hostname
-- trove
-- nfsboot-server
-- fstab
-- install-files
-- cloud-init
-- install-essential-files
+- extensions/set-hostname
+- extensions/trove
+- extensions/nfsboot-server
+- extensions/fstab
+- extensions/install-files
+- extensions/cloud-init
+- extensions/install-essential-files
diff --git a/systems/web-system-x86_64-generic.morph b/systems/web-system-x86_64-generic.morph
index 0b6e84b1..3f477833 100644
--- a/systems/web-system-x86_64-generic.morph
+++ b/systems/web-system-x86_64-generic.morph
@@ -30,8 +30,8 @@ strata:
- name: nodejs
morph: strata/nodejs.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/weston-system-armv7lhf-jetson.morph b/systems/weston-system-armv7lhf-jetson.morph
index ccb2c3ee..78ddc8b4 100644
--- a/systems/weston-system-armv7lhf-jetson.morph
+++ b/systems/weston-system-armv7lhf-jetson.morph
@@ -42,8 +42,8 @@ strata:
- name: tools
morph: strata/tools.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/weston-system-x86_64-generic.morph b/systems/weston-system-x86_64-generic.morph
index 84f0bad0..d927dd58 100644
--- a/systems/weston-system-x86_64-generic.morph
+++ b/systems/weston-system-x86_64-generic.morph
@@ -42,8 +42,8 @@ strata:
- name: tools
morph: strata/tools.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/xfce-system.morph b/systems/xfce-system.morph
index 643291d6..f87b0982 100644
--- a/systems/xfce-system.morph
+++ b/systems/xfce-system.morph
@@ -48,8 +48,8 @@ strata:
- name: xfce
morph: strata/xfce.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/zookeeper-client-x86_64.morph b/systems/zookeeper-client-x86_64.morph
index a9b01cd5..bc470df5 100644
--- a/systems/zookeeper-client-x86_64.morph
+++ b/systems/zookeeper-client-x86_64.morph
@@ -20,9 +20,9 @@ strata:
- name: test-tools
morph: strata/test-tools.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- simple-network
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/zookeeper-server-x86_64.morph b/systems/zookeeper-server-x86_64.morph
index 987ba9e1..bc46d7b3 100644
--- a/systems/zookeeper-server-x86_64.morph
+++ b/systems/zookeeper-server-x86_64.morph
@@ -20,9 +20,9 @@ strata:
- name: test-tools
morph: strata/test-tools.morph
configuration-extensions:
-- set-hostname
-- add-config-files
-- simple-network
-- nfsboot
-- install-files
-- install-essential-files
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files