summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes1
-rw-r--r--.gitlab-ci.yml126
-rw-r--r--.gitreview5
-rw-r--r--DEFAULTS252
-rw-r--r--README59
-rw-r--r--VERSION1
-rw-r--r--clusters/altera-socfpga-devkit-sd-image.morph14
-rw-r--r--clusters/build-system-x86_64-chroot-deploy.morph9
-rw-r--r--clusters/ci.morph93
-rw-r--r--clusters/example-distbuild-cluster.morph37
-rw-r--r--clusters/hardware-deployment.morph35
-rw-r--r--clusters/image-package-example.morph12
-rw-r--r--clusters/initramfs-test.morph22
-rw-r--r--clusters/installer-build-system-x86_64.morph52
-rw-r--r--clusters/jetson-upgrade.morph17
-rw-r--r--clusters/minimal-system-armv5l-openbmc-aspeed-deploy.morph13
-rw-r--r--clusters/minimal-system-deploy.morph14
-rw-r--r--clusters/minimal-system-x86_64-chroot-deploy.morph9
-rw-r--r--clusters/minimal-system-x86_64-deploy.morph12
-rw-r--r--clusters/moonshot-m2-armv8b64.morph56
-rw-r--r--clusters/moonshot-pxe-armv8b64.morph30
-rw-r--r--clusters/moonshot-pxe-armv8l64.morph22
-rw-r--r--clusters/release.morph62
-rw-r--r--clusters/sdk-example-cluster.morph46
-rw-r--r--clusters/upgrade-devel.morph39
-rwxr-xr-xextensions/add-config-files.configure26
-rw-r--r--extensions/busybox-init.configure145
-rw-r--r--extensions/ceph.configure344
-rwxr-xr-xextensions/cloud-init.configure69
-rwxr-xr-xextensions/distbuild-trove-nfsboot.check153
-rwxr-xr-xextensions/distbuild-trove-nfsboot.write283
-rw-r--r--extensions/distbuild-trove-nfsboot.write.help49
-rw-r--r--extensions/distbuild.configure132
-rwxr-xr-xextensions/fstab.configure28
-rw-r--r--extensions/genivi.configure124
-rw-r--r--extensions/genivi.configure.help25
-rw-r--r--extensions/hosts1
-rwxr-xr-xextensions/hosts.configure50
-rw-r--r--extensions/image-package-example/README9
-rw-r--r--extensions/image-package-example/common.sh.in72
-rw-r--r--extensions/image-package-example/disk-install.sh.in51
-rw-r--r--extensions/image-package-example/make-disk-image.sh.in36
-rwxr-xr-xextensions/image-package.write168
-rwxr-xr-xextensions/initramfs.write26
-rw-r--r--extensions/initramfs.write.help55
-rwxr-xr-xextensions/install-essential-files.configure40
-rw-r--r--extensions/install-essential-files.configure.help20
-rwxr-xr-xextensions/install-files.configure138
-rw-r--r--extensions/install-files.configure.help86
-rwxr-xr-xextensions/installer.configure48
-rw-r--r--extensions/jffs2.write64
-rw-r--r--extensions/jffs2.write.help28
-rwxr-xr-xextensions/kvm.check171
-rwxr-xr-xextensions/kvm.write126
-rw-r--r--extensions/kvm.write.help90
-rw-r--r--extensions/mason.configure153
-rw-r--r--extensions/mason/ansible/hosts1
-rw-r--r--extensions/mason/ansible/mason-setup.yml83
-rw-r--r--extensions/mason/httpd.service10
-rwxr-xr-xextensions/mason/mason-generator.sh101
-rwxr-xr-xextensions/mason/mason-report.sh297
-rw-r--r--extensions/mason/mason-setup.service16
-rw-r--r--extensions/mason/mason.service12
-rwxr-xr-xextensions/mason/mason.sh90
-rw-r--r--extensions/mason/mason.timer10
-rw-r--r--extensions/mason/os-init-script6
-rw-r--r--extensions/mason/share/mason.conf14
-rw-r--r--extensions/mason/share/os.conf30
-rw-r--r--extensions/moonshot-kernel.configure33
-rwxr-xr-xextensions/nfsboot-server.configure58
-rwxr-xr-xextensions/nfsboot.check96
-rwxr-xr-xextensions/nfsboot.configure30
-rwxr-xr-xextensions/nfsboot.write206
-rw-r--r--extensions/nfsboot.write.help33
-rw-r--r--extensions/openstack-ceilometer.configure122
-rw-r--r--extensions/openstack-cinder.configure125
-rw-r--r--extensions/openstack-glance.configure101
-rw-r--r--extensions/openstack-ironic.configure157
-rw-r--r--extensions/openstack-keystone.configure123
-rw-r--r--extensions/openstack-network.configure80
-rw-r--r--extensions/openstack-neutron.configure138
-rw-r--r--extensions/openstack-nova.configure163
-rw-r--r--extensions/openstack-swift-controller.configure49
-rw-r--r--extensions/openstack-time.configure61
-rwxr-xr-xextensions/openstack.check92
-rwxr-xr-xextensions/openstack.write94
-rw-r--r--extensions/openstack.write.help51
-rw-r--r--extensions/partitioning.py163
-rwxr-xr-xextensions/pxeboot.check86
-rw-r--r--extensions/pxeboot.write756
-rw-r--r--extensions/pxeboot.write.help166
-rw-r--r--extensions/pyfdisk.README144
-rw-r--r--extensions/pyfdisk.py769
-rwxr-xr-xextensions/rawdisk.check52
-rwxr-xr-xextensions/rawdisk.write122
-rw-r--r--extensions/rawdisk.write.help127
-rwxr-xr-xextensions/recv-hole158
-rwxr-xr-xextensions/sdk.write284
-rwxr-xr-xextensions/set-hostname.configure27
-rwxr-xr-xextensions/simple-network.configure296
-rwxr-xr-xextensions/ssh-rsync.check66
-rwxr-xr-xextensions/ssh-rsync.write175
-rw-r--r--extensions/ssh-rsync.write.help50
-rwxr-xr-xextensions/sshkeys.configure25
-rwxr-xr-xextensions/strip-gplv3.configure97
-rw-r--r--extensions/swift-build-rings.yml34
-rwxr-xr-xextensions/swift-storage-devices-validate.py60
-rw-r--r--extensions/swift-storage.configure107
-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.configure172
-rw-r--r--extensions/trove.configure.help134
-rw-r--r--extensions/vagrant.configure55
-rwxr-xr-xextensions/vdaboot.configure33
-rwxr-xr-xextensions/virtualbox-ssh.check36
-rwxr-xr-xextensions/virtualbox-ssh.write219
-rw-r--r--extensions/virtualbox-ssh.write.help135
-rw-r--r--extensions/writeexts.py1072
-rwxr-xr-xextensions/xfer-hole137
-rw-r--r--genivi/clusters/gdp-jetson-upgrade.morph19
-rw-r--r--genivi/clusters/genivi-demo-platform-x86_32-deploy.morph22
-rw-r--r--genivi/clusters/genivi-demo-platform-x86_64-deploy.morph22
-rw-r--r--genivi/clusters/release-genivi-baseline.morph41
-rw-r--r--genivi/strata/genivi-demo-platform-libs.morph18
-rw-r--r--genivi/strata/genivi-demo-platform-libs/dbus-c++.morph9
-rw-r--r--genivi/strata/genivi-demo-platform.morph42
-rw-r--r--genivi/strata/genivi-demo-platform/audiomanager-poc.morph10
-rw-r--r--genivi/strata/genivi-demo-platform/audiomanager@gdp.morph18
-rw-r--r--genivi/strata/genivi-demo-platform/browser-poc.morph29
-rw-r--r--genivi/strata/genivi-demo-platform/genivi-demo-platform-hmi.morph137
-rw-r--r--genivi/strata/genivi-demo-platform/mm-common.morph7
-rw-r--r--genivi/strata/genivi.morph119
-rw-r--r--genivi/strata/genivi/DLT-daemon.morph7
-rw-r--r--genivi/strata/genivi/genivi-common-api-dbus-runtime.morph3
-rw-r--r--genivi/strata/genivi/genivi-common-api-runtime.morph3
-rw-r--r--genivi/strata/genivi/googlemock.morph8
-rw-r--r--genivi/strata/genivi/googletest.morph7
-rw-r--r--genivi/strata/genivi/itzam-tarball.morph10
-rw-r--r--genivi/strata/genivi/json-c.morph7
-rw-r--r--genivi/strata/genivi/linuxquota.morph10
-rw-r--r--genivi/strata/genivi/node-startup-controller.morph9
-rw-r--r--genivi/strata/genivi/persistence-administrator.morph5
-rw-r--r--genivi/strata/genivi/persistence-common-object.morph5
-rw-r--r--genivi/strata/weston-genivi.morph21
-rw-r--r--genivi/strata/weston-genivi/wayland-ivi-extension.morph8
-rw-r--r--genivi/strata/weston-genivi/weston.morph86
-rw-r--r--genivi/systems/genivi-baseline-system-armv7lhf-jetson.morph56
-rw-r--r--genivi/systems/genivi-baseline-system-armv7lhf-versatile.morph54
-rw-r--r--genivi/systems/genivi-baseline-system-x86_64-generic.morph57
-rw-r--r--genivi/systems/genivi-demo-platform-armv7lhf-jetson.morph83
-rw-r--r--genivi/systems/genivi-demo-platform-x86_32-generic.morph85
-rw-r--r--genivi/systems/genivi-demo-platform-x86_64-generic.morph85
-rw-r--r--gnome/clusters/gnome-system-armv7lhf-jetson-deploy.morph17
-rw-r--r--gnome/clusters/gnome-system-x86_64-deploy.morph24
-rw-r--r--gnome/strata/flatpak-common.morph24
-rw-r--r--gnome/strata/flatpak-common/elfutils.morph7
-rw-r--r--gnome/strata/flatpak-common/flatpak.morph5
-rw-r--r--gnome/strata/gnome.morph969
-rw-r--r--gnome/strata/gnome/WebKitGtk.morph5
-rw-r--r--gnome/strata/gnome/accountsservice.morph9
-rw-r--r--gnome/strata/gnome/adwaita-icon-theme.morph11
-rw-r--r--gnome/strata/gnome/autoconf-archive.morph8
-rw-r--r--gnome/strata/gnome/berkeleydb.morph18
-rw-r--r--gnome/strata/gnome/caribou.morph5
-rw-r--r--gnome/strata/gnome/cheese.morph11
-rw-r--r--gnome/strata/gnome/clutter.morph6
-rw-r--r--gnome/strata/gnome/cogl.morph6
-rw-r--r--gnome/strata/gnome/colord.morph9
-rw-r--r--gnome/strata/gnome/cracklib.morph18
-rw-r--r--gnome/strata/gnome/d-feet.morph7
-rw-r--r--gnome/strata/gnome/dconf.morph5
-rw-r--r--gnome/strata/gnome/desktop-file-utils.morph7
-rw-r--r--gnome/strata/gnome/empathy.morph5
-rw-r--r--gnome/strata/gnome/epiphany.morph5
-rw-r--r--gnome/strata/gnome/evolution-data-server.morph11
-rw-r--r--gnome/strata/gnome/evolution.morph8
-rw-r--r--gnome/strata/gnome/folks.morph5
-rw-r--r--gnome/strata/gnome/gconf.morph5
-rw-r--r--gnome/strata/gnome/gdm.morph24
-rw-r--r--gnome/strata/gnome/glade.morph5
-rw-r--r--gnome/strata/gnome/glib-networking.morph9
-rw-r--r--gnome/strata/gnome/gnome-color-manager.morph7
-rw-r--r--gnome/strata/gnome/gnome-control-center.morph5
-rw-r--r--gnome/strata/gnome/gnome-initial-setup.morph9
-rw-r--r--gnome/strata/gnome/gnome-online-accounts.morph5
-rw-r--r--gnome/strata/gnome/gnome-session.morph5
-rw-r--r--gnome/strata/gnome/gnome-settings-daemon.morph5
-rw-r--r--gnome/strata/gnome/gnome-shell.morph5
-rw-r--r--gnome/strata/gnome/gnome-terminal.morph5
-rw-r--r--gnome/strata/gnome/gnome-themes-standard.morph5
-rw-r--r--gnome/strata/gnome/gtksourceview.morph5
-rw-r--r--gnome/strata/gnome/hicolor-icon-theme.morph7
-rw-r--r--gnome/strata/gnome/ibus-anthy.morph5
-rw-r--r--gnome/strata/gnome/ibus-hangul.morph5
-rw-r--r--gnome/strata/gnome/ibus-libpinyin.morph5
-rw-r--r--gnome/strata/gnome/ibus.morph9
-rw-r--r--gnome/strata/gnome/krb5.morph10
-rw-r--r--gnome/strata/gnome/libchamplain.morph5
-rw-r--r--gnome/strata/gnome/libgdata.morph6
-rw-r--r--gnome/strata/gnome/libhangul.morph6
-rw-r--r--gnome/strata/gnome/libpeas.morph5
-rw-r--r--gnome/strata/gnome/libpurple.morph9
-rw-r--r--gnome/strata/gnome/libpwquality.morph6
-rw-r--r--gnome/strata/gnome/librest.morph9
-rw-r--r--gnome/strata/gnome/libwnck.morph11
-rw-r--r--gnome/strata/gnome/mozjs24.morph18
-rw-r--r--gnome/strata/gnome/mutter.morph5
-rw-r--r--gnome/strata/gnome/nautilus.morph5
-rw-r--r--gnome/strata/gnome/network-manager-applet.morph5
-rw-r--r--gnome/strata/gnome/raptor.morph5
-rw-r--r--gnome/strata/gnome/telepathy-gabble.morph8
-rw-r--r--gnome/strata/gnome/telepathy-glib.morph6
-rw-r--r--gnome/strata/gnome/telepathy-logger.morph5
-rw-r--r--gnome/strata/gnome/telepathy-salut.morph5
-rw-r--r--gnome/strata/gnome/upower.morph5
-rw-r--r--gnome/strata/gnome/vte.morph5
-rw-r--r--gnome/strata/gnome/yelp.morph5
-rw-r--r--gnome/strata/gnome/zeitgeist.morph5
-rw-r--r--gnome/systems/gnome-system-armv7lhf-jetson.morph94
-rw-r--r--gnome/systems/gnome-system-x86_64.morph102
-rw-r--r--install-files/chef/manifest3
-rwxr-xr-xinstall-files/distbuild/lib/systemd/system-generators/ccache-nfs-mount-generator16
-rw-r--r--install-files/distbuild/manifest28
-rw-r--r--install-files/distbuild/usr/lib/distbuild-setup/ansible/distbuild-setup.yml115
-rw-r--r--install-files/distbuild/usr/lib/distbuild-setup/ansible/hosts1
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/distbuild-setup.service16
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/morph-cache-server.service12
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/morph-controller-helper.service13
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/morph-controller.service12
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/morph-worker-helper.service13
-rw-r--r--install-files/distbuild/usr/lib/systemd/system/morph-worker.service13
l---------install-files/distbuild/usr/lib/systemd/system/multi-user.target.wants/distbuild-setup.service1
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph-cache-server.conf5
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph-controller-helper.conf5
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph-controller.conf6
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph-worker-helper.conf4
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph-worker.conf4
-rw-r--r--install-files/distbuild/usr/share/distbuild-setup/morph.conf13
-rw-r--r--install-files/essential-files/etc/inputrc38
l---------install-files/essential-files/etc/os-release1
-rw-r--r--install-files/essential-files/etc/profile13
-rw-r--r--install-files/essential-files/manifest11
-rw-r--r--install-files/essential-files/usr/bin/brpaste29
-rw-r--r--install-files/essential-files/usr/lib/os-release5
-rw-r--r--install-files/essential-files/usr/lib/tmpfiles.d/shutdownramfs.conf4
l---------install-files/genivi-devel-system-armv7/etc/morph.conf1
-rw-r--r--install-files/genivi-devel-system-armv7/manifest5
-rw-r--r--install-files/genivi-devel-system-armv7/src/morph.conf5
-rw-r--r--install-files/gnome/etc/pam.d/gdm15
-rw-r--r--install-files/gnome/etc/pam.d/gdm-autologin17
-rw-r--r--install-files/gnome/etc/pam.d/gdm-launch-environment11
-rw-r--r--install-files/gnome/etc/pam.d/gdm-password24
-rw-r--r--install-files/gnome/etc/pam.d/passwd10
-rw-r--r--install-files/gnome/etc/pam.d/system-auth19
-rw-r--r--install-files/gnome/etc/securetty8
-rw-r--r--install-files/gnome/etc/ssh/sshd_config135
-rw-r--r--install-files/gnome/manifest9
-rw-r--r--install-files/gnome/usr/share/polkit-1/rules.d/geoclue-2.0.rules7
-rw-r--r--install-files/moonshot/boot/m400-1003.dtbbin0 -> 18063 bytes
-rw-r--r--install-files/moonshot/manifest2
-rw-r--r--install-files/openstack/etc/horizon/apache-horizon.conf36
-rw-r--r--install-files/openstack/etc/neutron/dnsmasq-neutron.conf2
-rwxr-xr-xinstall-files/openstack/etc/tempest/set_openstack_to_run_tempest.sh122
-rw-r--r--install-files/openstack/etc/tempest/tempest.conf1188
-rw-r--r--install-files/openstack/manifest117
-rw-r--r--install-files/openstack/usr/lib/sysctl.d/neutron.conf3
-rw-r--r--install-files/openstack/usr/lib/systemd/system/apache-httpd.service16
-rw-r--r--install-files/openstack/usr/lib/systemd/system/iscsi-setup.service12
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-evaluator.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-notifier.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-api.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-central.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-collector.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-compute.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-config-setup.service11
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-db-setup.service13
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-notification.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-api.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-backup.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-config-setup.service11
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-db-setup.service13
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-lv-setup.service12
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-scheduler.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-cinder-volume.service16
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-glance-api.service16
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-glance-registry.service16
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-glance-setup.service11
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-horizon-setup.service10
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ironic-api.service16
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ironic-conductor.service16
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-ironic-setup.service12
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-keystone-setup.service14
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-keystone.service16
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-network-setup.service12
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-config-setup.service13
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-db-setup.service13
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-dhcp-agent.service17
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-l3-agent.service17
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-metadata-agent.service17
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-ovs-cleanup.service18
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-plugin-openvswitch-agent.service17
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-neutron-server.service17
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-api.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-cert.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-compute.service16
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-conductor.service16
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-config-setup.service11
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-consoleauth.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-db-setup.service13
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-novncproxy.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-scheduler.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openstack-nova-serialproxy.service15
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openvswitch-db-server.service12
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openvswitch-setup.service11
-rw-r--r--install-files/openstack/usr/lib/systemd/system/openvswitch.service12
-rw-r--r--install-files/openstack/usr/lib/systemd/system/postgres-server-setup.service12
-rw-r--r--install-files/openstack/usr/lib/systemd/system/postgres-server.service26
-rw-r--r--install-files/openstack/usr/lib/systemd/system/rabbitmq-server.service16
-rw-r--r--install-files/openstack/usr/lib/systemd/system/swift-controller-setup.service13
-rw-r--r--install-files/openstack/usr/lib/systemd/system/swift-proxy.service14
-rw-r--r--install-files/openstack/usr/share/openstack/ceilometer-config.yml36
-rw-r--r--install-files/openstack/usr/share/openstack/ceilometer-db.yml50
-rw-r--r--install-files/openstack/usr/share/openstack/ceilometer/ceilometer.conf1330
-rw-r--r--install-files/openstack/usr/share/openstack/cinder-config.yml37
-rw-r--r--install-files/openstack/usr/share/openstack/cinder-db.yml59
-rw-r--r--install-files/openstack/usr/share/openstack/cinder-lvs.yml21
-rw-r--r--install-files/openstack/usr/share/openstack/cinder/cinder.conf2991
-rw-r--r--install-files/openstack/usr/share/openstack/extras/00-disable-device.network2
-rw-r--r--install-files/openstack/usr/share/openstack/extras/60-device-dhcp.network5
-rw-r--r--install-files/openstack/usr/share/openstack/glance.yml92
-rw-r--r--install-files/openstack/usr/share/openstack/glance/glance-api.conf813
-rw-r--r--install-files/openstack/usr/share/openstack/glance/glance-registry.conf268
-rw-r--r--install-files/openstack/usr/share/openstack/horizon.yml46
-rw-r--r--install-files/openstack/usr/share/openstack/hosts1
-rw-r--r--install-files/openstack/usr/share/openstack/ironic.yml104
-rw-r--r--install-files/openstack/usr/share/openstack/ironic/ironic.conf1568
-rw-r--r--install-files/openstack/usr/share/openstack/iscsi.yml15
-rw-r--r--install-files/openstack/usr/share/openstack/keystone.yml142
-rw-r--r--install-files/openstack/usr/share/openstack/keystone/keystone.conf1733
-rw-r--r--install-files/openstack/usr/share/openstack/network.yml67
-rw-r--r--install-files/openstack/usr/share/openstack/neutron-config.yml37
-rw-r--r--install-files/openstack/usr/share/openstack/neutron-db.yml51
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/dhcp_agent.ini89
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/l3_agent.ini121
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/metadata_agent.ini68
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/neutron.conf1027
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf.ini113
-rw-r--r--install-files/openstack/usr/share/openstack/neutron/plugins/ryu/ryu.ini44
-rw-r--r--install-files/openstack/usr/share/openstack/nova-config.yml34
-rw-r--r--install-files/openstack/usr/share/openstack/nova-db.yml50
-rw-r--r--install-files/openstack/usr/share/openstack/nova/nova-compute.conf4
-rw-r--r--install-files/openstack/usr/share/openstack/nova/nova.conf4008
-rw-r--r--install-files/openstack/usr/share/openstack/openvswitch.yml38
-rw-r--r--install-files/openstack/usr/share/openstack/postgres.yml48
-rw-r--r--install-files/openstack/usr/share/openstack/postgres/pg_hba.conf5
-rw-r--r--install-files/openstack/usr/share/openstack/postgres/postgresql.conf11
-rw-r--r--install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq-env.conf3
-rw-r--r--install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq.config9
-rw-r--r--install-files/openstack/usr/share/openstack/swift-controller.yml52
-rw-r--r--install-files/openstack/usr/share/swift/etc/rsyncd.j223
-rw-r--r--install-files/openstack/usr/share/swift/etc/swift/proxy-server.j2630
-rw-r--r--install-files/swift/etc/ntp.conf25
-rw-r--r--install-files/swift/manifest15
-rw-r--r--install-files/swift/usr/lib/systemd/system/rsync.service11
-rw-r--r--install-files/swift/usr/lib/systemd/system/swift-storage-setup.service12
-rw-r--r--install-files/swift/usr/lib/systemd/system/swift-storage.service12
-rw-r--r--install-files/swift/usr/share/swift/etc/rsyncd.j223
-rw-r--r--install-files/swift/usr/share/swift/etc/swift/account-server.j2192
-rw-r--r--install-files/swift/usr/share/swift/etc/swift/container-server.j2211
-rw-r--r--install-files/swift/usr/share/swift/etc/swift/object-server.j2306
-rw-r--r--install-files/swift/usr/share/swift/etc/swift/swift.j2169
-rw-r--r--install-files/swift/usr/share/swift/hosts1
-rw-r--r--install-files/swift/usr/share/swift/swift-storage.yml24
-rw-r--r--install-files/vagrant-files/home/vagrant/.ssh/authorized_keys1
-rw-r--r--install-files/vagrant-files/manifest4
-rw-r--r--ivi/clusters/ivi-system-armv7lhf-jetson-deploy.morph18
-rw-r--r--ivi/clusters/ivi-system-x86_32-deploy.morph24
-rw-r--r--ivi/clusters/ivi-system-x86_64-deploy.morph24
-rw-r--r--ivi/strata/bsp-x86_32-ivi.morph12
-rw-r--r--ivi/strata/bsp-x86_32-ivi/linux-x86-32-ivi.morph84
-rw-r--r--ivi/strata/bsp-x86_64-ivi.morph12
-rw-r--r--ivi/strata/bsp-x86_64-ivi/linux-x86-64-ivi.morph84
-rw-r--r--ivi/strata/qt5-ivi.morph21
-rw-r--r--ivi/strata/qt5-ivi/qtapplicationmanager.morph8
-rw-r--r--ivi/strata/rvi.morph11
-rw-r--r--ivi/strata/rvi/rvi_core.morph16
-rw-r--r--ivi/systems/ivi-system-armv7lhf-jetson.morph94
-rw-r--r--ivi/systems/ivi-system-x86_32.morph104
-rw-r--r--ivi/systems/ivi-system-x86_64.morph104
-rw-r--r--migrations3
-rw-r--r--partitioning/default9
-rw-r--r--partitioning/socfpga-devkit26
-rwxr-xr-xscripts/check-unpetrify-refs.py76
-rwxr-xr-xscripts/cycle.sh61
-rw-r--r--scripts/licensecheck.pl604
-rwxr-xr-xscripts/licensecheck.py201
-rwxr-xr-xscripts/organize-morphologies.py255
-rwxr-xr-xscripts/release-build192
-rw-r--r--scripts/release-build.test.conf6
-rwxr-xr-xscripts/release-test400
-rwxr-xr-xscripts/release-test-os526
-rwxr-xr-xscripts/release-upload473
-rw-r--r--scripts/release-upload.test.conf10
-rw-r--r--scripts/scriptslib.py156
-rwxr-xr-xscripts/yaml-jsonschema50
-rw-r--r--strata/CPAN-Mini-Inject.morph306
-rw-r--r--strata/CPAN-Mini-Inject/CPAN-Mini-Inject.morph3
-rw-r--r--strata/NetworkManager-common.morph47
-rw-r--r--strata/NetworkManager-common/ModemManager.morph9
-rw-r--r--strata/NetworkManager-common/NetworkManager.morph10
-rw-r--r--strata/ansible.morph26
-rw-r--r--strata/ansible/ansible.morph9
-rw-r--r--strata/ansible/openstack-ansible-modules.morph5
-rw-r--r--strata/armv7lhf-cross-toolchain.morph54
-rw-r--r--strata/armv7lhf-cross-toolchain/armv7lhf-cross-binutils.morph24
-rw-r--r--strata/armv7lhf-cross-toolchain/armv7lhf-cross-gcc-nolibc.morph73
-rw-r--r--strata/armv7lhf-cross-toolchain/armv7lhf-cross-gcc.morph47
-rw-r--r--strata/armv7lhf-cross-toolchain/armv7lhf-cross-glibc.morph51
-rw-r--r--strata/armv7lhf-cross-toolchain/armv7lhf-cross-libstdc++.morph32
-rw-r--r--strata/armv7lhf-cross-toolchain/armv7lhf-cross-linux-api-headers.morph10
-rw-r--r--strata/baserock-import.morph24
-rw-r--r--strata/bluetooth.morph39
-rw-r--r--strata/bluetooth/bluez-tools.morph10
-rw-r--r--strata/bluetooth/bluez.morph19
-rw-r--r--strata/bluetooth/libical.morph5
-rw-r--r--strata/bsp-armv5l-openbmc-aspeed.morph18
-rw-r--r--strata/bsp-armv5l-openbmc-aspeed/linux-armv5l-openbmc-aspeed.morph9
-rw-r--r--strata/bsp-armv5l-openbmc-aspeed/u-boot@aspeed.morph14
-rw-r--r--strata/bsp-armv7-highbank.morph17
-rw-r--r--strata/bsp-armv7-highbank/linux-armv7-highbank.morph52
-rw-r--r--strata/bsp-armv7-versatile.morph12
-rw-r--r--strata/bsp-armv7-versatile/linux-armv7-versatile.morph31
-rw-r--r--strata/bsp-armv7b-highbank.morph17
-rw-r--r--strata/bsp-armv7b-highbank/linux-armv7b-highbank.morph53
-rw-r--r--strata/bsp-armv7b-vexpress-tc2.morph11
-rw-r--r--strata/bsp-armv7b-vexpress-tc2/linux-armv7b-vexpress-tc2.morph57
-rw-r--r--strata/bsp-armv7l-altera-socfpga-devkit.morph39
-rw-r--r--strata/bsp-armv7l-altera-socfpga-devkit/bsp-support@socfpga-devkit.morph17
-rw-r--r--strata/bsp-armv7l-altera-socfpga-devkit/device-tree-compiler.morph6
-rw-r--r--strata/bsp-armv7l-altera-socfpga-devkit/linux-armv7l-altera-socfpga-devkit.morph34
-rw-r--r--strata/bsp-armv7l-altera-socfpga-devkit/preloader@socfpga-devkit.morph17
-rw-r--r--strata/bsp-armv7l-altera-socfpga-devkit/u-boot-tools@socfpga-devkit.morph14
-rw-r--r--strata/bsp-armv7l-altera-socfpga-devkit/u-boot@socfpga-devkit.morph9
-rw-r--r--strata/bsp-armv8b64-generic.morph15
-rw-r--r--strata/bsp-armv8b64-generic/linux-armv8b64-generic.morph278
-rw-r--r--strata/bsp-armv8l64-generic.morph14
-rw-r--r--strata/bsp-armv8l64-generic/linux-armv8l64-generic.morph276
-rw-r--r--strata/bsp-jetson.morph36
-rw-r--r--strata/bsp-jetson/device-tree-compiler@jetson.morph6
-rw-r--r--strata/bsp-jetson/linux-firmware@jetson.morph15
-rw-r--r--strata/bsp-jetson/linux-jetson-tk1.morph252
-rw-r--r--strata/bsp-jetson/u-boot@jetson.morph20
-rw-r--r--strata/bsp-ppc64-generic.morph11
-rw-r--r--strata/bsp-ppc64-generic/linux-ppc64.morph226
-rw-r--r--strata/bsp-wandboard.morph18
-rw-r--r--strata/bsp-wandboard/linux-armv7-wandboard.morph70
-rw-r--r--strata/bsp-wandboard/u-boot@wandboard.morph11
-rw-r--r--strata/bsp-x86_32-generic.morph26
-rw-r--r--strata/bsp-x86_32-generic/linux-x86-32-generic.morph299
-rw-r--r--strata/bsp-x86_32-generic/nasm.morph5
-rw-r--r--strata/bsp-x86_32-generic/syslinux.morph12
-rw-r--r--strata/bsp-x86_64-generic.morph26
-rw-r--r--strata/bsp-x86_64-generic/linux-x86-64-generic.morph300
-rw-r--r--strata/bsp-x86_64-generic/nasm.morph5
-rw-r--r--strata/bsp-x86_64-generic/syslinux.morph12
-rw-r--r--strata/bsp-x86_both-tools.morph21
-rw-r--r--strata/bsp-x86_both-tools/nasm.morph5
-rw-r--r--strata/bsp-x86_both-tools/syslinux.morph12
-rw-r--r--strata/build-essential.morph412
-rw-r--r--strata/build-essential/binutils.morph8
-rw-r--r--strata/build-essential/busybox.morph89
-rw-r--r--strata/build-essential/ccache.morph14
-rw-r--r--strata/build-essential/fhs-dirs.morph49
-rw-r--r--strata/build-essential/gawk.morph5
-rw-r--r--strata/build-essential/gcc.morph62
-rw-r--r--strata/build-essential/glibc.morph100
-rw-r--r--strata/build-essential/linux-api-headers.morph24
-rw-r--r--strata/build-essential/m4-tarball.morph5
-rw-r--r--strata/build-essential/make.morph5
-rw-r--r--strata/build-essential/stage1-binutils.morph23
-rw-r--r--strata/build-essential/stage1-gcc.morph83
-rw-r--r--strata/build-essential/stage2-binutils.morph21
-rw-r--r--strata/build-essential/stage2-busybox.morph80
-rw-r--r--strata/build-essential/stage2-fake-bash.morph4
-rw-r--r--strata/build-essential/stage2-fhs-dirs.morph51
-rw-r--r--strata/build-essential/stage2-gawk.morph9
-rw-r--r--strata/build-essential/stage2-gcc-fixed-headers.morph19
-rw-r--r--strata/build-essential/stage2-gcc.morph81
-rw-r--r--strata/build-essential/stage2-glibc.morph108
-rw-r--r--strata/build-essential/stage2-libstdc++.morph36
-rw-r--r--strata/build-essential/stage2-linux-api-headers.morph24
-rw-r--r--strata/build-essential/stage2-make.morph9
-rw-r--r--strata/build-essential/stage2-reset-specs.morph21
-rw-r--r--strata/build-essential/zlib.morph9
-rw-r--r--strata/cloudinit-support.morph21
-rw-r--r--strata/cloudinit-support/cloud-init.morph6
-rw-r--r--strata/connectivity.morph27
-rw-r--r--strata/connectivity/wpa_supplicant.morph36
-rw-r--r--strata/connman-common.morph16
-rw-r--r--strata/connman-common/connman.morph6
-rw-r--r--strata/connman-common/ofono.morph11
-rw-r--r--strata/corba.morph17
-rw-r--r--strata/corba/ACE_TAO.morph32
-rw-r--r--strata/corba/MPC.morph6
-rw-r--r--strata/core.morph471
-rw-r--r--strata/core/acl.morph6
-rw-r--r--strata/core/attr.morph19
-rw-r--r--strata/core/autoconf-tarball.morph5
-rw-r--r--strata/core/autoconf.morph5
-rw-r--r--strata/core/automake.morph8
-rw-r--r--strata/core/bash.morph36
-rw-r--r--strata/core/bison.morph6
-rw-r--r--strata/core/bzip2.morph10
-rw-r--r--strata/core/ca-certificates.morph26
-rw-r--r--strata/core/cmake.morph8
-rw-r--r--strata/core/curl.morph15
-rw-r--r--strata/core/e2fsprogs.morph27
-rw-r--r--strata/core/flex.morph14
-rw-r--r--strata/core/gdbm.morph8
-rw-r--r--strata/core/gettext-tarball.morph5
-rw-r--r--strata/core/git-minimal.morph7
-rw-r--r--strata/core/gperf.morph3
-rw-r--r--strata/core/gzip.morph6
-rw-r--r--strata/core/libcap2.morph6
-rw-r--r--strata/core/libexpat.morph6
-rw-r--r--strata/core/libffi.morph8
-rw-r--r--strata/core/libtool-tarball.morph5
-rw-r--r--strata/core/linux-pam.morph9
-rw-r--r--strata/core/mini-utils.morph7
-rw-r--r--strata/core/ncurses.morph45
-rw-r--r--strata/core/openssl-new.morph15
-rw-r--r--strata/core/patch.morph5
-rw-r--r--strata/core/perl.morph16
-rw-r--r--strata/core/pkg-config.morph5
-rw-r--r--strata/core/python3.morph15
-rw-r--r--strata/core/readline.morph8
-rw-r--r--strata/core/shadow.morph53
-rw-r--r--strata/core/texinfo-tarball.morph9
-rw-r--r--strata/core/util-linux.morph10
-rw-r--r--strata/coreutils-common.morph67
-rw-r--r--strata/coreutils-common/coreutils.morph12
-rw-r--r--strata/coreutils-common/diff.morph8
-rw-r--r--strata/coreutils-common/sed.morph8
-rw-r--r--strata/coreutils-common/tar.morph13
-rw-r--r--strata/cpp-common-libs.morph11
-rw-r--r--strata/cpp-common-libs/boost.morph9
-rw-r--r--strata/cross-bootstrap.morph29
-rw-r--r--strata/cross-bootstrap/groff.morph13
-rw-r--r--strata/cross-bootstrap/openssh.morph28
-rw-r--r--strata/cross-bootstrap/rsync.morph6
-rw-r--r--strata/cross-tools.morph11
-rw-r--r--strata/cups.morph11
-rw-r--r--strata/cups/cups.morph12
-rw-r--r--strata/data-indexing-management.morph40
-rw-r--r--strata/data-indexing-management/gmime.morph6
-rw-r--r--strata/data-indexing-management/libmediaart.morph5
-rw-r--r--strata/device-management.morph12
-rw-r--r--strata/devtools.morph55
-rw-r--r--strata/devtools/git.morph11
-rw-r--r--strata/devtools/nano.morph16
-rw-r--r--strata/devtools/screen.morph11
-rw-r--r--strata/devtools/vim.morph10
-rw-r--r--strata/devtools/wget.morph10
-rw-r--r--strata/dlna-services.morph51
-rw-r--r--strata/dlna-services/gssdp.morph5
-rw-r--r--strata/docutils.morph52
-rw-r--r--strata/docutils/docbook-xml.morph104
-rw-r--r--strata/docutils/docbook-xsl.morph50
-rw-r--r--strata/docutils/xml-catalog.morph6
-rw-r--r--strata/elixir.morph11
-rw-r--r--strata/elixir/elixir.morph6
-rw-r--r--strata/erlang.morph18
-rw-r--r--strata/erlang/erlang.morph9
-rw-r--r--strata/erlang/rebar.morph6
-rw-r--r--strata/foundation.morph131
-rw-r--r--strata/foundation/btrfs-progs.morph8
-rw-r--r--strata/foundation/dbus-pre.morph10
-rw-r--r--strata/foundation/dbus.morph10
-rw-r--r--strata/foundation/fuse.morph5
-rw-r--r--strata/foundation/groff.morph13
-rw-r--r--strata/foundation/kmod.morph23
-rw-r--r--strata/foundation/libarchive.morph6
-rw-r--r--strata/foundation/libgcrypt.morph10
-rw-r--r--strata/foundation/libgpg-error.morph7
-rw-r--r--strata/foundation/lzo.morph5
-rw-r--r--strata/foundation/openssh.morph32
-rw-r--r--strata/foundation/pciutils.morph11
-rw-r--r--strata/foundation/rsync.morph9
-rw-r--r--strata/foundation/systemd.morph31
-rw-r--r--strata/foundation/tbdiff.morph3
-rw-r--r--strata/foundation/time-zone-database.morph11
-rw-r--r--strata/geolocation.morph18
-rw-r--r--strata/geolocation/geoclue.morph13
-rw-r--r--strata/glib-common.morph38
-rw-r--r--strata/glib-common/glib.morph8
-rw-r--r--strata/graphics-common.morph110
-rw-r--r--strata/graphics-common/cairo.morph5
-rw-r--r--strata/graphics-common/chinese-fonts-truetype-bkai00mp.morph5
-rw-r--r--strata/graphics-common/chinese-fonts-truetype-bsmi00lp.morph5
-rw-r--r--strata/graphics-common/chinese-fonts-truetype-gbsn00lp.morph5
-rw-r--r--strata/graphics-common/chinese-fonts-truetype-gkai00mp.morph5
-rw-r--r--strata/graphics-common/fontconfig.morph7
-rw-r--r--strata/graphics-common/freefont-otf.morph5
-rw-r--r--strata/graphics-common/pixman.morph5
-rw-r--r--strata/graphics-common/ttf-alee.morph5
-rw-r--r--strata/gtk-deps.morph55
-rw-r--r--strata/gtk-deps/at-spi2-atk.morph5
-rw-r--r--strata/gtk-deps/at-spi2-core.morph5
-rw-r--r--strata/gtk-deps/gdk-pixbuf.morph8
-rw-r--r--strata/gtk-deps/shared-mime-info.morph8
-rw-r--r--strata/gtk2.morph12
-rw-r--r--strata/gtk2/gtk+.morph15
-rw-r--r--strata/gtk3.morph20
-rw-r--r--strata/gtk3/gtk3.morph15
-rw-r--r--strata/icu-common.morph10
-rw-r--r--strata/icu-common/icu.morph19
-rw-r--r--strata/initramfs-utils.morph11
-rw-r--r--strata/input-common.morph46
-rw-r--r--strata/input-common/libinput.morph8
-rw-r--r--strata/input-common/libxkbcommon-no-x11.morph12
-rw-r--r--strata/input-common/xkeyboard-config.morph7
-rw-r--r--strata/installer-utils.morph11
-rw-r--r--strata/installer-utils/installer-scripts.morph4
-rw-r--r--strata/ivi-common.morph12
-rw-r--r--strata/ivi-common/automotive-message-broker.morph20
-rw-r--r--strata/libdrm-common.morph17
-rw-r--r--strata/libdrm-common/drm.morph7
-rw-r--r--strata/libsoup-common.morph11
-rw-r--r--strata/libsoup-common/libsoup.morph6
-rw-r--r--strata/lighttpd-server.morph12
-rw-r--r--strata/lighttpd-server/lighttpd.morph6
-rw-r--r--strata/llvm-common.morph10
-rw-r--r--strata/llvm-common/llvm.morph24
-rw-r--r--strata/lorry.morph125
-rw-r--r--strata/lorry/cvs-tarball.morph10
-rw-r--r--strata/lorry/cvsps.morph6
-rw-r--r--strata/lorry/hg-fast-export.morph10
-rw-r--r--strata/lorry/libapr-util.morph7
-rw-r--r--strata/lorry/libapr.morph21
-rw-r--r--strata/lorry/libserf.morph6
-rw-r--r--strata/lorry/lorry.morph3
-rw-r--r--strata/lorry/mercurial-tarball.morph6
-rw-r--r--strata/lorry/neon.morph8
-rw-r--r--strata/lorry/perl-dbi-tarball.morph5
-rw-r--r--strata/lorry/subversion-tarball.morph12
-rw-r--r--strata/lorry/swig.morph7
-rw-r--r--strata/lua53.morph11
-rw-r--r--strata/lua53/lua53.morph9
-rw-r--r--strata/mesa-common.morph22
-rw-r--r--strata/mesa-common/mesa.morph24
-rw-r--r--strata/mesa-demos-common.morph37
-rw-r--r--strata/mesa-demos-common/glew.morph6
-rw-r--r--strata/morph-utils.morph54
-rw-r--r--strata/morph-utils/cmdtest.morph6
-rw-r--r--strata/morph-utils/pyfilesystem.morph6
-rw-r--r--strata/morph-utils/python-ttystatus.morph6
-rw-r--r--strata/mtd-utilities.morph11
-rw-r--r--strata/mtd-utilities/mtd-utils.morph6
-rw-r--r--strata/multimedia-common.morph64
-rw-r--r--strata/multimedia-common/libmad.morph10
-rw-r--r--strata/multimedia-common/libmpeg2.morph6
-rw-r--r--strata/multimedia-common/libvpx.morph14
-rw-r--r--strata/multimedia-common/orc.morph5
-rw-r--r--strata/multimedia-common/yasm.morph4
-rw-r--r--strata/multimedia-gstreamer-openmax-generic.morph14
-rw-r--r--strata/multimedia-gstreamer-openmax-generic/gst-omx.morph7
-rw-r--r--strata/multimedia-gstreamer.morph63
-rw-r--r--strata/multimedia-gstreamer/gst-libav.morph5
-rw-r--r--strata/multimedia-hardware-codecs-x86.morph31
-rw-r--r--strata/navigation.morph11
-rw-r--r--strata/navigation/navit.morph5
-rw-r--r--strata/network-security.morph47
-rw-r--r--strata/network-security/gnutls.morph6
-rw-r--r--strata/network-security/libtasn1.morph6
-rw-r--r--strata/network-security/nettle.morph6
-rw-r--r--strata/network-security/nspr.morph12
-rw-r--r--strata/network-security/nss.morph32
-rw-r--r--strata/network-security/p11-kit.morph5
-rw-r--r--strata/nfs.morph31
-rw-r--r--strata/nfs/nfs-utils.morph13
-rw-r--r--strata/nfs/rpcbind.morph11
-rw-r--r--strata/nfs/tcp-wrappers.morph9
-rw-r--r--strata/nfs/ti-rpc.morph6
-rw-r--r--strata/nodejs.morph12
-rw-r--r--strata/nodejs/node.morph9
-rw-r--r--strata/openbmc.morph22
-rw-r--r--strata/openbmc/i2c-tools.morph16
-rw-r--r--strata/openbmc/isc-dhcp.morph3
-rw-r--r--strata/openbmc/lm_sensors.morph7
-rw-r--r--strata/openstack-clients.morph154
-rw-r--r--strata/openstack-common.morph140
-rw-r--r--strata/openstack-common/babel.morph8
-rw-r--r--strata/ostree-core.morph38
-rw-r--r--strata/ostree-core/gpgme.morph7
-rw-r--r--strata/ostree-core/libassuan.morph7
-rw-r--r--strata/ostree-core/ostree.morph7
-rw-r--r--strata/pcre-utils.morph10
-rw-r--r--strata/pcre-utils/pcre.morph6
-rw-r--r--strata/perl-common.morph388
-rw-r--r--strata/perl-common/List-MoreUtils.morph9
-rw-r--r--strata/privileges-management.morph21
-rw-r--r--strata/privileges-management/mozjs17.morph18
-rw-r--r--strata/privileges-management/polkit.morph11
-rw-r--r--strata/python-cliapp.morph26
-rw-r--r--strata/python-cliapp/python-coveragepy.morph6
-rw-r--r--strata/python-common.morph93
-rw-r--r--strata/python-common/pycrypto.morph3
-rw-r--r--strata/python-pygobject.morph13
-rw-r--r--strata/python-pygobject/pygobject.morph5
-rw-r--r--strata/python-tools.morph29
-rw-r--r--strata/python-wsgi.morph17
-rw-r--r--strata/python2-core.morph107
-rw-r--r--strata/python2-core/python2.morph13
-rw-r--r--strata/python2-core/pyyaml-python2.morph6
-rw-r--r--strata/python3-gobject.morph13
-rw-r--r--strata/python3-gobject/python3-gobject.morph5
-rw-r--r--strata/qt5-sdk.morph15
-rw-r--r--strata/qt5-sdk/qt-creator.morph8
-rw-r--r--strata/qt5-sdk/snowshoe.morph8
-rw-r--r--strata/qt5-tools-qtmultimedia.morph12
-rw-r--r--strata/qt5-tools-qtwayland.morph12
-rw-r--r--strata/qt5-tools-qtwayland/qtwayland.morph5
-rw-r--r--strata/qt5-tools-qtwebengine.morph23
-rw-r--r--strata/qt5-tools-qtwebkit.morph41
-rw-r--r--strata/qt5-tools.morph132
-rw-r--r--strata/qt5-tools/qtbase.morph5
-rw-r--r--strata/ruby.morph54
-rw-r--r--strata/ruby/bundler.morph6
-rw-r--r--strata/ruby/hoe.morph16
-rw-r--r--strata/ruby/rake-compiler.morph15
-rw-r--r--strata/ruby/ruby-1.8.morph9
-rw-r--r--strata/ruby/ruby.morph9
-rw-r--r--strata/samba.morph13
-rw-r--r--strata/samba/samba.morph127
-rw-r--r--strata/sandboxing.morph18
-rw-r--r--strata/secret-service.morph27
-rw-r--r--strata/secret-service/gnome-keyring.morph5
-rw-r--r--strata/secret-service/libsecret.morph5
-rw-r--r--strata/sound-server-pulseaudio.morph74
-rw-r--r--strata/sound-server-pulseaudio/alsa-utils.morph7
-rw-r--r--strata/sound-server-pulseaudio/avahi.morph16
-rw-r--r--strata/sound-server-pulseaudio/libsndfile.morph5
-rw-r--r--strata/sound-server-pulseaudio/pulseaudio.morph18
-rw-r--r--strata/sound-server-pulseaudio/webrtc-audio-processing.morph14
-rw-r--r--strata/spell-checking.morph16
-rw-r--r--strata/storage-management.morph40
-rw-r--r--strata/storage-management/gvfs.morph5
-rw-r--r--strata/storage-management/libatasmart.morph6
-rw-r--r--strata/storage-management/libmtp.morph8
-rw-r--r--strata/storage-management/udisks.morph5
-rw-r--r--strata/swift.morph53
-rw-r--r--strata/swift/gf-complete.morph19
-rw-r--r--strata/swift/liberasurecode.morph5
-rw-r--r--strata/swift/xattr.morph8
-rw-r--r--strata/tools.morph69
-rw-r--r--strata/tools/device-tree-compiler.morph6
-rw-r--r--strata/tools/distcc.morph10
-rw-r--r--strata/tools/gdb.morph6
-rw-r--r--strata/tools/git-fat.morph4
-rw-r--r--strata/tools/ipmitool.morph5
-rw-r--r--strata/tools/kexec-tools.morph6
-rw-r--r--strata/tools/lsof.morph12
-rw-r--r--strata/tools/parted.morph12
-rw-r--r--strata/tools/procps-ng.morph16
-rw-r--r--strata/tools/u-boot.morph11
-rw-r--r--strata/tools/zip.morph9
-rw-r--r--strata/unionfs-fuse-group.morph20
-rw-r--r--strata/unionfs-fuse-group/unionfs-fuse.morph12
-rw-r--r--strata/vala-common.morph35
-rw-r--r--strata/vala-common/vala-bootstrap.morph7
-rw-r--r--strata/virtualbox-guest-x86_64.morph22
-rw-r--r--strata/virtualbox-guest-x86_64/vboxguest.morph34
-rw-r--r--strata/virtualbox-guest-x86_64/yasm.morph4
-rw-r--r--strata/wayland-generic.morph17
-rw-r--r--strata/wayland-generic/wayland.morph7
-rw-r--r--strata/weston-common.morph14
-rw-r--r--strata/weston-common/weston.morph7
-rw-r--r--strata/x-common.morph405
-rw-r--r--strata/x-drivers.morph26
-rw-r--r--strata/x-generic.morph46
-rw-r--r--strata/x-generic/xserver.morph12
-rw-r--r--strata/xorg-util-macros-common.morph17
-rw-r--r--systems/armv7lhf-cross-toolchain-system-x86_32.morph19
-rw-r--r--systems/armv7lhf-cross-toolchain-system-x86_64.morph19
-rw-r--r--systems/base-system-armv7-highbank.morph20
-rw-r--r--systems/base-system-armv7-versatile.morph20
-rw-r--r--systems/base-system-armv7b-highbank.morph20
-rw-r--r--systems/base-system-armv7b-vexpress-tc2.morph19
-rw-r--r--systems/base-system-armv7l-altera-socfpga-devkit.morph21
-rw-r--r--systems/base-system-armv7lhf-highbank.morph20
-rw-r--r--systems/base-system-armv8b64.morph22
-rw-r--r--systems/base-system-armv8l64.morph22
-rw-r--r--systems/base-system-ppc64-generic.morph20
-rw-r--r--systems/base-system-x86_32-generic.morph19
-rw-r--r--systems/base-system-x86_64-generic.morph20
-rw-r--r--systems/build-system-armv5l-openbmc-aspeed.morph49
-rw-r--r--systems/build-system-armv7l-altera-socfpga-devkit.morph51
-rw-r--r--systems/build-system-armv7lhf-highbank.morph63
-rw-r--r--systems/build-system-armv7lhf-jetson.morph61
-rw-r--r--systems/build-system-armv7lhf-rootfs.morph59
-rw-r--r--systems/build-system-armv8b64.morph63
-rw-r--r--systems/build-system-armv8l64.morph63
-rw-r--r--systems/build-system-ppc64.morph61
-rw-r--r--systems/build-system-x86_32-chroot.morph61
-rw-r--r--systems/build-system-x86_32.morph61
-rw-r--r--systems/build-system-x86_64-chroot.morph61
-rw-r--r--systems/build-system-x86_64.morph61
-rw-r--r--systems/cross-bootstrap-system-armv5l-generic.morph25
-rw-r--r--systems/cross-bootstrap-system-armv7lhf-generic.morph25
-rw-r--r--systems/cross-bootstrap-system-armv8b64-generic.morph25
-rw-r--r--systems/cross-bootstrap-system-armv8l64-generic.morph25
-rw-r--r--systems/cross-bootstrap-system-ppc64-generic.morph25
-rw-r--r--systems/cross-bootstrap-system-x86_64-generic.morph25
-rw-r--r--systems/devel-system-armv7-chroot.morph72
-rw-r--r--systems/devel-system-armv7-highbank.morph75
-rw-r--r--systems/devel-system-armv7-versatile.morph73
-rw-r--r--systems/devel-system-armv7-wandboard.morph73
-rw-r--r--systems/devel-system-armv7b-chroot.morph64
-rw-r--r--systems/devel-system-armv7b-highbank.morph71
-rw-r--r--systems/devel-system-armv7l-altera-socfpga-devkit.morph66
-rw-r--r--systems/devel-system-armv7lhf-chroot.morph72
-rw-r--r--systems/devel-system-armv7lhf-highbank.morph78
-rw-r--r--systems/devel-system-armv7lhf-jetson.morph76
-rw-r--r--systems/devel-system-armv7lhf-wandboard.morph76
-rw-r--r--systems/devel-system-armv8b64.morph77
-rw-r--r--systems/devel-system-armv8l64.morph78
-rw-r--r--systems/devel-system-ppc64-chroot.morph70
-rw-r--r--systems/devel-system-ppc64-generic.morph73
-rw-r--r--systems/devel-system-x86_32-chroot.morph72
-rw-r--r--systems/devel-system-x86_32-generic.morph78
-rw-r--r--systems/devel-system-x86_64-chroot.morph74
-rw-r--r--systems/devel-system-x86_64-generic.morph83
-rw-r--r--systems/devel-system-x86_64-vagrant.morph76
-rw-r--r--systems/initramfs-x86_32.morph11
-rw-r--r--systems/initramfs-x86_64.morph11
-rw-r--r--systems/installer-system-armv8b64.morph41
-rw-r--r--systems/installer-system-x86_64.morph40
-rw-r--r--systems/minimal-system-armv5l-openbmc-aspeed.morph20
-rw-r--r--systems/minimal-system-x86_32-generic.morph21
-rw-r--r--systems/minimal-system-x86_64-chroot.morph12
-rw-r--r--systems/minimal-system-x86_64-generic.morph21
-rw-r--r--trove/clusters/mason-openstack.morph39
-rw-r--r--trove/clusters/mason.morph56
-rw-r--r--trove/clusters/trove-example.morph58
-rw-r--r--trove/clusters/trove.baserock.org-upgrade.morph19
-rw-r--r--trove/strata/fail2ban-common.morph14
-rw-r--r--trove/strata/fail2ban-common/fail2ban.morph6
-rw-r--r--trove/strata/lorry-controller.morph16
-rw-r--r--trove/strata/lorry-controller/lorry-controller.morph10
-rw-r--r--trove/strata/python3-core.morph58
-rw-r--r--trove/strata/python3-core/pyyaml.morph6
-rw-r--r--trove/strata/trove.morph101
-rw-r--r--trove/strata/trove/cgit.morph6
-rw-r--r--trove/strata/trove/clod.morph7
-rw-r--r--trove/strata/trove/gall.morph7
-rw-r--r--trove/strata/trove/gitano.morph5
-rw-r--r--trove/strata/trove/lace.morph7
-rw-r--r--trove/strata/trove/lrexlib-pcre.morph9
-rw-r--r--trove/strata/trove/lua-scrypt.morph4
-rw-r--r--trove/strata/trove/lua.morph11
-rw-r--r--trove/strata/trove/luxio.morph7
-rw-r--r--trove/strata/trove/supple.morph7
-rw-r--r--trove/strata/trove/trove-setup.morph4
-rw-r--r--trove/systems/trove-system-x86_64.morph65
-rw-r--r--unmaintained/clusters/cephclient.morph20
-rw-r--r--unmaintained/clusters/example-ceph-cluster-on-openstack.morph55
-rw-r--r--unmaintained/clusters/example-swift-storage-cluster.morph62
-rw-r--r--unmaintained/clusters/openstack-one-node-swift.morph142
-rw-r--r--unmaintained/clusters/openstack-one-node.morph104
-rw-r--r--unmaintained/clusters/openstack-three-node-installer.morph238
-rw-r--r--unmaintained/clusters/openstack-two-node-installer.morph199
-rw-r--r--unmaintained/clusters/xfce-system-x86_64-deploy.morph23
-rw-r--r--unmaintained/clusters/zookeeper.morph21
-rw-r--r--unmaintained/strata/apache-httpd-server.morph41
-rw-r--r--unmaintained/strata/apache-httpd-server/apr.morph22
-rw-r--r--unmaintained/strata/apache-httpd-server/httpd-server.morph67
-rw-r--r--unmaintained/strata/apache-httpd-server/mod_wsgi.morph18
-rw-r--r--unmaintained/strata/ceph-service.morph73
-rw-r--r--unmaintained/strata/ceph-service/ceph.morph26
-rw-r--r--unmaintained/strata/ceph-service/keyutils.morph7
-rw-r--r--unmaintained/strata/ceph-service/leveldb.morph9
-rw-r--r--unmaintained/strata/ceph-service/libaio.morph7
-rw-r--r--unmaintained/strata/chef.morph193
-rw-r--r--unmaintained/strata/chef/chef-12.0.0.alpha.0.morph20
-rw-r--r--unmaintained/strata/chef/chef-zero-2.2.morph13
-rw-r--r--unmaintained/strata/chef/coderay-1.1.0.morph13
-rw-r--r--unmaintained/strata/chef/diff-lcs-1.2.5.morph13
-rw-r--r--unmaintained/strata/chef/erubis-master.morph19
-rw-r--r--unmaintained/strata/chef/ffi-1.9.3.morph13
-rw-r--r--unmaintained/strata/chef/ffi-yajl-1.0.2.morph13
-rw-r--r--unmaintained/strata/chef/hashie-2.1.2.morph13
-rw-r--r--unmaintained/strata/chef/highline-1.6.21.morph13
-rw-r--r--unmaintained/strata/chef/hoe-master.morph13
-rw-r--r--unmaintained/strata/chef/ipaddress-0.8.0.morph13
-rw-r--r--unmaintained/strata/chef/json-1.8.1.morph13
-rw-r--r--unmaintained/strata/chef/libpopt.morph6
-rw-r--r--unmaintained/strata/chef/libyajl2-1.0.1.morph13
-rw-r--r--unmaintained/strata/chef/method_source-0.8.2.morph13
-rw-r--r--unmaintained/strata/chef/mime-types-1.25.1.morph13
-rw-r--r--unmaintained/strata/chef/mixlib-authentication-1.3.0.morph13
-rw-r--r--unmaintained/strata/chef/mixlib-cli-1.5.0.morph13
-rw-r--r--unmaintained/strata/chef/mixlib-config-2.1.0.morph13
-rw-r--r--unmaintained/strata/chef/mixlib-log-1.6.0.morph13
-rw-r--r--unmaintained/strata/chef/mixlib-shellout-1.4.0.morph13
-rw-r--r--unmaintained/strata/chef/net-dhcp-1.2.1.morph13
-rw-r--r--unmaintained/strata/chef/net-ssh-2.9.1.morph15
-rw-r--r--unmaintained/strata/chef/net-ssh-gateway-1.2.0.morph15
-rw-r--r--unmaintained/strata/chef/net-ssh-multi-1.2.0.morph15
-rw-r--r--unmaintained/strata/chef/ohai-7.4.0.dev.morph13
-rw-r--r--unmaintained/strata/chef/plist-master.morph13
-rw-r--r--unmaintained/strata/chef/pry-0.10.1.morph13
-rw-r--r--unmaintained/strata/chef/rack-1.5.2.morph13
-rw-r--r--unmaintained/strata/chef/sgdisk.morph7
-rw-r--r--unmaintained/strata/chef/slop-3.6.0.morph13
-rw-r--r--unmaintained/strata/chef/systemu-2.6.4.morph13
-rw-r--r--unmaintained/strata/chef/wmi-lite-1.0.0.morph13
-rw-r--r--unmaintained/strata/chef/yajl.morph6
-rw-r--r--unmaintained/strata/cxmanage.morph36
-rw-r--r--unmaintained/strata/cxmanage/pexpect.morph10
-rw-r--r--unmaintained/strata/databases.morph35
-rw-r--r--unmaintained/strata/databases/memcached.morph21
-rw-r--r--unmaintained/strata/databases/redis.morph6
-rw-r--r--unmaintained/strata/django.morph37
-rw-r--r--unmaintained/strata/enlightenment.morph80
-rw-r--r--unmaintained/strata/enlightenment/bullet3.morph8
-rw-r--r--unmaintained/strata/enlightenment/efl.morph9
-rw-r--r--unmaintained/strata/enlightenment/elementary.morph8
-rw-r--r--unmaintained/strata/enlightenment/enlightenment.morph8
-rw-r--r--unmaintained/strata/enlightenment/eterm.morph8
-rw-r--r--unmaintained/strata/enlightenment/evas_generic_loaders.morph8
-rw-r--r--unmaintained/strata/enlightenment/imlib2.morph8
-rw-r--r--unmaintained/strata/enlightenment/libast.morph8
-rw-r--r--unmaintained/strata/java.morph22
-rw-r--r--unmaintained/strata/java/java-ant.morph8
-rw-r--r--unmaintained/strata/java/java-binary.morph16
-rw-r--r--unmaintained/strata/lua51.morph16
-rw-r--r--unmaintained/strata/lua51/lua51.morph11
-rw-r--r--unmaintained/strata/lua51/luajit2.morph7
-rw-r--r--unmaintained/strata/lvm.morph15
-rw-r--r--unmaintained/strata/lvm/lvm2.morph32
-rw-r--r--unmaintained/strata/multimedia-gstreamer-0.10.morph38
-rw-r--r--unmaintained/strata/multimedia-gstreamer-0.10/gstreamer-plugins-base@0.10.morph14
-rw-r--r--unmaintained/strata/networking-utils.morph105
-rw-r--r--unmaintained/strata/networking-utils/conntrack-tools.morph4
-rw-r--r--unmaintained/strata/networking-utils/ebtables.morph7
-rw-r--r--unmaintained/strata/networking-utils/iproute2.morph10
-rw-r--r--unmaintained/strata/networking-utils/ipset.morph6
-rw-r--r--unmaintained/strata/networking-utils/iputils.morph24
-rw-r--r--unmaintained/strata/networking-utils/libnet.morph16
-rw-r--r--unmaintained/strata/networking-utils/libnetfilter_conntrack.morph3
-rw-r--r--unmaintained/strata/networking-utils/libnetfilter_cthelper.morph3
-rw-r--r--unmaintained/strata/networking-utils/libnetfilter_cttimeout.morph3
-rw-r--r--unmaintained/strata/networking-utils/libnetfilter_queue.morph3
-rw-r--r--unmaintained/strata/networking-utils/libnfnetlink.morph3
-rw-r--r--unmaintained/strata/networking-utils/libpcap.morph3
-rw-r--r--unmaintained/strata/networking-utils/tcpdump.morph3
-rw-r--r--unmaintained/strata/ntpd.morph10
-rw-r--r--unmaintained/strata/ntpd/ntpd.morph51
-rw-r--r--unmaintained/strata/ocaml-language.morph11
-rw-r--r--unmaintained/strata/ocaml-language/ocaml.morph8
-rw-r--r--unmaintained/strata/openstack-clients/appdirs.morph3
-rw-r--r--unmaintained/strata/openstack-clients/argparse.morph3
-rw-r--r--unmaintained/strata/openstack-clients/cliff-tablib.morph3
-rw-r--r--unmaintained/strata/openstack-clients/os-client-config.morph3
-rw-r--r--unmaintained/strata/openstack-clients/pyparsing.morph6
-rw-r--r--unmaintained/strata/openstack-clients/python-ironicclient.morph3
-rw-r--r--unmaintained/strata/openstack-clients/python-openstackclient.morph3
-rw-r--r--unmaintained/strata/openstack-clients/tablib.morph3
-rw-r--r--unmaintained/strata/openstack-services.morph805
-rw-r--r--unmaintained/strata/openstack-services/ceilometer.morph23
-rw-r--r--unmaintained/strata/openstack-services/cinder.morph21
-rw-r--r--unmaintained/strata/openstack-services/erlang-sd_notify.morph8
-rw-r--r--unmaintained/strata/openstack-services/glance.morph29
-rw-r--r--unmaintained/strata/openstack-services/horizon.morph63
-rw-r--r--unmaintained/strata/openstack-services/ipaddr-py.morph6
-rw-r--r--unmaintained/strata/openstack-services/ironic.morph18
-rw-r--r--unmaintained/strata/openstack-services/keystone.morph9
-rw-r--r--unmaintained/strata/openstack-services/librabbitmq.morph10
-rw-r--r--unmaintained/strata/openstack-services/neutron.morph27
-rw-r--r--unmaintained/strata/openstack-services/nova.morph24
-rw-r--r--unmaintained/strata/openstack-services/novnc.morph11
-rw-r--r--unmaintained/strata/openstack-services/open-iscsi.morph46
-rw-r--r--unmaintained/strata/openstack-services/pysendfile.morph3
-rw-r--r--unmaintained/strata/openstack-services/qpid-python.morph6
-rw-r--r--unmaintained/strata/openstack-services/rabbitmq-codegen.morph7
-rw-r--r--unmaintained/strata/openstack-services/rabbitmq-server.morph16
-rw-r--r--unmaintained/strata/openstack-services/rtslib-fb.morph27
-rw-r--r--unmaintained/strata/openstack-services/singledispatch.morph3
-rw-r--r--unmaintained/strata/openstack-services/tempest.morph12
-rw-r--r--unmaintained/strata/openstack-services/tftp-hpa.morph5
-rw-r--r--unmaintained/strata/openstack-services/thrift.morph6
-rw-r--r--unmaintained/strata/qt4-sdk.morph14
-rw-r--r--unmaintained/strata/qt4-sdk/qt-creator.morph9
-rw-r--r--unmaintained/strata/qt4-tools.morph28
-rw-r--r--unmaintained/strata/qt4-tools/qt4-tools.morph18
-rw-r--r--unmaintained/strata/qt4-tools/ruby-1.8.morph9
-rw-r--r--unmaintained/strata/qt4-tools/ruby-1.9.morph9
-rw-r--r--unmaintained/strata/test-tools.morph133
-rw-r--r--unmaintained/strata/test-tools/subunit.morph3
-rw-r--r--unmaintained/strata/virtualization.morph117
-rw-r--r--unmaintained/strata/virtualization/dmidecode.morph7
-rw-r--r--unmaintained/strata/virtualization/dnsmasq.morph10
-rw-r--r--unmaintained/strata/virtualization/libosinfo.morph11
-rw-r--r--unmaintained/strata/virtualization/libvirt.morph34
-rw-r--r--unmaintained/strata/virtualization/openvswitch.morph11
-rw-r--r--unmaintained/strata/virtualization/qemu.morph5
-rw-r--r--unmaintained/strata/virtualization/yajl.morph8
-rw-r--r--unmaintained/strata/webtools.morph18
-rw-r--r--unmaintained/strata/webtools/nginx.morph14
-rw-r--r--unmaintained/strata/xfce.morph159
-rw-r--r--unmaintained/strata/xfce/elementary-xfce.morph10
-rw-r--r--unmaintained/strata/xfce/exo.morph8
-rw-r--r--unmaintained/strata/xfce/garcon.morph8
-rw-r--r--unmaintained/strata/xfce/gtk-xfce-engine-2.morph8
-rw-r--r--unmaintained/strata/xfce/libwnck.morph11
-rw-r--r--unmaintained/strata/xfce/libxfce4ui.morph8
-rw-r--r--unmaintained/strata/xfce/libxfce4util.morph8
-rw-r--r--unmaintained/strata/xfce/thunar.morph9
-rw-r--r--unmaintained/strata/xfce/tumbler.morph8
-rw-r--r--unmaintained/strata/xfce/xfce4-appfinder.morph8
-rw-r--r--unmaintained/strata/xfce/xfce4-panel.morph8
-rw-r--r--unmaintained/strata/xfce/xfce4-session.morph9
-rw-r--r--unmaintained/strata/xfce/xfce4-settings.morph8
-rw-r--r--unmaintained/strata/xfce/xfconf.morph8
-rw-r--r--unmaintained/strata/xfce/xfdesktop.morph8
-rw-r--r--unmaintained/strata/xfce/xfwm4.morph11
-rw-r--r--unmaintained/strata/xstatic.morph154
-rw-r--r--unmaintained/strata/zookeeper-client.morph16
-rw-r--r--unmaintained/strata/zookeeper-server.morph11
-rw-r--r--unmaintained/strata/zookeeper.morph14
-rw-r--r--unmaintained/strata/zookeeper/zookeeper-client.morph17
-rw-r--r--unmaintained/strata/zookeeper/zookeeper-server.morph30
-rw-r--r--unmaintained/strata/zookeeper/zookeeper.morph14
-rw-r--r--unmaintained/systems/ceph-service-x86_64-generic.morph70
-rw-r--r--unmaintained/systems/chef-system-x86_64-container.morph32
-rw-r--r--unmaintained/systems/cxmanage-system-x86_64-generic.morph28
-rw-r--r--unmaintained/systems/java-build-system-x86_64-generic.morph90
-rw-r--r--unmaintained/systems/nodejs-system-x86_64.morph24
-rw-r--r--unmaintained/systems/ocaml-system-x86_64.morph20
-rw-r--r--unmaintained/systems/openstack-system-x86_64.morph88
-rw-r--r--unmaintained/systems/qt4-devel-system-x86_64-generic.morph52
-rw-r--r--unmaintained/systems/qt5-devel-system-x86_64-generic.morph54
-rw-r--r--unmaintained/systems/swift-system-x86_64.morph34
-rw-r--r--unmaintained/systems/web-system-x86_64-generic.morph43
-rw-r--r--unmaintained/systems/xfce-system-x86_64.morph79
-rw-r--r--unmaintained/systems/zookeeper-client-x86_64.morph30
-rw-r--r--unmaintained/systems/zookeeper-server-x86_64.morph30
-rw-r--r--weston/clusters/weston-qt5-system-x86_64-deploy.morph23
-rw-r--r--weston/clusters/weston-system-x86_64-generic-deploy.morph23
-rw-r--r--weston/systems/weston-qt5-system-x86_64.morph70
-rw-r--r--weston/systems/weston-system-armv7lhf-jetson.morph58
-rw-r--r--weston/systems/weston-system-x86_64-generic.morph57
1055 files changed, 58431 insertions, 15 deletions
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..eaa89f8d
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+*.morph gitlab-language=yaml
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 96f5d99a..7330df69 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,22 +1,118 @@
-image: samthursfield/buildstream:0.1-20170627.1
+image: debian:stretch
-before_script:
- # Update to latest BuildStream commit
- - cd ~/buildstream
- - git remote update origin
- - git reset --hard origin/master
- - pip3 install .
- - cd -
-
- # Work around https://github.com/fedora-cloud/docker-brew-fedora/issues/14
- - export LANG="C.UTF-8"
- - export LC_ALL="C.UTF-8"
+variables:
+ YBD_base: "/cache/ybd_base"
+ YBD_gits: "/cache/ybd_base/gits"
+
+cache:
+ paths:
+ - "${YBD_gits}/"
-# We are limited to simple CI unless we provide our own GitLab CI runners.
stages:
- validate
+ - build-1
+ - deploy-1
+ - build-2
+ - build-3
+
+before_script:
+ - export LC_ALL="C.UTF-8"
+ - apt-get update -qq && apt-get install -y -qq git python-dev
+ - export CI_YBD_BRANCH=`[[ "$CI_BUILD_REF_NAME" =~ ^staging/fromybd/ ]] && echo -b ${CI_BUILD_REF_NAME#staging/fromybd/}`
+ - git clone https://gitlab.com/baserock/spec.git
+ - git clone https://gitlab.com/baserock/ybd.git $CI_YBD_BRANCH
+ - cd ybd && ./install_dependencies.sh && cd ..
+ - pip install -r spec/requirements.txt
-validate:
+validate-all-definitions:
stage: validate
script:
- - bst --colors show gnu-toolchain.bst
+ - python spec/quick_check.py .
+
+build-system-x86_64-chroot-build:
+ stage: build-1
+ script:
+ - ybd/ybd.py systems/build-system-x86_64-chroot.morph x86_64
+
+build-system-x86_64-chroot-deploy:
+ stage: deploy-1
+ dependencies:
+ - build-system-x86_64-chroot-build
+ script:
+ - ybd/ybd.py clusters/build-system-x86_64-chroot-deploy.morph x86_64
+ artifacts:
+ name: "${CI_BUILD_NAME}-${CI_BUILD_REF}"
+ paths:
+ - build-system-x86_64-chroot.tar
+
+#build-system-armv7lhf-rootfs-build:
+# stage: build-1
+# script:
+# - sudo ybd/ybd.py systems/build-system-armv7lhf-rootfs.morph armv7lhf
+# tags:
+# - armv7l
+# only:
+# - master
+# - /^staging\/.*$/
+
+devel-build-64:
+ stage: build-2
+ script:
+ - ybd/ybd.py systems/devel-system-x86_64-generic.morph x86_64
+
+genivi-baseline-build-64:
+ stage: build-2
+ script:
+ - ybd/ybd.py genivi/systems/genivi-baseline-system-x86_64-generic.morph x86_64
+ - ybd/ybd.py systems/initramfs-x86_64.morph x86_64
+
+genivi-demo-platform-build-64:
+ stage: build-3
+ script:
+ - ybd/ybd.py genivi/systems/genivi-demo-platform-x86_64-generic.morph x86_64
+ - ybd/ybd.py systems/initramfs-x86_64.morph x86_64
+
+ivi-build-64:
+ stage: build-3
+ script:
+ - ybd/ybd.py ivi/systems/ivi-system-x86_64.morph x86_64
+ - ybd/ybd.py systems/initramfs-x86_64.morph x86_64
+
+gnome-build-64:
+ stage: build-3
+ script:
+ - ybd/ybd.py gnome/systems/gnome-system-x86_64.morph x86_64
+ - ybd/ybd.py systems/initramfs-x86_64.morph x86_64
+
+minimal-build-64:
+ stage: build-1
+ script:
+ - ybd/ybd.py systems/minimal-system-x86_64-chroot.morph x86_64
+
+minimal-system-x86_64-chroot-deploy:
+ stage: deploy-1
+ dependencies:
+ - minimal-build-64
+ script:
+ - ybd/ybd.py clusters/minimal-system-x86_64-chroot-deploy.morph x86_64
+ artifacts:
+ name: "${CI_BUILD_NAME}-${CI_BUILD_REF}"
+ paths:
+ - minimal-system-x86_64-chroot.tar
+
+trove-build-64:
+ stage: build-2
+ script:
+ - ybd/ybd.py trove/systems/trove-system-x86_64.morph x86_64
+
+weston-build-64:
+ stage: build-2
+ script:
+ - ybd/ybd.py weston/systems/weston-system-x86_64-generic.morph x86_64
+ - ybd/ybd.py systems/initramfs-x86_64.morph x86_64
+
+weston-qt-build-64:
+ stage: build-3
+ script:
+ - ybd/ybd.py weston/systems/weston-qt5-system-x86_64.morph x86_64
+ - ybd/ybd.py systems/initramfs-x86_64.morph x86_64
diff --git a/.gitreview b/.gitreview
new file mode 100644
index 00000000..5da687ee
--- /dev/null
+++ b/.gitreview
@@ -0,0 +1,5 @@
+[gerrit]
+host=gerrit.baserock.org
+port=29418
+project=baserock/baserock/definitions
+defaultbranch=master
diff --git a/DEFAULTS b/DEFAULTS
new file mode 100644
index 00000000..402e5889
--- /dev/null
+++ b/DEFAULTS
@@ -0,0 +1,252 @@
+# Baserock definitions defaults
+# =============================
+#
+# The DEFAULTS file is treated specially by Baserock build tools.
+#
+# For more information, see: <http://wiki.baserock.org/definitions/current>.
+
+
+# Baserock Definitions Build Step Defaults
+# ----------------------------------------
+#
+# The default names and ordering for build steps in a given chunk.
+#
+build-steps: ['pre-bootstrap-commands',
+ 'bootstrap-commands',
+ 'post-bootstrap-commands',
+ 'pre-configure-commands',
+ 'configure-commands',
+ 'post-configure-commands',
+ 'pre-build-commands',
+ 'build-commands',
+ 'post-build-commands',
+ 'pre-test-commands',
+ 'test-commands',
+ 'post-test-commands',
+ 'pre-install-commands',
+ 'install-commands',
+ 'post-install-commands',
+ 'pre-strip-commands',
+ 'strip-commands',
+ 'post-strip-commands']
+
+
+# Predefined architecture constants
+# ---------------------------------
+#
+# Mapping from definitions architecture keywords to compiler keywords
+#
+cpus:
+ x86_32: 'i686'
+ armv8l64: 'aarch64'
+ armv8b64: 'aarch64_be'
+ mips64b: 'mips64'
+ mips64l: 'mips64el'
+ mips32b: 'mips'
+ mips32l: 'mipsel'
+
+
+# Predefined build commands
+# -------------------------
+#
+# Common patterns in build instructions can be defined here, which can save
+# users from having to write lots of similar-looking chunk .morph files.
+#
+# There are pre- and post- variants for each set of commands. These exist so
+# you can add more commands without having to copy the defaults. For example,
+# to create an extra symlink after running `make install`, you can use
+# post-install-commands. Since these exist as a way of extending the defaults,
+# you cannot set default values for the pre- and post- commands.
+#
+# The set of environment variables available when these commands are executed
+# is not formally specified right now, but you can assume PREFIX, DESTDIR and
+# MORPH_ARCH are all set.
+#
+build-systems:
+ manual:
+ # The special, default 'no-op' build system.
+ configure-commands: []
+ build-commands: []
+ install-commands: []
+ strip-commands: []
+
+ autotools:
+ # GNU Autoconf and GNU Automake, or anything which follow the same pattern.
+ #
+ # See also: https://github.com/cgwalters/build-api/blob/master/build-api.md
+ configure-commands:
+ - >-
+ export NOCONFIGURE=1;
+ if [ -e autogen ]; then ./autogen;
+ elif [ -e autogen.sh ]; then ./autogen.sh;
+ elif [ -e bootstrap ]; then ./bootstrap;
+ elif [ -e bootstrap.sh ]; then ./bootstrap.sh;
+ elif [ ! -e ./configure ]; then autoreconf -ivf;
+ fi
+ - ./configure --prefix="$PREFIX"
+ --sysconfdir=/etc
+ --localstatedir=/var
+
+ build-commands:
+ - make
+ install-commands:
+ - make DESTDIR="$DESTDIR" install
+ strip-commands:
+ # TODO: Make idempotent when files are hardlinks
+ # Strip all ELF binary files that are executable or named like a library.
+ # .so files for C, .cmxs for OCaml and .node for Node.
+ #
+ # The file name and permissions checks are done with the `find` command before
+ # the ELF header is checked with the shell command, because it is a lot cheaper
+ # to check the mode and file name first, because it is a metadata check, rather
+ # than a subprocess and a file read.
+ #
+ # `file` is not used, to keep the dependency requirements down.
+ - &generic-strip-command |
+ find "$DESTDIR" -type f \
+ '(' -perm -111 -o -name '*.so*' -o -name '*.cmxs' -o -name '*.node' ')' \
+ -exec sh -ec \
+ 'read -n4 hdr <"$1" # check for elf header
+ if [ "$hdr" != "$(printf \\x7fELF)" ]; then
+ exit 0
+ fi
+ debugfile="$DESTDIR$PREFIX/lib/debug/$(basename "$1")"
+ mkdir -p "$(dirname "$debugfile")"
+ objcopy --only-keep-debug "$1" "$debugfile"
+ chmod 644 "$debugfile"
+ strip --remove-section=.comment --remove-section=.note --strip-unneeded "$1"
+ objcopy --add-gnu-debuglink "$debugfile" "$1"' - {} ';'
+
+ python-distutils:
+ # The Python distutils build systems.
+ configure-commands: []
+ build-commands:
+ - python setup.py build
+ install-commands:
+ - python setup.py install --prefix "$PREFIX" --root "$DESTDIR"
+ strip-commands:
+ - *generic-strip-command
+
+ python3-distutils:
+ # The Python distutils build systems.
+ configure-commands: []
+ build-commands:
+ - python3 setup.py build
+ install-commands:
+ - python3 setup.py install --prefix "$PREFIX" --root "$DESTDIR"
+ strip-commands:
+ - *generic-strip-command
+
+ cpan:
+ # The Perl ExtUtil::MakeMaker build system. This is called the 'cpan' build
+ # system for historical reasons.
+ #
+ # To install perl distributions into the correct location in our chroot
+ # we need to set PREFIX to <destdir>/<prefix> in the configure-commands.
+ #
+ # The mapping between PREFIX and the final installation
+ # directories is complex and depends upon the configuration of perl
+ # see,
+ # https://metacpan.org/pod/distribution/perl/INSTALL#Installation-Directories
+ # and ExtUtil::MakeMaker's documentation for more details.
+ configure-commands:
+ - perl Makefile.PL PREFIX=$DESTDIR$PREFIX
+ build-commands:
+ - make
+ install-commands:
+ - make install
+ strip-commands:
+ - *generic-strip-command
+
+ module-build:
+ # The Module::Build build system
+ #
+ # See the comment in ExtUtilsMakeMakerBuildSystem to see why --prefix is
+ # set to $DESTDIR$PREFIX here (--prefix in Module::Build has the same
+ # meaning as PREFIX in ExtUtils::MakeMaker).
+ configure-commands:
+ - perl Build.PL --prefix "$DESTDIR$PREFIX"
+ build-commands:
+ - ./Build
+ install-commands:
+ - ./Build install
+ strip-commands:
+ - *generic-strip-command
+
+ cmake:
+ # The CMake build system.
+ configure-commands:
+ - cmake -DCMAKE_INSTALL_PREFIX="$PREFIX"
+ build-commands:
+ - make
+ install-commands:
+ - make DESTDIR="$DESTDIR" install
+ strip-commands:
+ - *generic-strip-command
+
+ qmake:
+ # The Qt build system.
+ configure-commands:
+ - qmake -makefile
+ build-commands:
+ - make
+ install-commands:
+ - make INSTALL_ROOT="$DESTDIR" install
+ strip-commands:
+ - *generic-strip-command
+
+
+# Predefined artifact splitting rules
+# -----------------------------------
+#
+# Once a build has completed, you have some files that have been installed into
+# $DESTDIR. The splitting rules control how many 'artifact' tarballs are
+# generated as a result of the build, and which files from $DESTDIR end up in
+# which 'artifact'.
+#
+# The default split rules are defined here. These can be overriden in
+# individual chunk .morph files and stratum .morph files using the 'products'
+# field.
+#
+split-rules:
+ chunk:
+ - artifact: -bins
+ include:
+ - (usr/)?s?bin/.*
+ - artifact: -libs
+ include:
+ - (usr/)?lib(32|64)?/lib[^/]*\.so(\.\d+)*
+ - (usr/)libexec/.*
+ - artifact: -devel
+ include:
+ - (usr/)?include/.*
+ - (usr/)?lib(32|64)?/lib.*\.a
+ - (usr/)?lib(32|64)?/lib.*\.la
+ - (usr/)?(lib(32|64)?|share)/pkgconfig/.*\.pc
+ - artifact: -doc
+ include:
+ - (usr/)?share/doc/.*
+ - (usr/)?share/man/.*
+ - (usr/)?share/info/.*
+ - artifact: -locale
+ include:
+ - (usr/)?share/locale/.*
+ - (usr/)?share/i18n/.*
+ - (usr/)?share/zoneinfo/.*
+ - artifact: -misc
+ include:
+ - .*
+
+ stratum:
+ - artifact: -devel
+ include:
+ - .*-devel
+ - .*-debug
+ - .*-doc
+ - artifact: -runtime
+ include:
+ - .*-bins
+ - .*-libs
+ - .*-locale
+ - .*-misc
+ - .*
diff --git a/README b/README
new file mode 100644
index 00000000..ec38f9df
--- /dev/null
+++ b/README
@@ -0,0 +1,59 @@
+Baserock reference system definitions
+=====================================
+
+Baserock is a system for developing embedded and appliance Linux systems. For
+more information, see <http://wiki.baserock.org>.
+
+These are some example definitions for use with Baserock tooling. You can fork
+this repo and develop your own systems directly within it, or use it as a
+reference point when developing your own set of definitions.
+
+These definitions follow the Baserock definitions format, which is defined in
+spec.git repository (http://git.baserock.org/cgit/baserock/baserock/spec.git).
+
+The spec is readable online at <http://docs.baserock.org/spec>.
+
+The systems listed in the systems/ directory are example systems
+that build and run at some point. The only ones we can be sure
+that still build in current master of definitions are the ones that
+we keep building in our ci system; they are listed in
+http://git.baserock.org/cgit/baserock/baserock/definitions.git/tree/clusters/ci.morph
+
+Keeping up to date
+------------------
+
+The Baserock definitions format is evolving. A set of automated migrations is
+provided in the migrations/ directory of spec.git, for use when the format has
+changed and you want to bring your definitions up to date.
+
+Before running the migrations, you can use the 'migrations/indent' tool to
+format the definitions in the specific style that the migrations expect.
+The migrations use the 'ruamel.yaml' Python library for editing the .morph
+files. This library preserves comments, ordering and some of the formatting
+when it rewrites a .morph file. However, it does impose a certain line width
+and indent style.
+
+It makes a lot of sense to run the migrations with a *clean Git working tree*,
+so you can clearly see what changes they made, and can then choose to either
+commit them, tweak them, or revert them with `git reset --hard` and write an
+angry email.
+
+The suggested workflow is to run this from within your definitions.git clone:
+
+ git clone git://git.baserock.org/baserock/baserock/spec ../spec.git
+
+ git status # ensure a clean Git tree
+ ../spec/migrations/indent
+ git diff # check for any spurious changes
+ git commit -a -m "Fix formatting"
+ ../spec/migrations/run-all
+ git diff # check the results
+ git commit -a -m "Migrate to version xx of Baserock definitions format"
+
+If you are working in a fork of the Baserock definitions.git repo, you can
+also keep to date with using changes in 'master' using `git merge`. In general,
+we recommend first running the migrations, committing any changes they make,
+*then* merging in changes using `git merge`. This should minimise the number of
+merge conflicts, although merge conflicts are still possible.
+
+See migrations/GUIDELINES for information on how to write new migrations.
diff --git a/VERSION b/VERSION
new file mode 100644
index 00000000..9a47f2b9
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+version: 8
diff --git a/clusters/altera-socfpga-devkit-sd-image.morph b/clusters/altera-socfpga-devkit-sd-image.morph
new file mode 100644
index 00000000..71d3da2d
--- /dev/null
+++ b/clusters/altera-socfpga-devkit-sd-image.morph
@@ -0,0 +1,14 @@
+name: altera-socfpga-devkit-sd-image
+kind: cluster
+description: |
+ This cluster morph deploys a little endian Baserock system to
+ an SD image for the Altera Cyclone V development kit
+systems:
+- morph: systems/build-system-armv7l-altera-socfpga-devkit.morph
+ deploy:
+ self:
+ type: extensions/rawdisk
+ location: build-system-armv7l-altera-socfpga-devkit.img
+ DISK_SIZE: 7G
+ USE_PARTITIONING: yes
+ PARTITION_FILE: partitioning/socfpga-devkit
diff --git a/clusters/build-system-x86_64-chroot-deploy.morph b/clusters/build-system-x86_64-chroot-deploy.morph
new file mode 100644
index 00000000..ce0b26bc
--- /dev/null
+++ b/clusters/build-system-x86_64-chroot-deploy.morph
@@ -0,0 +1,9 @@
+name: build-system-x86_64-chroot-deploy
+kind: cluster
+systems:
+- morph: systems/build-system-x86_64-chroot.morph
+ deploy:
+ build-system-x86_64-chroot:
+ type: extensions/tar
+ location: build-system-x86_64-chroot.tar
+ HOSTNAME: build-system-x86-64-chroot
diff --git a/clusters/ci.morph b/clusters/ci.morph
new file mode 100644
index 00000000..a56e34ea
--- /dev/null
+++ b/clusters/ci.morph
@@ -0,0 +1,93 @@
+name: ci
+kind: cluster
+description: |
+ Deploy all the systems for CD.
+
+ This cluster morph is for use by the Mason Continuous Delivery pipeline
+ during development.
+systems:
+- morph: systems/minimal-system-x86_64-generic.morph
+ deploy:
+ minimal-system-x86_64-generic:
+ type: extensions/rawdisk
+ location: minimal-system-x86_64-generic.img
+ DISK_SIZE: 512M
+ INIT_SYSTEM: busybox
+- morph: systems/devel-system-x86_64-generic.morph
+ deploy:
+ devel-system-x86_64-generic:
+ 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: 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: extensions/rawdisk
+ location: build-system-armv7lhf-jetson.img
+ DISK_SIZE: 3G
+ BOOT_DEVICE: /dev/mmcblk0p1
+ ROOT_DEVICE: /dev/mmcblk0p2
+ DTB_PATH: boot/tegra124-jetson-tk1.dtb
+ BOOTLOADER_CONFIG_FORMAT: extlinux
+ BOOTLOADER_INSTALL: none
+ KERNEL_ARGS: cma=256M console=tty0 console=ttyS0,115200n8 no_console_suspend=1
+ nouveau.pstate=1
+- morph: gnome/systems/gnome-system-x86_64.morph
+ deploy:
+ gnome-system-x86_64:
+ type: extensions/rawdisk
+ location: gnome-system-x86_64.img
+ DISK_SIZE: 7G
+ KERNEL_ARGS: vga=788
+- morph: weston/systems/weston-system-armv7lhf-jetson.morph
+ deploy:
+ weston-system-armv7lhf-jetson:
+ type: extensions/rawdisk
+ location: weston-system-armv7lhf-jetson.img
+ DISK_SIZE: 4G
+ BOOT_DEVICE: /dev/mmcblk0p1
+ ROOT_DEVICE: /dev/mmcblk0p2
+ DTB_PATH: boot/tegra124-jetson-tk1.dtb
+ BOOTLOADER_CONFIG_FORMAT: extlinux
+ BOOTLOADER_INSTALL: none
+ KERNEL_ARGS: cma=256M console=tty0 console=ttyS0,115200n8 no_console_suspend=1
+ nouveau.pstate=1
+- morph: genivi/systems/genivi-baseline-system-x86_64-generic.morph
+ deploy:
+ genivi-baseline-system-x86_64-generic:
+ type: extensions/rawdisk
+ location: genivi-baseline-system-x86_64-generic.img
+ DISK_SIZE: 4G
+ KERNEL_ARGS: vga=788
+ GENIVI_WESTON_BACKEND: fbdev
+ GENIVI_WESTON_CONFIG: baseline
+ GENIVI_WESTON_AUTOSTART: False
+- morph: genivi/systems/genivi-baseline-system-armv7lhf-jetson.morph
+ deploy:
+ genivi-baseline-system-armv7lhf-jetson:
+ type: extensions/rawdisk
+ location: genivi-baseline-system-armv7lhf-jetson.img
+ DISK_SIZE: 4G
+ BOOT_DEVICE: /dev/mmcblk0p1
+ ROOT_DEVICE: /dev/mmcblk0p2
+ DTB_PATH: boot/tegra124-jetson-tk1.dtb
+ BOOTLOADER_CONFIG_FORMAT: extlinux
+ BOOTLOADER_INSTALL: none
+ KERNEL_ARGS: cma=256M console=tty0 console=ttyS0,115200n8 no_console_suspend=1
+ nouveau.pstate=1
+ GENIVI_WESTON_BACKEND: drm
+ GENIVI_WESTON_CONFIG: baseline
+ GENIVI_WESTON_AUTOSTART: True
+- morph: weston/systems/weston-qt5-system-x86_64.morph
+ deploy:
+ weston-qt5-system-x86_64.morph:
+ type: extensions/rawdisk
+ location: weston-qt5-system-x86_64.morph.img
+ DISK_SIZE: 4G
+ KERNEL_ARGS: vga=788
diff --git a/clusters/example-distbuild-cluster.morph b/clusters/example-distbuild-cluster.morph
new file mode 100644
index 00000000..5208a5ca
--- /dev/null
+++ b/clusters/example-distbuild-cluster.morph
@@ -0,0 +1,37 @@
+name: example-distbuild-cluster
+kind: cluster
+description: |
+ This is an example cluster morph that can be adapted to set up a
+ Baserock distributed build network.
+
+ You will need to deploy a Trove for the distributed build network
+ to use before deploying this cluster. The worker SSH key file should
+ be generated as part of the Trove deployment. It is the key used by
+ workers to authenticate with the Trove to give them read access to
+ all source repositories.
+systems:
+- morph: systems/build-system-x86_64.morph
+ deploy-defaults:
+ CONTROLLERHOST: build-controller
+ DISTBUILD_CONTROLLER: false
+ DISTBUILD_WORKER: true
+ FSTAB_SRC: LABEL=src /srv/distbuild auto defaults,rw,noatime 0 2
+ INSTALL_FILES: install-files/distbuild/manifest
+ NFSBOOT_CONFIGURE: true
+ TROVE_ID: $MY_TROVE
+ WORKER_SSH_KEY: ssh-keys/worker.key
+ deploy:
+ build-controller:
+ type: extensions/nfsboot
+ location: $MY_TROVE
+ DISTBUILD_CONTROLLER: true
+ HOSTNAME: build-controller
+ WORKERS: build-node-1, build-node-2
+ build-node-1:
+ type: extensions/nfsboot
+ location: $MY_TROVE
+ HOSTNAME: build-node-1
+ build-node-2:
+ type: extensions/nfsboot
+ location: $MY_TROVE
+ HOSTNAME: build-node-2
diff --git a/clusters/hardware-deployment.morph b/clusters/hardware-deployment.morph
new file mode 100644
index 00000000..674d6587
--- /dev/null
+++ b/clusters/hardware-deployment.morph
@@ -0,0 +1,35 @@
+name: hardware-deployment
+kind: cluster
+description: |
+ Deploy a build-system into hardware using the combination
+ of the pxeboot.write extension and the installer system.
+ This examples uses the spawn-novlan mode of pxeboot.write.
+systems:
+- morph: systems/installer-system-x86_64.morph
+ deploy:
+ installer:
+ type: extensions/pxeboot
+ location: AB:CD:EF:12:34:56:78 #MAC address.
+ PXEBOOT_MODE: spawn-novlan
+ PXEBOOT_DEPLOYER_INTERFACE: ens6
+ KERNEL_ARGS: console=ttyS1,9600 console=tty0 init=/usr/lib/baserock-installer/installer
+ HOSTNAME: installer-system
+ IPMI_USER: myipmiuser
+ IPMI_PASSWORD: myipmipassword
+ IPMI_HOST: 123.34.45.120 #IPMI ip address
+ INSTALLER_TARGET_STORAGE_DEVICE: /dev/sda
+ INSTALLER_ROOTFS_TO_INSTALL: /rootfs
+ subsystems:
+ - morph: systems/build-system-x86_64.morph
+ deploy:
+ to-install:
+ type: extensions/sysroot
+ location: /rootfs
+ INITRAMFS_PATH: boot/initramfs.gz
+ KERNEL_ARGS: console=ttyS1,9600 console=tty0
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ initramfs:
+ type: extensions/initramfs
+ location: boot/initramfs.gz
diff --git a/clusters/image-package-example.morph b/clusters/image-package-example.morph
new file mode 100644
index 00000000..ca79ec97
--- /dev/null
+++ b/clusters/image-package-example.morph
@@ -0,0 +1,12 @@
+name: image-package-example
+kind: cluster
+description: |
+ Packaged system and script for installing it, for deferred instantiation.
+systems:
+- morph: systems/base-system-x86_32-generic.morph
+ deploy:
+ imgpkg:
+ type: extensions/image-package
+ location: image-package-example.tar
+ BOOTLOADER_BLOBS: /usr/share/syslinux/mbr.bin
+ 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
new file mode 100644
index 00000000..a4ce7f32
--- /dev/null
+++ b/clusters/initramfs-test.morph
@@ -0,0 +1,22 @@
+name: initramfs-test
+kind: cluster
+systems:
+- morph: systems/base-system-x86_64-generic.morph
+ deploy:
+ system:
+ type: extensions/rawdisk
+ location: initramfs-system-x86_64.img
+ DISK_SIZE: 1G
+ HOSTNAME: initramfs-system
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ initramfs:
+ type: extensions/initramfs
+ location: boot/initramfs.gz
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ shutdownramfs:
+ type: sysroot
+ location: usr/lib/shutdownramfs
diff --git a/clusters/installer-build-system-x86_64.morph b/clusters/installer-build-system-x86_64.morph
new file mode 100644
index 00000000..d9a2a28b
--- /dev/null
+++ b/clusters/installer-build-system-x86_64.morph
@@ -0,0 +1,52 @@
+name: installer-build-system-x86_64
+kind: cluster
+description: |
+ This is a cluster morphology that can be used to deploy
+ installer systems. This is done by adding the files needed
+ using a manifest file (installer/manifest) with the INSTALL_FILES
+ extension, and using the installer.configure extension to generate
+ the configuration needed in the system.
+
+ This manifest, which is installing the installer script in
+ /usr/lib/installer/installer.py, in combination of adding
+ "init=/usr/lib/installer/installer.py" as KERNEL_ARGS in the system
+ makes the system run the installer.py script as init script.
+
+ The installer.py script will read the information needed to
+ install the system (where is the root filesystem to install and
+ where to install it) from /etc/install.conf.
+
+ This cluster also deploys a subsystem (a build-system in this case)
+ which is going to be the system that the installer system/script is
+ going to install.
+
+systems:
+- morph: systems/installer-system-x86_64.morph
+ deploy:
+ installer:
+ type: extensions/rawdisk
+ location: installer-build-system-x86_64.img
+ KERNEL_ARGS: init=/usr/lib/baserock-installer/installer
+ DISK_SIZE: 6G
+ HOSTNAME: installer-x86_64
+ INSTALLER_TARGET_STORAGE_DEVICE: /dev/sda
+ INSTALLER_ROOTFS_TO_INSTALL: /rootfs
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ installer-initramfs:
+ type: extensions/initramfs
+ location: boot/initramfs.gz
+ - morph: systems/build-system-x86_64.morph
+ deploy:
+ to-install:
+ type: extensions/sysroot
+ location: /rootfs
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ to-install-initramfs:
+ type: extensions/initramfs
+ location: boot/initramfs.gz
diff --git a/clusters/jetson-upgrade.morph b/clusters/jetson-upgrade.morph
new file mode 100644
index 00000000..c8ac0681
--- /dev/null
+++ b/clusters/jetson-upgrade.morph
@@ -0,0 +1,17 @@
+name: jetson-upgrade
+kind: cluster
+systems:
+- morph: systems/devel-system-armv7lhf-jetson.morph
+ deploy-defaults:
+ BOOT_DEVICE: /dev/mmcblk0p1
+ ROOT_DEVICE: /dev/mmcblk0p2
+ DTB_PATH: boot/tegra124-jetson-tk1.dtb
+ BOOTLOADER_CONFIG_FORMAT: extlinux
+ BOOTLOADER_INSTALL: none
+ KERNEL_ARGS: cma=256M console=tty0 console=ttyS0,115200n8 no_console_suspend=1
+ nouveau.pstate=1
+ FSTAB_SRC: LABEL=src /src auto defaults,rw,noatime,nofail 0 2
+ deploy:
+ self:
+ upgrade-type: extensions/ssh-rsync
+ upgrade-location: root@127.0.0.1
diff --git a/clusters/minimal-system-armv5l-openbmc-aspeed-deploy.morph b/clusters/minimal-system-armv5l-openbmc-aspeed-deploy.morph
new file mode 100644
index 00000000..3154fa26
--- /dev/null
+++ b/clusters/minimal-system-armv5l-openbmc-aspeed-deploy.morph
@@ -0,0 +1,13 @@
+name: minimal-system-armv5l-openbmc-aspeed-deploy
+kind: cluster
+systems:
+- morph: systems/minimal-system-armv5l-openbmc-aspeed.morph
+ deploy:
+ minimal-system-armv5l-openbmc-aspeed:
+ type: extensions/jffs2
+ location: minimal-system-armv5l-openbmc-aspeed.img
+ ROOT_DEVICE: /dev/mtdblock
+ BOOTLOADER_CONFIG_FORMAT: extlinux
+ BOOTLOADER_INSTALL: none
+ ERASE_BLOCK: 64
+ INIT_SYSTEM: busybox
diff --git a/clusters/minimal-system-deploy.morph b/clusters/minimal-system-deploy.morph
new file mode 100644
index 00000000..cf8de54f
--- /dev/null
+++ b/clusters/minimal-system-deploy.morph
@@ -0,0 +1,14 @@
+name: minimal-system-deploy
+kind: cluster
+description: |
+ Deploy a minimal system to a system running KVM
+systems:
+- morph: systems/minimal-system-x86_32-generic.morph
+ deploy:
+ vm:
+ 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
+ INIT_SYSTEM: busybox
+ RAM_SIZE: 512M
diff --git a/clusters/minimal-system-x86_64-chroot-deploy.morph b/clusters/minimal-system-x86_64-chroot-deploy.morph
new file mode 100644
index 00000000..d25fdcc8
--- /dev/null
+++ b/clusters/minimal-system-x86_64-chroot-deploy.morph
@@ -0,0 +1,9 @@
+name: minimal-system-x86_64-chroot-deploy
+kind: cluster
+systems:
+- morph: systems/minimal-system-x86_64-chroot.morph
+ deploy:
+ minimal-system-x86_64-chroot:
+ type: extensions/tar
+ location: minimal-system-x86_64-chroot.tar
+ HOSTNAME: minimal-system-x86-64-chroot
diff --git a/clusters/minimal-system-x86_64-deploy.morph b/clusters/minimal-system-x86_64-deploy.morph
new file mode 100644
index 00000000..be193b8b
--- /dev/null
+++ b/clusters/minimal-system-x86_64-deploy.morph
@@ -0,0 +1,12 @@
+name: minimal-system-x86_64-deploy
+kind: cluster
+description: |
+ Deploy a minimal system
+systems:
+- morph: systems/minimal-system-x86_64-generic.morph
+ deploy:
+ minimal-system-x86_64-generic:
+ type: extensions/rawdisk
+ location: minimal-system-x86_64.img
+ DISK_SIZE: 1G
+ HOSTNAME: minimal-system-x86-64
diff --git a/clusters/moonshot-m2-armv8b64.morph b/clusters/moonshot-m2-armv8b64.morph
new file mode 100644
index 00000000..a1057fbd
--- /dev/null
+++ b/clusters/moonshot-m2-armv8b64.morph
@@ -0,0 +1,56 @@
+name: moonshot-m2-armv8b64
+kind: cluster
+description: |
+ Install a build armv8b64 system into the M.2 SSD storage of an HP
+ Moonshot node, using a combination of the pxeboot.write extension and
+ the installer system.
+systems:
+- morph: systems/installer-system-armv8b64.morph
+ deploy:
+ installer:
+ 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/
+ PXEBOOT_ROOTFS_RSYNC_ADDRESS: rsync://192.168.0.1/srv/nfsboot/
+ PXEBOOT_PXE_REBOOT_COMMAND: |
+ ssh Administrator@10.0.1.10 set node power off force c31n1
+ ssh Administrator@10.0.1.10 set node boot pxe c31n1
+ # Nodes are powered on twice as sometimes powering them on
+ # once is not enough
+ ssh Administrator@10.0.1.10 set node power on c31n1
+ ssh Administrator@10.0.1.10 set node power on c31n1
+ PXEBOOT_REBOOT_COMMAND: |
+ ssh Administrator@10.0.1.10 set node power off force c31n1
+ ssh Administrator@10.0.1.10 set node boot m.2 c31n1
+ ssh Administrator@10.0.1.10 set node power on c31n1
+ ssh Administrator@10.0.1.10 set node power on c31n1
+
+ INSTALLER_TARGET_STORAGE_DEVICE: /dev/sda
+ INSTALLER_ROOTFS_TO_INSTALL: /rootfs
+ INSTALLER_POST_INSTALL_COMMAND: |
+ while : ; do
+ echo "enter 'installed' in your deployment machine to finish the installation"
+ sleep 2
+ done
+ INSTALLER_CREATE_BOOT_PARTITION: true
+
+ HOSTNAME: installer-system-c31n1
+ DTB_PATH: boot/m400-1003.dtb
+ KERNEL_ARGS: console=ttyS0,9600n8r init=/usr/lib/baserock-installer/installer
+ INSTALL_FILES: install-files/moonshot/manifest
+ MOONSHOT_KERNEL: true
+ subsystems:
+ - morph: systems/devel-system-armv8b64.morph
+ deploy:
+ to-install:
+ type: extensions/sysroot
+ location: /rootfs
+ HOSTNAME: baserock-c31n1
+ DTB_PATH: boot/m400-1003.dtb
+ INSTALL_FILES: install-files/moonshot/manifest
+ MOONSHOT_KERNEL: true
+ BOOT_DEVICE: /dev/sda1
+ ROOT_DEVICE: /dev/sda2
+ BOOTLOADER_CONFIG_FORMAT: extlinux
+ BOOTLOADER_INSTALL: none
diff --git a/clusters/moonshot-pxe-armv8b64.morph b/clusters/moonshot-pxe-armv8b64.morph
new file mode 100644
index 00000000..b1734084
--- /dev/null
+++ b/clusters/moonshot-pxe-armv8b64.morph
@@ -0,0 +1,30 @@
+name: moonshot-pxe-armv8b64
+kind: cluster
+description: |
+ Deploy a big-endian armv8b64 devel system onto an HP Moonshot node
+
+ The system will be configured to boot through PXE from existing DHCP,
+ TFTP and NFS servers.
+systems:
+- morph: systems/devel-system-armv8b64.morph
+ deploy:
+ netboot:
+ 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/
+ PXEBOOT_ROOTFS_RSYNC_ADDRESS: rsync://192.168.0.1/srv/nfsboot/
+ PXEBOOT_PXE_REBOOT_COMMAND: |
+ ssh Administrator@10.0.1.10 set node power off force c31n1
+ ssh Administrator@10.0.1.10 set node boot pxe c31n1
+ # Nodes are powered on twice as sometimes powering them on
+ # once is not enough
+ ssh Administrator@10.0.1.10 set node power on c31n1
+ ssh Administrator@10.0.1.10 set node power on c31n1
+ PXE_INSTALLER: false
+
+ HOSTNAME: baserock-c31n1
+ DTB_PATH: boot/m400-1003.dtb
+ KERNEL_ARGS: console=ttyS0,9600n8r rw
+ INSTALL_FILES: install-files/moonshot/manifest
+ MOONSHOT_KERNEL: true
diff --git a/clusters/moonshot-pxe-armv8l64.morph b/clusters/moonshot-pxe-armv8l64.morph
new file mode 100644
index 00000000..1bce7791
--- /dev/null
+++ b/clusters/moonshot-pxe-armv8l64.morph
@@ -0,0 +1,22 @@
+name: moonshot-pxe-armv8l64
+kind: cluster
+description: |
+ Deploy an armv8l64 devel system into a HP Moonshot node
+
+ The system will be configured to boot through PXE from existing DHCP,
+ TFTP and NFS servers.
+systems:
+- morph: systems/devel-system-armv8l64.morph
+ deploy:
+ netboot:
+ 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/
+ PXEBOOT_ROOTFS_RSYNC_ADDRESS: rsync://192.168.0.1/srv/nfsboot/
+ KERNEL_ARGS: console=ttyS0,9600n8r rw
+ DTB_PATH: boot/m400-1003.dtb
+ HOSTNAME: baserock-m400-node31
+ MOONSHOT_KERNEL: true
+ INSTALL_FILES: install-files/moonshot/manifest
+ PXE_INSTALLER: false
diff --git a/clusters/release.morph b/clusters/release.morph
new file mode 100644
index 00000000..fe07665f
--- /dev/null
+++ b/clusters/release.morph
@@ -0,0 +1,62 @@
+name: release
+kind: cluster
+description: |
+ Deploy all the systems for we support in a release.
+
+ This cluster morph is used by the tool 'scripts/do-release'. While
+ you can deploy the systems yourself, if you are making a Baserock release
+ then the script should be used.
+systems:
+- morph: systems/build-system-x86_32-chroot.morph
+ deploy:
+ build-system-x86_32-chroot:
+ type: extensions/tar
+ location: build-system-x86_32-chroot.tar
+ HOSTNAME: build-system-x86-32-chroot
+- morph: systems/build-system-x86_32.morph
+ deploy:
+ build-system-x86_32:
+ type: extensions/rawdisk
+ location: build-system-x86_32.img
+ DISK_SIZE: 6G
+ HOSTNAME: build-system-x86-32
+- morph: systems/build-system-x86_64-chroot.morph
+ deploy:
+ build-system-x86_64-chroot:
+ type: extensions/tar
+ location: build-system-x86_64-chroot.tar
+ HOSTNAME: build-system-x86-64-chroot
+- morph: systems/build-system-x86_64.morph
+ deploy:
+ build-system-x86_64:
+ type: extensions/rawdisk
+ location: build-system-x86_64.img
+ DISK_SIZE: 6G
+ INITRAMFS_PATH: boot/initramfs.gz
+ HOSTNAME: build-system-x86-64
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ initramfs-build-system-x86_64:
+ type: extensions/initramfs
+ location: boot/initramfs.gz
+- morph: systems/build-system-armv7lhf-rootfs.morph
+ deploy:
+ build-system-armv7lhf-rootfs:
+ type: extensions/tar
+ location: build-system-armv7lhf-rootfs.tar
+ HOSTNAME: build-system-armv7lhf-rootfs
+- morph: systems/build-system-armv7lhf-jetson.morph
+ deploy:
+ build-system-armv7lhf-jetson:
+ type: extensions/rawdisk
+ location: build-system-armv7lhf-jetson.img
+ DISK_SIZE: 3G
+ BOOT_DEVICE: /dev/mmcblk0p1
+ ROOT_DEVICE: /dev/mmcblk0p2
+ DTB_PATH: boot/tegra124-jetson-tk1.dtb
+ BOOTLOADER_CONFIG_FORMAT: extlinux
+ BOOTLOADER_INSTALL: none
+ KERNEL_ARGS: cma=256M console=tty0 console=ttyS0,115200n8 no_console_suspend=1
+ nouveau.pstate=1
+ HOSTNAME: build-system-armv7lhf-jetson
diff --git a/clusters/sdk-example-cluster.morph b/clusters/sdk-example-cluster.morph
new file mode 100644
index 00000000..961afdcb
--- /dev/null
+++ b/clusters/sdk-example-cluster.morph
@@ -0,0 +1,46 @@
+name: sdk-example-cluster
+kind: cluster
+description: |
+ An example of creating a cross-compile SDK for an embedded Baserock system.
+
+ This cluster demonstrates how you can use the 'sdk' write extension to
+ produce a cross-compile SDK tarball for an Baserock applicance. In this
+ example the system is assumed to run on ARMv7, and the SDK is built to
+ run on any x86_32 GNU/Linux system.
+
+ The SDK is a Baserock system itself, containing just 'build-essential' and a
+ 'cross-toolchain' stratum. The SDK system also includes the target
+ appliance's system, as a 'subsystem', so that the libraries and headers are
+ available when building.
+
+ This cluster deploys the SDK system using the 'sdk' write extension, which
+ produces a tarball with a small shell header. When the shell header is
+ executed, and passed a directory name on the commandline, it extracts the SDK
+ to that path and patches the binaries so that they execute correctly from
+ that directory.
+
+ Deploying the applicate system artifact to the target device should be
+ done with a separate cluster morphology, because you will often want to
+ do this without rebuilding the SDK.
+
+ You must build each system with `morph build` before deploying. We recommend
+ doing this all from your Baserock development machine, using a Baserock
+ ARM distributed build network to produce the system artifact. Once both
+ system artifacts are cached locally, the `morph deploy` command will produce
+ a self-extracting shell script/tarball following the 'location' field.
+
+ See the documentation of the sdk.write extension for more information.
+systems:
+- morph: systems/armv7lhf-cross-toolchain-system-x86_64.morph
+ deploy:
+ sdk:
+ type: extensions/sdk
+ location: armv7lhf-cross-toolchain-system-x86_64.sh
+ PREFIX: /usr
+ TARGET: armv7lhf-baserock-linux-gnueabi
+ subsystems:
+ - morph: systems/devel-system-armv7lhf-highbank.morph
+ deploy:
+ sysroot:
+ type: extensions/sysroot
+ location: usr/armv7lhf-baserock-linux-gnueabi/sys-root
diff --git a/clusters/upgrade-devel.morph b/clusters/upgrade-devel.morph
new file mode 100644
index 00000000..dcf1cd8d
--- /dev/null
+++ b/clusters/upgrade-devel.morph
@@ -0,0 +1,39 @@
+name: upgrade-devel
+kind: cluster
+description: |
+ This is a cluster morphology that can be used to deploy systems to a
+ an existing Baserock devel system, as an upgrade of the running system.
+
+ This method is for users who deployed a system manually from one of the
+ images provided on http://download.baserock.org. IT IS ONLY POSSIBLE TO
+ UPGRADE BASEROCK 14 RELEASES OR NEWER.
+
+ If you deployed your system using `morph deploy` then you should reuse the
+ cluster morphology you did the initial deployment with, instead of this one,
+ so that the configuration is preserved in the new system.
+
+ Ensure that your root user has passwordless SSH access to localhost with
+ `ssh root@localhost whoami`. If not, run `ssh-copy-id root@localhost`.
+ Make sure the 'morph' field below matches the system you are upgrading.
+
+ To upgrade, select a sensible a value for VERSION_LABEL and run:
+
+ morph upgrade clusters/upgrade-devel.morph self.HOSTNAME=$(hostname) self.VERSION_LABEL=$VERSION_LABEL
+
+ Your configuration in /etc should be propagated to the new system, but there
+ may be merge conflicts. Check /etc for files named '.rej' and '.orig' in the
+ new system, which will indicate that there are changes from the old system
+ that must be merged manually. You can get a nice diff from the old /etc as
+ follows:
+
+ mount /dev/sda /mnt
+ git diff --no-index /mnt/systems/factory/run/etc /mnt/systems/$VERSION_LABEL/run/etc
+
+ On a base system, use 'diff -r' instead of 'git diff --no-index'. It will
+ not be as colourful.
+systems:
+- morph: systems/devel-system-x86_64-generic.morph
+ deploy:
+ self:
+ upgrade-type: extensions/ssh-rsync
+ upgrade-location: root@127.0.0.1
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/extensions/busybox-init.configure b/extensions/busybox-init.configure
new file mode 100644
index 00000000..c7dba3b9
--- /dev/null
+++ b/extensions/busybox-init.configure
@@ -0,0 +1,145 @@
+#!/bin/sh
+#
+# Copyright (C) 2014 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.
+#
+# This is a "morph deploy" configuration extension to configure a system
+# to use busybox for its init, if INIT_SYSTEM=busybox is specified.
+#
+# As well as checking INIT_SYSTEM, the following variables are used.
+#
+# Getty configuration:
+# * CONSOLE_DEVICE: Which device to spawn a getty on (default: ttyS0)
+# * CONSOLE_BAUDRATE: Baud rate of the console (default: 115200)
+# * CONSOLE_MODE: What kind of terminal this console emulates
+# (default: vt100)
+
+if [ "$INIT_SYSTEM" != busybox ]; then
+ echo Not configuring system to use busybox init.
+ exit 0
+fi
+
+set -e
+echo Configuring system to use busybox init
+
+RUN_SCRIPT=/etc/rcS
+INIT_SCRIPT=/sbin/init
+
+install_mdev_config(){
+ install -D -m644 /dev/stdin "$1" <<'EOF'
+# support module loading on hotplug
+$MODALIAS=.* root:root 660 @modprobe "$MODALIAS"
+
+# null may already exist; therefore ownership has to be changed with command
+null root:root 666 @chmod 666 $MDEV
+zero root:root 666
+full root:root 666
+random root:root 444
+urandom root:root 444
+hwrandom root:root 444
+grsec root:root 660
+
+kmem root:root 640
+mem root:root 640
+port root:root 640
+# console may already exist; therefore ownership has to be changed with command
+console root:root 600 @chmod 600 $MDEV
+ptmx root:root 666
+pty.* root:root 660
+
+# Typical devices
+
+tty root:root 666
+tty[0-9]* root:root 660
+vcsa*[0-9]* root:root 660
+ttyS[0-9]* root:root 660
+
+# block devices
+ram[0-9]* root:root 660
+loop[0-9]+ root:root 660
+sd[a-z].* root:root 660
+hd[a-z][0-9]* root:root 660
+md[0-9]* root:root 660
+sr[0-9]* root:root 660 @ln -sf $MDEV cdrom
+fd[0-9]* root:root 660
+
+# net devices
+SUBSYSTEM=net;.* root:root 600 @nameif
+tun[0-9]* root:root 600 =net/
+tap[0-9]* root:root 600 =net/
+EOF
+}
+
+install_start_script(){
+ install -D -m755 /dev/stdin "$1" <<'EOF'
+#!/bin/sh
+mount -t devtmpfs devtmpfs /dev
+mount -t proc proc /proc
+mount -t sysfs sysfs /sys
+mkdir -p /dev/pts
+mount -t devpts devpts /dev/pts
+
+echo /sbin/mdev >/proc/sys/kernel/hotplug
+mdev -s
+
+hostname -F /etc/hostname
+
+run-parts -a start /etc/init.d
+EOF
+}
+
+install_inittab(){
+ local inittab="$1"
+ local dev="$2"
+ local baud="$3"
+ local mode="$4"
+ install -D -m644 /dev/stdin "$1" <<EOF
+::sysinit:$RUN_SCRIPT
+
+::askfirst:-/bin/cttyhack /bin/sh
+::askfirst:/sbin/getty -L $dev $baud $mode
+
+::ctrlaltdel:/sbin/reboot
+::shutdown:/sbin/swapoff -a
+::shutdown:/bin/umount -a -r
+::restart:/sbin/init
+EOF
+}
+
+install_init_symlink(){
+ local initdir="$(dirname "$1")"
+ local initname="$(basename "$1")"
+ mkdir -p "$initdir"
+ cd "$initdir"
+ for busybox_dir in . ../bin ../sbin ../usr/bin ../usr/sbin; do
+ local busybox="$busybox_dir/busybox"
+ if [ ! -x "$busybox" ]; then
+ continue
+ fi
+ ln -sf "$busybox" "$initname"
+ return 0
+ done
+ echo Unable to find busybox >&2
+ exit 1
+}
+
+install_mdev_config "$1/etc/mdev.conf"
+
+install_start_script "$1$RUN_SCRIPT"
+
+install_inittab "$1/etc/inittab" "${CONSOLE_DEV-ttyS0}" \
+ "${CONSOLE_BAUD-115200}" "${CONSOLE_MODE-vt100}"
+
+install_init_symlink "$1$INIT_SCRIPT"
diff --git a/extensions/ceph.configure b/extensions/ceph.configure
new file mode 100644
index 00000000..32f512ef
--- /dev/null
+++ b/extensions/ceph.configure
@@ -0,0 +1,344 @@
+#!/usr/bin/env 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.5
+#
+# 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.
+
+import os
+import shutil
+import stat
+import sys
+import re
+
+import writeexts
+
+systemd_monitor_template = """
+[Unit]
+Description=Ceph Monitor firstboot setup
+After=network-online.target
+
+[Service]
+ExecStart=/bin/sh /root/setup-ceph-head
+ExecStartPost=/bin/systemctl disable ceph-monitor-fboot.service
+
+[Install]
+WantedBy=multi-user.target
+"""
+
+systemd_monitor_fname_template = "ceph-monitor-fboot.service"
+
+systemd_osd_template = """
+[Unit]
+Description=Ceph osd firstboot setup
+After=network-online.target
+
+[Service]
+ExecStart=/bin/sh /root/setup-ceph-node
+ExecStartPost=/bin/systemctl disable ceph-storage-fboot.service
+
+[Install]
+WantedBy=multi-user.target
+"""
+systemd_osd_fname_template = "ceph-storage-fboot.service"
+
+ceph_monitor_config_template = """#!/bin/sh
+hn={self.hostname}
+monIp={self.mon_ip}
+clustFsid={self.cluster_fsid}
+ceph-authtool --create-keyring /tmp/ceph.mon.keyring \
+ --gen-key -n mon. --cap mon 'allow *'
+ceph-authtool /tmp/ceph.mon.keyring \
+ --import-keyring /etc/ceph/ceph.client.admin.keyring
+monmaptool --create --add "$hn" "$monIp" --fsid "$clustFsid" /tmp/monmap
+mkdir -p /var/lib/ceph/mon/ceph-"$hn"
+ceph-mon --mkfs -i "$hn" --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
+systemctl enable ceph-mon@"$hn".service
+systemctl start ceph-mon@"$hn".service
+"""
+
+ceph_storage_config_template = """#!/bin/sh
+storageDisk={self.osd_storage_dev}
+if `file -sL "$storageDisk" | grep -q ext4`; then
+ echo "ext4 disk detected. Proceding..."
+else
+ echo "ERROR: ext4 disk required." \
+ "Ensure $storageDisk is formated as ext4." >&2
+ exit 1
+fi
+hn={self.hostname}
+uuid="`uuidgen`"
+osdnum="`ceph osd create $uuid`"
+mkdir /var/lib/ceph/osd/ceph-"$osdnum"
+mount -o user_xattr "$storageDisk" /var/lib/ceph/osd/ceph-"$osdnum"
+ceph-osd -i "$osdnum" --mkfs --mkkey --osd-uuid "$uuid"
+ceph auth add osd."$osdnum" osd 'allow *' mon 'allow profile osd' \
+ -i /var/lib/ceph/osd/ceph-"$osdnum"/keyring
+ceph osd crush add-bucket "$hn" host
+ceph osd crush move "$hn" root=default
+ceph osd crush add osd."$osdnum" 1.0 host="$hn"
+systmectl enable ceph-osd@"$osdnum".service
+systemctl start ceph-osd@"$osdnum".service
+echo "$storageDisk /var/lib/ceph/osd/ceph-$osdnum/ ext4 defaults 0 2" \
+ >> /etc/fstab
+"""
+
+executable_file_permissions = (
+ stat.S_IRUSR | stat.S_IXUSR | stat.S_IWUSR |
+ stat.S_IXGRP | stat.S_IRGRP | stat.S_IXOTH |
+ stat.S_IROTH )
+
+class CephConfigurationExtension(writeexts.Extension):
+ """
+ Set up ceph server daemons.
+
+ Support for metadata server has not been tested.
+
+ Must include the following environment variables:
+
+ HOSTNAME - Must be defined it is used as the ID for
+ the monitor and metadata daemons.
+
+ CEPH_CONF - Provide a ceph configuration file.
+
+ Optional environment variables:
+
+ CEPH_CLUSTER - Cluster name, if not provided defaults to 'ceph'.
+
+ CEPH_BOOTSTRAP_OSD - Registered key capable of generating OSD
+ keys.
+
+ CEPH_BOOTSTRAP_MDS - Registered key capable of generating MDS
+ keys.
+
+ Bootstrap keys are required for creating OSD daemons on servers
+ that do not have a running monitor daemon. They are gathered
+ by 'ceph-deploy gatherkeys' but can be generated and registered
+ separately.
+
+ CEPH_CLIENT_ADMIN - Key required by any ceph action that requires
+ client admin authentication to run
+
+ CEPH_MON - (Blank) Create a ceph monitor daemon on the image.
+ CEPH_MON_KEYRING - Location of monitor keyring. Required by the
+ monitor if using cephx authentication.
+ CEPH_MON_IP - ip address that the monitor node will have. This is required
+ if CEPH_MON is set. It should also be set in the CEPH_CONF
+ file too.
+ CEPH_CLUSTER_FSID - A uuid for the ceph cluster. This is required if
+ CEPH_MON is set. It should also be set in the
+ CEPH_CONF file too.
+
+ CEPH_OSD - (Blank) Create a ceph object storage daemon on the image.
+ CEPH_OSD_X_DATA_DIR - Location of data directory for OSD.
+ Create an OSD daemon on image. 'X' is an integer
+ id, many osd daemons may be run on same server.
+ CEPH_OSD_STORAGE_DEV - Location of the storage device to be used to host
+ the osd file system. This is a required field.
+
+ CEPH_MDS - (Blank) Create a metadata server daemon on server.
+ """
+
+ def process_args(self, args):
+
+ if "HOSTNAME" not in os.environ:
+ sys.exit( "ERROR: Need a hostname defined by 'HOSTNAME'" )
+ if "CEPH_CONF" not in os.environ:
+ sys.exit( "ERROR: Need a ceph conf file defined by 'CEPH_CONF'" )
+
+ self.dest_dir = args[0]
+
+ self.cluster_name = "ceph"
+ self.hostname = os.environ["HOSTNAME"]
+
+ self.conf_file = "/etc/ceph/{}.conf".format(self.cluster_name)
+ self.admin_file = os.path.join( "/etc/ceph/",
+ "{}.client.admin.keyring".format(self.cluster_name) )
+ self.mon_dir = "/var/lib/ceph/mon/"
+ self.osd_dir = "/var/lib/ceph/osd/"
+ self.mds_dir = "/var/lib/ceph/mds/"
+ self.tmp_dir = "/var/lib/ceph/tmp/"
+ self.bootstrap_mds_dir = "/var/lib/ceph/bootstrap-mds/"
+ self.bootstrap_osd_dir = "/var/lib/ceph/bootstrap-osd/"
+ self.systemd_dir = "/etc/systemd/system/"
+ self.systemd_multiuser_dir = \
+ "/etc/systemd/system/multi-user.target.wants/"
+
+
+ print "Copying from " + os.getcwd()
+ self.copy_to_img(os.environ["CEPH_CONF"], self.conf_file)
+
+
+ # If the clustername is provided set it accprdingly. Default is "ceph"
+ if "CEPH_CLUSTER" in os.environ:
+ self.cluster_name = os.environ["CEPH_CLUSTER"]
+
+ # Copy over bootstrap keyrings
+ if "CEPH_BOOTSTRAP_OSD" in os.environ:
+ self.copy_bootstrap_osd(os.environ["CEPH_BOOTSTRAP_OSD"]);
+ if "CEPH_BOOTSTRAP_MDS" in os.environ:
+ self.copy_bootstrap_mds(os.environ["CEPH_BOOTSTRAP_MDS"]);
+
+ # Copy over admin keyring
+ if "CEPH_CLIENT_ADMIN" in os.environ:
+ self.copy_to_img(os.environ["CEPH_CLIENT_ADMIN"], self.admin_file);
+
+ # Configure any monitor daemons
+ if "CEPH_MON" in os.environ:
+
+ # check for and set self.mon_ip : needs static value.
+ if "CEPH_MON_IP" not in os.environ:
+ sys.exit("ERROR: Static ip required for the monitor node")
+ else:
+ self.mon_ip = os.environ["CEPH_MON_IP"]
+
+ # Check and set for cluster fsid : can have default
+ if "CEPH_CLUSTER_FSID" not in os.environ:
+ sys.exit("ERROR: UUID fsid value required for cluster.")
+ else:
+ self.cluster_fsid = os.environ["CEPH_CLUSTER_FSID"]
+
+ self.create_mon_data_dir(os.environ.get("CEPH_MON_KEYRING"))
+
+ # Configure any object storage daemons
+ if "CEPH_OSD" in os.environ:
+
+ # Check a osd storage device has been provided
+ if "CEPH_OSD_STORAGE_DEV" not in os.environ:
+ sys.exit("ERROR: Storage device required. \
+ Set 'CEPH_OSD_STORAGE_DEV'.")
+ else:
+ self.osd_storage_dev = os.environ["CEPH_OSD_STORAGE_DEV"]
+
+ self.create_osd_startup_script()
+
+ osd_re = r"CEPH_OSD_(\d+)_DATA_DIR$"
+
+ for env in os.environ.keys():
+ match = re.match(osd_re, env)
+ if match:
+ osd_data_dir_env = match.group(0)
+ osd_id = match.group(1)
+
+ self.create_osd_data_dir(osd_id,
+ os.environ.get(osd_data_dir_env))
+
+
+ # Configure any mds daemons
+ if "CEPH_MDS" in os.environ:
+ self.create_mds_data_dir()
+
+ # Create a fake 'partprobe'
+ fake_partprobe_filename = self.dest_dir + "/sbin/partprobe"
+ fake_partprobe = open(fake_partprobe_filename, 'w')
+ fake_partprobe.write("#!/bin/bash\nexit 0;\n")
+ fake_partprobe.close()
+ os.chmod(fake_partprobe_filename, executable_file_permissions)
+ self.create_startup_scripts()
+
+ def copy_to_img(self, src_file, dest_file):
+ shutil.copy(src_file, self.dest_dir + dest_file)
+
+ def copy_bootstrap_osd(self, src_file):
+ self.copy_to_img(src_file,
+ os.path.join(self.bootstrap_osd_dir,
+ "{}.keyring".format(self.cluster_name)))
+
+ def copy_bootstrap_mds(self, src_file):
+ self.copy_to_img(src_file,
+ os.path.join(self.bootstrap_mds_dir,
+ "{}.keyring".format(self.cluster_name)))
+
+ def symlink_to_multiuser(self, fname):
+ sys.stderr.write( os.path.join("../", fname) )
+ sys.stderr.write( self.dest_dir +
+ os.path.join(self.systemd_multiuser_dir, fname) )
+ print "Linking: %s into %s"%(fname, self.systemd_multiuser_dir)
+ os.symlink(os.path.join("../", fname),
+ self.dest_dir +
+ os.path.join(self.systemd_multiuser_dir, fname))
+
+ def create_mon_data_dir(self, src_keyring):
+
+ # Create systemd file to initialize the monitor data directory
+ keyring = ""
+ mon_systemd_fname = systemd_monitor_fname_template
+
+ systemd_script_name = self.dest_dir \
+ + os.path.join(self.systemd_dir, mon_systemd_fname)
+ print "Write monitor systemd script to " + systemd_script_name
+ mon_systemd = open(systemd_script_name, 'w')
+ mon_systemd.write(systemd_monitor_template)
+ mon_systemd.close()
+ # Create a symlink to the multi user target
+ self.symlink_to_multiuser(mon_systemd_fname)
+
+ def create_osd_data_dir(self, osd_id, data_dir):
+ if not data_dir:
+ data_dir = '/srv/osd' + osd_id
+
+ # Create the osd data dir
+ os.makedirs(self.dest_dir + data_dir)
+
+ def create_osd_startup_script(self):
+ osd_systemd_fname = systemd_osd_fname_template
+
+ osd_full_name = self.dest_dir + \
+ os.path.join(self.systemd_dir, osd_systemd_fname)
+ print "Write Storage systemd script to " + osd_full_name
+
+ osd_systemd = open(osd_full_name, 'w')
+
+ osd_systemd.write(systemd_osd_template)
+ osd_systemd.close()
+
+ # Create a symlink to the multi user target
+ self.symlink_to_multiuser(osd_systemd_fname)
+
+ def create_mds_data_dir(self):
+
+ # Create the monitor data directory
+ mds_data_dir = os.path.join(self.mds_dir,
+ "{}-{}".format(self.cluster_name, self.hostname))
+ os.makedirs(self.dest_dir + mds_data_dir)
+
+ # Create sysvinit file to start via sysvinit
+ sysvinit_file = os.path.join(mds_data_dir, "sysvinit")
+ open(self.dest_dir + sysvinit_file, 'a').close()
+
+
+ def create_startup_scripts(self):
+ print "Copying startup scripts to node:"
+
+ # Write monitor script if monitor requested
+ if "CEPH_MON" in os.environ:
+ head_setup_file = \
+ os.path.join(self.dest_dir,"root","setup-ceph-head")
+ with open(head_setup_file, "w") as hs_file:
+ hs_file.write( ceph_monitor_config_template.format(self=self) )
+
+ os.chmod(head_setup_file, executable_file_permissions)
+
+ # Write osd script if osd is requested
+ elif "CEPH_OSD" in os.environ:
+ osd_setup_file = \
+ os.path.join(self.dest_dir, "root", "setup-ceph-node")
+ with open(osd_setup_file, "w") as os_file:
+ os_file.write( ceph_storage_config_template.format(self=self) )
+
+ os.chmod(osd_setup_file, executable_file_permissions)
+
+ else:
+ print ("No valid node type defined. "
+ "A generic ceph node will be created.")
+
+CephConfigurationExtension().run()
diff --git a/extensions/cloud-init.configure b/extensions/cloud-init.configure
new file mode 100755
index 00000000..3bcc0909
--- /dev/null
+++ b/extensions/cloud-init.configure
@@ -0,0 +1,69 @@
+#!/bin/sh
+#
+# Copyright (C) 2014 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.
+#
+#
+# This is a "morph deploy" configuration extension to enable the
+# cloud-init services.
+set -e
+
+ROOT="$1"
+
+# Write detailed logs to a special log file if set, otherwise everything
+# goes to stdout.
+if [ -z "$MORPH_LOG_FD" ]; then
+ MORPH_LOG_FD=1
+fi
+
+##########################################################################
+
+set -e
+
+case "$CLOUD_INIT" in
+''|False|no)
+ exit 0
+ ;;
+True|yes)
+ echo "Configuring cloud-init"
+ ;;
+*)
+ echo Unrecognised option "$CLOUD_INIT" to CLOUD_INIT
+ exit 1
+ ;;
+esac
+
+
+cloud_init_services="cloud-config.service
+ cloud-init-local.service
+ cloud-init.service
+ cloud-final.service"
+
+# Iterate over the cloud-init services and enable them creating a link
+# into /etc/systemd/system/multi-user.target.wants.
+# If the services to link are not present, fail.
+
+services_folder="lib/systemd/system"
+for service_name in $cloud_init_services; do
+ if [ ! -f "$ROOT/$services_folder/$service_name" ]; then
+ echo "ERROR: Service $service_name is missing." >&2
+ echo "Failed to configure cloud-init."
+ exit 1
+ else
+ echo Enabling systemd service "$service_name" >&"$MORPH_LOG_FD"
+ ln -sf "/$services_folder/$service_name" \
+ "$ROOT/etc/systemd/system/multi-user.target.wants/$service_name"
+ fi
+done
diff --git a/extensions/distbuild-trove-nfsboot.check b/extensions/distbuild-trove-nfsboot.check
new file mode 100755
index 00000000..e825ac66
--- /dev/null
+++ b/extensions/distbuild-trove-nfsboot.check
@@ -0,0 +1,153 @@
+#!/usr/bin/python2
+# 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 logging
+import os
+import sys
+
+import writeexts
+
+
+class DistbuildTroveNFSBootCheckExtension(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 writeexts.ExtensionError(
+ '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 writeexts.ExtensionError(
+ 'Please set: %s' % ', '.join(missing_vars))
+
+ controllers = os.getenv('DISTBUILD_CONTROLLER').split()
+ workers = os.getenv('DISTBUILD_WORKERS').split()
+
+ if len(controllers) != 1:
+ raise writeexts.ExtensionError(
+ 'Please specify exactly one controller.')
+
+ if len(workers) == 0:
+ raise writeexts.ExtensionError(
+ '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 writeexts.ExtensionError(
+ '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:
+ writeexts.ssh_runcmd(
+ netloc, ['test', '-e', '/etc/exports'])
+ except writeexts.ExtensionError:
+ raise writeexts.ExtensionError('server %s is not an nfs server'
+ % netloc)
+ try:
+ writeexts.ssh_runcmd(
+ netloc, ['systemctl', 'is-enabled', 'nfs-server.service'])
+
+ except writeexts.ExtensionError:
+ raise writeexts.ExtensionError('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:
+ writeexts.ssh_runcmd(
+ netloc, ['test' , '-d', tftp_root])
+ except writeexts.ExtensionError:
+ raise writeexts.ExtensionError('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 writeexts.ExtensionError(
+ '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 writeexts.ExtensionError(
+ '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:
+ writeexts.ssh_runcmd(nfs_netloc, ['test', '-d', path])
+ except writeexts.ExtensionError 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..171a84a8
--- /dev/null
+++ b/extensions/distbuild-trove-nfsboot.write
@@ -0,0 +1,283 @@
+#!/usr/bin/python2
+# 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 subprocess
+import sys
+import tempfile
+
+import writeexts
+
+
+class DistbuildTroveNFSBootWriteExtension(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 writeexts.ExtensionError('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 writeexts.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)
+ writeexts.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`.
+ subprocess.check_call(
+ ['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)
+ writeexts.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.
+ writeexts.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 writeexts.ExtensionError(
+ '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
+
+ writeexts.ssh_runcmd(nfs_netloc,
+ ['ln', '-f', kernel_dest,
+ os.path.join(tftp_dir, versioned_kernel_name)])
+
+ writeexts.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()
+ subprocess.check_call(
+ ['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')
+ writeexts.ssh_runcmd(
+ nfs_netloc, ['mkdir', '-p', path])
+ subprocess.check_call(
+ ['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:
+ writeexts.ssh_runcmd(
+ nfs_netloc, ['grep', '-q', exported_path, exports_path])
+ except writeexts.ExtensionError:
+ 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"
+ '''
+ writeexts.ssh_runcmd(
+ nfs_netloc,
+ ['sh', '-c', exports_append_sh, '--', exports_path],
+ feed_stdin=exports_string)
+
+ writeexts.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')
+
+ writeexts.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/extensions/distbuild.configure b/extensions/distbuild.configure
new file mode 100644
index 00000000..062aaecc
--- /dev/null
+++ b/extensions/distbuild.configure
@@ -0,0 +1,132 @@
+#!/bin/sh
+# Copyright (C) 2013-2014 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.
+#
+# This is a "morph deploy" configure extension to configure a Baserock
+# build node, as part of a distributed building cluster. It uses the
+# following variables from the environment:
+#
+# * DISTBUILD_CONTROLLER: if 'yes', machine is set up as the controller.
+# * DISTBUILD_WORKER: if 'yes', machine is set up as a worker.
+# * TROVE_ID: hostname and Trove prefix of the server to pull source
+# from and push built artifacts to.
+# * TROVE_HOST: FQDN of the same server as in TROVE_ID
+#
+# The following variable is optional:
+#
+# * ARTIFACT_CACHE_SERVER: by default artifacts are pushed to the same
+# Trove that served the source, but you can use a different one.
+#
+# The following variable is required for worker nodes only:
+#
+# * CONTROLLERHOST: hostname or IP address of distbuild controller machine.
+# * WORKER_SSH_KEY: identity used to authenticate with Trove
+#
+# The following variable is required for the controller node only:
+#
+# * WORKERS: hostnames or IP address of worker nodes, comma-separated.
+
+set -e
+
+if [ -n "$DISTBUILD_GENERIC" ]; then
+ echo "Not configuring the distbuild node, it will be generic"
+ exit 0
+fi
+
+# Set default values for these two options if they are unset, so that if the
+# user specifies no distbuild config at all the configure extension exits
+# without doing anything but does not raise an error.
+DISTBUILD_CONTROLLER=${DISTBUILD_CONTROLLER-False}
+DISTBUILD_WORKER=${DISTBUILD_WORKER-False}
+
+if [ "$DISTBUILD_CONTROLLER" = False -a "$DISTBUILD_WORKER" = False ]; then
+ exit 0
+fi
+
+set -u
+
+# Check that all the variables needed are present:
+
+error_vars=false
+
+if [ "x$TROVE_HOST" = "x" ]; then
+ echo "ERROR: TROVE_HOST needs to be defined."
+ error_vars=true
+fi
+
+if [ "x$TROVE_ID" = "x" ]; then
+ echo "ERROR: TROVE_ID needs to be defined."
+ error_vars=true
+fi
+
+if [ "$DISTBUILD_WORKER" = True ]; then
+ if ! ssh-keygen -lf "$WORKER_SSH_KEY" > /dev/null 2>&1; then
+ echo "ERROR: WORKER_SSH_KEY is not a vaild ssh key."
+ error_vars=true
+ fi
+
+ if [ "x$CONTROLLERHOST" = "x" ]; then
+ echo "ERROR: CONTROLLERHOST needs to be defined."
+ error_vars=true
+ fi
+fi
+
+if [ "$DISTBUILD_CONTROLLER" = True ]; then
+ if [ "x$WORKERS" = "x" ]; then
+ echo "ERROR: WORKERS needs to be defined."
+ error_vars=true
+ fi
+fi
+
+if "$error_vars"; then
+ exit 1
+fi
+
+
+ROOT="$1"
+
+DISTBUILD_DATA="$ROOT/etc/distbuild"
+mkdir -p "$DISTBUILD_DATA"
+
+# If it's a worker, install the worker ssh key.
+if [ "$DISTBUILD_WORKER" = True ]
+then
+ install -m 0644 "$WORKER_SSH_KEY" "$DISTBUILD_DATA/worker.key"
+fi
+
+
+
+# Create the configuration file
+python <<'EOF' >"$DISTBUILD_DATA/distbuild.conf"
+import os, sys, yaml
+
+distbuild_configuration={
+ 'TROVE_ID': os.environ['TROVE_ID'],
+ 'TROVE_HOST': os.environ['TROVE_HOST'],
+ 'DISTBUILD_WORKER': os.environ['DISTBUILD_WORKER'],
+ 'DISTBUILD_CONTROLLER': os.environ['DISTBUILD_CONTROLLER'],
+ 'WORKER_SSH_KEY': '/etc/distbuild/worker.key',
+}
+
+
+optional_keys = ('ARTIFACT_CACHE_SERVER', 'CONTROLLERHOST', 'WORKERS',
+ 'TROVE_BACKUP_KEYS')
+
+for key in optional_keys:
+ if key in os.environ:
+ distbuild_configuration[key] = os.environ[key]
+
+yaml.dump(distbuild_configuration, sys.stdout, default_flow_style=False)
+EOF
diff --git a/extensions/fstab.configure b/extensions/fstab.configure
new file mode 100755
index 00000000..3e67b585
--- /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 writeexts
+
+envvars = {k: v for (k, v) in os.environ.iteritems() if k.startswith('FSTAB_')}
+
+conf_file = os.path.join(sys.argv[1], 'etc/fstab')
+writeexts.write_from_dict(conf_file, envvars)
diff --git a/extensions/genivi.configure b/extensions/genivi.configure
new file mode 100644
index 00000000..c5f6dc4f
--- /dev/null
+++ b/extensions/genivi.configure
@@ -0,0 +1,124 @@
+#!/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/>.
+
+set -e
+
+ROOT="$1"
+
+enable(){
+ ln -sf "/usr/lib/systemd/system/$1.service" \
+ "$ROOT/etc/systemd/system/multi-user.target.wants/$1.service"
+}
+
+unnaceptable(){
+ eval echo Unexpected value \$$1 for $1 >&2
+ exit 1
+}
+
+check_bool(){
+ case "$(eval echo \"\$$1\")" in
+ True)
+ eval "$1=true"
+ ;;
+ False|'')
+ eval "$1=false"
+ ;;
+ *)
+ unnaceptable "$1"
+ ;;
+ esac
+}
+
+check_weston_config(){
+ weston_ini_folder="$ROOT/usr/share/doc/weston"
+ case "$GENIVI_WESTON_CONFIG" in
+ 'baseline'|'')
+ weston_ini_file=ivi-shell-weston.ini
+ ;;
+ 'gdp')
+ weston_ini_file=gdp-weston.ini
+ ;;
+ *)
+ unnaceptable "GENIVI_WESTON_CONFIG"
+ ;;
+ esac
+ weston_ini_file="$weston_ini_folder/$weston_ini_file"
+ if [ ! -f "$weston_ini_file" ]; then
+ echo ERROR: Failed to locate weston config file: $weston_ini_file
+ exit 1
+ fi
+}
+
+check_weston_backend (){
+ # If nothing defined, use drm-backend.so
+ if [ "x$GENIVI_WESTON_BACKEND" == "x" ]; then
+ echo GENIVI_WESTON_BACLEND not set, defaulting to drm-backend.so
+ GENIVI_WESTON_BACKEND=drm-backend.so
+ fi
+
+ backends_folder="$ROOT/usr/lib/weston"
+ backend_file="$backends_folder/$GENIVI_WESTON_BACKEND"
+ # Check that the backend exists
+ echo Checking for "$backend_file" ...
+ if [ ! -f "$backend_file" ]; then
+ echo "File $backend_file doesn't exist"
+ GENIVI_WESTON_BACKEND="$GENIVI_WESTON_BACKEND-backend.so"
+ backend_file="$backends_folder/$GENIVI_WESTON_BACKEND"
+ echo Checking for "$backend_file" ...
+ if [ ! -f "$backend_file" ]; then
+ echo "File $backend_file doesn't exist"
+ echo ERROR: Failed to find Weston backend in the system
+ exit 1
+ fi
+ fi
+ echo Backend $backend_file found
+}
+
+##########################################################################
+# Check variables
+##########################################################################
+
+check_bool GENIVI_WESTON_AUTOSTART
+check_weston_config
+check_weston_backend
+
+######################################
+# Create and enable weston.service #
+######################################
+
+cat > "$ROOT/usr/lib/systemd/system/weston.service" <<EOF
+[Unit]
+Description=Weston reference Wayland compositor
+After=dbus.service
+
+[Service]
+ExecStart=/usr/bin/weston-launch -u root -- --log=/tmp/weston.log --backend="$GENIVI_WESTON_BACKEND"
+ExecStop=/usr/bin/killall -s KILL weston
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+if "$GENIVI_WESTON_AUTOSTART"; then
+ enable weston
+fi
+
+######################################
+# Set weston.ini file #
+######################################
+
+install -d "$ROOT/etc/xdg/weston"
+install -m 0644 $weston_ini_file "$ROOT/etc/xdg/weston/weston.ini"
diff --git a/extensions/genivi.configure.help b/extensions/genivi.configure.help
new file mode 100644
index 00000000..6616f871
--- /dev/null
+++ b/extensions/genivi.configure.help
@@ -0,0 +1,25 @@
+help: |
+ This extension configures GENIVI systems. It uses the following
+ configuration variables:
+
+ * `GENIVI_WESTON_CONFIG` (optional, defaults to `baseline`)
+ the weston configuration file to use. The GENIVI baseline system
+ uses a different one than the GENIVI Demo Platform.
+
+ Possibles values here are `baseline` and `gdp`. Other values will
+ fail. The extension will copy the relevant configuration file
+ from `/usr/share/doc/weston/` to `/etc/xdg/weston/weston.ini`
+ to make it the default configuration for Weston.
+
+ * `GENIVI_WESTON_BACKEND` (optional, defaults to 'drm-backend.so')
+ the backend to use with Weston. This backend will be used in
+ the `weston.service` systemd unit overriding the default backend
+ specified when building Weston.
+
+ The extension looks for the backend in the system, failing if
+ it's not present. It will also try to append `-backend.so` to
+ the variable so that (e.g) you can set this variable to `fbdev`
+ and to `fbdev-backend.so`.
+
+ * `GENIVI_WESTON_AUTOSTART`(optional. defaults to 'False')
+ boolean. If `True` it will enable the `weston.service`.
diff --git a/extensions/hosts b/extensions/hosts
new file mode 100644
index 00000000..5b97818d
--- /dev/null
+++ b/extensions/hosts
@@ -0,0 +1 @@
+localhost ansible_connection=local
diff --git a/extensions/hosts.configure b/extensions/hosts.configure
new file mode 100755
index 00000000..11fcf573
--- /dev/null
+++ b/extensions/hosts.configure
@@ -0,0 +1,50 @@
+#!/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 writeexts
+
+def validate(var, line):
+ xs = line.split()
+ if len(xs) == 0:
+ raise writeexts.ExtensionError(
+ "`%s: %s': line is empty" % (var, line))
+
+ ip = xs[0]
+ hostnames = xs[1:]
+
+ if len(hostnames) == 0:
+ raise writeexts.ExtensionError(
+ "`%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 writeexts.ExtensionError("`%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')
+writeexts.write_from_dict(conf_file, envvars, validate)
diff --git a/extensions/image-package-example/README b/extensions/image-package-example/README
new file mode 100644
index 00000000..f6b66cd9
--- /dev/null
+++ b/extensions/image-package-example/README
@@ -0,0 +1,9 @@
+Image package example scripts
+=============================
+
+These are scripts used to create disk images or install the system onto
+an existing disk.
+
+This is also implemented independently for the rawdisk.write write
+extension; see writeexts.WriteExtension.create_local_system() for
+a similar, python implementation.
diff --git a/extensions/image-package-example/common.sh.in b/extensions/image-package-example/common.sh.in
new file mode 100644
index 00000000..9a7389a7
--- /dev/null
+++ b/extensions/image-package-example/common.sh.in
@@ -0,0 +1,72 @@
+#!/bin/false
+# Script library to be used by disk-install.sh and make-disk-image.sh
+
+status(){
+ echo "$@"
+}
+
+info(){
+ echo "$@" >&2
+}
+
+warn(){
+ echo "$@" >&2
+}
+
+extract_rootfs(){
+ tar -C "$1" -xf @@ROOTFS_TAR_PATH@@ .
+}
+
+make_disk_image(){
+ truncate --size "$1" "$2"
+}
+
+format_disk(){
+ local disk="$1"
+ mkfs.ext4 -F -L rootfs "$disk"
+}
+
+install_fs_config(){
+ local mountpoint="$1"
+ local rootdisk="${2-/dev/vda}"
+ cat >>"$mountpoint/etc/fstab" <<EOF
+$rootdisk / ext4 rw,errors=remount-ro 0 0
+EOF
+ install -D -m 644 /proc/self/fd/0 "$mountpoint/boot/extlinux.conf" <<EOF
+DEFAULT baserock
+LABEL baserock
+SAY Booting Baserock
+LINUX /boot/vmlinuz
+APPEND root=$rootdisk
+EOF
+}
+
+install_bootloader(){
+ local disk="$1"
+ local mountpoint="$2"
+ dd if=@@IMAGE_DIR@@/mbr.bin conv=notrunc bs=440 count=1 of="$disk"
+ extlinux --install "$mountpoint/boot"
+}
+
+loop_file(){
+ losetup --show --find "$1"
+}
+unloop_file(){
+ #losetup --detach "$1"
+ # unlooping handled by umount -d, for busybox compatibility
+ true
+}
+
+temp_mount(){
+ local mp="$(mktemp -d)"
+ if ! mount "$@" "$mp"; then
+ rmdir "$mp"
+ return 1
+ fi
+ echo "$mp"
+}
+untemp_mount(){
+ # Unmount and detach in one step for busybox compatibility
+ umount -d "$1"
+ rmdir "$1"
+}
diff --git a/extensions/image-package-example/disk-install.sh.in b/extensions/image-package-example/disk-install.sh.in
new file mode 100644
index 00000000..bc8e0e67
--- /dev/null
+++ b/extensions/image-package-example/disk-install.sh.in
@@ -0,0 +1,51 @@
+#!/bin/sh
+# Script for writing the system to an existing disk.
+# This formats the disk, extracts the rootfs to it, installs the
+# bootloader, and ensures there's appropriate configuration for the
+# bootloader, kernel and userland to agree what the rootfs is.
+
+set -eu
+
+usage(){
+ cat <<EOF
+usage: $0 DISK [TARGET_DISK]
+
+DISK: Where the disk appears on your development machine
+TARGET_DISK: What the disk will appear as on the target machine
+EOF
+}
+
+. @@SCRIPT_DIR@@/common.sh
+
+if [ "$#" -lt 1 -o "$#" -gt 2 ]; then
+ usage
+ exit 1
+fi
+
+DISK="$1"
+TARGET_DISK="${1-/dev/sda}"
+
+status Formatting "$DISK" as ext4
+format_disk "$DISK"
+(
+ info Mounting "$DISK"
+ MP="$(temp_mount -t ext4 "$DISK")"
+ info Mounted "$DISK" to "$MP"
+ set +e
+ (
+ set -e
+ info Copying rootfs onto disk
+ extract_rootfs "$MP"
+ info Configuring disk paths
+ install_fs_config "$MP" "$TARGET_DISK"
+ info Installing bootloader
+ install_bootloader "$DISK" "$MP"
+ )
+ ret="$?"
+ if [ "$ret" != 0 ]; then
+ warn Filling rootfs failed with "$ret"
+ fi
+ info Unmounting "$DISK" from "$MP" and removing "$MP"
+ untemp_mount "$MP"
+ exit "$ret"
+)
diff --git a/extensions/image-package-example/make-disk-image.sh.in b/extensions/image-package-example/make-disk-image.sh.in
new file mode 100644
index 00000000..61264fa0
--- /dev/null
+++ b/extensions/image-package-example/make-disk-image.sh.in
@@ -0,0 +1,36 @@
+#!/bin/sh
+# Script for writing the system to a disk image file.
+# This creates a file of the right size, attaches it to a loop device,
+# then hands the rest of the work off to disk-install.sh
+
+usage(){
+ cat <<EOF
+usage: $0 FILENAME SIZE [TARGET_DISK]
+
+FILENAME: Location to write the disk image to
+SIZE: Size to create the disk image with
+TARGET_DISK: What the disk will appear as on the target machine
+EOF
+}
+
+. @@SCRIPT_DIR@@/common.sh
+
+if [ "$#" -lt 2 -o "$#" -gt 3 ]; then
+ usage
+ exit 1
+fi
+
+DISK_IMAGE="$1"
+DISK_SIZE="$2"
+TARGET_DISK="${3-/dev/vda}"
+
+make_disk_image "$DISK_SIZE" "$DISK_IMAGE"
+
+(
+ LOOP="$(loop_file "$DISK_IMAGE")"
+ set +e
+ @@SCRIPT_DIR@@/disk-install.sh "$DISK_IMAGE" "$TARGET_DISK"
+ ret="$?"
+ unloop_file "$LOOP"
+ exit "$ret"
+)
diff --git a/extensions/image-package.write b/extensions/image-package.write
new file mode 100755
index 00000000..15ceadcf
--- /dev/null
+++ b/extensions/image-package.write
@@ -0,0 +1,168 @@
+#!/bin/sh
+# Copyright (C) 2014 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 =*=
+#
+#
+# This is a write extension for making a package that can be used to
+# install the produced system. Ideally we'd instead have Baserock
+# everywhere to do the deployment, but we need to support this workflow
+# until that is possible.
+#
+# This write extension produces a tarball, which contains:
+# - a tarball of the configured system root file system
+# - any supporting files listed in BOOTLOADER_BLOBS
+# - any supporting scripts, generated from templates listed in
+# INCLUDE_SCRIPTS
+#
+# The extension requires the following environment variables to be set:
+#
+# * BOOTLOADER_BLOBS: files to include besides rootfs tarball,
+# paths are relative to the root of the built rootfs
+# works on any kind of file in the rootfs, named
+# BOOTLOADER_BLOBS since that's the common use-case
+# :-separated by default
+# * INCLUDE_SCRIPTS: script templates that are included in the package
+# after being filled out
+# file paths are relative to the definitions repository
+# :-separated by default
+#
+# The script templates may contain any of the following strings, which
+# will be replaced with a string which will expand to the appropriate
+# value as a shell word:
+# - @@SCRIPT_DIR@@: the path the script files are installed to
+# - @@IMAGE_DIR@@: the path BOOTLOADER_BLOBS are installed to
+# - @@ROOTFS_TAR_PATH@@: path to the rootfs tarball
+#
+# The interpolated strings may run commands dependant on the current
+# working directory, so if `cd` is required, bind these values to a
+# variable beforehand.
+#
+# The following optional variables can be set as well:
+#
+# * INCLUDE_SCRIPTS_SEPARATOR: character to separate INCLUDE_SCRIPTS with (default: :)
+# * BOOTLOADER_BLOBS_SEPARATOR: character to separate BOOTLOADER_BLOBS with (default: :)
+# * SCRIPT_SUBDIR: where in the package processed scripts are installed to (default: tools)
+# * IMAGE_SUBDIR: where in the package BOOTLOADER_BLOBS are copied to (default: image_files)
+# * ROOTFS_TAR: name to call the rootfs tarball inside IMAGE_SUBDIR (default: rootfs.tar)
+# * OUTPUT_COMPRESS: compression used for output tarball (default: none)
+# * ROOTFS_COMPRESS: compression used for rootfs (default: none)
+
+set -eu
+
+die(){
+ echo "$@" >&2
+ exit 1
+}
+
+warn(){
+ echo "$@" >&2
+}
+
+info(){
+ echo "$@" >&2
+}
+
+shellescape(){
+ echo "'$(echo "$1" | sed -e "s/'/'\\''/g")'"
+}
+
+sedescape(){
+ # Escape the passed in string so it can be safely interpolated into
+ # a sed expression as a literal value.
+ echo "$1" | sed -e 's/[\/&]/\\&/g'
+}
+
+ROOTDIR="$1"
+OUTPUT_TAR="$2"
+td="$(mktemp -d)"
+IMAGE_SUBDIR="${IMAGE_SUBDIR-image_files}"
+SCRIPT_SUBDIR="${SCRIPT_SUBDIR-tools}"
+ROOTFS_TAR="${ROOTFS_TAR-rootfs.tar}"
+
+# Generate shell snippets that will expand to paths to various resources
+# needed by the scripts.
+# They expand to a single shell word, so constructs like the following work
+# SCRIPT_DIR=@@SCRIPT_DIR@@
+# dd if="$SCRIPT_DIR/mbr" of="$disk" count=1
+# tar -C "$mountpoint" -xf @@ROOTFS_TAR_PATH@@ .
+find_script_dir='"$(readlink -f "$(dirname "$0")")"'
+image_dir="$find_script_dir/../$(shellescape "$IMAGE_SUBDIR")"
+rootfs_tar_path="$image_dir/$(shellescape "$ROOTFS_TAR")"
+
+install_script(){
+ local source_file="$1"
+ local output_dir="$2"
+ local target_file="$output_dir/$SCRIPT_SUBDIR/$(basename "$source_file" .in)"
+ sed -e "s/@@SCRIPT_DIR@@/$(sedescape "$find_script_dir")/g" \
+ -e "s/@@IMAGE_DIR@@/$(sedescape "$image_dir")/g" \
+ -e "s/@@ROOTFS_TAR_PATH@@/$(sedescape "$rootfs_tar_path")/g" \
+ "$source_file" \
+ | install -D -m 755 /proc/self/fd/0 "$target_file"
+}
+
+install_scripts(){
+ local output_dir="$1"
+ (
+ IFS="${INCLUDE_SCRIPTS_SEPARATOR-:}"
+ for script in $INCLUDE_SCRIPTS; do
+ local script_path="$(pwd)/$script"
+ if [ ! -e "$script_path" ]; then
+ warn Script "$script" not found, ignoring
+ continue
+ fi
+ install_script "$script" "$output_dir"
+ done
+ )
+}
+
+install_bootloader_blobs(){
+ local output_dir="$1"
+ local image_dir="$output_dir/$IMAGE_SUBDIR"
+ (
+ IFS="${BOOTLOADER_BLOBS_SEPARATOR-:}"
+ for blob in $BOOTLOADER_BLOBS; do
+ local blob_path="$ROOTDIR/$blob"
+ if [ ! -e "$blob_path" ]; then
+ warn Bootloader blob "$blob" not found, ignoring
+ continue
+ fi
+ install -D -m644 "$blob_path" "$image_dir/$(basename "$blob_path")"
+ done
+ )
+}
+
+# Determine a basename for our directory as the same as our tarball with
+# extensions removed. This is needed, since tarball packages usually
+# have a base directory of its contents, rather then extracting into the
+# current directory.
+output_dir="$(basename "$OUTPUT_TAR")"
+for ext in .xz .bz2 .gzip .gz .tgz .tar; do
+ output_dir="${output_dir%$ext}"
+done
+
+info Installing scripts
+install_scripts "$td/$output_dir"
+
+info Installing bootloader blobs
+install_bootloader_blobs "$td/$output_dir"
+
+info Writing rootfs tar to "$IMAGE_SUBDIR/$ROOTFS_TAR"
+tar -C "$ROOTDIR" -c . \
+| sh -c "${ROOTFS_COMPRESS-cat}" >"$td/$output_dir/$IMAGE_SUBDIR/$ROOTFS_TAR"
+
+info Writing image package tar to "$OUTPUT_TAR"
+tar -C "$td" -c "$output_dir" | sh -c "${OUTPUT_COMPRESS-cat}" >"$OUTPUT_TAR"
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..8314b56d
--- /dev/null
+++ b/extensions/install-essential-files.configure
@@ -0,0 +1,40 @@
+#!/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 os
+import subprocess
+import sys
+
+target_root = sys.argv[1]
+
+# Clear all INSTALL_FILES environment variable options,
+# so we don't end up installing INSTALL_FILES_foo multiple times.
+for var in list(os.environ):
+ if var.startswith("INSTALL_FILES"):
+ del os.environ[var]
+
+# Force installation of the essential-files manifest
+os.environ["INSTALL_FILES"] = "install-files/essential-files/manifest"
+command = "extensions/install-files.configure"
+subprocess.check_call([command, target_root])
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..54481b97
--- /dev/null
+++ b/extensions/install-files.configure
@@ -0,0 +1,138 @@
+#!/usr/bin/python2
+# 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 environment variables starting
+INSTALL_FILES, then use the contens of those files to determine which files
+to install into the target system.
+
+'''
+
+import errno
+import os
+import re
+import sys
+import shlex
+import shutil
+import stat
+
+try:
+ import jinja2
+ jinja_available = True
+except ImportError:
+ jinja_available = False
+
+import writeexts
+
+class InstallFilesConfigureExtension(writeexts.Extension):
+
+ def process_args(self, args):
+ if not any(var.startswith('INSTALL_FILES') for var in os.environ):
+ return
+ target_root = args[0]
+ for manifest_var in sorted((var for var in os.environ
+ if var.startswith('INSTALL_FILES'))):
+ manifests = shlex.split(os.environ[manifest_var])
+ for manifest in manifests:
+ self.install_manifest(manifest, target_root)
+
+ def install_manifest(self, manifest, target_root):
+ manifest_dir = os.path.dirname(manifest)
+ 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 writeexts.ExtensionError(
+ '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 writeexts.ExtensionError(
+ '"%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 writeexts.ExtensionError('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 writeexts.ExtensionError('File already exists at %s'
+ % dest_path)
+ else:
+ if template:
+ if not jinja_available:
+ raise writeexts.ExtensionError(
+ "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 writeexts.ExtensionError('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..191e1378
--- /dev/null
+++ b/extensions/install-files.configure.help
@@ -0,0 +1,86 @@
+# 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
+
+ All variables starting INSTALL_FILES are considered, and are processed in
+ alphabetical order, so if INSTALL_FILES, INSTALL_FILES_distbuild and
+ INSTALL_FILES_openstack are given, manifests in INSTALL_FILES are processed
+ before those in INSTALL_FILES_distbuild, followed by INSTALL_FILES_openstack.
+
+ Multiple manifest files may be given in the same INSTALL_FILES variable,
+ by providing a whitespace separated list.
+
+ Shell word splitting is supported, so if a manifest's path has spaces in,
+ the path may be shell escaped.
+
+
+ More generally entries in the manifest are formatted as:
+ [overwrite] <octal mode> <uid decimal> <gid decimal> <filename>
+
+ 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/extensions/installer.configure b/extensions/installer.configure
new file mode 100755
index 00000000..995038ac
--- /dev/null
+++ b/extensions/installer.configure
@@ -0,0 +1,48 @@
+#!/usr/bin/python2
+#
+# Copyright (C) 2014 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.
+#
+# This is a "morph deploy" configuration extension to configure an installer
+# system. It will create the configuration needed in the installer system
+# to perform an installation. It uses the following variables from the
+# environment:
+#
+# * INSTALLER_TARGET_STORAGE_DEVICE
+# * INSTALLER_ROOTFS_TO_INSTALL
+# * INSTALLER_POST_INSTALL_COMMAND (optional, defaults to `reboot -f`)
+
+import os
+import sys
+import yaml
+
+install_config_file = os.path.join(sys.argv[1], 'etc', 'install.conf')
+
+try:
+ installer_configuration = {
+ 'INSTALLER_TARGET_STORAGE_DEVICE': os.environ['INSTALLER_TARGET_STORAGE_DEVICE'],
+ 'INSTALLER_ROOTFS_TO_INSTALL': os.environ['INSTALLER_ROOTFS_TO_INSTALL'],
+ }
+except KeyError as e:
+ print "Not configuring as an installer system"
+ sys.exit(0)
+
+postinstkey = 'INSTALLER_POST_INSTALL_COMMAND'
+installer_configuration[postinstkey] = os.environ.get(postinstkey, 'reboot -f')
+
+with open(install_config_file, 'w') as f:
+ f.write( yaml.dump(installer_configuration, default_flow_style=False) )
+
+print "Configuration of the installer system in %s" % install_config_file
diff --git a/extensions/jffs2.write b/extensions/jffs2.write
new file mode 100644
index 00000000..8ff918df
--- /dev/null
+++ b/extensions/jffs2.write
@@ -0,0 +1,64 @@
+#!/usr/bin/python2
+#-*- 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, see <http://www.gnu.org/licenses/>.
+
+
+'''A Morph deployment write extension for creating images with jffs2
+ as the root filesystem.'''
+
+
+import os
+import subprocess
+
+import writeexts
+
+
+class Jffs2WriteExtension(writeexts.WriteExtension):
+
+ '''See jffs2.write.help for documentation.'''
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise writeexts.ExtensionError('Wrong number of command line args')
+
+ temp_root, location = args
+
+ try:
+ self.create_jffs2_system(temp_root, location)
+ self.status(msg='Disk image has been created at %(location)s',
+ location=location)
+ except Exception:
+ self.status(msg='Failure to deploy system to %(location)s',
+ location=location)
+ raise
+
+ def create_jffs2_system(self, temp_root, location):
+ erase_block = self.get_erase_block_size()
+ subprocess.check_call(
+ ['mkfs.jffs2', '--pad', '--no-cleanmarkers',
+ '--eraseblock='+erase_block, '-d', temp_root, '-o', location])
+
+ def get_erase_block_size(self):
+ erase_block = os.environ.get('ERASE_BLOCK', '')
+
+ if erase_block == '':
+ raise writeexts.ExtensionError('ERASE_BLOCK was not given')
+
+ if not erase_block.isdigit():
+ raise writeexts.ExtensionError('ERASE_BLOCK must be a whole number')
+
+ return erase_block
+
+Jffs2WriteExtension().run()
diff --git a/extensions/jffs2.write.help b/extensions/jffs2.write.help
new file mode 100644
index 00000000..059a354b
--- /dev/null
+++ b/extensions/jffs2.write.help
@@ -0,0 +1,28 @@
+#-*- 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, see <http://www.gnu.org/licenses/>.
+
+help: |
+
+ Creates a system produced by Morph build with a jffs2 filesystem and then
+ writes to an image. To use this extension, the host system must have access
+ to mkfs.jffs2 which is provided in the mtd-utilities.morph stratum.
+
+ Parameters:
+
+ * location: the pathname of the disk image to be created/upgraded, or the
+ path to the physical device.
+
+ * ERASE_BLOCK: the erase block size of the target system, which can be
+ found in '/sys/class/mtd/mtdx/erasesize'
diff --git a/extensions/kvm.check b/extensions/kvm.check
new file mode 100755
index 00000000..9ed439dc
--- /dev/null
+++ b/extensions/kvm.check
@@ -0,0 +1,171 @@
+#!/usr/bin/python2
+# 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 os
+import re
+import urlparse
+
+import writeexts
+
+
+class KvmPlusSshCheckExtension(writeexts.WriteExtension):
+
+ location_pattern = '^/(?P<guest>[^/]+)(?P<path>/.+)$'
+
+ def process_args(self, args):
+ if len(args) != 1:
+ raise writeexts.ExtensionError(
+ 'Wrong number of command line args')
+
+ self.require_btrfs_in_deployment_host_kernel()
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if upgrade:
+ raise writeexts.ExtensionError(
+ '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 writeexts.ExtensionError(
+ 'URL schema must be kvm+ssh in %s' % location)
+
+ m = re.match(self.location_pattern, x.path)
+ if not m:
+ raise writeexts.ExtensionError(
+ '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:
+ writeexts.ssh_runcmd(ssh_host,
+ ['virsh', '--connect', 'qemu:///system', 'domstate', vm_name])
+ except writeexts.ExtensionError as e:
+ pass
+ else:
+ raise writeexts.ExtensionError(
+ '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:
+ writeexts.ssh_runcmd(ssh_host, ['touch', vm_path])
+ except writeexts.ExtensionError as e:
+ raise writeexts.ExtensionError(
+ "Can't write to location %s on %s" % (vm_path, ssh_host))
+ else:
+ writeexts.ssh_runcmd(ssh_host, ['rm', vm_path])
+
+ try:
+ writeexts.ssh_runcmd(ssh_host, ['test', '-e', vm_path])
+ except writeexts.ExtensionError as e:
+ # vm_path doesn't already exist, so let's test we can write
+ check_can_write_to_given_path()
+ else:
+ raise writeexts.ExtensionError('%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:
+ writeexts.ssh_runcmd(ssh_host, ['ls', filename])
+ except writeexts.ExtensionError as e:
+ raise writeexts.ExtensionError(
+ '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 = writeexts.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 writeexts.ExtensionError(
+ "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 writeexts.ExtensionError("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 writeexts.ExtensionError(
+ "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:
+ writeexts.ssh_runcmd(ssh_host, ['which', 'virt-install'])
+ except writeexts.ExtensionError:
+ raise writeexts.ExtensionError(
+ '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..d29f52e2
--- /dev/null
+++ b/extensions/kvm.write
@@ -0,0 +1,126 @@
+#!/usr/bin/python2
+# 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 os
+import re
+import subprocess
+import sys
+import tempfile
+import urlparse
+
+import writeexts
+
+
+class KvmPlusSshWriteExtension(writeexts.WriteExtension):
+
+ location_pattern = '^/(?P<guest>[^/]+)(?P<path>/.+)$'
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise writeexts.ExtensionError(
+ '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)
+ writeexts.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 = writeexts.get_data_path('xfer-hole')
+ recv_hole = writeexts.get_data('recv-hole')
+
+ ssh_remote_cmd = [
+ 'sh', '-c', recv_hole, 'dummy-argv0', 'file', vm_path
+ ]
+
+ xfer_hole_proc = subprocess.Popen(
+ ['python', xfer_hole_path, raw_disk],
+ stdout=subprocess.PIPE)
+ recv_hole_proc = subprocess.Popen(
+ ['ssh', ssh_host] + map(writeexts.shell_quote, ssh_remote_cmd),
+ stdin=xfer_hole_proc.stdout)
+ xfer_hole_proc.stdout.close()
+ recv_hole_proc.communicate()
+
+ 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']
+ writeexts.ssh_runcmd(ssh_host, cmdline)
+
+ if autostart:
+ writeexts.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/extensions/mason.configure b/extensions/mason.configure
new file mode 100644
index 00000000..40fdfe46
--- /dev/null
+++ b/extensions/mason.configure
@@ -0,0 +1,153 @@
+#!/bin/sh
+#
+# Copyright (C) 2014 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.
+#
+# This is a "morph deploy" configuration extension to fully configure
+# a Mason instance at deployment time. It uses the following variables
+# from the environment:
+#
+# * ARTIFACT_CACHE_SERVER
+# * MASON_CLUSTER_MORPHOLOGY
+# * MASON_DEFINITIONS_REF
+# * MASON_DISTBUILD_ARCH
+# * MASON_TEST_HOST
+# * OPENSTACK_NETWORK_ID
+# * TEST_INFRASTRUCTURE_TYPE
+# * TROVE_HOST
+# * TROVE_ID
+# * CONTROLLERHOST
+
+set -e
+
+##########################################################################
+# Copy Mason files into root filesystem
+##########################################################################
+
+ROOT="$1"
+
+mkdir -p "$ROOT"/usr/lib/mason
+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 extensions/mason/mason.timer "$ROOT"/etc/systemd/system/mason.timer
+
+cp extensions/mason/mason.service "$ROOT"/etc/systemd/system/mason.service
+
+##########################################################################
+# Set up httpd web server
+##########################################################################
+
+cp extensions/mason/httpd.service "$ROOT"/etc/systemd/system/httpd.service
+
+mkdir -p "$ROOT"/srv/mason
+
+cat >>"$ROOT"/etc/httpd.conf <<EOF
+.log:text/plain
+EOF
+
+mkdir -p "$ROOT"/var/mason
+
+##########################################################################
+# Copy files needed for Ansible configuration
+##########################################################################
+
+mkdir -p "$ROOT/usr/share/mason-setup"
+mkdir -p "$ROOT/usr/lib/mason-setup"
+
+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
+
+##########################################################################
+# Check variables
+##########################################################################
+
+if [ -n "$MASON_GENERIC" ]; then
+ echo Not configuring Mason, it will be generic
+ exit 0
+fi
+
+if [ -z "$MASON_CLUSTER_MORPHOLOGY" -a \
+ -z "$MASON_DEFINITIONS_REF" -a \
+ -z "$MASON_DISTBUILD_ARCH" -a \
+ -z "$MASON_TEST_HOST" ]; then
+ # No Mason options defined, do nothing.
+ exit 0
+fi
+
+if [ -z "$ARTIFACT_CACHE_SERVER" -o \
+ -z "$CONTROLLERHOST" -o \
+ -z "$MASON_CLUSTER_MORPHOLOGY" -o \
+ -z "$MASON_DEFINITIONS_REF" -o \
+ -z "$MASON_DISTBUILD_ARCH" -o \
+ -z "$MASON_TEST_HOST" -o \
+ -z "$TROVE_HOST" -o \
+ -z "$TROVE_ID" ]; then
+ echo Some options required for Mason were defined, but not all.
+ exit 1
+fi
+
+##########################################################################
+# Generate config variable shell snippet
+##########################################################################
+
+MASON_DATA="$ROOT/etc/mason"
+mkdir -p "$MASON_DATA"
+
+python <<'EOF' >"$MASON_DATA/mason.conf"
+import os, sys, yaml
+
+mason_configuration={
+ 'ARTIFACT_CACHE_SERVER': os.environ['ARTIFACT_CACHE_SERVER'],
+ 'MASON_CLUSTER_MORPHOLOGY': os.environ['MASON_CLUSTER_MORPHOLOGY'],
+ 'MASON_DEFINITIONS_REF': os.environ['MASON_DEFINITIONS_REF'],
+ 'MASON_DISTBUILD_ARCH': os.environ['MASON_DISTBUILD_ARCH'],
+ 'MASON_TEST_HOST': os.environ['MASON_TEST_HOST'],
+ 'OPENSTACK_NETWORK_ID': os.environ['OPENSTACK_NETWORK_ID'],
+ 'TEST_INFRASTRUCTURE_TYPE': os.environ['TEST_INFRASTRUCTURE_TYPE'],
+ 'TROVE_ID': os.environ['TROVE_ID'],
+ 'TROVE_HOST': os.environ['TROVE_HOST'],
+ 'CONTROLLERHOST': os.environ['CONTROLLERHOST'],
+}
+
+yaml.dump(mason_configuration, sys.stdout, default_flow_style=False)
+EOF
+
+if [ "$TEST_INFRASTRUCTURE_TYPE" = "openstack" ]; then
+ python <<'EOF' >>"$MASON_DATA/mason.conf"
+import os, sys, yaml
+
+openstack_credentials={
+ 'OS_USERNAME': os.environ['OPENSTACK_USER'],
+ 'OS_TENANT_NAME': os.environ['OPENSTACK_TENANT'],
+ 'OS_TENANT_ID': os.environ['OPENSTACK_TENANT_ID'],
+ 'OS_AUTH_URL': os.environ['OPENSTACK_AUTH_URL'],
+ 'OS_PASSWORD': os.environ['OPENSTACK_PASSWORD'],
+}
+
+yaml.dump(openstack_credentials, sys.stdout, default_flow_style=False)
+EOF
+fi
+
+##########################################################################
+# Enable services
+##########################################################################
+
+ln -s ../mason.timer "$ROOT"/etc/systemd/system/multi-user.target.wants/mason.timer
+ln -s ../httpd.service "$ROOT"/etc/systemd/system/multi-user.target.wants/httpd.service
diff --git a/extensions/mason/ansible/hosts b/extensions/mason/ansible/hosts
new file mode 100644
index 00000000..5b97818d
--- /dev/null
+++ b/extensions/mason/ansible/hosts
@@ -0,0 +1 @@
+localhost ansible_connection=local
diff --git a/extensions/mason/ansible/mason-setup.yml b/extensions/mason/ansible/mason-setup.yml
new file mode 100644
index 00000000..d1528dbb
--- /dev/null
+++ b/extensions/mason/ansible/mason-setup.yml
@@ -0,0 +1,83 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/mason/mason.conf"
+ tasks:
+
+
+ - fail: msg='TROVE_ID is mandatory'
+ when: TROVE_ID is not defined
+
+ - fail: msg='TROVE_HOST is mandatory'
+ when: TROVE_HOST is not defined
+
+ - fail: msg='ARTIFACT_CACHE_SERVER is mandatory'
+ when: ARTIFACT_CACHE_SERVER is not defined
+
+ - fail: msg='MASON_CLUSTER_MORPHOLOGY is mandatory'
+ when: MASON_CLUSTER_MORPHOLOGY is not defined
+
+ - fail: msg='MASON_DEFINITIONS_REF is mandatory'
+ when: MASON_DEFINITIONS_REF is not defined
+
+ - fail: msg='MASON_DISTBUILD_ARCH is mandatory'
+ when: MASON_DISTBUILD_ARCH is not defined
+
+ - fail: msg='MASON_TEST_HOST is mandatory'
+ when: MASON_TEST_HOST is not defined
+
+ - fail: msg='CONTROLLERHOST is mandatory'
+ when: CONTROLLERHOST is not defined
+
+ - fail: msg='TEST_INFRASTRUCTURE_TYPE is mandatory'
+ when: TEST_INFRASTRUCTURE_TYPE is not defined
+
+ - fail: msg='OPENSTACK_NETWORK_ID is mandatory when TEST_INFRASTRUCTURE_TYPE=openstack'
+ when: TEST_INFRASTRUCTURE_TYPE == "openstack" and OPENSTACK_NETWORK_ID is not defined
+
+ - fail: msg='OS_USERNAME is mandatory when TEST_INFRASTRUCTURE_TYPE=openstack'
+ when: TEST_INFRASTRUCTURE_TYPE == "openstack" and OS_USERNAME is not defined
+
+ - fail: msg='OS_PASSWORD is mandatory when TEST_INFRASTRUCTURE_TYPE=openstack'
+ when: TEST_INFRASTRUCTURE_TYPE == "openstack" and OS_PASSWORD is not defined
+
+ - fail: msg='OS_TENANT_ID is mandatory when TEST_INFRASTRUCTURE_TYPE=openstack'
+ when: TEST_INFRASTRUCTURE_TYPE == "openstack" and OS_TENANT_ID is not defined
+
+ - fail: msg='OS_TENANT_NAME is mandatory when TEST_INFRASTRUCTURE_TYPE=openstack'
+ when: TEST_INFRASTRUCTURE_TYPE == "openstack" and OS_TENANT_NAME is not defined
+
+ - fail: msg='OS_AUTH_URL is mandatory when TEST_INFRASTRUCTURE_TYPE=openstack'
+ when: TEST_INFRASTRUCTURE_TYPE == "openstack" and OS_AUTH_URL is not defined
+
+ - name: Create the Mason configuration file
+ template: src=/usr/share/mason-setup/{{ item }} dest=/etc/{{ item }}
+ with_items:
+ - mason.conf
+
+ - name: Create the OpenStack credentials file
+ template: src=/usr/share/mason-setup/{{ item }} dest=/etc/{{ item }}
+ with_items:
+ - os.conf
+ when: TEST_INFRASTRUCTURE_TYPE == "openstack"
+
+ - name: Enable the mason service
+ service: name=mason.service enabled=yes
+ register: mason_service
+ - name: Restart the mason service
+ service: name=mason.service state=restarted
+ when: mason_service|changed
+
+ - name: Enable the mason timer
+ service: name=mason.timer enabled=yes
+ register: mason_timer
+ - name: Restart the mason timer
+ service: name=mason.timer state=restarted
+ when: mason_timer|changed
+
+ - name: Enable the httpd service
+ service: name=httpd.service enabled=yes
+ register: httpd_service
+ - name: Restart the httpd service
+ service: name=httpd state=restarted
+ when: httpd_service|changed
diff --git a/extensions/mason/httpd.service b/extensions/mason/httpd.service
new file mode 100644
index 00000000..7572b732
--- /dev/null
+++ b/extensions/mason/httpd.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=HTTP server for Mason
+After=network.target
+
+[Service]
+User=root
+ExecStart=/usr/sbin/httpd -f -p 80 -h /srv/mason
+
+[Install]
+WantedBy=multi-user.target
diff --git a/extensions/mason/mason-generator.sh b/extensions/mason/mason-generator.sh
new file mode 100755
index 00000000..187db72c
--- /dev/null
+++ b/extensions/mason/mason-generator.sh
@@ -0,0 +1,101 @@
+#!/bin/sh
+
+set -e
+
+if [ "$#" -lt 5 -o "$#" -gt 6 -o "$1" == "-h" -o "$1" == "--help" ]; then
+ cat <<EOF
+Usage:
+ `basename $0` HOST_PREFIX UPSTREAM_TROVE_HOSTNAME VM_USER VM_HOST VM_PATH [HOST_POSTFIX]
+
+Where:
+ HOST_PREFIX -- Name of your Mason instance
+ e.g. "my-mason" to produce hostnames:
+ my-mason-trove and my-mason-controller
+ UPSTREAM_TROVE_HOSTNAME -- Upstream trove's hostname
+ VM_USER -- User on VM host for VM deployment
+ VM_HOST -- VM host for VM deployment
+ VM_PATH -- Path to store VM images in on VM host
+ HOST_POSTFIX -- e.g. ".example.com" to get
+ my-mason-trove.example.com
+
+This script makes deploying a Mason system simpler by automating
+the generation of keys for the systems to use, building of the
+systems, filling out the mason deployment cluster morphology
+template with useful values, and finally deploying the systems.
+
+To ensure that the deployed system can deploy test systems, you
+must supply an ssh key to the VM host. Do so with the following
+command:
+ ssh-copy-id -i ssh_keys-HOST_PREFIX/worker.key.pub VM_USER@VM_HOST
+
+To ensure that the mason can upload artifacts to the upstream trove,
+you must supply an ssh key to the upstream trove. Do so with the
+following command:
+ ssh-copy-id -i ssh_keys-HOST_PREFIX/id_rsa.key.pub root@UPSTREAM_TROVE_HOSTNAME
+
+EOF
+ exit 0
+fi
+
+
+HOST_PREFIX="$1"
+UPSTREAM_TROVE="$2"
+VM_USER="$3"
+VM_HOST="$4"
+VM_PATH="$5"
+HOST_POSTFIX="$6"
+
+sedescape() {
+ # Escape all non-alphanumeric characters
+ printf "%s\n" "$1" | sed -e 's/\W/\\&/g'
+}
+
+
+##############################################################################
+# Key generation
+##############################################################################
+
+mkdir -p "ssh_keys-${HOST_PREFIX}"
+cd "ssh_keys-${HOST_PREFIX}"
+test -e mason.key || ssh-keygen -t rsa -b 2048 -f mason.key -C mason@TROVE_HOST -N ''
+test -e lorry.key || ssh-keygen -t rsa -b 2048 -f lorry.key -C lorry@TROVE_HOST -N ''
+test -e worker.key || ssh-keygen -t rsa -b 2048 -f worker.key -C worker@TROVE_HOST -N ''
+test -e id_rsa || ssh-keygen -t rsa -b 2048 -f id_rsa -C trove-admin@TROVE_HOST -N ''
+cd ../
+
+
+##############################################################################
+# Mason setup
+##############################################################################
+
+cp clusters/mason.morph mason-${HOST_PREFIX}.morph
+
+sed -i "s/red-box-v1/$(sedescape "$HOST_PREFIX")/g" "mason-$HOST_PREFIX.morph"
+sed -i "s/ssh_keys/ssh_keys-$(sedescape "$HOST_PREFIX")/g" "mason-$HOST_PREFIX.morph"
+sed -i "s/upstream-trove/$(sedescape "$UPSTREAM_TROVE")/" "mason-$HOST_PREFIX.morph"
+sed -i "s/vm-user/$(sedescape "$VM_USER")/g" "mason-$HOST_PREFIX.morph"
+sed -i "s/vm-host/$(sedescape "$VM_HOST")/g" "mason-$HOST_PREFIX.morph"
+sed -i "s/vm-path/$(sedescape "$VM_PATH")/g" "mason-$HOST_PREFIX.morph"
+sed -i "s/\.example\.com/$(sedescape "$HOST_POSTFIX")/g" "mason-$HOST_PREFIX.morph"
+
+
+##############################################################################
+# System building
+##############################################################################
+
+morph build systems/trove-system-x86_64.morph
+morph build systems/build-system-x86_64.morph
+
+
+##############################################################################
+# System deployment
+##############################################################################
+
+morph deploy mason-${HOST_PREFIX}.morph
+
+
+##############################################################################
+# Cleanup
+##############################################################################
+
+rm mason-${HOST_PREFIX}.morph
diff --git a/extensions/mason/mason-report.sh b/extensions/mason/mason-report.sh
new file mode 100755
index 00000000..f6cca0ef
--- /dev/null
+++ b/extensions/mason/mason-report.sh
@@ -0,0 +1,297 @@
+#!/bin/bash
+
+set -x
+
+. /etc/mason.conf
+
+REPORT_PATH=/var/mason/report.html
+SERVER_PATH=/srv/mason
+SERVER_REPORT_PATH="$SERVER_PATH/index.html"
+
+sed_escape() {
+ printf "%s\n" "$1" | sed -e 's/\W/\\&/g'
+}
+
+create_report() {
+cat > $REPORT_PATH <<'EOF'
+<html>
+<head>
+<meta charset="UTF-8">
+<meta http-equiv="refresh" content="60">
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+}
+p.branding {
+ background: black;
+ color: #fff;
+ padding: 0.4em;
+ margin: 0;
+ font-weight: bold;
+}
+h1 {
+ background: #225588;
+ color: white;
+ margin: 0;
+ padding: 0.6em;
+}
+table {
+ width: 90%;
+ margin: 1em auto 6em auto;
+ border: 1px solid black;
+ border-spacing: 0;
+}
+table tr.headings {
+ background: #555;
+ color: white;
+}
+table tr.pass {
+ background: #aaffaa;
+}
+table tr.pass:hover {
+ background: #bbffbb;
+}
+table tr.fail {
+ background: #ffaaaa;
+}
+table tr.fail:hover {
+ background: #ffbbbb;
+}
+table tr.nonet {
+ background: #ffdd99;
+}
+table tr.nonet:hover {
+ background: #ffeeaa;
+}
+table tr.progress {
+ background: #00CCFF;
+}
+table tr.progress:hover {
+ background: #91E9FF;
+}
+table tr.headings th {
+ font-weight: bold;
+ text-align: left;
+ padding: 3px 2px;
+}
+table td {
+ padding: 2px;
+}
+td.result {
+ font-weight: bold;
+ text-transform: uppercase;
+}
+td.result a {
+ text-decoration: none;
+}
+td.result a:before {
+ content: "âž« ";
+}
+tr.pass td.result a {
+ color: #252;
+}
+tr.pass td.result a:hover {
+ color: #373;
+}
+tr.fail td.result a {
+ color: #622;
+}
+tr.fail td.result a:hover {
+ color: #933;
+}
+tr.nonet td.result a {
+ color: #641;
+}
+tr.nonet td.result a:hover {
+ color: #962;
+}
+tr.progress td.result a {
+ color: #000066;
+}
+tr.progress td.result a:hover {
+ color: #0000CC;
+}
+td.ref {
+ font-family: monospace;
+}
+td.ref a {
+ color: #333;
+}
+td.ref a:hover {
+ color: #555;
+}
+table tr.pass td, table tr.fail td {
+ border-top: solid white 1px;
+}
+p {
+ margin: 1.3em;
+}
+code {
+ padding: 0.3em 0.5em;
+ background: #eee;
+ border: 1px solid #bbb;
+ border-radius: 1em;
+}
+#footer {
+ margin: 0;
+ background: #aaa;
+ color: #222;
+ border-top: #888 1px solid;
+ font-size: 80%;
+ padding: 0;
+ position: fixed;
+ bottom: 0;
+ width: 100%;
+ display: table;
+}
+#footer p {
+ padding: 1.3em;
+ display: table-cell;
+}
+#footer p code {
+ font-size: 110%;
+}
+#footer p.about {
+ text-align: right;
+}
+</style>
+</head>
+<body>
+<p class="branding">Mason</p>
+<h1>Baserock: Continuous Delivery</h1>
+<p>Build log of changes to <code>BRANCH</code> from <code>TROVE</code>. Most recent first.</p>
+<table>
+<tr class="headings">
+ <th>Started</th>
+ <th>Ref</th>
+ <th>Duration</th>
+ <th>Result</th>
+</tr>
+<!--INSERTION POINT-->
+</table>
+<div id="footer">
+<p>Last checked for updates at: <code>....-..-.. ..:..:..</code></p>
+<p class="about">Generated by Mason | Powered by Baserock</p>
+</div>
+</body>
+</html>
+EOF
+
+ sed -i 's/BRANCH/'"$(sed_escape "$1")"'/' $REPORT_PATH
+ sed -i 's/TROVE/'"$(sed_escape "$2")"'/' $REPORT_PATH
+}
+
+update_report() {
+ # Give function params sensible names
+ build_start_time="$1"
+ build_trove_host="$2"
+ build_ref="$3"
+ build_sha1="$4"
+ build_duration="$5"
+ build_result="$6"
+ report_path="$7"
+ build_log="$8"
+
+ # Generate template if report file is not there
+ if [ ! -f $REPORT_PATH ]; then
+ create_report $build_ref $build_trove_host
+ fi
+
+ # Build table row for insertion into report file
+ if [ "$build_result" = nonet ]; then
+ msg='<tr class="'"${build_result}"'"><td>'"${build_start_time}"'</td><td class="ref">Failed to contact '"${build_trove_host}"'</a></td><td>'"${build_duration}s"'</td><td class="result"><a href="'"${build_log}"'">'"${build_result}"'</a></td></tr>'
+ else
+ msg='<tr class="'"${build_result}"'"><td>'"${build_start_time}"'</td><td class="ref"><a href="http://'"${build_trove_host}"'/cgi-bin/cgit.cgi/baserock/baserock/definitions.git/commit/?h='"${build_ref}"'&id='"${build_sha1}"'">'"${build_sha1}"'</a></td><td>'"${build_duration}s"'</td><td class="result"><a href="'"${build_log}"'">'"${build_result}"'</a></td></tr>'
+ fi
+
+ # Insert report line, newest at top
+ sed -i 's/<!--INSERTION POINT-->/<!--INSERTION POINT-->\n'"$(sed_escape "$msg")"'/' $report_path
+}
+
+update_report_time() {
+ # Give function params sensible names
+ build_start_time="$1"
+
+ # If the report file exists, update the last-checked-for-updates time
+ if [ -f $REPORT_PATH ]; then
+ sed -i 's/<code>....-..-.. ..:..:..<\/code>/<code>'"$(sed_escape "$build_start_time")"'<\/code>/' $REPORT_PATH
+ fi
+}
+
+START_TIME=`date +%Y-%m-%d\ %T`
+
+update_report_time "$START_TIME"
+cp "$REPORT_PATH" "$SERVER_PATH/index.html"
+
+logfile="$(mktemp)"
+
+#Update current.log symlink to point to the current build log
+ln -sf "$logfile" "$SERVER_PATH"/current.log
+
+#Copy current server report, to restore when result is "skip"
+cp "$SERVER_REPORT_PATH" "$SERVER_REPORT_PATH".bak
+
+update_report "$START_TIME" \
+ "$UPSTREAM_TROVE_ADDRESS" \
+ "$DEFINITIONS_REF" \
+ "" \
+ " - " \
+ "progress" \
+ "$SERVER_REPORT_PATH" \
+ "current.log"
+
+
+/usr/lib/mason/mason.sh 2>&1 | tee "$logfile"
+case "${PIPESTATUS[0]}" in
+0)
+ RESULT=pass
+ ;;
+33)
+ RESULT=skip
+ ;;
+42)
+ RESULT=nonet
+ ;;
+*)
+ RESULT=fail
+ ;;
+esac
+
+# TODO: Update page with last executed time
+if [ "$RESULT" = skip ]; then
+ # Restore copied server report, otherwise the 'progress' row will
+ # be still present with a broken link after we remove the $logfile
+ mv "$SERVER_REPORT_PATH".bak "$SERVER_REPORT_PATH"
+
+ rm "$logfile"
+ exit 0
+fi
+
+DURATION=$(( $(date +%s) - $(date --date="$START_TIME" +%s) ))
+SHA1="$(cd "/ws/mason-definitions-$DEFINITIONS_REF" && git rev-parse HEAD)"
+BUILD_LOG="log/${SHA1}--${START_TIME}.log"
+
+update_report "$START_TIME" \
+ "$UPSTREAM_TROVE_ADDRESS" \
+ "$DEFINITIONS_REF" \
+ "$SHA1" \
+ "$DURATION" \
+ "$RESULT" \
+ "$REPORT_PATH" \
+ "$BUILD_LOG"
+
+
+#
+# Copy report into server directory
+#
+
+cp "$REPORT_PATH" "$SERVER_REPORT_PATH"
+mkdir "$SERVER_PATH/log"
+mv "$logfile" "$SERVER_PATH/$BUILD_LOG"
+
+# Cleanup
+
+mkdir -p /srv/distbuild/remove
+find /srv/distbuild/ -not \( -name "remove" -o -name "trees.cache.pickle" \) -mindepth 1 -maxdepth 1 -exec mv '{}' /srv/distbuild/remove \;
+find /srv/distbuild/remove -delete
diff --git a/extensions/mason/mason-setup.service b/extensions/mason/mason-setup.service
new file mode 100644
index 00000000..60403bde
--- /dev/null
+++ b/extensions/mason/mason-setup.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Run mason-setup Ansible scripts
+Requires=network.target
+After=network.target
+Requires=opensshd.service
+After=opensshd.service
+
+# If there's a shared /var subvolume, it must be mounted before this
+# unit runs.
+Requires=local-fs.target
+After=local-fs.target
+
+ConditionPathExists=/etc/mason/mason.conf
+
+[Service]
+ExecStart=/usr/bin/ansible-playbook -v -i /usr/lib/mason-setup/ansible/hosts /usr/lib/mason-setup/ansible/mason-setup.yml
diff --git a/extensions/mason/mason.service b/extensions/mason/mason.service
new file mode 100644
index 00000000..d5c99498
--- /dev/null
+++ b/extensions/mason/mason.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Mason: Continuous Delivery Service
+After=mason-setup.service
+ConditionPathIsDirectory=/srv/distbuild
+
+[Service]
+User=root
+ExecStart=/usr/lib/mason/mason-report.sh
+WorkingDirectory=/srv/distbuild
+
+[Install]
+WantedBy=multi-user.target
diff --git a/extensions/mason/mason.sh b/extensions/mason/mason.sh
new file mode 100755
index 00000000..8b2cea5f
--- /dev/null
+++ b/extensions/mason/mason.sh
@@ -0,0 +1,90 @@
+#!/bin/sh
+
+# Load OpenStack credentials
+if [ -f "/etc/os.conf" ]; then
+ . /etc/os.conf
+fi
+
+set -e
+set -x
+
+# Load our deployment config
+. /etc/mason.conf
+
+mkdir -p /ws
+
+definitions_repo=/ws/mason-definitions-"$DEFINITIONS_REF"
+if [ ! -e "$definitions_repo" ]; then
+ git clone -b "$DEFINITIONS_REF" git://"$UPSTREAM_TROVE_ADDRESS"/baserock/baserock/definitions "$definitions_repo"
+ cd "$definitions_repo"
+ git config user.name "$TROVE_ID"-mason
+ git config user.email "$TROVE_ID"-mason@$(hostname)
+else
+ cd "$definitions_repo"
+ SHA1_PREV="$(git rev-parse HEAD)"
+fi
+
+if ! git remote update origin; then
+ echo ERROR: Unable to contact trove
+ exit 42
+fi
+git clean -fxd
+git reset --hard origin/"$DEFINITIONS_REF"
+
+SHA1="$(git rev-parse HEAD)"
+
+if [ -f "$HOME/success" ] && [ "$SHA1" = "$SHA1_PREV" ]; then
+ echo INFO: No changes to "$DEFINITIONS_REF", nothing to do
+ exit 33
+fi
+
+rm -f "$HOME/success"
+
+echo INFO: Mason building: $DEFINITIONS_REF at $SHA1
+
+if ! "scripts/release-build" --no-default-configs \
+ --trove-host "$UPSTREAM_TROVE_ADDRESS" \
+ --artifact-cache-server "http://$ARTIFACT_CACHE_SERVER:8080/" \
+ --controllers "$DISTBUILD_ARCH:$DISTBUILD_CONTROLLER_ADDRESS" \
+ "$BUILD_CLUSTER_MORPHOLOGY"; then
+ echo ERROR: Failed to build release images
+ echo Build logs for chunks:
+ find build-* -type f -exec echo {} \; -exec cat {} \;
+ exit 1
+fi
+
+releases_made="$(cd release && ls | wc -l)"
+if [ "$releases_made" = 0 ]; then
+ echo ERROR: No release images created
+ exit 1
+else
+ echo INFO: Created "$releases_made" release images
+fi
+
+if [ "$TEST_INFRASTRUCTURE_TYPE" = "openstack" ]; then
+ "scripts/release-test-os" \
+ --deployment-host "$DISTBUILD_ARCH":"$MASON_TEST_HOST" \
+ --trove-host "$UPSTREAM_TROVE_ADDRESS" \
+ --trove-id "$TROVE_ID" \
+ --net-id "$OPENSTACK_NETWORK_ID" \
+ "$BUILD_CLUSTER_MORPHOLOGY"
+elif [ "$TEST_INFRASTRUCTURE_TYPE" = "kvmhost" ]; then
+ "scripts/release-test" \
+ --deployment-host "$DISTBUILD_ARCH":"$MASON_TEST_HOST" \
+ --trove-host "$UPSTREAM_TROVE_ADDRESS" \
+ --trove-id "$TROVE_ID" \
+ "$BUILD_CLUSTER_MORPHOLOGY"
+fi
+
+"scripts/release-upload" --build-trove-host "$ARTIFACT_CACHE_SERVER" \
+ --arch "$DISTBUILD_ARCH" \
+ --log-level=debug --log="$HOME"/release-upload.log \
+ --public-trove-host "$UPSTREAM_TROVE_ADDRESS" \
+ --public-trove-username root \
+ --public-trove-artifact-dir /home/cache/artifacts \
+ --no-upload-release-artifacts \
+ "$BUILD_CLUSTER_MORPHOLOGY"
+
+echo INFO: Artifact upload complete for $DEFINITIONS_REF at $SHA1
+
+touch "$HOME/success"
diff --git a/extensions/mason/mason.timer b/extensions/mason/mason.timer
new file mode 100644
index 00000000..107dff97
--- /dev/null
+++ b/extensions/mason/mason.timer
@@ -0,0 +1,10 @@
+[Unit]
+Description=Runs Mason continually with 1 min between calls
+
+[Timer]
+#Time between Mason finishing and calling it again
+OnUnitActiveSec=1min
+Unit=mason.service
+
+[Install]
+WantedBy=multi-user.target
diff --git a/extensions/mason/os-init-script b/extensions/mason/os-init-script
new file mode 100644
index 00000000..77afb926
--- /dev/null
+++ b/extensions/mason/os-init-script
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+# This allows the test runner to know that cloud-init has completed the
+# disc resizing, and there is enough free space to continue.
+touch /root/cloud-init-finished
+
diff --git a/extensions/mason/share/mason.conf b/extensions/mason/share/mason.conf
new file mode 100644
index 00000000..1295ce84
--- /dev/null
+++ b/extensions/mason/share/mason.conf
@@ -0,0 +1,14 @@
+# This file is generarated by the mason-setup systemd unit.
+# If you want to change the configuration, change the configuration
+# in /etc/mason/mason.conf and restart the service.
+
+ARTIFACT_CACHE_SERVER={{ ARTIFACT_CACHE_SERVER|quote }}
+UPSTREAM_TROVE_ADDRESS={{ TROVE_HOST|quote }}
+DEFINITIONS_REF={{ MASON_DEFINITIONS_REF|quote }}
+DISTBUILD_ARCH={{ MASON_DISTBUILD_ARCH|quote }}
+DISTBUILD_CONTROLLER_ADDRESS={{ CONTROLLERHOST|quote }}
+TROVE_ID={{ TROVE_ID|quote }}
+BUILD_CLUSTER_MORPHOLOGY={{ MASON_CLUSTER_MORPHOLOGY|quote }}
+MASON_TEST_HOST={{ MASON_TEST_HOST|quote }}
+TEST_INFRASTRUCTURE_TYPE={{ TEST_INFRASTRUCTURE_TYPE|quote }}
+{% if OPENSTACK_NETWORK_ID is defined %}OPENSTACK_NETWORK_ID={{ OPENSTACK_NETWORK_ID|quote }}{% endif %}
diff --git a/extensions/mason/share/os.conf b/extensions/mason/share/os.conf
new file mode 100644
index 00000000..21ef398c
--- /dev/null
+++ b/extensions/mason/share/os.conf
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+# A version of this file with the relevant information included can be
+# obtained by navigating to 'Access & Security' -> 'API Access' ->
+# 'Download OpenStack RC file' in The Horizon web interface of your
+# OpenStack. However, the file obtained from there sets OS_PASSWORD
+# such that it will ask the user for a password, so you will need to
+# change that for Mason to work automatically.
+#
+# With the addition of Keystone, to use an openstack cloud you should
+# authenticate against keystone, which returns a **Token** and **Service
+# Catalog**. The catalog contains the endpoint for all services the
+# user/tenant has access to - including nova, glance, keystone, swift.
+#
+# *NOTE*: Using the 2.0 *auth api* does not mean that compute api is 2.0. We
+# will use the 1.1 *compute api*
+export OS_AUTH_URL={{ OS_AUTH_URL|quote }}
+
+# With the addition of Keystone we have standardized on the term **tenant**
+# as the entity that owns the resources.
+export OS_TENANT_ID={{ OS_TENANT_ID|quote }}
+export OS_TENANT_NAME={{ OS_TENANT_NAME|quote }}
+
+# In addition to the owning entity (tenant), openstack stores the entity
+# performing the action as the **user**.
+export OS_USERNAME={{ OS_USERNAME|quote }}
+
+# With Keystone you pass the keystone password.
+export OS_PASSWORD={{ OS_PASSWORD|quote }}
+
diff --git a/extensions/moonshot-kernel.configure b/extensions/moonshot-kernel.configure
new file mode 100644
index 00000000..11d01751
--- /dev/null
+++ b/extensions/moonshot-kernel.configure
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# Copyright (C) 2014 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.
+#
+# This is a "morph deploy" configuration extension to convert a plain
+# kernel Image to uImage, for an HP Moonshot m400 cartridge
+
+set -eu
+
+case "$MOONSHOT_KERNEL" in
+ True|yes)
+ echo "Converting kernel image for Moonshot"
+ mkimage -A arm -O linux -C none -T kernel -a 0x00080000 \
+ -e 0x00080000 -n Linux -d "$1/boot/vmlinux" "$1/boot/uImage"
+ ;;
+ *)
+ echo Unrecognised option "$MOONSHOT_KERNEL" to MOONSHOT_KERNEL
+ exit 1
+ ;;
+esac
diff --git a/extensions/nfsboot-server.configure b/extensions/nfsboot-server.configure
new file mode 100755
index 00000000..9fb48096
--- /dev/null
+++ b/extensions/nfsboot-server.configure
@@ -0,0 +1,58 @@
+#!/bin/sh
+#
+# Copyright (C) 2013-2014 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.
+#
+#
+# This is a "morph deploy" configuration extension to set up a server for
+# booting over nfs and tftp.
+set -e
+
+ROOT="$1"
+
+##########################################################################
+
+nfsboot_root=/srv/nfsboot
+tftp_root="$nfsboot_root"/tftp
+nfs_root="$nfsboot_root"/nfs
+mkdir -p "$ROOT$tftp_root" "$ROOT$nfs_root"
+
+install -D /dev/stdin "$ROOT/usr/lib/systemd/system/nfsboot-tftp.service" <<EOF
+[Unit]
+Description=tftp service for booting kernels
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/udpsvd -E 0 69 /usr/sbin/tftpd $tftp_root
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+for prefix in / /usr; do
+ for unit in nfsboot-tftp.service nfs-server.service; do
+ unit_path="${prefix}/lib/systemd/system/$unit"
+ if [ -e "$ROOT/$unit_path" ]; then
+ ln -s "../../../../$unit_path" \
+ "$ROOT/etc/systemd/system/multi-user.target.wants/$unit"
+ fi
+ done
+done
+
+pxelinux_file="$ROOT/usr/share/syslinux/pxelinux.0"
+if [ -e "$pxelinux_file" ]; then
+ cp "$pxelinux_file" "$ROOT$tftp_root/pxelinux.0"
+fi
diff --git a/extensions/nfsboot.check b/extensions/nfsboot.check
new file mode 100755
index 00000000..0b2e6be7
--- /dev/null
+++ b/extensions/nfsboot.check
@@ -0,0 +1,96 @@
+#!/usr/bin/python2
+# 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 os
+
+import writeexts
+
+
+class NFSBootCheckExtension(writeexts.WriteExtension):
+
+ _nfsboot_root = '/srv/nfsboot'
+
+ def process_args(self, args):
+ if len(args) != 1:
+ raise writeexts.ExtensionError(
+ 'Wrong number of command line args')
+
+ location = args[0]
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if upgrade:
+ raise writeexts.ExtensionError(
+ 'Upgrading is not currently supported for NFS deployments.')
+
+ hostname = os.environ.get('HOSTNAME', None)
+ if hostname is None:
+ raise writeexts.ExtensionError('You must specify a HOSTNAME.')
+ if hostname == 'baserock':
+ raise writeexts.ExtensionError('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 writeexts.ExtensionError(
+ '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:
+ writeexts.ssh_runcmd(
+ 'root@%s' % server, ['test', '-e', '/etc/exports'])
+ except writeexts.ExtensionError:
+ raise writeexts.ExtensionError('server %s is not an nfs server'
+ % server)
+ try:
+ writeexts.ssh_runcmd(
+ 'root@%s' % server, ['systemctl', 'is-enabled',
+ 'nfs-server.service'])
+
+ except writeexts.ExtensionError:
+ raise writeexts.ExtensionError('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:
+ writeexts.ssh_runcmd(
+ 'root@%s' % server, ['test' , '-d', tftp_root])
+ except writeexts.ExtensionError:
+ raise writeexts.ExtensionError('server %s does not export %s' %
+ (tftp_root, server))
+
+ def version_exists(self, versioned_root, location):
+ try:
+ writeexts.ssh_runcmd('root@%s' % location,
+ ['test', '-d', versioned_root])
+ except writeexts.ExtensionError:
+ 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..1256b56f
--- /dev/null
+++ b/extensions/nfsboot.write
@@ -0,0 +1,206 @@
+#!/usr/bin/python2
+# 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 glob
+import os
+import subprocess
+
+import writeexts
+
+
+class NFSBootWriteExtension(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 writeexts.ExtensionError(
+ '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')]
+ writeexts.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 writeexts.ExtensionError(
+ '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')
+ subprocess.check_call(
+ ['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:
+ writeexts.ssh_runcmd('root@%s' % location,
+ ['ln', '-f', kernel_dest,
+ os.path.join(tftp_dir, versioned_kernel_name)])
+
+ writeexts.ssh_runcmd('root@%s' % location,
+ ['ln', '-sf', versioned_kernel_name,
+ os.path.join(tftp_dir, kernel_name)])
+ except writeexts.ExtensionError:
+ raise writeexts.ExtensionError('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:
+ writeexts.ssh_runcmd('root@%s' % location,
+ ['mkdir', '-p', orig_path, run_path])
+ except writeexts.ExtensionError:
+ raise writexts.ExtensionError(
+ 'Could not create dirs %s and %s on %s'
+ % (orig_path, run_path, location))
+
+ self.status(msg='Creating \'orig\' rootfs')
+ subprocess.check_call(
+ ['rsync', '-asXSPH', '--delete', rootfs_src,
+ 'root@%s:%s' % (location, orig_path)])
+
+ self.status(msg='Creating \'run\' rootfs')
+ try:
+ writeexts.ssh_runcmd('root@%s' % location,
+ ['rm', '-rf', run_path])
+ writeexts.ssh_runcmd('root@%s' % location,
+ ['cp', '-al', orig_path, run_path])
+ writeexts.ssh_runcmd('root@%s' % location,
+ ['rm', '-rf',
+ os.path.join(run_path, 'etc')])
+ writeexts.ssh_runcmd('root@%s' % location,
+ ['cp', '-a',
+ os.path.join(orig_path, 'etc'),
+ os.path.join(run_path, 'etc')])
+ except writeexts.ExtensionError:
+ raise writeexts.ExtensionError('Could not create \'run\' rootfs'
+ ' from \'orig\'')
+
+ self.status(msg='Linking \'default\' to latest system')
+ try:
+ writeexts.ssh_runcmd('root@%s' % location,
+ ['ln', '-sfn', versioned_root,
+ os.path.join(self._nfsboot_root, hostname, 'systems',
+ 'default')])
+ except writeexts.ExtensionError:
+ raise writeexts.ExtensionError("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:
+ writeexts.ssh_runcmd(
+ 'root@%s' % location, ['grep', '-q', exported_path,
+ exports_path])
+ except writeexts.ExtensionError:
+ 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"
+'''
+ writeexts.ssh_runcmd(
+ 'root@%s' % location,
+ ['sh', '-c', exports_append_sh, '--', exports_path],
+ feed_stdin=exports_string)
+ writeexts.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/extensions/openstack-ceilometer.configure b/extensions/openstack-ceilometer.configure
new file mode 100644
index 00000000..a98c4d73
--- /dev/null
+++ b/extensions/openstack-ceilometer.configure
@@ -0,0 +1,122 @@
+#!/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, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+set -e
+
+ROOT="$1"
+
+enable(){
+ ln -sf "/usr/lib/systemd/system/$1.service" \
+ "$ROOT/etc/systemd/system/multi-user.target.wants/$1.service"
+}
+
+unnaceptable(){
+ eval echo Unexpected value \$$1 for $1 >&2
+ exit 1
+}
+
+check_bool(){
+ case "$(eval echo \"\$$1\")" in
+ True|'')
+ eval "$1=true"
+ ;;
+ False)
+ eval "$1=false"
+ ;;
+ *)
+ unnaceptable "$1"
+ ;;
+ esac
+}
+
+##########################################################################
+# Check variables
+##########################################################################
+
+check_bool CEILOMETER_ENABLE_CONTROLLER
+check_bool CEILOMETER_ENABLE_COMPUTE
+
+if ! "$CEILOMETER_ENABLE_CONTROLLER" && \
+ ! "$CEILOMETER_ENABLE_COMPUTE"; then
+ exit 0
+fi
+
+if [ -z "$KEYSTONE_TEMPORARY_ADMIN_TOKEN" -o \
+ -z "$CEILOMETER_SERVICE_USER" -o \
+ -z "$CEILOMETER_SERVICE_PASSWORD" -o \
+ -z "$CEILOMETER_DB_USER" -o \
+ -z "$CEILOMETER_DB_PASSWORD" -o \
+ -z "$METERING_SECRET" -o \
+ -z "$RABBITMQ_HOST" -o \
+ -z "$RABBITMQ_PORT" -o \
+ -z "$RABBITMQ_USER" -o \
+ -z "$RABBITMQ_PASSWORD" -o \
+ -z "$MANAGEMENT_INTERFACE_IP_ADDRESS" -o \
+ -z "$NOVA_VIRT_TYPE" -o \
+ -z "$CONTROLLER_HOST_ADDRESS" ]; then
+ echo Some options required for Ceilometer were defined, but not all.
+ exit 1
+fi
+
+######################################
+# Enable relevant openstack services #
+######################################
+
+if "$CEILOMETER_ENABLE_COMPUTE" || "$CEILOMETER_ENABLE_CONTROLLER"; then
+ enable openstack-ceilometer-config-setup
+fi
+if "$CEILOMETER_ENABLE_COMPUTE"; then
+ enable openstack-ceilometer-compute
+fi
+if "$CEILOMETER_ENABLE_CONTROLLER"; then
+ enable openstack-ceilometer-db-setup
+ enable openstack-ceilometer-api
+ enable openstack-ceilometer-collector
+ enable openstack-ceilometer-notification
+ enable openstack-ceilometer-central
+ enable openstack-ceilometer-alarm-evaluator
+ enable openstack-ceilometer-alarm-notifier
+fi
+
+##########################################################################
+# Generate configuration file
+##########################################################################
+
+OPENSTACK_DATA="$ROOT/etc/openstack"
+mkdir -p "$OPENSTACK_DATA"
+
+python <<'EOF' >"$OPENSTACK_DATA/ceilometer.conf"
+import os, sys, yaml
+
+ceilometer_configuration={
+ 'KEYSTONE_TEMPORARY_ADMIN_TOKEN': os.environ['KEYSTONE_TEMPORARY_ADMIN_TOKEN'],
+ 'CEILOMETER_SERVICE_PASSWORD': os.environ['CEILOMETER_SERVICE_PASSWORD'],
+ 'CEILOMETER_SERVICE_USER': os.environ['CEILOMETER_SERVICE_USER'],
+ 'CEILOMETER_DB_USER': os.environ['CEILOMETER_DB_USER'],
+ 'CEILOMETER_DB_PASSWORD': os.environ['CEILOMETER_DB_PASSWORD'],
+ 'METERING_SECRET': os.environ['METERING_SECRET'],
+ 'RABBITMQ_HOST': os.environ['RABBITMQ_HOST'],
+ 'RABBITMQ_PORT': os.environ['RABBITMQ_PORT'],
+ 'RABBITMQ_USER': os.environ['RABBITMQ_USER'],
+ 'RABBITMQ_PASSWORD': os.environ['RABBITMQ_PASSWORD'],
+ 'MANAGEMENT_INTERFACE_IP_ADDRESS': os.environ['MANAGEMENT_INTERFACE_IP_ADDRESS'],
+ 'CONTROLLER_HOST_ADDRESS': os.environ['CONTROLLER_HOST_ADDRESS'],
+ 'NOVA_VIRT_TYPE': os.environ['NOVA_VIRT_TYPE'],
+}
+
+yaml.dump(ceilometer_configuration, sys.stdout, default_flow_style=False)
+EOF
diff --git a/extensions/openstack-cinder.configure b/extensions/openstack-cinder.configure
new file mode 100644
index 00000000..4c32e11a
--- /dev/null
+++ b/extensions/openstack-cinder.configure
@@ -0,0 +1,125 @@
+#!/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/>.
+
+set -e
+
+ROOT="$1"
+
+enable(){
+ ln -sf "/usr/lib/systemd/system/$1.service" \
+ "$ROOT/etc/systemd/system/multi-user.target.wants/$1.service"
+}
+
+unnaceptable(){
+ eval echo Unexpected value \$$1 for $1 >&2
+ exit 1
+}
+
+check_bool(){
+ case "$(eval echo \"\$$1\")" in
+ True|'')
+ eval "$1=true"
+ ;;
+ False)
+ eval "$1=false"
+ ;;
+ *)
+ unnaceptable "$1"
+ ;;
+ esac
+}
+
+##########################################################################
+# Check variables
+##########################################################################
+
+check_bool CINDER_ENABLE_CONTROLLER
+check_bool CINDER_ENABLE_COMPUTE
+check_bool CINDER_ENABLE_STORAGE
+
+if ! "$CINDER_ENABLE_CONTROLLER" && \
+ ! "$CINDER_ENABLE_COMPUTE" && \
+ ! "$CINDER_ENABLE_STORAGE"; then
+ exit 0
+fi
+
+if [ -z "$RABBITMQ_HOST" -o \
+ -z "$RABBITMQ_PORT" -o \
+ -z "$RABBITMQ_USER" -o \
+ -z "$RABBITMQ_PASSWORD" -o \
+ -z "$KEYSTONE_TEMPORARY_ADMIN_TOKEN" -o \
+ -z "$CINDER_DB_USER" -o \
+ -z "$CINDER_DB_PASSWORD" -o \
+ -z "$CONTROLLER_HOST_ADDRESS" -o \
+ -z "$CINDER_SERVICE_USER" -o \
+ -z "$CINDER_SERVICE_PASSWORD" -o \
+ -z "$CINDER_DEVICE" -o \
+ -z "$MANAGEMENT_INTERFACE_IP_ADDRESS" ]; then
+ echo Some options required for Cinder were defined, but not all.
+ exit 1
+fi
+
+######################################
+# Enable relevant openstack services #
+######################################
+
+if "$CINDER_ENABLE_COMPUTE" || "$CINDER_ENABLE_STORAGE"; then
+ enable iscsi-setup
+ enable target #target.service!
+ enable iscsid
+fi
+if "$CINDER_ENABLE_COMPUTE" || "$CINDER_ENABLE_CONTROLLER" || "$CINDER_ENABLE_STORAGE"; then
+ enable openstack-cinder-config-setup
+fi
+if "$CINDER_ENABLE_STORAGE"; then
+ enable openstack-cinder-lv-setup
+ enable lvm2-lvmetad
+ enable openstack-cinder-volume
+ enable openstack-cinder-backup
+ enable openstack-cinder-scheduler
+fi
+if "$CINDER_ENABLE_CONTROLLER"; then
+ enable openstack-cinder-db-setup
+ enable openstack-cinder-api
+fi
+
+##########################################################################
+# Generate configuration file
+##########################################################################
+
+OPENSTACK_DATA="$ROOT/etc/openstack"
+mkdir -p "$OPENSTACK_DATA"
+
+python <<'EOF' >"$OPENSTACK_DATA/cinder.conf"
+import os, sys, yaml
+
+cinder_configuration={
+ 'RABBITMQ_HOST':os.environ['RABBITMQ_HOST'],
+ 'RABBITMQ_PORT':os.environ['RABBITMQ_PORT'],
+ 'RABBITMQ_USER':os.environ['RABBITMQ_USER'],
+ 'RABBITMQ_PASSWORD':os.environ['RABBITMQ_PASSWORD'],
+ 'KEYSTONE_TEMPORARY_ADMIN_TOKEN':os.environ['KEYSTONE_TEMPORARY_ADMIN_TOKEN'],
+ 'CINDER_DB_USER':os.environ['CINDER_DB_USER'],
+ 'CINDER_DB_PASSWORD':os.environ['CINDER_DB_PASSWORD'],
+ 'CONTROLLER_HOST_ADDRESS':os.environ['CONTROLLER_HOST_ADDRESS'],
+ 'CINDER_SERVICE_USER':os.environ['CINDER_SERVICE_USER'],
+ 'CINDER_SERVICE_PASSWORD':os.environ['CINDER_SERVICE_PASSWORD'],
+ 'CINDER_DEVICE':os.environ['CINDER_DEVICE'],
+ 'MANAGEMENT_INTERFACE_IP_ADDRESS':os.environ['MANAGEMENT_INTERFACE_IP_ADDRESS'],
+}
+
+yaml.dump(cinder_configuration, sys.stdout, default_flow_style=False)
+EOF
diff --git a/extensions/openstack-glance.configure b/extensions/openstack-glance.configure
new file mode 100644
index 00000000..5da08895
--- /dev/null
+++ b/extensions/openstack-glance.configure
@@ -0,0 +1,101 @@
+#!/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/>.
+
+set -e
+
+ROOT="$1"
+
+enable(){
+ ln -sf "/usr/lib/systemd/system/$1.service" \
+ "$ROOT/etc/systemd/system/multi-user.target.wants/$1.service"
+}
+
+unnaceptable(){
+ eval echo Unexpected value \$$1 for $1 >&2
+ exit 1
+}
+
+check_bool(){
+ case "$(eval echo \"\$$1\")" in
+ True|'')
+ eval "$1=true"
+ ;;
+ False)
+ eval "$1=false"
+ ;;
+ *)
+ unnaceptable "$1"
+ ;;
+ esac
+}
+
+##########################################################################
+# Check variables
+##########################################################################
+
+check_bool GLANCE_ENABLE_SERVICE
+
+if ! "$GLANCE_ENABLE_SERVICE"; then
+ exit 0
+fi
+
+if [ -z "$KEYSTONE_TEMPORARY_ADMIN_TOKEN" -o \
+ -z "$GLANCE_SERVICE_USER" -o \
+ -z "$GLANCE_SERVICE_PASSWORD" -o \
+ -z "$GLANCE_DB_USER" -o \
+ -z "$GLANCE_DB_PASSWORD" -o \
+ -z "$RABBITMQ_HOST" -o \
+ -z "$RABBITMQ_PORT" -o \
+ -z "$RABBITMQ_USER" -o \
+ -z "$RABBITMQ_PASSWORD" -o \
+ -z "$MANAGEMENT_INTERFACE_IP_ADDRESS" -o \
+ -z "$CONTROLLER_HOST_ADDRESS" ]; then
+ echo Some options required for Glance were defined, but not all.
+ exit 1
+fi
+
+######################################
+# Enable relevant openstack services #
+######################################
+
+enable openstack-glance-setup
+
+##########################################################################
+# Generate configuration file
+##########################################################################
+
+OPENSTACK_DATA="$ROOT/etc/openstack"
+mkdir -p "$OPENSTACK_DATA"
+
+python <<'EOF' >"$OPENSTACK_DATA/glance.conf"
+import os, sys, yaml
+
+glance_configuration={
+ 'KEYSTONE_TEMPORARY_ADMIN_TOKEN': os.environ['KEYSTONE_TEMPORARY_ADMIN_TOKEN'],
+ 'GLANCE_SERVICE_PASSWORD': os.environ['GLANCE_SERVICE_PASSWORD'],
+ 'GLANCE_SERVICE_USER': os.environ['GLANCE_SERVICE_USER'],
+ 'GLANCE_DB_USER': os.environ['GLANCE_DB_USER'],
+ 'GLANCE_DB_PASSWORD': os.environ['GLANCE_DB_PASSWORD'],
+ 'RABBITMQ_HOST': os.environ['RABBITMQ_HOST'],
+ 'RABBITMQ_PORT': os.environ['RABBITMQ_PORT'],
+ 'RABBITMQ_USER': os.environ['RABBITMQ_USER'],
+ 'RABBITMQ_PASSWORD': os.environ['RABBITMQ_PASSWORD'],
+ 'MANAGEMENT_INTERFACE_IP_ADDRESS': os.environ['MANAGEMENT_INTERFACE_IP_ADDRESS'],
+ 'CONTROLLER_HOST_ADDRESS': os.environ['CONTROLLER_HOST_ADDRESS'],
+}
+
+yaml.dump(glance_configuration, sys.stdout, default_flow_style=False)
+EOF
diff --git a/extensions/openstack-ironic.configure b/extensions/openstack-ironic.configure
new file mode 100644
index 00000000..c77b1288
--- /dev/null
+++ b/extensions/openstack-ironic.configure
@@ -0,0 +1,157 @@
+#!/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, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+set -e
+
+ROOT="$1"
+
+enable(){
+ ln -sf "/usr/lib/systemd/system/$1.service" \
+ "$ROOT/etc/systemd/system/multi-user.target.wants/$1.service"
+}
+
+unnaceptable(){
+ eval echo Unexpected value \$$1 for $1 >&2
+ exit 1
+}
+
+check_bool(){
+ case "$(eval echo \"\$$1\")" in
+ True|'')
+ eval "$1=true"
+ ;;
+ False)
+ eval "$1=false"
+ ;;
+ *)
+ unnaceptable "$1"
+ ;;
+ esac
+}
+
+##########################################################################
+# Check variables
+##########################################################################
+
+check_bool IRONIC_ENABLE_SERVICE
+
+if ! "$IRONIC_ENABLE_SERVICE"; then
+ exit 0
+fi
+
+if [ -z "$IRONIC_SERVICE_USER" -o \
+ -z "$IRONIC_SERVICE_PASSWORD" -o \
+ -z "$IRONIC_DB_USER" -o \
+ -z "$IRONIC_DB_PASSWORD" -o \
+ -z "$RABBITMQ_HOST" -o \
+ -z "$RABBITMQ_USER" -o \
+ -z "$RABBITMQ_PASSWORD" -o \
+ -z "$RABBITMQ_PORT" -o \
+ -z "$CONTROLLER_HOST_ADDRESS" -o \
+ -z "$MANAGEMENT_INTERFACE_IP_ADDRESS" -o \
+ -z "$KEYSTONE_TEMPORARY_ADMIN_TOKEN" ]; then
+ echo Some options required for Ironic were defined, but not all.
+ exit 1
+fi
+
+######################################
+# Enable relevant openstack services #
+######################################
+
+enable openstack-ironic-setup
+enable iscsi-setup
+enable target #target.service!
+enable iscsid
+
+##########################################################################
+# Generate configuration file
+##########################################################################
+
+OPENSTACK_DATA="$ROOT/etc/openstack"
+mkdir -p "$OPENSTACK_DATA"
+
+python <<'EOF' >"$OPENSTACK_DATA/ironic.conf"
+import os, sys, yaml
+
+ironic_configuration={
+ 'IRONIC_SERVICE_USER': os.environ['IRONIC_SERVICE_USER'],
+ 'IRONIC_SERVICE_PASSWORD': os.environ['IRONIC_SERVICE_PASSWORD'],
+ 'IRONIC_DB_USER': os.environ['IRONIC_DB_USER'],
+ 'IRONIC_DB_PASSWORD': os.environ['IRONIC_DB_PASSWORD'],
+ 'RABBITMQ_HOST':os.environ['RABBITMQ_HOST'],
+ 'RABBITMQ_PORT':os.environ['RABBITMQ_PORT'],
+ 'RABBITMQ_USER':os.environ['RABBITMQ_USER'],
+ 'RABBITMQ_PASSWORD':os.environ['RABBITMQ_PASSWORD'],
+ 'CONTROLLER_HOST_ADDRESS': os.environ['CONTROLLER_HOST_ADDRESS'],
+ 'MANAGEMENT_INTERFACE_IP_ADDRESS': os.environ['MANAGEMENT_INTERFACE_IP_ADDRESS'],
+ 'KEYSTONE_TEMPORARY_ADMIN_TOKEN': os.environ['KEYSTONE_TEMPORARY_ADMIN_TOKEN'],
+
+}
+
+yaml.dump(ironic_configuration, sys.stdout, default_flow_style=False)
+EOF
+
+##########################################################################
+# Configure the TFTP service #
+##########################################################################
+
+tftp_root="/srv/tftp_root/" # trailing slash is essential
+mkdir -p "$ROOT/$tftp_root"
+
+install -D /dev/stdin -m 644 "$ROOT/usr/lib/systemd/system/tftp-hpa.service" << 'EOF'
+[Unit]
+Description=tftp service for booting kernels
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=simple
+EnvironmentFile=/etc/tftp-hpa.conf
+ExecStart=/usr/sbin/in.tftpd $TFTP_OPTIONS ${TFTP_ROOT}
+StandardInput=socket
+StandardOutput=inherit
+StandardError=journal
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+install -D /dev/stdin -m 644 "$ROOT/usr/lib/systemd/system/tftp-hpa.socket" << EOF
+[Unit]
+Description=Tftp server activation socket
+
+[Socket]
+ListenDatagram=$MANAGEMENT_INTERFACE_IP_ADDRESS:69
+FreeBind=yes
+
+[Install]
+WantedBy=sockets.target
+EOF
+
+install -D -m 644 /dev/stdin "$ROOT"/etc/tftp-hpa.conf << EOF
+TFTP_ROOT=$tftp_root
+TFTP_OPTIONS="-v -v -v -v -v --map-file $tftp_root/map-file"
+EOF
+
+install -D /dev/stdin -m 644 "$ROOT/$tftp_root"/map-file << EOF
+r ^([^/]) $tftp_root\1
+r ^/tftpboot/ $tftp_root\2
+EOF
+
+cp "$ROOT"/usr/share/syslinux/pxelinux.0 "$ROOT/$tftp_root"
+cp "$ROOT"/usr/share/syslinux/chain.c32 "$ROOT/$tftp_root"
+
diff --git a/extensions/openstack-keystone.configure b/extensions/openstack-keystone.configure
new file mode 100644
index 00000000..6b011b14
--- /dev/null
+++ b/extensions/openstack-keystone.configure
@@ -0,0 +1,123 @@
+#!/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/>.
+
+set -e
+
+ROOT="$1"
+
+enable(){
+ ln -sf "/usr/lib/systemd/system/$1.service" \
+ "$ROOT/etc/systemd/system/multi-user.target.wants/$1.service"
+}
+
+unnaceptable(){
+ eval echo Unexpected value \$$1 for $1 >&2
+ exit 1
+}
+
+check_bool(){
+ case "$(eval echo \"\$$1\")" in
+ True|'')
+ eval "$1=true"
+ ;;
+ False)
+ eval "$1=false"
+ ;;
+ *)
+ unnaceptable "$1"
+ ;;
+ esac
+}
+
+##########################################################################
+# Check variables
+##########################################################################
+
+check_bool KEYSTONE_ENABLE_SERVICE
+
+if ! "$KEYSTONE_ENABLE_SERVICE"; then
+ exit 0
+fi
+
+if [ -z "$KEYSTONE_TEMPORARY_ADMIN_TOKEN" -o \
+ -z "$KEYSTONE_ADMIN_PASSWORD" -o \
+ -z "$KEYSTONE_DB_USER" -o \
+ -z "$KEYSTONE_DB_PASSWORD" -o \
+ -z "$RABBITMQ_HOST" -o \
+ -z "$RABBITMQ_PORT" -o \
+ -z "$RABBITMQ_USER" -o \
+ -z "$RABBITMQ_PASSWORD" -o \
+ -z "$MANAGEMENT_INTERFACE_IP_ADDRESS" -o \
+ -z "$CONTROLLER_HOST_ADDRESS" ]; then
+ echo Some options required for Keystone were defined, but not all.
+ exit 1
+fi
+
+python <<'EOF'
+import socket
+import sys
+import os
+
+try:
+ socket.inet_pton(socket.AF_INET, os.environ['MANAGEMENT_INTERFACE_IP_ADDRESS'])
+except:
+ print "Error: MANAGEMENT_INTERFACE_IP_ADDRESS is not a valid IP"
+ sys.exit(1)
+EOF
+
+######################################
+# Enable relevant openstack services #
+######################################
+
+enable openstack-keystone-setup
+enable openstack-horizon-setup
+enable postgres-server-setup
+
+##########################################################################
+# Generate configuration file
+##########################################################################
+
+OPENSTACK_DATA="$ROOT/etc/openstack"
+mkdir -p "$OPENSTACK_DATA"
+
+python <<'EOF' >"$OPENSTACK_DATA/keystone.conf"
+import os, sys, yaml
+
+keystone_configuration={
+ 'KEYSTONE_TEMPORARY_ADMIN_TOKEN': os.environ['KEYSTONE_TEMPORARY_ADMIN_TOKEN'],
+ 'KEYSTONE_ADMIN_PASSWORD': os.environ['KEYSTONE_ADMIN_PASSWORD'],
+ 'KEYSTONE_DB_USER': os.environ['KEYSTONE_DB_USER'],
+ 'KEYSTONE_DB_PASSWORD': os.environ['KEYSTONE_DB_PASSWORD'],
+ 'RABBITMQ_HOST': os.environ['RABBITMQ_HOST'],
+ 'RABBITMQ_PORT': os.environ['RABBITMQ_PORT'],
+ 'RABBITMQ_USER': os.environ['RABBITMQ_USER'],
+ 'RABBITMQ_PASSWORD': os.environ['RABBITMQ_PASSWORD'],
+ 'MANAGEMENT_INTERFACE_IP_ADDRESS': os.environ['MANAGEMENT_INTERFACE_IP_ADDRESS'],
+ 'CONTROLLER_HOST_ADDRESS': os.environ['CONTROLLER_HOST_ADDRESS'],
+}
+
+yaml.dump(keystone_configuration, sys.stdout, default_flow_style=False)
+EOF
+
+python << 'EOF' > "$OPENSTACK_DATA/postgres.conf"
+import os, sys, yaml
+
+postgres_configuration={
+ 'MANAGEMENT_INTERFACE_IP_ADDRESS': os.environ['MANAGEMENT_INTERFACE_IP_ADDRESS'],
+}
+
+yaml.dump(postgres_configuration, sys.stdout, default_flow_style=False)
+EOF
diff --git a/extensions/openstack-network.configure b/extensions/openstack-network.configure
new file mode 100644
index 00000000..9128f845
--- /dev/null
+++ b/extensions/openstack-network.configure
@@ -0,0 +1,80 @@
+#!/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/>.
+
+set -e
+
+ROOT="$1"
+
+enable(){
+ ln -sf "/usr/lib/systemd/system/$1.service" \
+ "$ROOT/etc/systemd/system/multi-user.target.wants/$1.service"
+}
+
+unnaceptable(){
+ eval echo Unexpected value \$$1 for $1 >&2
+ exit 1
+}
+
+check_bool(){
+ case "$(eval echo \"\$$1\")" in
+ True|'')
+ eval "$1=true"
+ ;;
+ False)
+ eval "$1=false"
+ ;;
+ *)
+ unnaceptable "$1"
+ ;;
+ esac
+}
+
+##########################################################################
+# Check variables
+##########################################################################
+
+check_bool NEUTRON_ENABLE_MANAGER
+check_bool NEUTRON_ENABLE_AGENT
+
+if ! "$NEUTRON_ENABLE_MANAGER" && ! "$NEUTRON_ENABLE_AGENT"; then
+ exit 0
+fi
+
+###################
+# Enable services #
+###################
+
+enable openvswitch-setup
+enable openstack-network-setup
+
+##########################################################################
+# Generate config variable shell snippet
+##########################################################################
+
+OPENSTACK_DATA="$ROOT/etc/openstack"
+mkdir -p "$OPENSTACK_DATA"
+
+python <<'EOF' >"$OPENSTACK_DATA/network.conf"
+import os, sys, yaml
+
+network_configuration = {}
+
+optional_keys = ('EXTERNAL_INTERFACE',)
+
+network_configuration.update((k, os.environ[k]) for k in optional_keys if k in os.environ)
+
+yaml.dump(network_configuration, sys.stdout, default_flow_style=False)
+EOF
diff --git a/extensions/openstack-neutron.configure b/extensions/openstack-neutron.configure
new file mode 100644
index 00000000..210222db
--- /dev/null
+++ b/extensions/openstack-neutron.configure
@@ -0,0 +1,138 @@
+#!/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/>.
+
+set -e
+
+ROOT="$1"
+
+enable(){
+ ln -sf "/usr/lib/systemd/system/openstack-neutron-$1.service" \
+ "$ROOT/etc/systemd/system/multi-user.target.wants/openstack-neutron-$1.service"
+}
+
+unnaceptable(){
+ eval echo Unexpected value \$$1 for $1 >&2
+ exit 1
+}
+
+check_bool(){
+ case "$(eval echo \"\$$1\")" in
+ True|'')
+ eval "$1=true"
+ ;;
+ False)
+ eval "$1=false"
+ ;;
+ *)
+ unnaceptable "$1"
+ ;;
+ esac
+}
+
+##########################################################################
+# Check variables
+##########################################################################
+
+check_bool NEUTRON_ENABLE_CONTROLLER
+check_bool NEUTRON_ENABLE_MANAGER
+check_bool NEUTRON_ENABLE_AGENT
+
+if ! "$NEUTRON_ENABLE_CONTROLLER" && \
+ ! "$NEUTRON_ENABLE_MANAGER" && \
+ ! "$NEUTRON_ENABLE_AGENT"; then
+ exit 0
+fi
+
+if [ -z "$NEUTRON_SERVICE_USER" -o \
+ -z "$NEUTRON_SERVICE_PASSWORD" -o \
+ -z "$NEUTRON_DB_USER" -o \
+ -z "$NEUTRON_DB_PASSWORD" -o \
+ -z "$METADATA_PROXY_SHARED_SECRET" -o \
+ -z "$NOVA_SERVICE_USER" -o \
+ -z "$NOVA_SERVICE_PASSWORD" -o \
+ -z "$RABBITMQ_HOST" -o \
+ -z "$RABBITMQ_USER" -o \
+ -z "$RABBITMQ_PASSWORD" -o \
+ -z "$RABBITMQ_PORT" -o \
+ -z "$CONTROLLER_HOST_ADDRESS" -o \
+ -z "$MANAGEMENT_INTERFACE_IP_ADDRESS" -o \
+ -z "$KEYSTONE_TEMPORARY_ADMIN_TOKEN" ]; then
+ echo Some options required for Neutron were defined, but not all.
+ exit 1
+fi
+
+#############################################
+# Ensure /var/run is an appropriate symlink #
+#############################################
+
+if ! link="$(readlink "$ROOT/var/run")" || [ "$link" != ../run ]; then
+ rm -rf "$ROOT/var/run"
+ ln -s ../run "$ROOT/var/run"
+fi
+
+###################
+# Enable services #
+###################
+
+if "$NEUTRON_ENABLE_CONTROLLER"; then
+ enable config-setup
+ enable db-setup
+ enable server
+fi
+
+if "$NEUTRON_ENABLE_MANAGER"; then
+ enable config-setup
+ enable ovs-cleanup
+ enable dhcp-agent
+ enable l3-agent
+ enable plugin-openvswitch-agent
+ enable metadata-agent
+fi
+
+if "$NEUTRON_ENABLE_AGENT"; then
+ enable config-setup
+ enable plugin-openvswitch-agent
+fi
+
+##########################################################################
+# Generate config variable shell snippet
+##########################################################################
+
+OPENSTACK_DATA="$ROOT/etc/openstack"
+mkdir -p "$OPENSTACK_DATA"
+
+python <<'EOF' >"$OPENSTACK_DATA/neutron.conf"
+import os, sys, yaml
+
+nova_configuration={
+ 'NEUTRON_SERVICE_USER': os.environ['NEUTRON_SERVICE_USER'],
+ 'NEUTRON_SERVICE_PASSWORD': os.environ['NEUTRON_SERVICE_PASSWORD'],
+ 'NEUTRON_DB_USER': os.environ['NEUTRON_DB_USER'],
+ 'NEUTRON_DB_PASSWORD': os.environ['NEUTRON_DB_PASSWORD'],
+ 'METADATA_PROXY_SHARED_SECRET': os.environ['METADATA_PROXY_SHARED_SECRET'],
+ 'NOVA_SERVICE_USER': os.environ['NOVA_SERVICE_USER'],
+ 'NOVA_SERVICE_PASSWORD': os.environ['NOVA_SERVICE_PASSWORD'],
+ 'RABBITMQ_HOST': os.environ['RABBITMQ_HOST'],
+ 'RABBITMQ_USER': os.environ['RABBITMQ_USER'],
+ 'RABBITMQ_PASSWORD': os.environ['RABBITMQ_PASSWORD'],
+ 'RABBITMQ_PORT': os.environ['RABBITMQ_PORT'],
+ 'CONTROLLER_HOST_ADDRESS': os.environ['CONTROLLER_HOST_ADDRESS'],
+ 'MANAGEMENT_INTERFACE_IP_ADDRESS': os.environ['MANAGEMENT_INTERFACE_IP_ADDRESS'],
+ 'KEYSTONE_TEMPORARY_ADMIN_TOKEN': os.environ['KEYSTONE_TEMPORARY_ADMIN_TOKEN'],
+}
+
+yaml.dump(nova_configuration, sys.stdout, default_flow_style=False)
+EOF
diff --git a/extensions/openstack-nova.configure b/extensions/openstack-nova.configure
new file mode 100644
index 00000000..241d94c2
--- /dev/null
+++ b/extensions/openstack-nova.configure
@@ -0,0 +1,163 @@
+#!/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/>.
+
+set -e
+
+ROOT="$1"
+
+enable(){
+ ln -sf "/usr/lib/systemd/system/openstack-nova-$1.service" \
+ "$ROOT/etc/systemd/system/multi-user.target.wants/openstack-nova-$1.service"
+}
+
+unnaceptable(){
+ eval echo Unexpected value \$$1 for $1 >&2
+ exit 1
+}
+
+check_bool(){
+ case "$(eval echo \"\$$1\")" in
+ True|'')
+ eval "$1=true"
+ ;;
+ False)
+ eval "$1=false"
+ ;;
+ *)
+ unnaceptable "$1"
+ ;;
+ esac
+}
+
+##########################################################################
+# Check variables
+##########################################################################
+
+check_bool NOVA_ENABLE_CONTROLLER
+check_bool NOVA_ENABLE_COMPUTE
+
+if ! "$NOVA_ENABLE_CONTROLLER" && \
+ ! "$NOVA_ENABLE_COMPUTE"; then
+ exit 0
+fi
+
+if [ -z "$NOVA_SERVICE_USER" -o \
+ -z "$NOVA_SERVICE_PASSWORD" -o \
+ -z "$NOVA_DB_USER" -o \
+ -z "$NOVA_DB_PASSWORD" -o \
+ -z "$NOVA_VIRT_TYPE" -o \
+ -z "$NEUTRON_SERVICE_USER" -o \
+ -z "$NEUTRON_SERVICE_PASSWORD" -o \
+ -z "$IRONIC_SERVICE_USER" -a \
+ -z "$IRONIC_SERVICE_PASSWORD" -a \
+ -z "$METADATA_PROXY_SHARED_SECRET" -o \
+ -z "$RABBITMQ_HOST" -o \
+ -z "$RABBITMQ_USER" -o \
+ -z "$RABBITMQ_PASSWORD" -o \
+ -z "$RABBITMQ_PORT" -o \
+ -z "$CONTROLLER_HOST_ADDRESS" -o \
+ -z "$MANAGEMENT_INTERFACE_IP_ADDRESS" -o \
+ -z "$KEYSTONE_TEMPORARY_ADMIN_TOKEN" ]; then
+ echo Some options required for Nova were defined, but not all.
+ exit 1
+fi
+
+###############################################
+# Enable libvirtd and libvirt-guests services #
+###############################################
+
+wants_dir="$ROOT"/usr/lib/systemd/system/multi-user.target.wants
+mkdir -p "$wants_dir"
+mkdir -p "$ROOT"/var/lock/subsys
+ln -sf ../libvirtd.service "$wants_dir/libvirtd.service"
+
+######################################
+# Enable relevant openstack services #
+######################################
+
+if "$NOVA_ENABLE_CONTROLLER" || "$NOVA_ENABLE_COMPUTE"; then
+ enable config-setup
+fi
+if "$NOVA_ENABLE_CONTROLLER" && ! "$NOVA_ENABLE_COMPUTE"; then
+ enable conductor
+fi
+if "$NOVA_ENABLE_COMPUTE"; then
+ enable compute
+fi
+if "$NOVA_ENABLE_CONTROLLER"; then
+ for service in db-setup api cert consoleauth novncproxy scheduler serialproxy; do
+ enable "$service"
+ done
+fi
+
+
+##########################################################################
+# Generate configuration file
+##########################################################################
+
+case "$NOVA_BAREMETAL_SCHEDULING" in
+ True|true|yes)
+ export COMPUTE_MANAGER=ironic.nova.compute.manager.ClusteredComputeManager
+ export RESERVED_HOST_MEMORY_MB=0
+ export SCHEDULER_HOST_MANAGER=nova.scheduler.ironic_host_manager.IronicHostManager
+ export RAM_ALLOCATION_RATIO=1.0
+ export COMPUTE_DRIVER=nova.virt.ironic.IronicDriver
+ export SCHEDULER_USE_BAREMETAL_FILTERS=true
+ ;;
+ *)
+ export COMPUTE_MANAGER=nova.compute.manager.ComputeManager
+ export RESERVED_HOST_MEMORY_MB=512
+ export SCHEDULER_HOST_MANAGER=nova.scheduler.host_manager.HostManager
+ export RAM_ALLOCATION_RATIO=1.5
+ export COMPUTE_DRIVER=libvirt.LibvirtDriver
+ export SCHEDULER_USE_BAREMETAL_FILTERS=false
+ ;;
+esac
+
+OPENSTACK_DATA="$ROOT/etc/openstack"
+mkdir -p "$OPENSTACK_DATA"
+
+python <<'EOF' >"$OPENSTACK_DATA/nova.conf"
+import os, sys, yaml
+
+nova_configuration={
+ 'NOVA_SERVICE_USER': os.environ['NOVA_SERVICE_USER'],
+ 'NOVA_SERVICE_PASSWORD': os.environ['NOVA_SERVICE_PASSWORD'],
+ 'NOVA_DB_USER': os.environ['NOVA_DB_USER'],
+ 'NOVA_DB_PASSWORD': os.environ['NOVA_DB_PASSWORD'],
+ 'NOVA_VIRT_TYPE': os.environ['NOVA_VIRT_TYPE'],
+ 'COMPUTE_MANAGER': os.environ['COMPUTE_MANAGER'],
+ 'RESERVED_HOST_MEMORY_MB': os.environ['RESERVED_HOST_MEMORY_MB'],
+ 'SCHEDULER_HOST_MANAGER': os.environ['SCHEDULER_HOST_MANAGER'],
+ 'RAM_ALLOCATION_RATIO': os.environ['RAM_ALLOCATION_RATIO'],
+ 'SCHEDULER_USE_BAREMETAL_FILTERS': os.environ['SCHEDULER_USE_BAREMETAL_FILTERS'],
+ 'COMPUTE_DRIVER': os.environ['COMPUTE_DRIVER'],
+ 'NEUTRON_SERVICE_USER': os.environ['NEUTRON_SERVICE_USER'],
+ 'NEUTRON_SERVICE_PASSWORD': os.environ['NEUTRON_SERVICE_PASSWORD'],
+ 'IRONIC_SERVICE_USER': os.environ['IRONIC_SERVICE_USER'],
+ 'IRONIC_SERVICE_PASSWORD': os.environ['IRONIC_SERVICE_PASSWORD'],
+ 'METADATA_PROXY_SHARED_SECRET': os.environ['METADATA_PROXY_SHARED_SECRET'],
+ 'RABBITMQ_HOST': os.environ['RABBITMQ_HOST'],
+ 'RABBITMQ_USER': os.environ['RABBITMQ_USER'],
+ 'RABBITMQ_PASSWORD': os.environ['RABBITMQ_PASSWORD'],
+ 'RABBITMQ_PORT': os.environ['RABBITMQ_PORT'],
+ 'CONTROLLER_HOST_ADDRESS': os.environ['CONTROLLER_HOST_ADDRESS'],
+ 'MANAGEMENT_INTERFACE_IP_ADDRESS': os.environ['MANAGEMENT_INTERFACE_IP_ADDRESS'],
+ 'KEYSTONE_TEMPORARY_ADMIN_TOKEN': os.environ['KEYSTONE_TEMPORARY_ADMIN_TOKEN'],
+}
+
+yaml.dump(nova_configuration, sys.stdout, default_flow_style=False)
+EOF
diff --git a/extensions/openstack-swift-controller.configure b/extensions/openstack-swift-controller.configure
new file mode 100644
index 00000000..424ab57b
--- /dev/null
+++ b/extensions/openstack-swift-controller.configure
@@ -0,0 +1,49 @@
+#!/bin/bash
+#
+# 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, see <http://www.gnu.org/licenses/>.
+
+
+set -e
+
+export ROOT="$1"
+
+MANDATORY_OPTIONS="SWIFT_ADMIN_PASSWORD KEYSTONE_TEMPORARY_ADMIN_TOKEN"
+
+for option in $MANDATORY_OPTIONS
+do
+ if ! [[ -v $option ]]
+ then
+ missing_option=True
+ echo "Required option $option isn't set!" >&2
+ fi
+done
+
+if [[ $missing_option = True ]]; then exit 1; fi
+
+mkdir -p "$ROOT/usr/lib/systemd/system/multi-user.target.wants" # ensure this exists before we make symlinks
+
+ln -s "/usr/lib/systemd/system/swift-controller-setup.service" \
+ "$ROOT/usr/lib/systemd/system/multi-user.target.wants/swift-controller-setup.service"
+ln -s "/usr/lib/systemd/system/memcached.service" \
+ "$ROOT/usr/lib/systemd/system/multi-user.target.wants/memcached.service"
+ln -s "/usr/lib/systemd/system/openstack-swift-proxy.service" \
+ "$ROOT/usr/lib/systemd/system/multi-user.target.wants/swift-proxy.service"
+
+cat << EOF > "$ROOT"/usr/share/openstack/swift-controller-vars.yml
+---
+SWIFT_ADMIN_PASSWORD: $SWIFT_ADMIN_PASSWORD
+MANAGEMENT_INTERFACE_IP_ADDRESS: $MANAGEMENT_INTERFACE_IP_ADDRESS
+KEYSTONE_TEMPORARY_ADMIN_TOKEN: $KEYSTONE_TEMPORARY_ADMIN_TOKEN
+EOF
diff --git a/extensions/openstack-time.configure b/extensions/openstack-time.configure
new file mode 100644
index 00000000..4f5c8fbd
--- /dev/null
+++ b/extensions/openstack-time.configure
@@ -0,0 +1,61 @@
+#!/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, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+set -e
+
+ROOT="$1"
+
+unnaceptable(){
+ eval echo Unexpected value \$$1 for $1 >&2
+ exit 1
+}
+
+check_bool(){
+ case "$(eval echo \"\$$1\")" in
+ True)
+ eval "$1=true"
+ ;;
+ False|'')
+ eval "$1=false"
+ ;;
+ *)
+ unnaceptable "$1"
+ ;;
+ esac
+}
+check_bool SYNC_TIME_WITH_CONTROLLER
+
+if "$SYNC_TIME_WITH_CONTROLLER"; then
+
+ cat << EOF > "$ROOT"/etc/ntpd.conf
+# We use iburst here to reduce the potential initial delay to set the clock
+server $CONTROLLER_HOST_ADDRESS iburst
+
+# kod - notify client when packets are denied service,
+# rather than just dropping the packets
+#
+# nomodify - deny queries which attempt to modify the state of the server
+#
+# notrap - decline to provide mode 6 control message trap service to
+# matching hosts
+#
+# see ntp.conf(5) for more details
+restrict -4 default limited limited nomodify
+restrict -6 default limited limited notrap nomodify
+EOF
+
+fi
diff --git a/extensions/openstack.check b/extensions/openstack.check
new file mode 100755
index 00000000..131ea8e8
--- /dev/null
+++ b/extensions/openstack.check
@@ -0,0 +1,92 @@
+#!/usr/bin/python2
+# 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 os
+import urlparse
+
+import keystoneclient
+
+import writeexts
+
+
+class OpenStackCheckExtension(writeexts.WriteExtension):
+
+ def process_args(self, args):
+ if len(args) != 1:
+ raise writeexts.ExtensionError(
+ 'Wrong number of command line args')
+
+ self.require_btrfs_in_deployment_host_kernel()
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if upgrade:
+ raise writeexts.ExtensionError(
+ '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 writeexts.ExtensionError(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 writeexts.ExtensionError(
+ 'OPENSTACK_IMAGENAME was not given')
+
+ def check_location(self, location):
+ x = urlparse.urlparse(location)
+ if x.scheme not in ['http', 'https']:
+ raise writeexts.ExtensionError(
+ 'URL schema must be http or https in %s' % location)
+ if (x.path != '/v2.0' and x.path != '/v2.0/'):
+ raise writeexts.ExtensionError(
+ '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 writeexts.ExtensionError(errmsg)
+
+
+OpenStackCheckExtension().run()
diff --git a/extensions/openstack.write b/extensions/openstack.write
new file mode 100755
index 00000000..1fc3ba90
--- /dev/null
+++ b/extensions/openstack.write
@@ -0,0 +1,94 @@
+#!/usr/bin/python2
+# 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 os
+import subprocess
+import tempfile
+import urlparse
+
+import writeexts
+
+
+class OpenStackWriteExtension(writeexts.WriteExtension):
+
+ '''See openstack.write.help for documentation'''
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise writeexts.ExtensionError(
+ '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.find_and_mount_rootfs(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]
+ subprocess.check_call(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/extensions/partitioning.py b/extensions/partitioning.py
new file mode 100644
index 00000000..2a8de058
--- /dev/null
+++ b/extensions/partitioning.py
@@ -0,0 +1,163 @@
+#!/usr/bin/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 module providing Baserock-specific partitioning functions"""
+
+import os
+import pyfdisk
+import re
+import subprocess
+import writeexts
+
+def do_partitioning(location, disk_size, temp_root, part_spec):
+ '''Perform partitioning
+
+ Perform partitioning using the pyfdisk.py module. Documentation
+ for this, and guidance on how to create a partition specification can
+ be found in extensions/pyfdisk.README
+
+ This function also validates essential parts of the partition layout
+
+ Args:
+ location: Path to the target device or image
+ temp_root: Location of the unpacked Baserock rootfs
+ part_spec: Path to a YAML formatted partition specification
+ Returns:
+ A pyfdisk.py Device object
+ Raises:
+ writeexts.ExtensionError
+ '''
+ # Create partition table and filesystems
+ try:
+ dev = pyfdisk.load_yaml(location, disk_size, part_spec)
+ writeexts.Extension.status(msg='Loaded partition specification: %s' %
+ part_spec)
+
+ # FIXME: GPT currently not fully supported due to missing tools
+ if dev.partition_table_format.lower() == 'gpt':
+ writeexts.Extension.status(msg='WARNING: GPT partition tables '
+ 'are not currently supported, '
+ 'when using the extlinux '
+ 'bootloader')
+
+ writeexts.Extension.status(msg='Summary:\n' + str(dev.partitionlist))
+ writeexts.Extension.status(msg='Writing partition table')
+ dev.commit()
+ dev.create_filesystems(skip=('/'))
+ except (pyfdisk.PartitioningError, pyfdisk.FdiskError) as e:
+ raise writeexts.ExtensionError(e.msg)
+
+ mountpoints = set(part.mountpoint for part in dev.partitionlist
+ if hasattr(part, 'mountpoint'))
+ if '/' not in mountpoints:
+ raise writeexts.ExtensionError('No partition with root '
+ 'mountpoint, please specify a '
+ 'partition with \'mountpoint: /\' '
+ 'in the partition specification')
+
+ mounted_partitions = set(part for part in dev.partitionlist
+ if hasattr(part, 'mountpoint'))
+
+ for part in mounted_partitions:
+ if not hasattr(part, 'filesystem'):
+ raise writeexts.ExtensionError('Cannot mount a partition '
+ 'without filesystem, please specify one '
+ 'for \'%s\' partition in the partition '
+ 'specification' % part.mountpoint)
+ if part.mountpoint == '/':
+ # Check that bootable flag is set for MBR devices
+ if (hasattr(part, 'boot')
+ and str(part.boot).lower() not in ('yes', 'true')
+ and dev.partition_table_format.lower() == 'mbr'):
+ writeexts.Extension.status(msg='WARNING: Boot partition '
+ 'needs bootable flag set to '
+ 'boot with extlinux/syslinux')
+
+ return dev
+
+def process_raw_files(dev, temp_root):
+ if hasattr(dev, 'raw_files'):
+ write_raw_files(dev.location, temp_root, dev)
+ for part in dev.partitionlist:
+ if hasattr(part, 'raw_files'):
+ # dd seek=n is used, which skips n blocks before writing,
+ # so we must skip n-1 sectors before writing in order to
+ # start writing files to the first block of the partition
+ write_raw_files(dev.location, temp_root, part,
+ (part.extent.start - 1) * dev.sector_size)
+
+def write_raw_files(location, temp_root, dev_or_part, start_offset=0):
+ '''Write files with `dd`'''
+ offset = 0
+ for raw_args in dev_or_part.raw_files:
+ r = RawFile(temp_root, start_offset, offset, **raw_args)
+ offset = r.next_offset
+ r.dd(location)
+
+
+class RawFile(object):
+ '''A class to hold information about a raw file to write to a device'''
+
+ def __init__(self, source_root,
+ start_offset=0, wr_offset=0,
+ sector_size=512, **kwargs):
+ '''Initialisation function
+
+ Args:
+ source_root: Base path for filenames
+ wr_offset: Offset to write to (and offset per-file offsets by)
+ sector_size: Device sector size (default: 512)
+ **kwargs:
+ file: A path to the file to write (combined with source_root)
+ offset_sectors: An offset to write to in sectors (optional)
+ offset_bytes: An offset to write to in bytes (optional)
+ '''
+ if 'file' not in kwargs:
+ raise writeexts.ExtensionError('Missing file name or path')
+ self.path = os.path.join(source_root,
+ re.sub('^/', '', kwargs['file']))
+
+ if not os.path.exists(self.path):
+ raise writeexts.ExtensionError('File not found: %s' % self.path)
+ elif os.path.isdir(self.path):
+ raise writeexts.ExtensionError('Can only dd regular files')
+ else:
+ self.size = os.stat(self.path).st_size
+
+ self.offset = start_offset
+ if 'offset_bytes' in kwargs:
+ self.offset += pyfdisk.human_size(kwargs['offset_bytes'])
+ elif 'offset_sectors' in kwargs:
+ self.offset += kwargs['offset_sectors'] * sector_size
+ else:
+ self.offset += wr_offset
+
+ self.skip = pyfdisk.human_size(kwargs.get('skip_bytes', 0))
+ self.count = pyfdisk.human_size(kwargs.get('count_bytes', self.size))
+
+ # Offset of the first free byte after this file (first byte of next)
+ self.next_offset = self.size + self.offset
+
+ def dd(self, location):
+ writeexts.Extension.status(msg='Writing %s at %d bytes' %
+ (self.path, self.offset))
+ subprocess.check_call(['dd', 'if=%s' % self.path,
+ 'of=%s' % location, 'bs=1',
+ 'seek=%d' % self.offset,
+ 'skip=%d' % self.skip,
+ 'count=%d' % self.count,
+ 'conv=notrunc'])
+ subprocess.check_call('sync')
diff --git a/extensions/pxeboot.check b/extensions/pxeboot.check
new file mode 100755
index 00000000..19891482
--- /dev/null
+++ b/extensions/pxeboot.check
@@ -0,0 +1,86 @@
+#!/usr/bin/python2
+
+import itertools
+import os
+import subprocess
+import sys
+flatten = itertools.chain.from_iterable
+
+def powerset(iterable):
+ "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
+ s = list(iterable)
+ return flatten(itertools.combinations(s, r) for r in range(len(s)+1))
+
+valid_option_sets = frozenset((
+ ('spawn-novlan', frozenset(('PXEBOOT_DEPLOYER_INTERFACE',))),
+ ('spawn-vlan', frozenset(('PXEBOOT_DEPLOYER_INTERFACE', 'PXEBOOT_VLAN'))),
+ ('existing-dhcp', frozenset(('PXEBOOT_DEPLOYER_INTERFACE',
+ 'PXEBOOT_CONFIG_TFTP_ADDRESS'))),
+ ('existing-server', frozenset(('PXEBOOT_CONFIG_TFTP_ADDRESS',
+ 'PXEBOOT_ROOTFS_RSYNC_ADDRESS'))),
+))
+valid_modes = frozenset(mode for mode, opt_set in valid_option_sets)
+
+
+def compute_matches(env):
+ complete_matches = set()
+ for mode, opt_set in valid_option_sets:
+ if all(k in env for k in opt_set):
+ complete_matches.add(opt_set)
+ return complete_matches
+
+complete_matches = compute_matches(os.environ)
+
+def word_separate_options(options):
+ assert options
+ s = options.pop(-1)
+ if options:
+ s = '%s and %s' % (', '.join(options), s)
+ return s
+
+
+valid_options = frozenset(flatten(opt_set for (mode, opt_set)
+ in valid_option_sets))
+matched_options = frozenset(o for o in valid_options
+ if o in os.environ)
+if not complete_matches:
+ addable_sets = frozenset(frozenset(os) - matched_options for os in
+ valid_options
+ if frozenset(os) - matched_options)
+ print('Please provide %s' % ' or '.join(
+ word_separate_options(list(opt_set))
+ for opt_set in addable_sets if opt_set))
+ sys.exit(1)
+elif len(complete_matches) > 1:
+ removable_sets = frozenset(matched_options - frozenset(os) for os in
+ powerset(matched_options)
+ if len(compute_matches(os)) == 1)
+ print('WARNING: Following options might not be needed: %s' % ' or '.join(
+ word_separate_options(list(opt_set))
+ for opt_set in removable_sets if opt_set))
+
+if 'PXEBOOT_MODE' in os.environ:
+ mode = os.environ['PXEBOOT_MODE']
+else:
+ try:
+ mode, = (mode for (mode, opt_set) in valid_option_sets
+ if all(o in os.environ for o in opt_set))
+
+ except ValueError as e:
+ print ('More than one candidate for PXEBOOT_MODE, please '
+ 'set a value for it. Type `morph help pxeboot.write for '
+ 'more info')
+ sys.exit(1)
+
+if mode not in valid_modes:
+ print('%s is not a valid PXEBOOT_MODE' % mode)
+ sys.exit(1)
+
+if mode != 'existing-server':
+ with open(os.devnull, 'w') as devnull:
+ if subprocess.call(['systemctl', 'is-active', 'nfs-server'],
+ stdout=devnull) != 0:
+ print ('ERROR: nfs-server.service is not running and is needed '
+ 'for this deployment. Please, run `systemctl start nfs-server` '
+ 'and try `morph deploy` again.')
+ sys.exit(1)
diff --git a/extensions/pxeboot.write b/extensions/pxeboot.write
new file mode 100644
index 00000000..20e4f6bd
--- /dev/null
+++ b/extensions/pxeboot.write
@@ -0,0 +1,756 @@
+#!/usr/bin/env python
+
+
+import collections
+import contextlib
+import errno
+import itertools
+import logging
+import os
+import select
+import signal
+import shutil
+import socket
+import string
+import StringIO
+import subprocess
+import sys
+import tempfile
+import textwrap
+import urlparse
+
+import writeexts
+
+def _int_to_quad_dot(i):
+ return '.'.join((
+ str(i >> 24 & 0xff),
+ str(i >> 16 & 0xff),
+ str(i >> 8 & 0xff),
+ str(i & 0xff)))
+
+
+def _quad_dot_to_int(s):
+ i = 0
+ for octet in s.split('.'):
+ i <<= 8
+ i += int(octet, 10)
+ return i
+
+
+def _netmask_to_prefixlen(mask):
+ bs = '{:032b}'.format(mask)
+ prefix = bs.rstrip('0')
+ if '0' in prefix:
+ raise ValueError('abnormal netmask: %s' %
+ _int_to_quad_dot(mask))
+ return len(prefix)
+
+
+def _get_routes():
+ routes = []
+ with open('/proc/net/route', 'r') as f:
+ for line in list(f)[1:]:
+ fields = line.split()
+ destination, flags, mask = fields[1], fields[3], fields[7]
+ flags = int(flags, 16)
+ if flags & 2:
+ # default route, ignore
+ continue
+ destination = socket.ntohl(int(destination, 16))
+ mask = socket.ntohl(int(mask, 16))
+ prefixlen = _netmask_to_prefixlen(mask)
+ routes.append((destination, prefixlen))
+ return routes
+
+
+class IPRange(object):
+ def __init__(self, prefix, prefixlen):
+ self.prefixlen = prefixlen
+ mask = (1 << prefixlen) - 1
+ self.mask = mask << (32 - prefixlen)
+ self.prefix = prefix & self.mask
+ @property
+ def bitstring(self):
+ return ('{:08b}' * 4).format(
+ self.prefix >> 24 & 0xff,
+ self.prefix >> 16 & 0xff,
+ self.prefix >> 8 & 0xff,
+ self.prefix & 0xff
+ )[:self.prefixlen]
+ def startswith(self, other_range):
+ return self.bitstring.startswith(other_range.bitstring)
+
+
+def find_subnet(valid_ranges, invalid_ranges):
+ for vr in valid_ranges:
+ known_subnets = set(ir for ir in invalid_ranges if ir.startswith(vr))
+ prefixlens = set(r.prefixlen for r in known_subnets)
+ prefixlens.add(32 - 2) # need at least 4 addresses in subnet
+ prefixlen = min(prefixlens)
+ if prefixlen <= vr.prefixlen:
+ # valid subnet is full, move on to next
+ continue
+ subnetlen = prefixlen - vr.prefixlen
+ for prefix in (subnetid + vr.prefix
+ for subnetid in xrange(1 << subnetlen)):
+ if any(subnet.prefix == prefix for subnet in known_subnets):
+ continue
+ return prefix, prefixlen
+
+
+def _normalise_macaddr(macaddr):
+ '''pxelinux.0 wants the mac address to be lowercase and - separated'''
+ digits = (c for c in macaddr.lower() if c in string.hexdigits)
+ nibble_pairs = grouper(digits, 2)
+ return '-'.join(''.join(byte) for byte in nibble_pairs)
+
+
+@contextlib.contextmanager
+def executor(target_pid):
+ 'Kills a process if its parent dies'
+ read_fd, write_fd = os.pipe()
+ helper_pid = os.fork()
+ if helper_pid == 0:
+ try:
+ os.close(write_fd)
+ while True:
+ rlist, _, _ = select.select([read_fd], [], [])
+ if read_fd in rlist:
+ d = os.read(read_fd, 1)
+ if not d:
+ os.kill(target_pid, signal.SIGKILL)
+ if d in ('', 'Q'):
+ os._exit(0)
+ else:
+ os._exit(1)
+ except BaseException as e:
+ import traceback
+ traceback.print_exc()
+ os._exit(1)
+ os.close(read_fd)
+ yield
+ os.write(write_fd, 'Q')
+ os.close(write_fd)
+
+
+def grouper(iterable, n, fillvalue=None):
+ "Collect data into fixed-length chunks or blocks"
+ # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
+ args = [iter(iterable)] * n
+ return itertools.izip_longest(*args, fillvalue=fillvalue)
+
+
+class PXEBoot(writeexts.WriteExtension):
+ @contextlib.contextmanager
+ def _vlan(self, interface, vlan):
+ viface = '%s.%s' % (interface, vlan)
+ self.status(msg='Creating vlan %(viface)s', viface=viface)
+ subprocess.check_call(['vconfig', 'add', interface, str(vlan)])
+ try:
+ yield viface
+ finally:
+ self.status(msg='Destroying vlan %(viface)s', viface=viface)
+ subprocess.call(['vconfig', 'rem', viface])
+
+ @contextlib.contextmanager
+ def _static_ip(self, iface):
+ valid_ranges = set((
+ IPRange(_quad_dot_to_int('192.168.0.0'), 16),
+ IPRange(_quad_dot_to_int('172.16.0.0'), 12),
+ IPRange(_quad_dot_to_int('10.0.0.0'), 8),
+ ))
+ invalid_ranges = set(IPRange(prefix, prefixlen)
+ for (prefix, prefixlen) in _get_routes())
+ prefix, prefixlen = find_subnet(valid_ranges, invalid_ranges)
+ netaddr = prefix
+ dhcp_server_ip = netaddr + 1
+ client_ip = netaddr + 2
+ broadcast_ip = prefix | ((1 << (32 - prefixlen)) - 1)
+ self.status(msg='Assigning ip address %(ip)s/%(prefixlen)d to '
+ 'iface %(iface)s',
+ ip=_int_to_quad_dot(dhcp_server_ip), prefixlen=prefixlen,
+ iface=iface)
+ subprocess.check_call(['ip', 'addr', 'add',
+ '{}/{}'.format(_int_to_quad_dot(dhcp_server_ip),
+ prefixlen),
+ 'broadcast', _int_to_quad_dot(broadcast_ip),
+ 'scope', 'global',
+ 'dev', iface])
+ try:
+ yield (dhcp_server_ip, client_ip, broadcast_ip)
+ finally:
+ self.status(msg='Removing ip addresses from iface %(iface)s',
+ iface=iface)
+ subprocess.call(['ip', 'addr', 'flush', 'dev', iface])
+
+ @contextlib.contextmanager
+ def _up_interface(self, iface):
+ self.status(msg='Bringing interface %(iface)s up', iface=iface)
+ subprocess.check_call(['ip', 'link', 'set', iface, 'up'])
+ try:
+ yield
+ finally:
+ self.status(msg='Bringing interface %(iface)s down', iface=iface)
+ subprocess.call(['ip', 'link', 'set', iface, 'down'])
+
+ @contextlib.contextmanager
+ def static_ip(self, interface):
+ with self._static_ip(iface=interface) as (host_ip, client_ip,
+ broadcast_ip), \
+ self._up_interface(iface=interface):
+ yield (_int_to_quad_dot(host_ip),
+ _int_to_quad_dot(client_ip),
+ _int_to_quad_dot(broadcast_ip))
+
+ @contextlib.contextmanager
+ def vlan(self, interface, vlan):
+ with self._vlan(interface=interface, vlan=vlan) as viface, \
+ self.static_ip(interface=viface) \
+ as (host_ip, client_ip, broadcast_ip):
+ yield host_ip, client_ip, broadcast_ip
+
+ @contextlib.contextmanager
+ def _tempdir(self):
+ td = tempfile.mkdtemp()
+ print 'Created tempdir:', td
+ try:
+ yield td
+ finally:
+ shutil.rmtree(td, ignore_errors=True)
+
+ @contextlib.contextmanager
+ def _remote_tempdir(self, hostname, template):
+ persist = os.environ.get('PXE_INSTALLER') in ('no', 'False')
+ td = writeexts.ssh_runcmd(
+ hostname, ['mktemp', '-d', template]).strip()
+ try:
+ yield td
+ finally:
+ if not persist:
+ writeexts.ssh_runcmd(hostname, ['find', td, '-delete'])
+
+ def _serve_tftpd(self, sock, host, port, interface, tftproot):
+ self.settings.progname = 'tftp server'
+ self._set_process_name()
+ while True:
+ logging.debug('tftpd waiting for connections')
+ # recvfrom with MSG_PEEK is how you accept UDP connections
+ _, peer = sock.recvfrom(0, socket.MSG_PEEK)
+ conn = sock
+ logging.debug('Connecting socket to peer: ' + repr(peer))
+ conn.connect(peer)
+ # The existing socket is now only serving that peer, so we need to
+ # bind a new UDP socket to the wildcard address, which needs the
+ # port to be in REUSEADDR mode.
+ conn.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ logging.debug('Binding replacement socket to ' + repr((host, port)))
+ sock.bind((host, port))
+
+ logging.debug('tftpd server handing connection to tftpd')
+ tftpd_serve = ['tftpd', '-rl', tftproot]
+ ret = subprocess.call(args=tftpd_serve, stdin=conn,
+ stdout=conn, stderr=None, close_fds=True)
+ # It's handy to turn off REUSEADDR after the rebinding,
+ # so we can protect against future bind attempts on this port.
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 0)
+ logging.debug('tftpd exited %d' % ret)
+ os._exit(0)
+
+ @contextlib.contextmanager
+ def _spawned_tftp_server(self, tftproot, host_ip, interface, tftp_port=0):
+ # inetd-style launchers tend to bind UDP ports with SO_REUSEADDR,
+ # because they need to have multiple ports bound, one for recieving
+ # all connection attempts on that port, and one for each concurrent
+ # connection with a peer
+ # this makes detecting whether there's a tftpd running difficult, so
+ # we'll instead use an ephemeral port and configure the PXE boot to
+ # use that tftp server for the kernel
+ s = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
+ s.bind((host_ip, tftp_port))
+ host, port = s.getsockname()
+ self.status(msg='Bound listen socket to %(host)s, %(port)s',
+ host=host, port=port)
+ pid = os.fork()
+ if pid == 0:
+ try:
+ self._serve_tftpd(sock=s, host=host, port=port,
+ interface=interface, tftproot=tftproot)
+ except BaseException as e:
+ import traceback
+ traceback.print_exc()
+ os._exit(1)
+ s.close()
+ with executor(pid):
+ try:
+ yield port
+ finally:
+ self.status(msg='Killing tftpd listener pid=%(pid)d',
+ pid=pid)
+ os.kill(pid, signal.SIGKILL)
+
+ @contextlib.contextmanager
+ def tftp_server(self, host_ip, interface, tftp_port=0):
+ with self._tempdir() as tftproot, \
+ self._spawned_tftp_server(tftproot=tftproot, host_ip=host_ip,
+ interface=interface,
+ tftp_port=tftp_port) as tftp_port:
+ self.status(msg='Serving tftp root %(tftproot)s, on port %(port)d',
+ port=tftp_port, tftproot=tftproot)
+ yield tftp_port, tftproot
+
+ @contextlib.contextmanager
+ def _local_copy(self, src, dst):
+ self.status(msg='Installing %(src)s to %(dst)s',
+ src=src, dst=dst)
+ shutil.copy2(src=src, dst=dst)
+ try:
+ yield
+ finally:
+ self.status(msg='Removing %(dst)s', dst=dst)
+ os.unlink(dst)
+
+ @contextlib.contextmanager
+ def _local_symlink(self, src, dst):
+ os.symlink(src, dst)
+ try:
+ yield
+ finally:
+ os.unlink(dst)
+
+ def local_pxelinux(self, tftproot):
+ return self._local_copy('/usr/share/syslinux/pxelinux.0',
+ os.path.join(tftproot, 'pxelinux.0'))
+
+ def local_kernel(self, rootfs, tftproot):
+ return self._local_copy(os.path.join(rootfs, 'boot/vmlinuz'),
+ os.path.join(tftproot, 'kernel'))
+
+ @contextlib.contextmanager
+ def _remote_copy(self, hostname, src, dst):
+ persist = os.environ.get('PXE_INSTALLER') in ('no', 'False')
+ with open(src, 'r') as f:
+ writeexts.ssh_runcmd(hostname,
+ ['install', '-D', '-m644',
+ '/proc/self/fd/0', dst],
+ stdin=f, stdout=None, stderr=None)
+ try:
+ yield
+ finally:
+ if not persist:
+ writeexts.ssh_runcmd(hostname, ['rm', dst])
+
+ @contextlib.contextmanager
+ def _remote_symlink(self, hostname, src, dst):
+ persist = os.environ.get('PXE_INSTALLER') in ('no', 'False')
+ writeexts.ssh_runcmd(hostname,
+ ['ln', '-s', '-f', src, dst],
+ stdin=None, stdout=None, stderr=None)
+ try:
+ yield
+ finally:
+ if not persist:
+ writeexts.ssh_runcmd(hostname, ['rm', '-f', dst])
+
+ @contextlib.contextmanager
+ def remote_kernel(self, rootfs, tftp_url, macaddr):
+ for name in ('vmlinuz', 'zImage', 'uImage'):
+ kernel_path = os.path.join(rootfs, 'boot', name)
+ if os.path.exists(kernel_path):
+ break
+ else:
+ raise writeexts.ExtensionError('Failed to locate kernel')
+ url = urlparse.urlsplit(tftp_url)
+ basename = '{}-kernel'.format(_normalise_macaddr(macaddr))
+ target_path = os.path.join(url.path, basename)
+ with self._remote_copy(hostname=url.hostname, src=kernel_path,
+ dst=target_path):
+ yield basename
+
+ @contextlib.contextmanager
+ def remote_fdt(self, rootfs, tftp_url, macaddr):
+ fdt_rel_path = os.environ.get('DTB_PATH', '')
+ if fdt_rel_path == '':
+ yield
+ fdt_abs_path = os.path.join(rootfs, fdt_rel_path)
+ if not fdt_abs_path:
+ raise writeexts.ExtensionError(
+ 'Failed to locate Flattened Device Tree')
+ url = urlparse.urlsplit(tftp_url)
+ basename = '{}-fdt'.format(_normalise_macaddr(macaddr))
+ target_path = os.path.join(url.path, basename)
+ with self._remote_copy(hostname=url.hostname, src=fdt_abs_path,
+ dst=target_path):
+ yield basename
+
+ @contextlib.contextmanager
+ def local_nfsroot(self, rootfs, target_ip):
+ nfsroot = target_ip + ':' + rootfs
+ self.status(msg='Exporting %(nfsroot)s as local nfsroot',
+ nfsroot=nfsroot)
+ subprocess.check_call(['exportfs', '-o', 'ro,insecure,no_root_squash',
+ nfsroot])
+ try:
+ yield
+ finally:
+ self.status(msg='Removing %(nfsroot)s from local nfsroots',
+ nfsroot=nfsroot)
+ subprocess.check_call(['exportfs', '-u', nfsroot])
+
+ @contextlib.contextmanager
+ def remote_nfsroot(self, rootfs, rsync_url, macaddr):
+ url = urlparse.urlsplit(rsync_url)
+ template = os.path.join(url.path,
+ _normalise_macaddr(macaddr) + '.XXXXXXXXXX')
+ with self._remote_tempdir(hostname=url.hostname, template=template) \
+ as tempdir:
+ nfsroot = urlparse.urlunsplit((url.scheme, url.netloc, tempdir,
+ url.query, url.fragment))
+ subprocess.check_call(['rsync', '-asSPH', '--delete',
+ rootfs, nfsroot],
+ stdin=None, stdout=open(os.devnull, 'w'),
+ stderr=None)
+ yield os.path.join(os.path.basename(tempdir),
+ os.path.basename(rootfs))
+
+ @staticmethod
+ def _write_pxe_config(fh, kernel_tftp_url, rootfs_nfs_url, device=None,
+ fdt_subpath=None, extra_args=''):
+
+ if device is None:
+ ip_cfg = "ip=dhcp"
+ else:
+ ip_cfg = "ip=:::::{device}:dhcp::".format(device=device)
+
+ fh.write(textwrap.dedent('''\
+ DEFAULT default
+ LABEL default
+ LINUX {kernel_url}
+ APPEND root=/dev/nfs {ip_cfg} nfsroot={rootfs_nfs_url} {extra_args}
+ ''').format(kernel_url=kernel_tftp_url, ip_cfg=ip_cfg,
+ rootfs_nfs_url=rootfs_nfs_url, extra_args=extra_args))
+ if fdt_subpath is not None:
+ fh.write("FDT {}\n".format(fdt_subpath))
+ fh.flush()
+
+ @contextlib.contextmanager
+ def local_pxeboot_config(self, tftproot, macaddr, ip, tftp_port,
+ nfsroot_dir, device=None):
+ kernel_tftp_url = 'tftp://{}:{}/kernel'.format(ip, tftp_port)
+ rootfs_nfs_url = '{}:{}'.format(ip, nfsroot_dir)
+ pxe_cfg_filename = _normalise_macaddr(macaddr)
+ pxe_cfg_path = os.path.join(tftproot, 'pxelinux.cfg', pxe_cfg_filename)
+ os.makedirs(os.path.dirname(pxe_cfg_path))
+ with open(pxe_cfg_path, 'w') as f:
+ self._write_pxe_config(fh=f, kernel_tftp_url=kernel_tftp_url,
+ rootfs_nfs_url=rootfs_nfs_url,
+ device=device,
+ extra_args=os.environ.get('KERNEL_ARGS',''))
+
+ try:
+ with self._local_symlink(
+ src=pxe_cfg_filename,
+ dst=os.path.join(tftproot,
+ 'pxelinux.cfg',
+ '01-' + pxe_cfg_filename)):
+ yield
+ finally:
+ os.unlink(pxe_cfg_path)
+
+ @contextlib.contextmanager
+ def remote_pxeboot_config(self, tftproot, kernel_tftproot, kernel_subpath,
+ fdt_subpath, rootfs_nfsroot, rootfs_subpath,
+ macaddr):
+ rootfs_nfs_url = '{}/{}'.format(rootfs_nfsroot, rootfs_subpath)
+ url = urlparse.urlsplit(kernel_tftproot)
+ kernel_tftp_url = '{}:{}'.format(url.netloc, kernel_subpath)
+ pxe_cfg_filename = _normalise_macaddr(macaddr)
+ url = urlparse.urlsplit(tftproot)
+ inst_cfg_path = os.path.join(url.path, 'pxelinux.cfg')
+ with tempfile.NamedTemporaryFile() as f:
+ self._write_pxe_config(
+ fh=f, kernel_tftp_url=kernel_tftp_url,
+ fdt_subpath=fdt_subpath,
+ rootfs_nfs_url=rootfs_nfs_url,
+ extra_args=os.environ.get('KERNEL_ARGS',''))
+ with self._remote_copy(
+ hostname=url.hostname, src=f.name,
+ dst=os.path.join(inst_cfg_path,
+ pxe_cfg_filename)), \
+ self._remote_symlink(
+ hostname=url.hostname,
+ src=pxe_cfg_filename,
+ dst=os.path.join(inst_cfg_path,
+ '01-' + pxe_cfg_filename)):
+ yield
+
+ @contextlib.contextmanager
+ def dhcp_server(self, interface, host_ip, target_ip, broadcast_ip):
+ with self._tempdir() as td:
+ leases_path = os.path.join(td, 'leases')
+ config_path = os.path.join(td, 'config')
+ stdout_path = os.path.join(td, 'stdout')
+ stderr_path = os.path.join(td, 'stderr')
+ pidfile_path = os.path.join(td, 'pid')
+ with open(config_path, 'w') as f:
+ f.write(textwrap.dedent('''\
+ start {target_ip}
+ end {target_ip}
+ interface {interface}
+ max_leases 1
+ lease_file {leases_path}
+ pidfile {pidfile_path}
+ boot_file pxelinux.0
+ option dns {host_ip}
+ option broadcast {broadcast_ip}
+ ''').format(**locals()))
+ with open(stdout_path, 'w') as stdout, \
+ open(stderr_path, 'w') as stderr:
+ sp = subprocess.Popen(['udhcpd', '-f', config_path], cwd=td,
+ stdin=open(os.devnull), stdout=stdout,
+ stderr=stderr)
+ try:
+ with executor(sp.pid):
+ yield
+ finally:
+ sp.terminate()
+
+ def get_interface_ip(self, interface):
+ ip_addresses = []
+ info = subprocess.check_output(['ip', '-o', '-f', 'inet', 'addr',
+ 'show', interface]).rstrip('\n')
+ if info:
+ tokens = collections.deque(info.split()[1:])
+ ifname = tokens.popleft()
+ while tokens:
+ tok = tokens.popleft()
+ if tok == 'inet':
+ address = tokens.popleft()
+ address, netmask = address.split('/')
+ ip_addresses.append(address)
+ elif tok == 'brd':
+ tokens.popleft() # not interested in broadcast address
+ elif tok == 'scope':
+ tokens.popleft() # not interested in scope tag
+ else:
+ continue
+ if not ip_addresses:
+ raise writeexts.ExtensionError('Interface %s has no addresses'
+ % interface)
+ if len(ip_addresses) > 1:
+ warnings.warn('Interface %s has multiple addresses, '
+ 'using first (%s)' % (interface, ip_addresses[0]))
+ return ip_addresses[0]
+
+ def ipmi_set_target_vlan(self):
+ if any(env_var.startswith('IPMI_') for env_var in os.environ):
+ # Needs IPMI_USER, IPMI_PASSWORD, IPMI_HOST and PXEBOOT_VLAN
+ default = textwrap.dedent('''\
+ ipmitool -I lanplus -U "$IPMI_USER" -E -H "$IPMI_HOST" \\
+ lan set 1 vlan id "$PXEBOOT_VLAN"
+ ''')
+ else:
+ default = textwrap.dedent('''\
+ while true; do
+ echo Please set the target\\'s vlan to $PXEBOOT_VLAN, \\
+ then enter \\"vlanned\\"
+ read
+ if [ "$REPLY" = vlanned ]; then
+ break
+ fi
+ done
+ ''')
+ command = os.environ.get('PXEBOOT_SET_VLAN_COMMAND', default)
+ subprocess.check_call(['sh', '-euc', command, '-'])
+
+ def ipmi_pxe_reboot_target(self):
+ if any(env_var.startswith('IPMI_') for env_var in os.environ):
+ # Needs IPMI_USER, IPMI_PASSWORD, IPMI_HOST and PXEBOOT_VLAN
+ default = textwrap.dedent('''\
+ set -- ipmitool -I lanplus -U "$IPMI_USER" -E -H "$IPMI_HOST"
+ "$@" chassis bootdev pxe
+ "$@" chassis power reset
+ ''')
+ else:
+ default = textwrap.dedent('''\
+ while true; do
+ echo Please reboot the target in PXE mode, then\\
+ enter \\"pxe-booted\\"
+ read
+ if [ "$REPLY" = pxe-booted ]; then
+ break
+ fi
+ done
+ ''')
+ command = os.environ.get('PXEBOOT_PXE_REBOOT_COMMAND', default)
+ subprocess.check_call(['sh', '-euc', command, '-'])
+
+ def wait_for_target_to_install(self):
+ command = os.environ.get(
+ 'PXEBOOT_WAIT_INSTALL_COMMAND',
+ textwrap.dedent('''\
+ while true; do
+ echo Please wait for the system to install, then \\
+ enter \\"installed\\"
+ read
+ if [ "$REPLY" = installed ]; then
+ break
+ fi
+ done
+ '''))
+ subprocess.check_call(['sh', '-euc', command, '-'])
+
+ def ipmi_unset_target_vlan(self):
+ if any(env_var.startswith('IPMI_') for env_var in os.environ):
+ # Needs IPMI_USER, IPMI_PASSWORD, IPMI_HOST
+ default = textwrap.dedent('''\
+ ipmitool -I lanplus -U "$IPMI_USER" -E -H "$IPMI_HOST" \\
+ lan set 1 vlan id off
+ ''')
+ else:
+ default = textwrap.dedent('''\
+ while true; do
+ echo Please reset the target\\'s vlan, \\
+ then enter \\"unvlanned\\"
+ read
+ if [ "$REPLY" = unvlanned ]; then
+ break
+ fi
+ done
+ ''')
+ command = os.environ.get('PXEBOOT_UNSET_VLAN_COMMAND', default)
+ subprocess.check_call(['sh', '-euc', command, '-'])
+
+ def ipmi_reboot_target(self):
+ if any(env_var.startswith('IPMI_') for env_var in os.environ):
+ # Needs IPMI_USER, IPMI_PASSWORD, IPMI_HOST
+ default = textwrap.dedent('''\
+ ipmitool -I lanplus -U "$IPMI_USER" -E -H "$IPMI_HOST" \\
+ chassis power reset
+ ''')
+ else:
+ default = textwrap.dedent('''\
+ while true; do
+ echo Please reboot the target, then\\
+ enter \\"rebooted\\"
+ read
+ if [ "$REPLY" = rebooted ]; then
+ break
+ fi
+ done
+ ''')
+ command = os.environ.get('PXEBOOT_REBOOT_COMMAND', default)
+ subprocess.check_call(['sh', '-euc', command, '-'])
+
+ def process_args(self, (temp_root, macaddr)):
+ interface = os.environ.get('PXEBOOT_DEPLOYER_INTERFACE', None)
+ target_interface = os.environ.get('PXEBOOT_TARGET_INTERFACE', None)
+ vlan = os.environ.get('PXEBOOT_VLAN')
+ if vlan is not None: vlan = int(vlan)
+ mode = os.environ.get('PXEBOOT_MODE')
+ if mode is None:
+ if interface:
+ if vlan is not None:
+ mode = 'spawn-vlan'
+ else:
+ if 'PXEBOOT_CONFIG_TFTP_ADDRESS' in os.environ:
+ mode = 'existing-dhcp'
+ else:
+ mode = 'spawn-novlan'
+ else:
+ mode = 'existing-server'
+ assert mode in ('spawn-vlan', 'spawn-novlan', 'existing-dhcp',
+ 'existing-server')
+ if mode == 'spawn-vlan':
+ with self.vlan(interface=interface, vlan=vlan) \
+ as (host_ip, target_ip, broadcast_ip), \
+ self.tftp_server(host_ip=host_ip, interface=interface) \
+ as (tftp_port, tftproot), \
+ self.local_pxelinux(tftproot=tftproot), \
+ self.local_kernel(rootfs=temp_root, tftproot=tftproot), \
+ self.local_nfsroot(rootfs=temp_root, target_ip=target_ip), \
+ self.local_pxeboot_config(tftproot=tftproot, macaddr=macaddr,
+ device=target_interface,
+ ip=host_ip, tftp_port=tftp_port,
+ nfsroot_dir=temp_root), \
+ self.dhcp_server(interface=interface, host_ip=host_ip,
+ target_ip=target_ip,
+ broadcast_ip=broadcast_ip):
+ self.ipmi_set_target_vlan()
+ self.ipmi_pxe_reboot_target()
+ self.wait_for_target_to_install()
+ self.ipmi_unset_target_vlan()
+ self.ipmi_reboot_target()
+ elif mode == 'spawn-novlan':
+ with self.static_ip(interface=interface) as (host_ip, target_ip,
+ broadcast_ip), \
+ self.tftp_server(host_ip=host_ip, interface=interface,
+ tftp_port=69) \
+ as (tftp_port, tftproot), \
+ self.local_pxelinux(tftproot=tftproot), \
+ self.local_kernel(rootfs=temp_root, tftproot=tftproot), \
+ self.local_nfsroot(rootfs=temp_root, target_ip=target_ip), \
+ self.local_pxeboot_config(tftproot=tftproot, macaddr=macaddr,
+ device=target_interface,
+ ip=host_ip, tftp_port=tftp_port,
+ nfsroot_dir=temp_root), \
+ self.dhcp_server(interface=interface, host_ip=host_ip,
+ target_ip=target_ip,
+ broadcast_ip=broadcast_ip):
+ self.ipmi_pxe_reboot_target()
+ self.wait_for_target_to_install()
+ self.ipmi_reboot_target()
+ elif mode == 'existing-dhcp':
+ ip = self.get_interface_ip(interface)
+ config_tftpaddr = os.environ['PXEBOOT_CONFIG_TFTP_ADDRESS']
+ with self.tftp_server(ip=ip, interface=interface, tftp_port=69) \
+ as (tftp_port, tftproot), \
+ self.local_kernel(rootfs=temp_root, tftproot=tftproot), \
+ self.local_nfsroot(rootfs=temp_root, client_ip=''):
+ kernel_tftproot = 'tftp://{}:{}/'.format(ip, tftp_port)
+ rootfs_nfsroot = '{}:{}'.format(ip, temp_root)
+ with self.remote_pxeboot_config(
+ tftproot=config_tftpaddr,
+ kernel_tftproot=kernel_tftproot,
+ kernel_subpath='kernel',
+ rootfs_nfsroot=nfsroot,
+ rootfs_subpath='',
+ macaddr=macaddr):
+ self.ipmi_pxe_reboot_target()
+ self.wait_for_target_to_install()
+ self.ipmi_reboot_target()
+ elif mode == 'existing-server':
+ config_tftpaddr = os.environ[ 'PXEBOOT_CONFIG_TFTP_ADDRESS']
+ kernel_tftpaddr = os.environ.get('PXEBOOT_KERNEL_TFTP_ADDRESS',
+ config_tftpaddr)
+ url = urlparse.urlsplit(kernel_tftpaddr)
+ kernel_tftproot = os.environ.get('PXEBOOT_KERNEL_TFTP_ROOT',
+ 'tftp://%s/%s' % (url.hostname,
+ url.path))
+ rootfs_rsync = os.environ['PXEBOOT_ROOTFS_RSYNC_ADDRESS']
+ url = urlparse.urlsplit(rootfs_rsync)
+ nfsroot = os.environ.get('PXEBOOT_ROOTFS_NFSROOT',
+ '%s:%s' % (url.hostname, url.path))
+ with self.remote_kernel(rootfs=temp_root, tftp_url=kernel_tftpaddr,
+ macaddr=macaddr) as kernel_subpath, \
+ self.remote_fdt(rootfs=temp_root, tftp_url=kernel_tftpaddr,
+ macaddr=macaddr) as fdt_subpath, \
+ self.remote_nfsroot(rootfs=temp_root, rsync_url=rootfs_rsync, \
+ macaddr=macaddr) as rootfs_subpath, \
+ self.remote_pxeboot_config(tftproot=config_tftpaddr,
+ kernel_tftproot=kernel_tftproot,
+ kernel_subpath=kernel_subpath,
+ fdt_subpath=fdt_subpath,
+ rootfs_nfsroot=nfsroot,
+ rootfs_subpath=rootfs_subpath,
+ macaddr=macaddr):
+ persist = os.environ.get('PXE_INSTALLER') in ('no', 'False')
+ if not persist:
+ self.ipmi_pxe_reboot_target()
+ self.wait_for_target_to_install()
+ self.ipmi_reboot_target()
+ else:
+ writeexts.ExtensionError('Invalid PXEBOOT_MODE: %s' % mode)
+
+PXEBoot().run()
diff --git a/extensions/pxeboot.write.help b/extensions/pxeboot.write.help
new file mode 100644
index 00000000..7cb78bce
--- /dev/null
+++ b/extensions/pxeboot.write.help
@@ -0,0 +1,166 @@
+help: >
+ pxeboot.write extension.
+
+
+ This write extension will serve your generated system over NFS to
+ the target system.
+
+ In all modes `location` is the mac address of the interface that
+ the target will PXE boot from. This is used so that the target will
+ load the configuration file appropriate to it.
+
+
+ # `PXEBOOT_MODE`
+
+
+ It has 4 modes, which can be specified with PXEBOOT_MODE, or inferred
+ from which parameters are passed:
+
+
+ ## spawn-vlan
+
+
+ Specify PXEBOOT_DEPLOYER_INTERFACE and PXEBOOT_VLAN to configure
+ the target to pxeboot on a vlan and spawn a dhcp, nfs and tftp
+ server. This is potentially the fastest, since it doesn't need to
+ copy data to other servers.
+
+ This will create a vlan interface for the interface specified in
+ PXEBOOT_DEPLOYER_INTERFACE and spawn a dhcp server which serves
+ pxelinux.0, a configuration file and a kernel image from itself.
+
+ The configuration file informs the target to boot with a kernel
+ command-line that uses an NFS root served from the deployment host.
+
+
+ ## spawn-novlan
+
+
+ Specify PXEBOOT_DEPLOYER_INTERFACE without PXEBOOT_VLAN to configure
+ like `spawn-vlan`, but without creating the vlan interface.
+
+ This assumes that you have exclusive access to the interface, such
+ as if you're plugged in to the device directly, or your interface
+ is vlanned by your infrastructure team.
+
+ This is required if you are serving from a VM and bridging it to the
+ correct network via macvtap. For this to work, you need to macvtap
+ bridge to a pre-vlanned interface on your host machine.
+
+
+ ## existing-dhcp
+
+
+ Specify PXEBOOT_DEPLOYER_INTERFACE and PXEBOOT_CONFIG_TFTP_ADDRESS
+ to put config on an existing tftp server, already configured by the
+ dhcp server.
+
+ This spawns a tftp server and configures the local nfs server, but
+ doesn't spawn a dhcp server. This is useful if you have already got a
+ dhcp server that serves PXE images.
+
+ PXEBOOT_CONFIG_TFTP_ADDRESS is a URL in the form `sftp://$HOST/$PATH`.
+ The configuration file is copied to `$PATH/pxelinux.cfg/` on the
+ target identified by `$HOST`.
+
+
+ ## existing-server
+
+
+ Specify at least PXEBOOT_CONFIG_TFTP_ADDRESS and
+ PXEBOOT_ROOTFS_RSYNC_ADDRESS to specify existing servers to copy
+ config, kernels and the rootfs to.
+
+ Configuration is copied to the target as `existing-dhcp`.
+
+ Specify PXEBOOT_KERNEL_TFTP_ADDRESS if the tftp server that the
+ kernel must be downloaded from is different to that of the pxelinux
+ configuration file.
+
+ PXEBOOT_ROOTFS_RSYNC_ADDRESS is a rsync URL describing where to copy
+ nfsroots to where they will be exported by the NFS server.
+
+ Specify PXEBOOT_ROOTFS_NFSROOT if the nfsroot appears as a different
+ address from the target's perspective.
+
+
+ # IPMI commands
+
+
+ After the PXE boot has been set up, the target needs to be rebooted
+ in PXE mode.
+
+ If the target is IPMI enabled, you can set `IPMI_USER`, `IPMI_HOST`
+ and `IPMI_PASSWORD` to make it reboot the target into netboot mode
+ automatically.
+
+ If they are not specified, then instructions will be displayed, and
+ `pxeboot.write` will wait for you to finish.
+
+ If there are command-line automation tools for rebooting the target
+ in netboot mode, then appropriate commands can be defined in the
+ following variables.
+
+
+ ## PXEBOOT_PXE_REBOOT_COMMAND
+
+
+ This command will be used to reboot the target device with its boot
+ device set to PXE boot.
+
+
+ ## PXEBOOT_REBOOT_COMMAND
+
+
+ This command will be used to reboot the target device in its default
+ boot mode.
+
+
+ ## PXEBOOT_WAIT_INSTALL_COMMAND
+
+
+ If it is possible for the target to notify you that it has finished
+ installing, you can put a command in here to wait for the event.
+
+
+ # Misc
+
+
+ ## KERNEL_ARGS
+
+
+ Additional kernel command line options. Note that the following
+ options
+
+ root=/dev/nfs ip=dhcp nfsroot=$NFSROOT`
+
+ are implicitly added by the extension.
+
+
+ ## DTB_PATH
+
+
+ Location in the deployed root filesystem of the Flattened Device
+ Tree blob (FDT) to use.
+
+
+ ## PXE_INSTALLER
+
+
+ If set to `no`, `False` or any other YAML value for false, the
+ remotely installed rootfs, kernel, bootloader config file and
+ device tree blob if specified, will not be removed after the
+ deployment finishes. This variable is only meanful on the
+ `existing-server` mode.
+
+
+ ## PXEBOOT_TARGET_INTERFACE
+
+ Name of the interface of the target to pxeboot from. Some targets
+ with more than one interface try to get the rootfs from a different
+ interface than the interface from where the pxeboot server is
+ reachable. Using this variable, the kernel arguments will be filled
+ to include the device.
+
+ Note that the name of this interface is the kernel's default name,
+ usually called ethX, and is non-determinisic.
diff --git a/extensions/pyfdisk.README b/extensions/pyfdisk.README
new file mode 100644
index 00000000..8b3b941b
--- /dev/null
+++ b/extensions/pyfdisk.README
@@ -0,0 +1,144 @@
+Introduction
+============
+
+The pyfdisk.py module provides a basic Python wrapper around command-line
+fdisk from util-linux, and some assorted related functions for querying
+information from real disks or disk images.
+
+
+YAML partition specification
+============================
+
+A YAML file may be loaded, using the function load_yaml(). This can contain
+all the information needed to create a Device object which can then be
+committed to disk.
+
+The format of this file is as follows:
+
+ start_offset: 2048
+ partition_table_format: gpt
+ partitions:
+ - description: boot
+ size: 1M
+ fdisk_type: 0x0B
+ filesystem: vfat
+ boot: yes
+ mountpoint: /boot
+ - description: rootfs
+ number: 3
+ size: 10G
+ filesystem: btrfs
+ fdisk_type: 0x83
+ mountpoint: /
+ - description: src
+ size: fill
+ filesystem: ext4
+ fdisk_type: 0x81
+ mountpoint: /src
+
+There are a couple of global attributes:
+
+* 'start_offset': specifies the start sector of the first partition on the
+ device (default: 2048)
+
+* 'partition_table_format': specifies the partition table format to be used
+ when creating the partition table. Possible format
+ strings are 'gpt', 'dos', or 'mbr' ('dos' and
+ 'mbr' are interchangeable). (default: gpt)
+
+Following this, up to 4 (for MBR) or 128 (for GPT) partitions can be
+specified, in the list, 'partitions'. For partitions, 'size', 'fdisk_type' and
+'filesystem' are required.
+
+* 'size' is the size in bytes, or 'fill', which will expand the partition to
+ fill any unused space. Multiple partitions with 'size: fill' will share the
+ free space on the device. Human readable formatting can be used: K, M, G, T,
+ for integer multiples (calculated as powers of 2^n)
+
+* 'fdisk_type' is the fdisk partition type, specified as a hexadecimal value
+ (default: 0x81)
+
+* 'filesystem' specifies a filesystem to be created on the partition. It can
+ be a filesystem with associated any mkfs.* tool, or 'none' for an
+ unformatted partition.
+
+Optional partition attributes include:
+
+* 'number' is optional, and can be used to override the numbering of
+ partitions, if it is desired to have partition numbering that differs from
+ the physical order of the partitions on the disk.
+ - For all un-numbered partitions, the physical order of partitions on the
+ device is determined by the order in which they appear in the
+ specification.
+ - For any partitions without a specified number, partition numbering is
+ handled automatically. In the example above, /boot is 1, /src is 2,
+ and / is 3, even though the physical order differs.
+
+* 'boot' sets the partition's bootable flag (currently only for MBR partition
+ tables)
+
+* 'mountpoint' specifies a mountpoint of a partition. One partition must
+ have a '/' mountpoint to contain the rootfs, otherwise this is optional.
+ Files present in the rootfs under the mount point for a given partition will
+ be copied to the created partition.
+
+load_yaml() produces a Device object, populated with any partitions contained
+in the specification.
+
+
+Objects
+=======
+
+Partition - An object containing properties of a partition
+
+Device - An object holding information about a physical device, and the
+ overall properties of the partitioning scheme. It contains a
+ PartitionList holding the partitions on the device.
+
+PartitionList - An object which holds a list of partitions on the disk. New
+ partitions can be added to the list at any time. When the list
+ is queried, properties of partitions which depend on the
+ properties of the other partitions in the list, for example
+ the size of a fill partition, or numbering, are recalculated,
+ and an updated copy of a Partition object is returned.
+
+Extent - An object which helps encapsulate sector dimensions for partitions
+ and devices.
+
+
+Quick start
+===========
+
+ >>> dev = pyfdisk.Device('test.img', 'fill')
+ >>> print dev
+ <Device: location=test.img, size=16777216, partitions: 0>
+ >>> part = pyfdisk.Partition(size='1M', fdisk_type=0x81, filesystem='ext4', mountpoint='/test1')
+ >>> part2 = pyfdisk.Partition(size='fill', filesystem='btrfs', mountpoint='/test2')
+ >>> dev.add_partition(part)
+ >>> dev.add_partition(part2)
+ >>> print dev.partitionlist
+ Partition
+ size: 14663168
+ fdisk type: 0x81
+ filesystem: btrfs
+ start: 4096
+ end: 32734
+ number: 2
+ mountpoint: /test2
+ Partition
+ size: 1048576
+ fdisk type: 0x81
+ filesystem: ext4
+ start: 2048
+ end: 4095
+ number: 1
+ mountpoint: /test1
+ >>> dev.commit()
+ Creating GPT partition table on test.img
+
+ $ fdisk -l test.img
+ Disk test.img: 16 MiB, 16777216 bytes, 32768 sectors
+ ...
+ Device Start End Sectors Size Type
+ test.img1 2048 4095 2048 1M Linux filesystem
+ test.img2 4096 32734 28639 14M Linux filesystem
diff --git a/extensions/pyfdisk.py b/extensions/pyfdisk.py
new file mode 100644
index 00000000..a7796729
--- /dev/null
+++ b/extensions/pyfdisk.py
@@ -0,0 +1,769 @@
+#!/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 simple Python wrapper for fdisk
+
+ * Intends to have as few dependencies as possible, beyond command line fdisk
+ * Intends to work on Linux, though may work on other operating systems with
+ fdisk from util-linux.
+ * Provides for the creation of MBR and GPT partitioned images or devices
+ * Includes some utility functions for reading information from existing
+ partition tables
+
+Caveats:
+ * Designed to cater for disks using 4096 byte sectors, although this hasn't
+ been tested yet.
+"""
+
+import contextlib
+from copy import deepcopy
+import re
+import subprocess
+import time
+import yaml
+
+
+class Extent(object):
+ """
+ A class to hold start and end points for other objects
+
+ Start and end points are measured in sectors. This class transparently
+ handles the inclusive nature of the start and end sectors of blocks of
+ storage. It also allows extents to be aligned within other extents.
+ """
+
+ def __init__(self, start=0, length=0, end=0):
+ if length and not start:
+ raise PartitioningError('Extent requires a non-zero start '
+ 'point and length')
+ if start and length:
+ self.start = int(start)
+ self.end = int(start) + int(length) - 1
+ else:
+ self.start = int(start)
+ self.end = int(end)
+
+ self.filled_sectors = 0
+
+ def __max__(self):
+ return self.end
+
+ def __min__(self):
+ return self.start
+
+ def __len__(self):
+ return self.end - self.start + 1
+
+ def __add__(self, other):
+ """Return the sum of two extents"""
+ return Extent(start=self.start,
+ length=(len(self) + len(other)))
+
+ def __iadd__(self, other):
+ """+="""
+ self.end += len(other)
+ return self
+
+ def __gt__(self, other):
+ return len(self) > len(other)
+
+ def __lt__(self, other):
+ return not self > other
+
+ def __str__(self):
+ return ('<Extent: Start=%d, End=%d, Length=%d>' %
+ (self.start, self.end, len(self)))
+
+ def pack(self, other):
+ """
+ Return a new Extent aligned to self's first unused sector
+
+ This is done by length, to quantify fitting an area of disk space
+ inside the other. The filled space in self is calculated and updated.
+
+ Returns:
+ A new Extent, starting at the first available sector in `self`,
+ with the same length as `other`.
+ """
+ length_other = len(other)
+ first_free_sector = self.start + self.filled_sectors
+ if length_other + self.filled_sectors > len(self):
+ raise PartitioningError('Not enough free space to pack Extent')
+ self.filled_sectors += length_other
+ return Extent(start=first_free_sector, length=length_other)
+
+ def free_sectors(self):
+ return len(self) - self.filled_sectors
+
+
+class PartitionList(object):
+ """
+ An iterable object to contain and process a list of Partition objects
+
+ This class eases the calculation of partition sizes and numbering, since
+ the properties of a given partition depend on each of the other partitions
+ in the list.
+
+ Attributes:
+ device: A Device class containing the partition list
+ """
+
+ def __init__(self, device):
+ """
+ Initialisation function
+
+ Args:
+ device: A Device object
+ """
+ self.device = device
+ self.extent = device.extent
+
+ self.__cached_list_hash = 0
+
+ self.__partition_list = []
+ self.__iter_index = 0
+
+ def append(self, partition):
+ """Append a new Partition object to the list"""
+ partition.check()
+ if isinstance(partition, Partition):
+ for part in self.__partition_list:
+ dup_attrib = part.compare(partition)
+ if dup_attrib:
+ raise PartitioningError('Duplicated partition attribute '
+ '\'%s\'' % dup_attrib)
+ self.__partition_list.append(partition)
+ else:
+ raise PartitioningError('PartitionList can only '
+ 'contain Partition objects')
+
+ def __iter__(self):
+ """Return a copy of self as an iterable object"""
+ self.__iter_index = 0
+ copy = deepcopy(self)
+ return copy
+
+ def __next__(self):
+ """Return the next item in an iteration"""
+ if self.__iter_index == len(self.__partition_list):
+ raise StopIteration
+ else:
+ partition = self[self.__iter_index]
+ self.__iter_index += 1
+ return partition
+
+ def next(self):
+ """Provide a next() method for Python 2 compatibility"""
+ return self.__next__()
+
+ def __getitem__(self, i):
+ """Return an partition from the list, sorted by partition number"""
+ part_list = sorted(self.__update_partition_list(),
+ key=lambda part: part.number)
+ return part_list[i]
+
+ def free_sectors(self):
+ """Calculate the amount of unused space in the list"""
+ part_list = self.__update_partition_list()
+ self.extent.filled_sectors = 0
+ for part in part_list:
+ self.extent.pack(part.extent)
+ return self.extent.free_sectors()
+
+ def __update_partition_list(self):
+ """
+ Allocate extent and numbering for each Partition object in the list
+
+ A copy of the partition list is made so that any Partition object
+ returned from this list is a copy of a stored Partition object, thus
+ any partitions stored in the partition list remain intact even if a
+ copy is modified after is is returned. Hashing is used to avoid
+ updating the list when the partition list has not changed.
+ """
+ current_list_hash = hash(str(self.__partition_list))
+ if current_list_hash == self.__cached_list_hash:
+ return self.__cached_list
+
+ part_list = deepcopy(self.__partition_list)
+ used_numbers = set()
+ fill_partitions = set(partition for partition in part_list
+ if partition.size == 'fill')
+ requested_numbers = set(partition.number for partition in part_list
+ if hasattr(partition, 'number'))
+
+ # Get free space and the size of 'fill' partitions
+ self.extent.filled_sectors = 0
+ for part in part_list:
+ if part.size != 'fill':
+ extent = Extent(start=1,
+ length=self.get_length_sectors(part.size))
+ part.extent = extent
+ self.extent.pack(extent)
+
+ # Allocate aligned Extents and process partition numbers
+ if len(fill_partitions):
+ fill_size = self.extent.free_sectors() / len(fill_partitions)
+ # Set size of fill partitions
+ for part in fill_partitions:
+ part.size = fill_size * self.device.sector_size
+ part.extent = Extent(start=1, length=fill_size)
+
+ self.extent.filled_sectors = 0
+ for part in part_list:
+ part.extent = self.extent.pack(part.extent)
+
+ # Find the next unused partition number if not assigned
+ if hasattr(part, 'number'):
+ num = part.number
+ else:
+ for n in range(1, self.device.max_allowed_partitions + 1):
+ if n not in used_numbers and n not in requested_numbers:
+ num = n
+ break
+
+ part.number = num
+ used_numbers.add(num)
+
+ self.__cached_list_hash = current_list_hash
+ self.__cached_list = part_list
+ return part_list
+
+ def get_length_sectors(self, size_bytes):
+ """Get a length in sectors, aligned to 4096 byte boundaries"""
+ return (int(size_bytes) / self.device.sector_size +
+ ((int(size_bytes) % 4096) != 0) *
+ (4096 / self.device.sector_size))
+
+ def __str__(self):
+ string = ''
+ for part in self:
+ string = '%s\n%s\n' % (part, string)
+ return string.rstrip()
+
+ def __len__(self):
+ return len(self.__partition_list)
+
+ def __setitem__(self, i, value):
+ """Update the ith item in the list"""
+ self.append(partition)
+
+
+class Partition(object):
+ """
+ A class to describe a partition in a disk or image
+
+ The required attributes are loaded via kwargs.
+
+ Required attributes:
+ size: String describing the size of the partition in bytes
+ This may also be 'fill' to indicate that this partition should
+ be expanded to fill all unused space. Where there is more than
+ one fill partition, unused space is divided equally between the
+ fill partitions.
+ fdisk_type: An integer representing the hexadecimal code used by fdisk
+ to describe the partition type. Any partitions with
+ fdisk_type='none' create an area of unused space.
+
+ Optional attributes:
+ **kwargs: A mapping of any keyword arguments
+ filesystem: A string describing the filesystem format for the
+ partition, or 'none' to skip filesystem creation.
+ description: A string describing the partition, for documentation
+ boot: Boolean string describing whether to set the bootable flag
+ mountpoint: String describing the mountpoint for the partition
+ number: Number used to override partition numbering for the
+ partition (Possible only when using an MBR partition table)
+ """
+ def __init__(self, size=0, fdisk_type=0x81, filesystem='none', **kwargs):
+ if not size and 'size' not in kwargs:
+ raise PartitioningError('Partition must have a non-zero size')
+
+ self.filesystem = filesystem
+ self.fdisk_type = fdisk_type
+
+ self.size = human_size(size)
+ self.__dict__.update(**kwargs)
+
+ def check(self):
+ """Check for correctness"""
+ if self.fdisk_type == 'none':
+ if self.filesystem != 'none':
+ raise PartitioningError('Partition: Free space '
+ 'cannot have a filesystem')
+ if hasattr(self, 'mountpoint') and self.mountpoint != 'none':
+ raise PartitioningError('Partition: Free space '
+ 'cannot have a mountpoint')
+
+ def compare(self, other):
+ """Check for mutually exclusive attributes"""
+ non_duplicable = ('number', 'mountpoint')
+ for attrib in non_duplicable:
+ if hasattr(self, attrib) and hasattr(other, attrib):
+ if getattr(self, attrib) == getattr(other, attrib):
+ return attrib
+ return False
+
+ def __str__(self):
+ string = ('Partition\n'
+ ' size: %s\n'
+ ' fdisk type: %s\n'
+ ' filesystem: %s'
+ % (self.size,
+ hex(self.fdisk_type) if self.fdisk_type != 'none'
+ else 'none',
+ self.filesystem))
+ if hasattr(self, 'extent'):
+ string += (
+ '\n start: %s'
+ '\n end: %s'
+ % (self.extent.start, self.extent.end))
+ if hasattr(self, 'number'):
+ string += '\n number: %s' % self.number
+ if hasattr(self, 'mountpoint'):
+ string += '\n mountpoint: %s' % self.mountpoint
+ if hasattr(self, 'boot'):
+ string += '\n bootable: %s' % self.boot
+
+ return string
+
+
+class Device(object):
+ """
+ A class to describe a disk or image, and its partition layout
+
+ Attributes are loaded from **kwargs, containing key-value pairs describing
+ the required attributes. This can be loaded from a YAML file, using the
+ module function load_yaml().
+
+ Required attributes:
+ location: The location of the device or disk image
+ size: A size in bytes describing the total amount of space the
+ partition table on the device will occupy, or 'fill' to
+ automatically fill the available space.
+
+ Optional attributes:
+ **kwargs: A mapping of any keyword arguments
+ start_offset: The first 512 byte sector of the first partition
+ (default: 2048)
+ partition_table_format: A string describing the type of partition
+ table used on the device (default: 'gpt')
+ partitions: A list of mappings for the attributes for each Partition
+ object. update_partitions() populates the partition list
+ based on the contents of this attribute.
+ """
+ min_start_bytes = 1024**2
+
+ def __init__(self, location, size, **kwargs):
+
+ if 'partition_table_format' not in kwargs:
+ self.partition_table_format = 'gpt'
+ if 'start_offset' not in kwargs:
+ self.start_offset = 2048
+
+ target_size = get_disk_size(location)
+ if str(size).lower() == 'fill':
+ self.size = target_size
+ else:
+ self.size = human_size(size)
+
+ if self.size > target_size:
+ raise PartitioningError('Not enough space available on target')
+
+ if self.size <= self.min_start_bytes:
+ raise PartitioningError('Device size must be greater than %d '
+ 'bytes' % self.min_start_bytes)
+
+ # Get sector size
+ self.sector_size = get_sector_size(location)
+ self.location = location
+
+ # Populate Device attributes from keyword args
+ self.__dict__.update(**kwargs)
+
+ if self.partition_table_format.lower() == 'gpt':
+ self.max_allowed_partitions = 128
+ else:
+ self.max_allowed_partitions = 4
+
+ # Process Device size
+ start = (self.start_offset * 512) / self.sector_size
+ # Sector quantities in the specification are assumed to be 512 bytes
+ # This converts to the real sector size
+ if (start * self.sector_size) < self.min_start_bytes:
+ raise PartitioningError('Start offset should be greater than '
+ '%d, for %d byte sectors' %
+ (min_start_bytes / self.sector_size,
+ self.sector_size))
+ # Check the disk's first partition starts on a 4096 byte boundary
+ # this ensures alignment, and avoiding a reduction in performance
+ # on disks which use a 4096 byte physical sector size
+ if (start * self.sector_size) % 4096 != 0:
+ print('WARNING: Start sector is not aligned '
+ 'to 4096 byte sector boundaries')
+
+ # End sector is one sector less than the disk length
+ disk_end_sector = (self.size / self.sector_size) - 1
+ if self.partition_table_format == 'gpt':
+ # GPT partition table is duplicated at the end of the device.
+ # GPT header takes one sector, whatever the sector size,
+ # with a 16384 byte 'minimum' area for partition entries,
+ # supporting up to 128 partitions (128 bytes per entry).
+ # The duplicate GPT does not include the 'protective' MBR
+ gpt_size = ((16 * 1024) / self.sector_size) + 1
+ self.extent = Extent(start=start,
+ end=(disk_end_sector - gpt_size))
+ else:
+ self.extent = Extent(start=start, end=disk_end_sector)
+
+ self.update_partitions()
+
+ def update_partitions(self, partitions=None):
+ """
+ Reset list, populate with partitions from a list of attributes
+
+ Args:
+ partitions: A list of partition keyword attributes
+ """
+
+ self.partitionlist = PartitionList(self)
+ if partitions:
+ self.partitions = partitions
+ if hasattr(self, 'partitions'):
+ for partition_args in self.partitions:
+ self.add_partition(Partition(**partition_args))
+
+ def add_partition(self, partition):
+ """
+ Add a Partition object to the device's list of partitions
+
+ Args:
+ partition: a Partition class
+ """
+
+ if len(self.partitionlist) < self.max_allowed_partitions:
+ self.partitionlist.append(partition)
+ else:
+ raise PartitioningError('Exceeded maximum number of partitions '
+ 'for %s partition table (%d)' %
+ (self.partition_table_format.upper(),
+ self.max_allowed_partitions))
+
+ def get_partition_by_mountpoint(self, mountpoint):
+ """Return a Partition with a specified mountpoint"""
+
+ try:
+ return next(r for r in self.partitionlist
+ if hasattr(r, 'mountpoint')
+ and r.mountpoint == mountpoint)
+ except StopIteration:
+ return False
+
+ def commit(self):
+ """Write the partition table to the disk or image"""
+
+ pt_format = self.partition_table_format.lower()
+ print("Creating %s partition table on %s" %
+ (pt_format.upper(), self.location))
+
+ # Create a new partition table
+ if pt_format in ('mbr', 'dos'):
+ cmd = "o\n"
+ elif pt_format == 'gpt':
+ cmd = "g\n"
+ else:
+ raise PartitioningError('Unrecognised partition '
+ 'table type \'%s\'' % pt_format)
+
+ for partition in self.partitionlist:
+ # Create partitions
+ if str(partition.fdisk_type).lower() != 'none':
+ cmd += "n\n"
+ if pt_format in ('mbr', 'dos'):
+ cmd += "p\n"
+ cmd += (str(partition.number) + "\n"
+ "" + str(partition.extent.start) + "\n"
+ "" + str(partition.extent.end) + "\n")
+
+ # Set partition types
+ cmd += "t\n"
+ if partition.number > 1:
+ # fdisk does not ask for a partition
+ # number when setting the type of the
+ # first created partition
+ cmd += str(partition.number) + "\n"
+ cmd += str(hex(partition.fdisk_type)) + "\n"
+
+ # Set bootable flag
+ if hasattr(partition, 'boot') and pt_format == 'mbr':
+ if str(partition.boot).lower() in ('yes', 'true'):
+ cmd += "a\n"
+ if partition.number > 1:
+ cmd += str(partition.number) + "\n"
+
+ # Write changes
+ cmd += ("w\n"
+ "q\n")
+ p = subprocess.Popen(["fdisk", self.location],
+ stdin=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ stdout=subprocess.PIPE)
+ output = p.communicate(cmd)
+
+ errors = output[1].split('\n')[1:-1]
+ if errors:
+ # Exception handling is done in this way since fdisk will not
+ # return a failure exit code if it finds problems with its input.
+ # Note that the message 'disk does not contain a valid partition
+ # table' is not an error, it's a status message printed to stderr
+ # when fdisk starts with a blank device.
+ raise FdiskError('"%s"' % ' '.join(str(x) for x in errors))
+
+ def get_partition_uuid(self, partition):
+ """Read a partition's UUID from disk (MBR or GPT)"""
+
+ return get_partition_uuid(self.location, partition.number,
+ self.partition_table_format)
+
+ def create_filesystems(self, skip=[]):
+ """Create filesystems on the disk or image
+
+ Args:
+ skip: An iterable of mountpoints identifying partitions to skip
+ filesystem creation on, for example if custom settings are
+ required
+ """
+
+ for part in self.partitionlist:
+ if hasattr(part, 'mountpoint') and part.mountpoint in skip:
+ continue
+ if part.filesystem.lower() != 'none':
+ with create_loopback(self.location,
+ part.extent.start * self.sector_size,
+ part.size) as loop:
+ print ('Creating %s filesystem on partition %s' %
+ (part.filesystem, part.number))
+ subprocess.check_output(['mkfs.' + part.filesystem, loop])
+
+ def __str__(self):
+ return ('<Device: location=%s, size=%s, partitions: %s>' %
+ (self.location, self.size, len(self.partitionlist)))
+
+
+class PartitioningError(Exception):
+
+ def __init__(self, msg=None):
+ self.msg = msg
+
+ def __str__(self):
+ return self.msg
+
+
+class FdiskError(Exception):
+
+ def __init__(self, msg=None):
+ self.msg = msg
+
+ def __str__(self):
+ return self.msg
+
+
+def load_yaml(location, size, yaml_file):
+ """
+ Load partition data from a yaml specification
+
+ The YAML file describes the attributes documented in the Device
+ and Partition classes.
+
+ Args:
+ yaml_file: String path to a YAML file to load
+ location: Path to the device node or image to use for partitioning
+ size: The desired device size in bytes (may be 'fill' to occupy the
+ entire device
+
+ Returns:
+ A Device object
+ """
+
+ with open(yaml_file, 'r') as f:
+ kwargs = yaml.safe_load(f)
+ return Device(location, size, **kwargs)
+
+
+def get_sector_size(location):
+ """Get the logical sector size of a block device or image, in bytes"""
+
+ return int(__filter_fdisk_list_output('Sector size.*?(\d+) bytes',
+ location)[0])
+
+def get_disk_size(location):
+ """Get the total size of a block device or image, in bytes"""
+
+ return int(__filter_fdisk_list_output('Disk.*?(\d+) bytes',
+ location)[0])
+
+def get_partition_offsets(location):
+ """Return an array of the partition start sectors in a device or image"""
+
+ return __get_fdisk_list_numeric_column(location, 1)
+
+def get_partition_sector_sizes(location):
+ """Return an array of sizes of partitions in a device or image in sectors"""
+
+ return __get_fdisk_list_numeric_column(location, 3)
+
+def __get_fdisk_list_numeric_column(location, column):
+ return map(int, __filter_fdisk_list_output('%s(?:\d+[\*\s]+){%d}(\d+)' %
+ (location, column), location))
+
+def __filter_fdisk_list_output(regex, location):
+ r = re.compile(regex, re.DOTALL)
+ m = re.findall(r, subprocess.check_output(['fdisk', '-l', location]))
+ if m:
+ return m
+ else:
+ raise PartitioningError('Error reading information from fdisk')
+
+def human_size(size_string):
+ """Parse strings for human readable size factors"""
+
+ facts_of_1024 = ['', 'k', 'm', 'g', 't']
+ m = re.match('^(\d+)([kmgtKMGT]?)$', str(size_string))
+ if not m:
+ return size_string
+ return int(m.group(1)) * (1024 ** facts_of_1024.index(m.group(2).lower()))
+
+@contextlib.contextmanager
+def create_loopback(mount_path, offset=0, size=0):
+ """
+ Create a loopback device for accessing partitions in block devices
+
+ Args:
+ mount_path: String path to mount
+ offset: Offset of the start of a partition in bytes (default 0)
+ size: Limits the size of the partition, in bytes (default 0). This is
+ important when creating filesystems, otherwise tools often
+ corrupt areas beyond the desired limits of the partition.
+ Returns:
+ The path to a created loopback device node
+ """
+
+ try:
+ base_args = ['losetup', '--show', '-f', '-P', '-o', str(offset)]
+ if size and offset:
+ cmd = base_args + ['--sizelimit', str(size), mount_path]
+ else:
+ cmd = base_args + [mount_path]
+ loop_device = subprocess.check_output(cmd).rstrip()
+ # Allow the system time to see the new device On some systems, mounts
+ # created on the loopdev too soon after creating the loopback device
+ # may be unreliable, even though the -P option (--partscan) is passed
+ # to losetup
+ time.sleep(1)
+ except subprocess.CalledProcessError:
+ PartitioningError('Error creating loopback')
+ try:
+ yield loop_device
+ finally:
+ subprocess.check_call(['losetup', '-d', loop_device])
+
+def get_pt_type(location):
+ """Read the partition table type from location (device or image)"""
+
+ pt_type = __get_blkid_output('PTTYPE', location).lower()
+ return 'none' if pt_type == '' else pt_type
+
+def __get_blkid_output(field, location):
+ return subprocess.check_output(['blkid', '-p', '-o', 'value',
+ '-s', field, location]).rstrip()
+
+def get_partition_uuid(location, part_num, pt_type=None):
+ """
+ Read the partition UUID (MBR or GPT) for location (device or image)
+
+ Args:
+ location: Path to device or image
+ part_num: Integer number of the partition
+ pt_type: The partition table format (MBR or GPT)
+ """
+
+ if not pt_type:
+ pt_type = get_pt_type(location)
+ if pt_type == 'gpt':
+ return get_partition_gpt_guid(location, part_num)
+ elif pt_type == 'mbr':
+ return get_partition_mbr_uuid(location, part_num)
+
+def get_partition_mbr_uuid(location, part_num):
+ """
+ Get a partition's UUID in a device using MBR partition table
+
+ In Linux, MBR partition UUIDs are comprised of the NT disk signature,
+ followed by '-' and a two digit, zero-padded partition number. This is
+ necessary since the MBR does not provide per-partition GUIDs as GPT
+ partition tables do. This can be passed to the kernel with
+ "root=PARTUUID=$UUID" to identify a partition containing a root
+ filesystem.
+
+ Args:
+ partition: A partition object
+ location: Location of the storage device containing the partition -
+ an image or device node
+ Returns:
+ A UUID referring to an MBR partition, e.g. '97478dab-02'
+ """
+
+ pt_uuid = __get_blkid_output('PTUUID', location).upper()
+ return '%s-%02d' % (pt_uuid, part_num)
+
+def get_partition_gpt_guid(location, part_num):
+ """
+ Get a partition's GUID from a GPT partition table
+
+ This is read directly from the partition table, since current fdisk does
+ not support reading GPT partition GUIDs. It does not require special tools
+ (gfdisk). This is the GUID which identifies the partition, created with
+ the partition table, as opposed to the filesystem UUID, created with the
+ filesystem. It is particularly useful for specifying the partition which
+ the Linux kernel can use on boot to find the root filesystem, e.g. when
+ using the kernel command line "root=PARTUUID=$UUID"
+
+ Args:
+ part_num: The partition number
+ location: Location of the storage device containing the partition -
+ an image path or device node
+ Returns:
+ A GUID string, e.g. 'B342D1AB-4B65-4601-97DC-D6DF3FE2E95E'
+ """
+
+ sector_size = get_sector_size(location)
+ # The partition GUID is located two sectors (protective MBR + GPT header)
+ # plus 128 bytes for each partition entry in the table, plus 16 bytes for
+ # the location of the partition's GUID
+ guid_offset = (2 * sector_size) + (128 * (part_num - 1)) + 16
+
+ with open(location, 'rb') as f:
+ f.seek(guid_offset)
+ raw_uuid_bin = f.read(16)
+
+ a = ''
+ for c in raw_uuid_bin:
+ a += '%02X' % ord(c)
+
+ return ('%s%s%s%s-%s%s-%s%s-%s-%s' %
+ (a[6:8], a[4:6], a[2:4], a[0:2],
+ a[10:12], a[8:10],
+ a[14:16], a[12:14],
+ a[16:20], a[20:32]))
diff --git a/extensions/rawdisk.check b/extensions/rawdisk.check
new file mode 100755
index 00000000..e7aed390
--- /dev/null
+++ b/extensions/rawdisk.check
@@ -0,0 +1,52 @@
+#!/usr/bin/python2
+# 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 os
+
+import writeexts
+
+
+class RawdiskCheckExtension(writeexts.WriteExtension):
+ def process_args(self, args):
+ if len(args) != 1:
+ raise writeexts.ExtensionError(
+ '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 writeexts.ExtensionError(
+ 'Cannot upgrade %s: it is not an existing disk image' %
+ location)
+
+ version_label = os.environ.get('VERSION_LABEL')
+ if version_label is None:
+ raise writeexts.ExtensionError(
+ '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 writeexts.ExtensionError(
+ '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..ad81ca45
--- /dev/null
+++ b/extensions/rawdisk.write
@@ -0,0 +1,122 @@
+#!/usr/bin/python2
+# 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 contextlib
+import os
+import pyfdisk
+import re
+import subprocess
+import sys
+import time
+import tempfile
+
+import writeexts
+
+
+class RawDiskWriteExtension(writeexts.WriteExtension):
+
+ '''See rawdisk.write.help for documentation'''
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise writeexts.ExtensionError(
+ '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.create_baserock_system(temp_root, location)
+ self.status(msg='Disk image has been created at %s' %
+ location)
+ else:
+ self.create_baserock_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, location, temp_root):
+ self.complete_fstab_for_btrfs_layout(temp_root)
+
+ try:
+ with self.mount(location) as mp:
+ self.do_upgrade(mp, temp_root)
+ return
+ except subprocess.CalledProcessError:
+ pass
+
+ # At this point, we have failed to mount a raw image, so instead
+ # search for a Baserock root filesystem in the device's partitions
+ with self.find_and_mount_rootfs(location) as mp:
+ self.do_upgrade(mp, temp_root)
+
+ def do_upgrade(self, mp, temp_root):
+ 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')
+ subprocess.check_call(
+ ['btrfs', 'subvolume', 'snapshot', old_orig, new_orig])
+
+ subprocess.check_call(
+ ['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 writeexts.ExtensionError('VERSION_LABEL was not given')
+
+ if os.path.exists(os.path.join(mp, 'systems', version_label)):
+ raise writeexts.ExtensionError('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..72e285b7
--- /dev/null
+++ b/extensions/rawdisk.write.help
@@ -0,0 +1,127 @@
+# 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)
+
+ * PARTITION_FILE=path: path to a YAML partition specification to use for
+ producing partitioned disks or devices. The default specification is
+ 'partitioning/default' in definitions, which specifies a device with a
+ single partition. This may serve as an example of the format of this
+ file, or check the pyfdisk.py documentation in pyfdisk.README.
+
+ In addition to the features available in pyfdisk.py, using this
+ extension, a list of 'raw_files' items can be added at the partition
+ level, or the top level of the partition specification. This specifies
+ files to be written directly to the target device or image using `dd`
+
+ start_offset: 2048
+ partition_table_format: mbr
+ partitions:
+ - description: boot
+ filesystem: none
+ ...
+ raw_files:
+ - file: boot/uboot.img
+ raw_files:
+ - file: boot/uboot-env.img
+ offset_bytes: 512
+ - file: boot/preloader.bin
+ skip_bytes: 128
+ count_bytes: 16K
+
+ * Files are written consecutively in the order they are listed, and
+ sourced from the unpacked root filesystem image
+ * Files can be given a specific offset with 'offset_sectors' or
+ 'offset_bytes'
+ * With 'raw_files' specified inside a partition, 'offset_sectors' or
+ 'offset_bytes' is counted from the start of that partition,
+ otherwise from the start of the device.
+ * For files without an explicit offset, the next file is written
+ starting with the next free byte following the previous file
+ * Providing an offset is optional for all files
+ * Specifying 'skip_bytes' will set the 'skip=' option for dd, skipping
+ a number of bytes at the start of the input file
+ * Specifying 'count_bytes' sets the 'count=' option for dd
+ * For properties which take an input in bytes, a human-readable
+ multiplier can be used, e.g. K, M, G (integer multiplicands only)
+
+ * USE_PARTITIONING=boolean (default: no) Use this flag to enable
+ partitioning functions.
+
+ (See `morph help deploy` for details of how to pass parameters to write
+ extensions)
diff --git a/extensions/recv-hole b/extensions/recv-hole
new file mode 100755
index 00000000..fe69f304
--- /dev/null
+++ b/extensions/recv-hole
@@ -0,0 +1,158 @@
+#!/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 =*=
+
+
+# Receive a data stream describing a sparse file, and reproduce it,
+# either to a named file or stdout.
+#
+# The data stream is simple: it's a sequence of DATA or HOLE records:
+#
+# DATA
+# 123
+# <123 bytes of binary data, NOT including newline at the end>
+#
+# HOLE
+# 123
+#
+# This shell script can be executed over ssh (given to ssh as an arguemnt,
+# with suitable escaping) on a different computer. This allows a large
+# sparse file (e.g., disk image) be transferred quickly.
+#
+# This script should be called in one of the following ways:
+#
+# recv-hole file FILENAME
+# recv-hole vbox FILENAME DISKSIZE
+#
+# In both cases, FILENAME is the pathname of the disk image on the
+# receiving end. DISKSIZE is the size of the disk image in bytes. The
+# first form is used when transferring a disk image to become an
+# identical file on the receiving end.
+#
+# The second form is used when the disk image should be converted for
+# use by VirtualBox. In this case, we want to avoid writing a
+# temporary file on disk, and then calling the VirtualBox VBoxManage
+# tool to do the conversion, since that would involve large amounts of
+# unnecessary I/O and disk usage. Instead we pipe the file directly to
+# VBoxManage, avoiding those issues. The piping is done here in this
+# script, instead of in the caller, to make it easier to run things
+# over ssh.
+#
+# However, since it's not possible seek in a Unix pipe, we have to
+# explicitly write the zeroes into the pipe. This is not
+# super-efficient, but the way to avoid that would be to avoid sending
+# a sparse file, and do the conversion to a VDI on the sending end.
+# That is out of scope for xfer-hole and recv-hole.
+
+
+set -eu
+
+
+die()
+{
+ echo "$@" 1>&2
+ exit 1
+}
+
+
+recv_hole_to_file()
+{
+ local n
+
+ read n
+ truncate --size "+$n" "$1"
+}
+
+
+recv_data_to_file()
+{
+ local n
+ read n
+
+ local blocksize=1048576
+ local blocks=$(($n / $blocksize))
+ local extra=$(($n % $blocksize))
+
+ xfer_data_to_stdout "$blocksize" "$blocks" >> "$1"
+ xfer_data_to_stdout 1 "$extra" >> "$1"
+}
+
+
+recv_hole_to_stdout()
+{
+ local n
+ read n
+ (echo "$n"; cat /dev/zero) | recv_data_to_stdout
+}
+
+
+recv_data_to_stdout()
+{
+ local n
+ read n
+
+ local blocksize=1048576
+ local blocks=$(($n / $blocksize))
+ local extra=$(($n % $blocksize))
+
+ xfer_data_to_stdout "$blocksize" "$blocks"
+ xfer_data_to_stdout 1 "$extra"
+}
+
+
+xfer_data_to_stdout()
+{
+ local log="$(mktemp)"
+ if ! dd "bs=$1" count="$2" iflag=fullblock status=noxfer 2> "$log"
+ then
+ cat "$log" 1>&2
+ rm -f "$log"
+ exit 1
+ else
+ rm -f "$log"
+ fi
+}
+
+
+type="$1"
+case "$type" in
+ file)
+ output="$2"
+ truncate --size=0 "$output"
+ while read what
+ do
+ case "$what" in
+ DATA) recv_data_to_file "$output" ;;
+ HOLE) recv_hole_to_file "$output" ;;
+ *) die "Unknown instruction: $what" ;;
+ esac
+ done
+ ;;
+ vbox)
+ output="$2"
+ disk_size="$3"
+ while read what
+ do
+ case "$what" in
+ DATA) recv_data_to_stdout ;;
+ HOLE) recv_hole_to_stdout ;;
+ *) die "Unknown instruction: $what" ;;
+ esac
+ done |
+ VBoxManage convertfromraw stdin "$output" "$disk_size"
+ ;;
+esac
diff --git a/extensions/sdk.write b/extensions/sdk.write
new file mode 100755
index 00000000..8d3d2a63
--- /dev/null
+++ b/extensions/sdk.write
@@ -0,0 +1,284 @@
+#!/bin/sh
+# Copyright (C) 2014 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 =*=
+
+set -eu
+
+die(){
+ echo "$@" >&2
+ exit 1
+}
+
+shellescape(){
+ echo "'$(echo "$1" | sed -e "s/'/'\\''/g")'"
+}
+
+########################## END OF COMMON HEADER ###############################
+#
+# The above lines, as well as being part of this script, are copied into the
+# self-installing SDK blob's header script, as a means of re-using content.
+#
+
+help(){
+ cat <<EOF
+sdk.write: Write extension for making an SDK installer.
+
+Description:
+ This is a write extension for producing a self-installing SDK blob
+ from a configured system.
+
+ It generates a shell script header and appends the rootfs as a tarball,
+ which the header later extracts, and performs various configuration
+ to have it useable as a relocatable toolchain.
+
+ This is similar to what the shar and makeself programs do, but we
+ need custom setup, so shar isn't appropriate, and makeself's api is
+ insufficiently flexible for our requirements.
+
+ The toolchain relocation is handled by sedding every text file in the
+ SDK directory, and using the patchelf from inside the SDK to change
+ every ELF binary in the toolchain to use the linker and libraries from
+ inside the SDK.
+
+ The ELF patching is required so that the SDK can work independently
+ of the versions of libraries installed on the host system.
+
+Location: Path to create the script at
+
+ENV VARS:
+ PREFIX (optional) The prefix the toolchain is built with
+ defaults to /usr
+ TARGET (mandatory) The gnu triplet the toolchain was built with
+EOF
+}
+
+ROOTDIR="$1"
+OUTPUT_SCRIPT="$2"
+PREFIX=${PREFIX-/usr}
+
+find_patchelf(){
+ # Look for patchelf in the usual places
+ for binpath in /bin "$PREFIX/bin"; do
+ if [ -x "$ROOTDIR$binpath/patchelf" ]; then
+ echo "$binpath/patchelf"
+ return
+ fi
+ done
+ die "patchelf not found in rootfs"
+}
+
+read_elf_interpreter(){
+ # Use readelf and sed to find the interpreter a binary uses this is
+ # required since we can't yet guarantee that the deploying system
+ # contains patchelf
+ readelf --wide --program-headers "$1" |
+ sed -nr -f /proc/self/fd/3 3<<'EOF'
+/\s+INTERP/{
+ n # linker is on line after INTERP line
+ s/^\s*\[Requesting program interpreter: (.*)]$/\1/
+ p # in -n mode, so need to print our text
+}
+EOF
+}
+
+find_lib_paths(){
+ local found_first=false
+ for libpath in "$PREFIX/lib32" "$PREFIX/lib64" "$PREFIX/lib" \
+ /lib32 /lib64 /lib; do
+ if [ -e "$ROOTDIR$libpath" ]; then
+ if "$found_first"; then
+ printf ":%s" "$libpath"
+ else
+ printf "%s" "$libpath"
+ found_first=true
+ fi
+ fi
+ done
+}
+
+# Create script with common header
+header_end=$(grep -En -m1 -e '^#+ END OF COMMON HEADER #+$' "$0" | cut -d: -f1)
+head -n "$header_end" "$0" | install -m 755 -D /dev/stdin "$OUTPUT_SCRIPT"
+
+# Determine any config
+PATCHELF="$(find_patchelf)"
+RTLD="$(read_elf_interpreter "$ROOTDIR$PATCHELF")"
+LIB_PATH="${LIB_PATH-$(find_lib_paths)}"
+
+# Append deploy-time config to header
+cat >>"$OUTPUT_SCRIPT" <<EOF
+#################### START OF DEPLOY TIME CONFIGURATION #######################
+
+TARGET=$(shellescape "$TARGET")
+PREFIX=$(shellescape "$PREFIX")
+PATCHELF=$(shellescape "$PATCHELF")
+RTLD=$(shellescape "$RTLD")
+LIB_PATH=$(shellescape "$LIB_PATH")
+
+##################### END OF DEPLOY TIME CONFIGURATION ########################
+EOF
+
+# Append deployment script
+cat >>"$OUTPUT_SCRIPT" <<'EOF'
+########################### START OF HEADER SCRIPT ############################
+
+usage(){
+ cat <<USAGE
+usage: $0 TOOLCHAIN_PATH
+USAGE
+}
+
+if [ "$#" != 1 ]; then
+ echo TOOLCHAIN_PATH not given >&2
+ usage >&2
+ exit 1
+fi
+
+TOOLCHAIN_PATH="$(readlink -f \"$1\")"
+
+sedescape(){
+ # Escape the passed in string so it can be safely interpolated into
+ # a sed expression as a literal value.
+ echo "$1" | sed -e 's/[\/&]/\\&/g'
+}
+
+prepend_to_path_elements(){
+ # Prepend $1 to every entry in the : separated list specified as $2.
+ local prefix="$1"
+ (
+ # Split path into components
+ IFS=:
+ set -- $2
+ # Print path back out with new prefix
+ printf %s "$prefix/$1"
+ shift
+ for arg in "$@"; do
+ printf ":%s" "$prefix/$arg"
+ done
+ )
+}
+
+extract_rootfs(){
+ # Extract the bzipped tarball at the end of the script passed as $1
+ # to the path specified as $2
+ local selfextractor="$1"
+ local target="$2"
+ local script_end="$(($(\
+ grep -aEn -m1 -e '^#+ END OF HEADER SCRIPT #+$' "$selfextractor" |
+ cut -d: -f1) + 1 ))"
+ mkdir -p "$target"
+ tail -n +"$script_end" "$selfextractor" | tar -xj -C "$target" .
+}
+
+amend_text_file_paths(){
+ # Replace all instances of $3 with $4 in the directory specified by $1
+ # excluding the subdirectory $2
+ local root="$1"
+ local inner_sysroot="$2"
+ local old_prefix="$3"
+ local new_prefix="$4"
+ find "$root" \( -path "$inner_sysroot" -prune \) -o -type f \
+ -exec sh -c 'file "$1" | grep -q text' - {} \; \
+ -exec sed -i -e \
+ "s/$(sedescape "$old_prefix")/$(sedescape "$new_prefix")/g" {} +
+}
+
+filter_patchelf_errors(){
+ # Filter out warnings from patchelf that are acceptable
+ # The warning that it's making a file bigger is just noise
+ # The warning about not being an ELF executable just means we got a
+ # false positive from file that it was an ELF binary
+ # Failing to find .interp is because for convenience, we set the
+ # interpreter in the same command as setting the rpath, even though
+ # we give it both executables and libraries.
+ grep -v -e 'warning: working around a Linux kernel bug' \
+ -e 'not an ELF executable' \
+ -e 'cannot find section .interp'
+}
+
+patch_elves(){
+ # Set the interpreter and library paths of ELF binaries in $1,
+ # except for the $2 subdirectory, using the patchelf command in the
+ # toolchain specified as $3, so that it uses the linker specified
+ # as $4 as the interpreter, and the runtime path specified by $5.
+ #
+ # The patchelf inside the toolchain is used to ensure that it works
+ # independently of the availability of patchelf on the host.
+ #
+ # This is possible by invoking the linker directly and specifying
+ # --linker-path as the RPATH we want to set the binaries to use.
+ local root="$1"
+ local inner_sysroot="$2"
+ local patchelf="$3"
+ local linker="$4"
+ local lib_path="$5"
+ find "$root" \( -path "$inner_sysroot" -prune \) -o -type f \
+ -type f -perm +u=x \
+ -exec sh -c 'file "$1" | grep -q "ELF"' - {} \; \
+ -exec "$linker" --library-path "$lib_path" \
+ "$patchelf" --set-interpreter "$linker" \
+ --set-rpath "$lib_path" {} \; 2>&1 \
+ | filter_patchelf_errors
+}
+
+generate_environment_setup(){
+ local target="$1"
+ install -m 644 -D /dev/stdin "$target" <<ENVSETUP
+export PATH=$(shellescape "$TOOLCHAIN_PATH/usr/bin"):"\$PATH"
+export TARGET_PREFIX=$(shellescape "$TARGET"-)
+export CC=$(shellescape "$TARGET-gcc")
+export CXX=$(shellescape "$TARGET-g++")
+export CPP=$(shellescape "$TARGET-gcc -E")
+export AS=$(shellescape "$TARGET-as")
+export LD=$(shellescape "$TARGET-ld")
+export STRIP=$(shellescape "$TARGET-strip")
+export RANLIB=$(shellescape "$TARGET-ranlib")
+export OBJCOPY=$(shellescape "$TARGET-objcopy")
+export OBJDUMP=$(shellescape "$TARGET-objdump")
+export AR=$(shellescape "$TARGET-ar")
+export NM=$(shellescape "$TARGET-nm")
+ENVSETUP
+}
+
+SYSROOT="$TOOLCHAIN_PATH$PREFIX/$TARGET/sys-root"
+PATCHELF="$TOOLCHAIN_PATH$PATCHELF"
+RTLD="$TOOLCHAIN_PATH$RTLD"
+OLD_PREFIX="$PREFIX"
+NEW_PREFIX="$TOOLCHAIN_PATH/$PREFIX"
+RPATH="$(prepend_to_path_elements "$TOOLCHAIN_PATH" "$LIB_PATH")"
+ENV_SETUP_FILE="$(dirname "$TOOLCHAIN_PATH")/environment-setup-$TARGET"
+
+echo Writing environment setup script to "$ENV_SETUP_FILE"
+generate_environment_setup "$ENV_SETUP_FILE"
+
+echo Extracting rootfs
+extract_rootfs "$0" "$TOOLCHAIN_PATH"
+
+echo "Relocating prefix references of $OLD_PREFIX to $NEW_PREFIX in" \
+ "the toolchain's textual config files."
+amend_text_file_paths "$TOOLCHAIN_PATH" "$SYSROOT" "$OLD_PREFIX" "$NEW_PREFIX"
+
+echo "Patching ELF binary files' interpreter and runtime library paths" \
+ "to refer to libraries within the toolchain"
+patch_elves "$TOOLCHAIN_PATH" "$SYSROOT" "$PATCHELF" "$RTLD" "$RPATH"
+
+exit
+############################ END OF HEADER SCRIPT #############################
+EOF
+
+# Append rootfs as tarball
+tar -C "$1" -cj >>"$OUTPUT_SCRIPT" .
diff --git a/extensions/set-hostname.configure b/extensions/set-hostname.configure
new file mode 100755
index 00000000..3c400563
--- /dev/null
+++ b/extensions/set-hostname.configure
@@ -0,0 +1,27 @@
+#!/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
+ mkdir -p "$1/etc"
+ echo "$HOSTNAME" > "$1/etc/hostname"
+fi
+
diff --git a/extensions/simple-network.configure b/extensions/simple-network.configure
new file mode 100755
index 00000000..67f46bc4
--- /dev/null
+++ b/extensions/simple-network.configure
@@ -0,0 +1,296 @@
+#!/usr/bin/python2
+# 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 errno
+import os
+import sys
+
+import writeexts
+
+
+class SimpleNetworkError(writeexts.ExtensionError):
+ '''Errors associated with simple network setup'''
+ pass
+
+
+class SimpleNetworkConfigurationExtension(object):
+ '''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 run(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 SimpleNetworkError(
+ '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 %.
+
+ '''
+
+ sys.stdout.write('%s\n' % (kwargs['msg'] % kwargs))
+
+try:
+ SimpleNetworkConfigurationExtension().run(sys.argv[1:])
+except SimpleNetworkError as e:
+ sys.stdout.write('ERROR: %s\n' % e)
+ sys.exit(1)
diff --git a/extensions/ssh-rsync.check b/extensions/ssh-rsync.check
new file mode 100755
index 00000000..5c2e5507
--- /dev/null
+++ b/extensions/ssh-rsync.check
@@ -0,0 +1,66 @@
+#!/usr/bin/python2
+# 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 os
+
+import writeexts
+
+
+class SshRsyncCheckExtension(writeexts.WriteExtension):
+ def process_args(self, args):
+ if len(args) != 1:
+ raise writeexts.ExtensionError(
+ 'Wrong number of command line args')
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if not upgrade:
+ raise writeexts.ExtensionError(
+ '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 writeexts.ExtensionError(
+ '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 = writeexts.ssh_runcmd(
+ location,
+ ['sh', '-c', 'test -d /baserock || echo -n dirnotfound'])
+ if output == 'dirnotfound':
+ raise writeexts.ExtensionError('%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 = writeexts.ssh_runcmd(location, ['sh', '-c', test])
+ if output == 'cmdnotfound':
+ raise writeexts.ExtensionError(
+ "%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..1045c528
--- /dev/null
+++ b/extensions/ssh-rsync.write
@@ -0,0 +1,175 @@
+#!/usr/bin/python2
+# 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 os
+import subprocess
+import sys
+import tempfile
+import time
+
+import writeexts
+
+
+def ssh_runcmd_ignore_failure(location, command, **kwargs):
+ try:
+ return writeexts.ssh_runcmd(location, command, **kwargs)
+ except writeexts.ExtensionError:
+ pass
+
+
+class SshRsyncWriteExtension(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 = writeexts.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 = writeexts.ssh_runcmd(location,
+ ['mktemp', '-d']).strip()
+ try:
+ yield remote_mnt
+ finally:
+ self.status(msg='Removing remote mount point')
+ writeexts.ssh_runcmd(location, ['rmdir', remote_mnt])
+
+ @contextlib.contextmanager
+ def _remote_mount(self, location, root_disk, mountpoint):
+ self.status(msg='Mounting root disk')
+ writeexts.ssh_runcmd(location, ['mount', root_disk, mountpoint])
+ try:
+ yield
+ finally:
+ self.status(msg='Unmounting root disk')
+ writeexts.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)
+ writeexts.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')
+ writeexts.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')
+ subprocess.check_call(['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')
+ writeexts.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')
+ writeexts.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 = writeexts.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)
+ writeexts.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 writeexts.ExtensionError(
+ '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/extensions/strip-gplv3.configure b/extensions/strip-gplv3.configure
new file mode 100755
index 00000000..e4e836f4
--- /dev/null
+++ b/extensions/strip-gplv3.configure
@@ -0,0 +1,97 @@
+#!/usr/bin/python2
+# Copyright (C) 2013-2016 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.
+
+''' A Morph configuration extension for removing gplv3 chunks from a system
+
+Using a hard-coded list of chunks, it will read the system's /baserock metadata
+to find the files created by that chunk, then remove them.
+
+'''
+
+import os
+import re
+import subprocess
+import sys
+
+import writeexts
+
+import imp
+scriptslib = imp.load_source('scriptslib', 'scripts/scriptslib.py')
+
+class StripGPLv3ConfigureExtension(writeexts.Extension):
+ gplv3_chunks = [
+ ['autoconf', ''],
+ ['autoconf-tarball', ''],
+ ['automake', ''],
+ ['bash', ''],
+ ['binutils', ''],
+ ['bison', ''],
+ ['ccache', ''],
+ ['cmake', ''],
+ ['flex', ''],
+ ['gawk', ''],
+ ['gcc', r'^.*lib.*\.so(\.\d+)*$'],
+ ['gdbm', ''],
+ ['gettext-tarball', ''],
+ ['gperf', ''],
+ ['groff', ''],
+ ['libtool', r'^.*lib.*\.so(\.\d+)*$'],
+ ['libtool-tarball', r'^.*lib.*\.so(\.\d+)*$'],
+ ['m4', ''],
+ ['make', ''],
+ ['nano', ''],
+ ['patch', ''],
+ ['rsync', ''],
+ ['texinfo-tarball', ''],
+ ]
+
+ def process_args(self, args):
+ target_root = args[0]
+ meta_dir = os.path.join(target_root, 'baserock')
+ metadata = scriptslib.meta_load_from_dir(meta_dir)
+
+ for chunk in self.gplv3_chunks:
+ for meta in metadata.get_name(chunk[0]):
+ self.remove_chunk(
+ target_root, reversed(meta['contents']), chunk[1])
+
+ def remove_chunk(self, target_root, chunk_contents, pattern):
+ updated_contents = []
+ for content_entry in chunk_contents:
+ pat = re.compile(pattern)
+ if len(pattern) == 0 or not pat.match(content_entry):
+ self.remove_content_entry(target_root, content_entry)
+ else:
+ updated_contents.append(content_entry)
+
+ def remove_content_entry(self, target_root, content_entry):
+ entry_path = os.path.join(target_root, './' + content_entry)
+ if not entry_path.startswith(target_root):
+ raise writeexts.ExtensionError(
+ '%s is not in %s' % (entry_path, target_root))
+ if os.path.exists(entry_path):
+ if os.path.islink(entry_path):
+ os.unlink(entry_path)
+ elif os.path.isfile(entry_path):
+ os.remove(entry_path)
+ elif os.path.isdir(entry_path):
+ if not os.listdir(entry_path):
+ os.rmdir(entry_path)
+ else:
+ raise writeexts.ExtensionError(
+ '%s is not a link, file or directory' % entry_path)
+
+StripGPLv3ConfigureExtension().run(sys.argv[1:])
diff --git a/extensions/swift-build-rings.yml b/extensions/swift-build-rings.yml
new file mode 100644
index 00000000..1ffe9c37
--- /dev/null
+++ b/extensions/swift-build-rings.yml
@@ -0,0 +1,34 @@
+---
+- hosts: localhost
+ vars:
+ - rings:
+ - { name: account, port: 6002 }
+ - { name: container, port: 6001 }
+ - { name: object, port: 6000 }
+ remote_user: root
+ tasks:
+ - file: path={{ ansible_env.ROOT }}/etc/swift owner=root group=root state=directory
+
+ - name: Create ring
+ shell: swift-ring-builder {{ item.name }}.builder create {{ ansible_env.SWIFT_PART_POWER }}
+ {{ ansible_env.SWIFT_REPLICAS }} {{ ansible_env.SWIFT_MIN_PART_HOURS }}
+ with_items: rings
+
+ - name: Add each storage node to the ring
+ shell: swift-ring-builder {{ item[0].name }}.builder
+ add r1z1-{{ item[1].ip }}:{{ item[0].port }}/{{ item[1].device }} {{ item[1].weight }}
+ with_nested:
+ - rings
+ - ansible_env.SWIFT_STORAGE_DEVICES
+
+ - name: Rebalance the ring
+ shell: swift-ring-builder {{ item.name }}.builder rebalance {{ ansible_env.SWIFT_REBALANCE_SEED }}
+ with_items: rings
+
+ - name: Copy ring configuration files into place
+ copy: src={{ item.name }}.ring.gz dest={{ ansible_env.ROOT }}/etc/swift
+ with_items: rings
+
+ - name: Copy ring builder files into place
+ copy: src={{ item.name }}.builder dest={{ ansible_env.ROOT }}/etc/swift
+ with_items: rings
diff --git a/extensions/swift-storage-devices-validate.py b/extensions/swift-storage-devices-validate.py
new file mode 100755
index 00000000..57ab23d0
--- /dev/null
+++ b/extensions/swift-storage-devices-validate.py
@@ -0,0 +1,60 @@
+#!/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, see <http://www.gnu.org/licenses/>.
+#
+# This is used by the openstack-swift.configure extension
+# to validate any provided storage device specifiers
+# under SWIFT_STORAGE_DEVICES
+#
+
+
+'''
+ This is used by the swift-storage.configure extension
+ to validate any storage device specifiers specified
+ in the SWIFT_STORAGE_DEVICES environment variable
+'''
+
+from __future__ import print_function
+
+import yaml
+import sys
+
+EXAMPLE_DEVSPEC = '{device: sdb1, ip: 127.0.0.1, weight: 100}'
+REQUIRED_KEYS = ['ip', 'device', 'weight']
+
+def err(msg):
+ print(msg, file=sys.stderr)
+ sys.exit(1)
+
+if len(sys.argv) != 2:
+ err('usage: %s STRING_TO_BE_VALIDATED' % sys.argv[0])
+
+swift_storage_devices = yaml.load(sys.argv[1])
+
+if not isinstance(swift_storage_devices, list):
+ err('Expected list of device specifiers\n'
+ 'Example: [%s]' % EXAMPLE_DEVSPEC)
+
+for d in swift_storage_devices:
+ if not isinstance(d, dict):
+ err("Invalid device specifier: `%s'\n"
+ 'Device specifier must be a dictionary\n'
+ 'Example: %s' % (d, EXAMPLE_DEVSPEC))
+
+ if set(d.keys()) != set(REQUIRED_KEYS):
+ err("Invalid device specifier: `%s'\n"
+ 'Specifier should contain: %s\n'
+ 'Example: %s' % (d, str(REQUIRED_KEYS)[1:-1], EXAMPLE_DEVSPEC))
diff --git a/extensions/swift-storage.configure b/extensions/swift-storage.configure
new file mode 100644
index 00000000..391b392a
--- /dev/null
+++ b/extensions/swift-storage.configure
@@ -0,0 +1,107 @@
+#!/bin/bash
+#
+# 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, see <http://www.gnu.org/licenses/>.
+
+set -e
+
+# The ansible script needs to know where the rootfs is, so we export it here
+export ROOT="$1"
+
+validate_number() {
+ local name="$1"
+ local value="$2"
+
+ local pattern='^[0-9]+$'
+ if ! [[ $value =~ $pattern ]]
+ then
+ echo "'$name' must be a number" >&2
+ exit 1
+ fi
+}
+
+validate_non_empty() {
+ local name="$1"
+ local value="$2"
+
+ if [[ $value = None ]]
+ then
+ echo "'$name' cannot be empty" >&2
+ exit 1
+ fi
+}
+
+MANDATORY_OPTIONS="SWIFT_HASH_PATH_PREFIX \
+ SWIFT_HASH_PATH_SUFFIX \
+ SWIFT_REBALANCE_SEED \
+ SWIFT_PART_POWER \
+ SWIFT_REPLICAS \
+ SWIFT_MIN_PART_HOURS \
+ SWIFT_STORAGE_DEVICES \
+ CONTROLLER_HOST_ADDRESS \
+ MANAGEMENT_INTERFACE_IP_ADDRESS"
+
+for option in $MANDATORY_OPTIONS
+do
+ if ! [[ -v $option ]]
+ then
+ missing_option=True
+ echo "Required option $option isn't set!" >&2
+ fi
+done
+
+if [[ $missing_option = True ]]; then exit 1; fi
+
+./swift-storage-devices-validate.py "$SWIFT_STORAGE_DEVICES"
+
+# Validate SWIFT_PART_POWER, SWIFT_REPLICAS, SWIFT_MIN_PART_HOURS
+# just make sure they're numbers
+
+validate_number "SWIFT_PART_POWER" "$SWIFT_PART_POWER"
+validate_number "SWIFT_REPLICAS" "$SWIFT_REPLICAS"
+validate_number "SWIFT_MIN_PART_HOURS" "$SWIFT_MIN_PART_HOURS"
+
+# Make sure these aren't empty
+validate_non_empty "SWIFT_HASH_PATH_PREFIX" "$SWIFT_HASH_PATH_PREFIX"
+validate_non_empty "SWIFT_HASH_PATH_SUFFIX" "$SWIFT_HASH_PATH_SUFFIX"
+validate_non_empty "SWIFT_REBALANCE_SEED" "$SWIFT_REBALANCE_SEED"
+validate_non_empty "CONTROLLER_HOST_ADDRESS" "$CONTROLLER_HOST_ADDRESS"
+validate_non_empty "MANAGEMENT_INTERFACE_IP_ADDRESS" "$MANAGEMENT_INTERFACE_IP_ADDRESS"
+
+mkdir -p "$ROOT/usr/lib/systemd/system/multi-user.target.wants" # ensure this exists before we make symlinks
+
+# A swift controller needs the storage setup service
+# but does not want any of the other storage services enabled
+ln -s "/usr/lib/systemd/system/swift-storage-setup.service" \
+ "$ROOT/usr/lib/systemd/system/multi-user.target.wants/swift-storage-setup.service"
+
+SWIFT_CONTROLLER=${SWIFT_CONTROLLER:-False}
+
+if [[ $SWIFT_CONTROLLER = False ]]
+then
+ ln -s "/usr/lib/systemd/system/rsync.service" \
+ "$ROOT/usr/lib/systemd/system/multi-user.target.wants/rsync.service"
+ ln -s "/usr/lib/systemd/system/swift-storage.service" \
+ "$ROOT/usr/lib/systemd/system/multi-user.target.wants/swift-storage.service"
+fi
+
+# Build swift data structures (the rings)
+/usr/bin/ansible-playbook -i hosts swift-build-rings.yml
+
+cat << EOF > "$ROOT"/usr/share/swift/swift-storage-vars.yml
+---
+MANAGEMENT_INTERFACE_IP_ADDRESS: $MANAGEMENT_INTERFACE_IP_ADDRESS
+SWIFT_HASH_PATH_PREFIX: $SWIFT_HASH_PATH_PREFIX
+SWIFT_HASH_PATH_SUFFIX: $SWIFT_HASH_PATH_SUFFIX
+EOF
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..ca5747fd
--- /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/extensions/trove.configure b/extensions/trove.configure
new file mode 100755
index 00000000..c1cd8a65
--- /dev/null
+++ b/extensions/trove.configure
@@ -0,0 +1,172 @@
+#!/bin/sh
+#
+# Copyright (C) 2013 - 2014 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.
+#
+# This is a "morph deploy" configuration extension to fully configure
+# a Trove instance at deployment time. It uses the following variables
+# from the environment (run `morph help trove.configure` to see a description
+# of them):
+#
+# * TROVE_ID
+# * TROVE_HOSTNAME (optional, defaults to TROVE_ID)
+# * TROVE_COMPANY
+# * LORRY_SSH_KEY
+# * UPSTREAM_TROVE
+# * UPSTREAM_TROVE_PROTOCOL
+# * TROVE_ADMIN_USER
+# * TROVE_ADMIN_EMAIL
+# * TROVE_ADMIN_NAME
+# * TROVE_ADMIN_SSH_PUBKEY
+# * LORRY_CONTROLLER_MINIONS (optional, defaults to 4)
+# * TROVE_BACKUP_KEYS - a space-separated list of paths to SSH keys.
+# (optional)
+# * TROVE_GENERIC (optional)
+#
+# The configuration of a Trove is slightly tricky: part of it has to
+# be run on the configured system after it has booted. We accomplish
+# this by copying in all the relevant data to the target system
+# (in /var/lib/trove-setup), and creating a systemd unit file that
+# runs on the first boot. The first boot will be detected by the
+# existence of the /var/lib/trove-setup/needed file.
+
+set -e
+
+if [ "$TROVE_GENERIC" ]
+then
+ echo "Not configuring the trove, it will be generic"
+ exit 0
+fi
+
+
+# Check that all the variables needed are present:
+
+error_vars=false
+if test "x$TROVE_ID" = "x"; then
+ echo "ERROR: TROVE_ID needs to be defined."
+ error_vars=true
+fi
+
+if test "x$TROVE_COMPANY" = "x"; then
+ echo "ERROR: TROVE_COMPANY needs to be defined."
+ error_vars=true
+fi
+
+if test "x$TROVE_ADMIN_USER" = "x"; then
+ echo "ERROR: TROVE_ADMIN_USER needs to be defined."
+ error_vars=true
+fi
+
+if test "x$TROVE_ADMIN_NAME" = "x"; then
+ echo "ERROR: TROVE_ADMIN_NAME needs to be defined."
+ error_vars=true
+fi
+
+if test "x$TROVE_ADMIN_EMAIL" = "x"; then
+ echo "ERROR: TROVE_ADMIN_EMAIL needs to be defined."
+ error_vars=true
+fi
+
+if ! ssh-keygen -lf $LORRY_SSH_KEY > /dev/null 2>&1
+then
+ echo "ERROR: LORRY_SSH_KEY is not a vaild ssh key."
+ error_vars=true
+fi
+
+if ! ssh-keygen -lf $WORKER_SSH_PUBKEY > /dev/null 2>&1
+then
+ echo "ERROR: WORKER_SSH_PUBKEY is not a vaild ssh key."
+ error_vars=true
+fi
+
+if ! ssh-keygen -lf $TROVE_ADMIN_SSH_PUBKEY > /dev/null 2>&1
+then
+ echo "ERROR: TROVE_ADMIN_SSH_PUBKEY is not a vaild ssh key."
+ error_vars=true
+fi
+
+if "$error_vars"; then
+ exit 1
+fi
+
+ROOT="$1"
+
+
+TROVE_DATA="$ROOT/etc/trove"
+mkdir -p "$TROVE_DATA"
+
+# Install mandatory files
+install -m 0600 "$LORRY_SSH_KEY" "$TROVE_DATA/lorry.key"
+install -m 0644 "${LORRY_SSH_KEY}.pub" "$TROVE_DATA/lorry.key.pub"
+install -m 0644 "$TROVE_ADMIN_SSH_PUBKEY" "$TROVE_DATA/admin.key.pub"
+install -m 0644 "$WORKER_SSH_PUBKEY" "$TROVE_DATA/worker.key.pub"
+
+
+# Create base configuration file
+python <<'EOF' >"$TROVE_DATA/trove.conf"
+import os, sys, yaml
+
+trove_configuration={
+ 'TROVE_ID': os.environ['TROVE_ID'],
+ 'TROVE_COMPANY': os.environ['TROVE_COMPANY'],
+ 'TROVE_ADMIN_USER': os.environ['TROVE_ADMIN_USER'],
+ 'TROVE_ADMIN_EMAIL': os.environ['TROVE_ADMIN_EMAIL'],
+ 'TROVE_ADMIN_NAME': os.environ['TROVE_ADMIN_NAME'],
+ 'LORRY_SSH_KEY': '/etc/trove/lorry.key',
+ 'LORRY_SSH_PUBKEY': '/etc/trove/lorry.key.pub',
+ 'TROVE_ADMIN_SSH_PUBKEY': '/etc/trove/admin.key.pub',
+ 'WORKER_SSH_PUBKEY': '/etc/trove/worker.key.pub',
+}
+
+
+
+optional_keys = ('MASON_ID', 'HOSTNAME', 'TROVE_HOSTNAME',
+ 'LORRY_CONTROLLER_MINIONS', 'TROVE_BACKUP_KEYS',
+ 'UPSTREAM_TROVE', 'UPSTREAM_TROVE_PROTOCOL')
+
+for key in optional_keys:
+ if key in os.environ:
+ trove_configuration[key]=os.environ[key]
+
+yaml.dump(trove_configuration, sys.stdout, default_flow_style=False)
+EOF
+
+# Add backups configuration
+if [ -n "$TROVE_BACKUP_KEYS" ]; then
+ mkdir -p "$TROVE_DATA/backup-keys"
+ cp -- $TROVE_BACKUP_KEYS "$TROVE_DATA/backup-keys"
+ echo "TROVE_BACKUP_KEYS: /etc/trove/backup-keys/*" >> "$TROVE_DATA/trove.conf"
+fi
+
+# Add SSL configuration
+if test "x$TROVE_SSL_PEMFILE" != "x"; then
+ if test -f "$TROVE_SSL_PEMFILE"; then
+ install -m 0600 "$TROVE_SSL_PEMFILE" "$TROVE_DATA/trove-ssl-pemfile.pem"
+ echo "TROVE_SSL_PEMFILE: /etc/trove/trove-ssl-pemfile.pem" >> "$TROVE_DATA/trove.conf"
+ else
+ echo "ERROR: $TROVE_SSL_PEMFILE (TROVE_SSL_PEMFILE) doesn't exist."
+ exit 1
+ fi
+fi
+
+if test "x$TROVE_SSL_CA_FILE" != "x"; then
+ if test -f "$TROVE_SSL_CA_FILE"; then
+ install -m 0644 "$TROVE_SSL_CA_FILE" "$TROVE_DATA/trove-ssl-ca-file.pem"
+ echo "TROVE_SSL_CA_FILE: /etc/trove/trove-ssl-ca-file.pem" >> "$TROVE_DATA/trove.conf"
+ else
+ echo "ERROR: $TROVE_SSL_CA_FILE (TROVE_SSL_CA_FILE) doesn't exist."
+ exit 1
+ fi
+fi
diff --git a/extensions/trove.configure.help b/extensions/trove.configure.help
new file mode 100644
index 00000000..2669f693
--- /dev/null
+++ b/extensions/trove.configure.help
@@ -0,0 +1,134 @@
+help: |
+ This is a "morph deploy" configuration extension to fully configure
+ a Trove instance at deployment time. It uses the following
+ configuration variables:
+
+ * `TROVE_ID`
+ * `TROVE_HOSTNAME` (optional, defaults to `TROVE_ID`)
+ * `TROVE_COMPANY`
+ * `LORRY_SSH_KEY`
+ * `UPSTREAM_TROVE`
+ * `TROVE_ADMIN_USER`
+ * `TROVE_ADMIN_EMAIL`
+ * `TROVE_ADMIN_NAME`
+ * `TROVE_ADMIN_SSH_PUBKEY`
+ * `LORRY_CONTROLLER_MINIONS` (optional, defaults to 4)
+ * `TROVE_BACKUP_KEYS` - a space-separated list of paths to SSH keys.
+ (optional)
+ * `TROVE_SSL_PEMFILE` (optional)
+ * `TROVE_SSL_CA_FILE` (optional)
+
+ The variables are described in more detail below.
+
+ A Trove deployment needs to know the following things:
+
+ * The Trove's ID and public name.
+ * The Trove's administrator name and access details.
+ * Private and public SSH keys for the Lorry user on the Trove.
+ * Which upstream Trove it should be set to mirror upon initial deploy.
+
+ These are specified with the configuration variables described in this
+ help.
+
+ * `TROVE_GENERIC` -- boolean. If it's true the trove will be generic
+ and it won't be configured with any of the other variables listed
+ here.
+
+ * `TROVE_ID` -- the identifier of the Trove. This separates it from
+ other Troves, and allows mirroring of Troves to happen without local
+ changes getting overwritten.
+
+ The Trove ID is used in several ways. Any local repositories (those not
+ mirrored from elsewhere) get created under a prefix that is the ID.
+ Thus, the local repositories on the `git.baserock.org` Trove, whose
+ Trove ID is `baserock`, are named
+ `baserock/baserock/definitions.git` and similar. The ID is used
+ there twice: first as a prefix and then as a "project name" within
+ that prefix. There can be more projects under the prefix. For
+ example, there is a `baserock/local-config/lorries.git` repository,
+ where `local-config` is a separate project from `baserock`. Projects
+ here are a concept for the Trove's git access control language.
+
+ The Trove ID also used as the prefix for any branch and tag names
+ created locally for repositories that are not local. Thus, in the
+ `delta/linux.git` repository, any local branches would be called
+ something like `baserock/morph`, instead of just `morph`. The
+ Trove's git access control prevents normal uses from pushing
+ branches and tags that do not have the Trove ID as the prefix.
+
+ * `TROVE_HOSTNAME` -- the public name of the Trove. This is an
+ optional setting, and defaults to `TROVE_ID`. The public name is
+ typically the domain name of the server (e.g., `git.baserock.org`),
+ but can also be an IP address. This setting is used when Trove needs
+ to generate URLs that point to itself, such as the `git://` and
+ `http://` URLs for each git repository that is viewed via the web
+ interface.
+
+ Note that this is _not_ the system hostname. That is set separately,
+ with the `HOSTNAME` configuration setting (see the
+ `set-hostname.configure` extension).
+
+ * `TROVE_COMPANY` -- a description of the organisation who own the
+ Trove. This is shown in various parts of the web interface of the
+ Trove. It is for descriptive purposes only.
+
+ * `LORRY_SSH_KEY` -- ssh key pair that the Trove's Lorry will use to
+ access an upstream Trove, and to push updates to the Trove's git
+ server.
+
+ The value is a filename on the system doing the deployment (where
+ `morph deploy` is run). The file contains the _private_ key, and the
+ public key is in a file with the `.pub` suffix added to the name.
+
+ The upstream Trove needs to be configured to allow this key to
+ access it. This configuration does not do that automatically.
+
+ * `UPSTREAM_TROVE` -- public name of the upstream Trove (domain
+ name or IP address). This is an optional setting. If it's set,
+ the new Trove will be configured to mirror that Trove.
+
+ * `TROVE_ADMIN_USER`, `TROVE_ADMIN_EMAIL`, `TROVE_ADMIN_NAME`,
+ `TROVE_ADMIN_SSH_PUBKEY` -- details of the Trove's (initial)
+ administrator.
+
+ Each Trove needs at least one administrator user, and one is created
+ upon initial deployment. `TROVE_ADMIN_USER` is the username of the
+ account to be created, `TROVE_ADMIN_EMAIL` should be the e-mail of
+ the user, and `TROVE_ADMIN_NAME` is their name. If more
+ administrators are needed, the initial person should create them
+ using the usual Gitano commands.
+
+ * `LORRY_CONTROLLER_MINIONS` -- the number of Lorry Controller worker
+ processes to start. This is an optional setting and defaults to 4.
+ The more workers are running, the more Lorry jobs can run at the same
+ time, but the more resources they require.
+
+ * `TROVE_BACKUP_KEYS` -- a space-separated list of paths to SSH keys.
+ If this is set, the Trove will have a backup user that can be accessed
+ with rsync using the SSH keys provided.
+
+ * `TROVE_SSL_PEMFILE` -- SSL certificate to use in lighttpd SSL
+ configuration.
+
+ * `TROVE_SSL_CA_FILE` -- CA chain certificate to use in lighttpd SSL
+ configuration.
+
+ Example
+ -------
+
+ The following set of variables could be to deploy a Trove instance:
+
+ TROVE_ID: my-trove
+ TROVE_HOSTNAME: my-trove.example.com
+ TROVE_COMPANY: My Personal Trove for Me, Myself and I
+ LORRY_SSH_KEY: my-trove/lorry.key
+ UPSTREAM_TROVE: git.baserock.org
+ UPSTREAM_TROVE_USER: my-trove
+ UPSTREAM_TROVE_EMAIL: my-trove@example.com
+ TROVE_ADMIN_USER: tomjon
+ TROVE_ADMIN_EMAIL: tomjon@example.com
+ TROVE_ADMIN_NAME: Tomjon of Lancre
+ TROVE_ADMIN_SSH_PUBKEY: my-trove/tomjon.key.pub
+
+ These would be put into the cluster morphology used to do the
+ deployment.
diff --git a/extensions/vagrant.configure b/extensions/vagrant.configure
new file mode 100644
index 00000000..abc3ea0c
--- /dev/null
+++ b/extensions/vagrant.configure
@@ -0,0 +1,55 @@
+#!/bin/sh
+# Copyright (C) 2014 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.5
+#
+# 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
+
+ROOT="$1"
+
+if test "x$VAGRANT" = "x"; then
+ exit 0
+fi
+
+for needed in etc/ssh/sshd_config etc/sudoers; do
+ if ! test -e "$ROOT/$needed"; then
+ echo >&2 "Unable to find $needed"
+ echo >&2 "Cannot continue configuring as Vagrant basebox"
+ exit 1
+ fi
+done
+
+# SSH daemon needs to be configured to not use DNS...
+sed -i -e's/^(.*[Uu]][Ss][Ee][Dd][Nn][Ss].*)$/#\1/' "$ROOT/etc/ssh/sshd_config"
+echo "UseDNS no" >> "$ROOT/etc/ssh/sshd_config"
+
+# We need to add a vagrant user with "vagrant" as the password We're doing this
+# manually because chrooting in to run adduser is not really allowed for
+# deployment time since we wouldn't be able to run the adduser necessarily. In
+# practice for now we'd be able to because we can't deploy raw disks
+# cross-platform and expect extlinux to install but we won't, for good
+# practice and to hilight this deficiency.
+echo 'vagrant:x:1000:1000:Vagrant User:/home/vagrant:/bin/bash' >> "$ROOT/etc/passwd"
+echo 'vagrant:/6PTOoWylhw3w:16198:0:99999:7:::' >> "$ROOT/etc/shadow"
+echo 'vagrant:x:1000:' >> "$ROOT/etc/group"
+mkdir -p "$ROOT/home/vagrant"
+chown -R 1000:1000 "$ROOT/home/vagrant"
+
+# Next, the vagrant user is meant to have sudo access
+echo 'vagrant ALL=(ALL) NOPASSWD: ALL' >> "$ROOT/etc/sudoers"
+
+# And ensure that we get sbin in our path
+echo 'PATH="$PATH:/sbin:/usr/sbin"' >> "$ROOT/etc/profile"
+echo 'export PATH' >> "$ROOT/etc/profile"
+
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..215c8b30
--- /dev/null
+++ b/extensions/virtualbox-ssh.check
@@ -0,0 +1,36 @@
+#!/usr/bin/python2
+# 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 writeexts
+
+
+class VirtualBoxPlusSshCheckExtension(writeexts.WriteExtension):
+ def process_args(self, args):
+ if len(args) != 1:
+ raise writeexts.ExtensionError(
+ 'Wrong number of command line args')
+
+ self.require_btrfs_in_deployment_host_kernel()
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if upgrade:
+ raise writeexts.ExtensionError(
+ '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..56c0bb57
--- /dev/null
+++ b/extensions/virtualbox-ssh.write
@@ -0,0 +1,219 @@
+#!/usr/bin/python2
+# 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 os
+import re
+import subprocess
+import sys
+import tempfile
+import time
+import urlparse
+
+import writeexts
+
+
+class VirtualBoxPlusSshWriteExtension(writeexts.WriteExtension):
+
+ def process_args(self, args):
+ if len(args) != 2:
+ raise writeexts.ExtensionError(
+ '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)
+ writeexts.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 writeexts.ExtensionError(
+ 'URL schema must be vbox+ssh in %s' % location)
+ m = re.match('^/(?P<guest>[^/]+)(?P<path>/.+)$', x.path)
+ if not m:
+ raise writeexts.ExtensionError(
+ '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)
+ # TODO: Something!
+ xfer_hole_path = writeexts.get_data_path('xfer-hole')
+ recv_hole = writeexts.get_data('recv-hole')
+
+ ssh_remote_cmd = [
+ 'sh', '-c', recv_hole,
+ 'dummy-argv0', 'vbox', vdi_path, str(st.st_size),
+ ]
+
+ xfer_hole_proc = subprocess.Popen(
+ ['python', xfer_hole_path, raw_disk],
+ stdout=subprocess.PIPE)
+ recv_hole_proc = subprocess.Popen(
+ ['ssh', ssh_host] + map(writeexts.shell_quote, ssh_remote_cmd),
+ stdin=xfer_hole_proc.stdout)
+ xfer_hole_proc.stdout.close()
+ recv_hole_proc.communicate()
+
+ 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 = writeexts.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
+ writeexts.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 writeexts.ExtensionError('HOST_IPADDR was not given')
+
+ if netmask is None:
+ raise writeexts.ExtensionError('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 = writeexts.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 = writeexts.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("'")]
+ writeexts.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/extensions/writeexts.py b/extensions/writeexts.py
new file mode 100644
index 00000000..5b79093b
--- /dev/null
+++ b/extensions/writeexts.py
@@ -0,0 +1,1072 @@
+#!/usr/bin/python2
+# 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/>.
+
+
+import contextlib
+import errno
+import logging
+import os
+import re
+import shutil
+import stat
+import subprocess
+import sys
+import time
+import tempfile
+
+import partitioning
+import pyfdisk
+import writeexts
+
+
+if sys.version_info >= (3, 3, 0):
+ import shlex
+ shell_quote = shlex.quote
+else:
+ import pipes
+ shell_quote = pipes.quote
+
+
+def get_data_path(relative_path):
+ extensions_dir = os.path.dirname(__file__)
+ return os.path.join(extensions_dir, relative_path)
+
+
+def get_data(relative_path):
+ with open(get_data_path(relative_path)) as f:
+ return f.read()
+
+
+def ssh_runcmd(host, args, **kwargs):
+ '''Run command over ssh'''
+ command = ['ssh', host, '--'] + [shell_quote(arg) for arg in args]
+
+ feed_stdin = kwargs.get('feed_stdin')
+ stdin = kwargs.get('stdin', subprocess.PIPE)
+ stdout = kwargs.get('stdout', subprocess.PIPE)
+ stderr = kwargs.get('stderr', subprocess.PIPE)
+
+ p = subprocess.Popen(command, stdin=stdin, stdout=stdout, stderr=stderr)
+ out, err = p.communicate(input=feed_stdin)
+ if p.returncode != 0:
+ raise ExtensionError('ssh command `%s` failed' % ' '.join(command))
+ return out
+
+
+def write_from_dict(filepath, d, validate=lambda x, y: True):
+ """Takes a dictionary and appends the contents to a file
+
+ An optional validation callback can be passed to perform validation on
+ each value in the dictionary.
+
+ e.g.
+
+ def validation_callback(dictionary_key, dictionary_value):
+ if not dictionary_value.isdigit():
+ raise Exception('value contains non-digit character(s)')
+
+ Any callback supplied to this function should raise an exception
+ if validation fails.
+
+ """
+ # Sort items asciibetically
+ # the output of the deployment should not depend
+ # on the locale of the machine running the deployment
+ items = sorted(d.iteritems(), key=lambda (k, v): [ord(c) for c in v])
+
+ for (k, v) in items:
+ validate(k, v)
+
+ with open(filepath, 'a') as f:
+ for (_, v) in items:
+ f.write('%s\n' % v)
+
+ os.fchown(f.fileno(), 0, 0)
+ os.fchmod(f.fileno(), 0644)
+
+
+def parse_environment_pairs(env, pairs):
+ '''Add key=value pairs to the environment dict.
+
+ Given a dict and a list of strings of the form key=value,
+ set dict[key] = value, unless key is already set in the
+ environment, at which point raise an exception.
+
+ This does not modify the passed in dict.
+
+ Returns the extended dict.
+
+ '''
+ extra_env = dict(p.split('=', 1) for p in pairs)
+ conflicting = [k for k in extra_env if k in env]
+ if conflicting:
+ raise ExtensionError('Environment already set: %s'
+ % ', '.join(conflicting))
+
+ # Return a dict that is the union of the two
+ # This is not the most performant, since it creates
+ # 3 unnecessary lists, but I felt this was the most
+ # easy to read. Using itertools.chain may be more efficicent
+ return dict(env.items() + extra_env.items())
+
+
+class ExtensionError(Exception):
+
+ def __init__(self, msg):
+ self.msg = msg
+
+ def __str__(self):
+ return self.msg
+
+
+class Fstab(object):
+ '''Small helper class for parsing and adding lines to /etc/fstab.'''
+
+ # There is an existing Python helper library for editing of /etc/fstab.
+ # However it is unmaintained and has an incompatible license (GPL3).
+ #
+ # https://code.launchpad.net/~computer-janitor-hackers/python-fstab/trunk
+
+ def __init__(self, filepath='/etc/fstab'):
+ if os.path.exists(filepath):
+ with open(filepath, 'r') as f:
+ self.text= f.read()
+ else:
+ self.text = ''
+ self.filepath = filepath
+ self.lines_added = 0
+
+ def get_mounts(self):
+ '''Return list of mount devices and targets in /etc/fstab.
+
+ Return value is a dict of target -> device.
+ '''
+ mounts = dict()
+ for line in self.text.splitlines():
+ words = line.split()
+ if len(words) >= 2 and not words[0].startswith('#'):
+ device, target = words[0:2]
+ mounts[target] = device
+ return mounts
+
+ def add_line(self, line):
+ '''Add a new entry to /etc/fstab.
+
+ Lines are appended, and separated from any entries made by configure
+ extensions with a comment.
+
+ '''
+ if self.lines_added == 0:
+ if len(self.text) == 0 or self.text[-1] is not '\n':
+ self.text += '\n'
+ self.text += '# Morph default system layout\n'
+ self.lines_added += 1
+
+ self.text += line + '\n'
+
+ def write(self):
+ '''Rewrite the fstab file to include all new entries.'''
+ with tempfile.NamedTemporaryFile(delete=False) as f:
+ f.write(self.text)
+ tmp = f.name
+ shutil.move(os.path.abspath(tmp), os.path.abspath(self.filepath))
+
+
+class Extension(object):
+
+ '''A base class for deployment extensions.
+
+ A subclass should subclass this class, and add a
+ ``process_args`` method.
+
+ Note that it is not necessary to subclass this class for write
+ extensions. This class is here just to collect common code for
+ write extensions.
+
+ '''
+
+ def setup_logging(self):
+ '''Direct all logging output to MORPH_LOG_FD, if set.
+
+ This file descriptor is read by Morph and written into its own log
+ file.
+
+ '''
+ log_write_fd = int(os.environ.get('MORPH_LOG_FD', 0))
+
+ if log_write_fd == 0:
+ return
+
+ formatter = logging.Formatter('%(message)s')
+
+ handler = logging.StreamHandler(os.fdopen(log_write_fd, 'w'))
+ handler.setFormatter(formatter)
+
+ logger = logging.getLogger()
+ logger.addHandler(handler)
+ logger.setLevel(logging.DEBUG)
+
+ def process_args(self, args):
+ raise NotImplementedError()
+
+ def run(self, args=None):
+ if args is None:
+ args = sys.argv[1:]
+ try:
+ self.setup_logging()
+ self.process_args(args)
+ except ExtensionError as e:
+ sys.stdout.write('ERROR: %s\n' % e)
+ sys.exit(1)
+
+ @staticmethod
+ def status(**kwargs):
+ '''Provide status output.
+
+ The ``msg`` keyword argument is the actual message,
+ the rest are values for fields in the message as interpolated
+ by %.
+
+ '''
+ sys.stdout.write('%s\n' % (kwargs['msg'] % kwargs))
+ sys.stdout.flush()
+
+
+class WriteExtension(Extension):
+
+ '''A base class for deployment write extensions.
+
+ A subclass should subclass this class, and add a
+ ``process_args`` method.
+
+ Note that it is not necessary to subclass this class for write
+ extensions. This class is here just to collect common code for
+ write extensions.
+
+ '''
+
+ def check_for_btrfs_in_deployment_host_kernel(self):
+ with open('/proc/filesystems') as f:
+ text = f.read()
+ return '\tbtrfs\n' in text
+
+ def require_btrfs_in_deployment_host_kernel(self):
+ if not self.check_for_btrfs_in_deployment_host_kernel():
+ raise ExtensionError(
+ 'Error: Btrfs is required for this deployment, but was not '
+ 'detected in the kernel of the machine that is running Morph.')
+
+ def create_local_system(self, temp_root, location):
+ '''Create a raw system image locally.'''
+
+ with self.created_disk_image(location):
+ self.create_baserock_system(temp_root, location)
+
+ def create_baserock_system(self, temp_root, location):
+ if self.get_environment_boolean('USE_PARTITIONING', 'no'):
+ self.create_partitioned_system(temp_root, location)
+ else:
+ self.format_btrfs(location)
+ self.create_unpartitioned_system(temp_root, location)
+
+ @contextlib.contextmanager
+ def created_disk_image(self, location):
+ size = self.get_disk_size()
+ if not size:
+ raise ExtensionError('DISK_SIZE is not defined')
+ self.create_raw_disk_image(location, size)
+ try:
+ yield
+ except BaseException:
+ os.unlink(location)
+ raise
+
+ def format_btrfs(self, raw_disk):
+ try:
+ self.mkfs_btrfs(raw_disk)
+ except BaseException:
+ sys.stderr.write('Error creating disk image')
+ raise
+
+ def create_unpartitioned_system(self, temp_root, raw_disk):
+ '''Deploy a bootable Baserock system within a single Btrfs filesystem.
+
+ Called if USE_PARTITIONING=no (the default) is set in the deployment
+ options.
+
+ '''
+ with self.mount(raw_disk) as mp:
+ try:
+ self.create_versioned_layout(mp, version_label='factory')
+ self.create_btrfs_system_rootfs(
+ temp_root, mp, version_label='factory',
+ rootfs_uuid=self.get_uuid(raw_disk))
+ if self.bootloader_config_is_wanted():
+ self.create_bootloader_config(
+ temp_root, mp, version_label='factory',
+ rootfs_uuid=self.get_uuid(raw_disk))
+ except BaseException:
+ sys.stderr.write('Error creating Btrfs system layout')
+ raise
+
+ def _parse_size(self, size):
+ '''Parse a size from a string.
+
+ Return size in bytes.
+
+ '''
+
+ m = re.match('^(\d+)([kmgKMG]?)$', size)
+ if not m:
+ return None
+
+ factors = {
+ '': 1,
+ 'k': 1024,
+ 'm': 1024**2,
+ 'g': 1024**3,
+ }
+ factor = factors[m.group(2).lower()]
+
+ return int(m.group(1)) * factor
+
+ def _parse_size_from_environment(self, env_var, default):
+ '''Parse a size from an environment variable.'''
+
+ size = os.environ.get(env_var, default)
+ if size is None:
+ return None
+ bytes = self._parse_size(size)
+ if bytes is None:
+ raise ExtensionError('Cannot parse %s value %s'
+ % (env_var, size))
+ return bytes
+
+ def get_disk_size(self):
+ '''Parse disk size from environment.'''
+ return self._parse_size_from_environment('DISK_SIZE', None)
+
+ def get_ram_size(self):
+ '''Parse RAM size from environment.'''
+ return self._parse_size_from_environment('RAM_SIZE', '1G')
+
+ def get_vcpu_count(self):
+ '''Parse the virtual cpu count from environment.'''
+ return self._parse_size_from_environment('VCPUS', '1')
+
+ def create_raw_disk_image(self, filename, size):
+ '''Create a raw disk image.'''
+
+ self.status(msg='Creating empty disk image')
+ with open(filename, 'wb') as f:
+ if size > 0:
+ f.seek(size-1)
+ f.write('\0')
+
+ def mkfs_btrfs(self, location):
+ '''Create a btrfs filesystem on the disk.'''
+
+ self.status(msg='Creating btrfs filesystem')
+ try:
+ # The following command disables some new filesystem features. We
+ # need to do this because at the time of writing, SYSLINUX has not
+ # been updated to understand these new features and will fail to
+ # boot if the kernel is on a filesystem where they are enabled.
+ subprocess.check_output(
+ ['mkfs.btrfs','-f', '-L', 'baserock',
+ '--features', '^extref',
+ '--features', '^skinny-metadata',
+ '--features', '^mixed-bg',
+ '--nodesize', '4096',
+ location], stderr=subprocess.STDOUT)
+ except subprocess.CalledProcessError as e:
+ if 'unrecognized option \'--features\'' in e.output:
+ # Old versions of mkfs.btrfs (including v0.20, present in many
+ # Baserock releases) don't support the --features option, but
+ # also don't enable the new features by default. So we can
+ # still create a bootable system in this situation.
+ logging.debug(
+ 'Assuming mkfs.btrfs failure was because the tool is too '
+ 'old to have --features flag.')
+ subprocess.check_call(['mkfs.btrfs','-f',
+ '-L', 'baserock', location])
+ else:
+ raise
+
+ def get_uuid(self, location, offset=0):
+ '''Get the filesystem UUID of a block device's file system.
+
+ Requires util-linux blkid; the busybox version ignores options and
+ lies by exiting successfully.
+
+ Args:
+ location: Path of device or image to inspect
+ offset: A byte offset - which should point to the start of a
+ partition containing a filesystem
+ '''
+
+ return subprocess.check_output(['blkid', '-s', 'UUID', '-o',
+ 'value', '-p', '-O', str(offset),
+ location]).strip()
+
+ @contextlib.contextmanager
+ def mount(self, location):
+ self.status(msg='Mounting filesystem')
+ try:
+ mount_point = tempfile.mkdtemp()
+ if self.is_device(location):
+ subprocess.check_call(['mount', location, mount_point])
+ else:
+ subprocess.check_call(['mount', '-o', 'loop',
+ location, mount_point])
+ except BaseException:
+ sys.stderr.write('Error mounting filesystem')
+ os.rmdir(mount_point)
+ raise
+ try:
+ yield mount_point
+ finally:
+ self.status(msg='Unmounting filesystem')
+ subprocess.check_call(['umount', mount_point])
+ os.rmdir(mount_point)
+
+ def create_versioned_layout(self, mountpoint, version_label):
+ '''Create a versioned directory structure within a partition.
+
+ The Baserock project has defined a 'reference upgrade mechanism'. This
+ mandates a specific directory layout. It consists of a toplevel
+ '/systems' directory, containing subdirectories named with a 'version
+ label'. These subdirectories contain the actual OS content.
+
+ For the root file system, a Btrfs partition must be used. For each
+ version, two subvolumes are created: 'orig' and 'run'. This is handled
+ in create_btrfs_system_rootfs().
+
+ Other partitions (e.g. /boot) can also follow the same layout. In the
+ case of /boot, content goes directly in the version directory. That
+ means there are no 'orig' and 'run' subvolumes, which avoids the
+ need to use Btrfs.
+
+ The `system-version-manager` tool from tbdiff.git is responsible for
+ deploying live upgrades, and it understands this layout.
+
+ '''
+ version_root = os.path.join(mountpoint, 'systems', version_label)
+
+ os.makedirs(version_root)
+ os.symlink(
+ version_label, os.path.join(mountpoint, 'systems', 'default'))
+
+ def create_btrfs_system_rootfs(self, temp_root, mountpoint, version_label,
+ rootfs_uuid, device=None):
+ '''Separate base OS versions from state using subvolumes.
+
+ The 'device' parameter should be a pyfdisk.Device instance,
+ as returned by partitioning.do_partitioning(), that describes the
+ partition layout of the target device. This is used to set up
+ mountpoints in the root partition for the other partitions.
+ If no 'device' instance is passed, no mountpoints are set up in the
+ rootfs.
+
+ '''
+ version_root = os.path.join(mountpoint, 'systems', version_label)
+ state_root = os.path.join(mountpoint, 'state')
+ os.makedirs(state_root)
+
+ system_dir = self.create_orig(version_root, temp_root)
+ state_dirs = self.complete_fstab_for_btrfs_layout(system_dir,
+ rootfs_uuid, device)
+
+ for state_dir in state_dirs:
+ self.create_state_subvolume(system_dir, mountpoint, state_dir)
+
+ self.create_run(version_root)
+
+ if device:
+ self.create_partition_mountpoints(device, system_dir)
+
+ def create_bootloader_config(self, temp_root, mountpoint, version_label,
+ rootfs_uuid, device=None):
+ '''Setup the bootloader.
+
+ '''
+ initramfs = self.find_initramfs(temp_root)
+ version_root = os.path.join(mountpoint, 'systems', version_label)
+
+ self.install_kernel(version_root, temp_root)
+ if self.get_dtb_path() != '':
+ self.install_dtb(version_root, temp_root)
+ self.install_syslinux_menu(mountpoint, temp_root)
+ if initramfs is not None:
+ # Using initramfs - can boot a rootfs with a filesystem UUID
+ self.install_initramfs(initramfs, version_root)
+ self.generate_bootloader_config(mountpoint,
+ rootfs_uuid=rootfs_uuid)
+ else:
+ if device:
+ # A partitioned disk or image - boot with partition UUID
+ root_part = device.get_partition_by_mountpoint('/')
+ root_guid = device.get_partition_uuid(root_part)
+ self.generate_bootloader_config(mountpoint,
+ root_guid=root_guid)
+ else:
+ # Unpartitioned and no initramfs - cannot boot with a UUID
+ self.generate_bootloader_config(mountpoint)
+ self.install_bootloader(mountpoint)
+
+ def create_partition_mountpoints(self, device, system_dir):
+ '''Create (or empty) partition mountpoints in the root filesystem
+
+ Delete contents of partition mountpoints in the rootfs to leave an
+ empty mount drectory (files are copied to the actual partition in
+ create_partitioned_system()), or create an empty mount directory in
+ the rootfs if the mount path doesn't exist.
+
+ Args:
+ device: A pyfdisk.py Device object describing the partitioning
+ system_dir: A path to the Baserock rootfs to be modified
+ '''
+
+ for part in device.partitionlist:
+ if hasattr(part, 'mountpoint') and part.mountpoint != '/':
+ part_mount_dir = os.path.join(system_dir,
+ re.sub('^/', '', part.mountpoint))
+ if os.path.exists(part_mount_dir):
+ self.status(msg='Deleting files in mountpoint '
+ 'for %s partition' % part.mountpoint)
+ self.empty_dir(part_mount_dir)
+ else:
+ self.status(msg='Creating empty mount directory '
+ 'for %s partition' % part.mountpoint)
+ os.mkdir(part_mount_dir)
+
+ def create_orig(self, version_root, temp_root):
+ '''Create the default "factory" system.'''
+
+ orig = os.path.join(version_root, 'orig')
+
+ self.status(msg='Creating orig subvolume')
+ subprocess.check_call(['btrfs', 'subvolume', 'create', orig])
+ self.status(msg='Copying files to orig subvolume')
+ subprocess.check_call(['cp', '-a', temp_root + '/.', orig + '/.'])
+
+ return orig
+
+ def create_run(self, version_root):
+ '''Create the 'run' snapshot.'''
+
+ self.status(msg='Creating run subvolume')
+ orig = os.path.join(version_root, 'orig')
+ run = os.path.join(version_root, 'run')
+ subprocess.check_call(
+ ['btrfs', 'subvolume', 'snapshot', orig, run])
+
+ def create_state_subvolume(self, system_dir, mountpoint, state_subdir):
+ '''Create a shared state subvolume.
+
+ We need to move any files added to the temporary rootfs by the
+ configure extensions to their correct home. For example, they might
+ have added keys in `/root/.ssh` which we now need to transfer to
+ `/state/root/.ssh`.
+
+ '''
+ self.status(msg='Creating %s subvolume' % state_subdir)
+ subvolume = os.path.join(mountpoint, 'state', state_subdir)
+ subprocess.check_call(['btrfs', 'subvolume', 'create', subvolume])
+ os.chmod(subvolume, 0o755)
+
+ existing_state_dir = os.path.join(system_dir, state_subdir)
+ self.move_dir_contents(existing_state_dir, subvolume)
+
+ def move_dir_contents(self, source_dir, target_dir):
+ '''Move all files source_dir, to target_dir'''
+
+ n = self.__cmd_files_in_dir(['mv'], source_dir, target_dir)
+ if n:
+ self.status(msg='Moved %d files to %s' % (n, target_dir))
+
+ def copy_dir_contents(self, source_dir, target_dir):
+ '''Copy all files source_dir, to target_dir'''
+
+ n = self.__cmd_files_in_dir(['cp', '-a', '-r'], source_dir, target_dir)
+ if n:
+ self.status(msg='Copied %d files to %s' % (n, target_dir))
+
+ def empty_dir(self, directory):
+ '''Empty the contents of a directory, but not the directory itself'''
+
+ n = self.__cmd_files_in_dir(['rm', '-rf'], directory)
+ if n:
+ self.status(msg='Deleted %d files in %s' % (n, directory))
+
+ def __cmd_files_in_dir(self, cmd, source_dir, target_dir=None):
+ files = []
+ if os.path.exists(source_dir):
+ files = os.listdir(source_dir)
+ for filename in files:
+ filepath = os.path.join(source_dir, filename)
+ add_params = [filepath, target_dir] if target_dir else [filepath]
+ subprocess.check_call(cmd + add_params)
+ return len(files)
+
+ def complete_fstab_for_btrfs_layout(self, system_dir,
+ rootfs_uuid=None, device=None):
+ '''Fill in /etc/fstab entries for the default Btrfs disk layout.
+
+ In the future we should move this code out of the write extension and
+ in to a configure extension. To do that, though, we need some way of
+ informing the configure extension what layout should be used. Right now
+ a configure extension doesn't know if the system is going to end up as
+ a Btrfs disk image, a tarfile or something else and so it can't come
+ up with a sensible default fstab.
+
+ Configuration extensions can already create any /etc/fstab that they
+ like. This function only fills in entries that are missing, so if for
+ example the user configured /home to be on a separate partition, that
+ decision will be honoured and /state/home will not be created.
+
+ '''
+ shared_state_dirs = {'home', 'root', 'opt', 'srv', 'var'}
+
+ fstab = Fstab(os.path.join(system_dir, 'etc', 'fstab'))
+ existing_mounts = fstab.get_mounts()
+
+ if '/' in existing_mounts:
+ root_device = existing_mounts['/']
+ else:
+ root_device = (self.get_root_device() if rootfs_uuid is None else
+ 'UUID=%s' % rootfs_uuid)
+ fstab.add_line('%s / btrfs defaults,rw,noatime 0 1' % root_device)
+
+ # Add fstab entries for partitions
+ part_mountpoints = set()
+ if device:
+ mount_parts = set(p for p in device.partitionlist
+ if hasattr(p, 'mountpoint') and p.mountpoint != '/')
+ for part in mount_parts:
+ if part.mountpoint not in existing_mounts:
+ # Get filesystem UUID
+ part_uuid = self.get_uuid(device.location,
+ part.extent.start *
+ device.sector_size)
+ self.status(msg='Adding fstab entry for %s '
+ 'partition' % part.mountpoint)
+ fstab.add_line('UUID=%s %s %s defaults,rw,noatime '
+ '0 2' % (part_uuid, part.mountpoint,
+ part.filesystem))
+ part_mountpoints.add(part.mountpoint)
+ else:
+ self.status(msg='WARNING: an entry already exists in '
+ 'fstab for %s partition, skipping' %
+ part.mountpoint)
+
+ # Add entries for state dirs
+ all_mountpoints = set(existing_mounts.keys()) | part_mountpoints
+ state_dirs_to_create = set()
+ for state_dir in shared_state_dirs:
+ mp = '/' + state_dir
+ if mp not in all_mountpoints:
+ state_dirs_to_create.add(state_dir)
+ state_subvol = os.path.join('/state', state_dir)
+ fstab.add_line(
+ '%s /%s btrfs subvol=%s,defaults,rw,noatime 0 2' %
+ (root_device, state_dir, state_subvol))
+
+ fstab.write()
+ return state_dirs_to_create
+
+ def find_initramfs(self, temp_root):
+ '''Check whether the rootfs has an initramfs.
+
+ Uses the INITRAMFS_PATH option to locate it.
+ '''
+ if 'INITRAMFS_PATH' in os.environ:
+ initramfs = os.path.join(temp_root, os.environ['INITRAMFS_PATH'])
+ if not os.path.exists(initramfs):
+ raise ExtensionError('INITRAMFS_PATH specified, '
+ 'but file does not exist')
+ return initramfs
+ return None
+
+ def install_initramfs(self, initramfs_path, version_root):
+ '''Install the initramfs outside of 'orig' or 'run' subvolumes.
+
+ This is required because syslinux doesn't traverse subvolumes when
+ loading the kernel or initramfs.
+ '''
+ self.status(msg='Installing initramfs')
+ initramfs_dest = os.path.join(version_root, 'initramfs')
+ subprocess.check_call(['cp', '-a', initramfs_path, initramfs_dest])
+
+ def install_kernel(self, version_root, temp_root):
+ '''Install the kernel outside of 'orig' or 'run' subvolumes'''
+
+ self.status(msg='Installing kernel')
+ image_names = ['vmlinuz', 'zImage', 'uImage']
+ kernel_dest = os.path.join(version_root, 'kernel')
+ for name in image_names:
+ try_path = os.path.join(temp_root, 'boot', name)
+ if os.path.exists(try_path):
+ subprocess.check_call(['cp', '-a', try_path, kernel_dest])
+ break
+
+ def install_dtb(self, version_root, temp_root):
+ '''Install the device tree outside of 'orig' or 'run' subvolumes'''
+
+ self.status(msg='Installing devicetree')
+ device_tree_path = self.get_dtb_path()
+ dtb_dest = os.path.join(version_root, 'dtb')
+ try_path = os.path.join(temp_root, device_tree_path)
+ if os.path.exists(try_path):
+ subprocess.check_call(['cp', '-a', try_path, dtb_dest])
+ else:
+ logging.error("Failed to find device tree %s", device_tree_path)
+ raise ExtensionError(
+ 'Failed to find device tree %s' % device_tree_path)
+
+ def get_dtb_path(self):
+ return os.environ.get('DTB_PATH', '')
+
+ def get_bootloader_install(self):
+ # Do we actually want to install the bootloader?
+ # Set this to "none" to prevent the install
+ return os.environ.get('BOOTLOADER_INSTALL', 'extlinux')
+
+ def get_bootloader_config_format(self):
+ # The config format for the bootloader,
+ # if not set we default to extlinux for x86
+ return os.environ.get('BOOTLOADER_CONFIG_FORMAT', 'extlinux')
+
+ def get_extra_kernel_args(self):
+ return os.environ.get('KERNEL_ARGS', '')
+
+ def get_root_device(self):
+ return os.environ.get('ROOT_DEVICE', '/dev/sda')
+
+ def generate_bootloader_config(self, *args, **kwargs):
+ '''Install extlinux on the newly created disk image.'''
+ config_function_dict = {
+ 'extlinux': self.generate_extlinux_config,
+ }
+
+ config_type = self.get_bootloader_config_format()
+ if config_type in config_function_dict:
+ config_function_dict[config_type](*args, **kwargs)
+ else:
+ raise ExtensionError(
+ 'Invalid BOOTLOADER_CONFIG_FORMAT %s' % config_type)
+
+ def generate_extlinux_config(self, real_root,
+ rootfs_uuid=None, root_guid=None):
+ '''Generate the extlinux configuration file
+
+ Args:
+ real_root: Path to the mounted top level of the root filesystem
+ rootfs_uuid: Specify a filesystem UUID which can be loaded using
+ an initramfs aware of filesystems
+ root_guid: Specify a partition GUID, can be used without an
+ initramfs
+ '''
+
+ self.status(msg='Creating extlinux.conf')
+ # To be compatible with u-boot, create the extlinux.conf file in
+ # /extlinux/ rather than /
+ # Syslinux, however, requires this to be in /, so create a symlink
+ # as well
+ config_path = os.path.join(real_root, 'extlinux')
+ os.makedirs(config_path)
+ config = os.path.join(config_path, 'extlinux.conf')
+ os.symlink('extlinux/extlinux.conf', os.path.join(real_root,
+ 'extlinux.conf'))
+
+ ''' Please also update the documentation in the following files
+ if you change these default kernel args:
+ - kvm.write.help
+ - rawdisk.write.help
+ - virtualbox-ssh.write.help '''
+ kernel_args = (
+ 'rw ' # ro ought to work, but we don't test that regularly
+ 'init=/sbin/init ' # default, but it doesn't hurt to be explicit
+ 'rootfstype=btrfs ' # required when using initramfs, also boots
+ # faster when specified without initramfs
+ 'rootflags=subvol=systems/default/run ') # boot runtime subvol
+
+ # See init/do_mounts.c:182 in the kernel source, in the comment above
+ # function name_to_dev_t(), for an explanation of the available
+ # options for the kernel parameter 'root', particularly when using
+ # GUID/UUIDs
+ if rootfs_uuid:
+ root_device = 'UUID=%s' % rootfs_uuid
+ elif root_guid:
+ root_device = 'PARTUUID=%s' % root_guid
+ else:
+ # Fall back to the root partition named in the cluster
+ root_device = self.get_root_device()
+ kernel_args += 'root=%s ' % root_device
+
+ kernel_args += self.get_extra_kernel_args()
+ with open(config, 'w') as f:
+ f.write('default linux\n')
+ f.write('timeout 1\n')
+ f.write('label linux\n')
+ f.write('kernel /systems/default/kernel\n')
+ if rootfs_uuid is not None:
+ f.write('initrd /systems/default/initramfs\n')
+ if self.get_dtb_path() != '':
+ f.write('devicetree /systems/default/dtb\n')
+ f.write('append %s\n' % kernel_args)
+
+ def install_bootloader(self, *args, **kwargs):
+ install_function_dict = {
+ 'extlinux': self.install_bootloader_extlinux,
+ }
+
+ install_type = self.get_bootloader_install()
+ if install_type in install_function_dict:
+ install_function_dict[install_type](*args, **kwargs)
+ elif install_type != 'none':
+ raise ExtensionError(
+ 'Invalid BOOTLOADER_INSTALL %s' % install_type)
+
+ def install_bootloader_extlinux(self, real_root):
+ self.status(msg='Installing extlinux')
+ subprocess.check_call(['extlinux', '--install', real_root])
+
+ # FIXME this hack seems to be necessary to let extlinux finish
+ subprocess.check_call(['sync'])
+ time.sleep(2)
+
+ def install_syslinux_blob(self, device, orig_root):
+ '''Install Syslinux MBR blob
+
+ This is the first stage of boot (for partitioned images) on x86
+ machines. It is not required where there is no partition table. The
+ syslinux bootloader is written to the MBR, and is capable of loading
+ extlinux. This only works when the partition is set as bootable (MBR),
+ or the legacy boot flag is set (GPT). The blob is built with extlinux,
+ and found in the rootfs'''
+
+ pt_format = device.partition_table_format.lower()
+ if pt_format in ('gpb', 'mbr'):
+ blob = 'mbr.bin'
+ elif pt_format == 'gpt':
+ blob = 'gptmbr.bin'
+ blob_name = 'usr/share/syslinux/' + blob
+ self.status(msg='Installing syslinux %s blob' % pt_format.upper())
+ blob_location = os.path.join(orig_root, blob_name)
+ if os.path.exists(blob_location):
+ subprocess.check_call(['dd', 'if=%s' % blob_location,
+ 'of=%s' % device.location,
+ 'bs=440', 'count=1', 'conv=notrunc'])
+ else:
+ raise ExtensionError('MBR blob not found. Is this the correct'
+ 'architecture? The MBR blob will only be built for x86'
+ 'systems. You may wish to configure BOOTLOADER_INSTALL')
+
+ def install_syslinux_menu(self, real_root, temp_root):
+ '''Make syslinux/extlinux menu binary available.
+
+ The syslinux boot menu is compiled to a file named menu.c32. Extlinux
+ searches a few places for this file but it does not know to look inside
+ our subvolume, so we copy it to the filesystem root.
+
+ If the file is not available, the bootloader will still work but will
+ not be able to show a menu.
+
+ '''
+ menu_file = os.path.join(temp_root, 'usr', 'share', 'syslinux',
+ 'menu.c32')
+ if os.path.isfile(menu_file):
+ self.status(msg='Copying menu.c32')
+ shutil.copy(menu_file, real_root)
+
+ def parse_attach_disks(self):
+ '''Parse $ATTACH_DISKS into list of disks to attach.'''
+
+ if 'ATTACH_DISKS' in os.environ:
+ s = os.environ['ATTACH_DISKS']
+ return s.split(':')
+ else:
+ return []
+
+ def bootloader_config_is_wanted(self):
+ '''Does the user want to generate a bootloader config?
+
+ The user may set $BOOTLOADER_CONFIG_FORMAT to the desired
+ format. 'extlinux' is the only allowed value, and is the default
+ value for x86-32 and x86-64.
+
+ '''
+
+ def is_x86(arch):
+ return (arch == 'x86_64' or
+ (arch.startswith('i') and arch.endswith('86')))
+
+ value = os.environ.get('BOOTLOADER_CONFIG_FORMAT', '')
+ if value == '':
+ if not is_x86(os.uname()[-1]):
+ return False
+
+ return True
+
+ def get_environment_boolean(self, variable, default='no'):
+ '''Parse a yes/no boolean passed through the environment.'''
+
+ value = os.environ.get(variable, default).lower()
+ if value in ('no', '0', 'false'):
+ return False
+ elif value in ('yes', '1', 'true'):
+ return True
+ else:
+ raise ExtensionError('Unexpected value for %s: %s' %
+ (variable, value))
+
+ def check_ssh_connectivity(self, ssh_host):
+ try:
+ output = ssh_runcmd(ssh_host, ['echo', 'test'])
+ except ExtensionError as e:
+ logging.error("Error checking SSH connectivity: %s", str(e))
+ raise ExtensionError(
+ 'Unable to SSH to %s: %s' % (ssh_host, e))
+
+ if output.strip() != 'test':
+ raise ExtensionError(
+ 'Unexpected output from remote machine: %s' % output.strip())
+
+ def is_device(self, location):
+ try:
+ st = os.stat(location)
+ return stat.S_ISBLK(st.st_mode)
+ except OSError as e:
+ if e.errno == errno.ENOENT:
+ return False
+ raise
+
+ def create_partitioned_system(self, temp_root, location):
+ '''Deploy a bootable Baserock system with a custom partition layout.
+
+ Called if USE_PARTITIONING=yes is set in the deployment options.
+
+ '''
+ part_spec = os.environ.get('PARTITION_FILE', 'partitioning/default')
+
+ disk_size = self.get_disk_size()
+ if not disk_size:
+ raise writeexts.ExtensionError('DISK_SIZE is not defined')
+
+ dev = partitioning.do_partitioning(location, disk_size,
+ temp_root, part_spec)
+ boot_partition_available = dev.get_partition_by_mountpoint('/boot')
+
+ for part in dev.partitionlist:
+ if not hasattr(part, 'mountpoint'):
+ continue
+ if part.mountpoint == '/':
+ # Re-format the rootfs, to include needed extra features
+ with pyfdisk.create_loopback(location,
+ part.extent.start *
+ dev.sector_size, part.size) as l:
+ self.mkfs_btrfs(l)
+
+ self.status(msg='Mounting partition %d' % part.number)
+ offset = part.extent.start * dev.sector_size
+ with self.mount_partition(location,
+ offset, part.size) as part_mount_dir:
+ if part.mountpoint == '/':
+ # Install root filesystem
+ rfs_uuid = self.get_uuid(location, part.extent.start *
+ dev.sector_size)
+ self.create_versioned_layout(part_mount_dir, 'factory')
+ self.create_btrfs_system_rootfs(temp_root, part_mount_dir,
+ 'factory', rfs_uuid, dev)
+
+ # If there's no /boot partition, but we do need to generate
+ # a bootloader configuration file, then it needs to go in
+ # the root partition.
+ if (boot_partition_available is False
+ and self.bootloader_config_is_wanted()):
+ self.create_bootloader_config(
+ temp_root, part_mount_dir, 'factory', rfs_uuid,
+ dev)
+
+ if self.get_bootloader_install() == 'extlinux':
+ # The extlinux/syslinux MBR blob always needs to be
+ # installed in the root partition.
+ self.install_syslinux_blob(dev, temp_root)
+ else:
+ # Copy files to partition from unpacked rootfs
+ src_dir = os.path.join(temp_root,
+ re.sub('^/', '', part.mountpoint))
+ self.status(msg='Copying files to %s partition' %
+ part.mountpoint)
+ self.copy_dir_contents(src_dir, part_mount_dir)
+
+ if (part.mountpoint == '/boot' and
+ self.bootloader_config_is_wanted()):
+ # We need to mirror the layout of the root partition in the
+ # /boot partition. Each kernel lives in its own
+ # systems/$version_label/ directory within the /boot
+ # partition.
+ self.create_versioned_layout(part_mount_dir, 'factory')
+ self.create_bootloader_config(temp_root, part_mount_dir,
+ 'factory', None, dev)
+
+ # Write raw files to disk with dd
+ partitioning.process_raw_files(dev, temp_root)
+
+ @contextlib.contextmanager
+ def mount_partition(self, location, offset_bytes, size_bytes):
+ '''Mount a partition in a partitioned device or image'''
+
+ with pyfdisk.create_loopback(location, offset=offset_bytes,
+ size=size_bytes) as loop:
+ with self.mount(loop) as mountpoint:
+ yield mountpoint
+
+ @contextlib.contextmanager
+ def find_and_mount_rootfs(self, location):
+ '''
+ Mount a Baserock rootfs inside a partitioned device or image
+
+ This function searches a disk image or device, with unknown
+ partitioning scheme, for a Baserock rootfs. This is done by finding
+ offsets and sizes of partitions in the partition table, mounting each
+ partition, and checking whether a known path exists in the mount.
+
+ Args:
+ location: the location of the disk image or device to search
+ Returns:
+ A path to the mount point of the mounted Baserock rootfs
+ '''
+
+ if pyfdisk.get_pt_type(location) == 'none':
+ with self.mount(location) as mountpoint:
+ yield mountpoint
+
+ sector_size = pyfdisk.get_sector_size(location)
+ partn_sizes = pyfdisk.get_partition_sector_sizes(location)
+ for i, offset in enumerate(pyfdisk.get_partition_offsets(location)):
+ try:
+ with self.mount_partition(location, offset * sector_size,
+ partn_sizes[i] * sector_size) as mp:
+ path = os.path.join(mp, 'systems/default/orig/baserock')
+ if os.path.exists(path):
+ self.status(msg='Found a Baserock rootfs at '
+ 'offset %d sectors/%d bytes' %
+ (offset, offset * sector_size))
+ yield mp
+ except BaseException:
+ # Probably a partition without a filesystem, carry on
+ pass
diff --git a/extensions/xfer-hole b/extensions/xfer-hole
new file mode 100755
index 00000000..91f1be01
--- /dev/null
+++ b/extensions/xfer-hole
@@ -0,0 +1,137 @@
+#!/usr/bin/env python
+#
+# Send a sparse file more space-efficiently.
+# See recv-hole for a description of the protocol.
+#
+# Note that xfer-hole requires a version of Linux with support for
+# SEEK_DATA and SEEK_HOLE.
+#
+#
+# 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 =*=
+
+
+
+import errno
+import os
+import sys
+
+
+SEEK_DATA = 3
+SEEK_HOLE = 4
+
+
+filename = sys.argv[1]
+fd = os.open(filename, os.O_RDONLY)
+pos = 0
+
+
+DATA = 'data'
+HOLE = 'hole'
+EOF = 'eof'
+
+
+def safe_lseek(fd, pos, whence):
+ try:
+ return os.lseek(fd, pos, whence)
+ except OSError as e:
+ if e.errno == errno.ENXIO:
+ return -1
+ raise
+
+
+def current_data_or_pos(fd, pos):
+ length = safe_lseek(fd, 0, os.SEEK_END)
+ next_data = safe_lseek(fd, pos, SEEK_DATA)
+ next_hole = safe_lseek(fd, pos, SEEK_HOLE)
+
+ if pos == length:
+ return EOF, pos
+ elif pos == next_data:
+ return DATA, pos
+ elif pos == next_hole:
+ return HOLE, pos
+ else:
+ assert False, \
+ ("Do not understand: pos=%d next_data=%d next_hole=%d" %
+ (pos, next_data, next_hole))
+
+
+def next_data_or_hole(fd, pos):
+ length = safe_lseek(fd, 0, os.SEEK_END)
+ next_data = safe_lseek(fd, pos, SEEK_DATA)
+ next_hole = safe_lseek(fd, pos, SEEK_HOLE)
+
+ if pos == length:
+ return EOF, pos
+ elif pos == next_data:
+ # We are at data.
+ if next_hole == -1 or next_hole == length:
+ return EOF, length
+ else:
+ return HOLE, next_hole
+ elif pos == next_hole:
+ # We are at a hole.
+ if next_data == -1 or next_data == length:
+ return EOF, length
+ else:
+ return DATA, next_data
+ else:
+ assert False, \
+ ("Do not understand: pos=%d next_data=%d next_hole=%d" %
+ (pos, next_data, next_hole))
+
+
+def find_data_and_holes(fd):
+ pos = safe_lseek(fd, 0, os.SEEK_CUR)
+
+ kind, pos = current_data_or_pos(fd, pos)
+ while kind != EOF:
+ yield kind, pos
+ kind, pos = next_data_or_hole(fd, pos)
+ yield kind, pos
+
+
+def make_xfer_instructions(fd):
+ prev_kind = None
+ prev_pos = None
+ for kind, pos in find_data_and_holes(fd):
+ if prev_kind == DATA:
+ yield (DATA, prev_pos, pos)
+ elif prev_kind == HOLE:
+ yield (HOLE, prev_pos, pos)
+ prev_kind = kind
+ prev_pos = pos
+
+
+def copy_slice_from_file(to, fd, start, end):
+ safe_lseek(fd, start, os.SEEK_SET)
+ nbytes = end - start
+ max_at_a_time = 1024**2
+ while nbytes > 0:
+ data = os.read(fd, min(nbytes, max_at_a_time))
+ if not data:
+ break
+ to.write(data)
+ nbytes -= len(data)
+
+
+for kind, start, end in make_xfer_instructions(fd):
+ if kind == HOLE:
+ sys.stdout.write('HOLE\n%d\n' % (end - start))
+ elif kind == DATA:
+ sys.stdout.write('DATA\n%d\n' % (end - start))
+ copy_slice_from_file(sys.stdout, fd, start, end)
diff --git a/genivi/clusters/gdp-jetson-upgrade.morph b/genivi/clusters/gdp-jetson-upgrade.morph
new file mode 100644
index 00000000..57287f4c
--- /dev/null
+++ b/genivi/clusters/gdp-jetson-upgrade.morph
@@ -0,0 +1,19 @@
+name: gdp-jetson-upgrade
+kind: cluster
+systems:
+- morph: genivi/systems/genivi-demo-platform-armv7lhf-jetson.morph
+ deploy-defaults:
+ BOOT_DEVICE: "/dev/mmcblk0p1"
+ ROOT_DEVICE: "/dev/mmcblk0p2"
+ DTB_PATH: "boot/tegra124-jetson-tk1.dtb"
+ BOOTLOADER_CONFIG_FORMAT: "extlinux"
+ BOOTLOADER_INSTALL: "none"
+ KERNEL_ARGS: cma=256M console=tty0 console=ttyS0,115200n8 no_console_suspend=1 nouveau.pstate=1
+ FSTAB_SRC: LABEL=src /src auto defaults,rw,noatime,nofail 0 2
+ GENIVI_WESTON_BACKEND: drm
+ GENIVI_WESTON_CONFIG: gdp
+ GENIVI_WESTON_AUTOSTART: True
+ deploy:
+ self:
+ type: extensions/ssh-rsync
+ location: root@127.0.0.1
diff --git a/genivi/clusters/genivi-demo-platform-x86_32-deploy.morph b/genivi/clusters/genivi-demo-platform-x86_32-deploy.morph
new file mode 100644
index 00000000..d1c5544d
--- /dev/null
+++ b/genivi/clusters/genivi-demo-platform-x86_32-deploy.morph
@@ -0,0 +1,22 @@
+name: genivi-demo-platform-x86_32-deploy
+kind: cluster
+description: |
+ Deploy GENIVI Demo platform system
+systems:
+- morph: genivi/systems/genivi-demo-platform-x86_32-generic.morph
+ deploy:
+ genivi-demo-platform-x86_32-generic:
+ type: extensions/rawdisk
+ location: genivi-demo-platform-x86_32-generic.img
+ DISK_SIZE: 4G
+ KERNEL_ARGS: vga=788
+ INITRAMFS_PATH: boot/initramfs.gz
+ HOSTNAME: genivi-demo-platform-x86-32-generic
+ GENIVI_WESTON_CONFIG: gdp
+ GENIVI_WESTON_AUTOSTART: False
+ subsystems:
+ - morph: systems/initramfs-x86_32.morph
+ deploy:
+ initramfs-genivi-demo-platform-x86_32-generic:
+ type: extensions/initramfs
+ location: boot/initramfs.gz
diff --git a/genivi/clusters/genivi-demo-platform-x86_64-deploy.morph b/genivi/clusters/genivi-demo-platform-x86_64-deploy.morph
new file mode 100644
index 00000000..4e1005c4
--- /dev/null
+++ b/genivi/clusters/genivi-demo-platform-x86_64-deploy.morph
@@ -0,0 +1,22 @@
+name: genivi-demo-platform-x86_64-deploy
+kind: cluster
+description: |
+ Deploy GENIVI Demo platform system
+systems:
+- morph: genivi/systems/genivi-demo-platform-x86_64-generic.morph
+ deploy:
+ genivi-demo-platform-x86_64-generic:
+ type: extensions/rawdisk
+ location: genivi-demo-platform-x86_64-generic.img
+ DISK_SIZE: 4G
+ KERNEL_ARGS: vga=788
+ INITRAMFS_PATH: boot/initramfs.gz
+ HOSTNAME: genivi-demo-platform-x86-64-generic
+ GENIVI_WESTON_CONFIG: gdp
+ GENIVI_WESTON_AUTOSTART: False
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ initramfs-genivi-demo-platform-x86_64-generic:
+ type: extensions/initramfs
+ location: boot/initramfs.gz
diff --git a/genivi/clusters/release-genivi-baseline.morph b/genivi/clusters/release-genivi-baseline.morph
new file mode 100644
index 00000000..08a8c622
--- /dev/null
+++ b/genivi/clusters/release-genivi-baseline.morph
@@ -0,0 +1,41 @@
+name: release-genivi-baseline
+kind: cluster
+description: |
+ Deploy GENIVI Baseline systems
+systems:
+- morph: genivi/systems/genivi-baseline-system-x86_64-generic.morph
+ deploy:
+ genivi-baseline-system-x86_64-generic:
+ type: extensions/rawdisk
+ location: genivi-baseline-system-x86_64-generic.img
+ DISK_SIZE: 4G
+ KERNEL_ARGS: vga=788
+ INITRAMFS_PATH: boot/initramfs.gz
+ HOSTNAME: genivi-baseline-system-x86-64-generic
+ GENIVI_WESTON_BACKEND: fbdev
+ GENIVI_WESTON_CONFIG: baseline
+ GENIVI_WESTON_AUTOSTART: False
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ initramfs-genivi-baseline-system-x86_64-generic:
+ type: extensions/initramfs
+ location: boot/initramfs.gz
+- morph: genivi/systems/genivi-baseline-system-armv7lhf-jetson.morph
+ deploy:
+ genivi-baseline-system-armv7lhf-jetson:
+ type: extensions/rawdisk
+ location: genivi-baseline-system-armv7lhf-jetson.img
+ DISK_SIZE: 4G
+ BOOT_DEVICE: /dev/mmcblk0p1
+ ROOT_DEVICE: /dev/mmcblk0p2
+ DTB_PATH: boot/tegra124-jetson-tk1.dtb
+ BOOTLOADER_CONFIG_FORMAT: extlinux
+ BOOTLOADER_INSTALL: none
+ KERNEL_ARGS: cma=256M console=tty0 console=ttyS0,115200n8 no_console_suspend=1
+ nouveau.pstate=1
+ HOSTNAME: genivi-baseline-system-armv7lhf-jetson
+ GENIVI_WESTON_BACKEND: drm
+ GENIVI_WESTON_CONFIG: baseline
+ GENIVI_WESTON_AUTOSTART: False
+
diff --git a/genivi/strata/genivi-demo-platform-libs.morph b/genivi/strata/genivi-demo-platform-libs.morph
new file mode 100644
index 00000000..ed8bc458
--- /dev/null
+++ b/genivi/strata/genivi-demo-platform-libs.morph
@@ -0,0 +1,18 @@
+name: genivi-demo-platform-libs
+kind: stratum
+description: Libraries needed for the GENIVI demo platform.
+build-depends:
+- morph: strata/foundation.morph
+- morph: strata/python-pygobject.morph
+- morph: strata/bluetooth.morph
+chunks:
+- name: dbus-c++
+ morph: genivi/strata/genivi-demo-platform-libs/dbus-c++.morph
+ repo: upstream:dbus-c++
+ ref: f000001329c1d008d8db22cc3369d331dbf5cf4e
+ unpetrify-ref: baserock/genivi-demo-platform
+- name: dbus-python
+ repo: upstream:dbus-python
+ ref: d0d5b5be685dc4c16b21c54335becc87ca4d6f58
+ unpetrify-ref: dbus-python-1.2.0
+ build-system: autotools
diff --git a/genivi/strata/genivi-demo-platform-libs/dbus-c++.morph b/genivi/strata/genivi-demo-platform-libs/dbus-c++.morph
new file mode 100644
index 00000000..bd805ebf
--- /dev/null
+++ b/genivi/strata/genivi-demo-platform-libs/dbus-c++.morph
@@ -0,0 +1,9 @@
+name: dbus-c++
+kind: chunk
+description: libdbus-c++ and dbusxx-xml2cpp tool
+build-system: autotools
+configure-commands:
+- autoreconf -ivf
+- ./configure --prefix="$PREFIX" --disable-ecore
+post-install-commands:
+- install tools/dbusxx-xml2cpp "$DESTDIR/$PREFIX"/bin/dbusxx-xml2cpp
diff --git a/genivi/strata/genivi-demo-platform.morph b/genivi/strata/genivi-demo-platform.morph
new file mode 100644
index 00000000..46c486ea
--- /dev/null
+++ b/genivi/strata/genivi-demo-platform.morph
@@ -0,0 +1,42 @@
+name: genivi-demo-platform
+kind: stratum
+description: Components which make up the GENIVI demo platform.
+build-depends:
+- morph: genivi/strata/genivi-demo-platform-libs.morph
+- morph: strata/qt5-tools.morph
+- morph: strata/qt5-tools-qtmultimedia.morph
+- morph: strata/qt5-tools-qtwebkit.morph
+- morph: genivi/strata/genivi.morph
+- morph: strata/wayland-generic.morph
+- morph: genivi/strata/weston-genivi.morph
+chunks:
+- name: browser-poc
+ morph: genivi/strata/genivi-demo-platform/browser-poc.morph
+ repo: upstream:genivi/browser-poc
+ ref: d90501f8bd3edcd35eae72efbfb4583ba8f3cdfc
+ unpetrify-ref: baserock/genivi/genivi-demo-platform
+ submodules:
+ documentation/designdocument/cls:
+ url: http://github.com/Pelagicore/Pelagicore-LaTeX-Class.git
+- name: audiomanager-poc
+ morph: genivi/strata/genivi-demo-platform/audiomanager-poc.morph
+ repo: upstream:audiomanager
+ ref: bb65a4d0a18667baa64e5ba40104dc2cda06b299
+ unpetrify-ref: baserock/genivi/genivi-demo-platform
+- name: audiomanager@gdp
+ morph: genivi/strata/genivi-demo-platform/audiomanager@gdp.morph
+ repo: upstream:audiomanager
+ ref: ea8fb493035eb211c097ac4013c89ef99ecc00cc
+ unpetrify-ref: baserock/genivi/6.1-3-gba709ee-gdp
+- name: audiomanagerdemo
+ repo: upstream:genivi/audiomanagerdemo
+ ref: 30b7817bb5c2de17c725d6624d073092d3a821c0
+ unpetrify-ref: master
+ build-system: qmake
+ build-depends:
+ - audiomanager@gdp
+- name: genivi-demo-platform-hmi
+ morph: genivi/strata/genivi-demo-platform/genivi-demo-platform-hmi.morph
+ repo: upstream:genivi/genivi-demo-platform-hmi
+ ref: fd2c954165b0c0f7f4d9e94e8c9c3c8541a53e79
+ unpetrify-ref: master
diff --git a/genivi/strata/genivi-demo-platform/audiomanager-poc.morph b/genivi/strata/genivi-demo-platform/audiomanager-poc.morph
new file mode 100644
index 00000000..6974705b
--- /dev/null
+++ b/genivi/strata/genivi-demo-platform/audiomanager-poc.morph
@@ -0,0 +1,10 @@
+name: audiomanager-poc
+kind: chunk
+pre-configure-commands:
+- sed 's:/opt/:/usr/lib/:g' $(git grep -l "/opt/")
+configure-commands:
+- cd AudioManagerPoC && qmake -makefile
+build-commands:
+- cd AudioManagerPoC && make
+install-commands:
+- cd AudioManagerPoC && make install INSTALL_ROOT="$DESTDIR"
diff --git a/genivi/strata/genivi-demo-platform/audiomanager@gdp.morph b/genivi/strata/genivi-demo-platform/audiomanager@gdp.morph
new file mode 100644
index 00000000..d5e4684a
--- /dev/null
+++ b/genivi/strata/genivi-demo-platform/audiomanager@gdp.morph
@@ -0,0 +1,18 @@
+name: audiomanager@gdp
+kind: chunk
+configure-commands:
+- |
+ cmake -DUSE_BUILD_LIBS=OFF \
+ -DWITH_PULSE_ROUTING_PLUGIN=ON \
+ -DWITH_PULSE_CONTROL_PLUGIN=ON \
+ -DWITH_ENABLED_IPC=DBUS \
+ -DWITH_DATABASE_STORAGE=OFF \
+ -DWITH_DLT=OFF \
+ -DCMAKE_INSTALL_PREFIX="$PREFIX"
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
+# BuildStream builds break if files are installed to /tmp -- the element
+# itself builds fine, but subsequent builds do not.
+- rm -R "$DESTDIR"/tmp/*
diff --git a/genivi/strata/genivi-demo-platform/browser-poc.morph b/genivi/strata/genivi-demo-platform/browser-poc.morph
new file mode 100644
index 00000000..1ca23d40
--- /dev/null
+++ b/genivi/strata/genivi-demo-platform/browser-poc.morph
@@ -0,0 +1,29 @@
+name: browser-poc
+kind: chunk
+description: The GENIVI browser proof-of-concept for the GENIVI Demo Platform.
+configure-commands:
+- qmake -d -r browser-poc.pro
+build-commands:
+- make all
+install-commands:
+- make INSTALL_ROOT="$DESTDIR" install
+- mkdir -p "$DESTDIR/usr/lib/systemd/user"
+- |
+ cat >"$DESTDIR/usr/lib/systemd/user/browser.service" <<EOF
+ [Unit]
+ Description=Genivi Browser PoC service
+ Requires=dbus.service
+
+ [Service]
+ ExecStart=/usr/lib/browser-poc/browser/browser
+ EOF
+- |
+ cat >"$DESTDIR/usr/lib/systemd/user/demoui.service" <<EOF
+ [Unit]
+ Description=Genivi Browser PoC demoui
+ Requires=browser.service
+
+ [Service]
+ Environment=LD_PRELOAD=/usr/lib/libEGL.so
+ ExecStart=/usr/lib/browser-poc/demoui/demoui
+ EOF
diff --git a/genivi/strata/genivi-demo-platform/genivi-demo-platform-hmi.morph b/genivi/strata/genivi-demo-platform/genivi-demo-platform-hmi.morph
new file mode 100644
index 00000000..ae3d645a
--- /dev/null
+++ b/genivi/strata/genivi-demo-platform/genivi-demo-platform-hmi.morph
@@ -0,0 +1,137 @@
+name: genivi-demo-platform-hmi
+kind: chunk
+pre-configure-commands:
+- |
+ sed -i 's/sd_journal_print(LOG_DEBUG,/printf("DEBUG: "/' $(find . -name '*.cpp' -o -name '*.h')
+- |
+ sed -i 's/sd_journal_print(LOG_INFO,/printf("INFO: "/' $(find . -name '*.cpp' -o -name '*.h')
+- |
+ sed -i 's/sd_journal_print(LOG_ERR,/printf("ERR: "/' $(find . -name '*.cpp' -o -name '*.h')
+configure-commands:
+- autoreconf -vfi && ./configure --prefix="$PREFIX"
+- cd app/gdp-hmi-background && qmake
+- cd app/gdp-hmi-launcher2 && qmake
+- cd app/gdp-hmi-panel && qmake
+- cd app/qml-example && qmake
+build-commands:
+- make
+- cd app/gdp-hmi-background && make
+- cd app/gdp-hmi-launcher2 && make
+- cd app/gdp-hmi-panel && make
+- cd app/qml-example && make
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- cd app/gdp-hmi-background && make INSTALL_ROOT="$DESTDIR" install
+- cd app/gdp-hmi-launcher2 && make INSTALL_ROOT="$DESTDIR" install
+- cd app/gdp-hmi-panel && make INSTALL_ROOT="$DESTDIR" install
+- cd app/qml-example && make INSTALL_ROOT="$DESTDIR" install
+- mkdir -p "$DESTDIR"/usr/share/gdp
+- cp -a app/gdp-hmi-background/assets/* "$DESTDIR"/usr/share/gdp/
+- cp -a app/gdp-hmi-launcher2/content/images/* "$DESTDIR"/usr/share/gdp/
+- cp -a app/gdp-hmi-panel/assets/* "$DESTDIR"/usr/share/gdp/
+- mkdir -p "$DESTDIR/usr/lib/systemd/user"
+- mkdir -p "$DESTDIR/usr/lib/systemd/user/default.target.wants"
+- |
+ cat >"$DESTDIR/usr/lib/systemd/user/gdp-hmi-launcher2.service" <<EOF
+ [Unit]
+ Description=GENIVI Demo Platform HMI - Launcher2
+ Requires=gdp-hmi-controller.service
+
+ [Service]
+ Environment=LD_PRELOAD=/usr/lib/libEGL.so
+ ExecStart=/usr/bin/gdp-hmi-launcher2
+
+ [Install]
+ WantedBy=default.target
+ EOF
+- cd "$DESTDIR/usr/lib/systemd/user/default.target.wants" && ln -s ../gdp-hmi-launcher2.service .
+- |
+ cat >"$DESTDIR/usr/lib/systemd/user/gdp-hmi-background.service" <<EOF
+ [Unit]
+ Description=GENIVI Demo Platform HMI - Background
+ Requires=gdp-hmi-controller.service
+ After=gdp-hmi-controller.service
+
+ [Service]
+ Environment=LD_PRELOAD=/usr/lib/libEGL.so
+ ExecStart=/usr/bin/gdp-hmi-background
+
+ [Install]
+ WantedBy=default.target
+ EOF
+- cd "$DESTDIR/usr/lib/systemd/user/default.target.wants" && ln -s ../gdp-hmi-background.service .
+- |
+ cat >"$DESTDIR/usr/lib/systemd/user/gdp-hmi-controller.service" <<EOF
+ [Unit]
+ Description=GENIVI Demo Platform HMI - Controller
+ Requires=dbus.service
+ After=dbus.service weston.service
+
+ [Service]
+ ExecStart=/usr/bin/gdp-hmi-controller
+ Restart=always
+ RestartSec=2
+ TimeoutStopSec=1
+
+ [Install]
+ WantedBy=default.target
+ EOF
+- cd "$DESTDIR/usr/lib/systemd/user/default.target.wants" && ln -s ../gdp-hmi-controller.service .
+- |
+ cat >"$DESTDIR/usr/lib/systemd/user/gdp-hmi-panel.service" <<EOF
+ [Unit]
+ Description=GENIVI Demo Platform HMI - Panel
+ Requires=gdp-hmi-controller.service
+ After=gdp-hmi-background.service
+ After=EGLWLMockNavigation.service
+ After=EGLWLInputEventExample.service
+ After=demoui.service
+ After=qml-example.service
+
+ [Service]
+ Environment=LD_PRELOAD=/usr/lib/libEGL.so
+ ExecStart=/usr/bin/gdp-hmi-panel
+
+ [Install]
+ WantedBy=default.target
+ EOF
+- mkdir -p "$DESTDIR/usr/lib/systemd/user/EGLWLMockNavigation.service.wants"
+- cd "$DESTDIR/usr/lib/systemd/user/EGLWLMockNavigation.service.wants" && ln -s ../gdp-hmi-panel.service .
+- mkdir -p "$DESTDIR/usr/lib/systemd/user/EGLWLInputEventExample.service.wants"
+- cd "$DESTDIR/usr/lib/systemd/user/EGLWLInputEventExample.service.wants" && ln -s ../gdp-hmi-panel.service .
+- mkdir -p "$DESTDIR/usr/lib/systemd/user/demoui.service.wants"
+- cd "$DESTDIR/usr/lib/systemd/user/demoui.service.wants" && ln -s ../gdp-hmi-panel.service .
+- mkdir -p "$DESTDIR/usr/lib/systemd/user/qml-example.service.wants"
+- cd "$DESTDIR/usr/lib/systemd/user/qml-example.service.wants" && ln -s ../gdp-hmi-panel.service .
+- |
+ cat >"$DESTDIR/usr/lib/systemd/user/EGLWLMockNavigation.service" <<EOF
+ [Unit]
+ Description=EGL Wayland Mock Navigation
+
+ [Service]
+ ExecStart=/usr/bin/EGLWLMockNavigation -surface 10
+ EOF
+- |
+ cat > "$DESTDIR/usr/lib/systemd/user/EGLWLInputEventExample.service" <<EOF
+ [Unit]
+ Description=EGL Wayland Input Event Example
+
+ [Service]
+ ExecStart=/usr/bin/EGLWLInputEventExample --surface=5100
+ EOF
+- |
+ cat > "$DESTDIR/usr/lib/systemd/user/qml-example.service" <<EOF
+ [Unit]
+ Description=Genivi QML Example
+
+ [Service]
+ ExecStart=/usr/bin/qml-example
+ EOF
+- |
+ cat > "$DESTDIR/usr/lib/systemd/user/PowerOff.service" <<EOF
+ [Unit]
+ Description=HMI poweroff
+
+ [Service]
+ ExecStart=/bin/systemctl poweroff
+ EOF
diff --git a/genivi/strata/genivi-demo-platform/mm-common.morph b/genivi/strata/genivi-demo-platform/mm-common.morph
new file mode 100644
index 00000000..4f416e7c
--- /dev/null
+++ b/genivi/strata/genivi-demo-platform/mm-common.morph
@@ -0,0 +1,7 @@
+name: mm-common
+kind: chunk
+description: Common build files of the GNOME C++ bindings.
+build-system: autotools
+configure-commands:
+- ./autogen.sh
+- ./configure --prefix="$PREFIX"
diff --git a/genivi/strata/genivi.morph b/genivi/strata/genivi.morph
new file mode 100644
index 00000000..29b9d2fc
--- /dev/null
+++ b/genivi/strata/genivi.morph
@@ -0,0 +1,119 @@
+name: genivi
+kind: stratum
+description: Software components designed by genivi, for genivi.
+build-depends:
+- morph: strata/foundation.morph
+- morph: strata/sound-server-pulseaudio.morph
+- morph: strata/cpp-common-libs.morph
+chunks:
+- name: linuxquota
+ morph: genivi/strata/genivi/linuxquota.morph
+ repo: upstream:linuxquota
+ ref: 0804c89a16736533e440771dc42a15e5d0223902
+ unpetrify-ref: baserock/genivi/morph
+- name: DLT-daemon
+ morph: genivi/strata/genivi/DLT-daemon.morph
+ repo: upstream:DLT-daemon
+ ref: e9a486a08fff6d3cc7133a350cec3ee10f463207
+ unpetrify-ref: v2.15.0
+- name: node-startup-controller
+ morph: genivi/strata/genivi/node-startup-controller.morph
+ repo: upstream:node-startup-controller
+ ref: b77fb1dbb280ec45525853e52a362eafd736b400
+ unpetrify-ref: baserock/systemd_v216
+ build-depends:
+ - DLT-daemon
+- name: googletest
+ morph: genivi/strata/genivi/googletest.morph
+ repo: upstream:googletest
+ ref: 5e3f7d3db4c16e2ba8b42b0bf4689f7d2abbcb08
+ unpetrify-ref: baserock/morph
+- name: googlemock
+ morph: genivi/strata/genivi/googlemock.morph
+ repo: upstream:googlemock
+ ref: 0e9998c140079046c396a0e7033bb465abae79cd
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - googletest
+- name: genivi-common-api-runtime
+ morph: genivi/strata/genivi/genivi-common-api-runtime.morph
+ repo: upstream:genivi-common-api-runtime
+ ref: 77d9cdaf6acee03a1e360e0e1a3cd0b01a95b407
+ unpetrify-ref: 3.1.5
+- name: genivi-common-api-dbus-runtime
+ morph: genivi/strata/genivi/genivi-common-api-dbus-runtime.morph
+ repo: upstream:genivi-common-api-dbus-runtime
+ ref: 3348a422ffc756b63de5890356383858a898e8b1
+ unpetrify-ref: 3.1.5
+ build-depends:
+ - genivi-common-api-runtime
+- name: audiomanager
+ repo: upstream:audiomanager
+ ref: 5bcd206b9270d9a79e212f91723ea1a08a4d4859
+ unpetrify-ref: '7.4'
+ build-system: cmake
+ build-depends:
+ - DLT-daemon
+ - googletest
+ - googlemock
+ - genivi-common-api-runtime
+ - genivi-common-api-dbus-runtime
+- name: itzam-tarball
+ morph: genivi/strata/genivi/itzam-tarball.morph
+ repo: upstream:itzam-tarball
+ ref: 4ebcf671416927b64475da7b810b6016c847bf73
+ unpetrify-ref: baserock/genivi/baseline
+- name: persistence-common-object
+ morph: genivi/strata/genivi/persistence-common-object.morph
+ repo: upstream:genivi/persistence-common-object
+ ref: 395b0f504e05ee6c59c1b9d9267c793e072a19ba
+ unpetrify-ref: master
+ build-depends:
+ - itzam-tarball
+ - DLT-daemon
+- name: persistence-client-library
+ repo: upstream:genivi/persistence-client-library
+ ref: 4b503da99c6b04ad21a197dafe6e7243187c7c7e
+ unpetrify-ref: v1.1.0
+ build-system: autotools
+ build-depends:
+ - persistence-common-object
+ - DLT-daemon
+ - itzam-tarball
+- name: node-state-manager
+ repo: upstream:node-state-manager
+ ref: 30add4659e002f1df205cc36f71ef3141c10c1fb
+ unpetrify-ref: baserock/systemd_v216
+ build-system: autotools
+ build-depends:
+ - DLT-daemon
+ - persistence-client-library
+- name: json-c
+ morph: genivi/strata/genivi/json-c.morph
+ repo: upstream:json-c
+ ref: 365dabd8e6fa86da2add0889e448749e334e9164
+ unpetrify-ref: baserock/json-c-0.12-20140410-plus-patch
+- name: persistence-administrator
+ morph: genivi/strata/genivi/persistence-administrator.morph
+ repo: upstream:genivi/persistence-administrator
+ ref: 47e5a424c8ef6e33565737f20d3bd81f69c8efc9
+ unpetrify-ref: master
+ build-depends:
+ - persistence-common-object
+ - DLT-daemon
+ - json-c
+ - node-state-manager
+- name: node-health-monitor
+ repo: upstream:genivi/node-health-monitor
+ ref: 61f88bc9fc03c278664e05431ffb5933ff6007f1
+ unpetrify-ref: baserock/1.3.5
+ build-system: autotools
+ build-depends:
+ - node-state-manager
+ - persistence-client-library
+ - DLT-daemon
+- name: vSomeIP
+ repo: upstream:genivi/vSomeIP
+ ref: 2b7442a4c2452f8f3bd9e0f09f829478256d39af
+ unpetrify-ref: 2.0.1
+ build-system: cmake
diff --git a/genivi/strata/genivi/DLT-daemon.morph b/genivi/strata/genivi/DLT-daemon.morph
new file mode 100644
index 00000000..19ffd3b5
--- /dev/null
+++ b/genivi/strata/genivi/DLT-daemon.morph
@@ -0,0 +1,7 @@
+name: DLT-daemon
+kind: chunk
+build-system: cmake
+configure-commands:
+- cmake -DCMAKE_INSTALL_PREFIX="$PREFIX"
+ -DCMAKE_INSTALL_LIBDIR="$PREFIX/lib"
+ -DWITH_SYSTEMD=ON
diff --git a/genivi/strata/genivi/genivi-common-api-dbus-runtime.morph b/genivi/strata/genivi/genivi-common-api-dbus-runtime.morph
new file mode 100644
index 00000000..fa8742a0
--- /dev/null
+++ b/genivi/strata/genivi/genivi-common-api-dbus-runtime.morph
@@ -0,0 +1,3 @@
+name: genivi-common-api-dbus-runtime
+kind: chunk
+build-system: cmake
diff --git a/genivi/strata/genivi/genivi-common-api-runtime.morph b/genivi/strata/genivi/genivi-common-api-runtime.morph
new file mode 100644
index 00000000..1c4a66c2
--- /dev/null
+++ b/genivi/strata/genivi/genivi-common-api-runtime.morph
@@ -0,0 +1,3 @@
+name: genivi-common-api-runtime
+kind: chunk
+build-system: cmake
diff --git a/genivi/strata/genivi/googlemock.morph b/genivi/strata/genivi/googlemock.morph
new file mode 100644
index 00000000..b3eaa952
--- /dev/null
+++ b/genivi/strata/genivi/googlemock.morph
@@ -0,0 +1,8 @@
+name: googlemock
+kind: chunk
+build-system: autotools
+configure-commands:
+- mkdir -p gtest/m4
+- ln -s /usr/share/gtest/m4/acx_pthread.m4 gtest/m4/acx_pthread.m4
+- autoreconf -ivf
+- ./configure --prefix="$PREFIX"
diff --git a/genivi/strata/genivi/googletest.morph b/genivi/strata/genivi/googletest.morph
new file mode 100644
index 00000000..7723c721
--- /dev/null
+++ b/genivi/strata/genivi/googletest.morph
@@ -0,0 +1,7 @@
+name: googletest
+kind: chunk
+build-system: autotools
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- mkdir -p $DESTDIR/usr/share/gtest/m4
+- install -m 644 m4/acx_pthread.m4 $DESTDIR/usr/share/gtest/m4
diff --git a/genivi/strata/genivi/itzam-tarball.morph b/genivi/strata/genivi/itzam-tarball.morph
new file mode 100644
index 00000000..eaf2db61
--- /dev/null
+++ b/genivi/strata/genivi/itzam-tarball.morph
@@ -0,0 +1,10 @@
+name: itzam-tarball
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- sed -i 's/GENERIC_LIBRARY_NAME=libitzam/GENERIC_LIBRARY_NAME=itzam/g' configure.ac
+- mkdir m4
+- touch NEWS README AUTHORS ChangeLog
+- autoreconf -ivf
+post-install-commands:
+- install -D -m644 libitzam.pc "$DESTDIR$PREFIX/lib/pkgconfig/libitzam.pc"
diff --git a/genivi/strata/genivi/json-c.morph b/genivi/strata/genivi/json-c.morph
new file mode 100644
index 00000000..c3d9243c
--- /dev/null
+++ b/genivi/strata/genivi/json-c.morph
@@ -0,0 +1,7 @@
+name: json-c
+kind: chunk
+description: JSON C Library
+build-system: autotools
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- install -m755 json_object_iterator.h "$DESTDIR/usr/include/json"
diff --git a/genivi/strata/genivi/linuxquota.morph b/genivi/strata/genivi/linuxquota.morph
new file mode 100644
index 00000000..826696ad
--- /dev/null
+++ b/genivi/strata/genivi/linuxquota.morph
@@ -0,0 +1,10 @@
+name: linuxquota
+kind: chunk
+build-system: autotools
+configure-commands:
+- autoreconf -ivf
+- ./configure --prefix="$PREFIX"
+build-commands:
+- make "RPCGEN=rpcgen -Y /usr/bin"
+install-commands:
+- make ROOTDIR="$DESTDIR" install
diff --git a/genivi/strata/genivi/node-startup-controller.morph b/genivi/strata/genivi/node-startup-controller.morph
new file mode 100644
index 00000000..d3d6dc77
--- /dev/null
+++ b/genivi/strata/genivi/node-startup-controller.morph
@@ -0,0 +1,9 @@
+name: node-startup-controller
+kind: chunk
+configure-commands:
+- sh autogen.sh
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/genivi/strata/genivi/persistence-administrator.morph b/genivi/strata/genivi/persistence-administrator.morph
new file mode 100644
index 00000000..f4fd07a5
--- /dev/null
+++ b/genivi/strata/genivi/persistence-administrator.morph
@@ -0,0 +1,5 @@
+name: persistence-administrator
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- chmod +x autogen.sh
diff --git a/genivi/strata/genivi/persistence-common-object.morph b/genivi/strata/genivi/persistence-common-object.morph
new file mode 100644
index 00000000..179a6031
--- /dev/null
+++ b/genivi/strata/genivi/persistence-common-object.morph
@@ -0,0 +1,5 @@
+name: persistence-common-object
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- chmod +x autogen.sh
diff --git a/genivi/strata/weston-genivi.morph b/genivi/strata/weston-genivi.morph
new file mode 100644
index 00000000..a684645e
--- /dev/null
+++ b/genivi/strata/weston-genivi.morph
@@ -0,0 +1,21 @@
+name: weston-genivi
+kind: stratum
+build-depends:
+- morph: strata/graphics-common.morph
+- morph: strata/input-common.morph
+- morph: strata/mesa-common.morph
+- morph: strata/libdrm-common.morph
+- morph: strata/wayland-generic.morph
+chunks:
+- name: weston
+ morph: genivi/strata/weston-genivi/weston.morph
+ repo: upstream:weston
+ ref: 2e5232b980eaa1074023a65dd7941e80b72a763c
+ unpetrify-ref: baserock/weston-1.11.0/tegra
+- name: wayland-ivi-extension
+ morph: genivi/strata/weston-genivi/wayland-ivi-extension.morph
+ repo: upstream:genivi/wayland-ivi-extension
+ ref: 6c2823684105c0bd46aaeca817fe5d87e7c6da25
+ unpetrify-ref: 1.10.90
+ build-depends:
+ - weston
diff --git a/genivi/strata/weston-genivi/wayland-ivi-extension.morph b/genivi/strata/weston-genivi/wayland-ivi-extension.morph
new file mode 100644
index 00000000..08d43bac
--- /dev/null
+++ b/genivi/strata/weston-genivi/wayland-ivi-extension.morph
@@ -0,0 +1,8 @@
+name: wayland-ivi-extension
+kind: chunk
+configure-commands:
+- cmake -DWITH_ILM_INPUT=ON -DCMAKE_INSTALL_PREFIX="$PREFIX" -DCMAKE_C_FLAGS="-I/usr/include/weston"
+build-commands:
+- make
+install-commands:
+- make install DESTDIR="$DESTDIR"
diff --git a/genivi/strata/weston-genivi/weston.morph b/genivi/strata/weston-genivi/weston.morph
new file mode 100644
index 00000000..ff1d6a9c
--- /dev/null
+++ b/genivi/strata/weston-genivi/weston.morph
@@ -0,0 +1,86 @@
+name: weston
+kind: chunk
+description: weston compositor
+build-system: autotools
+configure-commands:
+- autoreconf -ivf
+- |
+ LDFLAGS='-L/lib64 -lrt' \
+ ./configure --prefix=$PREFIX --disable-xwayland \
+ --disable-x11-compositor \
+ --disable-wayland-compositor --enable-egl \
+ --enable-clients --enable-demo-clients-install --enable-fbdev-compositor
+post-install-commands:
+- install -d "$DESTDIR/usr/share/weston"
+- install -m 0644 data/*.png "$DESTDIR/usr/share/weston/"
+- cp ivi-shell/weston.ini ivi-shell/ivi-shell-weston.ini
+
+# Generate ivi-shell-weston config used for GENIVI Baseline
+- sed -i 's,/weston.build/data/,/usr/share/weston/,g' ivi-shell/ivi-shell-weston.ini
+- sed -i 's,/weston.build/clients/,/usr/bin/,g' ivi-shell/ivi-shell-weston.ini
+- sed -i 's,/weston.build/,/usr/libexec/,g' ivi-shell/ivi-shell-weston.ini
+- sed -i '/^\[ivi-launcher\]/,$d' ivi-shell/ivi-shell-weston.ini
+- |
+ cat <<EOF >> ivi-shell/ivi-shell-weston.ini
+ [ivi-launcher]
+ workspace-id=0
+ icon-id=4001
+ icon=/usr/share/weston/icon_ivi_flower.png
+ path=/usr/bin/weston-flower
+
+ [ivi-launcher]
+ workspace-id=0
+ icon-id=4002
+ icon=/usr/share/weston/icon_ivi_clickdot.png
+ path=/usr/bin/weston-clickdot
+
+ [ivi-launcher]
+ workspace-id=1
+ icon-id=4003
+ icon=/usr/share/weston/icon_ivi_simple-egl.png
+ path=/usr/bin/weston-simple-egl
+
+ [ivi-launcher]
+ workspace-id=1
+ icon-id=4004
+ icon=/usr/share/weston/icon_ivi_simple-shm.png
+ path=/usr/bin/weston-simple-shm
+
+ [ivi-launcher]
+ workspace-id=2
+ icon-id=4005
+ icon=/usr/share/weston/icon_ivi_smoke.png
+ path=/usr/bin/weston-smoke
+
+ [ivi-launcher]
+ workspace-id=2
+ icon-id=4006
+ icon=/usr/share/weston/terminal.png
+ path=/usr/bin/EGLWLMockNavigation
+ EOF
+
+# Generate gdp-weston config used for GENIVI Demo Platform
+- |
+ cat <<EOF > ivi-shell/gdp-weston.ini
+ [core]
+ shell=ivi-shell.so
+
+ [ivi-shell]
+ ivi-module=ivi-controller.so
+ ivi-input-module=ivi-input-controller.so
+
+ cursor-theme=default
+ cursor-size=32
+
+ base-layer-id=1000
+ workspace-background-layer-id=2000
+ workspace-layer-id=3000
+ application-layer-id=4000
+
+ transition-duration=300
+ EOF
+
+# Install both config files to decide later which one to use
+- install -d "$DESTDIR/usr/share/doc/weston"
+- install -m 0644 ivi-shell/ivi-shell-weston.ini "$DESTDIR/usr/share/doc/weston/ivi-shell-weston.ini"
+- install -m 0644 ivi-shell/gdp-weston.ini "$DESTDIR/usr/share/doc/weston/gdp-weston.ini"
diff --git a/genivi/systems/genivi-baseline-system-armv7lhf-jetson.morph b/genivi/systems/genivi-baseline-system-armv7lhf-jetson.morph
new file mode 100644
index 00000000..e2145b6f
--- /dev/null
+++ b/genivi/systems/genivi-baseline-system-armv7lhf-jetson.morph
@@ -0,0 +1,56 @@
+name: genivi-baseline-system-armv7lhf-jetson
+kind: system
+description: A GENIVI baseline system for a Jetson TK.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-jetson
+ morph: strata/bsp-jetson.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: connman-common
+ morph: strata/connman-common.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: genivi
+ morph: genivi/strata/genivi.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: weston-genivi
+ morph: genivi/strata/weston-genivi.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/strip-gplv3
+- extensions/fstab
+- extensions/install-essential-files
+- extensions/genivi
diff --git a/genivi/systems/genivi-baseline-system-armv7lhf-versatile.morph b/genivi/systems/genivi-baseline-system-armv7lhf-versatile.morph
new file mode 100644
index 00000000..35104513
--- /dev/null
+++ b/genivi/systems/genivi-baseline-system-armv7lhf-versatile.morph
@@ -0,0 +1,54 @@
+name: genivi-baseline-system-armv7lhf-versatile
+kind: system
+description: A GENIVI baseline system for an ARMv7 system.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7-versatile
+ morph: strata/bsp-armv7-versatile.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: connman-common
+ morph: strata/connman-common.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: genivi
+ morph: genivi/strata/genivi.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: weston-genivi
+ morph: genivi/strata/weston-genivi.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/strip-gplv3
+- extensions/fstab
+- extensions/install-essential-files
+- extensions/genivi
diff --git a/genivi/systems/genivi-baseline-system-x86_64-generic.morph b/genivi/systems/genivi-baseline-system-x86_64-generic.morph
new file mode 100644
index 00000000..ec32952c
--- /dev/null
+++ b/genivi/systems/genivi-baseline-system-x86_64-generic.morph
@@ -0,0 +1,57 @@
+name: genivi-baseline-system-x86_64-generic
+kind: system
+description: A GENIVI baseline system for a 64-bit x86 system.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: connman-common
+ morph: strata/connman-common.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: genivi
+ morph: genivi/strata/genivi.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: llvm-common
+ morph: strata/llvm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: weston-genivi
+ morph: genivi/strata/weston-genivi.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/strip-gplv3
+- extensions/install-essential-files
+- extensions/genivi
diff --git a/genivi/systems/genivi-demo-platform-armv7lhf-jetson.morph b/genivi/systems/genivi-demo-platform-armv7lhf-jetson.morph
new file mode 100644
index 00000000..e729c314
--- /dev/null
+++ b/genivi/systems/genivi-demo-platform-armv7lhf-jetson.morph
@@ -0,0 +1,83 @@
+name: genivi-demo-platform-armv7lhf-jetson
+kind: system
+description: A GENIVI demo platform for a 64-bit x86 system.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: cpp-common-libs
+ morph: strata/cpp-common-libs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-jetson
+ morph: strata/bsp-jetson.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: connman-common
+ morph: strata/connman-common.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: navigation
+ morph: strata/navigation.morph
+- name: genivi
+ morph: genivi/strata/genivi.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: ivi-common
+ morph: strata/ivi-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: weston-genivi
+ morph: genivi/strata/weston-genivi.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+- name: qt5-tools
+ morph: strata/qt5-tools.morph
+- name: qt5-tools-qtmultimedia
+ morph: strata/qt5-tools-qtmultimedia.morph
+- name: qt5-tools-qtwebkit
+ morph: strata/qt5-tools-qtwebkit.morph
+- name: qt5-tools-qtwayland
+ morph: strata/qt5-tools-qtwayland.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: genivi-demo-platform-libs
+ morph: genivi/strata/genivi-demo-platform-libs.morph
+- name: genivi-demo-platform
+ morph: genivi/strata/genivi-demo-platform.morph
+- name: tools
+ morph: strata/tools.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
+- extensions/genivi
diff --git a/genivi/systems/genivi-demo-platform-x86_32-generic.morph b/genivi/systems/genivi-demo-platform-x86_32-generic.morph
new file mode 100644
index 00000000..a18bbe28
--- /dev/null
+++ b/genivi/systems/genivi-demo-platform-x86_32-generic.morph
@@ -0,0 +1,85 @@
+name: genivi-demo-platform-x86_32-generic
+kind: system
+description: A GENIVI demo platform for a 32-bit x86 system.
+arch: x86_32
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: cpp-common-libs
+ morph: strata/cpp-common-libs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_32-generic
+ morph: strata/bsp-x86_32-generic.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: connman-common
+ morph: strata/connman-common.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: navigation
+ morph: strata/navigation.morph
+- name: genivi
+ morph: genivi/strata/genivi.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: ivi-common
+ morph: strata/ivi-common.morph
+- name: llvm-common
+ morph: strata/llvm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: weston-genivi
+ morph: genivi/strata/weston-genivi.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+- name: qt5-tools
+ morph: strata/qt5-tools.morph
+- name: qt5-tools-qtmultimedia
+ morph: strata/qt5-tools-qtmultimedia.morph
+- name: qt5-tools-qtwebkit
+ morph: strata/qt5-tools-qtwebkit.morph
+- name: qt5-tools-qtwayland
+ morph: strata/qt5-tools-qtwayland.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: genivi-demo-platform-libs
+ morph: genivi/strata/genivi-demo-platform-libs.morph
+- name: genivi-demo-platform
+ morph: genivi/strata/genivi-demo-platform.morph
+- name: tools
+ morph: strata/tools.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
+- extensions/genivi
diff --git a/genivi/systems/genivi-demo-platform-x86_64-generic.morph b/genivi/systems/genivi-demo-platform-x86_64-generic.morph
new file mode 100644
index 00000000..a14216bc
--- /dev/null
+++ b/genivi/systems/genivi-demo-platform-x86_64-generic.morph
@@ -0,0 +1,85 @@
+name: genivi-demo-platform-x86_64-generic
+kind: system
+description: A GENIVI demo platform for a 64-bit x86 system.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: cpp-common-libs
+ morph: strata/cpp-common-libs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: connman-common
+ morph: strata/connman-common.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: navigation
+ morph: strata/navigation.morph
+- name: genivi
+ morph: genivi/strata/genivi.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: ivi-common
+ morph: strata/ivi-common.morph
+- name: llvm-common
+ morph: strata/llvm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: weston-genivi
+ morph: genivi/strata/weston-genivi.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+- name: qt5-tools
+ morph: strata/qt5-tools.morph
+- name: qt5-tools-qtmultimedia
+ morph: strata/qt5-tools-qtmultimedia.morph
+- name: qt5-tools-qtwebkit
+ morph: strata/qt5-tools-qtwebkit.morph
+- name: qt5-tools-qtwayland
+ morph: strata/qt5-tools-qtwayland.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: genivi-demo-platform-libs
+ morph: genivi/strata/genivi-demo-platform-libs.morph
+- name: genivi-demo-platform
+ morph: genivi/strata/genivi-demo-platform.morph
+- name: tools
+ morph: strata/tools.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
+- extensions/genivi
diff --git a/gnome/clusters/gnome-system-armv7lhf-jetson-deploy.morph b/gnome/clusters/gnome-system-armv7lhf-jetson-deploy.morph
new file mode 100644
index 00000000..4b9739a0
--- /dev/null
+++ b/gnome/clusters/gnome-system-armv7lhf-jetson-deploy.morph
@@ -0,0 +1,17 @@
+name: gnome-system-armv7lhf-jetson-deploy
+kind: cluster
+description: Deploy a GNOME system.
+systems:
+- morph: gnome/systems/gnome-system-armv7lhf-jetson.morph
+ deploy:
+ gnome-system-armv7lhf-jetson:
+ type: extensions/rawdisk
+ location: gnome-system-armv7lhf-jetson.img
+ DISK_SIZE: 7G
+ BOOT_DEVICE: /dev/mmcblk0p1
+ ROOT_DEVICE: /dev/mmcblk0p2
+ DTB_PATH: boot/tegra124-jetson-tk1.dtb
+ BOOTLOADER_CONFIG_FORMAT: extlinux
+ BOOTLOADER_INSTALL: none
+ KERNEL_ARGS: cma=256M console=tty0 console=ttyS0,115200n8 no_console_suspend=1
+ nouveau.pstate=1
diff --git a/gnome/clusters/gnome-system-x86_64-deploy.morph b/gnome/clusters/gnome-system-x86_64-deploy.morph
new file mode 100644
index 00000000..faa036ce
--- /dev/null
+++ b/gnome/clusters/gnome-system-x86_64-deploy.morph
@@ -0,0 +1,24 @@
+name: gnome-system-x86_64-deploy
+kind: cluster
+description: |
+ Deploy a stock weston system.
+
+ The resulting image can be copied to a USB and booted from there,
+ as well as in a virtual machine.
+
+systems:
+- morph: gnome/systems/gnome-system-x86_64.morph
+ deploy:
+ gnome-system-x86_64:
+ type: extensions/rawdisk
+ location: /gnome-system-x86_64.img
+ DISK_SIZE: 7G
+ INSTALL_FILES: install-files/gnome/manifest
+ KERNEL_ARGS: vga=788
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ initramfs:
+ type: initramfs
+ location: boot/initramfs.gz
diff --git a/gnome/strata/flatpak-common.morph b/gnome/strata/flatpak-common.morph
new file mode 100644
index 00000000..fb9fae2b
--- /dev/null
+++ b/gnome/strata/flatpak-common.morph
@@ -0,0 +1,24 @@
+name: flatpak-common
+kind: stratum
+build-depends:
+- morph: strata/ostree-core.morph
+- morph: strata/privileges-management.morph
+- morph: strata/x-common.morph
+chunks:
+- name: elfutils
+ morph: gnome/strata/flatpak-common/elfutils.morph
+ repo: upstream:elfutils
+ ref: 515dd0acc77673c953380bcf5ccfb05b83c5a3ab
+ unpetrify-ref: elfutils-0.168
+- name: flatpak
+ morph: gnome/strata/flatpak-common/flatpak.morph
+ repo: upstream:flatpak
+ ref: 07b342a937ed562a59aa649d793771babee57a09
+ unpetrify-ref: 0.6.8
+ build-depends:
+ - elfutils
+ submodules:
+ libglnx:
+ url: upstream:libglnx
+ bubblewrap:
+ url: upstream:bubblewrap
diff --git a/gnome/strata/flatpak-common/elfutils.morph b/gnome/strata/flatpak-common/elfutils.morph
new file mode 100644
index 00000000..45707250
--- /dev/null
+++ b/gnome/strata/flatpak-common/elfutils.morph
@@ -0,0 +1,7 @@
+name: elfutils
+kind: chunk
+build-system: autotools
+configure-commands:
+- autoreconf -fi
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var
+ --enable-maintainer-mode
diff --git a/gnome/strata/flatpak-common/flatpak.morph b/gnome/strata/flatpak-common/flatpak.morph
new file mode 100644
index 00000000..e052c2a3
--- /dev/null
+++ b/gnome/strata/flatpak-common/flatpak.morph
@@ -0,0 +1,5 @@
+name: flatpak
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-documentation
diff --git a/gnome/strata/gnome.morph b/gnome/strata/gnome.morph
new file mode 100644
index 00000000..071f4024
--- /dev/null
+++ b/gnome/strata/gnome.morph
@@ -0,0 +1,969 @@
+name: gnome
+kind: stratum
+description: GNOME stratum
+build-depends:
+- morph: strata/bluetooth.morph
+- morph: strata/icu-common.morph
+- morph: strata/input-common.morph
+- morph: strata/data-indexing-management.morph
+- morph: strata/vala-common.morph
+- morph: strata/geolocation.morph
+- morph: strata/gtk2.morph
+- morph: strata/gtk3.morph
+- morph: strata/libsoup-common.morph
+- morph: strata/NetworkManager-common.morph
+- morph: strata/multimedia-gstreamer.morph
+- morph: strata/network-security.morph
+- morph: strata/privileges-management.morph
+- morph: strata/python3-gobject.morph
+- morph: strata/wayland-generic.morph
+- morph: strata/ruby.morph
+- morph: strata/samba.morph
+- morph: strata/secret-service.morph
+- morph: strata/sound-server-pulseaudio.morph
+- morph: strata/spell-checking.morph
+- morph: strata/cups.morph
+chunks:
+- name: dconf
+ morph: gnome/strata/gnome/dconf.morph
+ repo: upstream:dconf
+ ref: 7c0beccf286a1dbd396fda7d40b438598a6ce7f4
+ unpetrify-ref: master
+- name: cogl
+ morph: gnome/strata/gnome/cogl.morph
+ repo: upstream:gnome/cogl
+ ref: 85e0b084592e6beef2987b02e34a3909f35708e0
+ unpetrify-ref: cogl-1.22
+- name: clutter
+ morph: gnome/strata/gnome/clutter.morph
+ repo: upstream:gnome/clutter
+ ref: 2faa83baf3ce9b9c94635311ad79944ab2a73c84
+ unpetrify-ref: 1.26.2
+ build-depends:
+ - cogl
+- name: clutter-gtk
+ repo: upstream:gnome/clutter-gtk
+ ref: d48408a24672fa553034a0b3749bee930ad7c49d
+ unpetrify-ref: 1.8.2
+ build-system: autotools
+ build-depends:
+ - clutter
+- name: libchamplain
+ morph: gnome/strata/gnome/libchamplain.morph
+ repo: upstream:gnome/libchamplain
+ ref: c873d9d8116b8e14c1bfa939439d763926a77446
+ unpetrify-ref: LIBCHAMPLAIN_0_12_12
+ build-depends:
+ - clutter
+ - clutter-gtk
+- name: gsettings-desktop-schemas
+ repo: upstream:gnome/gsettings-desktop-schemas
+ ref: a5c759a1d9d7e4825f94da30f0f8fb8abc2e3efb
+ unpetrify-ref: 3.24.0
+ build-system: autotools
+- name: itstool
+ repo: upstream:itstool
+ ref: 359be5c350fc3d869807f663cee2b028adf1f5d7
+ unpetrify-ref: master
+ build-system: autotools
+- name: yelp-xsl
+ repo: upstream:yelp-xsl
+ ref: 2dcf168dde754d18152b008473269a803d6e650b
+ unpetrify-ref: master
+ build-depends:
+ - itstool
+ build-system: autotools
+- name: yelp-tools
+ repo: upstream:yelp-tools
+ ref: 6df6bf24e385bbc1ac0b800be8a6e878f18a775c
+ unpetrify-ref: master
+ build-depends:
+ - itstool
+ - yelp-xsl
+ build-system: autotools
+- name: iso-codes
+ repo: upstream:iso-codes
+ ref: 18ac112b4b84c8f03743565fde3512a637820761
+ unpetrify-ref: master
+ build-system: autotools
+- name: gnome-desktop
+ repo: upstream:gnome/gnome-desktop
+ ref: 3feec7a250265747f204e220f7acfe6b8d849dca
+ unpetrify-ref: 3.24.2
+ build-depends:
+ - gsettings-desktop-schemas
+ - iso-codes
+ - yelp-tools
+ build-system: autotools
+- name: libnotify
+ repo: upstream:gnome/libnotify
+ ref: 2f2c5649ef210b1dffeb46cddf062d20e1518ccf
+ unpetrify-ref: master
+ build-system: autotools
+- name: lcms2
+ repo: upstream:lcms2
+ ref: ff42eeaf932b64af997681f0eed6be3b67ebeb18
+ unpetrify-ref: baserock/gnome
+ build-system: autotools
+- name: gconf
+ morph: gnome/strata/gnome/gconf.morph
+ repo: upstream:gconf
+ ref: 4ef012c2a62d9abd759adb3aeb9d3b9cee17f721
+ unpetrify-ref: master
+- name: ibus
+ morph: gnome/strata/gnome/ibus.morph
+ repo: upstream:ibus
+ ref: 1d678673e18e132ed53df32502b779b0a56314d5
+ unpetrify-ref: master
+ build-depends:
+ - dconf
+ - gconf
+ - iso-codes
+ - libnotify
+- name: libhangul
+ morph: gnome/strata/gnome/libhangul.morph
+ repo: upstream:libhangul
+ ref: 78e9d8926262db423b4cf9181e1c2cb06a120a9b
+ unpetrify-ref: baserock/libhangul-0.1.0-19-g78e9d89
+- name: ibus-hangul
+ morph: gnome/strata/gnome/ibus-hangul.morph
+ repo: upstream:ibus-hangul
+ ref: 44f41ae5178372a7ff0540a4ce7a4944335525df
+ unpetrify-ref: baserock/1.5.0-13-g44f41ae
+ build-depends:
+ - ibus
+ - libhangul
+- name: berkeleydb
+ morph: gnome/strata/gnome/berkeleydb.morph
+ repo: upstream:berkeleydb
+ ref: 780b92ada9afcf1d58085a83a0b9e6bc982203d1
+ unpetrify-ref: db-6.1.23
+- name: libpinyin
+ repo: upstream:libpinyin
+ ref: 2e0c23b3ab6c247dd6a683c716e784a371646af4
+ unpetrify-ref: baserock/1.2.91
+ build-system: autotools
+ build-depends:
+ - berkeleydb
+- name: ibus-libpinyin
+ morph: gnome/strata/gnome/ibus-libpinyin.morph
+ repo: upstream:ibus-libpinyin
+ ref: 4bb5fc19c0829053acd29619de59a85a73e03676
+ unpetrify-ref: baserock/1.7.2-7-g4bb5fc1
+ build-depends:
+ - ibus
+ - libpinyin
+- name: anthy
+ repo: upstream:anthy
+ ref: a7a06a7ccfe0af1e134357678b8fa6cf87dff3b0
+ unpetrify-ref: anthy-9100h
+ build-system: autotools
+- name: ibus-anthy
+ morph: gnome/strata/gnome/ibus-anthy.morph
+ repo: upstream:ibus-anthy
+ ref: 9ba0a2a1e595fbf6e39c50a15814bb6f9e337769
+ unpetrify-ref: baserock/1.5.7-6-g9ba0a2a
+ build-depends:
+ - ibus
+ - anthy
+- name: libcanberra
+ repo: upstream:libcanberra
+ ref: c0620e432650e81062c1967cc669829dbd29b310
+ unpetrify-ref: master
+ build-system: autotools
+- name: upower
+ morph: gnome/strata/gnome/upower.morph
+ repo: upstream:upower
+ ref: 0825c162d3dc909966b10fecabbc2c1da364c1a6
+ unpetrify-ref: master
+- name: gusb
+ repo: upstream:gusb
+ ref: 0c5eb813279c67607e17dfd99087358d34c6c8f5
+ unpetrify-ref: master
+ build-system: autotools
+- name: colord
+ morph: gnome/strata/gnome/colord.morph
+ repo: upstream:colord
+ ref: e68f251b753297fcd1fc2bb7356588945bd3e69b
+ unpetrify-ref: baserock/gnome
+ build-depends:
+ - gusb
+ - lcms2
+- name: colord-gtk
+ repo: upstream:colord-gtk
+ ref: eadca143872288e1300303a771efdaab196900e1
+ unpetrify-ref: COLORD_GTK_0_1_26
+ build-system: autotools
+ build-depends:
+ - colord
+- name: libgweather
+ repo: upstream:gnome/libgweather
+ ref: 5b8aed611f24d03434eed35e438cea213b894b7c
+ unpetrify-ref: master
+ build-system: autotools
+- name: gnome-settings-daemon
+ morph: gnome/strata/gnome/gnome-settings-daemon.morph
+ repo: upstream:gnome-settings-daemon
+ ref: 2ff67385f2b7c7adb0ab438cb41d114235a8e40a
+ unpetrify-ref: GNOME_SETTINGS_DAEMON_3_24_2
+ build-depends:
+ - colord
+ - gnome-desktop
+ - gsettings-desktop-schemas
+ - ibus
+ - libcanberra
+ - libgweather
+ - libnotify
+ - lcms2
+ - upower
+ submodules:
+ plugins/media-keys/gvc:
+ url: upstream:gnome/libgnome-volume-control
+- name: zenity
+ repo: upstream:zenity
+ ref: d7135db2bdfdca812c0165f90e4611af9c7c6a50
+ unpetrify-ref: master
+ build-depends:
+ - yelp-tools
+ build-system: autotools
+- name: mozjs24
+ morph: gnome/strata/gnome/mozjs24.morph
+ repo: upstream:mozilla/mozjs24
+ ref: 6c7e94087fead341de6adc85cb9a7f412fc6905d
+ unpetrify-ref: baserock/gnome
+- name: gjs
+ repo: upstream:gjs
+ ref: 5d480f519e2b7e95cf1fad2f9f1a8e798fd5fe49
+ unpetrify-ref: master
+ build-depends:
+ - mozjs24
+ build-system: autotools
+- name: telepathy-glib
+ morph: gnome/strata/gnome/telepathy-glib.morph
+ repo: upstream:telepathy-glib
+ ref: d27684c488ceee4f2f54f549738adab0e2e8165d
+ unpetrify-ref: master
+- name: telepathy-logger
+ morph: gnome/strata/gnome/telepathy-logger.morph
+ repo: upstream:telepathy-logger
+ ref: 711842911edb15977430c0b6c1803e947619efc3
+ unpetrify-ref: master
+ build-depends:
+ - telepathy-glib
+- name: telepathy-mission-control
+ repo: upstream:telepathy-mission-control
+ ref: 84dc7d0fd952a9ef3d200ac5557cdf2daccca145
+ unpetrify-ref: telepathy-mission-control-5.16.3
+ build-system: autotools
+ build-depends:
+ - telepathy-glib
+- name: startup-notification
+ repo: upstream:startup-notification
+ ref: 07237ff25d6171e1b548118442ddba4259a53ba5
+ unpetrify-ref: master
+ build-system: autotools
+- name: mutter
+ morph: gnome/strata/gnome/mutter.morph
+ repo: upstream:mutter
+ ref: a8b06afba6e9210171303bfef13f5bbddecc3668
+ unpetrify-ref: 3.22.4
+ build-depends:
+ - clutter
+ - cogl
+ - gnome-desktop
+ - gnome-settings-daemon
+ - gsettings-desktop-schemas
+ - startup-notification
+ - upower
+ - zenity
+- name: libxklavier
+ repo: upstream:libxklavier
+ ref: 65c132a65e90a42e898f07243ef544109ada53c9
+ unpetrify-ref: master
+ build-depends:
+ - iso-codes
+ build-system: autotools
+- name: caribou
+ morph: gnome/strata/gnome/caribou.morph
+ repo: upstream:caribou
+ ref: e1a7a2488cdf8d0d32f0de67d68a85e9a6ab5fd2
+ unpetrify-ref: baserock/CARIBOU_0_4_19-1-ge1a7a24+python3
+ build-depends:
+ - clutter
+ - libxklavier
+- name: librest
+ morph: gnome/strata/gnome/librest.morph
+ repo: upstream:gnome/librest
+ ref: 08f1fc35e3c77aecedacf08aa510e82c91ac7f2a
+ unpetrify-ref: 0.7.93
+- name: WebKitGtk
+ morph: gnome/strata/gnome/WebKitGtk.morph
+ repo: upstream:WebKitGtk-tarball
+ ref: 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c
+ unpetrify-ref: webkitgtk-2.16.5
+ build-depends:
+ - libnotify
+- name: gnome-online-accounts
+ morph: gnome/strata/gnome/gnome-online-accounts.morph
+ repo: upstream:gnome/gnome-online-accounts
+ ref: f5169b28bfef03f0c82b538784bb4c66a2a0034c
+ unpetrify-ref: 3.24.1
+ build-depends:
+ - librest
+ - telepathy-glib
+ - WebKitGtk
+ submodules:
+ telepathy-account-widgets:
+ url: upstream:gnome/telepathy-account-widgets
+- name: liboauth
+ repo: upstream:liboauth
+ ref: 9ff9d2902caf8a85c5019c11214d73e67053ba69
+ unpetrify-ref: liboauth-0.9.7
+ build-system: autotools
+- name: autoconf-archive
+ morph: gnome/strata/gnome/autoconf-archive.morph
+ repo: upstream:autoconf-archive
+ ref: 77e8330ea91e1f2be52ea8d348c72f56f1337dfb
+ unpetrify-ref: baserock/v2017.03.21
+- name: libgdata
+ morph: gnome/strata/gnome/libgdata.morph
+ repo: upstream:libgdata
+ ref: 19f9f9420146bc51c7dc6dba2102c7d94bae149a
+ unpetrify-ref: 0.17.8
+ build-depends:
+ - autoconf-archive
+ - gnome-online-accounts
+ - liboauth
+- name: krb5
+ morph: gnome/strata/gnome/krb5.morph
+ repo: upstream:krb5
+ ref: db2acb6b06e469c6c12476bec68acc7964626523
+ unpetrify-ref: master
+- name: evolution-data-server
+ morph: gnome/strata/gnome/evolution-data-server.morph
+ repo: upstream:evolution-data-server
+ ref: 6ad2fc6fba46d79449be4090eafd91015d0d8cce
+ unpetrify-ref: gnome-3-24
+ build-depends:
+ - gnome-online-accounts
+ - krb5
+ - libgdata
+ - libgweather
+- name: raptor
+ morph: gnome/strata/gnome/raptor.morph
+ repo: upstream:raptor
+ ref: 286452cd786098ce31a002f16e5ec2e0fbdc9041
+ unpetrify-ref: raptor2_2_0_15
+- name: isodate
+ repo: upstream:python-packages/isodate
+ ref: b99c0bd318991a8a8a9dc0c5273800b9801428f6
+ unpetrify-ref: 0.5.4
+ build-system: python-distutils
+- name: rdflib
+ repo: upstream:python-packages/rdflib
+ ref: c2f9725f385a85fd280b4cf30239748b24f5cc06
+ unpetrify-ref: 4.2.1
+ build-system: python-distutils
+ build-depends:
+ - isodate
+- name: zeitgeist
+ morph: gnome/strata/gnome/zeitgeist.morph
+ repo: upstream:zeitgeist
+ ref: abc7939806346a563ded2b16456dc7e2fff54fcc
+ unpetrify-ref: v0.9.16
+ build-depends:
+ - raptor
+ - rdflib
+ - telepathy-glib
+- name: folks
+ morph: gnome/strata/gnome/folks.morph
+ repo: upstream:gnome/folks
+ ref: 27367f26cd66bb86b745c892db214aa9a136c818
+ unpetrify-ref: 0.11.2
+ build-depends:
+ - evolution-data-server
+ - telepathy-logger
+ - zeitgeist
+- name: libgfbgraph
+ repo: upstream:gnome/libgfbgraph
+ ref: 50eabf601310052216e25fa112e688204738f222
+ unpetrify-ref: v_0_2_3
+ build-system: autotools
+ build-depends:
+ - gnome-online-accounts
+ - librest
+- name: network-manager-applet
+ morph: gnome/strata/gnome/network-manager-applet.morph
+ repo: upstream:gnome/network-manager-applet
+ ref: 04e2bd752b231bdd87fe3b83a6e540ee812144ad
+ unpetrify-ref: 1.8.2
+ build-system: autotools
+ build-depends:
+ - iso-codes
+ - libnotify
+- name: gnome-shell
+ morph: gnome/strata/gnome/gnome-shell.morph
+ repo: upstream:gnome/gnome-shell
+ ref: 4da5b8dd1189e7e628605b2b23efe5db2d88f94b
+ unpetrify-ref: baserock/3.18.0-71-g4da5b8d
+ build-depends:
+ - caribou
+ - clutter
+ - evolution-data-server
+ - gjs
+ - libcanberra
+ - mutter
+ - startup-notification
+ - telepathy-glib
+ - network-manager-applet
+ submodules:
+ src/gvc:
+ url: upstream:gnome/libgnome-volume-control
+ data/theme/gnome-shell-sass:
+ url: upstream:gnome/gnome-shell-sass
+- name: gnome-session
+ morph: gnome/strata/gnome/gnome-session.morph
+ repo: upstream:gnome/gnome-session
+ ref: 4ab09c39738adaaf16116b3bd82e47188b5483cd
+ unpetrify-ref: 3.18.1.2
+ build-depends:
+ - gnome-desktop
+- name: d-feet
+ morph: gnome/strata/gnome/d-feet.morph
+ repo: upstream:gnome/d-feet
+ ref: a526f5325f179482f915216f7781232899be5600
+ unpetrify-ref: master
+ build-depends:
+ - yelp-tools
+- name: accountsservice
+ morph: gnome/strata/gnome/accountsservice.morph
+ repo: upstream:accountsservice
+ ref: 1b91edfe9db81e75d0f08e98c6909cdf34c9e91e
+ unpetrify-ref: baserock/0.6.40-8-gcad21b1+libsystemd_fix
+- name: gdm
+ morph: gnome/strata/gnome/gdm.morph
+ repo: upstream:gdm
+ ref: 494ec8cee5727c37118994d3864c44f36aa454fc
+ unpetrify-ref: 3.18.0
+ build-depends:
+ - accountsservice
+ - libcanberra
+ - dconf
+- name: hicolor-icon-theme
+ morph: gnome/strata/gnome/hicolor-icon-theme.morph
+ repo: upstream:hicolor-icon-theme
+ ref: 5954bd6c123aa31c8f35b83d70b73e1f6dcf34b3
+ unpetrify-ref: master
+- name: gnome-themes-standard
+ morph: gnome/strata/gnome/gnome-themes-standard.morph
+ repo: upstream:gnome-themes-standard
+ ref: 4058c3bced2173c8e6f2a22953327dcc2023e82d
+ unpetrify-ref: master
+ build-depends:
+ - hicolor-icon-theme
+- name: adwaita-icon-theme
+ morph: gnome/strata/gnome/adwaita-icon-theme.morph
+ repo: upstream:gnome/adwaita-icon-theme
+ ref: 5e469ae6e664cb0808b6ce9fcfd7bd2ac6fc4216
+ unpetrify-ref: gnome-3-18
+- name: gnome-backgrounds
+ repo: upstream:gnome/gnome-backgrounds
+ ref: e68462edd35ae3edb4311df90dc4d1a3cdcb175f
+ unpetrify-ref: baserock/3.18.0-2-ge68462e
+ build-system: autotools
+- name: glib-networking
+ morph: gnome/strata/gnome/glib-networking.morph
+ repo: upstream:gnome/glib-networking
+ ref: 32ee55186d7df497e3d402a1940cddfabd9dbc21
+ unpetrify-ref: 2.46.0
+- name: cracklib
+ morph: gnome/strata/gnome/cracklib.morph
+ repo: upstream:cracklib
+ ref: 1dd5ca2114c0dd478b17e68e38d2c9f7094552cc
+ unpetrify-ref: cracklib-2.9.6
+- name: libpwquality
+ morph: gnome/strata/gnome/libpwquality.morph
+ repo: upstream:libpwquality
+ ref: 24937f6fdcc1673e064c9626407c89f58289957d
+ unpetrify-ref: libpwquality-1.3.0
+ build-depends:
+ - cracklib
+- name: glade
+ morph: gnome/strata/gnome/glade.morph
+ repo: upstream:gnome/glade
+ ref: 4f81f15467ad45c3dddc7ee50ffaca9596d628ee
+ unpetrify-ref: master
+ build-depends:
+ - yelp-tools
+- name: vte
+ morph: gnome/strata/gnome/vte.morph
+ repo: upstream:gnome/vte
+ ref: aa7120c2e359bb5d6d0b0ec6c1e0eecf0583be03
+ unpetrify-ref: 0.43.0
+ build-depends:
+ - glade
+- name: nautilus
+ morph: gnome/strata/gnome/nautilus.morph
+ repo: upstream:nautilus
+ ref: 2efab5ea404077bfb09f543ed2acc8e0940d21c9
+ unpetrify-ref: baserock/3.18.1
+ build-depends:
+ - vte
+ - gnome-desktop
+ - gsettings-desktop-schemas
+ submodules:
+ libgd:
+ url: upstream:gnome/libgd
+- name: desktop-file-utils
+ morph: gnome/strata/gnome/desktop-file-utils.morph
+ repo: upstream:desktop-file-utils
+ ref: 4944725bddcf5821d53d7d648fc53347ce12cc03
+ unpetrify-ref: '0.22'
+- name: gnome-terminal
+ morph: gnome/strata/gnome/gnome-terminal.morph
+ repo: upstream:gnome/gnome-terminal
+ ref: d52e6beb2df7aedd0c98696ae3be4a36b4c8f0f0
+ unpetrify-ref: 3.18.1
+ build-depends:
+ - desktop-file-utils
+ - dconf
+ - gconf
+ - gsettings-desktop-schemas
+ - nautilus
+ - yelp-tools
+- name: libnice
+ repo: upstream:libnice
+ ref: 533ff6c5a03680f300709be4dc999f45659f3a1b
+ unpetrify-ref: 0.1.13
+ build-system: autotools
+- name: farstream
+ repo: upstream:farstream
+ ref: 01fafe82fbc01f31e76623fbbbe6dd99eb28d6bb
+ unpetrify-ref: 0.2.7
+ build-system: autotools
+ build-depends:
+ - libnice
+ submodules:
+ common:
+ url: upstream:gstreamer-common
+- name: telepathy-farstream
+ repo: upstream:telepathy-farstream
+ ref: 0b1bba79cfe94e7676fe69e9e0d2e3983a3c14c5
+ unpetrify-ref: telepathy-farstream-0.6.2
+ build-system: autotools
+ build-depends:
+ - farstream
+ - telepathy-glib
+- name: telepathy-gabble
+ morph: gnome/strata/gnome/telepathy-gabble.morph
+ repo: upstream:telepathy-gabble
+ ref: f10f557fd67ec11738670828a553496960c0d411
+ unpetrify-ref: telepathy-gabble-0.18.3
+ build-depends:
+ - libnice
+ - telepathy-glib
+ submodules:
+ lib/ext/wocky:
+ url: upstream:wocky
+- name: telepathy-salut
+ morph: gnome/strata/gnome/telepathy-salut.morph
+ repo: upstream:telepathy-salut
+ ref: cd32e00a3a461756cbf1f6899a0c2aa5bd5d79ee
+ unpetrify-ref: telepathy-salut-0.8.1
+ build-depends:
+ - telepathy-glib
+ submodules:
+ lib/ext/wocky:
+ url: upstream:wocky
+- name: telepathy-idle
+ repo: upstream:telepathy-idle
+ ref: 55e9841a4af51d7f014395475526b700abec4d0b
+ unpetrify-ref: telepathy-idle-0.2.0
+ build-system: autotools
+ build-depends:
+ - telepathy-glib
+- name: libpurple
+ morph: gnome/strata/gnome/libpurple.morph
+ repo: upstream:pidgin
+ ref: 9273b95bd66893a362cbf6f69bb8bc749db41f04
+ unpetrify-ref: baserock/v2.10.11
+ build-depends:
+ - evolution-data-server
+ - farstream
+- name: telepathy-haze
+ repo: upstream:telepathy-haze
+ ref: d3d7b7f9342511c0c961e3f2d9fc1f5fb0804142
+ unpetrify-ref: telepathy-haze-0.8.0
+ build-system: autotools
+ build-depends:
+ - libpurple
+ - telepathy-glib
+- name: grilo
+ repo: upstream:gnome/grilo
+ ref: 53b44b711a4558c0511dbe73d928971fd2c7bb30
+ unpetrify-ref: grilo-0.3.3
+ build-system: autotools
+- name: grilo-plugins
+ repo: upstream:gnome/grilo-plugins
+ ref: 9e4026978b4069468a6fe6d3e961c4d1a9c88051
+ unpetrify-ref: grilo-0.3.4
+ build-system: autotools
+ build-depends:
+ - gnome-online-accounts
+ - grilo
+ - libgdata
+ - liboauth
+ - librest
+ - yelp-tools
+- name: libgtop
+ repo: upstream:gnome/libgtop
+ ref: ac2aef0f47fd998555abf18003f4c11ffecbf542
+ unpetrify-ref: 2.32.0
+ build-system: autotools
+- name: gnome-bluetooth
+ repo: upstream:gnome/gnome-bluetooth
+ ref: 9219cc1ab433d3237b46146cbab2a7d89c5f09b5
+ unpetrify-ref: GNOMEBT_V_3_20_1
+ build-system: autotools
+ build-depends:
+ - libcanberra
+ - libnotify
+- name: gcab
+ repo: upstream:gnome/gcab
+ ref: e57dd3d1ddb0da91df9188c2a98d59d1050ac6cb
+ unpetrify-ref: baserock/v0.6-22-ge57dd3d
+ build-system: autotools
+- name: appstream-glib
+ repo: upstream:appstream-glib
+ ref: d3885c325271fee0bed5c5815d41eb788712acb4
+ unpetrify-ref: appstream_glib_0_5_0
+ # Building 0.5.3 requires absurdly new libsoup
+ # ref: 2b57a0c407021f2b1efca38eb99a9bf61c1d16b2
+ # unpetrify-ref: appstream_glib_0_5_3
+ build-system: autotools
+ build-depends:
+ - gcab
+- name: gnome-color-manager
+ morph: gnome/strata/gnome/gnome-color-manager.morph
+ repo: upstream:gnome/gnome-color-manager
+ ref: 8284cb186e0e7c248fc2a2449735fd24b778ec81
+ unpetrify-ref: GNOME_COLOR_MANAGER_3_18_0
+ build-depends:
+ - appstream-glib
+ - colord-gtk
+ - gnome-desktop
+ - lcms2
+ - libcanberra
+ - vte
+ - yelp-tools
+- name: clutter-gst
+ repo: upstream:gnome/clutter-gst
+ ref: 395797827a148809a2be0d968c5bf71a6e9c9299
+ unpetrify-ref: 3.0.14
+ build-system: autotools
+ build-depends:
+ - clutter
+- name: clutter-gst2
+ repo: upstream:gnome/clutter-gst
+ ref: e9372b1c7d858ae0268d92d0c5e02532a8352b68
+ unpetrify-ref: 2.0.16
+ build-system: autotools
+ build-depends:
+ - clutter
+- name: cheese
+ morph: gnome/strata/gnome/cheese.morph
+ repo: upstream:gnome/cheese
+ ref: 61651e03e8346bd0084da7247269e52e2a42190e
+ unpetrify-ref: gnome-3-18
+ build-depends:
+ - appstream-glib
+ - clutter
+ - clutter-gst
+ - clutter-gtk
+ - gnome-desktop
+ - libcanberra
+ - yelp-tools
+- name: gnome-control-center
+ morph: gnome/strata/gnome/gnome-control-center.morph
+ repo: upstream:gnome/gnome-control-center
+ ref: e44054466a35e637e0b8cb88cf676f94a9f40dc8
+ unpetrify-ref: GNOME_CONTROL_CENTER_3_24_2
+ build-depends:
+ - accountsservice
+ - cheese
+ - clutter
+ - clutter-gtk
+ - colord
+ - colord-gtk
+ - gnome-bluetooth
+ - gnome-desktop
+ - gnome-online-accounts
+ - gnome-settings-daemon
+ - grilo
+ - gsettings-desktop-schemas
+ - ibus
+ - iso-codes
+ - krb5
+ - libcanberra
+ - libgtop
+ - libpwquality
+ - network-manager-applet
+ submodules:
+ libgd:
+ url: upstream:gnome/libgd
+ panels/sound/gvc:
+ url: upstream:gnome/libgnome-volume-control
+- name: gnome-initial-setup
+ morph: gnome/strata/gnome/gnome-initial-setup.morph
+ repo: upstream:gnome/gnome-initial-setup
+ ref: a6ae059a7fab60cae534f78eb485960a7b406be5
+ unpetrify-ref: new-user-mode-fixes
+ build-depends:
+ - accountsservice
+ - cheese
+ - gdm
+ - gnome-desktop
+ - gnome-online-accounts
+ - ibus
+ - iso-codes
+ - krb5
+ - libgweather
+ - libpwquality
+ - network-manager-applet
+- name: libgnomekbd
+ repo: upstream:gnome/libgnomekbd
+ ref: d8ff867e95e548476c68db12ade3a0a4697a24a1
+ unpetrify-ref: master
+ build-system: autotools
+ build-depends:
+ - libxklavier
+- name: sound-theme-freedesktop
+ build-system: autotools
+ repo: upstream:sound-theme-freedesktop
+ ref: 9d2ac65a2f88263f0eec8b777ef3bdc023b93c25
+ unpetrify-ref: '0.8'
+- name: libwnck
+ morph: gnome/strata/gnome/libwnck.morph
+ repo: upstream:libwnck
+ ref: 46bade6f53351f2a63d030e27cbba2e0048d1cde
+ unpetrify-ref: 3.14.0
+- name: libpeas
+ morph: gnome/strata/gnome/libpeas.morph
+ repo: upstream:gnome/libpeas
+ ref: ede1902bee26dbe36c2c1559b1166035580cdf30
+ unpetrify-ref: libpeas-1.16.0
+- name: gtksourceview
+ morph: gnome/strata/gnome/gtksourceview.morph
+ repo: upstream:gnome/gtksourceview
+ ref: eeb6fd40fbbc74515828070fef554ed98ad481e9
+ unpetrify-ref: 3.18.1
+ build-depends:
+ - glade
+###############################################
+# Applications Start Here #
+###############################################
+- name: epiphany
+ morph: gnome/strata/gnome/epiphany.morph
+ repo: upstream:gnome/epiphany
+ ref: 4a9588f5812c7e5cd56fde2844fa29a4e33304fb
+ unpetrify-ref: gnome-3.24
+ build-depends:
+ - appstream-glib
+ - autoconf-archive
+ - gnome-desktop
+ - iso-codes
+ - libcanberra
+ - libnotify
+ - libwnck
+ - startup-notification
+ - WebKitGtk
+ submodules:
+ gvdb/gvdb:
+ url: upstream:gnome/gvdb
+ libgd:
+ url: upstream:gnome/libgd
+- name: totem
+ repo: upstream:gnome/totem
+ ref: dec87510f22daf87144eda36e1d97bfcabace1d1
+ unpetrify-ref: 3.24.0
+ build-system: autotools
+ build-depends:
+ - appstream-glib
+ - clutter
+ - clutter-gst
+ - clutter-gtk
+ - gnome-desktop
+ - grilo
+ - grilo-plugins
+ - gsettings-desktop-schemas
+ - iso-codes
+ - libpeas
+ - yelp-tools
+ submodules:
+ libgd:
+ url: upstream:gnome/libgd
+- name: yelp
+ repo: upstream:gnome/yelp
+ morph: gnome/strata/gnome/yelp.morph
+ ref: 9932283ce9610f969e023a0dc326c81159c06a15
+ unpetrify-ref: 3.18.1
+ build-depends:
+ - WebKitGtk
+ - yelp-xsl
+- name: gnome-user-docs
+ repo: upstream:gnome/gnome-user-docs
+ ref: 618fc9644317c55d674ca2e1b00b41d364427fb1
+ unpetrify-ref: master
+ build-system: autotools
+ build-depends:
+ - yelp-tools
+- name: gnome-getting-started-docs
+ repo: upstream:gnome/gnome-getting-started-docs
+ ref: e50ec428ee080513f059a5cab0a41174f99f0413
+ unpetrify-ref: 3.18.2
+ build-system: autotools
+ build-depends:
+ - yelp-tools
+- name: gedit
+ repo: upstream:gnome/gedit
+ ref: 8156d35a6eb27f3251e1ea454a48cb2a2ae4f87c
+ unpetrify-ref: 3.18.2
+ build-system: autotools
+ build-depends:
+ - gsettings-desktop-schemas
+ - gtksourceview
+ - iso-codes
+ - libpeas
+ - yelp-tools
+ submodules:
+ libgd:
+ url: upstream:gnome/libgd
+- name: gnome-calendar
+ repo: upstream:gnome/gnome-calendar
+ ref: 5292e9d57442067701ce94eea54b4b12d13b7aa3
+ unpetrify-ref: 3.18.1
+ build-system: autotools
+ build-depends:
+ - appstream-glib
+ - gnome-online-accounts
+ - evolution-data-server
+- name: gnome-todo
+ repo: upstream:gnome/gnome-todo
+ ref: a39ccadf8a659fca8b4503bf4844383f5346f6cb
+ unpetrify-ref: GNOME_TODO_3_18_1
+ build-system: autotools
+ build-depends:
+ - appstream-glib
+ - evolution-data-server
+ - gnome-online-accounts
+- name: empathy
+ morph: gnome/strata/gnome/empathy.morph
+ repo: upstream:gnome/empathy
+ ref: 24708b78dc0d66adfacc5a4c28f3a318af4ccd97
+ unpetrify-ref: master
+ build-depends:
+ - cheese
+ - clutter
+ - clutter-gst2
+ - clutter-gtk
+ - farstream
+ - folks
+ - gnome-online-accounts
+ - gsettings-desktop-schemas
+ - iso-codes
+ - libcanberra
+ - libchamplain
+ - libnotify
+ - telepathy-farstream
+ - telepathy-glib
+ - telepathy-logger
+ - telepathy-mission-control
+ - yelp-tools
+ submodules:
+ telepathy-account-widgets:
+ url: upstream:gnome/telepathy-account-widgets
+- name: gnome-contacts
+ repo: upstream:gnome/gnome-contacts
+ ref: fa736997cc7ec8df89458502c0a181090def64e9
+ unpetrify-ref: 3.18.0
+ build-system: autotools
+ build-depends:
+ - cheese
+ - folks
+ - gnome-desktop
+ - gnome-online-accounts
+ - libchamplain
+ - libnotify
+ - telepathy-glib
+ submodules:
+ libgd:
+ url: upstream:gnome/libgd
+- name: gnome-maps
+ repo: upstream:gnome/gnome-maps
+ ref: 6d6e8afd54735e565a0c81cb761f22bb82d142db
+ unpetrify-ref: v3.18.1
+ build-system: autotools
+ build-depends:
+ - folks
+ - clutter-gtk
+ - gjs
+ - gnome-desktop
+ - gnome-online-accounts
+ - libchamplain
+ - libgfbgraph
+- name: gnome-dictionary
+ repo: upstream:gnome/gnome-dictionary
+ ref: 902d1e02391486b152e84e36946d437c31040bb8
+ unpetrify-ref: 3.24.0
+ build-system: autotools
+ build-depends:
+ - yelp-tools
+- name: eog
+ repo: upstream:gnome/eog
+ ref: c665b86c19cec9e9ec783adb062c387ddb46958c
+ unpetrify-ref: 3.24.1
+ build-system: autotools
+ build-depends:
+ - gnome-desktop
+ - gsettings-desktop-schemas
+ - lcms2
+ - libpeas
+ - yelp-tools
+- name: baobab
+ repo: upstream:gnome/baobab
+ ref: 59fa8171d2dfa02be56930f451ae186680074bb6
+ unpetrify-ref: 3.18.1
+ build-system: autotools
+ build-depends:
+ - yelp-tools
+- name: gnome-font-viewer
+ repo: upstream:gnome/gnome-font-viewer
+ ref: 9af2f35a63f34f87407e784b514cafe1cc772384
+ unpetrify-ref: master
+ build-system: autotools
+ build-depends:
+ - gnome-desktop
+- name: gnome-screenshot
+ repo: upstream:gnome/gnome-screenshot
+ ref: 3a97ad23ff14a0400f12dd3fdf501d1d9dad04d4
+ unpetrify-ref: 3.18.0
+ build-system: autotools
+ build-depends:
+ - libcanberra
+- name: evolution
+ morph: gnome/strata/gnome/evolution.morph
+ repo: upstream:gnome/evolution
+ ref: 57b4424f7dd260b50c2f3fd12ec31948942d656e
+ unpetrify-ref: gnome-3-24
+ build-depends:
+ - evolution-data-server
+ - clutter-gtk
+ - gnome-desktop
+ - gnome-online-accounts
+ - gsettings-desktop-schemas
+ - libcanberra
+ - libchamplain
+ - libgdata
+ - libgweather
+ - libnotify
+ - yelp-tools
diff --git a/gnome/strata/gnome/WebKitGtk.morph b/gnome/strata/gnome/WebKitGtk.morph
new file mode 100644
index 00000000..9cb50a0d
--- /dev/null
+++ b/gnome/strata/gnome/WebKitGtk.morph
@@ -0,0 +1,5 @@
+name: WebKitGtk
+kind: chunk
+build-system: cmake
+configure-commands:
+- CXXFLAGS=-Wno-expansion-to-defined cmake -DPORT=GTK -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$PREFIX" -DCMAKE_INSTALL_LIBDIR=lib
diff --git a/gnome/strata/gnome/accountsservice.morph b/gnome/strata/gnome/accountsservice.morph
new file mode 100644
index 00000000..15ba434d
--- /dev/null
+++ b/gnome/strata/gnome/accountsservice.morph
@@ -0,0 +1,9 @@
+name: accountsservice
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --enable-admin-group=adm
+system-integration:
+ accountsservice-misc:
+ 00-enable-accounts-daemon-unit:
+ - systemctl enable accounts-daemon
diff --git a/gnome/strata/gnome/adwaita-icon-theme.morph b/gnome/strata/gnome/adwaita-icon-theme.morph
new file mode 100644
index 00000000..99ded09c
--- /dev/null
+++ b/gnome/strata/gnome/adwaita-icon-theme.morph
@@ -0,0 +1,11 @@
+name: adwaita-icon-theme
+kind: chunk
+build-system: autotools
+configure-commands:
+- gdk-pixbuf-query-loaders > loader.cache
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc
+build-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make
+install-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make install DESTDIR="$DESTDIR"
diff --git a/gnome/strata/gnome/autoconf-archive.morph b/gnome/strata/gnome/autoconf-archive.morph
new file mode 100644
index 00000000..5420b68a
--- /dev/null
+++ b/gnome/strata/gnome/autoconf-archive.morph
@@ -0,0 +1,8 @@
+name: autoconf-archive
+kind: chunk
+build-system: autotools
+
+pre-configure-commands:
+# Disable documentation, as it requires texinfo
+- sed -e '/^SUBDIRS\s\+=\s\+doc.*$/d' Makefile.am -i
+- ./bootstrap.sh
diff --git a/gnome/strata/gnome/berkeleydb.morph b/gnome/strata/gnome/berkeleydb.morph
new file mode 100644
index 00000000..e6238e7a
--- /dev/null
+++ b/gnome/strata/gnome/berkeleydb.morph
@@ -0,0 +1,18 @@
+name: berkeleydb
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ cd build_unix;
+ ../dist/configure --prefix="$PREFIX" \
+ --enable-compat185 \
+ --enable-dbm \
+ --enable-cxx
+build-commands:
+- |
+ cd build_unix;
+ make
+install-commands:
+- |
+ cd build_unix;
+ make DESTDIR="$DESTDIR" install
diff --git a/gnome/strata/gnome/caribou.morph b/gnome/strata/gnome/caribou.morph
new file mode 100644
index 00000000..14827a98
--- /dev/null
+++ b/gnome/strata/gnome/caribou.morph
@@ -0,0 +1,5 @@
+name: caribou
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-gtk2-module
diff --git a/gnome/strata/gnome/cheese.morph b/gnome/strata/gnome/cheese.morph
new file mode 100644
index 00000000..5e3671fb
--- /dev/null
+++ b/gnome/strata/gnome/cheese.morph
@@ -0,0 +1,11 @@
+name: cheese
+kind: chunk
+build-system: autotools
+configure-commands:
+- gdk-pixbuf-query-loaders > loader.cache
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc
+build-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make
+install-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make install DESTDIR="$DESTDIR"
diff --git a/gnome/strata/gnome/clutter.morph b/gnome/strata/gnome/clutter.morph
new file mode 100644
index 00000000..d454c6e3
--- /dev/null
+++ b/gnome/strata/gnome/clutter.morph
@@ -0,0 +1,6 @@
+name: clutter
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --enable-wayland-backend --enable-wayland-compositor
+ --enable-egl-backend --enable-evdev-input --enable-x11-backend
diff --git a/gnome/strata/gnome/cogl.morph b/gnome/strata/gnome/cogl.morph
new file mode 100644
index 00000000..8c9dca76
--- /dev/null
+++ b/gnome/strata/gnome/cogl.morph
@@ -0,0 +1,6 @@
+name: cogl
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --enable-wayland-egl-platform --enable-wayland-egl-server
+ --enable-kms-egl-platform --enable-xlib-egl-platform --enable-cogl-gst
diff --git a/gnome/strata/gnome/colord.morph b/gnome/strata/gnome/colord.morph
new file mode 100644
index 00000000..d1e14454
--- /dev/null
+++ b/gnome/strata/gnome/colord.morph
@@ -0,0 +1,9 @@
+name: colord
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc
+system-integration:
+ colord-misc:
+ 00-enable-colord-unit:
+ - systemctl enable colord
diff --git a/gnome/strata/gnome/cracklib.morph b/gnome/strata/gnome/cracklib.morph
new file mode 100644
index 00000000..fe204255
--- /dev/null
+++ b/gnome/strata/gnome/cracklib.morph
@@ -0,0 +1,18 @@
+name: cracklib
+kind: chunk
+build-system: autotools
+configure-commands:
+# cracklib has it's own autogen.sh script, but uses curl to download config.sub & config.guess, we just skip it
+- cd src && autopoint -f && cd m4 && echo EXTRA_DIST = *.m4 > Makefile.am && cd .. && autoreconf -f -i
+- cd src && ./configure --prefix="$PREFIX" --sysconfdir=/etc --with-default-dict=/lib/cracklib/pw_dict
+build-commands:
+- make -C src
+- make -C words cracklib-words.gz
+install-commands:
+- make -C src install
+- install -m644 -D words/cracklib-words.gz $DESTDIR$PREFIX/share/dict/cracklib-words.gz
+- install -v -m755 -d $DESTDIR/lib/cracklib
+system-integration:
+ cracklib-misc:
+ 00-cracklib-create-dict:
+ - create-cracklib-dict /usr/share/dict/cracklib-words.gz
diff --git a/gnome/strata/gnome/d-feet.morph b/gnome/strata/gnome/d-feet.morph
new file mode 100644
index 00000000..df74d3e0
--- /dev/null
+++ b/gnome/strata/gnome/d-feet.morph
@@ -0,0 +1,7 @@
+name: d-feet
+kind: chunk
+build-system: autotools
+configure-commands:
+# Workaround upstream bug https://bugzilla.gnome.org/show_bug.cgi?id=757769
+- sed -i 's/AM_PATH_PYTHON(\[2\.7\])/AM_PATH_PYTHON(\[3\.1\])/g' configure.ac
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-tests
diff --git a/gnome/strata/gnome/dconf.morph b/gnome/strata/gnome/dconf.morph
new file mode 100644
index 00000000..a49efd36
--- /dev/null
+++ b/gnome/strata/gnome/dconf.morph
@@ -0,0 +1,5 @@
+name: dconf
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-man
diff --git a/gnome/strata/gnome/desktop-file-utils.morph b/gnome/strata/gnome/desktop-file-utils.morph
new file mode 100644
index 00000000..df34dad6
--- /dev/null
+++ b/gnome/strata/gnome/desktop-file-utils.morph
@@ -0,0 +1,7 @@
+name: desktop-file-utils
+kind: chunk
+build-system: autotools
+system-integration:
+ desktop-file-utils-misc:
+ 01-update-desktop-database:
+ - update-desktop-database
diff --git a/gnome/strata/gnome/empathy.morph b/gnome/strata/gnome/empathy.morph
new file mode 100644
index 00000000..a2a0cbc0
--- /dev/null
+++ b/gnome/strata/gnome/empathy.morph
@@ -0,0 +1,5 @@
+name: empathy
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-Werror
diff --git a/gnome/strata/gnome/epiphany.morph b/gnome/strata/gnome/epiphany.morph
new file mode 100644
index 00000000..3a47a1a2
--- /dev/null
+++ b/gnome/strata/gnome/epiphany.morph
@@ -0,0 +1,5 @@
+name: epiphany
+kind: chunk
+build-system: autotools
+configure-commands:
+- CFLAGS="-std=gnu99" ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var --disable-Werror
diff --git a/gnome/strata/gnome/evolution-data-server.morph b/gnome/strata/gnome/evolution-data-server.morph
new file mode 100644
index 00000000..dfe9b55d
--- /dev/null
+++ b/gnome/strata/gnome/evolution-data-server.morph
@@ -0,0 +1,11 @@
+name: evolution-data-server
+kind: chunk
+build-system: cmake
+configure-commands:
+- cmake -DCMAKE_INSTALL_PREFIX="$PREFIX"
+ -DSYSCONFDIR=/etc
+ -DENABLE_INTROSPECTION=ON
+ -DENABLE_UOA=OFF
+ -DENABLE_VALA_BINDINGS=ON
+ -DWITH_LIBDB=OFF
+ -DWITH_OPENLDAP=OFF .
diff --git a/gnome/strata/gnome/evolution.morph b/gnome/strata/gnome/evolution.morph
new file mode 100644
index 00000000..fcef80e5
--- /dev/null
+++ b/gnome/strata/gnome/evolution.morph
@@ -0,0 +1,8 @@
+name: evolution
+kind: chunk
+build-system: cmake
+configure-commands:
+- cmake . -DCMAKE_INSTALL_PREFIX="$PREFIX" -DENABLE_AUTOAR=OFF
+ -DENABLE_CONTACT_MAPS=ON -DENABLE_GTKSPELL=OFF
+ -DENABLE_LIBCRYPTUI=OFF -DENABLE_PST_IMPORT=OFF
+ -DENABLE_TEXT_HIGHLIGHT=OFF -DENABLE_YTNEF=OFF -DWITH_OPENLDAP=OFF
diff --git a/gnome/strata/gnome/folks.morph b/gnome/strata/gnome/folks.morph
new file mode 100644
index 00000000..132c8f3f
--- /dev/null
+++ b/gnome/strata/gnome/folks.morph
@@ -0,0 +1,5 @@
+name: folks
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-fatal-warnings --enable-tracker-backend
diff --git a/gnome/strata/gnome/gconf.morph b/gnome/strata/gnome/gconf.morph
new file mode 100644
index 00000000..26930945
--- /dev/null
+++ b/gnome/strata/gnome/gconf.morph
@@ -0,0 +1,5 @@
+name: gconf
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-orbit --disable-documentation
diff --git a/gnome/strata/gnome/gdm.morph b/gnome/strata/gnome/gdm.morph
new file mode 100644
index 00000000..73081766
--- /dev/null
+++ b/gnome/strata/gnome/gdm.morph
@@ -0,0 +1,24 @@
+name: gdm
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ # GDM includes a few stock PAM configurations, we choose the LFS flavor
+ # because of it's simplicity over the others, also it does not require
+ # selinux modules, however we neet to tweak the config a little after install.
+ ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var \
+ --with-selinux=no --with-plymouth=no \
+ --enable-gdm-xsession --with-x --with-default-pam-config=lfs
+post-install-commands:
+# Instead of following LFS PAM config to the letter, we redirect the includes
+# to use the systemd installed all purpose 'system-auth' file
+- sed -i 's/system-account/system-auth/g' "$DESTDIR"/etc/pam.d/gdm*
+- sed -i 's/system-password/system-auth/g' "$DESTDIR"/etc/pam.d/gdm*
+- sed -i 's/system-session/system-auth/g' "$DESTDIR"/etc/pam.d/gdm*
+system-integration:
+ gdm-misc:
+ 00-add-gdm-user:
+ - groupadd -g 21 gdm
+ - useradd -rM -c "GDM Daemon Owner" -d /var/lib/gdm -u 21 -g gdm -s /bin/false gdm
+ 00-enable-gdm-unit:
+ - systemctl enable gdm
diff --git a/gnome/strata/gnome/glade.morph b/gnome/strata/gnome/glade.morph
new file mode 100644
index 00000000..9cc3675d
--- /dev/null
+++ b/gnome/strata/gnome/glade.morph
@@ -0,0 +1,5 @@
+name: glade
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-man-pages
diff --git a/gnome/strata/gnome/glib-networking.morph b/gnome/strata/gnome/glib-networking.morph
new file mode 100644
index 00000000..53380583
--- /dev/null
+++ b/gnome/strata/gnome/glib-networking.morph
@@ -0,0 +1,9 @@
+name: glib-networking
+kind: chunk
+build-system: autotools
+configure-commands:
+#
+# Tell glib-networking where the system CA certs are found, avoid depending
+# on an installed ca-certificates.
+#
+- ./autogen.sh --prefix="$PREFIX" --with-ca-certificates=/etc/ssl/certs/ca-certificates.crt
diff --git a/gnome/strata/gnome/gnome-color-manager.morph b/gnome/strata/gnome/gnome-color-manager.morph
new file mode 100644
index 00000000..90ed1815
--- /dev/null
+++ b/gnome/strata/gnome/gnome-color-manager.morph
@@ -0,0 +1,7 @@
+name: gnome-color-manager
+kind: chunk
+build-system: autotools
+configure-commands:
+# There is no justification to disable EXIV, we were just
+# too lazy to integrate EXIV
+- ./autogen.sh --prefix="$PREFIX" --disable-exiv
diff --git a/gnome/strata/gnome/gnome-control-center.morph b/gnome/strata/gnome/gnome-control-center.morph
new file mode 100644
index 00000000..9b5ec037
--- /dev/null
+++ b/gnome/strata/gnome/gnome-control-center.morph
@@ -0,0 +1,5 @@
+name: gnome-control-center
+kind: chunk
+build-system: autotools
+configure-commands:
+- CFLAGS="-std=gnu99" ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-documentation
diff --git a/gnome/strata/gnome/gnome-initial-setup.morph b/gnome/strata/gnome/gnome-initial-setup.morph
new file mode 100644
index 00000000..47324950
--- /dev/null
+++ b/gnome/strata/gnome/gnome-initial-setup.morph
@@ -0,0 +1,9 @@
+name: gnome-initial-setup
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc
+system-integration:
+ gnome-initial-setup-misc:
+ 01-add-gnome-initial-setup-user:
+ - useradd -rM -d /run/gnome-initial-setup/ -c "GNOME Initial Setup Owner" -s /bin/false gnome-initial-setup
diff --git a/gnome/strata/gnome/gnome-online-accounts.morph b/gnome/strata/gnome/gnome-online-accounts.morph
new file mode 100644
index 00000000..0dea9543
--- /dev/null
+++ b/gnome/strata/gnome/gnome-online-accounts.morph
@@ -0,0 +1,5 @@
+name: gnome-online-accounts
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-gtk-doc --disable-documentation
diff --git a/gnome/strata/gnome/gnome-session.morph b/gnome/strata/gnome/gnome-session.morph
new file mode 100644
index 00000000..e7a4a927
--- /dev/null
+++ b/gnome/strata/gnome/gnome-session.morph
@@ -0,0 +1,5 @@
+name: gnome-session
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-docbook-docs --disable-man --enable-systemd
diff --git a/gnome/strata/gnome/gnome-settings-daemon.morph b/gnome/strata/gnome/gnome-settings-daemon.morph
new file mode 100644
index 00000000..3112f778
--- /dev/null
+++ b/gnome/strata/gnome/gnome-settings-daemon.morph
@@ -0,0 +1,5 @@
+name: gnome-settings-daemon
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-man
diff --git a/gnome/strata/gnome/gnome-shell.morph b/gnome/strata/gnome/gnome-shell.morph
new file mode 100644
index 00000000..dc58f670
--- /dev/null
+++ b/gnome/strata/gnome/gnome-shell.morph
@@ -0,0 +1,5 @@
+name: gnome-shell
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-man --enable-compile-warnings=maximum
diff --git a/gnome/strata/gnome/gnome-terminal.morph b/gnome/strata/gnome/gnome-terminal.morph
new file mode 100644
index 00000000..89ec5964
--- /dev/null
+++ b/gnome/strata/gnome/gnome-terminal.morph
@@ -0,0 +1,5 @@
+name: gnome-terminal
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-search-provider
diff --git a/gnome/strata/gnome/gnome-themes-standard.morph b/gnome/strata/gnome/gnome-themes-standard.morph
new file mode 100644
index 00000000..c5b6702c
--- /dev/null
+++ b/gnome/strata/gnome/gnome-themes-standard.morph
@@ -0,0 +1,5 @@
+name: gnome-themes-standard
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-gtk2-engine
diff --git a/gnome/strata/gnome/gtksourceview.morph b/gnome/strata/gnome/gtksourceview.morph
new file mode 100644
index 00000000..a41c5e9c
--- /dev/null
+++ b/gnome/strata/gnome/gtksourceview.morph
@@ -0,0 +1,5 @@
+name: gtksourceview
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --enable-glade-catalog --disable-Werror
diff --git a/gnome/strata/gnome/hicolor-icon-theme.morph b/gnome/strata/gnome/hicolor-icon-theme.morph
new file mode 100644
index 00000000..88629b39
--- /dev/null
+++ b/gnome/strata/gnome/hicolor-icon-theme.morph
@@ -0,0 +1,7 @@
+name: hicolor-icon-theme
+kind: chunk
+build-system: autotools
+system-integration:
+ hicolor-icon-theme-misc:
+ 00-update-icon-cache:
+ - gtk-update-icon-cache -f -t /usr/share/icons/hicolor
diff --git a/gnome/strata/gnome/ibus-anthy.morph b/gnome/strata/gnome/ibus-anthy.morph
new file mode 100644
index 00000000..bb48e8bb
--- /dev/null
+++ b/gnome/strata/gnome/ibus-anthy.morph
@@ -0,0 +1,5 @@
+name: ibus-anthy
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --with-python=python3 --enable-private-png=yes
diff --git a/gnome/strata/gnome/ibus-hangul.morph b/gnome/strata/gnome/ibus-hangul.morph
new file mode 100644
index 00000000..a479459b
--- /dev/null
+++ b/gnome/strata/gnome/ibus-hangul.morph
@@ -0,0 +1,5 @@
+name: ibus-hangul
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --with-python=python3
diff --git a/gnome/strata/gnome/ibus-libpinyin.morph b/gnome/strata/gnome/ibus-libpinyin.morph
new file mode 100644
index 00000000..7ad8a349
--- /dev/null
+++ b/gnome/strata/gnome/ibus-libpinyin.morph
@@ -0,0 +1,5 @@
+name: ibus-libpinyin
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --with-python=python3 --disable-lua-extension
diff --git a/gnome/strata/gnome/ibus.morph b/gnome/strata/gnome/ibus.morph
new file mode 100644
index 00000000..f46a1a71
--- /dev/null
+++ b/gnome/strata/gnome/ibus.morph
@@ -0,0 +1,9 @@
+name: ibus
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc \
+ --disable-tests --disable-gconf --enable-dconf \
+ --disable-memconf --disable-ui GSETTINGS_SCHEMA_CONVERT=/usr/bin/false \
+ --with-python=python3 --enable-wayland
diff --git a/gnome/strata/gnome/krb5.morph b/gnome/strata/gnome/krb5.morph
new file mode 100644
index 00000000..d0a4600e
--- /dev/null
+++ b/gnome/strata/gnome/krb5.morph
@@ -0,0 +1,10 @@
+name: krb5
+kind: chunk
+build-system: autotools
+configure-commands:
+- cd src && ./util/reconf --force
+- cd src && ./configure --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var/lib --enable-dns
+build-commands:
+- make -C src
+install-commands:
+- make -C src install
diff --git a/gnome/strata/gnome/libchamplain.morph b/gnome/strata/gnome/libchamplain.morph
new file mode 100644
index 00000000..e1c902b8
--- /dev/null
+++ b/gnome/strata/gnome/libchamplain.morph
@@ -0,0 +1,5 @@
+name: libchamplain
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --enable-vala=yes
diff --git a/gnome/strata/gnome/libgdata.morph b/gnome/strata/gnome/libgdata.morph
new file mode 100644
index 00000000..4ff7c477
--- /dev/null
+++ b/gnome/strata/gnome/libgdata.morph
@@ -0,0 +1,6 @@
+name: libgdata
+kind: chunk
+build-system: autotools
+configure-commands:
+# Disable these cause we're too lazy to build libuhttpmock
+- ./autogen.sh --prefix="$PREFIX" --disable-installed-tests --disable-always-build-tests
diff --git a/gnome/strata/gnome/libhangul.morph b/gnome/strata/gnome/libhangul.morph
new file mode 100644
index 00000000..f3df4601
--- /dev/null
+++ b/gnome/strata/gnome/libhangul.morph
@@ -0,0 +1,6 @@
+name: libhangul
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+# Avoid an autotools error at translation build time, simply dont build po directory
+- sed -i 's/SUBDIRS = hangul data tools po/SUBDIRS = hangul data tools/g' Makefile.am
diff --git a/gnome/strata/gnome/libpeas.morph b/gnome/strata/gnome/libpeas.morph
new file mode 100644
index 00000000..d5193600
--- /dev/null
+++ b/gnome/strata/gnome/libpeas.morph
@@ -0,0 +1,5 @@
+name: libpeas
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --enable-python3
diff --git a/gnome/strata/gnome/libpurple.morph b/gnome/strata/gnome/libpurple.morph
new file mode 100644
index 00000000..9bbe089b
--- /dev/null
+++ b/gnome/strata/gnome/libpurple.morph
@@ -0,0 +1,9 @@
+name: libpurple
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc \
+ --with-gstreamer=1.0 --disable-gtkui \
+ --disable-idn --disable-meanwhile \
+ --disable-tcl
diff --git a/gnome/strata/gnome/libpwquality.morph b/gnome/strata/gnome/libpwquality.morph
new file mode 100644
index 00000000..aefed50d
--- /dev/null
+++ b/gnome/strata/gnome/libpwquality.morph
@@ -0,0 +1,6 @@
+name: libpwquality
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc --with-securedir=/lib/security --disable-nls
diff --git a/gnome/strata/gnome/librest.morph b/gnome/strata/gnome/librest.morph
new file mode 100644
index 00000000..34503de3
--- /dev/null
+++ b/gnome/strata/gnome/librest.morph
@@ -0,0 +1,9 @@
+name: librest
+kind: chunk
+build-system: autotools
+configure-commands:
+#
+# Tell librest where the system CA certs are found, avoid depending on
+# an installed ca-certificates.
+#
+- ./autogen.sh --prefix="$PREFIX" --with-ca-certificates=/etc/ssl/certs/ca-certificates.crt
diff --git a/gnome/strata/gnome/libwnck.morph b/gnome/strata/gnome/libwnck.morph
new file mode 100644
index 00000000..bb8d7afa
--- /dev/null
+++ b/gnome/strata/gnome/libwnck.morph
@@ -0,0 +1,11 @@
+name: libwnck
+kind: chunk
+build-system: autotools
+configure-commands:
+- gdk-pixbuf-query-loaders > loader.cache
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --prefix="$PREFIX"
+build-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make
+install-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make install DESTDIR="$DESTDIR"
diff --git a/gnome/strata/gnome/mozjs24.morph b/gnome/strata/gnome/mozjs24.morph
new file mode 100644
index 00000000..a3254305
--- /dev/null
+++ b/gnome/strata/gnome/mozjs24.morph
@@ -0,0 +1,18 @@
+name: mozjs24
+kind: chunk
+build-system: manual
+configure-commands:
+- |
+ cd js/src;
+ ./configure --prefix="$PREFIX" \
+ --sysconfdir=/etc \
+ --with-system-nspr \
+ --with-system-ffi \
+ --enable-threadsafe
+build-commands:
+- |
+ cd js/src;
+ make
+install-commands:
+- cd js/src;
+ make DESTDIR="$DESTDIR" install
diff --git a/gnome/strata/gnome/mutter.morph b/gnome/strata/gnome/mutter.morph
new file mode 100644
index 00000000..334e3306
--- /dev/null
+++ b/gnome/strata/gnome/mutter.morph
@@ -0,0 +1,5 @@
+name: mutter
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --enable-compile-warnings=no
diff --git a/gnome/strata/gnome/nautilus.morph b/gnome/strata/gnome/nautilus.morph
new file mode 100644
index 00000000..3afe7fd7
--- /dev/null
+++ b/gnome/strata/gnome/nautilus.morph
@@ -0,0 +1,5 @@
+name: nautilus
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-xmp
diff --git a/gnome/strata/gnome/network-manager-applet.morph b/gnome/strata/gnome/network-manager-applet.morph
new file mode 100644
index 00000000..8b144ed8
--- /dev/null
+++ b/gnome/strata/gnome/network-manager-applet.morph
@@ -0,0 +1,5 @@
+name: network-manager-applet
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --without-selinux --without-team
diff --git a/gnome/strata/gnome/raptor.morph b/gnome/strata/gnome/raptor.morph
new file mode 100644
index 00000000..fe2d1321
--- /dev/null
+++ b/gnome/strata/gnome/raptor.morph
@@ -0,0 +1,5 @@
+name: raptor
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-gtk-doc
diff --git a/gnome/strata/gnome/telepathy-gabble.morph b/gnome/strata/gnome/telepathy-gabble.morph
new file mode 100644
index 00000000..fef9b8d6
--- /dev/null
+++ b/gnome/strata/gnome/telepathy-gabble.morph
@@ -0,0 +1,8 @@
+name: telepathy-gabble
+kind: chunk
+build-system: autotools
+configure-commands:
+#
+# Tell telepathy-gabble where to load the certificate bundle from.
+#
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --with-ca-certificates=/etc/ssl/certs/ca-certificates.crt
diff --git a/gnome/strata/gnome/telepathy-glib.morph b/gnome/strata/gnome/telepathy-glib.morph
new file mode 100644
index 00000000..1a262ae8
--- /dev/null
+++ b/gnome/strata/gnome/telepathy-glib.morph
@@ -0,0 +1,6 @@
+name: telepathy-glib
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var
+ --disable-Werror --enable-vala-bindings --disable-fatal-warnings
diff --git a/gnome/strata/gnome/telepathy-logger.morph b/gnome/strata/gnome/telepathy-logger.morph
new file mode 100644
index 00000000..38c90539
--- /dev/null
+++ b/gnome/strata/gnome/telepathy-logger.morph
@@ -0,0 +1,5 @@
+name: telepathy-logger
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc
diff --git a/gnome/strata/gnome/telepathy-salut.morph b/gnome/strata/gnome/telepathy-salut.morph
new file mode 100644
index 00000000..bdb50cbd
--- /dev/null
+++ b/gnome/strata/gnome/telepathy-salut.morph
@@ -0,0 +1,5 @@
+name: telepathy-salut
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --with-backend=avahi --disable-avahi-tests
diff --git a/gnome/strata/gnome/upower.morph b/gnome/strata/gnome/upower.morph
new file mode 100644
index 00000000..00e828bd
--- /dev/null
+++ b/gnome/strata/gnome/upower.morph
@@ -0,0 +1,5 @@
+name: upower
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-man-pages
diff --git a/gnome/strata/gnome/vte.morph b/gnome/strata/gnome/vte.morph
new file mode 100644
index 00000000..34552c20
--- /dev/null
+++ b/gnome/strata/gnome/vte.morph
@@ -0,0 +1,5 @@
+name: vte
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --enable-introspection=yes --without-pcre2 --enable-glade-catalogue
diff --git a/gnome/strata/gnome/yelp.morph b/gnome/strata/gnome/yelp.morph
new file mode 100644
index 00000000..86434a4a
--- /dev/null
+++ b/gnome/strata/gnome/yelp.morph
@@ -0,0 +1,5 @@
+name: yelp
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --disable-Werror
diff --git a/gnome/strata/gnome/zeitgeist.morph b/gnome/strata/gnome/zeitgeist.morph
new file mode 100644
index 00000000..ec8dc87c
--- /dev/null
+++ b/gnome/strata/gnome/zeitgeist.morph
@@ -0,0 +1,5 @@
+name: zeitgeist
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --with-session-bus-services-dir="$PREFIX"/share/dbus-1/services
diff --git a/gnome/systems/gnome-system-armv7lhf-jetson.morph b/gnome/systems/gnome-system-armv7lhf-jetson.morph
new file mode 100644
index 00000000..ab99e493
--- /dev/null
+++ b/gnome/systems/gnome-system-armv7lhf-jetson.morph
@@ -0,0 +1,94 @@
+name: gnome-system-armv7lhf-jetson
+kind: system
+description: A GNOME system system.
+arch: armv7lhf
+strata:
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: bsp-jetson
+ morph: strata/bsp-jetson.morph
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: NetworkManager-common
+ morph: strata/NetworkManager-common.morph
+- name: core
+ morph: strata/core.morph
+- name: data-indexing-management
+ morph: strata/data-indexing-management.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: dlna-services
+ morph: strata/dlna-services.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: geolocation
+ morph: strata/geolocation.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: gnome
+ morph: gnome/strata/gnome.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: gtk-deps
+ morph: strata/gtk-deps.morph
+- name: gtk2
+ morph: strata/gtk2.morph
+- name: gtk3
+ morph: strata/gtk3.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: llvm-common
+ morph: strata/llvm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python3-gobject
+ morph: strata/python3-gobject.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: weston-common
+ morph: strata/weston-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: x-drivers
+ morph: strata/x-drivers.morph
+- name: x-generic
+ morph: strata/x-generic.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: flatpak-common
+ morph: gnome/strata/flatpak-common.morph
+- name: network-security
+ morph: strata/network-security.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+- name: samba
+ morph: strata/samba.morph
+- name: secret-service
+ morph: strata/secret-service.morph
+- name: spell-checking
+ morph: strata/spell-checking.morph
+- name: storage-management
+ morph: strata/storage-management.morph
+- name: cups
+ morph: strata/cups.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/gnome/systems/gnome-system-x86_64.morph b/gnome/systems/gnome-system-x86_64.morph
new file mode 100644
index 00000000..c7fb60b1
--- /dev/null
+++ b/gnome/systems/gnome-system-x86_64.morph
@@ -0,0 +1,102 @@
+name: gnome-system-x86_64
+kind: system
+description: A GNOME system system.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: NetworkManager-common
+ morph: strata/NetworkManager-common.morph
+- name: core
+ morph: strata/core.morph
+- name: data-indexing-management
+ morph: strata/data-indexing-management.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: dlna-services
+ morph: strata/dlna-services.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: geolocation
+ morph: strata/geolocation.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: gnome
+ morph: gnome/strata/gnome.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: gtk-deps
+ morph: strata/gtk-deps.morph
+- name: gtk2
+ morph: strata/gtk2.morph
+- name: gtk3
+ morph: strata/gtk3.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: llvm-common
+ morph: strata/llvm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-hardware-codecs-x86
+ morph: strata/multimedia-hardware-codecs-x86.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: multimedia-gstreamer-openmax-generic
+ morph: strata/multimedia-gstreamer-openmax-generic.morph
+- name: privileges-management
+ morph: strata/privileges-management.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python3-gobject
+ morph: strata/python3-gobject.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: vala-common
+ morph: strata/vala-common.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: weston-common
+ morph: strata/weston-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: x-drivers
+ morph: strata/x-drivers.morph
+- name: x-generic
+ morph: strata/x-generic.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: flatpak-common
+ morph: gnome/strata/flatpak-common.morph
+- name: network-security
+ morph: strata/network-security.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+- name: samba
+ morph: strata/samba.morph
+- name: secret-service
+ morph: strata/secret-service.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: spell-checking
+ morph: strata/spell-checking.morph
+- name: storage-management
+ morph: strata/storage-management.morph
+- name: cups
+ morph: strata/cups.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/install-files/chef/manifest b/install-files/chef/manifest
new file mode 100644
index 00000000..de6cc542
--- /dev/null
+++ b/install-files/chef/manifest
@@ -0,0 +1,3 @@
+0040755 0 0 /root
+0040700 1000 1000 /root/.ssh
+0100600 1000 1000 /root/.ssh/authorized_keys
diff --git a/install-files/distbuild/lib/systemd/system-generators/ccache-nfs-mount-generator b/install-files/distbuild/lib/systemd/system-generators/ccache-nfs-mount-generator
new file mode 100755
index 00000000..127bc84f
--- /dev/null
+++ b/install-files/distbuild/lib/systemd/system-generators/ccache-nfs-mount-generator
@@ -0,0 +1,16 @@
+#!/bin/sh
+read trove_host </etc/trove-host
+while read line; do echo "$line"; done >"$1/srv-distbuild-ccache.mount" <<EOF
+[Unit]
+Requires=rpcbind.service
+After=rpcbind.service
+SourcePath=/etc/trove-host
+
+[Mount]
+Type=nfs
+What=$trove_host:/home/cache/ccache
+Where=/srv/distbuild/ccache
+
+[Install]
+WantedBy=morph-worker.service
+EOF
diff --git a/install-files/distbuild/manifest b/install-files/distbuild/manifest
new file mode 100644
index 00000000..9363fa85
--- /dev/null
+++ b/install-files/distbuild/manifest
@@ -0,0 +1,28 @@
+0040755 0 0 /lib
+0040755 0 0 /lib/systemd
+0040755 0 0 /lib/systemd/system-generators
+0100755 0 0 /lib/systemd/system-generators/ccache-nfs-mount-generator
+0040755 0 0 /usr
+0040755 0 0 /usr/lib
+0040755 0 0 /usr/lib/distbuild-setup
+0040755 0 0 /usr/lib/distbuild-setup/ansible
+0100644 0 0 /usr/lib/distbuild-setup/ansible/hosts
+0100644 0 0 /usr/lib/distbuild-setup/ansible/distbuild-setup.yml
+0040755 0 0 /usr/lib/systemd
+0040755 0 0 /usr/lib/systemd/system
+0100644 0 0 /usr/lib/systemd/system/morph-cache-server.service
+0100644 0 0 /usr/lib/systemd/system/morph-controller.service
+0100644 0 0 /usr/lib/systemd/system/morph-controller-helper.service
+0100644 0 0 /usr/lib/systemd/system/morph-worker.service
+0100644 0 0 /usr/lib/systemd/system/morph-worker-helper.service
+0100644 0 0 /usr/lib/systemd/system/distbuild-setup.service
+0040755 0 0 /usr/lib/systemd/system/multi-user.target.wants
+0120644 0 0 /usr/lib/systemd/system/multi-user.target.wants/distbuild-setup.service
+0040755 0 0 /usr/share
+0040755 0 0 /usr/share/distbuild-setup
+0100644 0 0 /usr/share/distbuild-setup/morph.conf
+0100644 0 0 /usr/share/distbuild-setup/morph-cache-server.conf
+0100644 0 0 /usr/share/distbuild-setup/morph-controller.conf
+0100644 0 0 /usr/share/distbuild-setup/morph-controller-helper.conf
+0100644 0 0 /usr/share/distbuild-setup/morph-worker.conf
+0100644 0 0 /usr/share/distbuild-setup/morph-worker-helper.conf
diff --git a/install-files/distbuild/usr/lib/distbuild-setup/ansible/distbuild-setup.yml b/install-files/distbuild/usr/lib/distbuild-setup/ansible/distbuild-setup.yml
new file mode 100644
index 00000000..c3074c63
--- /dev/null
+++ b/install-files/distbuild/usr/lib/distbuild-setup/ansible/distbuild-setup.yml
@@ -0,0 +1,115 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/distbuild/distbuild.conf"
+ tasks:
+
+ - set_fact: ARTIFACT_CACHE_SERVER={{ TROVE_HOST }}
+ when: ARTIFACT_CACHE_SERVER is not defined
+
+ - name: Create mountpoint for extra disk space /srv/distbuild/
+ file: path=/srv/distbuild state=directory owner=root group=root mode=0755
+
+ - name: Create the morph and morph-cache-server configuration files
+ template: src=/usr/share/distbuild-setup/{{ item }} dest=/etc/{{ item }}
+ with_items:
+ - morph.conf
+ - morph-cache-server.conf
+
+ - name: Link the morph log file
+ file: src=/srv/distbuild/morph.log dest=/var/log/morph.log state=link force=yes
+
+ - name: Create the controller configuration files
+ template: src=/usr/share/distbuild-setup/{{ item }} dest=/etc/{{ item }}
+ with_items:
+ - morph-controller.conf
+ - morph-controller-helper.conf
+ when: DISTBUILD_CONTROLLER
+
+ - name: Link the controller log files
+ file: src=/srv/distbuild/{{ item }} dest=/var/log/{{ item }} state=link force=yes
+ with_items:
+ - morph-controller.log
+ - morph-controller-helper.log
+ when: DISTBUILD_CONTROLLER
+
+ - name: Create the worker configuration files
+ template: src=/usr/share/distbuild-setup/{{ item }} dest=/etc/{{ item }}
+ with_items:
+ - morph-worker.conf
+ - morph-worker-helper.conf
+ when: DISTBUILD_WORKER
+
+ - name: Link the controller log files
+ file: src=/srv/distbuild/{{ item }} dest=/var/log/{{ item }} state=link force=yes
+ with_items:
+ - morph-worker.log
+ - morph-worker-helper.log
+ when: DISTBUILD_WORKER
+
+ - name: Create /root/.ssh directory
+ file: path=/root/.ssh state=directory owner=root group=root mode=0700
+
+ - name: Copy the worker ssh key
+ copy: src={{ WORKER_SSH_KEY }} dest=/root/.ssh/id_rsa owner=root group=root mode=0600
+
+ - name: Create ssh public key
+ shell: ssh-keygen -y -f /root/.ssh/id_rsa > /root/.ssh/id_rsa.pub creates=/root/.ssh/id_rsa.pub
+
+ - name: Add trove's host key
+ shell: |
+ trove_key="$(ssh-keyscan -t dsa,ecdsa,rsa {{ TROVE_HOST|quote }})"
+ if [ -n "$trove_key" ]; then
+ echo "$trove_key" > /etc/ssh/ssh_known_hosts
+ fi
+ creates=/etc/ssh/ssh_known_hosts
+
+ # This is a kludge. We can add the host key for the TROVE_HOST that was
+ # specified, but users may access the Trove by other names, e.g. IP address
+ # or domain name. Distbuild is currently not safe to run except on a private
+ # network where host key checking is not important, so we disable it by
+ # default to avoid errors when users don't stick to using the exact same
+ # TROVE_HOST in repo URLs.
+ - name: Disable strict SSH host key checking
+ lineinfile:
+ dest: /etc/ssh/ssh_config
+ line: StrictHostKeyChecking no
+
+ - name: Enable the morph-cache-server service
+ service: name=morph-cache-server.service enabled=yes
+ register: morph_cache_server_service
+ - name: Restart the morph-cache-server service
+ service: name=morph-cache-server state=restarted
+ when: morph_cache_server_service|changed
+
+ - name: Enable the morph-worker service
+ service: name=morph-worker.service enabled=yes
+ register: morph_worker_service
+ when: DISTBUILD_WORKER
+ - name: Restart the morph-worker service
+ service: name=morph-worker state=restarted
+ when: morph_worker_service|changed
+
+ - name: Enable the morph-worker-helper service
+ service: name=morph-worker-helper.service enabled=yes
+ register: morph_worker_helper_service
+ when: DISTBUILD_WORKER
+ - name: Restart the morph-worker-helper service
+ service: name=morph-worker-helper state=restarted
+ when: morph_worker_helper_service|changed
+
+ - name: Enable the morph-controller service
+ service: name=morph-controller.service enabled=yes
+ register: morph_controller_service
+ when: DISTBUILD_CONTROLLER
+ - name: Restart the morph-controller service
+ service: name=morph-controller state=restarted
+ when: morph_controller_service|changed
+
+ - name: Enable the morph-controller-helper service
+ service: name=morph-controller-helper.service enabled=yes
+ register: morph_controller_helper_service
+ when: DISTBUILD_CONTROLLER
+ - name: Restart the morph-controller-helper service
+ service: name=morph-controller-helper state=restarted
+ when: morph_controller_helper_service|changed
diff --git a/install-files/distbuild/usr/lib/distbuild-setup/ansible/hosts b/install-files/distbuild/usr/lib/distbuild-setup/ansible/hosts
new file mode 100644
index 00000000..5b97818d
--- /dev/null
+++ b/install-files/distbuild/usr/lib/distbuild-setup/ansible/hosts
@@ -0,0 +1 @@
+localhost ansible_connection=local
diff --git a/install-files/distbuild/usr/lib/systemd/system/distbuild-setup.service b/install-files/distbuild/usr/lib/systemd/system/distbuild-setup.service
new file mode 100644
index 00000000..ec5f5a2d
--- /dev/null
+++ b/install-files/distbuild/usr/lib/systemd/system/distbuild-setup.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Run distbuild-setup Ansible scripts
+Requires=network.target
+After=network.target
+Requires=opensshd.service
+After=opensshd.service
+
+# If there's a shared /var subvolume, it must be mounted before this
+# unit runs.
+Requires=local-fs.target
+After=local-fs.target
+
+ConditionPathExists=/etc/distbuild/distbuild.conf
+
+[Service]
+ExecStart=/usr/bin/ansible-playbook -v -i /usr/lib/distbuild-setup/ansible/hosts /usr/lib/distbuild-setup/ansible/distbuild-setup.yml
diff --git a/install-files/distbuild/usr/lib/systemd/system/morph-cache-server.service b/install-files/distbuild/usr/lib/systemd/system/morph-cache-server.service
new file mode 100644
index 00000000..f55f3b6d
--- /dev/null
+++ b/install-files/distbuild/usr/lib/systemd/system/morph-cache-server.service
@@ -0,0 +1,12 @@
+[Install]
+WantedBy=multi-user.target
+
+[Unit]
+Description=Morph cache server
+Requires=local-fs.target network.target
+After=local-fs.target network.target
+ConditionPathExists=/etc/morph-cache-server.conf
+
+[Service]
+ExecStart=/usr/bin/morph-cache-server
+Restart=always
diff --git a/install-files/distbuild/usr/lib/systemd/system/morph-controller-helper.service b/install-files/distbuild/usr/lib/systemd/system/morph-controller-helper.service
new file mode 100644
index 00000000..3f30cbcf
--- /dev/null
+++ b/install-files/distbuild/usr/lib/systemd/system/morph-controller-helper.service
@@ -0,0 +1,13 @@
+[Install]
+WantedBy=multi-user.target
+
+[Unit]
+Description=Morph distributed build controller helper
+Requires=morph-controller.service
+After=morph-controller.service
+ConditionPathExists=/etc/morph-controller.conf
+ConditionPathExists=/etc/morph-controller-helper.conf
+
+[Service]
+ExecStart=/usr/bin/distbuild-helper --config /etc/morph-controller-helper.conf
+Restart=always
diff --git a/install-files/distbuild/usr/lib/systemd/system/morph-controller.service b/install-files/distbuild/usr/lib/systemd/system/morph-controller.service
new file mode 100644
index 00000000..1556d232
--- /dev/null
+++ b/install-files/distbuild/usr/lib/systemd/system/morph-controller.service
@@ -0,0 +1,12 @@
+[Install]
+WantedBy=multi-user.target
+
+[Unit]
+Description=Morph distributed build controller
+Requires=local-fs.target network.target
+After=local-fs.target network.target
+ConditionPathExists=/etc/morph-controller.conf
+
+[Service]
+ExecStart=/usr/bin/morph controller-daemon --config /etc/morph-controller.conf
+Restart=always
diff --git a/install-files/distbuild/usr/lib/systemd/system/morph-worker-helper.service b/install-files/distbuild/usr/lib/systemd/system/morph-worker-helper.service
new file mode 100644
index 00000000..28400701
--- /dev/null
+++ b/install-files/distbuild/usr/lib/systemd/system/morph-worker-helper.service
@@ -0,0 +1,13 @@
+[Install]
+WantedBy=multi-user.target
+
+[Unit]
+Description=Morph distributed build worker helper
+Requires=morph-worker.service
+After=morph-worker.service
+ConditionPathExists=/etc/morph-worker.conf
+ConditionPathExists=/etc/morph-worker-helper.conf
+
+[Service]
+ExecStart=/usr/bin/distbuild-helper --config /etc/morph-worker-helper.conf
+Restart=always
diff --git a/install-files/distbuild/usr/lib/systemd/system/morph-worker.service b/install-files/distbuild/usr/lib/systemd/system/morph-worker.service
new file mode 100644
index 00000000..90fea404
--- /dev/null
+++ b/install-files/distbuild/usr/lib/systemd/system/morph-worker.service
@@ -0,0 +1,13 @@
+[Install]
+WantedBy=multi-user.target
+
+[Unit]
+Description=Morph distributed build worker
+Requires=local-fs.target network.target
+Wants=srv-distbuild-ccache.mount
+After=local-fs.target network.target srv-distbuild-ccache.mount
+ConditionPathExists=/etc/morph-worker.conf
+
+[Service]
+ExecStart=/usr/bin/morph worker-daemon --config /etc/morph-worker.conf
+Restart=always
diff --git a/install-files/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
new file mode 120000
index 00000000..8f06febd
--- /dev/null
+++ b/install-files/distbuild/usr/lib/systemd/system/multi-user.target.wants/distbuild-setup.service
@@ -0,0 +1 @@
+../distbuild-setup.service \ No newline at end of file
diff --git a/install-files/distbuild/usr/share/distbuild-setup/morph-cache-server.conf b/install-files/distbuild/usr/share/distbuild-setup/morph-cache-server.conf
new file mode 100644
index 00000000..b9020e7d
--- /dev/null
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph-cache-server.conf
@@ -0,0 +1,5 @@
+[config]
+port = 8080
+artifact-dir = /srv/distbuild/artifacts
+direct-mode = True
+fcgi-server = False
diff --git a/install-files/distbuild/usr/share/distbuild-setup/morph-controller-helper.conf b/install-files/distbuild/usr/share/distbuild-setup/morph-controller-helper.conf
new file mode 100644
index 00000000..99d38739
--- /dev/null
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph-controller-helper.conf
@@ -0,0 +1,5 @@
+[config]
+log = /srv/distbuild/morph-controller-helper.log
+log-max = 100M
+parent-port = 5656
+parent-address = 127.0.0.1
diff --git a/install-files/distbuild/usr/share/distbuild-setup/morph-controller.conf b/install-files/distbuild/usr/share/distbuild-setup/morph-controller.conf
new file mode 100644
index 00000000..c16c0343
--- /dev/null
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph-controller.conf
@@ -0,0 +1,6 @@
+[config]
+log = /srv/distbuild/morph-controller.log
+log-max = 100M
+writeable-cache-server = http://{{ ARTIFACT_CACHE_SERVER }}:8081/
+worker = {{ WORKERS }}
+controller-helper-address = 127.0.0.1
diff --git a/install-files/distbuild/usr/share/distbuild-setup/morph-worker-helper.conf b/install-files/distbuild/usr/share/distbuild-setup/morph-worker-helper.conf
new file mode 100644
index 00000000..29d4ef3f
--- /dev/null
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph-worker-helper.conf
@@ -0,0 +1,4 @@
+[config]
+log = /srv/distbuild/morph-worker-helper.log
+log-max = 100M
+parent-address = 127.0.0.1
diff --git a/install-files/distbuild/usr/share/distbuild-setup/morph-worker.conf b/install-files/distbuild/usr/share/distbuild-setup/morph-worker.conf
new file mode 100644
index 00000000..fb382bad
--- /dev/null
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph-worker.conf
@@ -0,0 +1,4 @@
+[config]
+log = /srv/distbuild/morph-worker.log
+log-max = 100M
+controller-initiator-address =
diff --git a/install-files/distbuild/usr/share/distbuild-setup/morph.conf b/install-files/distbuild/usr/share/distbuild-setup/morph.conf
new file mode 100644
index 00000000..29de684c
--- /dev/null
+++ b/install-files/distbuild/usr/share/distbuild-setup/morph.conf
@@ -0,0 +1,13 @@
+[config]
+log = /srv/distbuild/morph.log
+log-max = 100M
+cachedir = /srv/distbuild
+tempdir = /srv/distbuild/tmp
+trove-host = {{ TROVE_HOST }}
+trove-id = {{ TROVE_ID }}
+controller-initiator-address = {{ CONTROLLERHOST }}
+tempdir-min-space = 4G
+cachedir-min-space = 4G
+build-ref-prefix = {{ TROVE_ID }}
+artifact-cache-server = http://{{ ARTIFACT_CACHE_SERVER }}:8080/
+git-resolve-cache-server = http://{{ TROVE_HOST }}:8080/
diff --git a/install-files/essential-files/etc/inputrc b/install-files/essential-files/etc/inputrc
new file mode 100644
index 00000000..ddee44cd
--- /dev/null
+++ b/install-files/essential-files/etc/inputrc
@@ -0,0 +1,38 @@
+# Allow the command prompt to wrap to the next line
+set horizontal-scroll-mode Off
+
+# Enable 8bit input
+set meta-flag On
+set input-meta On
+
+# Turns off 8th bit stripping
+set convert-meta Off
+
+# Keep the 8th bit for display
+set output-meta On
+
+# none, visible or audible
+set bell-style none
+
+# for linux console and RH/Debian xterm
+"\e[1~": beginning-of-line
+"\e[4~": end-of-line
+"\e[5~": beginning-of-history
+"\e[6~": end-of-history
+"\e[7~": beginning-of-line
+"\e[3~": delete-char
+"\e[2~": quoted-insert
+"\e[5C": forward-word
+"\e[5D": backward-word
+"\e\e[C": forward-word
+"\e\e[D": backward-word
+"\e[1;5C": forward-word
+"\e[1;5D": backward-word
+
+# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
+"\eOH": beginning-of-line
+"\eOF": end-of-line
+
+# for Konsole and freebsd console
+"\e[H": beginning-of-line
+"\e[F": end-of-line
diff --git a/install-files/essential-files/etc/os-release b/install-files/essential-files/etc/os-release
new file mode 120000
index 00000000..c4c75b41
--- /dev/null
+++ b/install-files/essential-files/etc/os-release
@@ -0,0 +1 @@
+../usr/lib/os-release \ No newline at end of file
diff --git a/install-files/essential-files/etc/profile b/install-files/essential-files/etc/profile
new file mode 100644
index 00000000..5c0a1331
--- /dev/null
+++ b/install-files/essential-files/etc/profile
@@ -0,0 +1,13 @@
+# /etc/profile
+
+# Set our default path
+PATH="/usr/local/bin:/usr/bin"
+export PATH
+
+# Source global bash config
+if test "$PS1" && test "$BASH" && test -r /etc/bash.bashrc; then
+ . /etc/bash.bashrc
+fi
+
+# Set default pager to less
+export MANPAGER='less -R'
diff --git a/install-files/essential-files/manifest b/install-files/essential-files/manifest
new file mode 100644
index 00000000..93095d86
--- /dev/null
+++ b/install-files/essential-files/manifest
@@ -0,0 +1,11 @@
+0040755 0 0 /etc
+overwrite 0120000 0 0 /etc/os-release
+overwrite 0100644 0 0 /etc/profile
+overwrite 0100644 0 0 /etc/inputrc
+0040755 0 0 /usr
+0040755 0 0 /usr/bin
+0100755 0 0 /usr/bin/brpaste
+0040755 0 0 /usr/lib
+0100644 0 0 /usr/lib/os-release
+0040755 0 0 /usr/lib/tmpfiles.d
+0100644 0 0 /usr/lib/tmpfiles.d/shutdownramfs.conf
diff --git a/install-files/essential-files/usr/bin/brpaste b/install-files/essential-files/usr/bin/brpaste
new file mode 100644
index 00000000..d2f9d867
--- /dev/null
+++ b/install-files/essential-files/usr/bin/brpaste
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+
+import urllib.request
+import os
+import json
+
+URL = 'http://paste.baserock.org/documents'
+
+def run(*args):
+ if args:
+ content = [open(x).read() for x in args]
+ extensions = [os.path.splitext(x)[1] for x in args]
+ else:
+ content = [sys.stdin.read()]
+ extensions = [None]
+
+ for i, each in enumerate(content):
+ req = urllib.request.Request(URL, each.encode('utf-8'))
+ response = urllib.request.urlopen(req)
+ the_page = response.read().decode('utf-8')
+ key = json.loads(the_page)['key']
+ url = "http://paste.baserock.org/%s" % key
+ if extensions[i]:
+ url += extensions[i]
+ print(url)
+
+if __name__ == '__main__':
+ import sys
+ sys.exit(run(*sys.argv[1:]))
diff --git a/install-files/essential-files/usr/lib/os-release b/install-files/essential-files/usr/lib/os-release
new file mode 100644
index 00000000..b729c75f
--- /dev/null
+++ b/install-files/essential-files/usr/lib/os-release
@@ -0,0 +1,5 @@
+NAME="Baserock"
+ID=baserock
+HOME_URL="http://wiki.baserock.org"
+SUPPORT_URL="http://wiki.baserock.org/mailinglist"
+BUG_REPORT_URL="http://wiki.baserock.org/mailinglist"
diff --git a/install-files/essential-files/usr/lib/tmpfiles.d/shutdownramfs.conf b/install-files/essential-files/usr/lib/tmpfiles.d/shutdownramfs.conf
new file mode 100644
index 00000000..174f1f03
--- /dev/null
+++ b/install-files/essential-files/usr/lib/tmpfiles.d/shutdownramfs.conf
@@ -0,0 +1,4 @@
+# If /usr/lib/shutdownramfs has been populated, copy it into /run/initramfs so
+# /run/initramfs/shutdown will be executed on shut-down, so that it may unmount
+# the rootfs.
+C /run/initramfs - - - - /usr/lib/shutdownramfs
diff --git a/install-files/genivi-devel-system-armv7/etc/morph.conf b/install-files/genivi-devel-system-armv7/etc/morph.conf
new file mode 120000
index 00000000..8f384049
--- /dev/null
+++ b/install-files/genivi-devel-system-armv7/etc/morph.conf
@@ -0,0 +1 @@
+/src/morph.conf \ No newline at end of file
diff --git a/install-files/genivi-devel-system-armv7/manifest b/install-files/genivi-devel-system-armv7/manifest
new file mode 100644
index 00000000..31980633
--- /dev/null
+++ b/install-files/genivi-devel-system-armv7/manifest
@@ -0,0 +1,5 @@
+0040755 0 0 /src
+0040755 0 0 /src/tmp
+0100666 0 0 /src/morph.conf
+0040755 0 0 /etc
+0120666 0 0 /etc/morph.conf
diff --git a/install-files/genivi-devel-system-armv7/src/morph.conf b/install-files/genivi-devel-system-armv7/src/morph.conf
new file mode 100644
index 00000000..76b6fde9
--- /dev/null
+++ b/install-files/genivi-devel-system-armv7/src/morph.conf
@@ -0,0 +1,5 @@
+[config]
+log = /src/morph.log
+cachedir = /src/cache
+tempdir = /src/tmp
+staging-chroot = true
diff --git a/install-files/gnome/etc/pam.d/gdm b/install-files/gnome/etc/pam.d/gdm
new file mode 100644
index 00000000..42036102
--- /dev/null
+++ b/install-files/gnome/etc/pam.d/gdm
@@ -0,0 +1,15 @@
+# Baserock customized /etc/pam.d/gdm
+#
+
+auth requisite pam_nologin.so
+auth required pam_env.so
+
+auth required pam_succeed_if.so uid >= 1000 quiet
+auth include system-auth
+
+account include system-auth
+password include system-auth
+
+session optional pam_keyinit.so force revoke
+session include system-auth
+session required pam_loginuid.so
diff --git a/install-files/gnome/etc/pam.d/gdm-autologin b/install-files/gnome/etc/pam.d/gdm-autologin
new file mode 100644
index 00000000..c99449ac
--- /dev/null
+++ b/install-files/gnome/etc/pam.d/gdm-autologin
@@ -0,0 +1,17 @@
+# Baserock customized /etc/pam.d/gdm-autologin
+#
+
+auth requisite pam_nologin.so
+auth required pam_env.so
+
+auth required pam_succeed_if.so uid >= 1000 quiet
+auth required pam_permit.so
+auth optional pam_gnome_keyring.so
+
+account include system-auth
+password include system-auth
+
+session required pam_loginuid.so
+session optional pam_keyinit.so force revoke
+session required pam_namespace.so
+session include system-auth
diff --git a/install-files/gnome/etc/pam.d/gdm-launch-environment b/install-files/gnome/etc/pam.d/gdm-launch-environment
new file mode 100644
index 00000000..f63c80fa
--- /dev/null
+++ b/install-files/gnome/etc/pam.d/gdm-launch-environment
@@ -0,0 +1,11 @@
+# Baserock customized /etc/pam.d/gdm-launch-environment
+#
+
+auth required pam_env.so
+auth optional pam_permit.so
+
+account include system-auth
+password include system-auth
+
+session optional pam_keyinit.so force revoke
+session include system-auth
diff --git a/install-files/gnome/etc/pam.d/gdm-password b/install-files/gnome/etc/pam.d/gdm-password
new file mode 100644
index 00000000..798d40a6
--- /dev/null
+++ b/install-files/gnome/etc/pam.d/gdm-password
@@ -0,0 +1,24 @@
+# Baserock customized /etc/pam.d/gdm-password
+#
+# This configuration ensures that the default keyring
+# is unlocked at gdm login time, and also that the
+# authentication token is used to update the keyring
+# when the password is set.
+
+auth requisite pam_nologin.so
+auth required pam_env.so
+
+auth required pam_succeed_if.so uid >= 1000 quiet
+auth substack system-auth
+auth optional pam_gnome_keyring.so
+
+account include system-auth
+password substack system-auth
+password optional pam_gnome_keyring.so use_authtok
+
+session required pam_limits.so
+session required pam_loginuid.so
+session optional pam_keyinit.so force revoke
+session required pam_namespace.so
+session substack system-auth
+session optional pam_gnome_keyring.so auto_start
diff --git a/install-files/gnome/etc/pam.d/passwd b/install-files/gnome/etc/pam.d/passwd
new file mode 100644
index 00000000..e0c98057
--- /dev/null
+++ b/install-files/gnome/etc/pam.d/passwd
@@ -0,0 +1,10 @@
+# Baserock customized /etc/pam.d/passwd
+#
+# This configuration ensures authentication token
+# is used to update the keyring when the password is set
+# using the regular passwd mechanism
+
+auth include system-auth
+account include system-auth
+password substack system-auth
+password optional pam_gnome_keyring.so use_authtok
diff --git a/install-files/gnome/etc/pam.d/system-auth b/install-files/gnome/etc/pam.d/system-auth
new file mode 100644
index 00000000..73d3968c
--- /dev/null
+++ b/install-files/gnome/etc/pam.d/system-auth
@@ -0,0 +1,19 @@
+# Baserock customized /etc/pam.d/system-auth
+#
+# This configuration is modified from the upstream
+# systemd provided file mostly because the upstream file
+# tries to pass the invalid 'try_authtok' option to the
+# pam_unix.so module.
+
+auth sufficient pam_unix.so nullok try_first_pass
+auth requisite pam_deny.so
+
+account required pam_nologin.so
+account sufficient pam_unix.so
+
+password sufficient pam_unix.so nullok sha512 shadow try_first_pass
+password required pam_deny.so
+
+-session optional pam_loginuid.so
+-session optional pam_systemd.so
+session sufficient pam_unix.so
diff --git a/install-files/gnome/etc/securetty b/install-files/gnome/etc/securetty
new file mode 100644
index 00000000..e3dfb6c4
--- /dev/null
+++ b/install-files/gnome/etc/securetty
@@ -0,0 +1,8 @@
+tty1
+#tty2
+#tty3
+#tty4
+#tty5
+#tty6
+#tty7
+#tty8
diff --git a/install-files/gnome/etc/ssh/sshd_config b/install-files/gnome/etc/ssh/sshd_config
new file mode 100644
index 00000000..aaab3cca
--- /dev/null
+++ b/install-files/gnome/etc/ssh/sshd_config
@@ -0,0 +1,135 @@
+# $OpenBSD: sshd_config,v 1.93 2014/01/10 05:59:19 djm Exp $
+
+# This is the sshd server system-wide configuration file. See
+# sshd_config(5) for more information.
+
+# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
+
+# The strategy used for options in the default sshd_config shipped with
+# OpenSSH is to specify options with their default value where
+# possible, but leave them commented. Uncommented options override the
+# default value.
+
+#Port 22
+#AddressFamily any
+#ListenAddress 0.0.0.0
+#ListenAddress ::
+
+# The default requires explicit activation of protocol 1
+#Protocol 2
+
+# HostKey for protocol version 1
+#HostKey /etc/ssh/ssh_host_key
+# HostKeys for protocol version 2
+#HostKey /etc/ssh/ssh_host_rsa_key
+#HostKey /etc/ssh/ssh_host_dsa_key
+#HostKey /etc/ssh/ssh_host_ecdsa_key
+#HostKey /etc/ssh/ssh_host_ed25519_key
+
+# Lifetime and size of ephemeral version 1 server key
+#KeyRegenerationInterval 1h
+#ServerKeyBits 1024
+
+# Ciphers and keying
+#RekeyLimit default none
+
+# Logging
+# obsoletes QuietMode and FascistLogging
+#SyslogFacility AUTH
+#LogLevel INFO
+
+# Authentication:
+
+#LoginGraceTime 2m
+#PermitRootLogin yes
+#StrictModes yes
+#MaxAuthTries 6
+#MaxSessions 10
+
+#RSAAuthentication yes
+#PubkeyAuthentication yes
+
+# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
+# but this is overridden so installations will only check .ssh/authorized_keys
+AuthorizedKeysFile .ssh/authorized_keys
+
+#AuthorizedPrincipalsFile none
+
+#AuthorizedKeysCommand none
+#AuthorizedKeysCommandUser nobody
+
+# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
+#RhostsRSAAuthentication no
+# similar for protocol version 2
+#HostbasedAuthentication no
+# Change to yes if you don't trust ~/.ssh/known_hosts for
+# RhostsRSAAuthentication and HostbasedAuthentication
+#IgnoreUserKnownHosts no
+# Don't read the user's ~/.rhosts and ~/.shosts files
+#IgnoreRhosts yes
+
+# To disable tunneled clear text passwords, change to no here!
+#PasswordAuthentication yes
+#PermitEmptyPasswords no
+
+# Change to no to disable s/key passwords
+#ChallengeResponseAuthentication yes
+
+# Kerberos options
+#KerberosAuthentication no
+#KerberosOrLocalPasswd yes
+#KerberosTicketCleanup yes
+#KerberosGetAFSToken no
+
+# GSSAPI options
+#GSSAPIAuthentication no
+#GSSAPICleanupCredentials yes
+
+# Set this to 'yes' to enable PAM authentication, account processing,
+# and session processing. If this is enabled, PAM authentication will
+# be allowed through the ChallengeResponseAuthentication and
+# PasswordAuthentication. Depending on your PAM configuration,
+# PAM authentication via ChallengeResponseAuthentication may bypass
+# the setting of "PermitRootLogin without-password".
+# If you just want the PAM account and session checks to run without
+# PAM authentication, then enable this but set PasswordAuthentication
+# and ChallengeResponseAuthentication to 'no'.
+UsePAM yes
+
+#AllowAgentForwarding yes
+#AllowTcpForwarding yes
+#GatewayPorts no
+#X11Forwarding no
+#X11DisplayOffset 10
+#X11UseLocalhost yes
+#PermitTTY yes
+#PrintMotd yes
+#PrintLastLog yes
+#TCPKeepAlive yes
+#UseLogin no
+UsePrivilegeSeparation sandbox # Default for new installations.
+PermitUserEnvironment yes
+#Compression delayed
+#ClientAliveInterval 0
+#ClientAliveCountMax 3
+#UseDNS yes
+#PidFile /var/run/sshd.pid
+#MaxStartups 10:30:100
+#PermitTunnel no
+#ChrootDirectory none
+#VersionAddendum none
+
+# no default banner path
+#Banner none
+
+# override default of no subsystems
+Subsystem sftp /usr/lib/openssh/sftp-server
+
+# Example of overriding settings on a per-user basis
+#Match User anoncvs
+# X11Forwarding no
+# AllowTcpForwarding no
+# PermitTTY no
+# ForceCommand cvs server
+
+AcceptEnv LANG LC_*
diff --git a/install-files/gnome/manifest b/install-files/gnome/manifest
new file mode 100644
index 00000000..d72a5e89
--- /dev/null
+++ b/install-files/gnome/manifest
@@ -0,0 +1,9 @@
+0100644 0 0 /etc/securetty
+overwrite 0100644 0 0 /etc/ssh/sshd_config
+overwrite 0100644 0 0 /etc/pam.d/passwd
+overwrite 0100644 0 0 /etc/pam.d/system-auth
+overwrite 0100644 0 0 /etc/pam.d/gdm
+overwrite 0100644 0 0 /etc/pam.d/gdm-password
+overwrite 0100644 0 0 /etc/pam.d/gdm-autologin
+overwrite 0100644 0 0 /etc/pam.d/gdm-launch-environment
+0100644 0 0 /usr/share/polkit-1/rules.d/geoclue-2.0.rules
diff --git a/install-files/gnome/usr/share/polkit-1/rules.d/geoclue-2.0.rules b/install-files/gnome/usr/share/polkit-1/rules.d/geoclue-2.0.rules
new file mode 100644
index 00000000..aeb42345
--- /dev/null
+++ b/install-files/gnome/usr/share/polkit-1/rules.d/geoclue-2.0.rules
@@ -0,0 +1,7 @@
+polkit.addRule(function(action, subject) {
+ if ((action.id == "org.freedesktop.ModemManager1.Device.Control" ||
+ action.id == "org.freedesktop.ModemManager1.Location") &&
+ subject.user == "geoclue") {
+ return polkit.Result.YES;
+ }
+});
diff --git a/install-files/moonshot/boot/m400-1003.dtb b/install-files/moonshot/boot/m400-1003.dtb
new file mode 100644
index 00000000..d6fd83ee
--- /dev/null
+++ b/install-files/moonshot/boot/m400-1003.dtb
Binary files differ
diff --git a/install-files/moonshot/manifest b/install-files/moonshot/manifest
new file mode 100644
index 00000000..dd80fe49
--- /dev/null
+++ b/install-files/moonshot/manifest
@@ -0,0 +1,2 @@
+0040755 0 0 /boot
+0100744 0 0 /boot/m400-1003.dtb
diff --git a/install-files/openstack/etc/horizon/apache-horizon.conf b/install-files/openstack/etc/horizon/apache-horizon.conf
new file mode 100644
index 00000000..ab3cf0c7
--- /dev/null
+++ b/install-files/openstack/etc/horizon/apache-horizon.conf
@@ -0,0 +1,36 @@
+<VirtualHost *:80>
+ WSGIScriptAlias / /var/lib/horizon/openstack_dashboard/wsgi/django.wsgi
+ WSGIDaemonProcess horizon user=horizon group=horizon processes=3 threads=10 home=/var/lib/horizon display-name=horizon
+ WSGIApplicationGroup %{GLOBAL}
+
+ SetEnv APACHE_RUN_USER apache
+ SetEnv APACHE_RUN_GROUP apache
+ WSGIProcessGroup horizon
+
+ DocumentRoot /var/lib/horizon/.blackhole
+ Alias /static /var/lib/horizon/static
+
+ <Directory /var/lib/horizon/static>
+ Require all granted
+ </Directory>
+
+ <Directory /var/lib/horizon/openstack_dashboard >
+ Options Indexes FollowSymLinks MultiViews
+ AllowOverride None
+ # Apache 2.4 uses mod_authz_host for access control now (instead of
+ # "Allow")
+ <IfVersion < 2.4>
+ Order allow,deny
+ Allow from all
+ </IfVersion>
+ <IfVersion >= 2.4>
+ Require all granted
+ </IfVersion>
+ </Directory>
+
+ ErrorLog /var/log/httpd/horizon_error.log
+ LogLevel warn
+ CustomLog /var/log/httpd/horizon_access.log combined
+</VirtualHost>
+
+WSGISocketPrefix /var/run/httpd
diff --git a/install-files/openstack/etc/neutron/dnsmasq-neutron.conf b/install-files/openstack/etc/neutron/dnsmasq-neutron.conf
new file mode 100644
index 00000000..d2659481
--- /dev/null
+++ b/install-files/openstack/etc/neutron/dnsmasq-neutron.conf
@@ -0,0 +1,2 @@
+# Provide a MTU (DHCP MTU option 26)
+dhcp-option-force=26,1454
diff --git a/install-files/openstack/etc/tempest/set_openstack_to_run_tempest.sh b/install-files/openstack/etc/tempest/set_openstack_to_run_tempest.sh
new file mode 100755
index 00000000..8c0b8da3
--- /dev/null
+++ b/install-files/openstack/etc/tempest/set_openstack_to_run_tempest.sh
@@ -0,0 +1,122 @@
+#!/bin/bash
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+
+
+# This script creates an public image in the admin tenant and
+# sets tempest.conf variables for running tests with images involved.
+# This is the minimal configuration to run tests for compute (api and services
+# tests).
+#
+# NOTE: the test image will be the following cirros image:
+# http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img
+#
+
+
+set -e
+
+# Global variables
+admin_filename="admin_env"
+admin_test_image="cirros64_img_ref"
+image_ref=""
+
+# Openstack admin credentials
+admin_username="admin"
+admin_password="veryinsecure"
+admin_tenant="admin"
+
+# Create a file with the environment variables
+# required for setting a Openstack admin user in the
+# admin tenant.
+create_admin_user_env(){
+ cat > "$admin_filename" <<EOF
+ export OS_USERNAME="$admin_username"
+ export OS_PASSWORD="$admin_password"
+ export OS_TENANT_NAME="$admin_tenant"
+ export OS_AUTH_URL=http://$(hostname):35357/v2.0
+EOF
+}
+
+# Set the image fields in tempest.conf with the UUID of the admin_test_image.
+configure_image_ref(){
+ image_ref="$(glance image-list | grep "$admin_test_image" | tr -d [:space:] | cut -d'|' -f 2)"
+ if [ -z "image_ref" ]; then
+ echo "ERROR: image_ref is empty, please check that $admin_test_image is in the image list."
+ exit 1
+ fi
+ # Configure the UUID (image_ref) for the created image
+ sed -r -i "s/[#]?image_ref =.*/image_ref = $image_ref/" tempest.conf
+ # Configure image_ssh_user for the created image
+ sed -r -i "s/[#]?image_ssh_user =.*/image_ssh_user = cirros/" tempest.conf
+ # Configure image_ssh_password for the created image
+ sed -r -i "s/[#]?image_ssh_password =.*/image_ssh_password = 'cubswin:)'/" tempest.conf
+ # Configure the UUID (image_ref_alt) for the created image
+ sed -r -i "s/[#]?image_ref_alt =.*/image_ref_alt = $image_ref/" tempest.conf
+ # Configure image_alt_ssh_user for the created image
+ sed -r -i "s/[#]?image_alt_ssh_user =.*/image_alt_ssh_user = cirros/" tempest.conf
+}
+
+create_image_for_user(){
+# Create a image in the tenant $user called
+ local user_name="$1"
+ local test_image="$2"
+
+ # Set the credential for $user
+ source "${user_name}_env"
+ # If there is an image with the same name as $test image, remove it.
+ if [ $(glance image-list | grep "$test_image" | wc -l) -gt 0 ]; then
+ declare -a previous_img=$(glance image-list | grep "$test_image" | awk -F "|" '{ print $2 }')
+ for index in ${previous_img[@]}; do
+ glance image-delete "$index"
+ done
+ fi
+ glance image-create --name "$test_image" \
+ --location http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img \
+ --is-public true --disk-format qcow2 --container-format bare --progress
+ if [[ $? -eq 0 ]] \
+ || [[ "$(glance image-list | grep "$test_image" | wc -l)" == "1" ]]; then
+ configure_image_ref
+ else
+ echo "ERROR: glance image-create failed."
+ exit 1
+ fi
+}
+
+create_tempest_custom_flavor(){
+ # Set the credential for admin
+ source "${admin_username}_env"
+ # In order to run tests in VMs we need a alternative flavor
+ # smaller than the small and bigger than the tiny flavor.
+ # So we create a flavor with the following features:
+ # name=m1.tempest_tests ID=6 Memory_MB=1024 Disk=1 Ephemeral=0 VCPUS=1
+ echo "Creating custom small flavor for tempest tests and set it as alt_flavor in tempest.conf"
+ nova flavor-create m1.tempest_tests 6 1024 1 1
+ sed -r -i "s/[#]?flavor_ref_alt =.*/flavor_ref_alt = 6/" tempest.conf
+}
+
+prepare_scenario_tests(){
+ local imgdir=/opt/openstack/images/
+ mkdir -p "$imgdir"
+ wget -c http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-uec.tar.gz \
+ -O "$imgdir"/cirros-0.3.1-x86_64-uec.tar.gz
+ cd "$imgdir" && tar xvf cirros-0.3.1-x86_64-uec.tar.gz
+}
+
+# Configure Openstack for running tempest tests.
+create_admin_user_env
+create_image_for_user "$admin_username" "$admin_test_image"
+create_tempest_custom_flavor
+prepare_scenario_tests
diff --git a/install-files/openstack/etc/tempest/tempest.conf b/install-files/openstack/etc/tempest/tempest.conf
new file mode 100644
index 00000000..f84eb1c0
--- /dev/null
+++ b/install-files/openstack/etc/tempest/tempest.conf
@@ -0,0 +1,1188 @@
+[DEFAULT]
+
+#
+# From oslo.log
+#
+
+# Print debugging output (set logging level to DEBUG instead of
+# default WARNING level). (boolean value)
+#debug = false
+
+# Print more verbose output (set logging level to INFO instead of
+# default WARNING level). (boolean value)
+#verbose = false
+
+# The name of a logging configuration file. This file is appended to
+# any existing logging configuration files. For details about logging
+# configuration files, see the Python logging module documentation.
+# (string value)
+# Deprecated group/name - [DEFAULT]/log_config
+#log_config_append = <None>
+
+# DEPRECATED. A logging.Formatter log message format string which may
+# use any of the available logging.LogRecord attributes. This option
+# is deprecated. Please use logging_context_format_string and
+# logging_default_format_string instead. (string value)
+#log_format = <None>
+
+# Format string for %%(asctime)s in log records. Default: %(default)s
+# . (string value)
+#log_date_format = %Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to output to. If no default is set,
+# logging will go to stdout. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file = <None>
+
+# (Optional) The base directory used for relative --log-file paths.
+# (string value)
+# Deprecated group/name - [DEFAULT]/logdir
+#log_dir = <None>
+
+# Use syslog for logging. Existing syslog format is DEPRECATED during
+# I, and will change in J to honor RFC5424. (boolean value)
+use_syslog = true
+
+# (Optional) Enables or disables syslog rfc5424 format for logging. If
+# enabled, prefixes the MSG part of the syslog message with APP-NAME
+# (RFC5424). The format without the APP-NAME is deprecated in I, and
+# will be removed in J. (boolean value)
+#use_syslog_rfc_format = false
+
+# Syslog facility to receive log lines. (string value)
+#syslog_log_facility = LOG_USER
+
+# Log output to standard error. (boolean value)
+#use_stderr = true
+
+# Format string to use for log messages with context. (string value)
+#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages without context. (string
+# value)
+#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Data to append to log format when level is DEBUG. (string value)
+#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format. (string
+# value)
+#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s
+
+# List of logger=LEVEL pairs. (list value)
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN
+
+# Enables or disables publication of error events. (boolean value)
+#publish_errors = false
+
+# Enables or disables fatal status of deprecations. (boolean value)
+#fatal_deprecations = false
+
+# The format for an instance that is passed with the log message.
+# (string value)
+#instance_format = "[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log message.
+# (string value)
+#instance_uuid_format = "[instance: %(uuid)s] "
+
+
+[auth]
+
+#
+# From tempest.config
+#
+
+# Path to the yaml file that contains the list of credentials to use
+# for running tests. If used when running in parallel you have to make
+# sure sufficient credentials are provided in the accounts file. For
+# example if no tests with roles are being run it requires at least `2
+# * CONC` distinct accounts configured in the `test_accounts_file`,
+# with CONC == the number of concurrent test processes. (string value)
+#test_accounts_file = <None>
+
+# Allows test cases to create/destroy tenants and users. This option
+# requires that OpenStack Identity API admin credentials are known. If
+# false, isolated test cases and parallel execution, can still be
+# achieved configuring a list of test accounts (boolean value)
+# Deprecated group/name - [compute]/allow_tenant_isolation
+# Deprecated group/name - [orchestration]/allow_tenant_isolation
+allow_tenant_isolation = true
+
+# Roles to assign to all users created by tempest (list value)
+#tempest_roles =
+
+# Only applicable when identity.auth_version is v3.Domain within which
+# isolated credentials are provisioned.The default "None" means that
+# the domain from theadmin user is used instead. (string value)
+#tenant_isolation_domain_name = <None>
+
+
+[baremetal]
+
+#
+# From tempest.config
+#
+
+# Catalog type of the baremetal provisioning service (string value)
+#catalog_type = baremetal
+
+# Whether the Ironic nova-compute driver is enabled (boolean value)
+#driver_enabled = false
+
+# Driver name which Ironic uses (string value)
+#driver = fake
+
+# The endpoint type to use for the baremetal provisioning service
+# (string value)
+# Allowed values: public, admin, internal, publicURL, adminURL, internalURL
+#endpoint_type = publicURL
+
+# Timeout for Ironic node to completely provision (integer value)
+#active_timeout = 300
+
+# Timeout for association of Nova instance and Ironic node (integer
+# value)
+#association_timeout = 30
+
+# Timeout for Ironic power transitions. (integer value)
+#power_timeout = 60
+
+# Timeout for unprovisioning an Ironic node. (integer value)
+#unprovision_timeout = 60
+
+
+[boto]
+
+#
+# From tempest.config
+#
+
+# EC2 URL (string value)
+#ec2_url = http://localhost:8773/services/Cloud
+
+# S3 URL (string value)
+#s3_url = http://localhost:8080
+
+# AWS Secret Key (string value)
+#aws_secret = <None>
+
+# AWS Access Key (string value)
+#aws_access = <None>
+
+# AWS Zone for EC2 tests (string value)
+#aws_zone = nova
+
+# S3 Materials Path (string value)
+#s3_materials_path = /opt/stack/devstack/files/images/s3-materials/cirros-0.3.0
+
+# ARI Ramdisk Image manifest (string value)
+#ari_manifest = cirros-0.3.0-x86_64-initrd.manifest.xml
+
+# AMI Machine Image manifest (string value)
+#ami_manifest = cirros-0.3.0-x86_64-blank.img.manifest.xml
+
+# AKI Kernel Image manifest (string value)
+#aki_manifest = cirros-0.3.0-x86_64-vmlinuz.manifest.xml
+
+# Instance type (string value)
+#instance_type = m1.tiny
+
+# boto Http socket timeout (integer value)
+#http_socket_timeout = 3
+
+# boto num_retries on error (integer value)
+#num_retries = 1
+
+# Status Change Timeout (integer value)
+#build_timeout = 60
+
+# Status Change Test Interval (integer value)
+#build_interval = 1
+
+
+[cli]
+
+#
+# From tempest.config
+#
+
+# enable cli tests (boolean value)
+enabled = true
+
+# directory where python client binaries are located (string value)
+cli_dir = /usr/bin
+
+# Whether the tempest run location has access to the *-manage
+# commands. In a pure blackbox environment it will not. (boolean
+# value)
+has_manage = true
+
+# Number of seconds to wait on a CLI timeout (integer value)
+#timeout = 15
+
+
+[compute]
+
+#
+# From tempest.config
+#
+
+# Valid primary image reference to be used in tests. This is a
+# required option (string value)
+#image_ref = <None>
+
+# Valid secondary image reference to be used in tests. This is a
+# required option, but if only one image is available duplicate the
+# value of image_ref above (string value)
+#image_ref_alt = <None>
+
+# Valid primary flavor to use in tests. (string value)
+flavor_ref = 1
+
+# Valid secondary flavor to be used in tests. (string value)
+flavor_ref_alt = 2
+
+# User name used to authenticate to an instance. (string value)
+#image_ssh_user = root
+
+# Password used to authenticate to an instance. (string value)
+#image_ssh_password = password
+
+# User name used to authenticate to an instance using the alternate
+# image. (string value)
+#image_alt_ssh_user = root
+
+# Time in seconds between build status checks. (integer value)
+build_interval = 1
+
+# Timeout in seconds to wait for an instance to build. Other services
+# that do not define build_timeout will inherit this value. (integer
+# value)
+build_timeout = 300
+
+# Should the tests ssh to instances? (boolean value)
+#run_ssh = false
+
+# Auth method used for authenticate to the instance. Valid choices
+# are: keypair, configured, adminpass and disabled. Keypair: start the
+# servers with a ssh keypair. Configured: use the configured user and
+# password. Adminpass: use the injected adminPass. Disabled: avoid
+# using ssh when it is an option. (string value)
+ssh_auth_method = adminpass
+
+# How to connect to the instance? fixed: using the first ip belongs
+# the fixed network floating: creating and using a floating ip.
+# (string value)
+ssh_connect_method = floating
+
+# User name used to authenticate to an instance. (string value)
+#ssh_user = root
+
+# Timeout in seconds to wait for ping to succeed. (integer value)
+#ping_timeout = 120
+
+# The packet size for ping packets originating from remote linux hosts
+# (integer value)
+#ping_size = 56
+
+# The number of ping packets originating from remote linux hosts
+# (integer value)
+#ping_count = 1
+
+# Timeout in seconds to wait for authentication to succeed. (integer
+# value)
+#ssh_timeout = 300
+
+# Additional wait time for clean state, when there is no OS-EXT-STS
+# extension available (integer value)
+#ready_wait = 0
+
+# Timeout in seconds to wait for output from ssh channel. (integer
+# value)
+#ssh_channel_timeout = 60
+
+# Name of the fixed network that is visible to all test tenants. If
+# multiple networks are available for a tenant this is the network
+# which will be used for creating servers if tempest does not create a
+# network or a network is not specified elsewhere. It may be used for
+# ssh validation only if floating IPs are disabled. (string value)
+#fixed_network_name = <None>
+
+# Network used for SSH connections. Ignored if
+# use_floatingip_for_ssh=true or run_ssh=false. (string value)
+#network_for_ssh = public
+
+# IP version used for SSH connections. (integer value)
+ip_version_for_ssh = 4
+
+# Does SSH use Floating IPs? (boolean value)
+#use_floatingip_for_ssh = true
+
+# Catalog type of the Compute service. (string value)
+catalog_type = compute
+
+# The compute region name to use. If empty, the value of
+# identity.region is used instead. If no such region is found in the
+# service catalog, the first found one is used. (string value)
+region = regionOne
+
+# The endpoint type to use for the compute service. (string value)
+# Allowed values: public, admin, internal, publicURL, adminURL, internalURL
+endpoint_type = publicURL
+
+# Expected device name when a volume is attached to an instance
+# (string value)
+volume_device_name = vdb
+
+# Time in seconds before a shelved instance is eligible for removing
+# from a host. -1 never offload, 0 offload when shelved. This time
+# should be the same as the time of nova.conf, and some tests will run
+# for as long as the time. (integer value)
+#shelved_offload_time = 0
+
+# Unallocated floating IP range, which will be used to test the
+# floating IP bulk feature for CRUD operation. This block must not
+# overlap an existing floating IP pool. (string value)
+#floating_ip_range = 10.0.0.0/29
+
+
+[compute-feature-enabled]
+
+#
+# From tempest.config
+#
+
+# If false, skip disk config tests (boolean value)
+disk_config = true
+
+# A list of enabled compute extensions with a special entry all which
+# indicates every extension is enabled. Each extension should be
+# specified with alias name. Empty list indicates all extensions are
+# disabled (list value)
+#api_extensions = all
+
+# Does the test environment support changing the admin password?
+# (boolean value)
+change_password = false
+
+# Does the test environment support obtaining instance serial console
+# output? (boolean value)
+console_output = true
+
+# Does the test environment support resizing? (boolean value)
+resize = false
+
+# Does the test environment support pausing? (boolean value)
+pause = true
+
+# Does the test environment support shelving/unshelving? (boolean
+# value)
+shelve = true
+
+# Does the test environment support suspend/resume? (boolean value)
+suspend = true
+
+# Does the test environment support live migration available? (boolean
+# value)
+live_migration = false
+
+# Does the test environment use block devices for live migration
+# (boolean value)
+block_migration_for_live_migration = false
+
+# Does the test environment block migration support cinder iSCSI
+# volumes. Note, libvirt doesn't support this, see
+# https://bugs.launchpad.net/nova/+bug/1398999 (boolean value)
+block_migrate_cinder_iscsi = false
+
+# Enable VNC console. This configuration value should be same as
+# [nova.vnc]->vnc_enabled in nova.conf (boolean value)
+vnc_console = true
+
+# Enable Spice console. This configuration value should be same as
+# [nova.spice]->enabled in nova.conf (boolean value)
+spice_console = false
+
+# Enable RDP console. This configuration value should be same as
+# [nova.rdp]->enabled in nova.conf (boolean value)
+rdp_console = false
+
+# Does the test environment support instance rescue mode? (boolean
+# value)
+rescue = true
+
+# Enables returning of the instance password by the relevant server
+# API calls such as create, rebuild or rescue. (boolean value)
+enable_instance_password = true
+
+# Does the test environment support dynamic network interface
+# attachment? (boolean value)
+interface_attach = true
+
+# Does the test environment support creating snapshot images of
+# running instances? (boolean value)
+snapshot = true
+
+# Does the test environment have the ec2 api running? (boolean value)
+ec2_api = false
+
+# Does Nova preserve preexisting ports from Neutron when deleting an
+# instance? This should be set to True if testing Kilo+ Nova. (boolean
+# value)
+preserve_ports = true
+
+
+[dashboard]
+
+#
+# From tempest.config
+#
+
+# Where the dashboard can be found (string value)
+dashboard_url = http://{{ CONTROLLER_HOST_ADDRESS }}
+
+# Login page for the dashboard (string value)
+login_url = http://{{ CONTROLLER_HOST_ADDRESS }}/auth/login/
+
+
+[data_processing]
+
+#
+# From tempest.config
+#
+
+# Catalog type of the data processing service. (string value)
+#catalog_type = data_processing
+
+# The endpoint type to use for the data processing service. (string
+# value)
+# Allowed values: public, admin, internal, publicURL, adminURL, internalURL
+#endpoint_type = publicURL
+
+
+[data_processing-feature-enabled]
+
+#
+# From tempest.config
+#
+
+# List of enabled data processing plugins (list value)
+#plugins = vanilla,hdp
+
+
+[database]
+
+#
+# From tempest.config
+#
+
+# Catalog type of the Database service. (string value)
+#catalog_type = database
+
+# Valid primary flavor to use in database tests. (string value)
+#db_flavor_ref = 1
+
+# Current database version to use in database tests. (string value)
+#db_current_version = v1.0
+
+
+[debug]
+
+#
+# From tempest.config
+#
+
+# A regex to determine which requests should be traced. This is a
+# regex to match the caller for rest client requests to be able to
+# selectively trace calls out of specific classes and methods. It
+# largely exists for test development, and is not expected to be used
+# in a real deploy of tempest. This will be matched against the
+# discovered ClassName:method in the test environment. Expected
+# values for this field are: * ClassName:test_method_name - traces
+# one test_method * ClassName:setUp(Class) - traces specific setup
+# functions * ClassName:tearDown(Class) - traces specific teardown
+# functions * ClassName:_run_cleanups - traces the cleanup functions
+# If nothing is specified, this feature is not enabled. To trace
+# everything specify .* as the regex. (string value)
+#trace_requests =
+
+
+[identity]
+
+#
+# From tempest.config
+#
+
+# Catalog type of the Identity service. (string value)
+catalog_type = identity
+
+# Set to True if using self-signed SSL certificates. (boolean value)
+#disable_ssl_certificate_validation = false
+
+# Specify a CA bundle file to use in verifying a TLS (https) server
+# certificate. (string value)
+#ca_certificates_file = <None>
+
+# Full URI of the OpenStack Identity API (Keystone), v2 (string value)
+uri = http://{{ CONTROLLER_HOST_ADDRESS }}:35357/v2.0/
+
+# Full URI of the OpenStack Identity API (Keystone), v3 (string value)
+#uri_v3 = <None>
+
+# Identity API version to be used for authentication for API tests.
+# (string value)
+auth_version = v2
+
+# The identity region name to use. Also used as the other services'
+# region name unless they are set explicitly. If no such region is
+# found in the service catalog, the first found one is used. (string
+# value)
+region = RegionOne
+
+# The endpoint type to use for the identity service. (string value)
+# Allowed values: public, admin, internal, publicURL, adminURL, internalURL
+endpoint_type = publicURL
+
+# Username to use for Nova API requests. (string value)
+username = {{ NOVA_SERVICE_USER }}
+
+# Tenant name to use for Nova API requests. (string value)
+tenant_name = service
+
+# Role required to administrate keystone. (string value)
+admin_role = admin
+
+# API key to use when authenticating. (string value)
+password = {{ NOVA_SERVICE_PASSWORD }}
+
+# Domain name for authentication (Keystone V3).The same domain applies
+# to user and project (string value)
+#domain_name = <None>
+
+# Username of alternate user to use for Nova API requests. (string
+# value)
+#alt_username = <None>
+
+# Alternate user's Tenant name to use for Nova API requests. (string
+# value)
+#alt_tenant_name = <None>
+
+# API key to use when authenticating as alternate user. (string value)
+#alt_password = <None>
+
+# Alternate domain name for authentication (Keystone V3).The same
+# domain applies to user and project (string value)
+#alt_domain_name = <None>
+
+# Administrative Username to use for Keystone API requests. (string
+# value)
+admin_username = admin
+
+# Administrative Tenant name to use for Keystone API requests. (string
+# value)
+admin_tenant_name = admin
+
+# API key to use when authenticating as admin. (string value)
+admin_password = {{ KEYSTONE_ADMIN_PASSWORD }}
+
+# Admin domain name for authentication (Keystone V3).The same domain
+# applies to user and project (string value)
+#admin_domain_name = <None>
+
+
+[identity-feature-enabled]
+
+#
+# From tempest.config
+#
+
+# Does the identity service have delegation and impersonation enabled
+# (boolean value)
+trust = false
+
+# Is the v2 identity API enabled (boolean value)
+api_v2 = true
+
+# Is the v3 identity API enabled (boolean value)
+api_v3 = false
+
+
+[image]
+
+#
+# From tempest.config
+#
+
+# Catalog type of the Image service. (string value)
+catalog_type = image
+
+# The image region name to use. If empty, the value of identity.region
+# is used instead. If no such region is found in the service catalog,
+# the first found one is used. (string value)
+region = regionOne
+
+# The endpoint type to use for the image service. (string value)
+# Allowed values: public, admin, internal, publicURL, adminURL, internalURL
+endpoint_type = publicURL
+
+# http accessible image (string value)
+http_image = http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-uec.tar.gz
+
+# Timeout in seconds to wait for an image to become available.
+# (integer value)
+build_timeout = 300
+
+# Time in seconds between image operation status checks. (integer
+# value)
+build_interval = 1
+
+
+[image-feature-enabled]
+
+#
+# From tempest.config
+#
+
+# Is the v2 image API enabled (boolean value)
+api_v2 = true
+
+# Is the v1 image API enabled (boolean value)
+api_v1 = true
+
+
+[input-scenario]
+
+#
+# From tempest.config
+#
+
+# Matching images become parameters for scenario tests (string value)
+image_regex = ^cirros-0.3.1-x86_64-uec$
+
+# Matching flavors become parameters for scenario tests (string value)
+flavor_regex = ^m1.nano$
+
+# SSH verification in tests is skippedfor matching images (string
+# value)
+#non_ssh_image_regex = ^.*[Ww]in.*$
+
+# List of user mapped to regex to matching image names. (string value)
+#ssh_user_regex = [["^.*[Cc]irros.*$", "cirros"]]
+
+
+[messaging]
+
+#
+# From tempest.config
+#
+
+# Catalog type of the Messaging service. (string value)
+catalog_type = messaging
+
+# The maximum number of queue records per page when listing queues
+# (integer value)
+max_queues_per_page = 20
+
+# The maximum metadata size for a queue (integer value)
+max_queue_metadata = 65536
+
+# The maximum number of queue message per page when listing (or)
+# posting messages (integer value)
+max_messages_per_page = 20
+
+# The maximum size of a message body (integer value)
+max_message_size = 262144
+
+# The maximum number of messages per claim (integer value)
+max_messages_per_claim = 20
+
+# The maximum ttl for a message (integer value)
+max_message_ttl = 1209600
+
+# The maximum ttl for a claim (integer value)
+max_claim_ttl = 43200
+
+# The maximum grace period for a claim (integer value)
+max_claim_grace = 43200
+
+
+[negative]
+
+#
+# From tempest.config
+#
+
+# Test generator class for all negative tests (string value)
+test_generator = tempest.common.generator.negative_generator.NegativeTestGenerator
+
+
+[network]
+
+#
+# From tempest.config
+#
+
+# Catalog type of the Neutron service. (string value)
+catalog_type = network
+
+# The network region name to use. If empty, the value of
+# identity.region is used instead. If no such region is found in the
+# service catalog, the first found one is used. (string value)
+region = regionOne
+
+# The endpoint type to use for the network service. (string value)
+# Allowed values: public, admin, internal, publicURL, adminURL, internalURL
+endpoint_type = publicURL
+
+# The cidr block to allocate tenant ipv4 subnets from (string value)
+tenant_network_cidr = 192.168.1.0/24
+
+# The mask bits for tenant ipv4 subnets (integer value)
+tenant_network_mask_bits = 28
+
+# The cidr block to allocate tenant ipv6 subnets from (string value)
+#tenant_network_v6_cidr = 2003::/48
+
+# The mask bits for tenant ipv6 subnets (integer value)
+#tenant_network_v6_mask_bits = 64
+
+# Whether tenant networks can be reached directly from the test
+# client. This must be set to True when the 'fixed' ssh_connect_method
+# is selected. (boolean value)
+#tenant_networks_reachable = false
+
+# Id of the public network that provides external connectivity (string
+# value)
+#public_network_id =
+
+# Default floating network name. Used to allocate floating IPs when
+# neutron is enabled. (string value)
+#floating_network_name = <None>
+
+# Id of the public router that provides external connectivity. This
+# should only be used when Neutron's 'allow_overlapping_ips' is set to
+# 'False' in neutron.conf. usually not needed past 'Grizzly' release
+# (string value)
+#public_router_id =
+
+# Timeout in seconds to wait for network operation to complete.
+# (integer value)
+build_timeout = 300
+
+# Time in seconds between network operation status checks. (integer
+# value)
+build_interval = 1
+
+# List of dns servers which should be used for subnet creation (list
+# value)
+dns_servers = 8.8.8.8,8.8.4.4
+
+# vnic_type to use when Launching instances with pre-configured ports.
+# Supported ports are: ['normal','direct','macvtap'] (string value)
+# Allowed values: <None>, normal, direct, macvtap
+#port_vnic_type = <None>
+
+
+[network-feature-enabled]
+
+#
+# From tempest.config
+#
+
+# Allow the execution of IPv6 tests (boolean value)
+ipv6 = false
+
+# A list of enabled network extensions with a special entry all which
+# indicates every extension is enabled. Empty list indicates all
+# extensions are disabled (list value)
+api_extensions = router
+
+# Allow the execution of IPv6 subnet tests that use the extended IPv6
+# attributes ipv6_ra_mode and ipv6_address_mode (boolean value)
+#ipv6_subnet_attributes = false
+
+# Does the test environment support changing port admin state (boolean
+# value)
+#port_admin_state_change = true
+
+
+[object-storage]
+
+#
+# From tempest.config
+#
+
+# Catalog type of the Object-Storage service. (string value)
+#catalog_type = object-store
+
+# The object-storage region name to use. If empty, the value of
+# identity.region is used instead. If no such region is found in the
+# service catalog, the first found one is used. (string value)
+#region =
+
+# The endpoint type to use for the object-store service. (string
+# value)
+# Allowed values: public, admin, internal, publicURL, adminURL, internalURL
+#endpoint_type = publicURL
+
+# Number of seconds to time on waiting for a container to container
+# synchronization complete. (integer value)
+#container_sync_timeout = 600
+
+# Number of seconds to wait while looping to check the status of a
+# container to container synchronization (integer value)
+#container_sync_interval = 5
+
+# Role to add to users created for swift tests to enable creating
+# containers (string value)
+#operator_role = Member
+
+# User role that has reseller admin (string value)
+#reseller_admin_role = ResellerAdmin
+
+# Name of sync realm. A sync realm is a set of clusters that have
+# agreed to allow container syncing with each other. Set the same
+# realm name as Swift's container-sync-realms.conf (string value)
+#realm_name = realm1
+
+# One name of cluster which is set in the realm whose name is set in
+# 'realm_name' item in this file. Set the same cluster name as Swift's
+# container-sync-realms.conf (string value)
+#cluster_name = name1
+
+
+[object-storage-feature-enabled]
+
+#
+# From tempest.config
+#
+
+# A list of the enabled optional discoverable apis. A single entry,
+# all, indicates that all of these features are expected to be enabled
+# (list value)
+#discoverable_apis = all
+
+# Execute (old style) container-sync tests (boolean value)
+#container_sync = true
+
+# Execute object-versioning tests (boolean value)
+#object_versioning = true
+
+# Execute discoverability tests (boolean value)
+#discoverability = true
+
+
+[orchestration]
+
+#
+# From tempest.config
+#
+
+# Catalog type of the Orchestration service. (string value)
+#catalog_type = orchestration
+
+# The orchestration region name to use. If empty, the value of
+# identity.region is used instead. If no such region is found in the
+# service catalog, the first found one is used. (string value)
+#region =
+
+# The endpoint type to use for the orchestration service. (string
+# value)
+# Allowed values: public, admin, internal, publicURL, adminURL, internalURL
+#endpoint_type = publicURL
+
+# Role required for users to be able to manage stacks (string value)
+#stack_owner_role = heat_stack_owner
+
+# Time in seconds between build status checks. (integer value)
+#build_interval = 1
+
+# Timeout in seconds to wait for a stack to build. (integer value)
+#build_timeout = 1200
+
+# Instance type for tests. Needs to be big enough for a full OS plus
+# the test workload (string value)
+#instance_type = m1.micro
+
+# Name of existing keypair to launch servers with. (string value)
+#keypair_name = <None>
+
+# Value must match heat configuration of the same name. (integer
+# value)
+#max_template_size = 524288
+
+# Value must match heat configuration of the same name. (integer
+# value)
+#max_resources_per_stack = 1000
+
+
+[oslo_concurrency]
+
+#
+# From oslo.concurrency
+#
+
+# Enables or disables inter-process locks. (boolean value)
+# Deprecated group/name - [DEFAULT]/disable_process_locking
+disable_process_locking = false
+
+# Directory to use for lock files. For security, the specified
+# directory should only be writable by the user running the processes
+# that need locking. Defaults to environment variable OSLO_LOCK_PATH.
+# If external locks are used, a lock path must be set. (string value)
+# Deprecated group/name - [DEFAULT]/lock_path
+lock_path = /run/lock
+
+
+[scenario]
+
+#
+# From tempest.config
+#
+
+# Directory containing image files (string value)
+img_dir = /opt/openstack/images/
+
+# Image file name (string value)
+# Deprecated group/name - [DEFAULT]/qcow2_img_file
+img_file = cirros-0.3.1-x86_64-disk.img
+
+# Image disk format (string value)
+img_disk_format = qcow2
+
+# Image container format (string value)
+img_container_format = bare
+
+# AMI image file name (string value)
+ami_img_file = cirros-0.3.1-x86_64-blank.img
+
+# ARI image file name (string value)
+ari_img_file = cirros-0.3.1-x86_64-initrd
+
+# AKI image file name (string value)
+aki_img_file = cirros-0.3.1-x86_64-vmlinuz
+
+# ssh username for the image file (string value)
+ssh_user = cirros
+
+# specifies how many resources to request at once. Used for large
+# operations testing. (integer value)
+#large_ops_number = 0
+
+# DHCP client used by images to renew DCHP lease. If left empty,
+# update operation will be skipped. Supported clients: "udhcpc",
+# "dhclient" (string value)
+# Allowed values: udhcpc, dhclient
+#dhcp_client = udhcpc
+
+
+[service_available]
+
+#
+# From tempest.config
+#
+
+# Whether or not cinder is expected to be available (boolean value)
+cinder = true
+
+# Whether or not neutron is expected to be available (boolean value)
+neutron = true
+
+# Whether or not glance is expected to be available (boolean value)
+glance = true
+
+# Whether or not swift is expected to be available (boolean value)
+swift = false
+
+# Whether or not nova is expected to be available (boolean value)
+nova = true
+
+# Whether or not Heat is expected to be available (boolean value)
+heat = false
+
+# Whether or not Ceilometer is expected to be available (boolean
+# value)
+ceilometer = true
+
+# Whether or not Horizon is expected to be available (boolean value)
+horizon = true
+
+# Whether or not Sahara is expected to be available (boolean value)
+sahara = false
+
+# Whether or not Ironic is expected to be available (boolean value)
+ironic = false
+
+# Whether or not Trove is expected to be available (boolean value)
+trove = false
+
+# Whether or not Zaqar is expected to be available (boolean value)
+zaqar = false
+
+
+[stress]
+
+#
+# From tempest.config
+#
+
+# Directory containing log files on the compute nodes (string value)
+#nova_logdir = <None>
+
+# Maximum number of instances to create during test. (integer value)
+#max_instances = 16
+
+# Controller host. (string value)
+#controller = <None>
+
+# Controller host. (string value)
+#target_controller = <None>
+
+# ssh user. (string value)
+#target_ssh_user = <None>
+
+# Path to private key. (string value)
+#target_private_key_path = <None>
+
+# regexp for list of log files. (string value)
+#target_logfiles = <None>
+
+# time (in seconds) between log file error checks. (integer value)
+#log_check_interval = 60
+
+# The number of threads created while stress test. (integer value)
+#default_thread_number_per_action = 4
+
+# Prevent the cleaning (tearDownClass()) between each stress test run
+# if an exception occurs during this run. (boolean value)
+#leave_dirty_stack = false
+
+# Allows a full cleaning process after a stress test. Caution : this
+# cleanup will remove every objects of every tenant. (boolean value)
+#full_clean_stack = false
+
+
+[telemetry]
+
+#
+# From tempest.config
+#
+
+# Catalog type of the Telemetry service. (string value)
+catalog_type = metering
+
+# The endpoint type to use for the telemetry service. (string value)
+# Allowed values: public, admin, internal, publicURL, adminURL, internalURL
+endpoint_type = publicURL
+
+# This variable is used as flag to enable notification tests (boolean
+# value)
+too_slow_to_test = true
+
+
+[validation]
+
+#
+# From tempest.config
+#
+
+# Default IP type used for validation: -fixed: uses the first IP
+# belonging to the fixed network -floating: creates and uses a
+# floating IP (string value)
+# Allowed values: fixed, floating
+connect_method = floating
+
+# Default authentication method to the instance. Only ssh via keypair
+# is supported for now. Additional methods will be handled in a
+# separate spec. (string value)
+# Allowed values: keypair
+auth_method = keypair
+
+# Default IP version for ssh connections. (integer value)
+ip_version_for_ssh = 4
+
+# Timeout in seconds to wait for ping to succeed. (integer value)
+ping_timeout = 120
+
+# Timeout in seconds to wait for the TCP connection to be successful.
+# (integer value)
+connect_timeout = 60
+
+# Timeout in seconds to wait for the ssh banner. (integer value)
+ssh_timeout = 300
+
+
+[volume]
+
+#
+# From tempest.config
+#
+
+# Time in seconds between volume availability checks. (integer value)
+#build_interval = 1
+
+# Timeout in seconds to wait for a volume to become available.
+# (integer value)
+#build_timeout = 300
+
+# Catalog type of the Volume Service (string value)
+catalog_type = volume
+
+# The volume region name to use. If empty, the value of
+# identity.region is used instead. If no such region is found in the
+# service catalog, the first found one is used. (string value)
+region = regionOne
+
+# The endpoint type to use for the volume service. (string value)
+# Allowed values: public, admin, internal, publicURL, adminURL, internalURL
+endpoint_type = publicURL
+
+# Name of the backend1 (must be declared in cinder.conf) (string
+# value)
+backend1_name = LVM_iSCSI
+
+# Name of the backend2 (must be declared in cinder.conf) (string
+# value)
+#backend2_name = BACKEND_2
+
+# Backend protocol to target when creating volume types (string value)
+storage_protocol = iSCSI
+
+# Backend vendor to target when creating volume types (string value)
+#vendor_name = Open Source
+
+# Disk format to use when copying a volume to image (string value)
+disk_format = raw
+
+# Default size in GB for volumes created by volumes tests (integer
+# value)
+volume_size = 1
+
+
+[volume-feature-enabled]
+
+#
+# From tempest.config
+#
+
+# Runs Cinder multi-backend test (requires 2 backends) (boolean value)
+multi_backend = false
+
+# Runs Cinder volumes backup test (boolean value)
+backup = false
+
+# Runs Cinder volume snapshot test (boolean value)
+snapshot = true
+
+# A list of enabled volume extensions with a special entry all which
+# indicates every extension is enabled. Empty list indicates all
+# extensions are disabled (list value)
+api_extensions = all
+
+# Is the v1 volume API enabled (boolean value)
+api_v1 = true
+
+# Is the v2 volume API enabled (boolean value)
+api_v2 = true
+
diff --git a/install-files/openstack/manifest b/install-files/openstack/manifest
new file mode 100644
index 00000000..3d9ea2dd
--- /dev/null
+++ b/install-files/openstack/manifest
@@ -0,0 +1,117 @@
+0040755 0 0 /etc/neutron
+0100644 0 0 /etc/neutron/dnsmasq-neutron.conf
+0040755 0 0 /etc/horizon
+0100644 0 0 /etc/horizon/apache-horizon.conf
+template 0100644 0 0 /etc/tempest/tempest.conf
+0100755 0 0 /etc/tempest/set_openstack_to_run_tempest.sh
+0040755 0 0 /usr/share/openstack
+0100644 0 0 /usr/share/openstack/hosts
+0040755 0 0 /usr/share/openstack/ceilometer
+0100644 0 0 /usr/share/openstack/ceilometer-config.yml
+0100644 0 0 /usr/share/openstack/ceilometer-db.yml
+0100644 0 0 /usr/share/openstack/ceilometer/ceilometer.conf
+0040755 0 0 /usr/share/openstack/cinder
+0100644 0 0 /usr/share/openstack/cinder-config.yml
+0100644 0 0 /usr/share/openstack/cinder-db.yml
+0100644 0 0 /usr/share/openstack/cinder-lvs.yml
+0100644 0 0 /usr/share/openstack/cinder/cinder.conf
+0040755 0 0 /usr/share/openstack/extras
+0100644 0 0 /usr/share/openstack/extras/00-disable-device.network
+0100644 0 0 /usr/share/openstack/extras/60-device-dhcp.network
+0100644 0 0 /usr/share/openstack/glance.yml
+0040755 0 0 /usr/share/openstack/glance
+0100644 0 0 /usr/share/openstack/glance/glance-api.conf
+0100644 0 0 /usr/share/openstack/glance/glance-registry.conf
+0100644 0 0 /usr/share/openstack/horizon.yml
+0040755 0 0 /usr/share/openstack/ironic
+0100644 0 0 /usr/share/openstack/ironic.yml
+0100644 0 0 /usr/share/openstack/ironic/ironic.conf
+0100644 0 0 /usr/share/openstack/iscsi.yml
+0100644 0 0 /usr/share/openstack/keystone.yml
+0040755 0 0 /usr/share/openstack/keystone
+0100644 0 0 /usr/share/openstack/keystone/keystone.conf
+0100644 0 0 /usr/share/openstack/network.yml
+0040755 0 0 /usr/share/openstack/neutron
+0100644 0 0 /usr/share/openstack/neutron-config.yml
+0100644 0 0 /usr/share/openstack/neutron-db.yml
+0100644 0 0 /usr/share/openstack/neutron/dhcp_agent.ini
+0100644 0 0 /usr/share/openstack/neutron/l3_agent.ini
+0100644 0 0 /usr/share/openstack/neutron/neutron.conf
+0100644 0 0 /usr/share/openstack/neutron/metadata_agent.ini
+0040755 0 0 /usr/share/openstack/neutron/plugins/
+0040755 0 0 /usr/share/openstack/neutron/plugins/ml2
+0100644 0 0 /usr/share/openstack/neutron/plugins/ml2/ml2_conf.ini
+0040755 0 0 /usr/share/openstack/nova
+0100644 0 0 /usr/share/openstack/nova-config.yml
+0100644 0 0 /usr/share/openstack/nova-db.yml
+0100644 0 0 /usr/share/openstack/nova/nova.conf
+0100644 0 0 /usr/share/openstack/nova/nova-compute.conf
+0100644 0 0 /usr/share/openstack/openvswitch.yml
+0040755 0 0 /usr/share/openstack/postgres
+0100644 0 0 /usr/share/openstack/postgres.yml
+0100644 0 0 /usr/share/openstack/postgres/pg_hba.conf
+0100644 0 0 /usr/share/openstack/postgres/postgresql.conf
+0040755 0 0 /usr/share/openstack/rabbitmq
+0100644 0 0 /usr/share/openstack/rabbitmq/rabbitmq-env.conf
+0100644 0 0 /usr/share/openstack/rabbitmq/rabbitmq.config
+0040755 0 0 /usr/lib/sysctl.d
+0100644 0 0 /usr/lib/sysctl.d/neutron.conf
+0100644 0 0 /usr/lib/systemd/system/apache-httpd.service
+0100644 0 0 /usr/lib/systemd/system/iscsi-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-keystone.service
+0100644 0 0 /usr/lib/systemd/system/openstack-keystone-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-glance-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-glance-api.service
+0100644 0 0 /usr/lib/systemd/system/openstack-glance-registry.service
+0100644 0 0 /usr/lib/systemd/system/openstack-horizon-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ironic-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ironic-api.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ironic-conductor.service
+0100644 0 0 /usr/lib/systemd/system/openstack-network-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-neutron-config-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-neutron-db-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-neutron-server.service
+0100644 0 0 /usr/lib/systemd/system/openstack-neutron-metadata-agent.service
+0100644 0 0 /usr/lib/systemd/system/openstack-neutron-plugin-openvswitch-agent.service
+0100644 0 0 /usr/lib/systemd/system/openstack-neutron-ovs-cleanup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-neutron-dhcp-agent.service
+0100644 0 0 /usr/lib/systemd/system/openstack-neutron-l3-agent.service
+0100644 0 0 /usr/lib/systemd/system/openstack-nova-config-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-nova-db-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-nova-compute.service
+0100644 0 0 /usr/lib/systemd/system/openstack-nova-conductor.service
+0100644 0 0 /usr/lib/systemd/system/openstack-nova-api.service
+0100644 0 0 /usr/lib/systemd/system/openstack-nova-scheduler.service
+0100644 0 0 /usr/lib/systemd/system/openstack-nova-consoleauth.service
+0100644 0 0 /usr/lib/systemd/system/openstack-nova-novncproxy.service
+0100644 0 0 /usr/lib/systemd/system/openstack-nova-cert.service
+0100644 0 0 /usr/lib/systemd/system/openstack-nova-serialproxy.service
+0100644 0 0 /usr/lib/systemd/system/rabbitmq-server.service
+0100644 0 0 /usr/lib/systemd/system/openstack-cinder-config-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-cinder-db-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-cinder-lv-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-cinder-api.service
+0100644 0 0 /usr/lib/systemd/system/openstack-cinder-scheduler.service
+0100644 0 0 /usr/lib/systemd/system/openstack-cinder-volume.service
+0100644 0 0 /usr/lib/systemd/system/openstack-cinder-backup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ceilometer-config-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ceilometer-db-setup.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ceilometer-alarm-evaluator.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ceilometer-alarm-notifier.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ceilometer-api.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ceilometer-central.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ceilometer-collector.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ceilometer-compute.service
+0100644 0 0 /usr/lib/systemd/system/openstack-ceilometer-notification.service
+0100644 0 0 /usr/lib/systemd/system/openvswitch-setup.service
+0100644 0 0 /usr/lib/systemd/system/openvswitch-db-server.service
+0100644 0 0 /usr/lib/systemd/system/openvswitch.service
+0100644 0 0 /usr/lib/systemd/system/postgres-server.service
+0100644 0 0 /usr/lib/systemd/system/postgres-server-setup.service
+0100644 0 0 /usr/share/openstack/swift-controller.yml
+0100644 0 0 /usr/lib/systemd/system/swift-controller-setup.service
+0100644 0 0 /usr/lib/systemd/system/swift-proxy.service
+0040755 0 0 /usr/share/swift
+0040755 0 0 /usr/share/swift/etc
+0040755 0 0 /usr/share/swift/etc/swift
+0100644 0 0 /usr/share/swift/etc/swift/proxy-server.j2
diff --git a/install-files/openstack/usr/lib/sysctl.d/neutron.conf b/install-files/openstack/usr/lib/sysctl.d/neutron.conf
new file mode 100644
index 00000000..644ca116
--- /dev/null
+++ b/install-files/openstack/usr/lib/sysctl.d/neutron.conf
@@ -0,0 +1,3 @@
+# Disable rp filtering, enabling forwarding is handled by networkd
+net.ipv4.conf.all.rp_filter=0
+net.ipv4.conf.default.rp_filter=0
diff --git a/install-files/openstack/usr/lib/systemd/system/apache-httpd.service b/install-files/openstack/usr/lib/systemd/system/apache-httpd.service
new file mode 100644
index 00000000..e2a840c6
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/apache-httpd.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Apache Web Server
+After=network.target remote-fs.target nss-lookup.target
+Wants=network.target
+
+[Service]
+Type=forking
+PIDFile=/var/run/httpd.pid
+ExecStart=/usr/sbin/apachectl start
+ExecStop=/usr/sbin/apachectl graceful-stop
+ExecReload=/usr/sbin/apachectl graceful
+PrivateTmp=true
+LimitNOFILE=infinity
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/iscsi-setup.service b/install-files/openstack/usr/lib/systemd/system/iscsi-setup.service
new file mode 100644
index 00000000..4cb10045
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/iscsi-setup.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Run iscsi-setup Ansible scripts
+Before=iscsid.service target.service
+Wants=iscsid.service target.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/iscsi.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-evaluator.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-evaluator.service
new file mode 100644
index 00000000..6e3ada59
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-evaluator.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack ceilometer alarm evaluation service
+ConditionPathExists=/etc/ceilometer/ceilometer.conf
+After=network-online.target openstack-ceilometer-config-setup.service openstack-ceilometer-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=ceilometer
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/ceilometer-alarm-evaluator --config-file /etc/ceilometer/ceilometer.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-notifier.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-notifier.service
new file mode 100644
index 00000000..7a3e1c91
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-alarm-notifier.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack ceilometer alarm notification service
+ConditionPathExists=/etc/ceilometer/ceilometer.conf
+After=network-online.target openstack-ceilometer-config-setup.service openstack-ceilometer-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=ceilometer
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/ceilometer-alarm-notifier --config-file /etc/ceilometer/ceilometer.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-api.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-api.service
new file mode 100644
index 00000000..eb0293bf
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-api.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack ceilometer API service
+ConditionPathExists=/etc/ceilometer/ceilometer.conf
+After=network-online.target openstack-ceilometer-config-setup.service openstack-ceilometer-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=ceilometer
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/ceilometer-api --config-file /etc/ceilometer/ceilometer.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-central.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-central.service
new file mode 100644
index 00000000..a1bc11ee
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-central.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack ceilometer central agent
+ConditionPathExists=/etc/ceilometer/ceilometer.conf
+After=network-online.target openstack-ceilometer-config-setup.service openstack-ceilometer-db-setup.service openstack-ceilometer-collector.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=ceilometer
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/ceilometer-agent-central --config-file /etc/ceilometer/ceilometer.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-collector.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-collector.service
new file mode 100644
index 00000000..dafc3ac7
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-collector.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack ceilometer collection service
+ConditionPathExists=/etc/ceilometer/ceilometer.conf
+After=network-online.target openstack-ceilometer-config-setup.service openstack-ceilometer-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=ceilometer
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/ceilometer-collector --config-file /etc/ceilometer/ceilometer.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-compute.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-compute.service
new file mode 100644
index 00000000..9fe8a1e6
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-compute.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack ceilometer compute agent
+ConditionPathExists=/etc/ceilometer/ceilometer.conf
+After=network-online.target openstack-ceilometer-config-setup.service openstack-ceilometer-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=ceilometer
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/ceilometer-agent-compute --config-file /etc/ceilometer/ceilometer.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-config-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-config-setup.service
new file mode 100644
index 00000000..c3e809d7
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-config-setup.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Run ceilometer-config-setup Ansible scripts
+ConditionPathExists=/etc/openstack/ceilometer.conf
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/ceilometer-config.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-db-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-db-setup.service
new file mode 100644
index 00000000..7a785227
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-db-setup.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Run ceilometer-db-setup Ansible scripts
+ConditionPathExists=/etc/openstack/ceilometer.conf
+After=network-online.target postgres-server-setup.service openstack-keystone-setup.service openstack-ceilometer-config-setup.service
+Wants=network-online.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/ceilometer-db.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-notification.service b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-notification.service
new file mode 100644
index 00000000..6696116e
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ceilometer-notification.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack ceilometer notification agent
+ConditionPathExists=/etc/ceilometer/ceilometer.conf
+After=network-online.target openstack-ceilometer-config-setup.service openstack-ceilometer-db-setup.service openstack-ceilometer-collector.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=ceilometer
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/ceilometer-agent-notification --config-file /etc/ceilometer/ceilometer.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-cinder-api.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-api.service
new file mode 100644
index 00000000..a284f31d
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-api.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack Volume Service (code-named Cinder) API server
+ConditionPathExists=/etc/cinder/cinder.conf
+After=network-online.target openstack-cinder-config-setup.service openstack-cinder-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=cinder
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/cinder-api --config-file /etc/cinder/cinder.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-cinder-backup.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-backup.service
new file mode 100644
index 00000000..c14e13aa
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-backup.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack Cinder backup server
+ConditionPathExists=/etc/cinder/cinder.conf
+After=network-online.target openstack-cinder-config-setup.service openstack-cinder-db-setup.service openstack-cinder-volume.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=cinder
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/cinder-backup --config-file /etc/cinder/cinder.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-cinder-config-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-config-setup.service
new file mode 100644
index 00000000..1c966933
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-config-setup.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Run cinder-config-setup Ansible scripts
+ConditionPathExists=/etc/openstack/cinder.conf
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/cinder-config.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-cinder-db-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-db-setup.service
new file mode 100644
index 00000000..a3c66d67
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-db-setup.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Run cinder-db-setup Ansible scripts
+ConditionPathExists=/etc/openstack/cinder.conf
+After=network-online.target postgres-server-setup.service openstack-keystone-setup.service openstack-cinder-config-setup.service
+Wants=network-online.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/cinder-db.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-cinder-lv-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-lv-setup.service
new file mode 100644
index 00000000..82e9b08d
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-lv-setup.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Run cinder-lvs-setup Ansible scripts
+ConditionPathExists=/etc/openstack/cinder.conf
+Wants=lvm2-lvmetad.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/cinder-lvs.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-cinder-scheduler.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-scheduler.service
new file mode 100644
index 00000000..f205aaff
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-scheduler.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack Cinder scheduler server
+ConditionPathExists=/etc/cinder/cinder.conf
+After=network-online.target openstack-cinder-config-setup.service openstack-cinder-db-setup.service openstack-cinder-volume.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=cinder
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/cinder-scheduler --config-file /etc/cinder/cinder.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-cinder-volume.service b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-volume.service
new file mode 100644
index 00000000..a5b7fe85
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-cinder-volume.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=OpenStack Cinder volume server
+ConditionPathExists=/etc/cinder/cinder.conf
+After=network-online.target openstack-cinder-config-setup.service openstack-cinder-db-setup.service openstack-cinder-lv-setup.service lvm2-lvmetad.service iscsid.service target.service
+Requisite=openstack-cinder-lv-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=cinder
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/cinder-volume --config-file /etc/cinder/cinder.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-glance-api.service b/install-files/openstack/usr/lib/systemd/system/openstack-glance-api.service
new file mode 100644
index 00000000..4c34ff10
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-glance-api.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=OpenStack Image Service (code-named Glance) API server
+ConditionPathExists=/etc/glance/glance-api.conf
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=glance
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/glance-api --config-file /etc/glance/glance-api.conf
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-glance-registry.service b/install-files/openstack/usr/lib/systemd/system/openstack-glance-registry.service
new file mode 100644
index 00000000..d53c8b33
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-glance-registry.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=OpenStack Image Service (code-named Glance) Registry server
+ConditionPathExists=/etc/glance/glance-registry.conf
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=glance
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/glance-registry --config-file /etc/glance/glance-registry.conf
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-glance-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-glance-setup.service
new file mode 100644
index 00000000..43810797
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-glance-setup.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Run glance-setup Ansible scripts
+ConditionPathExists=/etc/openstack/glance.conf
+After=local-fs.target network-online.target postgres-server-setup.service openstack-keystone-setup.service
+Wants=network-online.target
+
+[Service]
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/glance.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-horizon-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-horizon-setup.service
new file mode 100644
index 00000000..9ec3197a
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-horizon-setup.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Run horizon-setup Ansible scripts
+After=local-fs.target
+Before=apache-httpd.service
+
+[Service]
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/horizon.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ironic-api.service b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-api.service
new file mode 100644
index 00000000..5a286a95
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-api.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=OpenStack Bare Metal Provisioning Service (code-named Ironic) API server
+ConditionPathExists=/etc/ironic/ironic.conf
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=ironic
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/ironic-api --config-file /etc/ironic/ironic.conf
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ironic-conductor.service b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-conductor.service
new file mode 100644
index 00000000..b3b226e0
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-conductor.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=OpenStack Bare Metal Provisioning Service (code-named Ironic) Conductor server
+ConditionPathExists=/etc/ironic/ironic.conf
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=ironic
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/ironic-conductor --config-file /etc/ironic/ironic.conf
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-ironic-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-setup.service
new file mode 100644
index 00000000..e3a58eb5
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-ironic-setup.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Run ironic-setup Ansible scripts
+ConditionPathExists=/etc/openstack/ironic.conf
+After=local-fs.target network-online.target postgres-server-setup.service openstack-keystone-setup.service
+Wants=network-online.target
+
+[Service]
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/ironic.yml
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-keystone-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-keystone-setup.service
new file mode 100644
index 00000000..db9d0b2b
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-keystone-setup.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=Run keystone-setup Ansible scripts
+ConditionPathExists=/etc/openstack/keystone.conf
+After=local-fs.target network-online.target postgres-server-setup.service
+Wants=network-online.target
+
+[Service]
+# Oneshot, since others setup have to wait until this service finishes
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/keystone.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-keystone.service b/install-files/openstack/usr/lib/systemd/system/openstack-keystone.service
new file mode 100644
index 00000000..6f6ff644
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-keystone.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=OpenStack Identity Service (code-named Keystone)
+ConditionPathExists=/etc/keystone/keystone.conf
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=notify
+Restart=always
+User=keystone
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/keystone-all --config-file /etc/keystone/keystone.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-network-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-network-setup.service
new file mode 100644
index 00000000..021370d9
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-network-setup.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Run Ansible scripts to configure internal network for OpenStack
+After=openvswitch-setup.service openvswitch.service
+Before=systemd-networkd.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/network.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-neutron-config-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-config-setup.service
new file mode 100644
index 00000000..b74f44ab
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-config-setup.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Run neutron-config-setup Ansible scripts
+ConditionPathExists=/etc/openstack/neutron.conf
+After=network-online.target openstack-keystone-setup.service
+Wants=network-online.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/neutron-config.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-neutron-db-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-db-setup.service
new file mode 100644
index 00000000..5d07da2e
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-db-setup.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Run neutron-db-setup Ansible scripts
+ConditionPathExists=/etc/openstack/neutron.conf
+After=network-online.target postgres-server-setup.service openstack-keystone-setup.service openstack-neutron-config-setup.service
+Wants=network-online.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/neutron-db.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-neutron-dhcp-agent.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-dhcp-agent.service
new file mode 100644
index 00000000..9080f3c1
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-dhcp-agent.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Neutron DHCP Agent
+ConditionPathExists=/etc/neutron/neutron.conf
+After=network-online.target openstack-neutron-config-setup.service openstack-neutron-db-setup.service openstack-neutron-ovs-cleanup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=neutron
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/neutron-dhcp-agent \
+ --config-file=/etc/neutron/neutron.conf \
+ --config-file=/etc/neutron/dhcp_agent.ini
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-neutron-l3-agent.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-l3-agent.service
new file mode 100644
index 00000000..72cd1651
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-l3-agent.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Neutron Layer 3 Agent
+ConditionPathExists=/etc/neutron/neutron.conf
+After=network-online.target openstack-neutron-config-setup.service openstack-neutron-db-setup.service openstack-neutron-ovs-cleanup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=neutron
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/neutron-l3-agent \
+ --config-file=/etc/neutron/neutron.conf \
+ --config-file=/etc/neutron/l3_agent.ini
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-neutron-metadata-agent.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-metadata-agent.service
new file mode 100644
index 00000000..20540e4c
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-metadata-agent.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Neutron Metadata Plugin Agent
+ConditionPathExists=/etc/neutron/neutron.conf
+After=network-online.target openstack-neutron-config-setup.service openstack-neutron-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=neutron
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/neutron-metadata-agent \
+ --config-file=/etc/neutron/neutron.conf \
+ --config-file=/etc/neutron/metadata_agent.ini
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-neutron-ovs-cleanup.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-ovs-cleanup.service
new file mode 100644
index 00000000..f5709028
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-ovs-cleanup.service
@@ -0,0 +1,18 @@
+[Unit]
+Description=Neutron OVS cleanup
+ConditionPathExists=/etc/neutron/neutron.conf
+ConditionFileIsExecutable=/usr/bin/neutron-ovs-cleanup
+After=network-online.target openstack-neutron-config-setup.service openstack-neutron-db-setup.service openvswitch.service
+Before=openstack-neutron-plugin-openvswitch-agent.service
+Wants=network-online.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+StandardOutput=null
+StandardError=null
+User=neutron
+ExecStart=/usr/bin/neutron-ovs-cleanup --config-file /etc/neutron/neutron.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/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
new file mode 100644
index 00000000..6c579a62
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-plugin-openvswitch-agent.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Neutron OpenvSwitch Plugin Agent
+ConditionPathExists=/etc/neutron/neutron.conf
+After=network-online.target openstack-neutron-config-setup.service openstack-neutron-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=neutron
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/neutron-openvswitch-agent \
+ --config-file=/etc/neutron/neutron.conf \
+ --config-file=/etc/neutron/plugins/ml2/ml2_conf.ini
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-neutron-server.service b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-server.service
new file mode 100644
index 00000000..6376c3d8
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-neutron-server.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Neutron Api Server
+ConditionPathExists=/etc/neutron/neutron.conf
+After=network-online.target openstack-neutron-config-setup.service openstack-neutron-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=neutron
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/neutron-server \
+ --config-file=/etc/neutron/neutron.conf \
+ --config-file=/etc/neutron/plugins/ml2/ml2_conf.ini
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-nova-api.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-api.service
new file mode 100644
index 00000000..521353db
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-api.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack Compute Service (code-named Nova) API server
+ConditionPathExists=/etc/nova/nova.conf
+After=network-online.target openstack-nova-config-setup.service openstack-nova-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=nova
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/nova-api --config-file /etc/nova/nova.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-nova-cert.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-cert.service
new file mode 100644
index 00000000..b3733816
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-cert.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack Nova Cert
+ConditionPathExists=/etc/nova/nova.conf
+After=network-online.target openstack-nova-config-setup.service openstack-nova-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=nova
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/nova-cert --config-file /etc/nova/nova.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-nova-compute.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-compute.service
new file mode 100644
index 00000000..4f9b8196
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-compute.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=OpenStack Compute Service (code-named Nova) compute server
+ConditionPathExists=/etc/nova/nova.conf
+After=network-online.target openstack-nova-config-setup.service openstack-nova-db-setup.service libvirtd.service
+Wants=network-online.target
+Requires=libvirtd.service
+
+[Service]
+Type=simple
+User=nova
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/nova-compute --config-file /etc/nova/nova.conf --config-file /etc/nova/nova-compute.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-nova-conductor.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-conductor.service
new file mode 100644
index 00000000..4c0d7d43
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-conductor.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Database-access support for Compute nodes (nova-conductor)
+ConditionPathExists=/etc/nova/nova.conf
+After=network-online.target openstack-nova-config-setup.service openstack-nova-db-setup.service libvirtd.service
+Wants=network-online.target
+Requires=libvirtd.service
+
+[Service]
+Type=simple
+User=nova
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/nova-conductor --config-file /etc/nova/nova.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-nova-config-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-config-setup.service
new file mode 100644
index 00000000..df669aa9
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-config-setup.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Run nova-config-setup Ansible scripts
+ConditionPathExists=/etc/openstack/nova.conf
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/nova-config.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-nova-consoleauth.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-consoleauth.service
new file mode 100644
index 00000000..e22780a9
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-consoleauth.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Openstack Console Auth (nova-consoleauth)
+ConditionPathExists=/etc/nova/nova.conf
+After=network-online.target openstack-nova-config-setup.service openstack-nova-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=nova
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/nova-consoleauth --config-file /etc/nova/nova.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-nova-db-setup.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-db-setup.service
new file mode 100644
index 00000000..8e004327
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-db-setup.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Run nova-db-setup Ansible scripts
+ConditionPathExists=/etc/openstack/nova.conf
+After=network-online.target postgres-server-setup.service openstack-keystone-setup.service openstack-nova-config-setup.service
+Wants=network-online.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/nova-db.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-nova-novncproxy.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-novncproxy.service
new file mode 100644
index 00000000..8cbb20fd
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-novncproxy.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack Nova NoVNC proxy
+ConditionPathExists=/etc/nova/nova.conf
+After=network-online.target openstack-nova-config-setup.service openstack-nova-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=nova
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/nova-novncproxy --config-file /etc/nova/nova.conf --web /usr/share/novnc
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-nova-scheduler.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-scheduler.service
new file mode 100644
index 00000000..e89f0d3e
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-scheduler.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack Nova Scheduler
+ConditionPathExists=/etc/nova/nova.conf
+After=network-online.target openstack-nova-config-setup.service openstack-nova-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=nova
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/nova-scheduler --config-file /etc/nova/nova.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openstack-nova-serialproxy.service b/install-files/openstack/usr/lib/systemd/system/openstack-nova-serialproxy.service
new file mode 100644
index 00000000..30af8305
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openstack-nova-serialproxy.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenStack Nova Serial Proxy
+ConditionPathExists=/etc/nova/nova.conf
+After=network-online.target openstack-nova-config-setup.service openstack-nova-db-setup.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=nova
+StandardOutput=null
+StandardError=null
+ExecStart=/usr/bin/nova-serialproxy --config-file /etc/nova/nova.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openvswitch-db-server.service b/install-files/openstack/usr/lib/systemd/system/openvswitch-db-server.service
new file mode 100644
index 00000000..34a7c812
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openvswitch-db-server.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Open vSwitch Database Server Daemon
+After=local-fs.target
+
+[Service]
+Type=forking
+ExecStartPre=-/usr/bin/mkdir -p /var/run/openvswitch
+ExecStart=/usr/sbin/ovsdb-server --remote=punix:/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/install-files/openstack/usr/lib/systemd/system/openvswitch-setup.service b/install-files/openstack/usr/lib/systemd/system/openvswitch-setup.service
new file mode 100644
index 00000000..8393ebbc
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openvswitch-setup.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Run openvswitch-setup Ansible scripts
+After=local-fs.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -i /usr/share/openstack/hosts /usr/share/openstack/openvswitch.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/openvswitch.service b/install-files/openstack/usr/lib/systemd/system/openvswitch.service
new file mode 100644
index 00000000..113911f6
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/openvswitch.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Open vSwitch Daemon
+Before=network-pre.target
+Wants=network-pre.target
+
+[Service]
+Type=forking
+ExecStartPre=-/usr/bin/mkdir -p /var/run/openvswitch
+ExecStart=/usr/sbin/ovs-vswitchd --pidfile --detach
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/postgres-server-setup.service b/install-files/openstack/usr/lib/systemd/system/postgres-server-setup.service
new file mode 100644
index 00000000..202c0636
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/postgres-server-setup.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Run postgres-setup Ansible scripts
+ConditionPathExists=/etc/openstack/postgres.conf
+After=local-fs.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -i /usr/share/openstack/hosts /usr/share/openstack/postgres.yml
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/postgres-server.service b/install-files/openstack/usr/lib/systemd/system/postgres-server.service
new file mode 100644
index 00000000..9e11f26d
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/postgres-server.service
@@ -0,0 +1,26 @@
+[Unit]
+Description=PostgreSQL database server
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=forking
+TimeoutSec=120
+User=postgres
+Group=postgres
+
+Environment=PGROOT=/var/lib/pgsql
+
+SyslogIdentifier=postgres
+PIDFile=/var/lib/pgsql/data/postmaster.pid
+
+ExecStart=/usr/bin/pg_ctl -s -D ${PGROOT}/data start -w -t 120
+ExecReload=/usr/bin/pg_ctl -s -D ${PGROOT}/data reload
+ExecStop=/usr/bin/pg_ctl -s -D ${PGROOT}/data stop -m fast
+
+# Due to PostgreSQL's use of shared memory, OOM killer is often overzealous in
+# killing Postgres, so adjust it downward
+OOMScoreAdjust=-200
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/rabbitmq-server.service b/install-files/openstack/usr/lib/systemd/system/rabbitmq-server.service
new file mode 100644
index 00000000..1a20f3e4
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/rabbitmq-server.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=RabbitMQ broker
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=notify
+User=rabbitmq
+Group=rabbitmq
+Environment=HOME=/var/lib/rabbitmq
+WorkingDirectory=/var/lib/rabbitmq
+ExecStart=/usr/sbin/rabbitmq-server
+ExecStop=/usr/sbin/rabbitmqctl stop
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/swift-controller-setup.service b/install-files/openstack/usr/lib/systemd/system/swift-controller-setup.service
new file mode 100644
index 00000000..ccfbcbe6
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/swift-controller-setup.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Run swift-controller-setup (once)
+After=local-fs.target network-online.target postgres-server-setup.service openstack-keystone-setup.service
+Wants=network-online.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -M /usr/share/ansible/ansible-openstack-modules -i /usr/share/openstack/hosts /usr/share/openstack/swift-controller.yml
+Restart=no
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/lib/systemd/system/swift-proxy.service b/install-files/openstack/usr/lib/systemd/system/swift-proxy.service
new file mode 100644
index 00000000..7b0a2e17
--- /dev/null
+++ b/install-files/openstack/usr/lib/systemd/system/swift-proxy.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=OpenStack Swift Proxy Server
+After=network-online.target swift-controller-setup.service memcached.service
+Wants=network-online.target
+
+[Service]
+Type=forking
+PIDFile=/var/run/swift/proxy-server.pid
+Restart=on-failure
+ExecStart=/usr/bin/swift-init proxy-server start
+ExecStop=/usr/bin/swift-init proxy-server stop
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/openstack/usr/share/openstack/ceilometer-config.yml b/install-files/openstack/usr/share/openstack/ceilometer-config.yml
new file mode 100644
index 00000000..9850d84d
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/ceilometer-config.yml
@@ -0,0 +1,36 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/ceilometer.conf"
+ tasks:
+# Configure ceilometer
+ - name: Create the ceilometer user.
+ user:
+ name: ceilometer
+ comment: Openstack Ceilometer Daemons
+ shell: /sbin/nologin
+ home: /var/lib/ceilometer
+
+ - name: Create the /var folders for ceilometer
+ file:
+ path: "{{ item }}"
+ state: directory
+ owner: ceilometer
+ group: ceilometer
+ with_items:
+ - /var/run/ceilometer
+ - /var/lock/ceilometer
+ - /var/log/ceilometer
+ - /var/lib/ceilometer
+
+ - name: Create /etc/ceilometer directory
+ file:
+ path: /etc/ceilometer
+ state: directory
+
+ - name: Add the configuration needed for ceilometer in /etc/ceilometer using templates
+ template:
+ src: /usr/share/openstack/ceilometer/{{ item }}
+ dest: /etc/ceilometer/{{ item }}
+ with_lines:
+ - cd /usr/share/openstack/ceilometer && find -type f
diff --git a/install-files/openstack/usr/share/openstack/ceilometer-db.yml b/install-files/openstack/usr/share/openstack/ceilometer-db.yml
new file mode 100644
index 00000000..46a929bc
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/ceilometer-db.yml
@@ -0,0 +1,50 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/ceilometer.conf"
+ tasks:
+ - name: Create ceilometer service user in service tenant
+ keystone_user:
+ user: "{{ CEILOMETER_SERVICE_USER }}"
+ password: "{{ CEILOMETER_SERVICE_PASSWORD }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Assign admin role to ceilometers service user in the service tenant
+ keystone_user:
+ role: admin
+ user: "{{ CEILOMETER_SERVICE_USER }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Add ceilometer endpoint
+ keystone_service:
+ name: ceilometer
+ type: metering
+ description: Openstack Metering Service
+ publicurl: http://{{ ansible_hostname }}:8777
+ internalurl: http://{{ CONTROLLER_HOST_ADDRESS }}:8777
+ adminurl: http://{{ CONTROLLER_HOST_ADDRESS }}:8777
+ region: regionOne
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Create postgresql user for ceilometer
+ postgresql_user:
+ name: "{{ CEILOMETER_DB_USER }}"
+ login_host: "{{ CONTROLLER_HOST_ADDRESS }}"
+ password: "{{ CEILOMETER_DB_PASSWORD }}"
+ sudo: yes
+ sudo_user: ceilometer
+
+ - name: Create database for ceilometer services
+ postgresql_db:
+ name: ceilometer
+ owner: "{{ CEILOMETER_DB_USER }}"
+ login_host: "{{ CONTROLLER_HOST_ADDRESS }}"
+ sudo: yes
+ sudo_user: ceilometer
+
+ - name: Initiate ceilometer database
+ command: ceilometer-dbsync
+ sudo: yes
+ sudo_user: ceilometer
diff --git a/install-files/openstack/usr/share/openstack/ceilometer/ceilometer.conf b/install-files/openstack/usr/share/openstack/ceilometer/ceilometer.conf
new file mode 100644
index 00000000..b1ad2f47
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/ceilometer/ceilometer.conf
@@ -0,0 +1,1330 @@
+[DEFAULT]
+
+#
+# From ceilometer
+#
+
+auth_strategy = keystone
+
+# To reduce large requests at same time to Nova or other components
+# from different compute agents, shuffle start time of polling task.
+# (integer value)
+#shuffle_time_before_polling_task = 0
+
+# Configuration file for WSGI definition of API. (string value)
+api_paste_config = api_paste.ini
+
+# Number of workers for Ceilometer API server. (integer value)
+#api_workers = 1
+
+# Polling namespace(s) to be used while resource polling (unknown
+# type)
+#polling_namespaces = ['compute', 'central']
+
+# List of pollsters (or wildcard templates) to be used while polling
+# (unknown type)
+#pollster_list = []
+
+# Exchange name for Nova notifications. (string value)
+nova_control_exchange = nova
+
+# List of metadata prefixes reserved for metering use. (list value)
+reserved_metadata_namespace = metering.
+
+# Limit on length of reserved metadata values. (integer value)
+#reserved_metadata_length = 256
+
+# List of metadata keys reserved for metering use. And these keys are
+# additional to the ones included in the namespace. (list value)
+#reserved_metadata_keys =
+
+# Inspector to use for inspecting the hypervisor layer. (string value)
+hypervisor_inspector = libvirt
+
+# Libvirt domain type. (string value)
+# Allowed values: kvm, lxc, qemu, uml, xen
+libvirt_type = {{ NOVA_VIRT_TYPE }}
+
+# Override the default libvirt URI (which is dependent on
+# libvirt_type). (string value)
+#libvirt_uri =
+
+# Exchange name for Data Processing notifications. (string value)
+#sahara_control_exchange = sahara
+
+# Dispatcher to process data. (multi valued)
+# Deprecated group/name - [collector]/dispatcher
+#dispatcher = database
+
+# Exchange name for Keystone notifications. (string value)
+keystone_control_exchange = keystone
+
+# Number of items to request in each paginated Glance API request
+# (parameter used by glancecelient). If this is less than or equal to
+# 0, page size is not specified (default value in glanceclient is
+# used). (integer value)
+#glance_page_size = 0
+
+# Exchange name for Glance notifications. (string value)
+glance_control_exchange = glance
+
+# Exchange name for Ironic notifications. (string value)
+ironic_exchange = ironic
+
+# Exchanges name to listen for notifications. (multi valued)
+#http_control_exchanges = nova
+#http_control_exchanges = glance
+#http_control_exchanges = neutron
+#http_control_exchanges = cinder
+
+# Exchange name for Neutron notifications. (string value)
+# Deprecated group/name - [DEFAULT]/quantum_control_exchange
+neutron_control_exchange = neutron
+
+# Allow novaclient's debug log output. (boolean value)
+#nova_http_log_debug = false
+
+# Swift reseller prefix. Must be on par with reseller_prefix in proxy-
+# server.conf. (string value)
+#reseller_prefix = AUTH_
+
+# Enable eventlet backdoor. Acceptable values are 0, <port>, and
+# <start>:<end>, where 0 results in listening on a random tcp port
+# number; <port> results in listening on the specified port number
+# (and not enabling backdoor if that port is in use); and
+# <start>:<end> results in listening on the smallest unused port
+# number within the specified range of port numbers. The chosen port
+# is displayed in the service's log file. (string value)
+#backdoor_port = <None>
+
+# Print debugging output (set logging level to DEBUG instead of
+# default WARNING level). (boolean value)
+#debug = false
+
+# Print more verbose output (set logging level to INFO instead of
+# default WARNING level). (boolean value)
+#verbose = false
+
+# Log output to standard error. (boolean value)
+#use_stderr = true
+
+# The name of a logging configuration file. This file is appended to
+# any existing logging configuration files. For details about logging
+# configuration files, see the Python logging module documentation.
+# (string value)
+# Deprecated group/name - [DEFAULT]/log_config
+#log_config_append = <None>
+
+# DEPRECATED. A logging.Formatter log message format string which may
+# use any of the available logging.LogRecord attributes. This option
+# is deprecated. Please use logging_context_format_string and
+# logging_default_format_string instead. (string value)
+#log_format = <None>
+
+# Format string for %%(asctime)s in log records. Default: %(default)s
+# . (string value)
+#log_date_format = %Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to output to. If no default is set,
+# logging will go to stdout. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file = <None>
+
+# (Optional) The base directory used for relative --log-file paths.
+# (string value)
+# Deprecated group/name - [DEFAULT]/logdir
+#log_dir = <None>
+
+# Use syslog for logging. Existing syslog format is DEPRECATED during
+# I, and will change in J to honor RFC5424. (boolean value)
+use_syslog = True
+
+# (Optional) Enables or disables syslog rfc5424 format for logging. If
+# enabled, prefixes the MSG part of the syslog message with APP-NAME
+# (RFC5424). The format without the APP-NAME is deprecated in I, and
+# will be removed in J. (boolean value)
+#use_syslog_rfc_format = false
+
+# Syslog facility to receive log lines. (string value)
+#syslog_log_facility = LOG_USER
+
+# Format string to use for log messages with context. (string value)
+#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages without context. (string
+# value)
+#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Data to append to log format when level is DEBUG. (string value)
+#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format. (string
+# value)
+#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s
+
+# List of logger=LEVEL pairs. (list value)
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN
+
+# Enables or disables publication of error events. (boolean value)
+#publish_errors = false
+
+# Enables or disables fatal status of deprecations. (boolean value)
+#fatal_deprecations = false
+
+# The format for an instance that is passed with the log message.
+# (string value)
+#instance_format = "[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log message.
+# (string value)
+#instance_uuid_format = "[instance: %(uuid)s] "
+
+# Exchange name for Heat notifications (string value)
+#heat_control_exchange = heat
+
+# Configuration file for pipeline definition. (string value)
+pipeline_cfg_file = pipeline.yaml
+
+# Configuration file for event pipeline definition. (string value)
+event_pipeline_cfg_file = event_pipeline.yaml
+
+# Exchange name for DBaaS notifications. (string value)
+#trove_control_exchange = trove
+
+# Exchange name for Messaging service notifications. (string value)
+#zaqar_control_exchange = zaqar
+
+# Source for samples emitted on this instance. (string value)
+# Deprecated group/name - [DEFAULT]/counter_source
+#sample_source = openstack
+
+# Name of this node, which must be valid in an AMQP key. Can be an
+# opaque identifier. For ZeroMQ only, must be a valid host name, FQDN,
+# or IP address. (string value)
+#host = noisecell
+
+# Number of workers for collector service. A single collector is
+# enabled by default. (integer value)
+#collector_workers = 1
+
+# Number of workers for notification service. A single notification
+# agent is enabled by default. (integer value)
+#notification_workers = 1
+
+# Timeout seconds for HTTP requests. Set it to None to disable
+# timeout. (integer value)
+#http_timeout = 600
+
+# DEPRECATED - Database connection string. (string value)
+#database_connection = <None>
+
+# Path to the rootwrap configuration file touse for running commands
+# as root (string value)
+rootwrap_config = /etc/ceilometer/rootwrap.conf
+
+# Exchange name for Cinder notifications. (string value)
+cinder_control_exchange = cinder
+
+#
+# From oslo.messaging
+#
+
+# ZeroMQ bind address. Should be a wildcard (*), an ethernet
+# interface, or IP. The "host" option should point or resolve to this
+# address. (string value)
+#rpc_zmq_bind_address = *
+
+# MatchMaker driver. (string value)
+#rpc_zmq_matchmaker = local
+
+# ZeroMQ receiver listening port. (integer value)
+#rpc_zmq_port = 9501
+
+# Number of ZeroMQ contexts, defaults to 1. (integer value)
+#rpc_zmq_contexts = 1
+
+# Maximum number of ingress messages to locally buffer per topic.
+# Default is unlimited. (integer value)
+#rpc_zmq_topic_backlog = <None>
+
+# Directory for holding IPC sockets. (string value)
+#rpc_zmq_ipc_dir = /var/run/openstack
+
+# Name of this node. Must be a valid hostname, FQDN, or IP address.
+# Must match "host" option, if running Nova. (string value)
+#rpc_zmq_host = localhost
+
+# Seconds to wait before a cast expires (TTL). Only supported by
+# impl_zmq. (integer value)
+#rpc_cast_timeout = 30
+
+# Heartbeat frequency. (integer value)
+#matchmaker_heartbeat_freq = 300
+
+# Heartbeat time-to-live. (integer value)
+#matchmaker_heartbeat_ttl = 600
+
+# Size of RPC thread pool. (integer value)
+#rpc_thread_pool_size = 64
+
+# Driver or drivers to handle sending notifications. (multi valued)
+#notification_driver =
+
+# AMQP topic used for OpenStack notifications. (list value)
+# Deprecated group/name - [rpc_notifier2]/topics
+#notification_topics = notifications
+
+# Seconds to wait for a response from a call. (integer value)
+#rpc_response_timeout = 60
+
+# A URL representing the messaging driver to use and its full
+# configuration. If not set, we fall back to the rpc_backend option
+# and driver specific configuration. (string value)
+#transport_url = <None>
+
+# The messaging driver to use, defaults to rabbit. Other drivers
+# include qpid and zmq. (string value)
+rpc_backend = rabbit
+
+# The default exchange under which topics are scoped. May be
+# overridden by an exchange name specified in the transport_url
+# option. (string value)
+#control_exchange = openstack
+
+
+[alarm]
+
+#
+# From ceilometer
+#
+
+# SSL Client certificate for REST notifier. (string value)
+#rest_notifier_certificate_file =
+
+# SSL Client private key for REST notifier. (string value)
+#rest_notifier_certificate_key =
+
+# Whether to verify the SSL Server certificate when calling alarm
+# action. (boolean value)
+#rest_notifier_ssl_verify = true
+
+# Number of retries for REST notifier (integer value)
+#rest_notifier_max_retries = 0
+
+# Period of evaluation cycle, should be >= than configured pipeline
+# interval for collection of underlying metrics. (integer value)
+# Deprecated group/name - [alarm]/threshold_evaluation_interval
+#evaluation_interval = 60
+
+# The topic that ceilometer uses for alarm notifier messages. (string
+# value)
+notifier_rpc_topic = alarm_notifier
+
+# The topic that ceilometer uses for alarm partition coordination
+# messages. DEPRECATED: RPC-based partitionedalarm evaluation service
+# will be removed in Kilo in favour of the default alarm evaluation
+# service using tooz for partitioning. (string value)
+#partition_rpc_topic = alarm_partition_coordination
+
+# URL to Gnocchi. (string value)
+#gnocchi_url = http://localhost:8041
+
+# Record alarm change events. (boolean value)
+#record_history = true
+
+# Maximum number of alarms defined for a user. (integer value)
+#user_alarm_quota = <None>
+
+# Maximum number of alarms defined for a project. (integer value)
+#project_alarm_quota = <None>
+
+# Driver to use for alarm evaluation service. DEPRECATED: "singleton"
+# and "partitioned" alarm evaluator services will be removed in Kilo
+# in favour of the default alarm evaluation service using tooz for
+# partitioning. (string value)
+#evaluation_service = default
+
+
+[api]
+
+#
+# From ceilometer
+#
+
+# The port for the ceilometer API server. (integer value)
+# Deprecated group/name - [DEFAULT]/metering_api_port
+port = 8777
+
+# The listen IP for the ceilometer API server. (string value)
+host = {{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+
+# Toggle Pecan Debug Middleware. (boolean value)
+#pecan_debug = false
+
+
+[central]
+
+#
+# From ceilometer
+#
+
+# Work-load partitioning group prefix. Use only if you want to run
+# multiple polling agents with different config files. For each sub-
+# group of the agent pool with the same partitioning_group_prefix a
+# disjoint subset of pollsters should be loaded. (string value)
+# Deprecated group/name - [central]/partitioning_group_prefix
+#partitioning_group_prefix = <None>
+
+
+[collector]
+
+#
+# From ceilometer
+#
+
+# Address to which the UDP socket is bound. Set to an empty string to
+# disable. (string value)
+#udp_address = 0.0.0.0
+
+# Port to which the UDP socket is bound. (integer value)
+#udp_port = 4952
+
+# Requeue the sample on the collector sample queue when the collector
+# fails to dispatch it. This is only valid if the sample come from the
+# notifier publisher. (boolean value)
+#requeue_sample_on_dispatcher_error = false
+
+# Requeue the event on the collector event queue when the collector
+# fails to dispatch it. (boolean value)
+#requeue_event_on_dispatcher_error = false
+
+
+[compute]
+
+#
+# From ceilometer
+#
+
+# Enable work-load partitioning, allowing multiple compute agents to
+# be run simultaneously. (boolean value)
+#workload_partitioning = false
+
+
+[coordination]
+
+#
+# From ceilometer
+#
+
+# The backend URL to use for distributed coordination. If left empty,
+# per-deployment central agent and per-host compute agent won't do
+# workload partitioning and will only function correctly if a single
+# instance of that service is running. (string value)
+#backend_url = <None>
+
+# Number of seconds between heartbeats for distributed coordination.
+# (floating point value)
+#heartbeat = 1.0
+
+# Number of seconds between checks to see if group membership has
+# changed (floating point value)
+#check_watchers = 10.0
+
+
+[database]
+
+#
+# From ceilometer
+#
+
+# Number of seconds that samples are kept in the database for (<= 0
+# means forever). (integer value)
+# Deprecated group/name - [database]/time_to_live
+#metering_time_to_live = -1
+
+# Number of seconds that events are kept in the database for (<= 0
+# means forever). (integer value)
+#event_time_to_live = -1
+
+# The connection string used to connect to the metering database. (if
+# unset, connection is used) (string value)
+#metering_connection = <None>
+
+# The connection string used to connect to the alarm database. (if
+# unset, connection is used) (string value)
+#alarm_connection = <None>
+
+# The connection string used to connect to the event database. (if
+# unset, connection is used) (string value)
+#event_connection = <None>
+
+# The name of the replica set which is used to connect to MongoDB
+# database. If it is set, MongoReplicaSetClient will be used instead
+# of MongoClient. (string value)
+#mongodb_replica_set =
+
+# The max length of resources id in DB2 nosql, the value should be
+# larger than len(hostname) * 2 as compute node's resource id is
+# <hostname>_<nodename>. (integer value)
+#db2nosql_resource_id_maxlen = 512
+
+#
+# From oslo.db
+#
+
+# The file name to use with SQLite. (string value)
+# Deprecated group/name - [DEFAULT]/sqlite_db
+#sqlite_db = oslo.sqlite
+
+# If True, SQLite uses synchronous mode. (boolean value)
+# Deprecated group/name - [DEFAULT]/sqlite_synchronous
+#sqlite_synchronous = true
+
+# The back end to use for the database. (string value)
+# Deprecated group/name - [DEFAULT]/db_backend
+#backend = sqlalchemy
+
+# The SQLAlchemy connection string to use to connect to the database.
+# (string value)
+# Deprecated group/name - [DEFAULT]/sql_connection
+# Deprecated group/name - [DATABASE]/sql_connection
+# Deprecated group/name - [sql]/connection
+#connection = <None>
+connection=postgresql://{{ CEILOMETER_DB_USER }}:{{ CEILOMETER_DB_PASSWORD }}@{{ CONTROLLER_HOST_ADDRESS }}/ceilometer
+
+# The SQLAlchemy connection string to use to connect to the slave
+# database. (string value)
+#slave_connection = <None>
+
+# The SQL mode to be used for MySQL sessions. This option, including
+# the default, overrides any server-set SQL mode. To use whatever SQL
+# mode is set by the server configuration, set this to no value.
+# Example: mysql_sql_mode= (string value)
+#mysql_sql_mode = TRADITIONAL
+
+# Timeout before idle SQL connections are reaped. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_idle_timeout
+# Deprecated group/name - [DATABASE]/sql_idle_timeout
+# Deprecated group/name - [sql]/idle_timeout
+#idle_timeout = 3600
+
+# Minimum number of SQL connections to keep open in a pool. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_min_pool_size
+# Deprecated group/name - [DATABASE]/sql_min_pool_size
+#min_pool_size = 1
+
+# Maximum number of SQL connections to keep open in a pool. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_max_pool_size
+# Deprecated group/name - [DATABASE]/sql_max_pool_size
+#max_pool_size = <None>
+
+# Maximum number of database connection retries during startup. Set to
+# -1 to specify an infinite retry count. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_retries
+# Deprecated group/name - [DATABASE]/sql_max_retries
+#max_retries = 10
+
+# Interval between retries of opening a SQL connection. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_retry_interval
+# Deprecated group/name - [DATABASE]/reconnect_interval
+#retry_interval = 10
+
+# If set, use this value for max_overflow with SQLAlchemy. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_max_overflow
+# Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow
+#max_overflow = <None>
+
+# Verbosity of SQL debugging information: 0=None, 100=Everything.
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_connection_debug
+#connection_debug = 0
+
+# Add Python stack traces to SQL as comment strings. (boolean value)
+# Deprecated group/name - [DEFAULT]/sql_connection_trace
+#connection_trace = false
+
+# If set, use this value for pool_timeout with SQLAlchemy. (integer
+# value)
+# Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout
+#pool_timeout = <None>
+
+# Enable the experimental use of database reconnect on connection
+# lost. (boolean value)
+#use_db_reconnect = false
+
+# Seconds between retries of a database transaction. (integer value)
+#db_retry_interval = 1
+
+# If True, increases the interval between retries of a database
+# operation up to db_max_retry_interval. (boolean value)
+#db_inc_retry_interval = true
+
+# If db_inc_retry_interval is set, the maximum seconds between retries
+# of a database operation. (integer value)
+#db_max_retry_interval = 10
+
+# Maximum retries in case of connection error or deadlock error before
+# error is raised. Set to -1 to specify an infinite retry count.
+# (integer value)
+#db_max_retries = 20
+
+
+[dispatcher_file]
+
+#
+# From ceilometer
+#
+
+# Name and the location of the file to record meters. (string value)
+#file_path = <None>
+
+# The max size of the file. (integer value)
+#max_bytes = 0
+
+# The max number of the files to keep. (integer value)
+#backup_count = 0
+
+
+[event]
+
+#
+# From ceilometer
+#
+
+# Configuration file for event definitions. (string value)
+definitions_cfg_file = event_definitions.yaml
+
+# Drop notifications if no event definition matches. (Otherwise, we
+# convert them with just the default traits) (boolean value)
+#drop_unmatched_notifications = false
+
+# Store the raw notification for select priority levels (info and/or
+# error). By default, raw details are not captured. (multi valued)
+#store_raw =
+
+
+[hardware]
+
+#
+# From ceilometer
+#
+
+# URL scheme to use for hardware nodes. (string value)
+#url_scheme = snmp://
+
+# SNMPd user name of all nodes running in the cloud. (string value)
+#readonly_user_name = ro_snmp_user
+
+# SNMPd password of all the nodes running in the cloud. (string value)
+#readonly_user_password = password
+
+
+[ipmi]
+
+#
+# From ceilometer
+#
+
+# Number of retries upon Intel Node Manager initialization failure
+# (integer value)
+#node_manager_init_retry = 3
+
+# Tolerance of IPMI/NM polling failures before disable this pollster.
+# Negative indicates retrying forever. (integer value)
+#polling_retry = 3
+
+
+[keystone_authtoken]
+
+#
+# From keystonemiddleware.auth_token
+#
+
+# Complete public Identity API endpoint. (string value)
+auth_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:5000/v2.0
+
+# API version of the admin Identity API endpoint. (string value)
+#auth_version = <None>
+
+# Do not handle authorization requests within the middleware, but
+# delegate the authorization decision to downstream WSGI components.
+# (boolean value)
+#delay_auth_decision = false
+
+# Request timeout value for communicating with Identity API server.
+# (integer value)
+#http_connect_timeout = <None>
+
+# How many times are we trying to reconnect when communicating with
+# Identity API Server. (integer value)
+#http_request_max_retries = 3
+
+# Env key for the swift cache. (string value)
+#cache = <None>
+
+# Required if identity server requires client certificate (string
+# value)
+#certfile = <None>
+
+# Required if identity server requires client certificate (string
+# value)
+#keyfile = <None>
+
+# A PEM encoded Certificate Authority to use when verifying HTTPs
+# connections. Defaults to system CAs. (string value)
+#cafile = <None>
+
+# Verify HTTPS connections. (boolean value)
+#insecure = false
+
+# Directory used to cache files related to PKI tokens. (string value)
+#signing_dir = <None>
+
+# Optionally specify a list of memcached server(s) to use for caching.
+# If left undefined, tokens will instead be cached in-process. (list
+# value)
+# Deprecated group/name - [DEFAULT]/memcache_servers
+#memcached_servers = <None>
+
+# In order to prevent excessive effort spent validating tokens, the
+# middleware caches previously-seen tokens for a configurable duration
+# (in seconds). Set to -1 to disable caching completely. (integer
+# value)
+#token_cache_time = 300
+
+# Determines the frequency at which the list of revoked tokens is
+# retrieved from the Identity service (in seconds). A high number of
+# revocation events combined with a low cache duration may
+# significantly reduce performance. (integer value)
+#revocation_cache_time = 10
+
+# (Optional) If defined, indicate whether token data should be
+# authenticated or authenticated and encrypted. Acceptable values are
+# MAC or ENCRYPT. If MAC, token data is authenticated (with HMAC) in
+# the cache. If ENCRYPT, token data is encrypted and authenticated in
+# the cache. If the value is not one of these options or empty,
+# auth_token will raise an exception on initialization. (string value)
+#memcache_security_strategy = <None>
+
+# (Optional, mandatory if memcache_security_strategy is defined) This
+# string is used for key derivation. (string value)
+#memcache_secret_key = <None>
+
+# (Optional) Number of seconds memcached server is considered dead
+# before it is tried again. (integer value)
+#memcache_pool_dead_retry = 300
+
+# (Optional) Maximum total number of open connections to every
+# memcached server. (integer value)
+#memcache_pool_maxsize = 10
+
+# (Optional) Socket timeout in seconds for communicating with a
+# memcache server. (integer value)
+#memcache_pool_socket_timeout = 3
+
+# (Optional) Number of seconds a connection to memcached is held
+# unused in the pool before it is closed. (integer value)
+#memcache_pool_unused_timeout = 60
+
+# (Optional) Number of seconds that an operation will wait to get a
+# memcache client connection from the pool. (integer value)
+#memcache_pool_conn_get_timeout = 10
+
+# (Optional) Use the advanced (eventlet safe) memcache client pool.
+# The advanced pool will only work under python 2.x. (boolean value)
+#memcache_use_advanced_pool = false
+
+# (Optional) Indicate whether to set the X-Service-Catalog header. If
+# False, middleware will not ask for service catalog on token
+# validation and will not set the X-Service-Catalog header. (boolean
+# value)
+#include_service_catalog = true
+
+# Used to control the use and type of token binding. Can be set to:
+# "disabled" to not check token binding. "permissive" (default) to
+# validate binding information if the bind type is of a form known to
+# the server and ignore it if not. "strict" like "permissive" but if
+# the bind type is unknown the token will be rejected. "required" any
+# form of token binding is needed to be allowed. Finally the name of a
+# binding method that must be present in tokens. (string value)
+#enforce_token_bind = permissive
+
+# If true, the revocation list will be checked for cached tokens. This
+# requires that PKI tokens are configured on the identity server.
+# (boolean value)
+#check_revocations_for_cached = false
+
+# Hash algorithms to use for hashing PKI tokens. This may be a single
+# algorithm or multiple. The algorithms are those supported by Python
+# standard hashlib.new(). The hashes will be tried in the order given,
+# so put the preferred one first for performance. The result of the
+# first hash will be stored in the cache. This will typically be set
+# to multiple values only while migrating from a less secure algorithm
+# to a more secure one. Once all the old tokens are expired this
+# option should be set to a single value for better performance. (list
+# value)
+#hash_algorithms = md5
+
+# Prefix to prepend at the beginning of the path. Deprecated, use
+# identity_uri. (string value)
+#auth_admin_prefix =
+
+# Host providing the admin Identity API endpoint. Deprecated, use
+# identity_uri. (string value)
+#auth_host = 127.0.0.1
+
+# Port of the admin Identity API endpoint. Deprecated, use
+# identity_uri. (integer value)
+#auth_port = 35357
+
+# Protocol of the admin Identity API endpoint (http or https).
+# Deprecated, use identity_uri. (string value)
+#auth_protocol = https
+
+# Complete admin Identity API endpoint. This should specify the
+# unversioned root endpoint e.g. https://localhost:35357/ (string
+# value)
+identity_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:35357
+
+# This option is deprecated and may be removed in a future release.
+# Single shared secret with the Keystone configuration used for
+# bootstrapping a Keystone installation, or otherwise bypassing the
+# normal authentication process. This option should not be used, use
+# `admin_user` and `admin_password` instead. (string value)
+#admin_token = <None>
+
+# Service username. (string value)
+admin_user = {{ CEILOMETER_SERVICE_USER }}
+
+# Service user password. (string value)
+admin_password = {{ CEILOMETER_SERVICE_PASSWORD }}
+
+# Service tenant name. (string value)
+admin_tenant_name = service
+
+
+[matchmaker_redis]
+
+#
+# From oslo.messaging
+#
+
+# Host to locate redis. (string value)
+#host = 127.0.0.1
+
+# Use this port to connect to redis host. (integer value)
+#port = 6379
+
+# Password for Redis server (optional). (string value)
+#password = <None>
+
+
+[matchmaker_ring]
+
+#
+# From oslo.messaging
+#
+
+# Matchmaker ring file (JSON). (string value)
+# Deprecated group/name - [DEFAULT]/matchmaker_ringfile
+#ringfile = /etc/oslo/matchmaker_ring.json
+
+
+[notification]
+
+#
+# From ceilometer
+#
+
+# Acknowledge message when event persistence fails. (boolean value)
+# Deprecated group/name - [collector]/ack_on_event_error
+#ack_on_event_error = true
+
+# Save event details. (boolean value)
+# Deprecated group/name - [collector]/store_events
+#store_events = false
+
+# WARNING: Ceilometer historically offered the ability to store events
+# as meters. This usage is NOT advised as it can flood the metering
+# database and cause performance degradation. This option disables the
+# collection of non-metric meters and will be the default behavior in
+# Liberty. (boolean value)
+#disable_non_metric_meters = false
+
+# Enable workload partitioning, allowing multiple notification agents
+# to be run simultaneously. (boolean value)
+#workload_partitioning = false
+
+# Messaging URLs to listen for notifications. Example:
+# transport://user:pass@host1:port[,hostN:portN]/virtual_host
+# (DEFAULT/transport_url is used if empty) (multi valued)
+#messaging_urls =
+
+
+[oslo_concurrency]
+
+#
+# From oslo.concurrency
+#
+
+# Enables or disables inter-process locks. (boolean value)
+# Deprecated group/name - [DEFAULT]/disable_process_locking
+#disable_process_locking = false
+
+# Directory to use for lock files. For security, the specified
+# directory should only be writable by the user running the processes
+# that need locking. Defaults to environment variable OSLO_LOCK_PATH.
+# If external locks are used, a lock path must be set. (string value)
+# Deprecated group/name - [DEFAULT]/lock_path
+#lock_path = <None>
+
+
+[oslo_messaging_amqp]
+
+#
+# From oslo.messaging
+#
+
+# address prefix used when sending to a specific server (string value)
+# Deprecated group/name - [amqp1]/server_request_prefix
+#server_request_prefix = exclusive
+
+# address prefix used when broadcasting to all servers (string value)
+# Deprecated group/name - [amqp1]/broadcast_prefix
+#broadcast_prefix = broadcast
+
+# address prefix when sending to any server in group (string value)
+# Deprecated group/name - [amqp1]/group_request_prefix
+#group_request_prefix = unicast
+
+# Name for the AMQP container (string value)
+# Deprecated group/name - [amqp1]/container_name
+#container_name = <None>
+
+# Timeout for inactive connections (in seconds) (integer value)
+# Deprecated group/name - [amqp1]/idle_timeout
+#idle_timeout = 0
+
+# Debug: dump AMQP frames to stdout (boolean value)
+# Deprecated group/name - [amqp1]/trace
+#trace = false
+
+# CA certificate PEM file for verifing server certificate (string
+# value)
+# Deprecated group/name - [amqp1]/ssl_ca_file
+#ssl_ca_file =
+
+# Identifying certificate PEM file to present to clients (string
+# value)
+# Deprecated group/name - [amqp1]/ssl_cert_file
+#ssl_cert_file =
+
+# Private key PEM file used to sign cert_file certificate (string
+# value)
+# Deprecated group/name - [amqp1]/ssl_key_file
+#ssl_key_file =
+
+# Password for decrypting ssl_key_file (if encrypted) (string value)
+# Deprecated group/name - [amqp1]/ssl_key_password
+#ssl_key_password = <None>
+
+# Accept clients using either SSL or plain TCP (boolean value)
+# Deprecated group/name - [amqp1]/allow_insecure_clients
+#allow_insecure_clients = false
+
+
+[oslo_messaging_qpid]
+
+#
+# From oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+#amqp_durable_queues = false
+
+# Auto-delete queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/amqp_auto_delete
+#amqp_auto_delete = false
+
+# Size of RPC connection pool. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_conn_pool_size
+#rpc_conn_pool_size = 30
+
+# Qpid broker hostname. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_hostname
+#qpid_hostname = localhost
+
+# Qpid broker port. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_port
+#qpid_port = 5672
+
+# Qpid HA cluster host:port pairs. (list value)
+# Deprecated group/name - [DEFAULT]/qpid_hosts
+#qpid_hosts = $qpid_hostname:$qpid_port
+
+# Username for Qpid connection. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_username
+#qpid_username =
+
+# Password for Qpid connection. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_password
+#qpid_password =
+
+# Space separated list of SASL mechanisms to use for auth. (string
+# value)
+# Deprecated group/name - [DEFAULT]/qpid_sasl_mechanisms
+#qpid_sasl_mechanisms =
+
+# Seconds between connection keepalive heartbeats. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_heartbeat
+#qpid_heartbeat = 60
+
+# Transport to use, either 'tcp' or 'ssl'. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_protocol
+#qpid_protocol = tcp
+
+# Whether to disable the Nagle algorithm. (boolean value)
+# Deprecated group/name - [DEFAULT]/qpid_tcp_nodelay
+#qpid_tcp_nodelay = true
+
+# The number of prefetched messages held by receiver. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_receiver_capacity
+#qpid_receiver_capacity = 1
+
+# The qpid topology version to use. Version 1 is what was originally
+# used by impl_qpid. Version 2 includes some backwards-incompatible
+# changes that allow broker federation to work. Users should update
+# to version 2 when they are able to take everything down, as it
+# requires a clean break. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_topology_version
+#qpid_topology_version = 1
+
+
+[oslo_messaging_rabbit]
+
+#
+# From oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+#amqp_durable_queues = false
+
+# Auto-delete queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/amqp_auto_delete
+#amqp_auto_delete = false
+
+# Size of RPC connection pool. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_conn_pool_size
+#rpc_conn_pool_size = 30
+
+# SSL version to use (valid only if SSL enabled). Valid values are
+# TLSv1 and SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may be
+# available on some distributions. (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_version
+#kombu_ssl_version =
+
+# SSL key file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_keyfile
+#kombu_ssl_keyfile =
+
+# SSL cert file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_certfile
+#kombu_ssl_certfile =
+
+# SSL certification authority file (valid only if SSL enabled).
+# (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_ca_certs
+#kombu_ssl_ca_certs =
+
+# How long to wait before reconnecting in response to an AMQP consumer
+# cancel notification. (floating point value)
+# Deprecated group/name - [DEFAULT]/kombu_reconnect_delay
+#kombu_reconnect_delay = 1.0
+
+# The RabbitMQ broker address where a single node is used. (string
+# value)
+# Deprecated group/name - [DEFAULT]/rabbit_host
+rabbit_host = {{ RABBITMQ_HOST }}
+
+# The RabbitMQ broker port where a single node is used. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/rabbit_port
+rabbit_port = {{ RABBITMQ_PORT }}
+
+# RabbitMQ HA cluster host:port pairs. (list value)
+# Deprecated group/name - [DEFAULT]/rabbit_hosts
+#rabbit_hosts = $rabbit_host:$rabbit_port
+
+# Connect over SSL for RabbitMQ. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_use_ssl
+rabbit_use_ssl = false
+
+# The RabbitMQ userid. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_userid
+rabbit_userid = {{ RABBITMQ_USER }}
+
+# The RabbitMQ password. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_password
+rabbit_password = {{ RABBITMQ_PASSWORD }}
+
+# The RabbitMQ login method. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_login_method
+#rabbit_login_method = AMQPLAIN
+
+# The RabbitMQ virtual host. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_virtual_host
+rabbit_virtual_host = /
+
+# How frequently to retry connecting with RabbitMQ. (integer value)
+#rabbit_retry_interval = 1
+
+# How long to backoff for between retries when connecting to RabbitMQ.
+# (integer value)
+# Deprecated group/name - [DEFAULT]/rabbit_retry_backoff
+#rabbit_retry_backoff = 2
+
+# Maximum number of RabbitMQ connection retries. Default is 0
+# (infinite retry count). (integer value)
+# Deprecated group/name - [DEFAULT]/rabbit_max_retries
+#rabbit_max_retries = 0
+
+# Use HA queues in RabbitMQ (x-ha-policy: all). If you change this
+# option, you must wipe the RabbitMQ database. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_ha_queues
+#rabbit_ha_queues = false
+
+# Number of seconds after which the Rabbit broker is considered down
+# if heartbeat's keep-alive fails (0 disables the heartbeat, >0
+# enables it. Enabling heartbeats requires kombu>=3.0.7 and
+# amqp>=1.4.0). EXPERIMENTAL (integer value)
+#heartbeat_timeout_threshold = 0
+
+# How often times during the heartbeat_timeout_threshold we check the
+# heartbeat. (integer value)
+#heartbeat_rate = 2
+
+# Deprecated, use rpc_backend=kombu+memory or rpc_backend=fake
+# (boolean value)
+# Deprecated group/name - [DEFAULT]/fake_rabbit
+#fake_rabbit = false
+
+
+[oslo_policy]
+
+#
+# From oslo.policy
+#
+
+# The JSON file that defines policies. (string value)
+# Deprecated group/name - [DEFAULT]/policy_file
+policy_file = policy.json
+
+# Default rule. Enforced when a requested rule is not found. (string
+# value)
+# Deprecated group/name - [DEFAULT]/policy_default_rule
+policy_default_rule = default
+
+# Directories where policy configuration files are stored. They can be
+# relative to any directory in the search path defined by the
+# config_dir option, or absolute paths. The file defined by
+# policy_file must exist for these directories to be searched.
+# Missing or empty directories are ignored. (multi valued)
+# Deprecated group/name - [DEFAULT]/policy_dirs
+#policy_dirs = policy.d
+
+
+[polling]
+
+#
+# From ceilometer
+#
+
+# Work-load partitioning group prefix. Use only if you want to run
+# multiple polling agents with different config files. For each sub-
+# group of the agent pool with the same partitioning_group_prefix a
+# disjoint subset of pollsters should be loaded. (string value)
+# Deprecated group/name - [central]/partitioning_group_prefix
+#partitioning_group_prefix = <None>
+
+
+[publisher]
+
+#
+# From ceilometer
+#
+
+# Secret value for signing messages. Set value empty if signing is not
+# required to avoid computational overhead. (string value)
+# Deprecated group/name - [DEFAULT]/metering_secret
+# Deprecated group/name - [publisher_rpc]/metering_secret
+# Deprecated group/name - [publisher]/metering_secret
+#telemetry_secret = change this for valid signing
+
+
+[publisher_notifier]
+
+#
+# From ceilometer
+#
+
+# The topic that ceilometer uses for metering notifications. (string
+# value)
+#metering_topic = metering
+
+# The topic that ceilometer uses for event notifications. (string
+# value)
+#event_topic = event
+
+# The driver that ceilometer uses for metering notifications. (string
+# value)
+# Deprecated group/name - [DEFAULT]/metering_driver
+#telemetry_driver = messagingv2
+
+
+[publisher_rpc]
+
+#
+# From ceilometer
+#
+
+# The topic that ceilometer uses for metering messages. (string value)
+# Deprecated group/name - [DEFAULT]/metering_topic
+#metering_topic = metering
+
+
+[rgw_admin_credentials]
+
+#
+# From ceilometer
+#
+
+# Access key for Radosgw Admin. (string value)
+#access_key = <None>
+
+# Secret key for Radosgw Admin. (string value)
+#secret_key = <None>
+
+
+[service_credentials]
+
+#
+# From ceilometer
+#
+
+# User name to use for OpenStack service access. (string value)
+# Deprecated group/name - [DEFAULT]/os_username
+os_username = {{ CEILOMETER_SERVICE_USER }}
+
+# Password to use for OpenStack service access. (string value)
+# Deprecated group/name - [DEFAULT]/os_password
+os_password = {{ CEILOMETER_SERVICE_PASSWORD }}
+
+# Tenant ID to use for OpenStack service access. (string value)
+# Deprecated group/name - [DEFAULT]/os_tenant_id
+#os_tenant_id =
+
+# Tenant name to use for OpenStack service access. (string value)
+# Deprecated group/name - [DEFAULT]/os_tenant_name
+os_tenant_name = service
+
+# Certificate chain for SSL validation. (string value)
+#os_cacert = <None>
+
+# Auth URL to use for OpenStack service access. (string value)
+# Deprecated group/name - [DEFAULT]/os_auth_url
+os_auth_url = http://{{ CONTROLLER_HOST_ADDRESS }}:5000/v2.0
+
+# Region name to use for OpenStack service endpoints. (string value)
+# Deprecated group/name - [DEFAULT]/os_region_name
+os_region_name = regionOne
+
+# Type of endpoint in Identity service catalog to use for
+# communication with OpenStack services. (string value)
+os_endpoint_type = internalURL
+
+# Disables X.509 certificate validation when an SSL connection to
+# Identity Service is established. (boolean value)
+#insecure = false
+
+
+[service_types]
+
+#
+# From ceilometer
+#
+
+# Kwapi service type. (string value)
+#kwapi = energy
+
+# Glance service type. (string value)
+glance = image
+
+# Neutron service type. (string value)
+neutron = network
+
+# Nova service type. (string value)
+nova = compute
+
+# Radosgw service type. (string value)
+#radosgw = object-store
+
+# Swift service type. (string value)
+#swift = object-store
+
+
+[vmware]
+
+#
+# From ceilometer
+#
+
+# IP address of the VMware Vsphere host. (string value)
+#host_ip =
+
+# Port of the VMware Vsphere host. (integer value)
+#host_port = 443
+
+# Username of VMware Vsphere. (string value)
+#host_username =
+
+# Password of VMware Vsphere. (string value)
+#host_password =
+
+# Number of times a VMware Vsphere API may be retried. (integer value)
+#api_retry_count = 10
+
+# Sleep time in seconds for polling an ongoing async task. (floating
+# point value)
+#task_poll_interval = 0.5
+
+# Optional vim service WSDL location e.g
+# http://<server>/vimService.wsdl. Optional over-ride to default
+# location for bug work-arounds. (string value)
+#wsdl_location = <None>
+
+
+[xenapi]
+
+#
+# From ceilometer
+#
+
+# URL for connection to XenServer/Xen Cloud Platform. (string value)
+#connection_url = <None>
+
+# Username for connection to XenServer/Xen Cloud Platform. (string
+# value)
+#connection_username = root
+
+# Password for connection to XenServer/Xen Cloud Platform. (string
+# value)
+#connection_password = <None>
+
+# Timeout in seconds for XenAPI login. (integer value)
+#login_timeout = 10
diff --git a/install-files/openstack/usr/share/openstack/cinder-config.yml b/install-files/openstack/usr/share/openstack/cinder-config.yml
new file mode 100644
index 00000000..fd3e2cd0
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/cinder-config.yml
@@ -0,0 +1,37 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/cinder.conf"
+ tasks:
+# Configure cinder
+ - name: Create the cinder user.
+ user:
+ name: cinder
+ comment: Openstack Cinder Daemons
+ shell: /sbin/nologin
+ home: /var/lib/cinder
+
+ - name: Create the /var folders for cinder
+ file:
+ path: "{{ item }}"
+ state: directory
+ owner: cinder
+ group: cinder
+ with_items:
+ - /var/run/cinder
+ - /var/lock/cinder
+ - /var/log/cinder
+ - /var/lib/cinder
+ - /var/lib/cinder/volumes
+
+ - name: Create /etc/cinder directory
+ file:
+ path: /etc/cinder
+ state: directory
+
+ - name: Add the configuration needed for cinder in /etc/cinder using templates
+ template:
+ src: /usr/share/openstack/cinder/{{ item }}
+ dest: /etc/cinder/{{ item }}
+ with_lines:
+ - cd /usr/share/openstack/cinder && find -type f
diff --git a/install-files/openstack/usr/share/openstack/cinder-db.yml b/install-files/openstack/usr/share/openstack/cinder-db.yml
new file mode 100644
index 00000000..24e4980f
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/cinder-db.yml
@@ -0,0 +1,59 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/cinder.conf"
+ tasks:
+ - name: Create cinder service user in service tenant
+ keystone_user:
+ user: "{{ CINDER_SERVICE_USER }}"
+ password: "{{ CINDER_SERVICE_PASSWORD }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Assign admin role to cinder service user in the service tenant
+ keystone_user:
+ role: admin
+ user: "{{ CINDER_SERVICE_USER }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Add cinder endpoint
+ keystone_service:
+ name: cinder
+ type: volume
+ description: Openstack Block Storage
+ publicurl: 'http://{{ ansible_hostname }}:8776/v1/%(tenant_id)s'
+ internalurl: 'http://{{ CONTROLLER_HOST_ADDRESS }}:8776/v1/%(tenant_id)s'
+ adminurl: 'http://{{ CONTROLLER_HOST_ADDRESS }}:8776/v1/%(tenant_id)s'
+ region: regionOne
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Add cinderv2 endpoint
+ keystone_service:
+ name: cinderv2
+ type: volumev2
+ description: Openstack Block Storage
+ publicurl: 'http://{{ ansible_hostname }}:8776/v2/%(tenant_id)s'
+ internalurl: 'http://{{ CONTROLLER_HOST_ADDRESS }}:8776/v2/%(tenant_id)s'
+ adminurl: 'http://{{ CONTROLLER_HOST_ADDRESS }}:8776/v2/%(tenant_id)s'
+ region: regionOne
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Create postgresql user for cinder
+ postgresql_user:
+ name: "{{ CINDER_DB_USER }}"
+ password: "{{ CINDER_DB_PASSWORD }}"
+ sudo: yes
+ sudo_user: cinder
+
+ - name: Create database for cinder services
+ postgresql_db:
+ name: cinder
+ owner: "{{ CINDER_DB_USER }}"
+ sudo: yes
+ sudo_user: cinder
+
+ - name: Initiate cinder database
+ command: cinder-manage db sync
+ sudo: yes
+ sudo_user: cinder
diff --git a/install-files/openstack/usr/share/openstack/cinder-lvs.yml b/install-files/openstack/usr/share/openstack/cinder-lvs.yml
new file mode 100644
index 00000000..7a91a306
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/cinder-lvs.yml
@@ -0,0 +1,21 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/cinder.conf"
+ tasks:
+ - name: Check that CINDER_DEVICE exists
+ stat:
+ path: "{{ CINDER_DEVICE }}"
+ register: cinder_device_stats
+ failed_when: cinder_device_stats.stat.exists == false
+
+ - name: Configure LVM group for cinder
+ lvg:
+ vg: cinder-volumes
+ pvs: "{{ CINDER_DEVICE }}"
+
+ - lineinfile:
+ dest: /etc/lvm/lvm.conf
+ regexp: '# filter = \[ \"a\/\.\*/\" \]'
+ line: ' filter = [ "a|{{ CINDER_DEVICE }}|", "r/.*/" ]'
+ backrefs: yes
diff --git a/install-files/openstack/usr/share/openstack/cinder/cinder.conf b/install-files/openstack/usr/share/openstack/cinder/cinder.conf
new file mode 100644
index 00000000..f3e4f11c
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/cinder/cinder.conf
@@ -0,0 +1,2991 @@
+[DEFAULT]
+
+use_syslog = True
+
+#
+# Options defined in oslo.messaging
+#
+
+# ZeroMQ bind address. Should be a wildcard (*), an ethernet
+# interface, or IP. The "host" option should point or resolve
+# to this address. (string value)
+#rpc_zmq_bind_address=*
+
+# MatchMaker driver. (string value)
+#rpc_zmq_matchmaker=local
+
+# ZeroMQ receiver listening port. (integer value)
+#rpc_zmq_port=9501
+
+# Number of ZeroMQ contexts, defaults to 1. (integer value)
+#rpc_zmq_contexts=1
+
+# Maximum number of ingress messages to locally buffer per
+# topic. Default is unlimited. (integer value)
+#rpc_zmq_topic_backlog=<None>
+
+# Directory for holding IPC sockets. (string value)
+#rpc_zmq_ipc_dir=/var/run/openstack
+
+# Name of this node. Must be a valid hostname, FQDN, or IP
+# address. Must match "host" option, if running Nova. (string
+# value)
+#rpc_zmq_host=cinder
+
+# Seconds to wait before a cast expires (TTL). Only supported
+# by impl_zmq. (integer value)
+#rpc_cast_timeout=30
+
+# Heartbeat frequency. (integer value)
+#matchmaker_heartbeat_freq=300
+
+# Heartbeat time-to-live. (integer value)
+#matchmaker_heartbeat_ttl=600
+
+# Size of RPC thread pool. (integer value)
+#rpc_thread_pool_size=64
+
+# Driver or drivers to handle sending notifications. (multi
+# valued)
+notification_driver=messagingv2
+
+# AMQP topic used for OpenStack notifications. (list value)
+# Deprecated group/name - [rpc_notifier2]/topics
+#notification_topics=notifications
+
+# Seconds to wait for a response from a call. (integer value)
+#rpc_response_timeout=60
+
+# A URL representing the messaging driver to use and its full
+# configuration. If not set, we fall back to the rpc_backend
+# option and driver specific configuration. (string value)
+#transport_url=<None>
+
+# The messaging driver to use, defaults to rabbit. Other
+# drivers include qpid and zmq. (string value)
+rpc_backend=rabbit
+
+# The default exchange under which topics are scoped. May be
+# overridden by an exchange name specified in the
+# transport_url option. (string value)
+control_exchange=cinder
+
+
+#
+# Options defined in cinder.exception
+#
+
+# Make exception message format errors fatal. (boolean value)
+#fatal_exception_format_errors=false
+
+
+#
+# Options defined in cinder.quota
+#
+
+# Number of volumes allowed per project (integer value)
+#quota_volumes=10
+
+# Number of volume snapshots allowed per project (integer
+# value)
+#quota_snapshots=10
+
+# Number of consistencygroups allowed per project (integer
+# value)
+#quota_consistencygroups=10
+
+# Total amount of storage, in gigabytes, allowed for volumes
+# and snapshots per project (integer value)
+#quota_gigabytes=1000
+
+# Number of volume backups allowed per project (integer value)
+#quota_backups=10
+
+# Total amount of storage, in gigabytes, allowed for backups
+# per project (integer value)
+#quota_backup_gigabytes=1000
+
+# Number of seconds until a reservation expires (integer
+# value)
+#reservation_expire=86400
+
+# Count of reservations until usage is refreshed (integer
+# value)
+#until_refresh=0
+
+# Number of seconds between subsequent usage refreshes
+# (integer value)
+#max_age=0
+
+# Default driver to use for quota checks (string value)
+#quota_driver=cinder.quota.DbQuotaDriver
+
+# Enables or disables use of default quota class with default
+# quota. (boolean value)
+#use_default_quota_class=true
+
+
+#
+# Options defined in cinder.service
+#
+
+# Interval, in seconds, between nodes reporting state to
+# datastore (integer value)
+#report_interval=10
+
+# Interval, in seconds, between running periodic tasks
+# (integer value)
+#periodic_interval=60
+
+# Range, in seconds, to randomly delay when starting the
+# periodic task scheduler to reduce stampeding. (Disable by
+# setting to 0) (integer value)
+#periodic_fuzzy_delay=60
+
+# IP address on which OpenStack Volume API listens (string
+# value)
+#osapi_volume_listen=0.0.0.0
+
+# Port on which OpenStack Volume API listens (integer value)
+#osapi_volume_listen_port=8776
+
+# Number of workers for OpenStack Volume API service. The
+# default is equal to the number of CPUs available. (integer
+# value)
+#osapi_volume_workers=<None>
+
+
+#
+# Options defined in cinder.ssh_utils
+#
+
+# Option to enable strict host key checking. When set to
+# "True" Cinder will only connect to systems with a host key
+# present in the configured "ssh_hosts_key_file". When set to
+# "False" the host key will be saved upon first connection and
+# used for subsequent connections. Default=False (boolean
+# value)
+#strict_ssh_host_key_policy=false
+
+# File containing SSH host keys for the systems with which
+# Cinder needs to communicate. OPTIONAL:
+# Default=$state_path/ssh_known_hosts (string value)
+#ssh_hosts_key_file=$state_path/ssh_known_hosts
+
+
+#
+# Options defined in cinder.test
+#
+
+# File name of clean sqlite db (string value)
+#sqlite_clean_db=clean.sqlite
+
+
+#
+# Options defined in cinder.wsgi
+#
+
+# Maximum line size of message headers to be accepted.
+# max_header_line may need to be increased when using large
+# tokens (typically those generated by the Keystone v3 API
+# with big service catalogs). (integer value)
+#max_header_line=16384
+
+# Timeout for client connections' socket operations. If an
+# incoming connection is idle for this number of seconds it
+# will be closed. A value of '0' means wait forever. (integer
+# value)
+#client_socket_timeout=900
+
+# If False, closes the client socket connection explicitly.
+# Setting it to True to maintain backward compatibility.
+# Recommended setting is set it to False. (boolean value)
+#wsgi_keep_alive=true
+
+# Sets the value of TCP_KEEPALIVE (True/False) for each server
+# socket. (boolean value)
+#tcp_keepalive=true
+
+# Sets the value of TCP_KEEPIDLE in seconds for each server
+# socket. Not supported on OS X. (integer value)
+#tcp_keepidle=600
+
+# Sets the value of TCP_KEEPINTVL in seconds for each server
+# socket. Not supported on OS X. (integer value)
+#tcp_keepalive_interval=<None>
+
+# Sets the value of TCP_KEEPCNT for each server socket. Not
+# supported on OS X. (integer value)
+#tcp_keepalive_count=<None>
+
+# CA certificate file to use to verify connecting clients
+# (string value)
+#ssl_ca_file=<None>
+
+# Certificate file to use when starting the server securely
+# (string value)
+#ssl_cert_file=<None>
+
+# Private key file to use when starting the server securely
+# (string value)
+#ssl_key_file=<None>
+
+
+#
+# Options defined in cinder.api.common
+#
+
+# The maximum number of items that a collection resource
+# returns in a single response (integer value)
+#osapi_max_limit=1000
+
+# Base URL that will be presented to users in links to the
+# OpenStack Volume API (string value)
+# Deprecated group/name - [DEFAULT]/osapi_compute_link_prefix
+#osapi_volume_base_URL=<None>
+
+
+#
+# Options defined in cinder.api.middleware.auth
+#
+
+# Treat X-Forwarded-For as the canonical remote address. Only
+# enable this if you have a sanitizing proxy. (boolean value)
+#use_forwarded_for=false
+
+
+#
+# Options defined in cinder.api.middleware.sizelimit
+#
+
+# Max size for body of a request (integer value)
+#osapi_max_request_body_size=114688
+
+
+#
+# Options defined in cinder.api.views.versions
+#
+
+# Public url to use for versions endpoint. The default is
+# None, which will use the request's host_url attribute to
+# populate the URL base. If Cinder is operating behind a
+# proxy, you will want to change this to represent the proxy's
+# URL. (string value)
+#public_endpoint=<None>
+
+
+#
+# Options defined in cinder.backup.chunkeddriver
+#
+
+# Compression algorithm (None to disable) (string value)
+#backup_compression_algorithm=zlib
+
+
+#
+# Options defined in cinder.backup.driver
+#
+
+# Backup metadata version to be used when backing up volume
+# metadata. If this number is bumped, make sure the service
+# doing the restore supports the new version. (integer value)
+#backup_metadata_version=2
+
+# The number of chunks or objects, for which one Ceilometer
+# notification will be sent (integer value)
+#backup_object_number_per_notification=10
+
+# Interval, in seconds, between two progress notifications
+# reporting the backup status (integer value)
+#backup_timer_interval=120
+
+
+#
+# Options defined in cinder.backup.drivers.ceph
+#
+
+# Ceph configuration file to use. (string value)
+#backup_ceph_conf=/etc/ceph/ceph.conf
+
+# The Ceph user to connect with. Default here is to use the
+# same user as for Cinder volumes. If not using cephx this
+# should be set to None. (string value)
+#backup_ceph_user=cinder
+
+# The chunk size, in bytes, that a backup is broken into
+# before transfer to the Ceph object store. (integer value)
+#backup_ceph_chunk_size=134217728
+
+# The Ceph pool where volume backups are stored. (string
+# value)
+#backup_ceph_pool=backups
+
+# RBD stripe unit to use when creating a backup image.
+# (integer value)
+#backup_ceph_stripe_unit=0
+
+# RBD stripe count to use when creating a backup image.
+# (integer value)
+#backup_ceph_stripe_count=0
+
+# If True, always discard excess bytes when restoring volumes
+# i.e. pad with zeroes. (boolean value)
+#restore_discard_excess_bytes=true
+
+
+#
+# Options defined in cinder.backup.drivers.nfs
+#
+
+# The maximum size in bytes of the files used to hold backups.
+# If the volume being backed up exceeds this size, then it
+# will be backed up into multiple files. (integer value)
+#backup_file_size=1999994880
+
+# The size in bytes that changes are tracked for incremental
+# backups. backup_swift_object_size has to be multiple of
+# backup_swift_block_size. (integer value)
+#backup_sha_block_size_bytes=32768
+
+# Enable or Disable the timer to send the periodic progress
+# notifications to Ceilometer when backing up the volume to
+# the backend storage. The default value is True to enable the
+# timer. (boolean value)
+#backup_enable_progress_timer=true
+
+# Base dir containing mount point for NFS share. (string
+# value)
+#backup_mount_point_base=$state_path/backup_mount
+
+# NFS share in fqdn:path, ipv4addr:path, or "[ipv6addr]:path"
+# format. (string value)
+#backup_share=<None>
+
+# Mount options passed to the NFS client. See NFS man page for
+# details. (string value)
+#backup_mount_options=<None>
+
+# Custom container to use for backups. (string value)
+#backup_container=<None>
+
+
+#
+# Options defined in cinder.backup.drivers.swift
+#
+
+# The URL of the Swift endpoint (string value)
+#backup_swift_url=<None>
+
+# Info to match when looking for swift in the service catalog.
+# Format is: separated values of the form:
+# <service_type>:<service_name>:<endpoint_type> - Only used if
+# backup_swift_url is unset (string value)
+#swift_catalog_info=object-store:swift:publicURL
+
+# Swift authentication mechanism (string value)
+#backup_swift_auth=per_user
+
+# Swift authentication version. Specify "1" for auth 1.0, or
+# "2" for auth 2.0 (string value)
+#backup_swift_auth_version=1
+
+# Swift tenant/account name. Required when connecting to an
+# auth 2.0 system (string value)
+#backup_swift_tenant=<None>
+
+# Swift user name (string value)
+#backup_swift_user=<None>
+
+# Swift key for authentication (string value)
+#backup_swift_key=<None>
+
+# The default Swift container to use (string value)
+#backup_swift_container=volumebackups
+
+# The size in bytes of Swift backup objects (integer value)
+#backup_swift_object_size=52428800
+
+# The size in bytes that changes are tracked for incremental
+# backups. backup_swift_object_size has to be multiple of
+# backup_swift_block_size. (integer value)
+#backup_swift_block_size=32768
+
+# The number of retries to make for Swift operations (integer
+# value)
+#backup_swift_retry_attempts=3
+
+# The backoff time in seconds between Swift retries (integer
+# value)
+#backup_swift_retry_backoff=2
+
+# Enable or Disable the timer to send the periodic progress
+# notifications to Ceilometer when backing up the volume to
+# the Swift backend storage. The default value is True to
+# enable the timer. (boolean value)
+#backup_swift_enable_progress_timer=true
+
+
+#
+# Options defined in cinder.backup.drivers.tsm
+#
+
+# Volume prefix for the backup id when backing up to TSM
+# (string value)
+#backup_tsm_volume_prefix=backup
+
+# TSM password for the running username (string value)
+#backup_tsm_password=password
+
+# Enable or Disable compression for backups (boolean value)
+#backup_tsm_compression=true
+
+
+#
+# Options defined in cinder.backup.manager
+#
+
+# Driver to use for backups. (string value)
+# Deprecated group/name - [DEFAULT]/backup_service
+#backup_driver=cinder.backup.drivers.swift
+
+
+#
+# Options defined in cinder.cmd.volume
+#
+
+# Backend override of host value. (string value)
+# Deprecated group/name - [DEFAULT]/host
+#backend_host=<None>
+
+
+#
+# Options defined in cinder.cmd.volume_usage_audit
+#
+
+# If this option is specified then the start time specified is
+# used instead of the start time of the last completed audit
+# period. (string value)
+#start_time=<None>
+
+# If this option is specified then the end time specified is
+# used instead of the end time of the last completed audit
+# period. (string value)
+#end_time=<None>
+
+# Send the volume and snapshot create and delete notifications
+# generated in the specified period. (boolean value)
+#send_actions=false
+
+
+#
+# Options defined in cinder.common.config
+#
+
+# File name for the paste.deploy config for cinder-api (string
+# value)
+api_paste_config=api-paste.ini
+
+# Top-level directory for maintaining cinder's state (string
+# value)
+# Deprecated group/name - [DEFAULT]/pybasedir
+state_path=/var/lib/cinder
+
+# IP address of this host (string value)
+my_ip={{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+
+# Default glance host name or IP (string value)
+glance_host={{ CONTROLLER_HOST_ADDRESS }}
+
+# Default glance port (integer value)
+#glance_port=9292
+
+# A list of the glance API servers available to cinder
+# ([hostname|ip]:port) (list value)
+#glance_api_servers=$glance_host:$glance_port
+
+# Version of the glance API to use (integer value)
+#glance_api_version=1
+
+# Number retries when downloading an image from glance
+# (integer value)
+#glance_num_retries=0
+
+# Allow to perform insecure SSL (https) requests to glance
+# (boolean value)
+#glance_api_insecure=false
+
+# Enables or disables negotiation of SSL layer compression. In
+# some cases disabling compression can improve data
+# throughput, such as when high network bandwidth is available
+# and you use compressed image formats like qcow2. (boolean
+# value)
+#glance_api_ssl_compression=false
+
+# Location of ca certificates file to use for glance client
+# requests. (string value)
+#glance_ca_certificates_file=<None>
+
+# http/https timeout value for glance operations. If no value
+# (None) is supplied here, the glanceclient default value is
+# used. (integer value)
+#glance_request_timeout=<None>
+
+# The topic that scheduler nodes listen on (string value)
+#scheduler_topic=cinder-scheduler
+
+# The topic that volume nodes listen on (string value)
+#volume_topic=cinder-volume
+
+# The topic that volume backup nodes listen on (string value)
+#backup_topic=cinder-backup
+
+# DEPRECATED: Deploy v1 of the Cinder API. (boolean value)
+#enable_v1_api=true
+
+# Deploy v2 of the Cinder API. (boolean value)
+#enable_v2_api=true
+
+# Enables or disables rate limit of the API. (boolean value)
+#api_rate_limit=true
+
+# Specify list of extensions to load when using
+# osapi_volume_extension option with
+# cinder.api.contrib.select_extensions (list value)
+#osapi_volume_ext_list=
+
+# osapi volume extension to load (multi valued)
+#osapi_volume_extension=cinder.api.contrib.standard_extensions
+
+# Full class name for the Manager for volume (string value)
+#volume_manager=cinder.volume.manager.VolumeManager
+
+# Full class name for the Manager for volume backup (string
+# value)
+#backup_manager=cinder.backup.manager.BackupManager
+
+# Full class name for the Manager for scheduler (string value)
+#scheduler_manager=cinder.scheduler.manager.SchedulerManager
+
+# Name of this node. This can be an opaque identifier. It is
+# not necessarily a host name, FQDN, or IP address. (string
+# value)
+#host=cinder
+
+# Availability zone of this node (string value)
+#storage_availability_zone=nova
+
+# Default availability zone for new volumes. If not set, the
+# storage_availability_zone option value is used as the
+# default for new volumes. (string value)
+#default_availability_zone=<None>
+
+# Default volume type to use (string value)
+#default_volume_type=<None>
+
+# Time period for which to generate volume usages. The options
+# are hour, day, month, or year. (string value)
+#volume_usage_audit_period=month
+
+# Path to the rootwrap configuration file to use for running
+# commands as root (string value)
+rootwrap_config=/etc/cinder/rootwrap.conf
+
+# Enable monkey patching (boolean value)
+#monkey_patch=false
+
+# List of modules/decorators to monkey patch (list value)
+#monkey_patch_modules=
+
+# Maximum time since last check-in for a service to be
+# considered up (integer value)
+#service_down_time=60
+
+# The full class name of the volume API class to use (string
+# value)
+#volume_api_class=cinder.volume.api.API
+
+# The full class name of the volume backup API class (string
+# value)
+#backup_api_class=cinder.backup.api.API
+
+# The strategy to use for auth. Supports noauth, keystone, and
+# deprecated. (string value)
+auth_strategy=keystone
+
+# A list of backend names to use. These backend names should
+# be backed by a unique [CONFIG] group with its options (list
+# value)
+#enabled_backends=<None>
+
+# Whether snapshots count against gigabyte quota (boolean
+# value)
+#no_snapshot_gb_quota=false
+
+# The full class name of the volume transfer API class (string
+# value)
+#transfer_api_class=cinder.transfer.api.API
+
+# The full class name of the volume replication API class
+# (string value)
+#replication_api_class=cinder.replication.api.API
+
+# The full class name of the consistencygroup API class
+# (string value)
+#consistencygroup_api_class=cinder.consistencygroup.api.API
+
+# OpenStack privileged account username. Used for requests to
+# other services (such as Nova) that require an account with
+# special rights. (string value)
+#os_privileged_user_name=<None>
+
+# Password associated with the OpenStack privileged account.
+# (string value)
+#os_privileged_user_password=<None>
+
+# Tenant name associated with the OpenStack privileged
+# account. (string value)
+#os_privileged_user_tenant=<None>
+
+
+#
+# Options defined in cinder.compute
+#
+
+# The full class name of the compute API class to use (string
+# value)
+#compute_api_class=cinder.compute.nova.API
+
+
+#
+# Options defined in cinder.compute.nova
+#
+
+# Match this value when searching for nova in the service
+# catalog. Format is: separated values of the form:
+# <service_type>:<service_name>:<endpoint_type> (string value)
+#nova_catalog_info=compute:Compute Service:publicURL
+
+# Same as nova_catalog_info, but for admin endpoint. (string
+# value)
+#nova_catalog_admin_info=compute:Compute Service:adminURL
+
+# Override service catalog lookup with template for nova
+# endpoint e.g. http://localhost:8774/v2/%(project_id)s
+# (string value)
+#nova_endpoint_template=<None>
+
+# Same as nova_endpoint_template, but for admin endpoint.
+# (string value)
+#nova_endpoint_admin_template=<None>
+
+# Region name of this node (string value)
+#os_region_name=<None>
+
+# Location of ca certificates file to use for nova client
+# requests. (string value)
+#nova_ca_certificates_file=<None>
+
+# Allow to perform insecure SSL requests to nova (boolean
+# value)
+#nova_api_insecure=false
+
+
+#
+# Options defined in cinder.db.api
+#
+
+# Services to be added to the available pool on create
+# (boolean value)
+#enable_new_services=true
+
+# Template string to be used to generate volume names (string
+# value)
+volume_name_template=volume-%s
+
+# Template string to be used to generate snapshot names
+# (string value)
+snapshot_name_template=snapshot-%s
+
+# Template string to be used to generate backup names (string
+# value)
+backup_name_template=backup-%s
+
+
+#
+# Options defined in cinder.db.base
+#
+
+# Driver to use for database access (string value)
+#db_driver=cinder.db
+
+
+#
+# Options defined in cinder.image.glance
+#
+
+# Default core properties of image (list value)
+#glance_core_properties=checksum,container_format,disk_format,image_name,image_id,min_disk,min_ram,name,size
+
+# A list of url schemes that can be downloaded directly via
+# the direct_url. Currently supported schemes: [file]. (list
+# value)
+#allowed_direct_url_schemes=
+
+
+#
+# Options defined in cinder.image.image_utils
+#
+
+# Directory used for temporary storage during image conversion
+# (string value)
+#image_conversion_dir=$state_path/conversion
+
+
+#
+# Options defined in cinder.openstack.common.eventlet_backdoor
+#
+
+# Enable eventlet backdoor. Acceptable values are 0, <port>,
+# and <start>:<end>, where 0 results in listening on a random
+# tcp port number; <port> results in listening on the
+# specified port number (and not enabling backdoor if that
+# port is in use); and <start>:<end> results in listening on
+# the smallest unused port number within the specified range
+# of port numbers. The chosen port is displayed in the
+# service's log file. (string value)
+#backdoor_port=<None>
+
+
+#
+# Options defined in cinder.openstack.common.periodic_task
+#
+
+# Some periodic tasks can be run in a separate process. Should
+# we run them here? (boolean value)
+#run_external_periodic_tasks=true
+
+
+#
+# Options defined in cinder.openstack.common.policy
+#
+
+# The JSON file that defines policies. (string value)
+#policy_file=policy.json
+
+# Default rule. Enforced when a requested rule is not found.
+# (string value)
+#policy_default_rule=default
+
+# Directories where policy configuration files are stored.
+# They can be relative to any directory in the search path
+# defined by the config_dir option, or absolute paths. The
+# file defined by policy_file must exist for these directories
+# to be searched. Missing or empty directories are ignored.
+# (multi valued)
+#policy_dirs=policy.d
+
+
+#
+# Options defined in cinder.openstack.common.versionutils
+#
+
+# Enables or disables fatal status of deprecations. (boolean
+# value)
+#fatal_deprecations=false
+
+
+#
+# Options defined in cinder.scheduler.driver
+#
+
+# The scheduler host manager class to use (string value)
+#scheduler_host_manager=cinder.scheduler.host_manager.HostManager
+
+# Maximum number of attempts to schedule an volume (integer
+# value)
+#scheduler_max_attempts=3
+
+
+#
+# Options defined in cinder.scheduler.host_manager
+#
+
+# Which filter class names to use for filtering hosts when not
+# specified in the request. (list value)
+#scheduler_default_filters=AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter
+
+# Which weigher class names to use for weighing hosts. (list
+# value)
+#scheduler_default_weighers=CapacityWeigher
+
+
+#
+# Options defined in cinder.scheduler.manager
+#
+
+# Default scheduler driver to use (string value)
+#scheduler_driver=cinder.scheduler.filter_scheduler.FilterScheduler
+
+
+#
+# Options defined in cinder.scheduler.scheduler_options
+#
+
+# Absolute path to scheduler configuration JSON file. (string
+# value)
+#scheduler_json_config_location=
+
+
+#
+# Options defined in cinder.scheduler.simple
+#
+
+# This configure option has been deprecated along with the
+# SimpleScheduler. New scheduler is able to gather capacity
+# information for each host, thus setting the maximum number
+# of volume gigabytes for host is no longer needed. It's safe
+# to remove this configure from cinder.conf. (integer value)
+#max_gigabytes=10000
+
+
+#
+# Options defined in cinder.scheduler.weights.capacity
+#
+
+# Multiplier used for weighing volume capacity. Negative
+# numbers mean to stack vs spread. (floating point value)
+#capacity_weight_multiplier=1.0
+
+# Multiplier used for weighing volume capacity. Negative
+# numbers mean to stack vs spread. (floating point value)
+#allocated_capacity_weight_multiplier=-1.0
+
+
+#
+# Options defined in cinder.scheduler.weights.volume_number
+#
+
+# Multiplier used for weighing volume number. Negative numbers
+# mean to spread vs stack. (floating point value)
+#volume_number_multiplier=-1.0
+
+
+#
+# Options defined in cinder.transfer.api
+#
+
+# The number of characters in the salt. (integer value)
+#volume_transfer_salt_length=8
+
+# The number of characters in the autogenerated auth key.
+# (integer value)
+#volume_transfer_key_length=16
+
+
+#
+# Options defined in cinder.volume.api
+#
+
+# Cache volume availability zones in memory for the provided
+# duration in seconds (integer value)
+#az_cache_duration=3600
+
+# Create volume from snapshot at the host where snapshot
+# resides (boolean value)
+#snapshot_same_host=true
+
+# Ensure that the new volumes are the same AZ as snapshot or
+# source volume (boolean value)
+#cloned_volume_same_az=true
+
+
+#
+# Options defined in cinder.volume.driver
+#
+
+# The maximum number of times to rescan iSER targetto find
+# volume (integer value)
+#num_iser_scan_tries=3
+
+# This option is deprecated and unused. It will be removed in
+# the Liberty release. (integer value)
+#iser_num_targets=<None>
+
+# Prefix for iSER volumes (string value)
+#iser_target_prefix=iqn.2010-10.org.openstack:
+
+# The IP address that the iSER daemon is listening on (string
+# value)
+#iser_ip_address=$my_ip
+
+# The port that the iSER daemon is listening on (integer
+# value)
+#iser_port=3260
+
+# The name of the iSER target user-land tool to use (string
+# value)
+#iser_helper=tgtadm
+
+# Number of times to attempt to run flakey shell commands
+# (integer value)
+#num_shell_tries=3
+
+# The percentage of backend capacity is reserved (integer
+# value)
+#reserved_percentage=0
+
+# This option is deprecated and unused. It will be removed in
+# the Liberty release. (integer value)
+#iscsi_num_targets=<None>
+
+# Prefix for iSCSI volumes (string value)
+#iscsi_target_prefix=iqn.2010-10.org.openstack:
+
+# The IP address that the iSCSI daemon is listening on (string
+# value)
+iscsi_ip_address={{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+
+# The list of secondary IP addresses of the iSCSI daemon (list
+# value)
+#iscsi_secondary_ip_addresses=
+
+# The port that the iSCSI daemon is listening on (integer
+# value)
+iscsi_port=3260
+
+# The maximum number of times to rescan targets to find volume
+# (integer value)
+# Deprecated group/name - [DEFAULT]/num_iscsi_scan_tries
+#num_volume_device_scan_tries=3
+
+# The backend name for a given driver implementation (string
+# value)
+volume_backend_name=LVM_iSCSI
+
+# Do we attach/detach volumes in cinder using multipath for
+# volume to image and image to volume transfers? (boolean
+# value)
+#use_multipath_for_image_xfer=false
+
+# If this is set to True, attachment of volumes for image
+# transfer will be aborted when multipathd is not running.
+# Otherwise, it will fallback to single path. (boolean value)
+#enforce_multipath_for_image_xfer=false
+
+# Method used to wipe old volumes (string value)
+volume_clear=zero
+
+# Size in MiB to wipe at start of old volumes. 0 => all
+# (integer value)
+volume_clear_size=50
+
+# The flag to pass to ionice to alter the i/o priority of the
+# process used to zero a volume after deletion, for example
+# "-c3" for idle only priority. (string value)
+#volume_clear_ionice=<None>
+
+# iSCSI target user-land tool to use. tgtadm is default, use
+# lioadm for LIO iSCSI support, scstadmin for SCST target
+# support, iseradm for the ISER protocol, ietadm for iSCSI
+# Enterprise Target, iscsictl for Chelsio iSCSI Target or fake
+# for testing. (string value)
+iscsi_helper=lioadm
+
+# Volume configuration file storage directory (string value)
+volumes_dir=$state_path/volumes
+
+# IET configuration file (string value)
+#iet_conf=/etc/iet/ietd.conf
+
+# Chiscsi (CXT) global defaults configuration file (string
+# value)
+#chiscsi_conf=/etc/chelsio-iscsi/chiscsi.conf
+
+# This option is deprecated and unused. It will be removed in
+# the next release. (string value)
+#lio_initiator_iqns=
+
+# Sets the behavior of the iSCSI target to either perform
+# blockio or fileio optionally, auto can be set and Cinder
+# will autodetect type of backing device (string value)
+#iscsi_iotype=fileio
+
+# The default block size used when copying/clearing volumes
+# (string value)
+#volume_dd_blocksize=1M
+
+# The blkio cgroup name to be used to limit bandwidth of
+# volume copy (string value)
+#volume_copy_blkio_cgroup_name=cinder-volume-copy
+
+# The upper limit of bandwidth of volume copy. 0 => unlimited
+# (integer value)
+#volume_copy_bps_limit=0
+
+# Sets the behavior of the iSCSI target to either perform
+# write-back(on) or write-through(off). This parameter is
+# valid if iscsi_helper is set to tgtadm or iseradm. (string
+# value)
+#iscsi_write_cache=on
+
+# Determines the iSCSI protocol for new iSCSI volumes, created
+# with tgtadm or lioadm target helpers. In order to enable
+# RDMA, this parameter should be set with the value "iser".
+# The supported iSCSI protocol values are "iscsi" and "iser".
+# (string value)
+#iscsi_protocol=iscsi
+
+# The path to the client certificate key for verification, if
+# the driver supports it. (string value)
+#driver_client_cert_key=<None>
+
+# The path to the client certificate for verification, if the
+# driver supports it. (string value)
+#driver_client_cert=<None>
+
+# Tell driver to use SSL for connection to backend storage if
+# the driver supports it. (boolean value)
+#driver_use_ssl=false
+
+# Float representation of the over subscription ratio when
+# thin provisioning is involved. Default ratio is 20.0,
+# meaning provisioned capacity can be 20 times of the total
+# physical capacity. If the ratio is 10.5, it means
+# provisioned capacity can be 10.5 times of the total physical
+# capacity. A ratio of 1.0 means provisioned capacity cannot
+# exceed the total physical capacity. A ratio lower than 1.0
+# will be ignored and the default value will be used instead.
+# (floating point value)
+#max_over_subscription_ratio=20.0
+
+# Certain ISCSI targets have predefined target names, SCST
+# target driver uses this name. (string value)
+#scst_target_iqn_name=<None>
+
+# SCST target implementation can choose from multiple SCST
+# target drivers. (string value)
+#scst_target_driver=iscsi
+
+# Option to enable/disable CHAP authentication for targets.
+# (boolean value)
+# Deprecated group/name - [DEFAULT]/eqlx_use_chap
+#use_chap_auth=false
+
+# CHAP user name. (string value)
+# Deprecated group/name - [DEFAULT]/eqlx_chap_login
+#chap_username=
+
+# Password for specified CHAP account name. (string value)
+# Deprecated group/name - [DEFAULT]/eqlx_chap_password
+#chap_password=
+
+# Namespace for driver private data values to be saved in.
+# (string value)
+#driver_data_namespace=<None>
+
+# String representation for an equation that will be used to
+# filter hosts. Only used when the driver filter is set to be
+# used by the Cinder scheduler. (string value)
+#filter_function=<None>
+
+# String representation for an equation that will be used to
+# determine the goodness of a host. Only used when using the
+# goodness weigher is set to be used by the Cinder scheduler.
+# (string value)
+#goodness_function=<None>
+
+
+#
+# Options defined in cinder.volume.drivers.block_device
+#
+
+# List of all available devices (list value)
+#available_devices=
+
+
+#
+# Options defined in cinder.volume.drivers.cloudbyte.options
+#
+
+# These values will be used for CloudByte storage's addQos API
+# call. (dict value)
+#cb_add_qosgroup=latency:15,iops:10,graceallowed:false,iopscontrol:true,memlimit:0,throughput:0,tpcontrol:false,networkspeed:0
+
+# Driver will use this API key to authenticate against the
+# CloudByte storage's management interface. (string value)
+#cb_apikey=None
+
+# CloudByte storage specific account name. This maps to a
+# project name in OpenStack. (string value)
+#cb_account_name=None
+
+# This corresponds to the name of Tenant Storage Machine (TSM)
+# in CloudByte storage. A volume will be created in this TSM.
+# (string value)
+#cb_tsm_name=None
+
+# A retry value in seconds. Will be used by the driver to
+# check if volume creation was successful in CloudByte
+# storage. (integer value)
+#cb_confirm_volume_create_retry_interval=5
+
+# Will confirm a successful volume creation in CloudByte
+# storage by making this many number of attempts. (integer
+# value)
+#cb_confirm_volume_create_retries=3
+
+# These values will be used for CloudByte storage's
+# createVolume API call. (dict value)
+#cb_create_volume=compression:off,deduplication:off,blocklength:512B,sync:always,protocoltype:ISCSI,recordsize:16k
+
+
+#
+# Options defined in cinder.volume.drivers.datera
+#
+
+# DEPRECATED: This will be removed in the Liberty release. Use
+# san_login and san_password instead. This directly sets the
+# Datera API token. (string value)
+#datera_api_token=<None>
+
+# Datera API port. (string value)
+#datera_api_port=7717
+
+# Datera API version. (string value)
+#datera_api_version=1
+
+# Number of replicas to create of an inode. (string value)
+#datera_num_replicas=3
+
+
+#
+# Options defined in cinder.volume.drivers.dell.dell_storagecenter_common
+#
+
+# Storage Center System Serial Number (integer value)
+#dell_sc_ssn=64702
+
+# Dell API port (integer value)
+#dell_sc_api_port=3033
+
+# Name of the server folder to use on the Storage Center
+# (string value)
+#dell_sc_server_folder=openstack
+
+# Name of the volume folder to use on the Storage Center
+# (string value)
+#dell_sc_volume_folder=openstack
+
+
+#
+# Options defined in cinder.volume.drivers.emc.emc_vmax_common
+#
+
+# use this file for cinder emc plugin config data (string
+# value)
+#cinder_emc_config_file=/etc/cinder/cinder_emc_config.xml
+
+
+#
+# Options defined in cinder.volume.drivers.emc.emc_vnx_cli
+#
+
+# VNX authentication scope type. (string value)
+#storage_vnx_authentication_type=global
+
+# Directory path that contains the VNX security file. Make
+# sure the security file is generated first. (string value)
+#storage_vnx_security_file_dir=<None>
+
+# Naviseccli Path. (string value)
+#naviseccli_path=
+
+# Storage pool name. (string value)
+#storage_vnx_pool_name=<None>
+
+# VNX secondary SP IP Address. (string value)
+#san_secondary_ip=<None>
+
+# Default timeout for CLI operations in minutes. For example,
+# LUN migration is a typical long running operation, which
+# depends on the LUN size and the load of the array. An upper
+# bound in the specific deployment can be set to avoid
+# unnecessary long wait. By default, it is 365 days long.
+# (integer value)
+#default_timeout=525600
+
+# Default max number of LUNs in a storage group. By default,
+# the value is 255. (integer value)
+#max_luns_per_storage_group=255
+
+# To destroy storage group when the last LUN is removed from
+# it. By default, the value is False. (boolean value)
+#destroy_empty_storage_group=false
+
+# Mapping between hostname and its iSCSI initiator IP
+# addresses. (string value)
+#iscsi_initiators=
+
+# Automatically register initiators. By default, the value is
+# False. (boolean value)
+#initiator_auto_registration=false
+
+# Automatically deregister initiators after the related
+# storage group is destroyed. By default, the value is False.
+# (boolean value)
+#initiator_auto_deregistration=false
+
+# Report free_capacity_gb as 0 when the limit to maximum
+# number of pool LUNs is reached. By default, the value is
+# False. (boolean value)
+#check_max_pool_luns_threshold=false
+
+# Delete a LUN even if it is in Storage Groups. (boolean
+# value)
+#force_delete_lun_in_storagegroup=false
+
+
+#
+# Options defined in cinder.volume.drivers.emc.xtremio
+#
+
+# XMS cluster id in multi-cluster environment (string value)
+#xtremio_cluster_name=
+
+
+#
+# Options defined in cinder.volume.drivers.eqlx
+#
+
+# Group name to use for creating volumes. Defaults to
+# "group-0". (string value)
+#eqlx_group_name=group-0
+
+# Timeout for the Group Manager cli command execution. Default
+# is 30. (integer value)
+#eqlx_cli_timeout=30
+
+# Maximum retry count for reconnection. Default is 5. (integer
+# value)
+#eqlx_cli_max_retries=5
+
+# Use CHAP authentication for targets. Note that this option
+# is deprecated in favour of "use_chap_auth" as specified in
+# cinder/volume/driver.py and will be removed in next release.
+# (boolean value)
+#eqlx_use_chap=false
+
+# Existing CHAP account name. Note that this option is
+# deprecated in favour of "chap_username" as specified in
+# cinder/volume/driver.py and will be removed in next release.
+# (string value)
+#eqlx_chap_login=admin
+
+# Password for specified CHAP account name. Note that this
+# option is deprecated in favour of "chap_password" as
+# specified in cinder/volume/driver.py and will be removed in
+# the next release (string value)
+#eqlx_chap_password=password
+
+# Pool in which volumes will be created. Defaults to
+# "default". (string value)
+#eqlx_pool=default
+
+
+#
+# Options defined in cinder.volume.drivers.glusterfs
+#
+
+# File with the list of available gluster shares (string
+# value)
+#glusterfs_shares_config=/etc/cinder/glusterfs_shares
+
+# Create volumes as sparsed files which take no space.If set
+# to False volume is created as regular file.In such case
+# volume creation takes a lot of time. (boolean value)
+#glusterfs_sparsed_volumes=true
+
+# Create volumes as QCOW2 files rather than raw files.
+# (boolean value)
+#glusterfs_qcow2_volumes=false
+
+# Base dir containing mount points for gluster shares. (string
+# value)
+#glusterfs_mount_point_base=$state_path/mnt
+
+
+#
+# Options defined in cinder.volume.drivers.hds.hds
+#
+
+# The configuration file for the Cinder HDS driver for HUS
+# (string value)
+#hds_cinder_config_file=/opt/hds/hus/cinder_hus_conf.xml
+
+
+#
+# Options defined in cinder.volume.drivers.hds.iscsi
+#
+
+# Configuration file for HDS iSCSI cinder plugin (string
+# value)
+#hds_hnas_iscsi_config_file=/opt/hds/hnas/cinder_iscsi_conf.xml
+
+
+#
+# Options defined in cinder.volume.drivers.hds.nfs
+#
+
+# Configuration file for HDS NFS cinder plugin (string value)
+#hds_hnas_nfs_config_file=/opt/hds/hnas/cinder_nfs_conf.xml
+
+
+#
+# Options defined in cinder.volume.drivers.hitachi.hbsd_common
+#
+
+# Serial number of storage system (string value)
+#hitachi_serial_number=<None>
+
+# Name of an array unit (string value)
+#hitachi_unit_name=<None>
+
+# Pool ID of storage system (integer value)
+#hitachi_pool_id=<None>
+
+# Thin pool ID of storage system (integer value)
+#hitachi_thin_pool_id=<None>
+
+# Range of logical device of storage system (string value)
+#hitachi_ldev_range=<None>
+
+# Default copy method of storage system (string value)
+#hitachi_default_copy_method=FULL
+
+# Copy speed of storage system (integer value)
+#hitachi_copy_speed=3
+
+# Interval to check copy (integer value)
+#hitachi_copy_check_interval=3
+
+# Interval to check copy asynchronously (integer value)
+#hitachi_async_copy_check_interval=10
+
+# Control port names for HostGroup or iSCSI Target (string
+# value)
+#hitachi_target_ports=<None>
+
+# Range of group number (string value)
+#hitachi_group_range=<None>
+
+# Request for creating HostGroup or iSCSI Target (boolean
+# value)
+#hitachi_group_request=false
+
+
+#
+# Options defined in cinder.volume.drivers.hitachi.hbsd_fc
+#
+
+# Request for FC Zone creating HostGroup (boolean value)
+#hitachi_zoning_request=false
+
+
+#
+# Options defined in cinder.volume.drivers.hitachi.hbsd_horcm
+#
+
+# Instance numbers for HORCM (string value)
+#hitachi_horcm_numbers=200,201
+
+# Username of storage system for HORCM (string value)
+#hitachi_horcm_user=<None>
+
+# Password of storage system for HORCM (string value)
+#hitachi_horcm_password=<None>
+
+# Add to HORCM configuration (boolean value)
+#hitachi_horcm_add_conf=true
+
+
+#
+# Options defined in cinder.volume.drivers.hitachi.hbsd_iscsi
+#
+
+# Add CHAP user (boolean value)
+#hitachi_add_chap_user=false
+
+# iSCSI authentication method (string value)
+#hitachi_auth_method=<None>
+
+# iSCSI authentication username (string value)
+#hitachi_auth_user=HBSD-CHAP-user
+
+# iSCSI authentication password (string value)
+#hitachi_auth_password=HBSD-CHAP-password
+
+
+#
+# Options defined in cinder.volume.drivers.huawei
+#
+
+# The configuration file for the Cinder Huawei driver (string
+# value)
+#cinder_huawei_conf_file=/etc/cinder/cinder_huawei_conf.xml
+
+
+#
+# Options defined in cinder.volume.drivers.ibm.flashsystem
+#
+
+# Connection protocol should be FC. (string value)
+#flashsystem_connection_protocol=FC
+
+# Connect with multipath (FC only). (boolean value)
+#flashsystem_multipath_enabled=false
+
+# Allows vdisk to multi host mapping. (boolean value)
+#flashsystem_multihostmap_enabled=true
+
+
+#
+# Options defined in cinder.volume.drivers.ibm.gpfs
+#
+
+# Specifies the path of the GPFS directory where Block Storage
+# volume and snapshot files are stored. (string value)
+#gpfs_mount_point_base=<None>
+
+# Specifies the path of the Image service repository in GPFS.
+# Leave undefined if not storing images in GPFS. (string
+# value)
+#gpfs_images_dir=<None>
+
+# Specifies the type of image copy to be used. Set this when
+# the Image service repository also uses GPFS so that image
+# files can be transferred efficiently from the Image service
+# to the Block Storage service. There are two valid values:
+# "copy" specifies that a full copy of the image is made;
+# "copy_on_write" specifies that copy-on-write optimization
+# strategy is used and unmodified blocks of the image file are
+# shared efficiently. (string value)
+#gpfs_images_share_mode=<None>
+
+# Specifies an upper limit on the number of indirections
+# required to reach a specific block due to snapshots or
+# clones. A lengthy chain of copy-on-write snapshots or
+# clones can have a negative impact on performance, but
+# improves space utilization. 0 indicates unlimited clone
+# depth. (integer value)
+#gpfs_max_clone_depth=0
+
+# Specifies that volumes are created as sparse files which
+# initially consume no space. If set to False, the volume is
+# created as a fully allocated file, in which case, creation
+# may take a significantly longer time. (boolean value)
+#gpfs_sparse_volumes=true
+
+# Specifies the storage pool that volumes are assigned to. By
+# default, the system storage pool is used. (string value)
+#gpfs_storage_pool=system
+
+
+#
+# Options defined in cinder.volume.drivers.ibm.ibmnas
+#
+
+# IBMNAS platform type to be used as backend storage; valid
+# values are - v7ku : for using IBM Storwize V7000 Unified,
+# sonas : for using IBM Scale Out NAS, gpfs-nas : for using
+# NFS based IBM GPFS deployments. (string value)
+#ibmnas_platform_type=v7ku
+
+
+#
+# Options defined in cinder.volume.drivers.ibm.storwize_svc
+#
+
+# Storage system storage pool for volumes (string value)
+#storwize_svc_volpool_name=volpool
+
+# Storage system space-efficiency parameter for volumes
+# (percentage) (integer value)
+#storwize_svc_vol_rsize=2
+
+# Storage system threshold for volume capacity warnings
+# (percentage) (integer value)
+#storwize_svc_vol_warning=0
+
+# Storage system autoexpand parameter for volumes (True/False)
+# (boolean value)
+#storwize_svc_vol_autoexpand=true
+
+# Storage system grain size parameter for volumes
+# (32/64/128/256) (integer value)
+#storwize_svc_vol_grainsize=256
+
+# Storage system compression option for volumes (boolean
+# value)
+#storwize_svc_vol_compression=false
+
+# Enable Easy Tier for volumes (boolean value)
+#storwize_svc_vol_easytier=true
+
+# The I/O group in which to allocate volumes (integer value)
+#storwize_svc_vol_iogrp=0
+
+# Maximum number of seconds to wait for FlashCopy to be
+# prepared. Maximum value is 600 seconds (10 minutes) (integer
+# value)
+#storwize_svc_flashcopy_timeout=120
+
+# Connection protocol (iSCSI/FC) (string value)
+#storwize_svc_connection_protocol=iSCSI
+
+# Configure CHAP authentication for iSCSI connections
+# (Default: Enabled) (boolean value)
+#storwize_svc_iscsi_chap_enabled=true
+
+# Connect with multipath (FC only; iSCSI multipath is
+# controlled by Nova) (boolean value)
+#storwize_svc_multipath_enabled=false
+
+# Allows vdisk to multi host mapping (boolean value)
+#storwize_svc_multihostmap_enabled=true
+
+# Indicate whether svc driver is compatible for NPIV setup. If
+# it is compatible, it will allow no wwpns being returned on
+# get_conn_fc_wwpns during initialize_connection (boolean
+# value)
+#storwize_svc_npiv_compatibility_mode=false
+
+# Allow tenants to specify QOS on create (boolean value)
+#storwize_svc_allow_tenant_qos=false
+
+# If operating in stretched cluster mode, specify the name of
+# the pool in which mirrored copies are stored.Example:
+# "pool2" (string value)
+#storwize_svc_stretched_cluster_partner=<None>
+
+
+#
+# Options defined in cinder.volume.drivers.ibm.xiv_ds8k
+#
+
+# Proxy driver that connects to the IBM Storage Array (string
+# value)
+#xiv_ds8k_proxy=xiv_ds8k_openstack.nova_proxy.XIVDS8KNovaProxy
+
+# Connection type to the IBM Storage Array (string value)
+#xiv_ds8k_connection_type=iscsi
+
+# CHAP authentication mode, effective only for iscsi
+# (disabled|enabled) (string value)
+#xiv_chap=disabled
+
+
+#
+# Options defined in cinder.volume.drivers.lvm
+#
+
+# Name for the VG that will contain exported volumes (string
+# value)
+volume_group=cinder-volumes
+
+# If >0, create LVs with multiple mirrors. Note that this
+# requires lvm_mirrors + 2 PVs with available space (integer
+# value)
+#lvm_mirrors=0
+
+# Type of LVM volumes to deploy (string value)
+#lvm_type=default
+
+# LVM conf file to use for the LVM driver in Cinder; this
+# setting is ignored if the specified file does not exist (You
+# can also specify 'None' to not use a conf file even if one
+# exists). (string value)
+#lvm_conf_file=/etc/cinder/lvm.conf
+
+
+#
+# Options defined in cinder.volume.drivers.netapp.options
+#
+
+# The vFiler unit on which provisioning of block storage
+# volumes will be done. This option is only used by the driver
+# when connecting to an instance with a storage family of Data
+# ONTAP operating in 7-Mode. Only use this option when
+# utilizing the MultiStore feature on the NetApp storage
+# system. (string value)
+#netapp_vfiler=<None>
+
+# The name of the config.conf stanza for a Data ONTAP (7-mode)
+# HA partner. This option is only used by the driver when
+# connecting to an instance with a storage family of Data
+# ONTAP operating in 7-Mode, and it is required if the storage
+# protocol selected is FC. (string value)
+#netapp_partner_backend_name=<None>
+
+# Administrative user account name used to access the storage
+# system or proxy server. (string value)
+#netapp_login=<None>
+
+# Password for the administrative user account specified in
+# the netapp_login option. (string value)
+#netapp_password=<None>
+
+# This option specifies the virtual storage server (Vserver)
+# name on the storage cluster on which provisioning of block
+# storage volumes should occur. (string value)
+#netapp_vserver=<None>
+
+# The hostname (or IP address) for the storage system or proxy
+# server. (string value)
+#netapp_server_hostname=<None>
+
+# The TCP port to use for communication with the storage
+# system or proxy server. If not specified, Data ONTAP drivers
+# will use 80 for HTTP and 443 for HTTPS; E-Series will use
+# 8080 for HTTP and 8443 for HTTPS. (integer value)
+#netapp_server_port=<None>
+
+# This option is used to specify the path to the E-Series
+# proxy application on a proxy server. The value is combined
+# with the value of the netapp_transport_type,
+# netapp_server_hostname, and netapp_server_port options to
+# create the URL used by the driver to connect to the proxy
+# application. (string value)
+#netapp_webservice_path=/devmgr/v2
+
+# This option is only utilized when the storage family is
+# configured to eseries. This option is used to restrict
+# provisioning to the specified controllers. Specify the value
+# of this option to be a comma separated list of controller
+# hostnames or IP addresses to be used for provisioning.
+# (string value)
+#netapp_controller_ips=<None>
+
+# Password for the NetApp E-Series storage array. (string
+# value)
+#netapp_sa_password=<None>
+
+# This option is used to restrict provisioning to the
+# specified storage pools. Only dynamic disk pools are
+# currently supported. Specify the value of this option to be
+# a comma separated list of disk pool names to be used for
+# provisioning. (string value)
+#netapp_storage_pools=<None>
+
+# This option is used to define how the controllers in the
+# E-Series storage array will work with the particular
+# operating system on the hosts that are connected to it.
+# (string value)
+#netapp_eseries_host_type=linux_dm_mp
+
+# If the percentage of available space for an NFS share has
+# dropped below the value specified by this option, the NFS
+# image cache will be cleaned. (integer value)
+#thres_avl_size_perc_start=20
+
+# When the percentage of available space on an NFS share has
+# reached the percentage specified by this option, the driver
+# will stop clearing files from the NFS image cache that have
+# not been accessed in the last M minutes, where M is the
+# value of the expiry_thres_minutes configuration option.
+# (integer value)
+#thres_avl_size_perc_stop=60
+
+# This option specifies the threshold for last access time for
+# images in the NFS image cache. When a cache cleaning cycle
+# begins, images in the cache that have not been accessed in
+# the last M minutes, where M is the value of this parameter,
+# will be deleted from the cache to create free space on the
+# NFS share. (integer value)
+#expiry_thres_minutes=720
+
+# This option specifies the path of the NetApp copy offload
+# tool binary. Ensure that the binary has execute permissions
+# set which allow the effective user of the cinder-volume
+# process to execute the file. (string value)
+#netapp_copyoffload_tool_path=<None>
+
+# The quantity to be multiplied by the requested volume size
+# to ensure enough space is available on the virtual storage
+# server (Vserver) to fulfill the volume creation request.
+# (floating point value)
+#netapp_size_multiplier=1.2
+
+# This option is only utilized when the storage protocol is
+# configured to use iSCSI or FC. This option is used to
+# restrict provisioning to the specified controller volumes.
+# Specify the value of this option to be a comma separated
+# list of NetApp controller volume names to be used for
+# provisioning. (string value)
+#netapp_volume_list=<None>
+
+# The storage family type used on the storage system; valid
+# values are ontap_7mode for using Data ONTAP operating in
+# 7-Mode, ontap_cluster for using clustered Data ONTAP, or
+# eseries for using E-Series. (string value)
+#netapp_storage_family=ontap_cluster
+
+# The storage protocol to be used on the data path with the
+# storage system. (string value)
+#netapp_storage_protocol=<None>
+
+# The transport protocol used when communicating with the
+# storage system or proxy server. (string value)
+#netapp_transport_type=http
+
+
+#
+# Options defined in cinder.volume.drivers.nfs
+#
+
+# File with the list of available nfs shares (string value)
+#nfs_shares_config=/etc/cinder/nfs_shares
+
+# Create volumes as sparsed files which take no space.If set
+# to False volume is created as regular file.In such case
+# volume creation takes a lot of time. (boolean value)
+#nfs_sparsed_volumes=true
+
+# Percent of ACTUAL usage of the underlying volume before no
+# new volumes can be allocated to the volume destination.
+# (floating point value)
+#nfs_used_ratio=0.95
+
+# This will compare the allocated to available space on the
+# volume destination. If the ratio exceeds this number, the
+# destination will no longer be valid. (floating point value)
+#nfs_oversub_ratio=1.0
+
+# Base dir containing mount points for nfs shares. (string
+# value)
+#nfs_mount_point_base=$state_path/mnt
+
+# Mount options passed to the nfs client. See section of the
+# nfs man page for details. (string value)
+#nfs_mount_options=<None>
+
+# The number of attempts to mount nfs shares before raising an
+# error. At least one attempt will be made to mount an nfs
+# share, regardless of the value specified. (integer value)
+#nfs_mount_attempts=3
+
+
+#
+# Options defined in cinder.volume.drivers.nimble
+#
+
+# Nimble Controller pool name (string value)
+#nimble_pool_name=default
+
+# Nimble Subnet Label (string value)
+#nimble_subnet_label=*
+
+
+#
+# Options defined in cinder.volume.drivers.openvstorage
+#
+
+# Vpool to use for volumes - backend is defined by vpool not
+# by us. (string value)
+#vpool_name=
+
+
+#
+# Options defined in cinder.volume.drivers.prophetstor.options
+#
+
+# DPL pool uuid in which DPL volumes are stored. (string
+# value)
+#dpl_pool=
+
+# DPL port number. (integer value)
+#dpl_port=8357
+
+
+#
+# Options defined in cinder.volume.drivers.pure
+#
+
+# REST API authorization token. (string value)
+#pure_api_token=<None>
+
+
+#
+# Options defined in cinder.volume.drivers.quobyte
+#
+
+# URL to the Quobyte volume e.g., quobyte://<DIR host>/<volume
+# name> (string value)
+#quobyte_volume_url=<None>
+
+# Path to a Quobyte Client configuration file. (string value)
+#quobyte_client_cfg=<None>
+
+# Create volumes as sparse files which take no space. If set
+# to False, volume is created as regular file.In such case
+# volume creation takes a lot of time. (boolean value)
+#quobyte_sparsed_volumes=true
+
+# Create volumes as QCOW2 files rather than raw files.
+# (boolean value)
+#quobyte_qcow2_volumes=true
+
+# Base dir containing the mount point for the Quobyte volume.
+# (string value)
+#quobyte_mount_point_base=$state_path/mnt
+
+
+#
+# Options defined in cinder.volume.drivers.rbd
+#
+
+# The RADOS pool where rbd volumes are stored (string value)
+#rbd_pool=rbd
+
+# The RADOS client name for accessing rbd volumes - only set
+# when using cephx authentication (string value)
+#rbd_user=<None>
+
+# Path to the ceph configuration file (string value)
+#rbd_ceph_conf=
+
+# Flatten volumes created from snapshots to remove dependency
+# from volume to snapshot (boolean value)
+#rbd_flatten_volume_from_snapshot=false
+
+# The libvirt uuid of the secret for the rbd_user volumes
+# (string value)
+#rbd_secret_uuid=<None>
+
+# Directory where temporary image files are stored when the
+# volume driver does not write them directly to the volume.
+# Warning: this option is now deprecated, please use
+# image_conversion_dir instead. (string value)
+#volume_tmp_dir=<None>
+
+# Maximum number of nested volume clones that are taken before
+# a flatten occurs. Set to 0 to disable cloning. (integer
+# value)
+#rbd_max_clone_depth=5
+
+# Volumes will be chunked into objects of this size (in
+# megabytes). (integer value)
+#rbd_store_chunk_size=4
+
+# Timeout value (in seconds) used when connecting to ceph
+# cluster. If value < 0, no timeout is set and default
+# librados value is used. (integer value)
+#rados_connect_timeout=-1
+
+
+#
+# Options defined in cinder.volume.drivers.remotefs
+#
+
+# IP address or Hostname of NAS system. (string value)
+#nas_ip=
+
+# User name to connect to NAS system. (string value)
+#nas_login=admin
+
+# Password to connect to NAS system. (string value)
+#nas_password=
+
+# SSH port to use to connect to NAS system. (integer value)
+#nas_ssh_port=22
+
+# Filename of private key to use for SSH authentication.
+# (string value)
+#nas_private_key=
+
+# Allow network-attached storage systems to operate in a
+# secure environment where root level access is not permitted.
+# If set to False, access is as the root user and insecure. If
+# set to True, access is not as root. If set to auto, a check
+# is done to determine if this is a new installation: True is
+# used if so, otherwise False. Default is auto. (string value)
+#nas_secure_file_operations=auto
+
+# Set more secure file permissions on network-attached storage
+# volume files to restrict broad other/world access. If set to
+# False, volumes are created with open permissions. If set to
+# True, volumes are created with permissions for the cinder
+# user and group (660). If set to auto, a check is done to
+# determine if this is a new installation: True is used if so,
+# otherwise False. Default is auto. (string value)
+#nas_secure_file_permissions=auto
+
+# Path to the share to use for storing Cinder volumes. For
+# example: "/srv/export1" for an NFS server export available
+# at 10.0.5.10:/srv/export1 . (string value)
+#nas_share_path=
+
+# Options used to mount the storage backend file system where
+# Cinder volumes are stored. (string value)
+#nas_mount_options=<None>
+
+
+#
+# Options defined in cinder.volume.drivers.san.hp.hp_3par_common
+#
+
+# 3PAR WSAPI Server Url like https://<3par ip>:8080/api/v1
+# (string value)
+#hp3par_api_url=
+
+# 3PAR Super user username (string value)
+#hp3par_username=
+
+# 3PAR Super user password (string value)
+#hp3par_password=
+
+# List of the CPG(s) to use for volume creation (list value)
+#hp3par_cpg=OpenStack
+
+# The CPG to use for Snapshots for volumes. If empty the
+# userCPG will be used. (string value)
+#hp3par_cpg_snap=
+
+# The time in hours to retain a snapshot. You can't delete it
+# before this expires. (string value)
+#hp3par_snapshot_retention=
+
+# The time in hours when a snapshot expires and is deleted.
+# This must be larger than expiration (string value)
+#hp3par_snapshot_expiration=
+
+# Enable HTTP debugging to 3PAR (boolean value)
+#hp3par_debug=false
+
+# List of target iSCSI addresses to use. (list value)
+#hp3par_iscsi_ips=
+
+# Enable CHAP authentication for iSCSI connections. (boolean
+# value)
+#hp3par_iscsi_chap_enabled=false
+
+
+#
+# Options defined in cinder.volume.drivers.san.hp.hp_lefthand_rest_proxy
+#
+
+# HP LeftHand WSAPI Server Url like https://<LeftHand
+# ip>:8081/lhos (string value)
+#hplefthand_api_url=<None>
+
+# HP LeftHand Super user username (string value)
+#hplefthand_username=<None>
+
+# HP LeftHand Super user password (string value)
+#hplefthand_password=<None>
+
+# HP LeftHand cluster name (string value)
+#hplefthand_clustername=<None>
+
+# Configure CHAP authentication for iSCSI connections
+# (Default: Disabled) (boolean value)
+#hplefthand_iscsi_chap_enabled=false
+
+# Enable HTTP debugging to LeftHand (boolean value)
+#hplefthand_debug=false
+
+
+#
+# Options defined in cinder.volume.drivers.san.san
+#
+
+# Use thin provisioning for SAN volumes? (boolean value)
+#san_thin_provision=true
+
+# IP address of SAN controller (string value)
+#san_ip=
+
+# Username for SAN controller (string value)
+#san_login=admin
+
+# Password for SAN controller (string value)
+#san_password=
+
+# Filename of private key to use for SSH authentication
+# (string value)
+#san_private_key=
+
+# Cluster name to use for creating volumes (string value)
+#san_clustername=
+
+# SSH port to use with SAN (integer value)
+#san_ssh_port=22
+
+# Execute commands locally instead of over SSH; use if the
+# volume service is running on the SAN device (boolean value)
+#san_is_local=false
+
+# SSH connection timeout in seconds (integer value)
+#ssh_conn_timeout=30
+
+# Minimum ssh connections in the pool (integer value)
+#ssh_min_pool_conn=1
+
+# Maximum ssh connections in the pool (integer value)
+#ssh_max_pool_conn=5
+
+
+#
+# Options defined in cinder.volume.drivers.scality
+#
+
+# Path or URL to Scality SOFS configuration file (string
+# value)
+#scality_sofs_config=<None>
+
+# Base dir where Scality SOFS shall be mounted (string value)
+#scality_sofs_mount_point=$state_path/scality
+
+# Path from Scality SOFS root to volume dir (string value)
+#scality_sofs_volume_dir=cinder/volumes
+
+
+#
+# Options defined in cinder.volume.drivers.smbfs
+#
+
+# File with the list of available smbfs shares. (string value)
+#smbfs_shares_config=/etc/cinder/smbfs_shares
+
+# Default format that will be used when creating volumes if no
+# volume format is specified. (string value)
+#smbfs_default_volume_format=qcow2
+
+# Create volumes as sparsed files which take no space rather
+# than regular files when using raw format, in which case
+# volume creation takes lot of time. (boolean value)
+#smbfs_sparsed_volumes=true
+
+# Percent of ACTUAL usage of the underlying volume before no
+# new volumes can be allocated to the volume destination.
+# (floating point value)
+#smbfs_used_ratio=0.95
+
+# This will compare the allocated to available space on the
+# volume destination. If the ratio exceeds this number, the
+# destination will no longer be valid. (floating point value)
+#smbfs_oversub_ratio=1.0
+
+# Base dir containing mount points for smbfs shares. (string
+# value)
+#smbfs_mount_point_base=$state_path/mnt
+
+# Mount options passed to the smbfs client. See mount.cifs man
+# page for details. (string value)
+#smbfs_mount_options=noperm,file_mode=0775,dir_mode=0775
+
+
+#
+# Options defined in cinder.volume.drivers.solidfire
+#
+
+# Set 512 byte emulation on volume creation; (boolean value)
+#sf_emulate_512=true
+
+# Allow tenants to specify QOS on create (boolean value)
+#sf_allow_tenant_qos=false
+
+# Create SolidFire accounts with this prefix. Any string can
+# be used here, but the string "hostname" is special and will
+# create a prefix using the cinder node hostsname (previous
+# default behavior). The default is NO prefix. (string value)
+#sf_account_prefix=<None>
+
+# Account name on the SolidFire Cluster to use as owner of
+# template/cache volumes (created if does not exist). (string
+# value)
+#sf_template_account_name=openstack-vtemplate
+
+# Create an internal cache of copy of images when a bootable
+# volume is created to eliminate fetch from glance and qemu-
+# conversion on subsequent calls. (boolean value)
+#sf_allow_template_caching=true
+
+# SolidFire API port. Useful if the device api is behind a
+# proxy on a different port. (integer value)
+#sf_api_port=443
+
+
+#
+# Options defined in cinder.volume.drivers.srb
+#
+
+# Comma-separated list of REST servers IP to connect to. (eg
+# http://IP1/,http://IP2:81/path (string value)
+#srb_base_urls=<None>
+
+
+#
+# Options defined in cinder.volume.drivers.violin.v6000_common
+#
+
+# IP address or hostname of mg-a (string value)
+#gateway_mga=<None>
+
+# IP address or hostname of mg-b (string value)
+#gateway_mgb=<None>
+
+# Use igroups to manage targets and initiators (boolean value)
+#use_igroups=false
+
+# Global backend request timeout, in seconds (integer value)
+#request_timeout=300
+
+
+#
+# Options defined in cinder.volume.drivers.vmware.vmdk
+#
+
+# IP address for connecting to VMware ESX/VC server. (string
+# value)
+#vmware_host_ip=<None>
+
+# Username for authenticating with VMware ESX/VC server.
+# (string value)
+#vmware_host_username=<None>
+
+# Password for authenticating with VMware ESX/VC server.
+# (string value)
+#vmware_host_password=<None>
+
+# Optional VIM service WSDL Location e.g
+# http://<server>/vimService.wsdl. Optional over-ride to
+# default location for bug work-arounds. (string value)
+#vmware_wsdl_location=<None>
+
+# Number of times VMware ESX/VC server API must be retried
+# upon connection related issues. (integer value)
+#vmware_api_retry_count=10
+
+# The interval (in seconds) for polling remote tasks invoked
+# on VMware ESX/VC server. (floating point value)
+#vmware_task_poll_interval=0.5
+
+# Name for the folder in the VC datacenter that will contain
+# cinder volumes. (string value)
+#vmware_volume_folder=cinder-volumes
+
+# Timeout in seconds for VMDK volume transfer between Cinder
+# and Glance. (integer value)
+#vmware_image_transfer_timeout_secs=7200
+
+# Max number of objects to be retrieved per batch. Query
+# results will be obtained in batches from the server and not
+# in one shot. Server may still limit the count to something
+# less than the configured value. (integer value)
+#vmware_max_objects_retrieval=100
+
+# Optional string specifying the VMware VC server version. The
+# driver attempts to retrieve the version from VMware VC
+# server. Set this configuration only if you want to override
+# the VC server version. (string value)
+#vmware_host_version=<None>
+
+# Directory where virtual disks are stored during volume
+# backup and restore. (string value)
+#vmware_tmp_dir=/tmp
+
+
+#
+# Options defined in cinder.volume.drivers.windows.windows
+#
+
+# Path to store VHD backed volumes (string value)
+#windows_iscsi_lun_path=C:\iSCSIVirtualDisks
+
+
+#
+# Options defined in cinder.volume.drivers.xio
+#
+
+# Default storage pool for volumes. (integer value)
+#ise_storage_pool=1
+
+# Raid level for ISE volumes. (integer value)
+#ise_raid=1
+
+# Number of retries (per port) when establishing connection to
+# ISE management port. (integer value)
+#ise_connection_retries=5
+
+# Interval (secs) between retries. (integer value)
+#ise_retry_interval=1
+
+# Number on retries to get completion status after issuing a
+# command to ISE. (integer value)
+#ise_completion_retries=30
+
+
+#
+# Options defined in cinder.volume.drivers.zfssa.zfssanfs
+#
+
+# Data path IP address (string value)
+#zfssa_data_ip=<None>
+
+# HTTPS port number (string value)
+#zfssa_https_port=443
+
+# Options to be passed while mounting share over nfs (string
+# value)
+#zfssa_nfs_mount_options=
+
+# Storage pool name. (string value)
+#zfssa_nfs_pool=
+
+# Project name. (string value)
+#zfssa_nfs_project=NFSProject
+
+# Share name. (string value)
+#zfssa_nfs_share=nfs_share
+
+# Data compression. (string value)
+#zfssa_nfs_share_compression=off
+
+# Synchronous write bias-latency, throughput. (string value)
+#zfssa_nfs_share_logbias=latency
+
+# REST connection timeout. (seconds) (integer value)
+#zfssa_rest_timeout=<None>
+
+
+#
+# Options defined in cinder.volume.manager
+#
+
+# Driver to use for volume creation (string value)
+volume_driver=cinder.volume.drivers.lvm.LVMISCSIDriver
+
+# Timeout for creating the volume to migrate to when
+# performing volume migration (seconds) (integer value)
+#migration_create_volume_timeout_secs=300
+
+# Offload pending volume delete during volume service startup
+# (boolean value)
+#volume_service_inithost_offload=false
+
+# FC Zoning mode configured (string value)
+#zoning_mode=none
+
+# User defined capabilities, a JSON formatted string
+# specifying key/value pairs. The key/value pairs can be used
+# by the CapabilitiesFilter to select between backends when
+# requests specify volume types. For example, specifying a
+# service level or the geographical location of a backend,
+# then creating a volume type to allow the user to select by
+# these different properties. (string value)
+#extra_capabilities={}
+
+
+[BRCD_FABRIC_EXAMPLE]
+
+#
+# Options defined in cinder.zonemanager.drivers.brocade.brcd_fabric_opts
+#
+
+# Management IP of fabric (string value)
+#fc_fabric_address=
+
+# Fabric user ID (string value)
+#fc_fabric_user=
+
+# Password for user (string value)
+#fc_fabric_password=
+
+# Connecting port (integer value)
+#fc_fabric_port=22
+
+# overridden zoning policy (string value)
+#zoning_policy=initiator-target
+
+# overridden zoning activation state (boolean value)
+#zone_activate=true
+
+# overridden zone name prefix (string value)
+#zone_name_prefix=<None>
+
+# Principal switch WWN of the fabric (string value)
+#principal_switch_wwn=<None>
+
+
+[CISCO_FABRIC_EXAMPLE]
+
+#
+# Options defined in cinder.zonemanager.drivers.cisco.cisco_fabric_opts
+#
+
+# Management IP of fabric (string value)
+#cisco_fc_fabric_address=
+
+# Fabric user ID (string value)
+#cisco_fc_fabric_user=
+
+# Password for user (string value)
+#cisco_fc_fabric_password=
+
+# Connecting port (integer value)
+#cisco_fc_fabric_port=22
+
+# overridden zoning policy (string value)
+#cisco_zoning_policy=initiator-target
+
+# overridden zoning activation state (boolean value)
+#cisco_zone_activate=true
+
+# overridden zone name prefix (string value)
+#cisco_zone_name_prefix=<None>
+
+# VSAN of the Fabric (string value)
+#cisco_zoning_vsan=<None>
+
+
+[database]
+
+#
+# Options defined in oslo.db.concurrency
+#
+
+# Enable the experimental use of thread pooling for all DB API
+# calls (boolean value)
+# Deprecated group/name - [DEFAULT]/dbapi_use_tpool
+#use_tpool=false
+
+# The SQLAlchemy connection string to use to connect to the
+# database. (string value)
+connection=postgresql://{{ CINDER_DB_USER }}:{{ CINDER_DB_PASSWORD }}@{{ CONTROLLER_HOST_ADDRESS }}/cinder
+
+
+[fc-zone-manager]
+
+#
+# Options defined in cinder.zonemanager.drivers.brocade.brcd_fc_zone_driver
+#
+
+# Southbound connector for zoning operation (string value)
+#brcd_sb_connector=cinder.zonemanager.drivers.brocade.brcd_fc_zone_client_cli.BrcdFCZoneClientCLI
+
+
+#
+# Options defined in cinder.zonemanager.drivers.cisco.cisco_fc_zone_driver
+#
+
+# Southbound connector for zoning operation (string value)
+#cisco_sb_connector=cinder.zonemanager.drivers.cisco.cisco_fc_zone_client_cli.CiscoFCZoneClientCLI
+
+
+#
+# Options defined in cinder.zonemanager.fc_zone_manager
+#
+
+# FC Zone Driver responsible for zone management (string
+# value)
+#zone_driver=cinder.zonemanager.drivers.brocade.brcd_fc_zone_driver.BrcdFCZoneDriver
+
+# Zoning policy configured by user; valid values include
+# "initiator-target" or "initiator" (string value)
+#zoning_policy=initiator-target
+
+# Comma separated list of Fibre Channel fabric names. This
+# list of names is used to retrieve other SAN credentials for
+# connecting to each SAN fabric (string value)
+#fc_fabric_names=<None>
+
+# FC SAN Lookup Service (string value)
+#fc_san_lookup_service=cinder.zonemanager.drivers.brocade.brcd_fc_san_lookup_service.BrcdFCSanLookupService
+
+
+[keymgr]
+
+#
+# Options defined in cinder.keymgr
+#
+
+# The full class name of the key manager API class (string
+# value)
+#api_class=cinder.keymgr.conf_key_mgr.ConfKeyManager
+
+
+#
+# Options defined in cinder.keymgr.conf_key_mgr
+#
+
+# Fixed key returned by key manager, specified in hex (string
+# value)
+#fixed_key=<None>
+
+
+#
+# Options defined in cinder.keymgr.key_mgr
+#
+
+# Authentication url for encryption service. (string value)
+#encryption_auth_url=http://localhost:5000/v3
+
+# Url for encryption service. (string value)
+#encryption_api_url=http://localhost:9311/v1
+
+
+[oslo_concurrency]
+
+lock_path = /var/lock/cinder
+
+[keystone_authtoken]
+
+#
+# Options defined in keystonemiddleware.auth_token
+#
+
+# Complete public Identity API endpoint. (string value)
+auth_uri=http://{{ CONTROLLER_HOST_ADDRESS }}:5000/v2.0
+
+# API version of the admin Identity API endpoint. (string
+# value)
+#auth_version=<None>
+
+# Do not handle authorization requests within the middleware,
+# but delegate the authorization decision to downstream WSGI
+# components. (boolean value)
+#delay_auth_decision=false
+
+# Request timeout value for communicating with Identity API
+# server. (integer value)
+#http_connect_timeout=<None>
+
+# How many times are we trying to reconnect when communicating
+# with Identity API Server. (integer value)
+#http_request_max_retries=3
+
+# Env key for the swift cache. (string value)
+#cache=<None>
+
+# Required if identity server requires client certificate
+# (string value)
+#certfile=<None>
+
+# Required if identity server requires client certificate
+# (string value)
+#keyfile=<None>
+
+# A PEM encoded Certificate Authority to use when verifying
+# HTTPs connections. Defaults to system CAs. (string value)
+#cafile=<None>
+
+# Verify HTTPS connections. (boolean value)
+#insecure=false
+
+# Directory used to cache files related to PKI tokens. (string
+# value)
+#signing_dir=<None>
+
+# Optionally specify a list of memcached server(s) to use for
+# caching. If left undefined, tokens will instead be cached
+# in-process. (list value)
+# Deprecated group/name - [DEFAULT]/memcache_servers
+#memcached_servers=<None>
+
+# In order to prevent excessive effort spent validating
+# tokens, the middleware caches previously-seen tokens for a
+# configurable duration (in seconds). Set to -1 to disable
+# caching completely. (integer value)
+#token_cache_time=300
+
+# Determines the frequency at which the list of revoked tokens
+# is retrieved from the Identity service (in seconds). A high
+# number of revocation events combined with a low cache
+# duration may significantly reduce performance. (integer
+# value)
+#revocation_cache_time=10
+
+# (Optional) If defined, indicate whether token data should be
+# authenticated or authenticated and encrypted. Acceptable
+# values are MAC or ENCRYPT. If MAC, token data is
+# authenticated (with HMAC) in the cache. If ENCRYPT, token
+# data is encrypted and authenticated in the cache. If the
+# value is not one of these options or empty, auth_token will
+# raise an exception on initialization. (string value)
+#memcache_security_strategy=<None>
+
+# (Optional, mandatory if memcache_security_strategy is
+# defined) This string is used for key derivation. (string
+# value)
+#memcache_secret_key=<None>
+
+# (Optional) Number of seconds memcached server is considered
+# dead before it is tried again. (integer value)
+#memcache_pool_dead_retry=300
+
+# (Optional) Maximum total number of open connections to every
+# memcached server. (integer value)
+#memcache_pool_maxsize=10
+
+# (Optional) Socket timeout in seconds for communicating with
+# a memcache server. (integer value)
+#memcache_pool_socket_timeout=3
+
+# (Optional) Number of seconds a connection to memcached is
+# held unused in the pool before it is closed. (integer value)
+#memcache_pool_unused_timeout=60
+
+# (Optional) Number of seconds that an operation will wait to
+# get a memcache client connection from the pool. (integer
+# value)
+#memcache_pool_conn_get_timeout=10
+
+# (Optional) Use the advanced (eventlet safe) memcache client
+# pool. The advanced pool will only work under python 2.x.
+# (boolean value)
+#memcache_use_advanced_pool=false
+
+# (Optional) Indicate whether to set the X-Service-Catalog
+# header. If False, middleware will not ask for service
+# catalog on token validation and will not set the X-Service-
+# Catalog header. (boolean value)
+#include_service_catalog=true
+
+# Used to control the use and type of token binding. Can be
+# set to: "disabled" to not check token binding. "permissive"
+# (default) to validate binding information if the bind type
+# is of a form known to the server and ignore it if not.
+# "strict" like "permissive" but if the bind type is unknown
+# the token will be rejected. "required" any form of token
+# binding is needed to be allowed. Finally the name of a
+# binding method that must be present in tokens. (string
+# value)
+#enforce_token_bind=permissive
+
+# If true, the revocation list will be checked for cached
+# tokens. This requires that PKI tokens are configured on the
+# identity server. (boolean value)
+#check_revocations_for_cached=false
+
+# Hash algorithms to use for hashing PKI tokens. This may be a
+# single algorithm or multiple. The algorithms are those
+# supported by Python standard hashlib.new(). The hashes will
+# be tried in the order given, so put the preferred one first
+# for performance. The result of the first hash will be stored
+# in the cache. This will typically be set to multiple values
+# only while migrating from a less secure algorithm to a more
+# secure one. Once all the old tokens are expired this option
+# should be set to a single value for better performance.
+# (list value)
+#hash_algorithms=md5
+
+
+[matchmaker_redis]
+
+#
+# Options defined in oslo.messaging
+#
+
+# Host to locate redis. (string value)
+#host=127.0.0.1
+
+# Use this port to connect to redis host. (integer value)
+#port=6379
+
+# Password for Redis server (optional). (string value)
+#password=<None>
+
+
+[matchmaker_ring]
+
+#
+# Options defined in oslo.messaging
+#
+
+# Matchmaker ring file (JSON). (string value)
+# Deprecated group/name - [DEFAULT]/matchmaker_ringfile
+#ringfile=/etc/oslo/matchmaker_ring.json
+
+
+[oslo_messaging_amqp]
+
+#
+# Options defined in oslo.messaging
+#
+
+# address prefix used when sending to a specific server
+# (string value)
+#server_request_prefix=exclusive
+
+# address prefix used when broadcasting to all servers (string
+# value)
+#broadcast_prefix=broadcast
+
+# address prefix when sending to any server in group (string
+# value)
+#group_request_prefix=unicast
+
+# Name for the AMQP container (string value)
+#container_name=<None>
+
+# Timeout for inactive connections (in seconds) (integer
+# value)
+#idle_timeout=0
+
+# Debug: dump AMQP frames to stdout (boolean value)
+#trace=false
+
+# CA certificate PEM file for verifing server certificate
+# (string value)
+#ssl_ca_file=
+
+# Identifying certificate PEM file to present to clients
+# (string value)
+#ssl_cert_file=
+
+# Private key PEM file used to sign cert_file certificate
+# (string value)
+#ssl_key_file=
+
+# Password for decrypting ssl_key_file (if encrypted) (string
+# value)
+#ssl_key_password=<None>
+
+# Accept clients using either SSL or plain TCP (boolean value)
+#allow_insecure_clients=false
+
+
+[oslo_messaging_qpid]
+
+#
+# Options defined in oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+#amqp_durable_queues=false
+
+# Auto-delete queues in AMQP. (boolean value)
+#amqp_auto_delete=false
+
+# Size of RPC connection pool. (integer value)
+#rpc_conn_pool_size=30
+
+# Qpid broker hostname. (string value)
+#qpid_hostname=localhost
+
+# Qpid broker port. (integer value)
+#qpid_port=5672
+
+# Qpid HA cluster host:port pairs. (list value)
+#qpid_hosts=$qpid_hostname:$qpid_port
+
+# Username for Qpid connection. (string value)
+#qpid_username=
+
+# Password for Qpid connection. (string value)
+#qpid_password=
+
+# Space separated list of SASL mechanisms to use for auth.
+# (string value)
+#qpid_sasl_mechanisms=
+
+# Seconds between connection keepalive heartbeats. (integer
+# value)
+#qpid_heartbeat=60
+
+# Transport to use, either 'tcp' or 'ssl'. (string value)
+#qpid_protocol=tcp
+
+# Whether to disable the Nagle algorithm. (boolean value)
+#qpid_tcp_nodelay=true
+
+# The number of prefetched messages held by receiver. (integer
+# value)
+#qpid_receiver_capacity=1
+
+# The qpid topology version to use. Version 1 is what was
+# originally used by impl_qpid. Version 2 includes some
+# backwards-incompatible changes that allow broker federation
+# to work. Users should update to version 2 when they are
+# able to take everything down, as it requires a clean break.
+# (integer value)
+#qpid_topology_version=1
+
+
+[oslo_messaging_rabbit]
+
+#
+# Options defined in oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+#amqp_durable_queues=false
+
+# Auto-delete queues in AMQP. (boolean value)
+#amqp_auto_delete=false
+
+# Size of RPC connection pool. (integer value)
+#rpc_conn_pool_size=30
+
+# SSL version to use (valid only if SSL enabled). Valid values
+# are TLSv1 and SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may
+# be available on some distributions. (string value)
+#kombu_ssl_version=
+
+# SSL key file (valid only if SSL enabled). (string value)
+#kombu_ssl_keyfile=
+
+# SSL cert file (valid only if SSL enabled). (string value)
+#kombu_ssl_certfile=
+
+# SSL certification authority file (valid only if SSL
+# enabled). (string value)
+#kombu_ssl_ca_certs=
+
+# How long to wait before reconnecting in response to an AMQP
+# consumer cancel notification. (floating point value)
+#kombu_reconnect_delay=1.0
+
+# The RabbitMQ broker address where a single node is used.
+# (string value)
+rabbit_host={{ RABBITMQ_HOST }}
+
+# The RabbitMQ broker port where a single node is used.
+# (integer value)
+rabbit_port={{ RABBITMQ_PORT }}
+
+# RabbitMQ HA cluster host:port pairs. (list value)
+rabbit_hosts=$rabbit_host:$rabbit_port
+
+# Connect over SSL for RabbitMQ. (boolean value)
+#rabbit_use_ssl=false
+
+# The RabbitMQ userid. (string value)
+rabbit_userid={{ RABBITMQ_USER }}
+
+# The RabbitMQ password. (string value)
+rabbit_password={{ RABBITMQ_PASSWORD }}
+
+# The RabbitMQ login method. (string value)
+#rabbit_login_method=AMQPLAIN
+
+# The RabbitMQ virtual host. (string value)
+#rabbit_virtual_host=/
+
+# How frequently to retry connecting with RabbitMQ. (integer
+# value)
+#rabbit_retry_interval=1
+
+# How long to backoff for between retries when connecting to
+# RabbitMQ. (integer value)
+#rabbit_retry_backoff=2
+
+# Maximum number of RabbitMQ connection retries. Default is 0
+# (infinite retry count). (integer value)
+#rabbit_max_retries=0
+
+# Use HA queues in RabbitMQ (x-ha-policy: all). If you change
+# this option, you must wipe the RabbitMQ database. (boolean
+# value)
+#rabbit_ha_queues=false
+
+# Number of seconds after which the Rabbit broker is
+# considered down if heartbeat's keep-alive fails (0 disables
+# the heartbeat, >0 enables it. Enabling heartbeats requires
+# kombu>=3.0.7 and amqp>=1.4.0). EXPERIMENTAL (integer value)
+#heartbeat_timeout_threshold=0
+
+# How often times during the heartbeat_timeout_threshold we
+# check the heartbeat. (integer value)
+#heartbeat_rate=2
+
+# Deprecated, use rpc_backend=kombu+memory or rpc_backend=fake
+# (boolean value)
+#fake_rabbit=false
+
+
+[profiler]
+
+#
+# Options defined in cinder.service
+#
+
+# If False fully disable profiling feature. (boolean value)
+#profiler_enabled=false
+
+# If False doesn't trace SQL requests. (boolean value)
+#trace_sqlalchemy=false
+
+
+[DEFAULT]
+
+
+[keystone_authtoken]
+
+#
+# From keystonemiddleware.auth_token
+#
+
+# Complete public Identity API endpoint. (string value)
+#auth_uri = <None>
+
+# API version of the admin Identity API endpoint. (string value)
+#auth_version = <None>
+
+# Do not handle authorization requests within the middleware, but
+# delegate the authorization decision to downstream WSGI components.
+# (boolean value)
+#delay_auth_decision = false
+
+# Request timeout value for communicating with Identity API server.
+# (integer value)
+#http_connect_timeout = <None>
+
+# How many times are we trying to reconnect when communicating with
+# Identity API Server. (integer value)
+#http_request_max_retries = 3
+
+# Env key for the swift cache. (string value)
+#cache = <None>
+
+# Required if identity server requires client certificate (string
+# value)
+#certfile = <None>
+
+# Required if identity server requires client certificate (string
+# value)
+#keyfile = <None>
+
+# A PEM encoded Certificate Authority to use when verifying HTTPs
+# connections. Defaults to system CAs. (string value)
+#cafile = <None>
+
+# Verify HTTPS connections. (boolean value)
+#insecure = false
+
+# Directory used to cache files related to PKI tokens. (string value)
+#signing_dir = <None>
+
+# Optionally specify a list of memcached server(s) to use for caching.
+# If left undefined, tokens will instead be cached in-process. (list
+# value)
+# Deprecated group/name - [DEFAULT]/memcache_servers
+#memcached_servers = <None>
+
+# In order to prevent excessive effort spent validating tokens, the
+# middleware caches previously-seen tokens for a configurable duration
+# (in seconds). Set to -1 to disable caching completely. (integer
+# value)
+#token_cache_time = 300
+
+# Determines the frequency at which the list of revoked tokens is
+# retrieved from the Identity service (in seconds). A high number of
+# revocation events combined with a low cache duration may
+# significantly reduce performance. (integer value)
+#revocation_cache_time = 10
+
+# (Optional) If defined, indicate whether token data should be
+# authenticated or authenticated and encrypted. Acceptable values are
+# MAC or ENCRYPT. If MAC, token data is authenticated (with HMAC) in
+# the cache. If ENCRYPT, token data is encrypted and authenticated in
+# the cache. If the value is not one of these options or empty,
+# auth_token will raise an exception on initialization. (string value)
+#memcache_security_strategy = <None>
+
+# (Optional, mandatory if memcache_security_strategy is defined) This
+# string is used for key derivation. (string value)
+#memcache_secret_key = <None>
+
+# (Optional) Number of seconds memcached server is considered dead
+# before it is tried again. (integer value)
+#memcache_pool_dead_retry = 300
+
+# (Optional) Maximum total number of open connections to every
+# memcached server. (integer value)
+#memcache_pool_maxsize = 10
+
+# (Optional) Socket timeout in seconds for communicating with a
+# memcache server. (integer value)
+#memcache_pool_socket_timeout = 3
+
+# (Optional) Number of seconds a connection to memcached is held
+# unused in the pool before it is closed. (integer value)
+#memcache_pool_unused_timeout = 60
+
+# (Optional) Number of seconds that an operation will wait to get a
+# memcache client connection from the pool. (integer value)
+#memcache_pool_conn_get_timeout = 10
+
+# (Optional) Use the advanced (eventlet safe) memcache client pool.
+# The advanced pool will only work under python 2.x. (boolean value)
+#memcache_use_advanced_pool = false
+
+# (Optional) Indicate whether to set the X-Service-Catalog header. If
+# False, middleware will not ask for service catalog on token
+# validation and will not set the X-Service-Catalog header. (boolean
+# value)
+#include_service_catalog = true
+
+# Used to control the use and type of token binding. Can be set to:
+# "disabled" to not check token binding. "permissive" (default) to
+# validate binding information if the bind type is of a form known to
+# the server and ignore it if not. "strict" like "permissive" but if
+# the bind type is unknown the token will be rejected. "required" any
+# form of token binding is needed to be allowed. Finally the name of a
+# binding method that must be present in tokens. (string value)
+#enforce_token_bind = permissive
+
+# If true, the revocation list will be checked for cached tokens. This
+# requires that PKI tokens are configured on the identity server.
+# (boolean value)
+#check_revocations_for_cached = false
+
+# Hash algorithms to use for hashing PKI tokens. This may be a single
+# algorithm or multiple. The algorithms are those supported by Python
+# standard hashlib.new(). The hashes will be tried in the order given,
+# so put the preferred one first for performance. The result of the
+# first hash will be stored in the cache. This will typically be set
+# to multiple values only while migrating from a less secure algorithm
+# to a more secure one. Once all the old tokens are expired this
+# option should be set to a single value for better performance. (list
+# value)
+#hash_algorithms = md5
+
+# Prefix to prepend at the beginning of the path. Deprecated, use
+# identity_uri. (string value)
+#auth_admin_prefix =
+
+# Host providing the admin Identity API endpoint. Deprecated, use
+# identity_uri. (string value)
+#auth_host = 127.0.0.1
+
+# Port of the admin Identity API endpoint. Deprecated, use
+# identity_uri. (integer value)
+#auth_port = 35357
+
+# Protocol of the admin Identity API endpoint (http or https).
+# Deprecated, use identity_uri. (string value)
+#auth_protocol = https
+
+# Complete admin Identity API endpoint. This should specify the
+# unversioned root endpoint e.g. https://localhost:35357/ (string
+# value)
+identity_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:35357
+
+# This option is deprecated and may be removed in a future release.
+# Single shared secret with the Keystone configuration used for
+# bootstrapping a Keystone installation, or otherwise bypassing the
+# normal authentication process. This option should not be used, use
+# `admin_user` and `admin_password` instead. (string value)
+#admin_token = <None>
+
+# Service username. (string value)
+admin_user = {{ CINDER_SERVICE_USER }}
+
+# Service user password. (string value)
+admin_password = {{ CINDER_SERVICE_PASSWORD }}
+
+# Service tenant name. (string value)
+admin_tenant_name = service
diff --git a/install-files/openstack/usr/share/openstack/extras/00-disable-device.network b/install-files/openstack/usr/share/openstack/extras/00-disable-device.network
new file mode 100644
index 00000000..8e2532d0
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/extras/00-disable-device.network
@@ -0,0 +1,2 @@
+[Match]
+Name={{ item }}
diff --git a/install-files/openstack/usr/share/openstack/extras/60-device-dhcp.network b/install-files/openstack/usr/share/openstack/extras/60-device-dhcp.network
new file mode 100644
index 00000000..6fdbfd8d
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/extras/60-device-dhcp.network
@@ -0,0 +1,5 @@
+[Match]
+Name={{ item }}
+
+[Network]
+DHCP=yes
diff --git a/install-files/openstack/usr/share/openstack/glance.yml b/install-files/openstack/usr/share/openstack/glance.yml
new file mode 100644
index 00000000..4d642b6c
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/glance.yml
@@ -0,0 +1,92 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/glance.conf"
+ tasks:
+ - name: Create the glance user.
+ user:
+ name: glance
+ comment: Openstack Glance Daemons
+ shell: /sbin/nologin
+ home: /var/lib/glance
+
+ - name: Create the /var folders for glance
+ file:
+ path: "{{ item }}"
+ state: directory
+ owner: glance
+ group: glance
+ with_items:
+ - /var/run/glance
+ - /var/lock/glance
+ - /var/log/glance
+ - /var/lib/glance
+ - /var/lib/glance/images
+ - /var/lib/glance/image-cache
+
+ - name: Create /etc/glance directory
+ file:
+ path: /etc/glance
+ state: directory
+
+ - name: Add the configuration needed for glance in /etc/glance using templates
+ template:
+ src: /usr/share/openstack/glance/{{ item }}
+ dest: /etc/glance/{{ item }}
+ with_lines:
+ - cd /usr/share/openstack/glance && find -type f
+
+ - name: Create glance service user in service tenant
+ keystone_user:
+ user: "{{ GLANCE_SERVICE_USER }}"
+ password: "{{ GLANCE_SERVICE_PASSWORD }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Assign admin role to glances service user in the service tenant
+ keystone_user:
+ role: admin
+ user: "{{ GLANCE_SERVICE_USER }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Add glance endpoint
+ keystone_service:
+ name: glance
+ type: image
+ description: Openstack Image Service
+ publicurl: http://{{ ansible_hostname }}:9292
+ internalurl: http://{{ CONTROLLER_HOST_ADDRESS }}:9292
+ adminurl: http://{{ CONTROLLER_HOST_ADDRESS }}:9292
+ region: regionOne
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Create postgresql user for glance
+ postgresql_user:
+ name: "{{ GLANCE_DB_USER }}"
+ login_host: "{{ CONTROLLER_HOST_ADDRESS }}"
+ password: "{{ GLANCE_DB_PASSWORD }}"
+ sudo: yes
+ sudo_user: glance
+
+ - name: Create database for glance services
+ postgresql_db:
+ name: glance
+ owner: "{{ GLANCE_DB_USER }}"
+ login_host: "{{ CONTROLLER_HOST_ADDRESS }}"
+ sudo: yes
+ sudo_user: glance
+
+ - name: Initiate glance database
+ command: glance-manage db_sync
+ sudo: yes
+ sudo_user: glance
+
+ - name: Enable and start openstack-glance services
+ service:
+ name: "{{ item }}"
+ enabled: yes
+ state: started
+ with_items:
+ - openstack-glance-api.service
+ - openstack-glance-registry.service
diff --git a/install-files/openstack/usr/share/openstack/glance/glance-api.conf b/install-files/openstack/usr/share/openstack/glance/glance-api.conf
new file mode 100644
index 00000000..b6a4723d
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/glance/glance-api.conf
@@ -0,0 +1,813 @@
+[DEFAULT]
+# Show more verbose log output (sets INFO log level output)
+#verbose = False
+
+# Show debugging output in logs (sets DEBUG log level output)
+#debug = False
+
+# Maximum image size (in bytes) that may be uploaded through the
+# Glance API server. Defaults to 1 TB.
+# WARNING: this value should only be increased after careful consideration
+# and must be set to a value under 8 EB (9223372036854775808).
+#image_size_cap = 1099511627776
+
+# Address to bind the API server
+bind_host = 0.0.0.0
+
+# Port the bind the API server to
+bind_port = 9292
+
+# Log to this file. Make sure you do not set the same log file for both the API
+# and registry servers!
+#
+# If `log_file` is omitted and `use_syslog` is false, then log messages are
+# sent to stdout as a fallback.
+# log_file = /var/log/glance/api.log
+
+# Backlog requests when creating socket
+backlog = 4096
+
+# TCP_KEEPIDLE value in seconds when creating socket.
+# Not supported on OS X.
+#tcp_keepidle = 600
+
+# API to use for accessing data. Default value points to sqlalchemy
+# package, it is also possible to use: glance.db.registry.api
+# data_api = glance.db.sqlalchemy.api
+
+# The number of child process workers that will be
+# created to service API requests. The default will be
+# equal to the number of CPUs available. (integer value)
+#workers = 4
+
+# Maximum line size of message headers to be accepted.
+# max_header_line may need to be increased when using large tokens
+# (typically those generated by the Keystone v3 API with big service
+# catalogs)
+# max_header_line = 16384
+
+# Role used to identify an authenticated user as administrator
+#admin_role = admin
+
+# Allow unauthenticated users to access the API with read-only
+# privileges. This only applies when using ContextMiddleware.
+#allow_anonymous_access = False
+
+# Allow access to version 1 of glance api
+#enable_v1_api = True
+
+# Allow access to version 2 of glance api
+#enable_v2_api = True
+
+# Return the URL that references where the data is stored on
+# the backend storage system. For example, if using the
+# file system store a URL of 'file:///path/to/image' will
+# be returned to the user in the 'direct_url' meta-data field.
+# The default value is false.
+#show_image_direct_url = False
+
+# Send headers containing user and tenant information when making requests to
+# the v1 glance registry. This allows the registry to function as if a user is
+# authenticated without the need to authenticate a user itself using the
+# auth_token middleware.
+# The default value is false.
+#send_identity_headers = False
+
+# Supported values for the 'container_format' image attribute
+#container_formats=ami,ari,aki,bare,ovf,ova
+
+# Supported values for the 'disk_format' image attribute
+#disk_formats=ami,ari,aki,vhd,vmdk,raw,qcow2,vdi,iso
+
+# Property Protections config file
+# This file contains the rules for property protections and the roles/policies
+# associated with it.
+# If this config value is not specified, by default, property protections
+# won't be enforced.
+# If a value is specified and the file is not found, then the glance-api
+# service will not start.
+#property_protection_file =
+
+# Specify whether 'roles' or 'policies' are used in the
+# property_protection_file.
+# The default value for property_protection_rule_format is 'roles'.
+#property_protection_rule_format = roles
+
+# This value sets what strategy will be used to determine the image location
+# order. Currently two strategies are packaged with Glance 'location_order'
+# and 'store_type'.
+#location_strategy = location_order
+
+
+# Public url to use for versions endpoint. The default is None,
+# which will use the request's host_url attribute to populate the URL base.
+# If Glance is operating behind a proxy, you will want to change this to
+# represent the proxy's URL.
+#public_endpoint=<None>
+
+# http_keepalive option. If False, server will return the header
+# "Connection: close", If True, server will return "Connection: Keep-Alive"
+# in its responses. In order to close the client socket connection
+# explicitly after the response is sent and read successfully by the client,
+# you simply have to set this option to False when you create a wsgi server.
+#http_keepalive = True
+
+# ================= Syslog Options ============================
+
+# Send logs to syslog (/dev/log) instead of to file specified
+# by `log_file`
+use_syslog = True
+
+# Facility to use. If unset defaults to LOG_USER.
+#syslog_log_facility = LOG_LOCAL0
+
+# ================= SSL Options ===============================
+
+# Certificate file to use when starting API server securely
+#cert_file = /path/to/certfile
+
+# Private key file to use when starting API server securely
+#key_file = /path/to/keyfile
+
+# CA certificate file to use to verify connecting clients
+#ca_file = /path/to/cafile
+
+# ================= Security Options ==========================
+
+# AES key for encrypting store 'location' metadata, including
+# -- if used -- Swift or S3 credentials
+# Should be set to a random string of length 16, 24 or 32 bytes
+#metadata_encryption_key = <16, 24 or 32 char registry metadata key>
+
+
+# Digest algorithm which will be used for digital signature, the default is
+# sha1 in Kilo for a smooth upgrade process, and it will be updated with
+# sha256 in next release(L). Use command
+# "openssl list-message-digest-algorithms" to get the available algorithms
+# supported by the version of OpenSSL on the platform. Examples are 'sha1',
+# 'sha256', 'sha512', etc.
+#digest_algorithm = sha1
+
+# ============ Registry Options ===============================
+
+# Address to find the registry server
+registry_host = {{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+
+# Port the registry server is listening on
+registry_port = 9191
+
+# What protocol to use when connecting to the registry server?
+# Set to https for secure HTTP communication
+registry_client_protocol = http
+
+# The path to the key file to use in SSL connections to the
+# registry server, if any. Alternately, you may set the
+# GLANCE_CLIENT_KEY_FILE environ variable to a filepath of the key file
+#registry_client_key_file = /path/to/key/file
+
+# The path to the cert file to use in SSL connections to the
+# registry server, if any. Alternately, you may set the
+# GLANCE_CLIENT_CERT_FILE environ variable to a filepath of the cert file
+#registry_client_cert_file = /path/to/cert/file
+
+# The path to the certifying authority cert file to use in SSL connections
+# to the registry server, if any. Alternately, you may set the
+# GLANCE_CLIENT_CA_FILE environ variable to a filepath of the CA cert file
+#registry_client_ca_file = /path/to/ca/file
+
+# When using SSL in connections to the registry server, do not require
+# validation via a certifying authority. This is the registry's equivalent of
+# specifying --insecure on the command line using glanceclient for the API
+# Default: False
+#registry_client_insecure = False
+
+# The period of time, in seconds, that the API server will wait for a registry
+# request to complete. A value of '0' implies no timeout.
+# Default: 600
+#registry_client_timeout = 600
+
+# Enable DEBUG log messages from sqlalchemy which prints every database
+# query and response.
+# Default: False
+#sqlalchemy_debug = True
+
+# Pass the user's token through for API requests to the registry.
+# Default: True
+#use_user_token = True
+
+# If 'use_user_token' is not in effect then admin credentials
+# can be specified. Requests to the registry on behalf of
+# the API will use these credentials.
+# Admin user name
+#admin_user = None
+# Admin password
+#admin_password = None
+# Admin tenant name
+#admin_tenant_name = None
+# Keystone endpoint
+#auth_url = None
+# Keystone region
+#auth_region = None
+# Auth strategy
+#auth_strategy = keystone
+
+# ============ Notification System Options =====================
+
+# Driver or drivers to handle sending notifications. Set to
+# 'messaging' to send notifications to a message queue.
+notification_driver = messagingv2
+
+# Default publisher_id for outgoing notifications.
+# default_publisher_id = image.localhost
+
+# List of disabled notifications. A notification can be given either as a
+# notification type to disable a single event, or as a notification group
+# prefix to disable all events within a group.
+# Example: if this config option is set to
+# ["image.create", "metadef_namespace"], then "image.create" notification will
+# not be sent after image is created and none of the notifications for
+# metadefinition namespaces will be sent.
+# disabled_notifications = []
+
+# Messaging driver used for 'messaging' notifications driver
+rpc_backend = 'rabbit'
+
+# Configuration options if sending notifications via rabbitmq (these are
+# the defaults)
+rabbit_host = {{ RABBITMQ_HOST }}
+rabbit_port = {{ RABBITMQ_PORT }}
+rabbit_use_ssl = false
+rabbit_userid = {{ RABBITMQ_USER }}
+rabbit_password = {{ RABBITMQ_PASSWORD }}
+rabbit_virtual_host = /
+rabbit_notification_exchange = glance
+rabbit_notification_topic = notifications
+rabbit_durable_queues = False
+
+# Configuration options if sending notifications via Qpid (these are
+# the defaults)
+#qpid_notification_exchange = glance
+#qpid_notification_topic = notifications
+#qpid_hostname = localhost
+#qpid_port = 5672
+#qpid_username =
+#qpid_password =
+#qpid_sasl_mechanisms =
+#qpid_reconnect_timeout = 0
+#qpid_reconnect_limit = 0
+#qpid_reconnect_interval_min = 0
+#qpid_reconnect_interval_max = 0
+#qpid_reconnect_interval = 0
+#qpid_heartbeat = 5
+# Set to 'ssl' to enable SSL
+#qpid_protocol = tcp
+#qpid_tcp_nodelay = True
+
+# ============ Delayed Delete Options =============================
+
+# Turn on/off delayed delete
+delayed_delete = False
+
+# Delayed delete time in seconds
+scrub_time = 43200
+
+# Directory that the scrubber will use to remind itself of what to delete
+# Make sure this is also set in glance-scrubber.conf
+scrubber_datadir = /var/lib/glance/scrubber
+
+# =============== Quota Options ==================================
+
+# The maximum number of image members allowed per image
+#image_member_quota = 128
+
+# The maximum number of image properties allowed per image
+#image_property_quota = 128
+
+# The maximum number of tags allowed per image
+#image_tag_quota = 128
+
+# The maximum number of locations allowed per image
+#image_location_quota = 10
+
+# Set a system wide quota for every user. This value is the total number
+# of bytes that a user can use across all storage systems. A value of
+# 0 means unlimited.
+#user_storage_quota = 0
+
+# =============== Image Cache Options =============================
+
+# Base directory that the Image Cache uses
+image_cache_dir = /var/lib/glance/image-cache/
+
+# =============== Policy Options ==================================
+
+[oslo_policy]
+# The JSON file that defines policies.
+# Deprecated group/name - [DEFAULT]/policy_file
+#policy_file = policy.json
+
+# Default rule. Enforced when a requested rule is not found.
+# Deprecated group/name - [DEFAULT]/policy_default_rule
+#policy_default_rule = default
+
+# Directories where policy configuration files are stored.
+# They can be relative to any directory in the search path
+# defined by the config_dir option, or absolute paths.
+# The file defined by policy_file must exist for these
+# directories to be searched.
+# Deprecated group/name - [DEFAULT]/policy_dirs
+#policy_dirs = policy.d
+
+# =============== Database Options =================================
+
+[database]
+# The file name to use with SQLite (string value)
+#sqlite_db = oslo.sqlite
+
+# If True, SQLite uses synchronous mode (boolean value)
+#sqlite_synchronous = True
+
+# The backend to use for db (string value)
+# Deprecated group/name - [DEFAULT]/db_backend
+#backend = sqlalchemy
+
+# The SQLAlchemy connection string used to connect to the
+# database (string value)
+# Deprecated group/name - [DEFAULT]/sql_connection
+# Deprecated group/name - [DATABASE]/sql_connection
+# Deprecated group/name - [sql]/connection
+#connection = <None>
+connection=postgresql://{{ GLANCE_DB_USER }}:{{ GLANCE_DB_PASSWORD }}@{{ CONTROLLER_HOST_ADDRESS }}/glance
+
+# The SQL mode to be used for MySQL sessions. This option,
+# including the default, overrides any server-set SQL mode. To
+# use whatever SQL mode is set by the server configuration,
+# set this to no value. Example: mysql_sql_mode= (string
+# value)
+#mysql_sql_mode = TRADITIONAL
+
+# Timeout before idle sql connections are reaped (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_idle_timeout
+# Deprecated group/name - [DATABASE]/sql_idle_timeout
+# Deprecated group/name - [sql]/idle_timeout
+#idle_timeout = 3600
+
+# Minimum number of SQL connections to keep open in a pool
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_min_pool_size
+# Deprecated group/name - [DATABASE]/sql_min_pool_size
+#min_pool_size = 1
+
+# Maximum number of SQL connections to keep open in a pool
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_pool_size
+# Deprecated group/name - [DATABASE]/sql_max_pool_size
+#max_pool_size = <None>
+
+# Maximum db connection retries during startup. (setting -1
+# implies an infinite retry count) (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_retries
+# Deprecated group/name - [DATABASE]/sql_max_retries
+#max_retries = 10
+
+# Interval between retries of opening a sql connection
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_retry_interval
+# Deprecated group/name - [DATABASE]/reconnect_interval
+#retry_interval = 10
+
+# If set, use this value for max_overflow with sqlalchemy
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_overflow
+# Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow
+#max_overflow = <None>
+
+# Verbosity of SQL debugging information. 0=None,
+# 100=Everything (integer value)
+# Deprecated group/name - [DEFAULT]/sql_connection_debug
+#connection_debug = 0
+
+# Add python stack traces to SQL as comment strings (boolean
+# value)
+# Deprecated group/name - [DEFAULT]/sql_connection_trace
+#connection_trace = False
+
+# If set, use this value for pool_timeout with sqlalchemy
+# (integer value)
+# Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout
+#pool_timeout = <None>
+
+# Enable the experimental use of database reconnect on
+# connection lost (boolean value)
+#use_db_reconnect = False
+
+# seconds between db connection retries (integer value)
+#db_retry_interval = 1
+
+# Whether to increase interval between db connection retries,
+# up to db_max_retry_interval (boolean value)
+#db_inc_retry_interval = True
+
+# max seconds between db connection retries, if
+# db_inc_retry_interval is enabled (integer value)
+#db_max_retry_interval = 10
+
+# maximum db connection retries before error is raised.
+# (setting -1 implies an infinite retry count) (integer value)
+#db_max_retries = 20
+
+[oslo_concurrency]
+
+# Enables or disables inter-process locks. (boolean value)
+# Deprecated group/name - [DEFAULT]/disable_process_locking
+#disable_process_locking = false
+
+# Directory to use for lock files. For security, the specified
+# directory should only be writable by the user running the processes
+# that need locking. It could be read from environment variable
+# OSLO_LOCK_PATH. This setting needs to be the same for both
+# glance-scrubber and glance-api service. Default to a temp directory.
+# Deprecated group/name - [DEFAULT]/lock_path (string value)
+#lock_path = /tmp
+
+[keystone_authtoken]
+auth_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:5000/v2.0
+identity_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:35357
+admin_tenant_name = service
+admin_user = {{ GLANCE_SERVICE_USER }}
+admin_password = {{ GLANCE_SERVICE_PASSWORD }}
+revocation_cache_time = 10
+
+[paste_deploy]
+# Name of the paste configuration file that defines the available pipelines
+#config_file = glance-api-paste.ini
+
+# Partial name of a pipeline in your paste configuration file with the
+# service name removed. For example, if your paste section name is
+# [pipeline:glance-api-keystone], you would configure the flavor below
+# as 'keystone'.
+flavor=keystone
+
+[store_type_location_strategy]
+# The scheme list to use to get store preference order. The scheme must be
+# registered by one of the stores defined by the 'stores' config option.
+# This option will be applied when you using 'store_type' option as image
+# location strategy defined by the 'location_strategy' config option.
+#store_type_preference =
+
+[profiler]
+# If False fully disable profiling feature.
+#enabled = False
+
+# If False doesn't trace SQL requests.
+#trace_sqlalchemy = False
+
+[task]
+# ================= Glance Tasks Options ============================
+
+# Specifies how long (in hours) a task is supposed to live in the tasks DB
+# after succeeding or failing before getting soft-deleted.
+# The default value for task_time_to_live is 48 hours.
+# task_time_to_live = 48
+
+# Specifies which task executor to be used to run the task scripts.
+# The default value for task_executor is taskflow.
+# task_executor = taskflow
+
+# Work dir for asynchronous task operations. The directory set here
+# will be used to operate over images - normally before they are
+# imported in the destination store. When providing work dir, make sure
+# enough space is provided for concurrent tasks to run efficiently
+# without running out of space. A rough estimation can be done by
+# multiplying the number of `max_workers` - or the N of workers running
+# - by an average image size (e.g 500MB). The image size estimation
+# should be done based on the average size in your deployment. Note that
+# depending on the tasks running you may need to multiply this number by
+# some factor depending on what the task does. For example, you may want
+# to double the available size if image conversion is enabled. All this
+# being said, remember these are just estimations and you should do them
+# based on the worst case scenario and be prepared to act in case they
+# were wrong.
+# work_dir=None
+
+# Specifies the maximum number of eventlet threads which can be spun up by
+# the eventlet based task executor to perform execution of Glance tasks.
+# DEPRECATED: Use [taskflow_executor]/max_workers instead.
+# eventlet_executor_pool_size = 1000
+
+[taskflow_executor]
+# The mode in which the engine will run. Can be 'default', 'serial',
+# 'parallel' or 'worker-based'
+#engine_mode = serial
+
+# The number of parallel activities executed at the same time by
+# the engine. The value can be greater than one when the engine mode is
+# 'parallel' or 'worker-based', otherwise this value will be ignored.
+#max_workers = 10
+
+[glance_store]
+# List of which store classes and store class locations are
+# currently known to glance at startup.
+# Deprecated group/name - [DEFAULT]/known_stores
+# Existing but disabled stores:
+# glance.store.rbd.Store,
+# glance.store.s3.Store,
+# glance.store.swift.Store,
+# glance.store.sheepdog.Store,
+# glance.store.cinder.Store,
+# glance.store.gridfs.Store,
+# glance.store.vmware_datastore.Store,
+#stores = glance.store.filesystem.Store,
+# glance.store.http.Store
+
+# Which backend scheme should Glance use by default is not specified
+# in a request to add a new image to Glance? Known schemes are determined
+# by the stores option.
+# Deprecated group/name - [DEFAULT]/default_store
+# Default: 'file'
+default_store = file
+
+# ============ Filesystem Store Options ========================
+
+# Directory that the Filesystem backend store
+# writes image data to
+filesystem_store_datadir = /var/lib/glance/images/
+
+# A list of directories where image data can be stored.
+# This option may be specified multiple times for specifying multiple store
+# directories. Either one of filesystem_store_datadirs or
+# filesystem_store_datadir option is required. A priority number may be given
+# after each directory entry, separated by a ":".
+# When adding an image, the highest priority directory will be selected, unless
+# there is not enough space available in cases where the image size is already
+# known. If no priority is given, it is assumed to be zero and the directory
+# will be considered for selection last. If multiple directories have the same
+# priority, then the one with the most free space available is selected.
+# If same store is specified multiple times then BadStoreConfiguration
+# exception will be raised.
+#filesystem_store_datadirs = /var/lib/glance/images/:1
+
+# A path to a JSON file that contains metadata describing the storage
+# system. When show_multiple_locations is True the information in this
+# file will be returned with any location that is contained in this
+# store.
+#filesystem_store_metadata_file = None
+
+# ============ Swift Store Options =============================
+
+# Version of the authentication service to use
+# Valid versions are '2' for keystone and '1' for swauth and rackspace
+swift_store_auth_version = 2
+
+# Address where the Swift authentication service lives
+# Valid schemes are 'http://' and 'https://'
+# If no scheme specified, default to 'https://'
+# For swauth, use something like '127.0.0.1:8080/v1.0/'
+swift_store_auth_address = 127.0.0.1:5000/v2.0/
+
+# User to authenticate against the Swift authentication service
+# If you use Swift authentication service, set it to 'account':'user'
+# where 'account' is a Swift storage account and 'user'
+# is a user in that account
+swift_store_user = jdoe:jdoe
+
+# Auth key for the user authenticating against the
+# Swift authentication service
+swift_store_key = a86850deb2742ec3cb41518e26aa2d89
+
+# Container within the account that the account should use
+# for storing images in Swift
+swift_store_container = glance
+
+# Do we create the container if it does not exist?
+swift_store_create_container_on_put = False
+
+# What size, in MB, should Glance start chunking image files
+# and do a large object manifest in Swift? By default, this is
+# the maximum object size in Swift, which is 5GB
+swift_store_large_object_size = 5120
+
+# swift_store_config_file = glance-swift.conf
+# This file contains references for each of the configured
+# Swift accounts/backing stores. If used, this option can prevent
+# credentials being stored in the database. Using Swift references
+# is disabled if this config is left blank.
+
+# The reference to the default Swift parameters to use for adding new images.
+# default_swift_reference = 'ref1'
+
+# When doing a large object manifest, what size, in MB, should
+# Glance write chunks to Swift? This amount of data is written
+# to a temporary disk buffer during the process of chunking
+# the image file, and the default is 200MB
+swift_store_large_object_chunk_size = 200
+
+# If set, the configured endpoint will be used. If None, the storage URL
+# from the auth response will be used. The location of an object is
+# obtained by appending the container and object to the configured URL.
+#
+# swift_store_endpoint = https://www.example.com/v1/not_a_container
+#swift_store_endpoint =
+
+# If set to True enables multi-tenant storage mode which causes Glance images
+# to be stored in tenant specific Swift accounts.
+#swift_store_multi_tenant = False
+
+# If set to an integer value between 1 and 32, a single-tenant store will
+# use multiple containers to store images. If set to the default value of 0,
+# only a single container will be used. Multi-tenant stores are not affected
+# by this option. The max number of containers that will be used to store
+# images is approximately 16^N where N is the value of this option. Discuss
+# the impact of this with your swift deployment team, as this option is only
+# beneficial in the largest of deployments where swift rate limiting can lead
+# to unwanted throttling on a single container.
+#swift_store_multiple_containers_seed = 0
+
+# A list of swift ACL strings that will be applied as both read and
+# write ACLs to the containers created by Glance in multi-tenant
+# mode. This grants the specified tenants/users read and write access
+# to all newly created image objects. The standard swift ACL string
+# formats are allowed, including:
+# <tenant_id>:<username>
+# <tenant_name>:<username>
+# *:<username>
+# Multiple ACLs can be combined using a comma separated list, for
+# example: swift_store_admin_tenants = service:glance,*:admin
+#swift_store_admin_tenants =
+
+# The region of the swift endpoint to be used for single tenant. This setting
+# is only necessary if the tenant has multiple swift endpoints.
+#swift_store_region =
+
+# If set to False, disables SSL layer compression of https swift requests.
+# Setting to 'False' may improve performance for images which are already
+# in a compressed format, eg qcow2. If set to True, enables SSL layer
+# compression (provided it is supported by the target swift proxy).
+#swift_store_ssl_compression = True
+
+# The number of times a Swift download will be retried before the
+# request fails
+#swift_store_retry_get_count = 0
+
+# Bypass SSL verification for Swift
+#swift_store_auth_insecure = False
+
+# The path to a CA certificate bundle file to use for SSL verification when
+# communicating with Swift.
+#swift_store_cacert =
+
+# ============ S3 Store Options =============================
+
+# Address where the S3 authentication service lives
+# Valid schemes are 'http://' and 'https://'
+# If no scheme specified, default to 'http://'
+s3_store_host = s3.amazonaws.com
+
+# User to authenticate against the S3 authentication service
+s3_store_access_key = <20-char AWS access key>
+
+# Auth key for the user authenticating against the
+# S3 authentication service
+s3_store_secret_key = <40-char AWS secret key>
+
+# Container within the account that the account should use
+# for storing images in S3. Note that S3 has a flat namespace,
+# so you need a unique bucket name for your glance images. An
+# easy way to do this is append your AWS access key to "glance".
+# S3 buckets in AWS *must* be lowercased, so remember to lowercase
+# your AWS access key if you use it in your bucket name below!
+s3_store_bucket = <lowercased 20-char aws access key>glance
+
+# Do we create the bucket if it does not exist?
+s3_store_create_bucket_on_put = False
+
+# When sending images to S3, the data will first be written to a
+# temporary buffer on disk. By default the platform's temporary directory
+# will be used. If required, an alternative directory can be specified here.
+#s3_store_object_buffer_dir = /path/to/dir
+
+# When forming a bucket url, boto will either set the bucket name as the
+# subdomain or as the first token of the path. Amazon's S3 service will
+# accept it as the subdomain, but Swift's S3 middleware requires it be
+# in the path. Set this to 'path' or 'subdomain' - defaults to 'subdomain'.
+#s3_store_bucket_url_format = subdomain
+
+# Size, in MB, should S3 start chunking image files
+# and do a multipart upload in S3. The default is 100MB.
+#s3_store_large_object_size = 100
+
+# Multipart upload part size, in MB, should S3 use when uploading
+# parts. The size must be greater than or equal to
+# 5MB. The default is 10MB.
+#s3_store_large_object_chunk_size = 10
+
+# The number of thread pools to perform a multipart upload
+# in S3. The default is 10.
+#s3_store_thread_pools = 10
+
+# ============ RBD Store Options =============================
+
+# Ceph configuration file path
+# If using cephx authentication, this file should
+# include a reference to the right keyring
+# in a client.<USER> section
+#rbd_store_ceph_conf = /etc/ceph/ceph.conf
+
+# RADOS user to authenticate as (only applicable if using cephx)
+# If <None>, a default will be chosen based on the client. section
+# in rbd_store_ceph_conf
+#rbd_store_user = <None>
+
+# RADOS pool in which images are stored
+#rbd_store_pool = images
+
+# RADOS images will be chunked into objects of this size (in megabytes).
+# For best performance, this should be a power of two
+#rbd_store_chunk_size = 8
+
+# ============ Sheepdog Store Options =============================
+
+sheepdog_store_address = localhost
+
+sheepdog_store_port = 7000
+
+# Images will be chunked into objects of this size (in megabytes).
+# For best performance, this should be a power of two
+sheepdog_store_chunk_size = 64
+
+# ============ Cinder Store Options ===============================
+
+# Info to match when looking for cinder in the service catalog
+# Format is : separated values of the form:
+# <service_type>:<service_name>:<endpoint_type> (string value)
+#cinder_catalog_info = volume:cinder:publicURL
+
+# Override service catalog lookup with template for cinder endpoint
+# e.g. http://localhost:8776/v1/%(project_id)s (string value)
+#cinder_endpoint_template = <None>
+
+# Region name of this node (string value)
+#os_region_name = <None>
+
+# Location of ca certicates file to use for cinder client requests
+# (string value)
+#cinder_ca_certificates_file = <None>
+
+# Number of cinderclient retries on failed http calls (integer value)
+#cinder_http_retries = 3
+
+# Allow to perform insecure SSL requests to cinder (boolean value)
+#cinder_api_insecure = False
+
+# ============ VMware Datastore Store Options =====================
+
+# ESX/ESXi or vCenter Server target system.
+# The server value can be an IP address or a DNS name
+# e.g. 127.0.0.1, 127.0.0.1:443, www.vmware-infra.com
+#vmware_server_host = <None>
+
+# Server username (string value)
+#vmware_server_username = <None>
+
+# Server password (string value)
+#vmware_server_password = <None>
+
+# Inventory path to a datacenter (string value)
+# Value optional when vmware_server_ip is an ESX/ESXi host: if specified
+# should be `ha-datacenter`.
+# Deprecated in favor of vmware_datastores.
+#vmware_datacenter_path = <None>
+
+# Datastore associated with the datacenter (string value)
+# Deprecated in favor of vmware_datastores.
+#vmware_datastore_name = <None>
+
+# A list of datastores where the image can be stored.
+# This option may be specified multiple times for specifying multiple
+# datastores. Either one of vmware_datastore_name or vmware_datastores is
+# required. The datastore name should be specified after its datacenter
+# path, separated by ":". An optional weight may be given after the datastore
+# name, separated again by ":". Thus, the required format becomes
+# <datacenter_path>:<datastore_name>:<optional_weight>.
+# When adding an image, the datastore with highest weight will be selected,
+# unless there is not enough free space available in cases where the image size
+# is already known. If no weight is given, it is assumed to be zero and the
+# directory will be considered for selection last. If multiple datastores have
+# the same weight, then the one with the most free space available is selected.
+#vmware_datastores = <None>
+
+# The number of times we retry on failures
+# e.g., socket error, etc (integer value)
+#vmware_api_retry_count = 10
+
+# The interval used for polling remote tasks
+# invoked on VMware ESX/VC server in seconds (integer value)
+#vmware_task_poll_interval = 5
+
+# Absolute path of the folder containing the images in the datastore
+# (string value)
+#vmware_store_image_dir = /openstack_glance
+
+# Allow to perform insecure SSL requests to the target system (boolean value)
+#vmware_api_insecure = False
diff --git a/install-files/openstack/usr/share/openstack/glance/glance-registry.conf b/install-files/openstack/usr/share/openstack/glance/glance-registry.conf
new file mode 100644
index 00000000..40993d8d
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/glance/glance-registry.conf
@@ -0,0 +1,268 @@
+[DEFAULT]
+# Show more verbose log output (sets INFO log level output)
+#verbose = False
+
+# Show debugging output in logs (sets DEBUG log level output)
+#debug = False
+
+# Address to bind the registry server
+bind_host = {{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+
+# Port the bind the registry server to
+bind_port = 9191
+
+# Log to this file. Make sure you do not set the same log file for both the API
+# and registry servers!
+#
+# If `log_file` is omitted and `use_syslog` is false, then log messages are
+# sent to stdout as a fallback.
+# log_file = /var/log/glance/registry.log
+
+# Backlog requests when creating socket
+backlog = 4096
+
+# TCP_KEEPIDLE value in seconds when creating socket.
+# Not supported on OS X.
+#tcp_keepidle = 600
+
+# API to use for accessing data. Default value points to sqlalchemy
+# package.
+#data_api = glance.db.sqlalchemy.api
+
+# The number of child process workers that will be
+# created to service Registry requests. The default will be
+# equal to the number of CPUs available. (integer value)
+#workers = None
+
+# Enable Registry API versions individually or simultaneously
+#enable_v1_registry = True
+#enable_v2_registry = True
+
+# Limit the api to return `param_limit_max` items in a call to a container. If
+# a larger `limit` query param is provided, it will be reduced to this value.
+api_limit_max = 1000
+
+# If a `limit` query param is not provided in an api request, it will
+# default to `limit_param_default`
+limit_param_default = 25
+
+# Role used to identify an authenticated user as administrator
+#admin_role = admin
+
+# Enable DEBUG log messages from sqlalchemy which prints every database
+# query and response.
+# Default: False
+#sqlalchemy_debug = True
+
+# http_keepalive option. If False, server will return the header
+# "Connection: close", If True, server will return "Connection: Keep-Alive"
+# in its responses. In order to close the client socket connection
+# explicitly after the response is sent and read successfully by the client,
+# you simply have to set this option to False when you create a wsgi server.
+#http_keepalive = True
+
+# ================= Syslog Options ============================
+
+# Send logs to syslog (/dev/log) instead of to file specified
+# by `log_file`
+use_syslog = True
+
+# Facility to use. If unset defaults to LOG_USER.
+#syslog_log_facility = LOG_LOCAL1
+
+# ================= SSL Options ===============================
+
+# Certificate file to use when starting registry server securely
+#cert_file = /path/to/certfile
+
+# Private key file to use when starting registry server securely
+#key_file = /path/to/keyfile
+
+# CA certificate file to use to verify connecting clients
+#ca_file = /path/to/cafile
+
+# ============ Notification System Options =====================
+
+# Driver or drivers to handle sending notifications. Set to
+# 'messaging' to send notifications to a message queue.
+notification_driver = messagingv2
+
+# Default publisher_id for outgoing notifications.
+# default_publisher_id = image.localhost
+
+# Messaging driver used for 'messaging' notifications driver
+rpc_backend = 'rabbit'
+
+# Configuration options if sending notifications via rabbitmq (these are
+# the defaults)
+rabbit_host = {{ RABBITMQ_HOST }}
+rabbit_port = {{ RABBITMQ_PORT }}
+rabbit_use_ssl = false
+rabbit_userid = {{ RABBITMQ_USER }}
+rabbit_password = {{ RABBITMQ_PASSWORD }}
+rabbit_virtual_host = /
+rabbit_notification_exchange = glance
+rabbit_notification_topic = notifications
+rabbit_durable_queues = False
+
+# Configuration options if sending notifications via Qpid (these are
+# the defaults)
+#qpid_notification_exchange = glance
+#qpid_notification_topic = notifications
+#qpid_hostname = localhost
+#qpid_port = 5672
+#qpid_username =
+#qpid_password =
+#qpid_sasl_mechanisms =
+#qpid_reconnect_timeout = 0
+#qpid_reconnect_limit = 0
+#qpid_reconnect_interval_min = 0
+#qpid_reconnect_interval_max = 0
+#qpid_reconnect_interval = 0
+#qpid_heartbeat = 5
+# Set to 'ssl' to enable SSL
+#qpid_protocol = tcp
+#qpid_tcp_nodelay = True
+
+
+# =============== Policy Options ==============================
+
+[oslo_policy]
+# The JSON file that defines policies.
+# Deprecated group/name - [DEFAULT]/policy_file
+#policy_file = policy.json
+
+# Default rule. Enforced when a requested rule is not found.
+# Deprecated group/name - [DEFAULT]/policy_default_rule
+#policy_default_rule = default
+
+# Directories where policy configuration files are stored.
+# They can be relative to any directory in the search path
+# defined by the config_dir option, or absolute paths.
+# The file defined by policy_file must exist for these
+# directories to be searched.
+# Deprecated group/name - [DEFAULT]/policy_dirs
+#policy_dirs = policy.d
+
+# ================= Database Options ==========================
+
+[database]
+# The file name to use with SQLite (string value)
+#sqlite_db = glance.sqlite
+
+# If True, SQLite uses synchronous mode (boolean value)
+#sqlite_synchronous = True
+
+# The backend to use for db (string value)
+# Deprecated group/name - [DEFAULT]/db_backend
+#backend = sqlalchemy
+
+# The SQLAlchemy connection string used to connect to the
+# database (string value)
+# Deprecated group/name - [DEFAULT]/sql_connection
+# Deprecated group/name - [DATABASE]/sql_connection
+# Deprecated group/name - [sql]/connection
+#connection = <None>
+connection=postgresql://{{ GLANCE_DB_USER }}:{{ GLANCE_DB_PASSWORD }}@{{ CONTROLLER_HOST_ADDRESS }}/glance
+
+# The SQL mode to be used for MySQL sessions. This option,
+# including the default, overrides any server-set SQL mode. To
+# use whatever SQL mode is set by the server configuration,
+# set this to no value. Example: mysql_sql_mode= (string
+# value)
+#mysql_sql_mode = TRADITIONAL
+
+# Timeout before idle sql connections are reaped (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_idle_timeout
+# Deprecated group/name - [DATABASE]/sql_idle_timeout
+# Deprecated group/name - [sql]/idle_timeout
+#idle_timeout = 3600
+
+# Minimum number of SQL connections to keep open in a pool
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_min_pool_size
+# Deprecated group/name - [DATABASE]/sql_min_pool_size
+#min_pool_size = 1
+
+# Maximum number of SQL connections to keep open in a pool
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_pool_size
+# Deprecated group/name - [DATABASE]/sql_max_pool_size
+#max_pool_size = <None>
+
+# Maximum db connection retries during startup. (setting -1
+# implies an infinite retry count) (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_retries
+# Deprecated group/name - [DATABASE]/sql_max_retries
+#max_retries = 10
+
+# Interval between retries of opening a sql connection
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_retry_interval
+# Deprecated group/name - [DATABASE]/reconnect_interval
+#retry_interval = 10
+
+# If set, use this value for max_overflow with sqlalchemy
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_overflow
+# Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow
+#max_overflow = <None>
+
+# Verbosity of SQL debugging information. 0=None,
+# 100=Everything (integer value)
+# Deprecated group/name - [DEFAULT]/sql_connection_debug
+#connection_debug = 0
+
+# Add python stack traces to SQL as comment strings (boolean
+# value)
+# Deprecated group/name - [DEFAULT]/sql_connection_trace
+#connection_trace = False
+
+# If set, use this value for pool_timeout with sqlalchemy
+# (integer value)
+# Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout
+#pool_timeout = <None>
+
+# Enable the experimental use of database reconnect on
+# connection lost (boolean value)
+#use_db_reconnect = False
+
+# seconds between db connection retries (integer value)
+#db_retry_interval = 1
+
+# Whether to increase interval between db connection retries,
+# up to db_max_retry_interval (boolean value)
+#db_inc_retry_interval = True
+
+# max seconds between db connection retries, if
+# db_inc_retry_interval is enabled (integer value)
+#db_max_retry_interval = 10
+
+# maximum db connection retries before error is raised.
+# (setting -1 implies an infinite retry count) (integer value)
+#db_max_retries = 20
+
+[keystone_authtoken]
+auth_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:5000/v2.0
+identity_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:35357
+admin_tenant_name = service
+admin_user = {{ GLANCE_SERVICE_USER }}
+admin_password = {{ GLANCE_SERVICE_PASSWORD }}
+
+[paste_deploy]
+# Name of the paste configuration file that defines the available pipelines
+#config_file = glance-registry-paste.ini
+
+# Partial name of a pipeline in your paste configuration file with the
+# service name removed. For example, if your paste section name is
+# [pipeline:glance-registry-keystone], you would configure the flavor below
+# as 'keystone'.
+flavor=keystone
+
+[profiler]
+# If False fully disable profiling feature.
+#enabled = False
+
+# If False doesn't trace SQL requests.
+#trace_sqlalchemy = False
diff --git a/install-files/openstack/usr/share/openstack/horizon.yml b/install-files/openstack/usr/share/openstack/horizon.yml
new file mode 100644
index 00000000..1fec4ab0
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/horizon.yml
@@ -0,0 +1,46 @@
+---
+- hosts: localhost
+ tasks:
+
+# Setup apache, this may end up in apache.yml
+ - name: Create the apache user.
+ user:
+ name: apache
+ comment: Apache Server
+ shell: /sbin/nologin
+ home: /var/www
+
+ - file:
+ path: /usr/sbin/suexec
+ group: apache
+ mode: 4750
+
+# Setup horizon
+ - name: Create the horizon user.
+ user:
+ name: horizon
+ comment: Openstack Horizon User
+ shell: /sbin/nologin
+ home: /var/lib/horizon
+
+ - name: Fix permissions in /var/lib/horizon
+ file:
+ path: /var/lib/horizon
+ state: directory
+ owner: horizon
+ group: horizon
+ recurse: yes
+
+ - name: Link horizon apache configuration
+ file:
+ src: /etc/horizon/apache-horizon.conf
+ dest: /etc/httpd/conf.d/apache-horizon.conf
+ state: link
+
+ - name: Enable and start apache services needed by horizon
+ service:
+ name: "{{ item }}"
+ enabled: yes
+ state: started
+ with_items:
+ - apache-httpd.service
diff --git a/install-files/openstack/usr/share/openstack/hosts b/install-files/openstack/usr/share/openstack/hosts
new file mode 100644
index 00000000..5b97818d
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/hosts
@@ -0,0 +1 @@
+localhost ansible_connection=local
diff --git a/install-files/openstack/usr/share/openstack/ironic.yml b/install-files/openstack/usr/share/openstack/ironic.yml
new file mode 100644
index 00000000..19906b04
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/ironic.yml
@@ -0,0 +1,104 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/ironic.conf"
+ tasks:
+ - name: Create the ironic user
+ user:
+ name: ironic
+ comment: Openstack Ironic Daemons
+ shell: /sbin/nologin
+ home: /var/lib/ironic
+
+ - name: Create the /var folders for Ironic
+ file:
+ path: "{{ item }}"
+ state: directory
+ owner: ironic
+ group: ironic
+ with_items:
+ - /var/run/ironic
+ - /var/lock/ironic
+ - /var/log/ironic
+ - /var/lib/ironic
+
+ - file: path=/etc/ironic state=directory
+ - name: Add the configuration needed for ironic in /etc/ironic using templates
+ template:
+ src: /usr/share/openstack/ironic/{{ item }}
+ dest: /etc/ironic/{{ item }}
+ with_lines:
+ - cd /usr/share/openstack/ironic && find -type f
+
+ - name: Create Ironic service user in service tenant
+ keystone_user:
+ user: "{{ IRONIC_SERVICE_USER }}"
+ password: "{{ IRONIC_SERVICE_PASSWORD }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Assign admin role to Ironic service user in the service tenant
+ keystone_user:
+ role: admin
+ user: "{{ IRONIC_SERVICE_USER }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Add Ironic endpoint
+ keystone_service:
+ name: ironic
+ type: baremetal
+ description: Openstack Ironic Service
+ publicurl: 'http://{{ ansible_hostname }}:6385'
+ internalurl: 'http://{{ CONTROLLER_HOST_ADDRESS }}:6385'
+ adminurl: 'http://{{ CONTROLLER_HOST_ADDRESS }}:6385'
+ region: 'regionOne'
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Create postgresql user for Ironic
+ postgresql_user:
+ name: "{{ IRONIC_DB_USER }}"
+ login_host: "{{ CONTROLLER_HOST_ADDRESS }}"
+ password: "{{ IRONIC_DB_PASSWORD }}"
+ sudo: yes
+ sudo_user: ironic
+
+ - name: Create database for Ironic services
+ postgresql_db:
+ name: ironic
+ owner: "{{ IRONIC_DB_USER }}"
+ login_host: "{{ CONTROLLER_HOST_ADDRESS }}"
+ sudo: yes
+ sudo_user: ironic
+
+ - name: Initiate Ironic database
+ # Use 'upgrade' instead of 'create_schema' to make the operation
+ # idempotent
+ shell: |
+ ironic-dbsync \
+ --config-file /etc/ironic/ironic.conf upgrade
+ sudo: yes
+ sudo_user: ironic
+
+ - name: Enable and start openstack-ironic services
+ service:
+ name: "{{ item }}"
+ enabled: yes
+ state: started
+ with_items:
+ - openstack-ironic-conductor.service
+ - openstack-ironic-api.service
+
+ - name: Set owner and group for the tftp root directory
+ file:
+ path: "/srv/tftp_root/"
+ state: directory
+ owner: ironic
+ group: ironic
+ recurse: yes
+
+ - name: Enable and start tftp-hpa
+ service:
+ name: tftp-hpa.socket
+ enabled: yes
+ state: started
diff --git a/install-files/openstack/usr/share/openstack/ironic/ironic.conf b/install-files/openstack/usr/share/openstack/ironic/ironic.conf
new file mode 100644
index 00000000..a5b5d2e3
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/ironic/ironic.conf
@@ -0,0 +1,1568 @@
+[DEFAULT]
+
+#
+# Options defined in oslo.messaging
+#
+
+# ZeroMQ bind address. Should be a wildcard (*), an ethernet
+# interface, or IP. The "host" option should point or resolve
+# to this address. (string value)
+#rpc_zmq_bind_address=*
+
+# MatchMaker driver. (string value)
+#rpc_zmq_matchmaker=oslo_messaging._drivers.matchmaker.MatchMakerLocalhost
+
+# ZeroMQ receiver listening port. (integer value)
+#rpc_zmq_port=9501
+
+# Number of ZeroMQ contexts, defaults to 1. (integer value)
+#rpc_zmq_contexts=1
+
+# Maximum number of ingress messages to locally buffer per
+# topic. Default is unlimited. (integer value)
+#rpc_zmq_topic_backlog=<None>
+
+# Directory for holding IPC sockets. (string value)
+#rpc_zmq_ipc_dir=/var/run/openstack
+
+# Name of this node. Must be a valid hostname, FQDN, or IP
+# address. Must match "host" option, if running Nova. (string
+# value)
+#rpc_zmq_host=ironic
+
+# Seconds to wait before a cast expires (TTL). Only supported
+# by impl_zmq. (integer value)
+#rpc_cast_timeout=30
+
+# Heartbeat frequency. (integer value)
+#matchmaker_heartbeat_freq=300
+
+# Heartbeat time-to-live. (integer value)
+#matchmaker_heartbeat_ttl=600
+
+# Size of RPC thread pool. (integer value)
+#rpc_thread_pool_size=64
+
+# Driver or drivers to handle sending notifications. (multi
+# valued)
+#notification_driver=
+
+# AMQP topic used for OpenStack notifications. (list value)
+# Deprecated group/name - [rpc_notifier2]/topics
+#notification_topics=notifications
+
+# Seconds to wait for a response from a call. (integer value)
+#rpc_response_timeout=60
+
+# A URL representing the messaging driver to use and its full
+# configuration. If not set, we fall back to the rpc_backend
+# option and driver specific configuration. (string value)
+#transport_url=<None>
+
+# The messaging driver to use, defaults to rabbit. Other
+# drivers include qpid and zmq. (string value)
+#rpc_backend=rabbit
+
+# The default exchange under which topics are scoped. May be
+# overridden by an exchange name specified in the
+# transport_url option. (string value)
+#control_exchange=openstack
+
+
+#
+# Options defined in ironic.netconf
+#
+
+# IP address of this host. (string value)
+my_ip = {{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+
+
+#
+# Options defined in ironic.api.app
+#
+
+# Method to use for authentication: noauth or keystone.
+# (string value)
+#auth_strategy=keystone
+
+# Enable pecan debug mode. WARNING: this is insecure and
+# should not be used in production. (boolean value)
+#pecan_debug=false
+
+
+#
+# Options defined in ironic.common.driver_factory
+#
+
+# Specify the list of drivers to load during service
+# initialization. Missing drivers, or drivers which fail to
+# initialize, will prevent the conductor service from
+# starting. The option default is a recommended set of
+# production-oriented drivers. A complete list of drivers
+# present on your system may be found by enumerating the
+# "ironic.drivers" entrypoint. An example may be found in the
+# developer documentation online. (list value)
+enabled_drivers=pxe_ipmitool,pxe_ssh
+
+
+#
+# Options defined in ironic.common.exception
+#
+
+# Make exception message format errors fatal. (boolean value)
+#fatal_exception_format_errors=false
+
+
+#
+# Options defined in ironic.common.hash_ring
+#
+
+# Exponent to determine number of hash partitions to use when
+# distributing load across conductors. Larger values will
+# result in more even distribution of load and less load when
+# rebalancing the ring, but more memory usage. Number of
+# partitions per conductor is (2^hash_partition_exponent).
+# This determines the granularity of rebalancing: given 10
+# hosts, and an exponent of the 2, there are 40 partitions in
+# the ring.A few thousand partitions should make rebalancing
+# smooth in most cases. The default is suitable for up to a
+# few hundred conductors. Too many partitions has a CPU
+# impact. (integer value)
+#hash_partition_exponent=5
+
+# [Experimental Feature] Number of hosts to map onto each hash
+# partition. Setting this to more than one will cause
+# additional conductor services to prepare deployment
+# environments and potentially allow the Ironic cluster to
+# recover more quickly if a conductor instance is terminated.
+# (integer value)
+#hash_distribution_replicas=1
+
+
+#
+# Options defined in ironic.common.images
+#
+
+# Force backing images to raw format. (boolean value)
+#force_raw_images=true
+
+# Path to isolinux binary file. (string value)
+#isolinux_bin=/usr/lib/syslinux/isolinux.bin
+
+# Template file for isolinux configuration file. (string
+# value)
+#isolinux_config_template=$pybasedir/common/isolinux_config.template
+
+# Template file for grub configuration file. (string value)
+#grub_config_template=$pybasedir/common/grub_conf.template
+
+
+#
+# Options defined in ironic.common.paths
+#
+
+# Directory where the ironic python module is installed.
+# (string value)
+#pybasedir=/usr/lib/python/site-packages/ironic
+
+# Directory where ironic binaries are installed. (string
+# value)
+#bindir=$pybasedir/bin
+
+# Top-level directory for maintaining ironic's state. (string
+# value)
+#state_path=$pybasedir
+
+
+#
+# Options defined in ironic.common.service
+#
+
+# Seconds between running periodic tasks. (integer value)
+#periodic_interval=60
+
+# Name of this node. This can be an opaque identifier. It is
+# not necessarily a hostname, FQDN, or IP address. However,
+# the node name must be valid within an AMQP key, and if using
+# ZeroMQ, a valid hostname, FQDN, or IP address. (string
+# value)
+#host=ironic
+
+
+#
+# Options defined in ironic.common.utils
+#
+
+# Path to the rootwrap configuration file to use for running
+# commands as root. (string value)
+#rootwrap_config=/etc/ironic/rootwrap.conf
+
+# Explicitly specify the temporary working directory. (string
+# value)
+#tempdir=<None>
+
+
+#
+# Options defined in ironic.drivers.modules.image_cache
+#
+
+# Run image downloads and raw format conversions in parallel.
+# (boolean value)
+#parallel_image_downloads=false
+
+
+#
+# Options defined in ironic.openstack.common.eventlet_backdoor
+#
+
+# Enable eventlet backdoor. Acceptable values are 0, <port>,
+# and <start>:<end>, where 0 results in listening on a random
+# tcp port number; <port> results in listening on the
+# specified port number (and not enabling backdoor if that
+# port is in use); and <start>:<end> results in listening on
+# the smallest unused port number within the specified range
+# of port numbers. The chosen port is displayed in the
+# service's log file. (string value)
+#backdoor_port=<None>
+
+
+#
+# Options defined in ironic.openstack.common.log
+#
+
+# Print debugging output (set logging level to DEBUG instead
+# of default WARNING level). (boolean value)
+#debug=false
+
+# Print more verbose output (set logging level to INFO instead
+# of default WARNING level). (boolean value)
+#verbose=false
+
+# Log output to standard error. (boolean value)
+#use_stderr=true
+
+# Format string to use for log messages with context. (string
+# value)
+#logging_context_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages without context.
+# (string value)
+#logging_default_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Data to append to log format when level is DEBUG. (string
+# value)
+#logging_debug_format_suffix=%(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format.
+# (string value)
+#logging_exception_prefix=%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s
+
+# List of logger=LEVEL pairs. (list value)
+#default_log_levels=amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN
+
+# Enables or disables publication of error events. (boolean
+# value)
+#publish_errors=false
+
+# Enables or disables fatal status of deprecations. (boolean
+# value)
+#fatal_deprecations=false
+
+# The format for an instance that is passed with the log
+# message. (string value)
+#instance_format="[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log
+# message. (string value)
+#instance_uuid_format="[instance: %(uuid)s] "
+
+# The name of a logging configuration file. This file is
+# appended to any existing logging configuration files. For
+# details about logging configuration files, see the Python
+# logging module documentation. (string value)
+# Deprecated group/name - [DEFAULT]/log_config
+#log_config_append=<None>
+
+# DEPRECATED. A logging.Formatter log message format string
+# which may use any of the available logging.LogRecord
+# attributes. This option is deprecated. Please use
+# logging_context_format_string and
+# logging_default_format_string instead. (string value)
+#log_format=<None>
+
+# Format string for %%(asctime)s in log records. Default:
+# %(default)s . (string value)
+#log_date_format=%Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to output to. If no default is
+# set, logging will go to stdout. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file=<None>
+
+# (Optional) The base directory used for relative --log-file
+# paths. (string value)
+# Deprecated group/name - [DEFAULT]/logdir
+#log_dir=<None>
+
+# Use syslog for logging. Existing syslog format is DEPRECATED
+# during I, and will change in J to honor RFC5424. (boolean
+# value)
+use_syslog=true
+
+# (Optional) Enables or disables syslog rfc5424 format for
+# logging. If enabled, prefixes the MSG part of the syslog
+# message with APP-NAME (RFC5424). The format without the APP-
+# NAME is deprecated in I, and will be removed in J. (boolean
+# value)
+#use_syslog_rfc_format=false
+
+# Syslog facility to receive log lines. (string value)
+#syslog_log_facility=LOG_USER
+
+
+#
+# Options defined in ironic.openstack.common.periodic_task
+#
+
+# Some periodic tasks can be run in a separate process. Should
+# we run them here? (boolean value)
+#run_external_periodic_tasks=true
+
+
+#
+# Options defined in ironic.openstack.common.versionutils
+#
+
+# Enables or disables fatal status of deprecations. (boolean
+# value)
+#fatal_deprecations=false
+
+
+[agent]
+
+#
+# Options defined in ironic.drivers.modules.agent
+#
+
+# Additional append parameters for baremetal PXE boot. (string
+# value)
+#agent_pxe_append_params=nofb nomodeset vga=normal
+
+# Template file for PXE configuration. (string value)
+#agent_pxe_config_template=$pybasedir/drivers/modules/agent_config.template
+
+# Neutron bootfile DHCP parameter. (string value)
+#agent_pxe_bootfile_name=pxelinux.0
+
+# Priority to run in-band erase devices via the Ironic Python
+# Agent ramdisk. If unset, will use the priority set in the
+# ramdisk (defaults to 10 for the GenericHardwareManager). If
+# set to 0, will not run during cleaning. (integer value)
+#agent_erase_devices_priority=<None>
+
+# Whether Ironic will manage TFTP files for the deploy
+# ramdisks. If set to False, you will need to configure your
+# own TFTP server that allows booting the deploy ramdisks.
+# (boolean value)
+#manage_tftp=true
+
+#
+# Options defined in ironic.drivers.modules.agent_base_vendor
+#
+
+# Maximum interval (in seconds) for agent heartbeats. (integer
+# value)
+#heartbeat_timeout=300
+
+
+#
+# Options defined in ironic.drivers.modules.agent_client
+#
+
+# API version to use for communicating with the ramdisk agent.
+# (string value)
+#agent_api_version=v1
+
+
+[amt]
+
+#
+# Options defined in ironic.drivers.modules.amt.common
+#
+
+# Protocol used for AMT endpoint, support http/https (string
+# value)
+#protocol=http
+
+
+#
+# Options defined in ironic.drivers.modules.amt.power
+#
+
+# Maximum number of times to attempt an AMT operation, before
+# failing (integer value)
+#max_attempts=3
+
+# Amount of time (in seconds) to wait, before retrying an AMT
+# operation (integer value)
+#action_wait=10
+
+
+[api]
+
+#
+# Options defined in ironic.api
+#
+
+# The listen IP for the Ironic API server. (string value)
+#host_ip=0.0.0.0
+
+# The port for the Ironic API server. (integer value)
+#port=6385
+
+# The maximum number of items returned in a single response
+# from a collection resource. (integer value)
+#max_limit=1000
+
+
+[conductor]
+
+#
+# Options defined in ironic.conductor.manager
+#
+
+# URL of Ironic API service. If not set ironic can get the
+# current value from the keystone service catalog. (string
+# value)
+api_url = http://{{ MANAGEMENT_INTERFACE_IP_ADDRESS }}:6385
+
+# Seconds between conductor heart beats. (integer value)
+#heartbeat_interval=10
+
+# Maximum time (in seconds) since the last check-in of a
+# conductor. (integer value)
+#heartbeat_timeout=60
+
+# Interval between syncing the node power state to the
+# database, in seconds. (integer value)
+#sync_power_state_interval=60
+
+# Interval between checks of provision timeouts, in seconds.
+# (integer value)
+#check_provision_state_interval=60
+
+# Timeout (seconds) for waiting callback from deploy ramdisk.
+# 0 - unlimited. (integer value)
+#deploy_callback_timeout=1800
+
+# During sync_power_state, should the hardware power state be
+# set to the state recorded in the database (True) or should
+# the database be updated based on the hardware state (False).
+# (boolean value)
+#force_power_state_during_sync=true
+
+# During sync_power_state failures, limit the number of times
+# Ironic should try syncing the hardware node power state with
+# the node power state in DB (integer value)
+#power_state_sync_max_retries=3
+
+# Maximum number of worker threads that can be started
+# simultaneously by a periodic task. Should be less than RPC
+# thread pool size. (integer value)
+#periodic_max_workers=8
+
+# The size of the workers greenthread pool. (integer value)
+#workers_pool_size=100
+
+# Number of attempts to grab a node lock. (integer value)
+#node_locked_retry_attempts=3
+
+# Seconds to sleep between node lock attempts. (integer value)
+#node_locked_retry_interval=1
+
+# Enable sending sensor data message via the notification bus
+# (boolean value)
+#send_sensor_data=false
+
+# Seconds between conductor sending sensor data message to
+# ceilometer via the notification bus. (integer value)
+#send_sensor_data_interval=600
+
+# List of comma separated metric types which need to be sent
+# to Ceilometer. The default value, "ALL", is a special value
+# meaning send all the sensor data. (list value)
+#send_sensor_data_types=ALL
+
+# When conductors join or leave the cluster, existing
+# conductors may need to update any persistent local state as
+# nodes are moved around the cluster. This option controls how
+# often, in seconds, each conductor will check for nodes that
+# it should "take over". Set it to a negative value to disable
+# the check entirely. (integer value)
+#sync_local_state_interval=180
+
+# Whether to upload the config drive to Swift. (boolean value)
+#configdrive_use_swift=false
+
+# Name of the Swift container to store config drive data. Used
+# when configdrive_use_swift is True. (string value)
+#configdrive_swift_container=ironic_configdrive_container
+
+# Timeout (seconds) for waiting for node inspection. 0 -
+# unlimited. (integer value)
+#inspect_timeout=1800
+
+# Cleaning is a configurable set of steps, such as erasing
+# disk drives, that are performed on the node to ensure it is
+# in a baseline state and ready to be deployed to. This is
+# done after instance deletion, and during the transition from
+# a "managed" to "available" state. When enabled, the
+# particular steps performed to clean a node depend on which
+# driver that node is managed by; see the individual driver's
+# documentation for details. NOTE: The introduction of the
+# cleaning operation causes instance deletion to take
+# significantly longer. In an environment where all tenants
+# are trusted (eg, because there is only one tenant), this
+# option could be safely disabled. (boolean value)
+#clean_nodes=true
+
+
+[console]
+
+#
+# Options defined in ironic.drivers.modules.console_utils
+#
+
+# Path to serial console terminal program (string value)
+#terminal=shellinaboxd
+
+# Directory containing the terminal SSL cert(PEM) for serial
+# console access (string value)
+#terminal_cert_dir=<None>
+
+# Directory for holding terminal pid files. If not specified,
+# the temporary directory will be used. (string value)
+#terminal_pid_dir=<None>
+
+# Time interval (in seconds) for checking the status of
+# console subprocess. (integer value)
+#subprocess_checking_interval=1
+
+# Time (in seconds) to wait for the console subprocess to
+# start. (integer value)
+#subprocess_timeout=10
+
+
+[database]
+
+#
+# Options defined in oslo.db
+#
+
+# The file name to use with SQLite. (string value)
+#sqlite_db=oslo.sqlite
+
+# If True, SQLite uses synchronous mode. (boolean value)
+#sqlite_synchronous=true
+
+# The back end to use for the database. (string value)
+# Deprecated group/name - [DEFAULT]/db_backend
+#backend=sqlalchemy
+
+# The SQLAlchemy connection string to use to connect to the
+# database. (string value)
+# Deprecated group/name - [DEFAULT]/sql_connection
+# Deprecated group/name - [DATABASE]/sql_connection
+# Deprecated group/name - [sql]/connection
+connection = postgresql://{{ IRONIC_DB_USER}}:{{ IRONIC_DB_PASSWORD }}@{{ CONTROLLER_HOST_ADDRESS }}/ironic
+
+# The SQLAlchemy connection string to use to connect to the
+# slave database. (string value)
+#slave_connection=<None>
+
+# The SQL mode to be used for MySQL sessions. This option,
+# including the default, overrides any server-set SQL mode. To
+# use whatever SQL mode is set by the server configuration,
+# set this to no value. Example: mysql_sql_mode= (string
+# value)
+#mysql_sql_mode=TRADITIONAL
+
+# Timeout before idle SQL connections are reaped. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_idle_timeout
+# Deprecated group/name - [DATABASE]/sql_idle_timeout
+# Deprecated group/name - [sql]/idle_timeout
+#idle_timeout=3600
+
+# Minimum number of SQL connections to keep open in a pool.
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_min_pool_size
+# Deprecated group/name - [DATABASE]/sql_min_pool_size
+#min_pool_size=1
+
+# Maximum number of SQL connections to keep open in a pool.
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_pool_size
+# Deprecated group/name - [DATABASE]/sql_max_pool_size
+#max_pool_size=<None>
+
+# Maximum number of database connection retries during
+# startup. Set to -1 to specify an infinite retry count.
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_retries
+# Deprecated group/name - [DATABASE]/sql_max_retries
+#max_retries=10
+
+# Interval between retries of opening a SQL connection.
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_retry_interval
+# Deprecated group/name - [DATABASE]/reconnect_interval
+#retry_interval=10
+
+# If set, use this value for max_overflow with SQLAlchemy.
+# (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_overflow
+# Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow
+#max_overflow=<None>
+
+# Verbosity of SQL debugging information: 0=None,
+# 100=Everything. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_connection_debug
+#connection_debug=0
+
+# Add Python stack traces to SQL as comment strings. (boolean
+# value)
+# Deprecated group/name - [DEFAULT]/sql_connection_trace
+#connection_trace=false
+
+# If set, use this value for pool_timeout with SQLAlchemy.
+# (integer value)
+# Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout
+#pool_timeout=<None>
+
+# Enable the experimental use of database reconnect on
+# connection lost. (boolean value)
+#use_db_reconnect=false
+
+# Seconds between retries of a database transaction. (integer
+# value)
+#db_retry_interval=1
+
+# If True, increases the interval between retries of a
+# database operation up to db_max_retry_interval. (boolean
+# value)
+#db_inc_retry_interval=true
+
+# If db_inc_retry_interval is set, the maximum seconds between
+# retries of a database operation. (integer value)
+#db_max_retry_interval=10
+
+# Maximum retries in case of connection error or deadlock
+# error before error is raised. Set to -1 to specify an
+# infinite retry count. (integer value)
+#db_max_retries=20
+
+
+#
+# Options defined in ironic.db.sqlalchemy.models
+#
+
+# MySQL engine to use. (string value)
+#mysql_engine=InnoDB
+
+
+[deploy]
+
+#
+# Options defined in ironic.drivers.modules.deploy_utils
+#
+
+# Size of EFI system partition in MiB when configuring UEFI
+# systems for local boot. (integer value)
+#efi_system_partition_size=200
+
+# Block size to use when writing to the nodes disk. (string
+# value)
+#dd_block_size=1M
+
+# Maximum attempts to verify an iSCSI connection is active,
+# sleeping 1 second between attempts. (integer value)
+#iscsi_verify_attempts=3
+
+
+[dhcp]
+
+#
+# Options defined in ironic.common.dhcp_factory
+#
+
+# DHCP provider to use. "neutron" uses Neutron, and "none"
+# uses a no-op provider. (string value)
+#dhcp_provider=neutron
+
+
+[discoverd]
+
+#
+# Options defined in ironic.drivers.modules.discoverd
+#
+
+# whether to enable inspection using ironic-discoverd (boolean
+# value)
+#enabled=false
+
+# ironic-discoverd HTTP endpoint. If this is not set, the
+# ironic-discoverd client default (http://127.0.0.1:5050) will
+# be used. (string value)
+#service_url=<None>
+
+# period (in seconds) to check status of nodes on inspection
+# (integer value)
+#status_check_period=60
+
+
+[disk_partitioner]
+
+#
+# Options defined in ironic.common.disk_partitioner
+#
+
+# After Ironic has completed creating the partition table, it
+# continues to check for activity on the attached iSCSI device
+# status at this interval prior to copying the image to the
+# node, in seconds (integer value)
+#check_device_interval=1
+
+# The maximum number of times to check that the device is not
+# accessed by another process. If the device is still busy
+# after that, the disk partitioning will be treated as having
+# failed. (integer value)
+#check_device_max_retries=20
+
+
+[glance]
+
+#
+# Options defined in ironic.common.glance_service.v2.image_service
+#
+
+# A list of URL schemes that can be downloaded directly via
+# the direct_url. Currently supported schemes: [file]. (list
+# value)
+#allowed_direct_url_schemes=
+
+# The secret token given to Swift to allow temporary URL
+# downloads. Required for temporary URLs. (string value)
+#swift_temp_url_key=<None>
+
+# The length of time in seconds that the temporary URL will be
+# valid for. Defaults to 20 minutes. If some deploys get a 401
+# response code when trying to download from the temporary
+# URL, try raising this duration. (integer value)
+#swift_temp_url_duration=1200
+
+# The "endpoint" (scheme, hostname, optional port) for the
+# Swift URL of the form
+# "endpoint_url/api_version/account/container/object_id". Do
+# not include trailing "/". For example, use
+# "https://swift.example.com". Required for temporary URLs.
+# (string value)
+#swift_endpoint_url=<None>
+
+# The Swift API version to create a temporary URL for.
+# Defaults to "v1". Swift temporary URL format:
+# "endpoint_url/api_version/account/container/object_id"
+# (string value)
+#swift_api_version=v1
+
+# The account that Glance uses to communicate with Swift. The
+# format is "AUTH_uuid". "uuid" is the UUID for the account
+# configured in the glance-api.conf. Required for temporary
+# URLs. For example:
+# "AUTH_a422b2-91f3-2f46-74b7-d7c9e8958f5d30". Swift temporary
+# URL format:
+# "endpoint_url/api_version/account/container/object_id"
+# (string value)
+#swift_account=<None>
+
+# The Swift container Glance is configured to store its images
+# in. Defaults to "glance", which is the default in glance-
+# api.conf. Swift temporary URL format:
+# "endpoint_url/api_version/account/container/object_id"
+# (string value)
+#swift_container=glance
+
+# This should match a config by the same name in the Glance
+# configuration file. When set to 0, a single-tenant store
+# will only use one container to store all images. When set to
+# an integer value between 1 and 32, a single-tenant store
+# will use multiple containers to store images, and this value
+# will determine how many containers are created. (integer
+# value)
+#swift_store_multiple_containers_seed=0
+
+
+#
+# Options defined in ironic.common.image_service
+#
+
+# Default glance hostname or IP address. (string value)
+glance_host = {{ CONTROLLER_HOST_ADDRESS }}
+
+# Default glance port. (integer value)
+#glance_port=9292
+
+# Default protocol to use when connecting to glance. Set to
+# https for SSL. (string value)
+#glance_protocol=http
+
+# A list of the glance api servers available to ironic. Prefix
+# with https:// for SSL-based glance API servers. Format is
+# [hostname|IP]:port. (list value)
+#glance_api_servers=<None>
+
+# Allow to perform insecure SSL (https) requests to glance.
+# (boolean value)
+#glance_api_insecure=false
+
+# Number of retries when downloading an image from glance.
+# (integer value)
+#glance_num_retries=0
+
+# Authentication strategy to use when connecting to glance.
+# Only "keystone" and "noauth" are currently supported by
+# ironic. (string value)
+#auth_strategy=keystone
+
+
+[ilo]
+
+#
+# Options defined in ironic.drivers.modules.ilo.common
+#
+
+# Timeout (in seconds) for iLO operations (integer value)
+#client_timeout=60
+
+# Port to be used for iLO operations (integer value)
+#client_port=443
+
+# The Swift iLO container to store data. (string value)
+#swift_ilo_container=ironic_ilo_container
+
+# Amount of time in seconds for Swift objects to auto-expire.
+# (integer value)
+#swift_object_expiry_timeout=900
+
+
+#
+# Options defined in ironic.drivers.modules.ilo.deploy
+#
+
+# Priority for erase devices clean step. If unset, it defaults
+# to 10. If set to 0, the step will be disabled and will not
+# run during cleaning. (integer value)
+#clean_priority_erase_devices=<None>
+
+
+#
+# Options defined in ironic.drivers.modules.ilo.management
+#
+
+# Priority for reset_ilo clean step. (integer value)
+#clean_priority_reset_ilo=1
+
+# Priority for reset_bios_to_default clean step. (integer
+# value)
+#clean_priority_reset_bios_to_default=10
+
+# Priority for reset_secure_boot_keys clean step. This step
+# will reset the secure boot keys to manufacturing defaults.
+# (integer value)
+#clean_priority_reset_secure_boot_keys_to_default=20
+
+# Priority for clear_secure_boot_keys clean step. This step is
+# not enabled by default. It can be enabled to to clear all
+# secure boot keys enrolled with iLO. (integer value)
+#clean_priority_clear_secure_boot_keys=0
+
+# Priority for reset_ilo_credential clean step. This step
+# requires "ilo_change_password" parameter to be updated in
+# nodes's driver_info with the new password. (integer value)
+#clean_priority_reset_ilo_credential=30
+
+
+#
+# Options defined in ironic.drivers.modules.ilo.power
+#
+
+# Number of times a power operation needs to be retried
+# (integer value)
+#power_retry=6
+
+# Amount of time in seconds to wait in between power
+# operations (integer value)
+#power_wait=2
+
+
+[ipmi]
+
+#
+# Options defined in ironic.drivers.modules.ipminative
+#
+
+# Maximum time in seconds to retry IPMI operations. There is a
+# tradeoff when setting this value. Setting this too low may
+# cause older BMCs to crash and require a hard reset. However,
+# setting too high can cause the sync power state periodic
+# task to hang when there are slow or unresponsive BMCs.
+# (integer value)
+#retry_timeout=60
+
+# Minimum time, in seconds, between IPMI operations sent to a
+# server. There is a risk with some hardware that setting this
+# too low may cause the BMC to crash. Recommended setting is 5
+# seconds. (integer value)
+#min_command_interval=5
+
+
+[irmc]
+
+#
+# Options defined in ironic.drivers.modules.irmc.common
+#
+
+# Port to be used for iRMC operations, either 80 or 443
+# (integer value)
+#port=443
+
+# Authentication method to be used for iRMC operations, either
+# "basic" or "digest" (string value)
+#auth_method=basic
+
+# Timeout (in seconds) for iRMC operations (integer value)
+#client_timeout=60
+
+# Sensor data retrieval method, either "ipmitool" or "scci"
+# (string value)
+#sensor_method=ipmitool
+
+
+[keystone]
+
+#
+# Options defined in ironic.common.keystone
+#
+
+# The region used for getting endpoints of OpenStackservices.
+# (string value)
+#region_name=<None>
+
+
+[keystone_authtoken]
+
+#
+# Options defined in keystonemiddleware.auth_token
+#
+
+# Complete public Identity API endpoint. (string value)
+auth_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:5000/v2.0
+
+# API version of the admin Identity API endpoint. (string
+# value)
+#auth_version=<None>
+
+# Do not handle authorization requests within the middleware,
+# but delegate the authorization decision to downstream WSGI
+# components. (boolean value)
+#delay_auth_decision=false
+
+# Request timeout value for communicating with Identity API
+# server. (integer value)
+#http_connect_timeout=<None>
+
+# How many times are we trying to reconnect when communicating
+# with Identity API Server. (integer value)
+#http_request_max_retries=3
+
+# Env key for the swift cache. (string value)
+#cache=<None>
+
+# Required if identity server requires client certificate
+# (string value)
+#certfile=<None>
+
+# Required if identity server requires client certificate
+# (string value)
+#keyfile=<None>
+
+# A PEM encoded Certificate Authority to use when verifying
+# HTTPs connections. Defaults to system CAs. (string value)
+#cafile=<None>
+
+# Verify HTTPS connections. (boolean value)
+#insecure=false
+
+# Directory used to cache files related to PKI tokens. (string
+# value)
+#signing_dir=<None>
+
+# Optionally specify a list of memcached server(s) to use for
+# caching. If left undefined, tokens will instead be cached
+# in-process. (list value)
+# Deprecated group/name - [DEFAULT]/memcache_servers
+#memcached_servers=<None>
+
+# In order to prevent excessive effort spent validating
+# tokens, the middleware caches previously-seen tokens for a
+# configurable duration (in seconds). Set to -1 to disable
+# caching completely. (integer value)
+#token_cache_time=300
+
+# Determines the frequency at which the list of revoked tokens
+# is retrieved from the Identity service (in seconds). A high
+# number of revocation events combined with a low cache
+# duration may significantly reduce performance. (integer
+# value)
+#revocation_cache_time=10
+
+# (Optional) If defined, indicate whether token data should be
+# authenticated or authenticated and encrypted. Acceptable
+# values are MAC or ENCRYPT. If MAC, token data is
+# authenticated (with HMAC) in the cache. If ENCRYPT, token
+# data is encrypted and authenticated in the cache. If the
+# value is not one of these options or empty, auth_token will
+# raise an exception on initialization. (string value)
+#memcache_security_strategy=<None>
+
+# (Optional, mandatory if memcache_security_strategy is
+# defined) This string is used for key derivation. (string
+# value)
+#memcache_secret_key=<None>
+
+# (Optional) Number of seconds memcached server is considered
+# dead before it is tried again. (integer value)
+#memcache_pool_dead_retry=300
+
+# (Optional) Maximum total number of open connections to every
+# memcached server. (integer value)
+#memcache_pool_maxsize=10
+
+# (Optional) Socket timeout in seconds for communicating with
+# a memcache server. (integer value)
+#memcache_pool_socket_timeout=3
+
+# (Optional) Number of seconds a connection to memcached is
+# held unused in the pool before it is closed. (integer value)
+#memcache_pool_unused_timeout=60
+
+# (Optional) Number of seconds that an operation will wait to
+# get a memcache client connection from the pool. (integer
+# value)
+#memcache_pool_conn_get_timeout=10
+
+# (Optional) Use the advanced (eventlet safe) memcache client
+# pool. The advanced pool will only work under python 2.x.
+# (boolean value)
+#memcache_use_advanced_pool=false
+
+# (Optional) Indicate whether to set the X-Service-Catalog
+# header. If False, middleware will not ask for service
+# catalog on token validation and will not set the X-Service-
+# Catalog header. (boolean value)
+#include_service_catalog=true
+
+# Used to control the use and type of token binding. Can be
+# set to: "disabled" to not check token binding. "permissive"
+# (default) to validate binding information if the bind type
+# is of a form known to the server and ignore it if not.
+# "strict" like "permissive" but if the bind type is unknown
+# the token will be rejected. "required" any form of token
+# binding is needed to be allowed. Finally the name of a
+# binding method that must be present in tokens. (string
+# value)
+#enforce_token_bind=permissive
+
+# If true, the revocation list will be checked for cached
+# tokens. This requires that PKI tokens are configured on the
+# identity server. (boolean value)
+#check_revocations_for_cached=false
+
+# Hash algorithms to use for hashing PKI tokens. This may be a
+# single algorithm or multiple. The algorithms are those
+# supported by Python standard hashlib.new(). The hashes will
+# be tried in the order given, so put the preferred one first
+# for performance. The result of the first hash will be stored
+# in the cache. This will typically be set to multiple values
+# only while migrating from a less secure algorithm to a more
+# secure one. Once all the old tokens are expired this option
+# should be set to a single value for better performance.
+# (list value)
+#hash_algorithms=md5
+
+# Prefix to prepend at the beginning of the path. Deprecated,
+# use identity_uri. (string value)
+#auth_admin_prefix=
+
+# Host providing the admin Identity API endpoint. Deprecated,
+# use identity_uri. (string value)
+#auth_host=127.0.0.1
+
+# Port of the admin Identity API endpoint. Deprecated, use
+# identity_uri. (integer value)
+#auth_port=35357
+
+# Protocol of the admin Identity API endpoint (http or https).
+# Deprecated, use identity_uri. (string value)
+#auth_protocol=https
+
+# Complete admin Identity API endpoint. This should specify
+# the unversioned root endpoint e.g. https://localhost:35357/
+# (string value)
+identity_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:35357
+
+# This option is deprecated and may be removed in a future
+# release. Single shared secret with the Keystone
+# configuration used for bootstrapping a Keystone
+# installation, or otherwise bypassing the normal
+# authentication process. This option should not be used, use
+# `admin_user` and `admin_password` instead. (string value)
+#admin_token=<None>
+
+# Service username. (string value)
+admin_user = {{ IRONIC_SERVICE_USER }}
+
+# Service user password. (string value)
+admin_password = {{ IRONIC_SERVICE_PASSWORD }}
+
+# Service tenant name. (string value)
+admin_tenant_name=service
+
+
+[matchmaker_redis]
+
+#
+# Options defined in oslo.messaging
+#
+
+# Host to locate redis. (string value)
+#host=127.0.0.1
+
+# Use this port to connect to redis host. (integer value)
+#port=6379
+
+# Password for Redis server (optional). (string value)
+#password=<None>
+
+
+[matchmaker_ring]
+
+#
+# Options defined in oslo.messaging
+#
+
+# Matchmaker ring file (JSON). (string value)
+# Deprecated group/name - [DEFAULT]/matchmaker_ringfile
+#ringfile=/etc/oslo/matchmaker_ring.json
+
+
+[neutron]
+
+#
+# Options defined in ironic.dhcp.neutron
+#
+
+# URL for connecting to neutron. (string value)
+url = http://{{ CONTROLLER_HOST_ADDRESS }}:9696
+
+# Timeout value for connecting to neutron in seconds. (integer
+# value)
+#url_timeout=30
+
+# Client retries in the case of a failed request. (integer
+# value)
+#retries=3
+
+# Default authentication strategy to use when connecting to
+# neutron. Can be either "keystone" or "noauth". Running
+# neutron in noauth mode (related to but not affected by this
+# setting) is insecure and should only be used for testing.
+# (string value)
+#auth_strategy=keystone
+
+# UUID of the network to create Neutron ports on when booting
+# to a ramdisk for cleaning/zapping using Neutron DHCP (string
+# value)
+#cleaning_network_uuid=<None>
+
+
+[oslo_concurrency]
+
+#
+# Options defined in oslo.concurrency
+#
+
+# Enables or disables inter-process locks. (boolean value)
+#disable_process_locking=false
+
+# Directory to use for lock files. For security, the
+# specified directory should only be writable by the user
+# running the processes that need locking. Defaults to
+# environment variable OSLO_LOCK_PATH. If external locks are
+# used, a lock path must be set. (string value)
+#lock_path=<None>
+
+
+[oslo_messaging_amqp]
+
+#
+# Options defined in oslo.messaging
+#
+
+# address prefix used when sending to a specific server
+# (string value)
+#server_request_prefix=exclusive
+
+# address prefix used when broadcasting to all servers (string
+# value)
+#broadcast_prefix=broadcast
+
+# address prefix when sending to any server in group (string
+# value)
+#group_request_prefix=unicast
+
+# Name for the AMQP container (string value)
+#container_name=<None>
+
+# Timeout for inactive connections (in seconds) (integer
+# value)
+#idle_timeout=0
+
+# Debug: dump AMQP frames to stdout (boolean value)
+#trace=false
+
+# CA certificate PEM file for verifing server certificate
+# (string value)
+#ssl_ca_file=
+
+# Identifying certificate PEM file to present to clients
+# (string value)
+#ssl_cert_file=
+
+# Private key PEM file used to sign cert_file certificate
+# (string value)
+#ssl_key_file=
+
+# Password for decrypting ssl_key_file (if encrypted) (string
+# value)
+#ssl_key_password=<None>
+
+# Accept clients using either SSL or plain TCP (boolean value)
+#allow_insecure_clients=false
+
+
+[oslo_messaging_qpid]
+
+#
+# Options defined in oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+#amqp_durable_queues=false
+
+# Auto-delete queues in AMQP. (boolean value)
+#amqp_auto_delete=false
+
+# Size of RPC connection pool. (integer value)
+#rpc_conn_pool_size=30
+
+# Qpid broker hostname. (string value)
+#qpid_hostname=localhost
+
+# Qpid broker port. (integer value)
+#qpid_port=5672
+
+# Qpid HA cluster host:port pairs. (list value)
+#qpid_hosts=$qpid_hostname:$qpid_port
+
+# Username for Qpid connection. (string value)
+#qpid_username=
+
+# Password for Qpid connection. (string value)
+#qpid_password=
+
+# Space separated list of SASL mechanisms to use for auth.
+# (string value)
+#qpid_sasl_mechanisms=
+
+# Seconds between connection keepalive heartbeats. (integer
+# value)
+#qpid_heartbeat=60
+
+# Transport to use, either 'tcp' or 'ssl'. (string value)
+#qpid_protocol=tcp
+
+# Whether to disable the Nagle algorithm. (boolean value)
+#qpid_tcp_nodelay=true
+
+# The number of prefetched messages held by receiver. (integer
+# value)
+#qpid_receiver_capacity=1
+
+# The qpid topology version to use. Version 1 is what was
+# originally used by impl_qpid. Version 2 includes some
+# backwards-incompatible changes that allow broker federation
+# to work. Users should update to version 2 when they are
+# able to take everything down, as it requires a clean break.
+# (integer value)
+#qpid_topology_version=1
+
+
+[oslo_messaging_rabbit]
+
+#
+# Options defined in oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+#amqp_durable_queues=false
+
+# Auto-delete queues in AMQP. (boolean value)
+#amqp_auto_delete=false
+
+# Size of RPC connection pool. (integer value)
+#rpc_conn_pool_size=30
+
+# SSL version to use (valid only if SSL enabled). Valid values
+# are TLSv1 and SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may
+# be available on some distributions. (string value)
+#kombu_ssl_version=
+
+# SSL key file (valid only if SSL enabled). (string value)
+#kombu_ssl_keyfile=
+
+# SSL cert file (valid only if SSL enabled). (string value)
+#kombu_ssl_certfile=
+
+# SSL certification authority file (valid only if SSL
+# enabled). (string value)
+#kombu_ssl_ca_certs=
+
+# How long to wait before reconnecting in response to an AMQP
+# consumer cancel notification. (floating point value)
+#kombu_reconnect_delay=1.0
+
+# The RabbitMQ broker address where a single node is used.
+# (string value)
+rabbit_host = {{ RABBITMQ_HOST }}
+
+# The RabbitMQ broker port where a single node is used.
+# (integer value)
+rabbit_port = {{ RABBITMQ_PORT }}
+
+# RabbitMQ HA cluster host:port pairs. (list value)
+#rabbit_hosts=$rabbit_host:$rabbit_port
+
+# Connect over SSL for RabbitMQ. (boolean value)
+#rabbit_use_ssl=false
+
+# The RabbitMQ userid. (string value)
+rabbit_userid = {{ RABBITMQ_USER }}
+
+# The RabbitMQ password. (string value)
+rabbit_password = {{ RABBITMQ_PASSWORD }}
+
+# The RabbitMQ login method. (string value)
+#rabbit_login_method=AMQPLAIN
+
+# The RabbitMQ virtual host. (string value)
+#rabbit_virtual_host=/
+
+# How frequently to retry connecting with RabbitMQ. (integer
+# value)
+#rabbit_retry_interval=1
+
+# How long to backoff for between retries when connecting to
+# RabbitMQ. (integer value)
+#rabbit_retry_backoff=2
+
+# Maximum number of RabbitMQ connection retries. Default is 0
+# (infinite retry count). (integer value)
+#rabbit_max_retries=0
+
+# Use HA queues in RabbitMQ (x-ha-policy: all). If you change
+# this option, you must wipe the RabbitMQ database. (boolean
+# value)
+#rabbit_ha_queues=false
+
+# Number of seconds after which the Rabbit broker is
+# considered down if heartbeat's keep-alive fails (0 disable
+# the heartbeat). (integer value)
+#heartbeat_timeout_threshold=60
+
+# How often times during the heartbeat_timeout_threshold we
+# check the heartbeat. (integer value)
+#heartbeat_rate=2
+
+# Deprecated, use rpc_backend=kombu+memory or rpc_backend=fake
+# (boolean value)
+#fake_rabbit=false
+
+
+[oslo_policy]
+
+#
+# Options defined in oslo.policy
+#
+
+# The JSON file that defines policies. (string value)
+#policy_file=policy.json
+
+# Default rule. Enforced when a requested rule is not found.
+# (string value)
+#policy_default_rule=default
+
+# Directories where policy configuration files are stored.
+# They can be relative to any directory in the search path
+# defined by the config_dir option, or absolute paths. The
+# file defined by policy_file must exist for these directories
+# to be searched. Missing or empty directories are ignored.
+# (multi valued)
+#policy_dirs=policy.d
+
+
+[pxe]
+
+#
+# Options defined in ironic.drivers.modules.iscsi_deploy
+#
+
+# Additional append parameters for baremetal PXE boot. (string
+# value)
+#pxe_append_params=nofb nomodeset vga=normal
+
+# Default file system format for ephemeral partition, if one
+# is created. (string value)
+#default_ephemeral_format=ext4
+
+# Directory where images are stored on disk. (string value)
+#images_path=/var/lib/ironic/images/
+
+# Directory where master instance images are stored on disk.
+# (string value)
+#instance_master_path=/var/lib/ironic/master_images
+
+# Maximum size (in MiB) of cache for master images, including
+# those in use. (integer value)
+#image_cache_size=20480
+
+# Maximum TTL (in minutes) for old master images in cache.
+# (integer value)
+#image_cache_ttl=10080
+
+# The disk devices to scan while doing the deploy. (string
+# value)
+#disk_devices=cciss/c0d0,sda,hda,vda
+
+
+#
+# Options defined in ironic.drivers.modules.pxe
+#
+
+# Template file for PXE configuration. (string value)
+#pxe_config_template=$pybasedir/drivers/modules/pxe_config.template
+
+# Template file for PXE configuration for UEFI boot loader.
+# (string value)
+#uefi_pxe_config_template=$pybasedir/drivers/modules/elilo_efi_pxe_config.template
+
+# IP address of Ironic compute node's tftp server. (string
+# value)
+#tftp_server=$my_ip
+
+# Ironic compute node's tftp root path. (string value)
+tftp_root=/srv/tftp_root/
+
+# Directory where master tftp images are stored on disk.
+# (string value)
+tftp_master_path=/srv/tftp_root/master_images
+
+# Bootfile DHCP parameter. (string value)
+#pxe_bootfile_name=pxelinux.0
+
+# Bootfile DHCP parameter for UEFI boot mode. (string value)
+#uefi_pxe_bootfile_name=elilo.efi
+
+# Ironic compute node's HTTP server URL. Example:
+# http://192.1.2.3:8080 (string value)
+#http_url=<None>
+
+# Ironic compute node's HTTP root path. (string value)
+#http_root=/httpboot
+
+# Enable iPXE boot. (boolean value)
+#ipxe_enabled=false
+
+# The path to the main iPXE script file. (string value)
+#ipxe_boot_script=$pybasedir/drivers/modules/boot.ipxe
+
+
+[seamicro]
+
+#
+# Options defined in ironic.drivers.modules.seamicro
+#
+
+# Maximum retries for SeaMicro operations (integer value)
+#max_retry=3
+
+# Seconds to wait for power action to be completed (integer
+# value)
+#action_timeout=10
+
+
+[snmp]
+
+#
+# Options defined in ironic.drivers.modules.snmp
+#
+
+# Seconds to wait for power action to be completed (integer
+# value)
+#power_timeout=10
+
+
+[ssh]
+
+#
+# Options defined in ironic.drivers.modules.ssh
+#
+
+# libvirt uri (string value)
+#libvirt_uri=qemu:///system
+
+
+[swift]
+
+#
+# Options defined in ironic.common.swift
+#
+
+# Maximum number of times to retry a Swift request, before
+# failing. (integer value)
+#swift_max_retries=2
+
+
+[virtualbox]
+
+#
+# Options defined in ironic.drivers.modules.virtualbox
+#
+
+# Port on which VirtualBox web service is listening. (integer
+# value)
+#port=18083
+
+
diff --git a/install-files/openstack/usr/share/openstack/iscsi.yml b/install-files/openstack/usr/share/openstack/iscsi.yml
new file mode 100644
index 00000000..b80377ae
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/iscsi.yml
@@ -0,0 +1,15 @@
+---
+- hosts: localhost
+ tasks:
+ - name: Update kernel module dependencies
+ command: depmod -a
+
+ - name: generate InitiatorName for iscsi
+ shell: iscsi-iname
+ register: initiator_name
+
+ - lineinfile:
+ dest: /etc/iscsi/initiatorname.iscsi
+ regexp: '^InitiatorName=$'
+ line: 'InitiatorName={{ initiator_name.stdout }}'
+ backrefs: yes
diff --git a/install-files/openstack/usr/share/openstack/keystone.yml b/install-files/openstack/usr/share/openstack/keystone.yml
new file mode 100644
index 00000000..2fae4e98
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/keystone.yml
@@ -0,0 +1,142 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/keystone.conf"
+ tasks:
+
+ # RabbitMQ configuration, this may end up in a different playbook
+ - name: Create rabbitmq user
+ user:
+ name: rabbitmq
+ comment: Rabbitmq server daemon
+ shell: /sbin/nologin
+ home: /var/lib/rabbitmq
+
+ - name: Create the rabbitmq directories
+ file:
+ path: "{{ item }}"
+ state: directory
+ owner: rabbitmq
+ group: rabbitmq
+ with_items:
+ - /var/run/rabbitmq
+ - /var/log/rabbitmq
+ - /etc/rabbitmq
+
+ - name: Add the configuration needed for rabbitmq in /etc/rabbitmq using templates
+ template:
+ src: /usr/share/openstack/rabbitmq/{{ item }}
+ dest: /etc/rabbitmq/{{ item }}
+ owner: rabbitmq
+ group: rabbitmq
+ mode: 0644
+ with_items:
+ - rabbitmq.config
+ - rabbitmq-env.conf
+
+ - name: Enable and start rabbitmq services
+ service:
+ name: "{{ item }}"
+ enabled: yes
+ state: started
+ with_items:
+ - rabbitmq-server
+
+ # Keystone configuration
+ - name: Create the keystone user.
+ user:
+ name: keystone
+ comment: Openstack Keystone Daemons
+ shell: /sbin/nologin
+ home: /var/lib/keystone
+
+ - name: Create the /var folders for keystone
+ file:
+ path: "{{ item }}"
+ state: directory
+ owner: keystone
+ group: keystone
+ with_items:
+ - /var/run/keystone
+ - /var/lock/keystone
+ - /var/log/keystone
+ - /var/lib/keystone
+
+ - name: Create /etc/keystone directory
+ file:
+ path: /etc/keystone
+ state: directory
+
+ - name: Add the configuration needed for keystone in /etc using templates
+ template:
+ src: /usr/share/openstack/keystone/{{ item }}
+ dest: /etc/keystone/{{ item }}
+ with_lines:
+ - cd /usr/share/openstack/keystone && find -type f
+
+ - name: Create postgresql user for keystone
+ postgresql_user:
+ name: "{{ KEYSTONE_DB_USER }}"
+ password: "{{ KEYSTONE_DB_PASSWORD }}"
+ sudo: yes
+ sudo_user: keystone
+
+ - name: Create database for keystone services
+ postgresql_db:
+ name: keystone
+ owner: "{{ KEYSTONE_DB_USER }}"
+ sudo: yes
+ sudo_user: keystone
+
+ - name: Initiate keystone database
+ command: keystone-manage db_sync
+ sudo: yes
+ sudo_user: keystone
+
+ - name: Enable and start openstack-keystone service
+ service:
+ name: openstack-keystone.service
+ enabled: yes
+ state: started
+
+ - name: Create admin tenant
+ keystone_user:
+ tenant: admin
+ tenant_description: Admin Tenant
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+ endpoint: http://{{ CONTROLLER_HOST_ADDRESS }}:35357/v2.0
+
+ - name: Create admin user for the admin tenant
+ keystone_user:
+ user: admin
+ tenant: admin
+ password: "{{ KEYSTONE_ADMIN_PASSWORD }}"
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+ endpoint: http://{{ CONTROLLER_HOST_ADDRESS }}:35357/v2.0
+
+ - name: Create admin role for admin user in the admin tenant
+ keystone_user:
+ role: admin
+ user: admin
+ tenant: admin
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+ endpoint: http://{{ CONTROLLER_HOST_ADDRESS }}:35357/v2.0
+
+ - name: Create service tenant
+ keystone_user:
+ tenant: service
+ tenant_description: Service Tenant
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+ endpoint: http://{{ CONTROLLER_HOST_ADDRESS }}:35357/v2.0
+
+ - name: Add keystone endpoint
+ keystone_service:
+ name: keystone
+ type: identity
+ description: Keystone Identity Service
+ publicurl: http://{{ ansible_hostname }}:5000/v2.0
+ internalurl: http://{{ CONTROLLER_HOST_ADDRESS }}:5000/v2.0
+ adminurl: http://{{ ansible_hostname }}:35357/v2.0
+ region: regionOne
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+ endpoint: http://{{ CONTROLLER_HOST_ADDRESS }}:35357/v2.0
diff --git a/install-files/openstack/usr/share/openstack/keystone/keystone.conf b/install-files/openstack/usr/share/openstack/keystone/keystone.conf
new file mode 100644
index 00000000..1a082601
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/keystone/keystone.conf
@@ -0,0 +1,1733 @@
+[DEFAULT]
+
+#
+# From keystone
+#
+
+# A "shared secret" that can be used to bootstrap Keystone. This "token" does
+# not represent a user, and carries no explicit authorization. To disable in
+# production (highly recommended), remove AdminTokenAuthMiddleware from your
+# paste application pipelines (for example, in keystone-paste.ini). (string
+# value)
+admin_token = {{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}
+
+# (Deprecated) The port which the OpenStack Compute service listens on. This
+# option was only used for string replacement in the templated catalog backend.
+# Templated catalogs should replace the "$(compute_port)s" substitution with
+# the static port of the compute service. As of Juno, this option is deprecated
+# and will be removed in the L release. (integer value)
+#compute_port = 8774
+
+# The base public endpoint URL for Keystone that is advertised to clients
+# (NOTE: this does NOT affect how Keystone listens for connections). Defaults
+# to the base host URL of the request. E.g. a request to
+# http://server:5000/v3/users will default to http://server:5000. You should
+# only need to set this value if the base URL contains a path (e.g. /prefix/v3)
+# or the endpoint should be found on a different server. (string value)
+#public_endpoint = <None>
+
+# The base admin endpoint URL for Keystone that is advertised to clients (NOTE:
+# this does NOT affect how Keystone listens for connections). Defaults to the
+# base host URL of the request. E.g. a request to http://server:35357/v3/users
+# will default to http://server:35357. You should only need to set this value
+# if the base URL contains a path (e.g. /prefix/v3) or the endpoint should be
+# found on a different server. (string value)
+#admin_endpoint = <None>
+
+# Maximum depth of the project hierarchy. WARNING: setting it to a large value
+# may adversely impact performance. (integer value)
+#max_project_tree_depth = 5
+
+# Limit the sizes of user & project ID/names. (integer value)
+#max_param_size = 64
+
+# Similar to max_param_size, but provides an exception for token values.
+# (integer value)
+#max_token_size = 8192
+
+# Similar to the member_role_name option, this represents the default role ID
+# used to associate users with their default projects in the v2 API. This will
+# be used as the explicit role where one is not specified by the v2 API.
+# (string value)
+#member_role_id = 9fe2ff9ee4384b1894a90878d3e92bab
+
+# This is the role name used in combination with the member_role_id option; see
+# that option for more detail. (string value)
+#member_role_name = _member_
+
+# The value passed as the keyword "rounds" to passlib's encrypt method.
+# (integer value)
+#crypt_strength = 40000
+
+# The maximum number of entities that will be returned in a collection, with no
+# limit set by default. This global limit may be then overridden for a specific
+# driver, by specifying a list_limit in the appropriate section (e.g.
+# [assignment]). (integer value)
+#list_limit = <None>
+
+# Set this to false if you want to enable the ability for user, group and
+# project entities to be moved between domains by updating their domain_id.
+# Allowing such movement is not recommended if the scope of a domain admin is
+# being restricted by use of an appropriate policy file (see
+# policy.v3cloudsample as an example). (boolean value)
+#domain_id_immutable = true
+
+# If set to true, strict password length checking is performed for password
+# manipulation. If a password exceeds the maximum length, the operation will
+# fail with an HTTP 403 Forbidden error. If set to false, passwords are
+# automatically truncated to the maximum length. (boolean value)
+#strict_password_check = false
+
+# The HTTP header used to determine the scheme for the original request, even
+# if it was removed by an SSL terminating proxy. Typical value is
+# "HTTP_X_FORWARDED_PROTO". (string value)
+#secure_proxy_ssl_header = <None>
+
+#
+# From keystone.notifications
+#
+
+# Default publisher_id for outgoing notifications (string value)
+#default_publisher_id = <None>
+
+# Define the notification format for Identity Service events. A "basic"
+# notification has information about the resource being operated on. A "cadf"
+# notification has the same information, as well as information about the
+# initiator of the event. Valid options are: basic and cadf (string value)
+#notification_format = basic
+
+#
+# From keystone.openstack.common.eventlet_backdoor
+#
+
+# Enable eventlet backdoor. Acceptable values are 0, <port>, and
+# <start>:<end>, where 0 results in listening on a random tcp port number;
+# <port> results in listening on the specified port number (and not enabling
+# backdoor if that port is in use); and <start>:<end> results in listening on
+# the smallest unused port number within the specified range of port numbers.
+# The chosen port is displayed in the service's log file. (string value)
+#backdoor_port = <None>
+
+#
+# From oslo.log
+#
+
+# Print debugging output (set logging level to DEBUG instead of default WARNING
+# level). (boolean value)
+#debug = false
+
+# Print more verbose output (set logging level to INFO instead of default
+# WARNING level). (boolean value)
+#verbose = false
+
+# The name of a logging configuration file. This file is appended to any
+# existing logging configuration files. For details about logging configuration
+# files, see the Python logging module documentation. (string value)
+# Deprecated group/name - [DEFAULT]/log_config
+#log_config_append = <None>
+
+# DEPRECATED. A logging.Formatter log message format string which may use any
+# of the available logging.LogRecord attributes. This option is deprecated.
+# Please use logging_context_format_string and logging_default_format_string
+# instead. (string value)
+#log_format = <None>
+
+# Format string for %%(asctime)s in log records. Default: %(default)s . (string
+# value)
+#log_date_format = %Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to output to. If no default is set, logging will
+# go to stdout. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file = <None>
+
+# (Optional) The base directory used for relative --log-file paths. (string
+# value)
+# Deprecated group/name - [DEFAULT]/logdir
+#log_dir = <None>
+
+# Use syslog for logging. Existing syslog format is DEPRECATED during I, and
+# will change in J to honor RFC5424. (boolean value)
+#use_syslog = false
+
+# (Optional) Enables or disables syslog rfc5424 format for logging. If enabled,
+# prefixes the MSG part of the syslog message with APP-NAME (RFC5424). The
+# format without the APP-NAME is deprecated in I, and will be removed in J.
+# (boolean value)
+#use_syslog_rfc_format = false
+
+# Syslog facility to receive log lines. (string value)
+#syslog_log_facility = LOG_USER
+
+# Log output to standard error. (boolean value)
+#use_stderr = true
+
+# Format string to use for log messages with context. (string value)
+#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages without context. (string value)
+#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Data to append to log format when level is DEBUG. (string value)
+#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format. (string value)
+#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s
+
+# List of logger=LEVEL pairs. (list value)
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN
+
+# Enables or disables publication of error events. (boolean value)
+#publish_errors = false
+
+# Enables or disables fatal status of deprecations. (boolean value)
+#fatal_deprecations = false
+
+# The format for an instance that is passed with the log message. (string
+# value)
+#instance_format = "[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log message. (string
+# value)
+#instance_uuid_format = "[instance: %(uuid)s] "
+
+#
+# From oslo.messaging
+#
+
+# ZeroMQ bind address. Should be a wildcard (*), an ethernet interface, or IP.
+# The "host" option should point or resolve to this address. (string value)
+#rpc_zmq_bind_address = *
+
+# MatchMaker driver. (string value)
+#rpc_zmq_matchmaker = oslo_messaging._drivers.matchmaker.MatchMakerLocalhost
+
+# ZeroMQ receiver listening port. (integer value)
+#rpc_zmq_port = 9501
+
+# Number of ZeroMQ contexts, defaults to 1. (integer value)
+#rpc_zmq_contexts = 1
+
+# Maximum number of ingress messages to locally buffer per topic. Default is
+# unlimited. (integer value)
+#rpc_zmq_topic_backlog = <None>
+
+# Directory for holding IPC sockets. (string value)
+#rpc_zmq_ipc_dir = /var/run/openstack
+
+# Name of this node. Must be a valid hostname, FQDN, or IP address. Must match
+# "host" option, if running Nova. (string value)
+#rpc_zmq_host = localhost
+
+# Seconds to wait before a cast expires (TTL). Only supported by impl_zmq.
+# (integer value)
+#rpc_cast_timeout = 30
+
+# Heartbeat frequency. (integer value)
+#matchmaker_heartbeat_freq = 300
+
+# Heartbeat time-to-live. (integer value)
+#matchmaker_heartbeat_ttl = 600
+
+# Size of RPC thread pool. (integer value)
+#rpc_thread_pool_size = 64
+
+# Driver or drivers to handle sending notifications. (multi valued)
+#notification_driver =
+
+# AMQP topic used for OpenStack notifications. (list value)
+# Deprecated group/name - [rpc_notifier2]/topics
+#notification_topics = notifications
+
+# Seconds to wait for a response from a call. (integer value)
+#rpc_response_timeout = 60
+
+# A URL representing the messaging driver to use and its full configuration. If
+# not set, we fall back to the rpc_backend option and driver specific
+# configuration. (string value)
+#transport_url = <None>
+
+# The messaging driver to use, defaults to rabbit. Other drivers include qpid
+# and zmq. (string value)
+rpc_backend = rabbit
+
+# The default exchange under which topics are scoped. May be overridden by an
+# exchange name specified in the transport_url option. (string value)
+#control_exchange = keystone
+
+
+[assignment]
+
+#
+# From keystone
+#
+
+# Assignment backend driver. (string value)
+#driver = <None>
+
+
+[auth]
+
+#
+# From keystone
+#
+
+# Default auth methods. (list value)
+#methods = external,password,token,oauth1
+
+# The password auth plugin module. (string value)
+#password = keystone.auth.plugins.password.Password
+
+# The token auth plugin module. (string value)
+#token = keystone.auth.plugins.token.Token
+
+# The external (REMOTE_USER) auth plugin module. (string value)
+#external = keystone.auth.plugins.external.DefaultDomain
+
+# The oAuth1.0 auth plugin module. (string value)
+#oauth1 = keystone.auth.plugins.oauth1.OAuth
+
+
+[cache]
+
+#
+# From keystone
+#
+
+# Prefix for building the configuration dictionary for the cache region. This
+# should not need to be changed unless there is another dogpile.cache region
+# with the same configuration name. (string value)
+#config_prefix = cache.keystone
+
+# Default TTL, in seconds, for any cached item in the dogpile.cache region.
+# This applies to any cached method that doesn't have an explicit cache
+# expiration time defined for it. (integer value)
+#expiration_time = 600
+
+# Dogpile.cache backend module. It is recommended that Memcache with pooling
+# (keystone.cache.memcache_pool) or Redis (dogpile.cache.redis) be used in
+# production deployments. Small workloads (single process) like devstack can
+# use the dogpile.cache.memory backend. (string value)
+#backend = keystone.common.cache.noop
+
+# Arguments supplied to the backend module. Specify this option once per
+# argument to be passed to the dogpile.cache backend. Example format:
+# "<argname>:<value>". (multi valued)
+#backend_argument =
+
+# Proxy classes to import that will affect the way the dogpile.cache backend
+# functions. See the dogpile.cache documentation on changing-backend-behavior.
+# (list value)
+#proxies =
+
+# Global toggle for all caching using the should_cache_fn mechanism. (boolean
+# value)
+#enabled = false
+
+# Extra debugging from the cache backend (cache keys, get/set/delete/etc
+# calls). This is only really useful if you need to see the specific cache-
+# backend get/set/delete calls with the keys/values. Typically this should be
+# left set to false. (boolean value)
+#debug_cache_backend = false
+
+# Memcache servers in the format of "host:port". (dogpile.cache.memcache and
+# keystone.cache.memcache_pool backends only). (list value)
+#memcache_servers = localhost:11211
+
+# Number of seconds memcached server is considered dead before it is tried
+# again. (dogpile.cache.memcache and keystone.cache.memcache_pool backends
+# only). (integer value)
+#memcache_dead_retry = 300
+
+# Timeout in seconds for every call to a server. (dogpile.cache.memcache and
+# keystone.cache.memcache_pool backends only). (integer value)
+#memcache_socket_timeout = 3
+
+# Max total number of open connections to every memcached server.
+# (keystone.cache.memcache_pool backend only). (integer value)
+#memcache_pool_maxsize = 10
+
+# Number of seconds a connection to memcached is held unused in the pool before
+# it is closed. (keystone.cache.memcache_pool backend only). (integer value)
+#memcache_pool_unused_timeout = 60
+
+# Number of seconds that an operation will wait to get a memcache client
+# connection. (integer value)
+#memcache_pool_connection_get_timeout = 10
+
+
+[catalog]
+
+#
+# From keystone
+#
+
+# Catalog template file name for use with the template catalog backend. (string
+# value)
+#template_file = default_catalog.templates
+
+# Catalog backend driver. (string value)
+#driver = keystone.catalog.backends.sql.Catalog
+
+# Toggle for catalog caching. This has no effect unless global caching is
+# enabled. (boolean value)
+#caching = true
+
+# Time to cache catalog data (in seconds). This has no effect unless global and
+# catalog caching are enabled. (integer value)
+#cache_time = <None>
+
+# Maximum number of entities that will be returned in a catalog collection.
+# (integer value)
+#list_limit = <None>
+
+
+[credential]
+
+#
+# From keystone
+#
+
+# Credential backend driver. (string value)
+#driver = keystone.credential.backends.sql.Credential
+
+
+[database]
+
+#
+# From oslo.db
+#
+
+# The file name to use with SQLite. (string value)
+# Deprecated group/name - [DEFAULT]/sqlite_db
+#sqlite_db = oslo.sqlite
+
+# If True, SQLite uses synchronous mode. (boolean value)
+# Deprecated group/name - [DEFAULT]/sqlite_synchronous
+#sqlite_synchronous = true
+
+# The back end to use for the database. (string value)
+# Deprecated group/name - [DEFAULT]/db_backend
+#backend = sqlalchemy
+
+# The SQLAlchemy connection string to use to connect to the database. (string
+# value)
+# Deprecated group/name - [DEFAULT]/sql_connection
+# Deprecated group/name - [DATABASE]/sql_connection
+# Deprecated group/name - [sql]/connection
+connection=postgresql://{{ KEYSTONE_DB_USER }}:{{ KEYSTONE_DB_PASSWORD }}@{{ CONTROLLER_HOST_ADDRESS }}/keystone
+
+# The SQLAlchemy connection string to use to connect to the slave database.
+# (string value)
+#slave_connection = <None>
+
+# The SQL mode to be used for MySQL sessions. This option, including the
+# default, overrides any server-set SQL mode. To use whatever SQL mode is set
+# by the server configuration, set this to no value. Example: mysql_sql_mode=
+# (string value)
+#mysql_sql_mode = TRADITIONAL
+
+# Timeout before idle SQL connections are reaped. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_idle_timeout
+# Deprecated group/name - [DATABASE]/sql_idle_timeout
+# Deprecated group/name - [sql]/idle_timeout
+#idle_timeout = 3600
+
+# Minimum number of SQL connections to keep open in a pool. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_min_pool_size
+# Deprecated group/name - [DATABASE]/sql_min_pool_size
+#min_pool_size = 1
+
+# Maximum number of SQL connections to keep open in a pool. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_pool_size
+# Deprecated group/name - [DATABASE]/sql_max_pool_size
+#max_pool_size = <None>
+
+# Maximum number of database connection retries during startup. Set to -1 to
+# specify an infinite retry count. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_retries
+# Deprecated group/name - [DATABASE]/sql_max_retries
+#max_retries = 10
+
+# Interval between retries of opening a SQL connection. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_retry_interval
+# Deprecated group/name - [DATABASE]/reconnect_interval
+#retry_interval = 10
+
+# If set, use this value for max_overflow with SQLAlchemy. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_overflow
+# Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow
+#max_overflow = <None>
+
+# Verbosity of SQL debugging information: 0=None, 100=Everything. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_connection_debug
+#connection_debug = 0
+
+# Add Python stack traces to SQL as comment strings. (boolean value)
+# Deprecated group/name - [DEFAULT]/sql_connection_trace
+#connection_trace = false
+
+# If set, use this value for pool_timeout with SQLAlchemy. (integer value)
+# Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout
+#pool_timeout = <None>
+
+# Enable the experimental use of database reconnect on connection lost.
+# (boolean value)
+#use_db_reconnect = false
+
+# Seconds between retries of a database transaction. (integer value)
+#db_retry_interval = 1
+
+# If True, increases the interval between retries of a database operation up to
+# db_max_retry_interval. (boolean value)
+#db_inc_retry_interval = true
+
+# If db_inc_retry_interval is set, the maximum seconds between retries of a
+# database operation. (integer value)
+#db_max_retry_interval = 10
+
+# Maximum retries in case of connection error or deadlock error before error is
+# raised. Set to -1 to specify an infinite retry count. (integer value)
+#db_max_retries = 20
+
+
+[domain_config]
+
+#
+# From keystone
+#
+
+# Domain config backend driver. (string value)
+#driver = keystone.resource.config_backends.sql.DomainConfig
+
+# Toggle for domain config caching. This has no effect unless global caching is
+# enabled. (boolean value)
+#caching = true
+
+# TTL (in seconds) to cache domain config data. This has no effect unless
+# domain config caching is enabled. (integer value)
+#cache_time = 300
+
+
+[endpoint_filter]
+
+#
+# From keystone
+#
+
+# Endpoint Filter backend driver (string value)
+#driver = keystone.contrib.endpoint_filter.backends.sql.EndpointFilter
+
+# Toggle to return all active endpoints if no filter exists. (boolean value)
+#return_all_endpoints_if_no_filter = true
+
+
+[endpoint_policy]
+
+#
+# From keystone
+#
+
+# Endpoint policy backend driver (string value)
+#driver = keystone.contrib.endpoint_policy.backends.sql.EndpointPolicy
+
+
+[eventlet_server]
+
+#
+# From keystone
+#
+
+# The number of worker processes to serve the public eventlet application.
+# Defaults to number of CPUs (minimum of 2). (integer value)
+# Deprecated group/name - [DEFAULT]/public_workers
+#public_workers = <None>
+
+# The number of worker processes to serve the admin eventlet application.
+# Defaults to number of CPUs (minimum of 2). (integer value)
+# Deprecated group/name - [DEFAULT]/admin_workers
+#admin_workers = <None>
+
+# The IP address of the network interface for the public service to listen on.
+# (string value)
+# Deprecated group/name - [DEFAULT]/bind_host
+# Deprecated group/name - [DEFAULT]/public_bind_host
+#public_bind_host = 0.0.0.0
+
+# The port number which the public service listens on. (integer value)
+# Deprecated group/name - [DEFAULT]/public_port
+public_port = 5000
+
+# The IP address of the network interface for the admin service to listen on.
+# (string value)
+# Deprecated group/name - [DEFAULT]/bind_host
+# Deprecated group/name - [DEFAULT]/admin_bind_host
+#admin_bind_host = 0.0.0.0
+
+# The port number which the admin service listens on. (integer value)
+# Deprecated group/name - [DEFAULT]/admin_port
+admin_port = 35357
+
+# Set this to true if you want to enable TCP_KEEPALIVE on server sockets, i.e.
+# sockets used by the Keystone wsgi server for client connections. (boolean
+# value)
+# Deprecated group/name - [DEFAULT]/tcp_keepalive
+#tcp_keepalive = false
+
+# Sets the value of TCP_KEEPIDLE in seconds for each server socket. Only
+# applies if tcp_keepalive is true. (integer value)
+# Deprecated group/name - [DEFAULT]/tcp_keepidle
+#tcp_keepidle = 600
+
+
+[eventlet_server_ssl]
+
+#
+# From keystone
+#
+
+# Toggle for SSL support on the Keystone eventlet servers. (boolean value)
+# Deprecated group/name - [ssl]/enable
+#enable = false
+
+# Path of the certfile for SSL. For non-production environments, you may be
+# interested in using `keystone-manage ssl_setup` to generate self-signed
+# certificates. (string value)
+# Deprecated group/name - [ssl]/certfile
+#certfile = /etc/keystone/ssl/certs/keystone.pem
+
+# Path of the keyfile for SSL. (string value)
+# Deprecated group/name - [ssl]/keyfile
+#keyfile = /etc/keystone/ssl/private/keystonekey.pem
+
+# Path of the CA cert file for SSL. (string value)
+# Deprecated group/name - [ssl]/ca_certs
+#ca_certs = /etc/keystone/ssl/certs/ca.pem
+
+# Require client certificate. (boolean value)
+# Deprecated group/name - [ssl]/cert_required
+#cert_required = false
+
+
+[federation]
+
+#
+# From keystone
+#
+
+# Federation backend driver. (string value)
+#driver = keystone.contrib.federation.backends.sql.Federation
+
+# Value to be used when filtering assertion parameters from the environment.
+# (string value)
+#assertion_prefix =
+
+# Value to be used to obtain the entity ID of the Identity Provider from the
+# environment (e.g. if using the mod_shib plugin this value is `Shib-Identity-
+# Provider`). (string value)
+#remote_id_attribute = <None>
+
+# A domain name that is reserved to allow federated ephemeral users to have a
+# domain concept. Note that an admin will not be able to create a domain with
+# this name or update an existing domain to this name. You are not advised to
+# change this value unless you really have to. Changing this option to empty
+# string or None will not have any impact and default name will be used.
+# (string value)
+#federated_domain_name = Federated
+
+# A list of trusted dashboard hosts. Before accepting a Single Sign-On request
+# to return a token, the origin host must be a member of the trusted_dashboard
+# list. This configuration option may be repeated for multiple values. For
+# example: trusted_dashboard=http://acme.com trusted_dashboard=http://beta.com
+# (multi valued)
+#trusted_dashboard =
+
+# Location of Single Sign-On callback handler, will return a token to a trusted
+# dashboard host. (string value)
+#sso_callback_template = /etc/keystone/sso_callback_template.html
+
+
+[fernet_tokens]
+
+#
+# From keystone
+#
+
+# Directory containing Fernet token keys. (string value)
+#key_repository = /etc/keystone/fernet-keys/
+
+# This controls how many keys are held in rotation by keystone-manage
+# fernet_rotate before they are discarded. The default value of 3 means that
+# keystone will maintain one staged key, one primary key, and one secondary
+# key. Increasing this value means that additional secondary keys will be kept
+# in the rotation. (integer value)
+#max_active_keys = 3
+
+
+[identity]
+
+#
+# From keystone
+#
+
+# This references the domain to use for all Identity API v2 requests (which are
+# not aware of domains). A domain with this ID will be created for you by
+# keystone-manage db_sync in migration 008. The domain referenced by this ID
+# cannot be deleted on the v3 API, to prevent accidentally breaking the v2 API.
+# There is nothing special about this domain, other than the fact that it must
+# exist to order to maintain support for your v2 clients. (string value)
+#default_domain_id = default
+
+# A subset (or all) of domains can have their own identity driver, each with
+# their own partial configuration options, stored in either the resource
+# backend or in a file in a domain configuration directory (depending on the
+# setting of domain_configurations_from_database). Only values specific to the
+# domain need to be specified in this manner. This feature is disabled by
+# default; set to true to enable. (boolean value)
+#domain_specific_drivers_enabled = false
+
+# Extract the domain specific configuration options from the resource backend
+# where they have been stored with the domain data. This feature is disabled by
+# default (in which case the domain specific options will be loaded from files
+# in the domain configuration directory); set to true to enable. (boolean
+# value)
+#domain_configurations_from_database = false
+
+# Path for Keystone to locate the domain specific identity configuration files
+# if domain_specific_drivers_enabled is set to true. (string value)
+#domain_config_dir = /etc/keystone/domains
+
+# Identity backend driver. (string value)
+#driver = keystone.identity.backends.sql.Identity
+
+# Toggle for identity caching. This has no effect unless global caching is
+# enabled. (boolean value)
+#caching = true
+
+# Time to cache identity data (in seconds). This has no effect unless global
+# and identity caching are enabled. (integer value)
+#cache_time = 600
+
+# Maximum supported length for user passwords; decrease to improve performance.
+# (integer value)
+#max_password_length = 4096
+
+# Maximum number of entities that will be returned in an identity collection.
+# (integer value)
+#list_limit = <None>
+
+
+[identity_mapping]
+
+#
+# From keystone
+#
+
+# Keystone Identity Mapping backend driver. (string value)
+#driver = keystone.identity.mapping_backends.sql.Mapping
+
+# Public ID generator for user and group entities. The Keystone identity mapper
+# only supports generators that produce no more than 64 characters. (string
+# value)
+#generator = keystone.identity.id_generators.sha256.Generator
+
+# The format of user and group IDs changed in Juno for backends that do not
+# generate UUIDs (e.g. LDAP), with keystone providing a hash mapping to the
+# underlying attribute in LDAP. By default this mapping is disabled, which
+# ensures that existing IDs will not change. Even when the mapping is enabled
+# by using domain specific drivers, any users and groups from the default
+# domain being handled by LDAP will still not be mapped to ensure their IDs
+# remain backward compatible. Setting this value to False will enable the
+# mapping for even the default LDAP driver. It is only safe to do this if you
+# do not already have assignments for users and groups from the default LDAP
+# domain, and it is acceptable for Keystone to provide the different IDs to
+# clients than it did previously. Typically this means that the only time you
+# can set this value to False is when configuring a fresh installation.
+# (boolean value)
+#backward_compatible_ids = true
+
+
+[kvs]
+
+#
+# From keystone
+#
+
+# Extra dogpile.cache backend modules to register with the dogpile.cache
+# library. (list value)
+#backends =
+
+# Prefix for building the configuration dictionary for the KVS region. This
+# should not need to be changed unless there is another dogpile.cache region
+# with the same configuration name. (string value)
+#config_prefix = keystone.kvs
+
+# Toggle to disable using a key-mangling function to ensure fixed length keys.
+# This is toggle-able for debugging purposes, it is highly recommended to
+# always leave this set to true. (boolean value)
+#enable_key_mangler = true
+
+# Default lock timeout (in seconds) for distributed locking. (integer value)
+#default_lock_timeout = 5
+
+
+[ldap]
+
+#
+# From keystone
+#
+
+# URL for connecting to the LDAP server. (string value)
+#url = ldap://localhost
+
+# User BindDN to query the LDAP server. (string value)
+#user = <None>
+
+# Password for the BindDN to query the LDAP server. (string value)
+#password = <None>
+
+# LDAP server suffix (string value)
+#suffix = cn=example,cn=com
+
+# If true, will add a dummy member to groups. This is required if the
+# objectclass for groups requires the "member" attribute. (boolean value)
+#use_dumb_member = false
+
+# DN of the "dummy member" to use when "use_dumb_member" is enabled. (string
+# value)
+#dumb_member = cn=dumb,dc=nonexistent
+
+# Delete subtrees using the subtree delete control. Only enable this option if
+# your LDAP server supports subtree deletion. (boolean value)
+#allow_subtree_delete = false
+
+# The LDAP scope for queries, this can be either "one" (onelevel/singleLevel)
+# or "sub" (subtree/wholeSubtree). (string value)
+#query_scope = one
+
+# Maximum results per page; a value of zero ("0") disables paging. (integer
+# value)
+#page_size = 0
+
+# The LDAP dereferencing option for queries. This can be either "never",
+# "searching", "always", "finding" or "default". The "default" option falls
+# back to using default dereferencing configured by your ldap.conf. (string
+# value)
+#alias_dereferencing = default
+
+# Sets the LDAP debugging level for LDAP calls. A value of 0 means that
+# debugging is not enabled. This value is a bitmask, consult your LDAP
+# documentation for possible values. (integer value)
+#debug_level = <None>
+
+# Override the system's default referral chasing behavior for queries. (boolean
+# value)
+#chase_referrals = <None>
+
+# Search base for users. (string value)
+#user_tree_dn = <None>
+
+# LDAP search filter for users. (string value)
+#user_filter = <None>
+
+# LDAP objectclass for users. (string value)
+#user_objectclass = inetOrgPerson
+
+# LDAP attribute mapped to user id. WARNING: must not be a multivalued
+# attribute. (string value)
+#user_id_attribute = cn
+
+# LDAP attribute mapped to user name. (string value)
+#user_name_attribute = sn
+
+# LDAP attribute mapped to user email. (string value)
+#user_mail_attribute = mail
+
+# LDAP attribute mapped to password. (string value)
+#user_pass_attribute = userPassword
+
+# LDAP attribute mapped to user enabled flag. (string value)
+#user_enabled_attribute = enabled
+
+# Invert the meaning of the boolean enabled values. Some LDAP servers use a
+# boolean lock attribute where "true" means an account is disabled. Setting
+# "user_enabled_invert = true" will allow these lock attributes to be used.
+# This setting will have no effect if "user_enabled_mask" or
+# "user_enabled_emulation" settings are in use. (boolean value)
+#user_enabled_invert = false
+
+# Bitmask integer to indicate the bit that the enabled value is stored in if
+# the LDAP server represents "enabled" as a bit on an integer rather than a
+# boolean. A value of "0" indicates the mask is not used. If this is not set to
+# "0" the typical value is "2". This is typically used when
+# "user_enabled_attribute = userAccountControl". (integer value)
+#user_enabled_mask = 0
+
+# Default value to enable users. This should match an appropriate int value if
+# the LDAP server uses non-boolean (bitmask) values to indicate if a user is
+# enabled or disabled. If this is not set to "True" the typical value is "512".
+# This is typically used when "user_enabled_attribute = userAccountControl".
+# (string value)
+#user_enabled_default = True
+
+# List of attributes stripped off the user on update. (list value)
+#user_attribute_ignore = default_project_id,tenants
+
+# LDAP attribute mapped to default_project_id for users. (string value)
+#user_default_project_id_attribute = <None>
+
+# Allow user creation in LDAP backend. (boolean value)
+#user_allow_create = true
+
+# Allow user updates in LDAP backend. (boolean value)
+#user_allow_update = true
+
+# Allow user deletion in LDAP backend. (boolean value)
+#user_allow_delete = true
+
+# If true, Keystone uses an alternative method to determine if a user is
+# enabled or not by checking if they are a member of the
+# "user_enabled_emulation_dn" group. (boolean value)
+#user_enabled_emulation = false
+
+# DN of the group entry to hold enabled users when using enabled emulation.
+# (string value)
+#user_enabled_emulation_dn = <None>
+
+# List of additional LDAP attributes used for mapping additional attribute
+# mappings for users. Attribute mapping format is <ldap_attr>:<user_attr>,
+# where ldap_attr is the attribute in the LDAP entry and user_attr is the
+# Identity API attribute. (list value)
+#user_additional_attribute_mapping =
+
+# Search base for projects (string value)
+# Deprecated group/name - [ldap]/tenant_tree_dn
+#project_tree_dn = <None>
+
+# LDAP search filter for projects. (string value)
+# Deprecated group/name - [ldap]/tenant_filter
+#project_filter = <None>
+
+# LDAP objectclass for projects. (string value)
+# Deprecated group/name - [ldap]/tenant_objectclass
+#project_objectclass = groupOfNames
+
+# LDAP attribute mapped to project id. (string value)
+# Deprecated group/name - [ldap]/tenant_id_attribute
+#project_id_attribute = cn
+
+# LDAP attribute mapped to project membership for user. (string value)
+# Deprecated group/name - [ldap]/tenant_member_attribute
+#project_member_attribute = member
+
+# LDAP attribute mapped to project name. (string value)
+# Deprecated group/name - [ldap]/tenant_name_attribute
+#project_name_attribute = ou
+
+# LDAP attribute mapped to project description. (string value)
+# Deprecated group/name - [ldap]/tenant_desc_attribute
+#project_desc_attribute = description
+
+# LDAP attribute mapped to project enabled. (string value)
+# Deprecated group/name - [ldap]/tenant_enabled_attribute
+#project_enabled_attribute = enabled
+
+# LDAP attribute mapped to project domain_id. (string value)
+# Deprecated group/name - [ldap]/tenant_domain_id_attribute
+#project_domain_id_attribute = businessCategory
+
+# List of attributes stripped off the project on update. (list value)
+# Deprecated group/name - [ldap]/tenant_attribute_ignore
+#project_attribute_ignore =
+
+# Allow project creation in LDAP backend. (boolean value)
+# Deprecated group/name - [ldap]/tenant_allow_create
+#project_allow_create = true
+
+# Allow project update in LDAP backend. (boolean value)
+# Deprecated group/name - [ldap]/tenant_allow_update
+#project_allow_update = true
+
+# Allow project deletion in LDAP backend. (boolean value)
+# Deprecated group/name - [ldap]/tenant_allow_delete
+#project_allow_delete = true
+
+# If true, Keystone uses an alternative method to determine if a project is
+# enabled or not by checking if they are a member of the
+# "project_enabled_emulation_dn" group. (boolean value)
+# Deprecated group/name - [ldap]/tenant_enabled_emulation
+#project_enabled_emulation = false
+
+# DN of the group entry to hold enabled projects when using enabled emulation.
+# (string value)
+# Deprecated group/name - [ldap]/tenant_enabled_emulation_dn
+#project_enabled_emulation_dn = <None>
+
+# Additional attribute mappings for projects. Attribute mapping format is
+# <ldap_attr>:<user_attr>, where ldap_attr is the attribute in the LDAP entry
+# and user_attr is the Identity API attribute. (list value)
+# Deprecated group/name - [ldap]/tenant_additional_attribute_mapping
+#project_additional_attribute_mapping =
+
+# Search base for roles. (string value)
+#role_tree_dn = <None>
+
+# LDAP search filter for roles. (string value)
+#role_filter = <None>
+
+# LDAP objectclass for roles. (string value)
+#role_objectclass = organizationalRole
+
+# LDAP attribute mapped to role id. (string value)
+#role_id_attribute = cn
+
+# LDAP attribute mapped to role name. (string value)
+#role_name_attribute = ou
+
+# LDAP attribute mapped to role membership. (string value)
+#role_member_attribute = roleOccupant
+
+# List of attributes stripped off the role on update. (list value)
+#role_attribute_ignore =
+
+# Allow role creation in LDAP backend. (boolean value)
+#role_allow_create = true
+
+# Allow role update in LDAP backend. (boolean value)
+#role_allow_update = true
+
+# Allow role deletion in LDAP backend. (boolean value)
+#role_allow_delete = true
+
+# Additional attribute mappings for roles. Attribute mapping format is
+# <ldap_attr>:<user_attr>, where ldap_attr is the attribute in the LDAP entry
+# and user_attr is the Identity API attribute. (list value)
+#role_additional_attribute_mapping =
+
+# Search base for groups. (string value)
+#group_tree_dn = <None>
+
+# LDAP search filter for groups. (string value)
+#group_filter = <None>
+
+# LDAP objectclass for groups. (string value)
+#group_objectclass = groupOfNames
+
+# LDAP attribute mapped to group id. (string value)
+#group_id_attribute = cn
+
+# LDAP attribute mapped to group name. (string value)
+#group_name_attribute = ou
+
+# LDAP attribute mapped to show group membership. (string value)
+#group_member_attribute = member
+
+# LDAP attribute mapped to group description. (string value)
+#group_desc_attribute = description
+
+# List of attributes stripped off the group on update. (list value)
+#group_attribute_ignore =
+
+# Allow group creation in LDAP backend. (boolean value)
+#group_allow_create = true
+
+# Allow group update in LDAP backend. (boolean value)
+#group_allow_update = true
+
+# Allow group deletion in LDAP backend. (boolean value)
+#group_allow_delete = true
+
+# Additional attribute mappings for groups. Attribute mapping format is
+# <ldap_attr>:<user_attr>, where ldap_attr is the attribute in the LDAP entry
+# and user_attr is the Identity API attribute. (list value)
+#group_additional_attribute_mapping =
+
+# CA certificate file path for communicating with LDAP servers. (string value)
+#tls_cacertfile = <None>
+
+# CA certificate directory path for communicating with LDAP servers. (string
+# value)
+#tls_cacertdir = <None>
+
+# Enable TLS for communicating with LDAP servers. (boolean value)
+#use_tls = false
+
+# Valid options for tls_req_cert are demand, never, and allow. (string value)
+#tls_req_cert = demand
+
+# Enable LDAP connection pooling. (boolean value)
+#use_pool = false
+
+# Connection pool size. (integer value)
+#pool_size = 10
+
+# Maximum count of reconnect trials. (integer value)
+#pool_retry_max = 3
+
+# Time span in seconds to wait between two reconnect trials. (floating point
+# value)
+#pool_retry_delay = 0.1
+
+# Connector timeout in seconds. Value -1 indicates indefinite wait for
+# response. (integer value)
+#pool_connection_timeout = -1
+
+# Connection lifetime in seconds. (integer value)
+#pool_connection_lifetime = 600
+
+# Enable LDAP connection pooling for end user authentication. If use_pool is
+# disabled, then this setting is meaningless and is not used at all. (boolean
+# value)
+#use_auth_pool = false
+
+# End user auth connection pool size. (integer value)
+#auth_pool_size = 100
+
+# End user auth connection lifetime in seconds. (integer value)
+#auth_pool_connection_lifetime = 60
+
+
+[matchmaker_redis]
+
+#
+# From oslo.messaging
+#
+
+# Host to locate redis. (string value)
+#host = 127.0.0.1
+
+# Use this port to connect to redis host. (integer value)
+#port = 6379
+
+# Password for Redis server (optional). (string value)
+#password = <None>
+
+
+[matchmaker_ring]
+
+#
+# From oslo.messaging
+#
+
+# Matchmaker ring file (JSON). (string value)
+# Deprecated group/name - [DEFAULT]/matchmaker_ringfile
+#ringfile = /etc/oslo/matchmaker_ring.json
+
+
+[memcache]
+
+#
+# From keystone
+#
+
+# Memcache servers in the format of "host:port". (list value)
+#servers = localhost:11211
+
+# Number of seconds memcached server is considered dead before it is tried
+# again. This is used by the key value store system (e.g. token pooled
+# memcached persistence backend). (integer value)
+#dead_retry = 300
+
+# Timeout in seconds for every call to a server. This is used by the key value
+# store system (e.g. token pooled memcached persistence backend). (integer
+# value)
+#socket_timeout = 3
+
+# Max total number of open connections to every memcached server. This is used
+# by the key value store system (e.g. token pooled memcached persistence
+# backend). (integer value)
+#pool_maxsize = 10
+
+# Number of seconds a connection to memcached is held unused in the pool before
+# it is closed. This is used by the key value store system (e.g. token pooled
+# memcached persistence backend). (integer value)
+#pool_unused_timeout = 60
+
+# Number of seconds that an operation will wait to get a memcache client
+# connection. This is used by the key value store system (e.g. token pooled
+# memcached persistence backend). (integer value)
+#pool_connection_get_timeout = 10
+
+
+[oauth1]
+
+#
+# From keystone
+#
+
+# Credential backend driver. (string value)
+#driver = keystone.contrib.oauth1.backends.sql.OAuth1
+
+# Duration (in seconds) for the OAuth Request Token. (integer value)
+#request_token_duration = 28800
+
+# Duration (in seconds) for the OAuth Access Token. (integer value)
+#access_token_duration = 86400
+
+
+[os_inherit]
+
+#
+# From keystone
+#
+
+# role-assignment inheritance to projects from owning domain or from projects
+# higher in the hierarchy can be optionally enabled. (boolean value)
+#enabled = false
+
+
+[oslo_messaging_amqp]
+
+#
+# From oslo.messaging
+#
+
+# address prefix used when sending to a specific server (string value)
+# Deprecated group/name - [amqp1]/server_request_prefix
+#server_request_prefix = exclusive
+
+# address prefix used when broadcasting to all servers (string value)
+# Deprecated group/name - [amqp1]/broadcast_prefix
+#broadcast_prefix = broadcast
+
+# address prefix when sending to any server in group (string value)
+# Deprecated group/name - [amqp1]/group_request_prefix
+#group_request_prefix = unicast
+
+# Name for the AMQP container (string value)
+# Deprecated group/name - [amqp1]/container_name
+#container_name = <None>
+
+# Timeout for inactive connections (in seconds) (integer value)
+# Deprecated group/name - [amqp1]/idle_timeout
+#idle_timeout = 0
+
+# Debug: dump AMQP frames to stdout (boolean value)
+# Deprecated group/name - [amqp1]/trace
+#trace = false
+
+# CA certificate PEM file for verifing server certificate (string value)
+# Deprecated group/name - [amqp1]/ssl_ca_file
+#ssl_ca_file =
+
+# Identifying certificate PEM file to present to clients (string value)
+# Deprecated group/name - [amqp1]/ssl_cert_file
+#ssl_cert_file =
+
+# Private key PEM file used to sign cert_file certificate (string value)
+# Deprecated group/name - [amqp1]/ssl_key_file
+#ssl_key_file =
+
+# Password for decrypting ssl_key_file (if encrypted) (string value)
+# Deprecated group/name - [amqp1]/ssl_key_password
+#ssl_key_password = <None>
+
+# Accept clients using either SSL or plain TCP (boolean value)
+# Deprecated group/name - [amqp1]/allow_insecure_clients
+#allow_insecure_clients = false
+
+
+[oslo_messaging_qpid]
+
+#
+# From oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+#amqp_durable_queues = false
+
+# Auto-delete queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/amqp_auto_delete
+#amqp_auto_delete = false
+
+# Size of RPC connection pool. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_conn_pool_size
+#rpc_conn_pool_size = 30
+
+# Qpid broker hostname. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_hostname
+#qpid_hostname = localhost
+
+# Qpid broker port. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_port
+#qpid_port = 5672
+
+# Qpid HA cluster host:port pairs. (list value)
+# Deprecated group/name - [DEFAULT]/qpid_hosts
+#qpid_hosts = $qpid_hostname:$qpid_port
+
+# Username for Qpid connection. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_username
+#qpid_username =
+
+# Password for Qpid connection. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_password
+#qpid_password =
+
+# Space separated list of SASL mechanisms to use for auth. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_sasl_mechanisms
+#qpid_sasl_mechanisms =
+
+# Seconds between connection keepalive heartbeats. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_heartbeat
+#qpid_heartbeat = 60
+
+# Transport to use, either 'tcp' or 'ssl'. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_protocol
+#qpid_protocol = tcp
+
+# Whether to disable the Nagle algorithm. (boolean value)
+# Deprecated group/name - [DEFAULT]/qpid_tcp_nodelay
+#qpid_tcp_nodelay = true
+
+# The number of prefetched messages held by receiver. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_receiver_capacity
+#qpid_receiver_capacity = 1
+
+# The qpid topology version to use. Version 1 is what was originally used by
+# impl_qpid. Version 2 includes some backwards-incompatible changes that allow
+# broker federation to work. Users should update to version 2 when they are
+# able to take everything down, as it requires a clean break. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_topology_version
+#qpid_topology_version = 1
+
+
+[oslo_messaging_rabbit]
+
+#
+# From oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+#amqp_durable_queues = false
+
+# Auto-delete queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/amqp_auto_delete
+#amqp_auto_delete = false
+
+# Size of RPC connection pool. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_conn_pool_size
+#rpc_conn_pool_size = 30
+
+# SSL version to use (valid only if SSL enabled). Valid values are TLSv1 and
+# SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may be available on some
+# distributions. (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_version
+#kombu_ssl_version =
+
+# SSL key file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_keyfile
+#kombu_ssl_keyfile =
+
+# SSL cert file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_certfile
+#kombu_ssl_certfile =
+
+# SSL certification authority file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_ca_certs
+#kombu_ssl_ca_certs =
+
+# How long to wait before reconnecting in response to an AMQP consumer cancel
+# notification. (floating point value)
+# Deprecated group/name - [DEFAULT]/kombu_reconnect_delay
+#kombu_reconnect_delay = 1.0
+
+# The RabbitMQ broker address where a single node is used. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_host
+rabbit_host = {{ RABBITMQ_HOST }}
+
+# The RabbitMQ broker port where a single node is used. (integer value)
+# Deprecated group/name - [DEFAULT]/rabbit_port
+rabbit_port = {{ RABBITMQ_PORT }}
+
+# RabbitMQ HA cluster host:port pairs. (list value)
+# Deprecated group/name - [DEFAULT]/rabbit_hosts
+rabbit_hosts = $rabbit_host:$rabbit_port
+
+# Connect over SSL for RabbitMQ. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_use_ssl
+rabbit_use_ssl = false
+
+# The RabbitMQ userid. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_userid
+rabbit_userid = {{ RABBITMQ_USER }}
+
+# The RabbitMQ password. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_password
+rabbit_password = {{ RABBITMQ_PASSWORD }}
+
+# The RabbitMQ login method. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_login_method
+#rabbit_login_method = AMQPLAIN
+
+# The RabbitMQ virtual host. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_virtual_host
+#rabbit_virtual_host = /
+
+# How frequently to retry connecting with RabbitMQ. (integer value)
+#rabbit_retry_interval = 1
+
+# How long to backoff for between retries when connecting to RabbitMQ. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/rabbit_retry_backoff
+#rabbit_retry_backoff = 2
+
+# Maximum number of RabbitMQ connection retries. Default is 0 (infinite retry
+# count). (integer value)
+# Deprecated group/name - [DEFAULT]/rabbit_max_retries
+#rabbit_max_retries = 0
+
+# Use HA queues in RabbitMQ (x-ha-policy: all). If you change this option, you
+# must wipe the RabbitMQ database. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_ha_queues
+#rabbit_ha_queues = false
+
+# Number of seconds after which the Rabbit broker is considered down if
+# heartbeat's keep-alive fails (0 disable the heartbeat). (integer value)
+#heartbeat_timeout_threshold = 60
+
+# How often times during the heartbeat_timeout_threshold we check the
+# heartbeat. (integer value)
+#heartbeat_rate = 2
+
+# Deprecated, use rpc_backend=kombu+memory or rpc_backend=fake (boolean value)
+# Deprecated group/name - [DEFAULT]/fake_rabbit
+#fake_rabbit = false
+
+
+[oslo_middleware]
+
+#
+# From oslo.middleware
+#
+
+# The maximum body size for each request, in bytes. (integer value)
+# Deprecated group/name - [DEFAULT]/osapi_max_request_body_size
+# Deprecated group/name - [DEFAULT]/max_request_body_size
+#max_request_body_size = 114688
+
+
+[oslo_policy]
+
+#
+# From oslo.policy
+#
+
+# The JSON file that defines policies. (string value)
+# Deprecated group/name - [DEFAULT]/policy_file
+#policy_file = policy.json
+
+# Default rule. Enforced when a requested rule is not found. (string value)
+# Deprecated group/name - [DEFAULT]/policy_default_rule
+#policy_default_rule = default
+
+# Directories where policy configuration files are stored. They can be relative
+# to any directory in the search path defined by the config_dir option, or
+# absolute paths. The file defined by policy_file must exist for these
+# directories to be searched. Missing or empty directories are ignored. (multi
+# valued)
+# Deprecated group/name - [DEFAULT]/policy_dirs
+#policy_dirs = policy.d
+
+
+[paste_deploy]
+
+#
+# From keystone
+#
+
+# Name of the paste configuration file that defines the available pipelines.
+# (string value)
+#config_file = keystone-paste.ini
+
+
+[policy]
+
+#
+# From keystone
+#
+
+# Policy backend driver. (string value)
+#driver = keystone.policy.backends.sql.Policy
+
+# Maximum number of entities that will be returned in a policy collection.
+# (integer value)
+#list_limit = <None>
+
+
+[resource]
+
+#
+# From keystone
+#
+
+# Resource backend driver. If a resource driver is not specified, the
+# assignment driver will choose the resource driver. (string value)
+#driver = <None>
+
+# Toggle for resource caching. This has no effect unless global caching is
+# enabled. (boolean value)
+# Deprecated group/name - [assignment]/caching
+#caching = true
+
+# TTL (in seconds) to cache resource data. This has no effect unless global
+# caching is enabled. (integer value)
+# Deprecated group/name - [assignment]/cache_time
+#cache_time = <None>
+
+# Maximum number of entities that will be returned in a resource collection.
+# (integer value)
+# Deprecated group/name - [assignment]/list_limit
+#list_limit = <None>
+
+
+[revoke]
+
+#
+# From keystone
+#
+
+# An implementation of the backend for persisting revocation events. (string
+# value)
+#driver = keystone.contrib.revoke.backends.sql.Revoke
+
+# This value (calculated in seconds) is added to token expiration before a
+# revocation event may be removed from the backend. (integer value)
+#expiration_buffer = 1800
+
+# Toggle for revocation event caching. This has no effect unless global caching
+# is enabled. (boolean value)
+#caching = true
+
+# Time to cache the revocation list and the revocation events (in seconds).
+# This has no effect unless global and token caching are enabled. (integer
+# value)
+# Deprecated group/name - [token]/revocation_cache_time
+#cache_time = 3600
+
+
+[role]
+
+#
+# From keystone
+#
+
+# Role backend driver. (string value)
+#driver = <None>
+
+# Toggle for role caching. This has no effect unless global caching is enabled.
+# (boolean value)
+#caching = true
+
+# TTL (in seconds) to cache role data. This has no effect unless global caching
+# is enabled. (integer value)
+#cache_time = <None>
+
+# Maximum number of entities that will be returned in a role collection.
+# (integer value)
+#list_limit = <None>
+
+
+[saml]
+
+#
+# From keystone
+#
+
+# Default TTL, in seconds, for any generated SAML assertion created by
+# Keystone. (integer value)
+#assertion_expiration_time = 3600
+
+# Binary to be called for XML signing. Install the appropriate package, specify
+# absolute path or adjust your PATH environment variable if the binary cannot
+# be found. (string value)
+#xmlsec1_binary = xmlsec1
+
+# Path of the certfile for SAML signing. For non-production environments, you
+# may be interested in using `keystone-manage pki_setup` to generate self-
+# signed certificates. Note, the path cannot contain a comma. (string value)
+#certfile = /etc/keystone/ssl/certs/signing_cert.pem
+
+# Path of the keyfile for SAML signing. Note, the path cannot contain a comma.
+# (string value)
+#keyfile = /etc/keystone/ssl/private/signing_key.pem
+
+# Entity ID value for unique Identity Provider identification. Usually FQDN is
+# set with a suffix. A value is required to generate IDP Metadata. For example:
+# https://keystone.example.com/v3/OS-FEDERATION/saml2/idp (string value)
+#idp_entity_id = <None>
+
+# Identity Provider Single-Sign-On service value, required in the Identity
+# Provider's metadata. A value is required to generate IDP Metadata. For
+# example: https://keystone.example.com/v3/OS-FEDERATION/saml2/sso (string
+# value)
+#idp_sso_endpoint = <None>
+
+# Language used by the organization. (string value)
+#idp_lang = en
+
+# Organization name the installation belongs to. (string value)
+#idp_organization_name = <None>
+
+# Organization name to be displayed. (string value)
+#idp_organization_display_name = <None>
+
+# URL of the organization. (string value)
+#idp_organization_url = <None>
+
+# Company of contact person. (string value)
+#idp_contact_company = <None>
+
+# Given name of contact person (string value)
+#idp_contact_name = <None>
+
+# Surname of contact person. (string value)
+#idp_contact_surname = <None>
+
+# Email address of contact person. (string value)
+#idp_contact_email = <None>
+
+# Telephone number of contact person. (string value)
+#idp_contact_telephone = <None>
+
+# Contact type. Allowed values are: technical, support, administrative billing,
+# and other (string value)
+#idp_contact_type = other
+
+# Path to the Identity Provider Metadata file. This file should be generated
+# with the keystone-manage saml_idp_metadata command. (string value)
+#idp_metadata_path = /etc/keystone/saml2_idp_metadata.xml
+
+# The prefix to use for the RelayState SAML attribute, used when generating ECP
+# wrapped assertions. (string value)
+#relay_state_prefix = ss:mem:
+
+
+[signing]
+
+#
+# From keystone
+#
+
+# Path of the certfile for token signing. For non-production environments, you
+# may be interested in using `keystone-manage pki_setup` to generate self-
+# signed certificates. (string value)
+#certfile = /etc/keystone/ssl/certs/signing_cert.pem
+
+# Path of the keyfile for token signing. (string value)
+#keyfile = /etc/keystone/ssl/private/signing_key.pem
+
+# Path of the CA for token signing. (string value)
+#ca_certs = /etc/keystone/ssl/certs/ca.pem
+
+# Path of the CA key for token signing. (string value)
+#ca_key = /etc/keystone/ssl/private/cakey.pem
+
+# Key size (in bits) for token signing cert (auto generated certificate).
+# (integer value)
+#key_size = 2048
+
+# Days the token signing cert is valid for (auto generated certificate).
+# (integer value)
+#valid_days = 3650
+
+# Certificate subject (auto generated certificate) for token signing. (string
+# value)
+#cert_subject = /C=US/ST=Unset/L=Unset/O=Unset/CN=www.example.com
+
+
+[ssl]
+
+#
+# From keystone
+#
+
+# Path of the CA key file for SSL. (string value)
+#ca_key = /etc/keystone/ssl/private/cakey.pem
+
+# SSL key length (in bits) (auto generated certificate). (integer value)
+#key_size = 1024
+
+# Days the certificate is valid for once signed (auto generated certificate).
+# (integer value)
+#valid_days = 3650
+
+# SSL certificate subject (auto generated certificate). (string value)
+#cert_subject = /C=US/ST=Unset/L=Unset/O=Unset/CN=localhost
+
+
+[token]
+
+#
+# From keystone
+#
+
+# External auth mechanisms that should add bind information to token, e.g.,
+# kerberos,x509. (list value)
+#bind =
+
+# Enforcement policy on tokens presented to Keystone with bind information. One
+# of disabled, permissive, strict, required or a specifically required bind
+# mode, e.g., kerberos or x509 to require binding to that authentication.
+# (string value)
+#enforce_token_bind = permissive
+
+# Amount of time a token should remain valid (in seconds). (integer value)
+#expiration = 3600
+
+# Controls the token construction, validation, and revocation operations. Core
+# providers are "keystone.token.providers.[fernet|pkiz|pki|uuid].Provider".
+# (string value)
+provider = keystone.token.providers.uuid.Provider
+
+# Token persistence backend driver. (string value)
+driver = keystone.token.persistence.backends.sql.Token
+
+# Toggle for token system caching. This has no effect unless global caching is
+# enabled. (boolean value)
+#caching = true
+
+# Time to cache tokens (in seconds). This has no effect unless global and token
+# caching are enabled. (integer value)
+#cache_time = <None>
+
+# Revoke token by token identifier. Setting revoke_by_id to true enables
+# various forms of enumerating tokens, e.g. `list tokens for user`. These
+# enumerations are processed to determine the list of tokens to revoke. Only
+# disable if you are switching to using the Revoke extension with a backend
+# other than KVS, which stores events in memory. (boolean value)
+#revoke_by_id = true
+
+# Allow rescoping of scoped token. Setting allow_rescoped_scoped_token to false
+# prevents a user from exchanging a scoped token for any other token. (boolean
+# value)
+#allow_rescope_scoped_token = true
+
+# The hash algorithm to use for PKI tokens. This can be set to any algorithm
+# that hashlib supports. WARNING: Before changing this value, the auth_token
+# middleware must be configured with the hash_algorithms, otherwise token
+# revocation will not be processed correctly. (string value)
+#hash_algorithm = md5
+
+
+[trust]
+
+#
+# From keystone
+#
+
+# Delegation and impersonation features can be optionally disabled. (boolean
+# value)
+#enabled = true
+
+# Enable redelegation feature. (boolean value)
+#allow_redelegation = false
+
+# Maximum depth of trust redelegation. (integer value)
+#max_redelegation_count = 3
+
+# Trust backend driver. (string value)
+#driver = keystone.trust.backends.sql.Trust
diff --git a/install-files/openstack/usr/share/openstack/network.yml b/install-files/openstack/usr/share/openstack/network.yml
new file mode 100644
index 00000000..f99f7f1a
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/network.yml
@@ -0,0 +1,67 @@
+---
+- hosts: localhost
+ vars_files:
+ - /etc/openstack/network.conf
+ tasks:
+# Create the bridges to use the External network mapped
+
+# Count number of network interfaces (interfaces starting with 'e')
+ - shell: ls /sys/class/net | grep ^e.* | wc -l
+ register: number_interfaces
+
+# Abort if there number of interfaces != 1
+ - fail:
+ msg: More than one, or none network interfaces found.
+ when: EXTERNAL_INTERFACE is not defined and number_interfaces.stdout != "1"
+
+ - shell: ls /sys/class/net | grep ^e.*
+ register: interface_name
+ when: EXTERNAL_INTERFACE is not defined
+
+ - set_fact:
+ ETH_INTERFACE: "{{ interface_name.stdout }}"
+ when: EXTERNAL_INTERFACE is not defined
+
+ - set_fact:
+ ETH_INTERFACE: "{{ EXTERNAL_INTERFACE }}"
+ when: EXTERNAL_INTERFACE is defined
+
+ - set_fact:
+ ETH_MAC_ADDRESS: "{{ hostvars['localhost']['ansible_' + ETH_INTERFACE]['macaddress'] }}"
+
+ - name: Create the /run/systemd/network
+ file:
+ path: /run/systemd/network
+ state: directory
+
+ - name: Disable dhcp on the bound physical interface
+ template:
+ src: /usr/share/openstack/extras/00-disable-device.network
+ dest: /run/systemd/network/00-disable-{{ item }}-config.network
+ with_items:
+ - "{{ ETH_INTERFACE }}"
+
+ - name: Disable dhcp on all the internal interfaces
+ template:
+ src: /usr/share/openstack/extras/00-disable-device.network
+ dest: /run/systemd/network/00-disable-{{ item }}-config.network
+ with_items:
+ - ovs-system
+
+ - openvswitch_bridge:
+ bridge: br-ex
+ state: present
+
+ - openvswitch_port:
+ bridge: br-ex
+ port: "{{ ETH_INTERFACE }}"
+ state: present
+
+ - shell: ovs-vsctl set bridge br-ex other-config:hwaddr={{ ETH_MAC_ADDRESS }}
+
+ - name: Enable dhcp on the Open vSwitch device that replaces our external interface
+ template:
+ src: /usr/share/openstack/extras/60-device-dhcp.network
+ dest: /run/systemd/network/60-{{ item }}-dhcp.network
+ with_items:
+ - br-ex
diff --git a/install-files/openstack/usr/share/openstack/neutron-config.yml b/install-files/openstack/usr/share/openstack/neutron-config.yml
new file mode 100644
index 00000000..5d594353
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/neutron-config.yml
@@ -0,0 +1,37 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/neutron.conf"
+ tasks:
+
+ - name: Create the neutron user.
+ user:
+ name: neutron
+ comment: Openstack Neutron Daemons
+ shell: /sbin/nologin
+ home: /var/lib/neutron
+
+ - name: Create the /var folders for neutron
+ file:
+ path: "{{ item }}"
+ state: directory
+ owner: neutron
+ group: neutron
+ with_items:
+ - /var/run/neutron
+ - /var/lock/neutron
+ - /var/log/neutron
+
+ - name: Create the directories needed for Neutron configuration files.
+ file:
+ path: /etc/{{ item }}
+ state: directory
+ with_lines:
+ - cd /usr/share/openstack && find neutron -type d
+
+ - name: Add configuration needed for neutron using templates
+ template:
+ src: /usr/share/openstack/{{ item }}
+ dest: /etc/{{ item }}
+ with_lines:
+ - cd /usr/share/openstack && find neutron -type f
diff --git a/install-files/openstack/usr/share/openstack/neutron-db.yml b/install-files/openstack/usr/share/openstack/neutron-db.yml
new file mode 100644
index 00000000..fee53315
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/neutron-db.yml
@@ -0,0 +1,51 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/neutron.conf"
+ tasks:
+ - name: Create neutron service user in service tenant
+ keystone_user:
+ user: "{{ NEUTRON_SERVICE_USER }}"
+ password: "{{ NEUTRON_SERVICE_PASSWORD }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Add admin role to neutron service user in service tenant
+ keystone_user:
+ role: admin
+ user: "{{ NEUTRON_SERVICE_USER }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - keystone_service:
+ name: neutron
+ type: network
+ description: Openstack Compute Networking
+ publicurl: http://{{ ansible_hostname }}:9696
+ internalurl: http://{{ CONTROLLER_HOST_ADDRESS }}:9696
+ adminurl: http://{{ CONTROLLER_HOST_ADDRESS }}:9696
+ region: regionOne
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Create postgresql user for neutron
+ postgresql_user:
+ name: "{{ NEUTRON_DB_USER }}"
+ password: "{{ NEUTRON_DB_PASSWORD }}"
+ sudo: yes
+ sudo_user: neutron
+
+ - name: Create database for neutron services
+ postgresql_db:
+ name: neutron
+ owner: "{{ NEUTRON_DB_USER }}"
+ sudo: yes
+ sudo_user: neutron
+
+ - name: Initiate neutron database
+ shell: |
+ neutron-db-manage \
+ --config-file /etc/neutron/neutron.conf \
+ --config-file /etc/neutron/plugins/ml2/ml2_conf.ini \
+ upgrade head
+ sudo: yes
+ sudo_user: neutron
diff --git a/install-files/openstack/usr/share/openstack/neutron/dhcp_agent.ini b/install-files/openstack/usr/share/openstack/neutron/dhcp_agent.ini
new file mode 100644
index 00000000..1ab4c806
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/neutron/dhcp_agent.ini
@@ -0,0 +1,89 @@
+[DEFAULT]
+# Show debugging output in log (sets DEBUG log level output)
+# debug = False
+
+# The DHCP agent will resync its state with Neutron to recover from any
+# transient notification or rpc errors. The interval is number of
+# seconds between attempts.
+# resync_interval = 5
+
+# The DHCP agent requires an interface driver be set. Choose the one that best
+# matches your plugin.
+# interface_driver =
+
+# Example of interface_driver option for OVS based plugins(OVS, Ryu, NEC, NVP,
+# BigSwitch/Floodlight)
+interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
+
+# Name of Open vSwitch bridge to use
+# ovs_integration_bridge = br-int
+
+# Use veth for an OVS interface or not.
+# Support kernels with limited namespace support
+# (e.g. RHEL 6.5) so long as ovs_use_veth is set to True.
+# ovs_use_veth = False
+
+# Example of interface_driver option for LinuxBridge
+# interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
+
+# The agent can use other DHCP drivers. Dnsmasq is the simplest and requires
+# no additional setup of the DHCP server.
+dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
+
+# Allow overlapping IP (Must have kernel build with CONFIG_NET_NS=y and
+# iproute2 package that supports namespaces). This option is deprecated and
+# will be removed in a future release, at which point the old behavior of
+# use_namespaces = True will be enforced.
+# use_namespaces = True
+
+# The DHCP server can assist with providing metadata support on isolated
+# networks. Setting this value to True will cause the DHCP server to append
+# specific host routes to the DHCP request. The metadata service will only
+# be activated when the subnet does not contain any router port. The guest
+# instance must be configured to request host routes via DHCP (Option 121).
+enable_isolated_metadata = True
+
+# Allows for serving metadata requests coming from a dedicated metadata
+# access network whose cidr is 169.254.169.254/16 (or larger prefix), and
+# is connected to a Neutron router from which the VMs send metadata
+# request. In this case DHCP Option 121 will not be injected in VMs, as
+# they will be able to reach 169.254.169.254 through a router.
+# This option requires enable_isolated_metadata = True
+# enable_metadata_network = False
+
+# Number of threads to use during sync process. Should not exceed connection
+# pool size configured on server.
+# num_sync_threads = 4
+
+# Location to store DHCP server config files
+# dhcp_confs = $state_path/dhcp
+
+# Domain to use for building the hostnames
+# dhcp_domain = openstacklocal
+
+# Override the default dnsmasq settings with this file
+dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf
+
+# Comma-separated list of DNS servers which will be used by dnsmasq
+# as forwarders.
+# dnsmasq_dns_servers =
+
+# Limit number of leases to prevent a denial-of-service.
+# dnsmasq_lease_max = 16777216
+
+# Location to DHCP lease relay UNIX domain socket
+# dhcp_lease_relay_socket = $state_path/dhcp/lease_relay
+
+# Use broadcast in DHCP replies
+# dhcp_broadcast_reply = False
+
+# dhcp_delete_namespaces, which is True by default, can be set to False if
+# namespaces can't be deleted cleanly on the host running the DHCP agent.
+# Disable this if you hit the issue in
+# https://bugs.launchpad.net/neutron/+bug/1052535 or if
+# you are sure that your version of iproute suffers from the problem.
+# dhcp_delete_namespaces = True
+
+# Timeout for ovs-vsctl commands.
+# If the timeout expires, ovs commands will fail with ALARMCLOCK error.
+# ovs_vsctl_timeout = 10
diff --git a/install-files/openstack/usr/share/openstack/neutron/l3_agent.ini b/install-files/openstack/usr/share/openstack/neutron/l3_agent.ini
new file mode 100644
index 00000000..bc1321e4
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/neutron/l3_agent.ini
@@ -0,0 +1,121 @@
+[DEFAULT]
+# Show debugging output in log (sets DEBUG log level output)
+# debug = False
+
+# L3 requires that an interface driver be set. Choose the one that best
+# matches your plugin.
+interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
+
+# Example of interface_driver option for OVS based plugins (OVS, Ryu, NEC)
+# that supports L3 agent
+# interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
+
+# Use veth for an OVS interface or not.
+# Support kernels with limited namespace support
+# (e.g. RHEL 6.5) so long as ovs_use_veth is set to True.
+# ovs_use_veth = False
+
+# Example of interface_driver option for LinuxBridge
+# interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
+
+# Allow overlapping IP (Must have kernel build with CONFIG_NET_NS=y and
+# iproute2 package that supports namespaces). This option is deprecated and
+# will be removed in a future release, at which point the old behavior of
+# use_namespaces = True will be enforced.
+# use_namespaces = True
+
+# If use_namespaces is set as False then the agent can only configure one router.
+
+# This is done by setting the specific router_id.
+# router_id =
+
+# When external_network_bridge is set, each L3 agent can be associated
+# with no more than one external network. This value should be set to the UUID
+# of that external network. To allow L3 agent support multiple external
+# networks, both the external_network_bridge and gateway_external_network_id
+# must be left empty.
+# gateway_external_network_id =
+
+# With IPv6, the network used for the external gateway does not need
+# to have an associated subnet, since the automatically assigned
+# link-local address (LLA) can be used. However, an IPv6 gateway address
+# is needed for use as the next-hop for the default route. If no IPv6
+# gateway address is configured here, (and only then) the neutron router
+# will be configured to get its default route from router advertisements (RAs)
+# from the upstream router; in which case the upstream router must also be
+# configured to send these RAs.
+# The ipv6_gateway, when configured, should be the LLA of the interface
+# on the upstream router. If a next-hop using a global unique address (GUA)
+# is desired, it needs to be done via a subnet allocated to the network
+# and not through this parameter.
+# ipv6_gateway =
+
+# Indicates that this L3 agent should also handle routers that do not have
+# an external network gateway configured. This option should be True only
+# for a single agent in a Neutron deployment, and may be False for all agents
+# if all routers must have an external network gateway
+# handle_internal_only_routers = True
+
+# Name of bridge used for external network traffic. This should be set to
+# empty value for the linux bridge. when this parameter is set, each L3 agent
+# can be associated with no more than one external network.
+external_network_bridge = br-ex
+
+# TCP Port used by Neutron metadata server
+# metadata_port = 9697
+
+# Send this many gratuitous ARPs for HA setup. Set it below or equal to 0
+# to disable this feature.
+# send_arp_for_ha = 3
+
+# seconds between re-sync routers' data if needed
+# periodic_interval = 40
+
+# seconds to start to sync routers' data after
+# starting agent
+# periodic_fuzzy_delay = 5
+
+# enable_metadata_proxy, which is true by default, can be set to False
+# if the Nova metadata server is not available
+# enable_metadata_proxy = True
+
+# Iptables mangle mark used to mark metadata valid requests
+# metadata_access_mark = 0x1
+
+# Iptables mangle mark used to mark ingress from external network
+# external_ingress_mark = 0x2
+
+# router_delete_namespaces, which is True by default, can be set to False if
+# namespaces can't be deleted cleanly on the host running the L3 agent.
+# Disable this if you hit the issue in
+# https://bugs.launchpad.net/neutron/+bug/1052535 or if
+# you are sure that your version of iproute suffers from the problem.
+# If True, namespaces will be deleted when a router is destroyed.
+# router_delete_namespaces = True
+
+# Timeout for ovs-vsctl commands.
+# If the timeout expires, ovs commands will fail with ALARMCLOCK error.
+# ovs_vsctl_timeout = 10
+
+# The working mode for the agent. Allowed values are:
+# - legacy: this preserves the existing behavior where the L3 agent is
+# deployed on a centralized networking node to provide L3 services
+# like DNAT, and SNAT. Use this mode if you do not want to adopt DVR.
+# - dvr: this mode enables DVR functionality, and must be used for an L3
+# agent that runs on a compute host.
+# - dvr_snat: this enables centralized SNAT support in conjunction with
+# DVR. This mode must be used for an L3 agent running on a centralized
+# node (or in single-host deployments, e.g. devstack).
+# agent_mode = legacy
+
+# Location to store keepalived and all HA configurations
+# ha_confs_path = $state_path/ha_confs
+
+# VRRP authentication type AH/PASS
+# ha_vrrp_auth_type = PASS
+
+# VRRP authentication password
+# ha_vrrp_auth_password =
+
+# The advertisement interval in seconds
+# ha_vrrp_advert_int = 2
diff --git a/install-files/openstack/usr/share/openstack/neutron/metadata_agent.ini b/install-files/openstack/usr/share/openstack/neutron/metadata_agent.ini
new file mode 100644
index 00000000..ee89c943
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/neutron/metadata_agent.ini
@@ -0,0 +1,68 @@
+[DEFAULT]
+# Show debugging output in log (sets DEBUG log level output)
+# debug = True
+
+# The Neutron user information for accessing the Neutron API.
+auth_url = http://{{ CONTROLLER_HOST_ADDRESS }}:5000/v2.0
+auth_region = regionOne
+# Turn off verification of the certificate for ssl
+# auth_insecure = False
+# Certificate Authority public key (CA cert) file for ssl
+# auth_ca_cert =
+admin_tenant_name = service
+admin_user = {{ NEUTRON_SERVICE_USER }}
+admin_password = {{ NEUTRON_SERVICE_PASSWORD }}
+
+# Network service endpoint type to pull from the keystone catalog
+# endpoint_type = adminURL
+
+# IP address used by Nova metadata server
+nova_metadata_ip = {{ CONTROLLER_HOST_ADDRESS }}
+
+# TCP Port used by Nova metadata server
+# nova_metadata_port = 8775
+
+# Which protocol to use for requests to Nova metadata server, http or https
+# nova_metadata_protocol = http
+
+# Whether insecure SSL connection should be accepted for Nova metadata server
+# requests
+# nova_metadata_insecure = False
+
+# Client certificate for nova api, needed when nova api requires client
+# certificates
+# nova_client_cert =
+
+# Private key for nova client certificate
+# nova_client_priv_key =
+
+# When proxying metadata requests, Neutron signs the Instance-ID header with a
+# shared secret to prevent spoofing. You may select any string for a secret,
+# but it must match here and in the configuration used by the Nova Metadata
+# Server. NOTE: Nova uses the same config key, but in [neutron] section.
+metadata_proxy_shared_secret = {{ METADATA_PROXY_SHARED_SECRET }}
+
+# Location of Metadata Proxy UNIX domain socket
+# metadata_proxy_socket = $state_path/metadata_proxy
+
+# Metadata Proxy UNIX domain socket mode, 3 values allowed:
+# 'deduce': deduce mode from metadata_proxy_user/group values,
+# 'user': set metadata proxy socket mode to 0o644, to use when
+# metadata_proxy_user is agent effective user or root,
+# 'group': set metadata proxy socket mode to 0o664, to use when
+# metadata_proxy_group is agent effective group,
+# 'all': set metadata proxy socket mode to 0o666, to use otherwise.
+# metadata_proxy_socket_mode = deduce
+
+# Number of separate worker processes for metadata server. Defaults to
+# half the number of CPU cores
+# metadata_workers =
+
+# Number of backlog requests to configure the metadata server socket with
+# metadata_backlog = 4096
+
+# URL to connect to the cache backend.
+# default_ttl=0 parameter will cause cache entries to never expire.
+# Otherwise default_ttl specifies time in seconds a cache entry is valid for.
+# No cache is used in case no value is passed.
+# cache_url = memory://?default_ttl=5
diff --git a/install-files/openstack/usr/share/openstack/neutron/neutron.conf b/install-files/openstack/usr/share/openstack/neutron/neutron.conf
new file mode 100644
index 00000000..33c6398a
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/neutron/neutron.conf
@@ -0,0 +1,1027 @@
+[DEFAULT]
+# Print more verbose output (set logging level to INFO instead of default WARNING level).
+# verbose = False
+
+# =========Start Global Config Option for Distributed L3 Router===============
+# Setting the "router_distributed" flag to "True" will default to the creation
+# of distributed tenant routers. The admin can override this flag by specifying
+# the type of the router on the create request (admin-only attribute). Default
+# value is "False" to support legacy mode (centralized) routers.
+#
+# router_distributed = False
+#
+# ===========End Global Config Option for Distributed L3 Router===============
+
+# Print debugging output (set logging level to DEBUG instead of default WARNING level).
+# debug = False
+
+# Where to store Neutron state files. This directory must be writable by the
+# user executing the agent.
+# state_path = /var/lib/neutron
+
+# log_format = %(asctime)s %(levelname)8s [%(name)s] %(message)s
+# log_date_format = %Y-%m-%d %H:%M:%S
+
+# use_syslog -> syslog
+# log_file and log_dir -> log_dir/log_file
+# (not log_file) and log_dir -> log_dir/{binary_name}.log
+# use_stderr -> stderr
+# (not user_stderr) and (not log_file) -> stdout
+# publish_errors -> notification system
+
+use_syslog = True
+# syslog_log_facility = LOG_USER
+
+# use_stderr = True
+# log_file =
+# log_dir =
+
+# publish_errors = False
+
+# Address to bind the API server to
+# bind_host = 0.0.0.0
+
+# Port the bind the API server to
+# bind_port = 9696
+
+# Path to the extensions. Note that this can be a colon-separated list of
+# paths. For example:
+# api_extensions_path = extensions:/path/to/more/extensions:/even/more/extensions
+# The __path__ of neutron.extensions is appended to this, so if your
+# extensions are in there you don't need to specify them here
+# api_extensions_path =
+
+# (StrOpt) Neutron core plugin entrypoint to be loaded from the
+# neutron.core_plugins namespace. See setup.cfg for the entrypoint names of the
+# plugins included in the neutron source distribution. For compatibility with
+# previous versions, the class name of a plugin can be specified instead of its
+# entrypoint name.
+#
+core_plugin = ml2
+# Example: core_plugin = ml2
+
+# (ListOpt) List of service plugin entrypoints to be loaded from the
+# neutron.service_plugins namespace. See setup.cfg for the entrypoint names of
+# the plugins included in the neutron source distribution. For compatibility
+# with previous versions, the class name of a plugin can be specified instead
+# of its entrypoint name.
+#
+service_plugins = router
+# Example: service_plugins = router,firewall,lbaas,vpnaas,metering
+
+# Paste configuration file
+# api_paste_config = api-paste.ini
+
+# (StrOpt) Hostname to be used by the neutron server, agents and services
+# running on this machine. All the agents and services running on this machine
+# must use the same host value.
+# The default value is hostname of the machine.
+#
+# host =
+
+# The strategy to be used for auth.
+# Supported values are 'keystone'(default), 'noauth'.
+auth_strategy = keystone
+
+# Base MAC address. The first 3 octets will remain unchanged. If the
+# 4h octet is not 00, it will also be used. The others will be
+# randomly generated.
+# 3 octet
+# base_mac = fa:16:3e:00:00:00
+# 4 octet
+# base_mac = fa:16:3e:4f:00:00
+
+# DVR Base MAC address. The first 3 octets will remain unchanged. If the
+# 4th octet is not 00, it will also be used. The others will be randomly
+# generated. The 'dvr_base_mac' *must* be different from 'base_mac' to
+# avoid mixing them up with MAC's allocated for tenant ports.
+# A 4 octet example would be dvr_base_mac = fa:16:3f:4f:00:00
+# The default is 3 octet
+# dvr_base_mac = fa:16:3f:00:00:00
+
+# Maximum amount of retries to generate a unique MAC address
+# mac_generation_retries = 16
+
+# DHCP Lease duration (in seconds). Use -1 to
+# tell dnsmasq to use infinite lease times.
+# dhcp_lease_duration = 86400
+
+# Allow sending resource operation notification to DHCP agent
+# dhcp_agent_notification = True
+
+# Enable or disable bulk create/update/delete operations
+# allow_bulk = True
+# Enable or disable pagination
+# allow_pagination = False
+# Enable or disable sorting
+# allow_sorting = False
+# Enable or disable overlapping IPs for subnets
+# Attention: the following parameter MUST be set to False if Neutron is
+# being used in conjunction with nova security groups
+allow_overlapping_ips = True
+# Ensure that configured gateway is on subnet. For IPv6, validate only if
+# gateway is not a link local address. Deprecated, to be removed during the
+# K release, at which point the check will be mandatory.
+# force_gateway_on_subnet = True
+
+# Default maximum number of items returned in a single response,
+# value == infinite and value < 0 means no max limit, and value must
+# be greater than 0. If the number of items requested is greater than
+# pagination_max_limit, server will just return pagination_max_limit
+# of number of items.
+# pagination_max_limit = -1
+
+# Maximum number of DNS nameservers per subnet
+# max_dns_nameservers = 5
+
+# Maximum number of host routes per subnet
+# max_subnet_host_routes = 20
+
+# Maximum number of fixed ips per port
+# max_fixed_ips_per_port = 5
+
+# Maximum number of routes per router
+# max_routes = 30
+
+# Default Subnet Pool to be used for IPv4 subnet-allocation.
+# Specifies by UUID the pool to be used in case of subnet-create being called
+# without a subnet-pool ID. The default of None means that no pool will be
+# used unless passed explicitly to subnet create. If no pool is used, then a
+# CIDR must be passed to create a subnet and that subnet will not be allocated
+# from any pool; it will be considered part of the tenant's private address
+# space.
+# default_ipv4_subnet_pool =
+
+# Default Subnet Pool to be used for IPv6 subnet-allocation.
+# Specifies by UUID the pool to be used in case of subnet-create being
+# called without a subnet-pool ID. Set to "prefix_delegation"
+# to enable IPv6 Prefix Delegation in a PD-capable environment.
+# See the description for default_ipv4_subnet_pool for more information.
+# default_ipv6_subnet_pool =
+
+# =========== items for MTU selection and advertisement =============
+# Advertise MTU. If True, effort is made to advertise MTU
+# settings to VMs via network methods (ie. DHCP and RA MTU options)
+# when the network's preferred MTU is known.
+# advertise_mtu = False
+# ======== end of items for MTU selection and advertisement =========
+
+# =========== items for agent management extension =============
+# Seconds to regard the agent as down; should be at least twice
+# report_interval, to be sure the agent is down for good
+# agent_down_time = 75
+# =========== end of items for agent management extension =====
+
+# =========== items for agent scheduler extension =============
+# Driver to use for scheduling network to DHCP agent
+# network_scheduler_driver = neutron.scheduler.dhcp_agent_scheduler.ChanceScheduler
+# Driver to use for scheduling router to a default L3 agent
+# router_scheduler_driver = neutron.scheduler.l3_agent_scheduler.ChanceScheduler
+# Driver to use for scheduling a loadbalancer pool to an lbaas agent
+# loadbalancer_pool_scheduler_driver = neutron.services.loadbalancer.agent_scheduler.ChanceScheduler
+
+# (StrOpt) Representing the resource type whose load is being reported by
+# the agent.
+# This can be 'networks','subnets' or 'ports'. When specified (Default is networks),
+# the server will extract particular load sent as part of its agent configuration object
+# from the agent report state, which is the number of resources being consumed, at
+# every report_interval.
+# dhcp_load_type can be used in combination with network_scheduler_driver =
+# neutron.scheduler.dhcp_agent_scheduler.WeightScheduler
+# When the network_scheduler_driver is WeightScheduler, dhcp_load_type can
+# be configured to represent the choice for the resource being balanced.
+# Example: dhcp_load_type = networks
+# Values:
+# networks - number of networks hosted on the agent
+# subnets - number of subnets associated with the networks hosted on the agent
+# ports - number of ports associated with the networks hosted on the agent
+# dhcp_load_type = networks
+
+# Allow auto scheduling networks to DHCP agent. It will schedule non-hosted
+# networks to first DHCP agent which sends get_active_networks message to
+# neutron server
+# network_auto_schedule = True
+
+# Allow auto scheduling routers to L3 agent. It will schedule non-hosted
+# routers to first L3 agent which sends sync_routers message to neutron server
+# router_auto_schedule = True
+
+# Allow automatic rescheduling of routers from dead L3 agents with
+# admin_state_up set to True to alive agents.
+# allow_automatic_l3agent_failover = False
+
+# Allow automatic removal of networks from dead DHCP agents with
+# admin_state_up set to True.
+# Networks could then be rescheduled if network_auto_schedule is True
+# allow_automatic_dhcp_failover = True
+
+# Number of DHCP agents scheduled to host a tenant network.
+# If this number is greater than 1, the scheduler automatically
+# assigns multiple DHCP agents for a given tenant network,
+# providing high availability for DHCP service.
+# dhcp_agents_per_network = 1
+
+# Enable services on agents with admin_state_up False.
+# If this option is False, when admin_state_up of an agent is turned to
+# False, services on it will be disabled. If this option is True, services
+# on agents with admin_state_up False keep available and manual scheduling
+# to such agents is available. Agents with admin_state_up False are not
+# selected for automatic scheduling regardless of this option.
+# enable_services_on_agents_with_admin_state_down = False
+
+# =========== end of items for agent scheduler extension =====
+
+# =========== items for l3 extension ==============
+# Enable high availability for virtual routers.
+# l3_ha = False
+#
+# Maximum number of l3 agents which a HA router will be scheduled on. If it
+# is set to 0 the router will be scheduled on every agent.
+# max_l3_agents_per_router = 3
+#
+# Minimum number of l3 agents which a HA router will be scheduled on. The
+# default value is 2.
+# min_l3_agents_per_router = 2
+#
+# CIDR of the administrative network if HA mode is enabled
+# l3_ha_net_cidr = 169.254.192.0/18
+#
+# Enable snat by default on external gateway when available
+# enable_snat_by_default = True
+# =========== end of items for l3 extension =======
+
+# =========== items for metadata proxy configuration ==============
+# User (uid or name) running metadata proxy after its initialization
+# (if empty: agent effective user)
+# metadata_proxy_user =
+
+# Group (gid or name) running metadata proxy after its initialization
+# (if empty: agent effective group)
+# metadata_proxy_group =
+
+# Enable/Disable log watch by metadata proxy, it should be disabled when
+# metadata_proxy_user/group is not allowed to read/write its log file and
+# 'copytruncate' logrotate option must be used if logrotate is enabled on
+# metadata proxy log files. Option default value is deduced from
+# metadata_proxy_user: watch log is enabled if metadata_proxy_user is agent
+# effective user id/name.
+# metadata_proxy_watch_log =
+
+# Location of Metadata Proxy UNIX domain socket
+# metadata_proxy_socket = $state_path/metadata_proxy
+# =========== end of items for metadata proxy configuration ==============
+
+# ========== items for VLAN trunking networks ==========
+# Setting this flag to True will allow plugins that support it to
+# create VLAN transparent networks. This flag has no effect for
+# plugins that do not support VLAN transparent networks.
+# vlan_transparent = False
+# ========== end of items for VLAN trunking networks ==========
+
+# =========== WSGI parameters related to the API server ==============
+# Number of separate worker processes to spawn. The default, 0, runs the
+# worker thread in the current process. Greater than 0 launches that number of
+# child processes as workers. The parent process manages them.
+# api_workers = 0
+
+# Number of separate RPC worker processes to spawn. The default, 0, runs the
+# worker thread in the current process. Greater than 0 launches that number of
+# child processes as RPC workers. The parent process manages them.
+# This feature is experimental until issues are addressed and testing has been
+# enabled for various plugins for compatibility.
+# rpc_workers = 0
+
+# Timeout for client connections socket operations. If an
+# incoming connection is idle for this number of seconds it
+# will be closed. A value of '0' means wait forever. (integer
+# value)
+# client_socket_timeout = 900
+
+# wsgi keepalive option. Determines if connections are allowed to be held open
+# by clients after a request is fulfilled. A value of False will ensure that
+# the socket connection will be explicitly closed once a response has been
+# sent to the client.
+# wsgi_keep_alive = True
+
+# Sets the value of TCP_KEEPIDLE in seconds to use for each server socket when
+# starting API server. Not supported on OS X.
+# tcp_keepidle = 600
+
+# Number of seconds to keep retrying to listen
+# retry_until_window = 30
+
+# Number of backlog requests to configure the socket with.
+# backlog = 4096
+
+# Max header line to accommodate large tokens
+# max_header_line = 16384
+
+# Enable SSL on the API server
+# use_ssl = False
+
+# Certificate file to use when starting API server securely
+# ssl_cert_file = /path/to/certfile
+
+# Private key file to use when starting API server securely
+# ssl_key_file = /path/to/keyfile
+
+# CA certificate file to use when starting API server securely to
+# verify connecting clients. This is an optional parameter only required if
+# API clients need to authenticate to the API server using SSL certificates
+# signed by a trusted CA
+# ssl_ca_file = /path/to/cafile
+# ======== end of WSGI parameters related to the API server ==========
+
+# ======== neutron nova interactions ==========
+# Send notification to nova when port status is active.
+notify_nova_on_port_status_changes = True
+
+# Send notifications to nova when port data (fixed_ips/floatingips) change
+# so nova can update it's cache.
+notify_nova_on_port_data_changes = True
+
+# URL for connection to nova (Only supports one nova region currently).
+nova_url = http://{{ CONTROLLER_HOST_ADDRESS }}:8774/v2
+
+# Name of nova region to use. Useful if keystone manages more than one region
+# nova_region_name =
+
+# Username for connection to nova in admin context
+# nova_admin_username =
+
+# The uuid of the admin nova tenant
+# nova_admin_tenant_id =
+
+# The name of the admin nova tenant. If the uuid of the admin nova tenant
+# is set, this is optional. Useful for cases where the uuid of the admin
+# nova tenant is not available when configuration is being done.
+# nova_admin_tenant_name =
+
+# Password for connection to nova in admin context.
+# nova_admin_password =
+
+# Authorization URL for connection to nova in admin context.
+# nova_admin_auth_url =
+
+# CA file for novaclient to verify server certificates
+# nova_ca_certificates_file =
+
+# Boolean to control ignoring SSL errors on the nova url
+# nova_api_insecure = False
+
+# Number of seconds between sending events to nova if there are any events to send
+# send_events_interval = 2
+
+# ======== end of neutron nova interactions ==========
+
+#
+# Options defined in oslo.messaging
+#
+
+# Use durable queues in amqp. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+# amqp_durable_queues=false
+
+# Auto-delete queues in amqp. (boolean value)
+# amqp_auto_delete=false
+
+# Size of RPC connection pool. (integer value)
+# rpc_conn_pool_size=30
+
+# Qpid broker hostname. (string value)
+# qpid_hostname=localhost
+
+# Qpid broker port. (integer value)
+# qpid_port=5672
+
+# Qpid HA cluster host:port pairs. (list value)
+# qpid_hosts=$qpid_hostname:$qpid_port
+
+# Username for Qpid connection. (string value)
+# qpid_username=
+
+# Password for Qpid connection. (string value)
+# qpid_password=
+
+# Space separated list of SASL mechanisms to use for auth.
+# (string value)
+# qpid_sasl_mechanisms=
+
+# Seconds between connection keepalive heartbeats. (integer
+# value)
+# qpid_heartbeat=60
+
+# Transport to use, either 'tcp' or 'ssl'. (string value)
+# qpid_protocol=tcp
+
+# Whether to disable the Nagle algorithm. (boolean value)
+# qpid_tcp_nodelay=true
+
+# The qpid topology version to use. Version 1 is what was
+# originally used by impl_qpid. Version 2 includes some
+# backwards-incompatible changes that allow broker federation
+# to work. Users should update to version 2 when they are
+# able to take everything down, as it requires a clean break.
+# (integer value)
+# qpid_topology_version=1
+
+# SSL version to use (valid only if SSL enabled). valid values
+# are TLSv1, SSLv23 and SSLv3. SSLv2 may be available on some
+# distributions. (string value)
+# kombu_ssl_version=
+
+# SSL key file (valid only if SSL enabled). (string value)
+# kombu_ssl_keyfile=
+
+# SSL cert file (valid only if SSL enabled). (string value)
+# kombu_ssl_certfile=
+
+# SSL certification authority file (valid only if SSL
+# enabled). (string value)
+# kombu_ssl_ca_certs=
+
+# How long to wait before reconnecting in response to an AMQP
+# consumer cancel notification. (floating point value)
+# kombu_reconnect_delay=1.0
+
+# The RabbitMQ broker address where a single node is used.
+# (string value)
+# rabbit_host=localhost
+
+# The RabbitMQ broker port where a single node is used.
+# (integer value)
+# rabbit_port =5672
+
+# RabbitMQ HA cluster host:port pairs. (list value)
+# rabbit_hosts=$rabbit_host:$rabbit_port
+
+# Connect over SSL for RabbitMQ. (boolean value)
+# rabbit_use_ssl=false
+
+# The RabbitMQ userid. (string value)
+# rabbit_userid=guest
+
+# The RabbitMQ password. (string value)
+# rabbit_password=guest
+
+# the RabbitMQ login method (string value)
+# rabbit_login_method=AMQPLAIN
+
+# The RabbitMQ virtual host. (string value)
+# rabbit_virtual_host=/
+
+# How frequently to retry connecting with RabbitMQ. (integer
+# value)
+# rabbit_retry_interval=1
+
+# How long to backoff for between retries when connecting to
+# RabbitMQ. (integer value)
+# rabbit_retry_backoff=2
+
+# Maximum number of RabbitMQ connection retries. Default is 0
+# (infinite retry count). (integer value)
+# rabbit_max_retries=0
+
+# Use HA queues in RabbitMQ (x-ha-policy: all). If you change
+# this option, you must wipe the RabbitMQ database. (boolean
+# value)
+# rabbit_ha_queues=false
+
+# If passed, use a fake RabbitMQ provider. (boolean value)
+# fake_rabbit=false
+
+# ZeroMQ bind address. Should be a wildcard (*), an ethernet
+# interface, or IP. The "host" option should point or resolve
+# to this address. (string value)
+# rpc_zmq_bind_address=*
+
+# MatchMaker driver. (string value)
+# rpc_zmq_matchmaker=oslo.messaging._drivers.matchmaker.MatchMakerLocalhost
+
+# ZeroMQ receiver listening port. (integer value)
+# rpc_zmq_port=9501
+
+# Number of ZeroMQ contexts, defaults to 1. (integer value)
+# rpc_zmq_contexts=1
+
+# Maximum number of ingress messages to locally buffer per
+# topic. Default is unlimited. (integer value)
+# rpc_zmq_topic_backlog=
+
+# Directory for holding IPC sockets. (string value)
+# rpc_zmq_ipc_dir=/var/run/openstack
+
+# Name of this node. Must be a valid hostname, FQDN, or IP
+# address. Must match "host" option, if running Nova. (string
+# value)
+# rpc_zmq_host=oslo
+
+# Seconds to wait before a cast expires (TTL). Only supported
+# by impl_zmq. (integer value)
+# rpc_cast_timeout=30
+
+# Heartbeat frequency. (integer value)
+# matchmaker_heartbeat_freq=300
+
+# Heartbeat time-to-live. (integer value)
+# matchmaker_heartbeat_ttl=600
+
+# Size of RPC greenthread pool. (integer value)
+# rpc_thread_pool_size=64
+
+# Driver or drivers to handle sending notifications. (multi
+# valued)
+notification_driver = neutron.openstack.common.notifier.rpc_notifier
+
+# AMQP topic used for OpenStack notifications. (list value)
+# Deprecated group/name - [rpc_notifier2]/topics
+# notification_topics=notifications
+
+# Seconds to wait for a response from a call. (integer value)
+# rpc_response_timeout=60
+
+# A URL representing the messaging driver to use and its full
+# configuration. If not set, we fall back to the rpc_backend
+# option and driver specific configuration. (string value)
+# transport_url=
+
+# The messaging driver to use, defaults to rabbit. Other
+# drivers include qpid and zmq. (string value)
+rpc_backend = rabbit
+
+# The default exchange under which topics are scoped. May be
+# overridden by an exchange name specified in the
+# transport_url option. (string value)
+# control_exchange=openstack
+
+
+[matchmaker_redis]
+
+#
+# Options defined in oslo.messaging
+#
+
+# Host to locate redis. (string value)
+# host=127.0.0.1
+
+# Use this port to connect to redis host. (integer value)
+# port=6379
+
+# Password for Redis server (optional). (string value)
+# password=
+
+
+[matchmaker_ring]
+
+#
+# Options defined in oslo.messaging
+#
+
+# Matchmaker ring file (JSON). (string value)
+# Deprecated group/name - [DEFAULT]/matchmaker_ringfile
+# ringfile=/etc/oslo/matchmaker_ring.json
+
+[quotas]
+# Default driver to use for quota checks
+# quota_driver = neutron.db.quota_db.DbQuotaDriver
+
+# Resource name(s) that are supported in quota features
+# This option is deprecated for removal in the M release, please refrain from using it
+# quota_items = network,subnet,port
+
+# Default number of resource allowed per tenant. A negative value means
+# unlimited.
+# default_quota = -1
+
+# Number of networks allowed per tenant. A negative value means unlimited.
+# quota_network = 10
+
+# Number of subnets allowed per tenant. A negative value means unlimited.
+# quota_subnet = 10
+
+# Number of ports allowed per tenant. A negative value means unlimited.
+# quota_port = 50
+
+# Number of security groups allowed per tenant. A negative value means
+# unlimited.
+# quota_security_group = 10
+
+# Number of security group rules allowed per tenant. A negative value means
+# unlimited.
+# quota_security_group_rule = 100
+
+# Number of vips allowed per tenant. A negative value means unlimited.
+# quota_vip = 10
+
+# Number of pools allowed per tenant. A negative value means unlimited.
+# quota_pool = 10
+
+# Number of pool members allowed per tenant. A negative value means unlimited.
+# The default is unlimited because a member is not a real resource consumer
+# on Openstack. However, on back-end, a member is a resource consumer
+# and that is the reason why quota is possible.
+# quota_member = -1
+
+# Number of health monitors allowed per tenant. A negative value means
+# unlimited.
+# The default is unlimited because a health monitor is not a real resource
+# consumer on Openstack. However, on back-end, a member is a resource consumer
+# and that is the reason why quota is possible.
+# quota_health_monitor = -1
+
+# Number of loadbalancers allowed per tenant. A negative value means unlimited.
+# quota_loadbalancer = 10
+
+# Number of listeners allowed per tenant. A negative value means unlimited.
+# quota_listener = -1
+
+# Number of v2 health monitors allowed per tenant. A negative value means
+# unlimited. These health monitors exist under the lbaas v2 API
+# quota_healthmonitor = -1
+
+# Number of routers allowed per tenant. A negative value means unlimited.
+# quota_router = 10
+
+# Number of floating IPs allowed per tenant. A negative value means unlimited.
+# quota_floatingip = 50
+
+# Number of firewalls allowed per tenant. A negative value means unlimited.
+# quota_firewall = 1
+
+# Number of firewall policies allowed per tenant. A negative value means
+# unlimited.
+# quota_firewall_policy = 1
+
+# Number of firewall rules allowed per tenant. A negative value means
+# unlimited.
+# quota_firewall_rule = 100
+
+[agent]
+# Use "sudo neutron-rootwrap /etc/neutron/rootwrap.conf" to use the real
+# root filter facility.
+# Change to "sudo" to skip the filtering and just run the command directly
+root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
+
+# Set to true to add comments to generated iptables rules that describe
+# each rule's purpose. (System must support the iptables comments module.)
+# comment_iptables_rules = True
+
+# Root helper daemon application to use when possible.
+# root_helper_daemon =
+
+# Use the root helper when listing the namespaces on a system. This may not
+# be required depending on the security configuration. If the root helper is
+# not required, set this to False for a performance improvement.
+# use_helper_for_ns_read = True
+
+# The interval to check external processes for failure in seconds (0=disabled)
+# check_child_processes_interval = 60
+
+# Action to take when an external process spawned by an agent dies
+# Values:
+# respawn - Respawns the external process
+# exit - Exits the agent
+# check_child_processes_action = respawn
+
+# =========== items for agent management extension =============
+# seconds between nodes reporting state to server; should be less than
+# agent_down_time, best if it is half or less than agent_down_time
+# report_interval = 30
+
+# =========== end of items for agent management extension =====
+
+[keystone_authtoken]
+auth_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:5000/v2.0
+identity_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:35357
+admin_tenant_name = service
+admin_user = {{ NEUTRON_SERVICE_USER }}
+admin_password = {{ NEUTRON_SERVICE_PASSWORD }}
+
+[database]
+# This line MUST be changed to actually run the plugin.
+# Example:
+# connection = mysql://root:pass@127.0.0.1:3306/neutron
+# Replace 127.0.0.1 above with the IP address of the database used by the
+# main neutron server. (Leave it as is if the database runs on this host.)
+connection=postgresql://{{ NEUTRON_DB_USER }}:{{ NEUTRON_DB_PASSWORD }}@{{ CONTROLLER_HOST_ADDRESS }}/neutron
+
+# NOTE: In deployment the [database] section and its connection attribute may
+# be set in the corresponding core plugin '.ini' file. However, it is suggested
+# to put the [database] section and its connection attribute in this
+# configuration file.
+
+# Database engine for which script will be generated when using offline
+# migration
+# engine =
+
+# The SQLAlchemy connection string used to connect to the slave database
+# slave_connection =
+
+# Database reconnection retry times - in event connectivity is lost
+# set to -1 implies an infinite retry count
+# max_retries = 10
+
+# Database reconnection interval in seconds - if the initial connection to the
+# database fails
+# retry_interval = 10
+
+# Minimum number of SQL connections to keep open in a pool
+# min_pool_size = 1
+
+# Maximum number of SQL connections to keep open in a pool
+# max_pool_size = 10
+
+# Timeout in seconds before idle sql connections are reaped
+# idle_timeout = 3600
+
+# If set, use this value for max_overflow with sqlalchemy
+# max_overflow = 20
+
+# Verbosity of SQL debugging information. 0=None, 100=Everything
+# connection_debug = 0
+
+# Add python stack traces to SQL as comment strings
+# connection_trace = False
+
+# If set, use this value for pool_timeout with sqlalchemy
+# pool_timeout = 10
+
+[nova]
+# Name of the plugin to load
+auth_plugin = password
+
+# Config Section from which to load plugin specific options
+# auth_section =
+
+# PEM encoded Certificate Authority to use when verifying HTTPs connections.
+# cafile =
+
+# PEM encoded client certificate cert file
+# certfile =
+
+# Verify HTTPS connections.
+# insecure = False
+
+# PEM encoded client certificate key file
+# keyfile =
+
+# Name of nova region to use. Useful if keystone manages more than one region.
+region_name = regionOne
+
+# Timeout value for http requests
+# timeout =
+
+# Authorization URL for connection to nova in admin context.
+auth_url = http://{{ CONTROLLER_HOST_ADDRESS }}:35357/v2.0
+
+# Username for connection to nova in admin context
+username = {{ NOVA_SERVICE_USER }}
+
+# Password for connection to nova in admin context.
+password = {{ NOVA_SERVICE_PASSWORD }}
+
+# The uuid of the admin nova tenant
+# tenant_id =
+
+# The name of the admin nova tenant. If the uuid of the admin nova tenant
+# is set, this is optional. Useful for cases where the uuid of the admin
+# nova tenant is not available when configuration is being done.
+tenant_name = service
+
+[oslo_concurrency]
+
+# Directory to use for lock files. For security, the specified directory should
+# only be writable by the user running the processes that need locking.
+# Defaults to environment variable OSLO_LOCK_PATH. If external locks are used,
+# a lock path must be set.
+lock_path = $state_path/lock
+
+# Enables or disables inter-process locks.
+# disable_process_locking = False
+
+[oslo_policy]
+
+# The JSON file that defines policies.
+# policy_file = policy.json
+
+# Default rule. Enforced when a requested rule is not found.
+# policy_default_rule = default
+
+# Directories where policy configuration files are stored.
+# They can be relative to any directory in the search path defined by the
+# config_dir option, or absolute paths. The file defined by policy_file
+# must exist for these directories to be searched. Missing or empty
+# directories are ignored.
+# policy_dirs = policy.d
+
+[oslo_messaging_amqp]
+
+#
+# From oslo.messaging
+#
+
+# Address prefix used when sending to a specific server (string value)
+# Deprecated group/name - [amqp1]/server_request_prefix
+# server_request_prefix = exclusive
+
+# Address prefix used when broadcasting to all servers (string value)
+# Deprecated group/name - [amqp1]/broadcast_prefix
+# broadcast_prefix = broadcast
+
+# Address prefix when sending to any server in group (string value)
+# Deprecated group/name - [amqp1]/group_request_prefix
+# group_request_prefix = unicast
+
+# Name for the AMQP container (string value)
+# Deprecated group/name - [amqp1]/container_name
+# container_name =
+
+# Timeout for inactive connections (in seconds) (integer value)
+# Deprecated group/name - [amqp1]/idle_timeout
+# idle_timeout = 0
+
+# Debug: dump AMQP frames to stdout (boolean value)
+# Deprecated group/name - [amqp1]/trace
+# trace = false
+
+# CA certificate PEM file for verifing server certificate (string value)
+# Deprecated group/name - [amqp1]/ssl_ca_file
+# ssl_ca_file =
+
+# Identifying certificate PEM file to present to clients (string value)
+# Deprecated group/name - [amqp1]/ssl_cert_file
+# ssl_cert_file =
+
+# Private key PEM file used to sign cert_file certificate (string value)
+# Deprecated group/name - [amqp1]/ssl_key_file
+# ssl_key_file =
+
+# Password for decrypting ssl_key_file (if encrypted) (string value)
+# Deprecated group/name - [amqp1]/ssl_key_password
+# ssl_key_password =
+
+# Accept clients using either SSL or plain TCP (boolean value)
+# Deprecated group/name - [amqp1]/allow_insecure_clients
+# allow_insecure_clients = false
+
+
+[oslo_messaging_qpid]
+
+#
+# From oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+# amqp_durable_queues = false
+
+# Auto-delete queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/amqp_auto_delete
+# amqp_auto_delete = false
+
+# Size of RPC connection pool. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_conn_pool_size
+# rpc_conn_pool_size = 30
+
+# Qpid broker hostname. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_hostname
+# qpid_hostname = localhost
+
+# Qpid broker port. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_port
+# qpid_port = 5672
+
+# Qpid HA cluster host:port pairs. (list value)
+# Deprecated group/name - [DEFAULT]/qpid_hosts
+# qpid_hosts = $qpid_hostname:$qpid_port
+
+# Username for Qpid connection. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_username
+# qpid_username =
+
+# Password for Qpid connection. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_password
+# qpid_password =
+
+# Space separated list of SASL mechanisms to use for auth. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_sasl_mechanisms
+# qpid_sasl_mechanisms =
+
+# Seconds between connection keepalive heartbeats. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_heartbeat
+# qpid_heartbeat = 60
+
+# Transport to use, either 'tcp' or 'ssl'. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_protocol
+# qpid_protocol = tcp
+
+# Whether to disable the Nagle algorithm. (boolean value)
+# Deprecated group/name - [DEFAULT]/qpid_tcp_nodelay
+# qpid_tcp_nodelay = true
+
+# The number of prefetched messages held by receiver. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_receiver_capacity
+# qpid_receiver_capacity = 1
+
+# The qpid topology version to use. Version 1 is what was originally used by
+# impl_qpid. Version 2 includes some backwards-incompatible changes that allow
+# broker federation to work. Users should update to version 2 when they are
+# able to take everything down, as it requires a clean break. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_topology_version
+# qpid_topology_version = 1
+
+
+[oslo_messaging_rabbit]
+
+#
+# From oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+# amqp_durable_queues = false
+
+# Auto-delete queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/amqp_auto_delete
+# amqp_auto_delete = false
+
+# Size of RPC connection pool. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_conn_pool_size
+# rpc_conn_pool_size = 30
+
+# SSL version to use (valid only if SSL enabled). Valid values are TLSv1 and
+# SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may be available on some
+# distributions. (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_version
+# kombu_ssl_version =
+
+# SSL key file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_keyfile
+# kombu_ssl_keyfile =
+
+# SSL cert file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_certfile
+# kombu_ssl_certfile =
+
+# SSL certification authority file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_ca_certs
+# kombu_ssl_ca_certs =
+
+# How long to wait before reconnecting in response to an AMQP consumer cancel
+# notification. (floating point value)
+# Deprecated group/name - [DEFAULT]/kombu_reconnect_delay
+# kombu_reconnect_delay = 1.0
+
+# The RabbitMQ broker address where a single node is used. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_host
+rabbit_host = {{ RABBITMQ_HOST }}
+
+# The RabbitMQ broker port where a single node is used. (integer value)
+# Deprecated group/name - [DEFAULT]/rabbit_port
+rabbit_port = {{ RABBITMQ_PORT }}
+
+# RabbitMQ HA cluster host:port pairs. (list value)
+# Deprecated group/name - [DEFAULT]/rabbit_hosts
+# rabbit_hosts = $rabbit_host:$rabbit_port
+
+# Connect over SSL for RabbitMQ. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_use_ssl
+# rabbit_use_ssl = false
+
+# The RabbitMQ userid. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_userid
+rabbit_userid = {{ RABBITMQ_USER }}
+
+# The RabbitMQ password. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_password
+rabbit_password = {{ RABBITMQ_PASSWORD }}
+
+# The RabbitMQ login method. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_login_method
+# rabbit_login_method = AMQPLAIN
+
+# The RabbitMQ virtual host. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_virtual_host
+# rabbit_virtual_host = /
+
+# How frequently to retry connecting with RabbitMQ. (integer value)
+# rabbit_retry_interval = 1
+
+# How long to backoff for between retries when connecting to RabbitMQ. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/rabbit_retry_backoff
+# rabbit_retry_backoff = 2
+
+# Maximum number of RabbitMQ connection retries. Default is 0 (infinite retry
+# count). (integer value)
+# Deprecated group/name - [DEFAULT]/rabbit_max_retries
+# rabbit_max_retries = 0
+
+# Use HA queues in RabbitMQ (x-ha-policy: all). If you change this option, you
+# must wipe the RabbitMQ database. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_ha_queues
+# rabbit_ha_queues = false
+
+# Deprecated, use rpc_backend=kombu+memory or rpc_backend=fake (boolean value)
+# Deprecated group/name - [DEFAULT]/fake_rabbit
+# fake_rabbit = false
diff --git a/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf.ini
new file mode 100644
index 00000000..3258a40f
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ml2/ml2_conf.ini
@@ -0,0 +1,113 @@
+[ml2]
+# (ListOpt) List of network type driver entrypoints to be loaded from
+# the neutron.ml2.type_drivers namespace.
+#
+type_drivers = flat,gre
+# Example: type_drivers = flat,vlan,gre,vxlan
+
+# (ListOpt) Ordered list of network_types to allocate as tenant
+# networks. The default value 'local' is useful for single-box testing
+# but provides no connectivity between hosts.
+#
+tenant_network_types = gre
+# Example: tenant_network_types = vlan,gre,vxlan
+
+# (ListOpt) Ordered list of networking mechanism driver entrypoints
+# to be loaded from the neutron.ml2.mechanism_drivers namespace.
+mechanism_drivers = openvswitch
+# Example: mechanism_drivers = openvswitch,mlnx
+# Example: mechanism_drivers = arista
+# Example: mechanism_drivers = cisco,logger
+# Example: mechanism_drivers = openvswitch,brocade
+# Example: mechanism_drivers = linuxbridge,brocade
+
+# (ListOpt) Ordered list of extension driver entrypoints
+# to be loaded from the neutron.ml2.extension_drivers namespace.
+# extension_drivers =
+# Example: extension_drivers = anewextensiondriver
+
+# =========== items for MTU selection and advertisement =============
+# (IntOpt) Path MTU. The maximum permissible size of an unfragmented
+# packet travelling from and to addresses where encapsulated Neutron
+# traffic is sent. Drivers calculate maximum viable MTU for
+# validating tenant requests based on this value (typically,
+# path_mtu - max encap header size). If <=0, the path MTU is
+# indeterminate and no calculation takes place.
+# path_mtu = 0
+
+# (IntOpt) Segment MTU. The maximum permissible size of an
+# unfragmented packet travelling a L2 network segment. If <=0,
+# the segment MTU is indeterminate and no calculation takes place.
+# segment_mtu = 0
+
+# (ListOpt) Physical network MTUs. List of mappings of physical
+# network to MTU value. The format of the mapping is
+# <physnet>:<mtu val>. This mapping allows specifying a
+# physical network MTU value that differs from the default
+# segment_mtu value.
+# physical_network_mtus =
+# Example: physical_network_mtus = physnet1:1550, physnet2:1500
+# ======== end of items for MTU selection and advertisement =========
+
+# (StrOpt) Default network type for external networks when no provider
+# attributes are specified. By default it is None, which means that if
+# provider attributes are not specified while creating external networks
+# then they will have the same type as tenant networks.
+# Allowed values for external_network_type config option depend on the
+# network type values configured in type_drivers config option.
+# external_network_type =
+# Example: external_network_type = local
+
+[ml2_type_flat]
+# (ListOpt) List of physical_network names with which flat networks
+# can be created. Use * to allow flat networks with arbitrary
+# physical_network names.
+#
+flat_networks = External
+# Example:flat_networks = physnet1,physnet2
+# Example:flat_networks = *
+
+[ml2_type_vlan]
+# (ListOpt) List of <physical_network>[:<vlan_min>:<vlan_max>] tuples
+# specifying physical_network names usable for VLAN provider and
+# tenant networks, as well as ranges of VLAN tags on each
+# physical_network available for allocation as tenant networks.
+#
+# network_vlan_ranges =
+# Example: network_vlan_ranges = physnet1:1000:2999,physnet2
+
+[ml2_type_gre]
+# (ListOpt) Comma-separated list of <tun_min>:<tun_max> tuples enumerating ranges of GRE tunnel IDs that are available for tenant network allocation
+tunnel_id_ranges = 1:1000
+
+[ml2_type_vxlan]
+# (ListOpt) Comma-separated list of <vni_min>:<vni_max> tuples enumerating
+# ranges of VXLAN VNI IDs that are available for tenant network allocation.
+#
+# vni_ranges =
+
+# (StrOpt) Multicast group for the VXLAN interface. When configured, will
+# enable sending all broadcast traffic to this multicast group. When left
+# unconfigured, will disable multicast VXLAN mode.
+#
+# vxlan_group =
+# Example: vxlan_group = 239.1.1.1
+
+[securitygroup]
+# Controls if neutron security group is enabled or not.
+# It should be false when you use nova security group.
+enable_security_group = True
+
+# Use ipset to speed-up the iptables security groups. Enabling ipset support
+# requires that ipset is installed on L2 agent node.
+enable_ipset = True
+
+firewall_driver=neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
+
+[ovs]
+local_ip = {{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+enable_tunneling = True
+bridge_mappings=External:br-ex
+
+[agent]
+tunnel_types = gre
diff --git a/install-files/openstack/usr/share/openstack/neutron/plugins/ryu/ryu.ini b/install-files/openstack/usr/share/openstack/neutron/plugins/ryu/ryu.ini
new file mode 100644
index 00000000..9d9cfa25
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/neutron/plugins/ryu/ryu.ini
@@ -0,0 +1,44 @@
+[ovs]
+# integration_bridge = br-int
+
+# openflow_rest_api = <host IP address of ofp rest api service>:<port: 8080>
+# openflow_rest_api = 127.0.0.1:8080
+
+# tunnel key range: 0 < tunnel_key_min < tunnel_key_max
+# VLAN: 12bits, GRE, VXLAN: 24bits
+# tunnel_key_min = 1
+# tunnel_key_max = 0xffffff
+
+# tunnel_ip = <ip address for tunneling>
+# tunnel_interface = interface for tunneling
+# when tunnel_ip is NOT specified, ip address is read
+# from this interface
+# tunnel_ip =
+# tunnel_interface =
+tunnel_interface = eth0
+
+# ovsdb_port = port number on which ovsdb is listening
+# ryu-agent uses this parameter to setup ovsdb.
+# ovs-vsctl set-manager ptcp:<ovsdb_port>
+# See set-manager section of man ovs-vsctl for details.
+# currently ptcp is only supported.
+# ovsdb_ip = <host IP address on which ovsdb is listening>
+# ovsdb_interface = interface for ovsdb
+# when ovsdb_addr NOT specifiied, ip address is gotten
+# from this interface
+# ovsdb_port = 6634
+# ovsdb_ip =
+# ovsdb_interface =
+ovsdb_interface = eth0
+
+[securitygroup]
+# Firewall driver for realizing neutron security group function
+# firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
+
+# Controls if neutron security group is enabled or not.
+# It should be false when you use nova security group.
+# enable_security_group = True
+
+[agent]
+# Agent's polling interval in seconds
+# polling_interval = 2
diff --git a/install-files/openstack/usr/share/openstack/nova-config.yml b/install-files/openstack/usr/share/openstack/nova-config.yml
new file mode 100644
index 00000000..4f43db39
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/nova-config.yml
@@ -0,0 +1,34 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/nova.conf"
+ tasks:
+ - name: Create the nova user.
+ user:
+ name: nova
+ comment: Openstack Nova Daemons
+ shell: /sbin/nologin
+ home: /var/lib/nova
+ groups: libvirt
+ append: yes
+
+ - name: Create the /var folders for nova
+ file:
+ path: "{{ item }}"
+ state: directory
+ owner: nova
+ group: nova
+ with_items:
+ - /var/run/nova
+ - /var/lock/nova
+ - /var/log/nova
+ - /var/lib/nova
+ - /var/lib/nova/instances
+
+ - file: path=/etc/nova state=directory
+ - name: Add the configuration needed for nova in /etc/nova using templates
+ template:
+ src: /usr/share/openstack/nova/{{ item }}
+ dest: /etc/nova/{{ item }}
+ with_lines:
+ - cd /usr/share/openstack/nova && find -type f
diff --git a/install-files/openstack/usr/share/openstack/nova-db.yml b/install-files/openstack/usr/share/openstack/nova-db.yml
new file mode 100644
index 00000000..0e933ba8
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/nova-db.yml
@@ -0,0 +1,50 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/nova.conf"
+ tasks:
+ - name: Create nova service user in service tenant
+ keystone_user:
+ user: "{{ NOVA_SERVICE_USER }}"
+ password: "{{ NOVA_SERVICE_PASSWORD }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Assign admin role to nova service user in the service tenant
+ keystone_user:
+ role: admin
+ user: "{{ NOVA_SERVICE_USER }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Add nova endpoint
+ keystone_service:
+ name: nova
+ type: compute
+ description: Openstack Compute Service
+ publicurl: 'http://{{ ansible_hostname }}:8774/v2/%(tenant_id)s'
+ internalurl: 'http://{{ CONTROLLER_HOST_ADDRESS }}:8774/v2/%(tenant_id)s'
+ adminurl: 'http://{{ CONTROLLER_HOST_ADDRESS }}:8774/v2/%(tenant_id)s'
+ region: 'regionOne'
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - name: Create postgresql user for nova
+ postgresql_user:
+ name: "{{ NOVA_DB_USER }}"
+ login_host: "{{ CONTROLLER_HOST_ADDRESS }}"
+ password: "{{ NOVA_DB_PASSWORD }}"
+ sudo: yes
+ sudo_user: nova
+
+ - name: Create database for nova services
+ postgresql_db:
+ name: nova
+ owner: "{{ NOVA_DB_USER }}"
+ login_host: "{{ CONTROLLER_HOST_ADDRESS }}"
+ sudo: yes
+ sudo_user: nova
+
+ - name: Initiate nova database
+ command: nova-manage db sync
+ sudo: yes
+ sudo_user: nova
diff --git a/install-files/openstack/usr/share/openstack/nova/nova-compute.conf b/install-files/openstack/usr/share/openstack/nova/nova-compute.conf
new file mode 100644
index 00000000..8d186211
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/nova/nova-compute.conf
@@ -0,0 +1,4 @@
+[DEFAULT]
+compute_driver={{ COMPUTE_DRIVER }}
+[libvirt]
+virt_type={{ NOVA_VIRT_TYPE }}
diff --git a/install-files/openstack/usr/share/openstack/nova/nova.conf b/install-files/openstack/usr/share/openstack/nova/nova.conf
new file mode 100644
index 00000000..f2db93fc
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/nova/nova.conf
@@ -0,0 +1,4008 @@
+[DEFAULT]
+
+#
+# From oslo.messaging
+#
+
+# ZeroMQ bind address. Should be a wildcard (*), an ethernet interface, or IP.
+# The "host" option should point or resolve to this address. (string value)
+#rpc_zmq_bind_address = *
+
+# MatchMaker driver. (string value)
+#rpc_zmq_matchmaker = oslo_messaging._drivers.matchmaker.MatchMakerLocalhost
+
+# ZeroMQ receiver listening port. (integer value)
+#rpc_zmq_port = 9501
+
+# Number of ZeroMQ contexts, defaults to 1. (integer value)
+#rpc_zmq_contexts = 1
+
+# Maximum number of ingress messages to locally buffer per topic. Default is
+# unlimited. (integer value)
+#rpc_zmq_topic_backlog = <None>
+
+# Directory for holding IPC sockets. (string value)
+#rpc_zmq_ipc_dir = /var/run/openstack
+
+# Name of this node. Must be a valid hostname, FQDN, or IP address. Must match
+# "host" option, if running Nova. (string value)
+#rpc_zmq_host = localhost
+
+# Seconds to wait before a cast expires (TTL). Only supported by impl_zmq.
+# (integer value)
+#rpc_cast_timeout = 30
+
+# Heartbeat frequency. (integer value)
+#matchmaker_heartbeat_freq = 300
+
+# Heartbeat time-to-live. (integer value)
+#matchmaker_heartbeat_ttl = 600
+
+# Size of RPC thread pool. (integer value)
+#rpc_thread_pool_size = 64
+
+# Driver or drivers to handle sending notifications. (multi valued)
+notification_driver = messagingv2
+
+# AMQP topic used for OpenStack notifications. (list value)
+# Deprecated group/name - [rpc_notifier2]/topics
+#notification_topics = notifications
+
+# Seconds to wait for a response from a call. (integer value)
+#rpc_response_timeout = 60
+
+# A URL representing the messaging driver to use and its full configuration. If
+# not set, we fall back to the rpc_backend option and driver specific
+# configuration. (string value)
+#transport_url = <None>
+
+# The messaging driver to use, defaults to rabbit. Other drivers include qpid
+# and zmq. (string value)
+rpc_backend = rabbit
+
+# The default exchange under which topics are scoped. May be overridden by an
+# exchange name specified in the transport_url option. (string value)
+#control_exchange = openstack
+
+
+#
+# Options defined in nova.availability_zones
+#
+
+# The availability_zone to show internal services under
+# (string value)
+#internal_service_availability_zone=internal
+
+# Default compute node availability_zone (string value)
+#default_availability_zone=nova
+
+
+#
+# Options defined in nova.crypto
+#
+
+# Filename of root CA (string value)
+#ca_file=cacert.pem
+
+# Filename of private key (string value)
+#key_file=private/cakey.pem
+
+# Filename of root Certificate Revocation List (string value)
+#crl_file=crl.pem
+
+# Where we keep our keys (string value)
+#keys_path=$state_path/keys
+
+# Where we keep our root CA (string value)
+#ca_path=$state_path/CA
+
+# Should we use a CA for each project? (boolean value)
+#use_project_ca=false
+
+# Subject for certificate for users, %s for project, user,
+# timestamp (string value)
+#user_cert_subject=/C=US/ST=California/O=OpenStack/OU=NovaDev/CN=%.16s-%.16s-%s
+
+# Subject for certificate for projects, %s for project,
+# timestamp (string value)
+#project_cert_subject=/C=US/ST=California/O=OpenStack/OU=NovaDev/CN=project-ca-%.16s-%s
+
+
+#
+# Options defined in nova.exception
+#
+
+# Make exception message format errors fatal (boolean value)
+#fatal_exception_format_errors=false
+
+
+#
+# Options defined in nova.netconf
+#
+
+# IP address of this host (string value)
+my_ip={{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+
+# Block storage IP address of this host (string value)
+#my_block_storage_ip=$my_ip
+
+# Name of this node. This can be an opaque identifier. It is
+# not necessarily a hostname, FQDN, or IP address. However,
+# the node name must be valid within an AMQP key, and if using
+# ZeroMQ, a valid hostname, FQDN, or IP address (string value)
+#host=nova
+
+# Use IPv6 (boolean value)
+#use_ipv6=false
+
+
+#
+# Options defined in nova.notifications
+#
+
+# If set, send compute.instance.update notifications on
+# instance state changes. Valid values are None for no
+# notifications, "vm_state" for notifications on VM state
+# changes, or "vm_and_task_state" for notifications on VM and
+# task state changes. (string value)
+notify_on_state_change=vm_and_task_state
+
+# If set, send api.fault notifications on caught exceptions in
+# the API service. (boolean value)
+#notify_api_faults=false
+
+# Default notification level for outgoing notifications
+# (string value)
+#default_notification_level=INFO
+
+# Default publisher_id for outgoing notifications (string
+# value)
+#default_publisher_id=<None>
+
+
+#
+# Options defined in nova.paths
+#
+
+# Directory where the nova python module is installed (string
+# value)
+#pybasedir=/usr/lib/python/site-packages
+
+# Directory where nova binaries are installed (string value)
+#bindir=/usr/local/bin
+
+# Top-level directory for maintaining nova's state (string
+# value)
+state_path=/var/lib/nova
+
+
+#
+# Options defined in nova.quota
+#
+
+# Number of instances allowed per project (integer value)
+#quota_instances=10
+
+# Number of instance cores allowed per project (integer value)
+#quota_cores=20
+
+# Megabytes of instance RAM allowed per project (integer
+# value)
+#quota_ram=51200
+
+# Number of floating IPs allowed per project (integer value)
+#quota_floating_ips=10
+
+# Number of fixed IPs allowed per project (this should be at
+# least the number of instances allowed) (integer value)
+#quota_fixed_ips=-1
+
+# Number of metadata items allowed per instance (integer
+# value)
+#quota_metadata_items=128
+
+# Number of injected files allowed (integer value)
+#quota_injected_files=5
+
+# Number of bytes allowed per injected file (integer value)
+#quota_injected_file_content_bytes=10240
+
+# Length of injected file path (integer value)
+#quota_injected_file_path_length=255
+
+# Number of security groups per project (integer value)
+#quota_security_groups=10
+
+# Number of security rules per security group (integer value)
+#quota_security_group_rules=20
+
+# Number of key pairs per user (integer value)
+#quota_key_pairs=100
+
+# Number of server groups per project (integer value)
+#quota_server_groups=10
+
+# Number of servers per server group (integer value)
+#quota_server_group_members=10
+
+# Number of seconds until a reservation expires (integer
+# value)
+#reservation_expire=86400
+
+# Count of reservations until usage is refreshed. This
+# defaults to 0(off) to avoid additional load but it is useful
+# to turn on to help keep quota usage up to date and reduce
+# the impact of out of sync usage issues. (integer value)
+#until_refresh=0
+
+# Number of seconds between subsequent usage refreshes. This
+# defaults to 0(off) to avoid additional load but it is useful
+# to turn on to help keep quota usage up to date and reduce
+# the impact of out of sync usage issues. Note that quotas are
+# not updated on a periodic task, they will update on a new
+# reservation if max_age has passed since the last reservation
+# (integer value)
+#max_age=0
+
+# Default driver to use for quota checks (string value)
+#quota_driver=nova.quota.DbQuotaDriver
+
+
+#
+# Options defined in nova.service
+#
+
+# Seconds between nodes reporting state to datastore (integer
+# value)
+#report_interval=10
+
+# Enable periodic tasks (boolean value)
+#periodic_enable=true
+
+# Range of seconds to randomly delay when starting the
+# periodic task scheduler to reduce stampeding. (Disable by
+# setting to 0) (integer value)
+#periodic_fuzzy_delay=60
+
+# A list of APIs to enable by default (list value)
+enabled_apis=ec2,osapi_compute,metadata
+
+# A list of APIs with enabled SSL (list value)
+#enabled_ssl_apis=
+
+# The IP address on which the EC2 API will listen. (string
+# value)
+#ec2_listen=0.0.0.0
+
+# The port on which the EC2 API will listen. (integer value)
+#ec2_listen_port=8773
+
+# Number of workers for EC2 API service. The default will be
+# equal to the number of CPUs available. (integer value)
+#ec2_workers=<None>
+
+# The IP address on which the OpenStack API will listen.
+# (string value)
+#osapi_compute_listen=0.0.0.0
+
+# The port on which the OpenStack API will listen. (integer
+# value)
+#osapi_compute_listen_port=8774
+
+# Number of workers for OpenStack API service. The default
+# will be the number of CPUs available. (integer value)
+#osapi_compute_workers=<None>
+
+# OpenStack metadata service manager (string value)
+#metadata_manager=nova.api.manager.MetadataManager
+
+# The IP address on which the metadata API will listen.
+# (string value)
+#metadata_listen=0.0.0.0
+
+# The port on which the metadata API will listen. (integer
+# value)
+#metadata_listen_port=8775
+
+# Number of workers for metadata service. The default will be
+# the number of CPUs available. (integer value)
+#metadata_workers=<None>
+
+# Full class name for the Manager for compute (string value)
+compute_manager={{ COMPUTE_MANAGER }}
+
+# Full class name for the Manager for console proxy (string
+# value)
+#console_manager=nova.console.manager.ConsoleProxyManager
+
+# Manager for console auth (string value)
+#consoleauth_manager=nova.consoleauth.manager.ConsoleAuthManager
+
+# Full class name for the Manager for cert (string value)
+#cert_manager=nova.cert.manager.CertManager
+
+# Full class name for the Manager for network (string value)
+#network_manager=nova.network.manager.VlanManager
+
+# Full class name for the Manager for scheduler (string value)
+#scheduler_manager=nova.scheduler.manager.SchedulerManager
+
+# Maximum time since last check-in for up service (integer
+# value)
+#service_down_time=60
+
+
+#
+# Options defined in nova.utils
+#
+
+# Whether to log monkey patching (boolean value)
+#monkey_patch=false
+
+# List of modules/decorators to monkey patch (list value)
+#monkey_patch_modules=nova.api.ec2.cloud:nova.notifications.notify_decorator,nova.compute.api:nova.notifications.notify_decorator
+
+# Length of generated instance admin passwords (integer value)
+#password_length=12
+
+# Time period to generate instance usages for. Time period
+# must be hour, day, month or year (string value)
+instance_usage_audit_period=hour
+
+# Path to the rootwrap configuration file to use for running
+# commands as root (string value)
+rootwrap_config=/etc/nova/rootwrap.conf
+
+# Explicitly specify the temporary working directory (string
+# value)
+#tempdir=<None>
+
+
+#
+# Options defined in nova.wsgi
+#
+
+# File name for the paste.deploy config for nova-api (string
+# value)
+api_paste_config=api-paste.ini
+
+# A python format string that is used as the template to
+# generate log lines. The following values can be formatted
+# into it: client_ip, date_time, request_line, status_code,
+# body_length, wall_seconds. (string value)
+#wsgi_log_format=%(client_ip)s "%(request_line)s" status: %(status_code)s len: %(body_length)s time: %(wall_seconds).7f
+
+# CA certificate file to use to verify connecting clients
+# (string value)
+#ssl_ca_file=<None>
+
+# SSL certificate of API server (string value)
+#ssl_cert_file=<None>
+
+# SSL private key of API server (string value)
+#ssl_key_file=<None>
+
+# Sets the value of TCP_KEEPIDLE in seconds for each server
+# socket. Not supported on OS X. (integer value)
+#tcp_keepidle=600
+
+# Size of the pool of greenthreads used by wsgi (integer
+# value)
+#wsgi_default_pool_size=1000
+
+# Maximum line size of message headers to be accepted.
+# max_header_line may need to be increased when using large
+# tokens (typically those generated by the Keystone v3 API
+# with big service catalogs). (integer value)
+#max_header_line=16384
+
+# If False, closes the client socket connection explicitly.
+# (boolean value)
+#wsgi_keep_alive=true
+
+# Timeout for client connections' socket operations. If an
+# incoming connection is idle for this number of seconds it
+# will be closed. A value of '0' means wait forever. (integer
+# value)
+#client_socket_timeout=900
+
+
+#
+# Options defined in nova.api.auth
+#
+
+# Whether to use per-user rate limiting for the api. This
+# option is only used by v2 api. Rate limiting is removed from
+# v3 api. (boolean value)
+#api_rate_limit=false
+
+# The strategy to use for auth: keystone, noauth
+# (deprecated), or noauth2. Both noauth and noauth2 are
+# designed for testing only, as they do no actual credential
+# checking. noauth provides administrative credentials
+# regardless of the passed in user, noauth2 only does if
+# 'admin' is specified as the username. (string value)
+auth_strategy=keystone
+
+# Treat X-Forwarded-For as the canonical remote address. Only
+# enable this if you have a sanitizing proxy. (boolean value)
+#use_forwarded_for=false
+
+
+#
+# Options defined in nova.api.ec2
+#
+
+# Number of failed auths before lockout. (integer value)
+#lockout_attempts=5
+
+# Number of minutes to lockout if triggered. (integer value)
+#lockout_minutes=15
+
+# Number of minutes for lockout window. (integer value)
+#lockout_window=15
+
+# URL to get token from ec2 request. (string value)
+#keystone_ec2_url=http://localhost:5000/v2.0/ec2tokens
+
+# Return the IP address as private dns hostname in describe
+# instances (boolean value)
+#ec2_private_dns_show_ip=false
+
+# Validate security group names according to EC2 specification
+# (boolean value)
+#ec2_strict_validation=true
+
+# Time in seconds before ec2 timestamp expires (integer value)
+#ec2_timestamp_expiry=300
+
+# Disable SSL certificate verification. (boolean value)
+#keystone_ec2_insecure=false
+
+
+#
+# Options defined in nova.api.ec2.cloud
+#
+
+# The IP address of the EC2 API server (string value)
+#ec2_host=$my_ip
+
+# The internal IP address of the EC2 API server (string value)
+#ec2_dmz_host=$my_ip
+
+# The port of the EC2 API server (integer value)
+#ec2_port=8773
+
+# The protocol to use when connecting to the EC2 API server
+# (http, https) (string value)
+#ec2_scheme=http
+
+# The path prefix used to call the ec2 API server (string
+# value)
+#ec2_path=/
+
+# List of region=fqdn pairs separated by commas (list value)
+#region_list=
+
+
+#
+# Options defined in nova.api.metadata.base
+#
+
+# List of metadata versions to skip placing into the config
+# drive (string value)
+#config_drive_skip_versions=1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01
+
+# Driver to use for vendor data (string value)
+#vendordata_driver=nova.api.metadata.vendordata_json.JsonFileVendorData
+
+
+#
+# Options defined in nova.api.metadata.handler
+#
+
+# Time in seconds to cache metadata; 0 to disable metadata
+# caching entirely (not recommended). Increasingthis should
+# improve response times of the metadata API when under heavy
+# load. Higher values may increase memoryusage and result in
+# longer times for host metadata changes to take effect.
+# (integer value)
+#metadata_cache_expiration=15
+
+
+#
+# Options defined in nova.api.metadata.vendordata_json
+#
+
+# File to load JSON formatted vendor data from (string value)
+#vendordata_jsonfile_path=<None>
+
+
+#
+# Options defined in nova.api.openstack.common
+#
+
+# The maximum number of items returned in a single response
+# from a collection resource (integer value)
+#osapi_max_limit=1000
+
+# Base URL that will be presented to users in links to the
+# OpenStack Compute API (string value)
+#osapi_compute_link_prefix=<None>
+
+# Base URL that will be presented to users in links to glance
+# resources (string value)
+#osapi_glance_link_prefix=<None>
+
+
+#
+# Options defined in nova.api.openstack.compute
+#
+
+# Permit instance snapshot operations. (boolean value)
+#allow_instance_snapshots=true
+
+
+#
+# Options defined in nova.api.openstack.compute.contrib
+#
+
+# Specify list of extensions to load when using
+# osapi_compute_extension option with
+# nova.api.openstack.compute.contrib.select_extensions (list
+# value)
+#osapi_compute_ext_list=
+
+
+#
+# Options defined in nova.api.openstack.compute.contrib.fping
+#
+
+# Full path to fping. (string value)
+#fping_path=/usr/sbin/fping
+
+
+#
+# Options defined in nova.api.openstack.compute.contrib.os_tenant_networks
+#
+
+# Enables or disables quota checking for tenant networks
+# (boolean value)
+#enable_network_quota=false
+
+# Control for checking for default networks (string value)
+#use_neutron_default_nets=False
+
+# Default tenant id when creating neutron networks (string
+# value)
+#neutron_default_tenant_id=default
+
+# Number of private networks allowed per project (integer
+# value)
+#quota_networks=3
+
+
+#
+# Options defined in nova.api.openstack.compute.extensions
+#
+
+# osapi compute extension to load (multi valued)
+osapi_compute_extension=nova.api.openstack.compute.contrib.standard_extensions
+
+
+#
+# Options defined in nova.api.openstack.compute.plugins.v3.hide_server_addresses
+#
+
+# List of instance states that should hide network info (list
+# value)
+#osapi_hide_server_address_states=building
+
+
+#
+# Options defined in nova.api.openstack.compute.servers
+#
+
+# Enables returning of the instance password by the relevant
+# server API calls such as create, rebuild or rescue, If the
+# hypervisor does not support password injection then the
+# password returned will not be correct (boolean value)
+#enable_instance_password=true
+
+
+#
+# Options defined in nova.cert.rpcapi
+#
+
+# The topic cert nodes listen on (string value)
+#cert_topic=cert
+
+
+#
+# Options defined in nova.cloudpipe.pipelib
+#
+
+# Image ID used when starting up a cloudpipe vpn server
+# (string value)
+#vpn_image_id=0
+
+# Flavor for vpn instances (string value)
+#vpn_flavor=m1.tiny
+
+# Template for cloudpipe instance boot script (string value)
+#boot_script_template=$pybasedir/nova/cloudpipe/bootscript.template
+
+# Network to push into openvpn config (string value)
+#dmz_net=10.0.0.0
+
+# Netmask to push into openvpn config (string value)
+#dmz_mask=255.255.255.0
+
+# Suffix to add to project name for vpn key and secgroups
+# (string value)
+#vpn_key_suffix=-vpn
+
+
+#
+# Options defined in nova.cmd.novnc
+#
+
+# Record sessions to FILE.[session_number] (boolean value)
+#record=false
+
+# Become a daemon (background process) (boolean value)
+#daemon=false
+
+# Disallow non-encrypted connections (boolean value)
+#ssl_only=false
+
+# Source is ipv6 (boolean value)
+#source_is_ipv6=false
+
+# SSL certificate file (string value)
+#cert=self.pem
+
+# SSL key file (if separate from cert) (string value)
+#key=<None>
+
+# Run webserver on same port. Serve files from DIR. (string
+# value)
+#web=/usr/share/spice-html5
+
+
+#
+# Options defined in nova.cmd.novncproxy
+#
+
+# Host on which to listen for incoming requests (string value)
+#novncproxy_host=0.0.0.0
+
+# Port on which to listen for incoming requests (integer
+# value)
+#novncproxy_port=6080
+
+
+#
+# Options defined in nova.compute.api
+#
+
+# Allow destination machine to match source for resize. Useful
+# when testing in single-host environments. (boolean value)
+#allow_resize_to_same_host=false
+
+# Allow migrate machine to the same host. Useful when testing
+# in single-host environments. (boolean value)
+#allow_migrate_to_same_host=false
+
+# Availability zone to use when user doesn't specify one
+# (string value)
+#default_schedule_zone=<None>
+
+# These are image properties which a snapshot should not
+# inherit from an instance (list value)
+#non_inheritable_image_properties=cache_in_nova,bittorrent
+
+# Kernel image that indicates not to use a kernel, but to use
+# a raw disk image instead (string value)
+#null_kernel=nokernel
+
+# When creating multiple instances with a single request using
+# the os-multiple-create API extension, this template will be
+# used to build the display name for each instance. The
+# benefit is that the instances end up with different
+# hostnames. To restore legacy behavior of every instance
+# having the same name, set this option to "%(name)s". Valid
+# keys for the template are: name, uuid, count. (string value)
+#multi_instance_display_name_template=%(name)s-%(count)d
+
+# Maximum number of devices that will result in a local image
+# being created on the hypervisor node. Setting this to 0
+# means nova will allow only boot from volume. A negative
+# number means unlimited. (integer value)
+#max_local_block_devices=3
+
+
+#
+# Options defined in nova.compute.flavors
+#
+
+# Default flavor to use for the EC2 API only. The Nova API
+# does not support a default flavor. (string value)
+#default_flavor=m1.small
+
+
+#
+# Options defined in nova.compute.manager
+#
+
+# Console proxy host to use to connect to instances on this
+# host. (string value)
+#console_host=nova
+
+# Name of network to use to set access IPs for instances
+# (string value)
+#default_access_ip_network_name=<None>
+
+# Whether to batch up the application of IPTables rules during
+# a host restart and apply all at the end of the init phase
+# (boolean value)
+#defer_iptables_apply=false
+
+# Where instances are stored on disk (string value)
+#instances_path=$state_path/instances
+
+# Generate periodic compute.instance.exists notifications
+# (boolean value)
+instance_usage_audit= True
+
+# Number of 1 second retries needed in live_migration (integer
+# value)
+#live_migration_retry_count=30
+
+# Whether to start guests that were running before the host
+# rebooted (boolean value)
+#resume_guests_state_on_host_boot=false
+
+# Number of times to retry network allocation on failures
+# (integer value)
+#network_allocate_retries=0
+
+# Maximum number of instance builds to run concurrently
+# (integer value)
+#max_concurrent_builds=10
+
+# Number of times to retry block device allocation on failures
+# (integer value)
+#block_device_allocate_retries=60
+
+# The number of times to attempt to reap an instance's files.
+# (integer value)
+#maximum_instance_delete_attempts=5
+
+# Interval to pull network bandwidth usage info. Not supported
+# on all hypervisors. Set to -1 to disable. Setting this to 0
+# will run at the default rate. (integer value)
+#bandwidth_poll_interval=600
+
+# Interval to sync power states between the database and the
+# hypervisor. Set to -1 to disable. Setting this to 0 will run
+# at the default rate. (integer value)
+#sync_power_state_interval=600
+
+# Number of seconds between instance network information cache
+# updates (integer value)
+#heal_instance_info_cache_interval=60
+
+# Interval in seconds for reclaiming deleted instances
+# (integer value)
+#reclaim_instance_interval=0
+
+# Interval in seconds for gathering volume usages (integer
+# value)
+#volume_usage_poll_interval=0
+
+# Interval in seconds for polling shelved instances to
+# offload. Set to -1 to disable.Setting this to 0 will run at
+# the default rate. (integer value)
+#shelved_poll_interval=3600
+
+# Time in seconds before a shelved instance is eligible for
+# removing from a host. -1 never offload, 0 offload when
+# shelved (integer value)
+#shelved_offload_time=0
+
+# Interval in seconds for retrying failed instance file
+# deletes. Set to -1 to disable. Setting this to 0 will run at
+# the default rate. (integer value)
+#instance_delete_interval=300
+
+# Waiting time interval (seconds) between block device
+# allocation retries on failures (integer value)
+#block_device_allocate_retries_interval=3
+
+# Waiting time interval (seconds) between sending the
+# scheduler a list of current instance UUIDs to verify that
+# its view of instances is in sync with nova. If the CONF
+# option `scheduler_tracks_instance_changes` is False,
+# changing this option will have no effect. (integer value)
+#scheduler_instance_sync_interval=120
+
+# Action to take if a running deleted instance is detected.
+# Valid options are 'noop', 'log', 'shutdown', or 'reap'. Set
+# to 'noop' to take no action. (string value)
+#running_deleted_instance_action=reap
+
+# Number of seconds to wait between runs of the cleanup task.
+# (integer value)
+#running_deleted_instance_poll_interval=1800
+
+# Number of seconds after being deleted when a running
+# instance should be considered eligible for cleanup. (integer
+# value)
+#running_deleted_instance_timeout=0
+
+# Automatically hard reboot an instance if it has been stuck
+# in a rebooting state longer than N seconds. Set to 0 to
+# disable. (integer value)
+#reboot_timeout=0
+
+# Amount of time in seconds an instance can be in BUILD before
+# going into ERROR status. Set to 0 to disable. (integer
+# value)
+#instance_build_timeout=0
+
+# Automatically unrescue an instance after N seconds. Set to 0
+# to disable. (integer value)
+#rescue_timeout=0
+
+# Automatically confirm resizes after N seconds. Set to 0 to
+# disable. (integer value)
+#resize_confirm_window=0
+
+# Total amount of time to wait in seconds for an instance to
+# perform a clean shutdown. (integer value)
+#shutdown_timeout=60
+
+
+#
+# Options defined in nova.compute.monitors
+#
+
+# Monitor classes available to the compute which may be
+# specified more than once. (multi valued)
+#compute_available_monitors=nova.compute.monitors.all_monitors
+
+# A list of monitors that can be used for getting compute
+# metrics. (list value)
+#compute_monitors=
+
+
+#
+# Options defined in nova.compute.resource_tracker
+#
+
+# Amount of disk in MB to reserve for the host (integer value)
+#reserved_host_disk_mb=0
+
+# Amount of memory in MB to reserve for the host (integer
+# value)
+reserved_host_memory_mb={{ RESERVED_HOST_MEMORY_MB }}
+
+# Class that will manage stats for the local compute host
+# (string value)
+#compute_stats_class=nova.compute.stats.Stats
+
+# The names of the extra resources to track. (list value)
+#compute_resources=vcpu
+
+
+#
+# Options defined in nova.compute.rpcapi
+#
+
+# The topic compute nodes listen on (string value)
+#compute_topic=compute
+
+
+#
+# Options defined in nova.conductor.tasks.live_migrate
+#
+
+# Number of times to retry live-migration before failing. If
+# == -1, try until out of hosts. If == 0, only try once, no
+# retries. (integer value)
+#migrate_max_retries=-1
+
+
+#
+# Options defined in nova.console.manager
+#
+
+# Driver to use for the console proxy (string value)
+#console_driver=nova.console.xvp.XVPConsoleProxy
+
+# Stub calls to compute worker for tests (boolean value)
+#stub_compute=false
+
+# Publicly visible name for this console host (string value)
+#console_public_hostname=nova
+
+
+#
+# Options defined in nova.console.rpcapi
+#
+
+# The topic console proxy nodes listen on (string value)
+#console_topic=console
+
+
+#
+# Options defined in nova.console.xvp
+#
+
+# XVP conf template (string value)
+#console_xvp_conf_template=$pybasedir/nova/console/xvp.conf.template
+
+# Generated XVP conf file (string value)
+#console_xvp_conf=/etc/xvp.conf
+
+# XVP master process pid file (string value)
+#console_xvp_pid=/var/run/xvp.pid
+
+# XVP log file (string value)
+#console_xvp_log=/var/log/xvp.log
+
+# Port for XVP to multiplex VNC connections on (integer value)
+#console_xvp_multiplex_port=5900
+
+
+#
+# Options defined in nova.consoleauth
+#
+
+# The topic console auth proxy nodes listen on (string value)
+#consoleauth_topic=consoleauth
+
+
+#
+# Options defined in nova.consoleauth.manager
+#
+
+# How many seconds before deleting tokens (integer value)
+#console_token_ttl=600
+
+
+#
+# Options defined in nova.db.api
+#
+
+# Services to be added to the available pool on create
+# (boolean value)
+#enable_new_services=true
+
+# Template string to be used to generate instance names
+# (string value)
+instance_name_template=instance-%08x
+
+# Template string to be used to generate snapshot names
+# (string value)
+snapshot_name_template=snapshot-%s
+
+
+#
+# Options defined in nova.db.base
+#
+
+# The driver to use for database access (string value)
+#db_driver=nova.db
+
+
+#
+# Options defined in nova.db.sqlalchemy.api
+#
+
+# When set, compute API will consider duplicate hostnames
+# invalid within the specified scope, regardless of case.
+# Should be empty, "project" or "global". (string value)
+#osapi_compute_unique_server_name_scope=
+
+
+#
+# Options defined in nova.image.s3
+#
+
+# Parent directory for tempdir used for image decryption
+# (string value)
+#image_decryption_dir=/tmp
+
+# Hostname or IP for OpenStack to use when accessing the S3
+# api (string value)
+#s3_host=$my_ip
+
+# Port used when accessing the S3 api (integer value)
+#s3_port=3333
+
+# Access key to use for S3 server for images (string value)
+#s3_access_key=notchecked
+
+# Secret key to use for S3 server for images (string value)
+#s3_secret_key=notchecked
+
+# Whether to use SSL when talking to S3 (boolean value)
+#s3_use_ssl=false
+
+# Whether to affix the tenant id to the access key when
+# downloading from S3 (boolean value)
+#s3_affix_tenant=false
+
+
+#
+# Options defined in nova.ipv6.api
+#
+
+# Backend to use for IPv6 generation (string value)
+#ipv6_backend=rfc2462
+
+
+#
+# Options defined in nova.network
+#
+
+# The full class name of the network API class to use (string
+# value)
+network_api_class=nova.network.neutronv2.api.API
+
+
+#
+# Options defined in nova.network.driver
+#
+
+# Driver to use for network creation (string value)
+#network_driver=nova.network.linux_net
+
+
+#
+# Options defined in nova.network.floating_ips
+#
+
+# Default pool for floating IPs (string value)
+#default_floating_pool=nova
+
+# Autoassigning floating IP to VM (boolean value)
+#auto_assign_floating_ip=false
+
+# Full class name for the DNS Manager for floating IPs (string
+# value)
+#floating_ip_dns_manager=nova.network.noop_dns_driver.NoopDNSDriver
+
+# Full class name for the DNS Manager for instance IPs (string
+# value)
+#instance_dns_manager=nova.network.noop_dns_driver.NoopDNSDriver
+
+# Full class name for the DNS Zone for instance IPs (string
+# value)
+#instance_dns_domain=
+
+
+#
+# Options defined in nova.network.ldapdns
+#
+
+# URL for LDAP server which will store DNS entries (string
+# value)
+#ldap_dns_url=ldap://ldap.example.com:389
+
+# User for LDAP DNS (string value)
+#ldap_dns_user=uid=admin,ou=people,dc=example,dc=org
+
+# Password for LDAP DNS (string value)
+#ldap_dns_password=password
+
+# Hostmaster for LDAP DNS driver Statement of Authority
+# (string value)
+#ldap_dns_soa_hostmaster=hostmaster@example.org
+
+# DNS Servers for LDAP DNS driver (multi valued)
+#ldap_dns_servers=dns.example.org
+
+# Base DN for DNS entries in LDAP (string value)
+#ldap_dns_base_dn=ou=hosts,dc=example,dc=org
+
+# Refresh interval (in seconds) for LDAP DNS driver Statement
+# of Authority (string value)
+#ldap_dns_soa_refresh=1800
+
+# Retry interval (in seconds) for LDAP DNS driver Statement of
+# Authority (string value)
+#ldap_dns_soa_retry=3600
+
+# Expiry interval (in seconds) for LDAP DNS driver Statement
+# of Authority (string value)
+#ldap_dns_soa_expiry=86400
+
+# Minimum interval (in seconds) for LDAP DNS driver Statement
+# of Authority (string value)
+#ldap_dns_soa_minimum=7200
+
+
+#
+# Options defined in nova.network.linux_net
+#
+
+# Location of flagfiles for dhcpbridge (multi valued)
+#dhcpbridge_flagfile=/etc/nova/nova-dhcpbridge.conf
+
+# Location to keep network config files (string value)
+#networks_path=$state_path/networks
+
+# Interface for public IP addresses (string value)
+#public_interface=eth0
+
+# Location of nova-dhcpbridge (string value)
+#dhcpbridge=$bindir/nova-dhcpbridge
+
+# Public IP of network host (string value)
+#routing_source_ip=$my_ip
+
+# Lifetime of a DHCP lease in seconds (integer value)
+#dhcp_lease_time=86400
+
+# If set, uses specific DNS server for dnsmasq. Can be
+# specified multiple times. (multi valued)
+#dns_server=
+
+# If set, uses the dns1 and dns2 from the network ref. as dns
+# servers. (boolean value)
+#use_network_dns_servers=false
+
+# A list of dmz ranges that should be accepted (list value)
+#dmz_cidr=
+
+# Traffic to this range will always be snatted to the fallback
+# ip, even if it would normally be bridged out of the node.
+# Can be specified multiple times. (multi valued)
+#force_snat_range=
+
+# Override the default dnsmasq settings with this file (string
+# value)
+#dnsmasq_config_file=
+
+# Driver used to create ethernet devices. (string value)
+linuxnet_interface_driver=nova.network.linux_net.LinuxOVSInterfaceDriver
+
+# Name of Open vSwitch bridge used with linuxnet (string
+# value)
+#linuxnet_ovs_integration_bridge=br-int
+
+# Send gratuitous ARPs for HA setup (boolean value)
+#send_arp_for_ha=false
+
+# Send this many gratuitous ARPs for HA setup (integer value)
+#send_arp_for_ha_count=3
+
+# Use single default gateway. Only first nic of vm will get
+# default gateway from dhcp server (boolean value)
+#use_single_default_gateway=false
+
+# An interface that bridges can forward to. If this is set to
+# all then all traffic will be forwarded. Can be specified
+# multiple times. (multi valued)
+#forward_bridge_interface=all
+
+# The IP address for the metadata API server (string value)
+#metadata_host=$my_ip
+
+# The port for the metadata API port (integer value)
+#metadata_port=8775
+
+# Regular expression to match the iptables rule that should
+# always be on the top. (string value)
+#iptables_top_regex=
+
+# Regular expression to match the iptables rule that should
+# always be on the bottom. (string value)
+#iptables_bottom_regex=
+
+# The table that iptables to jump to when a packet is to be
+# dropped. (string value)
+#iptables_drop_action=DROP
+
+# Amount of time, in seconds, that ovs_vsctl should wait for a
+# response from the database. 0 is to wait forever. (integer
+# value)
+#ovs_vsctl_timeout=120
+
+# If passed, use fake network devices and addresses (boolean
+# value)
+#fake_network=false
+
+# Number of times to retry ebtables commands on failure.
+# (integer value)
+#ebtables_exec_attempts=3
+
+# Number of seconds to wait between ebtables retries.
+# (floating point value)
+#ebtables_retry_interval=1.0
+
+
+#
+# Options defined in nova.network.manager
+#
+
+# Bridge for simple network instances (string value)
+#flat_network_bridge=<None>
+
+# DNS server for simple network (string value)
+#flat_network_dns=8.8.4.4
+
+# Whether to attempt to inject network setup into guest
+# (boolean value)
+#flat_injected=false
+
+# FlatDhcp will bridge into this interface if set (string
+# value)
+#flat_interface=<None>
+
+# First VLAN for private networks (integer value)
+#vlan_start=100
+
+# VLANs will bridge into this interface if set (string value)
+#vlan_interface=<None>
+
+# Number of networks to support (integer value)
+#num_networks=1
+
+# Public IP for the cloudpipe VPN servers (string value)
+#vpn_ip=$my_ip
+
+# First Vpn port for private networks (integer value)
+#vpn_start=1000
+
+# Number of addresses in each private subnet (integer value)
+#network_size=256
+
+# Fixed IPv6 address block (string value)
+#fixed_range_v6=fd00::/48
+
+# Default IPv4 gateway (string value)
+#gateway=<None>
+
+# Default IPv6 gateway (string value)
+#gateway_v6=<None>
+
+# Number of addresses reserved for vpn clients (integer value)
+#cnt_vpn_clients=0
+
+# Seconds after which a deallocated IP is disassociated
+# (integer value)
+#fixed_ip_disassociate_timeout=600
+
+# Number of attempts to create unique mac address (integer
+# value)
+#create_unique_mac_address_attempts=5
+
+# If True, skip using the queue and make local calls (boolean
+# value)
+#fake_call=false
+
+# If True, unused gateway devices (VLAN and bridge) are
+# deleted in VLAN network mode with multi hosted networks
+# (boolean value)
+#teardown_unused_network_gateway=false
+
+# If True, send a dhcp release on instance termination
+# (boolean value)
+#force_dhcp_release=true
+
+# If True, when a DNS entry must be updated, it sends a fanout
+# cast to all network hosts to update their DNS entries in
+# multi host mode (boolean value)
+#update_dns_entries=false
+
+# Number of seconds to wait between runs of updates to DNS
+# entries. (integer value)
+#dns_update_periodic_interval=-1
+
+# Domain to use for building the hostnames (string value)
+#dhcp_domain=novalocal
+
+# Indicates underlying L3 management library (string value)
+#l3_lib=nova.network.l3.LinuxNetL3
+
+
+#
+# Options defined in nova.network.rpcapi
+#
+
+# The topic network nodes listen on (string value)
+#network_topic=network
+
+# Default value for multi_host in networks. Also, if set, some
+# rpc network calls will be sent directly to host. (boolean
+# value)
+#multi_host=false
+
+
+#
+# Options defined in nova.network.security_group.openstack_driver
+#
+
+# The full class name of the security API class (string value)
+security_group_api=neutron
+
+
+#
+# Options defined in nova.objects.network
+#
+
+# DEPRECATED: THIS VALUE SHOULD BE SET WHEN CREATING THE
+# NETWORK. If True in multi_host mode, all compute hosts share
+# the same dhcp address. The same IP address used for DHCP
+# will be added on each nova-network node which is only
+# visible to the vms on the same host. (boolean value)
+#share_dhcp_address=false
+
+# DEPRECATED: THIS VALUE SHOULD BE SET WHEN CREATING THE
+# NETWORK. MTU setting for network interface. (integer value)
+#network_device_mtu=<None>
+
+
+#
+# Options defined in nova.objectstore.s3server
+#
+
+# Path to S3 buckets (string value)
+#buckets_path=$state_path/buckets
+
+# IP address for S3 API to listen (string value)
+#s3_listen=0.0.0.0
+
+# Port for S3 API to listen (integer value)
+#s3_listen_port=3333
+
+
+#
+# From oslo.log
+#
+
+# Print debugging output (set logging level to DEBUG instead of default WARNING
+# level). (boolean value)
+#debug = false
+
+# Print more verbose output (set logging level to INFO instead of default
+# WARNING level). (boolean value)
+#verbose = false
+
+# The name of a logging configuration file. This file is appended to any
+# existing logging configuration files. For details about logging configuration
+# files, see the Python logging module documentation. (string value)
+# Deprecated group/name - [DEFAULT]/log_config
+#log_config_append = <None>
+
+# DEPRECATED. A logging.Formatter log message format string which may use any
+# of the available logging.LogRecord attributes. This option is deprecated.
+# Please use logging_context_format_string and logging_default_format_string
+# instead. (string value)
+#log_format = <None>
+
+# Format string for %%(asctime)s in log records. Default: %(default)s . (string
+# value)
+#log_date_format = %Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to output to. If no default is set, logging will
+# go to stdout. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file = <None>
+
+# (Optional) The base directory used for relative --log-file paths. (string
+# value)
+# Deprecated group/name - [DEFAULT]/logdir
+#log_dir = <None>
+
+# Use syslog for logging. Existing syslog format is DEPRECATED during I, and
+# will change in J to honor RFC5424. (boolean value)
+use_syslog = True
+
+# (Optional) Enables or disables syslog rfc5424 format for logging. If enabled,
+# prefixes the MSG part of the syslog message with APP-NAME (RFC5424). The
+# format without the APP-NAME is deprecated in I, and will be removed in J.
+# (boolean value)
+#use_syslog_rfc_format = false
+
+# Syslog facility to receive log lines. (string value)
+#syslog_log_facility = LOG_USER
+
+# Log output to standard error. (boolean value)
+#use_stderr = true
+
+# Format string to use for log messages with context. (string value)
+#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages without context. (string value)
+#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Data to append to log format when level is DEBUG. (string value)
+#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format. (string value)
+#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s
+
+# List of logger=LEVEL pairs. (list value)
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN
+
+# Enables or disables publication of error events. (boolean value)
+#publish_errors = false
+
+# Enables or disables fatal status of deprecations. (boolean value)
+#fatal_deprecations = false
+
+# The format for an instance that is passed with the log message. (string
+# value)
+#instance_format = "[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log message. (string
+# value)
+#instance_uuid_format = "[instance: %(uuid)s] "
+
+
+#
+# Options defined in nova.pci.request
+#
+
+# An alias for a PCI passthrough device requirement. This
+# allows users to specify the alias in the extra_spec for a
+# flavor, without needing to repeat all the PCI property
+# requirements. For example: pci_alias = { "name":
+# "QuicAssist", "product_id": "0443", "vendor_id": "8086",
+# "device_type": "ACCEL" } defines an alias for the Intel
+# QuickAssist card. (multi valued) (multi valued)
+#pci_alias=
+
+
+#
+# Options defined in nova.pci.whitelist
+#
+
+# White list of PCI devices available to VMs. For example:
+# pci_passthrough_whitelist = [{"vendor_id": "8086",
+# "product_id": "0443"}] (multi valued)
+#pci_passthrough_whitelist=
+
+
+#
+# Options defined in nova.scheduler.driver
+#
+
+# The scheduler host manager class to use (string value)
+scheduler_host_manager={{ SCHEDULER_HOST_MANAGER }}
+
+
+#
+# Options defined in nova.scheduler.filter_scheduler
+#
+
+# New instances will be scheduled on a host chosen randomly
+# from a subset of the N best hosts. This property defines the
+# subset size that a host is chosen from. A value of 1 chooses
+# the first host returned by the weighing functions. This
+# value must be at least 1. Any value less than 1 will be
+# ignored, and 1 will be used instead (integer value)
+#scheduler_host_subset_size=1
+
+
+#
+# Options defined in nova.scheduler.filters.aggregate_image_properties_isolation
+#
+
+# Force the filter to consider only keys matching the given
+# namespace. (string value)
+#aggregate_image_properties_isolation_namespace=<None>
+
+# The separator used between the namespace and keys (string
+# value)
+#aggregate_image_properties_isolation_separator=.
+
+
+#
+# Options defined in nova.scheduler.filters.core_filter
+#
+
+# Virtual CPU to physical CPU allocation ratio which affects
+# all CPU filters. This configuration specifies a global ratio
+# for CoreFilter. For AggregateCoreFilter, it will fall back
+# to this configuration value if no per-aggregate setting
+# found. (floating point value)
+#cpu_allocation_ratio=16.0
+
+
+#
+# Options defined in nova.scheduler.filters.disk_filter
+#
+
+# Virtual disk to physical disk allocation ratio (floating
+# point value)
+#disk_allocation_ratio=1.0
+
+
+#
+# Options defined in nova.scheduler.filters.io_ops_filter
+#
+
+# Tells filters to ignore hosts that have this many or more
+# instances currently in build, resize, snapshot, migrate,
+# rescue or unshelve task states (integer value)
+#max_io_ops_per_host=8
+
+
+#
+# Options defined in nova.scheduler.filters.isolated_hosts_filter
+#
+
+# Images to run on isolated host (list value)
+#isolated_images=
+
+# Host reserved for specific images (list value)
+#isolated_hosts=
+
+# Whether to force isolated hosts to run only isolated images
+# (boolean value)
+#restrict_isolated_hosts_to_isolated_images=true
+
+
+#
+# Options defined in nova.scheduler.filters.num_instances_filter
+#
+
+# Ignore hosts that have too many instances (integer value)
+#max_instances_per_host=50
+
+
+#
+# Options defined in nova.scheduler.filters.ram_filter
+#
+
+# Virtual ram to physical ram allocation ratio which affects
+# all ram filters. This configuration specifies a global ratio
+# for RamFilter. For AggregateRamFilter, it will fall back to
+# this configuration value if no per-aggregate setting found.
+# (floating point value)
+ram_allocation_ratio={{ RAM_ALLOCATION_RATIO }}
+
+
+#
+# Options defined in nova.scheduler.host_manager
+#
+
+# Filter classes available to the scheduler which may be
+# specified more than once. An entry of
+# "nova.scheduler.filters.all_filters" maps to all filters
+# included with nova. (multi valued)
+#scheduler_available_filters=nova.scheduler.filters.all_filters
+
+# Which filter class names to use for filtering hosts when not
+# specified in the request. (list value)
+scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter
+
+# Which weight class names to use for weighing hosts (list
+# value)
+#scheduler_weight_classes=nova.scheduler.weights.all_weighers
+
+# Determines if the Scheduler tracks changes to instances to
+# help with its filtering decisions. (boolean value)
+#scheduler_tracks_instance_changes=true
+
+
+#
+# Options defined in nova.scheduler.ironic_host_manager
+#
+
+# Which filter class names to use for filtering baremetal
+# hosts when not specified in the request. (list value)
+#baremetal_scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ExactRamFilter,ExactDiskFilter,ExactCoreFilter
+
+# Flag to decide whether to use
+# baremetal_scheduler_default_filters or not. (boolean value)
+scheduler_use_baremetal_filters={{ SCHEDULER_USE_BAREMETAL_FILTERS }}
+
+
+#
+# Options defined in nova.scheduler.manager
+#
+
+# Default driver to use for the scheduler (string value)
+scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
+
+# How often (in seconds) to run periodic tasks in the
+# scheduler driver of your choice. Please note this is likely
+# to interact with the value of service_down_time, but exactly
+# how they interact will depend on your choice of scheduler
+# driver. (integer value)
+#scheduler_driver_task_period=60
+
+
+#
+# Options defined in nova.scheduler.rpcapi
+#
+
+# The topic scheduler nodes listen on (string value)
+#scheduler_topic=scheduler
+
+
+#
+# Options defined in nova.scheduler.scheduler_options
+#
+
+# Absolute path to scheduler configuration JSON file. (string
+# value)
+#scheduler_json_config_location=
+
+
+#
+# Options defined in nova.scheduler.utils
+#
+
+# Maximum number of attempts to schedule an instance (integer
+# value)
+#scheduler_max_attempts=3
+
+
+#
+# Options defined in nova.scheduler.weights.io_ops
+#
+
+# Multiplier used for weighing host io ops. Negative numbers
+# mean a preference to choose light workload compute hosts.
+# (floating point value)
+#io_ops_weight_multiplier=-1.0
+
+
+#
+# Options defined in nova.scheduler.weights.ram
+#
+
+# Multiplier used for weighing ram. Negative numbers mean to
+# stack vs spread. (floating point value)
+#ram_weight_multiplier=1.0
+
+
+#
+# Options defined in nova.servicegroup.api
+#
+
+# The driver for servicegroup service (valid options are: db,
+# zk, mc) (string value)
+#servicegroup_driver=db
+
+
+#
+# Options defined in nova.virt.configdrive
+#
+
+# Config drive format. One of iso9660 (default) or vfat
+# (string value)
+#config_drive_format=iso9660
+
+# Set to "always" to force injection to take place on a config
+# drive. NOTE: The "always" will be deprecated in the Liberty
+# release cycle. (string value)
+#force_config_drive=<None>
+
+# Name and optionally path of the tool used for ISO image
+# creation (string value)
+#mkisofs_cmd=genisoimage
+
+
+#
+# Options defined in nova.virt.disk.api
+#
+
+# Name of the mkfs commands for ephemeral device. The format
+# is <os_type>=<mkfs command> (multi valued)
+#virt_mkfs=
+
+# Attempt to resize the filesystem by accessing the image over
+# a block device. This is done by the host and may not be
+# necessary if the image contains a recent version of cloud-
+# init. Possible mechanisms require the nbd driver (for qcow
+# and raw), or loop (for raw). (boolean value)
+#resize_fs_using_block_device=false
+
+
+#
+# Options defined in nova.virt.disk.mount.nbd
+#
+
+# Amount of time, in seconds, to wait for NBD device start up.
+# (integer value)
+#timeout_nbd=10
+
+
+#
+# Options defined in nova.virt.driver
+#
+
+# Driver to use for controlling virtualization. Options
+# include: libvirt.LibvirtDriver, xenapi.XenAPIDriver,
+# fake.FakeDriver, baremetal.BareMetalDriver,
+# vmwareapi.VMwareVCDriver, hyperv.HyperVDriver (string value)
+compute_driver={{ COMPUTE_DRIVER }}
+
+# The default format an ephemeral_volume will be formatted
+# with on creation. (string value)
+#default_ephemeral_format=<None>
+
+# VM image preallocation mode: "none" => no storage
+# provisioning is done up front, "space" => storage is fully
+# allocated at instance start (string value)
+#preallocate_images=none
+
+# Whether to use cow images (boolean value)
+#use_cow_images=true
+
+# Fail instance boot if vif plugging fails (boolean value)
+#vif_plugging_is_fatal=true
+
+# Number of seconds to wait for neutron vif plugging events to
+# arrive before continuing or failing (see
+# vif_plugging_is_fatal). If this is set to zero and
+# vif_plugging_is_fatal is False, events should not be
+# expected to arrive at all. (integer value)
+#vif_plugging_timeout=300
+
+
+#
+# Options defined in nova.virt.firewall
+#
+
+# Firewall driver (defaults to hypervisor specific iptables
+# driver) (string value)
+firewall_driver=nova.virt.firewall.NoopFirewallDriver
+
+# Whether to allow network traffic from same network (boolean
+# value)
+#allow_same_net_traffic=true
+
+
+#
+# Options defined in nova.virt.hardware
+#
+
+# Defines which pcpus that instance vcpus can use. For
+# example, "4-12,^8,15" (string value)
+#vcpu_pin_set=<None>
+
+
+#
+# Options defined in nova.virt.imagecache
+#
+
+# Number of seconds to wait between runs of the image cache
+# manager. Set to -1 to disable. Setting this to 0 will run at
+# the default rate. (integer value)
+#image_cache_manager_interval=2400
+
+# Where cached images are stored under $instances_path. This
+# is NOT the full path - just a folder name. For per-compute-
+# host cached images, set to _base_$my_ip (string value)
+#image_cache_subdirectory_name=_base
+
+# Should unused base images be removed? (boolean value)
+#remove_unused_base_images=true
+
+# Unused unresized base images younger than this will not be
+# removed (integer value)
+#remove_unused_original_minimum_age_seconds=86400
+
+
+#
+# Options defined in nova.virt.images
+#
+
+# Force backing images to raw format (boolean value)
+#force_raw_images=true
+
+
+#
+# Options defined in nova.virt.netutils
+#
+
+# Template file for injected network (string value)
+#injected_network_template=$pybasedir/nova/virt/interfaces.template
+
+
+#
+# Options defined in nova.vnc
+#
+
+# Location of VNC console proxy, in the form
+# "http://127.0.0.1:6080/vnc_auto.html" (string value)
+novncproxy_base_url=http://{{ MANAGEMENT_INTERFACE_IP_ADDRESS }}:6080/vnc_auto.html
+
+# Location of nova xvp VNC console proxy, in the form
+# "http://127.0.0.1:6081/console" (string value)
+#xvpvncproxy_base_url=http://127.0.0.1:6081/console
+
+# IP address on which instance vncservers should listen
+# (string value)
+vncserver_listen=0.0.0.0
+
+# The address to which proxy clients (like nova-xvpvncproxy)
+# should connect (string value)
+vncserver_proxyclient_address={{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+
+# Enable VNC related features (boolean value)
+vnc_enabled=true
+
+# Keymap for VNC (string value)
+vnc_keymap=en-us
+
+
+#
+# Options defined in nova.vnc.xvp_proxy
+#
+
+# Port that the XCP VNC proxy should bind to (integer value)
+#xvpvncproxy_port=6081
+
+# Address that the XCP VNC proxy should bind to (string value)
+#xvpvncproxy_host=0.0.0.0
+
+
+#
+# Options defined in nova.volume
+#
+
+# The full class name of the volume API class to use (string
+# value)
+#volume_api_class=nova.volume.cinder.API
+
+
+#
+# Options defined in nova.openstack.common.eventlet_backdoor
+#
+
+# Enable eventlet backdoor. Acceptable values are 0, <port>,
+# and <start>:<end>, where 0 results in listening on a random
+# tcp port number; <port> results in listening on the
+# specified port number (and not enabling backdoor if that
+# port is in use); and <start>:<end> results in listening on
+# the smallest unused port number within the specified range
+# of port numbers. The chosen port is displayed in the
+# service's log file. (string value)
+#backdoor_port=<None>
+
+
+#
+# Options defined in nova.openstack.common.memorycache
+#
+
+# Memcached servers or None for in process cache. (list value)
+#memcached_servers=<None>
+
+
+#
+# Options defined in nova.openstack.common.periodic_task
+#
+
+# Some periodic tasks can be run in a separate process. Should
+# we run them here? (boolean value)
+#run_external_periodic_tasks=true
+
+
+#
+# Options defined in nova.openstack.common.policy
+#
+
+# The JSON file that defines policies. (string value)
+#policy_file=policy.json
+
+# Default rule. Enforced when a requested rule is not found.
+# (string value)
+#policy_default_rule=default
+
+# Directories where policy configuration files are stored.
+# They can be relative to any directory in the search path
+# defined by the config_dir option, or absolute paths. The
+# file defined by policy_file must exist for these directories
+# to be searched. Missing or empty directories are ignored.
+# (multi valued)
+#policy_dirs=policy.d
+
+
+#
+# Options defined in nova.openstack.common.versionutils
+#
+
+# Enables or disables fatal status of deprecations. (boolean
+# value)
+#fatal_deprecations=false
+
+
+[api_database]
+
+#
+# Options defined in nova.db.sqlalchemy.api
+#
+
+# The SQLAlchemy connection string to use to connect to the
+# Nova API database. (string value)
+#connection=postgresql://{{ NOVA_DB_USER }}:{{ NOVA_DB_PASSWORD }}@{{ CONTROLLER_HOST_ADDRESS }}/nova
+
+# If True, SQLite uses synchronous mode. (boolean value)
+#sqlite_synchronous=true
+
+# Timeout before idle SQL connections are reaped. (integer
+# value)
+#idle_timeout=3600
+
+# Maximum number of SQL connections to keep open in a pool.
+# (integer value)
+#max_pool_size=<None>
+
+# Maximum number of database connection retries during
+# startup. Set to -1 to specify an infinite retry count.
+# (integer value)
+#max_retries=10
+
+# Interval between retries of opening a SQL connection.
+# (integer value)
+#retry_interval=10
+
+# If set, use this value for max_overflow with SQLAlchemy.
+# (integer value)
+#max_overflow=<None>
+
+# Verbosity of SQL debugging information: 0=None,
+# 100=Everything. (integer value)
+#connection_debug=0
+
+# Add Python stack traces to SQL as comment strings. (boolean
+# value)
+#connection_trace=false
+
+# If set, use this value for pool_timeout with SQLAlchemy.
+# (integer value)
+#pool_timeout=<None>
+
+
+[barbican]
+
+#
+# Options defined in nova.keymgr.barbican
+#
+
+# Info to match when looking for barbican in the service
+# catalog. Format is: separated values of the form:
+# <service_type>:<service_name>:<endpoint_type> (string value)
+#catalog_info=key-manager:barbican:public
+
+# Override service catalog lookup with template for barbican
+# endpoint e.g. http://localhost:9311/v1/%(project_id)s
+# (string value)
+#endpoint_template=<None>
+
+# Region name of this node (string value)
+#os_region_name=<None>
+
+
+#
+# Options defined in nova.volume.cinder
+#
+
+# Region name of this node (string value)
+#os_region_name=<None>
+
+
+[cells]
+
+#
+# Options defined in nova.cells.manager
+#
+
+# Cells communication driver to use (string value)
+#driver=nova.cells.rpc_driver.CellsRPCDriver
+
+# Number of seconds after an instance was updated or deleted
+# to continue to update cells (integer value)
+#instance_updated_at_threshold=3600
+
+# Number of instances to update per periodic task run (integer
+# value)
+#instance_update_num_instances=1
+
+
+#
+# Options defined in nova.cells.messaging
+#
+
+# Maximum number of hops for cells routing. (integer value)
+#max_hop_count=10
+
+# Cells scheduler to use (string value)
+#scheduler=nova.cells.scheduler.CellsScheduler
+
+
+#
+# Options defined in nova.cells.opts
+#
+
+# Enable cell functionality (boolean value)
+#enable=false
+
+# The topic cells nodes listen on (string value)
+#topic=cells
+
+# Manager for cells (string value)
+#manager=nova.cells.manager.CellsManager
+
+# Name of this cell (string value)
+#name=nova
+
+# Key/Multi-value list with the capabilities of the cell (list
+# value)
+#capabilities=hypervisor=xenserver;kvm,os=linux;windows
+
+# Seconds to wait for response from a call to a cell. (integer
+# value)
+#call_timeout=60
+
+# Percentage of cell capacity to hold in reserve. Affects both
+# memory and disk utilization (floating point value)
+#reserve_percent=10.0
+
+# Type of cell: api or compute (string value)
+#cell_type=compute
+
+# Number of seconds after which a lack of capability and
+# capacity updates signals the child cell is to be treated as
+# a mute. (integer value)
+#mute_child_interval=300
+
+# Seconds between bandwidth updates for cells. (integer value)
+#bandwidth_update_interval=600
+
+
+#
+# Options defined in nova.cells.rpc_driver
+#
+
+# Base queue name to use when communicating between cells.
+# Various topics by message type will be appended to this.
+# (string value)
+#rpc_driver_queue_base=cells.intercell
+
+
+#
+# Options defined in nova.cells.scheduler
+#
+
+# Filter classes the cells scheduler should use. An entry of
+# "nova.cells.filters.all_filters" maps to all cells filters
+# included with nova. (list value)
+#scheduler_filter_classes=nova.cells.filters.all_filters
+
+# Weigher classes the cells scheduler should use. An entry of
+# "nova.cells.weights.all_weighers" maps to all cell weighers
+# included with nova. (list value)
+#scheduler_weight_classes=nova.cells.weights.all_weighers
+
+# How many retries when no cells are available. (integer
+# value)
+#scheduler_retries=10
+
+# How often to retry in seconds when no cells are available.
+# (integer value)
+#scheduler_retry_delay=2
+
+
+#
+# Options defined in nova.cells.state
+#
+
+# Interval, in seconds, for getting fresh cell information
+# from the database. (integer value)
+#db_check_interval=60
+
+# Configuration file from which to read cells configuration.
+# If given, overrides reading cells from the database. (string
+# value)
+#cells_config=<None>
+
+
+#
+# Options defined in nova.cells.weights.mute_child
+#
+
+# Multiplier used to weigh mute children. (The value should be
+# negative.) (floating point value)
+#mute_weight_multiplier=-10.0
+
+# Weight value assigned to mute children. (The value should be
+# positive.) (floating point value)
+#mute_weight_value=1000.0
+
+
+#
+# Options defined in nova.cells.weights.ram_by_instance_type
+#
+
+# Multiplier used for weighing ram. Negative numbers mean to
+# stack vs spread. (floating point value)
+#ram_weight_multiplier=10.0
+
+
+#
+# Options defined in nova.cells.weights.weight_offset
+#
+
+# Multiplier used to weigh offset weigher. (floating point
+# value)
+#offset_weight_multiplier=1.0
+
+
+[cinder]
+
+#
+# Options defined in nova.volume.cinder
+#
+
+# Info to match when looking for cinder in the service
+# catalog. Format is: separated values of the form:
+# <service_type>:<service_name>:<endpoint_type> (string value)
+#catalog_info=volumev2:cinderv2:publicURL
+
+# Override service catalog lookup with template for cinder
+# endpoint e.g. http://localhost:8776/v1/%(project_id)s
+# (string value)
+#endpoint_template=<None>
+
+# Number of cinderclient retries on failed http calls (integer
+# value)
+#http_retries=3
+
+# Allow attach between instance and volume in different
+# availability zones. (boolean value)
+#cross_az_attach=true
+
+
+[conductor]
+
+#
+# Options defined in nova.conductor.api
+#
+
+# Perform nova-conductor operations locally (boolean value)
+use_local=true
+
+# The topic on which conductor nodes listen (string value)
+#topic=conductor
+
+# Full class name for the Manager for conductor (string value)
+#manager=nova.conductor.manager.ConductorManager
+
+# Number of workers for OpenStack Conductor service. The
+# default will be the number of CPUs available. (integer
+# value)
+#workers=<None>
+
+
+[database]
+
+#
+# From oslo.db
+#
+
+# The file name to use with SQLite. (string value)
+# Deprecated group/name - [DEFAULT]/sqlite_db
+#sqlite_db = oslo.sqlite
+
+# If True, SQLite uses synchronous mode. (boolean value)
+# Deprecated group/name - [DEFAULT]/sqlite_synchronous
+#sqlite_synchronous = true
+
+# The back end to use for the database. (string value)
+# Deprecated group/name - [DEFAULT]/db_backend
+#backend = sqlalchemy
+
+# The SQLAlchemy connection string to use to connect to the database. (string
+# value)
+# Deprecated group/name - [DEFAULT]/sql_connection
+# Deprecated group/name - [DATABASE]/sql_connection
+# Deprecated group/name - [sql]/connection
+#connection = <None>
+connection=postgresql://{{ NOVA_DB_USER }}:{{ NOVA_DB_PASSWORD }}@{{ CONTROLLER_HOST_ADDRESS }}/nova
+
+# The SQLAlchemy connection string to use to connect to the slave database.
+# (string value)
+#slave_connection = <None>
+
+# The SQL mode to be used for MySQL sessions. This option, including the
+# default, overrides any server-set SQL mode. To use whatever SQL mode is set
+# by the server configuration, set this to no value. Example: mysql_sql_mode=
+# (string value)
+#mysql_sql_mode = TRADITIONAL
+
+# Timeout before idle SQL connections are reaped. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_idle_timeout
+# Deprecated group/name - [DATABASE]/sql_idle_timeout
+# Deprecated group/name - [sql]/idle_timeout
+#idle_timeout = 3600
+
+# Minimum number of SQL connections to keep open in a pool. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_min_pool_size
+# Deprecated group/name - [DATABASE]/sql_min_pool_size
+#min_pool_size = 1
+
+# Maximum number of SQL connections to keep open in a pool. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_pool_size
+# Deprecated group/name - [DATABASE]/sql_max_pool_size
+#max_pool_size = <None>
+
+# Maximum number of database connection retries during startup. Set to -1 to
+# specify an infinite retry count. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_retries
+# Deprecated group/name - [DATABASE]/sql_max_retries
+#max_retries = 10
+
+# Interval between retries of opening a SQL connection. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_retry_interval
+# Deprecated group/name - [DATABASE]/reconnect_interval
+#retry_interval = 10
+
+# If set, use this value for max_overflow with SQLAlchemy. (integer value)
+# Deprecated group/name - [DEFAULT]/sql_max_overflow
+# Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow
+#max_overflow = <None>
+
+# Verbosity of SQL debugging information: 0=None, 100=Everything. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/sql_connection_debug
+#connection_debug = 0
+
+# Add Python stack traces to SQL as comment strings. (boolean value)
+# Deprecated group/name - [DEFAULT]/sql_connection_trace
+#connection_trace = false
+
+# If set, use this value for pool_timeout with SQLAlchemy. (integer value)
+# Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout
+#pool_timeout = <None>
+
+# Enable the experimental use of database reconnect on connection lost.
+# (boolean value)
+#use_db_reconnect = false
+
+# Seconds between retries of a database transaction. (integer value)
+#db_retry_interval = 1
+
+# If True, increases the interval between retries of a database operation up to
+# db_max_retry_interval. (boolean value)
+#db_inc_retry_interval = true
+
+# If db_inc_retry_interval is set, the maximum seconds between retries of a
+# database operation. (integer value)
+#db_max_retry_interval = 10
+
+# Maximum retries in case of connection error or deadlock error before error is
+# raised. Set to -1 to specify an infinite retry count. (integer value)
+#db_max_retries = 20
+
+
+#
+# Options defined in nova.db.sqlalchemy.api
+#
+
+# The SQLAlchemy connection string to use to connect to the
+# slave database. (string value)
+#slave_connection=<None>
+
+# The SQL mode to be used for MySQL sessions. This option,
+# including the default, overrides any server-set SQL mode. To
+# use whatever SQL mode is set by the server configuration,
+# set this to no value. Example: mysql_sql_mode= (string
+# value)
+#mysql_sql_mode=TRADITIONAL
+
+
+[ephemeral_storage_encryption]
+
+#
+# Options defined in nova.compute.api
+#
+
+# Whether to encrypt ephemeral storage (boolean value)
+#enabled=false
+
+# The cipher and mode to be used to encrypt ephemeral storage.
+# Which ciphers are available ciphers depends on kernel
+# support. See /proc/crypto for the list of available options.
+# (string value)
+#cipher=aes-xts-plain64
+
+# The bit length of the encryption key to be used to encrypt
+# ephemeral storage (in XTS mode only half of the bits are
+# used for encryption key) (integer value)
+#key_size=512
+
+
+[glance]
+
+#
+# Options defined in nova.image.glance
+#
+
+# Default glance hostname or IP address (string value)
+host={{ CONTROLLER_HOST_ADDRESS }}
+
+# Default glance port (integer value)
+port=9292
+
+# Default protocol to use when connecting to glance. Set to
+# https for SSL. (string value)
+protocol=http
+
+# A list of the glance api servers available to nova. Prefix
+# with https:// for ssl-based glance api servers.
+# ([hostname|ip]:port) (list value)
+api_servers=$host:$port
+
+# Allow to perform insecure SSL (https) requests to glance
+# (boolean value)
+#api_insecure=false
+
+# Number of retries when uploading / downloading an image to /
+# from glance. (integer value)
+#num_retries=0
+
+# A list of url scheme that can be downloaded directly via the
+# direct_url. Currently supported schemes: [file]. (list
+# value)
+#allowed_direct_url_schemes=
+
+
+[guestfs]
+
+#
+# Options defined in nova.virt.disk.vfs.guestfs
+#
+
+# Enable guestfs debug (boolean value)
+#debug=false
+
+
+[hyperv]
+
+#
+# Options defined in nova.virt.hyperv.pathutils
+#
+
+# The name of a Windows share name mapped to the
+# "instances_path" dir and used by the resize feature to copy
+# files to the target host. If left blank, an administrative
+# share will be used, looking for the same "instances_path"
+# used locally (string value)
+#instances_path_share=
+
+
+#
+# Options defined in nova.virt.hyperv.utilsfactory
+#
+
+# Force V1 WMI utility classes (boolean value)
+#force_hyperv_utils_v1=false
+
+# Force V1 volume utility class (boolean value)
+#force_volumeutils_v1=false
+
+
+#
+# Options defined in nova.virt.hyperv.vif
+#
+
+# External virtual switch Name, if not provided, the first
+# external virtual switch is used (string value)
+#vswitch_name=<None>
+
+
+#
+# Options defined in nova.virt.hyperv.vmops
+#
+
+# Required for live migration among hosts with different CPU
+# features (boolean value)
+#limit_cpu_features=false
+
+# Sets the admin password in the config drive image (boolean
+# value)
+#config_drive_inject_password=false
+
+# Path of qemu-img command which is used to convert between
+# different image types (string value)
+#qemu_img_cmd=qemu-img.exe
+
+# Attaches the Config Drive image as a cdrom drive instead of
+# a disk drive (boolean value)
+#config_drive_cdrom=false
+
+# Enables metrics collections for an instance by using
+# Hyper-V's metric APIs. Collected data can by retrieved by
+# other apps and services, e.g.: Ceilometer. Requires Hyper-V
+# / Windows Server 2012 and above (boolean value)
+#enable_instance_metrics_collection=false
+
+# Enables dynamic memory allocation (ballooning) when set to a
+# value greater than 1. The value expresses the ratio between
+# the total RAM assigned to an instance and its startup RAM
+# amount. For example a ratio of 2.0 for an instance with
+# 1024MB of RAM implies 512MB of RAM allocated at startup
+# (floating point value)
+#dynamic_memory_ratio=1.0
+
+# Number of seconds to wait for instance to shut down after
+# soft reboot request is made. We fall back to hard reboot if
+# instance does not shutdown within this window. (integer
+# value)
+#wait_soft_reboot_seconds=60
+
+
+#
+# Options defined in nova.virt.hyperv.volumeops
+#
+
+# The number of times to retry to attach a volume (integer
+# value)
+#volume_attach_retry_count=10
+
+# Interval between volume attachment attempts, in seconds
+# (integer value)
+#volume_attach_retry_interval=5
+
+# The number of times to retry checking for a disk mounted via
+# iSCSI. (integer value)
+#mounted_disk_query_retry_count=10
+
+# Interval between checks for a mounted iSCSI disk, in
+# seconds. (integer value)
+#mounted_disk_query_retry_interval=5
+
+
+[image_file_url]
+
+#
+# Options defined in nova.image.download.file
+#
+
+# List of file systems that are configured in this file in the
+# image_file_url:<list entry name> sections (list value)
+#filesystems=
+
+
+[ironic]
+
+#
+# Options defined in nova.virt.ironic.driver
+#
+
+# Version of Ironic API service endpoint. (integer value)
+#api_version=1
+
+# URL for Ironic API endpoint. (string value)
+api_endpoint=http://{{ CONTROLLER_HOST_ADDRESS }}:6385/v1
+
+# Ironic keystone admin name (string value)
+admin_username={{ IRONIC_SERVICE_USER }}
+
+# Ironic keystone admin password. (string value)
+admin_password={{ IRONIC_SERVICE_PASSWORD }}
+
+# Ironic keystone auth token. (string value)
+#admin_auth_token=<None>
+
+# Keystone public API endpoint. (string value)
+admin_url=http://{{ CONTROLLER_HOST_ADDRESS }}:35357/v2.0
+
+# Log level override for ironicclient. Set this in order to
+# override the global "default_log_levels", "verbose", and
+# "debug" settings. DEPRECATED: use standard logging
+# configuration. (string value)
+#client_log_level=<None>
+
+# Ironic keystone tenant name. (string value)
+admin_tenant_name=service
+
+# How many retries when a request does conflict. (integer
+# value)
+#api_max_retries=60
+
+# How often to retry in seconds when a request does conflict
+# (integer value)
+#api_retry_interval=2
+
+
+[keymgr]
+
+#
+# Options defined in nova.keymgr
+#
+
+# The full class name of the key manager API class (string
+# value)
+#api_class=nova.keymgr.conf_key_mgr.ConfKeyManager
+
+
+#
+# Options defined in nova.keymgr.conf_key_mgr
+#
+
+# Fixed key returned by key manager, specified in hex (string
+# value)
+#fixed_key=<None>
+
+
+[keystone_authtoken]
+
+#
+# From keystonemiddleware.auth_token
+#
+
+# Complete public Identity API endpoint. (string value)
+auth_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:5000/v2.0
+
+# API version of the admin Identity API endpoint. (string value)
+auth_version = v2.0
+
+# Do not handle authorization requests within the middleware, but delegate the
+# authorization decision to downstream WSGI components. (boolean value)
+#delay_auth_decision = false
+
+# Request timeout value for communicating with Identity API server. (integer
+# value)
+#http_connect_timeout = <None>
+
+# How many times are we trying to reconnect when communicating with Identity
+# API Server. (integer value)
+#http_request_max_retries = 3
+
+# Env key for the swift cache. (string value)
+#cache = <None>
+
+# Required if identity server requires client certificate (string value)
+#certfile = <None>
+
+# Required if identity server requires client certificate (string value)
+#keyfile = <None>
+
+# A PEM encoded Certificate Authority to use when verifying HTTPs connections.
+# Defaults to system CAs. (string value)
+#cafile = <None>
+
+# Verify HTTPS connections. (boolean value)
+#insecure = false
+
+# Directory used to cache files related to PKI tokens. (string value)
+#signing_dir = <None>
+
+# Optionally specify a list of memcached server(s) to use for caching. If left
+# undefined, tokens will instead be cached in-process. (list value)
+# Deprecated group/name - [DEFAULT]/memcache_servers
+#memcached_servers = <None>
+
+# In order to prevent excessive effort spent validating tokens, the middleware
+# caches previously-seen tokens for a configurable duration (in seconds). Set
+# to -1 to disable caching completely. (integer value)
+#token_cache_time = 300
+
+# Determines the frequency at which the list of revoked tokens is retrieved
+# from the Identity service (in seconds). A high number of revocation events
+# combined with a low cache duration may significantly reduce performance.
+# (integer value)
+#revocation_cache_time = 10
+
+# (Optional) If defined, indicate whether token data should be authenticated or
+# authenticated and encrypted. Acceptable values are MAC or ENCRYPT. If MAC,
+# token data is authenticated (with HMAC) in the cache. If ENCRYPT, token data
+# is encrypted and authenticated in the cache. If the value is not one of these
+# options or empty, auth_token will raise an exception on initialization.
+# (string value)
+#memcache_security_strategy = <None>
+
+# (Optional, mandatory if memcache_security_strategy is defined) This string is
+# used for key derivation. (string value)
+#memcache_secret_key = <None>
+
+# (Optional) Number of seconds memcached server is considered dead before it is
+# tried again. (integer value)
+#memcache_pool_dead_retry = 300
+
+# (Optional) Maximum total number of open connections to every memcached
+# server. (integer value)
+#memcache_pool_maxsize = 10
+
+# (Optional) Socket timeout in seconds for communicating with a memcache
+# server. (integer value)
+#memcache_pool_socket_timeout = 3
+
+# (Optional) Number of seconds a connection to memcached is held unused in the
+# pool before it is closed. (integer value)
+#memcache_pool_unused_timeout = 60
+
+# (Optional) Number of seconds that an operation will wait to get a memcache
+# client connection from the pool. (integer value)
+#memcache_pool_conn_get_timeout = 10
+
+# (Optional) Use the advanced (eventlet safe) memcache client pool. The
+# advanced pool will only work under python 2.x. (boolean value)
+#memcache_use_advanced_pool = false
+
+# (Optional) Indicate whether to set the X-Service-Catalog header. If False,
+# middleware will not ask for service catalog on token validation and will not
+# set the X-Service-Catalog header. (boolean value)
+#include_service_catalog = true
+
+# Used to control the use and type of token binding. Can be set to: "disabled"
+# to not check token binding. "permissive" (default) to validate binding
+# information if the bind type is of a form known to the server and ignore it
+# if not. "strict" like "permissive" but if the bind type is unknown the token
+# will be rejected. "required" any form of token binding is needed to be
+# allowed. Finally the name of a binding method that must be present in tokens.
+# (string value)
+#enforce_token_bind = permissive
+
+# If true, the revocation list will be checked for cached tokens. This requires
+# that PKI tokens are configured on the identity server. (boolean value)
+#check_revocations_for_cached = false
+
+# Hash algorithms to use for hashing PKI tokens. This may be a single algorithm
+# or multiple. The algorithms are those supported by Python standard
+# hashlib.new(). The hashes will be tried in the order given, so put the
+# preferred one first for performance. The result of the first hash will be
+# stored in the cache. This will typically be set to multiple values only while
+# migrating from a less secure algorithm to a more secure one. Once all the old
+# tokens are expired this option should be set to a single value for better
+# performance. (list value)
+#hash_algorithms = md5
+
+# Prefix to prepend at the beginning of the path. Deprecated, use identity_uri.
+# (string value)
+#auth_admin_prefix =
+
+# Host providing the admin Identity API endpoint. Deprecated, use identity_uri.
+# (string value)
+#auth_host = 127.0.0.1
+
+# Port of the admin Identity API endpoint. Deprecated, use identity_uri.
+# (integer value)
+#auth_port = 35357
+
+# Protocol of the admin Identity API endpoint (http or https). Deprecated, use
+# identity_uri. (string value)
+#auth_protocol = https
+
+# Complete admin Identity API endpoint. This should specify the unversioned
+# root endpoint e.g. https://localhost:35357/ (string value)
+identity_uri = http://{{ CONTROLLER_HOST_ADDRESS }}:35357
+
+# This option is deprecated and may be removed in a future release. Single
+# shared secret with the Keystone configuration used for bootstrapping a
+# Keystone installation, or otherwise bypassing the normal authentication
+# process. This option should not be used, use `admin_user` and
+# `admin_password` instead. (string value)
+#admin_token = <None>
+
+# Service username. (string value)
+admin_user = {{ NOVA_SERVICE_USER }}
+
+# Service user password. (string value)
+admin_password = {{ NOVA_SERVICE_PASSWORD }}
+
+# Service tenant name. (string value)
+admin_tenant_name = service
+
+
+[libvirt]
+
+#
+# Options defined in nova.virt.libvirt.driver
+#
+
+# Rescue ami image. This will not be used if an image id is
+# provided by the user. (string value)
+#rescue_image_id=<None>
+
+# Rescue aki image (string value)
+#rescue_kernel_id=<None>
+
+# Rescue ari image (string value)
+#rescue_ramdisk_id=<None>
+
+# Libvirt domain type (valid options are: kvm, lxc, qemu, uml,
+# xen and parallels) (string value)
+virt_type={{ NOVA_VIRT_TYPE }}
+
+# Override the default libvirt URI (which is dependent on
+# virt_type) (string value)
+#connection_uri=
+
+# Inject the admin password at boot time, without an agent.
+# (boolean value)
+#inject_password=false
+
+# Inject the ssh public key at boot time (boolean value)
+#inject_key=false
+
+# The partition to inject to : -2 => disable, -1 => inspect
+# (libguestfs only), 0 => not partitioned, >0 => partition
+# number (integer value)
+#inject_partition=-2
+
+# Sync virtual and real mouse cursors in Windows VMs (boolean
+# value)
+#use_usb_tablet=true
+
+# Migration target URI (any included "%s" is replaced with the
+# migration target hostname) (string value)
+#live_migration_uri=qemu+tcp://%s/system
+
+# Migration flags to be set for live migration (string value)
+#live_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED
+
+# Migration flags to be set for block migration (string value)
+#block_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED, VIR_MIGRATE_NON_SHARED_INC
+
+# Maximum bandwidth to be used during migration, in Mbps
+# (integer value)
+#live_migration_bandwidth=0
+
+# Snapshot image format (valid options are : raw, qcow2, vmdk,
+# vdi). Defaults to same as source image (string value)
+#snapshot_image_format=<None>
+
+# Override the default disk prefix for the devices attached to
+# a server, which is dependent on virt_type. (valid options
+# are: sd, xvd, uvd, vd) (string value)
+#disk_prefix=<None>
+
+# Number of seconds to wait for instance to shut down after
+# soft reboot request is made. We fall back to hard reboot if
+# instance does not shutdown within this window. (integer
+# value)
+#wait_soft_reboot_seconds=120
+
+# Set to "host-model" to clone the host CPU feature flags; to
+# "host-passthrough" to use the host CPU model exactly; to
+# "custom" to use a named CPU model; to "none" to not set any
+# CPU model. If virt_type="kvm|qemu", it will default to
+# "host-model", otherwise it will default to "none" (string
+# value)
+#cpu_mode=<None>
+
+# Set to a named libvirt CPU model (see names listed in
+# /usr/share/libvirt/cpu_map.xml). Only has effect if
+# cpu_mode="custom" and virt_type="kvm|qemu" (string value)
+#cpu_model=<None>
+
+# Location where libvirt driver will store snapshots before
+# uploading them to image service (string value)
+#snapshots_directory=$instances_path/snapshots
+
+# Location where the Xen hvmloader is kept (string value)
+#xen_hvmloader_path=/usr/lib/xen/boot/hvmloader
+
+# Specific cachemodes to use for different disk types e.g:
+# file=directsync,block=none (list value)
+#disk_cachemodes=
+
+# A path to a device that will be used as source of entropy on
+# the host. Permitted options are: /dev/random or /dev/hwrng
+# (string value)
+#rng_dev_path=<None>
+
+# For qemu or KVM guests, set this option to specify a default
+# machine type per host architecture. You can find a list of
+# supported machine types in your environment by checking the
+# output of the "virsh capabilities"command. The format of the
+# value for this config option is host-arch=machine-type. For
+# example: x86_64=machinetype1,armv7l=machinetype2 (list
+# value)
+#hw_machine_type=<None>
+
+# The data source used to the populate the host "serial" UUID
+# exposed to guest in the virtual BIOS. Permitted options are
+# "hardware", "os", "none" or "auto" (default). (string value)
+#sysinfo_serial=auto
+
+# A number of seconds to memory usage statistics period. Zero
+# or negative value mean to disable memory usage statistics.
+# (integer value)
+#mem_stats_period_seconds=10
+
+# List of uid targets and ranges.Syntax is guest-uid:host-
+# uid:countMaximum of 5 allowed. (list value)
+#uid_maps=
+
+# List of guid targets and ranges.Syntax is guest-gid:host-
+# gid:countMaximum of 5 allowed. (list value)
+#gid_maps=
+
+
+#
+# Options defined in nova.virt.libvirt.imagebackend
+#
+
+# VM Images format. Acceptable values are: raw, qcow2, lvm,
+# rbd, default. If default is specified, then use_cow_images
+# flag is used instead of this one. (string value)
+#images_type=default
+
+# LVM Volume Group that is used for VM images, when you
+# specify images_type=lvm. (string value)
+#images_volume_group=<None>
+
+# Create sparse logical volumes (with virtualsize) if this
+# flag is set to True. (boolean value)
+#sparse_logical_volumes=false
+
+# The RADOS pool in which rbd volumes are stored (string
+# value)
+#images_rbd_pool=rbd
+
+# Path to the ceph configuration file to use (string value)
+#images_rbd_ceph_conf=
+
+# Discard option for nova managed disks (valid options are:
+# ignore, unmap). Need Libvirt(1.0.6) Qemu1.5 (raw format)
+# Qemu1.6(qcow2 format) (string value)
+#hw_disk_discard=<None>
+
+
+#
+# Options defined in nova.virt.libvirt.imagecache
+#
+
+# Allows image information files to be stored in non-standard
+# locations (string value)
+#image_info_filename_pattern=$instances_path/$image_cache_subdirectory_name/%(image)s.info
+
+# Should unused kernel images be removed? This is only safe to
+# enable if all compute nodes have been updated to support
+# this option. This will be enabled by default in future.
+# (boolean value)
+#remove_unused_kernels=false
+
+# Unused resized base images younger than this will not be
+# removed (integer value)
+#remove_unused_resized_minimum_age_seconds=3600
+
+# Write a checksum for files in _base to disk (boolean value)
+#checksum_base_images=false
+
+# How frequently to checksum base images (integer value)
+#checksum_interval_seconds=3600
+
+
+#
+# Options defined in nova.virt.libvirt.lvm
+#
+
+# Method used to wipe old volumes (valid options are: none,
+# zero, shred) (string value)
+#volume_clear=zero
+
+# Size in MiB to wipe at start of old volumes. 0 => all
+# (integer value)
+#volume_clear_size=0
+
+
+#
+# Options defined in nova.virt.libvirt.utils
+#
+
+# Compress snapshot images when possible. This currently
+# applies exclusively to qcow2 images (boolean value)
+#snapshot_compression=false
+
+
+#
+# Options defined in nova.virt.libvirt.vif
+#
+
+# Use virtio for bridge interfaces with KVM/QEMU (boolean
+# value)
+#use_virtio_for_bridges=true
+
+
+#
+# Options defined in nova.virt.libvirt.volume
+#
+
+# Number of times to rescan iSCSI target to find volume
+# (integer value)
+#num_iscsi_scan_tries=5
+
+# Number of times to rescan iSER target to find volume
+# (integer value)
+#num_iser_scan_tries=5
+
+# The RADOS client name for accessing rbd volumes (string
+# value)
+#rbd_user=<None>
+
+# The libvirt UUID of the secret for the rbd_uservolumes
+# (string value)
+#rbd_secret_uuid=<None>
+
+# Directory where the NFS volume is mounted on the compute
+# node (string value)
+#nfs_mount_point_base=$state_path/mnt
+
+# Mount options passed to the NFS client. See section of the
+# nfs man page for details (string value)
+#nfs_mount_options=<None>
+
+# Directory where the SMBFS shares are mounted on the compute
+# node (string value)
+#smbfs_mount_point_base=$state_path/mnt
+
+# Mount options passed to the SMBFS client. See mount.cifs man
+# page for details. Note that the libvirt-qemu uid and gid
+# must be specified. (string value)
+#smbfs_mount_options=
+
+# Number of times to rediscover AoE target to find volume
+# (integer value)
+#num_aoe_discover_tries=3
+
+# Directory where the glusterfs volume is mounted on the
+# compute node (string value)
+#glusterfs_mount_point_base=$state_path/mnt
+
+# Use multipath connection of the iSCSI volume (boolean value)
+#iscsi_use_multipath=false
+
+# Use multipath connection of the iSER volume (boolean value)
+#iser_use_multipath=false
+
+# Path or URL to Scality SOFS configuration file (string
+# value)
+#scality_sofs_config=<None>
+
+# Base dir where Scality SOFS shall be mounted (string value)
+#scality_sofs_mount_point=$state_path/scality
+
+# Protocols listed here will be accessed directly from QEMU.
+# Currently supported protocols: [gluster] (list value)
+#qemu_allowed_storage_drivers=
+
+# Directory where the Quobyte volume is mounted on the compute
+# node (string value)
+#quobyte_mount_point_base=$state_path/mnt
+
+# Path to a Quobyte Client configuration file. (string value)
+#quobyte_client_cfg=<None>
+
+# The iSCSI transport iface to use to connect to target in
+# case offload support is desired. Supported transports are
+# be2iscsi, bnx2i, cxgb3i, cxgb4i, qla4xxx and ocs. Default
+# format is transport_name.hwaddress and can be generated
+# manually or via iscsiadm -m iface (string value)
+# Deprecated group/name - [DEFAULT]/iscsi_transport
+#iscsi_iface=<None>
+
+
+[metrics]
+
+#
+# Options defined in nova.scheduler.weights.metrics
+#
+
+# Multiplier used for weighing metrics. (floating point value)
+#weight_multiplier=1.0
+
+# How the metrics are going to be weighed. This should be in
+# the form of "<name1>=<ratio1>, <name2>=<ratio2>, ...", where
+# <nameX> is one of the metrics to be weighed, and <ratioX> is
+# the corresponding ratio. So for "name1=1.0, name2=-1.0" The
+# final weight would be name1.value * 1.0 + name2.value *
+# -1.0. (list value)
+#weight_setting=
+
+# How to treat the unavailable metrics. When a metric is NOT
+# available for a host, if it is set to be True, it would
+# raise an exception, so it is recommended to use the
+# scheduler filter MetricFilter to filter out those hosts. If
+# it is set to be False, the unavailable metric would be
+# treated as a negative factor in weighing process, the
+# returned value would be set by the option
+# weight_of_unavailable. (boolean value)
+#required=true
+
+# The final weight value to be returned if required is set to
+# False and any one of the metrics set by weight_setting is
+# unavailable. (floating point value)
+#weight_of_unavailable=-10000.0
+
+
+[neutron]
+
+#
+# Options defined in nova.api.metadata.handler
+#
+
+# Set flag to indicate Neutron will proxy metadata requests
+# and resolve instance ids. (boolean value)
+service_metadata_proxy=True
+
+# Shared secret to validate proxies Neutron metadata requests
+# (string value)
+metadata_proxy_shared_secret={{ METADATA_PROXY_SHARED_SECRET }}
+
+
+#
+# Options defined in nova.network.neutronv2.api
+#
+
+# URL for connecting to neutron (string value)
+url=http://{{ CONTROLLER_HOST_ADDRESS }}:9696
+
+# User id for connecting to neutron in admin context.
+# DEPRECATED: specify an auth_plugin and appropriate
+# credentials instead. (string value)
+#admin_user_id=<None>
+
+# Username for connecting to neutron in admin context
+# DEPRECATED: specify an auth_plugin and appropriate
+# credentials instead. (string value)
+admin_username={{ NEUTRON_SERVICE_USER }}
+
+# Password for connecting to neutron in admin context
+# DEPRECATED: specify an auth_plugin and appropriate
+# credentials instead. (string value)
+admin_password={{ NEUTRON_SERVICE_PASSWORD }}
+
+# Tenant id for connecting to neutron in admin context
+# DEPRECATED: specify an auth_plugin and appropriate
+# credentials instead. (string value)
+#admin_tenant_id=<None>
+
+# Tenant name for connecting to neutron in admin context. This
+# option will be ignored if neutron_admin_tenant_id is set.
+# Note that with Keystone V3 tenant names are only unique
+# within a domain. DEPRECATED: specify an auth_plugin and
+# appropriate credentials instead. (string value)
+admin_tenant_name=service
+
+# Region name for connecting to neutron in admin context
+# (string value)
+#region_name=<None>
+
+# Authorization URL for connecting to neutron in admin
+# context. DEPRECATED: specify an auth_plugin and appropriate
+# credentials instead. (string value)
+admin_auth_url=http://{{ CONTROLLER_HOST_ADDRESS }}:35357/v2.0
+
+# Authorization strategy for connecting to neutron in admin
+# context. DEPRECATED: specify an auth_plugin and appropriate
+# credentials instead. If an auth_plugin is specified strategy
+# will be ignored. (string value)
+auth_strategy=keystone
+
+# Name of Integration Bridge used by Open vSwitch (string
+# value)
+#ovs_bridge=br-int
+
+# Number of seconds before querying neutron for extensions
+# (integer value)
+#extension_sync_interval=600
+
+# DEPRECATED: Allow an instance to have multiple vNICs
+# attached to the same Neutron network. This option is
+# deprecated in the 2015.1 release and will be removed in the
+# 2015.2 release where the default behavior will be to always
+# allow multiple ports from the same network to be attached to
+# an instance. (boolean value)
+#allow_duplicate_networks=false
+
+
+[osapi_v3]
+
+#
+# Options defined in nova.api.openstack
+#
+
+# Whether the V3 API is enabled or not (boolean value)
+#enabled=false
+
+# A list of v3 API extensions to never load. Specify the
+# extension aliases here. (list value)
+#extensions_blacklist=
+
+# If the list is not empty then a v3 API extension will only
+# be loaded if it exists in this list. Specify the extension
+# aliases here. (list value)
+#extensions_whitelist=
+
+
+[rdp]
+
+#
+# Options defined in nova.rdp
+#
+
+# Location of RDP html5 console proxy, in the form
+# "http://127.0.0.1:6083/" (string value)
+#html5_proxy_base_url=http://127.0.0.1:6083/
+
+# Enable RDP related features (boolean value)
+#enabled=false
+
+
+[serial_console]
+
+#
+# Options defined in nova.cmd.serialproxy
+#
+
+# Host on which to listen for incoming requests (string value)
+serialproxy_host=127.0.0.1
+
+# Port on which to listen for incoming requests (integer
+# value)
+#serialproxy_port=6083
+
+
+#
+# Options defined in nova.console.serial
+#
+
+# Enable serial console related features (boolean value)
+enabled=false
+
+# Range of TCP ports to use for serial ports on compute hosts
+# (string value)
+#port_range=10000:20000
+
+# Location of serial console proxy. (string value)
+#base_url=ws://127.0.0.1:6083/
+
+# IP address on which instance serial console should listen
+# (string value)
+#listen=127.0.0.1
+
+# The address to which proxy clients (like nova-serialproxy)
+# should connect (string value)
+#proxyclient_address=127.0.0.1
+
+
+[spice]
+
+#
+# Options defined in nova.cmd.spicehtml5proxy
+#
+
+# Host on which to listen for incoming requests (string value)
+#html5proxy_host=0.0.0.0
+
+# Port on which to listen for incoming requests (integer
+# value)
+#html5proxy_port=6082
+
+
+#
+# Options defined in nova.spice
+#
+
+# Location of spice HTML5 console proxy, in the form
+# "http://127.0.0.1:6082/spice_auto.html" (string value)
+#html5proxy_base_url=http://127.0.0.1:6082/spice_auto.html
+
+# IP address on which instance spice server should listen
+# (string value)
+#server_listen=127.0.0.1
+
+# The address to which proxy clients (like nova-
+# spicehtml5proxy) should connect (string value)
+#server_proxyclient_address=127.0.0.1
+
+# Enable spice related features (boolean value)
+enabled=false
+
+# Enable spice guest agent support (boolean value)
+#agent_enabled=true
+
+# Keymap for spice (string value)
+#keymap=en-us
+
+
+[ssl]
+
+#
+# Options defined in nova.openstack.common.sslutils
+#
+
+# CA certificate file to use to verify connecting clients.
+# (string value)
+#ca_file=<None>
+
+# Certificate file to use when starting the server securely.
+# (string value)
+#cert_file=<None>
+
+# Private key file to use when starting the server securely.
+# (string value)
+#key_file=<None>
+
+
+[trusted_computing]
+
+#
+# Options defined in nova.scheduler.filters.trusted_filter
+#
+
+# Attestation server HTTP (string value)
+#attestation_server=<None>
+
+# Attestation server Cert file for Identity verification
+# (string value)
+#attestation_server_ca_file=<None>
+
+# Attestation server port (string value)
+#attestation_port=8443
+
+# Attestation web API URL (string value)
+#attestation_api_url=/OpenAttestationWebServices/V1.0
+
+# Attestation authorization blob - must change (string value)
+#attestation_auth_blob=<None>
+
+# Attestation status cache valid period length (integer value)
+#attestation_auth_timeout=60
+
+# Disable SSL cert verification for Attestation service
+# (boolean value)
+#attestation_insecure_ssl=false
+
+
+[upgrade_levels]
+
+#
+# Options defined in nova.baserpc
+#
+
+# Set a version cap for messages sent to the base api in any
+# service (string value)
+#baseapi=<None>
+
+
+#
+# Options defined in nova.cells.rpc_driver
+#
+
+# Set a version cap for messages sent between cells services
+# (string value)
+#intercell=<None>
+
+
+#
+# Options defined in nova.cells.rpcapi
+#
+
+# Set a version cap for messages sent to local cells services
+# (string value)
+#cells=<None>
+
+
+#
+# Options defined in nova.cert.rpcapi
+#
+
+# Set a version cap for messages sent to cert services (string
+# value)
+#cert=<None>
+
+
+#
+# Options defined in nova.compute.rpcapi
+#
+
+# Set a version cap for messages sent to compute services. If
+# you plan to do a live upgrade from havana to icehouse, you
+# should set this option to "icehouse-compat" before beginning
+# the live upgrade procedure. (string value)
+#compute=<None>
+
+
+#
+# Options defined in nova.conductor.rpcapi
+#
+
+# Set a version cap for messages sent to conductor services
+# (string value)
+#conductor=<None>
+
+
+#
+# Options defined in nova.console.rpcapi
+#
+
+# Set a version cap for messages sent to console services
+# (string value)
+#console=<None>
+
+
+#
+# Options defined in nova.consoleauth.rpcapi
+#
+
+# Set a version cap for messages sent to consoleauth services
+# (string value)
+#consoleauth=<None>
+
+
+#
+# Options defined in nova.network.rpcapi
+#
+
+# Set a version cap for messages sent to network services
+# (string value)
+#network=<None>
+
+
+#
+# Options defined in nova.scheduler.rpcapi
+#
+
+# Set a version cap for messages sent to scheduler services
+# (string value)
+#scheduler=<None>
+
+
+[vmware]
+
+#
+# Options defined in nova.virt.vmwareapi.driver
+#
+
+# The PBM status. (boolean value)
+#pbm_enabled=false
+
+# PBM service WSDL file location URL. e.g.
+# file:///opt/SDK/spbm/wsdl/pbmService.wsdl Not setting this
+# will disable storage policy based placement of instances.
+# (string value)
+#pbm_wsdl_location=<None>
+
+# The PBM default policy. If pbm_wsdl_location is set and
+# there is no defined storage policy for the specific request
+# then this policy will be used. (string value)
+#pbm_default_policy=<None>
+
+# Hostname or IP address for connection to VMware VC host.
+# (string value)
+#host_ip=<None>
+
+# Port for connection to VMware VC host. (integer value)
+#host_port=443
+
+# Username for connection to VMware VC host. (string value)
+#host_username=<None>
+
+# Password for connection to VMware VC host. (string value)
+#host_password=<None>
+
+# Name of a VMware Cluster ComputeResource. (multi valued)
+#cluster_name=<None>
+
+# Regex to match the name of a datastore. (string value)
+#datastore_regex=<None>
+
+# The interval used for polling of remote tasks. (floating
+# point value)
+#task_poll_interval=0.5
+
+# The number of times we retry on failures, e.g., socket
+# error, etc. (integer value)
+#api_retry_count=10
+
+# VNC starting port (integer value)
+#vnc_port=5900
+
+# Total number of VNC ports (integer value)
+#vnc_port_total=10000
+
+# Whether to use linked clone (boolean value)
+#use_linked_clone=true
+
+# Optional VIM Service WSDL Location e.g
+# http://<server>/vimService.wsdl. Optional over-ride to
+# default location for bug work-arounds (string value)
+#wsdl_location=<None>
+
+
+#
+# Options defined in nova.virt.vmwareapi.vif
+#
+
+# Physical ethernet adapter name for vlan networking (string
+# value)
+#vlan_interface=vmnic0
+
+# Name of Integration Bridge (string value)
+#integration_bridge=br-int
+
+
+#
+# Options defined in nova.virt.vmwareapi.vim_util
+#
+
+# The maximum number of ObjectContent data objects that should
+# be returned in a single result. A positive value will cause
+# the operation to suspend the retrieval when the count of
+# objects reaches the specified maximum. The server may still
+# limit the count to something less than the configured value.
+# Any remaining objects may be retrieved with additional
+# requests. (integer value)
+#maximum_objects=100
+
+
+#
+# Options defined in nova.virt.vmwareapi.vmops
+#
+
+# The prefix for Where cached images are stored. This is NOT
+# the full path - just a folder prefix. This should only be
+# used when a datastore cache should be shared between compute
+# nodes. Note: this should only be used when the compute nodes
+# have a shared file system. (string value)
+#cache_prefix=<None>
+
+
+[workarounds]
+
+#
+# Options defined in nova.utils
+#
+
+# This option allows a fallback to sudo for performance
+# reasons. For example see
+# https://bugs.launchpad.net/nova/+bug/1415106 (boolean value)
+#disable_rootwrap=false
+
+# When using libvirt 1.2.2 fails live snapshots intermittently
+# under load. This config option provides mechanism to
+# disable livesnapshot while this is resolved. See
+# https://bugs.launchpad.net/nova/+bug/1334398 (boolean value)
+#disable_libvirt_livesnapshot=true
+
+# Whether to destroy instances on startup when we suspect they
+# have previously been evacuated. This can result in data loss
+# if undesired. See https://launchpad.net/bugs/1419785
+# (boolean value)
+#destroy_after_evacuate=true
+
+
+[xenserver]
+
+#
+# Options defined in nova.virt.xenapi.agent
+#
+
+# Number of seconds to wait for agent reply (integer value)
+#agent_timeout=30
+
+# Number of seconds to wait for agent to be fully operational
+# (integer value)
+#agent_version_timeout=300
+
+# Number of seconds to wait for agent reply to resetnetwork
+# request (integer value)
+#agent_resetnetwork_timeout=60
+
+# Specifies the path in which the XenAPI guest agent should be
+# located. If the agent is present, network configuration is
+# not injected into the image. Used if
+# compute_driver=xenapi.XenAPIDriver and flat_injected=True
+# (string value)
+#agent_path=usr/sbin/xe-update-networking
+
+# Disables the use of the XenAPI agent in any image regardless
+# of what image properties are present. (boolean value)
+#disable_agent=false
+
+# Determines if the XenAPI agent should be used when the image
+# used does not contain a hint to declare if the agent is
+# present or not. The hint is a glance property
+# "xenapi_use_agent" that has the value "True" or "False".
+# Note that waiting for the agent when it is not present will
+# significantly increase server boot times. (boolean value)
+#use_agent_default=false
+
+
+#
+# Options defined in nova.virt.xenapi.client.session
+#
+
+# Timeout in seconds for XenAPI login. (integer value)
+#login_timeout=10
+
+# Maximum number of concurrent XenAPI connections. Used only
+# if compute_driver=xenapi.XenAPIDriver (integer value)
+#connection_concurrent=5
+
+
+#
+# Options defined in nova.virt.xenapi.driver
+#
+
+# URL for connection to XenServer/Xen Cloud Platform. A
+# special value of unix://local can be used to connect to the
+# local unix socket. Required if
+# compute_driver=xenapi.XenAPIDriver (string value)
+#connection_url=<None>
+
+# Username for connection to XenServer/Xen Cloud Platform.
+# Used only if compute_driver=xenapi.XenAPIDriver (string
+# value)
+#connection_username=root
+
+# Password for connection to XenServer/Xen Cloud Platform.
+# Used only if compute_driver=xenapi.XenAPIDriver (string
+# value)
+#connection_password=<None>
+
+# The interval used for polling of coalescing vhds. Used only
+# if compute_driver=xenapi.XenAPIDriver (floating point value)
+#vhd_coalesce_poll_interval=5.0
+
+# Ensure compute service is running on host XenAPI connects
+# to. (boolean value)
+#check_host=true
+
+# Max number of times to poll for VHD to coalesce. Used only
+# if compute_driver=xenapi.XenAPIDriver (integer value)
+#vhd_coalesce_max_attempts=20
+
+# Base path to the storage repository (string value)
+#sr_base_path=/var/run/sr-mount
+
+# The iSCSI Target Host (string value)
+#target_host=<None>
+
+# The iSCSI Target Port, default is port 3260 (string value)
+#target_port=3260
+
+# IQN Prefix (string value)
+#iqn_prefix=iqn.2010-10.org.openstack
+
+# Used to enable the remapping of VBD dev (Works around an
+# issue in Ubuntu Maverick) (boolean value)
+#remap_vbd_dev=false
+
+# Specify prefix to remap VBD dev to (ex. /dev/xvdb ->
+# /dev/sdb) (string value)
+#remap_vbd_dev_prefix=sd
+
+
+#
+# Options defined in nova.virt.xenapi.image.bittorrent
+#
+
+# Base URL for torrent files. (string value)
+#torrent_base_url=<None>
+
+# Probability that peer will become a seeder. (1.0 = 100%)
+# (floating point value)
+#torrent_seed_chance=1.0
+
+# Number of seconds after downloading an image via BitTorrent
+# that it should be seeded for other peers. (integer value)
+#torrent_seed_duration=3600
+
+# Cached torrent files not accessed within this number of
+# seconds can be reaped (integer value)
+#torrent_max_last_accessed=86400
+
+# Beginning of port range to listen on (integer value)
+#torrent_listen_port_start=6881
+
+# End of port range to listen on (integer value)
+#torrent_listen_port_end=6891
+
+# Number of seconds a download can remain at the same progress
+# percentage w/o being considered a stall (integer value)
+#torrent_download_stall_cutoff=600
+
+# Maximum number of seeder processes to run concurrently
+# within a given dom0. (-1 = no limit) (integer value)
+#torrent_max_seeder_processes_per_host=1
+
+
+#
+# Options defined in nova.virt.xenapi.pool
+#
+
+# To use for hosts with different CPUs (boolean value)
+#use_join_force=true
+
+
+#
+# Options defined in nova.virt.xenapi.vif
+#
+
+# Name of Integration Bridge used by Open vSwitch (string
+# value)
+#ovs_integration_bridge=xapi1
+
+
+#
+# Options defined in nova.virt.xenapi.vm_utils
+#
+
+# Cache glance images locally. `all` will cache all images,
+# `some` will only cache images that have the image_property
+# `cache_in_nova=True`, and `none` turns off caching entirely
+# (string value)
+#cache_images=all
+
+# Compression level for images, e.g., 9 for gzip -9. Range is
+# 1-9, 9 being most compressed but most CPU intensive on dom0.
+# (integer value)
+#image_compression_level=<None>
+
+# Default OS type (string value)
+#default_os_type=linux
+
+# Time to wait for a block device to be created (integer
+# value)
+#block_device_creation_timeout=10
+
+# Maximum size in bytes of kernel or ramdisk images (integer
+# value)
+#max_kernel_ramdisk_size=16777216
+
+# Filter for finding the SR to be used to install guest
+# instances on. To use the Local Storage in default
+# XenServer/XCP installations set this flag to other-config
+# :i18n-key=local-storage. To select an SR with a different
+# matching criteria, you could set it to other-
+# config:my_favorite_sr=true. On the other hand, to fall back
+# on the Default SR, as displayed by XenCenter, set this flag
+# to: default-sr:true (string value)
+#sr_matching_filter=default-sr:true
+
+# Whether to use sparse_copy for copying data on a resize down
+# (False will use standard dd). This speeds up resizes down
+# considerably since large runs of zeros won't have to be
+# rsynced (boolean value)
+#sparse_copy=true
+
+# Maximum number of retries to unplug VBD. if <=0, should try
+# once and no retry (integer value)
+#num_vbd_unplug_retries=10
+
+# Whether or not to download images via Bit Torrent
+# (all|some|none). (string value)
+#torrent_images=none
+
+# Name of network to use for booting iPXE ISOs (string value)
+#ipxe_network_name=<None>
+
+# URL to the iPXE boot menu (string value)
+#ipxe_boot_menu_url=<None>
+
+# Name and optionally path of the tool used for ISO image
+# creation (string value)
+#ipxe_mkisofs_cmd=mkisofs
+
+
+#
+# Options defined in nova.virt.xenapi.vmops
+#
+
+# Number of seconds to wait for instance to go to running
+# state (integer value)
+#running_timeout=60
+
+# The XenAPI VIF driver using XenServer Network APIs. (string
+# value)
+#vif_driver=nova.virt.xenapi.vif.XenAPIBridgeDriver
+
+# Dom0 plugin driver used to handle image uploads. (string
+# value)
+#image_upload_handler=nova.virt.xenapi.image.glance.GlanceStore
+
+
+#
+# Options defined in nova.virt.xenapi.volume_utils
+#
+
+# Number of seconds to wait for an SR to settle if the VDI
+# does not exist when first introduced (integer value)
+#introduce_vdi_retry_wait=20
+
+
+[zookeeper]
+
+#
+# Options defined in nova.servicegroup.drivers.zk
+#
+
+# The ZooKeeper addresses for servicegroup service in the
+# format of host1:port,host2:port,host3:port (string value)
+#address=<None>
+
+# The recv_timeout parameter for the zk session (integer
+# value)
+#recv_timeout=4000
+
+# The prefix used in ZooKeeper to store ephemeral nodes
+# (string value)
+#sg_prefix=/servicegroups
+
+# Number of seconds to wait until retrying to join the session
+# (integer value)
+#sg_retry_interval=5
+
+
+[matchmaker_redis]
+
+#
+# From oslo.messaging
+#
+
+# Host to locate redis. (string value)
+#host = 127.0.0.1
+
+# Use this port to connect to redis host. (integer value)
+#port = 6379
+
+# Password for Redis server (optional). (string value)
+#password = <None>
+
+
+[matchmaker_ring]
+
+#
+# From oslo.messaging
+#
+
+# Matchmaker ring file (JSON). (string value)
+# Deprecated group/name - [DEFAULT]/matchmaker_ringfile
+#ringfile = /etc/oslo/matchmaker_ring.json
+
+
+[oslo_concurrency]
+
+#
+# From oslo.concurrency
+#
+
+# Enables or disables inter-process locks. (boolean value)
+# Deprecated group/name - [DEFAULT]/disable_process_locking
+#disable_process_locking = false
+
+# Directory to use for lock files. For security, the specified directory
+# should only be writable by the user running the processes that need locking.
+# Defaults to environment variable OSLO_LOCK_PATH. If external locks are used,
+# a lock path must be set. (string value)
+# Deprecated group/name - [DEFAULT]/lock_path
+lock_path = /var/lock/nova
+
+
+[oslo_messaging_amqp]
+
+#
+# From oslo.messaging
+#
+
+# address prefix used when sending to a specific server (string value)
+# Deprecated group/name - [amqp1]/server_request_prefix
+#server_request_prefix = exclusive
+
+# address prefix used when broadcasting to all servers (string value)
+# Deprecated group/name - [amqp1]/broadcast_prefix
+#broadcast_prefix = broadcast
+
+# address prefix when sending to any server in group (string value)
+# Deprecated group/name - [amqp1]/group_request_prefix
+#group_request_prefix = unicast
+
+# Name for the AMQP container (string value)
+# Deprecated group/name - [amqp1]/container_name
+#container_name = <None>
+
+# Timeout for inactive connections (in seconds) (integer value)
+# Deprecated group/name - [amqp1]/idle_timeout
+#idle_timeout = 0
+
+# Debug: dump AMQP frames to stdout (boolean value)
+# Deprecated group/name - [amqp1]/trace
+#trace = false
+
+# CA certificate PEM file for verifing server certificate (string value)
+# Deprecated group/name - [amqp1]/ssl_ca_file
+#ssl_ca_file =
+
+# Identifying certificate PEM file to present to clients (string value)
+# Deprecated group/name - [amqp1]/ssl_cert_file
+#ssl_cert_file =
+
+# Private key PEM file used to sign cert_file certificate (string value)
+# Deprecated group/name - [amqp1]/ssl_key_file
+#ssl_key_file =
+
+# Password for decrypting ssl_key_file (if encrypted) (string value)
+# Deprecated group/name - [amqp1]/ssl_key_password
+#ssl_key_password = <None>
+
+# Accept clients using either SSL or plain TCP (boolean value)
+# Deprecated group/name - [amqp1]/allow_insecure_clients
+#allow_insecure_clients = false
+
+
+[oslo_messaging_qpid]
+
+#
+# From oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+#amqp_durable_queues = false
+
+# Auto-delete queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/amqp_auto_delete
+#amqp_auto_delete = false
+
+# Size of RPC connection pool. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_conn_pool_size
+#rpc_conn_pool_size = 30
+
+# Qpid broker hostname. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_hostname
+#qpid_hostname = localhost
+
+# Qpid broker port. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_port
+#qpid_port = 5672
+
+# Qpid HA cluster host:port pairs. (list value)
+# Deprecated group/name - [DEFAULT]/qpid_hosts
+#qpid_hosts = $qpid_hostname:$qpid_port
+
+# Username for Qpid connection. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_username
+#qpid_username =
+
+# Password for Qpid connection. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_password
+#qpid_password =
+
+# Space separated list of SASL mechanisms to use for auth. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_sasl_mechanisms
+#qpid_sasl_mechanisms =
+
+# Seconds between connection keepalive heartbeats. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_heartbeat
+#qpid_heartbeat = 60
+
+# Transport to use, either 'tcp' or 'ssl'. (string value)
+# Deprecated group/name - [DEFAULT]/qpid_protocol
+#qpid_protocol = tcp
+
+# Whether to disable the Nagle algorithm. (boolean value)
+# Deprecated group/name - [DEFAULT]/qpid_tcp_nodelay
+#qpid_tcp_nodelay = true
+
+# The number of prefetched messages held by receiver. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_receiver_capacity
+#qpid_receiver_capacity = 1
+
+# The qpid topology version to use. Version 1 is what was originally used by
+# impl_qpid. Version 2 includes some backwards-incompatible changes that allow
+# broker federation to work. Users should update to version 2 when they are
+# able to take everything down, as it requires a clean break. (integer value)
+# Deprecated group/name - [DEFAULT]/qpid_topology_version
+#qpid_topology_version = 1
+
+
+[oslo_messaging_rabbit]
+
+#
+# From oslo.messaging
+#
+
+# Use durable queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_durable_queues
+#amqp_durable_queues = false
+
+# Auto-delete queues in AMQP. (boolean value)
+# Deprecated group/name - [DEFAULT]/amqp_auto_delete
+#amqp_auto_delete = false
+
+# Size of RPC connection pool. (integer value)
+# Deprecated group/name - [DEFAULT]/rpc_conn_pool_size
+#rpc_conn_pool_size = 30
+
+# SSL version to use (valid only if SSL enabled). Valid values are TLSv1 and
+# SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may be available on some
+# distributions. (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_version
+#kombu_ssl_version =
+
+# SSL key file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_keyfile
+#kombu_ssl_keyfile =
+
+# SSL cert file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_certfile
+#kombu_ssl_certfile =
+
+# SSL certification authority file (valid only if SSL enabled). (string value)
+# Deprecated group/name - [DEFAULT]/kombu_ssl_ca_certs
+#kombu_ssl_ca_certs =
+
+# How long to wait before reconnecting in response to an AMQP consumer cancel
+# notification. (floating point value)
+# Deprecated group/name - [DEFAULT]/kombu_reconnect_delay
+#kombu_reconnect_delay = 1.0
+
+# The RabbitMQ broker address where a single node is used. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_host
+rabbit_host = {{ RABBITMQ_HOST }}
+
+# The RabbitMQ broker port where a single node is used. (integer value)
+# Deprecated group/name - [DEFAULT]/rabbit_port
+rabbit_port = {{ RABBITMQ_PORT }}
+
+# RabbitMQ HA cluster host:port pairs. (list value)
+# Deprecated group/name - [DEFAULT]/rabbit_hosts
+#rabbit_hosts = $rabbit_host:$rabbit_port
+
+# Connect over SSL for RabbitMQ. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_use_ssl
+rabbit_use_ssl = false
+
+# The RabbitMQ userid. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_userid
+rabbit_userid = {{ RABBITMQ_USER }}
+
+# The RabbitMQ password. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_password
+rabbit_password = {{ RABBITMQ_PASSWORD }}
+
+# The RabbitMQ login method. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_login_method
+#rabbit_login_method = AMQPLAIN
+
+# The RabbitMQ virtual host. (string value)
+# Deprecated group/name - [DEFAULT]/rabbit_virtual_host
+#rabbit_virtual_host = /
+
+# How frequently to retry connecting with RabbitMQ. (integer value)
+#rabbit_retry_interval = 1
+
+# How long to backoff for between retries when connecting to RabbitMQ. (integer
+# value)
+# Deprecated group/name - [DEFAULT]/rabbit_retry_backoff
+#rabbit_retry_backoff = 2
+
+# Maximum number of RabbitMQ connection retries. Default is 0 (infinite retry
+# count). (integer value)
+# Deprecated group/name - [DEFAULT]/rabbit_max_retries
+#rabbit_max_retries = 0
+
+# Use HA queues in RabbitMQ (x-ha-policy: all). If you change this option, you
+# must wipe the RabbitMQ database. (boolean value)
+# Deprecated group/name - [DEFAULT]/rabbit_ha_queues
+#rabbit_ha_queues = false
+
+# Number of seconds after which the Rabbit broker is considered down if
+# heartbeat's keep-alive fails (0 disable the heartbeat). (integer value)
+#heartbeat_timeout_threshold = 60
+
+# How often times during the heartbeat_timeout_threshold we check the
+# heartbeat. (integer value)
+#heartbeat_rate = 2
+
+# Deprecated, use rpc_backend=kombu+memory or rpc_backend=fake (boolean value)
+# Deprecated group/name - [DEFAULT]/fake_rabbit
+#fake_rabbit = false
diff --git a/install-files/openstack/usr/share/openstack/openvswitch.yml b/install-files/openstack/usr/share/openstack/openvswitch.yml
new file mode 100644
index 00000000..47257f7f
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/openvswitch.yml
@@ -0,0 +1,38 @@
+---
+- hosts: localhost
+ tasks:
+
+ - name: Create openvswitch directories
+ file: path={{ item }} state=directory
+ with_items:
+ - /etc/openvswitch
+ - /var/run/openvswitch
+
+ - shell: >
+ ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
+ creates=/etc/openvswitch/conf.db
+
+ # We enable the openvswitch-db-server in a different task to identify
+ # the first time we run this script by identifying when we enable the
+ # unit.
+ #
+ # We need to identify this to initialise the database.
+ - name: Enable openvswitch database service
+ service: name={{ item }} enabled=yes
+ with_items:
+ - openvswitch-db-server.service
+ register: openvswitch_db_enable
+
+ - name: Start openvswitch database service
+ service: name={{ item }} state=started
+ with_items:
+ - openvswitch-db-server.service
+
+ - name: initialise openvswitch-db
+ shell: ovs-vsctl --no-wait init
+ when: openvswitch_db_enable|changed
+
+ - name: Enable and start Open vSwitch service
+ service: name={{ item }} enabled=yes state=started
+ with_items:
+ - openvswitch.service
diff --git a/install-files/openstack/usr/share/openstack/postgres.yml b/install-files/openstack/usr/share/openstack/postgres.yml
new file mode 100644
index 00000000..5ff9355e
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/postgres.yml
@@ -0,0 +1,48 @@
+---
+- hosts: localhost
+ vars_files:
+ - "/etc/openstack/postgres.conf"
+ tasks:
+
+ - name: Create postgres user
+ user:
+ name: postgres
+ comment: PostgreSQL Server
+ shell: /sbin/nologin
+ home: /var/lib/pgsql
+
+ - name: Create the postgres directories
+ file:
+ path: "{{ item }}"
+ state: directory
+ owner: postgres
+ group: postgres
+ with_items:
+ - /var/run/postgresql
+ - /var/lib/pgsql/data
+
+ - name: Initialise postgres database
+ command: pg_ctl -D /var/lib/pgsql/data initdb
+ args:
+ creates: /var/lib/pgsql/data/base
+ sudo: yes
+ sudo_user: postgres
+
+ - name: Add the configuration needed for postgres for Openstack
+ template:
+ src: /usr/share/openstack/postgres/{{ item }}
+ dest: /var/lib/pgsql/data/{{ item }}
+ owner: postgres
+ group: postgres
+ mode: 0600
+ with_items:
+ - postgresql.conf
+ - pg_hba.conf
+
+ - name: Enable and start postgres services
+ service:
+ name: "{{ item }}"
+ enabled: yes
+ state: started
+ with_items:
+ - postgres-server
diff --git a/install-files/openstack/usr/share/openstack/postgres/pg_hba.conf b/install-files/openstack/usr/share/openstack/postgres/pg_hba.conf
new file mode 100644
index 00000000..78186924
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/postgres/pg_hba.conf
@@ -0,0 +1,5 @@
+local all all trust
+host all all 127.0.0.0/8 trust
+host all all ::1/128 trust
+host all all {{ MANAGEMENT_INTERFACE_IP_ADDRESS }}/32 trust
+host all all 0.0.0.0/0 md5
diff --git a/install-files/openstack/usr/share/openstack/postgres/postgresql.conf b/install-files/openstack/usr/share/openstack/postgres/postgresql.conf
new file mode 100644
index 00000000..9c8094ea
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/postgres/postgresql.conf
@@ -0,0 +1,11 @@
+listen_addresses = '{{ MANAGEMENT_INTERFACE_IP_ADDRESS }}'
+max_connections = 300
+shared_buffers = 128MB
+log_timezone = 'UTC'
+datestyle = 'iso, mdy'
+timezone = 'UTC'
+lc_messages = 'C'
+lc_monetary = 'C'
+lc_numeric = 'C'
+lc_time = 'C'
+default_text_search_config = 'pg_catalog.english'
diff --git a/install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq-env.conf b/install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq-env.conf
new file mode 100644
index 00000000..d4c58dae
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq-env.conf
@@ -0,0 +1,3 @@
+# Configure port node where rabbitmq-server will listen from.
+NODE_PORT={{ RABBITMQ_PORT }}
+CONFIG_FILE=/etc/rabbitmq/rabbitmq
diff --git a/install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq.config b/install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq.config
new file mode 100644
index 00000000..9b93881e
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/rabbitmq/rabbitmq.config
@@ -0,0 +1,9 @@
+%% -*- Rabbit configuration for Openstack in Baserock
+[
+ {rabbit,
+ [
+ {default_user, <<"{{ RABBITMQ_USER }}">>},
+ {default_pass, <<"{{ RABBITMQ_PASSWORD }}">>},
+ {tcp_listeners, [{{ RABBITMQ_PORT }}]}
+ ]}
+].
diff --git a/install-files/openstack/usr/share/openstack/swift-controller.yml b/install-files/openstack/usr/share/openstack/swift-controller.yml
new file mode 100644
index 00000000..690de087
--- /dev/null
+++ b/install-files/openstack/usr/share/openstack/swift-controller.yml
@@ -0,0 +1,52 @@
+---
+- hosts: localhost
+ vars_files:
+ - swift-controller-vars.yml
+ vars:
+ - ring_name_port_map:
+ account:
+ port: 6002
+ container:
+ port: 6001
+ object:
+ port: 6000
+ remote_user: root
+ tasks:
+ - user:
+ name: swift
+ comment: Swift user
+
+ - file:
+ path: /etc/swift
+ owner: swift
+ group: swift
+ state: directory
+
+ - template:
+ src: /usr/share/swift/etc/swift/proxy-server.j2
+ dest: /etc/swift/proxy-server.conf
+ mode: 0644
+ owner: swift
+ group: swift
+
+ - keystone_user:
+ user: swift
+ password: "{{ SWIFT_ADMIN_PASSWORD }}"
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - keystone_user:
+ role: admin
+ user: swift
+ tenant: service
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
+
+ - keystone_service:
+ name: swift
+ type: object-store
+ description: OpenStack Object Storage
+ publicurl: http://{{ MANAGEMENT_INTERFACE_IP_ADDRESS }}:8080/v1/AUTH_%(tenant_id)s
+ internalurl: http://{{ MANAGEMENT_INTERFACE_IP_ADDRESS }}:8080/v1/AUTH_%(tenant_id)s
+ adminurl: http://{{ MANAGEMENT_INTERFACE_IP_ADDRESS }}:8080
+ region: regionOne
+ token: "{{ KEYSTONE_TEMPORARY_ADMIN_TOKEN }}"
diff --git a/install-files/openstack/usr/share/swift/etc/rsyncd.j2 b/install-files/openstack/usr/share/swift/etc/rsyncd.j2
new file mode 100644
index 00000000..c0657665
--- /dev/null
+++ b/install-files/openstack/usr/share/swift/etc/rsyncd.j2
@@ -0,0 +1,23 @@
+uid = swift
+gid = swift
+log file = /var/log/rsyncd.log
+pid file = /var/run/rsyncd.pid
+address = {{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+
+[account]
+max connections = 2
+path = /srv/node/
+read only = false
+lock file = /var/lock/account.lock
+
+[container]
+max connections = 2
+path = /srv/node/
+read only = false
+lock file = /var/lock/container.lock
+
+[object]
+max connections = 2
+path = /srv/node/
+read only = false
+lock file = /var/lock/object.lock
diff --git a/install-files/openstack/usr/share/swift/etc/swift/proxy-server.j2 b/install-files/openstack/usr/share/swift/etc/swift/proxy-server.j2
new file mode 100644
index 00000000..dda82d5a
--- /dev/null
+++ b/install-files/openstack/usr/share/swift/etc/swift/proxy-server.j2
@@ -0,0 +1,630 @@
+[DEFAULT]
+# bind_ip = 0.0.0.0
+bind_port = 8080
+# bind_timeout = 30
+# backlog = 4096
+swift_dir = /etc/swift
+user = swift
+
+# Enables exposing configuration settings via HTTP GET /info.
+# expose_info = true
+
+# Key to use for admin calls that are HMAC signed. Default is empty,
+# which will disable admin calls to /info.
+# admin_key = secret_admin_key
+#
+# Allows the ability to withhold sections from showing up in the public calls
+# to /info. You can withhold subsections by separating the dict level with a
+# ".". The following would cause the sections 'container_quotas' and 'tempurl'
+# to not be listed, and the key max_failed_deletes would be removed from
+# bulk_delete. Default is empty, allowing all registered fetures to be listed
+# via HTTP GET /info.
+# disallowed_sections = container_quotas, tempurl, bulk_delete.max_failed_deletes
+
+# Use an integer to override the number of pre-forked processes that will
+# accept connections. Should default to the number of effective cpu
+# cores in the system. It's worth noting that individual workers will
+# use many eventlet co-routines to service multiple concurrent requests.
+# workers = auto
+#
+# Maximum concurrent requests per worker
+# max_clients = 1024
+#
+# Set the following two lines to enable SSL. This is for testing only.
+# cert_file = /etc/swift/proxy.crt
+# key_file = /etc/swift/proxy.key
+#
+# expiring_objects_container_divisor = 86400
+# expiring_objects_account_name = expiring_objects
+#
+# You can specify default log routing here if you want:
+# log_name = swift
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_headers = false
+# log_address = /dev/log
+# The following caps the length of log lines to the value given; no limit if
+# set to 0, the default.
+# log_max_line_length = 0
+#
+# This optional suffix (default is empty) that would be appended to the swift transaction
+# id allows one to easily figure out from which cluster that X-Trans-Id belongs to.
+# This is very useful when one is managing more than one swift cluster.
+# trans_id_suffix =
+#
+# comma separated list of functions to call to setup custom log handlers.
+# functions get passed: conf, name, log_to_console, log_route, fmt, logger,
+# adapted_logger
+# log_custom_handlers =
+#
+# If set, log_udp_host will override log_address
+# log_udp_host =
+# log_udp_port = 514
+#
+# You can enable StatsD logging here:
+# log_statsd_host = localhost
+# log_statsd_port = 8125
+# log_statsd_default_sample_rate = 1.0
+# log_statsd_sample_rate_factor = 1.0
+# log_statsd_metric_prefix =
+#
+# Use a comma separated list of full url (http://foo.bar:1234,https://foo.bar)
+# cors_allow_origin =
+# strict_cors_mode = True
+#
+# client_timeout = 60
+# eventlet_debug = false
+
+[pipeline:main]
+#pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk tempurl ratelimit tempauth container-quotas account-quotas slo dlo proxy-logging proxy-server
+pipeline = authtoken cache healthcheck keystoneauth proxy-logging proxy-server
+
+[app:proxy-server]
+use = egg:swift#proxy
+# You can override the default log routing for this app here:
+# set log_name = proxy-server
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_address = /dev/log
+#
+# log_handoffs = true
+# recheck_account_existence = 60
+# recheck_container_existence = 60
+# object_chunk_size = 65536
+# client_chunk_size = 65536
+#
+# How long the proxy server will wait on responses from the a/c/o servers.
+# node_timeout = 10
+#
+# How long the proxy server will wait for an initial response and to read a
+# chunk of data from the object servers while serving GET / HEAD requests.
+# Timeouts from these requests can be recovered from so setting this to
+# something lower than node_timeout would provide quicker error recovery
+# while allowing for a longer timeout for non-recoverable requests (PUTs).
+# Defaults to node_timeout, should be overriden if node_timeout is set to a
+# high number to prevent client timeouts from firing before the proxy server
+# has a chance to retry.
+# recoverable_node_timeout = node_timeout
+#
+# conn_timeout = 0.5
+#
+# How long to wait for requests to finish after a quorum has been established.
+# post_quorum_timeout = 0.5
+#
+# How long without an error before a node's error count is reset. This will
+# also be how long before a node is reenabled after suppression is triggered.
+# error_suppression_interval = 60
+#
+# How many errors can accumulate before a node is temporarily ignored.
+# error_suppression_limit = 10
+#
+# If set to 'true' any authorized user may create and delete accounts; if
+# 'false' no one, even authorized, can.
+allow_account_management = true
+#
+# Set object_post_as_copy = false to turn on fast posts where only the metadata
+# changes are stored anew and the original data file is kept in place. This
+# makes for quicker posts; but since the container metadata isn't updated in
+# this mode, features like container sync won't be able to sync posts.
+# object_post_as_copy = true
+#
+# If set to 'true' authorized accounts that do not yet exist within the Swift
+# cluster will be automatically created.
+account_autocreate = true
+#
+# If set to a positive value, trying to create a container when the account
+# already has at least this maximum containers will result in a 403 Forbidden.
+# Note: This is a soft limit, meaning a user might exceed the cap for
+# recheck_account_existence before the 403s kick in.
+# max_containers_per_account = 0
+#
+# This is a comma separated list of account hashes that ignore the
+# max_containers_per_account cap.
+# max_containers_whitelist =
+#
+# Comma separated list of Host headers to which the proxy will deny requests.
+# deny_host_headers =
+#
+# Prefix used when automatically creating accounts.
+# auto_create_account_prefix = .
+#
+# Depth of the proxy put queue.
+# put_queue_depth = 10
+#
+# Storage nodes can be chosen at random (shuffle), by using timing
+# measurements (timing), or by using an explicit match (affinity).
+# Using timing measurements may allow for lower overall latency, while
+# using affinity allows for finer control. In both the timing and
+# affinity cases, equally-sorting nodes are still randomly chosen to
+# spread load.
+# The valid values for sorting_method are "affinity", "shuffle", and "timing".
+# sorting_method = shuffle
+#
+# If the "timing" sorting_method is used, the timings will only be valid for
+# the number of seconds configured by timing_expiry.
+# timing_expiry = 300
+#
+# The maximum time (seconds) that a large object connection is allowed to last.
+# max_large_object_get_time = 86400
+#
+# Set to the number of nodes to contact for a normal request. You can use
+# '* replicas' at the end to have it use the number given times the number of
+# replicas for the ring being used for the request.
+# request_node_count = 2 * replicas
+#
+# Which backend servers to prefer on reads. Format is r<N> for region
+# N or r<N>z<M> for region N, zone M. The value after the equals is
+# the priority; lower numbers are higher priority.
+#
+# Example: first read from region 1 zone 1, then region 1 zone 2, then
+# anything in region 2, then everything else:
+# read_affinity = r1z1=100, r1z2=200, r2=300
+# Default is empty, meaning no preference.
+# read_affinity =
+#
+# Which backend servers to prefer on writes. Format is r<N> for region
+# N or r<N>z<M> for region N, zone M. If this is set, then when
+# handling an object PUT request, some number (see setting
+# write_affinity_node_count) of local backend servers will be tried
+# before any nonlocal ones.
+#
+# Example: try to write to regions 1 and 2 before writing to any other
+# nodes:
+# write_affinity = r1, r2
+# Default is empty, meaning no preference.
+# write_affinity =
+#
+# The number of local (as governed by the write_affinity setting)
+# nodes to attempt to contact first, before any non-local ones. You
+# can use '* replicas' at the end to have it use the number given
+# times the number of replicas for the ring being used for the
+# request.
+# write_affinity_node_count = 2 * replicas
+#
+# These are the headers whose values will only be shown to swift_owners. The
+# exact definition of a swift_owner is up to the auth system in use, but
+# usually indicates administrative responsibilities.
+# swift_owner_headers = x-container-read, x-container-write, x-container-sync-key, x-container-sync-to, x-account-meta-temp-url-key, x-account-meta-temp-url-key-2, x-account-access-control
+
+[filter:tempauth]
+use = egg:swift#tempauth
+# You can override the default log routing for this filter here:
+# set log_name = tempauth
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = false
+# set log_address = /dev/log
+#
+# The reseller prefix will verify a token begins with this prefix before even
+# attempting to validate it. Also, with authorization, only Swift storage
+# accounts with this prefix will be authorized by this middleware. Useful if
+# multiple auth systems are in use for one Swift cluster.
+# reseller_prefix = AUTH
+#
+# The auth prefix will cause requests beginning with this prefix to be routed
+# to the auth subsystem, for granting tokens, etc.
+# auth_prefix = /auth/
+# token_life = 86400
+#
+# This allows middleware higher in the WSGI pipeline to override auth
+# processing, useful for middleware such as tempurl and formpost. If you know
+# you're not going to use such middleware and you want a bit of extra security,
+# you can set this to false.
+# allow_overrides = true
+#
+# This specifies what scheme to return with storage urls:
+# http, https, or default (chooses based on what the server is running as)
+# This can be useful with an SSL load balancer in front of a non-SSL server.
+# storage_url_scheme = default
+#
+# Lastly, you need to list all the accounts/users you want here. The format is:
+# user_<account>_<user> = <key> [group] [group] [...] [storage_url]
+# or if you want underscores in <account> or <user>, you can base64 encode them
+# (with no equal signs) and use this format:
+# user64_<account_b64>_<user_b64> = <key> [group] [group] [...] [storage_url]
+# There are special groups of:
+# .reseller_admin = can do anything to any account for this auth
+# .admin = can do anything within the account
+# If neither of these groups are specified, the user can only access containers
+# that have been explicitly allowed for them by a .admin or .reseller_admin.
+# The trailing optional storage_url allows you to specify an alternate url to
+# hand back to the user upon authentication. If not specified, this defaults to
+# $HOST/v1/<reseller_prefix>_<account> where $HOST will do its best to resolve
+# to what the requester would need to use to reach this host.
+# Here are example entries, required for running the tests:
+user_admin_admin = admin .admin .reseller_admin
+user_test_tester = testing .admin
+user_test2_tester2 = testing2 .admin
+user_test_tester3 = testing3
+
+# To enable Keystone authentication you need to have the auth token
+# middleware first to be configured. Here is an example below, please
+# refer to the keystone's documentation for details about the
+# different settings.
+#
+# You'll need to have as well the keystoneauth middleware enabled
+# and have it in your main pipeline so instead of having tempauth in
+# there you can change it to: authtoken keystoneauth
+#
+[filter:authtoken]
+paste.filter_factory = keystonemiddleware.auth_token:filter_factory
+# auth_host = keystonehost
+# auth_port = 35357
+# auth_protocol = http
+# auth_uri = http://keystonehost:5000/
+#auth_uri = http://controller:5000/v2.0
+auth_uri = http://127.0.0.1:5000/v2.0
+identity_uri = http://127.0.0.1:35357
+admin_tenant_name = service
+admin_user = swift
+admin_password = {{ SWIFT_ADMIN_PASSWORD }}
+delay_auth_decision = 1
+# cache = swift.cache
+# include_service_catalog = False
+#
+[filter:keystoneauth]
+use = egg:swift#keystoneauth
+# Operator roles is the role which user would be allowed to manage a
+# tenant and be able to create container or give ACL to others.
+# operator_roles = admin, swiftoperator
+operator_roles = admin, _member_
+# The reseller admin role has the ability to create and delete accounts
+# reseller_admin_role = ResellerAdmin
+# For backwards compatibility, keystoneauth will match names in cross-tenant
+# access control lists (ACLs) when both the requesting user and the tenant
+# are in the default domain i.e the domain to which existing tenants are
+# migrated. The default_domain_id value configured here should be the same as
+# the value used during migration of tenants to keystone domains.
+# default_domain_id = default
+# For a new installation, or an installation in which keystone projects may
+# move between domains, you should disable backwards compatible name matching
+# in ACLs by setting allow_names_in_acls to false:
+# allow_names_in_acls = true
+
+[filter:healthcheck]
+use = egg:swift#healthcheck
+# An optional filesystem path, which if present, will cause the healthcheck
+# URL to return "503 Service Unavailable" with a body of "DISABLED BY FILE".
+# This facility may be used to temporarily remove a Swift node from a load
+# balancer pool during maintenance or upgrade (remove the file to allow the
+# node back into the load balancer pool).
+# disable_path =
+
+[filter:cache]
+use = egg:swift#memcache
+# You can override the default log routing for this filter here:
+# set log_name = cache
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = false
+# set log_address = /dev/log
+#
+# If not set here, the value for memcache_servers will be read from
+# memcache.conf (see memcache.conf-sample) or lacking that file, it will
+# default to the value below. You can specify multiple servers separated with
+# commas, as in: 10.1.2.3:11211,10.1.2.4:11211
+memcache_servers = 127.0.0.1:11211
+#
+# Sets how memcache values are serialized and deserialized:
+# 0 = older, insecure pickle serialization
+# 1 = json serialization but pickles can still be read (still insecure)
+# 2 = json serialization only (secure and the default)
+# If not set here, the value for memcache_serialization_support will be read
+# from /etc/swift/memcache.conf (see memcache.conf-sample).
+# To avoid an instant full cache flush, existing installations should
+# upgrade with 0, then set to 1 and reload, then after some time (24 hours)
+# set to 2 and reload.
+# In the future, the ability to use pickle serialization will be removed.
+# memcache_serialization_support = 2
+#
+# Sets the maximum number of connections to each memcached server per worker
+# memcache_max_connections = 2
+
+[filter:ratelimit]
+use = egg:swift#ratelimit
+# You can override the default log routing for this filter here:
+# set log_name = ratelimit
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = false
+# set log_address = /dev/log
+#
+# clock_accuracy should represent how accurate the proxy servers' system clocks
+# are with each other. 1000 means that all the proxies' clock are accurate to
+# each other within 1 millisecond. No ratelimit should be higher than the
+# clock accuracy.
+# clock_accuracy = 1000
+#
+# max_sleep_time_seconds = 60
+#
+# log_sleep_time_seconds of 0 means disabled
+# log_sleep_time_seconds = 0
+#
+# allows for slow rates (e.g. running up to 5 sec's behind) to catch up.
+# rate_buffer_seconds = 5
+#
+# account_ratelimit of 0 means disabled
+# account_ratelimit = 0
+
+# these are comma separated lists of account names
+# account_whitelist = a,b
+# account_blacklist = c,d
+
+# with container_limit_x = r
+# for containers of size x limit write requests per second to r. The container
+# rate will be linearly interpolated from the values given. With the values
+# below, a container of size 5 will get a rate of 75.
+# container_ratelimit_0 = 100
+# container_ratelimit_10 = 50
+# container_ratelimit_50 = 20
+
+# Similarly to the above container-level write limits, the following will limit
+# container GET (listing) requests.
+# container_listing_ratelimit_0 = 100
+# container_listing_ratelimit_10 = 50
+# container_listing_ratelimit_50 = 20
+
+[filter:domain_remap]
+use = egg:swift#domain_remap
+# You can override the default log routing for this filter here:
+# set log_name = domain_remap
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = false
+# set log_address = /dev/log
+#
+# storage_domain = example.com
+# path_root = v1
+# reseller_prefixes = AUTH
+
+[filter:catch_errors]
+use = egg:swift#catch_errors
+# You can override the default log routing for this filter here:
+# set log_name = catch_errors
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = false
+# set log_address = /dev/log
+
+[filter:cname_lookup]
+# Note: this middleware requires python-dnspython
+use = egg:swift#cname_lookup
+# You can override the default log routing for this filter here:
+# set log_name = cname_lookup
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = false
+# set log_address = /dev/log
+#
+# Specify the storage_domain that match your cloud, multiple domains
+# can be specified separated by a comma
+# storage_domain = example.com
+#
+# lookup_depth = 1
+
+# Note: Put staticweb just after your auth filter(s) in the pipeline
+[filter:staticweb]
+use = egg:swift#staticweb
+
+# Note: Put tempurl before dlo, slo and your auth filter(s) in the pipeline
+[filter:tempurl]
+use = egg:swift#tempurl
+# The methods allowed with Temp URLs.
+# methods = GET HEAD PUT POST DELETE
+#
+# The headers to remove from incoming requests. Simply a whitespace delimited
+# list of header names and names can optionally end with '*' to indicate a
+# prefix match. incoming_allow_headers is a list of exceptions to these
+# removals.
+# incoming_remove_headers = x-timestamp
+#
+# The headers allowed as exceptions to incoming_remove_headers. Simply a
+# whitespace delimited list of header names and names can optionally end with
+# '*' to indicate a prefix match.
+# incoming_allow_headers =
+#
+# The headers to remove from outgoing responses. Simply a whitespace delimited
+# list of header names and names can optionally end with '*' to indicate a
+# prefix match. outgoing_allow_headers is a list of exceptions to these
+# removals.
+# outgoing_remove_headers = x-object-meta-*
+#
+# The headers allowed as exceptions to outgoing_remove_headers. Simply a
+# whitespace delimited list of header names and names can optionally end with
+# '*' to indicate a prefix match.
+# outgoing_allow_headers = x-object-meta-public-*
+
+# Note: Put formpost just before your auth filter(s) in the pipeline
+[filter:formpost]
+use = egg:swift#formpost
+
+# Note: Just needs to be placed before the proxy-server in the pipeline.
+[filter:name_check]
+use = egg:swift#name_check
+# forbidden_chars = '"`<>
+# maximum_length = 255
+# forbidden_regexp = /\./|/\.\./|/\.$|/\.\.$
+
+[filter:list-endpoints]
+use = egg:swift#list_endpoints
+# list_endpoints_path = /endpoints/
+
+[filter:proxy-logging]
+use = egg:swift#proxy_logging
+# If not set, logging directives from [DEFAULT] without "access_" will be used
+# access_log_name = swift
+# access_log_facility = LOG_LOCAL0
+# access_log_level = INFO
+# access_log_address = /dev/log
+#
+# If set, access_log_udp_host will override access_log_address
+# access_log_udp_host =
+# access_log_udp_port = 514
+#
+# You can use log_statsd_* from [DEFAULT] or override them here:
+# access_log_statsd_host = localhost
+# access_log_statsd_port = 8125
+# access_log_statsd_default_sample_rate = 1.0
+# access_log_statsd_sample_rate_factor = 1.0
+# access_log_statsd_metric_prefix =
+# access_log_headers = false
+#
+# If access_log_headers is True and access_log_headers_only is set only
+# these headers are logged. Multiple headers can be defined as comma separated
+# list like this: access_log_headers_only = Host, X-Object-Meta-Mtime
+# access_log_headers_only =
+#
+# By default, the X-Auth-Token is logged. To obscure the value,
+# set reveal_sensitive_prefix to the number of characters to log.
+# For example, if set to 12, only the first 12 characters of the
+# token appear in the log. An unauthorized access of the log file
+# won't allow unauthorized usage of the token. However, the first
+# 12 or so characters is unique enough that you can trace/debug
+# token usage. Set to 0 to suppress the token completely (replaced
+# by '...' in the log).
+# Note: reveal_sensitive_prefix will not affect the value
+# logged with access_log_headers=True.
+# reveal_sensitive_prefix = 16
+#
+# What HTTP methods are allowed for StatsD logging (comma-sep); request methods
+# not in this list will have "BAD_METHOD" for the <verb> portion of the metric.
+# log_statsd_valid_http_methods = GET,HEAD,POST,PUT,DELETE,COPY,OPTIONS
+#
+# Note: The double proxy-logging in the pipeline is not a mistake. The
+# left-most proxy-logging is there to log requests that were handled in
+# middleware and never made it through to the right-most middleware (and
+# proxy server). Double logging is prevented for normal requests. See
+# proxy-logging docs.
+
+# Note: Put before both ratelimit and auth in the pipeline.
+[filter:bulk]
+use = egg:swift#bulk
+# max_containers_per_extraction = 10000
+# max_failed_extractions = 1000
+# max_deletes_per_request = 10000
+# max_failed_deletes = 1000
+
+# In order to keep a connection active during a potentially long bulk request,
+# Swift may return whitespace prepended to the actual response body. This
+# whitespace will be yielded no more than every yield_frequency seconds.
+# yield_frequency = 10
+
+# Note: The following parameter is used during a bulk delete of objects and
+# their container. This would frequently fail because it is very likely
+# that all replicated objects have not been deleted by the time the middleware got a
+# successful response. It can be configured the number of retries. And the
+# number of seconds to wait between each retry will be 1.5**retry
+
+# delete_container_retry_count = 0
+
+# Note: Put after auth in the pipeline.
+[filter:container-quotas]
+use = egg:swift#container_quotas
+
+# Note: Put after auth and staticweb in the pipeline.
+[filter:slo]
+use = egg:swift#slo
+# max_manifest_segments = 1000
+# max_manifest_size = 2097152
+# min_segment_size = 1048576
+# Start rate-limiting SLO segment serving after the Nth segment of a
+# segmented object.
+# rate_limit_after_segment = 10
+#
+# Once segment rate-limiting kicks in for an object, limit segments served
+# to N per second. 0 means no rate-limiting.
+# rate_limit_segments_per_sec = 0
+#
+# Time limit on GET requests (seconds)
+# max_get_time = 86400
+
+# Note: Put after auth and staticweb in the pipeline.
+# If you don't put it in the pipeline, it will be inserted for you.
+[filter:dlo]
+use = egg:swift#dlo
+# Start rate-limiting DLO segment serving after the Nth segment of a
+# segmented object.
+# rate_limit_after_segment = 10
+#
+# Once segment rate-limiting kicks in for an object, limit segments served
+# to N per second. 0 means no rate-limiting.
+# rate_limit_segments_per_sec = 1
+#
+# Time limit on GET requests (seconds)
+# max_get_time = 86400
+
+[filter:account-quotas]
+use = egg:swift#account_quotas
+
+[filter:gatekeeper]
+use = egg:swift#gatekeeper
+# You can override the default log routing for this filter here:
+# set log_name = gatekeeper
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = false
+# set log_address = /dev/log
+
+[filter:container_sync]
+use = egg:swift#container_sync
+# Set this to false if you want to disallow any full url values to be set for
+# any new X-Container-Sync-To headers. This will keep any new full urls from
+# coming in, but won't change any existing values already in the cluster.
+# Updating those will have to be done manually, as knowing what the true realm
+# endpoint should be cannot always be guessed.
+# allow_full_urls = true
+# Set this to specify this clusters //realm/cluster as "current" in /info
+# current = //REALM/CLUSTER
+
+# Note: Put it at the beginning of the pipleline to profile all middleware. But
+# it is safer to put this after catch_errors, gatekeeper and healthcheck.
+[filter:xprofile]
+use = egg:swift#xprofile
+# This option enable you to switch profilers which should inherit from python
+# standard profiler. Currently the supported value can be 'cProfile',
+# 'eventlet.green.profile' etc.
+# profile_module = eventlet.green.profile
+#
+# This prefix will be used to combine process ID and timestamp to name the
+# profile data file. Make sure the executing user has permission to write
+# into this path (missing path segments will be created, if necessary).
+# If you enable profiling in more than one type of daemon, you must override
+# it with an unique value like: /var/log/swift/profile/proxy.profile
+# log_filename_prefix = /tmp/log/swift/profile/default.profile
+#
+# the profile data will be dumped to local disk based on above naming rule
+# in this interval.
+# dump_interval = 5.0
+#
+# Be careful, this option will enable profiler to dump data into the file with
+# time stamp which means there will be lots of files piled up in the directory.
+# dump_timestamp = false
+#
+# This is the path of the URL to access the mini web UI.
+# path = /__profile__
+#
+# Clear the data when the wsgi server shutdown.
+# flush_at_shutdown = false
+#
+# unwind the iterator of applications
+# unwind = false
diff --git a/install-files/swift/etc/ntp.conf b/install-files/swift/etc/ntp.conf
new file mode 100644
index 00000000..54522871
--- /dev/null
+++ b/install-files/swift/etc/ntp.conf
@@ -0,0 +1,25 @@
+{% if SWIFT_CONTROLLER is undefined or SWIFT_CONTROLLER == "False" %}
+server {{ CONTROLLER_HOST_ADDRESS }} iburst
+{% else %}
+# We use iburst here to reduce the potential initial delay to set the clock
+server 0.pool.ntp.org iburst
+server 1.pool.ntp.org iburst
+server 2.pool.ntp.org iburst
+server 3.pool.ntp.org iburst
+
+# kod - notify client when packets are denied service,
+# rather than just dropping the packets
+#
+# nomodify - deny queries which attempt to modify the state of the server
+#
+# notrap - decline to provide mode 6 control message trap service to
+# matching hosts
+#
+# see ntp.conf(5) for more details
+restrict -4 default kod notrap nomodify
+restrict -6 default kod notrap nomodify
+{% endif %}
+
+# The default rlimit isn't enough in some cases
+# so we set a higher limit here
+rlimit memlock 256
diff --git a/install-files/swift/manifest b/install-files/swift/manifest
new file mode 100644
index 00000000..7fd76206
--- /dev/null
+++ b/install-files/swift/manifest
@@ -0,0 +1,15 @@
+0040755 0 0 /usr/share
+0040755 0 0 /usr/share/swift
+0100644 0 0 /usr/share/swift/hosts
+0100644 0 0 /usr/share/swift/swift-storage.yml
+0040755 0 0 /usr/share/swift/etc
+0040755 0 0 /usr/share/swift/etc/swift
+0100644 0 0 /usr/share/swift/etc/swift/account-server.j2
+0100644 0 0 /usr/share/swift/etc/swift/swift.j2
+0100644 0 0 /usr/share/swift/etc/swift/object-server.j2
+0100644 0 0 /usr/share/swift/etc/swift/container-server.j2
+0100644 0 0 /usr/share/swift/etc/rsyncd.j2
+0100644 0 0 /usr/lib/systemd/system/swift-storage-setup.service
+0100644 0 0 /usr/lib/systemd/system/swift-storage.service
+template overwrite 0100644 0 0 /etc/ntp.conf
+overwrite 0100644 0 0 /usr/lib/systemd/system/rsync.service
diff --git a/install-files/swift/usr/lib/systemd/system/rsync.service b/install-files/swift/usr/lib/systemd/system/rsync.service
new file mode 100644
index 00000000..babcfb46
--- /dev/null
+++ b/install-files/swift/usr/lib/systemd/system/rsync.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=fast remote file copy program daemon
+After=swift-storage-setup.service
+ConditionPathExists=/etc/rsyncd.conf
+
+[Service]
+ExecStart=/usr/bin/rsync --daemon --no-detach
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/swift/usr/lib/systemd/system/swift-storage-setup.service b/install-files/swift/usr/lib/systemd/system/swift-storage-setup.service
new file mode 100644
index 00000000..3df31163
--- /dev/null
+++ b/install-files/swift/usr/lib/systemd/system/swift-storage-setup.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Run openstack-swift-storage-setup (once)
+After=local-fs.target postgres-server-setup.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/ansible-playbook -v -i /usr/share/swift/hosts /usr/share/swift/swift-storage.yml
+Restart=no
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/swift/usr/lib/systemd/system/swift-storage.service b/install-files/swift/usr/lib/systemd/system/swift-storage.service
new file mode 100644
index 00000000..dc41d3bc
--- /dev/null
+++ b/install-files/swift/usr/lib/systemd/system/swift-storage.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=OpenStack Swift Storage
+After=syslog.target network.target swift-storage-setup.service
+
+[Service]
+Type=forking
+Restart=on-failure
+ExecStart=/usr/bin/swift-init all start
+ExecStop=/usr/bin/swift-init all stop
+
+[Install]
+WantedBy=multi-user.target
diff --git a/install-files/swift/usr/share/swift/etc/rsyncd.j2 b/install-files/swift/usr/share/swift/etc/rsyncd.j2
new file mode 100644
index 00000000..c0657665
--- /dev/null
+++ b/install-files/swift/usr/share/swift/etc/rsyncd.j2
@@ -0,0 +1,23 @@
+uid = swift
+gid = swift
+log file = /var/log/rsyncd.log
+pid file = /var/run/rsyncd.pid
+address = {{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+
+[account]
+max connections = 2
+path = /srv/node/
+read only = false
+lock file = /var/lock/account.lock
+
+[container]
+max connections = 2
+path = /srv/node/
+read only = false
+lock file = /var/lock/container.lock
+
+[object]
+max connections = 2
+path = /srv/node/
+read only = false
+lock file = /var/lock/object.lock
diff --git a/install-files/swift/usr/share/swift/etc/swift/account-server.j2 b/install-files/swift/usr/share/swift/etc/swift/account-server.j2
new file mode 100644
index 00000000..d977e295
--- /dev/null
+++ b/install-files/swift/usr/share/swift/etc/swift/account-server.j2
@@ -0,0 +1,192 @@
+[DEFAULT]
+# bind_ip = 0.0.0.0
+bind_ip = {{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+bind_port = 6002
+# bind_timeout = 30
+# backlog = 4096
+user = swift
+swift_dir = /etc/swift
+devices = /srv/node
+# mount_check = true
+# disable_fallocate = false
+#
+# Use an integer to override the number of pre-forked processes that will
+# accept connections.
+# workers = auto
+#
+# Maximum concurrent requests per worker
+# max_clients = 1024
+#
+# You can specify default log routing here if you want:
+# log_name = swift
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+# The following caps the length of log lines to the value given; no limit if
+# set to 0, the default.
+# log_max_line_length = 0
+#
+# comma separated list of functions to call to setup custom log handlers.
+# functions get passed: conf, name, log_to_console, log_route, fmt, logger,
+# adapted_logger
+# log_custom_handlers =
+#
+# If set, log_udp_host will override log_address
+# log_udp_host =
+# log_udp_port = 514
+#
+# You can enable StatsD logging here:
+# log_statsd_host = localhost
+# log_statsd_port = 8125
+# log_statsd_default_sample_rate = 1.0
+# log_statsd_sample_rate_factor = 1.0
+# log_statsd_metric_prefix =
+#
+# If you don't mind the extra disk space usage in overhead, you can turn this
+# on to preallocate disk space with SQLite databases to decrease fragmentation.
+# db_preallocation = off
+#
+# eventlet_debug = false
+#
+# You can set fallocate_reserve to the number of bytes you'd like fallocate to
+# reserve, whether there is space for the given file size or not.
+# fallocate_reserve = 0
+
+[pipeline:main]
+pipeline = healthcheck recon account-server
+
+[app:account-server]
+use = egg:swift#account
+# You can override the default log routing for this app here:
+# set log_name = account-server
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_requests = true
+# set log_address = /dev/log
+#
+# auto_create_account_prefix = .
+#
+# Configure parameter for creating specific server
+# To handle all verbs, including replication verbs, do not specify
+# "replication_server" (this is the default). To only handle replication,
+# set to a True value (e.g. "True" or "1"). To handle only non-replication
+# verbs, set to "False". Unless you have a separate replication network, you
+# should not specify any value for "replication_server".
+# replication_server = false
+
+[filter:healthcheck]
+use = egg:swift#healthcheck
+# An optional filesystem path, which if present, will cause the healthcheck
+# URL to return "503 Service Unavailable" with a body of "DISABLED BY FILE"
+# disable_path =
+
+[filter:recon]
+use = egg:swift#recon
+recon_cache_path = /var/cache/swift
+
+[account-replicator]
+# You can override the default log routing for this app here (don't use set!):
+# log_name = account-replicator
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+#
+# vm_test_mode = no
+# per_diff = 1000
+# max_diffs = 100
+# concurrency = 8
+# interval = 30
+#
+# How long without an error before a node's error count is reset. This will
+# also be how long before a node is reenabled after suppression is triggered.
+# error_suppression_interval = 60
+#
+# How many errors can accumulate before a node is temporarily ignored.
+# error_suppression_limit = 10
+#
+# node_timeout = 10
+# conn_timeout = 0.5
+#
+# The replicator also performs reclamation
+# reclaim_age = 604800
+#
+# Time in seconds to wait between replication passes
+# Note: if the parameter 'interval' is defined then it will be used in place
+# of run_pause.
+# run_pause = 30
+#
+# recon_cache_path = /var/cache/swift
+
+[account-auditor]
+# You can override the default log routing for this app here (don't use set!):
+# log_name = account-auditor
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+#
+# Will audit each account at most once per interval
+# interval = 1800
+#
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# accounts_per_second = 200
+# recon_cache_path = /var/cache/swift
+
+[account-reaper]
+# You can override the default log routing for this app here (don't use set!):
+# log_name = account-reaper
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+#
+# concurrency = 25
+# interval = 3600
+# node_timeout = 10
+# conn_timeout = 0.5
+#
+# Normally, the reaper begins deleting account information for deleted accounts
+# immediately; you can set this to delay its work however. The value is in
+# seconds; 2592000 = 30 days for example.
+# delay_reaping = 0
+#
+# If the account fails to be be reaped due to a persistent error, the
+# account reaper will log a message such as:
+# Account <name> has not been reaped since <date>
+# You can search logs for this message if space is not being reclaimed
+# after you delete account(s).
+# Default is 2592000 seconds (30 days). This is in addition to any time
+# requested by delay_reaping.
+# reap_warn_after = 2592000
+
+# Note: Put it at the beginning of the pipeline to profile all middleware. But
+# it is safer to put this after healthcheck.
+[filter:xprofile]
+use = egg:swift#xprofile
+# This option enable you to switch profilers which should inherit from python
+# standard profiler. Currently the supported value can be 'cProfile',
+# 'eventlet.green.profile' etc.
+# profile_module = eventlet.green.profile
+#
+# This prefix will be used to combine process ID and timestamp to name the
+# profile data file. Make sure the executing user has permission to write
+# into this path (missing path segments will be created, if necessary).
+# If you enable profiling in more than one type of daemon, you must override
+# it with an unique value like: /var/log/swift/profile/account.profile
+# log_filename_prefix = /tmp/log/swift/profile/default.profile
+#
+# the profile data will be dumped to local disk based on above naming rule
+# in this interval.
+# dump_interval = 5.0
+#
+# Be careful, this option will enable profiler to dump data into the file with
+# time stamp which means there will be lots of files piled up in the directory.
+# dump_timestamp = false
+#
+# This is the path of the URL to access the mini web UI.
+# path = /__profile__
+#
+# Clear the data when the wsgi server shutdown.
+# flush_at_shutdown = false
+#
+# unwind the iterator of applications
+# unwind = false
diff --git a/install-files/swift/usr/share/swift/etc/swift/container-server.j2 b/install-files/swift/usr/share/swift/etc/swift/container-server.j2
new file mode 100644
index 00000000..3c63b7d0
--- /dev/null
+++ b/install-files/swift/usr/share/swift/etc/swift/container-server.j2
@@ -0,0 +1,211 @@
+[DEFAULT]
+# bind_ip = 0.0.0.0
+bind_ip = {{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+bind_port = 6001
+# bind_timeout = 30
+# backlog = 4096
+user = swift
+swift_dir = /etc/swift
+devices = /srv/node
+# mount_check = true
+# disable_fallocate = false
+#
+# Use an integer to override the number of pre-forked processes that will
+# accept connections.
+# workers = auto
+#
+# Maximum concurrent requests per worker
+# max_clients = 1024
+#
+# This is a comma separated list of hosts allowed in the X-Container-Sync-To
+# field for containers. This is the old-style of using container sync. It is
+# strongly recommended to use the new style of a separate
+# container-sync-realms.conf -- see container-sync-realms.conf-sample
+# allowed_sync_hosts = 127.0.0.1
+#
+# You can specify default log routing here if you want:
+# log_name = swift
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+# The following caps the length of log lines to the value given; no limit if
+# set to 0, the default.
+# log_max_line_length = 0
+#
+# comma separated list of functions to call to setup custom log handlers.
+# functions get passed: conf, name, log_to_console, log_route, fmt, logger,
+# adapted_logger
+# log_custom_handlers =
+#
+# If set, log_udp_host will override log_address
+# log_udp_host =
+# log_udp_port = 514
+#
+# You can enable StatsD logging here:
+# log_statsd_host = localhost
+# log_statsd_port = 8125
+# log_statsd_default_sample_rate = 1.0
+# log_statsd_sample_rate_factor = 1.0
+# log_statsd_metric_prefix =
+#
+# If you don't mind the extra disk space usage in overhead, you can turn this
+# on to preallocate disk space with SQLite databases to decrease fragmentation.
+# db_preallocation = off
+#
+# eventlet_debug = false
+#
+# You can set fallocate_reserve to the number of bytes you'd like fallocate to
+# reserve, whether there is space for the given file size or not.
+# fallocate_reserve = 0
+
+[pipeline:main]
+pipeline = healthcheck recon container-server
+
+[app:container-server]
+use = egg:swift#container
+# You can override the default log routing for this app here:
+# set log_name = container-server
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_requests = true
+# set log_address = /dev/log
+#
+# node_timeout = 3
+# conn_timeout = 0.5
+# allow_versions = false
+# auto_create_account_prefix = .
+#
+# Configure parameter for creating specific server
+# To handle all verbs, including replication verbs, do not specify
+# "replication_server" (this is the default). To only handle replication,
+# set to a True value (e.g. "True" or "1"). To handle only non-replication
+# verbs, set to "False". Unless you have a separate replication network, you
+# should not specify any value for "replication_server".
+# replication_server = false
+
+[filter:healthcheck]
+use = egg:swift#healthcheck
+# An optional filesystem path, which if present, will cause the healthcheck
+# URL to return "503 Service Unavailable" with a body of "DISABLED BY FILE"
+# disable_path =
+
+[filter:recon]
+use = egg:swift#recon
+recon_cache_path = /var/cache/swift
+
+[container-replicator]
+# You can override the default log routing for this app here (don't use set!):
+# log_name = container-replicator
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+#
+# vm_test_mode = no
+# per_diff = 1000
+# max_diffs = 100
+# concurrency = 8
+# interval = 30
+# node_timeout = 10
+# conn_timeout = 0.5
+#
+# The replicator also performs reclamation
+# reclaim_age = 604800
+#
+# Time in seconds to wait between replication passes
+# Note: if the parameter 'interval' is defined then it will be used in place
+# of run_pause.
+# run_pause = 30
+#
+# recon_cache_path = /var/cache/swift
+
+[container-updater]
+# You can override the default log routing for this app here (don't use set!):
+# log_name = container-updater
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+#
+# interval = 300
+# concurrency = 4
+# node_timeout = 3
+# conn_timeout = 0.5
+#
+# slowdown will sleep that amount between containers
+# slowdown = 0.01
+#
+# Seconds to suppress updating an account that has generated an error
+# account_suppression_time = 60
+#
+# recon_cache_path = /var/cache/swift
+
+[container-auditor]
+# You can override the default log routing for this app here (don't use set!):
+# log_name = container-auditor
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+#
+# Will audit each container at most once per interval
+# interval = 1800
+#
+# containers_per_second = 200
+# recon_cache_path = /var/cache/swift
+
+[container-sync]
+# You can override the default log routing for this app here (don't use set!):
+# log_name = container-sync
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+#
+# If you need to use an HTTP Proxy, set it here; defaults to no proxy.
+# You can also set this to a comma separated list of HTTP Proxies and they will
+# be randomly used (simple load balancing).
+# sync_proxy = http://10.1.1.1:8888,http://10.1.1.2:8888
+#
+# Will sync each container at most once per interval
+# interval = 300
+#
+# Maximum amount of time to spend syncing each container per pass
+# container_time = 60
+#
+# Maximum amount of time in seconds for the connection attempt
+# conn_timeout = 5
+# Server errors from requests will be retried by default
+# request_tries = 3
+#
+# Internal client config file path
+# internal_client_conf_path = /etc/swift/internal-client.conf
+
+# Note: Put it at the beginning of the pipeline to profile all middleware. But
+# it is safer to put this after healthcheck.
+[filter:xprofile]
+use = egg:swift#xprofile
+# This option enable you to switch profilers which should inherit from python
+# standard profiler. Currently the supported value can be 'cProfile',
+# 'eventlet.green.profile' etc.
+# profile_module = eventlet.green.profile
+#
+# This prefix will be used to combine process ID and timestamp to name the
+# profile data file. Make sure the executing user has permission to write
+# into this path (missing path segments will be created, if necessary).
+# If you enable profiling in more than one type of daemon, you must override
+# it with an unique value like: /var/log/swift/profile/container.profile
+# log_filename_prefix = /tmp/log/swift/profile/default.profile
+#
+# the profile data will be dumped to local disk based on above naming rule
+# in this interval.
+# dump_interval = 5.0
+#
+# Be careful, this option will enable profiler to dump data into the file with
+# time stamp which means there will be lots of files piled up in the directory.
+# dump_timestamp = false
+#
+# This is the path of the URL to access the mini web UI.
+# path = /__profile__
+#
+# Clear the data when the wsgi server shutdown.
+# flush_at_shutdown = false
+#
+# unwind the iterator of applications
+# unwind = false
diff --git a/install-files/swift/usr/share/swift/etc/swift/object-server.j2 b/install-files/swift/usr/share/swift/etc/swift/object-server.j2
new file mode 100644
index 00000000..19d72f6c
--- /dev/null
+++ b/install-files/swift/usr/share/swift/etc/swift/object-server.j2
@@ -0,0 +1,306 @@
+[DEFAULT]
+# bind_ip = 0.0.0.0
+bind_ip = {{ MANAGEMENT_INTERFACE_IP_ADDRESS }}
+bind_port = 6000
+# bind_timeout = 30
+# backlog = 4096
+user = swift
+swift_dir = /etc/swift
+devices = /srv/node
+# mount_check = true
+# disable_fallocate = false
+# expiring_objects_container_divisor = 86400
+# expiring_objects_account_name = expiring_objects
+#
+# Use an integer to override the number of pre-forked processes that will
+# accept connections.
+# workers = auto
+#
+# Maximum concurrent requests per worker
+# max_clients = 1024
+#
+# You can specify default log routing here if you want:
+# log_name = swift
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+# The following caps the length of log lines to the value given; no limit if
+# set to 0, the default.
+# log_max_line_length = 0
+#
+# comma separated list of functions to call to setup custom log handlers.
+# functions get passed: conf, name, log_to_console, log_route, fmt, logger,
+# adapted_logger
+# log_custom_handlers =
+#
+# If set, log_udp_host will override log_address
+# log_udp_host =
+# log_udp_port = 514
+#
+# You can enable StatsD logging here:
+# log_statsd_host = localhost
+# log_statsd_port = 8125
+# log_statsd_default_sample_rate = 1.0
+# log_statsd_sample_rate_factor = 1.0
+# log_statsd_metric_prefix =
+#
+# eventlet_debug = false
+#
+# You can set fallocate_reserve to the number of bytes you'd like fallocate to
+# reserve, whether there is space for the given file size or not.
+# fallocate_reserve = 0
+#
+# Time to wait while attempting to connect to another backend node.
+# conn_timeout = 0.5
+# Time to wait while sending each chunk of data to another backend node.
+# node_timeout = 3
+# Time to wait while receiving each chunk of data from a client or another
+# backend node.
+# client_timeout = 60
+#
+# network_chunk_size = 65536
+# disk_chunk_size = 65536
+
+[pipeline:main]
+pipeline = healthcheck recon object-server
+
+[app:object-server]
+use = egg:swift#object
+# You can override the default log routing for this app here:
+# set log_name = object-server
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_requests = true
+# set log_address = /dev/log
+#
+# max_upload_time = 86400
+# slow = 0
+#
+# Objects smaller than this are not evicted from the buffercache once read
+# keep_cache_size = 5242880
+#
+# If true, objects for authenticated GET requests may be kept in buffer cache
+# if small enough
+# keep_cache_private = false
+#
+# on PUTs, sync data every n MB
+# mb_per_sync = 512
+#
+# Comma separated list of headers that can be set in metadata on an object.
+# This list is in addition to X-Object-Meta-* headers and cannot include
+# Content-Type, etag, Content-Length, or deleted
+# allowed_headers = Content-Disposition, Content-Encoding, X-Delete-At, X-Object-Manifest, X-Static-Large-Object
+#
+# auto_create_account_prefix = .
+#
+# A value of 0 means "don't use thread pools". A reasonable starting point is
+# 4.
+# threads_per_disk = 0
+#
+# Configure parameter for creating specific server
+# To handle all verbs, including replication verbs, do not specify
+# "replication_server" (this is the default). To only handle replication,
+# set to a True value (e.g. "True" or "1"). To handle only non-replication
+# verbs, set to "False". Unless you have a separate replication network, you
+# should not specify any value for "replication_server".
+# replication_server = false
+#
+# Set to restrict the number of concurrent incoming REPLICATION requests
+# Set to 0 for unlimited
+# Note that REPLICATION is currently an ssync only item
+# replication_concurrency = 4
+#
+# Restricts incoming REPLICATION requests to one per device,
+# replication_currency above allowing. This can help control I/O to each
+# device, but you may wish to set this to False to allow multiple REPLICATION
+# requests (up to the above replication_concurrency setting) per device.
+# replication_one_per_device = True
+#
+# Number of seconds to wait for an existing replication device lock before
+# giving up.
+# replication_lock_timeout = 15
+#
+# These next two settings control when the REPLICATION subrequest handler will
+# abort an incoming REPLICATION attempt. An abort will occur if there are at
+# least threshold number of failures and the value of failures / successes
+# exceeds the ratio. The defaults of 100 and 1.0 means that at least 100
+# failures have to occur and there have to be more failures than successes for
+# an abort to occur.
+# replication_failure_threshold = 100
+# replication_failure_ratio = 1.0
+#
+# Use splice() for zero-copy object GETs. This requires Linux kernel
+# version 3.0 or greater. If you set "splice = yes" but the kernel
+# does not support it, error messages will appear in the object server
+# logs at startup, but your object servers should continue to function.
+#
+# splice = no
+
+[filter:healthcheck]
+use = egg:swift#healthcheck
+# An optional filesystem path, which if present, will cause the healthcheck
+# URL to return "503 Service Unavailable" with a body of "DISABLED BY FILE"
+# disable_path =
+
+[filter:recon]
+use = egg:swift#recon
+recon_cache_path = /var/cache/swift
+#recon_lock_path = /var/lock
+
+[object-replicator]
+# You can override the default log routing for this app here (don't use set!):
+# log_name = object-replicator
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+#
+# vm_test_mode = no
+# daemonize = on
+# run_pause = 30
+# concurrency = 1
+# stats_interval = 300
+#
+# The sync method to use; default is rsync but you can use ssync to try the
+# EXPERIMENTAL all-swift-code-no-rsync-callouts method. Once ssync is verified
+# as having performance comparable to, or better than, rsync, we plan to
+# deprecate rsync so we can move on with more features for replication.
+# sync_method = rsync
+#
+# max duration of a partition rsync
+# rsync_timeout = 900
+#
+# bandwidth limit for rsync in kB/s. 0 means unlimited
+# rsync_bwlimit = 0
+#
+# passed to rsync for io op timeout
+# rsync_io_timeout = 30
+#
+# node_timeout = <whatever's in the DEFAULT section or 10>
+# max duration of an http request; this is for REPLICATE finalization calls and
+# so should be longer than node_timeout
+# http_timeout = 60
+#
+# attempts to kill all workers if nothing replicates for lockup_timeout seconds
+# lockup_timeout = 1800
+#
+# The replicator also performs reclamation
+# reclaim_age = 604800
+#
+# ring_check_interval = 15
+# recon_cache_path = /var/cache/swift
+#
+# limits how long rsync error log lines are
+# 0 means to log the entire line
+# rsync_error_log_line_length = 0
+#
+# handoffs_first and handoff_delete are options for a special case
+# such as disk full in the cluster. These two options SHOULD NOT BE
+# CHANGED, except for such an extreme situations. (e.g. disks filled up
+# or are about to fill up. Anyway, DO NOT let your drives fill up)
+# handoffs_first is the flag to replicate handoffs prior to canonical
+# partitions. It allows to force syncing and deleting handoffs quickly.
+# If set to a True value(e.g. "True" or "1"), partitions
+# that are not supposed to be on the node will be replicated first.
+# handoffs_first = False
+#
+# handoff_delete is the number of replicas which are ensured in swift.
+# If the number less than the number of replicas is set, object-replicator
+# could delete local handoffs even if all replicas are not ensured in the
+# cluster. Object-replicator would remove local handoff partition directories
+# after syncing partition when the number of successful responses is greater
+# than or equal to this number. By default(auto), handoff partitions will be
+# removed when it has successfully replicated to all the canonical nodes.
+# handoff_delete = auto
+
+[object-reconstructor]
+# You can override the default log routing for this app here (don't use set!):
+# Unless otherwise noted, each setting below has the same meaning as described
+# in the [object-replicator] section, however these settings apply to the EC
+# reconstructor
+#
+# log_name = object-reconstructor
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+#
+# daemonize = on
+# run_pause = 30
+# concurrency = 1
+# stats_interval = 300
+# node_timeout = 10
+# http_timeout = 60
+# lockup_timeout = 1800
+# reclaim_age = 604800
+# ring_check_interval = 15
+# recon_cache_path = /var/cache/swift
+# handoffs_first = False
+
+[object-updater]
+# You can override the default log routing for this app here (don't use set!):
+# log_name = object-updater
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+#
+# interval = 300
+# concurrency = 1
+# node_timeout = <whatever's in the DEFAULT section or 10>
+# slowdown will sleep that amount between objects
+# slowdown = 0.01
+#
+# recon_cache_path = /var/cache/swift
+
+[object-auditor]
+# You can override the default log routing for this app here (don't use set!):
+# log_name = object-auditor
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_address = /dev/log
+#
+# You can set the disk chunk size that the auditor uses making it larger if
+# you like for more efficient local auditing of larger objects
+# disk_chunk_size = 65536
+# files_per_second = 20
+# concurrency = 1
+# bytes_per_second = 10000000
+# log_time = 3600
+# zero_byte_files_per_second = 50
+# recon_cache_path = /var/cache/swift
+
+# Takes a comma separated list of ints. If set, the object auditor will
+# increment a counter for every object whose size is <= to the given break
+# points and report the result after a full scan.
+# object_size_stats =
+
+# Note: Put it at the beginning of the pipleline to profile all middleware. But
+# it is safer to put this after healthcheck.
+[filter:xprofile]
+use = egg:swift#xprofile
+# This option enable you to switch profilers which should inherit from python
+# standard profiler. Currently the supported value can be 'cProfile',
+# 'eventlet.green.profile' etc.
+# profile_module = eventlet.green.profile
+#
+# This prefix will be used to combine process ID and timestamp to name the
+# profile data file. Make sure the executing user has permission to write
+# into this path (missing path segments will be created, if necessary).
+# If you enable profiling in more than one type of daemon, you must override
+# it with an unique value like: /var/log/swift/profile/object.profile
+# log_filename_prefix = /tmp/log/swift/profile/default.profile
+#
+# the profile data will be dumped to local disk based on above naming rule
+# in this interval.
+# dump_interval = 5.0
+#
+# Be careful, this option will enable profiler to dump data into the file with
+# time stamp which means there will be lots of files piled up in the directory.
+# dump_timestamp = false
+#
+# This is the path of the URL to access the mini web UI.
+# path = /__profile__
+#
+# Clear the data when the wsgi server shutdown.
+# flush_at_shutdown = false
+#
+# unwind the iterator of applications
+# unwind = false
diff --git a/install-files/swift/usr/share/swift/etc/swift/swift.j2 b/install-files/swift/usr/share/swift/etc/swift/swift.j2
new file mode 100644
index 00000000..933e207e
--- /dev/null
+++ b/install-files/swift/usr/share/swift/etc/swift/swift.j2
@@ -0,0 +1,169 @@
+[swift-hash]
+
+# swift_hash_path_suffix and swift_hash_path_prefix are used as part of the
+# the hashing algorithm when determining data placement in the cluster.
+# These values should remain secret and MUST NOT change
+# once a cluster has been deployed.
+
+swift_hash_path_suffix = {{ SWIFT_HASH_PATH_SUFFIX }}
+swift_hash_path_prefix = {{ SWIFT_HASH_PATH_PREFIX }}
+
+# storage policies are defined here and determine various characteristics
+# about how objects are stored and treated. Policies are specified by name on
+# a per container basis. Names are case-insensitive. The policy index is
+# specified in the section header and is used internally. The policy with
+# index 0 is always used for legacy containers and can be given a name for use
+# in metadata however the ring file name will always be 'object.ring.gz' for
+# backwards compatibility. If no policies are defined a policy with index 0
+# will be automatically created for backwards compatibility and given the name
+# Policy-0. A default policy is used when creating new containers when no
+# policy is specified in the request. If no other policies are defined the
+# policy with index 0 will be declared the default. If multiple policies are
+# defined you must define a policy with index 0 and you must specify a
+# default. It is recommended you always define a section for
+# storage-policy:0.
+#
+# A 'policy_type' argument is also supported but is not mandatory. Default
+# policy type 'replication' is used when 'policy_type' is unspecified.
+[storage-policy:0]
+name = Policy-0
+default = yes
+#policy_type = replication
+
+# the following section would declare a policy called 'silver', the number of
+# replicas will be determined by how the ring is built. In this example the
+# 'silver' policy could have a lower or higher # of replicas than the
+# 'Policy-0' policy above. The ring filename will be 'object-1.ring.gz'. You
+# may only specify one storage policy section as the default. If you changed
+# this section to specify 'silver' as the default, when a client created a new
+# container w/o a policy specified, it will get the 'silver' policy because
+# this config has specified it as the default. However if a legacy container
+# (one created with a pre-policy version of swift) is accessed, it is known
+# implicitly to be assigned to the policy with index 0 as opposed to the
+# current default.
+#[storage-policy:1]
+#name = silver
+#policy_type = replication
+
+# The following declares a storage policy of type 'erasure_coding' which uses
+# Erasure Coding for data reliability. The 'erasure_coding' storage policy in
+# Swift is available as a "beta". Please refer to Swift documentation for
+# details on how the 'erasure_coding' storage policy is implemented.
+#
+# Swift uses PyECLib, a Python Erasure coding API library, for encode/decode
+# operations. Please refer to Swift documentation for details on how to
+# install PyECLib.
+#
+# When defining an EC policy, 'policy_type' needs to be 'erasure_coding' and
+# EC configuration parameters 'ec_type', 'ec_num_data_fragments' and
+# 'ec_num_parity_fragments' must be specified. 'ec_type' is chosen from the
+# list of EC backends supported by PyECLib. The ring configured for the
+# storage policy must have it's "replica" count configured to
+# 'ec_num_data_fragments' + 'ec_num_parity_fragments' - this requirement is
+# validated when services start. 'ec_object_segment_size' is the amount of
+# data that will be buffered up before feeding a segment into the
+# encoder/decoder. More information about these configuration options and
+# supported `ec_type` schemes is available in the Swift documentation. Please
+# refer to Swift documentation for details on how to configure EC policies.
+#
+# The example 'deepfreeze10-4' policy defined below is a _sample_
+# configuration with 10 'data' and 4 'parity' fragments. 'ec_type'
+# defines the Erasure Coding scheme. 'jerasure_rs_vand' (Reed-Solomon
+# Vandermonde) is used as an example below.
+#
+#[storage-policy:2]
+#name = deepfreeze10-4
+#policy_type = erasure_coding
+#ec_type = jerasure_rs_vand
+#ec_num_data_fragments = 10
+#ec_num_parity_fragments = 4
+#ec_object_segment_size = 1048576
+
+
+# The swift-constraints section sets the basic constraints on data
+# saved in the swift cluster. These constraints are automatically
+# published by the proxy server in responses to /info requests.
+
+[swift-constraints]
+
+# max_file_size is the largest "normal" object that can be saved in
+# the cluster. This is also the limit on the size of each segment of
+# a "large" object when using the large object manifest support.
+# This value is set in bytes. Setting it to lower than 1MiB will cause
+# some tests to fail. It is STRONGLY recommended to leave this value at
+# the default (5 * 2**30 + 2).
+
+#max_file_size = 5368709122
+
+
+# max_meta_name_length is the max number of bytes in the utf8 encoding
+# of the name portion of a metadata header.
+
+#max_meta_name_length = 128
+
+
+# max_meta_value_length is the max number of bytes in the utf8 encoding
+# of a metadata value
+
+#max_meta_value_length = 256
+
+
+# max_meta_count is the max number of metadata keys that can be stored
+# on a single account, container, or object
+
+#max_meta_count = 90
+
+
+# max_meta_overall_size is the max number of bytes in the utf8 encoding
+# of the metadata (keys + values)
+
+#max_meta_overall_size = 4096
+
+# max_header_size is the max number of bytes in the utf8 encoding of each
+# header. Using 8192 as default because eventlet use 8192 as max size of
+# header line. This value may need to be increased when using identity
+# v3 API tokens including more than 7 catalog entries.
+# See also include_service_catalog in proxy-server.conf-sample
+# (documented in overview_auth.rst)
+
+#max_header_size = 8192
+
+
+# max_object_name_length is the max number of bytes in the utf8 encoding
+# of an object name
+
+#max_object_name_length = 1024
+
+
+# container_listing_limit is the default (and max) number of items
+# returned for a container listing request
+
+#container_listing_limit = 10000
+
+
+# account_listing_limit is the default (and max) number of items returned
+# for an account listing request
+#account_listing_limit = 10000
+
+
+# max_account_name_length is the max number of bytes in the utf8 encoding
+# of an account name
+
+#max_account_name_length = 256
+
+
+# max_container_name_length is the max number of bytes in the utf8 encoding
+# of a container name
+
+#max_container_name_length = 256
+
+
+# By default all REST API calls should use "v1" or "v1.0" as the version string,
+# for example "/v1/account". This can be manually overridden to make this
+# backward-compatible, in case a different version string has been used before.
+# Use a comma-separated list in case of multiple allowed versions, for example
+# valid_api_versions = v0,v1,v2
+# This is only enforced for account, container and object requests. The allowed
+# api versions are by default excluded from /info.
+
+# valid_api_versions = v1,v1.0
diff --git a/install-files/swift/usr/share/swift/hosts b/install-files/swift/usr/share/swift/hosts
new file mode 100644
index 00000000..5b97818d
--- /dev/null
+++ b/install-files/swift/usr/share/swift/hosts
@@ -0,0 +1 @@
+localhost ansible_connection=local
diff --git a/install-files/swift/usr/share/swift/swift-storage.yml b/install-files/swift/usr/share/swift/swift-storage.yml
new file mode 100644
index 00000000..62a335ed
--- /dev/null
+++ b/install-files/swift/usr/share/swift/swift-storage.yml
@@ -0,0 +1,24 @@
+---
+- hosts: localhost
+ vars_files:
+ - swift-storage-vars.yml
+ vars:
+ remote_user: root
+ tasks:
+ - user: name=swift comment="Swift user"
+ - file: path=/etc/swift owner=swift group=swift state=directory recurse=yes
+
+ - template: src=/usr/share/swift/etc/rsyncd.j2 dest=/etc/rsyncd.conf
+ mode=0644 owner=swift group=swift
+
+ - template: src=/usr/share/swift/etc/swift/{{ item }}.j2
+ dest=/etc/swift/{{ item }}.conf mode=0644 owner=swift group=swift
+ with_items:
+ - account-server
+ - container-server
+ - object-server
+ - swift
+
+ - file: path=/srv/node owner=swift group=swift state=directory recurse=yes
+ - file: path=/var/cache/swift owner=swift group=swift state=directory
+ recurse=yes
diff --git a/install-files/vagrant-files/home/vagrant/.ssh/authorized_keys b/install-files/vagrant-files/home/vagrant/.ssh/authorized_keys
new file mode 100644
index 00000000..18a9c00f
--- /dev/null
+++ b/install-files/vagrant-files/home/vagrant/.ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key
diff --git a/install-files/vagrant-files/manifest b/install-files/vagrant-files/manifest
new file mode 100644
index 00000000..67168341
--- /dev/null
+++ b/install-files/vagrant-files/manifest
@@ -0,0 +1,4 @@
+0040755 0 0 /home
+0040755 1000 0000 /home/vagrant
+0040700 1000 1000 /home/vagrant/.ssh
+0100600 1000 1000 /home/vagrant/.ssh/authorized_keys
diff --git a/ivi/clusters/ivi-system-armv7lhf-jetson-deploy.morph b/ivi/clusters/ivi-system-armv7lhf-jetson-deploy.morph
new file mode 100644
index 00000000..b7d54749
--- /dev/null
+++ b/ivi/clusters/ivi-system-armv7lhf-jetson-deploy.morph
@@ -0,0 +1,18 @@
+name: ivi-system-armv7lhf-jetson-deploy
+kind: cluster
+description: Deploy a IVI system.
+systems:
+- morph: ivi/systems/ivi-system-armv7lhf-jetson.morph
+ deploy:
+ ivi-system-armv7lhf-jetson:
+ type: extensions/rawdisk
+ location: /ivi-system-armv7lhf-jetson.img
+ HOSTNAME: ivi-system-armv7lhf-jetson
+ DISK_SIZE: 6G
+ BOOT_DEVICE: /dev/mmcblk0p1
+ ROOT_DEVICE: /dev/mmcblk0p2
+ DTB_PATH: boot/tegra124-jetson-tk1.dtb
+ BOOTLOADER_CONFIG_FORMAT: extlinux
+ BOOTLOADER_INSTALL: none
+ KERNEL_ARGS: cma=256M console=tty0 console=ttyS0,115200n8 no_console_suspend=1
+ nouveau.pstate=1
diff --git a/ivi/clusters/ivi-system-x86_32-deploy.morph b/ivi/clusters/ivi-system-x86_32-deploy.morph
new file mode 100644
index 00000000..9adaa196
--- /dev/null
+++ b/ivi/clusters/ivi-system-x86_32-deploy.morph
@@ -0,0 +1,24 @@
+name: ivi-system-x86_32-deploy
+kind: cluster
+description: |
+ Deploy a stock IVI system.
+
+ The resulting image can be copied to a USB and booted from there,
+ as well as in a virtual machine.
+
+systems:
+- morph: ivi/systems/ivi-system-x86_32.morph
+ deploy:
+ ivi-system-x86_32:
+ type: extensions/rawdisk
+ location: /ivi-system-x86_32.img
+ HOSTNAME: ivi-system-x86-32
+ DISK_SIZE: 6G
+ KERNEL_ARGS: vga=788
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: systems/initramfs-x86_32.morph
+ deploy:
+ initramfs:
+ type: initramfs
+ location: boot/initramfs.gz
diff --git a/ivi/clusters/ivi-system-x86_64-deploy.morph b/ivi/clusters/ivi-system-x86_64-deploy.morph
new file mode 100644
index 00000000..5e18cd39
--- /dev/null
+++ b/ivi/clusters/ivi-system-x86_64-deploy.morph
@@ -0,0 +1,24 @@
+name: ivi-system-x86_64-deploy
+kind: cluster
+description: |
+ Deploy a stock IVI system.
+
+ The resulting image can be copied to a USB and booted from there,
+ as well as in a virtual machine.
+
+systems:
+- morph: ivi/systems/ivi-system-x86_64.morph
+ deploy:
+ ivi-system-x86_64:
+ type: extensions/rawdisk
+ location: /ivi-system-x86_64.img
+ HOSTNAME: ivi-system-x86-64
+ DISK_SIZE: 6G
+ KERNEL_ARGS: vga=788
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ initramfs:
+ type: initramfs
+ location: boot/initramfs.gz
diff --git a/ivi/strata/bsp-x86_32-ivi.morph b/ivi/strata/bsp-x86_32-ivi.morph
new file mode 100644
index 00000000..0dd7e00d
--- /dev/null
+++ b/ivi/strata/bsp-x86_32-ivi.morph
@@ -0,0 +1,12 @@
+name: bsp-x86_32-ivi
+kind: stratum
+description: Set of components required for booting a 32-bit
+ x86 based system, with some options specific to IVI systems.
+build-depends:
+- morph: strata/bsp-x86_both-tools.morph
+chunks:
+- name: linux-x86-32-ivi
+ morph: ivi/strata/bsp-x86_32-ivi/linux-x86-32-ivi.morph
+ repo: upstream:linux
+ ref: 6f7da290413ba713f0cdd9ff1a2a9bb129ef4f6c
+ unpetrify-ref: v4.12
diff --git a/ivi/strata/bsp-x86_32-ivi/linux-x86-32-ivi.morph b/ivi/strata/bsp-x86_32-ivi/linux-x86-32-ivi.morph
new file mode 100644
index 00000000..c4ff83f6
--- /dev/null
+++ b/ivi/strata/bsp-x86_32-ivi/linux-x86-32-ivi.morph
@@ -0,0 +1,84 @@
+name: linux-x86-32-ivi
+kind: chunk
+products:
+- artifact: linux-x86-32-ivi-devel
+ include:
+ - (usr/)?src/linux/.*
+- artifact: linux-x86-32-ivi-bins
+ include:
+ - boot/.*
+- artifact: linux-x86-32-ivi-libs
+ include:
+ - lib/.*
+configure-commands:
+- make defconfig
+- scripts/config -e ATA
+- scripts/config -e ATA_PIIX
+- scripts/config -e AUTOFS4_FS
+- scripts/config -e BLK_DEV_BSG
+- scripts/config -e BLK_DEV_SD
+- scripts/config -e BTRFS_FS
+- scripts/config -e BTRFS_FS_POSIX_ACL
+- scripts/config -e CFS_BANDWIDTH
+- scripts/config -e CGROUPS
+- scripts/config -e CGROUP_SCHED
+- scripts/config -e CHECKPOINT_RESTORE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e DEVTMPFS
+- scripts/config -e DMIID
+- scripts/config -e EFIVAR_FS
+- scripts/config -e EFI_PARTITION
+- scripts/config -e EPOLL
+- scripts/config -e FAIR_GROUP_SCHED
+- scripts/config -e FHANDLE
+- scripts/config -d FW_LOADER_USER_HELPER
+- scripts/config -e INOTIFY_USER
+- scripts/config -e IPV6
+- scripts/config -e NET
+- scripts/config -e NET_NS
+- scripts/config -e PROC_FS
+- scripts/config -e SATA_AHCI
+- scripts/config -e SCSI
+- scripts/config -e SCSI_MOD
+- scripts/config -e SECCOMP
+- scripts/config -e SIGNALFD
+- scripts/config -e SYSFS
+- scripts/config -d SYSFS_DEPRECATED
+- scripts/config -e TIMERFD
+- scripts/config -e TMPFS_POSIX_ACL
+- scripts/config -e TMPFS_XATTR
+- scripts/config -e UEVENT_HELPER_PATH=""
+- scripts/config -m CONFIG_DRM_CIRRUS_QEMU
+- scripts/config -m CONFIG_DRM_BOCHS
+- scripts/config -m CONFIG_DRM_VIRTIO_GPU
+- scripts/config -m CONFIG_BT_INTEL
+- scripts/config -m CONFIG_MOSTCORE
+- yes '' | make oldconfig
+build-commands:
+- make $MAKEFLAGS
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- make INSTALL_PATH="$DESTDIR"/boot install
+- make INSTALL_MOD_PATH="$DESTDIR" modules_install
+- install -d "$DESTDIR$PREFIX/src/linux"
+- |
+ (
+ printf 'Makefile\0'
+ printf 'Module.symvers\0'
+ find arch/x86 -maxdepth 1 -name 'Makefile*' -print0
+ find arch/x86 \( -name 'module.lds' -o -name 'Kbuild.platforms' -o -name 'Platform' \) -print0
+ find arch/x86 \( -type d -a \( -name include -o -name scripts \) \) -o \
+ \! -type d -a \( -path '*include/*' -o -path '*scripts/*' \) -print0
+ find include -name 'asm*' -prune -o -print0
+ find include/asm-generic -print0
+ find include/uapi -print0
+ find scripts -print0
+ ) | cpio -0pumd "$DESTDIR$PREFIX/src/linux"
+system-integration:
+ linux-x86-32-ivi-misc:
+ # This is required for any modules to work correctly. However, it depends
+ # `depmod` from the 'kmod' chunk in the 'foundation' stratum, so it runs
+ # conditionally on `depmod` existing to avoid breaking in
+ # minimal-system-x86_32.
+ 00-depmod:
+ - if which depmod; then (cd /usr/lib/modules && for version in *; do depmod -a "$version"; done) fi
diff --git a/ivi/strata/bsp-x86_64-ivi.morph b/ivi/strata/bsp-x86_64-ivi.morph
new file mode 100644
index 00000000..009afdd8
--- /dev/null
+++ b/ivi/strata/bsp-x86_64-ivi.morph
@@ -0,0 +1,12 @@
+name: bsp-x86_64-ivi
+kind: stratum
+description: Set of components required for booting a 64-bit
+ x86 based system, with some options specific to IVI systems.
+build-depends:
+- morph: strata/bsp-x86_both-tools.morph
+chunks:
+- name: linux-x86-64-ivi
+ morph: ivi/strata/bsp-x86_64-ivi/linux-x86-64-ivi.morph
+ repo: upstream:linux
+ ref: 6f7da290413ba713f0cdd9ff1a2a9bb129ef4f6c
+ unpetrify-ref: v4.12
diff --git a/ivi/strata/bsp-x86_64-ivi/linux-x86-64-ivi.morph b/ivi/strata/bsp-x86_64-ivi/linux-x86-64-ivi.morph
new file mode 100644
index 00000000..21d82571
--- /dev/null
+++ b/ivi/strata/bsp-x86_64-ivi/linux-x86-64-ivi.morph
@@ -0,0 +1,84 @@
+name: linux-x86-64-ivi
+kind: chunk
+products:
+- artifact: linux-x86-64-ivi-devel
+ include:
+ - (usr/)?src/linux/.*
+- artifact: linux-x86-64-ivi-bins
+ include:
+ - boot/.*
+- artifact: linux-x86-64-ivi-libs
+ include:
+ - lib/.*
+configure-commands:
+- make defconfig
+- scripts/config -e ATA
+- scripts/config -e ATA_PIIX
+- scripts/config -e AUTOFS4_FS
+- scripts/config -e BLK_DEV_BSG
+- scripts/config -e BLK_DEV_SD
+- scripts/config -e BTRFS_FS
+- scripts/config -e BTRFS_FS_POSIX_ACL
+- scripts/config -e CFS_BANDWIDTH
+- scripts/config -e CGROUPS
+- scripts/config -e CGROUP_SCHED
+- scripts/config -e CHECKPOINT_RESTORE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e DEVTMPFS
+- scripts/config -e DMIID
+- scripts/config -e EFIVAR_FS
+- scripts/config -e EFI_PARTITION
+- scripts/config -e EPOLL
+- scripts/config -e FAIR_GROUP_SCHED
+- scripts/config -e FHANDLE
+- scripts/config -d FW_LOADER_USER_HELPER
+- scripts/config -e INOTIFY_USER
+- scripts/config -e IPV6
+- scripts/config -e NET
+- scripts/config -e NET_NS
+- scripts/config -e PROC_FS
+- scripts/config -e SATA_AHCI
+- scripts/config -e SCSI
+- scripts/config -e SCSI_MOD
+- scripts/config -e SECCOMP
+- scripts/config -e SIGNALFD
+- scripts/config -e SYSFS
+- scripts/config -d SYSFS_DEPRECATED
+- scripts/config -e TIMERFD
+- scripts/config -e TMPFS_POSIX_ACL
+- scripts/config -e TMPFS_XATTR
+- scripts/config -e UEVENT_HELPER_PATH=""
+- scripts/config -m CONFIG_DRM_CIRRUS_QEMU
+- scripts/config -m CONFIG_DRM_BOCHS
+- scripts/config -m CONFIG_DRM_VIRTIO_GPU
+- scripts/config -m CONFIG_BT_INTEL
+- scripts/config -m CONFIG_MOSTCORE
+- yes '' | make oldconfig
+build-commands:
+- make $MAKEFLAGS
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- make INSTALL_PATH="$DESTDIR"/boot install
+- make INSTALL_MOD_PATH="$DESTDIR" modules_install
+- install -d "$DESTDIR$PREFIX/src/linux"
+- |
+ (
+ printf 'Makefile\0'
+ printf 'Module.symvers\0'
+ find arch/x86 -maxdepth 1 -name 'Makefile*' -print0
+ find arch/x86 \( -name 'module.lds' -o -name 'Kbuild.platforms' -o -name 'Platform' \) -print0
+ find arch/x86 \( -type d -a \( -name include -o -name scripts \) \) -o \
+ \! -type d -a \( -path '*include/*' -o -path '*scripts/*' \) -print0
+ find include -name 'asm*' -prune -o -print0
+ find include/asm-generic -print0
+ find include/uapi -print0
+ find scripts -print0
+ ) | cpio -0pumd "$DESTDIR$PREFIX/src/linux"
+system-integration:
+ linux-x86-64-ivi-misc:
+ # This is required for any modules to work correctly. However, it depends
+ # `depmod` from the 'kmod' chunk in the 'foundation' stratum, so it runs
+ # conditionally on `depmod` existing to avoid breaking in
+ # minimal-system-x86_64.
+ 00-depmod:
+ - if which depmod; then (cd /usr/lib/modules && for version in *; do depmod -a "$version"; done) fi
diff --git a/ivi/strata/qt5-ivi.morph b/ivi/strata/qt5-ivi.morph
new file mode 100644
index 00000000..7032c290
--- /dev/null
+++ b/ivi/strata/qt5-ivi.morph
@@ -0,0 +1,21 @@
+name: qt5-ivi
+kind: stratum
+description: Qt5 IVI stratum
+build-depends:
+- morph: strata/ruby.morph
+- morph: strata/qt5-tools.morph
+- morph: strata/qt5-tools-qtmultimedia.morph
+chunks:
+- name: qtapplicationmanager
+ morph: ivi/strata/qt5-ivi/qtapplicationmanager.morph
+ repo: upstream:qt5/qtapplicationmanager
+ ref: 3334cc42fcbc15dc75a0e247578e714399cd939f
+ unpetrify-ref: "5.9"
+- name: qtivi
+ repo: upstream:qt5/qtivi
+ ref: 107832b9e27319e9104e3b68d76a4d0f326567f6
+ unpetrify-ref: dev
+ build-system: qmake
+ submodules:
+ src/3rdparty/qface:
+ url: upstream:qt5/qtivi-qface
diff --git a/ivi/strata/qt5-ivi/qtapplicationmanager.morph b/ivi/strata/qt5-ivi/qtapplicationmanager.morph
new file mode 100644
index 00000000..45f2c07a
--- /dev/null
+++ b/ivi/strata/qt5-ivi/qtapplicationmanager.morph
@@ -0,0 +1,8 @@
+name: qtapplicationmanager
+kind: chunk
+build-system: qmake
+configure-commands:
+- qmake -config install-prefix=$PREFIX
+post-install-commands:
+- mkdir -p $DESTDIR/opt/am
+- cp -r template-opt/am/* $DESTDIR/opt/am/
diff --git a/ivi/strata/rvi.morph b/ivi/strata/rvi.morph
new file mode 100644
index 00000000..8fd11874
--- /dev/null
+++ b/ivi/strata/rvi.morph
@@ -0,0 +1,11 @@
+name: rvi
+kind: stratum
+build-depends:
+- morph: strata/bluetooth.morph
+- morph: strata/erlang.morph
+chunks:
+- name: rvi_core
+ morph: ivi/strata/rvi/rvi_core.morph
+ repo: upstream:rvi/rvi_core
+ ref: 9a3db2baecdddbfba8e8bfeb71038e4de6a44225
+ unpetrify-ref: v0.5.0
diff --git a/ivi/strata/rvi/rvi_core.morph b/ivi/strata/rvi/rvi_core.morph
new file mode 100644
index 00000000..c34f8a97
--- /dev/null
+++ b/ivi/strata/rvi/rvi_core.morph
@@ -0,0 +1,16 @@
+name: rvi_core
+kind: chunk
+build-system: manual
+build-commands:
+- |
+ make deps
+ make compile
+ make escript
+install-commands:
+- |
+ make DESTDIR="$DESTDIR" install
+ install -d "$DESTDIR"/usr/lib/systemd/system
+ install -m 0644 yocto_template/rvi.service "$DESTDIR"/usr/lib/systemd/system
+post-install-commands:
+- echo "genivi.org/node/$(cat /proc/sys/kernel/random/uuid)" > "$DESTDIR"/etc/opt/rvi/device_id
+- install -m 0644 priv/config/rvi_common.config "$DESTDIR"/etc/opt/rvi/rvi.config
diff --git a/ivi/systems/ivi-system-armv7lhf-jetson.morph b/ivi/systems/ivi-system-armv7lhf-jetson.morph
new file mode 100644
index 00000000..552e31ac
--- /dev/null
+++ b/ivi/systems/ivi-system-armv7lhf-jetson.morph
@@ -0,0 +1,94 @@
+name: ivi-system-armv7lhf-jetson
+kind: system
+description: A generic IVI system with components from GENIVI and AGL
+arch: armv7lhf
+strata:
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: cpp-common-libs
+ morph: strata/cpp-common-libs.morph
+- name: data-indexing-management
+ morph: strata/data-indexing-management.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: dlna-services
+ morph: strata/dlna-services.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: geolocation
+ morph: strata/geolocation.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: ivi-common
+ morph: strata/ivi-common.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: llvm-common
+ morph: strata/llvm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: multimedia-gstreamer-openmax-generic
+ morph: strata/multimedia-gstreamer-openmax-generic.morph
+- name: navigation
+ morph: strata/navigation.morph
+- name: network-security
+ morph: strata/network-security.morph
+- name: NetworkManager-common
+ morph: strata/NetworkManager-common.morph
+- name: privileges-management
+ morph: strata/privileges-management.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python3-gobject
+ morph: strata/python3-gobject.morph
+- name: qt5-tools
+ morph: strata/qt5-tools.morph
+- name: qt5-tools-qtmultimedia
+ morph: strata/qt5-tools-qtmultimedia.morph
+- name: qt5-tools-qtwebengine
+ morph: strata/qt5-tools-qtwebengine.morph
+- name: qt5-tools-qtwayland
+ morph: strata/qt5-tools-qtwayland.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: samba
+ morph: strata/samba.morph
+- name: secret-service
+ morph: strata/secret-service.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: spell-checking
+ morph: strata/spell-checking.morph
+- name: storage-management
+ morph: strata/storage-management.morph
+- name: vala-common
+ morph: strata/vala-common.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: weston-common
+ morph: strata/weston-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/install-essential-files
diff --git a/ivi/systems/ivi-system-x86_32.morph b/ivi/systems/ivi-system-x86_32.morph
new file mode 100644
index 00000000..12f5efc3
--- /dev/null
+++ b/ivi/systems/ivi-system-x86_32.morph
@@ -0,0 +1,104 @@
+name: ivi-system-x86_32
+kind: system
+description: A generic IVI system with components from GENIVI and AGL
+arch: x86_32
+strata:
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: bsp-x86_both-tools
+ morph: strata/bsp-x86_both-tools.morph
+- name: bsp-x86_32-ivi
+ morph: ivi/strata/bsp-x86_32-ivi.morph
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: cpp-common-libs
+ morph: strata/cpp-common-libs.morph
+- name: data-indexing-management
+ morph: strata/data-indexing-management.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: dlna-services
+ morph: strata/dlna-services.morph
+- name: erlang
+ morph: strata/erlang.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: geolocation
+ morph: strata/geolocation.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: ivi-common
+ morph: strata/ivi-common.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: llvm-common
+ morph: strata/llvm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-hardware-codecs-x86
+ morph: strata/multimedia-hardware-codecs-x86.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: multimedia-gstreamer-openmax-generic
+ morph: strata/multimedia-gstreamer-openmax-generic.morph
+- name: navigation
+ morph: strata/navigation.morph
+- name: network-security
+ morph: strata/network-security.morph
+- name: NetworkManager-common
+ morph: strata/NetworkManager-common.morph
+- name: privileges-management
+ morph: strata/privileges-management.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python3-gobject
+ morph: strata/python3-gobject.morph
+- name: qt5-ivi
+ morph: ivi/strata/qt5-ivi.morph
+- name: qt5-tools
+ morph: strata/qt5-tools.morph
+- name: qt5-tools-qtmultimedia
+ morph: strata/qt5-tools-qtmultimedia.morph
+- name: qt5-tools-qtwebengine
+ morph: strata/qt5-tools-qtwebengine.morph
+- name: qt5-tools-qtwayland
+ morph: strata/qt5-tools-qtwayland.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: samba
+ morph: strata/samba.morph
+- name: secret-service
+ morph: strata/secret-service.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: spell-checking
+ morph: strata/spell-checking.morph
+- name: storage-management
+ morph: strata/storage-management.morph
+- name: vala-common
+ morph: strata/vala-common.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: weston-common
+ morph: strata/weston-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: rvi
+ morph: ivi/strata/rvi.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/install-essential-files
diff --git a/ivi/systems/ivi-system-x86_64.morph b/ivi/systems/ivi-system-x86_64.morph
new file mode 100644
index 00000000..2a42f003
--- /dev/null
+++ b/ivi/systems/ivi-system-x86_64.morph
@@ -0,0 +1,104 @@
+name: ivi-system-x86_64
+kind: system
+description: A generic IVI system with components from GENIVI and AGL
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: bsp-x86_both-tools
+ morph: strata/bsp-x86_both-tools.morph
+- name: bsp-x86_64-ivi
+ morph: ivi/strata/bsp-x86_64-ivi.morph
+- name: core
+ morph: strata/core.morph
+- name: cpp-common-libs
+ morph: strata/cpp-common-libs.morph
+- name: data-indexing-management
+ morph: strata/data-indexing-management.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: dlna-services
+ morph: strata/dlna-services.morph
+- name: erlang
+ morph: strata/erlang.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: geolocation
+ morph: strata/geolocation.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: ivi-common
+ morph: strata/ivi-common.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: llvm-common
+ morph: strata/llvm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-hardware-codecs-x86
+ morph: strata/multimedia-hardware-codecs-x86.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: multimedia-gstreamer-openmax-generic
+ morph: strata/multimedia-gstreamer-openmax-generic.morph
+- name: navigation
+ morph: strata/navigation.morph
+- name: network-security
+ morph: strata/network-security.morph
+- name: NetworkManager-common
+ morph: strata/NetworkManager-common.morph
+- name: privileges-management
+ morph: strata/privileges-management.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python3-gobject
+ morph: strata/python3-gobject.morph
+- name: qt5-ivi
+ morph: ivi/strata/qt5-ivi.morph
+- name: qt5-tools
+ morph: strata/qt5-tools.morph
+- name: qt5-tools-qtmultimedia
+ morph: strata/qt5-tools-qtmultimedia.morph
+- name: qt5-tools-qtwebengine
+ morph: strata/qt5-tools-qtwebengine.morph
+- name: qt5-tools-qtwayland
+ morph: strata/qt5-tools-qtwayland.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: samba
+ morph: strata/samba.morph
+- name: secret-service
+ morph: strata/secret-service.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: spell-checking
+ morph: strata/spell-checking.morph
+- name: storage-management
+ morph: strata/storage-management.morph
+- name: vala-common
+ morph: strata/vala-common.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: weston-common
+ morph: strata/weston-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: rvi
+ morph: ivi/strata/rvi.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/install-essential-files
diff --git a/migrations b/migrations
new file mode 100644
index 00000000..2b0104d2
--- /dev/null
+++ b/migrations
@@ -0,0 +1,3 @@
+The content of the definitions/migrations directory is now at
+
+http://git.baserock.org/cgit/baserock/baserock/spec.git/tree/migrations
diff --git a/partitioning/default b/partitioning/default
new file mode 100644
index 00000000..5e34afbf
--- /dev/null
+++ b/partitioning/default
@@ -0,0 +1,9 @@
+start_offset: 2048
+partition_table_format: mbr
+partitions:
+- description: rootfs
+ size: fill
+ fdisk_type: 0x83
+ filesystem: btrfs
+ mountpoint: /
+ boot: yes
diff --git a/partitioning/socfpga-devkit b/partitioning/socfpga-devkit
new file mode 100644
index 00000000..4a982427
--- /dev/null
+++ b/partitioning/socfpga-devkit
@@ -0,0 +1,26 @@
+start_offset: 2048
+partition_table_format: mbr
+partitions:
+- description: pre-loader
+ filesystem: none
+ fdisk_type: 0xa2
+ number: 3
+ size: 1M
+ raw_files:
+ - file: boot/socfpga-preloader.img
+ - file: boot/u-boot.img
+- description: boot
+ filesystem: vfat
+ mountpoint: /boot
+ fdisk_type: 0x0b
+ number: 1
+ size: 100M
+- description: root
+ filesystem: btrfs
+ mountpoint: /
+ fdisk_type: 0x83
+ number: 2
+ size: fill
+raw_files:
+- file: boot/socfpga-devkit-env.img
+ offset_bytes: 512
diff --git a/scripts/check-unpetrify-refs.py b/scripts/check-unpetrify-refs.py
new file mode 100755
index 00000000..c70b680d
--- /dev/null
+++ b/scripts/check-unpetrify-refs.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+# Copyright (C) 2016 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.
+
+import os
+import glob
+import argparse
+import subprocess
+
+import scriptslib
+
+
+'''
+Script for checking unpetrify-refs in strata.
+
+Without args this script will check everything in strata/, or each stratum
+given on the command-line and will print on stdout whether a chunk has
+a missing or non-existent unpetrify-ref and if it fails to check the remote
+(missing repo).
+'''
+
+strata_dir = "strata"
+
+def ref_exists(remote, ref):
+ output = subprocess.check_output(
+ ["git", "ls-remote", remote, str(ref)],
+ stderr=subprocess.STDOUT).strip()
+ return True if output else False
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Sanity checks unpetrify-refs in Baserock strata")
+ parser.add_argument("--trove-host", default="git.baserock.org",
+ help="Trove host to map repo aliases to")
+ parser.add_argument("strata", nargs="*", metavar="STRATA",
+ help="The strata to check (checks all by default)")
+ args = parser.parse_args()
+
+ if args.strata:
+ strata = args.strata
+ else:
+ strata_path = os.path.join(scriptslib.definitions_root(), strata_dir)
+ strata = glob.glob("%s/*.morph" % strata_path)
+
+ for stratum in strata:
+ path = os.path.relpath(stratum)
+ morphology = scriptslib.load_yaml_file(stratum)
+ for chunk in morphology['chunks']:
+ unpetrify_ref = chunk.get("unpetrify-ref")
+ if not unpetrify_ref:
+ print ("%s: '%s' has no unpetrify-ref!" %
+ (path, chunk['name']))
+ continue
+ remote = scriptslib.parse_repo_alias(chunk['repo'], args.trove_host)
+ try:
+ if not ref_exists(remote, unpetrify_ref):
+ print ("%s: unpetrify-ref for '%s' is not present on the "
+ "remote (%s)!" % (path, chunk['name'], remote))
+ except subprocess.CalledProcessError as e:
+ print ("%s: failed to ls-remote (%s) for chunk '%s':\n%s" %
+ (path, remote, chunk['name'], e.output.strip()))
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/cycle.sh b/scripts/cycle.sh
new file mode 100755
index 00000000..c0e2aa67
--- /dev/null
+++ b/scripts/cycle.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+# Copyright (C) 2014 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.
+
+usage() {
+ echo "Usage: cycle.sh some-system some-cluster [newversion]"
+ echo
+ echo "This builds and deploys the current checked out version of"
+ echo "some-system, applying it as a self-upgrade to the system you"
+ echo "are working in, using configuration from some-cluster."
+ echo "The upgrade is labelled TEST by default, or [newversion] if"
+ echo "specified, and is set to be the default for next boot."
+}
+
+if [ -z "$1" ] || [ -z "$2" ] || [ ! -z "$4" ] ; then
+ usage
+ exit 1
+fi
+
+newversion=TEST
+if [ ! -z "$3" ] ; then
+ newversion=$3
+ if (echo "$newversion" | grep ' ' > /dev/null 2>&1) ; then
+ echo 'Version label must not contain spaces.'
+ exit 1
+ fi
+fi
+
+if system-version-manager get-running | grep -q "^$newversion$"; then
+ echo "You are currently running the $newversion system."
+ echo "Maybe you want to boot into a different system version?"
+ exit 1
+fi
+
+set -e
+set -v
+
+runningversion=`system-version-manager get-running`
+system-version-manager set-default $runningversion
+if system-version-manager list | grep -q "^$newversion$"; then
+ system-version-manager remove $newversion
+fi
+
+morph gc
+morph build "$1"
+
+sed -i "s|^- morph: .*$|- morph: $1|" "$2"
+morph deploy --upgrade "$2" self.HOSTNAME=$(hostname) self.VERSION_LABEL=$newversion
+system-version-manager list
diff --git a/scripts/licensecheck.pl b/scripts/licensecheck.pl
new file mode 100644
index 00000000..5b6d0d33
--- /dev/null
+++ b/scripts/licensecheck.pl
@@ -0,0 +1,604 @@
+#!/usr/bin/perl
+# This script was originally based on the script of the same name from
+# the KDE SDK (by dfaure@kde.org)
+#
+# This version is
+# Copyright (C) 2007, 2008 Adam D. Barratt
+# Copyright (C) 2012 Francesco Poli
+#
+# 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; either version 2 of the License, or
+# (at your option) any later version.
+#
+# 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 <https://www.gnu.org/licenses/>.
+
+=head1 NAME
+
+licensecheck - simple license checker for source files
+
+=head1 SYNOPSIS
+
+B<licensecheck> B<--help>|B<--version>
+
+B<licensecheck> [B<--no-conf>] [B<--verbose>] [B<--copyright>]
+[B<-l>|B<--lines=>I<N>] [B<-i>|B<--ignore=>I<regex>] [B<-c>|B<--check=>I<regex>]
+[B<-m>|B<--machine>] [B<-r>|B<--recursive>]
+I<list of files and directories to check>
+
+=head1 DESCRIPTION
+
+B<licensecheck> attempts to determine the license that applies to each file
+passed to it, by searching the start of the file for text belonging to
+various licenses.
+
+If any of the arguments passed are directories, B<licensecheck> will add
+the files contained within to the list of files to process.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--verbose>, B<--no-verbose>
+
+Specify whether to output the text being processed from each file before
+the corresponding license information.
+
+Default is to be quiet.
+
+=item B<-l=>I<N>, B<--lines=>I<N>
+
+Specify the number of lines of each file's header which should be parsed
+for license information. (Default is 60).
+
+=item B<-i=>I<regex>, B<--ignore=>I<regex>
+
+When processing the list of files and directories, the regular
+expression specified by this option will be used to indicate those which
+should not be considered (e.g. backup files, VCS metadata).
+
+=item B<-r>, B<--recursive>
+
+Specify that the contents of directories should be added
+recursively.
+
+=item B<-c=>I<regex>, B<--check=>I<regex>
+
+Specify a pattern against which filenames will be matched in order to
+decide which files to check the license of.
+
+The default includes common source files.
+
+=item B<--copyright>
+
+Also display copyright text found within the file
+
+=item B<-m>, B<--machine>
+
+Display the information in a machine readable way, i.e. in the form
+<file><tab><license>[<tab><copyright>] so that it can be easily sorted
+and/or filtered, e.g. with the B<awk> and B<sort> commands.
+Note that using the B<--verbose> option will kill the readability.
+
+=item B<--no-conf>, B<--noconf>
+
+Do not read any configuration files. This can only be used as the first
+option given on the command line.
+
+=back
+
+=head1 CONFIGURATION VARIABLES
+
+The two configuration files F</etc/devscripts.conf> and
+F<~/.devscripts> are sourced by a shell in that order to set
+configuration variables. Command line options can be used to override
+configuration file settings. Environment variable settings are
+ignored for this purpose. The currently recognised variables are:
+
+=over 4
+
+=item B<LICENSECHECK_VERBOSE>
+
+If this is set to I<yes>, then it is the same as the B<--verbose> command
+line parameter being used. The default is I<no>.
+
+=item B<LICENSECHECK_PARSELINES>
+
+If this is set to a positive number then the specified number of lines
+at the start of each file will be read whilst attempting to determine
+the license(s) in use. This is equivalent to the B<--lines> command line
+option.
+
+=back
+
+=head1 LICENSE
+
+This code is copyright by Adam D. Barratt <I<adam@adam-barratt.org.uk>>,
+all rights reserved; based on a script of the same name from the KDE
+SDK, which is copyright by <I<dfaure@kde.org>>.
+This program comes with ABSOLUTELY NO WARRANTY.
+You are free to redistribute this code under the terms of the GNU
+General Public License, version 2 or later.
+
+=head1 AUTHOR
+
+Adam D. Barratt <adam@adam-barratt.org.uk>
+
+=cut
+
+use strict;
+use warnings;
+use Getopt::Long qw(:config gnu_getopt);
+use File::Basename;
+
+my $progname = basename($0);
+
+# From dpkg-source
+my $default_ignore_regex = '
+# Ignore general backup files
+(?:^|/).*~$|
+# Ignore emacs recovery files
+(?:^|/)\.#.*$|
+# Ignore vi swap files
+(?:^|/)\..*\.swp$|
+# Ignore baz-style junk files or directories
+(?:^|/),,.*(?:$|/.*$)|
+# File-names that should be ignored (never directories)
+(?:^|/)(?:DEADJOE|\.cvsignore|\.arch-inventory|\.bzrignore|\.gitignore)$|
+# File or directory names that should be ignored
+(?:^|/)(?:CVS|RCS|\.pc|\.deps|\{arch\}|\.arch-ids|\.svn|\.hg|_darcs|\.git|
+\.shelf|_MTN|\.bzr(?:\.backup|tags)?)(?:$|/.*$)
+';
+
+# Take out comments and newlines
+$default_ignore_regex =~ s/^#.*$//mg;
+$default_ignore_regex =~ s/\n//sg;
+
+my $default_check_regex = '\.(c(c|pp|xx)?|h(h|pp|xx)?|f(77|90)?|go|p(l|m)|xs|sh|php|py(|x)|rb|java|js|vala|el|sc(i|e)|cs|pas|inc|dtd|xsl|mod|m|tex|mli?|(c|l)?hs)$';
+
+my $modified_conf_msg;
+
+my %OPT=(
+ verbose => '',
+ lines => '',
+ noconf => '',
+ ignore => '',
+ check => '',
+ recursive => 0,
+ copyright => 0,
+ machine => 0,
+);
+
+my $def_lines = 60;
+
+# Read configuration files and then command line
+# This is boilerplate
+
+if (@ARGV and $ARGV[0] =~ /^--no-?conf$/) {
+ $modified_conf_msg = " (no configuration files read)";
+ shift;
+} else {
+ my @config_files = ('/etc/devscripts.conf', '~/.devscripts');
+ my %config_vars = (
+ 'LICENSECHECK_VERBOSE' => 'no',
+ 'LICENSECHECK_PARSELINES' => $def_lines,
+ );
+ my %config_default = %config_vars;
+
+ my $shell_cmd;
+ # Set defaults
+ foreach my $var (keys %config_vars) {
+ $shell_cmd .= qq[$var="$config_vars{$var}";\n];
+ }
+ $shell_cmd .= 'for file in ' . join(" ", @config_files) . "; do\n";
+ $shell_cmd .= '[ -f $file ] && . $file; done;' . "\n";
+ # Read back values
+ foreach my $var (keys %config_vars) { $shell_cmd .= "echo \$$var;\n" }
+ my $shell_out = `/bin/bash -c '$shell_cmd'`;
+ @config_vars{keys %config_vars} = split /\n/, $shell_out, -1;
+
+ # Check validity
+ $config_vars{'LICENSECHECK_VERBOSE'} =~ /^(yes|no)$/
+ or $config_vars{'LICENSECHECK_VERBOSE'} = 'no';
+ $config_vars{'LICENSECHECK_PARSELINES'} =~ /^[1-9][0-9]*$/
+ or $config_vars{'LICENSECHECK_PARSELINES'} = $def_lines;
+
+ foreach my $var (sort keys %config_vars) {
+ if ($config_vars{$var} ne $config_default{$var}) {
+ $modified_conf_msg .= " $var=$config_vars{$var}\n";
+ }
+ }
+ $modified_conf_msg ||= " (none)\n";
+ chomp $modified_conf_msg;
+
+ $OPT{'verbose'} = $config_vars{'LICENSECHECK_VERBOSE'} eq 'yes' ? 1 : 0;
+ $OPT{'lines'} = $config_vars{'LICENSECHECK_PARSELINES'};
+}
+
+GetOptions(\%OPT,
+ "help|h",
+ "check|c=s",
+ "copyright",
+ "ignore|i=s",
+ "lines|l=i",
+ "machine|m",
+ "noconf|no-conf",
+ "recursive|r",
+ "verbose!",
+ "version|v",
+) or die "Usage: $progname [options] filelist\nRun $progname --help for more details\n";
+
+$OPT{'lines'} = $def_lines if $OPT{'lines'} !~ /^[1-9][0-9]*$/;
+$OPT{'ignore'} = $default_ignore_regex if ! length $OPT{'ignore'};
+$OPT{'check'} = $default_check_regex if ! length $OPT{'check'};
+
+if ($OPT{'noconf'}) {
+ fatal("--no-conf is only acceptable as the first command-line option!");
+}
+if ($OPT{'help'}) { help(); exit 0; }
+if ($OPT{'version'}) { version(); exit 0; }
+
+die "Usage: $progname [options] filelist\nRun $progname --help for more details\n" unless @ARGV;
+
+$OPT{'lines'} = $def_lines if not defined $OPT{'lines'};
+
+my @files = ();
+my @find_args = ();
+my $files_count = @ARGV;
+
+push @find_args, qw(-maxdepth 1) unless $OPT{'recursive'};
+push @find_args, qw(-follow -type f -print);
+
+while (@ARGV) {
+ my $file = shift @ARGV;
+
+ if (-d $file) {
+ open my $FIND, '-|', 'find', $file, @find_args
+ or die "$progname: couldn't exec find: $!\n";
+
+ while (<$FIND>) {
+ chomp;
+ next unless m%$OPT{'check'}%;
+ # Skip empty files
+ next if (-z $_);
+ push @files, $_ unless m%$OPT{'ignore'}%;
+ }
+ close $FIND;
+ } else {
+ next unless ($files_count == 1) or $file =~ m%$OPT{'check'}%;
+ push @files, $file unless $file =~ m%$OPT{'ignore'}%;
+ }
+}
+
+while (@files) {
+ my $file = shift @files;
+ my $content = '';
+ my $copyright_match;
+ my $copyright = '';
+ my $license = '';
+ my %copyrights;
+
+ open (my $F, '<' ,$file) or die "Unable to access $file\n";
+ while (<$F>) {
+ last if ($. > $OPT{'lines'});
+ $content .= $_;
+ $copyright_match = parse_copyright($_);
+ if ($copyright_match) {
+ $copyrights{lc("$copyright_match")} = "$copyright_match";
+ }
+ }
+ close($F);
+
+ $copyright = join(" / ", reverse sort values %copyrights);
+
+ print qq(----- $file header -----\n$content----- end header -----\n\n)
+ if $OPT{'verbose'};
+
+ $license = parselicense(clean_comments($content));
+
+ if ($OPT{'machine'}) {
+ print "$file\t$license";
+ print "\t" . ($copyright or "*No copyright*") if $OPT{'copyright'};
+ print "\n";
+ } else {
+ print "$file: ";
+ print "*No copyright* " unless $copyright;
+ print $license . "\n";
+ print " [Copyright: " . $copyright . "]\n"
+ if $copyright and $OPT{'copyright'};
+ print "\n" if $OPT{'copyright'};
+ }
+}
+
+sub parse_copyright {
+ my $copyright = '';
+ my $match;
+
+ my $copyright_indicator_regex = '
+ (?:copyright # The full word
+ |copr\. # Legally-valid abbreviation
+ |\x{00a9} # Unicode character COPYRIGHT SIGN
+ |\xc2\xa9 # Unicode copyright sign encoded in iso8859
+ |\(c\) # Legally-null representation of sign
+ )';
+ my $copyright_disindicator_regex = '
+ \b(?:info(?:rmation)? # Discussing copyright information
+ |(notice|statement|claim|string)s? # Discussing the notice
+ |and|or|is|in|to # Part of a sentence
+ |(holder|owner)s? # Part of a sentence
+ |ownership # Part of a sentence
+ )\b';
+ my $copyright_predisindicator_regex = '(
+ ^[#]define\s+.*\(c\) # #define foo(c) -- not copyright
+ )';
+
+ if ( ! m%$copyright_predisindicator_regex%ix) {
+
+ if (m%$copyright_indicator_regex(?::\s*|\s+)(\S.*)$%ix) {
+ $match = $1;
+
+ # Ignore lines matching "see foo for copyright information" etc.
+ if ($match !~ m%^\s*$copyright_disindicator_regex%ix) {
+ # De-cruft
+ $match =~ s/([,.])?\s*$//;
+ $match =~ s/$copyright_indicator_regex//igx;
+ $match =~ s/^\s+//;
+ $match =~ s/\s{2,}/ /g;
+ $match =~ s/\\@/@/g;
+ $copyright = $match;
+ }
+ }
+ }
+
+ return $copyright;
+}
+
+sub clean_comments {
+ local $_ = shift or return q{};
+
+ # Remove generic comments: look for 4 or more lines beginning with
+ # regular comment pattern and trim it. Fall back to old algorithm
+ # if no such pattern found.
+ my @matches = m/^\s*([^a-zA-Z0-9\s]{1,3})\s\w/mg;
+ if (@matches >= 4) {
+ my $comment_re = qr/\s*[\Q$matches[0]\E]{1,3}\s*/;
+ s/^$comment_re//mg;
+ }
+
+ # Remove Fortran comments
+ s/^[cC] //gm;
+ tr/\t\r\n/ /;
+
+ # Remove C / C++ comments
+ s#(\*/|/[/*])##g;
+ tr% A-Za-z.,@;0-9\(\)/-%%cd;
+ tr/ //s;
+
+ return $_;
+}
+
+sub help {
+ print <<"EOF";
+Usage: $progname [options] filename [filename ...]
+Valid options are:
+ --help, -h Display this message
+ --version, -v Display version and copyright info
+ --no-conf, --noconf Don't read devscripts config files; must be
+ the first option given
+ --verbose Display the header of each file before its
+ license information
+ --lines, -l Specify how many lines of the file header
+ should be parsed for license information
+ (Default: $def_lines)
+ --check, -c Specify a pattern indicating which files should
+ be checked
+ (Default: '$default_check_regex')
+ --machine, -m Display in a machine readable way (good for awk)
+ --recursive, -r Add the contents of directories recursively
+ --copyright Also display the file's copyright
+ --ignore, -i Specify that files / directories matching the
+ regular expression should be ignored when
+ checking files
+ (Default: '$default_ignore_regex')
+
+Default settings modified by devscripts configuration files:
+$modified_conf_msg
+EOF
+}
+
+sub version {
+ print <<"EOF";
+This is $progname, from the Debian devscripts package, version ###VERSION###
+Copyright (C) 2007, 2008 by Adam D. Barratt <adam\@adam-barratt.org.uk>; based
+on a script of the same name from the KDE SDK by <dfaure\@kde.org>.
+
+This program comes with ABSOLUTELY NO WARRANTY.
+You are free to redistribute this code under the terms of the
+GNU General Public License, version 2, or (at your option) any
+later version.
+EOF
+}
+
+sub parselicense {
+ my ($licensetext) = @_;
+
+ my $gplver = "";
+ my $extrainfo = "";
+ my $license = "";
+
+ if ($licensetext =~ /version ([^, ]+?)[.,]? (?:\(?only\)?.? )?(?:of the GNU (Affero )?(Lesser |Library )?General Public License )?(as )?published by the Free Software Foundation/i or
+ $licensetext =~ /GNU (?:Affero )?(?:Lesser |Library )?General Public License (?:as )?published by the Free Software Foundation[;,] version ([^, ]+?)[.,]? /i) {
+
+ $gplver = " (v$1)";
+ } elsif ($licensetext =~ /GNU (?:Affero )?(?:Lesser |Library )?General Public License, version (\d+(?:\.\d+)?)[ \.]/) {
+ $gplver = " (v$1)";
+ } elsif ($licensetext =~ /either version ([^ ]+)(?: of the License)?, or \(at your option\) any later version/) {
+ $gplver = " (v$1 or later)";
+ } elsif ($licensetext =~ /either version ([^ ]+)(?: of the License)?, or \(at your option\) version (\d(?:[\.-]\d+)*)/) {
+ $gplver = " (v$1 or v$2)";
+ }
+
+ if ($licensetext =~ /(?:675 Mass Ave|59 Temple Place|51 Franklin Steet|02139|02111-1307)/i) {
+ $extrainfo = " (with incorrect FSF address)$extrainfo";
+ }
+
+ if ($licensetext =~ /permission (?:is (also granted|given))? to link (the code of )?this program with (any edition of )?(Qt|the Qt library)/i) {
+ $extrainfo = " (with Qt exception)$extrainfo"
+ }
+
+ if ($licensetext =~ /(All changes made in this file will be lost|DO NOT (EDIT|delete this file)|Generated (automatically|by|from)|generated.*file)/i) {
+ $license = "GENERATED FILE";
+ }
+
+ if ($licensetext =~ /((is free software.? )?you can redistribute (it|them) and\/or modify (it|them)|is licensed) under the terms of (version [^ ]+ of )?the (GNU (Library |Lesser )General Public License|LGPL)/i) {
+ $license = "LGPL$gplver$extrainfo $license";
+ }
+
+ if ($licensetext =~ /is free software.? you can redistribute (it|them) and\/or modify (it|them) under the terms of the (GNU Affero General Public License|AGPL)/i) {
+ $license = "AGPL$gplver$extrainfo $license";
+ }
+
+ if ($licensetext =~ /(is free software.? )?you (can|may) redistribute (it|them) and\/or modify (it|them) under the terms of (?:version [^ ]+ (?:\(?only\)? )?of )?the GNU General Public License/i) {
+ $license = "GPL$gplver$extrainfo $license";
+ }
+
+ if ($licensetext =~ /is distributed under the terms of the GNU General Public License,/
+ and length $gplver) {
+ $license = "GPL$gplver$extrainfo $license";
+ }
+
+ if ($licensetext =~ /is distributed.*terms.*GPL/) {
+ $license = "GPL (unversioned/unknown version) $license";
+ }
+
+ if ($licensetext =~ /This file is part of the .*Qt GUI Toolkit. This file may be distributed under the terms of the Q Public License as defined/) {
+ $license = "QPL (part of Qt) $license";
+ } elsif ($licensetext =~ /may (be distributed|redistribute it) under the terms of the Q Public License/) {
+ $license = "QPL $license";
+ }
+
+ if ($licensetext =~ /opensource\.org\/licenses\/mit-license\.php/) {
+ $license = "MIT/X11 (BSD like) $license";
+ } elsif ($licensetext =~ /Permission is hereby granted, free of charge, to any person obtaining a copy of this software and(\/or)? associated documentation files \(the (Software|Materials)\), to deal in the (Software|Materials)/) {
+ $license = "MIT/X11 (BSD like) $license";
+ } elsif ($licensetext =~ /Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose/) {
+ $license = "MIT/X11 (BSD like) $license";
+ }
+
+ if ($licensetext =~ /Permission to use, copy, modify, and(\/or)? distribute this software for any purpose with or without fee is hereby granted, provided.*copyright notice.*permission notice.*all copies/) {
+ $license = "ISC $license";
+ }
+
+ if ($licensetext =~ /THIS SOFTWARE IS PROVIDED .*AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY/) {
+ if ($licensetext =~ /All advertising materials mentioning features or use of this software must display the following acknowledge?ment.*This product includes software developed by/i) {
+ $license = "BSD (4 clause) $license";
+ } elsif ($licensetext =~ /(The name(?:\(s\))? .*? may not|Neither the (names? .*?|authors?) nor the names of( (its|their|other|any))? contributors may) be used to endorse or promote products derived from this software/i) {
+ $license = "BSD (3 clause) $license";
+ } elsif ($licensetext =~ /Redistributions of source code must retain the above copyright notice/i) {
+ $license = "BSD (2 clause) $license";
+ } else {
+ $license = "BSD $license";
+ }
+ }
+
+ if ($licensetext =~ /Mozilla Public License,? (Version|v\.) (\d+(?:\.\d+)?)/) {
+ $license = "MPL (v$2) $license";
+ }
+
+ if ($licensetext =~ /Released under the terms of the Artistic License ([^ ]+)/) {
+ $license = "Artistic (v$1) $license";
+ }
+
+ if ($licensetext =~ /is free software under the Artistic [Ll]icense/) {
+ $license = "Artistic $license";
+ }
+
+ if ($licensetext =~ /This program is free software; you can redistribute it and\/or modify it under the same terms as Perl itself/) {
+ $license = "Perl $license";
+ }
+
+ if ($licensetext =~ /under the Apache License, Version ([^ ]+)/) {
+ $license = "Apache (v$1) $license";
+ }
+
+ if ($licensetext =~ /(THE BEER-WARE LICENSE)/i) {
+ $license = "Beerware $license";
+ }
+
+ if ($licensetext =~ /This source file is subject to version ([^ ]+) of the PHP license/) {
+ $license = "PHP (v$1) $license";
+ }
+
+ if ($licensetext =~ /under the terms of the CeCILL /) {
+ $license = "CeCILL $license";
+ }
+
+ if ($licensetext =~ /under the terms of the CeCILL-([^ ]+) /) {
+ $license = "CeCILL-$1 $license";
+ }
+
+ if ($licensetext =~ /under the SGI Free Software License B/) {
+ $license = "SGI Free Software License B $license";
+ }
+
+ if ($licensetext =~ /is in the public domain/i) {
+ $license = "Public domain $license";
+ }
+
+ if ($licensetext =~ /terms of the Common Development and Distribution License(, Version ([^(]+))? \(the License\)/) {
+ $license = "CDDL " . ($1 ? "(v$2) " : '') . $license;
+ }
+
+ if ($licensetext =~ /Microsoft Permissive License \(Ms-PL\)/) {
+ $license = "Ms-PL $license";
+ }
+
+ if ($licensetext =~ /Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license \(the \"Software\"\)/ or
+ $licensetext =~ /Boost Software License([ ,-]+Version ([^ ]+)?(\.))/i) {
+ $license = "BSL " . ($1 ? "(v$2) " : '') . $license;
+ }
+
+ if ($licensetext =~ /PYTHON SOFTWARE FOUNDATION LICENSE (VERSION ([^ ]+))/i) {
+ $license = "PSF " . ($1 ? "(v$2) " : '') . $license;
+ }
+
+ if ($licensetext =~ /The origin of this software must not be misrepresented.*Altered source versions must be plainly marked as such.*This notice may not be removed or altered from any source distribution/ or
+ $licensetext =~ /see copyright notice in zlib\.h/) {
+ $license = "zlib/libpng $license";
+ } elsif ($licensetext =~ /This code is released under the libpng license/) {
+ $license = "libpng $license";
+ }
+
+ if ($licensetext =~ /Do What The Fuck You Want To Public License, Version ([^, ]+)/i) {
+ $license = "WTFPL (v$1) $license";
+ }
+
+ if ($licensetext =~ /Do what The Fuck You Want To Public License/i) {
+ $license = "WTFPL $license";
+ }
+
+ if ($licensetext =~ /(License WTFPL|Under (the|a) WTFPL)/i) {
+ $license = "WTFPL $license";
+ }
+
+ $license = "UNKNOWN" if (!length($license));
+
+ # Remove trailing spaces.
+ $license =~ s/\s+$//;
+
+ return $license;
+}
+
+sub fatal {
+ my ($pack,$file,$line);
+ ($pack,$file,$line) = caller();
+ (my $msg = "$progname: fatal error at line $line:\n@_\n") =~ tr/\0//d;
+ $msg =~ s/\n\n$/\n/;
+ die $msg;
+}
diff --git a/scripts/licensecheck.py b/scripts/licensecheck.py
new file mode 100755
index 00000000..08d0e1b4
--- /dev/null
+++ b/scripts/licensecheck.py
@@ -0,0 +1,201 @@
+#!/usr/bin/env python
+# Copyright (C) 2016 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.
+
+import argparse
+import errno
+import os
+import pipes
+import re
+import string
+import subprocess
+import sys
+import tempfile
+
+import scriptslib
+
+
+gpl3_chunks = ("autoconf",
+ "autoconf-tarball",
+ "automake",
+ "bash",
+ "binutils",
+ "bison",
+ "ccache",
+ "cmake",
+ "flex",
+ "gawk",
+ "gcc",
+ "gdbm",
+ "gettext-tarball",
+ "gperf",
+ "groff",
+ "libtool",
+ "libtool-tarball",
+ "m4-tarball",
+ "make",
+ "nano",
+ "patch",
+ "rsync",
+ "texinfo-tarball")
+
+
+def license_file_name(repo_name, sha, licenses_dir):
+ license_file = os.path.join(licenses_dir, repo_name + '-' + sha)
+ return license_file
+
+
+def check_license(repo_name, sha, clone_path, license_file):
+
+ licenses_dir = os.path.dirname(license_file)
+
+ try:
+ os.makedirs(licenses_dir)
+ except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise
+
+ _, license_file_temp = tempfile.mkstemp(dir=licenses_dir)
+ with open(license_file_temp,"wb") as out:
+ sys.stderr.write("Checking license of '%s' ...\n" % repo_name)
+ with open(os.devnull, 'w') as devnull:
+ subprocess.check_call("perl scripts/licensecheck.pl -r "
+ + pipes.quote(clone_path) + "|cut -d: -f2- | sort -u",
+ stdout=out, stderr=devnull, shell=True)
+
+ os.rename(license_file_temp, license_file)
+ return license_file
+
+
+def check_repo_if_needed(name, repo, ref, repos_dir, licenses_dir):
+ repo_name = re.split('/|:',repo)[-1]
+ if repo_name.endswith(".git"):
+ repo_name = repo_name[:-4]
+
+ repo_url = scriptslib.parse_repo_alias(repo)
+
+ # Check if ref is sha1 to speedup
+ if len(ref) == 40 and all(c in string.hexdigits for c in ref):
+ license_file = license_file_name(repo_name, ref, licenses_dir)
+ if os.path.isfile(license_file):
+ return (repo, license_file)
+
+ clone_path = os.path.join(repos_dir, repo_name)
+
+ if os.path.isdir(clone_path):
+ sys.stderr.write("Updating repo '%s' ...\n" % repo_name)
+ with open(os.devnull, 'w') as devnull:
+ subprocess.check_call([
+ "git", "remote", "update", "origin", "--prune"],
+ stderr=devnull, stdout=devnull, cwd=clone_path)
+ # Update submodules
+ subprocess.check_call(
+ ["git", "submodule", "update", "--recursive"],
+ stderr=devnull, stdout=devnull, cwd=clone_path)
+ subprocess.check_call(["git", "checkout", ref], stderr=devnull,
+ stdout=devnull, cwd=clone_path)
+ else:
+ sys.stderr.write("Getting repo '%s' ...\n" % repo_name)
+ with open(os.devnull, 'w') as devnull:
+ try:
+ # Attempt to use morph to obtain a repository, from morph's
+ # existing local git cache if possible
+ subprocess.check_call(
+ ["morph", "get-repo", name, clone_path],
+ stdout=devnull, stderr=devnull)
+
+ except (OSError, subprocess.CalledProcessError):
+ # Fall back to git clone, when morph hasn't been found on the
+ # system, or otherwise fails to get a repo. This is required
+ # where morph isn't available, e.g. when using YBD to build.
+ # YBD currently doesn't offer a similar 'get-repo' feature.
+ sys.stderr.write("Falling back to git clone.\n")
+ subprocess.check_call(
+ ["git", "clone", "--recursive", repo_url, clone_path],
+ stdout=devnull, stderr=devnull) # also clone submodules
+
+ sha = subprocess.check_output(
+ ["git", "rev-parse", "HEAD"], cwd=clone_path).strip()
+
+ license_file = license_file_name(repo_name, sha, licenses_dir)
+ if os.path.isfile(license_file):
+ return (repo, license_file)
+
+ return (repo, check_license(repo_name, sha, clone_path, license_file))
+
+
+def check_stratum(stratum_file, repos_dir, licenses_dir):
+ stratum = scriptslib.load_yaml_file(stratum_file)
+ license_files = []
+ for chunk in stratum['chunks']:
+
+ name = chunk["name"]
+ build_mode = chunk.get("build-mode") # Allowed to be None
+
+ # Don't include bootstrap chunks and stripped gplv3 chunks
+ if name in gpl3_chunks or build_mode == "bootstrap":
+ continue
+ repo = chunk["repo"]
+ ref = chunk["ref"]
+ yield check_repo_if_needed(name, repo, ref, repos_dir, licenses_dir)
+
+
+def main():
+
+ parser = argparse.ArgumentParser(
+ description='Checks licenses of the components of a given System.')
+ parser.add_argument('system', metavar='SYSTEM', type=str,
+ help='System to check for licenses')
+ parser.add_argument('--repos-dir', default="./repos",
+ help='DIR to clone all the repos (default ./repos)')
+ parser.add_argument('--licenses-dir', default="./licenses",
+ help='DIR to store chunk license files (default ./licenses)')
+
+ args = parser.parse_args()
+
+ if not os.path.exists(args.repos_dir):
+ os.makedirs(args.repos_dir)
+
+ system = scriptslib.load_yaml_file(args.system)
+ license_files = []
+ for stratum in system['strata']:
+ stratum_file = stratum['morph']
+ stratum_path = os.path.join(scriptslib.definitions_root(), stratum_file)
+ license_files.extend(check_stratum(stratum_path, args.repos_dir, args.licenses_dir))
+
+ for chunk_repo, chunk_license in license_files:
+ try:
+ # Print repo name
+ sys.stdout.write("%s\n%s\n" % (chunk_repo, '-' * len(chunk_repo)))
+
+ # Print license file of the repo
+ with open(chunk_license, 'r') as f:
+ for line in f:
+ sys.stdout.write(line)
+ sys.stdout.write("\n")
+ except IOError:
+ # stdout is closed, no point in continuing
+ # Attempt to close them explicitly to prevent cleanup problems:
+ try:
+ sys.stdout.flush()
+ sys.stdout.close()
+ except IOError:
+ pass
+ finally:
+ exit()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/organize-morphologies.py b/scripts/organize-morphologies.py
new file mode 100755
index 00000000..3072c8f8
--- /dev/null
+++ b/scripts/organize-morphologies.py
@@ -0,0 +1,255 @@
+#!/usr/bin/env python
+# Copyright (C) 2014-2016 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.
+
+import json
+import morphlib
+import os
+import subprocess
+import sys
+import urllib
+import urllib2
+import urlparse
+import yaml
+import re
+import errno
+
+''' organize-morphologies.py:
+Tool for organizing morphologies in definitions.
+
+This script will move:
+ - cluster morphologies into clusters directory
+ - system morphologies into systems directory
+ - stratum morphologies into strata directory
+
+This script will download the chunk morphologies for every stratum
+and placed into strata/stratum_which_the_chunk_belongs_to directory.
+
+It also modifies the morphologies fields which points to some morpholgy
+which has been moved.
+'''
+
+
+def make_request(path):
+ server_url = 'http://git.baserock.org:8080/'
+ url = urlparse.urljoin(server_url, '/1.0/%s' % path)
+ handle = urllib2.urlopen(url)
+ return handle.read()
+
+def quote(*args):
+ return tuple(urllib.quote(string) for string in args)
+
+def cat_file(repo, ref, filename):
+ return make_request('files?repo=%s&ref=%s&filename=%s' %
+ quote(repo, ref, filename))
+
+# NOTE: This function reimplement part of morphlib's loader
+def sanitise_morphology_path(morph_field, morph_kind, belongs_to='None'):
+ '''This function receives the name or the morph field of one morphology
+ and returns the path of the morphology depending on the name, kind and
+ if it belongs to other morphologies.
+ '''
+ # Dictionary which match morphology's kind and morphology's
+ # directory in definitions.git
+ morph_dir = { 'chunk': 'chunks', 'stratum': 'strata',
+ 'system':'systems', 'cluster': 'clusters'}
+ # For chunks morphologies we need to know to which stratums
+ # belongs this chunk.
+ if morph_kind == 'chunk':
+ if belongs_to == '':
+ raise morphlib.Error('Chunk morphologies need the stratum name'
+ 'to create the path. Please add the stratum'
+ 'which belongs this morphology')
+ # Get the name of the chunk which we assume is at the end
+ # of the morph file
+ if '/' in morph_field:
+ morph_field = os.path.basename(morph_field)
+
+ # Add the stratum name to the chunk name
+ morph_field = os.path.join(belongs_to, morph_field)
+
+ # Reset the kind to stratum because chunk contains stratum
+ # name in its path.
+ morph_kind = 'stratum'
+
+ # Add the morphology path to the morph field.
+ if not morph_field.startswith(morph_dir[morph_kind]):
+ morph_field = os.path.join(morph_dir[morph_kind], morph_field)
+
+ # Add the morphology suffix if the morphology.
+ if not morph_field.endswith('.morph'):
+ morph_field = morph_field + '.morph'
+
+ return morph_field
+
+def create_directory(name, path):
+ directory = os.path.join(path, name)
+ try:
+ os.makedirs(directory)
+ except OSError as err:
+ if err.errno != errno.EEXIST:
+ raise err
+ else:
+ pass
+ return directory
+
+def move_file(morph, directory, path, loader):
+ if not morph.filename.startswith(directory):
+ filename = os.path.basename(morph.filename)
+ new_location = os.path.join(path, filename)
+ print '\nMoving %s into %s' % (filename, new_location)
+ subprocess.call(['git', 'mv', morph.filename, new_location])
+ morph.filename = new_location
+ loader.unset_defaults(morph)
+ loader.save_to_file(morph.filename, morph)
+
+def load_and_fix_chunk(chunk_str, loader, name):
+ try:
+ chunk_morph = loader.load_from_string(chunk_str)
+ except morphlib.morphloader.InvalidFieldError as err:
+ if "comments" in str(err):
+ # This error is caused because there are old morphologies which
+ # contain the field "comments" instead of "description".
+ # Replacing "comments" field by "description" will allow the morphology
+ # to pass parse_morphology_text check and ready to be written to a file.
+ fixed_chunk = loader.parse_morphology_text(chunk_str, name)
+ fixed_chunk['description'] = fixed_chunk.pop('comments')
+ print "WARNING: Invalid 'comments' field in " \
+ "%s corrected to 'description'" % name
+ chunk_morph = load_and_fix_chunk(str(fixed_chunk), loader, name)
+ elif "buildsystem" in str(err):
+ # This error is caused because a typo in a morphology which
+ # has a field "buildsystem" instead of "build-system".
+ fixed_chunk = loader.parse_morphology_text(chunk_str, name)
+ fixed_chunk['build-system'] = fixed_chunk.pop('buildsystem')
+ print "WARNING: Invalid 'buildsystem' field in %s" \
+ "corrected to 'build-system'" % name
+ chunk_morph = load_and_fix_chunk(str(fixed_chunk), loader, name)
+ else:
+ print "ERROR: %s in chunk %s" %(err, name)
+ raise err
+ except morphlib.morphloader.MorphologyNotYamlError as err:
+ print "WARNING: %s in chunk %s is not valid YAML, " \
+ "attempting to fix..." %(err, name)
+ # This error is caused because there are old morphologies written
+ # in JSON which contain '\t' characters. When try to load this
+ # kind of morphologies load_from_string fails when parse_morphology_text.
+ # Removing this characters will make load_from_string to load the morphology
+ # and translate it into a correct yaml format.
+ fixed_chunk = chunk_str.replace('\t','')
+ print "INFO: %s successfully fixed" % name
+ chunk_morph = load_and_fix_chunk(fixed_chunk, loader, name)
+ return chunk_morph
+
+def move_clusters(morphs, path, loader):
+ kind = 'system'
+ directory = 'clusters'
+ # Move cluster morphologies to clusters folder fixing their dependent
+ # morphologies which are systems.
+ full_path = create_directory(directory, path)
+ for morph in morphs:
+ all_systems = morph['systems'][:]
+ for system in morph['systems']:
+ all_systems.extend(system.get('subsystems', []))
+ # Add the correct path to the morph fields for systems and subsystems
+ for field in all_systems:
+ field['morph'] = sanitise_morphology_path(field['morph'], kind)
+ move_file(morph, directory, full_path, loader)
+
+def move_systems(morphs, path, loader):
+ kind = 'stratum'
+ directory = 'systems'
+ # Move system morphologies to systems folder fixing their dependent
+ # morphologies which are strata.
+ full_path = create_directory(directory, path)
+ for morph in morphs:
+ # Add name field and the correct path to the stratum on the morph
+ # fields in strata.
+ for field in morph['strata']:
+ field['name'] = os.path.basename(field['morph'])
+ field['morph'] = sanitise_morphology_path(field['morph'], kind)
+ move_file(morph, directory, full_path, loader)
+
+def download_chunks(morph, loader):
+ # Download chunks morphologies defined on the stratum and
+ # add them to the directory tree.
+ for chunk in morph['chunks']:
+ name = chunk['name'] + '.morph'
+ try:
+ chunk['morph'] = sanitise_morphology_path(chunk['morph'], 'chunk', morph['name'])
+ except KeyError as err:
+ if 'morph' in str(err):
+ chunk['morph'] = sanitise_morphology_path(chunk['name'], 'chunk', morph['name'])
+ else:
+ raise err
+ ref = chunk['ref']
+ repo = scriptslib.parse_repo_alias(chunk['repo'])
+ try:
+ print "\nDownloading %s from %s into %s" %(name, repo, chunk['morph'])
+ chunk_str = cat_file(repo, ref, name)
+ except urllib2.HTTPError as err:
+ # If there is no morphology in the repository we assume that the morphology
+ # system will be autodetected, so we don't have to create a new one
+ # unless we shut down the autodetecting system (fallback system).
+ if err.code == 404:
+ print 'INFO: Morph will fall-back to build-time' \
+ 'autodetection for %s' %(name)
+ # Remove morph field from autodetected chunks
+ del chunk['morph']
+ else:
+ loaded_chunk = load_and_fix_chunk(chunk_str, loader, name)
+ loader.unset_defaults(loaded_chunk)
+ loader.save_to_file(chunk['morph'], loaded_chunk)
+
+def move_strata(morphs, path, loader):
+ # Create strata directory
+ strata_dir = 'strata/'
+ strata_path = create_directory(strata_dir, path)
+ for morph in morphs:
+ # Create stratum directory where downloading its chunks.
+ stratum_path = strata_path + morph['name']
+ stratum_dir = create_directory(stratum_path, path)
+
+ # Download chunks which belongs to the stratum
+ download_chunks(morph, loader)
+
+ # Add to build-depends the correct path to the dependent stratum morphologies.
+ for build_depends in morph['build-depends']:
+ build_depends['morph'] = sanitise_morphology_path(build_depends['morph'], 'stratum')
+ # Move stratum morphologies to strata
+ move_file(morph, strata_dir, strata_path, loader)
+
+def main():
+ # Load all morphologies in the definitions repo
+ sb = morphlib.sysbranchdir.open_from_within('.')
+ loader = morphlib.morphloader.MorphologyLoader()
+ morphs = [m for m in sb.load_all_morphologies(loader)]
+
+ # Clasify the morphologies regarding of their kind field
+ morphologies = { kind: [m for m in morphs if m['kind'] == kind]
+ for kind in ('chunk', 'stratum', 'system', 'cluster') }
+
+ for kind, morphs in morphologies.iteritems():
+ print 'There are: %d %s.\n' %(len(morphs), kind)
+
+ # Get the path from definitions repo
+ definitions_repo = sb.get_git_directory_name(sb.root_repository_url)
+
+ # Move the morphologies to its directories
+ move_clusters(morphologies['cluster'], definitions_repo, loader)
+ move_systems(morphologies['system'], definitions_repo, loader)
+ move_strata(morphologies['stratum'], definitions_repo, loader)
+
+main()
diff --git a/scripts/release-build b/scripts/release-build
new file mode 100755
index 00000000..cb62f661
--- /dev/null
+++ b/scripts/release-build
@@ -0,0 +1,192 @@
+#!/usr/bin/env python
+# Copyright (C) 2014 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.
+
+
+import cliapp
+import morphlib
+import os
+import subprocess
+import sys
+import time
+
+
+class Build(object):
+ '''A single distbuild instance.'''
+
+ def __init__(self, name, arch, app):
+ self.system_name = name
+
+ controller_netloc = app.controllers[arch].split(':')
+ controller_args = [
+ '--controller-initiator-address=%s' % controller_netloc[0],
+ ]
+ if len(controller_netloc) > 1:
+ controller_args.append(
+ '--controller-initiator-port=%s' % controller_netloc[1])
+
+ self.command = ['morph', 'distbuild', '--local-changes=ignore']
+ self.command += controller_args + [self.system_name]
+
+ def start(self):
+ self.process = subprocess.Popen(self.command)
+
+ def completed(self):
+ return (self.process.poll() is not None)
+
+
+class ReleaseApp(cliapp.Application):
+
+ '''Cliapp app that handles distbuilding and deploying a cluster.'''
+
+ def add_settings(self):
+ self.settings.string_list(['controllers'],
+ 'a list of distbuild controllers and their '
+ 'architecture')
+
+ self.settings.string(['trove-host'],
+ 'hostname of Trove instance')
+
+ self.settings.string(['artifact-cache-server'],
+ 'server to fetch artifacts from', default=None)
+
+ self.settings.string(['release-number'],
+ 'Baserock version of the systems being built',
+ default='yy.ww')
+
+ def error(self, message):
+ raise cliapp.AppException(message)
+
+ def check_args(self, args):
+ if len(args) == 0:
+ self.error(
+ "Please pass the name of the release cluster (e.g. "
+ "clusters/release.morph)")
+
+ if len(args) > 1:
+ self.error("Too many arguments given.")
+
+ def process_args(self, args):
+ '''Process the command line'''
+ self.controllers = {}
+ controllers_list = self.settings['controllers']
+
+ for item in controllers_list:
+ arch, controller = item.split(':', 1)
+ self.controllers[arch] = controller
+
+ defs_repo = morphlib.definitions_repo.open(
+ '.', search_for_root=True)
+ self.loader = defs_repo.get_morphology_loader()
+ self.finder = morphlib.morphologyfinder.MorphologyFinder(defs_repo)
+
+ self.check_args(args)
+
+ cluster_name = args[0]
+ cluster, cluster_path = self.load_morphology(cluster_name)
+
+ builds = self.prepare_builds(cluster)
+ for build in builds:
+ build.start()
+
+ while not all(build.completed() for build in builds):
+ time.sleep(1)
+
+ fail = False
+ for build in builds:
+ if build.process.returncode != 0:
+ fail = True
+ sys.stderr.write(
+ 'Building failed for %s\n' % build.system_name)
+ if fail:
+ raise cliapp.AppException('Building of systems failed')
+
+ if not os.path.exists('release'):
+ os.mkdir('release')
+ self.deploy_images(cluster, cluster_path)
+
+ def load_morphology(self, name, kind=None):
+ path = morphlib.util.sanitise_morphology_path(name)
+ morph = self.loader.load_from_string(
+ self.finder.read_file(path))
+ if kind:
+ assert morph['kind'] == kind
+ return morph, path
+
+ def iterate_systems(self, system_list):
+ for system in system_list:
+ yield system['morph']
+ if 'subsystems' in system:
+ for subsystem in self.iterate_systems(system['subsystems']):
+ yield subsystem
+
+ def prepare_builds(self, cluster):
+ '''Prepare a list of builds'''
+ systems = set(self.iterate_systems(cluster['systems']))
+ builds = []
+ for system_name in systems:
+ system, _ = self.load_morphology(system_name)
+ if system['arch'] in self.controllers:
+ builds.append(Build(system_name, system['arch'], self))
+ else:
+ print("Unable to build %s: no %s distbuild available" %
+ (system_name, system['arch']))
+ return builds
+
+ def deploy_images(self, cluster, cluster_path):
+ version_label = 'baserock-%s' % self.settings['release-number']
+ outputs = {}
+
+ for system in cluster['systems']:
+ morphology_name = system['morph']
+ morphology = self.load_morphology(morphology_name)[0]
+ if morphology['arch'] not in self.controllers:
+ continue
+
+ for deployment_name, deployment_info in system['deploy'].iteritems():
+ # The release.morph cluster must specify a basename for the file,
+ # of name and extension. This script knows about name, but it
+ # can't find out the appropriate file extension without second
+ # guessing the behaviour of write extensions.
+ basename = deployment_info['location']
+
+ if '/' in basename or basename.startswith(version_label):
+ raise cliapp.AppException(
+ 'In %s: system %s.location should be just the base name, '
+ 'e.g. "%s.img"' % (cluster_path, deployment_name, deployment_name))
+
+ filename = os.path.join('release', '%s-%s' % (version_label, basename))
+ if os.path.exists(filename):
+ self.output.write('Reusing existing deployment of %s\n' % filename)
+ else:
+ self.output.write('Creating %s from release.morph\n' % filename)
+ self.deploy_single_image(cluster_path, deployment_name, filename, version_label)
+
+ def deploy_single_image(self, cluster_path, name, location, version_label):
+ deploy_command = [
+ 'morph', 'deploy', cluster_path, name,
+ '--trove-host=%s' % self.settings['trove-host']]
+ artifact_server = self.settings['artifact-cache-server']
+ if artifact_server is not None:
+ deploy_command.append('--artifact-cache-server=%s' % artifact_server)
+ deploy_command.extend((
+ '%s.location=%s' % (name, location),
+ '%s.VERSION_LABEL=%s' % (name, version_label)
+ ))
+
+ cliapp.runcmd(deploy_command, stdout=sys.stdout)
+
+
+ReleaseApp().run()
diff --git a/scripts/release-build.test.conf b/scripts/release-build.test.conf
new file mode 100644
index 00000000..50083352
--- /dev/null
+++ b/scripts/release-build.test.conf
@@ -0,0 +1,6 @@
+[config]
+trove-host = ct-mcr-1.ducie.codethink.co.uk
+controllers = x86_64:ct-mcr-1-distbuild-x86-64-majikthise-controller.dyn.ducie.codethink.co.uk,
+ x86_32:ct-mcr-1-distbuild-x86-32-majikthise-controller.dyn.ducie.codethink.co.uk,
+ armv7lhf:ct-mcr-1-distbuild-armv7lhf-jetson.dyn.ducie.codethink.co.uk
+release-number = 14.29
diff --git a/scripts/release-test b/scripts/release-test
new file mode 100755
index 00000000..4dcc6f76
--- /dev/null
+++ b/scripts/release-test
@@ -0,0 +1,400 @@
+#!/usr/bin/env python
+#
+# 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.
+
+'''release-test
+
+This script deploys the set of systems in the cluster morphology it is
+instructed to read, to test that they work correctly.
+
+'''
+
+import cliapp
+import os
+import pipes
+import shlex
+import shutil
+import socket
+import tempfile
+import time
+import uuid
+
+import morphlib
+
+
+class MorphologyHelper(object):
+
+ def __init__(self):
+ self.defs_repo = morphlib.definitions_repo.open(
+ '.', search_for_root=True)
+ self.loader = morphlib.morphloader.MorphologyLoader()
+ self.finder = morphlib.morphologyfinder.MorphologyFinder(self.defs_repo)
+
+ def load_morphology(self, path):
+ text = self.finder.read_file(path)
+ return self.loader.load_from_string(text)
+
+ @classmethod
+ def iterate_systems(cls, systems_list):
+ for system in systems_list:
+ yield morphlib.util.sanitise_morphology_path(system['morph'])
+ if 'subsystems' in system:
+ for subsystem in cls.iterate_systems(system['subsystems']):
+ yield subsystem
+
+ def iterate_cluster_deployments(cls, cluster_morph):
+ for system in cluster_morph['systems']:
+ path = morphlib.util.sanitise_morphology_path(system['morph'])
+ defaults = system.get('deploy-defaults', {})
+ for name, options in system['deploy'].iteritems():
+ config = dict(defaults)
+ config.update(options)
+ yield path, name, config
+
+ def load_cluster_systems(self, cluster_morph):
+ for system_path in set(self.iterate_systems(cluster_morph['systems'])):
+ system_morph = self.load_morphology(system_path)
+ yield system_path, system_morph
+
+
+class TimeoutError(cliapp.AppException):
+
+ """Error to be raised when a connection waits too long"""
+
+ def __init__(self, msg):
+ super(TimeoutError, self).__init__(msg)
+
+
+class VMHost(object):
+
+ def __init__(self, user, address, disk_path):
+ self.user = user
+ self.address = address
+ self.disk_path = disk_path
+
+ @property
+ def ssh_host(self):
+ return '{user}@{address}'.format(user=self.user, address=self.address)
+
+ def runcmd(self, *args, **kwargs):
+ cliapp.ssh_runcmd(self.ssh_host, *args, **kwargs)
+
+ def virsh(self, *args, **kwargs):
+ self.runcmd(['virsh', '-c', 'qemu:///system'] + list(args), **kwargs)
+
+
+class DeployedSystemInstance(object):
+
+ def __init__(self, deployment, config, host_machine, vm_id, rootfs_path):
+ self.deployment = deployment
+ self.config = config
+ # TODO: Stop assuming test machine can DHCP and be assigned its
+ # hostname in the deployer's resolve search path.
+ self.ip_address = self.config['HOSTNAME']
+ self.host_machine = host_machine
+ self.vm_id = vm_id
+ self.rootfs_path = rootfs_path
+
+ @property
+ def ssh_host(self):
+ # TODO: Stop assuming we ssh into test instances as root
+ return 'root@{host}'.format(host=self.ip_address)
+
+ def runcmd(self, argv, chdir='.', **kwargs):
+ ssh_cmd = ['ssh', '-o', 'StrictHostKeyChecking=no',
+ '-o', 'UserKnownHostsFile=/dev/null', self.ssh_host]
+ cmd = ['sh', '-c', 'cd "$1" && shift && exec "$@"', '-', chdir]
+ cmd += argv
+ ssh_cmd.append(' '.join(map(pipes.quote, cmd)))
+ return cliapp.runcmd(ssh_cmd, **kwargs)
+
+ def _wait_for_dhcp(self, timeout):
+ '''Block until given hostname resolves successfully.
+
+ Raises TimeoutError if the hostname has not appeared in 'timeout'
+ seconds.
+
+ '''
+ start_time = time.time()
+ while True:
+ try:
+ socket.gethostbyname(self.ip_address)
+ return
+ except socket.gaierror:
+ pass
+ if time.time() > start_time + timeout:
+ raise TimeoutError("Host %s did not appear after %i seconds" %
+ (self.ip_address, timeout))
+ time.sleep(0.5)
+
+ def _wait_for_ssh(self, timeout):
+ """Wait until the deployed VM is responding via SSH"""
+ start_time = time.time()
+ while True:
+ try:
+ self.runcmd(['true'], stdin=None, stdout=None, stderr=None)
+ return
+ except cliapp.AppException:
+ # TODO: Stop assuming the ssh part of the command is what failed
+ if time.time() > start_time + timeout:
+ raise TimeoutError("%s sshd did not start after %i seconds"
+ % (self.ip_address, timeout))
+ time.sleep(0.5)
+
+ def wait_until_online(self, timeout=10):
+ self._wait_for_dhcp(timeout)
+ self._wait_for_ssh(timeout)
+
+ def delete(self):
+ # Stop and remove VM
+ try:
+ self.host_machine.virsh('destroy', self.vm_id)
+ except cliapp.AppException as e:
+ # TODO: Stop assuming that destroy failed because it wasn't running
+ pass
+ try:
+ self.host_machine.virsh('undefine', self.vm_id, '--remove-all-storage')
+ except cliapp.AppException as e:
+ # TODO: Stop assuming that undefine failed because it was
+ # already removed
+ pass
+
+
+class Deployment(object):
+
+ def __init__(self, cluster_path, name, deployment_config, host_machine):
+ self.cluster_path = cluster_path
+ self.name = name
+ self.deployment_config = deployment_config
+ self.host_machine = host_machine
+
+ @staticmethod
+ def _ssh_host_key_exists(hostname):
+ """Check if an ssh host key exists in known_hosts"""
+ if not os.path.exists('/root/.ssh/known_hosts'):
+ return False
+ with open('/root/.ssh/known_hosts', 'r') as known_hosts:
+ return any(line.startswith(hostname) for line in known_hosts)
+
+ def _update_known_hosts(self):
+ if not self._ssh_host_key_exists(self.host_machine.address):
+ with open('/root/.ssh/known_hosts', 'a') as known_hosts:
+ cliapp.runcmd(['ssh-keyscan', self.host_machine.address],
+ stdout=known_hosts)
+
+ @staticmethod
+ def _generate_sshkey_config(tempdir, config):
+ manifest = os.path.join(tempdir, 'manifest')
+ with open(manifest, 'w') as f:
+ f.write('0040700 0 0 /root/.ssh\n')
+ f.write('overwrite 0100600 0 0 /root/.ssh/authorized_keys\n')
+ authkeys = os.path.join(tempdir, 'root', '.ssh', 'authorized_keys')
+ os.makedirs(os.path.dirname(authkeys))
+ with open(authkeys, 'w') as auth_f:
+ with open('/root/.ssh/id_rsa.pub', 'r') as key_f:
+ shutil.copyfileobj(key_f, auth_f)
+
+ install_files = shlex.split(config.get('INSTALL_FILES', ''))
+ install_files.append(manifest)
+ yield 'INSTALL_FILES', ' '.join(pipes.quote(f) for f in install_files)
+
+ def deploy(self):
+ self._update_known_hosts()
+
+ hostname = str(uuid.uuid4())
+ vm_id = hostname
+ image_base = self.host_machine.disk_path
+ rootpath = '{image_base}/{hostname}.img'.format(image_base=image_base,
+ hostname=hostname)
+ loc = 'kvm+ssh://{ssh_host}/{id}/{path}'.format(
+ ssh_host=self.host_machine.ssh_host, id=vm_id, path=rootpath)
+
+ options = {
+ 'type': 'kvm',
+ 'location': loc,
+ 'AUTOSTART': 'True',
+ 'HOSTNAME': hostname,
+ 'DISK_SIZE': '20G',
+ 'RAM_SIZE': '2G',
+ 'VERSION_LABEL': 'release-test',
+ }
+
+ tempdir = tempfile.mkdtemp()
+ try:
+ options.update(
+ self._generate_sshkey_config(tempdir,
+ self.deployment_config))
+
+ args = ['morph', 'deploy', self.cluster_path, self.name]
+ for k, v in options.iteritems():
+ args.append('%s.%s=%s' % (self.name, k, v))
+ cliapp.runcmd(args, stdin=None, stdout=None, stderr=None)
+
+ config = dict(self.deployment_config)
+ config.update(options)
+
+ return DeployedSystemInstance(self, config, self.host_machine,
+ vm_id, rootpath)
+ finally:
+ shutil.rmtree(tempdir)
+
+
+class ReleaseApp(cliapp.Application):
+
+ """Cliapp application which handles automatic builds and tests"""
+
+ def add_settings(self):
+ """Add the command line options needed"""
+ group_main = 'Program Options'
+ self.settings.string_list(['deployment-host'],
+ 'ARCH:HOST:PATH that VMs can be deployed to',
+ default=None,
+ group=group_main)
+ self.settings.string(['trove-host'],
+ 'Address of Trove for test systems to build from',
+ default=None,
+ group=group_main)
+ self.settings.string(['trove-id'],
+ 'ID of Trove for test systems to build from',
+ default=None,
+ group=group_main)
+ self.settings.string(['build-ref-prefix'],
+ 'Prefix of build branches for test systems',
+ default=None,
+ group=group_main)
+
+ @staticmethod
+ def _run_tests(instance, system_path, system_morph,
+ (trove_host, trove_id, build_ref_prefix),
+ morph_helper, systems):
+ instance.wait_until_online()
+
+ tests = []
+ def baserock_build_test(instance):
+ instance.runcmd(['git', 'config', '--global', 'user.name',
+ 'Test Instance of %s' % instance.deployment.name])
+ instance.runcmd(['git', 'config', '--global', 'user.email',
+ 'ci-test@%s' % instance.config['HOSTNAME']])
+ instance.runcmd(['mkdir', '-p', '/src/ws', '/src/cache',
+ '/src/tmp'])
+ def morph_cmd(*args, **kwargs):
+ # TODO: decide whether to use cached artifacts or not by
+ # adding --artifact-cache-server= --cache-server=
+ argv = ['morph', '--log=/src/morph.log', '--cachedir=/src/cache',
+ '--tempdir=/src/tmp', '--log-max=100M',
+ '--trove-host', trove_host, '--trove-id', trove_id,
+ '--build-ref-prefix', build_ref_prefix]
+ argv.extend(args)
+ instance.runcmd(argv, **kwargs)
+
+ repo = morph_helper.sb.root_repository_url
+ ref = morph_helper.defs_repo.HEAD
+ sha1 = morph_helper.defs_repo.resolve_ref_to_commit(ref)
+ morph_cmd('init', '/src/ws')
+ chdir = '/src/ws'
+
+ morph_cmd('checkout', repo, ref, chdir=chdir)
+ # TODO: Add a morph subcommand that gives the path to the root repository.
+ repo_path = os.path.relpath(
+ morph_helper.sb.get_git_directory_name(repo),
+ morph_helper.sb.root_directory)
+ chdir = os.path.join(chdir, ref, repo_path)
+
+ instance.runcmd(['git', 'reset', '--hard', sha1], chdir=chdir)
+ print 'Building test systems for {sys}'.format(sys=system_path)
+ for to_build_path, to_build_morph in systems.iteritems():
+ if to_build_morph['arch'] == system_morph['arch']:
+ print 'Test building {path}'.format(path=to_build_path)
+ morph_cmd('build', to_build_path, chdir=chdir,
+ stdin=None, stdout=None, stderr=None)
+ print 'Finished Building test systems'
+
+ def python_smoke_test(instance):
+ instance.runcmd(['python', '-c', 'print "Hello World"'])
+
+ # TODO: Come up with a better way of determining which tests to run
+ if 'devel' in system_path:
+ tests.append(baserock_build_test)
+ else:
+ tests.append(python_smoke_test)
+
+ for test in tests:
+ test(instance)
+
+ def deploy_and_test_systems(self, cluster_path,
+ deployment_hosts, build_test_config):
+ """Run the deployments and tests"""
+
+ version = 'release-test'
+
+ morph_helper = MorphologyHelper()
+ cluster_morph = morph_helper.load_morphology(cluster_path)
+ systems = dict(morph_helper.load_cluster_systems(cluster_morph))
+
+ for system_path, deployment_name, deployment_config in \
+ morph_helper.iterate_cluster_deployments(cluster_morph):
+
+ system_morph = systems[system_path]
+ # We can only test systems in KVM that have a BSP
+ if not any('bsp' in si['morph'] for si in system_morph['strata']):
+ continue
+
+ # We can only test systems in KVM that we have a host for
+ if system_morph['arch'] not in deployment_hosts:
+ continue
+ host_machine = deployment_hosts[system_morph['arch']]
+ deployment = Deployment(cluster_path, deployment_name,
+ deployment_config, host_machine)
+
+ instance = deployment.deploy()
+ try:
+ self._run_tests(instance, system_path, system_morph,
+ build_test_config, morph_helper, systems)
+ finally:
+ instance.delete()
+
+ def process_args(self, args):
+ """Process the command line args and kick off the builds/tests"""
+ if self.settings['build-ref-prefix'] is None:
+ self.settings['build-ref-prefix'] = (
+ os.path.join(self.settings['trove-id'], 'builds'))
+ for setting in ('deployment-host', 'trove-host',
+ 'trove-id', 'build-ref-prefix'):
+ self.settings.require(setting)
+
+ deployment_hosts = {}
+ for host_config in self.settings['deployment-host']:
+ arch, address = host_config.split(':', 1)
+ user, address = address.split('@', 1)
+ address, disk_path = address.split(':', 1)
+ if user == '':
+ user = 'root'
+ # TODO: Don't assume root is the user with deploy access
+ deployment_hosts[arch] = VMHost(user, address, disk_path)
+
+ build_test_config = (self.settings['trove-host'],
+ self.settings['trove-id'],
+ self.settings['build-ref-prefix'])
+
+ if len(args) != 1:
+ raise cliapp.AppException('Usage: release-test CLUSTER')
+ cluster_path = morphlib.util.sanitise_morphology_path(args[0])
+ self.deploy_and_test_systems(cluster_path, deployment_hosts,
+ build_test_config)
+
+
+if __name__ == '__main__':
+ ReleaseApp().run()
diff --git a/scripts/release-test-os b/scripts/release-test-os
new file mode 100755
index 00000000..06e01daf
--- /dev/null
+++ b/scripts/release-test-os
@@ -0,0 +1,526 @@
+#!/usr/bin/env python
+#
+# 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.
+
+'''release-test
+
+This script deploys the set of systems in the cluster morphology it is
+instructed to read, to test that they work correctly.
+
+'''
+
+import cliapp
+import os
+import pipes
+import shlex
+import shutil
+import socket
+import tempfile
+import time
+import uuid
+
+import morphlib
+
+
+class NovaList:
+ def __init__(self):
+ self.output = []
+ self.lines = []
+ self.instance = []
+
+ def update(self):
+ self.output = cliapp.runcmd(['nova', 'list'])
+ self.lines = self.output.split('\n')
+ self.lines = self.lines[3:-2]
+
+ def get_nova_details_for_instance(self, name):
+ self.update()
+
+ for line in self.lines:
+ entries = line.split('|')
+ stripped_line = [entry.strip() for entry in entries]
+ if stripped_line.count(name) == 1:
+ self.instance = stripped_line
+
+ def get_nova_state_for_instance(self, name):
+ self.get_nova_details_for_instance(name)
+ if not self.instance:
+ return
+ return self.instance[3]
+
+ def get_nova_ip_for_instance(self, name):
+ self.get_nova_details_for_instance(name)
+ if not self.instance:
+ return
+
+ if self.get_nova_state_for_instance(name) != 'ACTIVE':
+ return
+
+ return self.instance[6]
+
+ def get_nova_ip_for_instance_timeout(self, name, timeout=120):
+ start_time = time.time()
+
+ while self.get_nova_state_for_instance(name) != 'ACTIVE':
+
+ if time.time() > start_time + timeout:
+ print "%s not ACTIVE after %i seconds" % (name, timeout)
+ return
+
+ time.sleep(1)
+
+ ip_addr = self.get_nova_ip_for_instance(name)
+ if not ip_addr:
+ return
+
+ if ip_addr.count('=') == 0:
+ return
+
+ ip_addr = ip_addr[ip_addr.find('=') + 1:]
+
+ if ip_addr.count(',') == 0:
+ return ip_addr
+
+ return ip_addr[:ip_addr.find(',')]
+
+
+
+class MorphologyHelper(object):
+
+ def __init__(self):
+ self.sb = sb = morphlib.sysbranchdir.open_from_within('.')
+ defs_repo_path = sb.get_git_directory_name(sb.root_repository_url)
+ self.defs_repo = morphlib.gitdir.GitDirectory(defs_repo_path)
+ self.loader = morphlib.morphloader.MorphologyLoader()
+ self.finder = morphlib.morphologyfinder.MorphologyFinder(self.defs_repo)
+
+ def load_morphology(self, path):
+ text = self.finder.read_file(path)
+ return self.loader.load_from_string(text)
+
+ @classmethod
+ def iterate_systems(cls, systems_list):
+ for system in systems_list:
+ yield morphlib.util.sanitise_morphology_path(system['morph'])
+ if 'subsystems' in system:
+ for subsystem in cls.iterate_systems(system['subsystems']):
+ yield subsystem
+
+ def iterate_cluster_deployments(cls, cluster_morph):
+ for system in cluster_morph['systems']:
+ path = morphlib.util.sanitise_morphology_path(system['morph'])
+ defaults = system.get('deploy-defaults', {})
+ for name, options in system['deploy'].iteritems():
+ config = dict(defaults)
+ config.update(options)
+ yield path, name, config
+
+ def load_cluster_systems(self, cluster_morph):
+ for system_path in set(self.iterate_systems(cluster_morph['systems'])):
+ system_morph = self.load_morphology(system_path)
+ yield system_path, system_morph
+
+
+class TimeoutError(cliapp.AppException):
+
+ """Error to be raised when a connection waits too long"""
+
+ def __init__(self, msg):
+ super(TimeoutError, self).__init__(msg)
+
+
+class VMHost(object):
+
+ def __init__(self, user, address, disk_path):
+ self.user = user
+ self.address = address
+ self.disk_path = disk_path
+
+ @property
+ def ssh_host(self):
+ return '{user}@{address}'.format(user=self.user, address=self.address)
+
+ def runcmd(self, *args, **kwargs):
+ cliapp.ssh_runcmd(self.ssh_host, *args, **kwargs)
+
+
+class DeployedSystemInstance(object):
+
+ def __init__(self, deployment, config, host_machine, vm_id, rootfs_path,
+ ip_addr, hostname):
+ self.deployment = deployment
+ self.config = config
+ self.ip_address = ip_addr
+ self.host_machine = host_machine
+ self.vm_id = vm_id
+ self.rootfs_path = rootfs_path
+ self.hostname = hostname
+
+ @property
+ def ssh_host(self):
+ # TODO: Stop assuming we ssh into test instances as root
+ return 'root@{host}'.format(host=self.ip_address)
+
+ def runcmd(self, argv, chdir='.', **kwargs):
+ ssh_cmd = ['ssh', '-o', 'StrictHostKeyChecking=no',
+ '-o', 'UserKnownHostsFile=/dev/null', self.ssh_host]
+ cmd = ['sh', '-c', 'cd "$1" && shift && exec "$@"', '-', chdir]
+ cmd += argv
+ ssh_cmd.append(' '.join(map(pipes.quote, cmd)))
+ return cliapp.runcmd(ssh_cmd, **kwargs)
+
+ def _wait_for_dhcp(self, timeout):
+ '''Block until given hostname resolves successfully.
+
+ Raises TimeoutError if the hostname has not appeared in 'timeout'
+ seconds.
+
+ '''
+ start_time = time.time()
+ while True:
+ try:
+ socket.gethostbyname(self.ip_address)
+ return
+ except socket.gaierror:
+ pass
+ if time.time() > start_time + timeout:
+ raise TimeoutError("Host %s did not appear after %i seconds" %
+ (self.ip_address, timeout))
+ time.sleep(0.5)
+
+ def _wait_for_ssh(self, timeout):
+ """Wait until the deployed VM is responding via SSH"""
+ start_time = time.time()
+ while True:
+ try:
+ self.runcmd(['true'], stdin=None, stdout=None, stderr=None)
+ return
+ except cliapp.AppException:
+ # TODO: Stop assuming the ssh part of the command is what failed
+ if time.time() > start_time + timeout:
+ raise TimeoutError("%s sshd did not start after %i seconds"
+ % (self.ip_address, timeout))
+ time.sleep(0.5)
+
+ def _wait_for_cloud_init(self, timeout):
+ """Wait until cloud init has resized the disc"""
+ start_time = time.time()
+ while True:
+ try:
+ out = self.runcmd(['sh', '-c',
+ 'test -e "$1" && echo exists || echo does not exist',
+ '-',
+ '/root/cloud-init-finished'])
+ except:
+ import traceback
+ traceback.print_exc()
+ raise
+ if out.strip() == 'exists':
+ return
+ if time.time() > start_time + timeout:
+ raise TimeoutError("Disc size not increased after %i seconds"
+ % (timeout))
+ time.sleep(3)
+
+ def wait_until_online(self, timeout=120):
+ self._wait_for_dhcp(timeout)
+ self._wait_for_ssh(timeout)
+ self._wait_for_cloud_init(timeout)
+ print "Test system %s ready to run tests." % (self.hostname)
+
+ def delete(self):
+ # Stop and remove VM
+ print "Deleting %s test instance" % (self.hostname)
+ try:
+ cliapp.runcmd(['nova', 'delete', self.hostname])
+ except cliapp.AppException as e:
+ # TODO: Stop assuming that delete failed because the instance
+ # wasn't running
+ print "- Failed"
+ pass
+ print "Deleting %s test disc image" % (self.hostname)
+ try:
+ cliapp.runcmd(['nova', 'image-delete', self.hostname])
+ except cliapp.AppException as e:
+ # TODO: Stop assuming that image-delete failed because it was
+ # already removed
+ print "- Failed"
+ pass
+
+
+class Deployment(object):
+
+ def __init__(self, cluster_path, name, deployment_config,
+ host_machine, net_id):
+ self.cluster_path = cluster_path
+ self.name = name
+ self.deployment_config = deployment_config
+ self.host_machine = host_machine
+ self.net_id = net_id
+
+ @staticmethod
+ def _ssh_host_key_exists(hostname):
+ """Check if an ssh host key exists in known_hosts"""
+ if not os.path.exists('/root/.ssh/known_hosts'):
+ return False
+ with open('/root/.ssh/known_hosts', 'r') as known_hosts:
+ return any(line.startswith(hostname) for line in known_hosts)
+
+ def _update_known_hosts(self):
+ if not self._ssh_host_key_exists(self.host_machine.address):
+ with open('/root/.ssh/known_hosts', 'a') as known_hosts:
+ cliapp.runcmd(['ssh-keyscan', self.host_machine.address],
+ stdout=known_hosts)
+
+ @staticmethod
+ def _generate_sshkey_config(tempdir, config):
+ manifest = os.path.join(tempdir, 'manifest')
+ with open(manifest, 'w') as f:
+ f.write('0040700 0 0 /root/.ssh\n')
+ f.write('overwrite 0100600 0 0 /root/.ssh/authorized_keys\n')
+ authkeys = os.path.join(tempdir, 'root', '.ssh', 'authorized_keys')
+ os.makedirs(os.path.dirname(authkeys))
+ with open(authkeys, 'w') as auth_f:
+ with open('/root/.ssh/id_rsa.pub', 'r') as key_f:
+ shutil.copyfileobj(key_f, auth_f)
+
+ install_files = shlex.split(config.get('INSTALL_FILES', ''))
+ install_files.append(manifest)
+ yield 'INSTALL_FILES', ' '.join(pipes.quote(f) for f in install_files)
+
+ def deploy(self):
+ self._update_known_hosts()
+
+ hostname = str(uuid.uuid4())
+ vm_id = hostname
+ image_base = self.host_machine.disk_path
+ rootpath = '{image_base}/{hostname}.img'.format(image_base=image_base,
+ hostname=hostname)
+ loc = 'http://{ssh_host}:5000/v2.0'.format(
+ ssh_host=self.host_machine.ssh_host, id=vm_id, path=rootpath)
+
+ options = {
+ 'type': 'openstack',
+ 'location': loc,
+ 'HOSTNAME': hostname,
+ 'DISK_SIZE': '5G',
+ 'RAM_SIZE': '2G',
+ 'VERSION_LABEL': 'release-test',
+ 'OPENSTACK_USER': os.environ['OS_USERNAME'],
+ 'OPENSTACK_TENANT': os.environ['OS_TENANT_NAME'],
+ 'OPENSTACK_PASSWORD': os.environ['OS_PASSWORD'],
+ 'OPENSTACK_IMAGENAME': hostname,
+ 'CLOUD_INIT': 'yes',
+ 'KERNEL_ARGS': 'console=tty0 console=ttyS0',
+ }
+
+ tempdir = tempfile.mkdtemp()
+ try:
+ options.update(
+ self._generate_sshkey_config(tempdir,
+ self.deployment_config))
+
+ # Deploy the image to openstack
+ args = ['morph', 'deploy', self.cluster_path, self.name]
+ for k, v in options.iteritems():
+ args.append('%s.%s=%s' % (self.name, k, v))
+ cliapp.runcmd(args, stdin=None, stdout=None, stderr=None)
+
+ config = dict(self.deployment_config)
+ config.update(options)
+
+ # Boot an instance from the image
+ args = ['nova', 'boot',
+ '--flavor', 'm1.medium',
+ '--image', hostname,
+ '--user-data', '/usr/lib/mason/os-init-script',
+ '--nic', "net-id=%s" % (self.net_id),
+ hostname]
+ output = cliapp.runcmd(args)
+
+ # Print nova boot output, with adminPass line removed
+ output_lines = output.split('\n')
+ for line in output_lines:
+ if line.find('adminPass') != -1:
+ password_line = line
+ output_lines.remove(password_line)
+ output = '\n'.join(output_lines)
+ print output
+
+ # Get ip address from nova list
+ nl = NovaList()
+ ip_addr = nl.get_nova_ip_for_instance_timeout(hostname)
+ print "IP address for instance %s: %s" % (hostname, ip_addr)
+
+ return DeployedSystemInstance(self, config, self.host_machine,
+ vm_id, rootpath, ip_addr, hostname)
+ finally:
+ shutil.rmtree(tempdir)
+
+
+class ReleaseApp(cliapp.Application):
+
+ """Cliapp application which handles automatic builds and tests"""
+
+ def add_settings(self):
+ """Add the command line options needed"""
+ group_main = 'Program Options'
+ self.settings.string_list(['deployment-host'],
+ 'ARCH:HOST:PATH that VMs can be deployed to',
+ default=None,
+ group=group_main)
+ self.settings.string(['trove-host'],
+ 'Address of Trove for test systems to build from',
+ default=None,
+ group=group_main)
+ self.settings.string(['trove-id'],
+ 'ID of Trove for test systems to build from',
+ default=None,
+ group=group_main)
+ self.settings.string(['build-ref-prefix'],
+ 'Prefix of build branches for test systems',
+ default=None,
+ group=group_main)
+ self.settings.string(['net-id'],
+ 'Openstack network ID',
+ default=None,
+ group=group_main)
+
+ @staticmethod
+ def _run_tests(instance, system_path, system_morph,
+ (trove_host, trove_id, build_ref_prefix),
+ morph_helper, systems):
+ instance.wait_until_online()
+
+ tests = []
+ def baserock_build_test(instance):
+ instance.runcmd(['git', 'config', '--global', 'user.name',
+ 'Test Instance of %s' % instance.deployment.name])
+ instance.runcmd(['git', 'config', '--global', 'user.email',
+ 'ci-test@%s' % instance.config['HOSTNAME']])
+ instance.runcmd(['mkdir', '-p', '/src/ws', '/src/cache',
+ '/src/tmp'])
+ def morph_cmd(*args, **kwargs):
+ # TODO: decide whether to use cached artifacts or not by
+ # adding --artifact-cache-server= --cache-server=
+ argv = ['morph', '--log=/src/morph.log', '--cachedir=/src/cache',
+ '--tempdir=/src/tmp', '--log-max=100M',
+ '--trove-host', trove_host, '--trove-id', trove_id,
+ '--build-ref-prefix', build_ref_prefix]
+ argv.extend(args)
+ instance.runcmd(argv, **kwargs)
+
+ repo = morph_helper.sb.root_repository_url
+ ref = morph_helper.defs_repo.HEAD
+ sha1 = morph_helper.defs_repo.resolve_ref_to_commit(ref)
+ morph_cmd('init', '/src/ws')
+ chdir = '/src/ws'
+
+ morph_cmd('checkout', repo, ref, chdir=chdir)
+ # TODO: Add a morph subcommand that gives the path to the root repository.
+ repo_path = os.path.relpath(
+ morph_helper.sb.get_git_directory_name(repo),
+ morph_helper.sb.root_directory)
+ chdir = os.path.join(chdir, ref, repo_path)
+
+ instance.runcmd(['git', 'reset', '--hard', sha1], chdir=chdir)
+ print 'Building test systems for {sys}'.format(sys=system_path)
+ for to_build_path, to_build_morph in systems.iteritems():
+ if to_build_morph['arch'] == system_morph['arch']:
+ print 'Test building {path}'.format(path=to_build_path)
+ morph_cmd('build', to_build_path, chdir=chdir,
+ stdin=None, stdout=None, stderr=None)
+ print 'Finished Building test systems'
+
+ def python_smoke_test(instance):
+ instance.runcmd(['python', '-c', 'print "Hello World"'])
+
+ # TODO: Come up with a better way of determining which tests to run
+ if 'devel' in system_path:
+ tests.append(baserock_build_test)
+ else:
+ tests.append(python_smoke_test)
+
+ for test in tests:
+ test(instance)
+
+ def deploy_and_test_systems(self, cluster_path,
+ deployment_hosts, build_test_config,
+ net_id):
+ """Run the deployments and tests"""
+
+ version = 'release-test'
+
+ morph_helper = MorphologyHelper()
+ cluster_morph = morph_helper.load_morphology(cluster_path)
+ systems = dict(morph_helper.load_cluster_systems(cluster_morph))
+
+ for system_path, deployment_name, deployment_config in \
+ morph_helper.iterate_cluster_deployments(cluster_morph):
+
+ system_morph = systems[system_path]
+ # We can only test systems in KVM that have a BSP
+ if not any('bsp' in si['morph'] for si in system_morph['strata']):
+ continue
+
+ # We can only test systems in KVM that we have a host for
+ if system_morph['arch'] not in deployment_hosts:
+ continue
+ host_machine = deployment_hosts[system_morph['arch']]
+ deployment = Deployment(cluster_path, deployment_name,
+ deployment_config, host_machine,
+ net_id)
+
+ instance = deployment.deploy()
+ try:
+ self._run_tests(instance, system_path, system_morph,
+ build_test_config, morph_helper, systems)
+ finally:
+ instance.delete()
+
+ def process_args(self, args):
+ """Process the command line args and kick off the builds/tests"""
+ if self.settings['build-ref-prefix'] is None:
+ self.settings['build-ref-prefix'] = (
+ os.path.join(self.settings['trove-id'], 'builds'))
+ for setting in ('deployment-host', 'trove-host',
+ 'trove-id', 'build-ref-prefix', 'net-id'):
+ self.settings.require(setting)
+
+ deployment_hosts = {}
+ for host_config in self.settings['deployment-host']:
+ arch, address = host_config.split(':', 1)
+ user, address = address.split('@', 1)
+ address, disk_path = address.split(':', 1)
+ if user == '':
+ user = 'root'
+ # TODO: Don't assume root is the user with deploy access
+ deployment_hosts[arch] = VMHost(user, address, disk_path)
+
+ build_test_config = (self.settings['trove-host'],
+ self.settings['trove-id'],
+ self.settings['build-ref-prefix'])
+
+ if len(args) != 1:
+ raise cliapp.AppException('Usage: release-test CLUSTER')
+ cluster_path = morphlib.util.sanitise_morphology_path(args[0])
+ self.deploy_and_test_systems(cluster_path, deployment_hosts,
+ build_test_config,
+ self.settings['net-id'])
+
+
+if __name__ == '__main__':
+ ReleaseApp().run()
diff --git a/scripts/release-upload b/scripts/release-upload
new file mode 100755
index 00000000..f8b3337c
--- /dev/null
+++ b/scripts/release-upload
@@ -0,0 +1,473 @@
+#!/usr/bin/python
+# Copyright (C) 2014 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.
+
+
+'''Upload and publish Baserock binaries for a release.
+
+This utility is used for the Baserock release process. See
+http://wiki.baserock.org/guides/release-process/ for details on the
+release process.
+
+This utility uploads two sets of binaries:
+
+* The build artifacts (built chunks and strata) used to construct the
+ systems being released. The systems are found in `release.morph` and
+ the artifacts from the Trove used to prepare the release. They get
+ uploaded to a public Trove (by default git.baserock.org). If they're
+ the same Trove, then nothing happens.
+
+* The released system images (disk images, tar archives, etc)
+ specified in `release.morph` get uploaded to a download server (by
+ default download.baserock.org).
+
+'''
+
+
+import json
+import logging
+import os
+import pwd
+import shutil
+import sys
+import urllib
+import urllib2
+import urlparse
+
+import cliapp
+import yaml
+
+import morphlib
+
+class ReleaseUploader(cliapp.Application):
+
+ def add_settings(self):
+ group = 'Release upload settings'
+
+ local_username = self.get_local_username()
+
+ self.settings.string(
+ ['build-trove-host'],
+ 'get build artifacts from Trove at ADDRESS',
+ metavar='ADDRESS',
+ group=group)
+
+ self.settings.string(
+ ['public-trove-host'],
+ 'publish build artifacts on Trove at ADDRESS',
+ metavar='ADDRESS',
+ default='git.baserock.org',
+ group=group)
+
+ self.settings.string(
+ ['public-trove-username'],
+ 'log into public trove as USER',
+ metavar='USER',
+ default=local_username,
+ group=group)
+
+ self.settings.string(
+ ['public-trove-artifact-dir'],
+ 'put published artifacts into DIR',
+ metavar='DIR',
+ default='/home/cache/artifacts',
+ group=group)
+
+ self.settings.string(
+ ['release-artifact-dir'],
+ 'get release artifacts from DIR (all files from there)',
+ metavar='DIR',
+ default='.',
+ group=group)
+
+ self.settings.string(
+ ['download-server-address'],
+ 'publish release artifacts on server at ADDRESS',
+ metavar='ADDRESS',
+ default='download.baserock.org',
+ group=group)
+
+ self.settings.string(
+ ['download-server-username'],
+ 'log into download server as USER',
+ metavar='USER',
+ default=local_username,
+ group=group)
+
+ self.settings.string(
+ ['download-server-private-dir'],
+ 'use DIR as the temporary location for uploaded release '
+ 'artifacts',
+ metavar='DIR',
+ default='/srv/download.baserock.org/baserock/.publish-temp',
+ group=group)
+
+ self.settings.string(
+ ['download-server-public-dir'],
+ 'put published release artifacts in DIR',
+ metavar='DIR',
+ default='/srv/download.baserock.org/baserock',
+ group=group)
+
+ self.settings.string(
+ ['local-build-artifacts-dir'],
+ 'keep build artifacts to be uploaded temporarily in DIR',
+ metavar='DIR',
+ default='build-artifacts',
+ group=group)
+
+ self.settings.string(
+ ['morph-cmd'],
+ 'run FILE to invoke morph',
+ metavar='FILE',
+ default='morph',
+ group=group)
+
+ self.settings.string_list(
+ ['arch'],
+ 'Upload files from morphologies of ARCH',
+ metavar='ARCH',
+ default=[],
+ group=group)
+
+ self.settings.boolean(
+ ['upload-build-artifacts'],
+ 'upload build artifacts?',
+ default=True)
+
+ self.settings.boolean(
+ ['upload-release-artifacts'],
+ 'upload release artifacts (disk images etc)?',
+ default=True)
+
+ def get_local_username(self):
+ uid = os.getuid()
+ return pwd.getpwuid(uid)[0]
+
+ def process_args(self, args):
+ if len(args) != 1:
+ raise cliapp.AppException('Usage: release-upload CLUSTER')
+ cluster_morphology_path = args[0]
+ self.status(msg='Uploading and publishing Baserock release')
+
+ if self.settings['upload-build-artifacts']:
+ self.publish_build_artifacts(cluster_morphology_path)
+ else:
+ self.status(
+ msg='Not uploading build artifacts '
+ '(upload-build-artifacts set to false')
+
+ if self.settings['upload-release-artifacts']:
+ self.publish_release_artifacts()
+ else:
+ self.status(
+ msg='Not uploading release artifacts '
+ '(upload-release-artifacts set to false')
+
+ def publish_build_artifacts(self, cluster_morphology_path):
+ publisher = BuildArtifactPublisher(self.settings, self.status)
+ publisher.publish_build_artifacts(cluster_morphology_path)
+ self.status(msg='Build artifacts have been published')
+
+ def publish_release_artifacts(self):
+ publisher = ReleaseArtifactPublisher(self.settings, self.status)
+ publisher.publish_release_artifacts()
+ self.status(msg='Release artifacts have been published')
+
+ def status(self, msg, **kwargs):
+ formatted = msg.format(**kwargs)
+ logging.info(formatted)
+ sys.stdout.write(formatted + '\n')
+ sys.stdout.flush()
+
+
+class BuildArtifactPublisher(object):
+
+ '''Publish build artifacts related to the release.'''
+
+ def __init__(self, settings, status):
+ self.settings = settings
+ self.status = status
+
+ def publish_build_artifacts(self, cluster_path):
+ artifact_basenames = self.list_build_artifacts_for_release(cluster_path)
+ self.status(
+ msg='Found {count} build artifact files in release',
+ count=len(artifact_basenames))
+
+ to_be_uploaded = self.filter_away_build_artifacts_on_public_trove(
+ artifact_basenames)
+
+ logging.debug('List of artifacts (basenames) to upload (without already uploaded):')
+ for i, basename in enumerate(to_be_uploaded):
+ logging.debug(' {0}: {1}'.format(i, basename))
+ logging.debug('End of artifact list (to_be_uploaded)')
+
+ self.status(
+ msg='Need to fetch locally, then upload {count} build artifacts',
+ count=len(to_be_uploaded))
+
+ self.upload_build_artifacts_to_public_trove(to_be_uploaded)
+
+ def list_build_artifacts_for_release(self, cluster_morphology_path):
+ self.status(msg='Find build artifacts included in release')
+
+ # FIXME: These are hardcoded for simplicity. They would be
+ # possible to deduce automatically from the workspace, but
+ # that can happen later.
+ repo = 'file://%s' % os.path.abspath('.')
+ ref = 'HEAD'
+
+ argv = [self.settings['morph-cmd'], 'list-artifacts', '--quiet',
+ '--repo', repo, '--ref', ref]
+ argv += self.find_system_morphologies(cluster_morphology_path)
+ output = cliapp.runcmd(argv)
+ basenames = output.splitlines()
+ logging.debug('List of build artifacts in release:')
+ for basename in basenames:
+ logging.debug(' {0}'.format(basename))
+ logging.debug('End of list of build artifacts in release')
+
+ return basenames
+
+ def find_system_morphologies(self, cluster_morphology_path):
+ cluster = self.load_cluster_morphology(cluster_morphology_path)
+ system_dicts = self.find_systems_in_parsed_cluster_morphology(cluster)
+ if self.settings['arch']:
+ system_dicts = self.choose_systems_for_wanted_architectures(
+ system_dicts, self.settings['arch'])
+ return [sd['morph'] for sd in system_dicts]
+
+ def load_cluster_morphology(self, pathname):
+ with open(pathname) as f:
+ return yaml.load(f)
+
+ def find_systems_in_parsed_cluster_morphology(self, cluster):
+ return cluster['systems']
+
+ def choose_systems_for_wanted_architectures(self, system_dicts, archs):
+ return [
+ sd
+ for sd in system_dicts
+ if self.system_is_for_wanted_arch(sd, archs)]
+
+ def system_is_for_wanted_arch(self, system_dict, archs):
+ morph = self.load_system_morphology(system_dict)
+ return morph['arch'] in archs
+
+ def load_system_morphology(self, system_dict):
+ pathname = morphlib.util.sanitise_morphology_path(system_dict['morph'])
+ return self.load_morphology_from_named_file(pathname)
+
+ def load_morphology_from_named_file(self, pathname):
+ finder = self.get_morphology_finder_for_root_repository()
+ morphology_text = finder.read_file(pathname)
+ loader = morphlib.morphloader.MorphologyLoader()
+ return loader.load_from_string(morphology_text)
+
+ def get_morphology_finder_for_root_repository(self):
+ definitions_repo = morphlib.definitions_repo.open(
+ '.', search_for_root=True)
+ return morphlib.morphologyfinder.MorphologyFinder(definitions_repo)
+
+ def filter_away_build_artifacts_on_public_trove(self, basenames):
+ result = []
+ logging.debug('Filtering away already existing artifacts:')
+ for basename, exists in self.query_public_trove_for_artifacts(basenames):
+ logging.debug(' {0}: {1}'.format(basename, exists))
+ if not exists:
+ result.append(basename)
+ logging.debug('End of filtering away')
+ return result
+
+ def query_public_trove_for_artifacts(self, basenames):
+ host = self.settings['public-trove-host']
+
+ # FIXME: This could use
+ # contextlib.closing(urllib2.urlopen(url, data=data) instead
+ # of explicit closing.
+ url = 'http://{host}:8080/1.0/artifacts'.format(host=host)
+ data = json.dumps(basenames)
+ f = urllib2.urlopen(url, data=data)
+ obj = json.load(f)
+ return obj.items()
+
+ def upload_build_artifacts_to_public_trove(self, basenames):
+ self.download_artifacts_locally(basenames)
+ self.upload_artifacts_to_public_trove(basenames)
+
+ def download_artifacts_locally(self, basenames):
+ dirname = self.settings['local-build-artifacts-dir']
+ self.create_directory_if_missing(dirname)
+ for i, basename in enumerate(basenames):
+ url = self.construct_artifact_url(basename)
+ pathname = os.path.join(dirname, basename)
+ if not os.path.exists(pathname):
+ self.status(
+ msg='Downloading {i}/{total} {basename}',
+ basename=repr(basename), i=i, total=len(basenames))
+ self.download_from_url(url, dirname, pathname)
+
+ def create_directory_if_missing(self, dirname):
+ if not os.path.exists(dirname):
+ os.makedirs(dirname)
+
+ def construct_artifact_url(self, basename):
+ scheme = 'http'
+ netloc = '{host}:8080'.format(host=self.settings['build-trove-host'])
+ path = '/1.0/artifacts'
+ query = 'filename={0}'.format(urllib.quote_plus(basename))
+ fragment = ''
+ components = (scheme, netloc, path, query, fragment)
+ return urlparse.urlunsplit(components)
+
+ def download_from_url(self, url, dirname, pathname):
+ logging.info(
+ 'Downloading {url} to {pathname}'.format(
+ url=url, pathname=pathname))
+ with open(pathname, 'wb') as output:
+ try:
+ incoming = urllib2.urlopen(url)
+ shutil.copyfileobj(incoming, output)
+ incoming.close()
+ except urllib2.HTTPError as e:
+ if pathname.endswith('.meta'):
+ return
+ self.status(
+ msg="ERROR: Can't download {url}: {explanation}",
+ url=url,
+ explanation=str(e))
+ os.remove(pathname)
+ raise
+
+ def upload_artifacts_to_public_trove(self, basenames):
+ self.status(
+ msg='Upload build artifacts to {trove}',
+ trove=self.settings['public-trove-host'])
+ rsync_files_to_server(
+ self.settings['local-build-artifacts-dir'],
+ basenames,
+ self.settings['public-trove-username'],
+ self.settings['public-trove-host'],
+ self.settings['public-trove-artifact-dir'])
+ set_permissions_on_server(
+ self.settings['public-trove-username'],
+ self.settings['public-trove-host'],
+ self.settings['public-trove-artifact-dir'],
+ basenames)
+
+class ReleaseArtifactPublisher(object):
+
+ '''Publish release artifacts for a release.'''
+
+ def __init__(self, settings, status):
+ self.settings = settings
+ self.status = status
+
+ def publish_release_artifacts(self):
+ files = self.list_release_artifacts()
+ if files:
+ self.upload_release_artifacts_to_private_dir(files)
+ self.move_release_artifacts_to_public_dir(files)
+ self.create_symlinks_to_new_release_artifacts(files)
+
+ def list_release_artifacts(self):
+ self.status(msg='Find release artifacts to publish')
+ return os.listdir(self.settings['release-artifact-dir'])
+
+ def upload_release_artifacts_to_private_dir(self, files):
+ self.status(msg='Upload release artifacts to private directory')
+ path = self.settings['download-server-private-dir']
+ self.create_directory_on_download_server(path)
+ self.rsync_files_to_download_server(files, path)
+
+ def create_directory_on_download_server(self, path):
+ user = self.settings['download-server-username']
+ host = self.settings['download-server-address']
+ self.status(msg='Create {host}:{path}', host=host, path=path)
+ target = '{user}@{host}'.format(user=user, host=host)
+ cliapp.ssh_runcmd(target, ['mkdir', '-p', path])
+
+ def rsync_files_to_download_server(self, files, path):
+ self.status(msg='Upload release artifacts to download server')
+ rsync_files_to_server(
+ self.settings['release-artifact-dir'],
+ files,
+ self.settings['download-server-username'],
+ self.settings['download-server-address'],
+ path)
+ set_permissions_on_server(
+ self.settings['download-server-username'],
+ self.settings['download-server-address'],
+ path,
+ files)
+
+ def move_release_artifacts_to_public_dir(self, files):
+ self.status(msg='Move release artifacts to public directory')
+ private_dir = self.settings['download-server-private-dir']
+ public_dir = self.settings['download-server-public-dir']
+ self.create_directory_on_download_server(public_dir)
+
+ # Move just the contents of the private dir, not the dir
+ # itself (-mindepth). Avoid overwriting existing files (mv
+ # -n).
+ argv = ['find', private_dir, '-mindepth', '1',
+ '-exec', 'mv', '-n', '{}', public_dir + '/.', ';']
+
+ target = '{user}@{host}'.format(
+ user=self.settings['download-server-username'],
+ host=self.settings['download-server-address'])
+ cliapp.ssh_runcmd(target, argv)
+
+ def create_symlinks_to_new_release_artifacts(self, files):
+ self.status(msg='FIXME: Create symlinks to new releas artifacts')
+
+
+def rsync_files_to_server(
+ source_dir, source_filenames, user, host, target_dir):
+
+ if not source_filenames:
+ return
+
+ argv = [
+ 'rsync',
+ '-a',
+ '--progress',
+ '--partial',
+ '--human-readable',
+ '--sparse',
+ '--protect-args',
+ '-0',
+ '--files-from=-',
+ source_dir,
+ '{user}@{host}:{path}'.format(user=user, host=host, path=target_dir),
+ ]
+
+ files_list = '\0'.join(filename for filename in source_filenames)
+ cliapp.runcmd(argv, feed_stdin=files_list, stdout=None, stderr=None)
+
+
+def set_permissions_on_server(user, host, target_dir, filenames):
+ # If we have no files, we can't form a valid command to run on the server
+ if not filenames:
+ return
+ target = '{user}@{host}'.format(user=user, host=host)
+ argv = ['xargs', '-0', 'chmod', '0644']
+ files_list = ''.join(
+ '{0}\0'.format(os.path.join(target_dir, filename)) for filename in filenames)
+ cliapp.ssh_runcmd(target, argv, feed_stdin=files_list, stdout=None, stderr=None)
+
+
+ReleaseUploader(description=__doc__).run()
diff --git a/scripts/release-upload.test.conf b/scripts/release-upload.test.conf
new file mode 100644
index 00000000..13227983
--- /dev/null
+++ b/scripts/release-upload.test.conf
@@ -0,0 +1,10 @@
+[config]
+download-server-address = localhost
+download-server-private-dir = /tmp/private
+download-server-public-dir = /tmp/public
+build-trove-host = ct-mcr-1.ducie.codethink.co.uk
+public-trove-host = localhost
+public-trove-username = root
+public-trove-artifact-dir = /tmp/artifacts
+release-artifact-dir = t.release-files
+morph-cmd = /home/root/git-morph
diff --git a/scripts/scriptslib.py b/scripts/scriptslib.py
new file mode 100644
index 00000000..53c6ca8e
--- /dev/null
+++ b/scripts/scriptslib.py
@@ -0,0 +1,156 @@
+# Copyright (C) 2016 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.
+
+# Small library of useful things for the scripts that live here.
+
+import yaml
+import subprocess
+import os
+import sys
+
+aliases = {
+ 'baserock:': 'git://%(trove)s/baserock/',
+ 'freedesktop:': 'git://anongit.freedesktop.org/',
+ 'github:': 'git://github.com/',
+ 'gnome:': 'git://git.gnome.org/',
+ 'upstream:': 'git://%(trove)s/delta/'
+}
+
+def parse_repo_alias(repo, trove_host='git.baserock.org'):
+ global aliases
+ remote = repo[:repo.find(':') + 1]
+ aliases = {k: v % {'trove': trove_host} for k, v in aliases.iteritems()}
+ try:
+ return repo.replace(remote, aliases[remote])
+ except KeyError as e:
+ raise Exception("Unknown repo-alias \"%s\"" % repo)
+
+def definitions_root():
+ return subprocess.check_output(
+ ["git", "rev-parse", "--show-toplevel"]).strip()
+
+def load_yaml_file(yaml_file):
+ with open(yaml_file, 'r') as f:
+ return yaml.safe_load(f)
+
+
+class BaserockMeta(object):
+ '''An object representing Baserock metadata contained in a Baserock
+ system image, for available metadata formats'''
+
+ def __init__(self):
+ self.metas = {}
+
+ def get_each(self):
+ '''Yield an iterable for the whole list of metas'''
+ for key in self.metas:
+ yield self.metas[key]
+
+ def get_name(self, name):
+ '''Yield an iterable of metadata matched by name, e.g. `bash`'''
+ for key in self.metas:
+ if self.metas[key]['source-name'] == name:
+ yield self.metas[key]
+
+ def import_meta(self, meta_text):
+ importers = (self.import_meta_ybd,
+ self.import_meta_morph)
+
+ for i in importers:
+ try:
+ i(meta_text)
+ return
+ except (KeyError, Exception) as err:
+ pass
+
+ # Shouldn't get here
+ sys.stderr.write('Metadata format not recognised.\n'
+ 'Error:\n')
+ raise err
+
+ def import_meta_morph(self, meta_text):
+ self._add_meta(yaml.load(meta_text))
+
+ def import_meta_ybd(self, meta_text):
+ source = yaml.load(meta_text)
+
+ null = '0' * 32
+
+ if 'configuration' in source:
+ # This is the deployment metadata, ignore
+ return
+ elif 'repo' not in source:
+ kind = 'stratum'
+ contents = 'components'
+ source['repo'] = 'upstream:definitions'
+ source['ref'] = null # No ref info
+ else:
+ kind = 'chunk'
+ contents = 'components'
+
+ repo = parse_repo_alias(source['repo'])
+ source_name = '-'.join(
+ source['products'][0]['artifact'].split('-')[:-1])
+
+ # Needed until YBD provides cache-key in metadata
+ if not 'cache-key' in source:
+ source['cache-key'] = null
+
+ for product in source['products']:
+
+ self._add_meta({
+ 'kind': kind,
+ 'source-name': source_name,
+ 'artifact-name': product['artifact'],
+ 'contents': product[contents],
+ 'repo': repo,
+ 'repo-alias': source['repo'],
+ 'sha1': source['ref'],
+ 'original_ref': source['ref'],
+ 'cache-key': source['cache-key']
+ })
+
+ def _add_meta(self, meta_dict):
+ '''Validate and add a meta'''
+
+ ignore = ('configuration',
+ 'system-artifact-name')
+
+ for i in ignore:
+ if i in meta_dict:
+ return
+
+ required_fields = ('repo', 'sha1', 'contents')
+ for f in required_fields:
+ if not f in meta_dict:
+ raise Exception('Metadata format not recognised, no '
+ 'value for \'%s\'. Data: \'%s\''% (f, str(meta_dict)))
+
+ self.metas[meta_dict['artifact-name']] = meta_dict
+
+
+def meta_load_from_dir(meta_dir_path):
+ '''Read Baserock metadata from a directory'''
+
+ files = [f for f in os.listdir(meta_dir_path)
+ if os.path.isfile(os.path.join(meta_dir_path, f))]
+
+ meta = BaserockMeta()
+ for f in files:
+ if f.endswith('.meta'):
+ meta.import_meta(
+ open(os.path.join(meta_dir_path, f), 'r').read())
+
+ return meta
diff --git a/scripts/yaml-jsonschema b/scripts/yaml-jsonschema
new file mode 100755
index 00000000..64f52a79
--- /dev/null
+++ b/scripts/yaml-jsonschema
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+# 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 tool to validate YAML files against the JSON-Schema schemas.
+
+This wraps Python `jsonschema` module so that YAML schemas can be understood
+and YAML data can be validated.
+
+Usage: yaml-jsonschema SCHEMA INPUT1 [INPUT2, ...]
+
+'''
+
+
+import jsonschema
+import yaml
+
+import sys
+
+
+schema_file = sys.argv[1]
+input_files = sys.argv[2:]
+
+
+with open(schema_file) as f:
+ schema = yaml.load(f)
+
+
+for input_file in input_files:
+ with open(input_file) as f:
+ data = yaml.load(f)
+
+ try:
+ jsonschema.validate(data, schema)
+ print("%s: valid" % input_file)
+ except jsonschema.ValidationError as e:
+ # Print 'e' instead of 'e.message' for more information!
+ print("%s: %s" % (input_file, e.message))
diff --git a/strata/CPAN-Mini-Inject.morph b/strata/CPAN-Mini-Inject.morph
new file mode 100644
index 00000000..d4566bd3
--- /dev/null
+++ b/strata/CPAN-Mini-Inject.morph
@@ -0,0 +1,306 @@
+name: CPAN-Mini-Inject
+kind: stratum
+description: A collection of perl distributions used by CPAN::Mini::Inject
+build-depends:
+- morph: strata/core.morph
+- morph: strata/perl-common.morph
+chunks:
+- name: Archive-Zip
+ repo: upstream:cpan/Archive-Zip-tarball
+ ref: 42c8b23669eac442a303190dad44d78cea63cf59
+ unpetrify-ref: Archive-Zip-1.49
+ build-system: cpan
+- name: CPAN-DistnameInfo
+ repo: upstream:cpan/CPAN-DistnameInfo-tarball
+ ref: 56f58177bddb4002f0dc57811fe0f72a8fc9e479
+ unpetrify-ref: CPAN-DistnameInfo-0.12
+ build-system: cpan
+- name: Compress-Bzip2
+ repo: upstream:cpan/Compress-Bzip2-tarball
+ ref: efd32dfb6c52e28f3b158930b64f986ff8760409
+ unpetrify-ref: Compress-Bzip2-2.22
+ build-system: cpan
+- name: Encode-Locale
+ repo: upstream:cpan/Encode-Locale-tarball
+ ref: e4bf16d2fde5df6eadd91475e3dcca56b87b1eb0
+ unpetrify-ref: Encode-Locale-1.05
+ build-system: cpan
+- name: File-Slurp
+ repo: upstream:cpan/File-Slurp-tarball
+ ref: 9d4173f2716c2f9a2d26f8f9ab0f47b351b87de7
+ unpetrify-ref: File-Slurp-9999.19
+ build-system: cpan
+- name: File-Spec-Native
+ repo: upstream:cpan/File-Spec-Native-tarball
+ ref: 475e3c7cb559a68109d8c90ab8ff0b6a37c98793
+ unpetrify-ref: File-Spec-Native-1.004
+ build-system: cpan
+- name: File-Which
+ repo: upstream:cpan/File-Which-tarball
+ ref: a276db189a656a4cc5881a2ebc4cad3113685030
+ unpetrify-ref: File-Which-1.19
+ build-system: cpan
+- name: File-HomeDir
+ repo: upstream:cpan/File-HomeDir-tarball
+ ref: d08b8685307cd5e8980f3c9409d4b3c1d06b2c24
+ unpetrify-ref: File-HomeDir-1.00
+ build-system: cpan
+ build-depends:
+ - File-Which
+- name: HTML-Tagset
+ repo: upstream:cpan/HTML-Tagset-tarball
+ ref: 85713405a9d0b06f3abba0c2ddfaab2077344e8f
+ unpetrify-ref: HTML-Tagset-3.20
+ build-system: cpan
+- name: HTML-Parser
+ repo: upstream:cpan/HTML-Parser-tarball
+ ref: 2f253cfc85ffd55a8acb988e91f0bc5ab348124c
+ unpetrify-ref: HTML-Parser-3.71
+ build-system: cpan
+ build-depends:
+ - HTML-Tagset
+- name: CGI
+ repo: upstream:cpan/CGI-tarball
+ ref: f9f3ab3056d94292adb4ab2e1451645bee989769
+ unpetrify-ref: CGI-4.21
+ build-system: cpan
+ build-depends:
+ - HTML-Tagset
+ - HTML-Parser
+- name: HTTP-Date
+ repo: upstream:cpan/HTTP-Date-tarball
+ ref: f1f9b3164e11c877ed5d509738551a56ac9b37f0
+ unpetrify-ref: HTTP-Date-6.02
+ build-system: cpan
+- name: File-Listing
+ repo: upstream:cpan/File-Listing-tarball
+ ref: c1655656f083337cbfd901455db96695890f2d89
+ unpetrify-ref: File-Listing-6.04
+ build-system: cpan
+ build-depends:
+ - HTTP-Date
+- name: HTTP-Server-Simple
+ repo: upstream:cpan/HTTP-Server-Simple-tarball
+ ref: e2d680ac7c6f0bb36808aa45e1453c8b585d2717
+ unpetrify-ref: HTTP-Server-Simple-0.50
+ build-system: cpan
+ build-depends:
+ - CGI
+ - HTML-Tagset
+ - HTML-Parser
+- name: IO-HTML
+ repo: upstream:cpan/IO-HTML-tarball
+ ref: adc9c8b29ed1144626af564f936811a9d5e319a6
+ unpetrify-ref: IO-HTML-1.001
+ build-system: cpan
+- name: LWP-MediaTypes
+ repo: upstream:cpan/LWP-MediaTypes-tarball
+ ref: d550937a3b104e53897b8f51dd528724f721858a
+ unpetrify-ref: LWP-MediaTypes-6.02
+ build-system: cpan
+- name: Number-Compare
+ repo: upstream:cpan/Number-Compare-tarball
+ ref: af206af84f17997c2967416423e9cdf516e17203
+ unpetrify-ref: Number-Compare-0.03
+ build-system: cpan
+- name: Path-Class
+ repo: upstream:cpan/Path-Class-tarball
+ ref: 5f549fcb4056f8b314c7f7336a020ef9735fb384
+ unpetrify-ref: Path-Class-0.35
+ build-system: cpan
+- name: Text-Glob
+ repo: upstream:cpan/Text-Glob-tarball
+ ref: 7c186823d68db1d2bd078fb91a95d30cd12890da
+ unpetrify-ref: Text-Glob-0.09
+ build-system: cpan
+- name: File-Find-Rule
+ repo: upstream:cpan/File-Find-Rule-tarball
+ ref: 5e7c9d8e7b80b54baa3f8161222b5a8e9077c0aa
+ unpetrify-ref: File-Find-Rule-0.33
+ build-system: cpan
+ build-depends:
+ - Text-Glob
+ - Number-Compare
+- name: Data-Compare
+ repo: upstream:cpan/Data-Compare-tarball
+ ref: 8fddd4400d09891094843fe9e77fec74e4510c67
+ unpetrify-ref: Data-Compare-1.25
+ build-system: cpan
+ build-depends:
+ - File-Find-Rule
+ - Text-Glob
+ - Number-Compare
+- name: CPAN-Checksums
+ repo: upstream:cpan/CPAN-Checksums-tarball
+ ref: 26d8d4d1d2a7a8ebcffc6ff5c6b13495f74dd129
+ unpetrify-ref: CPAN-Checksums-2.10
+ build-system: cpan
+ build-depends:
+ - Text-Glob
+ - Data-Compare
+ - File-Find-Rule
+ - Number-Compare
+ - Compress-Bzip2
+- name: Dist-Metadata
+ repo: upstream:cpan/Dist-Metadata-tarball
+ ref: 2ca9db53e3e8164ecf0c95bf93fa289019e1b92c
+ unpetrify-ref: Dist-Metadata-0.926
+ build-system: cpan
+ build-depends:
+ - Path-Class
+ - File-Spec-Native
+ - Archive-Zip
+ - CPAN-DistnameInfo
+- name: URI
+ repo: upstream:cpan/URI-tarball
+ ref: 9165b237ad8fae18b36d4d40d6e2ccfde7b136c7
+ unpetrify-ref: URI-1.69
+ build-system: cpan
+- name: Net-HTTP
+ repo: upstream:cpan/Net-HTTP-tarball
+ ref: 8780c70ceb3019aa50e129cb62daa3bfaebd0e82
+ unpetrify-ref: Net-HTTP-6.09
+ build-system: cpan
+ build-depends:
+ - URI
+- name: HTTP-Message
+ repo: upstream:cpan/HTTP-Message-tarball
+ ref: d403562e3f7ac96df7cee2c1709ecd970b6c9761
+ unpetrify-ref: HTTP-Message-6.10
+ build-system: cpan
+ build-depends:
+ - Encode-Locale
+ - HTTP-Date
+ - IO-HTML
+ - URI
+ - LWP-MediaTypes
+- name: HTTP-Negotiate
+ repo: upstream:cpan/HTTP-Negotiate-tarball
+ ref: ab7c5218426d7424b8f7b5c333870958ad6609da
+ unpetrify-ref: HTTP-Negotiate-6.01
+ build-system: cpan
+ build-depends:
+ - Encode-Locale
+ - HTTP-Date
+ - IO-HTML
+ - LWP-MediaTypes
+ - URI
+ - HTTP-Message
+- name: HTTP-Cookies
+ repo: upstream:cpan/HTTP-Cookies-tarball
+ ref: 4861af5daed8f4ba6d0041aed25e98f403d96fc0
+ unpetrify-ref: HTTP-Cookies-6.01
+ build-system: cpan
+ build-depends:
+ - Encode-Locale
+ - HTTP-Date
+ - IO-HTML
+ - URI
+ - LWP-MediaTypes
+ - HTTP-Message
+- name: HTTP-Daemon
+ repo: upstream:cpan/HTTP-Daemon-tarball
+ ref: 64ffbaec18717f99cb80441d8b474868e39939fb
+ unpetrify-ref: HTTP-Daemon-6.01
+ build-system: cpan
+ build-depends:
+ - Encode-Locale
+ - HTTP-Date
+ - IO-HTML
+ - LWP-MediaTypes
+ - URI
+ - HTTP-Message
+- name: WWW-RobotRules
+ repo: upstream:cpan/WWW-RobotRules-tarball
+ ref: 80c86924c3437c0ad64852ea29c7eab1197dfe90
+ unpetrify-ref: WWW-RobotRules-6.02
+ build-system: cpan
+ build-depends:
+ - URI
+- name: YAML
+ repo: upstream:cpan/YAML-tarball
+ ref: 2fe5b8de1e9d06482aa76303e7342bc6605700ea
+ unpetrify-ref: YAML-1.15
+ build-system: cpan
+- name: libwww-perl
+ repo: upstream:cpan/libwww-perl-tarball
+ ref: 20f161ca116b8a4fc7ac986a317d7f6d43e5c173
+ unpetrify-ref: libwww-perl-6.13
+ build-system: cpan
+ build-depends:
+ - Encode-Locale
+ - Net-HTTP
+ - HTTP-Daemon
+ - HTTP-Date
+ - HTTP-Negotiate
+ - HTTP-Message
+ - IO-HTML
+ - LWP-MediaTypes
+ - HTML-Tagset
+ - WWW-RobotRules
+ - HTTP-Cookies
+ - File-Listing
+ - HTML-Parser
+ - URI
+- name: CPAN-Mini
+ repo: upstream:cpan/CPAN-Mini-tarball
+ ref: 2a051e40a3fc09bba24c335060e8df327d313e55
+ unpetrify-ref: CPAN-Mini-1.111016
+ build-system: cpan
+ build-depends:
+ - Encode-Locale
+ - File-Which
+ - HTTP-Date
+ - HTTP-Cookies
+ - HTTP-Daemon
+ - LWP-MediaTypes
+ - HTTP-Negotiate
+ - File-Listing
+ - URI
+ - File-HomeDir
+ - HTML-Tagset
+ - HTTP-Message
+ - Net-HTTP
+ - IO-HTML
+ - libwww-perl
+ - HTML-Parser
+ - WWW-RobotRules
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject/CPAN-Mini-Inject.morph
+ repo: upstream:cpan/CPAN-Mini-Inject-tarball
+ ref: 74e30d582ac01d80a7f1b28af247d0a5ee913d55
+ unpetrify-ref: master
+ build-depends:
+ - File-Spec-Native
+ - HTTP-Negotiate
+ - LWP-MediaTypes
+ - Dist-Metadata
+ - File-Which
+ - Compress-Bzip2
+ - libwww-perl
+ - CGI
+ - File-Slurp
+ - IO-HTML
+ - Number-Compare
+ - CPAN-Mini
+ - HTML-Tagset
+ - HTTP-Server-Simple
+ - HTTP-Message
+ - File-HomeDir
+ - Path-Class
+ - Archive-Zip
+ - Text-Glob
+ - Data-Compare
+ - HTTP-Date
+ - URI
+ - File-Listing
+ - HTTP-Cookies
+ - CPAN-DistnameInfo
+ - HTML-Parser
+ - Encode-Locale
+ - HTTP-Daemon
+ - File-Find-Rule
+ - YAML
+ - WWW-RobotRules
+ - Net-HTTP
+ - CPAN-Checksums
diff --git a/strata/CPAN-Mini-Inject/CPAN-Mini-Inject.morph b/strata/CPAN-Mini-Inject/CPAN-Mini-Inject.morph
new file mode 100644
index 00000000..a92c26f3
--- /dev/null
+++ b/strata/CPAN-Mini-Inject/CPAN-Mini-Inject.morph
@@ -0,0 +1,3 @@
+name: CPAN-Mini-Inject
+kind: chunk
+build-system: module-build
diff --git a/strata/NetworkManager-common.morph b/strata/NetworkManager-common.morph
new file mode 100644
index 00000000..28a0f3bb
--- /dev/null
+++ b/strata/NetworkManager-common.morph
@@ -0,0 +1,47 @@
+name: NetworkManager-common
+kind: stratum
+build-depends:
+- morph: strata/bluetooth.morph
+- morph: strata/connectivity.morph
+- morph: strata/device-management.morph
+- morph: strata/network-security.morph
+- morph: strata/privileges-management.morph
+- morph: strata/python-pygobject.morph
+chunks:
+- name: libmbim
+ repo: upstream:libmbim
+ ref: 50cddf48823f05ec124afad80c0d948184e19b00
+ unpetrify-ref: 1.14.0
+ build-system: autotools
+- name: libqmi
+ repo: upstream:libqmi
+ ref: 7bdb9347cf08cf26ed8e420a11b358befa81824b
+ unpetrify-ref: 1.16.0
+ build-system: autotools
+- name: ModemManager
+ morph: strata/NetworkManager-common/ModemManager.morph
+ repo: upstream:ModemManager
+ ref: 397761c9758c3a8c2d130afaf36dab645d6e0ecf
+ unpetrify-ref: 1.6.0
+ build-depends:
+ - libmbim
+ - libqmi
+- name: libndp
+ repo: upstream:libndp
+ ref: 2f721c4ff519f38f46695a60d9f9d88f35bf3c1d
+ unpetrify-ref: v1.6
+ build-system: autotools
+- name: readline6
+ repo: upstream:readline
+ ref: 7628b745a813aac53586b640da056a975f1c443e
+ unpetrify-ref: readline-6.3
+ build-system: autotools
+- name: NetworkManager
+ morph: strata/NetworkManager-common/NetworkManager.morph
+ repo: upstream:NetworkManager
+ ref: 9ed1921ce3b8f1b856d97128913b33c7eeeed6e9
+ unpetrify-ref: 1.8.2
+ build-depends:
+ - ModemManager
+ - libndp
+ - readline6
diff --git a/strata/NetworkManager-common/ModemManager.morph b/strata/NetworkManager-common/ModemManager.morph
new file mode 100644
index 00000000..909f6eca
--- /dev/null
+++ b/strata/NetworkManager-common/ModemManager.morph
@@ -0,0 +1,9 @@
+name: ModemManager
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc
+system-integration:
+ ModemManager-misc:
+ 00-enable-ModemManager-unit:
+ - systemctl enable ModemManager
diff --git a/strata/NetworkManager-common/NetworkManager.morph b/strata/NetworkManager-common/NetworkManager.morph
new file mode 100644
index 00000000..4964fa2e
--- /dev/null
+++ b/strata/NetworkManager-common/NetworkManager.morph
@@ -0,0 +1,10 @@
+name: NetworkManager
+kind: chunk
+build-system: autotools
+configure-commands:
+- NOCONFIGURE=1 ./autogen.sh
+- PYTHON=python3 ./configure --prefix="$PREFIX" --sysconfdir=/etc --with-session-tracking=systemd --disable-ppp --enable-more-warnings=yes --disable-gtk-doc
+system-integration:
+ ModemManager-misc:
+ 00-enable-NetworkManager-unit:
+ - systemctl enable NetworkManager
diff --git a/strata/ansible.morph b/strata/ansible.morph
new file mode 100644
index 00000000..f21cb222
--- /dev/null
+++ b/strata/ansible.morph
@@ -0,0 +1,26 @@
+name: ansible
+kind: stratum
+description: A stratum with ansible and its dependencies
+build-depends:
+- morph: strata/core.morph
+- morph: strata/python-common.morph
+chunks:
+- name: ansible
+ morph: strata/ansible/ansible.morph
+ repo: upstream:ansible
+ ref: ebc8d48d34296fe010096f044e2b7591df37a622
+ unpetrify-ref: v1.8.4
+ submodules:
+ lib/ansible/modules/core:
+ url: upstream:ansible-modules-core.git
+ v2/ansible/modules/core:
+ url: upstream:ansible-modules-core.git
+ v2/ansible/modules/extras:
+ url: upstream:ansible-modules-extras.git
+ lib/ansible/modules/extras:
+ url: upstream:ansible-modules-extras.git
+- name: openstack-ansible-modules
+ morph: strata/ansible/openstack-ansible-modules.morph
+ repo: upstream:openstack/openstack-ansible-modules
+ ref: 451dcdeadfd35615a867d5e59a684e4aa82959ae
+ unpetrify-ref: master
diff --git a/strata/ansible/ansible.morph b/strata/ansible/ansible.morph
new file mode 100644
index 00000000..dbc6ec4b
--- /dev/null
+++ b/strata/ansible/ansible.morph
@@ -0,0 +1,9 @@
+name: ansible
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+- |
+ install -D -m644 /proc/self/fd/0 "$DESTDIR/etc/ansible/ansible.cfg" <<EOF
+ [defaults]
+ log_path=/var/log/ansible
+ EOF
diff --git a/strata/ansible/openstack-ansible-modules.morph b/strata/ansible/openstack-ansible-modules.morph
new file mode 100644
index 00000000..d8e885e6
--- /dev/null
+++ b/strata/ansible/openstack-ansible-modules.morph
@@ -0,0 +1,5 @@
+name: openstack-ansible-modules
+kind: chunk
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX"/share/ansible/ansible-openstack-modules
+- cp -r * "$DESTDIR$PREFIX"/share/ansible/ansible-openstack-modules
diff --git a/strata/armv7lhf-cross-toolchain.morph b/strata/armv7lhf-cross-toolchain.morph
new file mode 100644
index 00000000..4a105f2d
--- /dev/null
+++ b/strata/armv7lhf-cross-toolchain.morph
@@ -0,0 +1,54 @@
+name: armv7lhf-cross-toolchain
+kind: stratum
+description: Stratum for building an armv7lhf cross compiler for your native system.
+build-depends:
+- morph: strata/build-essential.morph
+chunks:
+- name: armv7lhf-cross-binutils
+ morph: strata/armv7lhf-cross-toolchain/armv7lhf-cross-binutils.morph
+ repo: upstream:binutils-tarball
+ ref: 5500a97a2ad1735db5b35bc51cfb825c1f4c38df
+ unpetrify-ref: binutils-2.25
+
+- name: armv7lhf-cross-linux-api-headers
+ morph: strata/armv7lhf-cross-toolchain/armv7lhf-cross-linux-api-headers.morph
+ repo: upstream:linux
+ ref: df2e1b9168a7ab5dd8149e38b5ac70cdef86d1fa
+ unpetrify-ref: baserock/v3.8
+
+- name: armv7lhf-cross-gcc-nolibc
+ morph: strata/armv7lhf-cross-toolchain/armv7lhf-cross-gcc-nolibc.morph
+ repo: upstream:gcc-tarball
+ ref: 7ccad68acf3805b35721e861fb9bc5a9e40effc8
+ unpetrify-ref: baserock/gcc-5.3.0
+ build-depends:
+ - armv7lhf-cross-binutils
+
+- name: armv7lhf-cross-glibc
+ morph: strata/armv7lhf-cross-toolchain/armv7lhf-cross-glibc.morph
+ repo: upstream:glibc
+ ref: b995d95a5943785be3ab862b2d3276f3b4a22481
+ unpetrify-ref: release/2.22/master
+ build-depends:
+ - armv7lhf-cross-binutils
+ - armv7lhf-cross-gcc-nolibc
+ - armv7lhf-cross-linux-api-headers
+
+- name: armv7lhf-cross-gcc
+ morph: strata/armv7lhf-cross-toolchain/armv7lhf-cross-gcc.morph
+ repo: upstream:gcc-tarball
+ ref: 7ccad68acf3805b35721e861fb9bc5a9e40effc8
+ unpetrify-ref: baserock/gcc-5.3.0
+ build-depends:
+ - armv7lhf-cross-binutils
+ - armv7lhf-cross-glibc
+
+- name: armv7lhf-cross-libstdc++
+ morph: strata/armv7lhf-cross-toolchain/armv7lhf-cross-libstdc++.morph
+ repo: upstream:gcc-tarball
+ ref: 7ccad68acf3805b35721e861fb9bc5a9e40effc8
+ unpetrify-ref: baserock/gcc-5.3.0
+ build-depends:
+ - armv7lhf-cross-binutils
+ - armv7lhf-cross-gcc
+ - armv7lhf-cross-glibc
diff --git a/strata/armv7lhf-cross-toolchain/armv7lhf-cross-binutils.morph b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-binutils.morph
new file mode 100644
index 00000000..8e842e41
--- /dev/null
+++ b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-binutils.morph
@@ -0,0 +1,24 @@
+name: armv7lhf-cross-binutils
+kind: chunk
+build-system: autotools
+
+configure-commands:
+- |
+ # The TARGET used is the final triplet we expect, rather than that
+ # of the libc-less GCC we build, since the binutils only needs to
+ # be built once.
+ # This requires extra effort to get the stage 1 GCC to use these
+ # tools, but saves having an extra binutils build.
+ export TARGET=armv7lhf-baserock-linux-gnueabi
+
+ # 1. Binutils gets installed in the default sysroot path of
+ # $PREFIX/$TARGET/{bin,lib}, with the actual sysroot at
+ # $PREFIX/$TARGET/sys-root and its tools also available as
+ # $PREFIX/bin/$TARGET-$tool
+ # 2. The '=' makes the path we give relative to the sysroot.
+ ./configure --prefix="$PREFIX" --disable-nls --disable-werror \
+ --build=$(sh config.guess) \
+ --host=$(sh config.guess) \
+ --target="$TARGET" \
+ `# [1]` --with-sysroot \
+ `# [2]` --with-lib-path="=$PREFIX/lib"
diff --git a/strata/armv7lhf-cross-toolchain/armv7lhf-cross-gcc-nolibc.morph b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-gcc-nolibc.morph
new file mode 100644
index 00000000..b43577f4
--- /dev/null
+++ b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-gcc-nolibc.morph
@@ -0,0 +1,73 @@
+name: armv7lhf-cross-gcc-nolibc
+kind: chunk
+
+configure-commands:
+- mkdir o
+
+# Configure flag notes:
+# 1. Standard flags. See gcc.morph.
+# 2. See stage1-gcc.morph.
+# 3. Our binutils is for the final $TARGET, rather than the intermediate
+# target our GCC is being built for, so we need to set
+# with-build-time-tools to get it to find our binutils at
+# build-time and with-as and with-ld so our temporary GCC uses
+# the appropriate tools when it compiles our libc, rather than
+# trying to use $TARGET_STAGE1-as when producing binaries.
+# 4. Disable stuff that doesn't work when building a cross compiler
+# without an existing libc, and generally try to keep this build as
+# simple as possible.
+- |
+ export MORPH_ARCH=armv7lhf
+ export TARGET=armv7lhf-baserock-linux-gnueabi
+ export TARGET_STAGE1=armv7lhf-none-linux-gnueabi
+
+ case "$MORPH_ARCH" in
+ armv7lhf) ARCH_FLAGS="--with-arch=armv7-a \
+ --with-tune=cortex-a9 \
+ --with-fpu=vfpv3-d16 \
+ --with-float=hard" ;;
+ armv7*) ARCH_FLAGS="--with-arch=armv7-a" ;;
+ esac
+
+ cd o && ../configure \
+ $ARCH_FLAGS \
+ --build=$(sh ../config.guess) \
+ --host=$(sh ../config.guess) \
+ --target="$TARGET_STAGE1" \
+ --prefix="$PREFIX" \
+ `# [1]` --libdir="$PREFIX/lib" \
+ `# [2]` --with-sysroot=/nonexistentdir \
+ --with-newlib \
+ `# [2]` --with-local-prefix="$PREFIX" \
+ `# [2]` --with-native-system-header-dir="$PREFIX/include" \
+ `# [3]` --with-build-time-tools="$PREFIX/$TARGET/bin" \
+ `# [3]` --with-as="$PREFIX/$TARGET/bin/as" \
+ `# [3]` --with-ld="$PREFIX/$TARGET/bin/ld" \
+ --without-headers \
+ --disable-nls \
+ --disable-shared \
+ `# [4]` --disable-multilib \
+ `# [4]` --disable-decimal-float \
+ `# [4]` --disable-threads \
+ `# [4]` --disable-libatomic \
+ `# [4]` --disable-libgomp \
+ `# [4]` --disable-libitm \
+ `# [4]` --disable-libquadmath \
+ `# [4]` --disable-libsanitizer \
+ `# [4]` --disable-libssp \
+ `# [4]` --disable-libvtv \
+ `# [4]` --disable-libcilkrts \
+ `# [4]` --disable-libstdc++-v3 \
+ --enable-languages=c,c++
+
+build-commands:
+- |
+ # See stage1-gcc.morph.
+ case "$MORPH_ARCH" in
+ armv7*) sed -i "s/--host=none/--host=armv7a/" o/Makefile
+ sed -i "s/--target=none/--target=armv7a/" o/Makefile ;;
+ esac
+ cd o && make
+
+install-commands:
+- cd o && make DESTDIR="$DESTDIR" install
diff --git a/strata/armv7lhf-cross-toolchain/armv7lhf-cross-gcc.morph b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-gcc.morph
new file mode 100644
index 00000000..d5c1a14a
--- /dev/null
+++ b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-gcc.morph
@@ -0,0 +1,47 @@
+name: armv7lhf-cross-gcc
+kind: chunk
+
+configure-commands:
+- mkdir o
+
+# Configure flag notes:
+# 1. Use the default sysroot path to install to and locate headers
+# 2. Avoid having more than one copy of ZLib in use on the system
+# 3. Standard flags. See gcc.morph.
+- |
+ export MORPH_ARCH=armv7lhf
+ export TARGET=armv7lhf-baserock-linux-gnueabi
+
+ case "$MORPH_ARCH" in
+ armv7lhf) ARCH_FLAGS="--with-arch=armv7-a \
+ --with-tune=cortex-a9 \
+ --with-fpu=vfpv3-d16 \
+ --with-float=hard" ;;
+ armv7*) ARCH_FLAGS="--with-arch=armv7-a" ;;
+ esac
+
+ cd o && ../configure \
+ $ARCH_FLAGS \
+ --build=$(sh ../config.guess) \
+ --host=$(sh ../config.guess) \
+ --target="$TARGET" \
+ --prefix="$PREFIX" \
+ `# [1]` --with-sysroot \
+ --disable-bootstrap \
+ `# [2]` --with-system-zlib \
+ `# [3]` --libdir="$PREFIX/lib" \
+ `# [3]` --disable-multilib \
+ `# [3]` --enable-languages=c,c++,fortran
+
+build-commands:
+- cd o && make
+
+install-commands:
+- cd o && make DESTDIR="$DESTDIR" install
+- ln -s gcc "$DESTDIR/$PREFIX/bin/cc"
+- |
+ export TARGET=armv7lhf-baserock-linux-gnueabi
+ for fortran_alias in f77 f90 f95; do
+ ln -s "$TARGET-gfortran" \
+ "$DESTDIR/$PREFIX/bin/$TARGET-$fortran_alias"
+ done
diff --git a/strata/armv7lhf-cross-toolchain/armv7lhf-cross-glibc.morph b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-glibc.morph
new file mode 100644
index 00000000..2a692c38
--- /dev/null
+++ b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-glibc.morph
@@ -0,0 +1,51 @@
+name: armv7lhf-cross-glibc
+kind: chunk
+
+configure-commands:
+- mkdir o
+
+# Configure flag notes:
+# 1. Location of linux-api-headers, needed since glibc doesn't
+# support being given a sysroot.
+# 2. Location of binutils, since we build binutils for the final
+# target triplet, but our gcc of our stage 1 target triplet.
+# 3. Normal flags. See strata/build-essential/glibc.morph.
+# 4. Force configuration values of certain things that can't be detected
+# in a cross-compile.
+- |
+ export MORPH_ARCH=armv7lhf
+ export TARGET=armv7lhf-baserock-linux-gnueabi
+ export TARGET_STAGE1=armv7lhf-none-linux-gnueabi
+
+ export CFLAGS="-O2 $CFLAGS"
+
+ # glibc looks for $TARGET-gcc, but not $TARGET_STAGE1-gcc even
+ # though --build is specified, so we have to override what gcc to
+ # use here.
+ export CC="$TARGET_STAGE1-gcc"
+
+ case "$MORPH_ARCH" in
+ armv7*)
+ ARCH_FLAGS="--without-fp" ;;
+ esac
+
+ cd o && ../configure \
+ $ARCH_FLAGS \
+ --build=$TARGET_STAGE1 --host=$TARGET \
+ --prefix="$PREFIX" \
+ `# [1]` --with-headers="$PREFIX/$TARGET/sys-root/$PREFIX/include" \
+ `# [2]` --with-binutils="$PREFIX/$TARGET/bin" \
+ `# [3]` --disable-profile --enable-kernel=2.6.25 \
+ `# [4]` libc_cv_c_cleanup=yes libc_cv_ctors_header=yes \
+ libc_cv_forced_unwind=yes libc_cv_ssp=no
+
+build-commands:
+- cd o && make localtime=UTC
+
+install-commands:
+- |
+ # glibc doesn't help with sysroots, so we need to spell out the
+ # full path ourselves.
+ export TARGET=armv7lhf-baserock-linux-gnueabi
+ cd o && make install_root="$DESTDIR/$PREFIX/$TARGET/sys-root/" \
+ localtime=UTC install
diff --git a/strata/armv7lhf-cross-toolchain/armv7lhf-cross-libstdc++.morph b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-libstdc++.morph
new file mode 100644
index 00000000..7743bb5b
--- /dev/null
+++ b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-libstdc++.morph
@@ -0,0 +1,32 @@
+name: armv7lhf-cross-libstdc++
+kind: chunk
+configure-commands:
+- mkdir o
+
+# Configure flag notes:
+# 1. Use the default sysroot path to install to and locate headers
+# 2. From LFS: the header location of C++ needs to be explicitly given
+# as we are running the configure script from the top-level
+# directory.
+- |
+ export MORPH_ARCH=armv7lhf
+ export TARGET=armv7lhf-baserock-linux-gnueabi
+
+ # -fPIC must be given, otherwise it will not be possible to create
+ # shared libraries linked to libstdc++
+ export CPPFLAGS="-fPIC"
+ cd o && ../libstdc++-v3/configure \
+ --build=$(sh ../config.guess) \
+ --host=$(sh ../config.guess) \
+ --target="$TARGET" \
+ --prefix="$PREFIX" \
+ --disable-nls \
+ --disable-shared \
+ --disable-multilib \
+ `# [1]` --with-sysroot
+
+build-commands:
+- cd o && make
+
+install-commands:
+- cd o && make DESTDIR="$DESTDIR" install
diff --git a/strata/armv7lhf-cross-toolchain/armv7lhf-cross-linux-api-headers.morph b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-linux-api-headers.morph
new file mode 100644
index 00000000..c2654419
--- /dev/null
+++ b/strata/armv7lhf-cross-toolchain/armv7lhf-cross-linux-api-headers.morph
@@ -0,0 +1,10 @@
+name: armv7lhf-cross-linux-api-headers
+kind: chunk
+install-commands:
+- ARCH=arm make INSTALL_HDR_PATH=dest headers_install
+- |
+ # Copy headers to the sysroot where the eglibc build will find them,
+ # and install its own headers and libraries.
+ export TARGET=armv7lhf-baserock-linux-gnueabi
+ install -d "$DESTDIR$PREFIX/$TARGET/sys-root/$PREFIX/include"
+ cp -r dest/include/* "$DESTDIR/$PREFIX/$TARGET/sys-root/$PREFIX/include"
diff --git a/strata/baserock-import.morph b/strata/baserock-import.morph
new file mode 100644
index 00000000..bc01a9a6
--- /dev/null
+++ b/strata/baserock-import.morph
@@ -0,0 +1,24 @@
+name: baserock-import
+kind: stratum
+description: Tools for importing software into Baserock definitions.
+build-depends:
+- morph: strata/python-common.morph
+- morph: strata/morph-utils.morph
+chunks:
+- name: ansicolor
+ repo: upstream:python-packages/ansicolor
+ ref: 9d3adbaff35bb6cde1d63414a8cc72f572c4d0ef
+ unpetrify-ref: 0.2.4
+ build-system: python-distutils
+- name: requests-cache
+ repo: upstream:python-packages/requests-cache
+ ref: a1b5e65ccd715f1e8434f18f27913715340d6aaf
+ unpetrify-ref: 0.4.6
+ build-system: python-distutils
+- name: baserock-import
+ repo: baserock:baserock/import
+ ref: 6406a6992b709b4ae65de5b2f7b27cb005a2ec8d
+ unpetrify-ref: master
+ build-system: python-distutils
+ build-depends:
+ - ansicolor
diff --git a/strata/bluetooth.morph b/strata/bluetooth.morph
new file mode 100644
index 00000000..ea603b30
--- /dev/null
+++ b/strata/bluetooth.morph
@@ -0,0 +1,39 @@
+name: bluetooth
+kind: stratum
+description: Components required for bluetooth.
+build-depends:
+- morph: strata/glib-common.morph
+- morph: strata/foundation.morph
+chunks:
+- name: libical
+ morph: strata/bluetooth/libical.morph
+ repo: upstream:libical-git
+ ref: 6c4af23b0a95fd105f38e879908cbc80390f3716
+ unpetrify-ref: v2.0.0
+- name: bluez
+ morph: strata/bluetooth/bluez.morph
+ repo: upstream:bluez
+ ref: 6c68ebf4d31a04459285169af83714b610fffb1a
+ unpetrify-ref: baserock/5.43+service-api
+ build-depends:
+ - libical
+- name: dbus-glib
+ repo: upstream:dbus-glib
+ ref: 397e8297d433547c9bf4150ddd2b9e0b4c39628c
+ unpetrify-ref: dbus-glib_0.102
+ build-system: autotools
+- name: bluez-tools
+ morph: strata/bluetooth/bluez-tools.morph
+ repo: upstream:bluez-tools
+ ref: 7350787e96a6ecf2cc5d4afddb3321ccad9fa461
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - dbus-glib
+- name: obexd
+ repo: upstream:obexd
+ ref: 4225280022c206762c91beee47c62d05e1baeacc
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - bluez
+ - libical
diff --git a/strata/bluetooth/bluez-tools.morph b/strata/bluetooth/bluez-tools.morph
new file mode 100644
index 00000000..80e47ef5
--- /dev/null
+++ b/strata/bluetooth/bluez-tools.morph
@@ -0,0 +1,10 @@
+name: bluez-tools
+kind: chunk
+description: A set of tools to manage Bluetooth devices for Linux
+build-system: autotools
+configure-commands:
+- sed -i -e 's/-lreadline/-lreadline -lncurses/g' configure.ac
+- ./autogen.sh
+- ./configure --prefix="$PREFIX" --disable-obex
+build-commands:
+- LDFLAGS="$LDFLAGS -lncurses" make
diff --git a/strata/bluetooth/bluez.morph b/strata/bluetooth/bluez.morph
new file mode 100644
index 00000000..e7208da7
--- /dev/null
+++ b/strata/bluetooth/bluez.morph
@@ -0,0 +1,19 @@
+name: bluez
+kind: chunk
+description: Bluetooth protocol stack for Linux
+build-system: autotools
+configure-commands:
+- autoreconf -ivf
+- ./configure --prefix="$PREFIX"
+ --enable-tools
+ --enable-service
+ --enable-test
+ --enable-library
+ --sysconfdir=/etc
+ --localstatedir=/var
+ --libexecdir=/lib
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- mkdir -p "$DESTDIR/etc/systemd/system/bluetooth.target.wants"
+- ln -s /lib/systemd/system/bluetooth.service "$DESTDIR/etc/systemd/system/bluetooth.target.wants/bluetooth.service"
+- ln -s /lib/systemd/system/bluetooth.service "$DESTDIR/etc/systemd/system/dbus-org.bluez.service"
diff --git a/strata/bluetooth/libical.morph b/strata/bluetooth/libical.morph
new file mode 100644
index 00000000..2ee7c96c
--- /dev/null
+++ b/strata/bluetooth/libical.morph
@@ -0,0 +1,5 @@
+name: libical
+kind: chunk
+build-system: cmake
+configure-commands:
+- cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$PREFIX" -DCMAKE_INSTALL_LIBDIR=lib
diff --git a/strata/bsp-armv5l-openbmc-aspeed.morph b/strata/bsp-armv5l-openbmc-aspeed.morph
new file mode 100644
index 00000000..d7e1f180
--- /dev/null
+++ b/strata/bsp-armv5l-openbmc-aspeed.morph
@@ -0,0 +1,18 @@
+name: bsp-armv5l-openbmc-aspeed
+kind: stratum
+description: |
+ The set of platform specific components required for booting
+ armvl5-openbmc-aspeed based systems
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: linux-armv5l-openbmc-aspeed
+ morph: strata/bsp-armv5l-openbmc-aspeed/linux-armv5l-openbmc-aspeed.morph
+ repo: upstream:linux-stable
+ ref: 5cbce86c2115075b8054e4dba8cdf328aa6fa5b6
+ unpetrify-ref: baserock/v2.6.28.9/openbmc_aspeed_wedge
+- name: u-boot@aspeed
+ morph: strata/bsp-armv5l-openbmc-aspeed/u-boot@aspeed.morph
+ repo: upstream:u-boot
+ ref: af962087db0b88f4073f8f5a6184cb7f011d224d
+ unpetrify-ref: baserock/v2013.07+aspeed_wedge
diff --git a/strata/bsp-armv5l-openbmc-aspeed/linux-armv5l-openbmc-aspeed.morph b/strata/bsp-armv5l-openbmc-aspeed/linux-armv5l-openbmc-aspeed.morph
new file mode 100644
index 00000000..c6e38c63
--- /dev/null
+++ b/strata/bsp-armv5l-openbmc-aspeed/linux-armv5l-openbmc-aspeed.morph
@@ -0,0 +1,9 @@
+name: linux-armv5l-openbmc-aspeed
+kind: chunk
+configure-commands:
+- make ast2400_defconfig
+build-commands:
+- make $MAKEFLAGS
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- cp arch/arm/boot/Image "$DESTDIR/boot/vmlinux"
diff --git a/strata/bsp-armv5l-openbmc-aspeed/u-boot@aspeed.morph b/strata/bsp-armv5l-openbmc-aspeed/u-boot@aspeed.morph
new file mode 100644
index 00000000..1ded05c5
--- /dev/null
+++ b/strata/bsp-armv5l-openbmc-aspeed/u-boot@aspeed.morph
@@ -0,0 +1,14 @@
+name: u-boot@aspeed
+kind: chunk
+configure-commands:
+- make ast2400_spi_config
+build-commands:
+- make
+- make tools
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX/bin"
+- install -m 755 tools/img2brec.sh "$DESTDIR$PREFIX/bin/"
+- install -m 755 tools/jtagconsole "$DESTDIR$PREFIX/bin/"
+- install -m 755 tools/netconsole "$DESTDIR$PREFIX/bin/"
+- install -m 755 tools/mkenvimage "$DESTDIR$PREFIX/bin/"
+- install -m 755 tools/mkimage "$DESTDIR$PREFIX/bin/"
diff --git a/strata/bsp-armv7-highbank.morph b/strata/bsp-armv7-highbank.morph
new file mode 100644
index 00000000..9ac97e6c
--- /dev/null
+++ b/strata/bsp-armv7-highbank.morph
@@ -0,0 +1,17 @@
+name: bsp-armv7-highbank
+kind: stratum
+description: The platform dependent components required to boot an ARM highbank board.
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: linux-armv7-highbank
+ morph: strata/bsp-armv7-highbank/linux-armv7-highbank.morph
+ repo: upstream:linux-stable
+
+ # Linux 3.16 and later do not boot on Calxeda. They fail just before
+ # starting 'init' with this sort of message:
+ #
+ # Unhandled fault: imprecise external abort (0xc06) at 0xb6fea878
+
+ ref: f35b5e46feabab668a44df5b33f3558629f94dfc
+ unpetrify-ref: v3.15.10
diff --git a/strata/bsp-armv7-highbank/linux-armv7-highbank.morph b/strata/bsp-armv7-highbank/linux-armv7-highbank.morph
new file mode 100644
index 00000000..e904ff45
--- /dev/null
+++ b/strata/bsp-armv7-highbank/linux-armv7-highbank.morph
@@ -0,0 +1,52 @@
+name: linux-armv7-highbank
+kind: chunk
+configure-commands:
+- make multi_v7_defconfig
+- scripts/config -e AUTOFS4_FS
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config -e CGROUPS
+- scripts/config -e CONFIG_POSIX_MQUEUE
+- scripts/config -e CPU_IDLE
+- scripts/config -e EXT4_FS
+- scripts/config -e FUSE_FS
+#- scripts/config -e OVERLAY_FS # Activate when we build Linux >= 3.18
+- scripts/config -e EXT4_USE_FOR_EXT23
+- scripts/config -e PACKET
+- scripts/config -e UNIX
+- scripts/config -e INET
+- scripts/config -e IP_MULTICAST
+- scripts/config -e IP_PNP
+- scripts/config -e IP_PNP_DHCP
+- scripts/config -e IP_PNP_BOOTP
+- scripts/config -e MSDOS_FS
+- scripts/config -e NETWORK_FILESYSTEMS
+- scripts/config -e NET_KEY
+- scripts/config -e NFS_FS
+- scripts/config -e NFS_V3
+- scripts/config -e ROOT_NFS
+- scripts/config -e LOCKD
+- scripts/config -e LOCKD_V4
+- scripts/config -e NFS_COMMON
+- scripts/config -e SUNRPC
+- scripts/config -e SYSVIPC
+- scripts/config -e BTRFS_FS
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e TMPFS
+- scripts/config -e TMPFS_POSIX_ACL
+- scripts/config -e VFAT_FS
+- scripts/config -e VLAN_8021Q
+- scripts/config -e BRIDGE_VLAN_FILTERING
+- scripts/config -e VETH
+- yes '' | make oldconfig
+build-commands:
+- make zImage $MAKEFLAGS
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- cp arch/arm/boot/zImage "$DESTDIR"/boot/zImage
diff --git a/strata/bsp-armv7-versatile.morph b/strata/bsp-armv7-versatile.morph
new file mode 100644
index 00000000..470f6c56
--- /dev/null
+++ b/strata/bsp-armv7-versatile.morph
@@ -0,0 +1,12 @@
+name: bsp-armv7-versatile
+kind: stratum
+description: The platform dependent components required to boot an ARM versatile development
+ board.
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: linux-armv7-versatile
+ morph: strata/bsp-armv7-versatile/linux-armv7-versatile.morph
+ repo: upstream:linux-stable
+ ref: 660613d1a4e94144490850b6c3d350331860fac4
+ unpetrify-ref: v3.19.2
diff --git a/strata/bsp-armv7-versatile/linux-armv7-versatile.morph b/strata/bsp-armv7-versatile/linux-armv7-versatile.morph
new file mode 100644
index 00000000..ed0194b8
--- /dev/null
+++ b/strata/bsp-armv7-versatile/linux-armv7-versatile.morph
@@ -0,0 +1,31 @@
+name: linux-armv7-versatile
+kind: chunk
+configure-commands:
+- make ARCH=arm vexpress_defconfig
+- scripts/config -e BTRFS_FS
+- scripts/config -e BTRFS_FS_POSIX_ACL
+- scripts/config -d BTRFS_FS_CHECK_INTEGRITY
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e FUSE_FS
+- scripts/config -e OVERLAY_FS
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e CGROUPS
+- scripts/config -e AUTOFS4_FS
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e SECCOMP
+- scripts/config -d DEBUG_STACK_TRACE
+- scripts/config -e FB_VESA
+- scripts/config -e VLAN_8021Q
+- scripts/config -e BRIDGE_VLAN_FILTERING
+- yes '' | make oldconfig
+build-commands:
+- make ARCH=arm zImage $MAKEFLAGS
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- cp arch/arm/boot/zImage "$DESTDIR"/boot/zImage
diff --git a/strata/bsp-armv7b-highbank.morph b/strata/bsp-armv7b-highbank.morph
new file mode 100644
index 00000000..397b9fcb
--- /dev/null
+++ b/strata/bsp-armv7b-highbank.morph
@@ -0,0 +1,17 @@
+name: bsp-armv7b-highbank
+kind: stratum
+description: The platform dependent components required to boot an ARM highbank board.
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: linux-armv7b-highbank
+ morph: strata/bsp-armv7b-highbank/linux-armv7b-highbank.morph
+ repo: upstream:linux-stable
+
+ # Linux 3.16 and later do not boot on Calxeda. They fail just before
+ # starting 'init' with this sort of message:
+ #
+ # Unhandled fault: imprecise external abort (0xc06) at 0xb6fea878
+
+ ref: f35b5e46feabab668a44df5b33f3558629f94dfc
+ unpetrify-ref: v3.15.10
diff --git a/strata/bsp-armv7b-highbank/linux-armv7b-highbank.morph b/strata/bsp-armv7b-highbank/linux-armv7b-highbank.morph
new file mode 100644
index 00000000..1b86d320
--- /dev/null
+++ b/strata/bsp-armv7b-highbank/linux-armv7b-highbank.morph
@@ -0,0 +1,53 @@
+name: linux-armv7b-highbank
+kind: chunk
+configure-commands:
+- make multi_v7_defconfig
+- scripts/config -e CPU_BIG_ENDIAN
+- scripts/config -e CPU_ENDIAN_BE8
+- scripts/config -e CPU_BE8_BOOT_LE
+- scripts/config -e PACKET
+- scripts/config -e UNIX
+- scripts/config -e NET_KEY
+- scripts/config -e INET
+- scripts/config -e IP_MULTICAST
+- scripts/config -e IP_PNP
+- scripts/config -e IP_PNP_DHCP
+- scripts/config -e IP_PNP_BOOTP
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config -e BTRFS_FS
+- scripts/config -e TMPFS
+- scripts/config -e FUSE_FS
+#- scripts/config -e OVERLAY_FS # Activate when we build Linux >= 3.18
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e CGROUPS
+- scripts/config -e AUTOFS4_FS
+- scripts/config -e NETWORK_FILESYSTEMS
+- scripts/config -e NFS_FS
+- scripts/config -e NFS_V3
+- scripts/config -e ROOT_NFS
+- scripts/config -e LOCKD
+- scripts/config -e LOCKD_V4
+- scripts/config -e NFS_COMMON
+- scripts/config -e SUNRPC
+- scripts/config -e SYSVIPC
+- scripts/config -e CONFIG_POSIX_MQUEUE
+- scripts/config -e CPU_IDLE
+- scripts/config -e EXT4_FS
+- scripts/config -e EXT4_USE_FOR_EXT23
+- scripts/config -e MSDOS_FS
+- scripts/config -e VFAT_FS
+- scripts/config -e VLAN_8021Q
+- scripts/config -e BRIDGE_VLAN_FILTERING
+- yes '' | make oldconfig
+build-commands:
+- make zImage $MAKEFLAGS
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- cp arch/arm/boot/zImage "$DESTDIR"/boot/zImage
diff --git a/strata/bsp-armv7b-vexpress-tc2.morph b/strata/bsp-armv7b-vexpress-tc2.morph
new file mode 100644
index 00000000..ea67c386
--- /dev/null
+++ b/strata/bsp-armv7b-vexpress-tc2.morph
@@ -0,0 +1,11 @@
+name: bsp-armv7b-vexpress-tc2
+kind: stratum
+description: The platform dependent components required to boot Versatile TC2 board
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: linux-armv7b-vexpress-tc2
+ morph: strata/bsp-armv7b-vexpress-tc2/linux-armv7b-vexpress-tc2.morph
+ repo: upstream:linux-stable
+ ref: 660613d1a4e94144490850b6c3d350331860fac4
+ unpetrify-ref: v3.19.2
diff --git a/strata/bsp-armv7b-vexpress-tc2/linux-armv7b-vexpress-tc2.morph b/strata/bsp-armv7b-vexpress-tc2/linux-armv7b-vexpress-tc2.morph
new file mode 100644
index 00000000..fd6fab15
--- /dev/null
+++ b/strata/bsp-armv7b-vexpress-tc2/linux-armv7b-vexpress-tc2.morph
@@ -0,0 +1,57 @@
+name: linux-armv7b-vexpress-tc2
+kind: chunk
+configure-commands:
+- make vexpress_defconfig
+- scripts/config -e CPU_BIG_ENDIAN
+- scripts/config -e CPU_ENDIAN_BE8
+- scripts/config -e CPU_BE8_BOOT_LE
+- scripts/config -e PACKET
+- scripts/config -e UNIX
+- scripts/config -e NET_KEY
+- scripts/config -e INET
+- scripts/config -e IP_MULTICAST
+- scripts/config -e IP_PNP
+- scripts/config -e IP_PNP_DHCP
+- scripts/config -e IP_PNP_BOOTP
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config -e BTRFS_FS
+- scripts/config -e TMPFS
+- scripts/config -e FUSE_FS
+- scripts/config -e OVERLAY_FS
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e CGROUPS
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e AUTOFS4_FS
+- scripts/config -e NETWORK_FILESYSTEMS
+- scripts/config -e NFS_FS
+- scripts/config -e NFS_V3
+- scripts/config -e ROOT_NFS
+- scripts/config -e LOCKD
+- scripts/config -e LOCKD_V4
+- scripts/config -e NFS_COMMON
+- scripts/config -e SUNRPC
+- scripts/config -e SYSVIPC
+- scripts/config -e CONFIG_POSIX_MQUEUE
+- scripts/config -e CPU_IDLE
+- scripts/config -e EXT4_FS
+- scripts/config -e EXT4_USE_FOR_EXT23
+- scripts/config -e MSDOS_FS
+- scripts/config -e VFAT_FS
+- scripts/config -e VLAN_8021Q
+- scripts/config -e BRIDGE_VLAN_FILTERING
+- scripts/config -e VETH
+- yes '' | make oldconfig
+build-commands:
+- make zImage vexpress-v2p-ca15_a7.dtb
+- |
+ cat arch/arm/boot/zImage arch/arm/boot/dts/vexpress-v2p-ca15_a7.dtb |
+ dd conv=sync bs=4 of=kernel.bin
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- cp kernel.bin "$DESTDIR"/boot/zImage
diff --git a/strata/bsp-armv7l-altera-socfpga-devkit.morph b/strata/bsp-armv7l-altera-socfpga-devkit.morph
new file mode 100644
index 00000000..403e04e1
--- /dev/null
+++ b/strata/bsp-armv7l-altera-socfpga-devkit.morph
@@ -0,0 +1,39 @@
+name: bsp-armv7l-altera-socfpga-devkit
+kind: stratum
+description: |
+ The platform dependent components required to boot the Altera Cortex-A9
+ HPS core on an Altera SoCFPGA development kit.
+build-depends:
+- morph: strata/coreutils-common.morph
+- morph: strata/tools.morph
+chunks:
+- name: u-boot-tools@socfpga-devkit
+ morph: strata/bsp-armv7l-altera-socfpga-devkit/u-boot-tools@socfpga-devkit.morph
+ repo: upstream:u-boot
+ ref: 905e8f9e53766e606bd4a0ed46d804889e613f32
+ unpetrify-ref: v2015.07-rc1
+- name: u-boot@socfpga-devkit
+ morph: strata/bsp-armv7l-altera-socfpga-devkit/u-boot@socfpga-devkit.morph
+ repo: upstream:u-boot-socfpga
+ ref: 32c1d91bc0d10beca54c2dfc5b475d4ffeffc15a
+ unpetrify-ref: socfpga_v2013.01.01
+- name: bsp-support@socfpga-devkit
+ morph: strata/bsp-armv7l-altera-socfpga-devkit/bsp-support@socfpga-devkit.morph
+ repo: baserock:baserock/bsp-support
+ ref: 95e6be2188ad9dfd13cb8887cdc698519831871d
+ unpetrify-ref: master
+ build-depends:
+ - u-boot-tools@socfpga-devkit
+- name: preloader@socfpga-devkit
+ morph: strata/bsp-armv7l-altera-socfpga-devkit/preloader@socfpga-devkit.morph
+ repo: upstream:u-boot-socfpga
+ ref: 32c1d91bc0d10beca54c2dfc5b475d4ffeffc15a
+ unpetrify-ref: socfpga_v2013.01.01
+ build-depends:
+ - bsp-support@socfpga-devkit
+ - u-boot-tools@socfpga-devkit
+- name: linux-armv7l-altera-socfpga-devkit
+ morph: strata/bsp-armv7l-altera-socfpga-devkit/linux-armv7l-altera-socfpga-devkit.morph
+ repo: upstream:linux
+ ref: e26081808edadfd257c6c9d81014e3b25e9a6118
+ unpetrify-ref: v4.1-rc4
diff --git a/strata/bsp-armv7l-altera-socfpga-devkit/bsp-support@socfpga-devkit.morph b/strata/bsp-armv7l-altera-socfpga-devkit/bsp-support@socfpga-devkit.morph
new file mode 100644
index 00000000..2e206b4e
--- /dev/null
+++ b/strata/bsp-armv7l-altera-socfpga-devkit/bsp-support@socfpga-devkit.morph
@@ -0,0 +1,17 @@
+name: bsp-support@socfpga-devkit
+kind: chunk
+build-commands:
+# Modify auto-generated source files:
+- mv altera-socfpga/* .
+- for file in patches/*.diff; do patch -p 1 < "$file"; done
+- sed -i 's/^PRELOADER_SETTINGS_DIR := .*$/PRELOADER_SETTINGS_DIR := .\/hps_hps_0/' hardware-handoff/spl_bsp/Makefile
+- sed -i 's/^CROSS_COMPILE := .*$/CROSS_COMPILE := \/usr\/bin\//' hardware-handoff/spl_bsp/Makefile
+- mkenvimage -s 4096 -o socfpga-devkit-env.img socfpga-devkit-env.txt
+- dtc -f -I dts -O dtb dts-generated/socfpga-devkit.dts > socfpga-devkit.dtb
+install-commands:
+- mkdir -p "$DESTDIR/boot"
+- install -m 755 socfpga-devkit-env.img "$DESTDIR/boot"
+- install -m 755 socfpga-devkit.dtb "$DESTDIR/boot"
+# These files are required later, to be built against U-Boot:
+- mkdir -p "$DESTDIR/tmp/preloader"
+- cp -R ./hardware-handoff/* "$DESTDIR/tmp/preloader"
diff --git a/strata/bsp-armv7l-altera-socfpga-devkit/device-tree-compiler.morph b/strata/bsp-armv7l-altera-socfpga-devkit/device-tree-compiler.morph
new file mode 100644
index 00000000..8abfafc8
--- /dev/null
+++ b/strata/bsp-armv7l-altera-socfpga-devkit/device-tree-compiler.morph
@@ -0,0 +1,6 @@
+name: device-tree-compiler
+kind: chunk
+build-commands:
+- make all
+install-commands:
+- make install DESTDIR="$DESTDIR" PREFIX="$PREFIX"
diff --git a/strata/bsp-armv7l-altera-socfpga-devkit/linux-armv7l-altera-socfpga-devkit.morph b/strata/bsp-armv7l-altera-socfpga-devkit/linux-armv7l-altera-socfpga-devkit.morph
new file mode 100644
index 00000000..be372265
--- /dev/null
+++ b/strata/bsp-armv7l-altera-socfpga-devkit/linux-armv7l-altera-socfpga-devkit.morph
@@ -0,0 +1,34 @@
+name: linux-armv7l-altera-socfpga-devkit
+kind: chunk
+configure-commands:
+- git status
+- make ARCH=arm socfpga_defconfig
+- scripts/config -e BTRFS_FS
+- scripts/config -e BTRFS_FS_POSIX_ACL
+- scripts/config -d BTRFS_FS_CHECK_INTEGRITY
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e FUSE_FS
+- scripts/config -e OVERLAY_FS
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e CGROUPS
+- scripts/config -e AUTOFS4_FS
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e SECCOMP
+- scripts/config -d DEBUG_STACK_TRACE
+- scripts/config -e FB_VESA
+- scripts/config -e VLAN_8021Q
+- scripts/config -e BRIDGE_VLAN_FILTERING
+- scripts/config -e IPV6
+- scripts/config -d MTD_NAND
+- yes '' | make oldconfig
+build-commands:
+- make ARCH=arm LOADADDR=0x8000 zImage dtbs $MAKEFLAGS
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- cp arch/arm/boot/zImage "$DESTDIR"/boot/zImage
+- cp arch/arm/boot/dts/socfpga_cyclone5*.dtb "$DESTDIR"/boot/
diff --git a/strata/bsp-armv7l-altera-socfpga-devkit/preloader@socfpga-devkit.morph b/strata/bsp-armv7l-altera-socfpga-devkit/preloader@socfpga-devkit.morph
new file mode 100644
index 00000000..c61b10a7
--- /dev/null
+++ b/strata/bsp-armv7l-altera-socfpga-devkit/preloader@socfpga-devkit.morph
@@ -0,0 +1,17 @@
+name: preloader@socfpga-devkit
+kind: chunk
+configure-commands:
+- mkdir uboot-socfpga
+- find -maxdepth 1 | egrep -v '^./uboot-socfpga|\.$' | xargs -I {} mv {} uboot-socfpga
+- cp -R /tmp/preloader/spl_bsp/* .
+- cp -R /tmp/preloader/hps_hps_0 .
+build-commands:
+- make
+- mkimage -T socfpgaimage -d uboot-socfpga/spl/u-boot-spl.bin preloader.bin
+# Signed preloader needs to be duplicated four times
+# which U-Boot's mkimage tool doesn't support
+- dd if=/dev/zero of=socfpga-preloader.img bs=64K count=4
+- for i in $(seq 0 3); do dd if=preloader.bin of=socfpga-preloader.img bs=64K seek="$i" conv=notrunc; done
+install-commands:
+- mkdir -p "$DESTDIR/boot"
+- install -m 755 socfpga-preloader.img "$DESTDIR/boot"
diff --git a/strata/bsp-armv7l-altera-socfpga-devkit/u-boot-tools@socfpga-devkit.morph b/strata/bsp-armv7l-altera-socfpga-devkit/u-boot-tools@socfpga-devkit.morph
new file mode 100644
index 00000000..f7d3f7cb
--- /dev/null
+++ b/strata/bsp-armv7l-altera-socfpga-devkit/u-boot-tools@socfpga-devkit.morph
@@ -0,0 +1,14 @@
+name: u-boot-tools@socfpga-devkit
+kind: chunk
+configure-commands:
+- git status
+- make ARCH=arm socfpga_cyclone5_config
+build-commands:
+- make ARCH=arm tools
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX/bin"
+- install -m 755 tools/img2brec.sh "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/jtagconsole "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/netconsole "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/mkenvimage "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/mkimage "$DESTDIR$PREFIX/bin/."
diff --git a/strata/bsp-armv7l-altera-socfpga-devkit/u-boot@socfpga-devkit.morph b/strata/bsp-armv7l-altera-socfpga-devkit/u-boot@socfpga-devkit.morph
new file mode 100644
index 00000000..2b7ce450
--- /dev/null
+++ b/strata/bsp-armv7l-altera-socfpga-devkit/u-boot@socfpga-devkit.morph
@@ -0,0 +1,9 @@
+name: u-boot@socfpga-devkit
+kind: chunk
+configure-commands:
+- make ARCH=arm socfpga_cyclone5_config
+build-commands:
+- make ARCH=arm
+install-commands:
+- mkdir -p "$DESTDIR/boot"
+- install -m 755 u-boot.img "$DESTDIR/boot"
diff --git a/strata/bsp-armv8b64-generic.morph b/strata/bsp-armv8b64-generic.morph
new file mode 100644
index 00000000..636e62b4
--- /dev/null
+++ b/strata/bsp-armv8b64-generic.morph
@@ -0,0 +1,15 @@
+name: bsp-armv8b64-generic
+kind: stratum
+description: |
+ The set of platform specific components required for booting generic ARMv8
+ systems in big-endian mode, such as the 64-bit APM XGene ARM based m400
+ Moonshot cartridge.
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: linux-armv8b64-generic
+ morph: strata/bsp-armv8b64-generic/linux-armv8b64-generic.morph
+ repo: upstream:linux
+ ref: cd1397b1f6e429b82e94565b0af93c6bd44e4271
+ unpetrify-ref: baserock/bjdooks/m400-be3
+ build-depends: []
diff --git a/strata/bsp-armv8b64-generic/linux-armv8b64-generic.morph b/strata/bsp-armv8b64-generic/linux-armv8b64-generic.morph
new file mode 100644
index 00000000..9362eb6e
--- /dev/null
+++ b/strata/bsp-armv8b64-generic/linux-armv8b64-generic.morph
@@ -0,0 +1,278 @@
+name: linux-armv8b64-generic
+kind: chunk
+configure-commands:
+- make ARCH=arm64 defconfig
+- scripts/config -e PACKET
+- scripts/config -e SATA_AHCI
+- scripts/config -e ATA_GENERIC
+- scripts/config -e HAVE_IDE
+- scripts/config -d BLK_DEV_IDE_SATA
+- scripts/config -e BTRFS_FS
+- scripts/config -e BTRFS_FS_POSIX_ACL
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e CGROUPS
+- scripts/config -e AUTOFS4_FS
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e EXT2_FS
+- scripts/config -e EXT2_FS_XATTR
+- scripts/config -e EXT2_FS_POSIX_ACL
+- scripts/config -e EXT2_FS_SECURITY
+- scripts/config -e EXT2_FS_XIP
+- scripts/config -e EXT3_FS
+- scripts/config -d EXT3_DEFAULTS_TO_ORDERED
+- scripts/config -e EXT3_FS_XATTR
+- scripts/config -e EXT3_FS_POSIX_ACL
+- scripts/config -e EXT3_FS_SECURITY
+- scripts/config -e EXT4_FS
+- scripts/config -e EXT4_FS_XATTR
+- scripts/config -e EXT4_FS_POSIX_ACL
+- scripts/config -e EXT4_FS_SECURITY
+- scripts/config -d EXT4_DEBUG
+- scripts/config -e XFS_FS
+- scripts/config -e LIBCRC32C
+- scripts/config -e FUSE_FS
+- scripts/config -e OVERLAY_FS
+- scripts/config -d JBD_DEBUG
+- scripts/config -d JBD2_DEBUG
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config -d BLK_DEV_CRYPTOLOOP
+- scripts/config -e CEPH_FS
+- scripts/config --set-val BLK_DEV_LOOP_MIN_COUNT 8
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e VIRTIO
+- scripts/config -e VIRTIO_RING
+- scripts/config -e VIRTIO_PCI
+- scripts/config -e VIRTIO_BALLOON
+- scripts/config -e VIRTIO_BLK
+- scripts/config -e VIRTIO_NET
+- scripts/config -e VIRTIO_CONSOLE
+- scripts/config -e HW_RANDOM_VIRTIO
+- scripts/config -e 9P_FS
+- scripts/config -e 9P_FSCACHE
+- scripts/config -e 9P_FS_POSIX_ACL
+- scripts/config -e NET_9P
+- scripts/config -e NET_9P_VIRTIO
+- scripts/config -e R8169
+- scripts/config -e 8139TOO
+- scripts/config -e 8139CP
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e SECCOMP
+- scripts/config -d DEBUG_STACK_TRACE
+- scripts/config -e NFSD
+- scripts/config -e NFSD_V3
+- scripts/config -e KVM
+- scripts/config -e TUN
+- scripts/config -e BRIDGE
+- scripts/config -e VHOST_NET
+- scripts/config -e NF_NAT
+- scripts/config -e IP_NF_NAT
+- scripts/config -e IP_NF_TARGET_MASQUERADE
+- scripts/config -e FB_VESA
+- scripts/config -e HOTPLUG_PCI
+- scripts/config -e HOTPLUG_PCI_ACPI
+- scripts/config -e VLAN_8021Q
+- scripts/config -e BRIDGE_VLAN_FILTERING
+- scripts/config -e IPV6
+- scripts/config -e BLK_DEV_NBD
+- scripts/config -e BRIDGE_NF_EBTABLES
+- scripts/config -e NETFILTER
+- scripts/config -e NETFILTER_ADVANCED
+- scripts/config -e NETFILTER_XT_MATCH_ADDRTYPE
+- scripts/config -e OPENVSWITCH
+- scripts/config -e OPENVSWITCH_VXLAN
+- scripts/config -e CONFIG_OPENVSWITCH_GRE
+- scripts/config -e NET_CLS_BASIC
+- scripts/config -e NET_SCH_INGRESS
+- scripts/config -e NET_ACT_POLICE
+- scripts/config -e NET_IPGRE_DEMUX
+- scripts/config -e NET_SCH_HTB
+- scripts/config -e NET_SCH_HFSC
+- scripts/config -e VXLAN
+- scripts/config -e VETH
+- scripts/config -e IP_NF_MATCH_AH
+- scripts/config -e IP_NF_MATCH_ECN
+- scripts/config -e IP_NF_MATCH_RPFILTER
+- scripts/config -e IP_NF_MATCH_TTL
+- scripts/config -e IP_NF_TARGET_SYNPROXY
+- scripts/config -e IP_NF_TARGET_NETMAP
+- scripts/config -e IP_NF_TARGET_REDIRECT
+- scripts/config -e IP_NF_TARGET_CLUSTERIP
+- scripts/config -e IP_NF_TARGET_ECN
+- scripts/config -e IP_NF_TARGET_TTL
+- scripts/config -e IP_NF_RAW
+- scripts/config -e IP_NF_SECURITY
+- scripts/config -e IP_NF_ARPTABLES
+- scripts/config -e NETFILTER_NETLINK_QUEUE
+- scripts/config -e SCSI_NETLINK
+- scripts/config -e NETFILTER_XT_TARGET_MARK
+- scripts/config -e NETFILTER_XT_SET
+- scripts/config -e IP_SET
+- scripts/config -e IP_SET_BITMAP_IP
+- scripts/config -e IP_SET_BITMAP_IPMAC
+- scripts/config -e IP_SET_BITMAP_PORT
+- scripts/config -e IP_SET_HASH_IP
+- scripts/config -e IP_SET_HASH_IPMARK
+- scripts/config -e IP_SET_HASH_IPPORT
+- scripts/config -e IP_SET_HASH_IPPORTIP
+- scripts/config -e IP_SET_HASH_IPPORTNET
+- scripts/config -e IP_SET_HASH_MAC
+- scripts/config -e IP_SET_HASH_NETPORTNET
+- scripts/config -e IP_SET_HASH_NET
+- scripts/config -e IP_SET_HASH_NETNET
+- scripts/config -e IP_SET_HASH_NETPORT
+- scripts/config -e IP_SET_HASH_NETIFACE
+- scripts/config -e IP_SET_LIST_SET
+- scripts/config -e NF_CONNTRACK_TIMEOUT
+- scripts/config -e NF_CONNTRACK_TIMESTAMP
+- scripts/config -e NF_CONNTRACK_EVENTS
+- scripts/config -e NF_CONNTRACK_LABELS
+- scripts/config -e NETFILTER_NETLINK_ACCT
+- scripts/config -e NETFILTER_NETLINK_QUEUE_CT
+- scripts/config -e NF_CT_PROTO_DCCP
+- scripts/config -e NF_CT_PROTO_GRE
+- scripts/config -e NF_CT_PROTO_SCTP
+- scripts/config -e NF_CT_PROTO_UDPLITE
+- scripts/config -e NF_CT_NETLINK_TIMEOUT
+- scripts/config -e NF_CT_NETLINK_HELPER
+- scripts/config -e NF_CONNTRACK_AMANDA
+- scripts/config -e NF_CONNTRACK_H323
+- scripts/config -e NF_CONNTRACK_BROADCAST
+- scripts/config -e NF_CONNTRACK_NETBIOS_NS
+- scripts/config -e NF_CONNTRACK_SNMP
+- scripts/config -e NF_CONNTRACK_PPTP
+- scripts/config -e NF_CONNTRACK_SANE
+- scripts/config -e NF_CONNTRACK_TFTP
+- scripts/config -e NF_LOG_COMMON
+- scripts/config -e NF_NAT_PROTO_DCCP
+- scripts/config -e NF_NAT_PROTO_UDPLITE
+- scripts/config -e NF_NAT_PROTO_SCTP
+- scripts/config -e NF_NAT_AMANDA
+- scripts/config -e NF_NAT_TFTP
+- scripts/config -e NF_TABLES
+- scripts/config -e NF_TABLES_INET
+- scripts/config -e NFT_COMPAT
+- scripts/config -e NFT_EXTHDR
+- scripts/config -e NFT_META
+- scripts/config -e NFT_CT
+- scripts/config -e NFT_LIMIT
+- scripts/config -e NFT_NAT
+- scripts/config -e NFT_QUEUE
+- scripts/config -e NFT_REJECT
+- scripts/config -e NFT_REJECT_INET
+- scripts/config -e NFT_RBTREE
+- scripts/config -e NFT_HASH
+- scripts/config -e NFT_COUNTER
+- scripts/config -e NFT_LOG
+- scripts/config -e NFT_MASQ
+- scripts/config -e NETFILTER_XT_CONNMARK
+- scripts/config -e NETFILTER_XT_TARGET_AUDIT
+- scripts/config -e NETFILTER_XT_TARGET_CHECKSUM
+- scripts/config -e NETFILTER_XT_TARGET_CLASSIFY
+- scripts/config -e NETFILTER_XT_TARGET_CT
+- scripts/config -e NETFILTER_XT_TARGET_DSCP
+- scripts/config -e NETFILTER_XT_TARGET_HMARK
+- scripts/config -e NETFILTER_XT_TARGET_LED
+- scripts/config -e NETFILTER_XT_TARGET_LOG
+- scripts/config -e NETFILTER_XT_TARGET_NFQUEUE
+- scripts/config -e NETFILTER_XT_TARGET_RATEEST
+- scripts/config -e NETFILTER_XT_TARGET_TPROXY
+- scripts/config -e NETFILTER_XT_TARGET_TCPOPTSTRIP
+- scripts/config -e NETFILTER_XT_TARGET_TEE
+- scripts/config -e NETFILTER_XT_TARGET_TRACE
+- scripts/config -e NETFILTER_XT_TARGET_IDLETIMER
+- scripts/config -e NETFILTER_XT_MATCH_BPF
+- scripts/config -e NETFILTER_XT_MATCH_CLUSTER
+- scripts/config -e NETFILTER_XT_MATCH_COMMENT
+- scripts/config -e NETFILTER_XT_MATCH_CONNBYTES
+- scripts/config -e NETFILTER_XT_MATCH_CONNLABEL
+- scripts/config -e NETFILTER_XT_MATCH_CONNLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_CPU
+- scripts/config -e NETFILTER_XT_MATCH_DCCP
+- scripts/config -e NETFILTER_XT_MATCH_DEVGROUP
+- scripts/config -e NETFILTER_XT_MATCH_DSCP
+- scripts/config -e NETFILTER_XT_MATCH_ESP
+- scripts/config -e NETFILTER_XT_MATCH_HASHLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_HELPER
+- scripts/config -e NETFILTER_XT_MATCH_IPCOMP
+- scripts/config -e NETFILTER_XT_MATCH_IPRANGE
+- scripts/config -e NETFILTER_XT_MATCH_IPVS
+- scripts/config -e NETFILTER_XT_MATCH_L2TP
+- scripts/config -e NETFILTER_XT_MATCH_LENGTH
+- scripts/config -e NETFILTER_XT_MATCH_LIMIT
+- scripts/config -e NETFILTER_XT_MATCH_MAC
+- scripts/config -e NETFILTER_XT_MATCH_MULTIPORT
+- scripts/config -e NETFILTER_XT_MATCH_NFACCT
+- scripts/config -e NETFILTER_XT_MATCH_OSF
+- scripts/config -e NETFILTER_XT_MATCH_OWNER
+- scripts/config -e NETFILTER_XT_MATCH_CGROUP
+- scripts/config -e NETFILTER_XT_MATCH_PHYSDEV
+- scripts/config -e NETFILTER_XT_MATCH_PKTTYPE
+- scripts/config -e NETFILTER_XT_MATCH_QUOTA
+- scripts/config -e NETFILTER_XT_MATCH_RATEEST
+- scripts/config -e NETFILTER_XT_MATCH_REALM
+- scripts/config -e NETFILTER_XT_MATCH_RECENT
+- scripts/config -e NETFILTER_XT_MATCH_SCTP
+- scripts/config -e NETFILTER_XT_MATCH_SOCKET
+- scripts/config -e NETFILTER_XT_MATCH_STATISTIC
+- scripts/config -e NETFILTER_XT_MATCH_STRING
+- scripts/config -e NETFILTER_XT_MATCH_TCPMSS
+- scripts/config -e NETFILTER_XT_MATCH_TIME
+- scripts/config -e NETFILTER_XT_MATCH_U32
+- scripts/config -e IP_VS
+- scripts/config -e BRIDGE_NETFILTER
+- scripts/config -e CRYPTO_CRC32C
+- scripts/config -e CONFIGFS_FS
+- scripts/config -e EXPERT
+- scripts/config -e TARGET_CORE
+- scripts/config -e ISCSI_TARGET
+- scripts/config -e TCM_IBLOCK
+- scripts/config -e TCM_FILEIO
+- scripts/config -e TCM_PSCSI
+- scripts/config -e TCM_USER
+- scripts/config -e CONFIG_UIO
+- scripts/config -e LOOPBACK_TARGET
+- scripts/config -e TCM_FC
+- scripts/config -e LIBFC
+- scripts/config -e SCSI_FC_ATTRS
+- scripts/config -e SCSI_ISCSI_ATTRS
+- scripts/config -e ISCSI_TCP
+- scripts/config -e SCSI_LOWLEVEL
+# Required for M400
+- scripts/config -e SATA_AHCI_PLATFORM
+- scripts/config -e AHCI_XGENE
+- scripts/config -e GENERIC_PHY
+- scripts/config -e PHY_XGENE
+- scripts/config -e NET_VENDOR_MELLANOX
+- scripts/config -e MLX4_EN
+- scripts/config -e MLX4_EN_DCB
+- scripts/config -e MLX4_EN_VXLAN
+- scripts/config -e MLX4_CORE
+- scripts/config -e MLX5_CORE
+- scripts/config -e NET_IP_TUNNEL
+- scripts/config -e VXLAN
+- scripts/config -e UIO
+- scripts/config -e UIO_PDRV_GENIRQ
+- scripts/config -e GPIO_DWAPB
+- scripts/config -e KEYBOARD_GPIO
+- scripts/config -e INPUT_POLLDEV
+- scripts/config -e KEYBOARD_GPIO_POLLED
+- scripts/config -d DMA_CMA
+- scripts/config -e POWER_RESET
+- scripts/config -e POWER_RESET_GPIO
+- scripts/config -e POWER_RESET_SYSCON
+- scripts/config -e POWER_AVS
+# Big endian kernel
+- scripts/config -e CPU_BIG_ENDIAN
+- yes '' | make ARCH=arm64 oldconfig
+build-commands:
+# Only generate Image here, uImage generated in deployment
+# due to availability of mkimage build systems
+- make vmlinux dtbs $MAKEFLAGS
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- make install dtbs_install INSTALL_PATH="$DESTDIR/boot"
+- cp arch/arm64/boot/Image "$DESTDIR/boot/vmlinux"
diff --git a/strata/bsp-armv8l64-generic.morph b/strata/bsp-armv8l64-generic.morph
new file mode 100644
index 00000000..ca74dbe3
--- /dev/null
+++ b/strata/bsp-armv8l64-generic.morph
@@ -0,0 +1,14 @@
+name: bsp-armv8l64-generic
+kind: stratum
+description: |
+ The set of platform specific components required for booting
+ armv8l64-based systems, like the 64-bit APM XGene ARM based m400
+ Moonshot cartridge.
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: linux-armv8l64-generic
+ morph: strata/bsp-armv8l64-generic/linux-armv8l64-generic.morph
+ repo: upstream:linux
+ ref: 5f06398ae6a04f414932243de38b5cf3d264ff84
+ unpetrify-ref: baserock/apm-xgene-m400-moonshot-cartridge
diff --git a/strata/bsp-armv8l64-generic/linux-armv8l64-generic.morph b/strata/bsp-armv8l64-generic/linux-armv8l64-generic.morph
new file mode 100644
index 00000000..dd54b4e4
--- /dev/null
+++ b/strata/bsp-armv8l64-generic/linux-armv8l64-generic.morph
@@ -0,0 +1,276 @@
+name: linux-armv8l64-generic
+kind: chunk
+configure-commands:
+- make ARCH=arm64 defconfig
+- scripts/config -e PACKET
+- scripts/config -e SATA_AHCI
+- scripts/config -e ATA_GENERIC
+- scripts/config -e HAVE_IDE
+- scripts/config -d BLK_DEV_IDE_SATA
+- scripts/config -e BTRFS_FS
+- scripts/config -e BTRFS_FS_POSIX_ACL
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e CGROUPS
+- scripts/config -e AUTOFS4_FS
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e EXT2_FS
+- scripts/config -e EXT2_FS_XATTR
+- scripts/config -e EXT2_FS_POSIX_ACL
+- scripts/config -e EXT2_FS_SECURITY
+- scripts/config -e EXT2_FS_XIP
+- scripts/config -e EXT3_FS
+- scripts/config -d EXT3_DEFAULTS_TO_ORDERED
+- scripts/config -e EXT3_FS_XATTR
+- scripts/config -e EXT3_FS_POSIX_ACL
+- scripts/config -e EXT3_FS_SECURITY
+- scripts/config -e EXT4_FS
+- scripts/config -e EXT4_FS_XATTR
+- scripts/config -e EXT4_FS_POSIX_ACL
+- scripts/config -e EXT4_FS_SECURITY
+- scripts/config -d EXT4_DEBUG
+- scripts/config -e FUSE_FS
+- scripts/config -e OVERLAY_FS
+- scripts/config -e XFS_FS
+- scripts/config -e LIBCRC32C
+- scripts/config -d JBD_DEBUG
+- scripts/config -d JBD2_DEBUG
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config -d BLK_DEV_CRYPTOLOOP
+- scripts/config -e CEPH_FS
+- scripts/config --set-val BLK_DEV_LOOP_MIN_COUNT 8
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e VIRTIO
+- scripts/config -e VIRTIO_RING
+- scripts/config -e VIRTIO_PCI
+- scripts/config -e VIRTIO_BALLOON
+- scripts/config -e VIRTIO_BLK
+- scripts/config -e VIRTIO_NET
+- scripts/config -e VIRTIO_CONSOLE
+- scripts/config -e HW_RANDOM_VIRTIO
+- scripts/config -e 9P_FS
+- scripts/config -e 9P_FSCACHE
+- scripts/config -e 9P_FS_POSIX_ACL
+- scripts/config -e NET_9P
+- scripts/config -e NET_9P_VIRTIO
+- scripts/config -e R8169
+- scripts/config -e 8139TOO
+- scripts/config -e 8139CP
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e SECCOMP
+- scripts/config -d DEBUG_STACK_TRACE
+- scripts/config -e NFSD
+- scripts/config -e NFSD_V3
+- scripts/config -e KVM
+- scripts/config -e TUN
+- scripts/config -e BRIDGE
+- scripts/config -e VHOST_NET
+- scripts/config -e NF_NAT
+- scripts/config -e IP_NF_NAT
+- scripts/config -e IP_NF_TARGET_MASQUERADE
+- scripts/config -e FB_VESA
+- scripts/config -e HOTPLUG_PCI
+- scripts/config -e HOTPLUG_PCI_ACPI
+- scripts/config -e VLAN_8021Q
+- scripts/config -e BRIDGE_VLAN_FILTERING
+- scripts/config -e IPV6
+- scripts/config -e BLK_DEV_NBD
+- scripts/config -e BRIDGE_NF_EBTABLES
+- scripts/config -e NETFILTER
+- scripts/config -e NETFILTER_ADVANCED
+- scripts/config -e NETFILTER_XT_MATCH_ADDRTYPE
+- scripts/config -e OPENVSWITCH
+- scripts/config -e OPENVSWITCH_VXLAN
+- scripts/config -e CONFIG_OPENVSWITCH_GRE
+- scripts/config -e NET_CLS_BASIC
+- scripts/config -e NET_SCH_INGRESS
+- scripts/config -e NET_ACT_POLICE
+- scripts/config -e NET_IPGRE_DEMUX
+- scripts/config -e NET_SCH_HTB
+- scripts/config -e NET_SCH_HFSC
+- scripts/config -e VXLAN
+- scripts/config -e VETH
+- scripts/config -e IP_NF_MATCH_AH
+- scripts/config -e IP_NF_MATCH_ECN
+- scripts/config -e IP_NF_MATCH_RPFILTER
+- scripts/config -e IP_NF_MATCH_TTL
+- scripts/config -e IP_NF_TARGET_SYNPROXY
+- scripts/config -e IP_NF_TARGET_NETMAP
+- scripts/config -e IP_NF_TARGET_REDIRECT
+- scripts/config -e IP_NF_TARGET_CLUSTERIP
+- scripts/config -e IP_NF_TARGET_ECN
+- scripts/config -e IP_NF_TARGET_TTL
+- scripts/config -e IP_NF_RAW
+- scripts/config -e IP_NF_SECURITY
+- scripts/config -e IP_NF_ARPTABLES
+- scripts/config -e NETFILTER_NETLINK_QUEUE
+- scripts/config -e SCSI_NETLINK
+- scripts/config -e NETFILTER_XT_TARGET_MARK
+- scripts/config -e NETFILTER_XT_SET
+- scripts/config -e IP_SET
+- scripts/config -e IP_SET_BITMAP_IP
+- scripts/config -e IP_SET_BITMAP_IPMAC
+- scripts/config -e IP_SET_BITMAP_PORT
+- scripts/config -e IP_SET_HASH_IP
+- scripts/config -e IP_SET_HASH_IPMARK
+- scripts/config -e IP_SET_HASH_IPPORT
+- scripts/config -e IP_SET_HASH_IPPORTIP
+- scripts/config -e IP_SET_HASH_IPPORTNET
+- scripts/config -e IP_SET_HASH_MAC
+- scripts/config -e IP_SET_HASH_NETPORTNET
+- scripts/config -e IP_SET_HASH_NET
+- scripts/config -e IP_SET_HASH_NETNET
+- scripts/config -e IP_SET_HASH_NETPORT
+- scripts/config -e IP_SET_HASH_NETIFACE
+- scripts/config -e IP_SET_LIST_SET
+- scripts/config -e NF_CONNTRACK_TIMEOUT
+- scripts/config -e NF_CONNTRACK_TIMESTAMP
+- scripts/config -e NF_CONNTRACK_EVENTS
+- scripts/config -e NF_CONNTRACK_LABELS
+- scripts/config -e NETFILTER_NETLINK_ACCT
+- scripts/config -e NETFILTER_NETLINK_QUEUE_CT
+- scripts/config -e NF_CT_PROTO_DCCP
+- scripts/config -e NF_CT_PROTO_GRE
+- scripts/config -e NF_CT_PROTO_SCTP
+- scripts/config -e NF_CT_PROTO_UDPLITE
+- scripts/config -e NF_CT_NETLINK_TIMEOUT
+- scripts/config -e NF_CT_NETLINK_HELPER
+- scripts/config -e NF_CONNTRACK_AMANDA
+- scripts/config -e NF_CONNTRACK_H323
+- scripts/config -e NF_CONNTRACK_BROADCAST
+- scripts/config -e NF_CONNTRACK_NETBIOS_NS
+- scripts/config -e NF_CONNTRACK_SNMP
+- scripts/config -e NF_CONNTRACK_PPTP
+- scripts/config -e NF_CONNTRACK_SANE
+- scripts/config -e NF_CONNTRACK_TFTP
+- scripts/config -e NF_LOG_COMMON
+- scripts/config -e NF_NAT_PROTO_DCCP
+- scripts/config -e NF_NAT_PROTO_UDPLITE
+- scripts/config -e NF_NAT_PROTO_SCTP
+- scripts/config -e NF_NAT_AMANDA
+- scripts/config -e NF_NAT_TFTP
+- scripts/config -e NF_TABLES
+- scripts/config -e NF_TABLES_INET
+- scripts/config -e NFT_COMPAT
+- scripts/config -e NFT_EXTHDR
+- scripts/config -e NFT_META
+- scripts/config -e NFT_CT
+- scripts/config -e NFT_LIMIT
+- scripts/config -e NFT_NAT
+- scripts/config -e NFT_QUEUE
+- scripts/config -e NFT_REJECT
+- scripts/config -e NFT_REJECT_INET
+- scripts/config -e NFT_RBTREE
+- scripts/config -e NFT_HASH
+- scripts/config -e NFT_COUNTER
+- scripts/config -e NFT_LOG
+- scripts/config -e NFT_MASQ
+- scripts/config -e NETFILTER_XT_CONNMARK
+- scripts/config -e NETFILTER_XT_TARGET_AUDIT
+- scripts/config -e NETFILTER_XT_TARGET_CHECKSUM
+- scripts/config -e NETFILTER_XT_TARGET_CLASSIFY
+- scripts/config -e NETFILTER_XT_TARGET_CT
+- scripts/config -e NETFILTER_XT_TARGET_DSCP
+- scripts/config -e NETFILTER_XT_TARGET_HMARK
+- scripts/config -e NETFILTER_XT_TARGET_LED
+- scripts/config -e NETFILTER_XT_TARGET_LOG
+- scripts/config -e NETFILTER_XT_TARGET_NFQUEUE
+- scripts/config -e NETFILTER_XT_TARGET_RATEEST
+- scripts/config -e NETFILTER_XT_TARGET_TPROXY
+- scripts/config -e NETFILTER_XT_TARGET_TCPOPTSTRIP
+- scripts/config -e NETFILTER_XT_TARGET_TEE
+- scripts/config -e NETFILTER_XT_TARGET_TRACE
+- scripts/config -e NETFILTER_XT_TARGET_IDLETIMER
+- scripts/config -e NETFILTER_XT_MATCH_BPF
+- scripts/config -e NETFILTER_XT_MATCH_CLUSTER
+- scripts/config -e NETFILTER_XT_MATCH_COMMENT
+- scripts/config -e NETFILTER_XT_MATCH_CONNBYTES
+- scripts/config -e NETFILTER_XT_MATCH_CONNLABEL
+- scripts/config -e NETFILTER_XT_MATCH_CONNLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_CPU
+- scripts/config -e NETFILTER_XT_MATCH_DCCP
+- scripts/config -e NETFILTER_XT_MATCH_DEVGROUP
+- scripts/config -e NETFILTER_XT_MATCH_DSCP
+- scripts/config -e NETFILTER_XT_MATCH_ESP
+- scripts/config -e NETFILTER_XT_MATCH_HASHLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_HELPER
+- scripts/config -e NETFILTER_XT_MATCH_IPCOMP
+- scripts/config -e NETFILTER_XT_MATCH_IPRANGE
+- scripts/config -e NETFILTER_XT_MATCH_IPVS
+- scripts/config -e NETFILTER_XT_MATCH_L2TP
+- scripts/config -e NETFILTER_XT_MATCH_LENGTH
+- scripts/config -e NETFILTER_XT_MATCH_LIMIT
+- scripts/config -e NETFILTER_XT_MATCH_MAC
+- scripts/config -e NETFILTER_XT_MATCH_MULTIPORT
+- scripts/config -e NETFILTER_XT_MATCH_NFACCT
+- scripts/config -e NETFILTER_XT_MATCH_OSF
+- scripts/config -e NETFILTER_XT_MATCH_OWNER
+- scripts/config -e NETFILTER_XT_MATCH_CGROUP
+- scripts/config -e NETFILTER_XT_MATCH_PHYSDEV
+- scripts/config -e NETFILTER_XT_MATCH_PKTTYPE
+- scripts/config -e NETFILTER_XT_MATCH_QUOTA
+- scripts/config -e NETFILTER_XT_MATCH_RATEEST
+- scripts/config -e NETFILTER_XT_MATCH_REALM
+- scripts/config -e NETFILTER_XT_MATCH_RECENT
+- scripts/config -e NETFILTER_XT_MATCH_SCTP
+- scripts/config -e NETFILTER_XT_MATCH_SOCKET
+- scripts/config -e NETFILTER_XT_MATCH_STATISTIC
+- scripts/config -e NETFILTER_XT_MATCH_STRING
+- scripts/config -e NETFILTER_XT_MATCH_TCPMSS
+- scripts/config -e NETFILTER_XT_MATCH_TIME
+- scripts/config -e NETFILTER_XT_MATCH_U32
+- scripts/config -e IP_VS
+- scripts/config -e BRIDGE_NETFILTER
+- scripts/config -e CRYPTO_CRC32C
+- scripts/config -e CONFIGFS_FS
+- scripts/config -e EXPERT
+- scripts/config -e TARGET_CORE
+- scripts/config -e ISCSI_TARGET
+- scripts/config -e TCM_IBLOCK
+- scripts/config -e TCM_FILEIO
+- scripts/config -e TCM_PSCSI
+- scripts/config -e TCM_USER
+- scripts/config -e CONFIG_UIO
+- scripts/config -e LOOPBACK_TARGET
+- scripts/config -e TCM_FC
+- scripts/config -e LIBFC
+- scripts/config -e SCSI_FC_ATTRS
+- scripts/config -e SCSI_ISCSI_ATTRS
+- scripts/config -e ISCSI_TCP
+- scripts/config -e SCSI_LOWLEVEL
+# Required for M400
+- scripts/config -e SATA_AHCI_PLATFORM
+- scripts/config -e AHCI_XGENE
+- scripts/config -e GENERIC_PHY
+- scripts/config -e PHY_XGENE
+- scripts/config -e NET_VENDOR_MELLANOX
+- scripts/config -e MLX4_EN
+- scripts/config -e MLX4_EN_DCB
+- scripts/config -e MLX4_EN_VXLAN
+- scripts/config -e MLX4_CORE
+- scripts/config -e MLX5_CORE
+- scripts/config -e NET_IP_TUNNEL
+- scripts/config -e VXLAN
+- scripts/config -e UIO
+- scripts/config -e UIO_PDRV_GENIRQ
+- scripts/config -e GPIO_DWAPB
+- scripts/config -e KEYBOARD_GPIO
+- scripts/config -e INPUT_POLLDEV
+- scripts/config -e KEYBOARD_GPIO_POLLED
+- scripts/config -d DMA_CMA
+- scripts/config -e POWER_RESET
+- scripts/config -e POWER_RESET_GPIO
+- scripts/config -e POWER_RESET_SYSCON
+- scripts/config -e POWER_AVS
+- yes '' | make ARCH=arm64 oldconfig
+build-commands:
+# Only generate Image here, uImage generated in deployment
+# due to availability of mkimage build systems
+- make vmlinux dtbs $MAKEFLAGS
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- make install dtbs_install INSTALL_PATH="$DESTDIR/boot"
+- cp arch/arm64/boot/Image "$DESTDIR/boot/vmlinux"
diff --git a/strata/bsp-jetson.morph b/strata/bsp-jetson.morph
new file mode 100644
index 00000000..746c17a6
--- /dev/null
+++ b/strata/bsp-jetson.morph
@@ -0,0 +1,36 @@
+name: bsp-jetson
+kind: stratum
+description: |
+ Platform-specific chunks for NVIDIA Jetson TK1
+
+ Support for the Tegra platform is still being developed. A very recent
+ kernel with some patches is currently required to get a fully
+ accelerated graphics stack on this platform. Note that the SATA and
+ networking will not work unless you have flashed the bootloader on
+ your board to the version of U-Boot built in this stratum. Also, the
+ CPUs on the Jetson run at a slow speed with this version of Linux.
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: device-tree-compiler@jetson
+ morph: strata/bsp-jetson/device-tree-compiler@jetson.morph
+ repo: upstream:device-tree-compiler
+ ref: 302fca9f4c283e1994cf0a5a9ce1cf43ca15e6d2
+ unpetrify-ref: v1.4.1
+- name: u-boot@jetson
+ morph: strata/bsp-jetson/u-boot@jetson.morph
+ repo: upstream:u-boot
+ ref: 5ec0003b19cbdf06ccd6941237cbc0d1c3468e2d
+ unpetrify-ref: v2015.10
+ build-depends:
+ - device-tree-compiler@jetson
+- name: linux-jetson-tk1
+ morph: strata/bsp-jetson/linux-jetson-tk1.morph
+ repo: upstream:linux
+ ref: 69973b830859bc6529a7a0468ba0d80ee5117826
+ unpetrify-ref: v4.9
+- name: linux-firmware@jetson
+ morph: strata/bsp-jetson/linux-firmware@jetson.morph
+ repo: upstream:linux-firmware
+ ref: 6ebf5d57d9f6d0cf05558baef1af2b90a3fe98ed
+ unpetrify-ref: master
diff --git a/strata/bsp-jetson/device-tree-compiler@jetson.morph b/strata/bsp-jetson/device-tree-compiler@jetson.morph
new file mode 100644
index 00000000..52c57739
--- /dev/null
+++ b/strata/bsp-jetson/device-tree-compiler@jetson.morph
@@ -0,0 +1,6 @@
+name: device-tree-compiler@jetson
+kind: chunk
+build-commands:
+- make all
+install-commands:
+- make install DESTDIR="$DESTDIR" PREFIX="$PREFIX"
diff --git a/strata/bsp-jetson/linux-firmware@jetson.morph b/strata/bsp-jetson/linux-firmware@jetson.morph
new file mode 100644
index 00000000..e8415e09
--- /dev/null
+++ b/strata/bsp-jetson/linux-firmware@jetson.morph
@@ -0,0 +1,15 @@
+name: linux-firmware@jetson
+kind: chunk
+install-commands:
+- install -d "$DESTDIR/lib/firmware/nvidia/gk20a"
+- install -d "$DESTDIR/lib/firmware/nvidia/tegra124"
+- install -m644 nvidia/gk20a/fecs_data.bin "$DESTDIR/lib/firmware/nvidia/gk20a"
+- install -m644 nvidia/gk20a/fecs_inst.bin "$DESTDIR/lib/firmware/nvidia/gk20a"
+- install -m644 nvidia/gk20a/gpccs_data.bin "$DESTDIR/lib/firmware/nvidia/gk20a"
+- install -m644 nvidia/gk20a/gpccs_inst.bin "$DESTDIR/lib/firmware/nvidia/gk20a"
+- install -m644 nvidia/gk20a/sw_bundle_init.bin "$DESTDIR/lib/firmware/nvidia/gk20a"
+- install -m644 nvidia/gk20a/sw_ctx.bin "$DESTDIR/lib/firmware/nvidia/gk20a"
+- install -m644 nvidia/gk20a/sw_method_init.bin "$DESTDIR/lib/firmware/nvidia/gk20a"
+- install -m644 nvidia/gk20a/sw_nonctx.bin "$DESTDIR/lib/firmware/nvidia/gk20a"
+- install -m644 nvidia/tegra124/xusb.bin "$DESTDIR/lib/firmware/nvidia/tegra124"
+- install -m644 LICENCE.nvidia "$DESTDIR/lib/firmware"
diff --git a/strata/bsp-jetson/linux-jetson-tk1.morph b/strata/bsp-jetson/linux-jetson-tk1.morph
new file mode 100644
index 00000000..b2d56d54
--- /dev/null
+++ b/strata/bsp-jetson/linux-jetson-tk1.morph
@@ -0,0 +1,252 @@
+name: linux-jetson-tk1
+kind: chunk
+configure-commands:
+- make ARCH=arm tegra_defconfig
+- scripts/config -d KERNEL_LZO
+- scripts/config -e KERNEL_GZIP
+- scripts/config -e NAMESPACES
+- scripts/config -e PACKET
+- scripts/config -e SATA_AHCI
+- scripts/config -e ATA_GENERIC
+- scripts/config -e HAVE_IDE
+- scripts/config -d BLK_DEV_IDE_SATA
+- scripts/config -e BTRFS_FS
+- scripts/config -e BTRFS_FS_POSIX_ACL
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e CGROUPS
+- scripts/config -e AUTOFS4_FS
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e EXT2_FS
+- scripts/config -e EXT2_FS_XATTR
+- scripts/config -e EXT2_FS_POSIX_ACL
+- scripts/config -e EXT2_FS_SECURITY
+- scripts/config -e EXT2_FS_XIP
+- scripts/config -e EXT3_FS
+- scripts/config -d EXT3_DEFAULTS_TO_ORDERED
+- scripts/config -e EXT3_FS_XATTR
+- scripts/config -e EXT3_FS_POSIX_ACL
+- scripts/config -e EXT3_FS_SECURITY
+- scripts/config -e EXT4_FS
+- scripts/config -e EXT4_FS_XATTR
+- scripts/config -e EXT4_FS_POSIX_ACL
+- scripts/config -e EXT4_FS_SECURITY
+- scripts/config -d EXT4_DEBUG
+- scripts/config -e OVERLAY_FS
+- scripts/config -e XFS_FS
+- scripts/config -e LIBCRC32C
+- scripts/config -d JBD_DEBUG
+- scripts/config -d JBD2_DEBUG
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config -d BLK_DEV_CRYPTOLOOP
+- scripts/config --set-val BLK_DEV_LOOP_MIN_COUNT 8
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e SECCOMP
+- scripts/config -d DEBUG_STACK_TRACE
+- scripts/config -e NFSD
+- scripts/config -e NFSD_V3
+- scripts/config -e DRM_TEGRA_STAGING
+- scripts/config -e VLAN_8021Q
+- scripts/config -e BRIDGE_VLAN_FILTERING
+- scripts/config -e BLK_DEV_NBD
+- scripts/config -e BRIDGE_NF_EBTABLES
+- scripts/config -e NETFILTER
+- scripts/config -e NETFILTER_ADVANCED
+- scripts/config -e NETFILTER_XT_MATCH_ADDRTYPE
+- scripts/config -e OPENVSWITCH
+- scripts/config -e OPENVSWITCH_VXLAN
+- scripts/config -e CONFIG_OPENVSWITCH_GRE
+- scripts/config -e NET_CLS_BASIC
+- scripts/config -e NET_SCH_INGRESS
+- scripts/config -e NET_ACT_POLICE
+- scripts/config -e NET_IPGRE_DEMUX
+- scripts/config -e NET_SCH_HTB
+- scripts/config -e NET_SCH_HFSC
+- scripts/config -e VXLAN
+- scripts/config -e VETH
+- scripts/config -e IP_NF_MATCH_AH
+- scripts/config -e IP_NF_MATCH_ECN
+- scripts/config -e IP_NF_MATCH_RPFILTER
+- scripts/config -e IP_NF_MATCH_TTL
+- scripts/config -e IP_NF_TARGET_SYNPROXY
+- scripts/config -e IP_NF_TARGET_NETMAP
+- scripts/config -e IP_NF_TARGET_REDIRECT
+- scripts/config -e IP_NF_TARGET_CLUSTERIP
+- scripts/config -e IP_NF_TARGET_ECN
+- scripts/config -e IP_NF_TARGET_TTL
+- scripts/config -e IP_NF_RAW
+- scripts/config -e IP_NF_SECURITY
+- scripts/config -e IP_NF_ARPTABLES
+- scripts/config -e NETFILTER_NETLINK_QUEUE
+- scripts/config -e SCSI_NETLINK
+- scripts/config -e NETFILTER_XT_TARGET_MARK
+- scripts/config -e NETFILTER_XT_SET
+- scripts/config -e IP_SET
+- scripts/config -e IP_SET_BITMAP_IP
+- scripts/config -e IP_SET_BITMAP_IPMAC
+- scripts/config -e IP_SET_BITMAP_PORT
+- scripts/config -e IP_SET_HASH_IP
+- scripts/config -e IP_SET_HASH_IPMARK
+- scripts/config -e IP_SET_HASH_IPPORT
+- scripts/config -e IP_SET_HASH_IPPORTIP
+- scripts/config -e IP_SET_HASH_IPPORTNET
+- scripts/config -e IP_SET_HASH_MAC
+- scripts/config -e IP_SET_HASH_NETPORTNET
+- scripts/config -e IP_SET_HASH_NET
+- scripts/config -e IP_SET_HASH_NETNET
+- scripts/config -e IP_SET_HASH_NETPORT
+- scripts/config -e IP_SET_HASH_NETIFACE
+- scripts/config -e IP_SET_LIST_SET
+- scripts/config -e NF_CONNTRACK_TIMEOUT
+- scripts/config -e NF_CONNTRACK_TIMESTAMP
+- scripts/config -e NF_CONNTRACK_EVENTS
+- scripts/config -e NF_CONNTRACK_LABELS
+- scripts/config -e NETFILTER_NETLINK_ACCT
+- scripts/config -e NETFILTER_NETLINK_QUEUE_CT
+- scripts/config -e NF_CT_PROTO_DCCP
+- scripts/config -e NF_CT_PROTO_GRE
+- scripts/config -e NF_CT_PROTO_SCTP
+- scripts/config -e NF_CT_PROTO_UDPLITE
+- scripts/config -e NF_CT_NETLINK_TIMEOUT
+- scripts/config -e NF_CT_NETLINK_HELPER
+- scripts/config -e NF_CONNTRACK_AMANDA
+- scripts/config -e NF_CONNTRACK_H323
+- scripts/config -e NF_CONNTRACK_BROADCAST
+- scripts/config -e NF_CONNTRACK_NETBIOS_NS
+- scripts/config -e NF_CONNTRACK_SNMP
+- scripts/config -e NF_CONNTRACK_PPTP
+- scripts/config -e NF_CONNTRACK_SANE
+- scripts/config -e NF_CONNTRACK_TFTP
+- scripts/config -e NF_LOG_COMMON
+- scripts/config -e NF_NAT_PROTO_DCCP
+- scripts/config -e NF_NAT_PROTO_UDPLITE
+- scripts/config -e NF_NAT_PROTO_SCTP
+- scripts/config -e NF_NAT_AMANDA
+- scripts/config -e NF_NAT_TFTP
+- scripts/config -e NF_TABLES
+- scripts/config -e NF_TABLES_INET
+- scripts/config -e NFT_COMPAT
+- scripts/config -e NFT_EXTHDR
+- scripts/config -e NFT_META
+- scripts/config -e NFT_CT
+- scripts/config -e NFT_LIMIT
+- scripts/config -e NFT_NAT
+- scripts/config -e NFT_QUEUE
+- scripts/config -e NFT_REJECT
+- scripts/config -e NFT_REJECT_INET
+- scripts/config -e NFT_RBTREE
+- scripts/config -e NFT_HASH
+- scripts/config -e NFT_COUNTER
+- scripts/config -e NFT_LOG
+- scripts/config -e NFT_MASQ
+- scripts/config -e NETFILTER_XT_CONNMARK
+- scripts/config -e NETFILTER_XT_TARGET_AUDIT
+- scripts/config -e NETFILTER_XT_TARGET_CHECKSUM
+- scripts/config -e NETFILTER_XT_TARGET_CLASSIFY
+- scripts/config -e NETFILTER_XT_TARGET_CT
+- scripts/config -e NETFILTER_XT_TARGET_DSCP
+- scripts/config -e NETFILTER_XT_TARGET_HMARK
+- scripts/config -e NETFILTER_XT_TARGET_LED
+- scripts/config -e NETFILTER_XT_TARGET_LOG
+- scripts/config -e NETFILTER_XT_TARGET_NFQUEUE
+- scripts/config -e NETFILTER_XT_TARGET_RATEEST
+- scripts/config -e NETFILTER_XT_TARGET_TPROXY
+- scripts/config -e NETFILTER_XT_TARGET_TCPOPTSTRIP
+- scripts/config -e NETFILTER_XT_TARGET_TEE
+- scripts/config -e NETFILTER_XT_TARGET_TRACE
+- scripts/config -e NETFILTER_XT_TARGET_IDLETIMER
+- scripts/config -e NETFILTER_XT_MATCH_BPF
+- scripts/config -e NETFILTER_XT_MATCH_CLUSTER
+- scripts/config -e NETFILTER_XT_MATCH_COMMENT
+- scripts/config -e NETFILTER_XT_MATCH_CONNBYTES
+- scripts/config -e NETFILTER_XT_MATCH_CONNLABEL
+- scripts/config -e NETFILTER_XT_MATCH_CONNLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_CPU
+- scripts/config -e NETFILTER_XT_MATCH_DCCP
+- scripts/config -e NETFILTER_XT_MATCH_DEVGROUP
+- scripts/config -e NETFILTER_XT_MATCH_DSCP
+- scripts/config -e NETFILTER_XT_MATCH_ESP
+- scripts/config -e NETFILTER_XT_MATCH_HASHLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_HELPER
+- scripts/config -e NETFILTER_XT_MATCH_IPCOMP
+- scripts/config -e NETFILTER_XT_MATCH_IPRANGE
+- scripts/config -e NETFILTER_XT_MATCH_IPVS
+- scripts/config -e NETFILTER_XT_MATCH_L2TP
+- scripts/config -e NETFILTER_XT_MATCH_LENGTH
+- scripts/config -e NETFILTER_XT_MATCH_LIMIT
+- scripts/config -e NETFILTER_XT_MATCH_MAC
+- scripts/config -e NETFILTER_XT_MATCH_MULTIPORT
+- scripts/config -e NETFILTER_XT_MATCH_NFACCT
+- scripts/config -e NETFILTER_XT_MATCH_OSF
+- scripts/config -e NETFILTER_XT_MATCH_OWNER
+- scripts/config -e NETFILTER_XT_MATCH_CGROUP
+- scripts/config -e NETFILTER_XT_MATCH_PHYSDEV
+- scripts/config -e NETFILTER_XT_MATCH_PKTTYPE
+- scripts/config -e NETFILTER_XT_MATCH_QUOTA
+- scripts/config -e NETFILTER_XT_MATCH_RATEEST
+- scripts/config -e NETFILTER_XT_MATCH_REALM
+- scripts/config -e NETFILTER_XT_MATCH_RECENT
+- scripts/config -e NETFILTER_XT_MATCH_SCTP
+- scripts/config -e NETFILTER_XT_MATCH_SOCKET
+- scripts/config -e NETFILTER_XT_MATCH_STATISTIC
+- scripts/config -e NETFILTER_XT_MATCH_STRING
+- scripts/config -e NETFILTER_XT_MATCH_TCPMSS
+- scripts/config -e NETFILTER_XT_MATCH_TIME
+- scripts/config -e NETFILTER_XT_MATCH_U32
+- scripts/config -e IP_VS
+- scripts/config -e BRIDGE_NETFILTER
+- scripts/config -e CRYPTO_CRC32C
+- scripts/config -e CONFIGFS_FS
+- scripts/config -e EXPERT
+- scripts/config -e TARGET_CORE
+- scripts/config -e ISCSI_TARGET
+- scripts/config -e TCM_IBLOCK
+- scripts/config -e TCM_FILEIO
+- scripts/config -e TCM_PSCSI
+- scripts/config -e TCM_USER
+- scripts/config -e CONFIG_UIO
+- scripts/config -e LOOPBACK_TARGET
+- scripts/config -e TCM_FC
+- scripts/config -e LIBFC
+- scripts/config -e SCSI_FC_ATTRS
+- scripts/config -e SCSI_ISCSI_ATTRS
+- scripts/config -e ISCSI_TCP
+- scripts/config -e SCSI_LOWLEVEL
+- scripts/config -e NOUVEAU_PLATFORM_DRIVER
+- scripts/config -e DRM_TEGRA_STAGING
+- scripts/config -e BT
+- yes '' | make ARCH=arm oldconfig
+build-commands:
+- make $MAKEFLAGS ARCH=arm LOADADDR=0x80200000 zImage dtbs
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- cp arch/arm/boot/zImage "$DESTDIR"/boot/zImage
+- cp arch/arm/boot/dts/tegra124-jetson-tk1.dtb "$DESTDIR"/boot/.
+- make modules
+- make INSTALL_MOD_PATH="$DESTDIR" modules_install
+- install -d "$DESTDIR$PREFIX/src/linux"
+- |
+ (
+ printf 'Makefile\0'
+ printf 'Module.symvers\0'
+ find arch/arm -maxdepth 1 -name 'Makefile*' -print0
+ find arch/arm \( -name 'module.lds' -o -name 'Kbuild.platforms' -o -name 'Platform' \) -print0
+ find arch/arm \( -type d -a \( -name include -o -name scripts \) \) -o \
+ \! -type d -a \( -path '*include/*' -o -path '*scripts/*' \) -print0
+ find include -name 'asm*' -prune -o -print0
+ find include/asm-generic -print0
+ find include/uapi -print0
+ find scripts -print0
+ ) | cpio -0pumd "$DESTDIR$PREFIX/src/linux"
+system-integration:
+ linux-jetson-tk1-misc:
+ # This is required for any modules to work correctly. However, it depends
+ # `depmod` from the 'kmod' chunk in the 'foundation' stratum, so it runs
+ # conditionally on `depmod` existing to avoid breaking in
+ # minimal-system-x86_64.
+ 00-depmod:
+ - if which depmod; then (cd /usr/lib/modules && for version in *; do depmod -a "$version"; done) fi
diff --git a/strata/bsp-jetson/u-boot@jetson.morph b/strata/bsp-jetson/u-boot@jetson.morph
new file mode 100644
index 00000000..533f253a
--- /dev/null
+++ b/strata/bsp-jetson/u-boot@jetson.morph
@@ -0,0 +1,20 @@
+name: u-boot@jetson
+kind: chunk
+configure-commands:
+- make ARCH=arm jetson-tk1_config
+build-commands:
+- make ARCH=arm CROSS_COMPILE=/usr/bin/
+- make ARCH=arm CROSS_COMPILE=/usr/bin/ tools
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX/bin"
+- mkdir -p "$DESTDIR/boot"
+- mkdir -p "$DESTDIR/boot/u-boot/"
+- install -m 755 u-boot-dtb-tegra.bin "$DESTDIR/boot/u-boot.bin"
+- install -m 755 u-boot-nodtb-tegra.bin "$DESTDIR/boot/u-boot/u-boot-nodtb-tegra.bin"
+- install -m 755 u-boot.dtb "$DESTDIR/boot/u-boot/u-boot.dtb"
+- size -A u-boot | grep -w .bss | tr -s ' ' | cut -d ' ' -f 2 > "$DESTDIR/boot/u-boot/u-boot-bss-size"
+- install -m 755 tools/img2brec.sh "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/jtagconsole "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/netconsole "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/mkenvimage "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/mkimage "$DESTDIR$PREFIX/bin/."
diff --git a/strata/bsp-ppc64-generic.morph b/strata/bsp-ppc64-generic.morph
new file mode 100644
index 00000000..ea606a75
--- /dev/null
+++ b/strata/bsp-ppc64-generic.morph
@@ -0,0 +1,11 @@
+name: bsp-ppc64-generic
+kind: stratum
+description: The platform dependent components required to boot a ppc64 board.
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: linux-ppc64
+ morph: strata/bsp-ppc64-generic/linux-ppc64.morph
+ repo: upstream:linux
+ ref: 39a8804455fb23f09157341d3ba7db6d7ae6ee76
+ unpetrify-ref: v4.0
diff --git a/strata/bsp-ppc64-generic/linux-ppc64.morph b/strata/bsp-ppc64-generic/linux-ppc64.morph
new file mode 100644
index 00000000..d2ef0747
--- /dev/null
+++ b/strata/bsp-ppc64-generic/linux-ppc64.morph
@@ -0,0 +1,226 @@
+name: linux-ppc64
+kind: chunk
+configure-commands:
+- make ARCH=powerpc ppc64_defconfig
+- scripts/config -e NAMESPACES
+- scripts/config -e PACKET
+- scripts/config -e SATA_AHCI
+- scripts/config -e ATA_GENERIC
+- scripts/config -e HAVE_IDE
+- scripts/config -d BLK_DEV_IDE_SATA
+- scripts/config -e BTRFS_FS
+- scripts/config -e BTRFS_FS_POSIX_ACL
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e CGROUPS
+- scripts/config -e AUTOFS4_FS
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e EXT2_FS
+- scripts/config -e EXT2_FS_XATTR
+- scripts/config -e EXT2_FS_POSIX_ACL
+- scripts/config -e EXT2_FS_SECURITY
+- scripts/config -e EXT2_FS_XIP
+- scripts/config -e EXT3_FS
+- scripts/config -d EXT3_DEFAULTS_TO_ORDERED
+- scripts/config -e EXT3_FS_XATTR
+- scripts/config -e EXT3_FS_POSIX_ACL
+- scripts/config -e EXT3_FS_SECURITY
+- scripts/config -e EXT4_FS
+- scripts/config -e EXT4_FS_XATTR
+- scripts/config -e EXT4_FS_POSIX_ACL
+- scripts/config -e EXT4_FS_SECURITY
+- scripts/config -d EXT4_DEBUG
+- scripts/config -e FUSE_FS
+- scripts/config -e OVERLAY_FS
+- scripts/config -e XFS_FS
+- scripts/config -e LIBCRC32C
+- scripts/config -d JBD_DEBUG
+- scripts/config -d JBD2_DEBUG
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config -d BLK_DEV_CRYPTOLOOP
+- scripts/config --set-val BLK_DEV_LOOP_MIN_COUNT 8
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e SECCOMP
+- scripts/config -d DEBUG_STACK_TRACE
+- scripts/config -e NFSD
+- scripts/config -e NFSD_V3
+- scripts/config -e IP_PNP
+- scripts/config -e IP_PNP_DHCP
+- scripts/config -e NFS_FS
+- scripts/config -e ROOT_NFS
+- scripts/config -e PCI
+- scripts/config -e TIGON3
+- scripts/config -e BLK_DEV_NBD
+- scripts/config -e BRIDGE_NF_EBTABLES
+- scripts/config -e NETFILTER
+- scripts/config -e NETFILTER_ADVANCED
+- scripts/config -e NETFILTER_XT_MATCH_ADDRTYPE
+- scripts/config -e OPENVSWITCH
+- scripts/config -e OPENVSWITCH_VXLAN
+- scripts/config -e CONFIG_OPENVSWITCH_GRE
+- scripts/config -e NET_CLS_BASIC
+- scripts/config -e NET_SCH_INGRESS
+- scripts/config -e NET_ACT_POLICE
+- scripts/config -e NET_IPGRE_DEMUX
+- scripts/config -e NET_SCH_HTB
+- scripts/config -e NET_SCH_HFSC
+- scripts/config -e VXLAN
+- scripts/config -e VETH
+- scripts/config -e IP_NF_MATCH_AH
+- scripts/config -e IP_NF_MATCH_ECN
+- scripts/config -e IP_NF_MATCH_RPFILTER
+- scripts/config -e IP_NF_MATCH_TTL
+- scripts/config -e IP_NF_TARGET_SYNPROXY
+- scripts/config -e IP_NF_TARGET_NETMAP
+- scripts/config -e IP_NF_TARGET_REDIRECT
+- scripts/config -e IP_NF_TARGET_CLUSTERIP
+- scripts/config -e IP_NF_TARGET_ECN
+- scripts/config -e IP_NF_TARGET_TTL
+- scripts/config -e IP_NF_RAW
+- scripts/config -e IP_NF_SECURITY
+- scripts/config -e IP_NF_ARPTABLES
+- scripts/config -e NETFILTER_NETLINK_QUEUE
+- scripts/config -e SCSI_NETLINK
+- scripts/config -e NETFILTER_XT_TARGET_MARK
+- scripts/config -e NETFILTER_XT_SET
+- scripts/config -e IP_SET
+- scripts/config -e IP_SET_BITMAP_IP
+- scripts/config -e IP_SET_BITMAP_IPMAC
+- scripts/config -e IP_SET_BITMAP_PORT
+- scripts/config -e IP_SET_HASH_IP
+- scripts/config -e IP_SET_HASH_IPMARK
+- scripts/config -e IP_SET_HASH_IPPORT
+- scripts/config -e IP_SET_HASH_IPPORTIP
+- scripts/config -e IP_SET_HASH_IPPORTNET
+- scripts/config -e IP_SET_HASH_MAC
+- scripts/config -e IP_SET_HASH_NETPORTNET
+- scripts/config -e IP_SET_HASH_NET
+- scripts/config -e IP_SET_HASH_NETNET
+- scripts/config -e IP_SET_HASH_NETPORT
+- scripts/config -e IP_SET_HASH_NETIFACE
+- scripts/config -e IP_SET_LIST_SET
+- scripts/config -e NF_CONNTRACK_TIMEOUT
+- scripts/config -e NF_CONNTRACK_TIMESTAMP
+- scripts/config -e NF_CONNTRACK_EVENTS
+- scripts/config -e NF_CONNTRACK_LABELS
+- scripts/config -e NETFILTER_NETLINK_ACCT
+- scripts/config -e NETFILTER_NETLINK_QUEUE_CT
+- scripts/config -e NF_CT_PROTO_DCCP
+- scripts/config -e NF_CT_PROTO_GRE
+- scripts/config -e NF_CT_PROTO_SCTP
+- scripts/config -e NF_CT_PROTO_UDPLITE
+- scripts/config -e NF_CT_NETLINK_TIMEOUT
+- scripts/config -e NF_CT_NETLINK_HELPER
+- scripts/config -e NF_CONNTRACK_AMANDA
+- scripts/config -e NF_CONNTRACK_H323
+- scripts/config -e NF_CONNTRACK_BROADCAST
+- scripts/config -e NF_CONNTRACK_NETBIOS_NS
+- scripts/config -e NF_CONNTRACK_SNMP
+- scripts/config -e NF_CONNTRACK_PPTP
+- scripts/config -e NF_CONNTRACK_SANE
+- scripts/config -e NF_CONNTRACK_TFTP
+- scripts/config -e NF_LOG_COMMON
+- scripts/config -e NF_NAT_PROTO_DCCP
+- scripts/config -e NF_NAT_PROTO_UDPLITE
+- scripts/config -e NF_NAT_PROTO_SCTP
+- scripts/config -e NF_NAT_AMANDA
+- scripts/config -e NF_NAT_TFTP
+- scripts/config -e NF_TABLES
+- scripts/config -e NF_TABLES_INET
+- scripts/config -e NFT_COMPAT
+- scripts/config -e NFT_EXTHDR
+- scripts/config -e NFT_META
+- scripts/config -e NFT_CT
+- scripts/config -e NFT_LIMIT
+- scripts/config -e NFT_NAT
+- scripts/config -e NFT_QUEUE
+- scripts/config -e NFT_REJECT
+- scripts/config -e NFT_REJECT_INET
+- scripts/config -e NFT_RBTREE
+- scripts/config -e NFT_HASH
+- scripts/config -e NFT_COUNTER
+- scripts/config -e NFT_LOG
+- scripts/config -e NFT_MASQ
+- scripts/config -e NETFILTER_XT_CONNMARK
+- scripts/config -e NETFILTER_XT_TARGET_AUDIT
+- scripts/config -e NETFILTER_XT_TARGET_CHECKSUM
+- scripts/config -e NETFILTER_XT_TARGET_CLASSIFY
+- scripts/config -e NETFILTER_XT_TARGET_CT
+- scripts/config -e NETFILTER_XT_TARGET_DSCP
+- scripts/config -e NETFILTER_XT_TARGET_HMARK
+- scripts/config -e NETFILTER_XT_TARGET_LED
+- scripts/config -e NETFILTER_XT_TARGET_LOG
+- scripts/config -e NETFILTER_XT_TARGET_NFQUEUE
+- scripts/config -e NETFILTER_XT_TARGET_RATEEST
+- scripts/config -e NETFILTER_XT_TARGET_TPROXY
+- scripts/config -e NETFILTER_XT_TARGET_TCPOPTSTRIP
+- scripts/config -e NETFILTER_XT_TARGET_TEE
+- scripts/config -e NETFILTER_XT_TARGET_TRACE
+- scripts/config -e NETFILTER_XT_TARGET_IDLETIMER
+- scripts/config -e NETFILTER_XT_MATCH_BPF
+- scripts/config -e NETFILTER_XT_MATCH_CLUSTER
+- scripts/config -e NETFILTER_XT_MATCH_COMMENT
+- scripts/config -e NETFILTER_XT_MATCH_CONNBYTES
+- scripts/config -e NETFILTER_XT_MATCH_CONNLABEL
+- scripts/config -e NETFILTER_XT_MATCH_CONNLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_CPU
+- scripts/config -e NETFILTER_XT_MATCH_DCCP
+- scripts/config -e NETFILTER_XT_MATCH_DEVGROUP
+- scripts/config -e NETFILTER_XT_MATCH_DSCP
+- scripts/config -e NETFILTER_XT_MATCH_ESP
+- scripts/config -e NETFILTER_XT_MATCH_HASHLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_HELPER
+- scripts/config -e NETFILTER_XT_MATCH_IPCOMP
+- scripts/config -e NETFILTER_XT_MATCH_IPRANGE
+- scripts/config -e NETFILTER_XT_MATCH_IPVS
+- scripts/config -e NETFILTER_XT_MATCH_L2TP
+- scripts/config -e NETFILTER_XT_MATCH_LENGTH
+- scripts/config -e NETFILTER_XT_MATCH_LIMIT
+- scripts/config -e NETFILTER_XT_MATCH_MAC
+- scripts/config -e NETFILTER_XT_MATCH_MULTIPORT
+- scripts/config -e NETFILTER_XT_MATCH_NFACCT
+- scripts/config -e NETFILTER_XT_MATCH_OSF
+- scripts/config -e NETFILTER_XT_MATCH_OWNER
+- scripts/config -e NETFILTER_XT_MATCH_CGROUP
+- scripts/config -e NETFILTER_XT_MATCH_PHYSDEV
+- scripts/config -e NETFILTER_XT_MATCH_PKTTYPE
+- scripts/config -e NETFILTER_XT_MATCH_QUOTA
+- scripts/config -e NETFILTER_XT_MATCH_RATEEST
+- scripts/config -e NETFILTER_XT_MATCH_REALM
+- scripts/config -e NETFILTER_XT_MATCH_RECENT
+- scripts/config -e NETFILTER_XT_MATCH_SCTP
+- scripts/config -e NETFILTER_XT_MATCH_SOCKET
+- scripts/config -e NETFILTER_XT_MATCH_STATISTIC
+- scripts/config -e NETFILTER_XT_MATCH_STRING
+- scripts/config -e NETFILTER_XT_MATCH_TCPMSS
+- scripts/config -e NETFILTER_XT_MATCH_TIME
+- scripts/config -e NETFILTER_XT_MATCH_U32
+- scripts/config -e IP_VS
+- scripts/config -e BRIDGE_NETFILTER
+- scripts/config -e CRYPTO_CRC32C
+- scripts/config -e CONFIGFS_FS
+- scripts/config -e EXPERT
+- scripts/config -e TARGET_CORE
+- scripts/config -e ISCSI_TARGET
+- scripts/config -e TCM_IBLOCK
+- scripts/config -e TCM_FILEIO
+- scripts/config -e TCM_PSCSI
+- scripts/config -e TCM_USER
+- scripts/config -e CONFIG_UIO
+- scripts/config -e LOOPBACK_TARGET
+- scripts/config -e TCM_FC
+- scripts/config -e LIBFC
+- scripts/config -e SCSI_FC_ATTRS
+- scripts/config -e SCSI_ISCSI_ATTRS
+- scripts/config -e ISCSI_TCP
+- scripts/config -e SCSI_LOWLEVEL
+- yes '' | make oldconfig
+build-commands:
+- make $MAKEFLAGS ARCH=powerpc zImage
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- cp arch/powerpc/boot/zImage "$DESTDIR"/boot/zImage
diff --git a/strata/bsp-wandboard.morph b/strata/bsp-wandboard.morph
new file mode 100644
index 00000000..ba704b1b
--- /dev/null
+++ b/strata/bsp-wandboard.morph
@@ -0,0 +1,18 @@
+name: bsp-wandboard
+kind: stratum
+description: The platform dependent components required to boot an wandboard ARM board.
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: u-boot@wandboard
+ morph: strata/bsp-wandboard/u-boot@wandboard.morph
+ repo: upstream:u-boot
+ ref: fe57382d04b46c37f34cf8d3b3ad876554fd12bf
+ unpetrify-ref: baserock/morph
+- name: linux-armv7-wandboard
+ morph: strata/bsp-wandboard/linux-armv7-wandboard.morph
+ repo: upstream:linux-stable
+ ref: 660613d1a4e94144490850b6c3d350331860fac4
+ unpetrify-ref: v3.19.2
+ build-depends:
+ - u-boot@wandboard
diff --git a/strata/bsp-wandboard/linux-armv7-wandboard.morph b/strata/bsp-wandboard/linux-armv7-wandboard.morph
new file mode 100644
index 00000000..8137198e
--- /dev/null
+++ b/strata/bsp-wandboard/linux-armv7-wandboard.morph
@@ -0,0 +1,70 @@
+name: linux-armv7-wandboard
+kind: chunk
+configure-commands:
+- make ARCH=arm imx_v6_v7_defconfig
+- scripts/config -d KERNEL_LZO
+- scripts/config -e KERNEL_GZIP
+- scripts/config -e NAMESPACES
+- scripts/config -e PACKET
+- scripts/config -e SATA_AHCI
+- scripts/config -e ATA_GENERIC
+- scripts/config -e HAVE_IDE
+- scripts/config -d BLK_DEV_IDE_SATA
+- scripts/config -e BTRFS_FS
+- scripts/config -e BTRFS_FS_POSIX_ACL
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e CGROUPS
+- scripts/config -e AUTOFS4_FS
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e EXT2_FS
+- scripts/config -e EXT2_FS_XATTR
+- scripts/config -e EXT2_FS_POSIX_ACL
+- scripts/config -e EXT2_FS_SECURITY
+- scripts/config -e EXT2_FS_XIP
+- scripts/config -e EXT3_FS
+- scripts/config -d EXT3_DEFAULTS_TO_ORDERED
+- scripts/config -e EXT3_FS_XATTR
+- scripts/config -e EXT3_FS_POSIX_ACL
+- scripts/config -e EXT3_FS_SECURITY
+- scripts/config -e EXT4_FS
+- scripts/config -e EXT4_FS_XATTR
+- scripts/config -e EXT4_FS_POSIX_ACL
+- scripts/config -e EXT4_FS_SECURITY
+- scripts/config -d EXT4_DEBUG
+- scripts/config -e FUSE_FS
+- scripts/config -e OVERLAY_FS
+- scripts/config -d JBD_DEBUG
+- scripts/config -d JBD2_DEBUG
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config -d BLK_DEV_CRYPTOLOOP
+- scripts/config --set-val BLK_DEV_LOOP_MIN_COUNT 8
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e SECCOMP
+- scripts/config -d DEBUG_STACK_TRACE
+- scripts/config -e NFSD
+- scripts/config -e NFSD_V3
+- scripts/config -e VLAN_8021Q
+- scripts/config -e BRIDGE_VLAN_FILTERING
+- scripts/config -e VETH
+- yes '' | make oldconfig
+build-commands:
+- make $MAKEFLAGS ARCH=arm LOADADDR=0x10800000 uImage dtbs
+- |
+ cat >boot.script <<'EOF'
+ setenv image_addr "0x12000000"
+ setenv bootargs "console=ttymxc0,115200 root=/dev/nfs rw ip=dhcp nfsroot=${fileserver}:${nfsroot},v3,tcp"
+ dhcp ${image_addr} ${fileserver}:${tfpboot}/uImage
+ bootm ${image_addr}
+ EOF
+- mkimage -A arm -T script -C none -n "Wandboard TFTP Boot Script" -d boot.script
+ boot.scr
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- cp arch/arm/boot/uImage "$DESTDIR"/boot/uImage
+- cp boot.scr "$DESTDIR"/boot/boot.scr
+- cp arch/arm/boot/dts/imx6*-wandboard.dtb "$DESTDIR"/boot/.
diff --git a/strata/bsp-wandboard/u-boot@wandboard.morph b/strata/bsp-wandboard/u-boot@wandboard.morph
new file mode 100644
index 00000000..8a51ee7c
--- /dev/null
+++ b/strata/bsp-wandboard/u-boot@wandboard.morph
@@ -0,0 +1,11 @@
+name: u-boot@wandboard
+kind: chunk
+build-commands:
+- make tools
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX/bin"
+- install -m 755 tools/img2brec.sh "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/jtagconsole "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/netconsole "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/mkenvimage "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/mkimage "$DESTDIR$PREFIX/bin/."
diff --git a/strata/bsp-x86_32-generic.morph b/strata/bsp-x86_32-generic.morph
new file mode 100644
index 00000000..8c558dca
--- /dev/null
+++ b/strata/bsp-x86_32-generic.morph
@@ -0,0 +1,26 @@
+name: bsp-x86_32-generic
+kind: stratum
+description: The set of platform specific components required for booting a 32-bit
+ x86 based system.
+build-depends:
+# nasm wants asciidoc and xmlto for generating its docs
+# so include docutils here
+- morph: strata/docutils.morph
+chunks:
+- name: linux-x86-32-generic
+ morph: strata/bsp-x86_32-generic/linux-x86-32-generic.morph
+ repo: upstream:linux
+ ref: 6f7da290413ba713f0cdd9ff1a2a9bb129ef4f6c
+ unpetrify-ref: v4.12
+- name: nasm
+ morph: strata/bsp-x86_32-generic/nasm.morph
+ repo: upstream:nasm
+ ref: 8fa0fe16408afc76ce1ae4387e1a9d46893cfda6
+ unpetrify-ref: nasm-2.11.08
+- name: syslinux
+ morph: strata/bsp-x86_32-generic/syslinux.morph
+ repo: upstream:syslinux
+ ref: 02ab5d34ba0a90e3b6dd78034d7c470c77500119
+ unpetrify-ref: baserock/syslinux-4.06-gcc7
+ build-depends:
+ - nasm
diff --git a/strata/bsp-x86_32-generic/linux-x86-32-generic.morph b/strata/bsp-x86_32-generic/linux-x86-32-generic.morph
new file mode 100644
index 00000000..a28e43d7
--- /dev/null
+++ b/strata/bsp-x86_32-generic/linux-x86-32-generic.morph
@@ -0,0 +1,299 @@
+name: linux-x86-32-generic
+kind: chunk
+products:
+- artifact: linux-x86-32-generic-devel
+ include:
+ - (usr/)?src/linux/.*
+- artifact: linux-x86-32-generic-bins
+ include:
+ - boot/.*
+- artifact: linux-x86-32-generic-libs
+ include:
+ - lib/.*
+configure-commands:
+- make defconfig
+- scripts/config -e PACKET
+- scripts/config -e SATA_AHCI
+- scripts/config -e ATA_GENERIC
+- scripts/config -e HAVE_IDE
+- scripts/config -d BLK_DEV_IDE_SATA
+- scripts/config -e BTRFS_FS
+- scripts/config -e BTRFS_FS_POSIX_ACL
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e CGROUPS
+- scripts/config -e AUTOFS4_FS
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e EXT2_FS
+- scripts/config -e EXT2_FS_XATTR
+- scripts/config -e EXT2_FS_POSIX_ACL
+- scripts/config -e EXT2_FS_SECURITY
+- scripts/config -e EXT2_FS_XIP
+- scripts/config -e EXT3_FS
+- scripts/config -d EXT3_DEFAULTS_TO_ORDERED
+- scripts/config -e EXT3_FS_XATTR
+- scripts/config -e EXT3_FS_POSIX_ACL
+- scripts/config -e EXT3_FS_SECURITY
+- scripts/config -e EXT4_FS
+- scripts/config -e EXT4_FS_XATTR
+- scripts/config -e EXT4_FS_POSIX_ACL
+- scripts/config -e EXT4_FS_SECURITY
+- scripts/config -d EXT4_DEBUG
+- scripts/config -e FUSE_FS
+- scripts/config -e OVERLAY_FS
+- scripts/config -e XFS_FS
+- scripts/config -e LIBCRC32C
+- scripts/config -d JBD_DEBUG
+- scripts/config -d JBD2_DEBUG
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config -d BLK_DEV_CRYPTOLOOP
+- scripts/config -e CEPH_FS
+- scripts/config --set-val BLK_DEV_LOOP_MIN_COUNT 8
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e VIRTIO
+- scripts/config -e VIRTIO_RING
+- scripts/config -e VIRTIO_PCI
+- scripts/config -e VIRTIO_BALLOON
+- scripts/config -e VIRTIO_BLK
+- scripts/config -e VIRTIO_NET
+- scripts/config -e VIRTIO_CONSOLE
+- scripts/config -e HW_RANDOM_VIRTIO
+- scripts/config -e 9P_FS
+- scripts/config -e 9P_FSCACHE
+- scripts/config -e 9P_FS_POSIX_ACL
+- scripts/config -e NET_9P
+- scripts/config -e NET_9P_VIRTIO
+- scripts/config -e R8169
+- scripts/config -e 8139TOO
+- scripts/config -e 8139CP
+- scripts/config -e ATL1
+- scripts/config -e ATL1C
+- scripts/config -e ATL1E
+- scripts/config -e E100
+- scripts/config -e E1000
+- scripts/config -e E1000E
+- scripts/config -e USB_USBNET
+- scripts/config -e USB_NET_AX8817X
+- scripts/config -e USB_NET_AX88179_178A
+- scripts/config -e USB_NET_DM9601
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e SECCOMP
+- scripts/config -d DEBUG_STACK_TRACE
+- scripts/config -e NFSD
+- scripts/config -e NFSD_V3
+- scripts/config -e KVM
+- scripts/config -e TUN
+- scripts/config -e BRIDGE
+- scripts/config -e VHOST_NET
+- scripts/config -e NF_NAT
+- scripts/config -e IP_NF_NAT
+- scripts/config -e IP_NF_TARGET_MASQUERADE
+- scripts/config -e FB_VESA
+- scripts/config -e HOTPLUG_PCI
+- scripts/config -e HOTPLUG_PCI_ACPI
+- scripts/config -e VLAN_8021Q
+- scripts/config -e BRIDGE_VLAN_FILTERING
+- scripts/config -e BLK_DEV_NBD
+- scripts/config -e BRIDGE_NF_EBTABLES
+- scripts/config -e NETFILTER
+- scripts/config -e NETFILTER_ADVANCED
+- scripts/config -e NETFILTER_XT_MATCH_ADDRTYPE
+- scripts/config -e OPENVSWITCH
+- scripts/config -e OPENVSWITCH_VXLAN
+- scripts/config -e CONFIG_OPENVSWITCH_GRE
+- scripts/config -e NET_CLS_BASIC
+- scripts/config -e NET_SCH_INGRESS
+- scripts/config -e NET_ACT_POLICE
+- scripts/config -e NET_IPGRE_DEMUX
+- scripts/config -e NET_SCH_HTB
+- scripts/config -e NET_SCH_HFSC
+- scripts/config -e VXLAN
+- scripts/config -e VETH
+- scripts/config -e IP_NF_MATCH_AH
+- scripts/config -e IP_NF_MATCH_ECN
+- scripts/config -e IP_NF_MATCH_RPFILTER
+- scripts/config -e IP_NF_MATCH_TTL
+- scripts/config -e IP_NF_TARGET_SYNPROXY
+- scripts/config -e IP_NF_TARGET_NETMAP
+- scripts/config -e IP_NF_TARGET_REDIRECT
+- scripts/config -e IP_NF_TARGET_CLUSTERIP
+- scripts/config -e IP_NF_TARGET_ECN
+- scripts/config -e IP_NF_TARGET_TTL
+- scripts/config -e IP_NF_RAW
+- scripts/config -e IP_NF_SECURITY
+- scripts/config -e IP_NF_ARPTABLES
+- scripts/config -e KVM_INTEL
+- scripts/config -e NETFILTER_NETLINK_QUEUE
+- scripts/config -e SCSI_NETLINK
+- scripts/config -e NETFILTER_XT_TARGET_MARK
+- scripts/config -e NETFILTER_XT_SET
+- scripts/config -e IP_SET
+- scripts/config -e IP_SET_BITMAP_IP
+- scripts/config -e IP_SET_BITMAP_IPMAC
+- scripts/config -e IP_SET_BITMAP_PORT
+- scripts/config -e IP_SET_HASH_IP
+- scripts/config -e IP_SET_HASH_IPMARK
+- scripts/config -e IP_SET_HASH_IPPORT
+- scripts/config -e IP_SET_HASH_IPPORTIP
+- scripts/config -e IP_SET_HASH_IPPORTNET
+- scripts/config -e IP_SET_HASH_MAC
+- scripts/config -e IP_SET_HASH_NETPORTNET
+- scripts/config -e IP_SET_HASH_NET
+- scripts/config -e IP_SET_HASH_NETNET
+- scripts/config -e IP_SET_HASH_NETPORT
+- scripts/config -e IP_SET_HASH_NETIFACE
+- scripts/config -e IP_SET_LIST_SET
+- scripts/config -e NF_CONNTRACK_TIMEOUT
+- scripts/config -e NF_CONNTRACK_TIMESTAMP
+- scripts/config -e NF_CONNTRACK_EVENTS
+- scripts/config -e NF_CONNTRACK_LABELS
+- scripts/config -e NETFILTER_NETLINK_ACCT
+- scripts/config -e NETFILTER_NETLINK_QUEUE_CT
+- scripts/config -e NF_CT_PROTO_DCCP
+- scripts/config -e NF_CT_PROTO_GRE
+- scripts/config -e NF_CT_PROTO_SCTP
+- scripts/config -e NF_CT_PROTO_UDPLITE
+- scripts/config -e NF_CT_NETLINK_TIMEOUT
+- scripts/config -e NF_CT_NETLINK_HELPER
+- scripts/config -e NF_CONNTRACK_AMANDA
+- scripts/config -e NF_CONNTRACK_H323
+- scripts/config -e NF_CONNTRACK_BROADCAST
+- scripts/config -e NF_CONNTRACK_NETBIOS_NS
+- scripts/config -e NF_CONNTRACK_SNMP
+- scripts/config -e NF_CONNTRACK_PPTP
+- scripts/config -e NF_CONNTRACK_SANE
+- scripts/config -e NF_CONNTRACK_TFTP
+- scripts/config -e NF_LOG_COMMON
+- scripts/config -e NF_NAT_PROTO_DCCP
+- scripts/config -e NF_NAT_PROTO_UDPLITE
+- scripts/config -e NF_NAT_PROTO_SCTP
+- scripts/config -e NF_NAT_AMANDA
+- scripts/config -e NF_NAT_TFTP
+- scripts/config -e NF_TABLES
+- scripts/config -e NF_TABLES_INET
+- scripts/config -e NFT_COMPAT
+- scripts/config -e NFT_EXTHDR
+- scripts/config -e NFT_META
+- scripts/config -e NFT_CT
+- scripts/config -e NFT_LIMIT
+- scripts/config -e NFT_NAT
+- scripts/config -e NFT_QUEUE
+- scripts/config -e NFT_REJECT
+- scripts/config -e NFT_REJECT_INET
+- scripts/config -e NFT_RBTREE
+- scripts/config -e NFT_HASH
+- scripts/config -e NFT_COUNTER
+- scripts/config -e NFT_LOG
+- scripts/config -e NFT_MASQ
+- scripts/config -e NETFILTER_XT_CONNMARK
+- scripts/config -e NETFILTER_XT_TARGET_AUDIT
+- scripts/config -e NETFILTER_XT_TARGET_CHECKSUM
+- scripts/config -e NETFILTER_XT_TARGET_CLASSIFY
+- scripts/config -e NETFILTER_XT_TARGET_CT
+- scripts/config -e NETFILTER_XT_TARGET_DSCP
+- scripts/config -e NETFILTER_XT_TARGET_HMARK
+- scripts/config -e NETFILTER_XT_TARGET_LED
+- scripts/config -e NETFILTER_XT_TARGET_LOG
+- scripts/config -e NETFILTER_XT_TARGET_NFQUEUE
+- scripts/config -e NETFILTER_XT_TARGET_RATEEST
+- scripts/config -e NETFILTER_XT_TARGET_TPROXY
+- scripts/config -e NETFILTER_XT_TARGET_TCPOPTSTRIP
+- scripts/config -e NETFILTER_XT_TARGET_TEE
+- scripts/config -e NETFILTER_XT_TARGET_TRACE
+- scripts/config -e NETFILTER_XT_TARGET_IDLETIMER
+- scripts/config -e NETFILTER_XT_MATCH_BPF
+- scripts/config -e NETFILTER_XT_MATCH_CLUSTER
+- scripts/config -e NETFILTER_XT_MATCH_COMMENT
+- scripts/config -e NETFILTER_XT_MATCH_CONNBYTES
+- scripts/config -e NETFILTER_XT_MATCH_CONNLABEL
+- scripts/config -e NETFILTER_XT_MATCH_CONNLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_CPU
+- scripts/config -e NETFILTER_XT_MATCH_DCCP
+- scripts/config -e NETFILTER_XT_MATCH_DEVGROUP
+- scripts/config -e NETFILTER_XT_MATCH_DSCP
+- scripts/config -e NETFILTER_XT_MATCH_ESP
+- scripts/config -e NETFILTER_XT_MATCH_HASHLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_HELPER
+- scripts/config -e NETFILTER_XT_MATCH_IPCOMP
+- scripts/config -e NETFILTER_XT_MATCH_IPRANGE
+- scripts/config -e NETFILTER_XT_MATCH_IPVS
+- scripts/config -e NETFILTER_XT_MATCH_L2TP
+- scripts/config -e NETFILTER_XT_MATCH_LENGTH
+- scripts/config -e NETFILTER_XT_MATCH_LIMIT
+- scripts/config -e NETFILTER_XT_MATCH_MAC
+- scripts/config -e NETFILTER_XT_MATCH_MULTIPORT
+- scripts/config -e NETFILTER_XT_MATCH_NFACCT
+- scripts/config -e NETFILTER_XT_MATCH_OSF
+- scripts/config -e NETFILTER_XT_MATCH_OWNER
+- scripts/config -e NETFILTER_XT_MATCH_CGROUP
+- scripts/config -e NETFILTER_XT_MATCH_PHYSDEV
+- scripts/config -e NETFILTER_XT_MATCH_PKTTYPE
+- scripts/config -e NETFILTER_XT_MATCH_QUOTA
+- scripts/config -e NETFILTER_XT_MATCH_RATEEST
+- scripts/config -e NETFILTER_XT_MATCH_REALM
+- scripts/config -e NETFILTER_XT_MATCH_RECENT
+- scripts/config -e NETFILTER_XT_MATCH_SCTP
+- scripts/config -e NETFILTER_XT_MATCH_SOCKET
+- scripts/config -e NETFILTER_XT_MATCH_STATISTIC
+- scripts/config -e NETFILTER_XT_MATCH_STRING
+- scripts/config -e NETFILTER_XT_MATCH_TCPMSS
+- scripts/config -e NETFILTER_XT_MATCH_TIME
+- scripts/config -e NETFILTER_XT_MATCH_U32
+- scripts/config -e IP_VS
+- scripts/config -e BRIDGE_NETFILTER
+- scripts/config -e CRYPTO_CRC32C
+- scripts/config -e CONFIGFS_FS
+- scripts/config -e EXPERT
+- scripts/config -e TARGET_CORE
+- scripts/config -e ISCSI_TARGET
+- scripts/config -e TCM_IBLOCK
+- scripts/config -e TCM_FILEIO
+- scripts/config -e TCM_PSCSI
+- scripts/config -e TCM_USER
+- scripts/config -e CONFIG_UIO
+- scripts/config -e LOOPBACK_TARGET
+- scripts/config -e TCM_FC
+- scripts/config -e LIBFC
+- scripts/config -e SCSI_FC_ATTRS
+- scripts/config -e SCSI_ISCSI_ATTRS
+- scripts/config -e ISCSI_TCP
+- scripts/config -e SCSI_LOWLEVEL
+- scripts/config -e SCSI_VIRTIO
+- scripts/config -e HYPERVISOR_GUEST
+- scripts/config -e PARAVIRT
+- scripts/config -e CONFIG_SND_INTEL8X0
+- scripts/config -m CONFIG_DRM_CIRRUS_QEMU
+- scripts/config -m CONFIG_DRM_BOCHS
+- scripts/config -e BT
+- yes '' | make oldconfig
+build-commands:
+- make $MAKEFLAGS
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- make INSTALL_PATH="$DESTDIR"/boot install
+- make INSTALL_MOD_PATH="$DESTDIR" modules_install
+- install -d "$DESTDIR$PREFIX/src/linux"
+- |
+ (
+ printf 'Makefile\0'
+ printf 'Module.symvers\0'
+ find arch/x86 -maxdepth 1 -name 'Makefile*' -print0
+ find arch/x86 \( -name 'module.lds' -o -name 'Kbuild.platforms' -o -name 'Platform' \) -print0
+ find arch/x86 \( -type d -a \( -name include -o -name scripts \) \) -o \
+ \! -type d -a \( -path '*include/*' -o -path '*scripts/*' \) -print0
+ find include -name 'asm*' -prune -o -print0
+ find include/asm-generic -print0
+ find include/uapi -print0
+ find scripts -print0
+ ) | cpio -0pumd "$DESTDIR$PREFIX/src/linux"
+system-integration:
+ linux-x86-32-generic-misc:
+ # This is required for any modules to work correctly. However, it depends
+ # `depmod` from the 'kmod' chunk in the 'foundation' stratum, so it runs
+ # conditionally on `depmod` existing to avoid breaking in
+ # minimal-system-x86_32.
+ 00-depmod:
+ - if which depmod; then (cd /usr/lib/modules && for version in *; do depmod -a "$version"; done) fi
diff --git a/strata/bsp-x86_32-generic/nasm.morph b/strata/bsp-x86_32-generic/nasm.morph
new file mode 100644
index 00000000..0ab1a629
--- /dev/null
+++ b/strata/bsp-x86_32-generic/nasm.morph
@@ -0,0 +1,5 @@
+name: nasm
+kind: chunk
+build-system: autotools
+install-commands:
+- make INSTALLROOT="$DESTDIR" install
diff --git a/strata/bsp-x86_32-generic/syslinux.morph b/strata/bsp-x86_32-generic/syslinux.morph
new file mode 100644
index 00000000..4570865b
--- /dev/null
+++ b/strata/bsp-x86_32-generic/syslinux.morph
@@ -0,0 +1,12 @@
+name: syslinux
+kind: chunk
+products:
+- artifact: syslinux-devel
+ include:
+ - (usr/)?share/syslinux/com32.*
+build-commands:
+- make clean
+- make NO_WERROR=1
+- make NO_WERROR=1 installer
+install-commands:
+- make INSTALLROOT="$DESTDIR" install
diff --git a/strata/bsp-x86_64-generic.morph b/strata/bsp-x86_64-generic.morph
new file mode 100644
index 00000000..ddef23bd
--- /dev/null
+++ b/strata/bsp-x86_64-generic.morph
@@ -0,0 +1,26 @@
+name: bsp-x86_64-generic
+kind: stratum
+description: The set of platform specific components required for booting a 64-bit
+ x86 based system.
+build-depends:
+# nasm wants asciidoc and xmlto for generating its docs
+# so include docutils here
+- morph: strata/docutils.morph
+chunks:
+- name: linux-x86-64-generic
+ morph: strata/bsp-x86_64-generic/linux-x86-64-generic.morph
+ repo: upstream:linux
+ ref: 6f7da290413ba713f0cdd9ff1a2a9bb129ef4f6c
+ unpetrify-ref: v4.12
+- name: nasm
+ morph: strata/bsp-x86_64-generic/nasm.morph
+ repo: upstream:nasm
+ ref: 8fa0fe16408afc76ce1ae4387e1a9d46893cfda6
+ unpetrify-ref: nasm-2.11.08
+- name: syslinux
+ morph: strata/bsp-x86_64-generic/syslinux.morph
+ repo: upstream:syslinux
+ ref: 02ab5d34ba0a90e3b6dd78034d7c470c77500119
+ unpetrify-ref: baserock/syslinux-4.06-gcc7
+ build-depends:
+ - nasm
diff --git a/strata/bsp-x86_64-generic/linux-x86-64-generic.morph b/strata/bsp-x86_64-generic/linux-x86-64-generic.morph
new file mode 100644
index 00000000..203ccea0
--- /dev/null
+++ b/strata/bsp-x86_64-generic/linux-x86-64-generic.morph
@@ -0,0 +1,300 @@
+name: linux-x86-64-generic
+kind: chunk
+products:
+- artifact: linux-x86-64-generic-devel
+ include:
+ - (usr/)?src/linux/.*
+- artifact: linux-x86-64-generic-bins
+ include:
+ - boot/.*
+- artifact: linux-x86-64-generic-libs
+ include:
+ - lib/.*
+configure-commands:
+- make defconfig
+- scripts/config -e PACKET
+- scripts/config -e SATA_AHCI
+- scripts/config -e ATA_GENERIC
+- scripts/config -e HAVE_IDE
+- scripts/config -d BLK_DEV_IDE_SATA
+- scripts/config -e BTRFS_FS
+- scripts/config -e BTRFS_FS_POSIX_ACL
+- scripts/config -e DEVTMPFS
+- scripts/config -e DEVTMPFS_MOUNT
+- scripts/config -e CONFIG_FHANDLE
+- scripts/config -e DEVPTS_MULTIPLE_INSTANCES
+- scripts/config -e CGROUPS
+- scripts/config -e AUTOFS4_FS
+- scripts/config --set-str UEVENT_HELPER_PATH ''
+- scripts/config -e EXT2_FS
+- scripts/config -e EXT2_FS_XATTR
+- scripts/config -e EXT2_FS_POSIX_ACL
+- scripts/config -e EXT2_FS_SECURITY
+- scripts/config -e EXT2_FS_XIP
+- scripts/config -e EXT3_FS
+- scripts/config -d EXT3_DEFAULTS_TO_ORDERED
+- scripts/config -e EXT3_FS_XATTR
+- scripts/config -e EXT3_FS_POSIX_ACL
+- scripts/config -e EXT3_FS_SECURITY
+- scripts/config -e EXT4_FS
+- scripts/config -e EXT4_FS_XATTR
+- scripts/config -e EXT4_FS_POSIX_ACL
+- scripts/config -e EXT4_FS_SECURITY
+- scripts/config -d EXT4_DEBUG
+- scripts/config -e FUSE_FS
+- scripts/config -e OVERLAY_FS
+- scripts/config -e XFS_FS
+- scripts/config -e LIBCRC32C
+- scripts/config -d JBD_DEBUG
+- scripts/config -d JBD2_DEBUG
+- scripts/config -e BLK_DEV_LOOP
+- scripts/config -d BLK_DEV_CRYPTOLOOP
+- scripts/config -e CEPH_FS
+- scripts/config --set-val BLK_DEV_LOOP_MIN_COUNT 8
+- scripts/config -e DM_SNAPSHOT
+- scripts/config -e VIRTIO
+- scripts/config -e VIRTIO_RING
+- scripts/config -e VIRTIO_PCI
+- scripts/config -e VIRTIO_BALLOON
+- scripts/config -e VIRTIO_BLK
+- scripts/config -e VIRTIO_NET
+- scripts/config -e VIRTIO_CONSOLE
+- scripts/config -e HW_RANDOM_VIRTIO
+- scripts/config -e 9P_FS
+- scripts/config -e 9P_FSCACHE
+- scripts/config -e 9P_FS_POSIX_ACL
+- scripts/config -e NET_9P
+- scripts/config -e NET_9P_VIRTIO
+- scripts/config -e R8169
+- scripts/config -e 8139TOO
+- scripts/config -e 8139CP
+- scripts/config -e ATL1
+- scripts/config -e ATL1C
+- scripts/config -e ATL1E
+- scripts/config -e E100
+- scripts/config -e E1000
+- scripts/config -e E1000E
+- scripts/config -e USB_USBNET
+- scripts/config -e USB_NET_AX8817X
+- scripts/config -e USB_NET_AX88179_178A
+- scripts/config -e USB_NET_DM9601
+- scripts/config -e IKCONFIG
+- scripts/config -e IKCONFIG_PROC
+- scripts/config -e SECCOMP
+- scripts/config -d DEBUG_STACK_TRACE
+- scripts/config -e NFSD
+- scripts/config -e NFSD_V3
+- scripts/config -e KVM
+- scripts/config -e TUN
+- scripts/config -e BRIDGE
+- scripts/config -e VHOST_NET
+- scripts/config -e NF_NAT
+- scripts/config -e IP_NF_NAT
+- scripts/config -e IP_NF_TARGET_MASQUERADE
+- scripts/config -e FB_VESA
+- scripts/config -e HOTPLUG_PCI
+- scripts/config -e HOTPLUG_PCI_ACPI
+- scripts/config -e VLAN_8021Q
+- scripts/config -e BRIDGE_VLAN_FILTERING
+- scripts/config -e BLK_DEV_NBD
+- scripts/config -e BRIDGE_NF_EBTABLES
+- scripts/config -e NETFILTER
+- scripts/config -e NETFILTER_ADVANCED
+- scripts/config -e NETFILTER_XT_MATCH_ADDRTYPE
+- scripts/config -e OPENVSWITCH
+- scripts/config -e OPENVSWITCH_VXLAN
+- scripts/config -e CONFIG_OPENVSWITCH_GRE
+- scripts/config -e NET_CLS_BASIC
+- scripts/config -e NET_SCH_INGRESS
+- scripts/config -e NET_ACT_POLICE
+- scripts/config -e NET_IPGRE_DEMUX
+- scripts/config -e NET_SCH_HTB
+- scripts/config -e NET_SCH_HFSC
+- scripts/config -e VXLAN
+- scripts/config -e VETH
+- scripts/config -e IP_NF_MATCH_AH
+- scripts/config -e IP_NF_MATCH_ECN
+- scripts/config -e IP_NF_MATCH_RPFILTER
+- scripts/config -e IP_NF_MATCH_TTL
+- scripts/config -e IP_NF_TARGET_SYNPROXY
+- scripts/config -e IP_NF_TARGET_NETMAP
+- scripts/config -e IP_NF_TARGET_REDIRECT
+- scripts/config -e IP_NF_TARGET_CLUSTERIP
+- scripts/config -e IP_NF_TARGET_ECN
+- scripts/config -e IP_NF_TARGET_TTL
+- scripts/config -e IP_NF_RAW
+- scripts/config -e IP_NF_SECURITY
+- scripts/config -e IP_NF_ARPTABLES
+- scripts/config -e KVM_INTEL
+- scripts/config -e NETFILTER_NETLINK_QUEUE
+- scripts/config -e SCSI_NETLINK
+- scripts/config -e NETFILTER_XT_TARGET_MARK
+- scripts/config -e NETFILTER_XT_SET
+- scripts/config -e IP_SET
+- scripts/config -e IP_SET_BITMAP_IP
+- scripts/config -e IP_SET_BITMAP_IPMAC
+- scripts/config -e IP_SET_BITMAP_PORT
+- scripts/config -e IP_SET_HASH_IP
+- scripts/config -e IP_SET_HASH_IPMARK
+- scripts/config -e IP_SET_HASH_IPPORT
+- scripts/config -e IP_SET_HASH_IPPORTIP
+- scripts/config -e IP_SET_HASH_IPPORTNET
+- scripts/config -e IP_SET_HASH_MAC
+- scripts/config -e IP_SET_HASH_NETPORTNET
+- scripts/config -e IP_SET_HASH_NET
+- scripts/config -e IP_SET_HASH_NETNET
+- scripts/config -e IP_SET_HASH_NETPORT
+- scripts/config -e IP_SET_HASH_NETIFACE
+- scripts/config -e IP_SET_LIST_SET
+- scripts/config -e NF_CONNTRACK_TIMEOUT
+- scripts/config -e NF_CONNTRACK_TIMESTAMP
+- scripts/config -e NF_CONNTRACK_EVENTS
+- scripts/config -e NF_CONNTRACK_LABELS
+- scripts/config -e NETFILTER_NETLINK_ACCT
+- scripts/config -e NETFILTER_NETLINK_QUEUE_CT
+- scripts/config -e NF_CT_PROTO_DCCP
+- scripts/config -e NF_CT_PROTO_GRE
+- scripts/config -e NF_CT_PROTO_SCTP
+- scripts/config -e NF_CT_PROTO_UDPLITE
+- scripts/config -e NF_CT_NETLINK_TIMEOUT
+- scripts/config -e NF_CT_NETLINK_HELPER
+- scripts/config -e NF_CONNTRACK_AMANDA
+- scripts/config -e NF_CONNTRACK_H323
+- scripts/config -e NF_CONNTRACK_BROADCAST
+- scripts/config -e NF_CONNTRACK_NETBIOS_NS
+- scripts/config -e NF_CONNTRACK_SNMP
+- scripts/config -e NF_CONNTRACK_PPTP
+- scripts/config -e NF_CONNTRACK_SANE
+- scripts/config -e NF_CONNTRACK_TFTP
+- scripts/config -e NF_LOG_COMMON
+- scripts/config -e NF_NAT_PROTO_DCCP
+- scripts/config -e NF_NAT_PROTO_UDPLITE
+- scripts/config -e NF_NAT_PROTO_SCTP
+- scripts/config -e NF_NAT_AMANDA
+- scripts/config -e NF_NAT_TFTP
+- scripts/config -e NF_TABLES
+- scripts/config -e NF_TABLES_INET
+- scripts/config -e NFT_COMPAT
+- scripts/config -e NFT_EXTHDR
+- scripts/config -e NFT_META
+- scripts/config -e NFT_CT
+- scripts/config -e NFT_LIMIT
+- scripts/config -e NFT_NAT
+- scripts/config -e NFT_QUEUE
+- scripts/config -e NFT_REJECT
+- scripts/config -e NFT_REJECT_INET
+- scripts/config -e NFT_RBTREE
+- scripts/config -e NFT_HASH
+- scripts/config -e NFT_COUNTER
+- scripts/config -e NFT_LOG
+- scripts/config -e NFT_MASQ
+- scripts/config -e NETFILTER_XT_CONNMARK
+- scripts/config -e NETFILTER_XT_TARGET_AUDIT
+- scripts/config -e NETFILTER_XT_TARGET_CHECKSUM
+- scripts/config -e NETFILTER_XT_TARGET_CLASSIFY
+- scripts/config -e NETFILTER_XT_TARGET_CT
+- scripts/config -e NETFILTER_XT_TARGET_DSCP
+- scripts/config -e NETFILTER_XT_TARGET_HMARK
+- scripts/config -e NETFILTER_XT_TARGET_LED
+- scripts/config -e NETFILTER_XT_TARGET_LOG
+- scripts/config -e NETFILTER_XT_TARGET_NFQUEUE
+- scripts/config -e NETFILTER_XT_TARGET_RATEEST
+- scripts/config -e NETFILTER_XT_TARGET_TPROXY
+- scripts/config -e NETFILTER_XT_TARGET_TCPOPTSTRIP
+- scripts/config -e NETFILTER_XT_TARGET_TEE
+- scripts/config -e NETFILTER_XT_TARGET_TRACE
+- scripts/config -e NETFILTER_XT_TARGET_IDLETIMER
+- scripts/config -e NETFILTER_XT_MATCH_BPF
+- scripts/config -e NETFILTER_XT_MATCH_CLUSTER
+- scripts/config -e NETFILTER_XT_MATCH_COMMENT
+- scripts/config -e NETFILTER_XT_MATCH_CONNBYTES
+- scripts/config -e NETFILTER_XT_MATCH_CONNLABEL
+- scripts/config -e NETFILTER_XT_MATCH_CONNLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_CPU
+- scripts/config -e NETFILTER_XT_MATCH_DCCP
+- scripts/config -e NETFILTER_XT_MATCH_DEVGROUP
+- scripts/config -e NETFILTER_XT_MATCH_DSCP
+- scripts/config -e NETFILTER_XT_MATCH_ESP
+- scripts/config -e NETFILTER_XT_MATCH_HASHLIMIT
+- scripts/config -e NETFILTER_XT_MATCH_HELPER
+- scripts/config -e NETFILTER_XT_MATCH_IPCOMP
+- scripts/config -e NETFILTER_XT_MATCH_IPRANGE
+- scripts/config -e NETFILTER_XT_MATCH_IPVS
+- scripts/config -e NETFILTER_XT_MATCH_L2TP
+- scripts/config -e NETFILTER_XT_MATCH_LENGTH
+- scripts/config -e NETFILTER_XT_MATCH_LIMIT
+- scripts/config -e NETFILTER_XT_MATCH_MAC
+- scripts/config -e NETFILTER_XT_MATCH_MULTIPORT
+- scripts/config -e NETFILTER_XT_MATCH_NFACCT
+- scripts/config -e NETFILTER_XT_MATCH_OSF
+- scripts/config -e NETFILTER_XT_MATCH_OWNER
+- scripts/config -e NETFILTER_XT_MATCH_CGROUP
+- scripts/config -e NETFILTER_XT_MATCH_PHYSDEV
+- scripts/config -e NETFILTER_XT_MATCH_PKTTYPE
+- scripts/config -e NETFILTER_XT_MATCH_QUOTA
+- scripts/config -e NETFILTER_XT_MATCH_RATEEST
+- scripts/config -e NETFILTER_XT_MATCH_REALM
+- scripts/config -e NETFILTER_XT_MATCH_RECENT
+- scripts/config -e NETFILTER_XT_MATCH_SCTP
+- scripts/config -e NETFILTER_XT_MATCH_SOCKET
+- scripts/config -e NETFILTER_XT_MATCH_STATISTIC
+- scripts/config -e NETFILTER_XT_MATCH_STRING
+- scripts/config -e NETFILTER_XT_MATCH_TCPMSS
+- scripts/config -e NETFILTER_XT_MATCH_TIME
+- scripts/config -e NETFILTER_XT_MATCH_U32
+- scripts/config -e IP_VS
+- scripts/config -e BRIDGE_NETFILTER
+- scripts/config -e CRYPTO_CRC32C
+- scripts/config -e CONFIGFS_FS
+- scripts/config -e EXPERT
+- scripts/config -e TARGET_CORE
+- scripts/config -e ISCSI_TARGET
+- scripts/config -e TCM_IBLOCK
+- scripts/config -e TCM_FILEIO
+- scripts/config -e TCM_PSCSI
+- scripts/config -e TCM_USER
+- scripts/config -e CONFIG_UIO
+- scripts/config -e LOOPBACK_TARGET
+- scripts/config -e TCM_FC
+- scripts/config -e LIBFC
+- scripts/config -e SCSI_FC_ATTRS
+- scripts/config -e SCSI_ISCSI_ATTRS
+- scripts/config -e ISCSI_TCP
+- scripts/config -e SCSI_LOWLEVEL
+- scripts/config -e SCSI_VIRTIO
+- scripts/config -e HYPERVISOR_GUEST
+- scripts/config -e PARAVIRT
+- scripts/config -e CONFIG_SND_INTEL8X0
+- scripts/config -m CONFIG_DRM_CIRRUS_QEMU
+- scripts/config -m CONFIG_DRM_BOCHS
+- scripts/config -m CONFIG_DRM_VIRTIO_GPU
+- scripts/config -e BT
+- yes '' | make oldconfig
+build-commands:
+- make $MAKEFLAGS
+install-commands:
+- mkdir -p "$DESTDIR"/boot
+- make INSTALL_PATH="$DESTDIR"/boot install
+- make INSTALL_MOD_PATH="$DESTDIR" modules_install
+- install -d "$DESTDIR$PREFIX/src/linux"
+- |
+ (
+ printf 'Makefile\0'
+ printf 'Module.symvers\0'
+ find arch/x86 -maxdepth 1 -name 'Makefile*' -print0
+ find arch/x86 \( -name 'module.lds' -o -name 'Kbuild.platforms' -o -name 'Platform' \) -print0
+ find arch/x86 \( -type d -a \( -name include -o -name scripts \) \) -o \
+ \! -type d -a \( -path '*include/*' -o -path '*scripts/*' \) -print0
+ find include -name 'asm*' -prune -o -print0
+ find include/asm-generic -print0
+ find include/uapi -print0
+ find scripts -print0
+ ) | cpio -0pumd "$DESTDIR$PREFIX/src/linux"
+system-integration:
+ linux-x86-64-generic-misc:
+ # This is required for any modules to work correctly. However, it depends
+ # `depmod` from the 'kmod' chunk in the 'foundation' stratum, so it runs
+ # conditionally on `depmod` existing to avoid breaking in
+ # minimal-system-x86_64.
+ 00-depmod:
+ - if which depmod; then (cd /usr/lib/modules && for version in *; do depmod -a "$version"; done) fi
diff --git a/strata/bsp-x86_64-generic/nasm.morph b/strata/bsp-x86_64-generic/nasm.morph
new file mode 100644
index 00000000..0ab1a629
--- /dev/null
+++ b/strata/bsp-x86_64-generic/nasm.morph
@@ -0,0 +1,5 @@
+name: nasm
+kind: chunk
+build-system: autotools
+install-commands:
+- make INSTALLROOT="$DESTDIR" install
diff --git a/strata/bsp-x86_64-generic/syslinux.morph b/strata/bsp-x86_64-generic/syslinux.morph
new file mode 100644
index 00000000..4570865b
--- /dev/null
+++ b/strata/bsp-x86_64-generic/syslinux.morph
@@ -0,0 +1,12 @@
+name: syslinux
+kind: chunk
+products:
+- artifact: syslinux-devel
+ include:
+ - (usr/)?share/syslinux/com32.*
+build-commands:
+- make clean
+- make NO_WERROR=1
+- make NO_WERROR=1 installer
+install-commands:
+- make INSTALLROOT="$DESTDIR" install
diff --git a/strata/bsp-x86_both-tools.morph b/strata/bsp-x86_both-tools.morph
new file mode 100644
index 00000000..5a72caa7
--- /dev/null
+++ b/strata/bsp-x86_both-tools.morph
@@ -0,0 +1,21 @@
+name: bsp-x86_both-tools
+kind: stratum
+description: The set of platform specific components required for configuring a bootable
+ x86 based system.
+build-depends:
+# nasm wants asciidoc and xmlto for generating its docs
+# so include docutils here
+- morph: strata/docutils.morph
+chunks:
+- name: nasm
+ morph: strata/bsp-x86_both-tools/nasm.morph
+ repo: upstream:nasm
+ ref: 8fa0fe16408afc76ce1ae4387e1a9d46893cfda6
+ unpetrify-ref: nasm-2.11.08
+- name: syslinux
+ morph: strata/bsp-x86_both-tools/syslinux.morph
+ repo: upstream:syslinux
+ ref: 02ab5d34ba0a90e3b6dd78034d7c470c77500119
+ unpetrify-ref: baserock/syslinux-4.06-gcc7
+ build-depends:
+ - nasm
diff --git a/strata/bsp-x86_both-tools/nasm.morph b/strata/bsp-x86_both-tools/nasm.morph
new file mode 100644
index 00000000..0ab1a629
--- /dev/null
+++ b/strata/bsp-x86_both-tools/nasm.morph
@@ -0,0 +1,5 @@
+name: nasm
+kind: chunk
+build-system: autotools
+install-commands:
+- make INSTALLROOT="$DESTDIR" install
diff --git a/strata/bsp-x86_both-tools/syslinux.morph b/strata/bsp-x86_both-tools/syslinux.morph
new file mode 100644
index 00000000..4570865b
--- /dev/null
+++ b/strata/bsp-x86_both-tools/syslinux.morph
@@ -0,0 +1,12 @@
+name: syslinux
+kind: chunk
+products:
+- artifact: syslinux-devel
+ include:
+ - (usr/)?share/syslinux/com32.*
+build-commands:
+- make clean
+- make NO_WERROR=1
+- make NO_WERROR=1 installer
+install-commands:
+- make INSTALLROOT="$DESTDIR" install
diff --git a/strata/build-essential.morph b/strata/build-essential.morph
new file mode 100644
index 00000000..1dd9cd35
--- /dev/null
+++ b/strata/build-essential.morph
@@ -0,0 +1,412 @@
+name: build-essential
+kind: stratum
+description: |
+ Toolchain stratum
+
+ Stage 1: build a minimal cross compiler with the host's tools.
+
+ Starting with a cross compiler ensures that (a) nothing from the host
+ can leak into the build-essential artifacts, and (b) cross-compiling
+ build-essential is fully tested and supported, since we always use the
+ cross code paths.
+
+ Stage 2: cross-build the whole of build-essential, using the host's tools
+ but the cross-compiler toolchain.
+
+ Stage 2 GCC outputs code for the same 'bootstrap' machine as stage 1 GCC,
+ but because stage 2 GCC is also built to *run* on the bootstrap machine
+ it can only execute inside the stage 3 chroot (due to being built against
+ a libc with a non-standard prefix).
+
+ Stage 3: build the whole of build-essential again, this time using a
+ staging area containing only the output of stage 2. The result of this
+ build is fully reproducible.
+
+ We do a switch-a-roo between stage 2 and 3: stages 2 chunks are all built
+ to run on a host *-bootstrap-* while stage 3 chunks are native-built for
+ a *-baserock-* machine. This works, because the cross build was all for
+ show (and cleanliness) and the binaries actually still run on the host.
+
+ After build-essential is built we do another trick. See
+ stage2-fhs-dirs.morph for details. Basically, /bin is a symlink to
+ /tools/bin during stage 2 but in stage 3 it becomes a real directory
+ again.
+
+ PLEASE KEEP THE REFS IN 'armv7lhf-cross-toolchain' STRATUM UP TO DATE WITH
+ THIS ONE!
+
+ Please note that the chunk 'build-depends' field is treated differently in
+ this stratum to how other strata in definitions.git use it. Other strata
+ rely on the fact that dependencies of a dependency (called 'transitive
+ dependencies') are implicitly included in the staging area. Within
+ build-essential, some chunks list transitive dependencies explicitly to
+ make clearer what is going on.
+products:
+- artifact: build-essential-minimal
+ include:
+ - fhs-dirs-.*
+ - busybox-.*
+ - glibc-nss
+chunks:
+- name: stage1-binutils
+ morph: strata/build-essential/stage1-binutils.morph
+ repo: upstream:binutils-tarball
+ ref: 5500a97a2ad1735db5b35bc51cfb825c1f4c38df
+ unpetrify-ref: binutils-2.25
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage1-gcc
+ morph: strata/build-essential/stage1-gcc.morph
+ repo: upstream:gcc-tarball
+ ref: 3b0dbcfa2e5d12bd80cab1b35f08653d61fe7838
+ unpetrify-ref: baserock/gcc-7.1.0
+ build-depends:
+ - stage1-binutils
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-linux-api-headers
+ morph: strata/build-essential/stage2-linux-api-headers.morph
+ repo: upstream:linux
+ ref: a351e9b9fc24e982ec2f0e76379a49826036da12
+ unpetrify-ref: v4.11
+ build-depends:
+ - stage1-binutils
+ - stage1-gcc
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-glibc
+ morph: strata/build-essential/stage2-glibc.morph
+ repo: upstream:glibc
+ ref: db0242e3023436757bbc7c488a779e6e3343db04
+ unpetrify-ref: glibc-2.25
+ build-depends:
+ - stage1-binutils
+ - stage1-gcc
+ - stage2-linux-api-headers
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-libstdc++
+ morph: strata/build-essential/stage2-libstdc++.morph
+ repo: upstream:gcc-tarball
+ ref: 3b0dbcfa2e5d12bd80cab1b35f08653d61fe7838
+ unpetrify-ref: baserock/gcc-7.1.0
+ build-depends:
+ - stage1-binutils
+ - stage1-gcc
+ - stage2-linux-api-headers
+ - stage2-glibc
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-binutils
+ morph: strata/build-essential/stage2-binutils.morph
+ repo: upstream:binutils-tarball
+ ref: 5500a97a2ad1735db5b35bc51cfb825c1f4c38df
+ unpetrify-ref: binutils-2.25
+ build-depends:
+ - stage1-binutils
+ - stage1-gcc
+ - stage2-linux-api-headers
+ - stage2-glibc
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-gcc-fixed-headers
+ morph: strata/build-essential/stage2-gcc-fixed-headers.morph
+ repo: upstream:gcc-tarball
+ ref: 3b0dbcfa2e5d12bd80cab1b35f08653d61fe7838
+ unpetrify-ref: baserock/gcc-7.1.0
+ build-depends:
+ - stage1-binutils
+ - stage1-gcc
+ - stage2-linux-api-headers
+ - stage2-glibc
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-gcc
+ morph: strata/build-essential/stage2-gcc.morph
+ repo: upstream:gcc-tarball
+ ref: 3b0dbcfa2e5d12bd80cab1b35f08653d61fe7838
+ unpetrify-ref: baserock/gcc-7.1.0
+ build-depends:
+ - stage1-binutils
+ - stage1-gcc
+ - stage2-linux-api-headers
+ - stage2-glibc
+ - stage2-gcc-fixed-headers
+ - stage2-libstdc++
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-busybox
+ morph: strata/build-essential/stage2-busybox.morph
+ repo: upstream:busybox
+ ref: 1ecfe811fe2f70380170ef7d820e8150054e88ca
+ unpetrify-ref: '1_23_1'
+ build-depends:
+ - stage1-binutils
+ - stage1-gcc
+ - stage2-linux-api-headers
+ - stage2-glibc
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-fake-bash
+ morph: strata/build-essential/stage2-fake-bash.morph
+ repo: upstream:bash
+ ref: 3590145af6f1c9fa321dff231f69ae696e7e740b
+ unpetrify-ref: baserock/bash-4.3-patch-27
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-fhs-dirs
+ morph: strata/build-essential/stage2-fhs-dirs.morph
+ repo: baserock:baserock/fhs-dirs
+ ref: 9fafca436000bb57ddd5c498f8a75ea7b274f6c5
+ unpetrify-ref: baserock/usr_merge
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-gawk
+ morph: strata/build-essential/stage2-gawk.morph
+ repo: upstream:gawk
+ ref: 925f9363c4b0a5bb9375298afcdcf404efb32587
+ unpetrify-ref: gawk-4.1-stable
+ build-depends:
+ - stage1-binutils
+ - stage1-gcc
+ - stage2-linux-api-headers
+ - stage2-glibc
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-make
+ morph: strata/build-essential/stage2-make.morph
+ repo: upstream:make-tarball
+ ref: 4978d7129e42340ab9efeb0cb9cae4ad0fa052d4
+ unpetrify-ref: baserock/make-4.1-ttyname-segfault-fix
+ build-depends:
+ - stage1-binutils
+ - stage1-gcc
+ - stage2-linux-api-headers
+ - stage2-glibc
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: stage2-reset-specs
+ morph: strata/build-essential/stage2-reset-specs.morph
+ repo: upstream:glibc
+ ref: fdfc9260b61d3d72541f18104d24c7bcb0ce5ca2
+ unpetrify-ref: glibc-2.24
+ build-depends:
+ - stage1-binutils
+ - stage1-gcc
+ - stage2-linux-api-headers
+ - stage2-glibc
+ build-mode: bootstrap
+ prefix: /tools
+
+- name: fhs-dirs
+ morph: strata/build-essential/fhs-dirs.morph
+ repo: baserock:baserock/fhs-dirs
+ ref: 9fafca436000bb57ddd5c498f8a75ea7b274f6c5
+ unpetrify-ref: baserock/usr_merge
+ build-depends:
+ - stage2-binutils
+ - stage2-busybox
+ - stage2-glibc
+ - stage2-fhs-dirs
+ - stage2-gawk
+ - stage2-gcc
+ - stage2-linux-api-headers
+ - stage2-make
+ - stage2-reset-specs
+
+- name: linux-api-headers
+ morph: strata/build-essential/linux-api-headers.morph
+ repo: upstream:linux
+ ref: a351e9b9fc24e982ec2f0e76379a49826036da12
+ unpetrify-ref: v4.11
+ build-depends:
+ - stage2-binutils
+ - stage2-busybox
+ - stage2-glibc
+ - stage2-fhs-dirs
+ - stage2-gawk
+ - stage2-gcc
+ - stage2-linux-api-headers
+ - stage2-make
+ - stage2-reset-specs
+ - fhs-dirs
+
+- name: glibc
+ morph: strata/build-essential/glibc.morph
+ repo: upstream:glibc
+ ref: db0242e3023436757bbc7c488a779e6e3343db04
+ unpetrify-ref: glibc-2.25
+ build-depends:
+ - stage2-binutils
+ - stage2-busybox
+ - stage2-fake-bash
+ - stage2-glibc
+ - stage2-fhs-dirs
+ - stage2-gawk
+ - stage2-gcc
+ - stage2-linux-api-headers
+ - stage2-make
+ - stage2-reset-specs
+ - linux-api-headers
+ artifacts:
+ glibc-gconv: build-essential-runtime
+ glibc-libs: build-essential-minimal
+ glibc-nss: build-essential-runtime
+
+- name: zlib
+ morph: strata/build-essential/zlib.morph
+ repo: upstream:zlib
+ ref: 50893291621658f355bc5b4d450a8d06a563053d
+ unpetrify-ref: v1.2.8
+ build-depends:
+ - stage2-binutils
+ - stage2-busybox
+ - stage2-glibc
+ - stage2-fhs-dirs
+ - stage2-gawk
+ - stage2-gcc
+ - stage2-linux-api-headers
+ - stage2-make
+ - stage2-reset-specs
+ - glibc
+ artifacts:
+ zlib-libs: build-essential-minimal
+
+- name: binutils
+ morph: strata/build-essential/binutils.morph
+ repo: upstream:binutils-tarball
+ ref: 5500a97a2ad1735db5b35bc51cfb825c1f4c38df
+ unpetrify-ref: binutils-2.25
+ build-depends:
+ - stage2-binutils
+ - stage2-busybox
+ - stage2-glibc
+ - stage2-fhs-dirs
+ - stage2-gawk
+ - stage2-gcc
+ - stage2-linux-api-headers
+ - stage2-make
+ - stage2-reset-specs
+ - glibc
+ - zlib
+
+- name: busybox
+ morph: strata/build-essential/busybox.morph
+ repo: upstream:busybox
+ ref: 1ecfe811fe2f70380170ef7d820e8150054e88ca
+ unpetrify-ref: '1_23_1'
+ build-depends:
+ - stage2-binutils
+ - stage2-busybox
+ - stage2-glibc
+ - stage2-fhs-dirs
+ - stage2-gawk
+ - stage2-gcc
+ - stage2-linux-api-headers
+ - stage2-make
+ - stage2-reset-specs
+ - glibc
+
+- name: gawk
+ morph: strata/build-essential/gawk.morph
+ repo: upstream:gawk
+ ref: dc5af665700d9b04fdf9c18930526d28eef5d5d9
+ unpetrify-ref: gawk-4.1.1
+ build-depends:
+ - stage2-binutils
+ - stage2-busybox
+ - stage2-glibc
+ - stage2-fhs-dirs
+ - stage2-gawk
+ - stage2-gcc
+ - stage2-linux-api-headers
+ - stage2-make
+ - stage2-reset-specs
+ - glibc
+
+- name: m4-tarball
+ morph: strata/build-essential/m4-tarball.morph
+ repo: upstream:m4-tarball
+ ref: 23c11479b3ad787adc7a651ee0c4347839e47723
+ unpetrify-ref: m4-1.4.17
+ build-depends:
+ - stage2-binutils
+ - stage2-busybox
+ - stage2-glibc
+ - stage2-fhs-dirs
+ - stage2-gawk
+ - stage2-gcc
+ - stage2-linux-api-headers
+ - stage2-make
+ - stage2-reset-specs
+ - glibc
+
+- name: gcc
+ morph: strata/build-essential/gcc.morph
+ repo: upstream:gcc-tarball
+ ref: 3b0dbcfa2e5d12bd80cab1b35f08653d61fe7838
+ unpetrify-ref: baserock/gcc-7.1.0
+ build-depends:
+ - stage2-binutils
+ - stage2-busybox
+ - stage2-glibc
+ - stage2-fhs-dirs
+ - stage2-gawk
+ - stage2-gcc
+ - stage2-linux-api-headers
+ - stage2-make
+ - stage2-reset-specs
+ - glibc
+ - zlib
+ - m4-tarball
+ - linux-api-headers
+ artifacts:
+ gcc-libs: build-essential-minimal
+
+- name: make
+ morph: strata/build-essential/make.morph
+ repo: upstream:make-tarball
+ ref: 4978d7129e42340ab9efeb0cb9cae4ad0fa052d4
+ unpetrify-ref: baserock/make-4.1-ttyname-segfault-fix
+ build-depends:
+ - stage2-binutils
+ - stage2-busybox
+ - stage2-glibc
+ - stage2-fhs-dirs
+ - stage2-gawk
+ - stage2-gcc
+ - stage2-linux-api-headers
+ - stage2-make
+ - stage2-reset-specs
+ - glibc
+
+- name: ccache
+ morph: strata/build-essential/ccache.morph
+ repo: upstream:ccache-tarball
+ ref: 4f49dfd6f2ac799e236f61593ec209228f47f5c5
+ unpetrify-ref: ccache-3.3.4
+ build-depends:
+ - stage2-binutils
+ - stage2-busybox
+ - stage2-glibc
+ - stage2-fhs-dirs
+ - stage2-gawk
+ - stage2-gcc
+ - stage2-linux-api-headers
+ - stage2-make
+ - stage2-reset-specs
+ - glibc
+ - zlib
diff --git a/strata/build-essential/binutils.morph b/strata/build-essential/binutils.morph
new file mode 100644
index 00000000..bab52672
--- /dev/null
+++ b/strata/build-essential/binutils.morph
@@ -0,0 +1,8 @@
+name: binutils
+kind: chunk
+build-system: autotools
+
+configure-commands:
+- |
+ ./configure --prefix="$PREFIX" --disable-nls --disable-werror \
+ --with-system-zlib
diff --git a/strata/build-essential/busybox.morph b/strata/build-essential/busybox.morph
new file mode 100644
index 00000000..1bbd97a6
--- /dev/null
+++ b/strata/build-essential/busybox.morph
@@ -0,0 +1,89 @@
+name: busybox
+kind: chunk
+
+configure-commands:
+# Busybox's default config has everything enabled.
+- make defconfig KCONFIG_NOTIMESTAMP=1
+
+- sed -e 's|.*UDHCPC_DEFAULT_SCRIPT.*|CONFIG_UDHCPC_DEFAULT_SCRIPT="'"$PREFIX"/share/udhcpc/default.script'"|'
+ -i .config
+- sed -e 's|.*IFUPDOWN_IFSTATE_PATH.*|CONFIG_IFUPDOWN_IFSTATE_PATH="/run/ifstate"|'
+ -i .config
+
+# Avoid dividing applets between $PREFIX/[s]bin and $PREFIX/usr/[s]bin.
+- '[ "$PREFIX" = /usr ] || sed -e ''s/.*INSTALL_NO_USR.*/CONFIG_INSTALL_NO_USR=y/''
+ -i .config'
+# We have GAWK, but in GENIVI baseline we want to get rid of it
+# - sed -e 's/CONFIG_AWK=y.*/# CONFIG_AWK is not set/' -i .config
+
+# Depends on stuff that was removed since eglibc 2.14.
+- sed -e 's/CONFIG_INETD=y.*/# CONFIG_INETD is not set/' -i .config
+
+# Busybox Patch is incompatible enough with GNU Patch that it can't be
+# used for GNULib projects built from Git.
+- sed -e 's/CONFIG_PATCH=y.*/# CONFIG_PATCH is not set/' -i .config
+
+# None of this is needed because we have kmod; and it actually breaks the
+# Linux build because depmod isn't compatible enough with util-linux's.
+- sed -e 's/CONFIG_DEPMOD=y.*/# CONFIG_DEPMOD is not set/' -i .config
+- sed -e 's/CONFIG_INSMOD=y.*/# CONFIG_INSMOD is not set/' -i .config
+- sed -e 's/CONFIG_MODPROBE=y.*/# CONFIG_MODPROBE is not set/' -i .config
+- sed -e 's/CONFIG_MODPROBE_SMALL=y.*/# CONFIG_MODPROBE_SMALL is not set/' -i .config
+- sed -e 's/CONFIG_LSMOD=y.*/# CONFIG_LSMOD is not set/' -i .config
+- sed -e 's/CONFIG_RMMOD=y.*/# CONFIG_RMMOD is not set/' -i .config
+
+# General features that we don't need.
+- sed -e 's/CONFIG_FEATURE_MOUNT_CIFS=y.*/# CONFIG_FEATURE_MOUNT_CIFS is not set/'
+ -i .config
+- sed -e 's/CONFIG_FEATURE_EXTRA_QUIET=y.*/# CONFIG_FEATURE_EXTRA_QUIET is not set/'
+ -i .config
+- sed -e 's/CONFIG_FEATURE_INIT_COREDUMPS=y.*/# CONFIG_FEATURE_INIT_COREDUMPS is not
+ set/' -i .config
+- sed -e 's/CONFIG_FEATURE_INIT_SCTTY=y.*/# CONFIG_FEATURE_INIT_SCTTY is not set/'
+ -i .config
+- sed -e 's/CONFIG_FEATURE_INIT_SYSLOG=y.*/# CONFIG_FEATURE_INIT_SYSLOG is not set/'
+ -i .config
+- sed -e 's/CONFIG_FEATURE_INITRD=y.*/# CONFIG_FEATURE_INITRD is not set/' -i .config
+- sed -e 's/CONFIG_FEATURE_MINIX2=y.*/# CONFIG_FEATURE_MINIX2 is not set/' -i .config
+- sed -e 's/CONFIG_FSCK_MINIX=y.*/# CONFIG_FSCK_MINIX is not set/' -i .config
+- sed -e 's/CONFIG_LOSETUP=y.*/# CONFIG_LOSETUP is not set/' -i .config
+- sed -e 's/CONFIG_LSUSB=y.*/# CONFIG_LSUSB is not set/' -i .config
+- sed -e 's/CONFIG_LSPCI=y.*/# CONFIG_LSPCI is not set/' -i .config
+- sed -e 's/CONFIG_LZMA=y.*/# CONFIG_LZMA is not set/' -i .config
+- sed -e 's/CONFIG_MKFS_EXT2=y.*/# CONFIG_MKFS_EXT2 is not set/' -i .config
+- sed -e 's/CONFIG_MKFS_MINIX=y.*/# CONFIG_MKFS_MINIX is not set/' -i .config
+- sed -e 's/CONFIG_STRINGS=y.*/# CONFIG_STRINGS is not set/' -i .config
+- sed -e 's/CONFIG_UNLZMA=y.*/# CONFIG_UNLZMA is not set/' -i .config
+- sed -e 's/CONFIG_UNXZ=y.*/# CONFIG_UNXZ is not set/' -i .config
+- sed -e 's/CONFIG_XZ=y.*/# CONFIG_XZ is not set/' -i .config
+
+# Now turn on some little bits we do need
+- sed -e 's/# CONFIG_BBCONFIG is not set/CONFIG_BBCONFIG=y/' -i .config
+- sed -e 's/# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set/CONFIG_FEATURE_COMPRESS_BBCONFIG=y/'
+ -i .config
+- sed -e 's/# CONFIG_FEATURE_MOUNT_HELPERS is not set/CONFIG_FEATURE_MOUNT_HELPERS=y/'
+ -i .config
+
+
+build-commands:
+- make KCONFIG_NOTIMESTAMP=1
+
+install-commands:
+- |
+ if [ "$PREFIX" = /usr ]; then PREFIX=; fi &&
+ make CONFIG_PREFIX="$DESTDIR$PREFIX" KCONFIG_NOTIMESTAMP=1 install &&
+ chmod 6755 "$DESTDIR$PREFIX"/bin/busybox
+# Set up man environment variables
+- mkdir -p "$DESTDIR"/etc
+- |
+ cat << EOF > "$DESTDIR/etc/man.conf"
+ # This file is used by man to provide a manpath for those without one by
+ # examining their PATH environment variable.
+ #
+ # Lines beginning with `#' are comments and are ignored. Any combination of
+ # tabs or spaces may be used as `whitespace' separators.
+
+ MANDATORY_MANPATH /usr/man
+ MANDATORY_MANPATH /usr/share/man
+ MANDATORY_MANPATH /usr/local/share/man
+ EOF
diff --git a/strata/build-essential/ccache.morph b/strata/build-essential/ccache.morph
new file mode 100644
index 00000000..441344f9
--- /dev/null
+++ b/strata/build-essential/ccache.morph
@@ -0,0 +1,14 @@
+name: ccache
+kind: chunk
+build-system: autotools
+
+configure-commands:
+- ./configure --prefix="$PREFIX"
+
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- mkdir -p "$DESTDIR/$PREFIX/lib/ccache"
+- for cc in gcc cc g++ c++; do ln -sf "$PREFIX/bin/ccache" "$DESTDIR/$PREFIX/lib/ccache/$cc";
+ done
+- for cc in gcc cc g++ c++; do ln -sf "$PREFIX/bin/ccache" "$DESTDIR/$PREFIX/lib/ccache/$TARGET-$cc";
+ done
diff --git a/strata/build-essential/fhs-dirs.morph b/strata/build-essential/fhs-dirs.morph
new file mode 100644
index 00000000..f4a1b1e9
--- /dev/null
+++ b/strata/build-essential/fhs-dirs.morph
@@ -0,0 +1,49 @@
+name: fhs-dirs
+kind: chunk
+description: create the FHS 2.3 directory hierarchy and the usual files
+install-commands:
+- sh ./create-fhs-dirs "$DESTDIR"
+- install -m 644 passwd "$DESTDIR/etc/passwd"
+- install -m 600 shadow "$DESTDIR/etc/shadow"
+- install -m 644 interfaces "$DESTDIR/etc/network/interfaces"
+- install -m 644 group "$DESTDIR/etc/group"
+- install -m 644 issue "$DESTDIR/etc/issue"
+- install -m 644 services "$DESTDIR/etc/services"
+- install -m 644 protocols "$DESTDIR/etc/protocols"
+- echo baserock > "$DESTDIR"/etc/hostname
+devices:
+- type: c
+ filename: /dev/console
+ gid: 0
+ major: 5
+ minor: 1
+ permissions: '0600'
+ uid: 0
+- type: c
+ filename: /dev/full
+ gid: 0
+ major: 1
+ minor: 7
+ permissions: '0666'
+ uid: 0
+- type: c
+ filename: /dev/null
+ gid: 0
+ major: 1
+ minor: 3
+ permissions: '0666'
+ uid: 0
+- type: c
+ filename: /dev/urandom
+ gid: 0
+ major: 1
+ minor: 9
+ permissions: '0666'
+ uid: 0
+- type: c
+ filename: /dev/zero
+ gid: 0
+ major: 1
+ minor: 5
+ permissions: '0666'
+ uid: 0
diff --git a/strata/build-essential/gawk.morph b/strata/build-essential/gawk.morph
new file mode 100644
index 00000000..1ad871c6
--- /dev/null
+++ b/strata/build-essential/gawk.morph
@@ -0,0 +1,5 @@
+name: gawk
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --prefix="$PREFIX" --disable-nls
diff --git a/strata/build-essential/gcc.morph b/strata/build-essential/gcc.morph
new file mode 100644
index 00000000..18459b73
--- /dev/null
+++ b/strata/build-essential/gcc.morph
@@ -0,0 +1,62 @@
+name: gcc
+kind: chunk
+
+products:
+- artifact: gcc-libs
+ include:
+ - (usr/)lib/lib.*\.so(\.\d+)*$
+- artifact: gcc-doc
+ include:
+ - (usr/)?share/doc/.*
+ - (usr/)?share/man/.*
+ - (usr/)?share/info/.*
+- artifact: gcc-devel
+ # devel includes everything which isn't documentation or libs, since
+ # everything else gcc produces is required for compiling
+ # this is the -devel artifact instead of -misc, since it goes in -devel
+ # stratum artifacts by default
+ include: [.*]
+configure-commands:
+- mkdir o
+
+# Configure flag notes:
+# 1. An attempt to stop anything going in $PREFIX/lib64 (which doesn't
+# fully work; we will need to hobble the multilib configuration in
+# config/i386/t-linux64 if we really want to kill /lib64).
+# 2. Avoid having more than one copy of ZLib in use on the system
+# 3. Multilib does not make sense in Baserock.
+- |
+ case "$MORPH_ARCH" in
+ armv7lhf) ARCH_FLAGS="--with-arch=armv7-a \
+ --with-tune=cortex-a9 \
+ --with-fpu=vfpv3-d16 \
+ --with-float=hard" ;;
+ armv7*) ARCH_FLAGS="--with-arch=armv7-a" ;;
+ esac
+
+ cd o && ../configure \
+ $ARCH_FLAGS \
+ --prefix="$PREFIX" \
+ `# [1]` --libdir=$PREFIX/lib \
+ --disable-bootstrap \
+ `# [2]` --with-system-zlib \
+ `# [3]` --disable-multilib \
+ --enable-languages=c,c++,fortran
+
+build-commands:
+- |
+ case "$MORPH_ARCH" in
+ armv5*) sed -i "s/--host=none/--host=armv5/" o/Makefile
+ sed -i "s/--target=none/--target=armv5/" o/Makefile ;;
+ armv7*) sed -i "s/--host=none/--host=armv7a/" o/Makefile
+ sed -i "s/--target=none/--target=armv7a/" o/Makefile ;;
+ esac
+ cd o && make
+
+install-commands:
+- cd o && make DESTDIR="$DESTDIR" install
+- ln -s gcc "$DESTDIR/$PREFIX/bin/cc"
+- |
+ for fortran_alias in f77 f90 f95; do
+ ln -s gfortran "$DESTDIR/$PREFIX/bin/$fortran_alias"
+ done
diff --git a/strata/build-essential/glibc.morph b/strata/build-essential/glibc.morph
new file mode 100644
index 00000000..6c87c5d9
--- /dev/null
+++ b/strata/build-essential/glibc.morph
@@ -0,0 +1,100 @@
+name: glibc
+kind: chunk
+products:
+- artifact: glibc-nss
+ include:
+ - etc/nsswitch.conf
+ - (usr/)?lib/libnss.*
+- artifact: glibc-gconv
+ include:
+ - (usr/)?lib/gconv/.*
+- artifact: glibc-libs
+ include:
+ - sbin/ldconfig
+ - lib(32|64)?/ld-.*
+ - (usr/)?lib(exec)?/pt_chown
+- artifact: glibc-bins
+ include:
+ - (usr/)?s?bin/.*
+ - (usr/)?libexec/getconf/.*
+ - (usr/)?lib(32|64)?/libSegFault\.so(\.\d+)*$
+- artifact: glibc-libs
+ include:
+ # This is processed after bins, so bins can take libSegFault.so
+ - (usr/)?lib(32|64)?/lib[^/]*\.so(\.\d+)*$
+ - etc/ld.so.conf
+ - etc/ld.so.conf.d
+- artifact: glibc-devel
+ include:
+ - (usr/)?include/.*
+ - (usr/)?lib(32|64)?/lib.*\.a
+ - (usr/)?lib(32|64)?/lib.*\.la
+ - (usr/)?(lib(32|64)?|share)/pkgconfig/.*\.pc
+ - (usr/)?lib(32|64)?/.*\.o
+- artifact: glibc-locale
+ include:
+ - (usr/)?lib/locale/.*
+ - (usr/)?share/locale/.*
+ - (usr/)?share/i18n/.*
+ - (usr/)?share/zoneinfo/.*
+- artifact: glibc-misc
+ include:
+ - .*
+configure-commands:
+- mkdir o
+
+- |
+ case "$MORPH_ARCH" in
+ armv7*)
+ ARCH_FLAGS="--without-fp" ;;
+ esac
+
+ # We override the PATH here to remove /tools/bin from it.
+ # Thanks to this glibc finds bash in /bin/bash through the /bin
+ # symlink. This is important because glibc changes the path to bash
+ # of the shebang in some scripts and these scripts will be broken if
+ # they point to bash in /tools/bin/bash.
+ export PATH="/usr/bin:/sbin:/bin";
+ export CFLAGS="-O2 $CFLAGS";
+ cd o && ../configure \
+ $ARCH_FLAGS \
+ --prefix="$PREFIX" \
+ --disable-profile \
+ --enable-kernel=3.0.0 \
+ --without-cvs \
+ --without-selinux \
+ --enable-obsolete-rpc
+
+build-commands:
+- cd o && make localtime=UTC
+
+install-commands:
+- cd o && make install_root="$DESTDIR" localtime=UTC install
+- cd o && make install_root="$DESTDIR" localtime=UTC localedata/install-locales
+- mkdir -p "$DESTDIR/etc"
+- mkdir -p "$DESTDIR/etc/ld.so.conf.d"
+- |
+ cat <<EOF > nsswitch.conf
+ passwd: compat
+ group: compat
+ shadow: compat
+
+ hosts: files myhostname mdns4_minimal [NOTFOUND=return] dns mdns4
+ networks: files
+
+ protocols: db files
+ services: db files
+ ethers: db files
+ rpc: db files
+
+ netgroup: nis
+ EOF
+- install -m 644 -o root -g root nsswitch.conf "$DESTDIR/etc/nsswitch.conf"
+- |
+ cat <<EOF > ld.so.conf
+ /lib
+ /usr/lib
+ /usr/local/lib
+ include /etc/ld.so.conf.d/*.conf
+ EOF
+- install -m 644 -o root -g root ld.so.conf "$DESTDIR/etc/ld.so.conf"
diff --git a/strata/build-essential/linux-api-headers.morph b/strata/build-essential/linux-api-headers.morph
new file mode 100644
index 00000000..62aa22b8
--- /dev/null
+++ b/strata/build-essential/linux-api-headers.morph
@@ -0,0 +1,24 @@
+name: linux-api-headers
+kind: chunk
+install-commands:
+- |
+ case "$MORPH_ARCH" in
+ armv5l)
+ ARCH="arm" ;;
+ armv7b|armv7l|armv7lhf)
+ ARCH="arm" ;;
+ armv8l64|armv8b64)
+ ARCH="arm64" ;;
+ x86_32)
+ ARCH="i386" ;;
+ x86_64)
+ ARCH="x86_64" ;;
+ ppc64)
+ ARCH="powerpc" ;;
+ *)
+ echo "Error: unsupported Morph architecture: $MORPH_ARCH" >&2
+ exit 1
+ esac
+ ARCH=$ARCH make INSTALL_HDR_PATH=dest headers_install
+- install -d "$DESTDIR${PREFIX-/usr}/include"
+- cp -r dest/include/* "$DESTDIR/${PREFIX-/usr}/include"
diff --git a/strata/build-essential/m4-tarball.morph b/strata/build-essential/m4-tarball.morph
new file mode 100644
index 00000000..eb16726a
--- /dev/null
+++ b/strata/build-essential/m4-tarball.morph
@@ -0,0 +1,5 @@
+name: m4-tarball
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --prefix="$PREFIX" --disable-gcc-warnings
diff --git a/strata/build-essential/make.morph b/strata/build-essential/make.morph
new file mode 100644
index 00000000..1259b342
--- /dev/null
+++ b/strata/build-essential/make.morph
@@ -0,0 +1,5 @@
+name: make
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --prefix="$PREFIX" --disable-nls
diff --git a/strata/build-essential/stage1-binutils.morph b/strata/build-essential/stage1-binutils.morph
new file mode 100644
index 00000000..69a79d14
--- /dev/null
+++ b/strata/build-essential/stage1-binutils.morph
@@ -0,0 +1,23 @@
+name: stage1-binutils
+kind: chunk
+build-system: autotools
+
+configure-commands:
+# We set the sysroot location dynamically at runtime by passing
+# `--sysroot` to GCC, so we need to build a linker with sysroot support.
+# We set it to a non-existent directory as a safety net to avoid looking
+# at the host dirs in case we forget to set the sysroot. Setting the
+# lib path is vital to avoid the tools we build linking to the libraries
+# on the host system; the '=' makes the path we give relative to the
+# sysroot, which we can then set at runtime by passing -Wl,--sysroot to
+# GCC. Although nothing should be installed on /lib64, we configure the
+# linker to look at that directory as well to make things more robust
+# (currently GCC installs libraries to this directory at least on
+# x86_64).
+
+- |
+ ./configure --prefix="$PREFIX" --disable-nls --disable-werror \
+ --build=$(sh config.guess) \
+ --host=$(sh config.guess) \
+ --target=$TARGET_STAGE1 \
+ --with-sysroot=/nonexistentdir --with-lib-path="=$PREFIX/lib:=$PREFIX/lib64"
diff --git a/strata/build-essential/stage1-gcc.morph b/strata/build-essential/stage1-gcc.morph
new file mode 100644
index 00000000..f5d828f7
--- /dev/null
+++ b/strata/build-essential/stage1-gcc.morph
@@ -0,0 +1,83 @@
+name: stage1-gcc
+kind: chunk
+
+configure-commands:
+# Workaround from LFS due GCC not detecting stack protection correctly
+- |
+ sed -i -e '/k prot/a \
+ gcc_cv_libc_provides_ssp=yes
+ ' gcc/configure
+
+- mkdir o
+
+# Configure flag notes:
+# 1. See gcc.morph.
+# 2. Although we will be setting a sysroot at runtime, giving a
+# temporary one at configuration time seems necessary so that
+# `--with-native-system-header-dir` produces effect and
+# /tools/include is in the include path for the newly built GCC. We
+# set it by default to a non-existent directory to avoid GCC looking
+# at the host dirs, in case we forget to give it at runtime.
+# 3. Disable searching /usr/local/include for headers
+# 4. The pass 1 compiler needs to find the libraries we build in pass
+# 2. Include path must be set explicility, because it defaults to
+# $SYSROOT/usr/include rather than $SYSROOT/include.
+# 5. Disable stuff that doesn't work when building a cross compiler
+# without an existing libc, and generally try to keep this build as
+# simple as possible.
+- |
+ case "$MORPH_ARCH" in
+ armv7lhf) ARCH_FLAGS="--with-arch=armv7-a \
+ --with-tune=cortex-a9 \
+ --with-fpu=vfpv3-d16 \
+ --with-float=hard" ;;
+ armv7*) ARCH_FLAGS="--with-arch=armv7-a" ;;
+ esac
+
+ cd o && CXX="g++ -std=gnu++98" ../configure \
+ $ARCH_FLAGS \
+ --build=$(sh ../config.guess) \
+ --host=$(sh ../config.guess) \
+ --target=$TARGET_STAGE1 \
+ --prefix="$PREFIX" \
+ `# [1]` --libdir="$PREFIX/lib" \
+ `# [2]` --with-sysroot=/nonexistentdir \
+ --with-newlib \
+ `# [3]` --with-local-prefix="$PREFIX" \
+ `# [4]` --with-native-system-header-dir="$PREFIX/include" \
+ --without-headers \
+ --disable-nls \
+ --disable-shared \
+ --disable-multilib \
+ `# [5]` --disable-decimal-float \
+ `# [5]` --disable-threads \
+ `# [5]` --disable-libatomic \
+ `# [5]` --disable-libgomp \
+ `# [5]` --disable-libitm \
+ `# [5]` --disable-libmpx \
+ `# [5]` --disable-libquadmath \
+ `# [5]` --disable-libsanitizer \
+ `# [5]` --disable-libssp \
+ `# [5]` --disable-libvtv \
+ `# [5]` --disable-libcilkrts \
+ `# [5]` --disable-libstdc++-v3 \
+ --enable-languages=c,c++
+
+build-commands:
+- |
+ # GCC is not passing the correct host/target flags to GMP's configure
+ # script, which causes it to not use the machine-dependent code for
+ # the platform and use the generic one instead. However, the generic
+ # code results on an undefined reference to `__gmpn_invert_limb' in
+ # ARMv7. Fix the invocation of GMP's configure script so that GMP can
+ # use the machine-dependent code.
+ case "$MORPH_ARCH" in
+ armv5*) sed -i "s/--host=none/--host=armv5/" o/Makefile
+ sed -i "s/--target=none/--target=armv5/" o/Makefile ;;
+ armv7*) sed -i "s/--host=none/--host=armv7a/" o/Makefile
+ sed -i "s/--target=none/--target=armv7a/" o/Makefile ;;
+ esac
+ cd o && make
+
+install-commands:
+- cd o && make DESTDIR="$DESTDIR" install
diff --git a/strata/build-essential/stage2-binutils.morph b/strata/build-essential/stage2-binutils.morph
new file mode 100644
index 00000000..b07b56a4
--- /dev/null
+++ b/strata/build-essential/stage2-binutils.morph
@@ -0,0 +1,21 @@
+name: stage2-binutils
+kind: chunk
+build-system: autotools
+
+configure-commands:
+- |
+ export STAGE2_SYSROOT="$(dirname $(pwd))"
+ export CXX="$TARGET_STAGE1-g++ --sysroot=$STAGE2_SYSROOT"
+ # binutils has its own embedded libtool, which is old and strips out
+ # `--sysroot`. Work around by modifying the compiler command to
+ # include the sysroot flag
+ export CC="$TARGET_STAGE1-gcc --sysroot=$STAGE2_SYSROOT"
+ ./configure --prefix="$PREFIX" --disable-nls --disable-werror \
+ --build=$(sh config.guess) \
+ --host=$TARGET_STAGE1 \
+ --target=$TARGET_STAGE1
+
+build-commands:
+- |
+ export STAGE2_SYSROOT="$(dirname $(pwd))"
+ make
diff --git a/strata/build-essential/stage2-busybox.morph b/strata/build-essential/stage2-busybox.morph
new file mode 100644
index 00000000..f271a40d
--- /dev/null
+++ b/strata/build-essential/stage2-busybox.morph
@@ -0,0 +1,80 @@
+name: stage2-busybox
+kind: chunk
+
+configure-commands:
+# Explicitly setting HOSTCC is required because we have a 'gcc' earlier in
+# the PATH supplied by the stage2-gcc chunk, which can't execute outside of
+# the stage 3 staging area.
+- make HOSTCC="/usr/bin/gcc" CROSS_COMPILE=$TARGET_STAGE1- KCONFIG_NOTIMESTAMP=1 defconfig
+
+# Avoid dividing applets between $PREFIX/[s]bin and $PREFIX/usr/[s]bin.
+- '[ "$PREFIX" = /usr ] || sed -e ''s/.*INSTALL_NO_USR.*/CONFIG_INSTALL_NO_USR=y/''
+ -i .config'
+# We have GAWK.
+- sed -e 's/CONFIG_AWK=y.*/# CONFIG_AWK is not set/' -i .config
+
+# Depends on stuff that was removed since eglibc 2.14.
+- sed -e 's/CONFIG_INETD=y.*/# CONFIG_INETD is not set/' -i .config
+
+# Busybox Patch is incompatible enough with GNU Patch that it can't be
+# used for GNULib projects built from Git.
+- sed -e 's/CONFIG_PATCH=y.*/# CONFIG_PATCH is not set/' -i .config
+
+# None of this is needed because we have kmod; and it actually breaks the
+# Linux build because depmod isn't compatible enough with util-linux's.
+- sed -e 's/CONFIG_DEPMOD=y.*/# CONFIG_DEPMOD is not set/' -i .config
+- sed -e 's/CONFIG_INSMOD=y.*/# CONFIG_INSMOD is not set/' -i .config
+- sed -e 's/CONFIG_MODPROBE=y.*/# CONFIG_MODPROBE is not set/' -i .config
+- sed -e 's/CONFIG_MODPROBE_SMALL=y.*/# CONFIG_MODPROBE_SMALL is not set/' -i .config
+- sed -e 's/CONFIG_LSMOD=y.*/# CONFIG_LSMOD is not set/' -i .config
+- sed -e 's/CONFIG_RMMOD=y.*/# CONFIG_RMMOD is not set/' -i .config
+
+# General features that we don't need.
+- sed -e 's/CONFIG_FEATURE_MOUNT_CIFS=y.*/# CONFIG_FEATURE_MOUNT_CIFS is not set/'
+ -i .config
+- sed -e 's/CONFIG_FEATURE_EXTRA_QUIET=y.*/# CONFIG_FEATURE_EXTRA_QUIET is not set/'
+ -i .config
+- sed -e 's/CONFIG_FEATURE_INIT_COREDUMPS=y.*/# CONFIG_FEATURE_INIT_COREDUMPS is not
+ set/' -i .config
+- sed -e 's/CONFIG_FEATURE_INIT_SCTTY=y.*/# CONFIG_FEATURE_INIT_SCTTY is not set/'
+ -i .config
+- sed -e 's/CONFIG_FEATURE_INIT_SYSLOG=y.*/# CONFIG_FEATURE_INIT_SYSLOG is not set/'
+ -i .config
+- sed -e 's/CONFIG_FEATURE_INITRD=y.*/# CONFIG_FEATURE_INITRD is not set/' -i .config
+- sed -e 's/CONFIG_FEATURE_USE_INITTAB=y.*/# CONFIG_FEATURE_USE_INITTAB is not set/'
+ -i .config
+- sed -e 's/CONFIG_FEATURE_MINIX2=y.*/# CONFIG_FEATURE_MINIX2 is not set/' -i .config
+- sed -e 's/CONFIG_FSCK_MINIX=y.*/# CONFIG_FSCK_MINIX is not set/' -i .config
+- sed -e 's/CONFIG_HALT=y.*/# CONFIG_HALT is not set/' -i .config
+- sed -e 's/CONFIG_INIT=y.*/# CONFIG_INIT is not set/' -i .config
+- sed -e 's/CONFIG_INIT_TERMINAL_TYPE=y.*/CONFIG_INIT_TERMINAL_TYPE=""/' -i .config
+- sed -e 's/CONFIG_LOSETUP=y.*/# CONFIG_LOSETUP is not set/' -i .config
+- sed -e 's/CONFIG_LSUSB=y.*/# CONFIG_LSUSB is not set/' -i .config
+- sed -e 's/CONFIG_LZMA=y.*/# CONFIG_LZMA is not set/' -i .config
+- sed -e 's/CONFIG_MKFS_EXT2=y.*/# CONFIG_MKFS_EXT2 is not set/' -i .config
+- sed -e 's/CONFIG_MKFS_MINIX=y.*/# CONFIG_MKFS_MINIX is not set/' -i .config
+- sed -e 's/CONFIG_RUNLEVEL=y.*/# CONFIG_RUNLEVEL is not set/' -i .config
+- sed -e 's/CONFIG_STRINGS=y.*/# CONFIG_STRINGS is not set/' -i .config
+- sed -e 's/CONFIG_UNLZMA=y.*/# CONFIG_UNLZMA is not set/' -i .config
+- sed -e 's/CONFIG_UNXZ=y.*/# CONFIG_UNXZ is not set/' -i .config
+- sed -e 's/CONFIG_XZ=y.*/# CONFIG_XZ is not set/' -i .config
+
+build-commands:
+- |
+ export STAGE2_SYSROOT="$(dirname $(pwd))"
+ export CPPFLAGS="--sysroot=$STAGE2_SYSROOT"
+ export LDFLAGS="--sysroot=$STAGE2_SYSROOT"
+ make HOSTCC="/usr/bin/gcc" CROSS_COMPILE=$TARGET_STAGE1- KCONFIG_NOTIMESTAMP=1
+
+install-commands:
+# We expect to be built with a non-standard prefix in stage 2 (i.e. not
+# /usr). The install will break if prefix is set to /usr.
+- |
+ export STAGE2_SYSROOT="$(dirname $(pwd))"
+ export CPPFLAGS="--sysroot=$STAGE2_SYSROOT"
+ export LDFLAGS="--sysroot=$STAGE2_SYSROOT"
+ make CONFIG_PREFIX="$DESTDIR$PREFIX" \
+ HOSTCC="/usr/bin/gcc" \
+ CROSS_COMPILE=$TARGET_STAGE1- \
+ KCONFIG_NOTIMESTAMP=1 install &&
+ chmod 6755 "$DESTDIR$PREFIX"/bin/busybox
diff --git a/strata/build-essential/stage2-fake-bash.morph b/strata/build-essential/stage2-fake-bash.morph
new file mode 100644
index 00000000..021fd366
--- /dev/null
+++ b/strata/build-essential/stage2-fake-bash.morph
@@ -0,0 +1,4 @@
+name: stage2-fake-bash
+kind: chunk
+install-commands:
+- printf '#!/bin/sh\nexec /bin/sh "$@"\n' | install -D /proc/self/fd/0 -m 755 "$DESTDIR$PREFIX/bin/bash"
diff --git a/strata/build-essential/stage2-fhs-dirs.morph b/strata/build-essential/stage2-fhs-dirs.morph
new file mode 100644
index 00000000..6f842403
--- /dev/null
+++ b/strata/build-essential/stage2-fhs-dirs.morph
@@ -0,0 +1,51 @@
+name: stage2-fhs-dirs
+kind: chunk
+description: create the FHS 2.3 directory hierarchy and the usual files
+install-commands:
+- sh ./create-fhs-dirs "$DESTDIR"
+- rmdir "$DESTDIR/usr/bin"
+- ln -s "$PREFIX/bin" "$DESTDIR/usr/bin"
+- install -m 644 passwd "$DESTDIR/etc/passwd"
+- install -m 600 shadow "$DESTDIR/etc/shadow"
+- install -m 644 interfaces "$DESTDIR/etc/network/interfaces"
+- install -m 644 group "$DESTDIR/etc/group"
+- install -m 644 issue "$DESTDIR/etc/issue"
+- install -m 644 services "$DESTDIR/etc/services"
+- install -m 644 protocols "$DESTDIR/etc/protocols"
+- echo baserock > "$DESTDIR"/etc/hostname
+devices:
+- type: c
+ filename: /dev/console
+ gid: 0
+ major: 5
+ minor: 1
+ permissions: '0600'
+ uid: 0
+- type: c
+ filename: /dev/full
+ gid: 0
+ major: 1
+ minor: 7
+ permissions: '0666'
+ uid: 0
+- type: c
+ filename: /dev/null
+ gid: 0
+ major: 1
+ minor: 3
+ permissions: '0666'
+ uid: 0
+- type: c
+ filename: /dev/urandom
+ gid: 0
+ major: 1
+ minor: 9
+ permissions: '0666'
+ uid: 0
+- type: c
+ filename: /dev/zero
+ gid: 0
+ major: 1
+ minor: 5
+ permissions: '0666'
+ uid: 0
diff --git a/strata/build-essential/stage2-gawk.morph b/strata/build-essential/stage2-gawk.morph
new file mode 100644
index 00000000..15c838b6
--- /dev/null
+++ b/strata/build-essential/stage2-gawk.morph
@@ -0,0 +1,9 @@
+name: stage2-gawk
+kind: chunk
+build-system: autotools
+configure-commands:
+- STAGE2_SYSROOT="$(dirname $(pwd))" CPPFLAGS="--sysroot=$STAGE2_SYSROOT" CXX=false
+ LDFLAGS="--sysroot=$STAGE2_SYSROOT" ./configure --prefix="$PREFIX" --disable-nls
+ --build=$(sh config.guess) --host=$TARGET_STAGE1
+build-commands:
+- STAGE2_SYSROOT="$(dirname $(pwd))" make
diff --git a/strata/build-essential/stage2-gcc-fixed-headers.morph b/strata/build-essential/stage2-gcc-fixed-headers.morph
new file mode 100644
index 00000000..10794872
--- /dev/null
+++ b/strata/build-essential/stage2-gcc-fixed-headers.morph
@@ -0,0 +1,19 @@
+name: stage2-gcc-fixed-headers
+kind: chunk
+install-commands:
+# Stage 1 GCC's fixincludes process created a limits.h before there was
+# a real limits.h available for the target. This step (taken from Linux
+# Linux From Scratch) creates a better one so that stage 2 GCC can compile.
+#
+# THIS IS A FRAGILE HACK! We need to replace the headers. The only way to
+# overwrite files in a staging area is to install a new chunk.
+# This is undesired behaviour in the long term, as we want to never
+# have overlaps, so this functionality may go away.
+- |
+ libgcc_dir=$(dirname $($TARGET_STAGE1-gcc -print-libgcc-file-name))
+ sysroot="$(dirname "$(pwd)")"
+ target_libgcc_dir="${libgcc_dir#$sysroot}"
+ mkdir -p "$DESTDIR/$target_libgcc_dir/include-fixed"
+ cat "gcc/limitx.h" "gcc/glimits.h" "gcc/limity.h" \
+ >"$DESTDIR/$target_libgcc_dir/include-fixed/limits.h"
+
diff --git a/strata/build-essential/stage2-gcc.morph b/strata/build-essential/stage2-gcc.morph
new file mode 100644
index 00000000..6f211e83
--- /dev/null
+++ b/strata/build-essential/stage2-gcc.morph
@@ -0,0 +1,81 @@
+name: stage2-gcc
+kind: chunk
+
+configure-commands:
+- mkdir o
+
+# In other projects we specify the sysroot location using CPPFLAGS.
+# Here, that breaks because GCC compiles stuff for the *build* machine,
+# too ... and this requires using the host's compiler, which cannot use
+# the same set of CPPFLAGS as the target. If we specify the sysroot
+# using CC instead then we don't interfere, because we are only
+# specifying the *host* C compiler.
+#
+# Configure flag notes:
+# 1. It's vital that this compiler runs in the bootstrap machine, and
+# targets the same machine (TARGET_STAGE1) so that the stage 1 GCC
+# is used instead of the compiler of the build machine.
+# 2. See gcc.morph.
+# 3. Disable searching /usr/local/include for headers
+# 4. This flag causes the correct --sysroot flag to be passed when
+# calling stage 1 GCC.
+- |
+ case "$MORPH_ARCH" in
+ armv7lhf) ARCH_FLAGS="--with-arch=armv7-a \
+ --with-tune=cortex-a9 \
+ --with-fpu=vfpv3-d16 \
+ --with-float=hard" ;;
+ armv7*) ARCH_FLAGS="--with-arch=armv7-a" ;;
+ esac
+ export STAGE2_SYSROOT="$(dirname $(pwd))"
+ export CC="$TARGET_STAGE1-gcc --sysroot=$STAGE2_SYSROOT"
+ export CXX="$TARGET_STAGE1-g++ --sysroot=$STAGE2_SYSROOT"
+ export AR="$TARGET_STAGE1-ar"
+ export RANLIB="$TARGET_STAGE1-ranlib"
+ cd o && ../configure \
+ $ARCH_FLAGS \
+ --build=$(sh ../config.guess) \
+ `# [1]` --host=$TARGET_STAGE1 \
+ `# [1]` --target=$TARGET_STAGE1 \
+ --prefix="$PREFIX" \
+ `# [2]` --libdir=$PREFIX/lib \
+ `# [3]` --with-local-prefix=$PREFIX \
+ `# [4]` --with-build-sysroot="$STAGE2_SYSROOT" \
+ --disable-bootstrap \
+ --disable-nls \
+ --disable-multilib \
+ --disable-libgomp \
+ --disable-libstdcxx-pch \
+ --enable-languages=c,c++
+
+build-commands:
+- |
+ case "$MORPH_ARCH" in
+ armv5*) sed -i "s/--host=none/--host=armv5/" o/Makefile
+ sed -i "s/--target=none/--target=armv5/" o/Makefile ;;
+ armv7*) sed -i "s/--host=none/--host=armv7a/" o/Makefile
+ sed -i "s/--target=none/--target=armv7a/" o/Makefile ;;
+ esac
+ export STAGE2_SYSROOT="$(dirname $(pwd))"
+ cd o && make
+
+install-commands:
+- cd o && make DESTDIR="$DESTDIR" install
+
+# Stage 3 builds need to link against this file in the location that
+# it will be in the final system, so we make a temporary link now.
+#
+# On x86_64 GCC resolutely installs its libraries into lib64. To fix this
+# would require hobbling the MULTILIB_OSDIRNAMES field in
+# gcc/config/i386/t-linux64 and this might break things, so for now we
+# tolerate the inconsistency.
+- |
+ if [ "$(echo $TARGET | cut -c -6)" = "x86_64" ]; then
+ libdir=lib64
+ else
+ libdir=lib
+ fi
+
+ install -d "$DESTDIR/lib"
+ ln -s "$PREFIX/$libdir/libgcc_s.so" "$DESTDIR/lib/"
+ ln -s "$PREFIX/$libdir/libgcc_s.so.1" "$DESTDIR/lib/"
diff --git a/strata/build-essential/stage2-glibc.morph b/strata/build-essential/stage2-glibc.morph
new file mode 100644
index 00000000..d2ead6c6
--- /dev/null
+++ b/strata/build-essential/stage2-glibc.morph
@@ -0,0 +1,108 @@
+name: stage2-glibc
+kind: chunk
+build-system: manual
+
+configure-commands:
+- mkdir o
+
+# Configure flag notes:
+# 1. Avoid installing to PREFIX/lib64 on x86_64.
+# 2. Location of linux-api-headers.
+# 3. Normal flags. See glibc.morph.
+# 4. Force configuration values of certain things that can't be detected
+# in a cross-compile.
+- |
+ case "$MORPH_ARCH" in
+ armv7*)
+ ARCH_FLAGS="--without-fp" ;;
+ esac
+
+ export CFLAGS="-O2 $CFLAGS"; export CXX=false; \
+ cd o && ../configure \
+ $ARCH_FLAGS \
+ --build=$(../scripts/config.guess) --host=$TARGET_STAGE1 \
+ --prefix="$PREFIX" \
+ --enable-obsolete-rpc \
+ `# [1]` --libdir="$PREFIX/lib" \
+ `# [2]` --with-headers="$(pwd)/../../$PREFIX/include" \
+ `# [3]` --disable-profile --enable-kernel=2.6.25 \
+ `# [4]` libc_cv_c_cleanup=yes libc_cv_ctors_header=yes \
+ libc_cv_forced_unwind=yes libc_cv_ssp=no
+
+build-commands:
+- cd o && make localtime=UTC
+
+install-commands:
+- cd o && make install_root="$DESTDIR" localtime=UTC install
+- mkdir -p "$DESTDIR/etc"
+- mkdir -p "$DESTDIR/etc/ld.so.conf.d"
+- |
+ cat <<EOF > ld.so.conf
+ /lib
+ /usr/lib
+ /usr/local/lib
+ include /etc/ld.so.conf.d/*.conf
+ EOF
+- install -m 644 -o root -g root ld.so.conf "$DESTDIR/etc/ld.so.conf"
+- |
+ # Fix up GCC to handle the sysroot containing glibc being in a different
+ # location for each chunk build.
+ #
+ # For headers, it's enough to pass -B in the CPPFLAGS. This would work for
+ # the startup files (crt*.o) as well, except where libtool is involved (in
+ # which case it strips -B out of your LDFLAGS before calling GCC). We get
+ # around this by making GCC locate them relative to the environment variable
+ # STAGE2_SYSROOT, which we can then set along with CPPFLAGS in each stage 2
+ # chunk build.
+ #
+ # We also force the use of the program loader at PREFIX/lib/ld.so instead
+ # of its usual home in /lib or /lib64, which is necessary for the output of
+ # stage 2 to work as a chroot when building stage 3.
+
+ sysroot="$(dirname "$(pwd)")"
+ specs_dir="$(dirname $($TARGET_STAGE1-gcc --print-libgcc-file-name))"
+ target_specs_dir="$DESTDIR/${specs_dir#$sysroot}"
+ mkdir -p "$target_specs_dir"
+
+ $TARGET_STAGE1-gcc -dumpspecs |
+ sed -e "s@[gMS]\?crt[1in].o%s@%:getenv(STAGE2_SYSROOT $PREFIX/lib/&)@g" \
+ -e "s@/lib\(64\)\?/ld@$PREFIX/lib/ld@g" \
+ > "$target_specs_dir/specs-for-sysroot"
+
+ # NASTY HACK #
+ # We create a symlink to the actual specs here, so that later the
+ # symlink can be replaced with a dangling link.
+ #
+ # This is necessary as we need to have gcc use its internal specs,
+ # which can differ to the specs generated by `gcc -dumpspecs`.
+ #
+ # The dangling symlink will not make it onto the final system, just
+ # like all other bootstrap only components.
+ ln -s specs-for-sysroot "$target_specs_dir/specs"
+
+# Install a symlink for the program interpreter (ld.so) so that binaries
+# built in stage 3 before the stage 3 glibc is built can use it.
+# FIXME: get a better way of finding the name of the loader. The lib64
+# path is hardcoded into glibc in the file
+# sysdeps/unix/sysv/linux/configure.
+- install -d $DESTDIR/lib
+- |
+ case "$MORPH_ARCH" in
+ x86_64)
+ install -d "$DESTDIR/lib64"
+ ln -s "$PREFIX/lib/ld-linux-x86-64.so.2" \
+ "$DESTDIR/lib64/ld-linux-x86-64.so.2" ;;
+ ppc64l)
+ install -d "$DESTDIR/lib64"
+ ln -s "$PREFIX/lib/ld64.so.2" \
+ "$DESTDIR/lib64/ld64.so.2" ;;
+ ppc64|ppc64b)
+ install -d "$DESTDIR/lib64"
+ ln -s "$PREFIX/lib/ld64.so.1" \
+ "$DESTDIR/lib64/ld64.so.1" ;;
+ *)
+ loader=$(basename $(ls "$DESTDIR$PREFIX"/lib/ld-linux*))
+ [ -z $loader ] && loader=$(basename $(ls "$DESTDIR$PREFIX"/lib/ld.so*))
+ [ -z $loader ] && ( echo "Bug in stage2-glibc ld.so symlinks" ; exit 1 )
+ ln -s "$PREFIX/lib/$loader" "$DESTDIR/lib/$loader"
+ esac
diff --git a/strata/build-essential/stage2-libstdc++.morph b/strata/build-essential/stage2-libstdc++.morph
new file mode 100644
index 00000000..79a40308
--- /dev/null
+++ b/strata/build-essential/stage2-libstdc++.morph
@@ -0,0 +1,36 @@
+name: stage2-libstdc++
+kind: chunk
+configure-commands:
+- mkdir o
+
+# Configure flag notes:
+# 1. The thread C++ library cannot be built, as the thread C library
+# was not build in stage1-gcc.
+# 2. Prevents the installation of precompiled include files, which are
+# not needed at this stage.
+# 3. From LFS: the header location of C++ needs to be explicitly given
+# as we are running the configure script from the top-level
+# directory.
+- |
+ export STAGE2_SYSROOT="$(dirname $(pwd))"
+ # -fPIC must be given, otherwise it will not be possible to create
+ # shared libraries linked to libstdc++
+ export CPPFLAGS="--sysroot=$STAGE2_SYSROOT -fPIC"
+ export LDFLAGS="--sysroot=$STAGE2_SYSROOT"
+ cd o && ../libstdc++-v3/configure \
+ --build=$(sh ../config.guess) \
+ --host="$TARGET_STAGE1" \
+ --target="$TARGET_STAGE1" \
+ --prefix="$PREFIX" \
+ --disable-nls \
+ --disable-shared \
+ --disable-multilib \
+ `# [1]` --disable-libstdcxx-threads \
+ `# [2]` --disable-libstdcxx-pch \
+ `# [3]` --with-gxx-include-dir=/tools/"$TARGET_STAGE1"/include/c++/7.1.0
+
+build-commands:
+- cd o && make
+
+install-commands:
+- cd o && make DESTDIR="$DESTDIR" install
diff --git a/strata/build-essential/stage2-linux-api-headers.morph b/strata/build-essential/stage2-linux-api-headers.morph
new file mode 100644
index 00000000..1da94ee9
--- /dev/null
+++ b/strata/build-essential/stage2-linux-api-headers.morph
@@ -0,0 +1,24 @@
+name: stage2-linux-api-headers
+kind: chunk
+install-commands:
+- |
+ case "$MORPH_ARCH" in
+ armv5l)
+ ARCH="arm" ;;
+ armv7b|armv7l|armv7lhf)
+ ARCH="arm" ;;
+ armv8l64|armv8b64)
+ ARCH="arm64" ;;
+ x86_32)
+ ARCH="i386" ;;
+ x86_64)
+ ARCH="x86_64" ;;
+ ppc64)
+ ARCH="powerpc" ;;
+ *)
+ echo "Error: unsupported Morph architecture: $MORPH_ARCH" >&2
+ exit 1
+ esac
+ ARCH=$ARCH make INSTALL_HDR_PATH=dest headers_install
+- install -d "$DESTDIR${PREFIX-/usr}/include"
+- cp -r dest/include/* "$DESTDIR/${PREFIX-/usr}/include"
diff --git a/strata/build-essential/stage2-make.morph b/strata/build-essential/stage2-make.morph
new file mode 100644
index 00000000..af5e5347
--- /dev/null
+++ b/strata/build-essential/stage2-make.morph
@@ -0,0 +1,9 @@
+name: stage2-make
+kind: chunk
+build-system: autotools
+configure-commands:
+- STAGE2_SYSROOT="$(dirname $(pwd))" CPPFLAGS="--sysroot=$STAGE2_SYSROOT" CXX=false
+ LDFLAGS="--sysroot=$STAGE2_SYSROOT" ./configure --prefix="$PREFIX" --disable-nls --without-guile
+ --build=$(sh config/config.guess) --host=$TARGET_STAGE1
+build-commands:
+- STAGE2_SYSROOT="$(dirname $(pwd))" make
diff --git a/strata/build-essential/stage2-reset-specs.morph b/strata/build-essential/stage2-reset-specs.morph
new file mode 100644
index 00000000..8892f67c
--- /dev/null
+++ b/strata/build-essential/stage2-reset-specs.morph
@@ -0,0 +1,21 @@
+name: stage2-reset-specs
+kind: chunk
+
+# Nasty hack to get around being unable to reliably add configuration to gcc,
+# hence the gcc specs are modified, combined with Baserock's rootfs protection
+# preventing specs being modified before builds.
+# The limitation is overcome by installing files as part of a chunk, which
+# overwrites previous files.
+# New specs were added for the bootstrap builds, but after stage2 we start
+# having chrooted builds, so the old specs need to be replaced.
+# Unfortunately we can't just replace the specs with the ones gcc produces,
+# since gcc behaves differently without specs to with specs it produces!
+# So we use a **NASTY HACK** to replace the specs symlink with one that
+# points to a file that doesn't exist.
+install-commands:
+- |
+ STAGE2_SYSROOT="$(dirname "$(pwd)")"
+ specs_dir="$(dirname $($TARGET_STAGE1-gcc -print-libgcc-file-name))"
+ target_specs_dir="$DESTDIR/${specs_dir#$STAGE2_SYSROOT}"
+ mkdir -p "$target_specs_dir"
+ ln -s "temporary specs removed by baserock bootstrap" "$target_specs_dir/specs"
diff --git a/strata/build-essential/zlib.morph b/strata/build-essential/zlib.morph
new file mode 100644
index 00000000..900648b6
--- /dev/null
+++ b/strata/build-essential/zlib.morph
@@ -0,0 +1,9 @@
+name: zlib
+kind: chunk
+build-system: manual
+configure-commands:
+- ./configure --prefix="$PREFIX"
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/strata/cloudinit-support.morph b/strata/cloudinit-support.morph
new file mode 100644
index 00000000..4cb15542
--- /dev/null
+++ b/strata/cloudinit-support.morph
@@ -0,0 +1,21 @@
+name: cloudinit-support
+kind: stratum
+description: A stratum with cloudinit to fit a system in the OpenStack cloud.
+build-depends:
+- morph: strata/build-essential.morph
+- morph: strata/python2-core.morph
+- morph: strata/python-common.morph
+- morph: strata/foundation.morph
+chunks:
+- name: python-cheetah
+ repo: upstream:python-cheetah
+ ref: 831aa6b99d9b4fb012ee644d8e80e0bc0eb6d6ed
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
+- name: cloud-init
+ morph: strata/cloudinit-support/cloud-init.morph
+ repo: upstream:cloud-init
+ ref: 130d51acc5b0becd64e7007f9dfe41a6e022eaec
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - python-cheetah
diff --git a/strata/cloudinit-support/cloud-init.morph b/strata/cloudinit-support/cloud-init.morph
new file mode 100644
index 00000000..5933dbf8
--- /dev/null
+++ b/strata/cloudinit-support/cloud-init.morph
@@ -0,0 +1,6 @@
+name: cloud-init
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+- mkdir -p "$DESTDIR"/lib/systemd/system
+- cp systemd/* "$DESTDIR"/lib/systemd/system/
diff --git a/strata/connectivity.morph b/strata/connectivity.morph
new file mode 100644
index 00000000..9d1a1b04
--- /dev/null
+++ b/strata/connectivity.morph
@@ -0,0 +1,27 @@
+name: connectivity
+kind: stratum
+build-depends:
+- morph: strata/foundation.morph
+chunks:
+- name: mobile-broadband-provider-info
+ repo: upstream:mobile-broadband-provider-info
+ ref: 4ed19e11c2975105b71b956440acdb25d46a347d
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: libnl
+ repo: upstream:libnl
+ ref: a2c4bd8f094a7247903578860a9c42049991860b
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: wpa_supplicant
+ morph: strata/connectivity/wpa_supplicant.morph
+ repo: upstream:hostap
+ ref: 2462f347bca0a7cce7e06ff88adbe3aa47c52d54
+ unpetrify-ref: hostap_2_6
+ build-depends:
+ - libnl
+- name: iptables
+ repo: upstream:iptables
+ ref: 482c6d3731e2681cb4baae835c294840300197e6
+ unpetrify-ref: v1.4.21
+ build-system: autotools
diff --git a/strata/connectivity/wpa_supplicant.morph b/strata/connectivity/wpa_supplicant.morph
new file mode 100644
index 00000000..3fdc68a2
--- /dev/null
+++ b/strata/connectivity/wpa_supplicant.morph
@@ -0,0 +1,36 @@
+name: wpa_supplicant
+kind: chunk
+configure-commands:
+- |
+ cat >"wpa_supplicant/.config" <<EOF
+ CONFIG_DRIVER_HOSTAP=y
+ CONFIG_DRIVER_ATMEL=y
+ CONFIG_DRIVER_WEXT=y
+ CONFIG_DRIVER_NL80211=y
+ CONFIG_DRIVER_WIRED=y
+ CONFIG_IEEE8021X_EAPOL=y
+ CONFIG_EAP_MD5=y
+ CONFIG_EAP_MSCHAPV2=y
+ CONFIG_EAP_TLS=y
+ CONFIG_EAP_PEAP=y
+ CONFIG_EAP_TTLS=y
+ CONFIG_EAP_GTC=y
+ CONFIG_EAP_OTP=y
+ CONFIG_EAP_LEAP=y
+ CONFIG_WPS=y
+ CONFIG_PKCS12=y
+ CONFIG_SMARTCARD=y
+ CONFIG_CTRL_IFACE=y
+ CONFIG_BACKEND=file
+ CONFIG_PEERKEY=y
+ CONFIG_CTRL_IFACE_DBUS=y
+ CONFIG_CTRL_IFACE_DBUS_NEW=y
+ CONFIG_CTRL_IFACE_DBUS_INTRO=y
+ CONFIG_LIBNL32=y
+ CONFIG_IPV6=y
+ CFLAGS += -I/usr/include/libnl3
+ EOF
+build-commands:
+- make -C wpa_supplicant
+install-commands:
+- make -C wpa_supplicant DESTDIR="$DESTDIR" install
diff --git a/strata/connman-common.morph b/strata/connman-common.morph
new file mode 100644
index 00000000..55f47726
--- /dev/null
+++ b/strata/connman-common.morph
@@ -0,0 +1,16 @@
+name: connman-common
+kind: stratum
+build-depends:
+- morph: strata/connectivity.morph
+- morph: strata/glib-common.morph
+chunks:
+- name: connman
+ morph: strata/connman-common/connman.morph
+ repo: upstream:connman
+ ref: c47e491bb374fe3992d8938cc30b48beee379f23
+ unpetrify-ref: '1.33'
+- name: ofono
+ morph: strata/connman-common/ofono.morph
+ repo: upstream:ofono
+ ref: e51b39e92cffb30c4bc0f95a1c24b9ee9ce22b54
+ unpetrify-ref: '1.19'
diff --git a/strata/connman-common/connman.morph b/strata/connman-common/connman.morph
new file mode 100644
index 00000000..e468bc49
--- /dev/null
+++ b/strata/connman-common/connman.morph
@@ -0,0 +1,6 @@
+name: connman
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./bootstrap
+- ./configure --prefix="$PREFIX" --disable-wispr --disable-client LIBS=-lncurses
diff --git a/strata/connman-common/ofono.morph b/strata/connman-common/ofono.morph
new file mode 100644
index 00000000..a775b0c1
--- /dev/null
+++ b/strata/connman-common/ofono.morph
@@ -0,0 +1,11 @@
+name: ofono
+kind: chunk
+description: ofono Open Source Telephony
+build-system: autotools
+configure-commands:
+- autoreconf -ivf
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var
+install-commands:
+- make install
+- mkdir -p "$DESTDIR/etc/systemd/system/multi-user.target.wants"
+- ln -s /lib/systemd/system/ofono.service "$DESTDIR/etc/systemd/system/multi-user.target.wants/ofono.service"
diff --git a/strata/corba.morph b/strata/corba.morph
new file mode 100644
index 00000000..d9848f76
--- /dev/null
+++ b/strata/corba.morph
@@ -0,0 +1,17 @@
+name: corba
+kind: stratum
+build-depends:
+ - morph: strata/core.morph
+chunks:
+ - name: MPC
+ repo: upstream:MPC
+ morph: strata/corba/MPC.morph
+ ref: c2cddd1335036f1ca3610274a155d2222a8b5f7c
+ unpetrify-ref: ACE+TAO-6_3_4
+ - name: ACE_TAO
+ morph: strata/corba/ACE_TAO.morph
+ repo: upstream:ATCD
+ ref: b9ab94b74529a926864c154675559fd6a1d8998b
+ unpetrify-ref: ACE+TAO-6_3_4
+ build-depends:
+ - MPC
diff --git a/strata/corba/ACE_TAO.morph b/strata/corba/ACE_TAO.morph
new file mode 100644
index 00000000..bfbbb4cc
--- /dev/null
+++ b/strata/corba/ACE_TAO.morph
@@ -0,0 +1,32 @@
+name: ACE_TAO
+kind: chunk
+build-system: manual
+configure-commands:
+- |
+ export ACE_ROOT="$PWD/ACE"
+ export TAO_ROOT="$PWD/TAO"
+ export MPC_ROOT='/usr/src/MPC'
+ cd "$TAO_ROOT"
+ perl "$ACE_ROOT"/bin/mwc.pl TAO_ACE.mwc -type gnuace
+
+build-commands:
+- |
+ export ACE_ROOT="$PWD/ACE"
+ export TAO_ROOT="$PWD/TAO"
+ export MPC_ROOT='/usr/src/MPC'
+ echo '#include "ace/config-linux.h"' > "$ACE_ROOT"/ace/config.h
+ echo "include "$ACE_ROOT"/include/makeinclude/platform_linux.GNU" > "$ACE_ROOT"/include/makeinclude/platform_macros.GNU
+ export LD_LIBRARY_PATH="$ACE_ROOT"/lib:$LD_LIBRARY_PATH
+ cd "$TAO_ROOT"
+ make
+install-commands:
+- |
+ export ACE_ROOT="$PWD/ACE"
+ export TAO_ROOT="$PWD/TAO"
+ export MPC_ROOT='/usr/src/MPC'
+ cd "$TAO_ROOT"
+ make DESTDIR="$DESTDIR" INSTALL_PREFIX="$PREFIX" install
+system-integration:
+ ACE_TAO-misc:
+ 00-remove-build-dependencies:
+ - rm -rf /usr/src/MPC
diff --git a/strata/corba/MPC.morph b/strata/corba/MPC.morph
new file mode 100644
index 00000000..84b015ec
--- /dev/null
+++ b/strata/corba/MPC.morph
@@ -0,0 +1,6 @@
+name: MPC
+kind: chunk
+build-system: manual
+install-commands:
+- mkdir -p "$DESTDIR/usr/src/MPC"
+- cp -r * "$DESTDIR/usr/src/MPC"
diff --git a/strata/core.morph b/strata/core.morph
new file mode 100644
index 00000000..bcc3994f
--- /dev/null
+++ b/strata/core.morph
@@ -0,0 +1,471 @@
+name: core
+kind: stratum
+description: Core components of a Baserock base system that are build tools required
+ for the BSP and Foundation strata, but a step above build-essential
+build-depends:
+- morph: strata/build-essential.morph
+chunks:
+- name: gdbm
+ morph: strata/core/gdbm.morph
+ repo: upstream:gdbm-tarball
+ ref: e5faeaaf75ecfb705a9b643b3e4cb881ebb69f48
+ unpetrify-ref: gdbm-1.11
+- name: perl
+ morph: strata/core/perl.morph
+ repo: upstream:perl
+ ref: 70f63a4c7dba89e8e48b44de7978faae4319e693
+ unpetrify-ref: v5.22.0
+ build-depends:
+ - gdbm
+- name: ncurses
+ morph: strata/core/ncurses.morph
+ repo: upstream:ncurses
+ ref: f6d73a10a980bc78969c3af93665cbe7d06c3646
+ unpetrify-ref: ncurses-5.9-20150131
+- name: texinfo-tarball
+ morph: strata/core/texinfo-tarball.morph
+ repo: upstream:texinfo-tarball
+ ref: 6a55f074b1f67d02149c13931eb1df9f0e539b15
+ unpetrify-ref: texinfo-5.2
+ build-depends:
+ - ncurses
+ - perl
+- name: autoconf-tarball
+ morph: strata/core/autoconf-tarball.morph
+ repo: upstream:autoconf-tarball
+ ref: 55d1d2c339bc5f935f6d8d702e98b7bd5d968e9d
+ unpetrify-ref: autoconf-2.69
+ build-depends:
+ - perl
+- name: automake
+ morph: strata/core/automake.morph
+ repo: upstream:automake
+ ref: db43dd473361d90d8b00362cfef5bac8e722000d
+ unpetrify-ref: v1.15
+ build-depends:
+ - autoconf-tarball
+ - perl
+ - texinfo-tarball
+- name: help2man
+ repo: upstream:help2man
+ ref: 83bab7e2e8e24a380266a9a247c029c49b0de666
+ unpetrify-ref: baserock/v1.46.5
+ build-system: autotools
+ build-depends:
+ - autoconf-tarball
+ - automake
+ - perl
+ - texinfo-tarball
+# Note: autoconf's version number must be set in autoconf's chunk morph,
+# so if you update autoconf be sure to also update the version number
+# in strata/core/autoconf.morph
+- name: autoconf
+ morph: strata/core/autoconf.morph
+ repo: upstream:autoconf
+ ref: 218f9347c9c34919c2b8eef8d9a0513ac567a3c1
+ unpetrify-ref: baserock/v2.69-texinfo-fix
+ build-depends:
+ - autoconf-tarball
+ - automake
+ - help2man
+ - texinfo-tarball
+ - perl
+- name: libtool-tarball
+ morph: strata/core/libtool-tarball.morph
+ repo: upstream:libtool-tarball
+ ref: c026ca36e37d2643623a75d0d3e9e451023139f3
+ unpetrify-ref: libtool-2.4.6
+- name: file
+ repo: upstream:file
+ ref: 670c2bbcffe873a2b8589ed140c12e7923ef20c0
+ unpetrify-ref: file-5.22
+ build-system: autotools
+- name: libexpat
+ morph: strata/core/libexpat.morph
+ repo: upstream:libexpat
+ ref: 7cfc09db3e258129ab05811f2f9e351746ddab9f
+ unpetrify-ref: R_2_1_0
+ build-depends:
+ - autoconf
+ - automake
+ - file
+ - libtool-tarball
+ - perl
+- name: openssl-new
+ morph: strata/core/openssl-new.morph
+ repo: upstream:openssl-new
+ ref: 081314d07705aa58912845c213a48414d8f616a9
+ unpetrify-ref: OpenSSL_1_0_2k
+ build-depends:
+ - perl
+- name: bzip2
+ morph: strata/core/bzip2.morph
+ repo: upstream:bzip2
+ ref: 8deafa68e52b230018c0318dc7959ff9af3ad2a5
+ unpetrify-ref: baserock/morph
+- name: readline
+ morph: strata/core/readline.morph
+ repo: upstream:readline
+ ref: 518937ab89be812ccd45e9b8c1ce4ad721d35ef6
+ unpetrify-ref: baserock/genivi/baseline
+ build-depends:
+ - automake
+- name: libffi
+ morph: strata/core/libffi.morph
+ repo: upstream:libffi
+ ref: 77d4586cc47e8f4c02278afbc220145bba0d442b
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - autoconf
+ - automake
+- name: sqlite3
+ repo: upstream:sqlite3
+ ref: 24adc227bc29cd17e39df097fbca389c7724cd14
+ unpetrify-ref: sqlite-autoconf-3080801
+ build-system: autotools
+- name: python3
+ morph: strata/core/python3.morph
+ repo: upstream:cpython
+ ref: 609bc370055e03b3c74c4321a5990929c29a226d
+ unpetrify-ref: v3.5.2
+ build-depends:
+ - openssl-new
+ - bzip2
+ - libexpat
+ - libffi
+ - sqlite3
+ - ncurses
+ - readline
+- name: ca-certificates
+ morph: strata/core/ca-certificates.morph
+ repo: upstream:ca-certificates
+ ref: 642c21872876ce2f9ec323b1df44f1cd6c47e91c
+ unpetrify-ref: baserock/debian/20150426
+ build-depends:
+ - automake
+ - python3
+- name: curl
+ morph: strata/core/curl.morph
+ repo: upstream:curl
+ ref: 44b9b4d4f56d6f6de92c89636994c03984e9cd01
+ unpetrify-ref: curl-7_52_1
+ build-depends:
+ - autoconf
+ - automake
+ - file
+ - libtool-tarball
+ - openssl-new
+ - perl
+- name: gettext-tarball
+ morph: strata/core/gettext-tarball.morph
+ repo: upstream:gettext-tarball
+ ref: 500500ec9b7b0d0cef90b48c9b4ddc8866b5f19c
+ unpetrify-ref: gettext-0.19.8.1
+ build-depends:
+ - libexpat
+- name: git-minimal
+ morph: strata/core/git-minimal.morph
+ repo: upstream:git
+ ref: ed9067f705aa51819c7dfff7e4190dd267beaf5d
+ unpetrify-ref: v2.8.0-rc2
+ build-depends:
+ - autoconf
+ - python3
+ - curl
+ - gettext-tarball
+ - libexpat
+ - openssl-new
+ - perl
+- name: mini-utils
+ morph: strata/core/mini-utils.morph
+ repo: baserock:baserock/mini-utils
+ ref: 5293265b29bbf468ab9d7f3302b19dbc81d0f8b8
+ unpetrify-ref: master
+- name: gzip
+ morph: strata/core/gzip.morph
+ repo: upstream:gzip
+ ref: e360d3795658e14fb15705876393b9384843971e
+ unpetrify-ref: master
+ build-system: autotools
+ build-depends:
+ - autoconf
+ - gettext-tarball
+ - git-minimal
+ - mini-utils
+ submodules:
+ gnulib:
+ url: upstream:gnulib
+- name: flex
+ morph: strata/core/flex.morph
+ repo: upstream:flex
+ ref: de10f98e8a2dc2a021796811490d0f30c3cd90bf
+ unpetrify-ref: baserock/build-essential
+ build-depends:
+ - perl
+ - autoconf
+ - automake
+ - file
+ - gettext-tarball
+ - texinfo-tarball
+- name: bison
+ morph: strata/core/bison.morph
+ repo: upstream:bison
+ ref: c4e686a1abd817b4d4da5bdd5b3a5540566fd4a0
+ unpetrify-ref: v3.0.4
+ build-depends:
+ - autoconf
+ - automake
+ - flex
+ - gettext-tarball
+ - git-minimal
+ - openssl-new
+ - help2man
+ - mini-utils
+ - perl
+ - texinfo-tarball
+ submodules:
+ submodules/autoconf:
+ url: upstream:autoconf
+ gnulib:
+ url: upstream:gnulib
+- name: patch
+ morph: strata/core/patch.morph
+ repo: upstream:patch
+ ref: 3b698ab6a13fd3e5890689cd85cf41312c682f8c
+ unpetrify-ref: v2.7.5
+ build-depends:
+ - autoconf
+ - automake
+ - bison
+ - git-minimal
+ - openssl-new
+ - mini-utils
+ - perl
+ submodules:
+ gnulib:
+ url: upstream:gnulib
+- name: xz
+ repo: upstream:xz
+ ref: a0cd05ee71d330b79ead6eb9222e1b24e1559d3a
+ unpetrify-ref: v5.2.0
+ build-system: autotools
+ build-depends:
+ - autoconf
+ - automake
+ - file
+ - gettext-tarball
+ - libtool-tarball
+ - perl
+- name: libtool
+ repo: upstream:libtool
+ ref: f09d00cbcf924c378573163e244fffeb8d28005f
+ unpetrify-ref: v2.4.6
+ build-system: autotools
+ build-depends:
+ - autoconf
+ - automake
+ - file
+ - help2man
+ - git-minimal
+ - openssl-new
+ - patch
+ - texinfo-tarball
+ - xz
+ - perl
+ - mini-utils
+ submodules:
+ gnulib:
+ url: upstream:gnulib
+- name: pkg-config
+ morph: strata/core/pkg-config.morph
+ repo: upstream:pkg-config
+ ref: 74ceac54ef6f9247c00f08eecd8cca811a3c5934
+ unpetrify-ref: pkg-config-0.28
+ build-depends:
+ - autoconf
+ - automake
+ - libtool
+ - perl
+- name: attr
+ morph: strata/core/attr.morph
+ repo: upstream:attr
+ ref: 4b005410f865895d4dcd56e2c135278a7a315877
+ unpetrify-ref: v2.4.47
+ build-depends:
+ - file
+ - autoconf
+ - automake
+ - gettext-tarball
+ - libtool
+ - perl
+- name: acl
+ morph: strata/core/acl.morph
+ repo: upstream:acl
+ ref: f13e09bd54fd4a501c4952f002ed2752bdd9f93b
+ unpetrify-ref: v2.2.52
+ build-depends:
+ - autoconf
+ - automake
+ - gettext-tarball
+ - libtool
+ - attr
+ - perl
+- name: linux-pam
+ morph: strata/core/linux-pam.morph
+ repo: upstream:linux-pam
+ ref: b1521c97e73b10469f7b34c0571d51c647eca83c
+ unpetrify-ref: Linux-PAM-1.1.8
+ build-depends:
+ - autoconf
+ - automake
+ - gettext-tarball
+ - libtool
+ - pkg-config
+ - flex
+ - attr
+ - acl
+ - perl
+- name: libcap2
+ morph: strata/core/libcap2.morph
+ repo: upstream:libcap2
+ ref: 4f7cca1bc9c2a274edb39d351b65747010d3ba7b
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - autoconf
+ - automake
+ - gettext-tarball
+ - libtool
+ - pkg-config
+ - attr
+ - acl
+ - linux-pam
+ - perl
+- name: shadow
+ morph: strata/core/shadow.morph
+ repo: upstream:shadow
+ ref: bfaa59229d61adb7fa0c570f0d94fd324c6e05aa
+ unpetrify-ref: upstream/4.2.1
+ build-depends:
+ - autoconf
+ - automake
+ - gettext-tarball
+ - libtool
+ - bison
+ - attr
+ - acl
+ - linux-pam
+ - libcap2
+ - perl
+- name: util-linux
+ morph: strata/core/util-linux.morph
+ repo: upstream:util-linux
+ ref: 44338f7fe6a529cef1f206dccd95e7282625c483
+ unpetrify-ref: v2.28
+ build-depends:
+ - autoconf
+ - automake
+ - gettext-tarball
+ - git-minimal
+ - openssl-new
+ - libtool
+ - pkg-config
+ - linux-pam
+ - shadow
+ - perl
+- name: e2fsprogs
+ morph: strata/core/e2fsprogs.morph
+ repo: upstream:e2fsprogs
+ ref: 6a3741ad293031447b95b88431eafa77401a8987
+ unpetrify-ref: v1.42.12
+ build-depends:
+ - pkg-config
+ - util-linux
+ - file
+- name: libxml2
+ repo: upstream:libxml2
+ ref: 6657afe83a38278f124ace71dc85f60420beb2d5
+ unpetrify-ref: v2.9.3
+ build-system: autotools
+ build-depends:
+ - autoconf
+ - automake
+ - file
+ - libtool
+ - libexpat
+ - pkg-config
+ - python3
+ - xz
+ - perl
+- name: libxslt
+ repo: upstream:libxslt
+ ref: 73e08bf7c36a9145d38f51d37e66529b873c011a
+ unpetrify-ref: master
+ build-system: autotools
+ build-depends:
+ - autoconf
+ - libtool
+ - automake
+ - file
+ - libxml2
+ - xz
+ - perl
+- name: XML-Parser
+ repo: upstream:XML-Parser
+ ref: e1a3ec157140a699e3020836475a0df622f70f1b
+ unpetrify-ref: baserock/morph
+ build-system: cpan
+ build-depends:
+ - libexpat
+ - perl
+- name: intltool
+ repo: upstream:intltool
+ ref: 12f04c88be9ff8a578d8fd6990ee2448c66dc5f4
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - libexpat
+ - XML-Parser
+ - autoconf
+ - automake
+ - perl
+- name: bash
+ morph: strata/core/bash.morph
+ repo: upstream:bash
+ ref: 3590145af6f1c9fa321dff231f69ae696e7e740b
+ unpetrify-ref: baserock/bash-4.3-patch-27
+- name: cmake
+ morph: strata/core/cmake.morph
+ repo: upstream:cmake
+ ref: 0d5a2252ef8a586f4fc70a66aabd17fb3fd52110
+ unpetrify-ref: v3.8.2
+- name: cython
+ repo: upstream:cython
+ ref: 4dd8e762fa51d01775506fbbc102c45dbcea065d
+ unpetrify-ref: '0.22'
+ build-system: python3-distutils
+ build-depends:
+ - python3
+- name: gperf
+ morph: strata/core/gperf.morph
+ repo: upstream:gperf
+ ref: 5094e4a539adf845111013f82c2c4fcaec637983
+ unpetrify-ref: baserock/morph
+- name: bc
+ repo: upstream:bc-tarball
+ ref: 0956d119432ff6a2e85bae1fa336df799cad70b0
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - perl
+ - flex
+ - texinfo-tarball
+- name: libseccomp
+ repo: upstream:libseccomp
+ ref: 7932b4fa24c1add0d7a315de8387d216334fbcf7
+ unpetrify-ref: v2.2.3
+ build-system: autotools
+ build-depends:
+ - autoconf
+ - automake
+ - libtool
+ - perl
diff --git a/strata/core/acl.morph b/strata/core/acl.morph
new file mode 100644
index 00000000..23f08c1f
--- /dev/null
+++ b/strata/core/acl.morph
@@ -0,0 +1,6 @@
+name: acl
+kind: chunk
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install-lib install-dev
diff --git a/strata/core/attr.morph b/strata/core/attr.morph
new file mode 100644
index 00000000..c7b46d31
--- /dev/null
+++ b/strata/core/attr.morph
@@ -0,0 +1,19 @@
+name: attr
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- make configure
+configure-commands:
+- |
+ ./configure --prefix="$PREFIX" \
+ --exec-prefix="$PREFIX" \
+ --sbindir="$PREFIX"/bin \
+ --bindir="$PREFIX"/bin \
+ --libdir="$PREFIX"/lib \
+ --libexecdir="$PREFIX"/lib \
+ --enable-lib64=yes \
+ --includedir="$PREFIX"/include \
+ --mandir="$PREFIX"/share/man \
+ --datadir="$PREFIX"/share
+install-commands:
+- make DESTDIR="$DESTDIR" install-lib install-dev
diff --git a/strata/core/autoconf-tarball.morph b/strata/core/autoconf-tarball.morph
new file mode 100644
index 00000000..fbdc5768
--- /dev/null
+++ b/strata/core/autoconf-tarball.morph
@@ -0,0 +1,5 @@
+name: autoconf-tarball
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --prefix="$PREFIX"
diff --git a/strata/core/autoconf.morph b/strata/core/autoconf.morph
new file mode 100644
index 00000000..63b95ba8
--- /dev/null
+++ b/strata/core/autoconf.morph
@@ -0,0 +1,5 @@
+name: autoconf
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- echo "2.69" > .tarball-version
diff --git a/strata/core/automake.morph b/strata/core/automake.morph
new file mode 100644
index 00000000..282535d6
--- /dev/null
+++ b/strata/core/automake.morph
@@ -0,0 +1,8 @@
+name: automake
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./bootstrap.sh
+- ./configure --prefix="$PREFIX"
+build-commands:
+- unset DESTDIR; make
diff --git a/strata/core/bash.morph b/strata/core/bash.morph
new file mode 100644
index 00000000..59c9e8b4
--- /dev/null
+++ b/strata/core/bash.morph
@@ -0,0 +1,36 @@
+name: bash
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ export CFLAGS="${CFLAGS} -DSYS_BASHRC='\"/etc/bash.bashrc\"'";
+ ./configure --prefix="$PREFIX" \
+ --without-bash-malloc \
+ --with-installed-readline \
+ --enable-readline
+post-install-commands:
+- |
+ cat <<'EOF' >> bash.bashrc
+ #
+ # /etc/bash.bashrc
+ #
+
+ # If not running interactively, don't do anything
+ [[ $- != *i* ]] && return
+
+ # Configure prompt for different terminals
+ case ${TERM} in
+ xterm*|rxvt*|Eterm|aterm|kterm|gnome*)
+ PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
+
+ ;;
+ screen)
+ PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033_%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
+ ;;
+ esac
+
+ # Enable bash completion if present
+ [ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
+ EOF
+- mkdir -p "$DESTDIR"/etc
+- install -m 644 bash.bashrc "$DESTDIR"/etc/bash.bashrc
diff --git a/strata/core/bison.morph b/strata/core/bison.morph
new file mode 100644
index 00000000..7b880cb6
--- /dev/null
+++ b/strata/core/bison.morph
@@ -0,0 +1,6 @@
+name: bison
+kind: chunk
+build-system: autotools
+configure-commands:
+- sh bootstrap --skip-po --no-git --gnulib-srcdir=gnulib
+- ./configure --prefix="$PREFIX"
diff --git a/strata/core/bzip2.morph b/strata/core/bzip2.morph
new file mode 100644
index 00000000..f4bdb794
--- /dev/null
+++ b/strata/core/bzip2.morph
@@ -0,0 +1,10 @@
+name: bzip2
+kind: chunk
+configure-commands:
+- sed -i -rf bzip2.morph-makefix.sed Makefile
+build-commands:
+- make -f Makefile-libbz2_so
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" PREFIX="$PREFIX" install
+- install libbz2.so* "$DESTDIR$PREFIX/lib"
diff --git a/strata/core/ca-certificates.morph b/strata/core/ca-certificates.morph
new file mode 100644
index 00000000..0497b283
--- /dev/null
+++ b/strata/core/ca-certificates.morph
@@ -0,0 +1,26 @@
+name: ca-certificates
+kind: chunk
+build-system: manual
+build-commands:
+- make
+install-commands:
+#
+# ca-certificates makefile does not properly take responsibility
+# for creating the paths it installs to
+#
+- mkdir -p "$DESTDIR"/usr/share/ca-certificates
+- mkdir -p "$DESTDIR"/usr/sbin
+- make DESTDIR="$DESTDIR" install
+- mkdir "$DESTDIR"/etc
+#
+# We create the config with all certificates provided
+# by the debian package enabled. Some systems may want
+# to override the ca-certificates.conf file.
+#
+- |
+ cd "$DESTDIR"/usr/share/ca-certificates
+ find * -type f > "$DESTDIR"/etc/ca-certificates.conf
+system-integration:
+ ca-certificates-misc:
+ 00-update-ca-certs:
+ - update-ca-certificates
diff --git a/strata/core/cmake.morph b/strata/core/cmake.morph
new file mode 100644
index 00000000..1d310ef4
--- /dev/null
+++ b/strata/core/cmake.morph
@@ -0,0 +1,8 @@
+name: cmake
+kind: chunk
+configure-commands:
+- ./bootstrap --prefix="$PREFIX" --docdir=/share/doc/cmake --mandir=/share/man
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/strata/core/curl.morph b/strata/core/curl.morph
new file mode 100644
index 00000000..d445ee00
--- /dev/null
+++ b/strata/core/curl.morph
@@ -0,0 +1,15 @@
+name: curl
+kind: chunk
+configure-commands:
+#
+# Curl must be configured --with-ca-bundle in order to find the
+# correct certificate bundle at runtime, which is later generated
+# by update-ca-certificates. Other applications such as git, rely
+# on curl knowing the default location of the certs.
+#
+- ./buildconf
+- ./configure --disable-manual --prefix="$PREFIX" --with-ca-bundle=/etc/ssl/certs/ca-certificates.crt
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/strata/core/e2fsprogs.morph b/strata/core/e2fsprogs.morph
new file mode 100644
index 00000000..6f32ad38
--- /dev/null
+++ b/strata/core/e2fsprogs.morph
@@ -0,0 +1,27 @@
+name: e2fsprogs
+kind: chunk
+build-system: autotools
+configure-commands:
+# Configure with the usual paths for binaries and config
+# but also disable whatever we can that is already provided by util-linux
+# Disabling e2fsprofs' libblkid does not work, but we don't have to
+# install it.
+- |
+ ./configure --prefix="$PREFIX" --sysconfdir=/etc \
+ --disable-libuuid --disable-uuidd --disable-libblkid
+build-commands:
+# Without this, the static archive libcom_err is generated without
+# position independant code; later when samba tries to create a shared
+# library linking to this archive, we get errors.
+- make CFLAGS="-g -O2 -DHAVE_CONFIG_H -fPIC"
+install-commands:
+# e2fsprogs also includes tools that are provided by util-linux, so we
+# need to selectively exclude them. Removing them directly from DESTDIR
+# causes problems, so we need to remove them beforehand.
+- |
+ td="$(mktemp -d)"
+ make DESTDIR="$td" install
+ make DESTDIR="$td" install-libs
+ find "$td" \( -name blkid -o -name findfs -o \) -delete
+ find "$td" \( -name blkid.8 -o -name findfs.8 \) -delete
+ mv "$td"/* "$DESTDIR"
diff --git a/strata/core/flex.morph b/strata/core/flex.morph
new file mode 100644
index 00000000..615bf79e
--- /dev/null
+++ b/strata/core/flex.morph
@@ -0,0 +1,14 @@
+name: flex
+kind: chunk
+pre-configure-commands:
+- autoreconf -ivf
+configure-commands:
+- ./configure --prefix="$PREFIX"
+build-commands:
+- make dist_doc_DATA=
+install-commands:
+- make dist_doc_DATA= DESTDIR="$DESTDIR" install
+- ln -s libfl.a "$DESTDIR$PREFIX/lib/libl.a"
+- echo "#!$PREFIX/bin/sh" >"$DESTDIR$PREFIX/bin/lex"
+- echo 'exec '"$PREFIX"'/bin/flex -l "$@"' >>"$DESTDIR$PREFIX/bin/lex"
+- chmod 755 "$DESTDIR$PREFIX/bin/lex"
diff --git a/strata/core/gdbm.morph b/strata/core/gdbm.morph
new file mode 100644
index 00000000..6bec33e0
--- /dev/null
+++ b/strata/core/gdbm.morph
@@ -0,0 +1,8 @@
+name: gdbm
+kind: chunk
+configure-commands:
+- ./configure --prefix="$PREFIX" --enable-libgdbm-compat --disable-nls
+build-commands:
+- make MANS= INFO_DEPS=
+install-commands:
+- make MANS= INFO_DEPS= DESTDIR="$DESTDIR" install
diff --git a/strata/core/gettext-tarball.morph b/strata/core/gettext-tarball.morph
new file mode 100644
index 00000000..4983b484
--- /dev/null
+++ b/strata/core/gettext-tarball.morph
@@ -0,0 +1,5 @@
+name: gettext-tarball
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --prefix="$PREFIX"
diff --git a/strata/core/git-minimal.morph b/strata/core/git-minimal.morph
new file mode 100644
index 00000000..8b562ef6
--- /dev/null
+++ b/strata/core/git-minimal.morph
@@ -0,0 +1,7 @@
+name: git-minimal
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- make configure
+build-commands:
+- make all
diff --git a/strata/core/gperf.morph b/strata/core/gperf.morph
new file mode 100644
index 00000000..e4f598c5
--- /dev/null
+++ b/strata/core/gperf.morph
@@ -0,0 +1,3 @@
+name: gperf
+kind: chunk
+build-system: autotools
diff --git a/strata/core/gzip.morph b/strata/core/gzip.morph
new file mode 100644
index 00000000..2a9ebbe8
--- /dev/null
+++ b/strata/core/gzip.morph
@@ -0,0 +1,6 @@
+name: gzip
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- sed -i -e '/^buildreq="/,/^"/{/rsync/d}' bootstrap.conf
+- ./bootstrap --skip-po --no-git --gnulib-srcdir=gnulib
diff --git a/strata/core/libcap2.morph b/strata/core/libcap2.morph
new file mode 100644
index 00000000..3e4f205e
--- /dev/null
+++ b/strata/core/libcap2.morph
@@ -0,0 +1,6 @@
+name: libcap2
+kind: chunk
+build-commands:
+- make prefix="$PREFIX"
+install-commands:
+- make prefix="$PREFIX" DESTDIR="$DESTDIR" RAISE_SETFCAP=no install lib=lib
diff --git a/strata/core/libexpat.morph b/strata/core/libexpat.morph
new file mode 100644
index 00000000..05285c0d
--- /dev/null
+++ b/strata/core/libexpat.morph
@@ -0,0 +1,6 @@
+name: libexpat
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- ./buildconf.sh
+- automake --add-missing --copy || true
diff --git a/strata/core/libffi.morph b/strata/core/libffi.morph
new file mode 100644
index 00000000..174477af
--- /dev/null
+++ b/strata/core/libffi.morph
@@ -0,0 +1,8 @@
+name: libffi
+kind: chunk
+build-system: autotools
+install-commands:
+- make DESTDIR="$DESTDIR"/ install
+- mkdir -p "$DESTDIR"/usr/include
+- cp "$TARGET"/include/ffi.h "$DESTDIR"/usr/include/
+- cp "$TARGET"/include/ffitarget.h "$DESTDIR"/usr/include/
diff --git a/strata/core/libtool-tarball.morph b/strata/core/libtool-tarball.morph
new file mode 100644
index 00000000..65a3edbc
--- /dev/null
+++ b/strata/core/libtool-tarball.morph
@@ -0,0 +1,5 @@
+name: libtool-tarball
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --prefix="$PREFIX"
diff --git a/strata/core/linux-pam.morph b/strata/core/linux-pam.morph
new file mode 100644
index 00000000..e65caa63
--- /dev/null
+++ b/strata/core/linux-pam.morph
@@ -0,0 +1,9 @@
+name: linux-pam
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- autoreconf -ivf
+configure-commands:
+# libdir has to be specified or it'll go into lib64. It has to be /usr/lib because
+# systemd installs its pam library into /usr/lib/security.
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc --libdir="$PREFIX/lib"
diff --git a/strata/core/mini-utils.morph b/strata/core/mini-utils.morph
new file mode 100644
index 00000000..a3d1109e
--- /dev/null
+++ b/strata/core/mini-utils.morph
@@ -0,0 +1,7 @@
+name: mini-utils
+kind: chunk
+build-system: manual
+build-commands:
+- make
+install-commands:
+- make PREFIX="$PREFIX" DESTDIR="$DESTDIR" install
diff --git a/strata/core/ncurses.morph b/strata/core/ncurses.morph
new file mode 100644
index 00000000..42acb481
--- /dev/null
+++ b/strata/core/ncurses.morph
@@ -0,0 +1,45 @@
+name: ncurses
+kind: chunk
+configure-commands:
+- LDCONFIG=true ./configure --with-shared --without-debug --enable-widec
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
+post-install-commands:
+- |
+ # lfs recommends some alterations for software that looks for
+ # libcurses instead of libncurses
+ # it's more convenient to have this in a separate file than the
+ # morph as less strings have to be escaped and comments are possible
+
+ # some software expects to find libcurses in /lib
+ mkdir -p "$DESTDIR/lib"
+ mv "$DESTDIR"/"$PREFIX"/lib/libncursesw.so.5* "$DESTDIR"/lib
+ ln -sf ../../lib/libncursesw.so.5 "$DESTDIR"/"$PREFIX"/lib/libncursesw.so
+
+ # some linker tricks for libraries that look for non-wide character
+ # versions of ncurses
+ for lib in ncurses form panel menu; do
+ # remove non-wide shared object
+ rm -f "$DESTDIR/${PREFIX}/lib/lib${lib}.so"
+ # use a linker script to find the wide character variant
+ echo "INPUT(-l${lib}w)" >"$DESTDIR/${PREFIX}/lib/lib${lib}.so"
+ # symlink the non-shared library
+ ln -sf "lib${lib}w.a" "$DESTDIR/${PREFIX}/lib/lib${lib}.a"
+ done
+ ln -sf libncurses++w.a "$DESTDIR/${PREFIX}/lib/libncurses++.a"
+
+ # redirect software that looks for libcurses
+ rm -f "$DESTDIR/${PREFIX}/lib/libcursesw.so"
+ echo "INPUT(-lncursesw)" >"$DESTDIR/${PREFIX}/lib/libcursesw.so"
+ ln -sf libncurses.so "$DESTDIR/${PREFIX}/lib/libcurses.so"
+ ln -sf libncursesw.a "$DESTDIR/${PREFIX}/lib/libcursesw.a"
+ ln -sf libncurses.a "$DESTDIR/${PREFIX}/lib/libcurses.a"
+
+ # install documentation
+ mkdir -p "$DESTDIR/${PREFIX}/share/doc/ncurses"
+ cp -R doc/* "$DESTDIR/${PREFIX}/share/doc/ncurses"
+
+ # remove 'clear' and 'reset' executables, busybox provides them
+ rm -f "$DESTDIR/${PREFIX}/bin/clear" "$DESTDIR/${PREFIX}/bin/reset"
diff --git a/strata/core/openssl-new.morph b/strata/core/openssl-new.morph
new file mode 100644
index 00000000..2ed14ff2
--- /dev/null
+++ b/strata/core/openssl-new.morph
@@ -0,0 +1,15 @@
+name: openssl-new
+kind: chunk
+max-jobs: 1
+configure-commands:
+- sed -i -e 's,^LIBNAMES=\\(.*\\) padlock \\(.*\\),LIBNAMES=\\1 \\2,g' engines/Makefile
+- |
+ if [ "$(uname -m)" = "ppc64" ]; then
+ sh ./Configure linux-ppc64 --openssldir=/etc/ssl --prefix="${PREFIX-/usr}" --libdir=lib shared
+ else
+ ./config --openssldir=/etc/ssl --prefix="${PREFIX-/usr}" --libdir=lib shared
+ fi
+build-commands:
+- make
+install-commands:
+- make INSTALL_PREFIX="$DESTDIR" install_sw
diff --git a/strata/core/patch.morph b/strata/core/patch.morph
new file mode 100644
index 00000000..b7f146ef
--- /dev/null
+++ b/strata/core/patch.morph
@@ -0,0 +1,5 @@
+name: patch
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- ./bootstrap --skip-po
diff --git a/strata/core/perl.morph b/strata/core/perl.morph
new file mode 100644
index 00000000..ce086aa7
--- /dev/null
+++ b/strata/core/perl.morph
@@ -0,0 +1,16 @@
+name: perl
+kind: chunk
+max-jobs: 1
+configure-commands:
+- sh Configure -des -Dprefix="$PREFIX" -Darchlib="$PREFIX/lib/perl" -Dprivlib="$PREFIX/share/perl"
+ -Dbin="$PREFIX/bin" -Dscriptdir="$PREFIX/bin" -Dman1dir="$PREFIX/share/man/man1"
+ -Dman3dir="$PREFIX/share/man/man3" -Dsiteprefix="$PREFIX" -Dsitearch="$PREFIX/lib/perl"
+ -Dsitelib="$PREFIX/share/perl" -Dsitebin="$PREFIX/bin" -Dsitescript="$PREFIX/bin"
+ -Dsiteman1dir="$PREFIX/share/man/man1" -Dsiteman3dir="$PREFIX/share/man/man3" -Dvendorprefix="$PREFIX"
+ -Dvendorarch="$PREFIX/lib/perl" -Dvendorlib="$PREFIX/share/perl" -Dvendorbin="$PREFIX/bin"
+ -Dvendorscript="$PREFIX/bin" -Dvendorman1dir="$PREFIX/share/man/man1" -Dvendorman3dir="$PREFIX/share/man/man3"
+ -Dpager="$PREFIX/bin/less -isR" -Duseshrplib
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/strata/core/pkg-config.morph b/strata/core/pkg-config.morph
new file mode 100644
index 00000000..ed35a2ac
--- /dev/null
+++ b/strata/core/pkg-config.morph
@@ -0,0 +1,5 @@
+name: pkg-config
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --with-internal-glib
diff --git a/strata/core/python3.morph b/strata/core/python3.morph
new file mode 100644
index 00000000..54d2e9e7
--- /dev/null
+++ b/strata/core/python3.morph
@@ -0,0 +1,15 @@
+name: python3
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ ./configure --prefix="$PREFIX" \
+ --sysconfdir=/etc \
+ --enable-shared \
+ --with-system-expat \
+ --with-system-ffi
+post-install-commands:
+- test -x "$DESTDIR"/"$PREFIX"/bin/python || ln -s python3.5 "$DESTDIR"/"$PREFIX"/bin/python
+- test -x "$DESTDIR"/"$PREFIX"/bin/python3 || ln -s python3.5 "$DESTDIR"/"$PREFIX"/bin/python3
+- test -x "$DESTDIR"/"$PREFIX"/bin/python-config || ln -s python3.5-config "$DESTDIR"/"$PREFIX"/bin/python-config
+- test -x "$DESTDIR"/"$PREFIX"/bin/python3-config || ln -s python3.5-config "$DESTDIR"/"$PREFIX"/bin/python3-config
diff --git a/strata/core/readline.morph b/strata/core/readline.morph
new file mode 100644
index 00000000..08c9586c
--- /dev/null
+++ b/strata/core/readline.morph
@@ -0,0 +1,8 @@
+name: readline
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- cp /usr/share/automake*/config.guess support
+- cp /usr/share/automake*/config.sub support
+build-commands:
+- make SHLIB_LIBS=-lncurses
diff --git a/strata/core/shadow.morph b/strata/core/shadow.morph
new file mode 100644
index 00000000..5e3244ae
--- /dev/null
+++ b/strata/core/shadow.morph
@@ -0,0 +1,53 @@
+name: shadow
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- autoreconf -vfi
+configure-commands:
+- |
+ ./configure --with-selinux=no \
+ --sysconfdir=/etc \
+ --with-libpam=yes \
+ --prefix="$PREFIX"
+post-install-commands:
+# Disable things handled by pam instead
+- |
+ for OPTION in FAIL_DELAY \
+ FAILLOG_ENAB \
+ LASTLOG_ENAB \
+ MAIL_CHECK_ENAB \
+ OBSCURE_CHECKS_ENAB \
+ PORTTIME_CHECKS_ENAB \
+ QUOTAS_ENAB \
+ CONSOLE MOTD_FILE \
+ FTMP_FILE \
+ NOLOGINS_FILE \
+ ENV_HZ \
+ PASS_MIN_LEN \
+ SU_WHEEL_ONLY \
+ CRACKLIB_DICTPATH \
+ PASS_CHANGE_TRIES \
+ PASS_ALWAYS_WARN \
+ CHFN_AUTH \
+ ENVIRON_FILE
+ do
+ sed -i -e "s/^${OPTION}.*/# & #This option is handled by PAM instead./" \
+ "$DESTDIR/etc/login.defs"
+ done
+# ENCRYPT_METHOD is handled specially with PAM, it will use the default as
+# provided in login.defs, but it may be overridden in the pam.d config.
+# We do not currently override this though, and it's better to guard oursleves
+# against accidentally reducing password security by forgetting to include the
+# algorithm as an argument to the PAM module, so ENCRYPT_METHOD is configured
+# here, rather than in PAM.
+- |
+ if grep -q '[\s#]ENCRYPT_METHOD' "$DESTDIR/etc/login.defs"; then
+ sed -i -e '/^[\s#]*ENCRYPT_METHOD /s/.*/ENCRYPT_METHOD SHA512/g' "$DESTDIR/etc/login.defs"
+ else
+ echo 'ENCRYPT_METHOD SHA512' >>"$DESTDIR/etc/login.defs"
+ fi
+
+# The default pam.d config files have pam_selinux.so as a requirement, even
+# when shadow is configured '--with-selinux=no'. We change this default config
+# to make this requirement optional.
+- sed -i -e 's/\(.*\)required\(.*pam_selinux.so.*\)/\1optional\2/' "$DESTDIR"/etc/pam.d/*
diff --git a/strata/core/texinfo-tarball.morph b/strata/core/texinfo-tarball.morph
new file mode 100644
index 00000000..5f784ba2
--- /dev/null
+++ b/strata/core/texinfo-tarball.morph
@@ -0,0 +1,9 @@
+name: texinfo-tarball
+kind: chunk
+configure-commands:
+- ./configure --prefix="$PREFIX"
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- make DESTDIR="$DESTDIR" TEXMF="$PREFIX/share/texmf" install-tex
diff --git a/strata/core/util-linux.morph b/strata/core/util-linux.morph
new file mode 100644
index 00000000..dca8ad4c
--- /dev/null
+++ b/strata/core/util-linux.morph
@@ -0,0 +1,10 @@
+name: util-linux
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- ./autogen.sh
+configure-commands:
+- |
+ ./configure --prefix="$PREFIX" \
+ --enable-libmount-force-mountinfo \
+ --disable-use-tty-group
diff --git a/strata/coreutils-common.morph b/strata/coreutils-common.morph
new file mode 100644
index 00000000..c22fcfac
--- /dev/null
+++ b/strata/coreutils-common.morph
@@ -0,0 +1,67 @@
+name: coreutils-common
+kind: stratum
+description: |
+ We need to split this so we can build stuff using coreutils but we can not
+ having it in the final systems (for example in genivi ones that do not
+ accept GPLv3 code)
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: coreutils
+ morph: strata/coreutils-common/coreutils.morph
+ repo: upstream:coreutils
+ ref: 68f73f23866d6137e9c8d88d86073b33588d7b56
+ unpetrify-ref: v8.25
+ submodules:
+ gnulib:
+ url: upstream:gnulib
+- name: sed
+ morph: strata/coreutils-common/sed.morph
+ repo: upstream:sed
+ ref: ed4b1d7c04f92b330b940d4f0d02cd51d2473ce9
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - coreutils
+ submodules:
+ gnulib:
+ url: upstream:gnulib
+- name: diff
+ morph: strata/coreutils-common/diff.morph
+ repo: upstream:diffutils
+ ref: bd86eb1a1e87ab85a7c8dbb658fa829ce69c252e
+ unpetrify-ref: baserock/v3.3
+ build-depends:
+ - coreutils
+ submodules:
+ gnulib:
+ url: upstream:gnulib
+- name: tar
+ morph: strata/coreutils-common/tar.morph
+ repo: upstream:tar
+ ref: 20b55f0679d314568ec21ae6db1ea635494e292b
+ unpetrify-ref: baserock/release_1_29
+ build-depends:
+ - coreutils
+ submodules:
+ paxutils:
+ url: upstream:paxutils
+ gnulib:
+ url: upstream:gnulib
+- name: findutils
+ repo: upstream:findutils
+ ref: 992a6b62ab8061531dc0ad40325b8e4c222fce66
+ unpetrify-ref: v4.6.0
+ build-system: autotools
+ submodules:
+ gnulib:
+ url: upstream:gnulib
+- name: less
+ repo: upstream:less
+ ref: 09a405d8f652b56944c93ebf5c673cdfe5319b04
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: jq
+ repo: upstream:jq
+ ref: a5b5cbefb83935ce95ec62b9cadc8ec73026d33a
+ unpetrify-ref: jq-1.5
+ build-system: autotools
diff --git a/strata/coreutils-common/coreutils.morph b/strata/coreutils-common/coreutils.morph
new file mode 100644
index 00000000..ad6b2c32
--- /dev/null
+++ b/strata/coreutils-common/coreutils.morph
@@ -0,0 +1,12 @@
+name: coreutils
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- sed -i -e '/^buildreq="/,/^"/{/rsync/d}' bootstrap.conf
+- bash bootstrap --skip-po --no-git --gnulib-srcdir=gnulib
+configure-commands:
+- FORCE_UNSAFE_CONFIGURE=1 ./configure --prefix="$PREFIX" --disable-nls
+build-commands:
+- make WERROR_CFLAGS=
+install-commands:
+- make INSTALL_PROGRAM=install DESTDIR="$DESTDIR" install
diff --git a/strata/coreutils-common/diff.morph b/strata/coreutils-common/diff.morph
new file mode 100644
index 00000000..c5eb809d
--- /dev/null
+++ b/strata/coreutils-common/diff.morph
@@ -0,0 +1,8 @@
+name: diff
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- sed -i -e '/^buildreq="/,/^"/{/rsync/d}' bootstrap.conf
+- ./bootstrap --skip-po --no-git --gnulib-srcdir=gnulib
+configure-commands:
+- ./configure --prefix="$PREFIX" --disable-gcc-warnings
diff --git a/strata/coreutils-common/sed.morph b/strata/coreutils-common/sed.morph
new file mode 100644
index 00000000..87ace803
--- /dev/null
+++ b/strata/coreutils-common/sed.morph
@@ -0,0 +1,8 @@
+name: sed
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- sed -i -e '/^buildreq="/,/^"/{/rsync/d}' bootstrap.conf
+- ./bootstrap --skip-po --no-git --gnulib-srcdir=gnulib
+configure-commands:
+- ./configure --prefix="$PREFIX" --disable-gcc-warnings
diff --git a/strata/coreutils-common/tar.morph b/strata/coreutils-common/tar.morph
new file mode 100644
index 00000000..11ca9585
--- /dev/null
+++ b/strata/coreutils-common/tar.morph
@@ -0,0 +1,13 @@
+name: tar
+kind: chunk
+build-system: autotools
+configure-commands:
+- bash bootstrap --skip-po --gnulib-srcdir="$(pwd)/gnulib"
+
+# Configure flag notes:
+# 1. Needed to run configure as root
+# 2. Disable some warning that cause the build to fail
+- |
+ `# [1]` env FORCE_UNSAFE_CONFIGURE=1 \
+ ./configure --prefix="$PREFIX" \
+ `# [2]` --disable-gcc-warnings
diff --git a/strata/cpp-common-libs.morph b/strata/cpp-common-libs.morph
new file mode 100644
index 00000000..470f0155
--- /dev/null
+++ b/strata/cpp-common-libs.morph
@@ -0,0 +1,11 @@
+name: cpp-common-libs
+kind: stratum
+description: C++ common libraries
+build-depends:
+- morph: strata/python2-core.morph
+chunks:
+- name: boost
+ morph: strata/cpp-common-libs/boost.morph
+ repo: upstream:boost-tarball
+ ref: ed232fdd34968697a68783b3195b1da4226915b5
+ unpetrify-ref: boost_1_57_0
diff --git a/strata/cpp-common-libs/boost.morph b/strata/cpp-common-libs/boost.morph
new file mode 100644
index 00000000..6aaee8ad
--- /dev/null
+++ b/strata/cpp-common-libs/boost.morph
@@ -0,0 +1,9 @@
+name: boost
+kind: chunk
+build-system: manual
+configure-commands:
+- ./bootstrap.sh
+build-commands:
+- ./b2 $MAKEFLAGS
+install-commands:
+- ./b2 install --prefix="$DESTDIR$PREFIX"
diff --git a/strata/cross-bootstrap.morph b/strata/cross-bootstrap.morph
new file mode 100644
index 00000000..9248101a
--- /dev/null
+++ b/strata/cross-bootstrap.morph
@@ -0,0 +1,29 @@
+name: cross-bootstrap
+kind: stratum
+description: The minimal development tools to build a baserock devel system
+build-depends:
+- morph: strata/core.morph
+- morph: strata/python2-core.morph
+chunks:
+- name: groff
+ morph: strata/cross-bootstrap/groff.morph
+ repo: upstream:groff-git
+ ref: 16305a24e67966ace06d55e2a0b98cc0e3127a93
+ unpetrify-ref: 1.22.3
+- name: openssh
+ morph: strata/cross-bootstrap/openssh.morph
+ repo: upstream:openssh-git
+ ref: 782fe9e725243eeb5ad6ab9a1783b5d6bedfe0d7
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - groff
+- name: linux-user-chroot
+ repo: upstream:linux-user-chroot
+ ref: d25cc110f69e6e71a95b4ac532dcfc5423d4a16b
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: rsync
+ morph: strata/cross-bootstrap/rsync.morph
+ repo: upstream:rsync
+ ref: 7cb0de6326c915a72253fd103dae93308031ec3f
+ unpetrify-ref: v3.1.1
diff --git a/strata/cross-bootstrap/groff.morph b/strata/cross-bootstrap/groff.morph
new file mode 100644
index 00000000..8380a9cc
--- /dev/null
+++ b/strata/cross-bootstrap/groff.morph
@@ -0,0 +1,13 @@
+name: groff
+kind: chunk
+max-jobs: 1
+configure-commands:
+- PAGE=A4 ./configure --prefix="$PREFIX"
+build-commands:
+# hack to avoid a netpbm dependency
+- touch doc/gnu.eps
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- ln -s eqn "$DESTDIR$PREFIX/bin/geqn"
+- ln -s tbl "$DESTDIR$PREFIX/bin/gtbl"
diff --git a/strata/cross-bootstrap/openssh.morph b/strata/cross-bootstrap/openssh.morph
new file mode 100644
index 00000000..6c759cb0
--- /dev/null
+++ b/strata/cross-bootstrap/openssh.morph
@@ -0,0 +1,28 @@
+name: openssh
+kind: chunk
+configure-commands:
+- autoreconf -if
+- |
+ OPENSSL_SEEDS_ITSELF=yes ./configure \
+ --prefix="$PREFIX" --sysconfdir=/etc/ssh \
+ --datadir="$PREFIX/share/sshd" \
+ --libexecdir="$PREFIX/lib/openssh" \
+ --with-privsep-path=/var/lib/sshd
+build-commands:
+- make
+- |
+ sed -e "s|@prefix@|$PREFIX|g" \
+ -e 's|@STARTUP_SCRIPT_SHELL@|/bin/sh|g' \
+ -e 's|@sysconfdir@|/etc/ssh|g' \
+ -e 's|@COMMENT_OUT_ECC@||g' \
+ sshd-keygen.in >sshd-keygen
+- sed -e "s|@prefix@|$PREFIX|g" opensshd.service.in >opensshd.service
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- mkdir -p "$DESTDIR/$PREFIX/sbin"
+- chmod go= "$DESTDIR"/var/lib/sshd
+- install -m 744 sshd-keygen "$DESTDIR/$PREFIX/sbin/sshd-keygen"
+- install -m 755 contrib/ssh-copy-id "$DESTDIR/$PREFIX/bin/ssh-copy-id"
+- mkdir -p "$DESTDIR/lib/systemd/system/multi-user.target.wants"
+- install -m 644 opensshd.service "$DESTDIR/lib/systemd/system/opensshd.service"
+- ln -s ../opensshd.service "$DESTDIR/lib/systemd/system/multi-user.target.wants/opensshd.service"
diff --git a/strata/cross-bootstrap/rsync.morph b/strata/cross-bootstrap/rsync.morph
new file mode 100644
index 00000000..9a92878d
--- /dev/null
+++ b/strata/cross-bootstrap/rsync.morph
@@ -0,0 +1,6 @@
+name: rsync
+kind: chunk
+build-system: autotools
+build-commands:
+- make proto
+- make
diff --git a/strata/cross-tools.morph b/strata/cross-tools.morph
new file mode 100644
index 00000000..795d3936
--- /dev/null
+++ b/strata/cross-tools.morph
@@ -0,0 +1,11 @@
+name: cross-tools
+kind: stratum
+description: Tools used together with cross compilers
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: patchelf
+ repo: upstream:patchelf
+ ref: 21a85cc1c63cf3ef060ece59cdd82455e2884703
+ unpetrify-ref: baserock/morph
+ build-system: autotools
diff --git a/strata/cups.morph b/strata/cups.morph
new file mode 100644
index 00000000..b10bcd6c
--- /dev/null
+++ b/strata/cups.morph
@@ -0,0 +1,11 @@
+name: cups
+kind: stratum
+description: Cups printer driver
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: cups
+ morph: strata/cups/cups.morph
+ repo: upstream:cups
+ ref: f28bae1aeae3964fba4f0728263657405f63c417
+ unpetrify-ref: release-1.7.0
diff --git a/strata/cups/cups.morph b/strata/cups/cups.morph
new file mode 100644
index 00000000..a3c2edf8
--- /dev/null
+++ b/strata/cups/cups.morph
@@ -0,0 +1,12 @@
+name: cups
+kind: chunk
+build-system: manual
+configure-commands:
+- autoconf
+- ./configure --prefix="$PREFIX"
+build-commands:
+- make
+# Note: BUILDROOT is the variable recommended in INSTALL.txt for the
+# destination directory.
+install-commands:
+- make BUILDROOT="$DESTDIR" install
diff --git a/strata/data-indexing-management.morph b/strata/data-indexing-management.morph
new file mode 100644
index 00000000..097f2d72
--- /dev/null
+++ b/strata/data-indexing-management.morph
@@ -0,0 +1,40 @@
+name: data-indexing-management
+kind: stratum
+description: Components to index data
+build-depends:
+- morph: strata/graphics-common.morph
+- morph: strata/icu-common.morph
+- morph: strata/multimedia-gstreamer.morph
+- morph: strata/vala-common.morph
+chunks:
+- name: libexif
+ repo: upstream:libexif-tarball
+ ref: 0c6a5fa0d9719a40748d8726b4543f02f70518c1
+ unpetrify-ref: libexif-0.6.21
+ build-system: autotools
+- name: libmediaart
+ morph: strata/data-indexing-management/libmediaart.morph
+ repo: upstream:gnome/libmediaart
+ ref: 52eb6498c97ce0005186946bc9162d87597abc2c
+ unpetrify-ref: baserock/1.9.0-8-g52eb649
+- name: gmime
+ morph: strata/data-indexing-management/gmime.morph
+ repo: upstream:gnome/gmime
+ ref: 496313fbe956b350c22fa705edbcfdde3d7c9e50
+ unpetrify-ref: baserock/GMIME_2_6_20-24-g496313f
+- name: totem-pl-parser
+ repo: upstream:gnome/totem-pl-parser
+ ref: 1be3144e9a6bf183a61c9596165d52bbe405b5cc
+ unpetrify-ref: baserock/V_3_10_5-16-g1be3144
+ build-system: autotools
+ build-depends:
+ - gmime
+- name: tracker
+ repo: upstream:gnome/tracker
+ ref: ad31f26e3c45dbe3365ff4aaae39269d9210f4a9
+ unpetrify-ref: 1.6.0
+ build-system: autotools
+ build-depends:
+ - libexif
+ - libmediaart
+ - totem-pl-parser
diff --git a/strata/data-indexing-management/gmime.morph b/strata/data-indexing-management/gmime.morph
new file mode 100644
index 00000000..f71efac4
--- /dev/null
+++ b/strata/data-indexing-management/gmime.morph
@@ -0,0 +1,6 @@
+name: gmime
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+# Work around upstream bug: https://bugzilla.gnome.org/show_bug.cgi?id=757720
+- sed -i 's/$(INCLUDES)/$(AM_CPPFLAGS)/g' gmime/Makefile.am
diff --git a/strata/data-indexing-management/libmediaart.morph b/strata/data-indexing-management/libmediaart.morph
new file mode 100644
index 00000000..43e0812f
--- /dev/null
+++ b/strata/data-indexing-management/libmediaart.morph
@@ -0,0 +1,5 @@
+name: libmediaart
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --disable-qt
diff --git a/strata/device-management.morph b/strata/device-management.morph
new file mode 100644
index 00000000..e0ed4a25
--- /dev/null
+++ b/strata/device-management.morph
@@ -0,0 +1,12 @@
+name: device-management
+kind: stratum
+description: libraries that provides access to devices
+build-depends:
+- morph: strata/foundation.morph
+- morph: strata/glib-common.morph
+chunks:
+- name: libgudev
+ repo: upstream:libgudev
+ ref: d722339aae9065a379acc0c421e8bbab866d5a38
+ unpetrify-ref: "230"
+ build-system: autotools
diff --git a/strata/devtools.morph b/strata/devtools.morph
new file mode 100644
index 00000000..41dd501c
--- /dev/null
+++ b/strata/devtools.morph
@@ -0,0 +1,55 @@
+name: devtools
+kind: stratum
+description: |
+ Extra development tools included in the devel system, this stratum
+ is here to help reduce unnecessary building, chunks added to this
+ stratum should not have any dependants (please don't build-depend on this
+ stratum)
+build-depends:
+- morph: strata/core.morph
+- morph: strata/python2-core.morph
+- morph: strata/docutils.morph
+chunks:
+- name: nano
+ morph: strata/devtools/nano.morph
+ repo: upstream:nano-tarball
+ ref: fb040ea36cb8e2158ccd9100600652f94ae90af1
+ unpetrify-ref: baserock/morph
+- name: vim
+ morph: strata/devtools/vim.morph
+ repo: upstream:vim
+ ref: 07c2c06799e0579e6bfb1a7d98acf38e36a98f79
+ unpetrify-ref: baserock/morph
+- name: pv
+ repo: upstream:pv
+ ref: d6ce7cfec684fa72d7a919d7b1aa817a0ca6102a
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: screen
+ morph: strata/devtools/screen.morph
+ repo: upstream:screen
+ ref: 7dd4a9e5f385c96a77e8ee5c977a1dde4c0ff467
+ unpetrify-ref: baserock/morph
+- name: git-review
+ repo: upstream:git-review
+ ref: 79262a52301c146a6b60d09a828661a83a5f5ba7
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: wget
+ morph: strata/devtools/wget.morph
+ repo: upstream:wget
+ ref: f65f522f58606f125535306e712c2c29921ee8b4
+ unpetrify-ref: v1.17.1
+ submodules:
+ gnulib:
+ url: upstream:gnulib
+- name: git
+ morph: strata/devtools/git.morph
+ repo: upstream:git
+ ref: ed9067f705aa51819c7dfff7e4190dd267beaf5d
+ unpetrify-ref: v2.8.0-rc2
+- name: iotop
+ repo: upstream:iotop
+ ref: 59e2537794d91c1375d391293f8fd89ca8b794a8
+ unpetrify-ref: iotop-0.6
+ build-system: python-distutils
diff --git a/strata/devtools/git.morph b/strata/devtools/git.morph
new file mode 100644
index 00000000..da7a8c04
--- /dev/null
+++ b/strata/devtools/git.morph
@@ -0,0 +1,11 @@
+name: git
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- make configure
+build-commands:
+- make all doc
+install-commands:
+- make DESTDIR="$DESTDIR" install install-doc
+post-install-commands:
+- install -D -m 644 -t "$DESTDIR"/etc/bash_completion.d/. contrib/completion/git-completion.bash
diff --git a/strata/devtools/nano.morph b/strata/devtools/nano.morph
new file mode 100644
index 00000000..3eeee120
--- /dev/null
+++ b/strata/devtools/nano.morph
@@ -0,0 +1,16 @@
+name: nano
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc
+post-install-commands:
+- |
+ cat <<EOF >> nanorc
+ set smooth
+ include /usr/share/nano/c.nanorc
+ include /usr/share/nano/patch.nanorc
+ include /usr/share/nano/python.nanorc
+ include /usr/share/nano/sh.nanorc
+ EOF
+- mkdir -p "$DESTDIR"/etc
+- install -m 644 nanorc "$DESTDIR"/etc/nanorc
diff --git a/strata/devtools/screen.morph b/strata/devtools/screen.morph
new file mode 100644
index 00000000..0b23c5d4
--- /dev/null
+++ b/strata/devtools/screen.morph
@@ -0,0 +1,11 @@
+name: screen
+kind: chunk
+description: A terminal multiplexer and sanity tool for many
+max-jobs: 1
+configure-commands:
+- cd ./src && sh autogen.sh
+- cd ./src && ./configure --prefix="$PREFIX"
+build-commands:
+- cd ./src && make
+install-commands:
+- cd ./src && make DESTDIR="$DESTDIR" install
diff --git a/strata/devtools/vim.morph b/strata/devtools/vim.morph
new file mode 100644
index 00000000..58e1403f
--- /dev/null
+++ b/strata/devtools/vim.morph
@@ -0,0 +1,10 @@
+name: vim
+kind: chunk
+build-system: autotools
+configure-commands:
+- echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >>src/feature.h
+- ./configure --prefix="$PREFIX" --enable-multibyte
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- mkdir -p "$DESTDIR"/etc
+- install -m 644 runtime/vimrc_example.vim "$DESTDIR"/etc/vimrc
diff --git a/strata/devtools/wget.morph b/strata/devtools/wget.morph
new file mode 100644
index 00000000..a3a7995a
--- /dev/null
+++ b/strata/devtools/wget.morph
@@ -0,0 +1,10 @@
+name: wget
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+# rsync is needed if we want the bootstrap script to download .po files,
+# we can't download into our chroot so we remove this dependency
+- sed -i '/^buildreq="/,/"/ { /^rsync.*/ d }' bootstrap.conf
+- ./bootstrap --no-bootstrap-sync --skip-po
+configure-commands:
+- ./configure --prefix="$PREFIX" --with-ssl=openssl
diff --git a/strata/dlna-services.morph b/strata/dlna-services.morph
new file mode 100644
index 00000000..2c4f1104
--- /dev/null
+++ b/strata/dlna-services.morph
@@ -0,0 +1,51 @@
+name: dlna-services
+kind: stratum
+description: provides DLNA services
+build-depends:
+- morph: strata/data-indexing-management.morph
+- morph: strata/docutils.morph
+- morph: strata/vala-common.morph
+chunks:
+- name: gssdp
+ morph: strata/dlna-services/gssdp.morph
+ repo: upstream:gnome/gssdp
+ ref: a53a6ac85f1b70192bc75fbbd4601582d6095cfd
+ unpetrify-ref: gssdp-0.14.12
+- name: gupnp
+ repo: upstream:gnome/gupnp
+ ref: c42b9cdda466ae9fef91f6beb370f8dfdebc295c
+ unpetrify-ref: gupnp-0.20.14
+ build-system: autotools
+ build-depends:
+ - gssdp
+- name: gupnp-av
+ repo: upstream:gnome/gupnp-av
+ ref: d277511ae1f456ba804f4c9beb5d36043f5a1659
+ unpetrify-ref: gupnp-av-0.12.7
+ build-system: autotools
+ build-depends:
+ - gupnp
+- name: gupnp-igd
+ repo: upstream:gnome/gupnp-igd
+ ref: f679a8ad782eee72e2ff7a0a7598b4523ef03bb3
+ unpetrify-ref: 0.2.4
+ build-system: autotools
+ build-depends:
+ - gupnp
+- name: gupnp-dlna
+ repo: upstream:gnome/gupnp-dlna
+ ref: 1aad765f223e3338d86bc975a2b4925fca43bf58
+ unpetrify-ref: gupnp-dlna-0.10.3
+ build-system: autotools
+ build-depends:
+ - gupnp
+- name: rygel
+ repo: upstream:rygel
+ ref: 4a42aee4afda9509db1e3d259c5a2907407a7261
+ unpetrify-ref: RYGEL_0_28_2
+ build-system: autotools
+ build-depends:
+ - gssdp
+ - gupnp
+ - gupnp-av
+ - gupnp-dlna
diff --git a/strata/dlna-services/gssdp.morph b/strata/dlna-services/gssdp.morph
new file mode 100644
index 00000000..14b810b0
--- /dev/null
+++ b/strata/dlna-services/gssdp.morph
@@ -0,0 +1,5 @@
+name: gssdp
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --disable-Werror
diff --git a/strata/docutils.morph b/strata/docutils.morph
new file mode 100644
index 00000000..e76cc7a2
--- /dev/null
+++ b/strata/docutils.morph
@@ -0,0 +1,52 @@
+name: docutils
+kind: stratum
+description: Stuff for generating documentation
+build-depends:
+- morph: strata/python2-core.morph
+chunks:
+- name: xml-catalog
+ morph: strata/docutils/xml-catalog.morph
+ repo: baserock:baserock/xml-catalog
+ ref: 1d4a2abc875c4dda1b5eadc0a097a48a8d2ec82b
+ unpetrify-ref: master
+- name: docbook-xml
+ morph: strata/docutils/docbook-xml.morph
+ repo: upstream:docbook-xml
+ ref: c8f0ce32a8075e9ab21e5cf734fb96195455264d
+ unpetrify-ref: docbook-xml-4.5
+ build-depends:
+ # This is a little awkward, we don't really build-depend on xml-catalog,
+ # but if we don't include it as a build dependency
+ # then we won't have the existing xml catalog in our staging area
+ # which would cause this chunk to create a new catalog which would
+ # overwrite the catalog created by the 'xml-catalog' chunk.
+ #
+ # construction of the catalog cannot be done at system-integration time
+ # because we need the catalog *here* in order to build nasm complete with
+ # man pages.
+ - xml-catalog
+- name: docbook-xsl
+ morph: strata/docutils/docbook-xsl.morph
+ repo: upstream:docbook-xsl
+ ref: 802da9dd5d4bc18f46a916eedc0c5c1980a15e59
+ unpetrify-ref: docbook-xsl-1.78.1
+ build-depends:
+ # Same issue as above, except this time we don't want to overwrite
+ # the catalog that now contains the XML DTDs.
+ - docbook-xml
+- name: asciidoc
+ repo: upstream:asciidoc
+ ref: d3a6df0caa94edaf8180bd71bf2fc68390f56520
+ unpetrify-ref: 8.6.9
+ build-system: autotools
+ build-depends:
+ - docbook-xml
+ - docbook-xsl
+- name: xmlto
+ repo: upstream:xmlto-tarball
+ ref: 6a590aba95cbcce0f184381fb19d16558e56832d
+ unpetrify-ref: xmlto-0.0.26
+ build-system: autotools
+ build-depends:
+ - docbook-xml
+ - docbook-xsl
diff --git a/strata/docutils/docbook-xml.morph b/strata/docutils/docbook-xml.morph
new file mode 100644
index 00000000..91233b6d
--- /dev/null
+++ b/strata/docutils/docbook-xml.morph
@@ -0,0 +1,104 @@
+name: docbook-xml
+kind: chunk
+build-system: manual
+install-commands:
+- install -v -d -m755 "$DESTDIR$PREFIX/share/xml/docbook/xml-dtd-4.5"
+- install -v -d -m755 "$DESTDIR/etc/xml"
+- |
+ cp -v -af docbook.cat *.dtd ent/ *.mod \
+ "$DESTDIR$PREFIX/share/xml/docbook/xml-dtd-4.5"
+post-install-commands:
+- |
+ # Create (or update) and populate the "$DESTDIR/etc/xml/docbook" catalog file
+ if [ ! -e /etc/xml/docbook ]; then
+ xmlcatalog --noout --create "$DESTDIR/etc/xml/docbook"
+ else
+ # Copy the existing catalog so we can update it
+ cp /etc/xml/docbook "$DESTDIR/etc/xml/docbook"
+ fi
+
+- |
+ xmlcatalog --noout --add "public" \
+ "-//OASIS//DTD DocBook XML V4.5//EN" \
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" \
+ "$DESTDIR/etc/xml/docbook"
+- |
+ xmlcatalog --noout --add "public" \
+ "-//OASIS//DTD DocBook XML CALS Table Model V4.5//EN" \
+ "file:///usr/share/xml/docbook/xml-dtd-4.5/calstblx.dtd" \
+ "$DESTDIR/etc/xml/docbook"
+- |
+ xmlcatalog --noout --add "public" \
+ "-//OASIS//DTD XML Exchange Table Model 19990315//EN" \
+ "file:///usr/share/xml/docbook/xml-dtd-4.5/soextblx.dtd" \
+ "$DESTDIR/etc/xml/docbook"
+- |
+ xmlcatalog --noout --add "public" \
+ "-//OASIS//ELEMENTS DocBook XML Information Pool V4.5//EN" \
+ "file:///usr/share/xml/docbook/xml-dtd-4.5/dbpoolx.mod" \
+ "$DESTDIR/etc/xml/docbook"
+- |
+ xmlcatalog --noout --add "public" \
+ "-//OASIS//ELEMENTS DocBook XML Document Hierarchy V4.5//EN" \
+ "file:///usr/share/xml/docbook/xml-dtd-4.5/dbhierx.mod" \
+ "$DESTDIR/etc/xml/docbook"
+- |
+ xmlcatalog --noout --add "public" \
+ "-//OASIS//ELEMENTS DocBook XML HTML Tables V4.5//EN" \
+ "file:///usr/share/xml/docbook/xml-dtd-4.5/htmltblx.mod" \
+ "$DESTDIR/etc/xml/docbook"
+- |
+ xmlcatalog --noout --add "public" \
+ "-//OASIS//ENTITIES DocBook XML Notations V4.5//EN" \
+ "file:///usr/share/xml/docbook/xml-dtd-4.5/dbnotnx.mod" \
+ "$DESTDIR/etc/xml/docbook"
+- |
+ xmlcatalog --noout --add "public" \
+ "-//OASIS//ENTITIES DocBook XML Character Entities V4.5//EN" \
+ "file:///usr/share/xml/docbook/xml-dtd-4.5/dbcentx.mod" \
+ "$DESTDIR/etc/xml/docbook"
+- |
+ xmlcatalog --noout --add "public" \
+ "-//OASIS//ENTITIES DocBook XML Additional General Entities V4.5//EN" \ "file:///usr/share/xml/docbook/xml-dtd-4.5/dbgenent.mod" \
+ "$DESTDIR/etc/xml/docbook"
+- |
+ xmlcatalog --noout --add "rewriteSystem" \
+ "http://www.oasis-open.org/docbook/xml/4.5" \
+ "file:///usr/share/xml/docbook/xml-dtd-4.5" \
+ "$DESTDIR/etc/xml/docbook"
+- |
+ xmlcatalog --noout --add "rewriteURI" \
+ "http://www.oasis-open.org/docbook/xml/4.5" \
+ "file:///usr/share/xml/docbook/xml-dtd-4.5" \
+ "$DESTDIR/etc/xml/docbook"
+
+- |
+ # Create (or update) and populate the "$DESTDIR/etc/xml/catalog" catalog file
+ if [ ! -e /etc/xml/catalog ]; then
+ echo 'Creating new xml catalog'
+ xmlcatalog --noout --create "$DESTDIR/etc/xml/catalog"
+ else
+ # Copy the existing catalog so we can update it
+ cp /etc/xml/catalog "$DESTDIR/etc/xml/catalog"
+ fi
+
+- |
+ xmlcatalog --noout --add "delegatePublic" \
+ "-//OASIS//ENTITIES DocBook XML" \
+ "file:///etc/xml/docbook" \
+ "$DESTDIR/etc/xml/catalog"
+- |
+ xmlcatalog --noout --add "delegatePublic" \
+ "-//OASIS//DTD DocBook XML" \
+ "file:///etc/xml/docbook" \
+ "$DESTDIR/etc/xml/catalog"
+- |
+ xmlcatalog --noout --add "delegateSystem" \
+ "http://www.oasis-open.org/docbook/" \
+ "file:///etc/xml/docbook" \
+ "$DESTDIR/etc/xml/catalog"
+- |
+ xmlcatalog --noout --add "delegateURI" \
+ "http://www.oasis-open.org/docbook/" \
+ "file:///etc/xml/docbook" \
+ "$DESTDIR/etc/xml/catalog"
diff --git a/strata/docutils/docbook-xsl.morph b/strata/docutils/docbook-xsl.morph
new file mode 100644
index 00000000..b3bf396d
--- /dev/null
+++ b/strata/docutils/docbook-xsl.morph
@@ -0,0 +1,50 @@
+name: docbook-xsl
+kind: chunk
+install-commands:
+- install -v -m755 -d "$DESTDIR$PREFIX/share/xml/docbook/xsl-stylesheets-1.78.1"
+- |
+ cp -v -R VERSION common eclipse epub extensions fo highlighting html \
+ htmlhelp images javahelp lib manpages params profiling \
+ roundtrip slides template tests tools webhelp website \
+ xhtml xhtml-1_1 \
+ "$DESTDIR$PREFIX/share/xml/docbook/xsl-stylesheets-1.78.1"
+
+- ln -s VERSION "$DESTDIR$PREFIX/share/xml/docbook/xsl-stylesheets-1.78.1/VERSION.xsl"
+
+- install -v -m644 -D README "$DESTDIR$PREFIX/share/doc/docbook-xsl-1.78.1/README.txt"
+- |
+ install -v -m644 RELEASE-NOTES* NEWS* \
+ "$DESTDIR$PREFIX/share/doc/docbook-xsl-1.78.1"
+post-install-commands:
+- if [ ! -d "$DESTDIR/etc/xml" ]; then install -v -m755 -d "$DESTDIR/etc/xml"; fi
+- |
+ if [ ! -e /etc/xml/catalog ]; then
+ echo "Creating new xml catalog"
+ xmlcatalog --noout --create "$DESTDIR/etc/xml/catalog"
+ else
+ cp /etc/xml/catalog "$DESTDIR/etc/xml/catalog"
+ fi
+
+- |
+ xmlcatalog --noout --add "rewriteSystem" \
+ "http://docbook.sourceforge.net/release/xsl/1.78.1" \
+ "/usr/share/xml/docbook/xsl-stylesheets-1.78.1" \
+ "$DESTDIR/etc/xml/catalog"
+
+- |
+ xmlcatalog --noout --add "rewriteURI" \
+ "http://docbook.sourceforge.net/release/xsl/1.78.1" \
+ "/usr/share/xml/docbook/xsl-stylesheets-1.78.1" \
+ "$DESTDIR/etc/xml/catalog"
+
+- |
+ xmlcatalog --noout --add "rewriteSystem" \
+ "http://docbook.sourceforge.net/release/xsl/current" \
+ "/usr/share/xml/docbook/xsl-stylesheets-1.78.1" \
+ "$DESTDIR/etc/xml/catalog"
+
+- |
+ xmlcatalog --noout --add "rewriteURI" \
+ "http://docbook.sourceforge.net/release/xsl/current" \
+ "/usr/share/xml/docbook/xsl-stylesheets-1.78.1" \
+ "$DESTDIR/etc/xml/catalog"
diff --git a/strata/docutils/xml-catalog.morph b/strata/docutils/xml-catalog.morph
new file mode 100644
index 00000000..f0f589d3
--- /dev/null
+++ b/strata/docutils/xml-catalog.morph
@@ -0,0 +1,6 @@
+name: xml-catalog
+kind: chunk
+install-commands:
+- make DESTDIR="$DESTDIR" install
+post-install-commands:
+- DESTDIR="$DESTDIR" ./post-install.sh
diff --git a/strata/elixir.morph b/strata/elixir.morph
new file mode 100644
index 00000000..dd46ed64
--- /dev/null
+++ b/strata/elixir.morph
@@ -0,0 +1,11 @@
+name: elixir
+kind: stratum
+description: stratum for elixir
+build-depends:
+- morph: strata/erlang.morph
+chunks:
+- name: elixir
+ morph: strata/elixir/elixir.morph
+ repo: upstream:elixir
+ ref: 737ac62926db7a692e2fe67c27b696cfd0866674
+ unpetrify-ref: v1.2.3
diff --git a/strata/elixir/elixir.morph b/strata/elixir/elixir.morph
new file mode 100644
index 00000000..1efbea87
--- /dev/null
+++ b/strata/elixir/elixir.morph
@@ -0,0 +1,6 @@
+name: elixir
+kind: chunk
+build-commands:
+- make clean
+install-commands:
+- make install
diff --git a/strata/erlang.morph b/strata/erlang.morph
new file mode 100644
index 00000000..3aad68e8
--- /dev/null
+++ b/strata/erlang.morph
@@ -0,0 +1,18 @@
+name: erlang
+kind: stratum
+description: stratum for erlang/otp and stuff
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: erlang
+ morph: strata/erlang/erlang.morph
+ repo: upstream:erlang
+ ref: 1ab69efa960703b86a13ea6ba96f4fd56f1565f9
+ unpetrify-ref: OTP-18.3.3
+- name: rebar
+ morph: strata/erlang/rebar.morph
+ repo: upstream:erlang-modules/rebar
+ ref: d42ed4683576d995f60e3222f076e99f0b081f79
+ unpetrify-ref: master
+ build-depends:
+ - erlang
diff --git a/strata/erlang/erlang.morph b/strata/erlang/erlang.morph
new file mode 100644
index 00000000..feaf04f1
--- /dev/null
+++ b/strata/erlang/erlang.morph
@@ -0,0 +1,9 @@
+name: erlang
+kind: chunk
+configure-commands:
+- ./otp_build autoconf
+- ./configure --prefix=$PREFIX
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/strata/erlang/rebar.morph b/strata/erlang/rebar.morph
new file mode 100644
index 00000000..fa5fd64f
--- /dev/null
+++ b/strata/erlang/rebar.morph
@@ -0,0 +1,6 @@
+name: rebar
+kind: chunk
+build-commands:
+- ./bootstrap
+install-commands:
+- install -D -m 755 rebar "$DESTDIR$PREFIX"/bin/rebar
diff --git a/strata/foundation.morph b/strata/foundation.morph
new file mode 100644
index 00000000..50d1e63b
--- /dev/null
+++ b/strata/foundation.morph
@@ -0,0 +1,131 @@
+name: foundation
+kind: stratum
+description: Basic userland runtime system
+build-depends:
+- morph: strata/coreutils-common.morph
+chunks:
+- name: bash-completion
+ repo: upstream:bash-completion
+ ref: 3085c7e12179817a02a611016606391295c69942
+ unpetrify-ref: '2.1'
+ build-system: autotools
+- name: groff
+ morph: strata/foundation/groff.morph
+ repo: upstream:groff-git
+ ref: 16305a24e67966ace06d55e2a0b98cc0e3127a93
+ unpetrify-ref: 1.22.3
+- name: kmod
+ morph: strata/foundation/kmod.morph
+ repo: upstream:kmod
+ ref: 42f32b8ae45ad8e3a1da29c9b20af9b5e2e9e676
+ unpetrify-ref: v22
+- name: time-zone-database
+ morph: strata/foundation/time-zone-database.morph
+ repo: upstream:tz
+ ref: a0782484f101ac55c916568bc1c490d7761fc904
+ unpetrify-ref: 2015a
+- name: pciutils
+ morph: strata/foundation/pciutils.morph
+ repo: upstream:pciutils
+ ref: 37c9315c504f266c23d51e62e59d32422dbbe9e7
+ unpetrify-ref: v3.4.1
+- name: dbus-pre
+ morph: strata/foundation/dbus-pre.morph
+ repo: upstream:dbus
+ ref: 8f71063e75fd6e06e985c1de711bf62231b504af
+ unpetrify-ref: baserock/dbus-1.10.14-capi-patches
+- name: libgpg-error
+ morph: strata/foundation/libgpg-error.morph
+ repo: upstream:libgpg-error
+ ref: d77c33ae608d67086ea057cca5ddee99a7202f8b
+ unpetrify-ref: libgpg-error-1.19
+- name: libgcrypt
+ morph: strata/foundation/libgcrypt.morph
+ repo: upstream:libgcrypt
+ ref: b16176769672a659b9a7c1d23325270338323385
+ unpetrify-ref: baserock/libgcrypt-1.7.8
+ build-depends:
+ - libgpg-error
+- name: systemd
+ morph: strata/foundation/systemd.morph
+ repo: upstream:systemd
+ ref: a1e2ef7ec912902d8142e7cb5830cbfb47dba86c
+ unpetrify-ref: v232
+ build-depends:
+ - dbus-pre
+ - kmod
+ - libgcrypt
+ - libgpg-error
+- name: libusb
+ repo: upstream:libusb
+ ref: 09e75e98b4d9ea7909e8837b7a3f00dda4589dc3
+ unpetrify-ref: v1.0.21
+ build-system: autotools
+ build-depends:
+ - systemd
+- name: usbutils
+ repo: upstream:usbutils
+ ref: 3bafa6940f512357d7aa54d3a76de01662a19e48
+ unpetrify-ref: v008
+ build-system: autotools
+ build-depends:
+ - libusb
+ - systemd
+ submodules:
+ usbhid-dump:
+ url: upstream:usbhid-dump
+- name: lzo
+ morph: strata/foundation/lzo.morph
+ repo: upstream:lzo
+ ref: 338906b389d616a50da0447038d4ec3e1e3f190f
+ unpetrify-ref: lzo-2.08
+- name: fuse
+ morph: strata/foundation/fuse.morph
+ repo: upstream:fuse
+ ref: e9b2eec7c5856032652bb8ff734174764e444c74
+ unpetrify-ref: baserock/fuse_2_9_4-fix-armv8
+- name: btrfs-progs
+ morph: strata/foundation/btrfs-progs.morph
+ repo: upstream:btrfs-progs
+ ref: 19a806f575cd010734fa5793c4b3bfb49926dc62
+ unpetrify-ref: v4.0
+ build-depends:
+ - lzo
+- name: dbus
+ morph: strata/foundation/dbus.morph
+ repo: upstream:dbus
+ ref: 8f71063e75fd6e06e985c1de711bf62231b504af
+ unpetrify-ref: baserock/dbus-1.10.14-capi-patches
+ build-depends:
+ - systemd
+ - libgcrypt
+ - libgpg-error
+- name: openssh
+ morph: strata/foundation/openssh.morph
+ repo: upstream:openssh-git
+ ref: 782fe9e725243eeb5ad6ab9a1783b5d6bedfe0d7
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - groff
+- name: tbdiff
+ morph: strata/foundation/tbdiff.morph
+ repo: baserock:baserock/tbdiff
+ ref: e17a444c651451724046e7da1ae2559e71478b3a
+ unpetrify-ref: master
+- name: rsync
+ morph: strata/foundation/rsync.morph
+ repo: upstream:rsync
+ ref: 7cb0de6326c915a72253fd103dae93308031ec3f
+ unpetrify-ref: v3.1.1
+- name: python-systemd
+ build-system: python3-distutils
+ repo: upstream:python-packages/python-systemd
+ ref: 8ccd64789ab030b76a99b578b5b1e9812b7a8cd8
+ unpetrify-ref: v231
+ build-depends:
+ - systemd
+- name: libarchive
+ morph: strata/foundation/libarchive.morph
+ repo: upstream:libarchive
+ ref: 19f23e191f9d3e1dd2a518735046100419965804
+ unpetrify-ref: v3.1.2
diff --git a/strata/foundation/btrfs-progs.morph b/strata/foundation/btrfs-progs.morph
new file mode 100644
index 00000000..807a115f
--- /dev/null
+++ b/strata/foundation/btrfs-progs.morph
@@ -0,0 +1,8 @@
+name: btrfs-progs
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- ./autogen.sh
+configure-commands:
+# The change in the CFLAGS is needed to make the compilation succeed in armv5l
+- export CFLAGS="-O2 $CFLAGS"; ./configure --prefix="$PREFIX" --disable-documentation
diff --git a/strata/foundation/dbus-pre.morph b/strata/foundation/dbus-pre.morph
new file mode 100644
index 00000000..3ec008bf
--- /dev/null
+++ b/strata/foundation/dbus-pre.morph
@@ -0,0 +1,10 @@
+name: dbus-pre
+kind: chunk
+build-system: autotools
+configure-commands:
+- sh autogen.sh --no-configure
+- ./configure --prefix="$PREFIX" --localstatedir=/var --sysconfdir=/etc --disable-systemd
+build-commands:
+- make XMLTO_OUTPUT=
+install-commands:
+- make XMLTO_OUTPUT= DESTDIR="$DESTDIR" install
diff --git a/strata/foundation/dbus.morph b/strata/foundation/dbus.morph
new file mode 100644
index 00000000..23840ce1
--- /dev/null
+++ b/strata/foundation/dbus.morph
@@ -0,0 +1,10 @@
+name: dbus
+kind: chunk
+build-system: autotools
+configure-commands:
+- sh autogen.sh --no-configure
+- ./configure --prefix="$PREFIX" --localstatedir=/var --sysconfdir=/etc --enable-user-session
+build-commands:
+- make XMLTO_OUTPUT=
+install-commands:
+- make XMLTO_OUTPUT= DESTDIR="$DESTDIR" install
diff --git a/strata/foundation/fuse.morph b/strata/foundation/fuse.morph
new file mode 100644
index 00000000..5d431307
--- /dev/null
+++ b/strata/foundation/fuse.morph
@@ -0,0 +1,5 @@
+name: fuse
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- ./makeconf.sh
diff --git a/strata/foundation/groff.morph b/strata/foundation/groff.morph
new file mode 100644
index 00000000..8380a9cc
--- /dev/null
+++ b/strata/foundation/groff.morph
@@ -0,0 +1,13 @@
+name: groff
+kind: chunk
+max-jobs: 1
+configure-commands:
+- PAGE=A4 ./configure --prefix="$PREFIX"
+build-commands:
+# hack to avoid a netpbm dependency
+- touch doc/gnu.eps
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- ln -s eqn "$DESTDIR$PREFIX/bin/geqn"
+- ln -s tbl "$DESTDIR$PREFIX/bin/gtbl"
diff --git a/strata/foundation/kmod.morph b/strata/foundation/kmod.morph
new file mode 100644
index 00000000..ee1b1254
--- /dev/null
+++ b/strata/foundation/kmod.morph
@@ -0,0 +1,23 @@
+name: kmod
+kind: chunk
+configure-commands:
+- rm -rf libkmod/docs
+- sed -i -e'/SUBDIRS/{s/\S*doc\S*//;s/\S*man\S*//}' Makefile.am
+- sed -i -e'/AC_CONFIG_FILES(\[/,/])/{/docs/d}' configure.ac
+- autoreconf -fiv
+- |
+ ./configure --prefix="$PREFIX" --bindir="$PREFIX"/bin \
+ --libdir="$PREFIX"/lib --sysconfdir=/etc \
+ --without-xz --with-zlib \
+ --disable-manpages --enable-python
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" pkgconfigdir="$PREFIX"/lib/pkgconfig install
+post-install-commands:
+- ln -s kmod "$DESTDIR/$PREFIX"/bin/modprobe
+- ln -s kmod "$DESTDIR/$PREFIX"/bin/lsmod
+- ln -s kmod "$DESTDIR/$PREFIX"/bin/rmmod
+- ln -s kmod "$DESTDIR/$PREFIX"/bin/insmod
+- ln -s kmod "$DESTDIR/$PREFIX"/bin/modinfo
+- ln -s kmod "$DESTDIR/$PREFIX"/bin/depmod
diff --git a/strata/foundation/libarchive.morph b/strata/foundation/libarchive.morph
new file mode 100644
index 00000000..bf840f58
--- /dev/null
+++ b/strata/foundation/libarchive.morph
@@ -0,0 +1,6 @@
+name: libarchive
+kind: chunk
+build-system: autotools
+configure-commands:
+- autoreconf -ivf
+- ./configure --prefix="$PREFIX" --disable-acl
diff --git a/strata/foundation/libgcrypt.morph b/strata/foundation/libgcrypt.morph
new file mode 100644
index 00000000..ccd5cb8a
--- /dev/null
+++ b/strata/foundation/libgcrypt.morph
@@ -0,0 +1,10 @@
+name: libgcrypt
+kind: chunk
+build-system: autotools
+
+pre-configure-commands:
+- autoreconf -fi
+
+configure-commands:
+# libgcrypt documentation requires fig2dev, which we don't have
+- ./configure --prefix="$PREFIX" --disable-doc
diff --git a/strata/foundation/libgpg-error.morph b/strata/foundation/libgpg-error.morph
new file mode 100644
index 00000000..bc8dcdab
--- /dev/null
+++ b/strata/foundation/libgpg-error.morph
@@ -0,0 +1,7 @@
+name: libgpg-error
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- autoreconf -fi
+configure-commands:
+- ./configure --prefix="$PREFIX" --disable-doc
diff --git a/strata/foundation/lzo.morph b/strata/foundation/lzo.morph
new file mode 100644
index 00000000..a1a7bbc7
--- /dev/null
+++ b/strata/foundation/lzo.morph
@@ -0,0 +1,5 @@
+name: lzo
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --enable-shared=yes --prefix="$PREFIX"
diff --git a/strata/foundation/openssh.morph b/strata/foundation/openssh.morph
new file mode 100644
index 00000000..7d38791f
--- /dev/null
+++ b/strata/foundation/openssh.morph
@@ -0,0 +1,32 @@
+name: openssh
+kind: chunk
+configure-commands:
+- autoreconf -if
+- |
+ OPENSSL_SEEDS_ITSELF=yes ./configure \
+ --prefix="$PREFIX" --sysconfdir=/etc/ssh \
+ --datadir="$PREFIX/share/sshd" \
+ --libexecdir="$PREFIX/lib/openssh" \
+ --with-privsep-path=/var/lib/sshd \
+ --with-pam
+build-commands:
+- make
+- |
+ sed -e "s|@prefix@|$PREFIX|g" \
+ -e 's|@STARTUP_SCRIPT_SHELL@|/bin/sh|g' \
+ -e 's|@sysconfdir@|/etc/ssh|g' \
+ -e 's|@COMMENT_OUT_ECC@||g' \
+ sshd-keygen.in >sshd-keygen
+- sed -e "s|@prefix@|$PREFIX|g" opensshd.service.in >opensshd.service
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- mkdir -p "$DESTDIR/$PREFIX/sbin"
+- chmod go= "$DESTDIR"/var/lib/sshd
+- install -m 744 sshd-keygen "$DESTDIR/$PREFIX/sbin/sshd-keygen"
+- install -m 755 contrib/ssh-copy-id "$DESTDIR/$PREFIX/bin/ssh-copy-id"
+- mkdir -p "$DESTDIR$PREFIX/lib/systemd/system/"
+- install -m 644 opensshd.service "$DESTDIR$PREFIX/lib/systemd/system/opensshd.service"
+system-integration:
+ openssh-misc:
+ 00-enable-opensshd-unit:
+ - systemctl enable opensshd
diff --git a/strata/foundation/pciutils.morph b/strata/foundation/pciutils.morph
new file mode 100644
index 00000000..03bd4a23
--- /dev/null
+++ b/strata/foundation/pciutils.morph
@@ -0,0 +1,11 @@
+name: pciutils
+kind: chunk
+configure-commands:
+- make PREFIX="$PREFIX" ZLIB=no lib/config.mk
+- echo PREFIX="$PREFIX" >>lib/config.mk
+- echo MANDIR="$PREFIX/share/man" >>lib/config.mk # ensure manpages are always installed in share/man
+build-commands:
+- make PREFIX="$PREFIX"
+install-commands:
+- make PREFIX="$PREFIX" DESTDIR="$DESTDIR" install
+- make PREFIX="$PREFIX" DESTDIR="$DESTDIR" install-lib
diff --git a/strata/foundation/rsync.morph b/strata/foundation/rsync.morph
new file mode 100644
index 00000000..54337412
--- /dev/null
+++ b/strata/foundation/rsync.morph
@@ -0,0 +1,9 @@
+name: rsync
+kind: chunk
+build-system: autotools
+build-commands:
+- make proto
+- make
+install-commands:
+- make install
+- install -D -m 644 packaging/systemd/rsync.service "$DESTDIR$PREFIX"/lib/systemd/system/rsync.service
diff --git a/strata/foundation/systemd.morph b/strata/foundation/systemd.morph
new file mode 100644
index 00000000..d0f962a8
--- /dev/null
+++ b/strata/foundation/systemd.morph
@@ -0,0 +1,31 @@
+name: systemd
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var
+ --disable-manpages
+ --disable-tests
+ --libexecdir="$PREFIX/libexec"
+ --enable-split-usr
+post-install-commands:
+- mkdir -p "$DESTDIR"/sbin
+- ln -s "$PREFIX"/lib/systemd/systemd "$DESTDIR"/sbin/init
+- for f in telinit runlevel shutdown poweroff reboot halt; do ln -s "$PREFIX"/bin/systemctl
+ "$DESTDIR/sbin/$f"; done
+- touch "$DESTDIR/etc/machine-id"
+- |
+ cat > "$DESTDIR/etc/systemd/network/10-dhcp.network" << "EOF"
+ [Match]
+ Name=e*
+
+ [Network]
+ DHCP=yes
+ EOF
+# Use the pam config systemd provides
+- cp -a "$DESTDIR/$PREFIX"/share/factory/etc/pam.d/* "$DESTDIR/etc/pam.d"
+
+# Add pam_deny.so to the default systemd-auth pam.d config file. Without
+# it, if shadow is configured to use PAM, it would be possible to login
+# to a system with the wrong password.
+- echo 'auth requisite pam_deny.so' >> "$DESTDIR"/etc/pam.d/system-auth
diff --git a/strata/foundation/tbdiff.morph b/strata/foundation/tbdiff.morph
new file mode 100644
index 00000000..a907a109
--- /dev/null
+++ b/strata/foundation/tbdiff.morph
@@ -0,0 +1,3 @@
+name: tbdiff
+kind: chunk
+build-system: autotools
diff --git a/strata/foundation/time-zone-database.morph b/strata/foundation/time-zone-database.morph
new file mode 100644
index 00000000..701d781a
--- /dev/null
+++ b/strata/foundation/time-zone-database.morph
@@ -0,0 +1,11 @@
+name: time-zone-database
+kind: chunk
+description: |
+ Time zone database.
+build-system: manual
+install-commands:
+# ETCDIR is actually where the 'tzselect', 'zdump' and 'zic' commands get
+# installed. Note that tzselect from this chunk will overlap with and override
+# the tzselect binary from GLIBC.
+- make TOPDIR="$PREFIX" ETCDIR="$PREFIX/bin" TZDIR="$PREFIX/share/zoneinfo" DESTDIR="$DESTDIR"
+ install
diff --git a/strata/geolocation.morph b/strata/geolocation.morph
new file mode 100644
index 00000000..f6d654fc
--- /dev/null
+++ b/strata/geolocation.morph
@@ -0,0 +1,18 @@
+name: geolocation
+kind: stratum
+description: libraries/services that provides location information
+build-depends:
+- morph: strata/glib-common.morph
+- morph: strata/libsoup-common.morph
+- morph: strata/NetworkManager-common.morph
+chunks:
+- name: geocode-glib
+ repo: upstream:gnome/geocode-glib
+ ref: a3e183e40053b4bd0fd0b25a070f60597270397a
+ unpetrify-ref: master
+ build-system: autotools
+- name: geoclue
+ morph: strata/geolocation/geoclue.morph
+ repo: upstream:geoclue
+ ref: ae8f7ab2f1e90f61931c652f2f65996c30c79e87
+ unpetrify-ref: 2.4.0
diff --git a/strata/geolocation/geoclue.morph b/strata/geolocation/geoclue.morph
new file mode 100644
index 00000000..3be946bb
--- /dev/null
+++ b/strata/geolocation/geoclue.morph
@@ -0,0 +1,13 @@
+name: geoclue
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc \
+ --disable-nmea-source \
+ --with-dbus-service-user=geoclue
+system-integration:
+ geoclue-misc:
+ 00-add-geoclue-user:
+ - groupadd geoclue
+ - useradd -c "GeoClue Owner" -r -g geoclue -s /bin/false geoclue
diff --git a/strata/glib-common.morph b/strata/glib-common.morph
new file mode 100644
index 00000000..fd1018a3
--- /dev/null
+++ b/strata/glib-common.morph
@@ -0,0 +1,38 @@
+name: glib-common
+kind: stratum
+description: GLib and dependencies
+build-depends:
+- morph: strata/python2-core.morph
+- morph: strata/pcre-utils.morph
+chunks:
+- name: gtk-doc-stub
+ repo: upstream:gtk-doc-stub
+ ref: 58ec0d8593541ef7ae522ce42ebec6f98536c4e0
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: gnome-common
+ repo: upstream:gnome-common
+ ref: 5d61b55e8bea32fe2b52e21682ee4b3719b290c5
+ unpetrify-ref: 3.14.0
+ build-system: autotools
+- name: glib
+ morph: strata/glib-common/glib.morph
+ repo: upstream:glib
+ ref: 90bb8778f2eabf00bee5bff1259c48f1e7b791b8
+ unpetrify-ref: 2.52.3
+- name: gobject-introspection
+ repo: upstream:gobject-introspection
+ ref: 42bf17a25c7379689fe78f31f332a64e3eded5d2
+ unpetrify-ref: 1.48.0
+ build-system: autotools
+ build-depends:
+ - glib
+- name: json-glib
+ repo: upstream:json-glib
+ ref: 19f5626b70e72a81dae7ee11b4c3a4d75779a7be
+ unpetrify-ref: 1.2.0
+ build-system: autotools
+ build-depends:
+ - glib
+ - gobject-introspection
+ - gtk-doc-stub
diff --git a/strata/glib-common/glib.morph b/strata/glib-common/glib.morph
new file mode 100644
index 00000000..cdfceed2
--- /dev/null
+++ b/strata/glib-common/glib.morph
@@ -0,0 +1,8 @@
+name: glib
+kind: chunk
+build-system: autotools
+system-integration:
+ glib-misc:
+ 01-compile-schemas:
+ - mkdir -p /usr/share/glib-2.0/schemas
+ - /usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas
diff --git a/strata/graphics-common.morph b/strata/graphics-common.morph
new file mode 100644
index 00000000..f99e6093
--- /dev/null
+++ b/strata/graphics-common.morph
@@ -0,0 +1,110 @@
+name: graphics-common
+kind: stratum
+build-depends:
+- morph: strata/glib-common.morph
+- morph: strata/mesa-common.morph
+- morph: strata/x-common.morph
+- morph: strata/icu-common.morph
+chunks:
+- name: pixman
+ morph: strata/graphics-common/pixman.morph
+ repo: upstream:pixman
+ ref: 87eea99e443b389c978cf37efc52788bf03a0ee0
+ unpetrify-ref: pixman-0.32.6
+- name: freetype2
+ repo: upstream:freetype2
+ ref: 66cf29b1bc869b44863b0de2115bd017dfcce849
+ unpetrify-ref: VER-2-6-2
+ build-system: autotools
+- name: colm-tarball
+ repo: upstream:colm-tarball
+ ref: 404ae0f284a3b2d41fcdb53826550e4dfec5c65c
+ unpetrify-ref: colm-0.12.0
+ build-system: autotools
+- name: ragel-tarball
+ repo: upstream:ragel-tarball
+ ref: d13d67a31c451ebd78ce708a4ef85803d429f158
+ unpetrify-ref: ragel-6.10
+ build-system: autotools
+ build-depends:
+ - colm-tarball
+- name: harfbuzz
+ repo: upstream:harfbuzz
+ ref: 432ffc47a46d41bea17d839d0d3980e654c6e638
+ unpetrify-ref: 1.0.4
+ build-system: autotools
+ build-depends:
+ - freetype2
+ - ragel-tarball
+- name: freetype2-harfbuzz
+ repo: upstream:freetype2
+ ref: 66cf29b1bc869b44863b0de2115bd017dfcce849
+ unpetrify-ref: VER-2-6-2
+ build-system: autotools
+- name: fontconfig
+ morph: strata/graphics-common/fontconfig.morph
+ repo: upstream:fontconfig
+ ref: 690f822a1b26b089d86e9843746cab80f3c07fe3
+ unpetrify-ref: 2.12.3
+ build-depends:
+ - freetype2-harfbuzz
+- name: freefont-otf
+ morph: strata/graphics-common/freefont-otf.morph
+ repo: upstream:freefont-otf
+ ref: 75fa95a912718bb94a135d4bf6b13bb38e186ce7
+ unpetrify-ref: baserock/morph
+- name: ttf-alee
+ morph: strata/graphics-common/ttf-alee.morph
+ repo: upstream:ttf-alee
+ ref: 97ededc81c03d0a7333a15a9a1e6acc4d0e5ac50
+ unpetrify-ref: fonts-alee_13.1
+- name: chinese-fonts-truetype-bkai00mp
+ morph: strata/graphics-common/chinese-fonts-truetype-bkai00mp.morph
+ repo: upstream:chinese-fonts-truetype/bkai00mp
+ ref: aa20d88b0ae7945f0956d7d662e8e5cf1e50b53a
+ unpetrify-ref: bkai00mp.ttf
+- name: chinese-fonts-truetype-gkai00mp
+ morph: strata/graphics-common/chinese-fonts-truetype-gkai00mp.morph
+ repo: upstream:chinese-fonts-truetype/gkai00mp
+ ref: 7569dd2d8f31617a87229a4446b294a0d48055dd
+ unpetrify-ref: gkai00mp.ttf
+- name: chinese-fonts-truetype-bsmi00lp
+ morph: strata/graphics-common/chinese-fonts-truetype-bsmi00lp.morph
+ repo: upstream:chinese-fonts-truetype/bsmi00lp
+ ref: 8f1febdd4f74d56670777c8a5fc25dc6d8cf972c
+ unpetrify-ref: bsmi00lp.ttf
+- name: chinese-fonts-truetype-gbsn00lp
+ morph: strata/graphics-common/chinese-fonts-truetype-gbsn00lp.morph
+ repo: upstream:chinese-fonts-truetype/gbsn00lp
+ ref: be390396044728b4b535a067e3a0dca7daa0b8b6
+ unpetrify-ref: gbsn00lp.ttf
+- name: libpng
+ repo: upstream:libpng
+ ref: 88dd30b232362b65cca374dda39096888163dd6b
+ unpetrify-ref: libpng-1.6.16-signed
+ build-system: autotools
+- name: libjpeg
+ repo: upstream:libjpeg
+ ref: f57ac58ac664ede6bc6e8cd9d88e0edaa366e21a
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: libtiff
+ repo: upstream:libtiff
+ ref: 2f83c385ff3d5493602308b62ca6d7707725b4fd
+ unpetrify-ref: Release-v4-0-3
+ build-system: autotools
+- name: cairo
+ morph: strata/graphics-common/cairo.morph
+ repo: upstream:cairo
+ ref: f6fd372a8b31a0bebbdfe36090d6ffc7bab9a2f8
+ unpetrify-ref: 1.14.0
+ build-depends:
+ - fontconfig
+ - freetype2-harfbuzz
+ - pixman
+ - libpng
+- name: libwebp
+ repo: upstream:libwebp
+ ref: fcd94e925a9377cccfcf9de6db278126a52b97a4
+ unpetrify-ref: v0.4.3-rc1
+ build-system: autotools
diff --git a/strata/graphics-common/cairo.morph b/strata/graphics-common/cairo.morph
new file mode 100644
index 00000000..cc5a0725
--- /dev/null
+++ b/strata/graphics-common/cairo.morph
@@ -0,0 +1,5 @@
+name: cairo
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --enable-glesv2
diff --git a/strata/graphics-common/chinese-fonts-truetype-bkai00mp.morph b/strata/graphics-common/chinese-fonts-truetype-bkai00mp.morph
new file mode 100644
index 00000000..8dcde50f
--- /dev/null
+++ b/strata/graphics-common/chinese-fonts-truetype-bkai00mp.morph
@@ -0,0 +1,5 @@
+name: chinese-fonts-truetype-bkai00mp
+kind: chunk
+install-commands:
+- mkdir -p "$DESTDIR"/usr/share/fonts/truetype/chinese
+- install -p *.ttf "$DESTDIR"/usr/share/fonts/truetype/chinese
diff --git a/strata/graphics-common/chinese-fonts-truetype-bsmi00lp.morph b/strata/graphics-common/chinese-fonts-truetype-bsmi00lp.morph
new file mode 100644
index 00000000..8e0c060d
--- /dev/null
+++ b/strata/graphics-common/chinese-fonts-truetype-bsmi00lp.morph
@@ -0,0 +1,5 @@
+name: chinese-fonts-truetype-bsmi00lp
+kind: chunk
+install-commands:
+- mkdir -p "$DESTDIR"/usr/share/fonts/truetype/chinese
+- install -p *.ttf "$DESTDIR"/usr/share/fonts/truetype/chinese
diff --git a/strata/graphics-common/chinese-fonts-truetype-gbsn00lp.morph b/strata/graphics-common/chinese-fonts-truetype-gbsn00lp.morph
new file mode 100644
index 00000000..f1a0d15f
--- /dev/null
+++ b/strata/graphics-common/chinese-fonts-truetype-gbsn00lp.morph
@@ -0,0 +1,5 @@
+name: chinese-fonts-truetype-gbsn00lp
+kind: chunk
+install-commands:
+- mkdir -p "$DESTDIR"/usr/share/fonts/truetype/chinese
+- install -p *.ttf "$DESTDIR"/usr/share/fonts/truetype/chinese
diff --git a/strata/graphics-common/chinese-fonts-truetype-gkai00mp.morph b/strata/graphics-common/chinese-fonts-truetype-gkai00mp.morph
new file mode 100644
index 00000000..c08e0736
--- /dev/null
+++ b/strata/graphics-common/chinese-fonts-truetype-gkai00mp.morph
@@ -0,0 +1,5 @@
+name: chinese-fonts-truetype-gkai00mp
+kind: chunk
+install-commands:
+- mkdir -p "$DESTDIR"/usr/share/fonts/truetype/chinese
+- install -p *.ttf "$DESTDIR"/usr/share/fonts/truetype/chinese
diff --git a/strata/graphics-common/fontconfig.morph b/strata/graphics-common/fontconfig.morph
new file mode 100644
index 00000000..08a228f5
--- /dev/null
+++ b/strata/graphics-common/fontconfig.morph
@@ -0,0 +1,7 @@
+name: fontconfig
+kind: chunk
+build-system: autotools
+system-integration:
+ fontconfig-misc:
+ 00-update-fc-cache:
+ - fc-cache -f -v
diff --git a/strata/graphics-common/freefont-otf.morph b/strata/graphics-common/freefont-otf.morph
new file mode 100644
index 00000000..f021480d
--- /dev/null
+++ b/strata/graphics-common/freefont-otf.morph
@@ -0,0 +1,5 @@
+name: freefont-otf
+kind: chunk
+install-commands:
+- mkdir -p "$DESTDIR"/usr/share/fonts/opentype/freefont
+- install -p *.otf "$DESTDIR"/usr/share/fonts/opentype/freefont
diff --git a/strata/graphics-common/pixman.morph b/strata/graphics-common/pixman.morph
new file mode 100644
index 00000000..7942a964
--- /dev/null
+++ b/strata/graphics-common/pixman.morph
@@ -0,0 +1,5 @@
+name: pixman
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-arm-iwmmxt --disable-arm-iwmmxt2
diff --git a/strata/graphics-common/ttf-alee.morph b/strata/graphics-common/ttf-alee.morph
new file mode 100644
index 00000000..b25e699f
--- /dev/null
+++ b/strata/graphics-common/ttf-alee.morph
@@ -0,0 +1,5 @@
+name: ttf-alee
+kind: chunk
+install-commands:
+- mkdir -p "$DESTDIR"/usr/share/fonts/truetype/alee
+- install -p *.ttf "$DESTDIR"/usr/share/fonts/truetype/alee
diff --git a/strata/gtk-deps.morph b/strata/gtk-deps.morph
new file mode 100644
index 00000000..e1090557
--- /dev/null
+++ b/strata/gtk-deps.morph
@@ -0,0 +1,55 @@
+name: gtk-deps
+kind: stratum
+description: the GTK+ dependencies stratum
+build-depends:
+- morph: strata/core.morph
+- morph: strata/graphics-common.morph
+- morph: strata/x-common.morph
+chunks:
+- name: pango
+ repo: upstream:pango
+ ref: 8daf1de02f8ac7e05b4788dcd6a209ef06e6e03a
+ unpetrify-ref: 1.40.1
+ build-system: autotools
+- name: shared-mime-info
+ morph: strata/gtk-deps/shared-mime-info.morph
+ repo: upstream:shared-mime-info
+ ref: f4e094740c36c629b5284ac270a0b08d8c75cb85
+ unpetrify-ref: Release-1-6
+- name: gdk-pixbuf
+ morph: strata/gtk-deps/gdk-pixbuf.morph
+ repo: upstream:gdk-pixbuf
+ ref: d8ae54bc5e3e31d43acf410a6689be2d40567b03
+ unpetrify-ref: 2.36.6
+- name: atk
+ repo: upstream:atk
+ ref: 5a0a8577d29eba636aa0573c469a6200cc93db30
+ unpetrify-ref: ATK_2_20_0
+ build-system: autotools
+- name: at-spi2-core
+ morph: strata/gtk-deps/at-spi2-core.morph
+ repo: upstream:at-spi2-core
+ ref: 5c3aa9275bb4d143ed9b0a94c7e7d92f88eb1520
+ unpetrify-ref: AT_SPI2_CORE_2_20_1
+- name: at-spi2-atk
+ morph: strata/gtk-deps/at-spi2-atk.morph
+ repo: upstream:at-spi2-atk
+ ref: 176a34174403ab09cd633b04cbbb2219cfe58a9d
+ unpetrify-ref: AT_SPI2_ATK_2_20_1
+ build-depends:
+ - at-spi2-core
+ - atk
+- name: libcroco
+ repo: upstream:libcroco
+ ref: d8a1a160186a45a5852abc06916f9e452ace9e00
+ unpetrify-ref: 0.6.11
+ build-system: autotools
+- name: librsvg
+ repo: upstream:librsvg
+ ref: e68ec17827a7116fc418189d474c5fafa08555b5
+ unpetrify-ref: 2.40.16
+ build-system: autotools
+ build-depends:
+ - gdk-pixbuf
+ - libcroco
+ - pango
diff --git a/strata/gtk-deps/at-spi2-atk.morph b/strata/gtk-deps/at-spi2-atk.morph
new file mode 100644
index 00000000..ae15e7f1
--- /dev/null
+++ b/strata/gtk-deps/at-spi2-atk.morph
@@ -0,0 +1,5 @@
+name: at-spi2-atk
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc
diff --git a/strata/gtk-deps/at-spi2-core.morph b/strata/gtk-deps/at-spi2-core.morph
new file mode 100644
index 00000000..ec641284
--- /dev/null
+++ b/strata/gtk-deps/at-spi2-core.morph
@@ -0,0 +1,5 @@
+name: at-spi2-core
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc
diff --git a/strata/gtk-deps/gdk-pixbuf.morph b/strata/gtk-deps/gdk-pixbuf.morph
new file mode 100644
index 00000000..92655e30
--- /dev/null
+++ b/strata/gtk-deps/gdk-pixbuf.morph
@@ -0,0 +1,8 @@
+name: gdk-pixbuf
+kind: chunk
+build-system: autotools
+system-integration:
+ gdk-pixbuf-misc:
+ 01-query-loaders:
+ - mkdir -p /usr/lib/gdk-pixbuf-2.0/2.10.0/
+ - /usr/bin/gdk-pixbuf-query-loaders > /usr/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache
diff --git a/strata/gtk-deps/shared-mime-info.morph b/strata/gtk-deps/shared-mime-info.morph
new file mode 100644
index 00000000..02ae5555
--- /dev/null
+++ b/strata/gtk-deps/shared-mime-info.morph
@@ -0,0 +1,8 @@
+name: shared-mime-info
+kind: chunk
+max-jobs: 1
+build-system: autotools
+system-integration:
+ shared-mime-info-misc:
+ 00-update-mime-database:
+ - update-mime-database /usr/share/mime
diff --git a/strata/gtk2.morph b/strata/gtk2.morph
new file mode 100644
index 00000000..4c8db88a
--- /dev/null
+++ b/strata/gtk2.morph
@@ -0,0 +1,12 @@
+name: gtk2
+kind: stratum
+description: the gtk2 stratum
+build-depends:
+- morph: strata/gtk-deps.morph
+- morph: strata/x-common.morph
+chunks:
+- name: gtk+
+ morph: strata/gtk2/gtk+.morph
+ repo: upstream:gtk+
+ ref: b5b055721378ffe0269613e49ab5741a315eeb00
+ unpetrify-ref: 2.24.28
diff --git a/strata/gtk2/gtk+.morph b/strata/gtk2/gtk+.morph
new file mode 100644
index 00000000..bdc14cc6
--- /dev/null
+++ b/strata/gtk2/gtk+.morph
@@ -0,0 +1,15 @@
+name: gtk+
+kind: chunk
+build-system: autotools
+configure-commands:
+- gdk-pixbuf-query-loaders > loader.cache
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc
+build-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make
+install-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make install DESTDIR="$DESTDIR"
+system-integration:
+ gtk2-misc:
+ 00-update-im2-cache:
+ - gtk-query-immodules-2.0 --update-cache
diff --git a/strata/gtk3.morph b/strata/gtk3.morph
new file mode 100644
index 00000000..dd429739
--- /dev/null
+++ b/strata/gtk3.morph
@@ -0,0 +1,20 @@
+name: gtk3
+kind: stratum
+description: the gtk3 stratum
+build-depends:
+- morph: strata/gtk-deps.morph
+- morph: strata/wayland-generic.morph
+- morph: strata/x-common.morph
+chunks:
+- name: libxkbcommon-x11
+ repo: upstream:xorg-lib-libxkbcommon
+ ref: 877fe59ac362b4e9afb2979b6e0bc837950a1dad
+ unpetrify-ref: xkbcommon-0.7.1
+ build-system: autotools
+- name: gtk3
+ morph: strata/gtk3/gtk3.morph
+ repo: upstream:gtk+
+ ref: 74d51e86af1e983e4eab317da87fdcfc70aac32a
+ unpetrify-ref: 3.22.16
+ build-depends:
+ - libxkbcommon-x11
diff --git a/strata/gtk3/gtk3.morph b/strata/gtk3/gtk3.morph
new file mode 100644
index 00000000..86e15e89
--- /dev/null
+++ b/strata/gtk3/gtk3.morph
@@ -0,0 +1,15 @@
+name: gtk3
+kind: chunk
+build-system: autotools
+configure-commands:
+- gdk-pixbuf-query-loaders > loader.cache
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc
+build-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make
+install-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make install DESTDIR="$DESTDIR"
+system-integration:
+ gtk3-misc:
+ 00-update-im3-cache:
+ - gtk-query-immodules-3.0 --update-cache
diff --git a/strata/icu-common.morph b/strata/icu-common.morph
new file mode 100644
index 00000000..3ac48524
--- /dev/null
+++ b/strata/icu-common.morph
@@ -0,0 +1,10 @@
+name: icu-common
+kind: stratum
+build-depends:
+- morph: strata/coreutils-common.morph
+chunks:
+- name: icu
+ morph: strata/icu-common/icu.morph
+ repo: upstream:icu
+ ref: e2bd11ca1374cccfa50b7d27507ba9fe581be76a
+ unpetrify-ref: icu4c-52_1-src
diff --git a/strata/icu-common/icu.morph b/strata/icu-common/icu.morph
new file mode 100644
index 00000000..5c269ee0
--- /dev/null
+++ b/strata/icu-common/icu.morph
@@ -0,0 +1,19 @@
+name: icu
+kind: chunk
+configure-commands:
+- |
+ # As per commit 8874a7c7, We issue this sed command when
+ # building ICU libraries on arm architectures.
+ case "$MORPH_ARCH" in
+ *arm*)
+ sed -e 's/LDFLAGSICUDT/#LDFLAGSICUDT/' -i source/config/mh-linux
+ ;;
+ *)
+ ;;
+ esac
+ cd source
+ ./runConfigureICU Linux --prefix=/usr --sysconfdir=/etc
+build-commands:
+- cd source; unset TARGET ; make
+install-commands:
+- cd source; unset TARGET ; make DESTDIR="$DESTDIR" install
diff --git a/strata/initramfs-utils.morph b/strata/initramfs-utils.morph
new file mode 100644
index 00000000..610997f3
--- /dev/null
+++ b/strata/initramfs-utils.morph
@@ -0,0 +1,11 @@
+name: initramfs-utils
+kind: stratum
+description: stratum for initramfs
+build-depends:
+- morph: strata/build-essential.morph
+chunks:
+- name: initramfs-scripts
+ repo: baserock:baserock/initramfs-scripts
+ ref: e5c71f0ca075bd29ffd55ec0c25804585bc21046
+ unpetrify-ref: master
+ build-system: autotools
diff --git a/strata/input-common.morph b/strata/input-common.morph
new file mode 100644
index 00000000..c9b8fc20
--- /dev/null
+++ b/strata/input-common.morph
@@ -0,0 +1,46 @@
+name: input-common
+kind: stratum
+build-depends:
+- morph: strata/device-management.morph
+- morph: strata/foundation.morph
+- morph: strata/glib-common.morph
+- morph: strata/xorg-util-macros-common.morph
+- morph: strata/x-common.morph
+chunks:
+- name: mtdev
+ repo: upstream:mtdev-git
+ ref: 4381b78fea54de0e775bf54952b2f95e5a06c57d
+ unpetrify-ref: v1.1.5
+ build-system: autotools
+- name: xkeyboard-config
+ morph: strata/input-common/xkeyboard-config.morph
+ repo: upstream:xkeyboard-config
+ ref: 26f344c93f8c6141e9233eb68088ba4fd56bc9ef
+ unpetrify-ref: xkeyboard-config-2.14
+- name: libevdev
+ repo: upstream:libevdev
+ ref: 6f03fd49fb949e46ebccb5dfb54489584896c791
+ unpetrify-ref: libevdev-1.4.2
+ build-system: autotools
+- name: libwacom
+ repo: upstream:linuxwacom/libwacom
+ ref: 46774c4b0ece2ee326ca5f913303f055de240c64
+ unpetrify-ref: libwacom-0.25
+ build-system: autotools
+- name: libinput
+ morph: strata/input-common/libinput.morph
+ repo: upstream:libinput
+ ref: 401728a1574ef886ddb7fa19cd8ed196420d7931
+ unpetrify-ref: 1.8.0
+ build-system: autotools
+ build-depends:
+ - mtdev
+ - libevdev
+ - libwacom
+- name: libxkbcommon-no-x11
+ repo: upstream:xorg-lib-libxkbcommon
+ ref: c43c3c866eb9d52cd8f61e75cbef1c30d07f3a28
+ morph: strata/input-common/libxkbcommon-no-x11.morph
+ unpetrify-ref: xkbcommon-0.5.0
+ build-depends:
+ - xkeyboard-config
diff --git a/strata/input-common/libinput.morph b/strata/input-common/libinput.morph
new file mode 100644
index 00000000..89ee1961
--- /dev/null
+++ b/strata/input-common/libinput.morph
@@ -0,0 +1,8 @@
+name: libinput
+kind: chunk
+
+build-system: autotools
+
+configure-commands:
+ - NOCONFIGURE=1 ./autogen.sh
+ - ./configure --prefix="$PREFIX" --disable-documentation --disable-debug-gui --disable-tests
diff --git a/strata/input-common/libxkbcommon-no-x11.morph b/strata/input-common/libxkbcommon-no-x11.morph
new file mode 100644
index 00000000..95165aaf
--- /dev/null
+++ b/strata/input-common/libxkbcommon-no-x11.morph
@@ -0,0 +1,12 @@
+name: libxkbcommon-no-x11
+kind: chunk
+
+description: |
+ xkbcommon is a library to handle keyboard descriptions.
+
+ This version is built without X11 support. If built with X11 support,
+ it depends on the xcb-xkb library.
+
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-x11
diff --git a/strata/input-common/xkeyboard-config.morph b/strata/input-common/xkeyboard-config.morph
new file mode 100644
index 00000000..2195befe
--- /dev/null
+++ b/strata/input-common/xkeyboard-config.morph
@@ -0,0 +1,7 @@
+name: xkeyboard-config
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-runtime-deps
+install-commands:
+- mkdir -p "$DESTDIR"/"$PREFIX"/share/X11/xkb/
+- make install DESTDIR="$DESTDIR"
diff --git a/strata/installer-utils.morph b/strata/installer-utils.morph
new file mode 100644
index 00000000..ddc714b6
--- /dev/null
+++ b/strata/installer-utils.morph
@@ -0,0 +1,11 @@
+name: installer-utils
+kind: stratum
+description: stratum for Baserock installer script.
+build-depends:
+- morph: strata/build-essential.morph
+chunks:
+- name: installer-scripts
+ morph: strata/installer-utils/installer-scripts.morph
+ repo: baserock:baserock/installer-scripts
+ ref: a1629ded9eb499b55b547cd8caa0ade8233b32f4
+ unpetrify-ref: master
diff --git a/strata/installer-utils/installer-scripts.morph b/strata/installer-utils/installer-scripts.morph
new file mode 100644
index 00000000..e42313a8
--- /dev/null
+++ b/strata/installer-utils/installer-scripts.morph
@@ -0,0 +1,4 @@
+name: installer-scripts
+kind: chunk
+install-commands:
+- install -D -m 755 baserock-installer "$DESTDIR/usr/lib/baserock-installer/installer"
diff --git a/strata/ivi-common.morph b/strata/ivi-common.morph
new file mode 100644
index 00000000..80c519b1
--- /dev/null
+++ b/strata/ivi-common.morph
@@ -0,0 +1,12 @@
+name: ivi-common
+kind: stratum
+description: Components shared with different IVI systems
+build-depends:
+- morph: strata/cpp-common-libs.morph
+- morph: strata/glib-common.morph
+chunks:
+- name: automotive-message-broker
+ morph: strata/ivi-common/automotive-message-broker.morph
+ repo: upstream:automotive-message-broker
+ ref: 5cac4bd2958ea24ac6913be5baa0dfcda6466089
+ unpetrify-ref: '0.14'
diff --git a/strata/ivi-common/automotive-message-broker.morph b/strata/ivi-common/automotive-message-broker.morph
new file mode 100644
index 00000000..50428735
--- /dev/null
+++ b/strata/ivi-common/automotive-message-broker.morph
@@ -0,0 +1,20 @@
+name: automotive-message-broker
+kind: chunk
+description: Automotive Message Broker framework
+build-system: cmake
+post-install-commands:
+- mkdir -p "$DESTDIR/usr/lib/systemd/system"
+- |
+ cat >"$DESTDIR/usr/lib/systemd/system/ambd.service" <<EOF
+ [Unit]
+ Description=Automotive Message Broker
+ After=syslog.target
+
+ [Service]
+ Type=dbus
+ BusName=org.automotive.message.broker
+ ExecStart=/usr/bin/ambd
+
+ [Install]
+ WantedBy=multi-user.target
+ EOF
diff --git a/strata/libdrm-common.morph b/strata/libdrm-common.morph
new file mode 100644
index 00000000..ebaf207e
--- /dev/null
+++ b/strata/libdrm-common.morph
@@ -0,0 +1,17 @@
+name: libdrm-common
+kind: stratum
+build-depends:
+- morph: strata/xorg-util-macros-common.morph
+chunks:
+- name: xorg-lib-libpciaccess
+ repo: upstream:xorg-lib-libpciaccess
+ ref: bbd1acdd1d25b9a68f4b7913a4094af20d7cf78f
+ unpetrify-ref: libpciaccess-0.13.4
+ build-system: autotools
+- name: drm
+ repo: upstream:drm
+ morph: strata/libdrm-common/drm.morph
+ ref: 81312f3730c14a2930a7784493701809c7f04a26
+ unpetrify-ref: libdrm-2.4.81
+ build-depends:
+ - xorg-lib-libpciaccess
diff --git a/strata/libdrm-common/drm.morph b/strata/libdrm-common/drm.morph
new file mode 100644
index 00000000..e6b8ed28
--- /dev/null
+++ b/strata/libdrm-common/drm.morph
@@ -0,0 +1,7 @@
+name: drm
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc \
+ --enable-tegra-experimental-api --enable-udev
diff --git a/strata/libsoup-common.morph b/strata/libsoup-common.morph
new file mode 100644
index 00000000..759a842c
--- /dev/null
+++ b/strata/libsoup-common.morph
@@ -0,0 +1,11 @@
+name: libsoup-common
+kind: stratum
+build-depends:
+- morph: strata/core.morph
+- morph: strata/glib-common.morph
+chunks:
+- name: libsoup
+ morph: strata/libsoup-common/libsoup.morph
+ repo: upstream:libsoup
+ ref: c29630a8fdb4e6997ec27da4af545bddefab35ad
+ unpetrify-ref: 2.48.0
diff --git a/strata/libsoup-common/libsoup.morph b/strata/libsoup-common/libsoup.morph
new file mode 100644
index 00000000..804925aa
--- /dev/null
+++ b/strata/libsoup-common/libsoup.morph
@@ -0,0 +1,6 @@
+name: libsoup
+kind: chunk
+build-system: autotools
+configure-commands:
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc --disable-tls-check
diff --git a/strata/lighttpd-server.morph b/strata/lighttpd-server.morph
new file mode 100644
index 00000000..9aa166fd
--- /dev/null
+++ b/strata/lighttpd-server.morph
@@ -0,0 +1,12 @@
+name: lighttpd-server
+kind: stratum
+description: lighttpd web server
+build-depends:
+- morph: strata/tools.morph
+- morph: strata/pcre-utils.morph
+chunks:
+- name: lighttpd
+ morph: strata/lighttpd-server/lighttpd.morph
+ repo: upstream:lighttpd
+ ref: 12e4e21763da770034267ff0a7b660876930f789
+ unpetrify-ref: baserock/morph
diff --git a/strata/lighttpd-server/lighttpd.morph b/strata/lighttpd-server/lighttpd.morph
new file mode 100644
index 00000000..ae371c52
--- /dev/null
+++ b/strata/lighttpd-server/lighttpd.morph
@@ -0,0 +1,6 @@
+name: lighttpd
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh
+- ./configure --prefix="$PREFIX" --with-openssl --with-openssl-libs=/usr/lib
diff --git a/strata/llvm-common.morph b/strata/llvm-common.morph
new file mode 100644
index 00000000..66bfed43
--- /dev/null
+++ b/strata/llvm-common.morph
@@ -0,0 +1,10 @@
+name: llvm-common
+kind: stratum
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: llvm
+ morph: strata/llvm-common/llvm.morph
+ repo: upstream:llvm
+ ref: c8fccc53ed66d505898f8850bcc690c977a7c9a7
+ unpetrify-ref: release_40
diff --git a/strata/llvm-common/llvm.morph b/strata/llvm-common/llvm.morph
new file mode 100644
index 00000000..08c32fa5
--- /dev/null
+++ b/strata/llvm-common/llvm.morph
@@ -0,0 +1,24 @@
+name: llvm
+kind: chunk
+description: Low Level Virtual Machine
+build-system: cmake
+configure-commands:
+- |
+ mkdir build/
+ cd build/
+
+ CC=gcc CXX=g++ \
+ cmake -DCMAKE_INSTALL_PREFIX="$PREFIX" \
+ -DLLVM_ENABLE_FFI=ON \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DLLVM_BUILD_LLVM_DYLIB=ON \
+ -DLLVM_TARGETS_TO_BUILD="host;AMDGPU" \
+ -Wno-dev ..
+build-commands:
+- |
+ cd build/
+ make
+install-commands:
+- |
+ cd build/
+ make DESTDIR="$DESTDIR" install
diff --git a/strata/lorry.morph b/strata/lorry.morph
new file mode 100644
index 00000000..c5913c4f
--- /dev/null
+++ b/strata/lorry.morph
@@ -0,0 +1,125 @@
+name: lorry
+kind: stratum
+description: |
+ Lorry and tools for working with version control systems other than Git.
+
+ Lorry is a tool for creating and maintaining Git mirrors of source code
+ repositories, which aims to support most version control systems in use
+ by software projects that are used Baserock systems.
+
+ The commandline tools 'hg', 'bzr', 'svn', and 'cvs' are also made available
+ by this stratum.
+build-depends:
+- morph: strata/foundation.morph
+- morph: strata/python-cliapp.morph
+- morph: strata/pcre-utils.morph # for swig
+chunks:
+- name: bzr-tarball
+ repo: upstream:bzr-tarball
+ ref: e61c7edb4789abcd0f73c30fe719fa6fea478a52
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
+- name: python-fastimport
+ repo: upstream:python-fastimport
+ ref: 6500a5e7d82651ade9002d44e3ecc71a50302616
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
+- name: bzr-fastimport
+ repo: upstream:bzr-fastimport
+ ref: b3cda9967f857127bd4dab5eb72223a95916f5ea
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
+ build-depends:
+ - bzr-tarball
+ - python-fastimport
+- name: cvs-tarball
+ morph: strata/lorry/cvs-tarball.morph
+ repo: upstream:cvs-tarball
+ ref: ca4cd317a75ef4349563b5a9a734561beb4a4f98
+ unpetrify-ref: baserock/morph
+- name: libapr
+ morph: strata/lorry/libapr.morph
+ repo: upstream:libapr
+ ref: 10835ec9a2d8bb9f7b867d15f29984d29744f028
+ unpetrify-ref: 1.5.1
+- name: libapr-util
+ morph: strata/lorry/libapr-util.morph
+ repo: upstream:libapr-util
+ ref: 718a507e2e33d87ab15ff80cfe80aea8ae6c7163
+ unpetrify-ref: 1.5.4
+ build-depends:
+ - libapr
+- name: perl-dbi-tarball
+ morph: strata/lorry/perl-dbi-tarball.morph
+ repo: upstream:perl-dbi-tarball
+ ref: 09e269cff811f0c1881ea0d6b7571173bab8377b
+ unpetrify-ref: baserock/morph
+- name: perl-dbd-sqlite-tarball
+ repo: upstream:perl-dbd-sqlite-tarball
+ ref: 485b97be9f2f2abf5a40923b5fd85f75714a8c02
+ unpetrify-ref: baserock/morph
+ build-system: cpan
+ build-depends:
+ - perl-dbi-tarball
+- name: libserf
+ morph: strata/lorry/libserf.morph
+ repo: upstream:libserf-tarball
+ ref: f143c3cab79c59dd57124f19d16ac35253843136
+ unpetrify-ref: master
+ build-depends:
+ - libapr
+ - libapr-util
+- name: swig
+ morph: strata/lorry/swig.morph
+ repo: upstream:swig
+ ref: 4e23595704d6ddffe4e50ca41bbc90e4b8893f4d
+ unpetrify-ref: rel-3.0.6
+- name: neon
+ morph: strata/lorry/neon.morph
+ repo: upstream:neon
+ ref: 837374e9d797e216f1de684595cefe791f67c0e4
+ unpetrify-ref: baserock/morph
+- name: subversion-tarball
+ morph: strata/lorry/subversion-tarball.morph
+ repo: upstream:subversion-tarball
+ ref: bb0ef45f7c46b0ae221b26265ef98a768c33f820
+ unpetrify-ref: subversion-1.8.13
+ build-depends:
+ - swig
+ - libapr
+ - libapr-util
+ - libserf
+ - neon
+- name: mercurial-tarball
+ morph: strata/lorry/mercurial-tarball.morph
+ repo: upstream:mercurial-tarball
+ ref: 4b0aa73b8c69bd5b7521337809f7bc4714209a5a
+ unpetrify-ref: baserock/morph
+- name: hg-fast-export
+ morph: strata/lorry/hg-fast-export.morph
+ repo: upstream:hg-fast-export
+ ref: 09a472aa58da0417a11a22bae172785f7cb2e80f
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - mercurial-tarball
+- name: cvsps
+ morph: strata/lorry/cvsps.morph
+ repo: upstream:cvsps
+ ref: 71c6d1f5668f405a7b259a0aac0d423f6c9b4d49
+ unpetrify-ref: baserock/morph
+- name: lorry
+ morph: strata/lorry/lorry.morph
+ repo: baserock:baserock/lorry
+ ref: dd9f0de2bc8aadb57f20ce998fcdefbda91f59b6
+ unpetrify-ref: master
+ build-depends:
+ - bzr-tarball
+ - python-fastimport
+ - bzr-fastimport
+ - perl-dbi-tarball
+ - perl-dbd-sqlite-tarball
+ - cvs-tarball
+ - cvsps
+ - subversion-tarball
+ - mercurial-tarball
+ - hg-fast-export
diff --git a/strata/lorry/cvs-tarball.morph b/strata/lorry/cvs-tarball.morph
new file mode 100644
index 00000000..e03250e2
--- /dev/null
+++ b/strata/lorry/cvs-tarball.morph
@@ -0,0 +1,10 @@
+name: cvs-tarball
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- cp /usr/share/automake*/config.guess build-aux
+- cp /usr/share/automake*/config.sub build-aux
+configure-commands:
+- YACC='bison -y' ./configure --prefix "$PREFIX" --with-external-zlib --without-gssapi
+ --without-krb4 --disable-dependency-tracking --disable-nls --disable-rpath
+ --enable-rootcommit
diff --git a/strata/lorry/cvsps.morph b/strata/lorry/cvsps.morph
new file mode 100644
index 00000000..ff53784e
--- /dev/null
+++ b/strata/lorry/cvsps.morph
@@ -0,0 +1,6 @@
+name: cvsps
+kind: chunk
+build-commands:
+- make
+install-commands:
+- make install prefix="$DESTDIR$PREFIX"
diff --git a/strata/lorry/hg-fast-export.morph b/strata/lorry/hg-fast-export.morph
new file mode 100644
index 00000000..ef99a97a
--- /dev/null
+++ b/strata/lorry/hg-fast-export.morph
@@ -0,0 +1,10 @@
+name: hg-fast-export
+kind: chunk
+install-commands:
+- install -d "$DESTDIR/$PREFIX/bin"
+- install -m 0755 hg-fast-export.py "$DESTDIR/$PREFIX/bin/"
+- install -m 0755 hg-reset.py "$DESTDIR/$PREFIX/bin/"
+- install -m 0755 hg-fast-export.sh "$DESTDIR/$PREFIX/bin/hg-fast-export"
+- install -m 0755 hg-reset.sh "$DESTDIR/$PREFIX/bin/hg-reset"
+- install -d "$DESTDIR/$PREFIX/lib/python2.7/site-packages"
+- install -m 0644 hg2git.py "$DESTDIR/$PREFIX/lib/python2.7/site-packages/"
diff --git a/strata/lorry/libapr-util.morph b/strata/lorry/libapr-util.morph
new file mode 100644
index 00000000..26db03ba
--- /dev/null
+++ b/strata/lorry/libapr-util.morph
@@ -0,0 +1,7 @@
+name: libapr-util
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- ./buildconf --with-apr=/usr/share/apr-1
+configure-commands:
+- ./configure --prefix "$PREFIX" --with-apr=/usr/bin/apr-1-config
diff --git a/strata/lorry/libapr.morph b/strata/lorry/libapr.morph
new file mode 100644
index 00000000..57d35b84
--- /dev/null
+++ b/strata/lorry/libapr.morph
@@ -0,0 +1,21 @@
+name: libapr
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- ./buildconf
+configure-commands:
+- |
+ ./configure \
+ --prefix "$PREFIX" \
+ --disable-static \
+ --with-installbuilddir=/usr/share/apr-1/build
+post-install-commands:
+- |
+ # Install files required for apr-util
+ for file in find_apr.m4 apr_common.m4 install.sh gen-build.py \
+ get-version.sh config.guess config.sub
+ do
+ cp build/$file "$DESTDIR/$PREFIX"/share/apr-1/build/"$file"
+ done
+ # Create a symlink in the build directory to the include directory
+ ln -sf /usr/include/apr-1 "$DESTDIR/$PREFIX"/share/apr-1/build/
diff --git a/strata/lorry/libserf.morph b/strata/lorry/libserf.morph
new file mode 100644
index 00000000..d4bb415d
--- /dev/null
+++ b/strata/lorry/libserf.morph
@@ -0,0 +1,6 @@
+name: libserf
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- cp /usr/share/automake*/config.guess build
+- cp /usr/share/automake*/config.sub build
diff --git a/strata/lorry/lorry.morph b/strata/lorry/lorry.morph
new file mode 100644
index 00000000..6b8cb355
--- /dev/null
+++ b/strata/lorry/lorry.morph
@@ -0,0 +1,3 @@
+name: lorry
+kind: chunk
+build-system: python-distutils
diff --git a/strata/lorry/mercurial-tarball.morph b/strata/lorry/mercurial-tarball.morph
new file mode 100644
index 00000000..03264f56
--- /dev/null
+++ b/strata/lorry/mercurial-tarball.morph
@@ -0,0 +1,6 @@
+name: mercurial-tarball
+kind: chunk
+build-commands:
+- make build PREFIX="$PREFIX"
+install-commands:
+- make install-bin PREFIX="$PREFIX" DESTDIR="$DESTDIR"
diff --git a/strata/lorry/neon.morph b/strata/lorry/neon.morph
new file mode 100644
index 00000000..19f8e83f
--- /dev/null
+++ b/strata/lorry/neon.morph
@@ -0,0 +1,8 @@
+name: neon
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh
+- ./configure --prefix="$PREFIX" --with-ssl
+install-commands:
+- make install-lib install-headers install-config DESTDIR="$DESTDIR"
diff --git a/strata/lorry/perl-dbi-tarball.morph b/strata/lorry/perl-dbi-tarball.morph
new file mode 100644
index 00000000..9eb3a537
--- /dev/null
+++ b/strata/lorry/perl-dbi-tarball.morph
@@ -0,0 +1,5 @@
+name: perl-dbi-tarball
+kind: chunk
+build-system: cpan
+build-commands:
+- make -j1
diff --git a/strata/lorry/subversion-tarball.morph b/strata/lorry/subversion-tarball.morph
new file mode 100644
index 00000000..8fd1bc08
--- /dev/null
+++ b/strata/lorry/subversion-tarball.morph
@@ -0,0 +1,12 @@
+name: subversion-tarball
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- LIBTOOL_CONFIG=/usr/share/libtool/build-aux/ ./autogen.sh
+configure-commands:
+- python gen-make.py build.conf
+- ./configure --prefix="$PREFIX" --without-berkeley-db
+install-commands:
+- make install DESTDIR="$DESTDIR"
+- make swig-pl
+- make install-swig-pl DESTDIR="$DESTDIR"
diff --git a/strata/lorry/swig.morph b/strata/lorry/swig.morph
new file mode 100644
index 00000000..8a7d51b6
--- /dev/null
+++ b/strata/lorry/swig.morph
@@ -0,0 +1,7 @@
+name: swig
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- ./autogen.sh
+configure-commands:
+- ./configure --prefix="$PREFIX" --disable-ccache
diff --git a/strata/lua53.morph b/strata/lua53.morph
new file mode 100644
index 00000000..5cea88fb
--- /dev/null
+++ b/strata/lua53.morph
@@ -0,0 +1,11 @@
+name: lua53
+kind: stratum
+description: Interpreter for the lua 5.3 scripting language.
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: lua53
+ morph: strata/lua53/lua53.morph
+ repo: upstream:lua-github
+ ref: a7d799273a401040945826dbe1bd9edb8dab0662
+ unpetrify-ref: baserock/5.3.2
diff --git a/strata/lua53/lua53.morph b/strata/lua53/lua53.morph
new file mode 100644
index 00000000..c8c43d64
--- /dev/null
+++ b/strata/lua53/lua53.morph
@@ -0,0 +1,9 @@
+name: lua53
+kind: chunk
+build-system: manual
+build-commands:
+- make linux
+install-commands:
+- make INSTALL_TOP="$DESTDIR/$PREFIX" install
+- mkdir -p "$DESTDIR/$PREFIX/lib/pkgconfig/"
+- cp lua.pc "$DESTDIR/$PREFIX/lib/pkgconfig/"
diff --git a/strata/mesa-common.morph b/strata/mesa-common.morph
new file mode 100644
index 00000000..79215bdc
--- /dev/null
+++ b/strata/mesa-common.morph
@@ -0,0 +1,22 @@
+name: mesa-common
+kind: stratum
+build-depends:
+- morph: strata/foundation.morph
+- morph: strata/llvm-common.morph
+- morph: strata/libdrm-common.morph
+- morph: strata/wayland-generic.morph
+- morph: strata/python2-core.morph
+- morph: strata/x-common.morph
+chunks:
+- name: mesa
+ morph: strata/mesa-common/mesa.morph
+ repo: upstream:mesa
+ ref: f60875e211388e299724063af40c01738cc5d819
+ unpetrify-ref: mesa-17.1.3
+- name: libepoxy
+ repo: upstream:libepoxy
+ ref: e2c33af5bfcfc9d168f9e776156dd47c33f428b3
+ unpetrify-ref: v1.3.1
+ build-system: autotools
+ build-depends:
+ - mesa
diff --git a/strata/mesa-common/mesa.morph b/strata/mesa-common/mesa.morph
new file mode 100644
index 00000000..abd58b87
--- /dev/null
+++ b/strata/mesa-common/mesa.morph
@@ -0,0 +1,24 @@
+name: mesa
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ cpu=$(echo $TARGET | cut -d '-' -f 1)
+ case "$cpu" in
+ arm*)
+ DRIDRIVERS=no
+ GALLIUMDRIVERS=nouveau,freedreno,svga,swrast,vc4
+ VULKANDRIVERS=no
+ ;;
+ *)
+ DRIDRIVERS=yes
+ GALLIUMDRIVERS=r300,svga,swrast,virgl,swr
+ VULKANDRIVERS=intel
+ ;;
+ esac
+ ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc \
+ --enable-gles2 \
+ --with-egl-platforms=drm,wayland,x11 \
+ --with-vulkan-drivers="$VULKANDRIVERS" \
+ --with-gallium-drivers="$GALLIUMDRIVERS" \
+ --with-dri-drivers="$DRIDRIVERS"
diff --git a/strata/mesa-demos-common.morph b/strata/mesa-demos-common.morph
new file mode 100644
index 00000000..eb20c822
--- /dev/null
+++ b/strata/mesa-demos-common.morph
@@ -0,0 +1,37 @@
+name: mesa-demos-common
+kind: stratum
+build-depends:
+- morph: strata/mesa-common.morph
+chunks:
+- name: xorg-util-makedepend
+ repo: upstream:xorg-util-makedepend
+ ref: 30859adfd6a6523a92a637ca26bd61ce59680a1b
+ unpetrify-ref: makedepend-1.0.5
+ build-system: autotools
+- name: glu
+ repo: upstream:glu
+ ref: 069211570c32a8d5848e127975a2943e9d8fc6b9
+ unpetrify-ref: glu-9.0.0-2-g0692115
+ build-system: autotools
+- name: glut
+ repo: upstream:glut
+ ref: ee89e9aeb49604b036e06f1df6478d32006b30cd
+ unpetrify-ref: master
+ build-system: autotools
+ build-depends:
+ - glu
+ - xorg-util-makedepend
+- name: glew
+ morph: strata/mesa-demos-common/glew.morph
+ repo: upstream:glew-tarball
+ ref: 706e5d657396530bbd3d91a4e03b5f6b4cb6fa6f
+ unpetrify-ref: glew-1.13.0
+- name: mesa-demos
+ build-system: autotools
+ repo: upstream:mesa-demos
+ ref: 887e30bd1cc727150dc29556f228a94ef42dc33c
+ unpetrify-ref: mesa-demos-8.3.0
+ build-depends:
+ - glu
+ - glew
+ - glut
diff --git a/strata/mesa-demos-common/glew.morph b/strata/mesa-demos-common/glew.morph
new file mode 100644
index 00000000..202e00a2
--- /dev/null
+++ b/strata/mesa-demos-common/glew.morph
@@ -0,0 +1,6 @@
+name: glew
+kind: chunk
+build-system: manual
+install-commands:
+- make LIBDIR="/usr/lib"
+- make LIBDIR="/usr/lib" DESTDIR="$DESTDIR" install
diff --git a/strata/morph-utils.morph b/strata/morph-utils.morph
new file mode 100644
index 00000000..f713ba18
--- /dev/null
+++ b/strata/morph-utils.morph
@@ -0,0 +1,54 @@
+name: morph-utils
+kind: stratum
+build-depends:
+- morph: strata/core.morph
+- morph: strata/ostree-core.morph
+- morph: strata/python-cliapp.morph
+- morph: strata/python2-core.morph
+- morph: strata/python-pygobject.morph
+- morph: strata/python-wsgi.morph
+chunks:
+- name: python-ttystatus
+ morph: strata/morph-utils/python-ttystatus.morph
+ repo: upstream:python-ttystatus
+ ref: 47d871216cea6ce3b9d6efd70e9a0f38ab8604f0
+ unpetrify-ref: baserock/morph
+- name: git-fat
+ morph: strata/tools/git-fat.morph
+ repo: upstream:git-fat
+ ref: 208f88d0f0ef04c25e8a231979eb0083f57b1610
+ unpetrify-ref: baserock/morph
+- name: pyfilesystem
+ morph: strata/morph-utils/pyfilesystem.morph
+ repo: upstream:pyfilesystem
+ ref: 821f7db1ce3a3e1ac53fa514ddacbc2871eac0f6
+ unpetrify-ref: baserock/morph
+- name: cmdtest
+ morph: strata/morph-utils/cmdtest.morph
+ repo: upstream:cmdtest
+ ref: ac91791842c6e7e6eda3213916af413255999c7b
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - python-ttystatus
+- name: pylru
+ repo: upstream:python-packages/pylru
+ ref: 221dd259f5c34562c835611d1cf62384b9019da4
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: morph
+ repo: baserock:baserock/morph
+ ref: 74e8d1b9aeb47d957d526250784d2c0087e59bf9
+ unpetrify-ref: master
+ build-system: python-distutils
+ build-depends:
+ - cmdtest
+ - pyfilesystem
+ - pylru
+
+# This chunk isn't required to use Morph, but is required to do automated
+# migrations within the definitions.git repo.
+- name: ruamel.yaml
+ repo: upstream:python-packages/ruamel.yaml
+ ref: f3de88b82bf5e3902c44f6c30aed065e56626ee6
+ unpetrify-ref: 0.10.5
+ build-system: python-distutils
diff --git a/strata/morph-utils/cmdtest.morph b/strata/morph-utils/cmdtest.morph
new file mode 100644
index 00000000..3e1c71c6
--- /dev/null
+++ b/strata/morph-utils/cmdtest.morph
@@ -0,0 +1,6 @@
+name: cmdtest
+kind: chunk
+build-commands:
+- python setup.py build
+install-commands:
+- python setup.py install --prefix=/usr --root "$DESTDIR"
diff --git a/strata/morph-utils/pyfilesystem.morph b/strata/morph-utils/pyfilesystem.morph
new file mode 100644
index 00000000..a4931dfa
--- /dev/null
+++ b/strata/morph-utils/pyfilesystem.morph
@@ -0,0 +1,6 @@
+name: pyfilesystem
+kind: chunk
+build-commands:
+- python setup.py build
+install-commands:
+- python setup.py install --prefix="$PREFIX" --root "$DESTDIR"
diff --git a/strata/morph-utils/python-ttystatus.morph b/strata/morph-utils/python-ttystatus.morph
new file mode 100644
index 00000000..e45ef7a8
--- /dev/null
+++ b/strata/morph-utils/python-ttystatus.morph
@@ -0,0 +1,6 @@
+name: python-ttystatus
+kind: chunk
+build-commands:
+- python setup.py build
+install-commands:
+- python setup.py install --prefix=/usr --root "$DESTDIR"
diff --git a/strata/mtd-utilities.morph b/strata/mtd-utilities.morph
new file mode 100644
index 00000000..67ff09a8
--- /dev/null
+++ b/strata/mtd-utilities.morph
@@ -0,0 +1,11 @@
+name: mtd-utilities
+kind: stratum
+build-depends:
+- morph: strata/foundation.morph
+- morph: strata/core.morph
+chunks:
+- name: mtd-utils
+ morph: strata/mtd-utilities/mtd-utils.morph
+ repo: upstream:mtd-utils
+ ref: 9f107132a6a073cce37434ca9cda6917dd8d866b
+ unpetrify-ref: v1.5.1
diff --git a/strata/mtd-utilities/mtd-utils.morph b/strata/mtd-utilities/mtd-utils.morph
new file mode 100644
index 00000000..59dfcc68
--- /dev/null
+++ b/strata/mtd-utilities/mtd-utils.morph
@@ -0,0 +1,6 @@
+name: mtd-utils
+kind: chunk
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/strata/multimedia-common.morph b/strata/multimedia-common.morph
new file mode 100644
index 00000000..3df50d0d
--- /dev/null
+++ b/strata/multimedia-common.morph
@@ -0,0 +1,64 @@
+name: multimedia-common
+kind: stratum
+description: Mutimedia Libraries
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: opus
+ repo: upstream:opus
+ ref: 655cc54c564b84ef2827f0b2152ce3811046201e
+ unpetrify-ref: v1.1.2
+ build-system: autotools
+- name: ogg
+ repo: upstream:ogg-git
+ ref: 9b2ba419aecb4a1c97114545d57174593dc13111
+ unpetrify-ref: master
+ build-system: autotools
+- name: libvorbis
+ repo: upstream:libvorbis-git
+ ref: 7187e7a48f0c3ba32cc080f6bc3d921fe4ec6cc2
+ unpetrify-ref: master
+ build-system: autotools
+ build-depends:
+ - ogg
+- name: tremor
+ repo: upstream:tremor
+ ref: b56ffce0c0773ec5ca04c466bc00b1bbcaf65aef
+ unpetrify-ref: master
+ build-system: autotools
+ build-depends:
+ - ogg
+- name: flac
+ repo: upstream:flac
+ ref: 6ced857c253d5da286bf31adfd74a627aaa43c77
+ unpetrify-ref: master
+ build-system: autotools
+ build-depends:
+ - ogg
+- name: libmad
+ morph: strata/multimedia-common/libmad.morph
+ repo: upstream:libmad-tarball
+ ref: f2b21c41aef22e81b605afe96e1e6ef1bea0cfdc
+ unpetrify-ref: baserock/0.15.1b-gstreamer-sdk-fork
+- name: yasm
+ morph: strata/multimedia-common/yasm.morph
+ repo: upstream:yasm
+ ref: fefefe262eb29081f0bcb4d48f2d476ce5730562
+ unpetrify-ref: baserock/morph
+- name: libvpx
+ morph: strata/multimedia-common/libvpx.morph
+ repo: upstream:libvpx
+ ref: cbecf57f3e0d85a7b7f97f3ab7c507f6fe640a93
+ unpetrify-ref: v1.5.0
+ build-depends:
+ - yasm
+- name: libmpeg2
+ morph: strata/multimedia-common/libmpeg2.morph
+ repo: upstream:libmpeg2-tarball
+ ref: d1e80dc431815df3ac6eeed654eeccaf8d6beea7
+ unpetrify-ref: libmpeg2-0.5.1
+- name: orc
+ morph: strata/multimedia-common/orc.morph
+ repo: upstream:orc
+ ref: 831886d1f70d3cc21a913b2e335da38af4cae524
+ unpetrify-ref: orc-0.4.25
diff --git a/strata/multimedia-common/libmad.morph b/strata/multimedia-common/libmad.morph
new file mode 100644
index 00000000..5e9b1987
--- /dev/null
+++ b/strata/multimedia-common/libmad.morph
@@ -0,0 +1,10 @@
+name: libmad
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ OPTS=
+ case $MORPH_ARCH in
+ mips64*) ARCH_FLAGS="--enable-fpm=64bit" ;;
+ esac
+ ./configure --prefix="$PREFIX" --sysconfdir=/etc $ARCH_FLAGS
diff --git a/strata/multimedia-common/libmpeg2.morph b/strata/multimedia-common/libmpeg2.morph
new file mode 100644
index 00000000..6e55e59f
--- /dev/null
+++ b/strata/multimedia-common/libmpeg2.morph
@@ -0,0 +1,6 @@
+name: libmpeg2
+kind: chunk
+build-system: autotools
+configure-commands:
+# Explicitly just configure, avoid running the boostrap.sh script
+- ./configure --prefix="$PREFIX"
diff --git a/strata/multimedia-common/libvpx.morph b/strata/multimedia-common/libvpx.morph
new file mode 100644
index 00000000..011642f4
--- /dev/null
+++ b/strata/multimedia-common/libvpx.morph
@@ -0,0 +1,14 @@
+name: libvpx
+kind: chunk
+build-system: autotools
+configure-commands:
+# Workarond upstream bug: https://bugs.chromium.org/p/webm/issues/detail?id=1121
+- |
+ case "$MORPH_ARCH" in
+ armv7lhf)
+ CROSS=" " ./configure --prefix="$PREFIX" --target=armv7-linux-gcc
+ ;;
+ *)
+ ./configure --prefix="$PREFIX"
+ ;;
+ esac
diff --git a/strata/multimedia-common/orc.morph b/strata/multimedia-common/orc.morph
new file mode 100644
index 00000000..97a5da9d
--- /dev/null
+++ b/strata/multimedia-common/orc.morph
@@ -0,0 +1,5 @@
+name: orc
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --disable-gtk-doc
diff --git a/strata/multimedia-common/yasm.morph b/strata/multimedia-common/yasm.morph
new file mode 100644
index 00000000..437ae97d
--- /dev/null
+++ b/strata/multimedia-common/yasm.morph
@@ -0,0 +1,4 @@
+name: yasm
+kind: chunk
+max-jobs: 1
+build-system: autotools
diff --git a/strata/multimedia-gstreamer-openmax-generic.morph b/strata/multimedia-gstreamer-openmax-generic.morph
new file mode 100644
index 00000000..1a006971
--- /dev/null
+++ b/strata/multimedia-gstreamer-openmax-generic.morph
@@ -0,0 +1,14 @@
+name: multimedia-gstreamer-openmax-generic
+kind: stratum
+description: GStreamer OpenMAX IL wrapper plugin
+build-depends:
+- morph: strata/multimedia-gstreamer.morph
+chunks:
+- name: gst-omx
+ morph: strata/multimedia-gstreamer-openmax-generic/gst-omx.morph
+ repo: upstream:gst-omx
+ ref: b4c7c726ef443cf8a89df26026706e391846bb4a
+ unpetrify-ref: 1.2.0
+ submodules:
+ common:
+ url: upstream:gstreamer-common
diff --git a/strata/multimedia-gstreamer-openmax-generic/gst-omx.morph b/strata/multimedia-gstreamer-openmax-generic/gst-omx.morph
new file mode 100644
index 00000000..3f7be605
--- /dev/null
+++ b/strata/multimedia-gstreamer-openmax-generic/gst-omx.morph
@@ -0,0 +1,7 @@
+name: gst-omx
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX"
+ --disable-gtk-doc
+ --with-omx-target=generic
diff --git a/strata/multimedia-gstreamer.morph b/strata/multimedia-gstreamer.morph
new file mode 100644
index 00000000..debf9610
--- /dev/null
+++ b/strata/multimedia-gstreamer.morph
@@ -0,0 +1,63 @@
+name: multimedia-gstreamer
+kind: stratum
+description: GStreamer multimedia components
+build-depends:
+- morph: strata/libsoup-common.morph
+- morph: strata/multimedia-common.morph
+- morph: strata/mesa-common.morph
+- morph: strata/graphics-common.morph
+- morph: strata/sound-server-pulseaudio.morph
+chunks:
+- name: gstreamer
+ repo: upstream:gstreamer
+ ref: dd7e23e2b2b599597e60a2c56e1a8d1663511bcd
+ unpetrify-ref: 1.8.3
+ build-system: autotools
+ submodules:
+ common:
+ url: upstream:gstreamer-common
+- name: gstreamer-plugins-base
+ repo: upstream:gstreamer-plugins-base
+ ref: 793ef9e67127bd77175909b32b5eedf1b4d370a1
+ unpetrify-ref: 1.8.3
+ build-system: autotools
+ build-depends:
+ - gstreamer
+ submodules:
+ common:
+ url: upstream:gstreamer-common
+- name: gstreamer-plugins-good
+ repo: upstream:gstreamer-plugins-good
+ ref: 5b83b10999fa588d62e9043ff29eb0d07b2a42c8
+ unpetrify-ref: 1.8.3
+ build-system: autotools
+ build-depends:
+ - gstreamer
+ - gstreamer-plugins-base
+ submodules:
+ common:
+ url: upstream:gstreamer-common
+- name: gstreamer-plugins-bad
+ repo: upstream:gstreamer-plugins-bad
+ ref: ab536a68db84dd9543993ac0dff255b1885f8fee
+ unpetrify-ref: 1.8.3
+ build-system: autotools
+ build-depends:
+ - gstreamer
+ - gstreamer-plugins-base
+ submodules:
+ common:
+ url: upstream:gstreamer-common
+- name: gst-libav
+ morph: strata/multimedia-gstreamer/gst-libav.morph
+ repo: upstream:gst-libav
+ ref: 8612bf25fbc57b4fb867bf5d2b824250f5e015f1
+ unpetrify-ref: 1.8.3
+ build-depends:
+ - gstreamer
+ - gstreamer-plugins-base
+ submodules:
+ gst-libs/ext/libav:
+ url: upstream:ffmpeg
+ common:
+ url: upstream:gstreamer-common
diff --git a/strata/multimedia-gstreamer/gst-libav.morph b/strata/multimedia-gstreamer/gst-libav.morph
new file mode 100644
index 00000000..2d9c49ad
--- /dev/null
+++ b/strata/multimedia-gstreamer/gst-libav.morph
@@ -0,0 +1,5 @@
+name: gst-libav
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --disable-gtk-doc
diff --git a/strata/multimedia-hardware-codecs-x86.morph b/strata/multimedia-hardware-codecs-x86.morph
new file mode 100644
index 00000000..9f463d3c
--- /dev/null
+++ b/strata/multimedia-hardware-codecs-x86.morph
@@ -0,0 +1,31 @@
+name: multimedia-hardware-codecs-x86
+kind: stratum
+description: Hardware accelerated codecs for x86
+build-depends:
+- morph: strata/multimedia-gstreamer.morph
+- morph: strata/libdrm-common.morph
+- morph: strata/wayland-generic.morph
+- morph: strata/x-common.morph
+chunks:
+- name: libva
+ repo: upstream:libva
+ ref: 304bc13e244f9d5e185a0d8a87fcf3a3eb5a8bd8
+ unpetrify-ref: libva-1.6.2
+ build-system: autotools
+- name: libva-intel-driver
+ repo: upstream:libva-intel-driver
+ ref: 683edeedfdfd769807c18ed3797223f82b7aa0cc
+ unpetrify-ref: 1.6.2
+ build-system: autotools
+ build-depends:
+ - libva
+- name: gstreamer-vaapi
+ repo: upstream:gstreamer-vaapi
+ ref: c1f5efee1d0d286fd804c5456f43f9b7ecfce35b
+ unpetrify-ref: 1.8.3
+ build-system: autotools
+ build-depends:
+ - libva
+ submodules:
+ common:
+ url: upstream:gstreamer-common
diff --git a/strata/navigation.morph b/strata/navigation.morph
new file mode 100644
index 00000000..669f4084
--- /dev/null
+++ b/strata/navigation.morph
@@ -0,0 +1,11 @@
+name: navigation
+kind: stratum
+description: Stratum that provides navigation libraries / services
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: navit
+ morph: strata/navigation/navit.morph
+ repo: upstream:navit-svn
+ ref: 358812af2c27c4abe324beb205e6d156b96fb1ea
+ unpetrify-ref: master
diff --git a/strata/navigation/navit.morph b/strata/navigation/navit.morph
new file mode 100644
index 00000000..2bdb09d5
--- /dev/null
+++ b/strata/navigation/navit.morph
@@ -0,0 +1,5 @@
+name: navit
+kind: chunk
+build-system: cmake
+configure-commands:
+- cmake . -DSAMPLE_MAP=n
diff --git a/strata/network-security.morph b/strata/network-security.morph
new file mode 100644
index 00000000..a80c22f0
--- /dev/null
+++ b/strata/network-security.morph
@@ -0,0 +1,47 @@
+name: network-security
+kind: stratum
+description: This stratum provides SSL/TLS libraries
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: nspr
+ morph: strata/network-security/nspr.morph
+ repo: upstream:nspr-hg
+ ref: 996918a8942606b640279bcd69ef4fec18e28844
+ unpetrify-ref: NSPR_4_12_RTM
+- name: nss
+ morph: strata/network-security/nss.morph
+ repo: upstream:nss
+ ref: 711f0416e5f43f6514ad3c169080aed89054d44b
+ unpetrify-ref: baserock/nss-3.31
+ build-depends:
+ - nspr
+- name: libtasn1
+ morph: strata/network-security/libtasn1.morph
+ repo: upstream:libtasn1
+ ref: 4bc67882e72929732b1d9cccc73e606f3a44f542
+ unpetrify-ref: libtasn1_4_12
+- name: p11-kit
+ morph: strata/network-security/p11-kit.morph
+ repo: upstream:p11-kit
+ ref: ec9e2450bafa1cda47525b38a28c8f981f43c1e1
+ unpetrify-ref: 0.23.1
+ build-depends:
+ - libtasn1
+- name: nettle
+ morph: strata/network-security/nettle.morph
+ repo: upstream:nettle
+ ref: 22185d4efbd4c9c9afde9cba21eef0d550e88fab
+ unpetrify-ref: nettle_3.2_release_20160128
+- name: gnutls
+ morph: strata/network-security/gnutls.morph
+ repo: upstream:gnutls
+ ref: ae8ac9d420e9bd95eba2ce9f990dcd001d83ca42
+ unpetrify-ref: gnutls_3_4_14
+ build-depends:
+ - nettle
+ - libtasn1
+ - p11-kit
+ submodules:
+ devel/openssl:
+ url: upstream:openssl-new
diff --git a/strata/network-security/gnutls.morph b/strata/network-security/gnutls.morph
new file mode 100644
index 00000000..f31cbf12
--- /dev/null
+++ b/strata/network-security/gnutls.morph
@@ -0,0 +1,6 @@
+name: gnutls
+kind: chunk
+build-system: autotools
+configure-commands:
+- make autoreconf
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc --with-nettle-mini --disable-tools --disable-doc
diff --git a/strata/network-security/libtasn1.morph b/strata/network-security/libtasn1.morph
new file mode 100644
index 00000000..c4f378f2
--- /dev/null
+++ b/strata/network-security/libtasn1.morph
@@ -0,0 +1,6 @@
+name: libtasn1
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+# Add ChangeLog so autoreconf succeeds
+- touch ChangeLog
diff --git a/strata/network-security/nettle.morph b/strata/network-security/nettle.morph
new file mode 100644
index 00000000..80bdbf51
--- /dev/null
+++ b/strata/network-security/nettle.morph
@@ -0,0 +1,6 @@
+name: nettle
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./.bootstrap
+- ./configure --prefix="$PREFIX" --libdir="$PREFIX"/lib --sysconfdir=/etc --disable-documentation --enable-mini-gmp
diff --git a/strata/network-security/nspr.morph b/strata/network-security/nspr.morph
new file mode 100644
index 00000000..078486e7
--- /dev/null
+++ b/strata/network-security/nspr.morph
@@ -0,0 +1,12 @@
+name: nspr
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ case "$MORPH_ARCH" in
+ x86_64|ppc64)
+ EXTRA_ARGS="--enable-64bit";;
+ *)
+ EXTRA_ARGS="";;
+ esac
+ ./configure --prefix="$PREFIX" --sysconfdir=/etc --with-mozilla --with-pthreads $EXTRA_ARGS
diff --git a/strata/network-security/nss.morph b/strata/network-security/nss.morph
new file mode 100644
index 00000000..2103622c
--- /dev/null
+++ b/strata/network-security/nss.morph
@@ -0,0 +1,32 @@
+name: nss
+kind: chunk
+max-jobs: 1
+build-system: manual
+build-commands:
+- |
+ case "$MORPH_ARCH" in
+ x86_64|ppc64)
+ export USE_64=1;;
+ *)
+ ;;
+ esac
+ cd nss
+ make BUILD_OPT=1 \
+ NSPR_INCLUDE_DIR=/usr/include/nspr \
+ USE_SYSTEM_ZLIB=1 \
+ ZLIB_LIBS=-lz \
+ NSS_USE_SYSTEM_SQLITE=1
+install-commands:
+- install -d "$DESTDIR"/usr/lib/pkgconfig
+- install -v -m755 dist/Linux*/lib/*.so "$DESTDIR"/usr/lib
+- install -v -m644 dist/Linux*/lib/*.chk "$DESTDIR"/usr/lib
+- install -v -m644 dist/Linux*/lib/libcrmf.a "$DESTDIR"/usr/lib
+- install -v -m755 -d "$DESTDIR"/usr/include/nss
+- cp -v -RL dist/public/nss/* "$DESTDIR"/usr/include/nss
+- cp -v -RL dist/private/nss/* "$DESTDIR"/usr/include/nss
+- chmod -v 644 "$DESTDIR"/usr/include/nss/*
+- install -d "$DESTDIR"/usr/bin
+- install -v -m755 dist/Linux*/bin/certutil "$DESTDIR"/usr/bin
+- install -v -m755 dist/Linux*/bin/nss-config "$DESTDIR"/usr/bin
+- install -v -m755 dist/Linux*/bin/pk12util "$DESTDIR"/usr/bin
+- install -v -m644 dist/Linux*/lib/pkgconfig/nss.pc "$DESTDIR"/usr/lib/pkgconfig
diff --git a/strata/network-security/p11-kit.morph b/strata/network-security/p11-kit.morph
new file mode 100644
index 00000000..8f88969a
--- /dev/null
+++ b/strata/network-security/p11-kit.morph
@@ -0,0 +1,5 @@
+name: p11-kit
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --without-trust-paths
diff --git a/strata/nfs.morph b/strata/nfs.morph
new file mode 100644
index 00000000..e05d585c
--- /dev/null
+++ b/strata/nfs.morph
@@ -0,0 +1,31 @@
+name: nfs
+kind: stratum
+description: NFS utilities
+build-depends:
+- morph: strata/foundation.morph
+chunks:
+- name: libevent
+ repo: upstream:libevent
+ ref: 0b49ae34594533daa82c06a506078de9e336a013
+ unpetrify-ref: release-2.1.5-beta
+ build-system: autotools
+- name: ti-rpc
+ morph: strata/nfs/ti-rpc.morph
+ repo: upstream:ti-rpc
+ ref: c5a7a19070e74115fc9c26aa6f3dfec1da220c1f
+ unpetrify-ref: baserock/master
+- name: rpcbind
+ morph: strata/nfs/rpcbind.morph
+ repo: upstream:rpcbind
+ ref: aa3ac0d86c258d3e355ae59df31a96da795ecdfa
+ unpetrify-ref: baserock/master
+ build-depends:
+ - ti-rpc
+- name: nfs-utils
+ morph: strata/nfs/nfs-utils.morph
+ repo: upstream:nfs-utils
+ ref: 0da9f20a22bb32b2da6b587b4e85dafde087c0f7
+ unpetrify-ref: baserock/master
+ build-depends:
+ - libevent
+ - ti-rpc
diff --git a/strata/nfs/nfs-utils.morph b/strata/nfs/nfs-utils.morph
new file mode 100644
index 00000000..8116a9f4
--- /dev/null
+++ b/strata/nfs/nfs-utils.morph
@@ -0,0 +1,13 @@
+name: nfs-utils
+kind: chunk
+build-system: autotools
+configure-commands:
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --prefix="$PREFIX" --disable-nfsv4 --disable-nfsv41 --disable-gss --with-rpcgen=internal
+ --without-tcp-wrappers
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- mkdir -p "$DESTDIR"/lib/systemd/system
+- install -m644 proc-fs-nfsd.mount "$DESTDIR"/lib/systemd/system
+- install -m644 nfs-mountd.service "$DESTDIR"/lib/systemd/system
+- install -m644 nfs-server.service "$DESTDIR"/lib/systemd/system
diff --git a/strata/nfs/rpcbind.morph b/strata/nfs/rpcbind.morph
new file mode 100644
index 00000000..0ca929dc
--- /dev/null
+++ b/strata/nfs/rpcbind.morph
@@ -0,0 +1,11 @@
+name: rpcbind
+kind: chunk
+build-system: autotools
+configure-commands:
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --prefix="$PREFIX" --with-rpcuser=nobody --enable-warmstarts
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- mkdir -p "$DESTDIR"/lib/systemd/system
+- install -m644 rpcbind.service "$DESTDIR"/lib/systemd/system
+- install -m644 rpcbind.socket "$DESTDIR"/lib/systemd/system
diff --git a/strata/nfs/tcp-wrappers.morph b/strata/nfs/tcp-wrappers.morph
new file mode 100644
index 00000000..c68671f6
--- /dev/null
+++ b/strata/nfs/tcp-wrappers.morph
@@ -0,0 +1,9 @@
+name: tcp-wrappers
+kind: chunk
+build-commands:
+- make MAJOR=0 MINOR=7 REL=6 linux
+install-commands:
+- mkdir -p "$DESTDIR"/"$PREFIX"/include
+- install -p -m644 tcpd.h "$DESTDIR"/"$PREFIX"/include
+- mkdir -p "$DESTDIR"/"$PREFIX"/lib
+- cp -a libwrap.so* "$DESTDIR"/"$PREFIX"/lib
diff --git a/strata/nfs/ti-rpc.morph b/strata/nfs/ti-rpc.morph
new file mode 100644
index 00000000..3fb91e1f
--- /dev/null
+++ b/strata/nfs/ti-rpc.morph
@@ -0,0 +1,6 @@
+name: ti-rpc
+kind: chunk
+build-system: autotools
+configure-commands:
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc
diff --git a/strata/nodejs.morph b/strata/nodejs.morph
new file mode 100644
index 00000000..21348105
--- /dev/null
+++ b/strata/nodejs.morph
@@ -0,0 +1,12 @@
+name: nodejs
+kind: stratum
+description: Stratum for nodejs related stuff
+build-depends:
+- morph: strata/core.morph
+- morph: strata/python2-core.morph
+chunks:
+- name: node
+ morph: strata/nodejs/node.morph
+ repo: upstream:node-new
+ ref: 01461afb0aaf0e4b763e423884b383a35eb69c04
+ unpetrify-ref: v8.1.3
diff --git a/strata/nodejs/node.morph b/strata/nodejs/node.morph
new file mode 100644
index 00000000..be86ed86
--- /dev/null
+++ b/strata/nodejs/node.morph
@@ -0,0 +1,9 @@
+name: node
+kind: chunk
+build-system: manual
+configure-commands:
+- ./configure --prefix="$PREFIX"
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/strata/openbmc.morph b/strata/openbmc.morph
new file mode 100644
index 00000000..b1309a2a
--- /dev/null
+++ b/strata/openbmc.morph
@@ -0,0 +1,22 @@
+name: openbmc
+kind: stratum
+description: OpenBMC components
+build-depends:
+- morph: strata/build-essential.morph
+- morph: strata/core.morph
+chunks:
+- name: i2c-tools
+ morph: strata/openbmc/i2c-tools.morph
+ repo: upstream:i2c-tools
+ ref: 187dd637f7789c4cb12dfe2ba13f6e01d2a3c698
+ unpetrify-ref: V3-1-1
+- name: lm_sensors
+ morph: strata/openbmc/lm_sensors.morph
+ repo: upstream:lm-sensors
+ ref: d9983967a89382f64c65db67026f85f073ef9b74
+ unpetrify-ref: master
+- name: isc-dhcp
+ repo: upstream:isc-dhcp-tarball
+ morph: strata/openbmc/isc-dhcp.morph
+ ref: f800382616186a5d30e28d8b2c51e97a9a8360f2
+ unpetrify-ref: master
diff --git a/strata/openbmc/i2c-tools.morph b/strata/openbmc/i2c-tools.morph
new file mode 100644
index 00000000..5fba3b0a
--- /dev/null
+++ b/strata/openbmc/i2c-tools.morph
@@ -0,0 +1,16 @@
+name: i2c-tools
+kind: chunk
+build-commands:
+- make -C eepromer && make
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX"/bin
+- |
+ i2ctools="i2cdetect i2cdump i2cget i2cset"
+ for f in ${i2ctools}; do
+ install -m 755 tools/${f} "$DESTDIR$PREFIX"/bin/${f}
+ done
+- |
+ eepromtools="eepromer eeprom eeprog"
+ for f in ${eepromtools}; do
+ install -m 755 eepromer/${f} "$DESTDIR$PREFIX"/bin/${f}
+ done
diff --git a/strata/openbmc/isc-dhcp.morph b/strata/openbmc/isc-dhcp.morph
new file mode 100644
index 00000000..5ee2e66b
--- /dev/null
+++ b/strata/openbmc/isc-dhcp.morph
@@ -0,0 +1,3 @@
+name: isc-dhcp
+kind: chunk
+build-system: autotools
diff --git a/strata/openbmc/lm_sensors.morph b/strata/openbmc/lm_sensors.morph
new file mode 100644
index 00000000..27ee10d5
--- /dev/null
+++ b/strata/openbmc/lm_sensors.morph
@@ -0,0 +1,7 @@
+name: lm_sensors
+kind: chunk
+build-commands:
+- make user PROG_EXTRA="sensors"
+install-commands:
+- make DESTDIR="$DESTDIR" PREFIX="$PREFIX" install
+# TODO: If we need sensord too, we'll need rrdtool as a dependency and install instructions for sensord components
diff --git a/strata/openstack-clients.morph b/strata/openstack-clients.morph
new file mode 100644
index 00000000..9b0b8337
--- /dev/null
+++ b/strata/openstack-clients.morph
@@ -0,0 +1,154 @@
+name: openstack-clients
+kind: stratum
+description: Stratum with all the OpenStack clients and their dependencies.
+build-depends:
+- morph: strata/openstack-common.morph
+chunks:
+- name: warlock
+ repo: upstream:warlock
+ ref: 408ccb82347aabf3dc7cf6eccbd2ed2475cb0d60
+ unpetrify-ref: 1.1.0
+ build-system: python-distutils
+- name: python-keystoneclient
+ repo: upstream:openstack/python-keystoneclient
+ ref: 8fa6b6f0b5e95493342ce71489d04f73db2418b8
+ unpetrify-ref: 1.3.1
+ build-system: python-distutils
+- name: python-glanceclient
+ repo: upstream:openstack/python-glanceclient
+ ref: b176c28bbdae3eb5b3280c1981ad2b3b255e234e
+ unpetrify-ref: 0.17.1
+ build-system: python-distutils
+ build-depends:
+ - python-keystoneclient
+ - warlock
+- name: python-novaclient
+ repo: upstream:openstack/python-novaclient
+ ref: e0f5072907a00d48a183dd8fc91a6cf6038ca279
+ unpetrify-ref: 2.23.0
+ build-system: python-distutils
+ build-depends:
+ - python-keystoneclient
+- name: python-swiftclient
+ repo: upstream:openstack/python-swiftclient
+ ref: bb4d2ab59c4de9389667eeed255642f51e276f1e
+ unpetrify-ref: 2.3.1
+ build-system: python-distutils
+- name: python-troveclient
+ repo: upstream:openstack/python-troveclient
+ ref: e010a919750f07493afd42a4db867853b925bcbf
+ unpetrify-ref: 1.0.7
+ build-system: python-distutils
+- name: python-cinderclient
+ repo: upstream:openstack/python-cinderclient
+ ref: ac9b0913904c43f4bf12c8164324d6e6a55dc1ab
+ unpetrify-ref: 1.1.1
+ build-system: python-distutils
+ build-depends:
+ - python-keystoneclient
+- name: pyparsing
+ morph: unmaintained/strata/openstack-clients/pyparsing.morph
+ repo: upstream:python-packages/pyparsing.git
+ ref: 8062c76ab3958a570052124f17e71f3dd3ec2257
+ unpetrify-ref: pyparsing_2.0.3
+- name: cmd2
+ repo: upstream:python-packages/cmd2-hg
+ ref: c0d606bdeb88717ad92ba198bc9232615b83c4cd
+ unpetrify-ref: 0.6.7
+ build-system: python-distutils
+ build-depends:
+ - pyparsing
+- name: cliff
+ repo: upstream:openstack/cliff
+ ref: b703ad32743026d253f872caa1ff2cd727803d14
+ unpetrify-ref: 1.10.1
+ build-system: python-distutils
+ build-depends:
+ - cmd2
+ - pyparsing
+- name: tablib
+ morph: unmaintained/strata/openstack-clients/tablib.morph
+ repo: upstream:python-packages/tablib
+ ref: 1cc051f3e881289a8b51133c0c1ee73683b2d6fc
+ unpetrify-ref: v0.10.0
+- name: cliff-tablib
+ morph: unmaintained/strata/openstack-clients/cliff-tablib.morph
+ repo: upstream:python-packages/cliff-tablib
+ ref: a83bf47d7dfbb690dd53e189c532f0859898db04
+ unpetrify-ref: "1.1"
+- name: python-neutronclient
+ repo: upstream:openstack/python-neutronclient
+ ref: aa1215a5ad063b299d32ef319eb63d5210249a9b
+ unpetrify-ref: 2.4.0
+ build-system: python-distutils
+ build-depends:
+ - cliff
+ - python-keystoneclient
+- name: python-ceilometerclient
+ repo: upstream:openstack/python-ceilometerclient
+ ref: 127aadfd2b2daf9884ad7003e23440048e2efbd8
+ unpetrify-ref: 1.0.14
+ build-system: python-distutils
+ build-depends:
+ - python-keystoneclient
+- name: python-heatclient
+ repo: upstream:openstack/python-heatclient
+ ref: 6d528f005742263837d05250662bf6214a703da8
+ unpetrify-ref: 0.4.0
+ build-system: python-distutils
+ build-depends:
+ - python-keystoneclient
+- name: python-designateclient
+ repo: upstream:openstack/python-designateclient
+ ref: a900b41e4d8a9eb40e1812295ba16d773e2b9618
+ unpetrify-ref: 1.1.0
+ build-system: python-distutils
+ build-depends:
+ - cliff
+ - python-keystoneclient
+- name: python-barbicanclient
+ repo: upstream:openstack/python-barbicanclient
+ ref: 2919366867af335d59913764a55ca8e95569947d
+ unpetrify-ref: 3.0.3
+ build-system: python-distutils
+ build-depends:
+ - python-keystoneclient
+ - cliff
+- name: python-saharaclient
+ repo: upstream:openstack/python-saharaclient
+ ref: 319ceb6acf55382218dcd971367613aecb3e4afc
+ unpetrify-ref: 0.8.0
+ build-system: python-distutils
+ build-depends:
+ - python-keystoneclient
+- name: python-ironicclient
+ morph: unmaintained/strata/openstack-clients/python-ironicclient.morph
+ repo: upstream:openstack/python-ironicclient
+ ref: 4390a21663de3123fac306e9860624ba7deda0e6
+ unpetrify-ref: 0.4.1
+# Despite argparse being part of the Python 2.7's standard library, the
+# pkg_resources module used by python-openstackclient doesn't look into
+# the standard library, resulting in a 'DistributionNotFound: argparse'
+# error. Hence, install argparse separately.
+- name: argparse
+ morph: unmaintained/strata/openstack-clients/argparse.morph
+ repo: upstream:argparse
+ ref: ec94cd429c56487e89425f226284009f78a596c6
+ unpetrify-ref: r130
+# The latest release of python-openstackclient is not being used as it
+# requires newer versions of glance, neutron, keystone and nova.
+- name: python-openstackclient
+ morph: unmaintained/strata/openstack-clients/python-openstackclient.morph
+ repo: upstream:openstack/python-openstackclient
+ ref: 28f65e665045c1c6d0697f856f06020c7c8e656a
+ unpetrify-ref: 1.2.0
+- name: os-client-config
+ morph: unmaintained/strata/openstack-clients/os-client-config.morph
+ repo: upstream:openstack/os-client-config
+ ref: a0df67704ace186b18fd1ecdc220a7e56409bc6f
+ unpetrify-ref: 1.3.0
+- name: appdirs
+ morph: unmaintained/strata/openstack-clients/appdirs.morph
+ repo: upstream:python-packages/appdirs
+ ref: 57f2bc44a8bca99bac6c57496c8b3fdea26f94d5
+ unpetrify-ref: 1.4.0
diff --git a/strata/openstack-common.morph b/strata/openstack-common.morph
new file mode 100644
index 00000000..378ae880
--- /dev/null
+++ b/strata/openstack-common.morph
@@ -0,0 +1,140 @@
+name: openstack-common
+kind: stratum
+description: |
+ Stratum with the python packages needed to compile openstack
+ clients and services.
+build-depends:
+- morph: strata/python-common.morph
+- morph: strata/foundation.morph
+chunks:
+- name: pycparser
+ repo: upstream:python-packages/pycparser
+ ref: c926670643ebb5f88a2bf56579fc9934c82be6d2
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: cffi
+ repo: upstream:python-packages/cffi
+ ref: 40b9759b5bbf9f6a4efa1168acc9a60890527f6f
+ unpetrify-ref: release-1.6
+ build-system: python-distutils
+ build-depends:
+ - pycparser
+- name: pytz
+ repo: upstream:pytz-tarball
+ ref: c414cb801776e11c769fb36c0d37b8d7a7c8712c
+ unpetrify-ref: pytz-2014.10
+ build-system: python-distutils
+- name: babel
+ morph: strata/openstack-common/babel.morph
+ repo: upstream:babel
+# Babel requires core-23.1.zip to be present when compiles
+# from source, the following branch adds this file to the
+# repository, and stops the date being added to the version
+# number when running `python setup.py install`.
+ ref: 1891d93b10e6c11ab08099b95001b17e88315c2a
+ unpetrify-ref: baserock/1.3-50-g246996b
+ build-depends:
+ - pytz
+- name: enum34
+ repo: upstream:python-packages/enum34.git
+ ref: f1fa1787ceaac72b9934f318ea2135d28c05dd55
+ unpetrify-ref: enum34-1.0
+ build-system: python-distutils
+- name: pyasn1
+ repo: upstream:python-packages/pyasn1
+ ref: fa8e66c5f4367a1e39b53dcddc133d084b10400f
+ unpetrify-ref: release_0_1_7_tag
+ build-system: python-distutils
+- name: cryptography
+ repo: upstream:python-packages/cryptography
+ ref: afcd8f5ad8eb21f13be308c5183ef34ad28f9987
+ unpetrify-ref: 1.3.2
+ build-system: python-distutils
+ build-depends:
+ - pycparser
+ - pyasn1
+ - enum34
+ - cffi
+- name: pyiso8601
+ repo: upstream:pyiso8601
+ ref: 9eb87a9bab114e9cc9a8d3dceb04362644d89cab
+ unpetrify-ref: 0.1.10
+ build-system: python-distutils
+- name: netaddr
+ repo: upstream:netaddr
+ ref: bbb31ed50a5338a7d1c0011fc4429d09954f9f0b
+ unpetrify-ref: release-0.7.12
+ build-system: python-distutils
+- name: stevedore
+ repo: upstream:openstack/stevedore
+ ref: 218e95d5f09563bd14c50ee0441855f3389af7e7
+ unpetrify-ref: 1.3.0
+ build-system: python-distutils
+- name: oslo-config
+ repo: upstream:openstack/oslo-config
+ ref: 3c51838cdffe7a5057ff4823a8ab523bfacc3164
+ unpetrify-ref: 1.9.3
+ build-system: python-distutils
+ build-depends:
+ - netaddr
+ - stevedore
+- name: pyopenssl
+ repo: upstream:python-packages/pyopenssl
+ ref: 0146d447e63a737b4f05a1164d5950eff68543e7
+ unpetrify-ref: "0.14"
+ build-system: python-distutils
+- name: oslo-i18n
+ repo: upstream:openstack/oslo-i18n
+ ref: b0faab7b3d3ea3b14053ab92dd6086956f643e15
+ unpetrify-ref: 1.5.0
+ build-system: python-distutils
+ build-depends:
+ - babel
+- name: netifaces
+ repo: upstream:python-packages/netifaces
+ ref: 885b200ba717df87f6e8044ec8c66c677c949bcb
+ unpetrify-ref: release_0_10_4
+ build-system: python-distutils
+- name: oslo-utils
+ repo: upstream:openstack/oslo-utils
+ ref: 91dc782c2f11fb76425effd7a331d63111adf1ce
+ unpetrify-ref: 1.4.0
+ build-system: python-distutils
+ build-depends:
+ - babel
+ - pyiso8601
+ - oslo-i18n
+ - netifaces
+ - netaddr
+- name: futures
+ repo: upstream:python-packages/futures
+ ref: 4f7ceedb8a7742e52b0436a4160c7c44665a2597
+ unpetrify-ref: 2.2.0
+ build-system: python-distutils
+- name: oslo-serialization
+ repo: upstream:openstack/oslo-serialization.git
+ ref: 7bfd5dece0f22dbdea1c3e524dbc0eca1f70f1b7
+ unpetrify-ref: 1.4.0
+ build-system: python-distutils
+- name: simplejson
+ repo: upstream:simplejson
+ ref: 54d5ff15d508c51366986cc4f77f2f287f036582
+ unpetrify-ref: v3.6.4
+ build-system: python-distutils
+- name: greenlet
+ ref: ed943580bc514144958ebd257156ddfb7584a981
+ unpetrify-ref: 0.4.9
+ repo: upstream:python-packages/greenlet
+ build-system: python-distutils
+- name: eventlet
+ ref: dc10af4702115ee92803e432c18ef3a4350e0993
+ unpetrify-ref: v0.17.4
+ repo: upstream:python-packages/eventlet
+ build-system: python-distutils
+ build-depends:
+ - greenlet
+- name: pastedeploy
+ repo: upstream:python-packages/pastedeploy
+ ref: 5ad87be617c2cc1dd31625688172e964db2756dc
+ unpetrify-ref: 1.5.2
+ build-system: python-distutils
diff --git a/strata/openstack-common/babel.morph b/strata/openstack-common/babel.morph
new file mode 100644
index 00000000..b9dc475c
--- /dev/null
+++ b/strata/openstack-common/babel.morph
@@ -0,0 +1,8 @@
+name: babel
+kind: chunk
+build-system: python-distutils
+# NOTE: remember that Babel requires core-23.1.zip to be
+# present when compiles from source see baserock/1.3.50-g246996b
+# branch in babel repository in gbo for more information.
+pre-build-commands:
+- python setup.py import_cldr
diff --git a/strata/ostree-core.morph b/strata/ostree-core.morph
new file mode 100644
index 00000000..ff9725ce
--- /dev/null
+++ b/strata/ostree-core.morph
@@ -0,0 +1,38 @@
+name: ostree-core
+kind: stratum
+build-depends:
+- morph: strata/core.morph
+- morph: strata/libsoup-common.morph
+- morph: strata/foundation.morph
+chunks:
+- name: libassuan
+ morph: strata/ostree-core/libassuan.morph
+ repo: upstream:libassuan
+ ref: cdb1e6484d6f094f8e795bfec5b314ec524a90f8
+ unpetrify-ref: libassuan-2.3.0
+- name: gpgme
+ morph: strata/ostree-core/gpgme.morph
+ repo: upstream:gpgme
+ ref: 107bff70edb611309f627058dd4777a5da084b1a
+ unpetrify-ref: gpgme-1.6.0
+ build-depends:
+ - libassuan
+- name: libgsystem
+ repo: upstream:libgsystem
+ ref: 8231b8ad4a4ee35e4b11fae5f6e7cddabf1c51ae
+ unpetrify-ref: master
+ build-system: autotools
+- name: ostree
+ morph: strata/ostree-core/ostree.morph
+ repo: upstream:ostree
+ ref: c31cf75552af9be404fbc6a24643c569855c1c3b
+ unpetrify-ref: v2016.7
+ build-depends:
+ - gpgme
+ - libgsystem
+ - libassuan
+ submodules:
+ libglnx:
+ url: upstream:libglnx
+ bsdiff:
+ url: upstream:bsdiff
diff --git a/strata/ostree-core/gpgme.morph b/strata/ostree-core/gpgme.morph
new file mode 100644
index 00000000..cf938f31
--- /dev/null
+++ b/strata/ostree-core/gpgme.morph
@@ -0,0 +1,7 @@
+name: gpgme
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- autoreconf -fi
+configure-commands:
+- ./configure --prefix="$PREFIX" --enable-maintainer-mode
diff --git a/strata/ostree-core/libassuan.morph b/strata/ostree-core/libassuan.morph
new file mode 100644
index 00000000..baa1e902
--- /dev/null
+++ b/strata/ostree-core/libassuan.morph
@@ -0,0 +1,7 @@
+name: libassuan
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- autoreconf -fi
+configure-commands:
+- ./configure --prefix="$PREFIX" --enable-maintainer-mode
diff --git a/strata/ostree-core/ostree.morph b/strata/ostree-core/ostree.morph
new file mode 100644
index 00000000..2f2d86c7
--- /dev/null
+++ b/strata/ostree-core/ostree.morph
@@ -0,0 +1,7 @@
+name: ostree
+kind: chunk
+build-system: autotools
+configure-commands:
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var
+ --disable-man
diff --git a/strata/pcre-utils.morph b/strata/pcre-utils.morph
new file mode 100644
index 00000000..d747d122
--- /dev/null
+++ b/strata/pcre-utils.morph
@@ -0,0 +1,10 @@
+name: pcre-utils
+kind: stratum
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: pcre
+ repo: upstream:pcre
+ morph: strata/pcre-utils/pcre.morph
+ ref: b2b477a2025ee7501243e5b6a54ef4f6dbfb666b
+ unpetrify-ref: pcre-8.39
diff --git a/strata/pcre-utils/pcre.morph b/strata/pcre-utils/pcre.morph
new file mode 100644
index 00000000..8c44a5b9
--- /dev/null
+++ b/strata/pcre-utils/pcre.morph
@@ -0,0 +1,6 @@
+name: pcre
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh
+- ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-unicode-properties --enable-utf
diff --git a/strata/perl-common.morph b/strata/perl-common.morph
new file mode 100644
index 00000000..2947f053
--- /dev/null
+++ b/strata/perl-common.morph
@@ -0,0 +1,388 @@
+name: perl-common
+kind: stratum
+description: Common perl dependencies
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: Try-Tiny
+ repo: upstream:cpan/Try-Tiny-tarball
+ ref: b0ac2743153dd707789f7541af790f5a53843a36
+ unpetrify-ref: Try-Tiny-0.22
+ build-system: cpan
+- name: Log-Log4perl
+ repo: upstream:cpan/Log-Log4perl-tarball
+ ref: 94566f012421026c8311552f99175a5989eba063
+ unpetrify-ref: master
+ build-system: cpan
+- name: Module-Build
+ repo: upstream:cpan/Module-Build-tarball
+ ref: 467298a34215401cdcbb1dded51bc2aba5f1f41c
+ unpetrify-ref: Module-Build-0.4214
+ build-system: cpan
+- name: Devel-StackTrace
+ repo: upstream:cpan/Devel-StackTrace-tarball
+ ref: 22d921a6e9c4fc98cda05e898a8137c7e8dae970
+ unpetrify-ref: Devel-StackTrace-2.00
+ build-system: cpan
+- name: Exporter-Tiny
+ repo: upstream:cpan/Exporter-Tiny-tarball
+ ref: a3341f774a4aa00765970301e259be818929a7cf
+ unpetrify-ref: Exporter-Tiny-0.042
+ build-system: cpan
+- name: ExtUtils-Config
+ repo: upstream:cpan/ExtUtils-Config-tarball
+ ref: c8d851569c1b88d5431700809fe520cbca5023a8
+ unpetrify-ref: ExtUtils-Config-0.008
+ build-system: cpan
+- name: ExtUtils-Helpers
+ repo: upstream:cpan/ExtUtils-Helpers-tarball
+ ref: 13016fa7011fc3084536c7b3181d75acb43d3aae
+ unpetrify-ref: ExtUtils-Helpers-0.022
+ build-system: cpan
+- name: ExtUtils-InstallPaths
+ repo: upstream:cpan/ExtUtils-InstallPaths-tarball
+ ref: 2f62d65d28afdbbd6a417f8e3da3ac6143863ef8
+ unpetrify-ref: ExtUtils-InstallPaths-0.011
+ build-system: cpan
+ build-depends:
+ - ExtUtils-Config
+- name: List-MoreUtils
+ morph: strata/perl-common/List-MoreUtils.morph
+ repo: upstream:cpan/List-MoreUtils-tarball
+ ref: 7f3c4eb624730bcc71e75500f295d193b9375fbc
+ unpetrify-ref: List-MoreUtils-0.413
+ build-depends:
+ - Exporter-Tiny
+- name: MRO-Compat
+ repo: upstream:cpan/MRO-Compat-tarball
+ ref: 47420dfff2810300d68ea846502dbc4f85d34186
+ unpetrify-ref: MRO-Compat-0.12
+ build-system: cpan
+- name: Module-Build-Tiny
+ repo: upstream:cpan/Module-Build-Tiny-tarball
+ ref: 289b859a41b598e5ae4261b978402f3019fd9042
+ unpetrify-ref: Module-Build-Tiny-0.039
+ build-system: module-build
+ build-depends:
+ - ExtUtils-Helpers
+ - ExtUtils-Config
+ - ExtUtils-InstallPaths
+- name: Module-Runtime
+ repo: upstream:cpan/Module-Runtime-tarball
+ ref: 3621e4956cb037811317b0195d3248108c6658c3
+ unpetrify-ref: Module-Runtime-0.014
+ build-system: cpan
+ build-depends:
+ - Module-Build
+- name: Dist-CheckConflicts
+ repo: upstream:cpan/Dist-CheckConflicts-tarball
+ ref: dfaae12e4d85f7c6821ae4a9fbf7e463d570e7ba
+ unpetrify-ref: Dist-CheckConflicts-0.11
+ build-system: cpan
+ build-depends:
+ - Module-Build
+ - Module-Runtime
+- name: Module-Runtime-Conflicts
+ repo: upstream:cpan/Module-Runtime-Conflicts-tarball
+ ref: ab45179756d9ce7e63c894d52b2e34cafc10bf6a
+ unpetrify-ref: Module-Runtime-Conflicts-0.002
+ build-system: cpan
+ build-depends:
+ - Module-Build-Tiny
+ - ExtUtils-Config
+ - Module-Runtime
+ - ExtUtils-InstallPaths
+ - Module-Build
+ - ExtUtils-Helpers
+ - Dist-CheckConflicts
+- name: Package-Stash-XS
+ repo: upstream:cpan/Package-Stash-XS-tarball
+ ref: fff2e7a8ec398e4c5229fb61b1107cffda28aabd
+ unpetrify-ref: Package-Stash-XS-0.28
+ build-system: cpan
+- name: Params-Util
+ repo: upstream:cpan/Params-Util-tarball
+ ref: d8180ea7d4a24afe7b38df93513d224b90d4945f
+ unpetrify-ref: Params-Util-1.07
+ build-system: cpan
+- name: Sub-Exporter-Progressive
+ repo: upstream:cpan/Sub-Exporter-Progressive-tarball
+ ref: 1f3ec55911f841590a62ed06becc2bd9131a5fc4
+ unpetrify-ref: Sub-Exporter-Progressive-0.001011
+ build-system: cpan
+- name: Devel-GlobalDestruction
+ repo: upstream:cpan/Devel-GlobalDestruction-tarball
+ ref: 325e62ad0c0a3e34804212983fe22999b7d1f3bb
+ unpetrify-ref: Devel-GlobalDestruction-0.13
+ build-system: cpan
+ build-depends:
+ - Sub-Exporter-Progressive
+- name: Sub-Identify
+ repo: upstream:cpan/Sub-Identify-tarball
+ ref: bfaf3f426163c10c631d03bf2ce03fb34e74fdd9
+ unpetrify-ref: Sub-Identify-0.10
+ build-system: cpan
+- name: Sub-Install
+ repo: upstream:cpan/Sub-Install-tarball
+ ref: cf0894e4fcf980767c57734e9a3ddad3c35da7d2
+ unpetrify-ref: Sub-Install-0.928
+ build-system: cpan
+- name: Data-OptList
+ repo: upstream:cpan/Data-OptList-tarball
+ ref: aa2ab3d34edbee7e4fc832394136391fd5f87702
+ unpetrify-ref: Data-OptList-0.109
+ build-system: cpan
+ build-depends:
+ - Sub-Install
+ - Params-Util
+- name: Sub-Exporter
+ repo: upstream:cpan/Sub-Exporter-tarball
+ ref: 641cf398662e09a9660e5b4187f8691a3205a3db
+ unpetrify-ref: Sub-Exporter-0.987
+ build-system: cpan
+ build-depends:
+ - Data-OptList
+ - Sub-Install
+ - Params-Util
+- name: Package-DeprecationManager
+ repo: upstream:cpan/Package-DeprecationManager-tarball
+ ref: b05516a95f58a288b856d79e7d5be86c46a98110
+ unpetrify-ref: Package-DeprecationManager-0.14
+ build-system: cpan
+ build-depends:
+ - Sub-Install
+ - Params-Util
+- name: Sub-Name
+ repo: upstream:cpan/Sub-Name-tarball
+ ref: 5b19971882c74b097f4a052852a67ee81cb2bb5a
+ unpetrify-ref: Sub-Name-0.14
+ build-system: cpan
+- name: Task-Weaken
+ repo: upstream:cpan/Task-Weaken-tarball
+ ref: 75c7d27b13860660f80913cc8cd46c6c8edf5071
+ unpetrify-ref: Task-Weaken-1.04
+ build-system: cpan
+- name: Eval-Closure
+ repo: upstream:cpan/Eval-Closure-tarball
+ ref: cf3c05406f7cde406764915682e4bf5db73b1bdd
+ unpetrify-ref: Eval-Closure-0.13
+ build-system: cpan
+ build-depends:
+ - Try-Tiny
+- name: Module-Implementation
+ repo: upstream:cpan/Module-Implementation-tarball
+ ref: b808141b894ad538db75a7067e0199cbfe6337a9
+ unpetrify-ref: Module-Implementation-0.09
+ build-system: cpan
+ build-depends:
+ - Module-Build
+ - Module-Runtime
+ - Try-Tiny
+- name: Package-Stash
+ repo: upstream:cpan/Package-Stash-tarball
+ ref: 37bd679ad9ac185930fa8fea7cd11b27587ae478
+ unpetrify-ref: Package-Stash-0.37
+ build-system: cpan
+ build-depends:
+ - Module-Runtime
+ - Try-Tiny
+ - Module-Implementation
+ - Module-Build
+ - Dist-CheckConflicts
+ - Package-Stash-XS
+- name: Class-Load
+ repo: upstream:cpan/Class-Load-tarball
+ ref: 7e7ddbe33ca34359d711aee1e0ddebaeb40c2a18
+ unpetrify-ref: Class-Load-0.23
+ build-system: cpan
+ build-depends:
+ - Data-OptList
+ - Params-Util
+ - Module-Runtime
+ - Try-Tiny
+ - Module-Implementation
+ - Module-Build
+ - Package-Stash
+ - Sub-Install
+ - Dist-CheckConflicts
+ - Package-Stash-XS
+- name: Devel-OverloadInfo
+ repo: upstream:cpan/Devel-OverloadInfo-tarball
+ ref: 918097f3d406ac643ab6caf4387e4c0ab3d80718
+ unpetrify-ref: Devel-OverloadInfo-0.002
+ build-system: cpan
+ build-depends:
+ - Sub-Identify
+ - Module-Runtime
+ - Try-Tiny
+ - Module-Implementation
+ - Module-Build
+ - Package-Stash
+ - MRO-Compat
+ - Dist-CheckConflicts
+ - Package-Stash-XS
+- name: Class-Load-XS
+ repo: upstream:cpan/Class-Load-XS-tarball
+ ref: 60626c51d97a7ef06b364481ae4afd9706ef6ece
+ unpetrify-ref: Class-Load-XS-0.09
+ build-system: cpan
+ build-depends:
+ - Data-OptList
+ - Params-Util
+ - Module-Runtime
+ - Try-Tiny
+ - Module-Implementation
+ - Module-Build
+ - Package-Stash
+ - Sub-Install
+ - Dist-CheckConflicts
+ - Class-Load
+ - Package-Stash-XS
+- name: Moose
+ repo: upstream:cpan/Moose-tarball
+ ref: 5ac2026f7eed78958d69d051e7a8e993dcf51205
+ unpetrify-ref: master
+ build-system: cpan
+ build-depends:
+ - Data-OptList
+ - Module-Build-Tiny
+ - Sub-Exporter
+ - Devel-GlobalDestruction
+ - Module-Implementation
+ - Module-Build
+ - List-MoreUtils
+ - Class-Load
+ - ExtUtils-Helpers
+ - Exporter-Tiny
+ - Module-Runtime
+ - Try-Tiny
+ - Class-Load-XS
+ - Package-Stash-XS
+ - Sub-Exporter-Progressive
+ - Package-DeprecationManager
+ - Params-Util
+ - Task-Weaken
+ - Dist-CheckConflicts
+ - Sub-Name
+ - ExtUtils-Config
+ - Module-Runtime-Conflicts
+ - ExtUtils-InstallPaths
+ - Devel-StackTrace
+ - Sub-Identify
+ - Package-Stash
+ - MRO-Compat
+ - Sub-Install
+ - Devel-OverloadInfo
+ - Eval-Closure
+- name: Test-Fatal
+ repo: upstream:cpan/Test-Fatal-tarball
+ ref: 40b50d9c7952dab50b39612311048d6a02a9eb53
+ unpetrify-ref: Test-Fatal-0.014
+ build-system: cpan
+ build-depends:
+ - Try-Tiny
+- name: Test-Requires
+ repo: upstream:cpan/Test-Requires-tarball
+ ref: a3ff0e26c1de52421abeff3a5d068bebc1dc8621
+ unpetrify-ref: master
+ build-system: cpan
+- name: Params-Validate
+ repo: upstream:cpan/Params-Validate-tarball
+ ref: 11197f6fc2fdd0d2a139a74ff1302244c4911e4e
+ unpetrify-ref: Params-Validate-1.20
+ build-system: module-build
+ build-depends:
+ - Module-Implementation
+ - Module-Build
+ - Module-Runtime
+ - Try-Tiny
+ - Test-Fatal
+ - Test-Requires
+- name: Log-Dispatch
+ repo: upstream:cpan/Log-Dispatch-tarball
+ ref: 2e0d2bec52bd345ef05ea12ea9052643ef135029
+ unpetrify-ref: master
+ build-system: cpan
+ build-depends:
+ - Devel-GlobalDestruction
+ - Try-Tiny
+ - Module-Implementation
+ - Module-Build
+ - Params-Validate
+ - Dist-CheckConflicts
+ - Sub-Exporter-Progressive
+ - Module-Runtime
+- name: App-cpanminus
+ repo: upstream:cpan/App-cpanminus-tarball
+ ref: 67241d22c0a425ba7301017796d8a39f7e731999
+ unpetrify-ref: App-cpanminus-1.7039
+ build-system: cpan
+- name: Class-Tiny
+ repo: upstream:cpan/Class-Tiny-tarball
+ ref: 7446bb2b9d24fa6b702fbb62d73084a32ade6f75
+ unpetrify-ref: Class-Tiny-1.001
+ build-system: cpan
+- name: JSON
+ repo: upstream:cpan/JSON-tarball
+ ref: e84b6340760ed17a22ced0ca110a94fa8322b35e
+ unpetrify-ref: JSON-2.90
+ build-system: cpan
+- name: Module-CPANfile
+ repo: upstream:cpan/Module-CPANfile-tarball
+ ref: 6b1d736955543538c54f1d8033ce3bdcb175da91
+ unpetrify-ref: Module-CPANfile-1.1000
+ build-system: cpan
+- name: Module-Reader
+ repo: upstream:cpan/Module-Reader-tarball
+ ref: 7dd93df1d843cbb36356dbea8071fab21cf04c30
+ unpetrify-ref: Module-Reader-0.002003
+ build-system: cpan
+- name: Path-Tiny
+ repo: upstream:cpan/Path-Tiny-tarball
+ ref: b7fb38421c30b0419a30311c1bde34706aa60fb8
+ unpetrify-ref: Path-Tiny-0.070
+ build-system: cpan
+- name: Carton
+ repo: upstream:carton
+ ref: 64faf28ed61a6d0278c87831c83258cf8ecc40a9
+ unpetrify-ref: baserock/v1.0.21
+ build-system: cpan
+ build-depends:
+ - Class-Tiny
+ - Path-Tiny
+ - Module-CPANfile
+ - JSON
+ - App-cpanminus
+ - Module-Reader
+- name: Future
+ repo: upstream:cpan/Future-tarball
+ ref: 8cc5160aefb2ba3611d1d5d6b12b996227f9da72
+ unpetrify-ref: Future-0.32
+ build-system: cpan
+ build-depends:
+ - Module-Build
+- name: Struct-Dumb
+ repo: upstream:cpan/Struct-Dumb-tarball
+ ref: e0788c9e0be87d9d401f38e7f67f28738d613713
+ unpetrify-ref: Struct-Dumb-0.03
+ build-system: cpan
+ build-depends:
+ - Module-Build
+ - Try-Tiny
+ - Test-Fatal
+- name: IO-Async
+ repo: upstream:cpan/IO-Async-tarball
+ ref: 1425eea04dd872dc6313f5315f317b2de288037c
+ unpetrify-ref: master
+ build-system: cpan
+ build-depends:
+ - Struct-Dumb
+ - Try-Tiny
+ - Module-Build
+ - Future
+ - Test-Fatal
+- name: Archive-Extract
+ repo: upstream:cpan/Archive-Extract-tarball
+ ref: 8538680d8b9b92f693f7e03b48332627d4b129a0
+ unpetrify-ref: master
+ build-system: cpan
diff --git a/strata/perl-common/List-MoreUtils.morph b/strata/perl-common/List-MoreUtils.morph
new file mode 100644
index 00000000..1fd38042
--- /dev/null
+++ b/strata/perl-common/List-MoreUtils.morph
@@ -0,0 +1,9 @@
+name: List-MoreUtils
+kind: chunk
+build-system: cpan
+pre-configure-commands:
+# List::MoreUtils will assume that it needs to try and build a release
+# if there's a .git present, we don't want that so we remove the .git here.
+# an issue has been filed at
+# https://github.com/perl5-utils/List-MoreUtils/issues/14
+- rm -rf .git
diff --git a/strata/privileges-management.morph b/strata/privileges-management.morph
new file mode 100644
index 00000000..835ca62a
--- /dev/null
+++ b/strata/privileges-management.morph
@@ -0,0 +1,21 @@
+name: privileges-management
+kind: stratum
+description: Toolkit for controlling system-wide privileges
+build-depends:
+- morph: strata/foundation.morph
+- morph: strata/glib-common.morph
+- morph: strata/network-security.morph
+- morph: strata/python2-core.morph
+chunks:
+- name: mozjs17
+ morph: strata/privileges-management/mozjs17.morph
+ repo: upstream:mozilla/mozjs17
+ ref: 1c1080f592d4a0005c1765c870f314b3475825ae
+ unpetrify-ref: baserock/gnome
+- name: polkit
+ morph: strata/privileges-management/polkit.morph
+ repo: upstream:polkit
+ ref: 5a7e3b76aa45eea43e4bdc403ddd4c6e1a4c6542
+ unpetrify-ref: master
+ build-depends:
+ - mozjs17
diff --git a/strata/privileges-management/mozjs17.morph b/strata/privileges-management/mozjs17.morph
new file mode 100644
index 00000000..968bfcc8
--- /dev/null
+++ b/strata/privileges-management/mozjs17.morph
@@ -0,0 +1,18 @@
+name: mozjs17
+kind: chunk
+build-system: manual
+configure-commands:
+- |
+ cd js/src;
+ ./configure --prefix="$PREFIX" \
+ --sysconfdir=/etc \
+ --with-system-nspr \
+ --with-system-ffi \
+ --enable-threadsafe
+build-commands:
+- |
+ cd js/src;
+ make
+install-commands:
+- cd js/src;
+ make DESTDIR="$DESTDIR" install
diff --git a/strata/privileges-management/polkit.morph b/strata/privileges-management/polkit.morph
new file mode 100644
index 00000000..6b961600
--- /dev/null
+++ b/strata/privileges-management/polkit.morph
@@ -0,0 +1,11 @@
+name: polkit
+kind: chunk
+build-system: autotools
+max-jobs: 1
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-man-pages --disable-gtk-doc --enable-libsystemd-login=yes
+system-integration:
+ polkit-misc:
+ 00-add-polkitd-user:
+ - groupadd -fg 27 polkitd
+ - useradd -c "PolicyKit Daemon Owner" -d /etc/polkit-1 -u 27 -g polkitd -s /bin/false polkitd
diff --git a/strata/python-cliapp.morph b/strata/python-cliapp.morph
new file mode 100644
index 00000000..d143007d
--- /dev/null
+++ b/strata/python-cliapp.morph
@@ -0,0 +1,26 @@
+name: python-cliapp
+kind: stratum
+description: |
+ Cliapp command line application framework.
+build-depends:
+- morph: strata/python2-core.morph
+chunks:
+- name: python-coveragepy
+ morph: strata/python-cliapp/python-coveragepy.morph
+ repo: upstream:python-coveragepy
+ ref: 77d2e3bfd8fb325092aaed37ba1378054d182d19
+ unpetrify-ref: baserock/morph
+- name: python-coverage-test-runner
+ repo: upstream:python-coverage-test-runner
+ ref: 8ea9421ac3384b2e88e0c36f2cfa52586c4798b7
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
+ build-depends:
+ - python-coveragepy
+- name: cliapp
+ repo: upstream:cliapp
+ ref: cec20cedd062a3aef1b04f997e77b45090c07806
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
+ build-depends:
+ - python-coverage-test-runner
diff --git a/strata/python-cliapp/python-coveragepy.morph b/strata/python-cliapp/python-coveragepy.morph
new file mode 100644
index 00000000..ed5e3d87
--- /dev/null
+++ b/strata/python-cliapp/python-coveragepy.morph
@@ -0,0 +1,6 @@
+name: python-coveragepy
+kind: chunk
+build-commands:
+- python setup.py build
+install-commands:
+- python setup.py install --prefix=/usr --root "$DESTDIR"
diff --git a/strata/python-common.morph b/strata/python-common.morph
new file mode 100644
index 00000000..9777c1df
--- /dev/null
+++ b/strata/python-common.morph
@@ -0,0 +1,93 @@
+name: python-common
+kind: stratum
+description: Common dependencies of some python chunks
+build-depends:
+- morph: strata/python2-core.morph
+chunks:
+- name: pycrypto
+ morph: strata/python-common/pycrypto.morph
+ repo: upstream:python-packages/pycrypto
+ ref: af058ee6f5da391a05275470ab4a4a96aa22b350
+ unpetrify-ref: v2.7a1
+- name: ecdsa
+ repo: upstream:python-packages/ecdsa
+ ref: 36e9cfa80fcf8b53119adc787e54a5892ec1eb2c
+ unpetrify-ref: python-ecdsa-0.11
+ build-system: python-distutils
+- name: paramiko
+ repo: upstream:paramiko
+ ref: 424ba615c2a94d3b059e7f24db1a1093a92d8d22
+ unpetrify-ref: v1.15.2
+ build-system: python-distutils
+ build-depends:
+ - pycrypto
+ - ecdsa
+- name: markupsafe
+ repo: upstream:markupsafe
+ ref: feb1d70c16df62f60dcb521d127fdad8819fc036
+ unpetrify-ref: "0.23"
+ build-system: python-distutils
+- name: jinja2
+ repo: upstream:jinja2
+ ref: 762c612e7276889aac265645da00e62e33d1573c
+ unpetrify-ref: 2.7.3
+ build-system: python-distutils
+ build-depends:
+ - markupsafe
+- name: python-json-pointer
+ repo: upstream:python-json-pointer
+ ref: 34073e561261cb413b9bdff5beac31b070d98ea2
+ unpetrify-ref: v1.4
+ build-system: python-distutils
+- name: python-json-patch
+ repo: upstream:python-json-patch
+ ref: e4da658a5dc9f68d3386017ffdcc8e07d22b51a3
+ unpetrify-ref: v1.8
+ build-system: python-distutils
+ build-depends:
+ - python-json-pointer
+- name: python-prettytable
+ repo: upstream:python-prettytable
+ ref: bea6a50e4da00074b35b57232771cea58b89b3e0
+ unpetrify-ref: 0.7.2-RELEASE
+ build-system: python-distutils
+- name: configobj
+ repo: upstream:configobj-git
+ ref: 9d2aab01c77dce600b296ba9da1163cc0bbc14e0
+ unpetrify-ref: v5.0.6
+ build-system: python-distutils
+- name: python-mimeparse
+ repo: upstream:python-packages/python-mimeparse.git
+ ref: 2d600d3fc4a386af69d20fba433843b4df2b3c92
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: kazoo
+ repo: upstream:python-packages/kazoo.git
+ ref: 93a718ea4c20df797766742c3d74de281613c651
+ unpetrify-ref: "2.0"
+ build-system: python-distutils
+- name: webob
+ repo: upstream:python-packages/webob
+ ref: ae0ac90f22f9e1ff351e445f92330efd89195f51
+ unpetrify-ref: "1.4"
+ build-system: python-distutils
+- name: python-decorator
+ repo: upstream:python-packages/python-decorator
+ ref: b02f7a254c3679dfac57a824e08dd02ced850636
+ unpetrify-ref: decorator-3.4.0
+ build-system: python-distutils
+- name: networkx
+ repo: upstream:python-packages/networkx
+ ref: 8ac796aba866ade1a56b83e30f25ed392ca3512c
+ unpetrify-ref: networkx-1.9.1
+ build-system: python-distutils
+- name: boto
+ repo: upstream:boto
+ ref: 2517f660f8ef9012708d46da3a36ab967993d2f6
+ unpetrify-ref: 2.33.0
+ build-system: python-distutils
+- name: yoyo
+ repo: upstream:python-packages/yoyo
+ ref: 7e510acde274d2c806d38057f352e8525ee7ae9d
+ unpetrify-ref: v5.0.4-release
+ build-system: python-distutils
diff --git a/strata/python-common/pycrypto.morph b/strata/python-common/pycrypto.morph
new file mode 100644
index 00000000..51cc00f0
--- /dev/null
+++ b/strata/python-common/pycrypto.morph
@@ -0,0 +1,3 @@
+name: pycrypto
+kind: chunk
+build-system: python-distutils
diff --git a/strata/python-pygobject.morph b/strata/python-pygobject.morph
new file mode 100644
index 00000000..a6667be2
--- /dev/null
+++ b/strata/python-pygobject.morph
@@ -0,0 +1,13 @@
+name: python-pygobject
+kind: stratum
+description: |
+ Python GObject bindings
+build-depends:
+- morph: strata/python2-core.morph
+- morph: strata/glib-common.morph
+chunks:
+- name: pygobject
+ morph: strata/python-pygobject/pygobject.morph
+ repo: upstream:pygobject
+ ref: 276341d7ddab180020c31e6837bd28fd25784de0
+ unpetrify-ref: baserock/morph
diff --git a/strata/python-pygobject/pygobject.morph b/strata/python-pygobject/pygobject.morph
new file mode 100644
index 00000000..72382f93
--- /dev/null
+++ b/strata/python-pygobject/pygobject.morph
@@ -0,0 +1,5 @@
+name: pygobject
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-cairo
diff --git a/strata/python-tools.morph b/strata/python-tools.morph
new file mode 100644
index 00000000..d61fe150
--- /dev/null
+++ b/strata/python-tools.morph
@@ -0,0 +1,29 @@
+name: python-tools
+kind: stratum
+description: |
+ A stratum for useful python tools that we don't want to include in core.
+build-depends:
+- morph: strata/python2-core.morph
+chunks:
+- name: virtualenv
+ repo: upstream:python-packages/virtualenv
+ ref: 9205ff46a67130e8835f14bb4f802fd59e7dcf2c
+ unpetrify-ref: 12.0.5
+
+ build-system: python-distutils
+## Pylint - required in openstack-services.morph
+- name: astroid
+ repo: upstream:python-packages/astroid
+ ref: 194dc114a33b80b4bfbbeb73f36712848f696025
+ unpetrify-ref: astroid-1.3.5
+ build-system: python-distutils
+- name: logilab-common
+ repo: upstream:python-packages/logilab-common
+ ref: d1d8f793af6d015d885b9ea67b5741d5a093e2f4
+ unpetrify-ref: logilab-common-version-0.62.0
+ build-system: python-distutils
+- name: pylint
+ repo: upstream:python-packages/pylint
+ ref: ba998d7a4e5fce0ea3a3e701ff446bbe4ca406b5
+ unpetrify-ref: pylint-1.4.2
+ build-system: python-distutils
diff --git a/strata/python-wsgi.morph b/strata/python-wsgi.morph
new file mode 100644
index 00000000..cd72e398
--- /dev/null
+++ b/strata/python-wsgi.morph
@@ -0,0 +1,17 @@
+name: python-wsgi
+kind: stratum
+description: |
+ Python modules for web applications using Web Server Gateway Interface.
+build-depends:
+- morph: strata/python2-core.morph
+chunks:
+- name: bottle
+ repo: upstream:bottle
+ ref: 5238c615b3ec198fedebb0fcaad4458e3d68d70f
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
+- name: flup
+ repo: upstream:flup
+ ref: 0f97c5e0ab7d9827506120efc22af3a9c21d1d70
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
diff --git a/strata/python2-core.morph b/strata/python2-core.morph
new file mode 100644
index 00000000..2ae41d34
--- /dev/null
+++ b/strata/python2-core.morph
@@ -0,0 +1,107 @@
+name: python2-core
+kind: stratum
+description: |
+ Some "core" Python 2 packages, including the CPython interpreter itself.
+
+build-depends:
+- morph: strata/core.morph
+
+chunks:
+- name: python2
+ morph: strata/python2-core/python2.morph
+ repo: upstream:cpython
+ ref: 57af3f22d11600ca98c0c9073d0b3b57d43f7c4b
+ unpetrify-ref: v2.7.10
+
+- name: python2-setuptools
+ repo: upstream:python-setuptools-bitbucket
+ ref: 0aa6a4de5931d02876428388678802db2371fd37
+ unpetrify-ref: baserock/master
+ build-system: python-distutils
+ build-depends:
+ - python2
+
+- name: mako-python2
+ repo: upstream:python-packages/mako.git
+ ref: 285bc818a50ccc0f9549630f7c4f4c250585c3e7
+ unpetrify-ref: rel_1_0_0
+ build-system: python-distutils
+ build-depends:
+ - python2
+ - python2-setuptools
+
+- name: pbr-python2
+ repo: upstream:pbr
+ ref: 6e472b4905411a39e993c81c382a27ca9c771ef5
+ unpetrify-ref: 0.11.1
+ build-system: python-distutils
+ build-depends:
+ - python2
+ - python2-setuptools
+
+- name: python2-requests
+ repo: upstream:python-requests
+ ref: b83131779c701720a9ae9efae78996277d416269
+ unpetrify-ref: v2.5.1
+ build-system: python-distutils
+ build-depends:
+ - python2
+
+- name: six-python2
+ repo: upstream:six
+ ref: 8cfbff6b764af86d825086fa1637aa009e90d75a
+ unpetrify-ref: 1.9.0
+ build-system: python-distutils
+ build-depends:
+ - python2
+
+- name: pyyaml-python2
+ morph: strata/python2-core/pyyaml-python2.morph
+ repo: upstream:pyyaml
+ ref: d9fbcceaed39d955f6871b07c61dc42f824285c1
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - python2
+ - python2-setuptools
+
+- name: cython2
+ repo: upstream:cython
+ ref: 4dd8e762fa51d01775506fbbc102c45dbcea065d
+ unpetrify-ref: "0.22"
+ build-system: python-distutils
+ build-depends:
+ - python2
+
+- name: python2-lxml
+ repo: upstream:python-lxml
+ ref: 14505bc62f5f1fc9fb0ff007955f3e67ab4562bb
+ unpetrify-ref: lxml-3.4.0
+ build-system: python-distutils
+ build-depends:
+ - python2
+ - cython2
+
+- name: python2-markdown
+ repo: upstream:python-markdown
+ ref: f0c5b71acbc02af60a33d67c59558bb513b25e74
+ unpetrify-ref: 2.5.1-final
+ build-system: python-distutils
+ build-depends:
+ - python2
+
+- name: libxml2-python2
+ repo: upstream:libxml2
+ ref: 6657afe83a38278f124ace71dc85f60420beb2d5
+ unpetrify-ref: v2.9.3
+ build-system: autotools
+ build-depends:
+ - python2
+
+- name: jsonschema-python2
+ repo: upstream:jsonschema
+ ref: 35b60f390098d3306c03eee27ceec8cf8a493579
+ unpetrify-ref: v2.3.0
+ build-system: python-distutils
+ build-depends:
+ - python2
+ - python2-setuptools
diff --git a/strata/python2-core/python2.morph b/strata/python2-core/python2.morph
new file mode 100644
index 00000000..d5f6913a
--- /dev/null
+++ b/strata/python2-core/python2.morph
@@ -0,0 +1,13 @@
+name: python2
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ ./configure --prefix="$PREFIX" \
+ --enable-shared \
+ --with-ensurepip=upgrade \
+ --with-system-expat \
+ --with-system-ffi
+post-install-commands:
+- ln -sf python2.7 "$DESTDIR"/"$PREFIX"/bin/python
+- test -x "$DESTDIR"/"$PREFIX"/bin/python2 || ln -s python2.7 "$DESTDIR"/"$PREFIX"/bin/python2
diff --git a/strata/python2-core/pyyaml-python2.morph b/strata/python2-core/pyyaml-python2.morph
new file mode 100644
index 00000000..54d2b035
--- /dev/null
+++ b/strata/python2-core/pyyaml-python2.morph
@@ -0,0 +1,6 @@
+name: pyyaml-python2
+kind: chunk
+build-commands:
+- python2 setup.py --without-libyaml build
+install-commands:
+- python2 setup.py --without-libyaml install --prefix="$PREFIX" --root "$DESTDIR"
diff --git a/strata/python3-gobject.morph b/strata/python3-gobject.morph
new file mode 100644
index 00000000..1e2db195
--- /dev/null
+++ b/strata/python3-gobject.morph
@@ -0,0 +1,13 @@
+name: python3-gobject
+kind: stratum
+description: |
+ Python 3 GObject bindings
+build-depends:
+- morph: strata/core.morph
+- morph: strata/glib-common.morph
+chunks:
+- name: python3-gobject
+ morph: strata/python3-gobject/python3-gobject.morph
+ repo: upstream:pygobject
+ ref: 8e7f6f1458cf1c162c13422c72562b00433b762b
+ unpetrify-ref: pygobject-3-18
diff --git a/strata/python3-gobject/python3-gobject.morph b/strata/python3-gobject/python3-gobject.morph
new file mode 100644
index 00000000..8f165ad1
--- /dev/null
+++ b/strata/python3-gobject/python3-gobject.morph
@@ -0,0 +1,5 @@
+name: python3-gobject
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-cairo --with-python=python3
diff --git a/strata/qt5-sdk.morph b/strata/qt5-sdk.morph
new file mode 100644
index 00000000..0d556d38
--- /dev/null
+++ b/strata/qt5-sdk.morph
@@ -0,0 +1,15 @@
+name: qt5-sdk
+kind: stratum
+description: Qt5 Desktop Environment, IDE and Example Apps
+build-depends:
+- morph: strata/qt5-tools.morph
+- morph: strata/qt5-tools-qtwebkit.morph
+chunks:
+- name: qt-creator
+ morph: strata/qt5-sdk/qt-creator.morph
+ repo: upstream:qt-creator
+ ref: 8895770ba36f96f150fe8dca71f889ff24d07fd6
+ unpetrify-ref: baserock/v3.6.1
+ submodules:
+ qbs:
+ url: upstream:qbs
diff --git a/strata/qt5-sdk/qt-creator.morph b/strata/qt5-sdk/qt-creator.morph
new file mode 100644
index 00000000..91fae589
--- /dev/null
+++ b/strata/qt5-sdk/qt-creator.morph
@@ -0,0 +1,8 @@
+name: qt-creator
+kind: chunk
+configure-commands:
+- qmake
+build-commands:
+- make
+install-commands:
+- make install INSTALL_ROOT=$DESTDIR
diff --git a/strata/qt5-sdk/snowshoe.morph b/strata/qt5-sdk/snowshoe.morph
new file mode 100644
index 00000000..f89ab751
--- /dev/null
+++ b/strata/qt5-sdk/snowshoe.morph
@@ -0,0 +1,8 @@
+name: snowshoe
+kind: chunk
+configure-commands:
+- qmake
+build-commands:
+- make
+install-commands:
+- make install INSTALL_ROOT=$DESTDIR
diff --git a/strata/qt5-tools-qtmultimedia.morph b/strata/qt5-tools-qtmultimedia.morph
new file mode 100644
index 00000000..4f3484cd
--- /dev/null
+++ b/strata/qt5-tools-qtmultimedia.morph
@@ -0,0 +1,12 @@
+name: qt5-tools-qtmultimedia
+kind: stratum
+description: Qt5 QtMultimedia Development Libraries and Tools
+build-depends:
+- morph: strata/qt5-tools.morph
+- morph: strata/multimedia-gstreamer.morph
+chunks:
+- name: qtmultimedia
+ repo: upstream:qt5/qtmultimedia
+ ref: 631a6f6c38a5140e22c63b0840d9badb87851949
+ unpetrify-ref: v5.9.1
+ build-system: qmake
diff --git a/strata/qt5-tools-qtwayland.morph b/strata/qt5-tools-qtwayland.morph
new file mode 100644
index 00000000..7042101a
--- /dev/null
+++ b/strata/qt5-tools-qtwayland.morph
@@ -0,0 +1,12 @@
+name: qt5-tools-qtwayland
+kind: stratum
+description: Qt5 Wayland module
+build-depends:
+- morph: strata/input-common.morph
+- morph: strata/qt5-tools.morph
+chunks:
+- name: qtwayland
+ morph: strata/qt5-tools-qtwayland/qtwayland.morph
+ repo: upstream:qt5/qtwayland
+ ref: ef4eeb4d243e0fd6f44f52be2c345ab450c70a49
+ unpetrify-ref: v5.9.1
diff --git a/strata/qt5-tools-qtwayland/qtwayland.morph b/strata/qt5-tools-qtwayland/qtwayland.morph
new file mode 100644
index 00000000..06e8ac7c
--- /dev/null
+++ b/strata/qt5-tools-qtwayland/qtwayland.morph
@@ -0,0 +1,5 @@
+name: qtwayland
+kind: chunk
+build-system: qmake
+configure-commands:
+- qmake -makefile CONFIG+=wayland-compositor
diff --git a/strata/qt5-tools-qtwebengine.morph b/strata/qt5-tools-qtwebengine.morph
new file mode 100644
index 00000000..a5ac2000
--- /dev/null
+++ b/strata/qt5-tools-qtwebengine.morph
@@ -0,0 +1,23 @@
+name: qt5-tools-qtwebengine
+kind: stratum
+description: Qt5 WebEngine Development Libraries and Tools
+build-depends:
+- morph: strata/multimedia-gstreamer.morph
+- morph: strata/qt5-tools.morph
+- morph: strata/ruby.morph
+chunks:
+- name: qtwebchannel
+ repo: upstream:qt5/qtwebchannel
+ ref: 392da2b649ce669bf329b49668a69007179e4726
+ unpetrify-ref: 5.9.1
+ build-system: qmake
+- name: qtwebengine
+ repo: upstream:qt5/qtwebengine
+ ref: 0340d87b7c12a5e56966e61db156e4a299b57bd9
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtwebchannel
+ submodules:
+ src/3rdparty:
+ url: upstream:qt5/qtwebengine-chromium.git
diff --git a/strata/qt5-tools-qtwebkit.morph b/strata/qt5-tools-qtwebkit.morph
new file mode 100644
index 00000000..012834ff
--- /dev/null
+++ b/strata/qt5-tools-qtwebkit.morph
@@ -0,0 +1,41 @@
+name: qt5-tools-qtwebkit
+kind: stratum
+description: Qt5 WebKit Development Libraries and Tools
+build-depends:
+- morph: strata/multimedia-gstreamer.morph
+- morph: strata/qt5-tools.morph
+- morph: strata/ruby.morph
+chunks:
+- name: qtwebchannel
+ repo: upstream:qt5/qtwebchannel
+ ref: 392da2b649ce669bf329b49668a69007179e4726
+ unpetrify-ref: 5.9.1
+ build-system: qmake
+- name: qtwebkit
+ repo: upstream:qt5/qtwebkit
+ ref: d10511e0a3f655ab2b1dfebfd9c17ade151a7cfe
+ unpetrify-ref: '5.212'
+ build-system: qmake
+ build-depends:
+ - qtwebchannel
+- name: qtwebkit-examples
+ repo: upstream:qt5/qtwebkit-examples
+ ref: f544b2eec0c18b7674ac4df629ae98e8cacce5c7
+ unpetrify-ref: 5.9.1
+ build-system: qmake
+ build-depends:
+ - qtwebkit
+- name: qttools
+ repo: upstream:qt5/qttools
+ ref: dfda6f14b3e210a33b71ef1c6fa3c75a9c866cce
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtwebkit
+- name: qttranslations
+ repo: upstream:qt5/qttranslations
+ ref: ad5a9af215e2b1276893490c7fe92de39cc25005
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qttools
diff --git a/strata/qt5-tools.morph b/strata/qt5-tools.morph
new file mode 100644
index 00000000..87792a12
--- /dev/null
+++ b/strata/qt5-tools.morph
@@ -0,0 +1,132 @@
+name: qt5-tools
+kind: stratum
+description: Qt5 Development Libraries and Tools
+build-depends:
+- morph: strata/icu-common.morph
+- morph: strata/tools.morph
+- morph: strata/x-generic.morph
+chunks:
+- name: qtbase
+ morph: strata/qt5-tools/qtbase.morph
+ repo: upstream:qt5/qtbase
+ ref: 160533328cae32c8647cecafad21233aa3529659
+ unpetrify-ref: v5.9.1
+- name: qtsvg
+ repo: upstream:qt5/qtsvg
+ ref: 96d3cb055fe477aa2699682555c3c33c66e0e300
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+- name: qtscript
+ repo: upstream:qt5/qtscript
+ ref: dc65e802cae6751b167ada36b45f5b7ec53a1865
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+- name: qtdeclarative
+ repo: upstream:qt5/qtdeclarative
+ ref: 525de4ff29cfefd9f676ba35a4e8d7494e5198c2
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+ - qtscript
+ submodules:
+ tests/auto/qml/ecmascripttests/test262:
+ url: upstream:qt5/qtdeclarative-testsuites.git
+- name: qt3d
+ repo: upstream:qt5/qt3d
+ ref: 6310f055965f824f716ccc3fbc99e4209f667635
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+ - qtscript
+ - qtdeclarative
+- name: qtquickcontrols
+ repo: upstream:qt5/qtquickcontrols
+ ref: 5362d2d12970e435cc03dbd354fdd781ae666101
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+ - qtdeclarative
+- name: qtsensors
+ repo: upstream:qt5/qtsensors
+ ref: c67dbe9b0f853bd607fcdc29d8f7a128db7d9f0a
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+- name: qtserialport
+ repo: upstream:qt5/qtserialport
+ ref: 385eb5bcb9b230222a99dc8c125b3d13be978465
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+- name: qtx11extras
+ repo: upstream:qt5/qtx11extras
+ ref: a4eef519a7524835c93f5658dbf7064c83e33bbc
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+- name: qtxmlpatterns
+ repo: upstream:qt5/qtxmlpatterns
+ ref: 55bf61b68b42a79548bf1bf1358981d40cf75911
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+ submodules:
+ tests/auto/3rdparty/testsuites:
+ url: upstream:qt5/qtxmlpatterns-testsuites.git
+- name: qtdoc
+ repo: upstream:qt5/qtdoc
+ ref: 77ba407df4dc4257f9df37305c25bb6c0f5fb886
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+- name: qtgraphicaleffects
+ repo: upstream:qt5/qtgraphicaleffects
+ ref: ef26dd7c053c3a7a816e78a95898072a8f9b22ed
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+ - qtdeclarative
+- name: qtimageformats
+ repo: upstream:qt5/qtimageformats
+ ref: 6a325512a8d50f68a650ec9822dcd918653567c4
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+- name: qtconnectivity
+ repo: upstream:qt5/qtconnectivity
+ ref: a6772267d013bff5fbdf09634dc60977d83933b3
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+- name: qtlocation
+ repo: upstream:qt5/qtlocation
+ ref: dc70a1ffdcb6ab5753773917642b4d89e68d21e7
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
+ submodules:
+ src/3rdparty/mapbox-gl-native:
+ url: upstream:qt5/qtlocation-mapboxgl.git
+- name: qtwebsockets
+ repo: upstream:qt5/qtwebsockets
+ ref: 2818cc3e3d1aeb739eb82d5636a8caf56f5cfaf2
+ unpetrify-ref: v5.9.1
+ build-system: qmake
+ build-depends:
+ - qtbase
diff --git a/strata/qt5-tools/qtbase.morph b/strata/qt5-tools/qtbase.morph
new file mode 100644
index 00000000..0a6c61bc
--- /dev/null
+++ b/strata/qt5-tools/qtbase.morph
@@ -0,0 +1,5 @@
+name: qtbase
+kind: chunk
+build-system: qmake
+configure-commands:
+- ./configure -v -prefix /usr -opensource -confirm-license
diff --git a/strata/ruby.morph b/strata/ruby.morph
new file mode 100644
index 00000000..88e4d629
--- /dev/null
+++ b/strata/ruby.morph
@@ -0,0 +1,54 @@
+name: ruby
+kind: stratum
+description: |
+ Ruby and common Ruby build dependencies.
+
+ Most Gem dependencies are not required when building or installing the
+ Gem. They are needed at runtime only. Tools which extend Rake, such as
+ 'hoe' and 'rake-compiler', are exceptions to that rule, and are kept
+ in this stratum so they are always available when building other Gems.
+build-depends:
+- morph: strata/tools.morph
+chunks:
+- name: ruby-1.8
+ morph: strata/ruby/ruby-1.8.morph
+ repo: upstream:ruby
+ ref: 7a24f1710028d568ad61d0aa49d5178260178d77
+ unpetrify-ref: baserock/morph/ruby_1_8_7
+- name: libyaml
+ repo: upstream:libyaml-hg
+ ref: 0577078d6625a7bf06e6bc7fb26a43e27400b17e
+ unpetrify-ref: master
+ build-system: autotools
+- name: ruby
+ morph: strata/ruby/ruby.morph
+ repo: upstream:ruby
+ ref: 05604af5a6da635b8bca51269db8b433972e82c0
+ unpetrify-ref: baserock/ruby_2_0_0
+ build-depends:
+ - ruby-1.8
+ - libyaml
+- name: bundler
+ morph: strata/ruby/bundler.morph
+ repo: upstream:bundler
+ ref: 0708fbe62617a63300e1cc3b9869cc1280c57ef6
+ unpetrify-ref: baserock/v1.6.2
+ build-depends:
+ - libyaml
+ - ruby
+- name: hoe
+ morph: strata/ruby/hoe.morph
+ repo: upstream:ruby-gems/hoe
+ ref: 50a2706d0f70ece52922ddcc56630e1e0655b83e
+ unpetrify-ref: master
+ build-depends:
+ - ruby
+ - libyaml
+- name: rake-compiler
+ morph: strata/ruby/rake-compiler.morph
+ repo: upstream:ruby-gems/rake-compiler
+ ref: aaed621f6fdb0b0395775fea5464cc83e794fbdb
+ unpetrify-ref: v0.9.3
+ build-depends:
+ - libyaml
+ - ruby
diff --git a/strata/ruby/bundler.morph b/strata/ruby/bundler.morph
new file mode 100644
index 00000000..643ef119
--- /dev/null
+++ b/strata/ruby/bundler.morph
@@ -0,0 +1,6 @@
+name: bundler
+kind: chunk
+build-commands:
+- rake build
+install-commands:
+- gem install ./pkg/*gem --bindir "$DESTDIR/$PREFIX/bin" --install-dir "$DESTDIR/$PREFIX/lib/ruby/gems/2.0.0"
diff --git a/strata/ruby/hoe.morph b/strata/ruby/hoe.morph
new file mode 100644
index 00000000..0d06a82a
--- /dev/null
+++ b/strata/ruby/hoe.morph
@@ -0,0 +1,16 @@
+name: hoe
+kind: chunk
+description: |
+ Hoe is a rake/rubygems helper for project Rakefiles. It helps you
+ manage, maintain, and release your project and includes a dynamic
+ plug-in system allowing for easy extensibility.
+products:
+- artifact: hoe-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- rake gem
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./pkg/hoe-*.gem
diff --git a/strata/ruby/rake-compiler.morph b/strata/ruby/rake-compiler.morph
new file mode 100644
index 00000000..9286f14a
--- /dev/null
+++ b/strata/ruby/rake-compiler.morph
@@ -0,0 +1,15 @@
+name: rake-compiler
+kind: chunk
+description: |
+ Provide a standard and simplified way to build and package Ruby
+ extensions (C, Java) using Rake as glue.
+products:
+- artifact: rake-compiler-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- rake gem
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./pkg/rake-compiler-*.gem
diff --git a/strata/ruby/ruby-1.8.morph b/strata/ruby/ruby-1.8.morph
new file mode 100644
index 00000000..4554e441
--- /dev/null
+++ b/strata/ruby/ruby-1.8.morph
@@ -0,0 +1,9 @@
+name: ruby-1.8
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- cp /usr/share/automake*/config.guess .
+- cp /usr/share/automake*/config.sub .
+- autoconf
+configure-commands:
+- ./configure --prefix=/usr --program-suffix=-1.8
diff --git a/strata/ruby/ruby.morph b/strata/ruby/ruby.morph
new file mode 100644
index 00000000..f9f0ae7c
--- /dev/null
+++ b/strata/ruby/ruby.morph
@@ -0,0 +1,9 @@
+name: ruby
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- cp /usr/share/automake*/config.guess tool
+- cp /usr/share/automake*/config.sub tool
+- autoconf
+configure-commands:
+- ./configure --prefix=/usr --enable-shared --with-baseruby=/usr/bin/ruby-1.8
diff --git a/strata/samba.morph b/strata/samba.morph
new file mode 100644
index 00000000..97e72c7a
--- /dev/null
+++ b/strata/samba.morph
@@ -0,0 +1,13 @@
+name: samba
+kind: stratum
+description: Simple samba server
+build-depends:
+- morph: strata/core.morph
+- morph: strata/foundation.morph
+- morph: strata/python2-core.morph
+chunks:
+- name: samba
+ morph: strata/samba/samba.morph
+ repo: upstream:samba
+ ref: 704592c14dfedbe98e95d43860d062dc6338bca3
+ unpetrify-ref: master
diff --git a/strata/samba/samba.morph b/strata/samba/samba.morph
new file mode 100644
index 00000000..748ee886
--- /dev/null
+++ b/strata/samba/samba.morph
@@ -0,0 +1,127 @@
+name: samba
+kind: chunk
+configure-commands:
+- |
+ # Here are really really ugly hacks:
+ #
+ # This fixes a problem with ./configure and recent compilers
+ # which implement c9x by default.
+ sed -i "s/#define bool int//" source3/lib/util_sec.c
+ #
+ # This fixes the problem with Baserock build environments running
+ # as root but sandboxed, and preventing certain privileged operations
+ # from taking effect. eg. seteuid()
+ # Instead, convince it that we're not running as root so that it
+ # doesn't run these tests.
+ sed -i "s/getuid() != 0/1/" source3/lib/util_sec.c
+ #
+ #
+ ./configure \
+ --without-ldap \
+ --disable-gnutls \
+ --without-ad-dc \
+ --without-acl-support \
+ --without-ads \
+ --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var --enable-fhs
+build-commands:
+- make
+install-commands:
+- make install DESTDIR="$DESTDIR"
+# systemd configuration
+- mkdir -p "$DESTDIR/etc/tmpfiles.d"
+- install -m 644 ./packaging/systemd/samba.conf.tmp "$DESTDIR/etc/tmpfiles.d/samba.conf"
+- mkdir -p "$DESTDIR/lib/systemd/system/multi-user.target.wants"
+- |
+ cat <<EOF >"$DESTDIR/lib/systemd/system/nmb.service"
+ [Unit]
+ Description=Samba NMB Daemon
+ After=syslog.target network-online.target
+
+ [Service]
+ Type=forking
+ PIDFile=/var/run/samba/nmbd.pid
+ EnvironmentFile=-/etc/sysconfig/samba
+ ExecStart=$PREFIX/sbin/nmbd \$NMBDOPTIONS
+ ExecReload=$PREFIX/bin/kill -HUP \$MAINPID
+
+ [Install]
+ WantedBy=multi-user.target
+ EOF
+- |
+ cat <<EOF >"$DESTDIR/lib/systemd/system/smb.service"
+ [Unit]
+ Description=Samba SMB Daemon
+ After=syslog.target network-online.target nmb.service winbind.service
+
+ [Service]
+ Type=forking
+ PIDFile=/var/run/samba/smbd.pid
+ EnvironmentFile=-/etc/sysconfig/samba
+ ExecStart=$PREFIX/sbin/smbd \$NMBDOPTIONS
+ ExecReload=$PREFIX/bin/kill -HUP \$MAINPID
+
+ [Install]
+ WantedBy=multi-user.target
+ EOF
+- |
+ cat <<EOF >"$DESTDIR/lib/systemd/system/winbind.service"
+ [Unit]
+ Description=Samba winbind Daemon
+ After=syslog.target network-online.target nmb.service
+
+ [Service]
+ Type=forking
+ PIDFile=/var/run/samba/winbindd.pid
+ EnvironmentFile=-/etc/sysconfig/samba
+ ExecStart=$PREFIX/sbin/winbindd \$NMBDOPTIONS
+ ExecReload=$PREFIX/bin/kill -HUP \$MAINPID
+
+ [Install]
+ WantedBy=multi-user.target
+ EOF
+- |
+ for i in nmb smb winbind
+ do
+ ln -s ../$i.service "$DESTDIR/lib/systemd/system/multi-user.target.wants/$i.service"
+ done
+- mkdir -p "$DESTDIR/var/log/samba"
+# Install a sample configuration
+- mkdir -p "$DESTDIR/etc/samba"
+- |
+ cat <<EOF >"$DESTDIR/etc/samba/smb.conf"
+ [global]
+ workgroup = WORKGROUP
+ dns proxy = no
+ local master = yes
+ preferred master = yes
+ os level = 2
+ log file = /var/log/samba/log.%m
+ max log size = 1000
+ syslog = 0
+ server role = standalone server
+ passdb backend = tdbsam
+ obey pam restrictions = yes
+ unix password sync = yes
+ pam password change = yes
+ map to guest = bad user
+ usershare allow guests = yes
+ [homes]
+ comment = Home Directories
+ browseable = no
+ read only = yes
+ create mask = 0700
+ valid users = %S
+ ;[printers]
+ ;comment = All Printers
+ ;browseable = no
+ ;path = /var/spool/samba
+ ;printable = yes
+ ;guest ok = no
+ ;read only = yes
+ ;create mask = 0700
+ ;[src]
+ ;comment = Source code
+ ;path = /src
+ ;read only = yes
+ ;guest ok = yes
+ EOF
diff --git a/strata/sandboxing.morph b/strata/sandboxing.morph
new file mode 100644
index 00000000..64de36c3
--- /dev/null
+++ b/strata/sandboxing.morph
@@ -0,0 +1,18 @@
+name: sandboxing
+kind: stratum
+description: |
+ Libraries/tools for running programs/commands in a (partially) isolated
+ environment.
+build-depends:
+- morph: strata/python2-core.morph
+chunks:
+- name: sandboxlib
+ repo: upstream:sandboxlib
+ ref: ce30050daa10fa32801e8f798911b36aa82343a4
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: linux-user-chroot
+ repo: upstream:linux-user-chroot
+ ref: 40e0b71d556414dfe150a74937f2c8a68d351d6d
+ unpetrify-ref: v2015.1
+ build-system: autotools
diff --git a/strata/secret-service.morph b/strata/secret-service.morph
new file mode 100644
index 00000000..b6f9e896
--- /dev/null
+++ b/strata/secret-service.morph
@@ -0,0 +1,27 @@
+name: secret-service
+kind: stratum
+description: Service implementing the DBus Secret Service API
+build-depends:
+- morph: strata/foundation.morph
+- morph: strata/glib-common.morph
+- morph: strata/gtk3.morph
+- morph: strata/network-security.morph
+- morph: strata/vala-common.morph
+chunks:
+- name: gcr
+ repo: upstream:gnome/gcr
+ ref: 289ba4859fd170285f51e6bbfe91f2aac3b9170d
+ unpetrify-ref: 3.18.0
+ build-system: autotools
+- name: gnome-keyring
+ morph: strata/secret-service/gnome-keyring.morph
+ repo: upstream:gnome-keyring
+ ref: eb16c037431da14d4f1c396357f82f2b35e76e23
+ unpetrify-ref: baserock/3.18.3-5-geb16c03
+ build-depends:
+ - gcr
+- name: libsecret
+ morph: strata/secret-service/libsecret.morph
+ repo: upstream:gnome/libsecret
+ ref: 4d76cf7dd8e55d93bb58164a1fff38113ba97af5
+ unpetrify-ref: master
diff --git a/strata/secret-service/gnome-keyring.morph b/strata/secret-service/gnome-keyring.morph
new file mode 100644
index 00000000..73fe5298
--- /dev/null
+++ b/strata/secret-service/gnome-keyring.morph
@@ -0,0 +1,5 @@
+name: gnome-keyring
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-selinux --enable-pam --with-pam-dir=/lib/security --disable-doc
diff --git a/strata/secret-service/libsecret.morph b/strata/secret-service/libsecret.morph
new file mode 100644
index 00000000..b8af29b1
--- /dev/null
+++ b/strata/secret-service/libsecret.morph
@@ -0,0 +1,5 @@
+name: libsecret
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-manpages
diff --git a/strata/sound-server-pulseaudio.morph b/strata/sound-server-pulseaudio.morph
new file mode 100644
index 00000000..e9f9d830
--- /dev/null
+++ b/strata/sound-server-pulseaudio.morph
@@ -0,0 +1,74 @@
+name: sound-server-pulseaudio
+kind: stratum
+description: Components required for pulseaudio.
+build-depends:
+- morph: strata/bluetooth.morph
+chunks:
+- name: libatomic_ops
+ repo: upstream:libatomic_ops
+ ref: 0a58f5d63969c10d2141af89cb7a53df786909ab
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: alsa-lib
+ repo: upstream:alsa-lib
+ ref: 7e86c8c56fba6fd8cdb57ee97aaa731c351a8892
+ # Note: ref anchored because alsa-lib is known for rebasing
+ # tags, and master
+ unpetrify-ref: baserock/v1.1.3
+ build-system: autotools
+- name: alsa-utils
+ morph: strata/sound-server-pulseaudio/alsa-utils.morph
+ repo: upstream:alsa-utils
+ ref: 84591f0de015e5c40f5bfea83ca62360b9eaa349
+ # Note: ref anchored because alsa-utils is known for rebasing
+ # tags, and master
+ unpetrify-ref: baserock/v1.1.3
+ build-depends:
+ - alsa-lib
+- name: speex
+ repo: upstream:speex
+ ref: e5dc987a403426ee3d0d81768afffa0fe74e20fa
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: libsndfile
+ morph: strata/sound-server-pulseaudio/libsndfile.morph
+ repo: upstream:libsndfile
+ ref: 6c05c615c95ffef7a8a5a707cde0bb52bdd74244
+ unpetrify-ref: baserock/morph
+- name: libdaemon
+ repo: upstream:libdaemon
+ ref: 9fcc28e0e8f84968d1fb8b6d544a42efb13803ec
+ unpetrify-ref: v0.14
+ build-system: autotools
+- name: avahi
+ morph: strata/sound-server-pulseaudio/avahi.morph
+ repo: upstream:avahi
+ ref: 4c0b4cbf9c597f6df6a3220dec5438f4fe9e551b
+ unpetrify-ref: v0.6.31
+ build-depends:
+ - libdaemon
+- name: sbc
+ repo: upstream:sbc
+ ref: 24812c660036a693f8770766aa6fdea667de05d0
+ unpetrify-ref: "1.3"
+ build-system: autotools
+ build-depends:
+ - libsndfile
+- name: webrtc-audio-processing
+ morph: strata/sound-server-pulseaudio/webrtc-audio-processing.morph
+ repo: upstream:webrtc-audio-processing
+ ref: 9a0e28cab06f43d10cd00b69fc14dee78a73c2d0
+ unpetrify-ref: v0.2
+- name: pulseaudio
+ morph: strata/sound-server-pulseaudio/pulseaudio.morph
+ repo: upstream:pulseaudio
+ ref: 84952e6a092b6a0c5b153bd7a4f6e490810681c8
+ unpetrify-ref: v10.0
+ build-depends:
+ - avahi
+ - libsndfile
+ - libatomic_ops
+ - speex
+ - alsa-lib
+ - sbc
+ - webrtc-audio-processing
diff --git a/strata/sound-server-pulseaudio/alsa-utils.morph b/strata/sound-server-pulseaudio/alsa-utils.morph
new file mode 100644
index 00000000..a6a1e041
--- /dev/null
+++ b/strata/sound-server-pulseaudio/alsa-utils.morph
@@ -0,0 +1,7 @@
+name: alsa-utils
+kind: chunk
+description: ALSA utilities
+build-system: autotools
+configure-commands:
+- autoreconf -ifv
+- ./configure --prefix="$PREFIX" --disable-xmlto
diff --git a/strata/sound-server-pulseaudio/avahi.morph b/strata/sound-server-pulseaudio/avahi.morph
new file mode 100644
index 00000000..a255ce1e
--- /dev/null
+++ b/strata/sound-server-pulseaudio/avahi.morph
@@ -0,0 +1,16 @@
+name: avahi
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var --disable-werror \
+ --with-distro=none --disable-qt3 --disable-qt4 --disable-gtk --disable-gtk3 \
+ --disable-pygtk --disable-python-dbus --disable-mono --disable-manpages
+system-integration:
+ avahi-misc:
+ 00-add-avahi-user:
+ - groupadd -fg 86 netdev
+ - groupadd -fg 84 avahi
+ - useradd -c "Avahi Daemon Owner" -d /var/run/avahi-daemon -u 84 -g avahi -s /bin/false avahi
+ 00-enable-avahi-service:
+ - systemctl enable avahi-daemon
diff --git a/strata/sound-server-pulseaudio/libsndfile.morph b/strata/sound-server-pulseaudio/libsndfile.morph
new file mode 100644
index 00000000..8d6c2fe0
--- /dev/null
+++ b/strata/sound-server-pulseaudio/libsndfile.morph
@@ -0,0 +1,5 @@
+name: libsndfile
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --prefix="$PREFIX" --disable-external-libs
diff --git a/strata/sound-server-pulseaudio/pulseaudio.morph b/strata/sound-server-pulseaudio/pulseaudio.morph
new file mode 100644
index 00000000..dfaa9b0d
--- /dev/null
+++ b/strata/sound-server-pulseaudio/pulseaudio.morph
@@ -0,0 +1,18 @@
+name: pulseaudio
+kind: chunk
+description: PulseAudio System
+build-system: autotools
+pre-configure-commands:
+- NOCONFIGURE=1 ./bootstrap.sh
+configure-commands:
+- ./configure --prefix="$PREFIX" --localstatedir=/var --sysconfdir=/etc --with-database=simple
+ --with-systemduserunitdir=/usr/lib/systemd/user
+ --with-system-user=pulse --with-system-group=pulse --with-access-group=pulse-access
+ --enable-webrtc-aec
+system-integration:
+ pulseaudio-misc:
+ 00-add-pulse-users:
+ - groupadd -rf pulse-access
+ - groupadd -rf pulse-rt
+ - groupadd -f -g 171 -r pulse
+ - useradd -r -g pulse -d /var/run/pulse -s /bin/false -c "PulseAudio System Daemon" pulse || exit 0
diff --git a/strata/sound-server-pulseaudio/webrtc-audio-processing.morph b/strata/sound-server-pulseaudio/webrtc-audio-processing.morph
new file mode 100644
index 00000000..ea8cd4e0
--- /dev/null
+++ b/strata/sound-server-pulseaudio/webrtc-audio-processing.morph
@@ -0,0 +1,14 @@
+name: webrtc-audio-processing
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ NOCONFIGURE=1 ./autogen.sh
+
+ case "$MORPH_ARCH" in
+ x86_32)
+ sed -i -e "s/-O2/& -msse2/" configure
+ ;;
+ esac
+
+ ./configure --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var
diff --git a/strata/spell-checking.morph b/strata/spell-checking.morph
new file mode 100644
index 00000000..dfe8b997
--- /dev/null
+++ b/strata/spell-checking.morph
@@ -0,0 +1,16 @@
+name: spell-checking
+kind: stratum
+description: Spell checking libraries
+build-depends:
+- morph: strata/glib-common.morph
+chunks:
+- name: enchant
+ repo: upstream:enchant
+ ref: 6d8b6bb15f09a14c90fb900eb2ecf1172d7cf6cf
+ unpetrify-ref: master
+ build-system: autotools
+- name: hyphen
+ repo: upstream:hyphen
+ ref: 7f28cf7edb54cc1bc4eaa09672e0bc043b1da70b
+ unpetrify-ref: master
+ build-system: autotools
diff --git a/strata/storage-management.morph b/strata/storage-management.morph
new file mode 100644
index 00000000..c972d0d3
--- /dev/null
+++ b/strata/storage-management.morph
@@ -0,0 +1,40 @@
+name: storage-management
+kind: stratum
+description: libraries/services that provides access to storage
+build-depends:
+- morph: strata/device-management.morph
+- morph: strata/glib-common.morph
+- morph: strata/privileges-management.morph
+- morph: strata/secret-service.morph
+chunks:
+- name: libatasmart
+ morph: strata/storage-management/libatasmart.morph
+ repo: upstream:libatasmart
+ ref: de6258940960443038b4c1651dfda3620075e870
+ unpetrify-ref: master
+- name: udisks
+ morph: strata/storage-management/udisks.morph
+ repo: upstream:udisks
+ ref: 410cab8f3d749ad2660cda3ba38b6aece42bf10f
+ unpetrify-ref: master
+ build-depends:
+ - libatasmart
+- name: libgphoto2
+ repo: upstream:libgphoto2
+ ref: 3745402108932b457d73b102cbf8b2da8d383a18
+ unpetrify-ref: libgphoto2-2_5_9-release
+ build-system: autotools
+- name: libmtp
+ morph: strata/storage-management/libmtp.morph
+ repo: upstream:libmtp
+ ref: 83820ced69dca750b2edd6ac6d5640f246022a10
+ unpetrify-ref: libmtp-1-1-11
+- name: gvfs
+ morph: strata/storage-management/gvfs.morph
+ repo: upstream:gvfs
+ ref: d037b5fd56cae878ed7bb5269a40e4bd046551d7
+ unpetrify-ref: master
+ build-depends:
+ - libgphoto2
+ - libmtp
+ - udisks
diff --git a/strata/storage-management/gvfs.morph b/strata/storage-management/gvfs.morph
new file mode 100644
index 00000000..bafd3158
--- /dev/null
+++ b/strata/storage-management/gvfs.morph
@@ -0,0 +1,5 @@
+name: gvfs
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --disable-documentation
diff --git a/strata/storage-management/libatasmart.morph b/strata/storage-management/libatasmart.morph
new file mode 100644
index 00000000..e8df654e
--- /dev/null
+++ b/strata/storage-management/libatasmart.morph
@@ -0,0 +1,6 @@
+name: libatasmart
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh
+- ./configure CFLAGS='-g -O0 -Wp,-U_FORTIFY_SOURCE' --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib --libexecdir=/usr/lib
diff --git a/strata/storage-management/libmtp.morph b/strata/storage-management/libmtp.morph
new file mode 100644
index 00000000..8dbb22ba
--- /dev/null
+++ b/strata/storage-management/libmtp.morph
@@ -0,0 +1,8 @@
+name: libmtp
+kind: chunk
+build-system: autotools
+configure-commands:
+# autogen.sh asks user about autoupdate config.sub and config.guess
+- touch config.rpath
+- autoreconf -if
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var
diff --git a/strata/storage-management/udisks.morph b/strata/storage-management/udisks.morph
new file mode 100644
index 00000000..785fab39
--- /dev/null
+++ b/strata/storage-management/udisks.morph
@@ -0,0 +1,5 @@
+name: udisks
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc --enable-fhs-media --disable-gtk-doc --disable-man
diff --git a/strata/swift.morph b/strata/swift.morph
new file mode 100644
index 00000000..41fd0c75
--- /dev/null
+++ b/strata/swift.morph
@@ -0,0 +1,53 @@
+name: swift
+kind: stratum
+description: Distributed object storage
+build-depends:
+# openstack-common is required for simplejson, cffi, greenlet,
+# eventlet, pastedeploy, netifaces
+- morph: strata/openstack-common.morph
+chunks:
+- name: dnspython
+ repo: upstream:python-packages/dnspython
+ ref: e1369c62d14f82b80ef11197a490ace5d43bb3f3
+ unpetrify-ref: v1.12.0
+ build-system: python-distutils
+- name: xattr
+ morph: strata/swift/xattr.morph
+ repo: upstream:python-packages/xattr
+ ref: dd10d44e3eb9a1d2303c1f7d5126c099d56e97fc
+ unpetrify-ref: v0.7.6
+- name: liberasurecode
+ morph: strata/swift/liberasurecode.morph
+ repo: upstream:liberasurecode
+ ref: a380246762c16ea8eb7dbfccd50d296c3743b39e
+ unpetrify-ref: v1.0.7
+- name: gf-complete
+ morph: strata/swift/gf-complete.morph
+ repo: upstream:gf-complete
+ ref: 715443661c00558fe32f004a4be5f93f341b6e59
+ unpetrify-ref: v2
+- name: jerasure
+ repo: upstream:jerasure
+ ref: ff7032153ea230fb59596f1f8a0e9ad8653addfb
+ unpetrify-ref: v2
+ build-system: autotools
+ build-depends:
+ - gf-complete
+- name: pyeclib
+ repo: upstream:python-packages/pyeclib
+ ref: aa58aa887c2327e1394d6f28b3b6b7ab8f190b2b
+ unpetrify-ref: v1.0.7
+ build-system: python-distutils
+ build-depends:
+ - liberasurecode
+ - gf-complete
+ - jerasure
+- name: swift
+ repo: upstream:openstack/swift
+ ref: f8dee761bd36f857aa1288c27e095907032fad68
+ unpetrify-ref: 2.3.0
+ build-system: python-distutils
+ build-depends:
+ - dnspython
+ - xattr
+ - pyeclib
diff --git a/strata/swift/gf-complete.morph b/strata/swift/gf-complete.morph
new file mode 100644
index 00000000..adbe5a48
--- /dev/null
+++ b/strata/swift/gf-complete.morph
@@ -0,0 +1,19 @@
+name: gf-complete
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- ./autogen.sh
+configure-commands:
+- |
+ case "$MORPH_ARCH" in
+ x86_64)
+ SSE=
+ ;;
+ *)
+ # Disable SSE4 for any architecture which are not x86_64 bits
+ # see more information about architecture which support SSE in
+ # https://en.wikipedia.org/wiki/SSE4#Supporting_CPUs.
+ SSE=--disable-sse
+ ;;
+ esac
+ ./configure --prefix="$PREFIX" "$SSE"
diff --git a/strata/swift/liberasurecode.morph b/strata/swift/liberasurecode.morph
new file mode 100644
index 00000000..68839403
--- /dev/null
+++ b/strata/swift/liberasurecode.morph
@@ -0,0 +1,5 @@
+name: liberasurecode
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- autoreconf -ivf
diff --git a/strata/swift/xattr.morph b/strata/swift/xattr.morph
new file mode 100644
index 00000000..65f47dae
--- /dev/null
+++ b/strata/swift/xattr.morph
@@ -0,0 +1,8 @@
+name: xattr
+kind: chunk
+configure-commands:
+- cp -r /usr/lib/python2.7/site-packages/cffi .
+build-commands:
+- python setup.py build
+install-commands:
+- python setup.py install --prefix "$PREFIX" --root "$DESTDIR"
diff --git a/strata/tools.morph b/strata/tools.morph
new file mode 100644
index 00000000..b4710f6b
--- /dev/null
+++ b/strata/tools.morph
@@ -0,0 +1,69 @@
+name: tools
+kind: stratum
+description: Various tools
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: distcc
+ morph: strata/tools/distcc.morph
+ repo: upstream:distcc
+ ref: c9691a9604fdf9d6711204999787d332b7141692
+ unpetrify-ref: baserock/morph
+- name: gdb
+ morph: strata/tools/gdb.morph
+ repo: upstream:binutils-gdb
+ ref: cf9e333b2158c90752a1eacd16a9443dff4a59f1
+ unpetrify-ref: gdb-8.0-branch
+- name: lsof
+ morph: strata/tools/lsof.morph
+ repo: upstream:lsof
+ ref: fffb8558208586338587027c265fd0eca44466be
+ unpetrify-ref: baserock/morph
+- name: strace
+ repo: upstream:strace
+ ref: 6d8c0637e8dd0f65c667af33c612230552419db1
+ unpetrify-ref: v4.8
+ build-system: autotools
+- name: u-boot
+ morph: strata/tools/u-boot.morph
+ repo: upstream:u-boot
+ ref: fe57382d04b46c37f34cf8d3b3ad876554fd12bf
+ unpetrify-ref: baserock/morph
+- name: kexec-tools
+ morph: strata/tools/kexec-tools.morph
+ repo: upstream:kexec-tools
+ ref: f4d1d2ad474e882df13418239aa3050673a844d7
+ unpetrify-ref: baserock/morph
+- name: device-tree-compiler
+ morph: strata/tools/device-tree-compiler.morph
+ repo: upstream:device-tree-compiler
+ ref: c92f284c3cf76d471eb27a271de3a51cb45ed058
+ unpetrify-ref: baserock/morph
+- name: sudo
+ repo: upstream:sudo
+ ref: a4769dc7999b53260325fb89945bef85714fb338
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: procps-ng
+ morph: strata/tools/procps-ng.morph
+ repo: upstream:procps-ng
+ ref: 85fff468fa263cdd2ff1c0144579527c32333695
+ unpetrify-ref: v3.3.9
+- name: ipmitool
+ morph: strata/tools/ipmitool.morph
+ repo: upstream:ipmitool
+ ref: be7917f9f58c8a354bc0960ed57516af5d2bd29a
+ unpetrify-ref: IPMITOOL_1_8_14
+- name: parted
+ morph: strata/tools/parted.morph
+ repo: upstream:parted
+ ref: 387e96e6eac59d84e9a688422b4b321ae9beaa20
+ unpetrify-ref: baserock/v3.2
+ submodules:
+ gnulib:
+ url: upstream:gnulib
+- name: zip
+ morph: strata/tools/zip.morph
+ repo: upstream:zip
+ ref: e52e9d6a339aad5fcff464cf207da51c02996e39
+ unpetrify-ref: zip30
diff --git a/strata/tools/device-tree-compiler.morph b/strata/tools/device-tree-compiler.morph
new file mode 100644
index 00000000..8abfafc8
--- /dev/null
+++ b/strata/tools/device-tree-compiler.morph
@@ -0,0 +1,6 @@
+name: device-tree-compiler
+kind: chunk
+build-commands:
+- make all
+install-commands:
+- make install DESTDIR="$DESTDIR" PREFIX="$PREFIX"
diff --git a/strata/tools/distcc.morph b/strata/tools/distcc.morph
new file mode 100644
index 00000000..82adbe50
--- /dev/null
+++ b/strata/tools/distcc.morph
@@ -0,0 +1,10 @@
+name: distcc
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- NOCONFIGURE=1 ./autogen.sh
+# distcc doesn't use automake, so we cannot autoreconf it
+- cp /usr/share/automake*/config.guess .
+- cp /usr/share/automake*/config.sub .
+configure-commands:
+- ./configure --prefix="$PREFIX" --disable-Werror
diff --git a/strata/tools/gdb.morph b/strata/tools/gdb.morph
new file mode 100644
index 00000000..6f60da9e
--- /dev/null
+++ b/strata/tools/gdb.morph
@@ -0,0 +1,6 @@
+name: gdb
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --prefix="$PREFIX" --disable-werror --disable-gas --disable-binutils
+ --disable-ld --disable-gold --disable-gprof
diff --git a/strata/tools/git-fat.morph b/strata/tools/git-fat.morph
new file mode 100644
index 00000000..c971b07f
--- /dev/null
+++ b/strata/tools/git-fat.morph
@@ -0,0 +1,4 @@
+name: git-fat
+kind: chunk
+install-commands:
+- install -D -m 755 git-fat "$DESTDIR/usr/bin/git-fat"
diff --git a/strata/tools/ipmitool.morph b/strata/tools/ipmitool.morph
new file mode 100644
index 00000000..db0d5a3a
--- /dev/null
+++ b/strata/tools/ipmitool.morph
@@ -0,0 +1,5 @@
+name: ipmitool
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- touch NEWS
diff --git a/strata/tools/kexec-tools.morph b/strata/tools/kexec-tools.morph
new file mode 100644
index 00000000..118c1ac2
--- /dev/null
+++ b/strata/tools/kexec-tools.morph
@@ -0,0 +1,6 @@
+name: kexec-tools
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./bootstrap
+- ./configure --prefix="$PREFIX"
diff --git a/strata/tools/lsof.morph b/strata/tools/lsof.morph
new file mode 100644
index 00000000..38183ae6
--- /dev/null
+++ b/strata/tools/lsof.morph
@@ -0,0 +1,12 @@
+name: lsof
+kind: chunk
+configure-commands:
+- tar xf lsof_*_src.tar --no-same-owner
+- cd lsof_*_src/ && ./Configure -n linux
+build-commands:
+- cd lsof_*_src/ && make
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX"/bin
+- mv lsof_*_src/lsof "$DESTDIR$PREFIX"/bin/lsof
+- mkdir -p "$DESTDIR$PREFIX"/man/man8
+- mv lsof_*_src/lsof.8 "$DESTDIR$PREFIX"/man/man8
diff --git a/strata/tools/parted.morph b/strata/tools/parted.morph
new file mode 100644
index 00000000..0f279950
--- /dev/null
+++ b/strata/tools/parted.morph
@@ -0,0 +1,12 @@
+name: parted
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- sed -i -e '/^buildreq="/,/^"/{/rsync/d}' bootstrap.conf
+- sed -i -e '/^buildreq="/,/^"/{/perl/d}' bootstrap.conf
+- ./bootstrap --skip-po --no-git --gnulib-srcdir=gnulib
+configure-commands:
+# Disable device-mapper as it is not installed on Baserock
+- ./configure --prefix="$PREFIX" --disable-device-mapper
+build-commands:
+- make WERROR_CFLAGS=""
diff --git a/strata/tools/procps-ng.morph b/strata/tools/procps-ng.morph
new file mode 100644
index 00000000..fb742a23
--- /dev/null
+++ b/strata/tools/procps-ng.morph
@@ -0,0 +1,16 @@
+name: procps-ng
+kind: chunk
+
+description: |
+ Process management tools.
+
+ procps-ng is a fork of the original procps project.
+
+build-system: autotools
+
+configure-commands:
+- NOCONFIGURE=1 ./autogen.sh
+ # Setting exec-prefix to /usr causes a bunch of stuff to go in /usr/usr/bin
+ # Setting prefix to / causes files to go in /include and /share
+ # So don't do either of those things!
+- ./configure --prefix="$PREFIX" --exec-prefix=/
diff --git a/strata/tools/u-boot.morph b/strata/tools/u-boot.morph
new file mode 100644
index 00000000..9be30bc7
--- /dev/null
+++ b/strata/tools/u-boot.morph
@@ -0,0 +1,11 @@
+name: u-boot
+kind: chunk
+build-commands:
+- make tools
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX/bin"
+- install -m 755 tools/img2brec.sh "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/jtagconsole "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/netconsole "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/mkenvimage "$DESTDIR$PREFIX/bin/."
+- install -m 755 tools/mkimage "$DESTDIR$PREFIX/bin/."
diff --git a/strata/tools/zip.morph b/strata/tools/zip.morph
new file mode 100644
index 00000000..070467e0
--- /dev/null
+++ b/strata/tools/zip.morph
@@ -0,0 +1,9 @@
+name: zip
+kind: chunk
+configure-commands:
+- cp unix/Makefile .
+build-commands:
+- sed -i -e 's/^prefix = .*$/prefix = $$DESTDIR\/$$PREFIX/' Makefile
+- make generic
+install-commands:
+- make install
diff --git a/strata/unionfs-fuse-group.morph b/strata/unionfs-fuse-group.morph
new file mode 100644
index 00000000..acb094ea
--- /dev/null
+++ b/strata/unionfs-fuse-group.morph
@@ -0,0 +1,20 @@
+name: unionfs-fuse-group
+kind: stratum
+
+description: |
+ User-space union file system.
+
+ This is used by Morph for systems which are unable to use 'overlayfs'. It is slower
+ than 'overlayfs', because it runs outside rather than inside the kernel, but 'overlayfs'
+ is only available in Linux 3.18 and newer.
+
+build-depends:
+# Depends on foundation for 'fuse', and maybe other stuff.
+- morph: strata/foundation.morph
+
+chunks:
+- name: unionfs-fuse
+ morph: strata/unionfs-fuse-group/unionfs-fuse.morph
+ repo: upstream:unionfs-fuse
+ ref: efac5b7aa91ec860f8f430a8d21060fe53a07002
+ unpetrify-ref: v0.26
diff --git a/strata/unionfs-fuse-group/unionfs-fuse.morph b/strata/unionfs-fuse-group/unionfs-fuse.morph
new file mode 100644
index 00000000..98e1ce1f
--- /dev/null
+++ b/strata/unionfs-fuse-group/unionfs-fuse.morph
@@ -0,0 +1,12 @@
+name: unionfs-fuse
+kind: chunk
+
+description: User-space union file system.
+
+build-system: manual
+
+build-commands:
+- make PREFIX="$PREFIX"
+
+install-commands:
+- make PREFIX="$PREFIX" DESTDIR="$DESTDIR" install
diff --git a/strata/vala-common.morph b/strata/vala-common.morph
new file mode 100644
index 00000000..e1438de3
--- /dev/null
+++ b/strata/vala-common.morph
@@ -0,0 +1,35 @@
+name: vala-common
+kind: stratum
+description: Vala compiler
+build-depends:
+- morph: strata/core.morph
+- morph: strata/glib-common.morph
+chunks:
+- name: vala-bootstrap
+ morph: strata/vala-common/vala-bootstrap.morph
+ repo: upstream:vala
+ ref: 4e4a02c03445336237b36723b23a91670ef7621b
+ unpetrify-ref: baserock/bootstrap
+- name: vala
+ repo: upstream:vala
+ ref: 5f6ebe007050be12bdc4aa7c902ae4059f28874a
+ unpetrify-ref: 0.28.0
+ build-system: autotools
+ build-depends:
+ - vala-bootstrap
+- name: m4-common
+ repo: upstream:m4-common
+ ref: 6e9a4d3b35c5ce8af050e66d8caff96070c57d34
+ unpetrify-ref: baserock/2015-12-15
+ build-system: autotools
+ submodules:
+ autoconf-archive:
+ url: upstream:autoconf-archive
+- name: libgee
+ repo: upstream:gnome/libgee
+ ref: 4301ab58efc217409c588a5527f68990b4e3d220
+ unpetrify-ref: master
+ build-system: autotools
+ build-depends:
+ - m4-common
+ - vala
diff --git a/strata/vala-common/vala-bootstrap.morph b/strata/vala-common/vala-bootstrap.morph
new file mode 100644
index 00000000..e55b1887
--- /dev/null
+++ b/strata/vala-common/vala-bootstrap.morph
@@ -0,0 +1,7 @@
+name: vala-bootstrap
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- autoreconf -ivf
+configure-commands:
+- ./configure --prefix="$PREFIX"
diff --git a/strata/virtualbox-guest-x86_64.morph b/strata/virtualbox-guest-x86_64.morph
new file mode 100644
index 00000000..fadcec92
--- /dev/null
+++ b/strata/virtualbox-guest-x86_64.morph
@@ -0,0 +1,22 @@
+name: virtualbox-guest-x86_64
+kind: stratum
+description: |
+ VirtualBox Guest Additions for x86_64
+build-depends:
+- morph: strata/tools.morph
+- morph: strata/bsp-x86_64-generic.morph
+- morph: strata/x-common.morph
+- morph: strata/x-generic.morph
+chunks:
+- name: yasm
+ morph: strata/virtualbox-guest-x86_64/yasm.morph
+ repo: upstream:yasm
+ ref: fefefe262eb29081f0bcb4d48f2d476ce5730562
+ unpetrify-ref: baserock/morph
+- name: vboxguest
+ morph: strata/virtualbox-guest-x86_64/vboxguest.morph
+ repo: upstream:VirtualBox
+ ref: 617aeb5a3c13f4a46423e8c2fb560449403ad56d
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - yasm
diff --git a/strata/virtualbox-guest-x86_64/vboxguest.morph b/strata/virtualbox-guest-x86_64/vboxguest.morph
new file mode 100644
index 00000000..1ab7f0f1
--- /dev/null
+++ b/strata/virtualbox-guest-x86_64/vboxguest.morph
@@ -0,0 +1,34 @@
+name: vboxguest
+kind: chunk
+description: |
+ VirtualBox guest additions
+max-jobs: 1
+build-commands:
+- truncate -s0 src/VBox/Additions/common/pam/Makefile.kmk
+- env PATH="${PATH}:$(pwd)/kBuild/bin/linux.amd64/" VBOX_ONLY_ADDITIONS=1 VBOX_ONLY_BUILD=1
+ kmk
+- cd out/linux.amd64/release/bin/additions/src/ && make M="$(pwd)" -C /usr/src/linux
+ modules
+install-commands:
+- cd out/linux.amd64/release/bin/additions/src && make M="$(pwd)" -C /usr/src/linux
+ INSTALL_MOD_PATH="$DESTDIR" modules_install
+- install -m 755 -D -o 0 -g 0 out/linux.amd64/release/bin/additions/mount.vboxsf "$DESTDIR/sbin/mount.vboxsf"
+- install -m 755 -D -o 0 -g 0 out/linux.amd64/release/bin/additions/VBoxService "$DESTDIR/sbin/VBoxService"
+- install -m 755 -D -o 0 -g 0 out/linux.amd64/release/bin/additions/VBoxControl "$DESTDIR/sbin/VBoxControl"
+- |
+ install -m 644 -D -o 0 -g 0 /proc/self/fd/0 "$DESTDIR/lib/systemd/system/virtualbox-guest.service" <<EOS
+ [Unit]
+ Description=VirtualBox Guest Additions
+
+ [Service]
+ ExecStart=/sbin/VBoxService -f
+ Restart=always
+ EOS
+- mkdir -p "$DESTDIR/lib/systemd/system/basic.target.wants"
+- ln -s "/lib/systemd/system/virtualbox-guest.service" "$DESTDIR/lib/systemd/system/basic.target.wants/virtualbox-guest.service"
+- mkdir -p "$DESTDIR/etc/modules-load.d"
+- echo vboxsf > "$DESTDIR/etc/modules-load.d/virtualbox-guest-filesystem.conf"
+system-integration:
+ vboxguest-misc:
+ 00-depmod:
+ - depmod -a $(cd /usr/lib/modules; ls | head -n 1)
diff --git a/strata/virtualbox-guest-x86_64/yasm.morph b/strata/virtualbox-guest-x86_64/yasm.morph
new file mode 100644
index 00000000..437ae97d
--- /dev/null
+++ b/strata/virtualbox-guest-x86_64/yasm.morph
@@ -0,0 +1,4 @@
+name: yasm
+kind: chunk
+max-jobs: 1
+build-system: autotools
diff --git a/strata/wayland-generic.morph b/strata/wayland-generic.morph
new file mode 100644
index 00000000..5db5868e
--- /dev/null
+++ b/strata/wayland-generic.morph
@@ -0,0 +1,17 @@
+name: wayland-generic
+kind: stratum
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: wayland
+ morph: strata/wayland-generic/wayland.morph
+ repo: upstream:wayland
+ ref: 47163797f810373c81b6e13b7a8a245eb9877785
+ unpetrify-ref: 1.11.0
+- name: wayland-protocols
+ repo: upstream:wayland-protocols
+ ref: 26c99346ab5f2273fe5581bc4f6397bbb834f747
+ unpetrify-ref: "1.8"
+ build-system: autotools
+ build-depends:
+ - wayland
diff --git a/strata/wayland-generic/wayland.morph b/strata/wayland-generic/wayland.morph
new file mode 100644
index 00000000..a65afd05
--- /dev/null
+++ b/strata/wayland-generic/wayland.morph
@@ -0,0 +1,7 @@
+name: wayland
+kind: chunk
+description: Wayland server
+build-system: autotools
+configure-commands:
+- autoreconf -ivf
+- ./configure --prefix="$PREFIX" --sysconfdir=/etc --disable-documentation
diff --git a/strata/weston-common.morph b/strata/weston-common.morph
new file mode 100644
index 00000000..93818920
--- /dev/null
+++ b/strata/weston-common.morph
@@ -0,0 +1,14 @@
+name: weston-common
+kind: stratum
+build-depends:
+- morph: strata/graphics-common.morph
+- morph: strata/input-common.morph
+- morph: strata/mesa-common.morph
+- morph: strata/libdrm-common.morph
+- morph: strata/wayland-generic.morph
+chunks:
+- name: weston
+ morph: strata/weston-common/weston.morph
+ repo: upstream:weston
+ ref: 2e5232b980eaa1074023a65dd7941e80b72a763c
+ unpetrify-ref: baserock/weston-1.11.0/tegra
diff --git a/strata/weston-common/weston.morph b/strata/weston-common/weston.morph
new file mode 100644
index 00000000..af0844ed
--- /dev/null
+++ b/strata/weston-common/weston.morph
@@ -0,0 +1,7 @@
+name: weston
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --sysconfdir=/etc
+ --enable-demo-clients-install
+ --enable-systemd-notify
diff --git a/strata/x-common.morph b/strata/x-common.morph
new file mode 100644
index 00000000..a1149ae0
--- /dev/null
+++ b/strata/x-common.morph
@@ -0,0 +1,405 @@
+name: x-common
+kind: stratum
+build-depends:
+- morph: strata/xorg-util-macros-common.morph
+chunks:
+- name: xorg-proto-bigreqsproto
+ repo: upstream:xorg-proto-bigreqsproto
+ ref: d6ed3e927a756900ad4c9fd7235f8f7f34f376db
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-compositeproto
+ repo: upstream:xorg-proto-compositeproto
+ ref: 39738dbe9438dc80fc6b9e221d9ed26a6d42da6b
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-damageproto
+ repo: upstream:xorg-proto-damageproto
+ ref: 015b980e5091492dbe681af59569768ba89fbfe0
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-dmxproto
+ repo: upstream:xorg-proto-dmxproto
+ ref: 395f6fcc0a5635907b5e45829e86b29431316184
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-fixesproto
+ repo: upstream:xorg-proto-fixesproto
+ ref: b6c6bc2aa4b83f8763c75c90e6671052272a2af2
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-fontsproto
+ repo: upstream:xorg-proto-fontsproto
+ ref: df8c05f7c0253a36589d96efa52938215eff9d4d
+ unpetrify-ref: fontsproto-2.1.3
+ build-system: autotools
+- name: xorg-proto-glproto
+ repo: upstream:xorg-proto-glproto
+ ref: f84853d97d5749308992412a215fa518b6536eb3
+ unpetrify-ref: glproto-1.4.17
+ build-system: autotools
+- name: xorg-proto-inputproto
+ repo: upstream:xorg-proto-inputproto
+ ref: 343ff0938f592876b9d82c966f166bf45a78c3c8
+ unpetrify-ref: inputproto-2.3.1
+ build-system: autotools
+- name: xorg-proto-kbproto
+ repo: upstream:xorg-proto-kbproto
+ ref: f7022f5775350dce3348b7151845a32390e98791
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-xineramaproto
+ repo: upstream:xorg-proto-xineramaproto
+ ref: 4e77b45e0d6b42a448dab2ec316eeb5c490ecfed
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-randrproto
+ repo: upstream:xorg-proto-randrproto
+ ref: 79b63f0e57cd5baf06ff24252d3f1675dcb64467
+ unpetrify-ref: randrproto-1.5.0
+ build-system: autotools
+- name: xorg-proto-recordproto
+ repo: upstream:xorg-proto-recordproto
+ ref: 0fd4f8e57c1e637b2aaaaa0f539ddbac8cc50575
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-renderproto
+ repo: upstream:xorg-proto-renderproto
+ ref: 935f5ec95a3718c184ff685f5b79b467483b7844
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-resourceproto
+ repo: upstream:xorg-proto-resourceproto
+ ref: ada91f54c98b5a61d3e116fca6bf239a8604730f
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-scrnsaverproto
+ repo: upstream:xorg-proto-scrnsaverproto
+ ref: 614532026e8ec7496216316fb584d6f2af6a7f7b
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-videoproto
+ repo: upstream:xorg-proto-videoproto
+ ref: e42cf822e230cff5c6550ca2c050dfa27d2c9611
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-xcmiscproto
+ repo: upstream:xorg-proto-xcmiscproto
+ ref: 83549077a3c2140b9862709004cd873f1c55e395
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-xextproto
+ repo: upstream:xorg-proto-xextproto
+ ref: 66afec3f49e8eb0d4c2e9af7088fc3116d4bafd7
+ unpetrify-ref: xextproto-7.3.0
+ build-system: autotools
+- name: xorg-proto-xf86bigfontproto
+ repo: upstream:xorg-proto-xf86bigfontproto
+ ref: f805b328b2195de384c0fb6b82ef5f88c179b2c0
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-xf86dgaproto
+ repo: upstream:xorg-proto-xf86dgaproto
+ ref: c52b205c3175309be7952774668c87dd2d5ce30e
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-xf86driproto
+ repo: upstream:xorg-proto-xf86driproto
+ ref: cb03b8d49bf063860859c1ed8bcecd055551e93a
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-x11proto
+ repo: upstream:xorg-proto-x11proto
+ ref: d5524e2b8d811aa03ed19c6e8fb2ee4162ca2b23
+ unpetrify-ref: xproto-7.0.28
+ build-system: autotools
+- name: xorg-proto-dri2proto
+ repo: upstream:xorg-proto-dri2proto
+ ref: ead89ad84877551cc15d26b95cb19a3e205df71f
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-proto-dri3proto
+ repo: upstream:xorg-proto-dri3proto
+ ref: 91df0f88b70c268f3580385a7b37543ab8c544c8
+ build-system: autotools
+- name: xorg-proto-presentproto
+ repo: upstream:xorg-proto-presentproto
+ ref: ef84007fc4a23d3897b4776906139de9d0698c2a
+ build-system: autotools
+- name: xcb-proto
+ repo: upstream:xcb-proto
+ ref: 4b384d2a015c50d0e93dcacda4b8260a3fd37640
+ unpetrify-ref: '1.11'
+ build-system: autotools
+- name: xorg-lib-libxshmfence
+ repo: upstream:xorg-lib-libxshmfence
+ ref: 9c4f070e1304a3503cfab08f68573443025fc4c9
+ unpetrify-ref: master
+ build-system: autotools
+ build-depends:
+ - xorg-proto-x11proto
+- name: xorg-lib-libXau
+ repo: upstream:xorg-lib-libXau
+ ref: 1a8a1b2c68967b48c07b56142799b1020f017027
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xorg-proto-x11proto
+- name: xcb-libxcb
+ repo: upstream:xcb-libxcb
+ ref: d1e8ec96fca4862f37ec9f0e9407bb989c4c161a
+ unpetrify-ref: '1.11'
+ build-system: autotools
+ build-depends:
+ - xcb-proto
+ - xorg-lib-libXau
+- name: xcb-util
+ repo: upstream:xcb-util
+ ref: 4de010f122da40e17b52866d07d1d501a66bf007
+ unpetrify-ref: baserock/0.4.0
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ submodules:
+ m4:
+ url: upstream:xcb/util-common-m4
+- name: util-wm
+ repo: upstream:util-wm
+ ref: fb7afc3f291c8cc072d327cd8d97ab1db3283c21
+ unpetrify-ref: baserock/0.4.1
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ submodules:
+ m4:
+ url: upstream:xcb/util-common-m4
+- name: util-keysyms
+ repo: upstream:util-keysyms
+ ref: edb763a8837d3932690b9d6d77cb7e20a9ab8013
+ unpetrify-ref: baserock/0.4.0
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ submodules:
+ m4:
+ url: upstream:xcb/util-common-m4
+- name: util-image
+ repo: upstream:util-image
+ ref: f20f25a1c017c58d5d7dfffc6e9adc8d31879152
+ unpetrify-ref: baserock/0.4.0
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xcb-util
+ submodules:
+ m4:
+ url: upstream:xcb/util-common-m4
+- name: xorg-lib-libxtrans
+ repo: upstream:xorg-lib-libxtrans
+ ref: 7cbad9fe2e61cd9d5caeaf361826a6f4bd320f03
+ unpetrify-ref: xtrans-1.3.5
+ build-system: autotools
+- name: xorg-lib-libX11
+ repo: upstream:xorg-lib-libX11
+ ref: cb107760df33ffc8630677e66e2e50aa37950a5c
+ unpetrify-ref: libX11-1.6.2
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-lib-libxtrans
+ - xorg-proto-inputproto
+ - xorg-proto-kbproto
+ - xorg-proto-x11proto
+ - xorg-proto-xextproto
+ - xorg-proto-xf86bigfontproto
+- name: xorg-lib-libXext
+ repo: upstream:xorg-lib-libXext
+ ref: 8eee1236041d46a21faba32e0d27c26985267d89
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libX11
+ - xorg-lib-libXau
+ - xorg-proto-x11proto
+ - xorg-proto-xextproto
+- name: xorg-lib-libXfixes
+ repo: upstream:xorg-lib-libXfixes
+ ref: 0cb446962381f750e05d97bfb974ca1e32481d5d
+ unpetrify-ref: libXfixes-5.0.1
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-lib-libXext
+ - xorg-proto-fixesproto
+- name: xorg-lib-libXi
+ repo: upstream:xorg-lib-libXi
+ ref: f180dff710dc54d00e0e26b84de053151f8f207e
+ unpetrify-ref: libXi-1.7.5
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-lib-libX11
+ - xorg-lib-libXext
+ - xorg-lib-libXfixes
+ - xorg-proto-fixesproto
+ - xorg-proto-inputproto
+ - xorg-proto-x11proto
+ - xorg-proto-xextproto
+- name: xorg-lib-libXcomposite
+ repo: upstream:xorg-lib-libXcomposite
+ ref: eda48b1bedaa344ada8e13930c9ab3058b836190
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-lib-libX11
+ - xorg-lib-libXfixes
+ - xorg-proto-compositeproto
+- name: xorg-lib-libXrender
+ repo: upstream:xorg-lib-libXrender
+ ref: 1af52cb334377611233d7dc156bc1e6f7923756d
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-lib-libX11
+ - xorg-proto-renderproto
+- name: xorg-lib-libXrandr
+ repo: upstream:xorg-lib-libXrandr
+ ref: 99a63d10cbbab7d69a52d25d78795a3278506ea9
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-lib-libX11
+ - xorg-lib-libXext
+ - xorg-lib-libXrender
+ - xorg-proto-randrproto
+ - xorg-proto-renderproto
+ - xorg-proto-xextproto
+- name: xorg-lib-libXinerama
+ repo: upstream:xorg-lib-libXinerama
+ ref: 470b9356af961ff7d3968b164aa73872b49a5dcc
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xorg-lib-libX11
+ - xorg-lib-libXext
+ - xorg-proto-xextproto
+ - xorg-proto-xineramaproto
+- name: xorg-lib-libXtst
+ repo: upstream:xorg-lib-libXtst
+ ref: 2aafac9474a0a0a0c39797862f823255918cf368
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-lib-libX11
+ - xorg-lib-libXext
+ - xorg-lib-libXi
+ - xorg-proto-inputproto
+ - xorg-proto-recordproto
+ - xorg-proto-xextproto
+- name: xorg-lib-libXdamage
+ repo: upstream:xorg-lib-libXdamage
+ ref: 0d35761dc39409b70e04dd0786aef6537f92976a
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-lib-libXfixes
+ - xorg-proto-damageproto
+- name: xorg-lib-libXcursor
+ repo: upstream:xorg-lib-libXcursor
+ ref: 1b98fd6a2e8c00a563187849a585e68c7344468b
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXrender
+ - xorg-lib-libXfixes
+ - xorg-proto-fixesproto
+ - xorg-lib-libXau
+ - xorg-lib-libX11
+- name: xorg-lib-libICE
+ repo: upstream:xorg-lib-libICE
+ ref: 0dfab4253e26d5c6e5f058126eb5e9f7a7732ae8
+ unpetrify-ref: libICE-1.0.9
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-proto-x11proto
+ - xorg-lib-libxtrans
+- name: xorg-lib-libSM
+ repo: upstream:xorg-lib-libSM
+ ref: 0fd7aa17da41779129a3acfdad28e07c0072a160
+ unpetrify-ref: libSM-1.2.2
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-proto-x11proto
+ - xorg-lib-libICE
+ - xorg-lib-libxtrans
+- name: xorg-lib-libXt
+ repo: upstream:xorg-lib-libXt
+ ref: e7411e7e5299116604ff1f01d9415802607f1051
+ unpetrify-ref: libXt-1.1.5
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-proto-kbproto
+ - xorg-lib-libX11
+ - xorg-lib-libSM
+ - xorg-lib-libICE
+- name: xorg-lib-libXmu
+ repo: upstream:xorg-lib-libXmu
+ ref: 2539e539eafdac88177c8ee30b043c5d52f017e4
+ unpetrify-ref: libXmu-1.1.2
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-lib-libX11
+ - xorg-lib-libXext
+ - xorg-lib-libXt
+ - xorg-proto-xextproto
+ - xorg-lib-libICE
+ - xorg-lib-libSM
+- name: xorg-lib-libXv
+ repo: upstream:xorg-lib-libXv
+ ref: 736d7ac5a94c7aa6761d50ab58339a3d9a116c51
+ unpetrify-ref: libXv-1.0.10
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-lib-libX11
+ - xorg-lib-libXext
+ - xorg-proto-xextproto
+ - xorg-proto-videoproto
+- name: xorg-lib-libxkbfile
+ repo: upstream:xorg-lib-libxkbfile
+ ref: 7381c2f9013ef7784c78091fa671e652a62ca706
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xcb-libxcb
+ - xorg-lib-libXau
+ - xorg-lib-libX11
+ - xorg-proto-kbproto
diff --git a/strata/x-drivers.morph b/strata/x-drivers.morph
new file mode 100644
index 00000000..faf646f2
--- /dev/null
+++ b/strata/x-drivers.morph
@@ -0,0 +1,26 @@
+name: x-drivers
+kind: stratum
+build-depends:
+- morph: strata/input-common.morph
+- morph: strata/x-generic.morph
+chunks:
+- name: xorg-driver-xf86-video-fbdev
+ repo: upstream:xorg-driver-xf86-video-fbdev
+ ref: 679ed9a4e6b54227df191c580e3ef641e075db19
+ unpetrify-ref: xf86-video-fbdev-0.4.4
+ build-system: autotools
+- name: xorg-driver-xf86-video-vesa
+ repo: upstream:xorg-driver-xf86-video-vesa
+ ref: b49c293e67cd88424ff40a2ca4e58b28528691d7
+ unpetrify-ref: xf86-video-vesa-2.3.4
+ build-system: autotools
+- name: xorg-driver-xf86-video-intel
+ repo: upstream:xorg-driver-xf86-video-intel
+ ref: 57725564179b8ddb48d5c9437fde91a6c02c0740
+ unpetrify-ref: 2.99.917-381-g5772556
+ build-system: autotools
+- name: xorg-driver-xf86-input-libinput
+ repo: upstream:xorg-driver-xf86-input-libinput
+ ref: 44f4b2ed7075d424e3621f30815e11875b364c27
+ unpetrify-ref: xf86-input-libinput-0.15.0
+ build-system: autotools
diff --git a/strata/x-generic.morph b/strata/x-generic.morph
new file mode 100644
index 00000000..d9462426
--- /dev/null
+++ b/strata/x-generic.morph
@@ -0,0 +1,46 @@
+name: x-generic
+kind: stratum
+build-depends:
+- morph: strata/foundation.morph
+- morph: strata/libdrm-common.morph
+- morph: strata/mesa-common.morph
+- morph: strata/x-common.morph
+- morph: strata/graphics-common.morph
+chunks:
+- name: xorg-font-util
+ repo: upstream:xorg-font-util
+ ref: 5f01ea79f1cb2328bfc4130b1e693f71be916b87
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-lib-libfontenc
+ repo: upstream:xorg-lib-libfontenc
+ ref: f5d1208172e965fdd7fae8927bd3e29b3cc3a975
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xorg-font-util
+- name: xorg-lib-libXfont
+ repo: upstream:xorg-lib-libXfont
+ ref: ad4f4d8a2d0730c0ea3c09210bf921638b4682bc
+ unpetrify-ref: libXfont-1.5.0
+ build-system: autotools
+ build-depends:
+ - xorg-lib-libfontenc
+- name: xserver
+ morph: strata/x-generic/xserver.morph
+ repo: upstream:xserver
+ ref: 93d4224ccf3dee5a51815a66f76c905450419b50
+ unpetrify-ref: xorg-server-1.18.2
+ build-depends:
+ - xorg-font-util
+ - xorg-lib-libXfont
+- name: xorg-app-xkbcomp
+ repo: upstream:xorg-app-xkbcomp
+ ref: 705b9bbb426410f9510601c7010da51184919b36
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xorg-app-xinit
+ repo: upstream:xorg-app-xinit
+ ref: 4e85bce64acef1fa0ddff04d59737444e942ff12
+ unpetrify-ref: baserock/morph
+ build-system: autotools
diff --git a/strata/x-generic/xserver.morph b/strata/x-generic/xserver.morph
new file mode 100644
index 00000000..4e15605b
--- /dev/null
+++ b/strata/x-generic/xserver.morph
@@ -0,0 +1,12 @@
+name: xserver
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ ./autogen.sh --prefix="$PREFIX" \
+ --disable-xvfb \
+ --disable-xnest \
+ --disable-xquartz \
+ --disable-xwin \
+ --enable-glamor \
+ --enable-xwayland
diff --git a/strata/xorg-util-macros-common.morph b/strata/xorg-util-macros-common.morph
new file mode 100644
index 00000000..7e252a90
--- /dev/null
+++ b/strata/xorg-util-macros-common.morph
@@ -0,0 +1,17 @@
+name: xorg-util-macros-common
+kind: stratum
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: xorg-util-macros
+ repo: upstream:xorg-util-macros
+ ref: 9a54b858601bd305de2737b06e609084a2a114c2
+ unpetrify-ref: util-macros-1.19.0
+ build-system: autotools
+- name: xcb-pthread-stubs
+ repo: upstream:xcb-pthread-stubs
+ ref: 431d2c0be218d878b9dd3862e4232243c599df4b
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+ build-depends:
+ - xorg-util-macros
diff --git a/systems/armv7lhf-cross-toolchain-system-x86_32.morph b/systems/armv7lhf-cross-toolchain-system-x86_32.morph
new file mode 100644
index 00000000..b0ac9cfe
--- /dev/null
+++ b/systems/armv7lhf-cross-toolchain-system-x86_32.morph
@@ -0,0 +1,19 @@
+name: armv7lhf-cross-toolchain-system-x86_32
+kind: system
+description: A system that contains an ARM cross compiler, intended to be used as
+ a sysroot.
+arch: x86_32
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: armv7lhf-cross-toolchain
+ morph: strata/armv7lhf-cross-toolchain.morph
+- name: cross-tools
+ morph: strata/cross-tools.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..1bd1adc1
--- /dev/null
+++ b/systems/armv7lhf-cross-toolchain-system-x86_64.morph
@@ -0,0 +1,19 @@
+name: armv7lhf-cross-toolchain-system-x86_64
+kind: system
+description: A system that contains an ARM cross compiler, intended to be used as
+ a sysroot.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: armv7lhf-cross-toolchain
+ morph: strata/armv7lhf-cross-toolchain.morph
+- name: cross-tools
+ morph: strata/cross-tools.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..32d773e8
--- /dev/null
+++ b/systems/base-system-armv7-highbank.morph
@@ -0,0 +1,20 @@
+name: base-system-armv7-highbank
+kind: system
+description: The set of strata required to have a minimal system for an ARM highbank
+ system.
+arch: armv7l
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7-highbank
+ morph: strata/bsp-armv7-highbank.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..4f039c02
--- /dev/null
+++ b/systems/base-system-armv7-versatile.morph
@@ -0,0 +1,20 @@
+name: base-system-armv7-versatile
+kind: system
+description: The set of strata required to have a minimal system for an ARM versatile
+ system.
+arch: armv7l
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7-versatile
+ morph: strata/bsp-armv7-versatile.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..969967b5
--- /dev/null
+++ b/systems/base-system-armv7b-highbank.morph
@@ -0,0 +1,20 @@
+name: base-system-armv7b-highbank
+kind: system
+description: The set of strata required to have a minimal system for an ARM highbank
+ system.
+arch: armv7b
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7b-highbank
+ morph: strata/bsp-armv7b-highbank.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..cbfedd89
--- /dev/null
+++ b/systems/base-system-armv7b-vexpress-tc2.morph
@@ -0,0 +1,19 @@
+name: base-system-armv7b-vexpress-tc2
+kind: system
+description: A small system for Versatile TC2 boards system.
+arch: armv7b
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7b-vexpress-tc2
+ morph: strata/bsp-armv7b-vexpress-tc2.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/systems/base-system-armv7l-altera-socfpga-devkit.morph b/systems/base-system-armv7l-altera-socfpga-devkit.morph
new file mode 100644
index 00000000..b8fe4c28
--- /dev/null
+++ b/systems/base-system-armv7l-altera-socfpga-devkit.morph
@@ -0,0 +1,21 @@
+name: base-system-armv7l-altera-socfpga-devkit
+kind: system
+description: |
+ The set of strata required to have a minimal system for use on Altera SoCFPGA
+ development kit, using little-endian word order.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7l-altera-socfpga-devkit
+ morph: strata/bsp-armv7l-altera-socfpga-devkit.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..399931a5
--- /dev/null
+++ b/systems/base-system-armv7lhf-highbank.morph
@@ -0,0 +1,20 @@
+name: base-system-armv7lhf-highbank
+kind: system
+description: The set of strata required to have a minimal system for an ARM highbank
+ system.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7-highbank
+ morph: strata/bsp-armv7-highbank.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..d23bde9b
--- /dev/null
+++ b/systems/base-system-armv8b64.morph
@@ -0,0 +1,22 @@
+name: base-system-armv8b64
+kind: system
+description: |
+ The set of strata required to have a minimal
+ system for big endian 64-bit ARMv8 computers.
+arch: armv8b64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv8b64-generic
+ morph: strata/bsp-armv8b64-generic.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..24104a8b
--- /dev/null
+++ b/systems/base-system-armv8l64.morph
@@ -0,0 +1,22 @@
+name: base-system-armv8l64
+kind: system
+description: |
+ The set of strata required to have a minimal
+ system for little endian 64-bit ARMv8 computers.
+arch: armv8l64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv8l64-generic
+ morph: strata/bsp-armv8l64-generic.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..6da852e3
--- /dev/null
+++ b/systems/base-system-ppc64-generic.morph
@@ -0,0 +1,20 @@
+name: base-system-ppc64-generic
+kind: system
+description: The set of strata required to have a minimal system for a 64-bit ppc64
+ system.
+arch: ppc64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-ppc64-generic
+ morph: strata/bsp-ppc64-generic.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..d89fd913
--- /dev/null
+++ b/systems/base-system-x86_32-generic.morph
@@ -0,0 +1,19 @@
+name: base-system-x86_32-generic
+kind: system
+description: The set of strata required to have a basic system for a 32-bit x86 system.
+arch: x86_32
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_32-generic
+ morph: strata/bsp-x86_32-generic.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..aa1659b3
--- /dev/null
+++ b/systems/base-system-x86_64-generic.morph
@@ -0,0 +1,20 @@
+name: base-system-x86_64-generic
+kind: system
+description: The set of strata required to have a minimal system for a 64-bit x86
+ system.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..b8799bb0
--- /dev/null
+++ b/systems/build-system-armv5l-openbmc-aspeed.morph
@@ -0,0 +1,49 @@
+name: build-system-armv5l-openbmc-aspeed
+kind: system
+description: |
+ The system that should be used for building other Baserock systems
+ for little endian ARMv5 computers.
+arch: armv5l
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: bsp-armv5l-openbmc-aspeed
+ morph: strata/bsp-armv5l-openbmc-aspeed.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: mtd-utilities
+ morph: strata/mtd-utilities.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
+- extensions/hosts
diff --git a/systems/build-system-armv7l-altera-socfpga-devkit.morph b/systems/build-system-armv7l-altera-socfpga-devkit.morph
new file mode 100644
index 00000000..5d83cb6a
--- /dev/null
+++ b/systems/build-system-armv7l-altera-socfpga-devkit.morph
@@ -0,0 +1,51 @@
+name: build-system-armv7l-altera-socfpga-devkit
+kind: system
+description: |
+ The system that should be used for building other Baserock systems. For
+ use on Altera SoCFPGA development kit, using little-endian word order.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7l-altera-socfpga-devkit
+ morph: strata/bsp-armv7l-altera-socfpga-devkit.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/distbuild
+- extensions/fstab
+- extensions/mason
+- extensions/install-essential-files
+- extensions/hosts
diff --git a/systems/build-system-armv7lhf-highbank.morph b/systems/build-system-armv7lhf-highbank.morph
new file mode 100644
index 00000000..06262deb
--- /dev/null
+++ b/systems/build-system-armv7lhf-highbank.morph
@@ -0,0 +1,63 @@
+name: build-system-armv7lhf-highbank
+kind: system
+description: The system that should be used for building all other Baserock systems
+ for ARMv7 little-endian hard-float Calxeda Highbank computers.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: bsp-armv7-highbank
+ morph: strata/bsp-armv7-highbank.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: unionfs-fuse-group
+ morph: strata/unionfs-fuse-group.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
+- extensions/hosts
diff --git a/systems/build-system-armv7lhf-jetson.morph b/systems/build-system-armv7lhf-jetson.morph
new file mode 100644
index 00000000..aa0deac7
--- /dev/null
+++ b/systems/build-system-armv7lhf-jetson.morph
@@ -0,0 +1,61 @@
+name: build-system-armv7lhf-jetson
+kind: system
+description: The system that should be used for building all other Baserock systems
+ for ARMv7 little-endian hard-float NVIDIA Jetson TK1 computers.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: bsp-jetson
+ morph: strata/bsp-jetson.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
+- extensions/hosts
diff --git a/systems/build-system-armv7lhf-rootfs.morph b/systems/build-system-armv7lhf-rootfs.morph
new file mode 100644
index 00000000..4c934cc9
--- /dev/null
+++ b/systems/build-system-armv7lhf-rootfs.morph
@@ -0,0 +1,59 @@
+name: build-system-armv7lhf-rootfs
+kind: system
+description: The system that should be used for building all other Baserock systems
+ for ARMv7 little-endian hard-float, rootfs variant.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
+- extensions/hosts
diff --git a/systems/build-system-armv8b64.morph b/systems/build-system-armv8b64.morph
new file mode 100644
index 00000000..d544cebb
--- /dev/null
+++ b/systems/build-system-armv8b64.morph
@@ -0,0 +1,63 @@
+name: build-system-armv8b64
+kind: system
+description: |
+ The system that should be used for building all other Baserock systems
+ for 64-bit ARMv8 computers running in big-endian mode.
+arch: armv8b64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv8b64-generic
+ morph: strata/bsp-armv8b64-generic.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
+- extensions/hosts
diff --git a/systems/build-system-armv8l64.morph b/systems/build-system-armv8l64.morph
new file mode 100644
index 00000000..effd0d40
--- /dev/null
+++ b/systems/build-system-armv8l64.morph
@@ -0,0 +1,63 @@
+name: build-system-armv8l64
+kind: system
+description: |
+ The system that should be used for building all other Baserock systems
+ for little endian 64-bit ARMv8 computers.
+arch: armv8l64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: bsp-armv8l64-generic
+ morph: strata/bsp-armv8l64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
+- extensions/hosts
diff --git a/systems/build-system-ppc64.morph b/systems/build-system-ppc64.morph
new file mode 100644
index 00000000..2a5ca04f
--- /dev/null
+++ b/systems/build-system-ppc64.morph
@@ -0,0 +1,61 @@
+name: build-system-ppc64
+kind: system
+description: The system that should be used for building all other Baserock systems
+ for 64-bit POWER computers.
+arch: ppc64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: bsp-ppc64-generic
+ morph: strata/bsp-ppc64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
+- extensions/hosts
diff --git a/systems/build-system-x86_32-chroot.morph b/systems/build-system-x86_32-chroot.morph
new file mode 100644
index 00000000..868c3213
--- /dev/null
+++ b/systems/build-system-x86_32-chroot.morph
@@ -0,0 +1,61 @@
+name: build-system-x86_32-chroot
+kind: system
+description: The system that should be used for building all other Baserock systems
+ for 32-bit Intel x86 computers, chroot variant.
+arch: x86_32
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: bsp-x86_both-tools
+ morph: strata/bsp-x86_both-tools.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
+- extensions/hosts
diff --git a/systems/build-system-x86_32.morph b/systems/build-system-x86_32.morph
new file mode 100644
index 00000000..104d9a75
--- /dev/null
+++ b/systems/build-system-x86_32.morph
@@ -0,0 +1,61 @@
+name: build-system-x86_32
+kind: system
+description: The system that should be used for building all other Baserock systems
+ for 32-bit Intel x86 computers.
+arch: x86_32
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: bsp-x86_32-generic
+ morph: strata/bsp-x86_32-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
+- extensions/hosts
diff --git a/systems/build-system-x86_64-chroot.morph b/systems/build-system-x86_64-chroot.morph
new file mode 100644
index 00000000..339ecfb7
--- /dev/null
+++ b/systems/build-system-x86_64-chroot.morph
@@ -0,0 +1,61 @@
+name: build-system-x86_64-chroot
+kind: system
+description: The system that should be used for building all other Baserock systems
+ for 64-bit Intel x86 computers, chroot variant.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: bsp-x86_both-tools
+ morph: strata/bsp-x86_both-tools.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
+- extensions/hosts
diff --git a/systems/build-system-x86_64.morph b/systems/build-system-x86_64.morph
new file mode 100644
index 00000000..f006df9a
--- /dev/null
+++ b/systems/build-system-x86_64.morph
@@ -0,0 +1,61 @@
+name: build-system-x86_64
+kind: system
+description: The system that should be used for building all other Baserock systems
+ for 64-bit Intel x86 computers.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
+- extensions/hosts
diff --git a/systems/cross-bootstrap-system-armv5l-generic.morph b/systems/cross-bootstrap-system-armv5l-generic.morph
new file mode 100644
index 00000000..ff151deb
--- /dev/null
+++ b/systems/cross-bootstrap-system-armv5l-generic.morph
@@ -0,0 +1,25 @@
+name: cross-bootstrap-system-armv5l-generic
+kind: system
+description: A system that produces the minimum needed to build a devel system
+arch: armv5l
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: cross-bootstrap
+ morph: strata/cross-bootstrap.morph
diff --git a/systems/cross-bootstrap-system-armv7lhf-generic.morph b/systems/cross-bootstrap-system-armv7lhf-generic.morph
new file mode 100644
index 00000000..52ac2de9
--- /dev/null
+++ b/systems/cross-bootstrap-system-armv7lhf-generic.morph
@@ -0,0 +1,25 @@
+name: cross-bootstrap-system-armv7lhf-generic
+kind: system
+description: A system that produces the minimum needed to build a devel system
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: cross-bootstrap
+ morph: strata/cross-bootstrap.morph
diff --git a/systems/cross-bootstrap-system-armv8b64-generic.morph b/systems/cross-bootstrap-system-armv8b64-generic.morph
new file mode 100644
index 00000000..a3c3bc21
--- /dev/null
+++ b/systems/cross-bootstrap-system-armv8b64-generic.morph
@@ -0,0 +1,25 @@
+name: cross-bootstrap-system-armv8b64-generic
+kind: system
+description: A system that produces the minimum needed to build a devel system
+arch: armv8b64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: cross-bootstrap
+ morph: strata/cross-bootstrap.morph
diff --git a/systems/cross-bootstrap-system-armv8l64-generic.morph b/systems/cross-bootstrap-system-armv8l64-generic.morph
new file mode 100644
index 00000000..0ea68f8a
--- /dev/null
+++ b/systems/cross-bootstrap-system-armv8l64-generic.morph
@@ -0,0 +1,25 @@
+name: cross-bootstrap-system-armv8l64-generic
+kind: system
+description: A system that produces the minimum needed to build a devel system
+arch: armv8l64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: cross-bootstrap
+ morph: strata/cross-bootstrap.morph
diff --git a/systems/cross-bootstrap-system-ppc64-generic.morph b/systems/cross-bootstrap-system-ppc64-generic.morph
new file mode 100644
index 00000000..17e40242
--- /dev/null
+++ b/systems/cross-bootstrap-system-ppc64-generic.morph
@@ -0,0 +1,25 @@
+name: cross-bootstrap-system-ppc64-generic
+kind: system
+description: A system that produces the minimum needed to build a devel system
+arch: ppc64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: cross-bootstrap
+ morph: strata/cross-bootstrap.morph
diff --git a/systems/cross-bootstrap-system-x86_64-generic.morph b/systems/cross-bootstrap-system-x86_64-generic.morph
new file mode 100644
index 00000000..8c597841
--- /dev/null
+++ b/systems/cross-bootstrap-system-x86_64-generic.morph
@@ -0,0 +1,25 @@
+name: cross-bootstrap-system-x86_64-generic
+kind: system
+description: A system that produces the minimum needed to build a devel system
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: cross-bootstrap
+ morph: strata/cross-bootstrap.morph
diff --git a/systems/devel-system-armv7-chroot.morph b/systems/devel-system-armv7-chroot.morph
new file mode 100644
index 00000000..78b9fd42
--- /dev/null
+++ b/systems/devel-system-armv7-chroot.morph
@@ -0,0 +1,72 @@
+name: devel-system-armv7-chroot
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use as a chroot inside a Linux-based operating system on ARMv7
+ computers using little-endian word order.
+arch: armv7l
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..02f8069e
--- /dev/null
+++ b/systems/devel-system-armv7-highbank.morph
@@ -0,0 +1,75 @@
+name: devel-system-armv7-highbank
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on ARMv7 Calxeda Highbank computers using little-endian word order.
+arch: armv7l
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7-highbank
+ morph: strata/bsp-armv7-highbank.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: unionfs-fuse-group
+ morph: strata/unionfs-fuse-group.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..f4f37b43
--- /dev/null
+++ b/systems/devel-system-armv7-versatile.morph
@@ -0,0 +1,73 @@
+name: devel-system-armv7-versatile
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on generic ARMv7 versatile computers using little-endian word order.
+arch: armv7l
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7-versatile
+ morph: strata/bsp-armv7-versatile.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..5707e4a6
--- /dev/null
+++ b/systems/devel-system-armv7-wandboard.morph
@@ -0,0 +1,73 @@
+name: devel-system-armv7-wandboard
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on ARMv7 Wandboard computers using little-endian word order.
+arch: armv7l
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-wandboard
+ morph: strata/bsp-wandboard.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..18ca827b
--- /dev/null
+++ b/systems/devel-system-armv7b-chroot.morph
@@ -0,0 +1,64 @@
+name: devel-system-armv7b-chroot
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use as a chroot inside a Linux-based operating system on ARMv7 computers
+ using big-endian word order.
+arch: armv7b
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..04847e9d
--- /dev/null
+++ b/systems/devel-system-armv7b-highbank.morph
@@ -0,0 +1,71 @@
+name: devel-system-armv7b-highbank
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on ARMv7 Calxeda Highbank computers using big-endian word order.
+arch: armv7b
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7b-highbank
+ morph: strata/bsp-armv7b-highbank.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: unionfs-fuse-group
+ morph: strata/unionfs-fuse-group.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/devel-system-armv7l-altera-socfpga-devkit.morph b/systems/devel-system-armv7l-altera-socfpga-devkit.morph
new file mode 100644
index 00000000..f4e74723
--- /dev/null
+++ b/systems/devel-system-armv7l-altera-socfpga-devkit.morph
@@ -0,0 +1,66 @@
+name: devel-system-armv7l-altera-socfpga-devkit
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on Altera SoCFPGA development kit, using little-endian word
+ order.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7l-altera-socfpga-devkit
+ morph: strata/bsp-armv7l-altera-socfpga-devkit.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..9bcb1f50
--- /dev/null
+++ b/systems/devel-system-armv7lhf-chroot.morph
@@ -0,0 +1,72 @@
+name: devel-system-armv7lhf-chroot
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on ARMv7 computers using little-endian word order and hardware
+ floating point support.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..6921c8ad
--- /dev/null
+++ b/systems/devel-system-armv7lhf-highbank.morph
@@ -0,0 +1,78 @@
+name: devel-system-armv7lhf-highbank
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on ARMv7 Calxeda Highbank computers using little-endian word order
+ and hardware floating-point support.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv7-highbank
+ morph: strata/bsp-armv7-highbank.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: unionfs-fuse-group
+ morph: strata/unionfs-fuse-group.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..ce3dee27
--- /dev/null
+++ b/systems/devel-system-armv7lhf-jetson.morph
@@ -0,0 +1,76 @@
+name: devel-system-armv7lhf-jetson
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on ARMv7 NVIDIA Jetson TK1 computers using little-endian word order
+ and hardware floating-point support.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: bsp-jetson
+ morph: strata/bsp-jetson.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..2d83c2fa
--- /dev/null
+++ b/systems/devel-system-armv7lhf-wandboard.morph
@@ -0,0 +1,76 @@
+name: devel-system-armv7lhf-wandboard
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on ARMv7 Wandboard computers using little-endian word order and
+ hardware floating point support.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-wandboard
+ morph: strata/bsp-wandboard.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..5c5460cd
--- /dev/null
+++ b/systems/devel-system-armv8b64.morph
@@ -0,0 +1,77 @@
+name: devel-system-armv8b64
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on 64-bit ARMv8 computers using big-endian word.
+arch: armv8b64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv8b64-generic
+ morph: strata/bsp-armv8b64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..606ae102
--- /dev/null
+++ b/systems/devel-system-armv8l64.morph
@@ -0,0 +1,78 @@
+name: devel-system-armv8l64
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on 64-bit ARMv8 computers using little-endian word.
+arch: armv8l64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv8l64-generic
+ morph: strata/bsp-armv8l64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..34ed6834
--- /dev/null
+++ b/systems/devel-system-ppc64-chroot.morph
@@ -0,0 +1,70 @@
+name: devel-system-ppc64-chroot
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use as a chroot inside a Linux operating system on 64-bit POWER
+ computers.
+arch: ppc64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..6b542186
--- /dev/null
+++ b/systems/devel-system-ppc64-generic.morph
@@ -0,0 +1,73 @@
+name: devel-system-ppc64-generic
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on 64-bit POWER computers.
+arch: ppc64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-ppc64-generic
+ morph: strata/bsp-ppc64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..6b4be0ea
--- /dev/null
+++ b/systems/devel-system-x86_32-chroot.morph
@@ -0,0 +1,72 @@
+name: devel-system-x86_32-chroot
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use as a chroot inside a Linux operating system on 32-bit Intel x86
+ computers.
+arch: x86_32
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: bsp-x86_both-tools
+ morph: strata/bsp-x86_both-tools.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..d17abc07
--- /dev/null
+++ b/systems/devel-system-x86_32-generic.morph
@@ -0,0 +1,78 @@
+name: devel-system-x86_32-generic
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on 32-bit Intel x86 computers.
+arch: x86_32
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_32-generic
+ morph: strata/bsp-x86_32-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..be5ab108
--- /dev/null
+++ b/systems/devel-system-x86_64-chroot.morph
@@ -0,0 +1,74 @@
+name: devel-system-x86_64-chroot
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use as a chroot inside a Linux operating system on 64-bit Intel x86
+ computers.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: bsp-x86_both-tools
+ morph: strata/bsp-x86_both-tools.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..3691b14a
--- /dev/null
+++ b/systems/devel-system-x86_64-generic.morph
@@ -0,0 +1,83 @@
+name: devel-system-x86_64-generic
+kind: system
+description: |
+ A system with useful tools for doing Baserock development.
+
+ For use on 64-bit Intel x86 computers.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: erlang
+ morph: strata/erlang.morph
+- name: elixir
+ morph: strata/elixir.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..76d882e2
--- /dev/null
+++ b/systems/devel-system-x86_64-vagrant.morph
@@ -0,0 +1,76 @@
+name: devel-system-x86_64-vagrant
+kind: system
+description: |
+ A system with useful tools for doing Baserock development, using Vagrant.
+
+ For use with the Vagrant tool for x86_64 virtual machines.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: virtualbox-guest-x86_64
+ morph: strata/virtualbox-guest-x86_64.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: perl-common
+ morph: strata/perl-common.morph
+- name: CPAN-Mini-Inject
+ morph: strata/CPAN-Mini-Inject.morph
+- name: sandboxing
+ morph: strata/sandboxing.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/vagrant
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/systems/initramfs-x86_32.morph b/systems/initramfs-x86_32.morph
new file mode 100644
index 00000000..df817c13
--- /dev/null
+++ b/systems/initramfs-x86_32.morph
@@ -0,0 +1,11 @@
+name: initramfs-x86_32
+kind: system
+description: Initramfs for x86_32
+arch: x86_32
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+ artifacts:
+ - build-essential-minimal
+- name: initramfs-utils
+ morph: strata/initramfs-utils.morph
diff --git a/systems/initramfs-x86_64.morph b/systems/initramfs-x86_64.morph
new file mode 100644
index 00000000..4bb0020d
--- /dev/null
+++ b/systems/initramfs-x86_64.morph
@@ -0,0 +1,11 @@
+name: initramfs-x86_64
+kind: system
+description: Initramfs for x86_64
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+ artifacts:
+ - build-essential-minimal
+- name: initramfs-utils
+ morph: strata/initramfs-utils.morph
diff --git a/systems/installer-system-armv8b64.morph b/systems/installer-system-armv8b64.morph
new file mode 100644
index 00000000..ded674c5
--- /dev/null
+++ b/systems/installer-system-armv8b64.morph
@@ -0,0 +1,41 @@
+name: installer-system-armv8b64
+kind: system
+description: The system that should be used as an Installer to install other Baserock
+ systems.
+arch: armv8b64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-armv8b64-generic
+ morph: strata/bsp-armv8b64-generic.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: installer-utils
+ morph: strata/installer-utils.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..5623f82d
--- /dev/null
+++ b/systems/installer-system-x86_64.morph
@@ -0,0 +1,40 @@
+name: installer-system-x86_64
+kind: system
+description: The system that should be used as an Installer to install other Baserock
+ systems.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: installer-utils
+ morph: strata/installer-utils.morph
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..602e05c7
--- /dev/null
+++ b/systems/minimal-system-armv5l-openbmc-aspeed.morph
@@ -0,0 +1,20 @@
+name: minimal-system-armv5l-openbmc-aspeed
+kind: system
+description: The set of strata required to have a minimal system for armv5l
+arch: armv5l
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+ artifacts:
+ - build-essential-minimal
+- name: bsp-armv5l-openbmc-aspeed
+ morph: strata/bsp-armv5l-openbmc-aspeed.morph
+ artifacts:
+ - bsp-armv5l-openbmc-aspeed-runtime
+configuration-extensions:
+- 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
new file mode 100644
index 00000000..2e9f79c5
--- /dev/null
+++ b/systems/minimal-system-x86_32-generic.morph
@@ -0,0 +1,21 @@
+name: minimal-system-x86_32-generic
+kind: system
+description: The set of strata required to have a minimal system for a 32-bit x86
+ system.
+arch: x86_32
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+ artifacts:
+ - build-essential-minimal
+- name: bsp-x86_32-generic
+ morph: strata/bsp-x86_32-generic.morph
+ artifacts:
+ - bsp-x86_32-generic-runtime
+configuration-extensions:
+- 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-chroot.morph b/systems/minimal-system-x86_64-chroot.morph
new file mode 100644
index 00000000..d8635a64
--- /dev/null
+++ b/systems/minimal-system-x86_64-chroot.morph
@@ -0,0 +1,12 @@
+name: minimal-system-x86_64-chroot
+kind: system
+description: A minimal chroot system
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+ artifacts:
+ - build-essential-minimal
+configuration-extensions:
+- extensions/set-hostname
+- extensions/busybox-init
diff --git a/systems/minimal-system-x86_64-generic.morph b/systems/minimal-system-x86_64-generic.morph
new file mode 100644
index 00000000..afd9460c
--- /dev/null
+++ b/systems/minimal-system-x86_64-generic.morph
@@ -0,0 +1,21 @@
+name: minimal-system-x86_64-generic
+kind: system
+description: The set of strata required to have a minimal system for a 64-bit x86
+ system.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+ artifacts:
+ - build-essential-minimal
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+ artifacts:
+ - bsp-x86_64-generic-runtime
+configuration-extensions:
+- extensions/set-hostname
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/busybox-init
+- extensions/install-essential-files
diff --git a/trove/clusters/mason-openstack.morph b/trove/clusters/mason-openstack.morph
new file mode 100644
index 00000000..6a854bd5
--- /dev/null
+++ b/trove/clusters/mason-openstack.morph
@@ -0,0 +1,39 @@
+name: mason-openstack
+kind: cluster
+description: |
+ This is a template cluster morphology that can be adapted to set up a
+ Mason. Masons are composed of a trove and a distbuild system.
+systems:
+- morph: systems/build-system-x86_64.morph
+ deploy-defaults:
+ ARTIFACT_CACHE_SERVER: example-cache-server
+ CONTROLLERHOST: controller-hostname
+ DISTBUILD_CONTROLLER: true
+ DISTBUILD_WORKER: true
+ INSTALL_FILES: install-files/distbuild/manifest
+ RAM_SIZE: 8G
+ TROVE_HOST: your-upstream-trove
+ TROVE_ID: your-upstream-trove-prefix
+ VCPUS: 2
+ WORKER_SSH_KEY: ssh-keys/worker.key
+ deploy:
+ mason-openstack:
+ type: extensions/openstack
+ location: openstack-auth-url (eg example.com:5000/v2.0)
+ DISK_SIZE: 6G
+ DISTBUILD_CONTROLLER: true
+ HOSTNAME: controller-hostname
+ MASON_CLUSTER_MORPHOLOGY: clusters/ci.morph
+ MASON_DEFINITIONS_REF: master
+ MASON_DISTBUILD_ARCH: x86_64
+ MASON_TEST_HOST: user@openstack-auth-url
+ WORKERS: controller-hostname
+ OPENSTACK_AUTH_URL: openstack-auth-url
+ OPENSTACK_USER: baserock
+ OPENSTACK_TENANT: baserock
+ OPENSTACK_TENANT_ID: 7d7ebfe23367490b973a10fa426c3aec
+ OPENSTACK_IMAGENAME: mason-openstack
+ OPENSTACK_NETWORK_ID: 71f5151a-b7c3-405d-a841-d1b07e5db099
+ CLOUD_INIT: true
+ KERNEL_ARGS: console=ttyS0 console=tty0
+ TEST_INFRASTRUCTURE_TYPE: openstack
diff --git a/trove/clusters/mason.morph b/trove/clusters/mason.morph
new file mode 100644
index 00000000..f69a9e11
--- /dev/null
+++ b/trove/clusters/mason.morph
@@ -0,0 +1,56 @@
+name: example-mason-cluster
+kind: cluster
+description: |
+ This is a template cluster morphology that can be adapted to set up a
+ Mason. Masons are composed of a trove and a distbuild system.
+
+ It is suggested that you use mason/mason-generator.sh to adapt this
+ template to suit your needs. It also handles the generation of
+ keys to let the systems communicate.
+systems:
+- morph: trove/systems/trove-system-x86_64.morph
+ deploy:
+ red-box-v1-trove:
+ 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
+ HOSTNAME: red-box-v1-trove
+ LORRY_SSH_KEY: ssh_keys/lorry.key
+ MASON_SSH_PUBKEY: ssh_keys/mason.key.pub
+ RAM_SIZE: 8G
+ TROVE_ADMIN_EMAIL: adminuser@example.com
+ TROVE_ADMIN_NAME: Nobody
+ TROVE_ADMIN_SSH_PUBKEY: ssh_keys/id_rsa.pub
+ TROVE_ADMIN_USER: adminuser
+ TROVE_COMPANY: Company name goes here
+ TROVE_HOST: red-box-v1
+ TROVE_ID: red-box-v1-trove
+ UPSTREAM_TROVE: upstream-trove
+ VCPUS: 2
+ VERSION_LABEL: 45
+ WORKER_SSH_PUBKEY: ssh_keys/worker.key.pub
+- morph: systems/build-system-x86_64.morph
+ deploy-defaults:
+ ARTIFACT_CACHE_SERVER: red-box-v1-trove.example.com
+ CONTROLLERHOST: red-box-v1-controller.example.com
+ DISTBUILD_CONTROLLER: false
+ DISTBUILD_WORKER: true
+ INSTALL_FILES: install-files/distbuild/manifest
+ RAM_SIZE: 8G
+ TROVE_HOST: upstream-trove
+ TROVE_ID: upstream-trove
+ VCPUS: 2
+ WORKER_SSH_KEY: ssh_keys/worker.key
+ deploy:
+ red-box-v1-controller:
+ 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
+ HOSTNAME: red-box-v1-controller
+ MASON_CLUSTER_MORPHOLOGY: clusters/ci.morph
+ MASON_DEFINITIONS_REF: master
+ MASON_DISTBUILD_ARCH: x86_64
+ MASON_TEST_HOST: vm-user@vm-host:/vm-path/
+ WORKERS: red-box-v1-controller
diff --git a/trove/clusters/trove-example.morph b/trove/clusters/trove-example.morph
new file mode 100644
index 00000000..13171846
--- /dev/null
+++ b/trove/clusters/trove-example.morph
@@ -0,0 +1,58 @@
+name: trove-example
+kind: cluster
+description: |
+ This is an example cluster morphology for deploying a Trove,
+ both the initial deployment and an upgrade.
+
+ You need some ssh keys, which you can create like this:
+
+ mkdir ssh_keys
+ ssh-keygen -N '' -f ssh_keys/lorry.key
+ ssh-keygen -N '' -f ssh_keys/worker.key
+ ssh-keygen -N '' -f ssh_keys/trove-admin.key
+
+ You may also put in your own keys instead of creating new ones.
+
+ To do the initial deployment:
+
+ morph deploy clusters/trove-example.morph \
+ initial \
+ initial.location=kvm+ssh://liw@192.168.122.1/test-trove/tmp/test-trove.img
+
+ To do an upgrade:
+
+ morph deploy clusters/trove-example.morph \
+ upgrade upgrade.VERSION_LABEL=123
+
+ where `VERSION_LABEL` gets a new unique value each time.
+
+ Remember to always specify either initial or upgrade as the
+ deployment name to use, otherwise morph will attempt to deploy both.
+
+ You can find documentation for Trove at the following web address:
+ http://wiki.baserock.org/Trove/
+systems:
+- morph: trove/systems/trove-system-x86_64.morph
+ deploy-defaults:
+ HOSTNAME: test-trove
+ VCPUS: 2
+ RAM_SIZE: 2G
+ DISK_SIZE: 8G
+ LORRY_SSH_KEY: ssh_keys/lorry.key
+ WORKER_SSH_PUBKEY: ssh_keys/worker.key.pub
+ TROVE_ADMIN_EMAIL: adminuser@example.com
+ TROVE_ADMIN_NAME: Nobody
+ TROVE_ADMIN_SSH_PUBKEY: ssh_keys/trove-admin.key.pub
+ TROVE_ADMIN_USER: adminuser
+ TROVE_COMPANY: Company name goes here
+ TROVE_HOST: test-trove
+ TROVE_ID: test-trove
+ UPSTREAM_TROVE: ''
+ deploy:
+ initial:
+ type: extensions/kvm
+ location: kvm+ssh://vm-user@vm-host/test-trove/vm-path/test-trove.img
+ VERSION_LABEL: 1
+ upgrade:
+ type: extensions/ssh-rsync
+ location: test-trove
diff --git a/trove/clusters/trove.baserock.org-upgrade.morph b/trove/clusters/trove.baserock.org-upgrade.morph
new file mode 100644
index 00000000..cfd5d1cb
--- /dev/null
+++ b/trove/clusters/trove.baserock.org-upgrade.morph
@@ -0,0 +1,19 @@
+name: trove.baserock.org-upgrade
+kind: cluster
+description: |
+ This is a cluster morphology for deploying an UPGRADE to
+ git.baserock.org. It doesn't work for the initial deployment. The
+ deployer MUST have ssh access to root@git.baserock.org. To use:
+
+ morph upgrade clusters/trove.baserock.org-upgrade.morph gbo.VERSION_LABEL=2014-05-29
+
+ Replace the value of gbo.VERSION_LABEL above with the current date.
+ You can add letters if you need to upgrade multiple times in a day.
+systems:
+- morph: trove/systems/trove-system-x86_64.morph
+ deploy:
+ gbo:
+ upgrade-type: extensions/ssh-rsync
+ upgrade-location: root@git.baserock.org
+ HOSTNAME: baserock
+ TROVE_GENERIC: True
diff --git a/trove/strata/fail2ban-common.morph b/trove/strata/fail2ban-common.morph
new file mode 100644
index 00000000..23918a66
--- /dev/null
+++ b/trove/strata/fail2ban-common.morph
@@ -0,0 +1,14 @@
+name: fail2ban-common
+kind: stratum
+description: |
+ This stratum only installs fail2ban. You will need to
+ configure it afterwards. It's recommended to include
+ iptables in the system too.
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: fail2ban
+ morph: trove/strata/fail2ban-common/fail2ban.morph
+ repo: upstream:fail2ban
+ ref: 70ba5cb0054f0869930b8cd2dc1bb836653dd289
+ unpetrify-ref: "0.9.3"
diff --git a/trove/strata/fail2ban-common/fail2ban.morph b/trove/strata/fail2ban-common/fail2ban.morph
new file mode 100644
index 00000000..2f267a5a
--- /dev/null
+++ b/trove/strata/fail2ban-common/fail2ban.morph
@@ -0,0 +1,6 @@
+name: fail2ban
+kind: chunk
+build-system: python3-distutils
+post-install-commands:
+- install -D -m 640 files/fail2ban.service "$DESTDIR"/"$PREFIX"/lib/systemd/system/fail2ban.service
+- install -D -m 640 files/fail2ban-tmpfiles.conf "$DESTDIR"/"$PREFIX"/lib/tmpfiles.d/fail2ban.conf
diff --git a/trove/strata/lorry-controller.morph b/trove/strata/lorry-controller.morph
new file mode 100644
index 00000000..87d3ed00
--- /dev/null
+++ b/trove/strata/lorry-controller.morph
@@ -0,0 +1,16 @@
+name: lorry-controller
+kind: stratum
+description: |
+ Lorry Controller mirroring service.
+
+ This is a component of Trove, but can
+ also be used with other Git servers.
+build-depends:
+- morph: strata/python-cliapp.morph
+- morph: strata/python-wsgi.morph
+chunks:
+- name: lorry-controller
+ morph: trove/strata/lorry-controller/lorry-controller.morph
+ repo: baserock:baserock/lorry-controller
+ ref: dddd2e37953d795e4004b1d2722c25ec652135ad
+ unpetrify-ref: master
diff --git a/trove/strata/lorry-controller/lorry-controller.morph b/trove/strata/lorry-controller/lorry-controller.morph
new file mode 100644
index 00000000..2f90a9a1
--- /dev/null
+++ b/trove/strata/lorry-controller/lorry-controller.morph
@@ -0,0 +1,10 @@
+name: lorry-controller
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+- install -d 0755 "$DESTDIR/etc/lighttpd"
+- install -m 0644 -D etc/lighttpd/*.conf "$DESTDIR/etc/lighttpd/."
+- |
+ TGT="$DESTDIR/usr/lib/systemd/system"
+ install -d "$TGT/multi-user.target.wants"
+ install -m 0644 units/*.service units/*.timer "$TGT/."
diff --git a/trove/strata/python3-core.morph b/trove/strata/python3-core.morph
new file mode 100644
index 00000000..afacc3da
--- /dev/null
+++ b/trove/strata/python3-core.morph
@@ -0,0 +1,58 @@
+name: python3-core
+kind: stratum
+description: |
+ Some "core" Python packages, for Python 3.
+
+ The CPython interpreter for Python 3 is in core.morph.
+
+build-depends:
+- morph: strata/core.morph
+
+chunks:
+- name: mako
+ repo: upstream:python-packages/mako.git
+ ref: 285bc818a50ccc0f9549630f7c4f4c250585c3e7
+ unpetrify-ref: rel_1_0_0
+ build-system: python3-distutils
+
+- name: pbr
+ repo: upstream:pbr
+ ref: 6e472b4905411a39e993c81c382a27ca9c771ef5
+ unpetrify-ref: 0.11.1
+ build-system: python3-distutils
+
+- name: python-requests
+ repo: upstream:python-requests
+ ref: b83131779c701720a9ae9efae78996277d416269
+ unpetrify-ref: v2.5.1
+ build-system: python3-distutils
+
+- name: six
+ repo: upstream:six
+ ref: 8cfbff6b764af86d825086fa1637aa009e90d75a
+ unpetrify-ref: 1.9.0
+ build-system: python3-distutils
+
+- name: pyyaml
+ morph: trove/strata/python3-core/pyyaml.morph
+ repo: upstream:pyyaml
+ ref: d9fbcceaed39d955f6871b07c61dc42f824285c1
+ unpetrify-ref: baserock/morph
+
+- name: python-lxml
+ repo: upstream:python-lxml
+ ref: 14505bc62f5f1fc9fb0ff007955f3e67ab4562bb
+ unpetrify-ref: lxml-3.4.0
+ build-system: python3-distutils
+
+- name: python-markdown
+ repo: upstream:python-markdown
+ ref: f0c5b71acbc02af60a33d67c59558bb513b25e74
+ unpetrify-ref: 2.5.1-final
+ build-system: python3-distutils
+
+- name: jsonschema
+ repo: upstream:jsonschema
+ ref: 35b60f390098d3306c03eee27ceec8cf8a493579
+ unpetrify-ref: v2.3.0
+ build-system: python3-distutils
diff --git a/trove/strata/python3-core/pyyaml.morph b/trove/strata/python3-core/pyyaml.morph
new file mode 100644
index 00000000..001f392c
--- /dev/null
+++ b/trove/strata/python3-core/pyyaml.morph
@@ -0,0 +1,6 @@
+name: pyyaml
+kind: chunk
+build-commands:
+- python3 setup.py --without-libyaml build
+install-commands:
+- python3 setup.py --without-libyaml install --prefix="$PREFIX" --root "$DESTDIR"
diff --git a/trove/strata/trove.morph b/trove/strata/trove.morph
new file mode 100644
index 00000000..8306c630
--- /dev/null
+++ b/trove/strata/trove.morph
@@ -0,0 +1,101 @@
+name: trove
+kind: stratum
+description: Trove software
+build-depends:
+- morph: strata/python2-core.morph
+- morph: strata/tools.morph
+- morph: strata/morph-utils.morph
+- morph: strata/pcre-utils.morph
+chunks:
+- name: lua
+ morph: trove/strata/trove/lua.morph
+ repo: upstream:lua
+ ref: 948063437e0350d9ef1649ec3a76d0c24a5c8642
+ unpetrify-ref: baserock/5.1-morph
+- name: lace
+ morph: trove/strata/trove/lace.morph
+ repo: upstream:gitano/lace
+ ref: d1b540b6d361d6a1f51e53cdaab69f053340efbb
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - lua
+ submodules:
+ extras/luacov:
+ url: upstream:gitano/luacov
+- name: luxio
+ morph: trove/strata/trove/luxio.morph
+ repo: upstream:luxio
+ ref: be9d125080b9ff2376273e21b75669b65dc88d46
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - lua
+- name: supple
+ morph: trove/strata/trove/supple.morph
+ repo: upstream:gitano/supple
+ ref: 0963e5706d78d0ae7446ea91af986de1e196eb39
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - lua
+ - luxio
+ submodules:
+ extras/luacov:
+ url: upstream:gitano/luacov
+- name: clod
+ morph: trove/strata/trove/clod.morph
+ repo: upstream:gitano/clod
+ ref: da15894f42f48d15db997c4355d6b672371a4163
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - lua
+ submodules:
+ extras/luacov:
+ url: upstream:gitano/luacov
+- name: gall
+ morph: trove/strata/trove/gall.morph
+ repo: upstream:gitano/gall
+ ref: 11de77bd79c08a152932a3435d1921abc1020252
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - lua
+ - luxio
+ submodules:
+ libgit2:
+ url: upstream:gitano/libgit2
+ luagit2:
+ url: upstream:gitano/luagit2
+ extras/luacov:
+ url: upstream:gitano/luacov
+- name: lrexlib-pcre
+ morph: trove/strata/trove/lrexlib-pcre.morph
+ repo: upstream:lrexlib
+ ref: 0524a6e3ab6d50cba63c8642a875e246de53d651
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - lua
+- name: gitano
+ morph: trove/strata/trove/gitano.morph
+ repo: upstream:gitano/gitano
+ ref: 4b8ce6875266fdd6609a217dcf2924d7d4815cc2
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - lua
+- name: cgit
+ morph: trove/strata/trove/cgit.morph
+ repo: upstream:cgit
+ ref: dc881acb0c857c783b611c03294d79a7553a4ec7
+ unpetrify-ref: baserock/v0.12
+ submodules:
+ git:
+ url: upstream:git
+- name: trove-setup
+ morph: trove/strata/trove/trove-setup.morph
+ repo: baserock:baserock/trove-setup
+ ref: 1f2edd45b03a3e9d86d7c77847612c969b60b86f
+ unpetrify-ref: master
+- name: lua-scrypt
+ morph: trove/strata/trove/lua-scrypt.morph
+ repo: upstream:lua-scrypt
+ ref: 0d7f74cd3eab7d54fbb13294194de7ea70ac34a5
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - lua
diff --git a/trove/strata/trove/cgit.morph b/trove/strata/trove/cgit.morph
new file mode 100644
index 00000000..bd373a51
--- /dev/null
+++ b/trove/strata/trove/cgit.morph
@@ -0,0 +1,6 @@
+name: cgit
+kind: chunk
+build-commands:
+- make prefix="$PREFIX"
+install-commands:
+- make prefix="$PREFIX" DESTDIR="$DESTDIR" install
diff --git a/trove/strata/trove/clod.morph b/trove/strata/trove/clod.morph
new file mode 100644
index 00000000..e31ca4fb
--- /dev/null
+++ b/trove/strata/trove/clod.morph
@@ -0,0 +1,7 @@
+name: clod
+kind: chunk
+description: Configuration Language Organised (by) Dots.
+build-commands:
+- make
+install-commands:
+- make INST_BASE="$PREFIX" DESTDIR="$DESTDIR" install
diff --git a/trove/strata/trove/gall.morph b/trove/strata/trove/gall.morph
new file mode 100644
index 00000000..c1f2fd47
--- /dev/null
+++ b/trove/strata/trove/gall.morph
@@ -0,0 +1,7 @@
+name: gall
+kind: chunk
+description: Git Abstraction Layer for Lua
+build-commands:
+- make
+install-commands:
+- make INST_BASE="$PREFIX" DESTDIR="$DESTDIR" install
diff --git a/trove/strata/trove/gitano.morph b/trove/strata/trove/gitano.morph
new file mode 100644
index 00000000..962224d5
--- /dev/null
+++ b/trove/strata/trove/gitano.morph
@@ -0,0 +1,5 @@
+name: gitano
+kind: chunk
+install-commands:
+- make install INST_ROOT="$PREFIX" DESTDIR="$DESTDIR"
+- cp scripts/htpasswd "$DESTDIR/$PREFIX/bin"
diff --git a/trove/strata/trove/lace.morph b/trove/strata/trove/lace.morph
new file mode 100644
index 00000000..70752397
--- /dev/null
+++ b/trove/strata/trove/lace.morph
@@ -0,0 +1,7 @@
+name: lace
+kind: chunk
+description: Lua Access Control Engine.
+build-commands:
+- make
+install-commands:
+- make INST_BASE="$PREFIX" DESTDIR="$DESTDIR" install
diff --git a/trove/strata/trove/lrexlib-pcre.morph b/trove/strata/trove/lrexlib-pcre.morph
new file mode 100644
index 00000000..63f3b034
--- /dev/null
+++ b/trove/strata/trove/lrexlib-pcre.morph
@@ -0,0 +1,9 @@
+name: lrexlib-pcre
+kind: chunk
+description: Lua regular expression library - PCRE build only
+build-commands:
+- gcc -fPIC -DPIC -DVERSION=\"2.7.2\" -o rex_pcre.so -shared src/common.c src/pcre/lpcre.c
+ src/pcre/lpcre_f.c -lpcre
+install-commands:
+- mkdir -p $DESTDIR/usr/lib/lua/5.1/
+- cp rex_pcre.so $DESTDIR/usr/lib/lua/5.1/
diff --git a/trove/strata/trove/lua-scrypt.morph b/trove/strata/trove/lua-scrypt.morph
new file mode 100644
index 00000000..141b8ec3
--- /dev/null
+++ b/trove/strata/trove/lua-scrypt.morph
@@ -0,0 +1,4 @@
+name: lua-scrypt
+kind: chunk
+install-commands:
+- make lua-5.1-install DESTDIR="$DESTDIR"
diff --git a/trove/strata/trove/lua.morph b/trove/strata/trove/lua.morph
new file mode 100644
index 00000000..32aeb5c1
--- /dev/null
+++ b/trove/strata/trove/lua.morph
@@ -0,0 +1,11 @@
+name: lua
+kind: chunk
+configure-commands:
+- sed -e 's/defined(LUA_USE_READLINE)/0/g' src/luaconf.h.orig >src/luaconf.h
+- sed -i -e '/^linux:/{n;s/-lreadline//g;s/-lhistory//g;s/-lncurses//g}' src/Makefile
+build-commands:
+- make debian_linux INSTALL_TOP="$PREFIX" RPATH="$PREFIX/lib"
+install-commands:
+- make INSTALL_TOP="$DESTDIR/$PREFIX" debian_install
+- mkdir -p "$DESTDIR/$PREFIX/lib/pkgconfig"
+- cp lua5.1.pc "$DESTDIR/$PREFIX/lib/pkgconfig/"
diff --git a/trove/strata/trove/luxio.morph b/trove/strata/trove/luxio.morph
new file mode 100644
index 00000000..29aabfaf
--- /dev/null
+++ b/trove/strata/trove/luxio.morph
@@ -0,0 +1,7 @@
+name: luxio
+kind: chunk
+description: Lua Unix IO (and related stuff).
+build-commands:
+- make lua-5.1
+install-commands:
+- make DESTDIR="$DESTDIR" lua-5.1-install
diff --git a/trove/strata/trove/supple.morph b/trove/strata/trove/supple.morph
new file mode 100644
index 00000000..6470ba28
--- /dev/null
+++ b/trove/strata/trove/supple.morph
@@ -0,0 +1,7 @@
+name: supple
+kind: chunk
+description: Sandbox (for) Untrusted Procedure Partitioning (in) Lua Engine.
+build-commands:
+- make
+install-commands:
+- make INST_BASE="$PREFIX" DESTDIR="$DESTDIR" install
diff --git a/trove/strata/trove/trove-setup.morph b/trove/strata/trove/trove-setup.morph
new file mode 100644
index 00000000..1f49760f
--- /dev/null
+++ b/trove/strata/trove/trove-setup.morph
@@ -0,0 +1,4 @@
+name: trove-setup
+kind: chunk
+install-commands:
+- make install DESTDIR="$DESTDIR"
diff --git a/trove/systems/trove-system-x86_64.morph b/trove/systems/trove-system-x86_64.morph
new file mode 100644
index 00000000..fa691d62
--- /dev/null
+++ b/trove/systems/trove-system-x86_64.morph
@@ -0,0 +1,65 @@
+name: trove-system-x86_64
+kind: system
+description: Trove server
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: core
+ morph: strata/core.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python3-core
+ morph: trove/strata/python3-core.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: lorry-controller
+ morph: trove/strata/lorry-controller.morph
+- name: trove
+ morph: trove/strata/trove.morph
+- name: lighttpd-server
+ morph: strata/lighttpd-server.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: fail2ban-common
+ morph: trove/strata/fail2ban-common.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/trove
+- extensions/nfsboot-server
+- extensions/fstab
+- extensions/install-files
+- extensions/cloud-init
+- extensions/install-essential-files
diff --git a/unmaintained/clusters/cephclient.morph b/unmaintained/clusters/cephclient.morph
new file mode 100644
index 00000000..ad680a76
--- /dev/null
+++ b/unmaintained/clusters/cephclient.morph
@@ -0,0 +1,20 @@
+name: cephclient
+kind: cluster
+systems:
+- morph: unmaintained/systems/ceph-service-x86_64-generic.morph
+ deploy:
+ ceph-node-virtualbox-image:
+ 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.
+ #HOST_IPADDR: 10.0.100.100
+ #NETMASK: 255.255.255.0
+
+ # This is an example of how to configure the three interfaces necessary to support ceph in the BCPC configuration.
+ #NETWORK_CONFIG: lo:loopback;enp0s3:static,address=10.0.100.14,netmask=255.255.255.0;enp0s8:static,address=172.16.100.14,netmask=255.255.255.0;enp0s9:static,address=192.168.100.14,netmask=255.255.255.0
+ DISK_SIZE: 8G
+ HOSTNAME: CephNode4
+
+ # You must install authorized_keys in chef/root/.ssh/ before this will work.
+ INSTALL_FILES: install-files/chef/manifest
diff --git a/unmaintained/clusters/example-ceph-cluster-on-openstack.morph b/unmaintained/clusters/example-ceph-cluster-on-openstack.morph
new file mode 100644
index 00000000..73f6729c
--- /dev/null
+++ b/unmaintained/clusters/example-ceph-cluster-on-openstack.morph
@@ -0,0 +1,55 @@
+name: example-ceph-cluster-on-openstack
+kind: cluster
+description: |
+ This cluster morphology will deploy a 3 node ceph storage cluster to an
+ openstack server.
+
+ It was written for use with the following guide on the baserock wiki:
+ http://wiki.baserock.org/guides/ceph-cluster-deploy/
+
+ See this guide for more information.
+
+ See the ceph.configure file for more informatiion on the ceph
+ specific fields used in this cluster morphology.
+
+systems:
+- morph: unmaintained/systems/ceph-service-x86_64-generic.morph
+ deploy:
+ ceph-mon-0-openstack:
+ # openstack info
+ <<: &common-config
+ type: openstack
+ location: http://<BASEROCK_OPENSTACK_SERVER_IP>:5000/v2.0/
+ OPENSTACK_USER: demo
+ OPENSTACK_PASSWORD: demo
+ OPENSTACK_TENANT: demo
+ CLOUD_INIT: true
+ KERNEL_ARGS: console=ttyS0 console=tty0
+ CEPH_CLUSTER: ceph
+ CEPH_CONF: ceph.conf
+ CEPH_CLIENT_ADMIN: ceph.client.admin.keyring
+ CEPH_MON_IP: <CEPH_MON_IP>
+ CEPH_CLUSTER_FSID: <CEPH_CLUSTER_FSID>
+
+ OPENSTACK_IMAGENAME: mon-0-nd
+ DISK_SIZE: 10G
+ # Ceph info
+ HOSTNAME: mon-0
+ CEPH_MON:
+ ceph-osd-0-openstack:
+ <<: *common-config
+ OPENSTACK_IMAGENAME: osd-0
+ DISK_SIZE: 7G
+ # ceph info
+ HOSTNAME: osd-0
+ CEPH_OSD:
+ CEPH_OSD_STORAGE_DEV: /dev/vdb
+ ceph-osd-1-openstack:
+ <<: *common-config
+ OPENSTACK_IMAGENAME: osd-1
+ DISK_SIZE: 7G
+ # ceph info
+ HOSTNAME: osd-1
+
+ CEPH_OSD:
+ CEPH_OSD_STORAGE_DEV: /dev/vdb
diff --git a/unmaintained/clusters/example-swift-storage-cluster.morph b/unmaintained/clusters/example-swift-storage-cluster.morph
new file mode 100644
index 00000000..42f52d8a
--- /dev/null
+++ b/unmaintained/clusters/example-swift-storage-cluster.morph
@@ -0,0 +1,62 @@
+name: example-swift-storage-cluster
+kind: cluster
+systems:
+- morph: unmaintained/systems/swift-system-x86_64.morph
+ deploy-defaults:
+ INSTALL_FILES: install-files/swift/manifest
+
+ CONTROLLER_HOST_ADDRESS: <controller host address>
+
+ SWIFT_PART_POWER: 10
+ SWIFT_REPLICAS: 3
+ SWIFT_MIN_PART_HOURS: 1
+
+ SWIFT_STORAGE_DEVICES:
+ - {ip: <node0 management ip>, device: sdb, weight: 100}
+ - {ip: <node0 management ip>, device: sdc, weight: 100}
+ - {ip: <node0 management ip>, device: sdd, weight: 100}
+ - {ip: <node1 management ip>, device: sdb, weight: 100}
+ - {ip: <node1 management ip>, device: sdc, weight: 100}
+ - {ip: <node1 management ip>, device: sdd, weight: 100}
+
+ # This value can be any random string or number
+ # but each node in your swift cluster must have the same value
+ SWIFT_REBALANCE_SEED: 3828
+
+ # NOTE: Replace SWIFT_HASH_PATH_PREFIX and SWIFT_HASH_PATH_SUFFIX
+ # with your own unique values,
+ #
+ # `openssl rand -hex 10' can be used to generate unique values
+ #
+ # These values should be kept secret, do not lose them.
+ #
+ SWIFT_HASH_PATH_PREFIX: 041fc210e4e1d333ce1d
+ SWIFT_HASH_PATH_SUFFIX: 4d6f5362a356dda7fb7d
+
+ FSTAB_SDB: /dev/sdb /srv/node/sdb xfs defaults,user,rw 0 0
+ FSTAB_SDC: /dev/sdc /srv/node/sdc xfs defaults,user,rw 0 0
+ FSTAB_SDD: /dev/sdd /srv/node/sdd xfs defaults,user,rw 0 0
+
+ deploy:
+ node0:
+ type: extensions/kvm
+ location: kvm+ssh://user@host/swift-storage-0/home/user/swift-storage-0.img
+ DISK_SIZE: 10G
+ RAM_SIZE: 1G
+ VCPUS: 1
+ HOSTNAME: swift-storage-0
+ NIC_CONFIG: network=default
+ NETWORK_CONFIG: ens3:static,address=<node0 management ip>,netmask=255.255.255.0
+ MANAGEMENT_INTERFACE_IP_ADDRESS: <node0 management ip>
+ ATTACH_DISKS: /dev/node0_sdb:/dev/node0_sdc:/dev/node0_sdd
+ node1:
+ type: extensions/kvm
+ location: kvm+ssh://user@host/swift-storage-1/home/user/swift-storage-1.img
+ DISK_SIZE: 10G
+ RAM_SIZE: 1G
+ VCPUS: 1
+ HOSTNAME: swift-storage-1
+ NIC_CONFIG: network=default
+ NETWORK_CONFIG: ens3:static,address=<node1 management ip>,netmask=255.255.255.0
+ MANAGEMENT_INTERFACE_IP_ADDRESS: <node1 management ip>
+ ATTACH_DISKS: /dev/node1_sdb:/dev/node1_sdc:/dev/node1_sdd
diff --git a/unmaintained/clusters/openstack-one-node-swift.morph b/unmaintained/clusters/openstack-one-node-swift.morph
new file mode 100644
index 00000000..b9d6502b
--- /dev/null
+++ b/unmaintained/clusters/openstack-one-node-swift.morph
@@ -0,0 +1,142 @@
+name: openstack-one-node-swift
+kind: cluster
+description: |
+ This is a cluster morphology for deploying a x86_64 OpenStack system
+ all-in-one-node.
+
+ Requirements to be able to run and test the system:
+
+ - DISK_SIZE should be bigger than 5G
+ - The system has to have available at least 4G of RAM, but once
+ you start instantiating VMs you will need more.
+ - The IP of the system can't change, and you need to know it beforehand,
+ that is, the system needs a static IP address.
+
+ This cluster is configurable, but with the following constraints:
+
+ - The hostname in RABBITMQ_HOST has to match CONTROLLER_HOST_ADDRESS,
+ and HOST_CONTROLLER.
+ - HOSTS_CONTROLLER is only needed if the hostname (see previous point)
+ is not a FQDN.
+ - The IP listed in MANAGEMENT_INTERFACE_IP_ADDRESS has to match the one
+ used in HOSTS_CONTROLLER.
+ - CINDER_DEVICE should be a path to a storage device ready to be
+ used/formated for cinder data.
+ - EXTERNAL_INTERFACE is required when the system has more than one network
+ interface.
+
+ You can also have a look at the following suggestions:
+
+ - NOVA_VIRT_TYPE can be either 'kvm' or 'qemu', depending on where the
+ system is being deployed to.
+ - We recommend changing all the PASSWORDs variables, also the
+ KEYSTONE_TEMPORARY_ADMIN_TOKEN, METADATA_PROXY_SHARED_SECRET and
+ METERING_SECRET
+ - Setting NOVA_BAREMETAL_SCHEDULING with an YAML truth value will configure
+ Nova to schedule baremetal machines through the Ironic driver, instead of
+ sheduling virtual machines.
+
+systems:
+- morph: unmaintained/systems/openstack-system-x86_64.morph
+ deploy:
+ release:
+ type: extensions/rawdisk
+ location: baserock-openstack-system-x86_64.img
+ DISK_SIZE: 10G
+ INSTALL_FILES: install-files/openstack/manifest install-files/swift/manifest
+
+ HOSTNAME: onenode
+
+ #########################################################################
+ ## Swift config options
+ #########################################################################
+
+ SWIFT_CONTROLLER: true
+
+ SWIFT_ADMIN_PASSWORD: insecure
+
+ SWIFT_PART_POWER: 10
+ SWIFT_REPLICAS: 3
+ SWIFT_MIN_PART_HOURS: 1
+
+ SWIFT_STORAGE_DEVICES:
+ - {ip: <storage node 0 management ip>, device: sdb, weight: 100}
+ - {ip: <storage node 0 management ip>, device: sdc, weight: 100}
+ - {ip: <storage node 0 management ip>, device: sdd, weight: 100}
+ - {ip: <storage node 1 management ip>, device: sdb, weight: 100}
+ - {ip: <storage node 1 management ip>, device: sdc, weight: 100}
+ - {ip: <storage node 1 management ip>, device: sdd, weight: 100}
+
+ # This value can be any random string or number
+ # but each node in your swift cluster must have the same values
+ SWIFT_REBALANCE_SEED: 3828
+
+ # NOTE: Replace SWIFT_HASH_PATH_PREFIX and SWIFT_HASH_PATH_SUFFIX
+ # with your own unique values,
+ #
+ # `openssl rand -hex 10' can be used to generate unique values
+ #
+ # These values should be kept secret, do not lose them.
+ #
+ SWIFT_HASH_PATH_PREFIX: 041fc210e4e1d333ce1d
+ SWIFT_HASH_PATH_SUFFIX: 4d6f5362a356dda7fb7d
+
+ #########################################################################
+
+ RABBITMQ_HOST: onenode
+ RABBITMQ_PORT: 5672
+ RABBITMQ_USER: rabbitmq
+ RABBITMQ_PASSWORD: veryinsecure
+
+ CONTROLLER_HOST_ADDRESS: onenode
+ MANAGEMENT_INTERFACE_IP_ADDRESS: <management ip>
+
+ KEYSTONE_ENABLE_SERVICE: true
+ KEYSTONE_TEMPORARY_ADMIN_TOKEN: 22f3aa1cf538e3f6d5e8
+ KEYSTONE_ADMIN_PASSWORD: veryinsecure
+ KEYSTONE_DB_USER: keystoneDB
+ KEYSTONE_DB_PASSWORD: veryinsecure
+
+ GLANCE_ENABLE_SERVICE: true
+ GLANCE_SERVICE_USER: glance
+ GLANCE_SERVICE_PASSWORD: veryinsecure
+ GLANCE_DB_USER: glanceDB
+ GLANCE_DB_PASSWORD: veryinsecure
+
+ NOVA_SERVICE_USER: nova
+ NOVA_SERVICE_PASSWORD: veryinsecure
+ NOVA_DB_USER: novaDB
+ NOVA_DB_PASSWORD: veryinsecure
+ NOVA_VIRT_TYPE: qemu
+ NOVA_BAREMETAL_SCHEDULING: false
+
+ CINDER_SERVICE_USER: cinder
+ CINDER_SERVICE_PASSWORD: veryinsecure
+ CINDER_DB_USER: cinderDB
+ CINDER_DB_PASSWORD: veryinsecure
+ # Storage device to be used by Cinder
+ CINDER_DEVICE: /dev/sdb
+
+ NEUTRON_SERVICE_USER: neutron
+ NEUTRON_SERVICE_PASSWORD: veryinsecure
+ NEUTRON_DB_USER: neutronDB
+ NEUTRON_DB_PASSWORD: veryinsecure
+ METADATA_PROXY_SHARED_SECRET: novaneutronmetasecret
+
+ IRONIC_ENABLE_SERVICE: true
+ IRONIC_SERVICE_USER: ironic
+ IRONIC_SERVICE_PASSWORD: veryinsecure
+ IRONIC_DB_USER: ironicDB
+ IRONIC_DB_PASSWORD: veryinsecure
+
+ CEILOMETER_SERVICE_USER: ceilometer
+ CEILOMETER_SERVICE_PASSWORD: veryinsecure
+ CEILOMETER_DB_USER: ceilometerDB
+ CEILOMETER_DB_PASSWORD: veryinsecure
+ METERING_SECRET: insecureceilometersecret
+
+ HOSTS_CONTROLLER: <management ip> onenode
+
+ # Network interface to be used, only needed if there are more
+ # than one available.
+ # EXTERNAL_INTERFACE: eno1
diff --git a/unmaintained/clusters/openstack-one-node.morph b/unmaintained/clusters/openstack-one-node.morph
new file mode 100644
index 00000000..ddecb6fc
--- /dev/null
+++ b/unmaintained/clusters/openstack-one-node.morph
@@ -0,0 +1,104 @@
+name: openstack-one-node
+kind: cluster
+description: |
+ This is a cluster morphology for deploying a x86_64 OpenStack system
+ all-in-one-node.
+
+ Requirements to be able to run and test the system:
+
+ - DISK_SIZE should be bigger than 5G
+ - The system has to have available at least 4G of RAM, but once
+ you start instantiating VMs you will need more.
+ - The IP of the system can't change, and you need to know it beforehand,
+ that is, the system needs a static IP address.
+
+ This cluster is configurable, but with the following constraints:
+
+ - The hostname in RABBITMQ_HOST has to match CONTROLLER_HOST_ADDRESS,
+ and HOST_CONTROLLER.
+ - HOSTS_CONTROLLER is only needed if the hostname (see previous point)
+ is not a FQDN.
+ - The IP listed in MANAGEMENT_INTERFACE_IP_ADDRESS has to match the one
+ used in HOSTS_CONTROLLER.
+ - CINDER_DEVICE should be a path to a storage device ready to be
+ used/formated for cinder data.
+ - EXTERNAL_INTERFACE is required when the system has more than one network
+ interface.
+
+ You can also have a look at the following suggestions:
+
+ - NOVA_VIRT_TYPE can be either 'kvm' or 'qemu', depending on where the
+ system is being deployed to.
+ - We recommend changing all the PASSWORDs variables, also the
+ KEYSTONE_TEMPORARY_ADMIN_TOKEN, METADATA_PROXY_SHARED_SECRET and
+ METERING_SECRET
+ - Setting NOVA_BAREMETAL_SCHEDULING with an YAML truth value will configure
+ Nova to schedule baremetal machines through the Ironic driver, instead of
+ sheduling virtual machines.
+
+systems:
+- morph: unmaintained/systems/openstack-system-x86_64.morph
+ deploy:
+ release:
+ type: extensions/rawdisk
+ location: baserock-openstack-system-x86_64.img
+ DISK_SIZE: 10G
+ INSTALL_FILES: install-files/openstack/manifest
+
+ HOSTNAME: onenode
+
+ RABBITMQ_HOST: onenode
+ RABBITMQ_PORT: 5672
+ RABBITMQ_USER: rabbitmq
+ RABBITMQ_PASSWORD: veryinsecure
+
+ CONTROLLER_HOST_ADDRESS: onenode
+ MANAGEMENT_INTERFACE_IP_ADDRESS: <management ip>
+
+ KEYSTONE_ENABLE_SERVICE: true
+ KEYSTONE_TEMPORARY_ADMIN_TOKEN: 22f3aa1cf538e3f6d5e8
+ KEYSTONE_ADMIN_PASSWORD: veryinsecure
+ KEYSTONE_DB_USER: keystoneDB
+ KEYSTONE_DB_PASSWORD: veryinsecure
+
+ GLANCE_ENABLE_SERVICE: true
+ GLANCE_SERVICE_USER: glance
+ GLANCE_SERVICE_PASSWORD: veryinsecure
+ GLANCE_DB_USER: glanceDB
+ GLANCE_DB_PASSWORD: veryinsecure
+
+ NOVA_SERVICE_USER: nova
+ NOVA_SERVICE_PASSWORD: veryinsecure
+ NOVA_DB_USER: novaDB
+ NOVA_DB_PASSWORD: veryinsecure
+ NOVA_VIRT_TYPE: qemu
+ NOVA_BAREMETAL_SCHEDULING: false
+
+ CINDER_SERVICE_USER: cinder
+ CINDER_SERVICE_PASSWORD: veryinsecure
+ CINDER_DB_USER: cinderDB
+ CINDER_DB_PASSWORD: veryinsecure
+ # Storage device to be used by Cinder
+ CINDER_DEVICE: /dev/sdb
+
+ NEUTRON_SERVICE_USER: neutron
+ NEUTRON_SERVICE_PASSWORD: veryinsecure
+ NEUTRON_DB_USER: neutronDB
+ NEUTRON_DB_PASSWORD: veryinsecure
+ METADATA_PROXY_SHARED_SECRET: novaneutronmetasecret
+
+ IRONIC_ENABLE_SERVICE: true
+ IRONIC_SERVICE_USER: ironic
+ IRONIC_SERVICE_PASSWORD: veryinsecure
+ IRONIC_DB_USER: ironicDB
+ IRONIC_DB_PASSWORD: veryinsecure
+
+ CEILOMETER_SERVICE_USER: ceilometer
+ CEILOMETER_SERVICE_PASSWORD: veryinsecure
+ CEILOMETER_DB_USER: ceilometerDB
+ CEILOMETER_DB_PASSWORD: veryinsecure
+ METERING_SECRET: insecureceilometersecret
+
+ # Network interface to be used, only needed if there are more
+ # than one available.
+ # EXTERNAL_INTERFACE: eno1
diff --git a/unmaintained/clusters/openstack-three-node-installer.morph b/unmaintained/clusters/openstack-three-node-installer.morph
new file mode 100644
index 00000000..9274f9bf
--- /dev/null
+++ b/unmaintained/clusters/openstack-three-node-installer.morph
@@ -0,0 +1,238 @@
+name: openstack-three-node-installer
+kind: cluster
+description: |
+ This is a cluster morphology for deploying an installer for an x86_64
+ OpenStack system spread across three nodes.
+
+ This cluster creates disk images that may be `dd`'d onto install media to
+ produce an OpenStack cluster when instantiated.
+
+ Alternatively it may be used to install directly onto a physical disk by
+ running:
+
+ morph deploy clusters/openstack-three-node-installer.morph \
+ network-installer network-installer.location=/dev/vdb
+
+ Substituting network-installer for either compute-installer or
+ controller-installer will produce different configurations, and it is possible
+ to substitue /dev/vdb for a different path to a disk image to install to a
+ different disk image.
+
+ Substitute the values of HOSTNAME, NETWORK_CONFIG, EXTERNAL_INTERFACE,
+ MANAGEMENT_IP_ADDRESS, CONTROLLER_HOST_ADDRESS, RABBITMQ_HOST and HOSTS_* to
+ match your hardware and networking configuration.
+
+ Requirements to be able to run and test the system:
+
+ - DISK_SIZE should be bigger than 5G
+ - The system has to have available at least 4G of RAM, but once
+ you start instantiating VMs you will need more.
+ - The IP of the system can't change, and you need to know it beforehand,
+ that is, the system needs a static IP address.
+
+ This cluster is configurable, but with the following constraints:
+
+ - The hostname in RABBITMQ_HOST has to match CONTROLLER_HOST_ADDRESS,
+ and HOST_CONTROLLER.
+ - HOSTS_CONTROLLER is only needed if the hostname (see previous point)
+ is not a FQDN.
+ - The IP listed in MANAGEMENT_INTERFACE_IP_ADDRESS has to match the one
+ used in HOSTS_CONTROLLER.
+ - CINDER_DEVICE should be a path to a storage device ready to be
+ used/formated for cinder data.
+ - EXTERNAL_INTERFACE is required when the system has more than one network
+ interface.
+
+ You can also have a look at the following suggestions:
+
+ - NOVA_VIRT_TYPE can be either 'kvm' or 'qemu', depending on where the
+ system is being deployed to.
+ - We recommend changing all the PASSWORDs variables, also the
+ KEYSTONE_TEMPORARY_ADMIN_TOKEN, METADATA_PROXY_SHARED_SECRET and
+ METERING_SECRET.
+ - Setting NOVA_BAREMETAL_SCHEDULING with an YAML truth value will configure
+ Nova to schedule baremetal machines through the Ironic driver, instead of
+ sheduling virtual machines.
+
+systems:
+- morph: systems/installer-system-x86_64.morph
+ deploy:
+ network-installer: &installer
+ type: extensions/rawdisk
+ location: installer-openstack-network-x86_64.img
+ KERNEL_ARGS: init=/usr/lib/baserock-installer/installer
+ DISK_SIZE: 6G
+ HOSTNAME: installer-x86_64
+ INSTALLER_TARGET_STORAGE_DEVICE: /dev/sda
+ INSTALLER_ROOTFS_TO_INSTALL: /rootfs
+ INSTALLER_POST_INSTALL_COMMAND: sync; poweroff -f
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ network-initramfs: &initramfs
+ type: extensions/initramfs
+ location: boot/initramfs.gz
+ - morph: unmaintained/systems/openstack-system-x86_64.morph
+ deploy:
+ network-to-install: &stack-node
+ type: extensions/sysroot
+ location: rootfs
+ INSTALL_FILES: install-files/openstack/manifest
+ INITRAMFS_PATH: boot/initramfs.gz
+
+ HOSTNAME: threenode-network
+
+ RABBITMQ_HOST: threenode-controller.os-mgmt
+ RABBITMQ_PORT: 5672
+ RABBITMQ_USER: rabbitmq
+ RABBITMQ_PASSWORD: veryinsecure
+
+ # This token needs to be unique and secret
+ KEYSTONE_ENABLE_SERVICE: false
+ KEYSTONE_TEMPORARY_ADMIN_TOKEN: 22f3aa1cf538e3f6d5e8
+ KEYSTONE_ADMIN_PASSWORD: veryinsecure
+ KEYSTONE_DB_USER: keystoneDB
+ KEYSTONE_DB_PASSWORD: veryinsecure
+
+ GLANCE_ENABLE_SERVICE: false
+ GLANCE_SERVICE_USER: glance
+ GLANCE_SERVICE_PASSWORD: veryinsecure
+ GLANCE_DB_USER: glanceDB
+ GLANCE_DB_PASSWORD: veryinsecure
+
+ NOVA_ENABLE_CONTROLLER: false
+ NOVA_ENABLE_COMPUTE: false
+ NOVA_SERVICE_USER: nova
+ NOVA_SERVICE_PASSWORD: veryinsecure
+ NOVA_DB_USER: novaDB
+ NOVA_DB_PASSWORD: veryinsecure
+ NOVA_VIRT_TYPE: kvm
+ NOVA_BAREMETAL_SCHEDULING: false
+
+ CINDER_ENABLE_CONTROLLER: false
+ CINDER_ENABLE_COMPUTE: false
+ CINDER_ENABLE_STORAGE: false
+ CINDER_SERVICE_USER: cinder
+ CINDER_SERVICE_PASSWORD: veryinsecure
+ CINDER_DB_USER: cinderDB
+ CINDER_DB_PASSWORD: veryinsecure
+ # Storage device to be used by Cinder
+ CINDER_DEVICE: /dev/sdb
+
+ NEUTRON_ENABLE_AGENT: false
+ NEUTRON_ENABLE_MANAGER: true
+ NEUTRON_ENABLE_CONTROLLER: false
+ NEUTRON_SERVICE_USER: neutron
+ NEUTRON_SERVICE_PASSWORD: veryinsecure
+ NEUTRON_DB_USER: neutronDB
+ NEUTRON_DB_PASSWORD: veryinsecure
+ METADATA_PROXY_SHARED_SECRET: novaneutronmetasecret
+
+ IRONIC_ENABLE_SERVICE: false
+ IRONIC_SERVICE_USER: ironic
+ IRONIC_SERVICE_PASSWORD: veryinsecure
+ IRONIC_DB_USER: ironicDB
+ IRONIC_DB_PASSWORD: veryinsecure
+
+ CEILOMETER_SERVICE_USER: ceilometer
+ CEILOMETER_SERVICE_PASSWORD: veryinsecure
+ CEILOMETER_DB_USER: ceilometerDB
+ CEILOMETER_DB_PASSWORD: veryinsecure
+ CEILOMETER_ENABLE_CONTROLLER: false
+ CEILOMETER_ENABLE_COMPUTE: false
+ METERING_SECRET: insecureceilometersecret
+
+ CONTROLLER_HOST_ADDRESS: threenode-controller.os-mgmt
+ MANAGEMENT_INTERFACE_IP_ADDRESS: 10.0.0.1
+
+ HOSTS_NETWORK: 10.0.0.1 threenode-network.os-mgmt
+ HOSTS_CONTROL: 10.0.0.2 threenode-controller.os-mgmt
+ HOSTS_COMPUTE: 10.0.0.3 threenode-compute.os-mgmt
+
+ EXTERNAL_INTERFACE: enp3s0
+ NETWORK_CONFIG: enp3s0:dhcp;enp2s0:static,address=10.0.0.1,netmask=255.255.255.0
+ SYNC_TIME_WITH_CONTROLLER: true
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ network-to-install-initramfs: *initramfs
+- morph: systems/installer-system-x86_64.morph
+ deploy:
+ controller-installer:
+ <<: *installer
+ location: installer-openstack-controller-x86_64.img
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ controller-initramfs: *initramfs
+ - morph: unmaintained/systems/openstack-system-x86_64.morph
+ deploy:
+ controller-to-install:
+ <<: *stack-node
+ HOSTNAME: threenode-controller
+
+ KEYSTONE_ENABLE_SERVICE: true
+
+ GLANCE_ENABLE_SERVICE: true
+
+ NOVA_ENABLE_CONTROLLER: true
+
+ CINDER_ENABLE_CONTROLLER: true
+ CINDER_ENABLE_COMPUTE: false
+ CINDER_ENABLE_STORAGE: false
+
+ NEUTRON_ENABLE_AGENT: false
+ NEUTRON_ENABLE_MANAGER: false
+ NEUTRON_ENABLE_CONTROLLER: true
+ METADATA_PROXY_SHARED_SECRET: novaneutronmetasecret
+
+ IRONIC_ENABLE_SERVICE: true
+
+ CEILOMETER_ENABLE_CONTROLLER: true
+ CEILOMETER_ENABLE_COMPUTE: false
+
+ MANAGEMENT_INTERFACE_IP_ADDRESS: 10.0.0.2
+ EXTERNAL_INTERFACE: enp2s0
+ NETWORK_CONFIG: enp2s0:dhcp;enp0s26u1u2:static,address=10.0.0.2,netmask=255.255.255.0
+ SYNC_TIME_WITH_CONTROLLER: false
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ controller-to-install-initramfs: *initramfs
+- morph: systems/installer-system-x86_64.morph
+ deploy:
+ compute-installer:
+ <<: *installer
+ location: installer-openstack-compute-x86_64.img
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ compute-initramfs: *initramfs
+ - morph: unmaintained/systems/openstack-system-x86_64.morph
+ deploy:
+ compute-to-install:
+ <<: *stack-node
+ HOSTNAME: threenode-compute
+
+ NOVA_ENABLE_COMPUTE: true
+
+ CINDER_ENABLE_CONTROLLER: false
+ CINDER_ENABLE_COMPUTE: true
+ CINDER_ENABLE_STORAGE: true
+
+ NEUTRON_ENABLE_AGENT: true
+ NEUTRON_ENABLE_MANAGER: false
+ NEUTRON_ENABLE_CONTROLLER: false
+
+ CEILOMETER_ENABLE_CONTROLLER: false
+ CEILOMETER_ENABLE_COMPUTE: true
+
+ MANAGEMENT_INTERFACE_IP_ADDRESS: 10.0.0.3
+ EXTERNAL_INTERFACE: eno1
+ NETWORK_CONFIG: eno1:dhcp;enp0s29u1u3:static,address=10.0.0.3,netmask=255.255.255.0
+ SYNC_TIME_WITH_CONTROLLER: true
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ compute-to-install-initramfs: *initramfs
diff --git a/unmaintained/clusters/openstack-two-node-installer.morph b/unmaintained/clusters/openstack-two-node-installer.morph
new file mode 100644
index 00000000..e75b5a5e
--- /dev/null
+++ b/unmaintained/clusters/openstack-two-node-installer.morph
@@ -0,0 +1,199 @@
+name: openstack-two-node-installer
+kind: cluster
+description: |
+ This is a cluster morphology for deploying an installer for an x86_64
+ OpenStack system spread across three nodes.
+
+ This cluster creates disk images that may be `dd`'d onto install media to
+ produce an OpenStack cluster when instantiated.
+
+ Alternatively it may be used to install directly onto a physical disk by
+ running:
+
+ morph deploy clusters/openstack-two-node-installer.morph \
+ controller-installer controller-installer.location=/dev/vdb
+
+ Substituting contrller-installer for compute-installer will produce
+ different configurations, and it is possible to substitue /dev/vdb for a
+ different path to a disk image to install to a different disk image.
+
+ Substitute the values of HOSTNAME, NETWORK_CONFIG, EXTERNAL_INTERFACE,
+ MANAGEMENT_IP_ADDRESS, CONTROLLER_HOST_ADDRESS, RABBITMQ_HOST and HOSTS_* to
+ match your hardware and networking configuration.
+
+ Requirements to be able to run and test the system:
+
+ - DISK_SIZE should be bigger than 5G
+ - The system has to have available at least 4G of RAM, but once
+ you start instantiating VMs you will need more.
+ - The IP of the system can't change, and you need to know it beforehand,
+ that is, the system needs a static IP address.
+
+ This cluster is configurable, but with the following constraints:
+
+ - The hostname in RABBITMQ_HOST has to match CONTROLLER_HOST_ADDRESS,
+ and HOST_CONTROLLER.
+ - HOSTS_CONTROLLER is only needed if the hostname (see previous point)
+ is not a FQDN.
+ - The IP listed in MANAGEMENT_INTERFACE_IP_ADDRESS has to match the one
+ used in HOSTS_CONTROLLER.
+ - CINDER_DEVICE should be a path to a storage device ready to be
+ used/formated for cinder data.
+ - EXTERNAL_INTERFACE is required when the system has more than one network
+ interface.
+
+ You can also have a look at the following suggestions:
+
+ - NOVA_VIRT_TYPE can be either 'kvm' or 'qemu', depending on where the
+ system is being deployed to.
+ - We recommend changing all the PASSWORDs variables, also the
+ KEYSTONE_TEMPORARY_ADMIN_TOKEN, METADATA_PROXY_SHARED_SECRET and
+ METERING_SECRET.
+ - Setting NOVA_BAREMETAL_SCHEDULING with a YAML truth value will configure
+ Nova to schedule baremetal machines through the Ironic driver, instead of
+ sheduling virtual machines.
+
+systems:
+- morph: systems/installer-system-x86_64.morph
+ deploy:
+ controller-installer: &installer
+ type: extensions/rawdisk
+ location: installer-openstack-controller-x86_64.img
+ KERNEL_ARGS: init=/usr/lib/baserock-installer/installer
+ DISK_SIZE: 6G
+ HOSTNAME: installer-x86_64
+ INSTALLER_TARGET_STORAGE_DEVICE: /dev/sda
+ INSTALLER_ROOTFS_TO_INSTALL: /rootfs
+ INSTALLER_POST_INSTALL_COMMAND: sync; poweroff -f
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ controller-initramfs: &initramfs
+ type: extensions/initramfs
+ location: boot/initramfs.gz
+ - morph: unmaintained/systems/openstack-system-x86_64.morph
+ deploy:
+ controller-to-install: &stack-node
+ type: extensions/sysroot
+ location: rootfs
+ INSTALL_FILES: install-files/openstack/manifest
+ INITRAMFS_PATH: boot/initramfs.gz
+
+ HOSTNAME: twonode-controller
+
+ RABBITMQ_HOST: twonode-controller.os-mgmt
+ RABBITMQ_PORT: 5672
+ RABBITMQ_USER: rabbitmq
+ RABBITMQ_PASSWORD: veryinsecure
+
+ # This token needs to be unique and secret
+ KEYSTONE_ENABLE_SERVICE: true
+ KEYSTONE_TEMPORARY_ADMIN_TOKEN: 22f3aa1cf538e3f6d5e8
+ KEYSTONE_ADMIN_PASSWORD: veryinsecure
+ KEYSTONE_DB_USER: keystoneDB
+ KEYSTONE_DB_PASSWORD: veryinsecure
+
+ GLANCE_ENABLE_SERVICE: true
+ GLANCE_SERVICE_USER: glance
+ GLANCE_SERVICE_PASSWORD: veryinsecure
+ GLANCE_DB_USER: glanceDB
+ GLANCE_DB_PASSWORD: veryinsecure
+
+ NOVA_ENABLE_CONTROLLER: true
+ NOVA_ENABLE_COMPUTE: false
+ NOVA_SERVICE_USER: nova
+ NOVA_SERVICE_PASSWORD: veryinsecure
+ NOVA_DB_USER: novaDB
+ NOVA_DB_PASSWORD: veryinsecure
+ NOVA_VIRT_TYPE: kvm
+ NOVA_BAREMETAL_SCHEDULING: false
+
+ CINDER_ENABLE_CONTROLLER: true
+ CINDER_ENABLE_COMPUTE: false
+ CINDER_ENABLE_STORAGE: false
+ CINDER_SERVICE_USER: cinder
+ CINDER_SERVICE_PASSWORD: veryinsecure
+ CINDER_DB_USER: cinderDB
+ CINDER_DB_PASSWORD: veryinsecure
+ # Storage device to be used by Cinder
+ CINDER_DEVICE: /dev/sdb
+
+ NEUTRON_ENABLE_AGENT: false
+ NEUTRON_ENABLE_MANAGER: true
+ NEUTRON_ENABLE_CONTROLLER: true
+ NEUTRON_SERVICE_USER: neutron
+ NEUTRON_SERVICE_PASSWORD: veryinsecure
+ NEUTRON_DB_USER: neutronDB
+ NEUTRON_DB_PASSWORD: veryinsecure
+ METADATA_PROXY_SHARED_SECRET: novaneutronmetasecret
+
+ IRONIC_ENABLE_SERVICE: true
+ IRONIC_SERVICE_USER: ironic
+ IRONIC_SERVICE_PASSWORD: veryinsecure
+ IRONIC_DB_USER: ironicDB
+ IRONIC_DB_PASSWORD: veryinsecure
+
+ CEILOMETER_SERVICE_USER: ceilometer
+ CEILOMETER_SERVICE_PASSWORD: veryinsecure
+ CEILOMETER_DB_USER: ceilometerDB
+ CEILOMETER_DB_PASSWORD: veryinsecure
+ CEILOMETER_ENABLE_CONTROLLER: true
+ CEILOMETER_ENABLE_COMPUTE: false
+ METERING_SECRET: insecureceilometersecret
+
+ CONTROLLER_HOST_ADDRESS: twonode-controller.os-mgmt
+ MANAGEMENT_INTERFACE_IP_ADDRESS: 10.0.0.1
+
+ HOSTS_CONTROL: 10.0.0.1 twonode-controller.os-mgmt
+ HOSTS_COMPUTE: 10.0.0.3 twonode-compute.os-mgmt
+ EXTERNAL_INTERFACE: enp3s0
+ NETWORK_CONFIG: enp3s0:dhcp;enp2s0:static,address=10.0.0.1,netmask=255.255.255.0
+ SYNC_TIME_WITH_CONTROLLER: false
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ controller-to-install-initramfs: *initramfs
+- morph: systems/installer-system-x86_64.morph
+ deploy:
+ compute-installer:
+ <<: *installer
+ location: installer-openstack-compute-x86_64.img
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ compute-initramfs: *initramfs
+ - morph: unmaintained/systems/openstack-system-x86_64.morph
+ deploy:
+ compute-to-install:
+ <<: *stack-node
+ HOSTNAME: twonode-compute
+
+ KEYSTONE_ENABLE_SERVICE: false
+
+ GLANCE_ENABLE_SERVICE: false
+
+ NOVA_ENABLE_COMPUTE: true
+ NOVA_ENABLE_CONTROLLER: false
+
+ CINDER_ENABLE_CONTROLLER: false
+ CINDER_ENABLE_COMPUTE: true
+ CINDER_ENABLE_STORAGE: true
+
+ NEUTRON_ENABLE_AGENT: true
+ NEUTRON_ENABLE_MANAGER: false
+ NEUTRON_ENABLE_CONTROLLER: false
+
+ IRONIC_ENABLE_SERVICE: false
+
+ CEILOMETER_ENABLE_CONTROLLER: false
+ CEILOMETER_ENABLE_COMPUTE: true
+
+ MANAGEMENT_INTERFACE_IP_ADDRESS: 10.0.0.3
+ EXTERNAL_INTERFACE: eno1
+ NETWORK_CONFIG: eno1:dhcp;enp0s29u1u3:static,address=10.0.0.3,netmask=255.255.255.0
+ SYNC_TIME_WITH_CONTROLLER: true
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ compute-to-install-initramfs: *initramfs
diff --git a/unmaintained/clusters/xfce-system-x86_64-deploy.morph b/unmaintained/clusters/xfce-system-x86_64-deploy.morph
new file mode 100644
index 00000000..465ba1d0
--- /dev/null
+++ b/unmaintained/clusters/xfce-system-x86_64-deploy.morph
@@ -0,0 +1,23 @@
+name: xfce-system-x86_64-deploy
+kind: cluster
+description: |
+ Deploy a stock XFCE system.
+
+ The resulting image can be copied to a USB and booted from there,
+ as well as in a virtual machine.
+
+systems:
+- morph: unmaintained/systems/xfce-system-x86_64.morph
+ deploy:
+ xfce-system-x86_64:
+ type: extensions/rawdisk
+ location: /xfce-system-x86_64.img
+ DISK_SIZE: 6G
+ KERNEL_ARGS: vga=788
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ initramfs:
+ type: extensions/initramfs
+ location: boot/initramfs.gz
diff --git a/unmaintained/clusters/zookeeper.morph b/unmaintained/clusters/zookeeper.morph
new file mode 100644
index 00000000..ba859bc1
--- /dev/null
+++ b/unmaintained/clusters/zookeeper.morph
@@ -0,0 +1,21 @@
+name: zookeeper
+kind: cluster
+systems:
+- morph: unmaintained/systems/zookeeper-client-x86_64.morph
+ deploy:
+ my-client-system:
+ type: extensions/kvm
+ location: kvm+ssh://username@HOSTNAME/machinename/path/to/zookeeper-client.img
+ DISK_SIZE: 4G
+ RAM_SIZE: 1G
+ VCPUS: 1
+ HOSTNAME: zkclient
+- morph: unmaintained/systems/zookeeper-server-x86_64.morph
+ deploy:
+ my-server-system:
+ type: extensions/kvm
+ location: kvm+ssh://username@HOSTNAME/machinename/path/to/zookeeper-server.img
+ DISK_SIZE: 4G
+ RAM_SIZE: 1G
+ VCPUS: 1
+ HOSTNAME: zkserver
diff --git a/unmaintained/strata/apache-httpd-server.morph b/unmaintained/strata/apache-httpd-server.morph
new file mode 100644
index 00000000..e434ca6f
--- /dev/null
+++ b/unmaintained/strata/apache-httpd-server.morph
@@ -0,0 +1,41 @@
+name: apache-httpd-server
+kind: stratum
+description: apache http web server and some utilities related to it
+build-depends:
+- morph: strata/tools.morph
+- morph: strata/pcre-utils.morph
+- morph: strata/python2-core.morph
+chunks:
+- name: apr
+ morph: unmaintained/strata/apache-httpd-server/apr.morph
+ repo: upstream:apache/apr
+ ref: 3c818c6d7351f0130282d212a69035642f5fecad
+ unpetrify-ref: trunk
+- name: httpd-server
+ morph: unmaintained/strata/apache-httpd-server/httpd-server.morph
+ repo: upstream:apache/httpd
+ ref: 6d8e0b2fd95268fcba96326ba9dce7bb8f712c19
+ unpetrify-ref: 2.4.10
+ build-depends:
+ - apr
+- name: psutil
+ repo: upstream:python-packages/psutil
+ ref: 2bc8555f0428af81c2d067aa76168ed7bc5e0179
+ unpetrify-ref: release-2.2.0
+ build-system: python-distutils
+- name: mod_wsgi-metrics
+ repo: upstream:python-packages/mod_wsgi-metrics
+ ref: ec715eb593255229f9f45f3f323edbb845c691d8
+ unpetrify-ref: 1.1.1
+ build-system: python-distutils
+ build-depends:
+ - psutil
+- name: mod_wsgi
+ morph: unmaintained/strata/apache-httpd-server/mod_wsgi.morph
+ repo: upstream:python-packages/mod_wsgi
+ ref: 1be8b37aaf07d8cb3083da99d6fda12375221b07
+ unpetrify-ref: 4.4.5
+ build-depends:
+ - apr
+ - httpd-server
+ - mod_wsgi-metrics
diff --git a/unmaintained/strata/apache-httpd-server/apr.morph b/unmaintained/strata/apache-httpd-server/apr.morph
new file mode 100644
index 00000000..aaba1954
--- /dev/null
+++ b/unmaintained/strata/apache-httpd-server/apr.morph
@@ -0,0 +1,22 @@
+name: apr
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./buildconf
+- |
+ ./configure --prefix="$PREFIX" \
+ --disable-static \
+ --enable-threads \
+ --with-installbuilddir="$PREFIX"/share/apr-1/build
+post-install-commands:
+# Install files required for apr-util and httpd
+- |
+ for file in find_apr.m4 apr_common.m4 install.sh gen-build.py get-version.sh \
+ config.guess config.sub; do
+ cp build/"$file" "$DESTDIR$PREFIX"/share/apr-1/build/"$file";
+ done
+# Create a symlink in the build directory to the include directory (this is needed for httpd)
+- ln -sf /usr/include/apr-2 "$DESTDIR$PREFIX"/share/apr-1/build/
+# Copy apr headers needed for mod_wsgi
+- cp include/private/apr_support.h "$DESTDIR$PREFIX"/include/apr-2
+- cp include/arch/unix/apr_private.h "$DESTDIR$PREFIX"/include/apr-2
diff --git a/unmaintained/strata/apache-httpd-server/httpd-server.morph b/unmaintained/strata/apache-httpd-server/httpd-server.morph
new file mode 100644
index 00000000..41f0c36b
--- /dev/null
+++ b/unmaintained/strata/apache-httpd-server/httpd-server.morph
@@ -0,0 +1,67 @@
+name: httpd-server
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./buildconf --with-apr=/usr/share/apr-1
+# We override --libexecdir with the same value as --enable-layout=RPM
+# ought to provide, because otherwise there is a bug where when mod_wsgi
+# calls apxs, it fails as follows because the variable is empty.
+#
+#/usr/share/apr-1/build/libtool --silent --mode=link gcc -std=gnu99
+# -o src/server/mod_wsgi.la -rpath # -module -avoid-version
+# src/server/wsgi_validate.lo src/server/wsgi_stream.lo
+# src/server/wsgi_server.lo src/server/wsgi_restrict.lo
+# src/server/wsgi_metrics.lo src/server/wsgi_logger.lo
+# src/server/wsgi_interp.lo src/server/wsgi_daemon.lo
+# src/server/wsgi_convert.lo src/server/wsgi_buckets.lo
+# src/server/wsgi_apache.lo src/server/mod_wsgi.lo
+# -L/usr/lib -L/usr/lib/python2.7/config -lpython2.7 -lpthread -ldl -lutil -lm
+# libtool: error: only absolute run-paths are allowed
+# apxs:Error: Command failed with rc=65536
+#
+- |
+ ./configure --prefix="$PREFIX" \
+ --libexecdir="$PREFIX"/lib/httpd/modules \
+ --enable-layout=RPM \
+ --enable-mpms-shared=all \
+ --with-apr="$PREFIX"/bin/apr-2-config \
+ --enable-suexec --with-suexec \
+ --with-suexec-caller=apache \
+ --with-suexec-docroot=/var/www \
+ --with-suexec-logfile=/var/log/httpd/suexec.log \
+ --with-suexec-bin="$PREFIX"/sbin/suexec \
+ --with-suexec-uidmin=500 --with-suexec-gidmin=100\
+ --with-suexec-userdir=public_html \
+ --enable-pie \
+ --with-pcre \
+ --enable-mods-shared=all \
+ --enable-ssl --with-ssl \
+ --enable-case-filter --enable-case-filter-in \
+ --enable-cgid --enable-cgi\
+ --enable-so
+post-install-commands:
+# Add perl interpreter path to apxs script, required for loading mod_wsgi.
+- |
+ sed -i 's|#!/replace/with/path/to/perl/interpreter -w|#!/usr/bin/perl -w|g' \
+ "$DESTDIR$PREFIX"/bin/apxs
+# Add conf.d directory where apache will look for other configurations to load.
+- mkdir -p "$DESTDIR"/etc/httpd/conf.d
+- echo 'Include /etc/httpd/conf.d/*.conf' >> "$DESTDIR"/etc/httpd/conf/httpd.conf
+####################################################################################
+# This chunk should add an apache user and an apache group, create the apache home
+# directory and move suexec to /usr/lib/httpd/suexec as system-integration time.
+# This is not possible because linux-user-chroot drops all capabilities for security so
+# it does not allow to change the owners of directories or files.
+# So for now you should create a script which includes the following commands:
+# - mkdir -p /var/www
+# - groupadd -r apache
+# - |
+# useradd -c "Apache Server" -d /var/www -g apache \
+# -s /bin/false apache
+#
+# - mkdir -p /usr/lib/httpd
+# - mv -v /usr/bin/suexec /usr/lib/httpd/suexec
+# - chgrp apache /usr/lib/httpd/suexec
+# - chmod 4754 /usr/lib/httpd/suexec
+# - chown -R apache:apache /var/www
+####################################################################################
diff --git a/unmaintained/strata/apache-httpd-server/mod_wsgi.morph b/unmaintained/strata/apache-httpd-server/mod_wsgi.morph
new file mode 100644
index 00000000..86004ad3
--- /dev/null
+++ b/unmaintained/strata/apache-httpd-server/mod_wsgi.morph
@@ -0,0 +1,18 @@
+name: mod_wsgi
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ ./configure --prefix="$PREFIX" \
+ --with-apxs=/usr/bin/apxs
+post-install-commands:
+- |
+ install -D -m 644 /proc/self/fd/0 <<'EOF' "$DESTDIR"/etc/httpd/conf.d/wsgi.conf
+ # NOTE: mod_wsgi can not coexist in the same apache process as
+ # mod_wsgi_python3. Only load if mod_wsgi_python3 is not
+ # already loaded.
+
+ <IfModule !wsgi_module>
+ LoadModule wsgi_module /usr/lib/httpd/modules/mod_wsgi.so
+ </IfModule>
+ EOF
diff --git a/unmaintained/strata/ceph-service.morph b/unmaintained/strata/ceph-service.morph
new file mode 100644
index 00000000..4daf2b38
--- /dev/null
+++ b/unmaintained/strata/ceph-service.morph
@@ -0,0 +1,73 @@
+name: ceph-service
+kind: stratum
+build-depends:
+- morph: strata/cpp-common-libs.morph
+- morph: strata/foundation.morph
+- morph: strata/network-security.morph
+chunks:
+- name: libaio
+ morph: unmaintained/strata/ceph-service/libaio.morph
+ repo: upstream:libaio
+ ref: 08f50baec0e7731116d3f665c6155d7829edf5d7
+ unpetrify-ref: libaio-0.3.110-1
+- name: keyutils
+ morph: unmaintained/strata/ceph-service/keyutils.morph
+ repo: upstream:keyutils
+ ref: 9209a0c8fd63afc59f644e078b40cec531409c30
+ unpetrify-ref: v1.5.9
+- name: libunwind
+ repo: upstream:libunwind
+ ref: d7322f0f64dab715c4feb5f08edef5660d8719c0
+ unpetrify-ref: v1.1
+ build-system: autotools
+- name: gperftools
+ repo: upstream:gperftools
+ ref: 846b775dfadb77901202ae7ddbac30ad1de7df01
+ unpetrify-ref: gperftools-2.2
+ build-system: autotools
+ build-depends:
+ - libunwind
+- name: snappy
+ repo: upstream:snappy-git
+ ref: 1ff9be9b8fafc8528ca9e055646f5932aa5db9c4
+ unpetrify-ref: master
+ build-system: autotools
+- name: leveldb
+ morph: unmaintained/strata/ceph-service/leveldb.morph
+ repo: upstream:leveldb
+ ref: e353fbc7ea81f12a5694991b708f8f45343594b1
+ unpetrify-ref: v1.17
+ build-depends:
+ - snappy
+ - gperftools
+- name: libeditline
+ repo: upstream:libeditline-tarball
+ ref: 7503ff5f8610734521f40e276b59b3b6291830e7
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: ceph
+ morph: unmaintained/strata/ceph-service/ceph.morph
+ repo: upstream:ceph
+ ref: f4f12a634b0a92938d54d77910134dbbcdf864e6
+ unpetrify-ref: v0.94.1.1
+ build-depends:
+ - libaio
+ - gperftools
+ - leveldb
+ - libeditline
+ - keyutils
+ submodules:
+ src/erasure-code/jerasure/gf-complete:
+ url: https://github.com/ceph/gf-complete.git
+ src/civetweb:
+ url: https://github.com/ceph/civetweb
+ ceph-erasure-code-corpus:
+ url: https://github.com/ceph/ceph-erasure-code-corpus.git
+ src/rocksdb:
+ url: https://github.com/ceph/rocksdb
+ src/erasure-code/jerasure/jerasure:
+ url: https://github.com/ceph/jerasure.git
+ src/libs3:
+ url: https://github.com/ceph/libs3.git
+ ceph-object-corpus:
+ url: https://github.com/ceph/ceph-object-corpus.git
diff --git a/unmaintained/strata/ceph-service/ceph.morph b/unmaintained/strata/ceph-service/ceph.morph
new file mode 100644
index 00000000..56d30ead
--- /dev/null
+++ b/unmaintained/strata/ceph-service/ceph.morph
@@ -0,0 +1,26 @@
+name: ceph
+kind: chunk
+build-system: autotools
+configure-commands:
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --with-nss --prefix="$PREFIX" --sysconfdir=/etc --without-fuse --without-libatomic-ops
+ --without-libxfs
+build-commands:
+- make
+install-commands:
+- make install
+- install -D -m 755 src/init-ceph.in "$DESTDIR"/etc/init.d/ceph-SysV
+- install -D -m 755 systemd/ceph "$DESTDIR"/etc/systemd/system/ceph
+- install -D -m 644 systemd/ceph-mon@.service "$DESTDIR"/etc/systemd/system/ceph-mon@.service
+- install -D -m 644 systemd/ceph-osd@.service "$DESTDIR"/etc/systemd/system/ceph-osd@.service
+- install -D -m 644 systemd/ceph-mds@.service "$DESTDIR"/etc/systemd/system/ceph-mds@.service
+- install -D -m 644 systemd/ceph.target "$DESTDIR"/etc/systemd/system/ceph.target
+- install -d "$DESTDIR"/etc/ceph
+- install -D -d "$DESTDIR"/var/lib/ceph
+- install -d "$DESTDIR"/var/lib/ceph/mon
+- install -d "$DESTDIR"/var/lib/ceph/osd
+- install -d "$DESTDIR"/var/lib/ceph/mds
+- install -d "$DESTDIR"/var/lib/ceph/tmp
+- install -d "$DESTDIR"/var/lib/ceph/bootstrap-mds
+- install -d "$DESTDIR"/var/lib/ceph/bootstrap-osd
+- install -D -d "$DESTDIR"/var/log/ceph
diff --git a/unmaintained/strata/ceph-service/keyutils.morph b/unmaintained/strata/ceph-service/keyutils.morph
new file mode 100644
index 00000000..4d47e265
--- /dev/null
+++ b/unmaintained/strata/ceph-service/keyutils.morph
@@ -0,0 +1,7 @@
+name: keyutils
+kind: chunk
+build-commands:
+- make clean
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" LIBDIR="$PREFIX/lib" USRLIBDIR="$PREFIX/lib" install
diff --git a/unmaintained/strata/ceph-service/leveldb.morph b/unmaintained/strata/ceph-service/leveldb.morph
new file mode 100644
index 00000000..2b97c6e6
--- /dev/null
+++ b/unmaintained/strata/ceph-service/leveldb.morph
@@ -0,0 +1,9 @@
+name: leveldb
+kind: chunk
+build-commands:
+- make
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX"/lib
+- mkdir -p "$DESTDIR$PREFIX"/include
+- cp --preserve=links libleveldb.* "$DESTDIR$PREFIX"/lib
+- cp -r include/leveldb "$DESTDIR$PREFIX"/include
diff --git a/unmaintained/strata/ceph-service/libaio.morph b/unmaintained/strata/ceph-service/libaio.morph
new file mode 100644
index 00000000..62c24d37
--- /dev/null
+++ b/unmaintained/strata/ceph-service/libaio.morph
@@ -0,0 +1,7 @@
+name: libaio
+kind: chunk
+build-commands:
+- make clean
+- make
+install-commands:
+- make prefix="$DESTDIR$PREFIX" install
diff --git a/unmaintained/strata/chef.morph b/unmaintained/strata/chef.morph
new file mode 100644
index 00000000..feceac6e
--- /dev/null
+++ b/unmaintained/strata/chef.morph
@@ -0,0 +1,193 @@
+name: chef
+kind: stratum
+description: Autogenerated by Baserock import tool
+build-depends:
+- morph: strata/ruby.morph
+- morph: strata/core.morph
+chunks:
+- name: yajl
+ morph: unmaintained/strata/chef/yajl.morph
+ repo: upstream:yajl
+ ref: a0ecdde0c042b9256170f2f8890dd9451a4240aa
+ unpetrify-ref: 2.1.0
+- name: libyajl2-1.0.1
+ morph: unmaintained/strata/chef/libyajl2-1.0.1.morph
+ repo: upstream:ruby-gems/libyajl2-gem
+ ref: 98aef032f536d13775bc7b3b69a25ebac9bdee0a
+ unpetrify-ref: 1.0.1
+ build-depends:
+ - yajl
+ submodules:
+ ext/libyajl2/vendor/yajl:
+ url: https://github.com/lloyd/yajl.git
+- name: chef-12.0.0.alpha.0
+ morph: unmaintained/strata/chef/chef-12.0.0.alpha.0.morph
+ repo: upstream:ruby-gems/chef
+ ref: 9841bc9c6271c6d9add3aff0c2e11239cfb129ca
+ unpetrify-ref: 12.0.3
+- name: chef-zero-2.2
+ morph: unmaintained/strata/chef/chef-zero-2.2.morph
+ repo: upstream:ruby-gems/chef-zero
+ ref: 231c3abd052e606820297a97e4bc32bdab656a02
+ unpetrify-ref: v2.2
+- name: coderay-1.1.0.rc1
+ morph: unmaintained/strata/chef/coderay-1.1.0.morph
+ repo: upstream:ruby-gems/coderay
+ ref: a48037b85a12228431b32103786456f36beb355f
+ unpetrify-ref: v1.1.0
+- name: erubis-master
+ morph: unmaintained/strata/chef/erubis-master.morph
+ repo: upstream:ruby-gems/erubis
+ ref: 14d3eab57fbc361312c8f3af350cbf9a5bafce17
+ unpetrify-ref: master
+- name: ffi-1.9.3
+ morph: unmaintained/strata/chef/ffi-1.9.3.morph
+ repo: upstream:ruby-gems/ffi
+ ref: d982b7049336106c04f7721045dc5613b16d3545
+ unpetrify-ref: 1.9.3
+- name: ffi-yajl-1.0.2
+ morph: unmaintained/strata/chef/ffi-yajl-1.0.2.morph
+ repo: upstream:ruby-gems/ffi-yajl
+ ref: 3a4bc4259fd67af0ff4a8c1d3d71cfbaed9c112f
+ unpetrify-ref: master
+ build-depends:
+ - libyajl2-1.0.1
+ submodules:
+ ext/libyajl2/vendored:
+ url: https://github.com/lloyd/yajl
+- name: hashie-2.1.2
+ morph: unmaintained/strata/chef/hashie-2.1.2.morph
+ repo: upstream:ruby-gems/hashie
+ ref: 95b97fbff2cac643d56ec718cb708665500682e5
+ unpetrify-ref: v2.1.2
+- name: highline-1.6.21
+ morph: unmaintained/strata/chef/highline-1.6.21.morph
+ repo: upstream:ruby-gems/highline
+ ref: 51de22e436e6d45696759d673d7b9ceba16cae39
+ unpetrify-ref: master
+- name: hoe-master
+ morph: unmaintained/strata/chef/hoe-master.morph
+ repo: upstream:ruby-gems/hoe
+ ref: d94b26b4687be0a24d04b7cb582753fbec33d7e4
+ unpetrify-ref: master
+- name: diff-lcs-1.2.5
+ morph: unmaintained/strata/chef/diff-lcs-1.2.5.morph
+ repo: upstream:ruby-gems/diff-lcs
+ ref: d53e92242b9dd6745e56a0ff4ba15d2f62052b91
+ unpetrify-ref: v1.2.5
+ build-depends:
+ - hoe-master
+- name: ipaddress-0.8.0
+ morph: unmaintained/strata/chef/ipaddress-0.8.0.morph
+ repo: upstream:ruby-gems/ipaddress
+ ref: dae93ad0e4fb9a5d547a15dae0c3f2417078c845
+ unpetrify-ref: master
+- name: json-1.8.1
+ morph: unmaintained/strata/chef/json-1.8.1.morph
+ repo: upstream:ruby-gems/json
+ ref: 92a96dea2b24b9c68856004d69491f46aedd0925
+ unpetrify-ref: v1.8.1
+- name: method_source-0.8.1
+ morph: unmaintained/strata/chef/method_source-0.8.2.morph
+ repo: upstream:ruby-gems/method_source
+ ref: 1b1f8323a7c25f29331fe32511f50697e5405dbd
+ unpetrify-ref: v0.8.2
+- name: mime-types-1.25.1
+ morph: unmaintained/strata/chef/mime-types-1.25.1.morph
+ repo: upstream:ruby-gems/mime-types
+ ref: 6be836f59a041893cfc1c25668b3aa3552a7e334
+ unpetrify-ref: v1.25.1
+ build-depends:
+ - hoe-master
+- name: mixlib-authentication-1.3.0
+ morph: unmaintained/strata/chef/mixlib-authentication-1.3.0.morph
+ repo: upstream:ruby-gems/mixlib-authentication
+ ref: db24a56c6f5b99114998a50942220a7023060229
+ unpetrify-ref: 1.3.0
+- name: mixlib-cli-1.5.0
+ morph: unmaintained/strata/chef/mixlib-cli-1.5.0.morph
+ repo: upstream:ruby-gems/mixlib-cli
+ ref: b3b3c12141b5380ec61945770690fc1ae31d92b0
+ unpetrify-ref: 1.5.0
+- name: mixlib-config-2.1.0
+ morph: unmaintained/strata/chef/mixlib-config-2.1.0.morph
+ repo: upstream:ruby-gems/mixlib-config
+ ref: c5e2dee2beb5fdd17442ff92e520f2ef01d17ee5
+ unpetrify-ref: v2.1.0
+- name: mixlib-log-1.6.0
+ morph: unmaintained/strata/chef/mixlib-log-1.6.0.morph
+ repo: upstream:ruby-gems/mixlib-log
+ ref: 50ec55964ce19d3a8a14050be9a23c4b8990e2f0
+ unpetrify-ref: master
+- name: mixlib-shellout-1.4.0
+ morph: unmaintained/strata/chef/mixlib-shellout-1.4.0.morph
+ repo: upstream:ruby-gems/mixlib-shellout
+ ref: a04ce6db22edf0575c50e18ae2db09adced7dedc
+ unpetrify-ref: 1.4.0
+- name: net-dhcp-1.2.1
+ morph: unmaintained/strata/chef/net-dhcp-1.2.1.morph
+ repo: upstream:net-dhcp-ruby
+ ref: b644922a08aa09e2ce75f8f9f9fa1f0b8cecb2e9
+ unpetrify-ref: v1.2.1
+- name: net-ssh-2.9.1
+ morph: unmaintained/strata/chef/net-ssh-2.9.1.morph
+ repo: upstream:ruby-gems/net-ssh
+ ref: 9f8607984d8e904f211cc5edb39ab2a2ca94008e
+ unpetrify-ref: v2.9.1
+- name: net-ssh-gateway-1.2.0
+ morph: unmaintained/strata/chef/net-ssh-gateway-1.2.0.morph
+ repo: upstream:ruby-gems/net-ssh-gateway
+ ref: 1de7611a7f7cedbe7a4c6cf3798c88d00637582d
+ unpetrify-ref: v1.2.0
+- name: net-ssh-multi-1.2.0
+ morph: unmaintained/strata/chef/net-ssh-multi-1.2.0.morph
+ repo: upstream:ruby-gems/net-ssh-multi
+ ref: b659f2884b2c9abdbe3bbf3c844937a0799ed5ac
+ unpetrify-ref: v1.2.0
+- name: ohai-7.4.0.dev
+ morph: unmaintained/strata/chef/ohai-7.4.0.dev.morph
+ repo: upstream:ruby-gems/ohai
+ ref: 0bf2ed32744445a253082910ee4e07b2b38023a7
+ unpetrify-ref: master
+- name: plist-master
+ morph: unmaintained/strata/chef/plist-master.morph
+ repo: upstream:ruby-gems/plist
+ ref: 12eb82d283cab148183c37c07e3f75a309969dec
+ unpetrify-ref: master
+- name: pry-0.10.1
+ morph: unmaintained/strata/chef/pry-0.10.1.morph
+ repo: upstream:ruby-gems/pry
+ ref: 6d5eb0831b50ec729d2dc3356255b49535535e37
+ unpetrify-ref: master
+- name: rack-1.5.2
+ morph: unmaintained/strata/chef/rack-1.5.2.morph
+ repo: upstream:ruby-gems/rack
+ ref: ac590d055c936bb9a618e955a690dc836c625211
+ unpetrify-ref: 1.5.2
+- name: slop-3.6.0
+ morph: unmaintained/strata/chef/slop-3.6.0.morph
+ repo: upstream:ruby-gems/slop
+ ref: c3f84e7e794004f9ae6958c13ef3dd3038c2c0eb
+ unpetrify-ref: v3.6.0
+- name: systemu-2.6.4
+ morph: unmaintained/strata/chef/systemu-2.6.4.morph
+ repo: upstream:ruby-gems/systemu
+ ref: 35340f1e91941af47988b1b9d77705493b96d3db
+ unpetrify-ref: master
+- name: wmi-lite-1.0.0
+ morph: unmaintained/strata/chef/wmi-lite-1.0.0.morph
+ repo: upstream:ruby-gems/wmi-lite
+ ref: 9377836dc0a5487474038ec727f02f9b33facfa6
+ unpetrify-ref: 1.0.0
+- name: libpopt
+ morph: unmaintained/strata/chef/libpopt.morph
+ repo: upstream:libpopt
+ ref: c224abf28f4ff9bbf292908324359cb5905addf8
+ unpetrify-ref: master
+- name: sgdisk
+ morph: unmaintained/strata/chef/sgdisk.morph
+ repo: upstream:sgdisk
+ ref: a920398fa393f9d6301b32b191bc01e086ab8bc8
+ unpetrify-ref: master
+ build-depends:
+ - libpopt
diff --git a/unmaintained/strata/chef/chef-12.0.0.alpha.0.morph b/unmaintained/strata/chef/chef-12.0.0.alpha.0.morph
new file mode 100644
index 00000000..61c12ca0
--- /dev/null
+++ b/unmaintained/strata/chef/chef-12.0.0.alpha.0.morph
@@ -0,0 +1,20 @@
+name: chef-12.0.0.alpha.0
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: chef-12.0.0.alpha.0-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build chef.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./chef-12.0.0.alpha.0.gem
+- mkdir -p "$DESTDIR"/etc
+- |
+ cat << EOF > "$DESTDIR/etc/lsb-release"
+ DISTRIB_ID=Baserock
+ DISTRIB_CODENAME=baserock
+ DISTRIB_DESCRIPTION="Baserock"
+ EOF
diff --git a/unmaintained/strata/chef/chef-zero-2.2.morph b/unmaintained/strata/chef/chef-zero-2.2.morph
new file mode 100644
index 00000000..11407ae3
--- /dev/null
+++ b/unmaintained/strata/chef/chef-zero-2.2.morph
@@ -0,0 +1,13 @@
+name: chef-zero-2.2
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: chef-zero-2.2-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build chef-zero.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./chef-zero-2.2.gem
diff --git a/unmaintained/strata/chef/coderay-1.1.0.morph b/unmaintained/strata/chef/coderay-1.1.0.morph
new file mode 100644
index 00000000..a380b911
--- /dev/null
+++ b/unmaintained/strata/chef/coderay-1.1.0.morph
@@ -0,0 +1,13 @@
+name: coderay-1.1.0.rc1
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: coderay-1.1.0.rc1-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build coderay.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./coderay-1.1.0.rc1.gem
diff --git a/unmaintained/strata/chef/diff-lcs-1.2.5.morph b/unmaintained/strata/chef/diff-lcs-1.2.5.morph
new file mode 100644
index 00000000..3585467f
--- /dev/null
+++ b/unmaintained/strata/chef/diff-lcs-1.2.5.morph
@@ -0,0 +1,13 @@
+name: diff-lcs-1.2.5
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: diff-lcs-1.2.5-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build diff-lcs.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./diff-lcs-1.2.5.gem
diff --git a/unmaintained/strata/chef/erubis-master.morph b/unmaintained/strata/chef/erubis-master.morph
new file mode 100644
index 00000000..05d1a9f9
--- /dev/null
+++ b/unmaintained/strata/chef/erubis-master.morph
@@ -0,0 +1,19 @@
+name: erubis-master
+kind: chunk
+build-system: manual
+products:
+- artifact: erubis-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+configure-commands:
+# Manually do what it seems like the 'rook' build system would do, if it worked
+# Values taken from 'Rookbook.props'.
+- find -type f -exec sed -e 's/\$Release\$/2.7.0/g' -i \{} \;
+- find -type f -exec sed -e 's/\$Copyright\$/copyright(c) 2006-2011 kuwata-lab.com
+ all rights reserved./g' -i \{} \;
+build-commands:
+- gem build erubis.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./erubis-2.7.0.gem
diff --git a/unmaintained/strata/chef/ffi-1.9.3.morph b/unmaintained/strata/chef/ffi-1.9.3.morph
new file mode 100644
index 00000000..672f0bd7
--- /dev/null
+++ b/unmaintained/strata/chef/ffi-1.9.3.morph
@@ -0,0 +1,13 @@
+name: ffi-1.9.3
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: ffi-1.9.3-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build ffi.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./ffi-1.9.3.gem
diff --git a/unmaintained/strata/chef/ffi-yajl-1.0.2.morph b/unmaintained/strata/chef/ffi-yajl-1.0.2.morph
new file mode 100644
index 00000000..5d3c0792
--- /dev/null
+++ b/unmaintained/strata/chef/ffi-yajl-1.0.2.morph
@@ -0,0 +1,13 @@
+name: ffi-yajl-1.0.2
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: ffi-yajl-1.0.2-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build ffi-yajl.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./ffi-yajl-1.0.2.gem
diff --git a/unmaintained/strata/chef/hashie-2.1.2.morph b/unmaintained/strata/chef/hashie-2.1.2.morph
new file mode 100644
index 00000000..a4fb46f6
--- /dev/null
+++ b/unmaintained/strata/chef/hashie-2.1.2.morph
@@ -0,0 +1,13 @@
+name: hashie-2.1.2
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: hashie-2.1.2-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build hashie.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./hashie-2.1.2.gem
diff --git a/unmaintained/strata/chef/highline-1.6.21.morph b/unmaintained/strata/chef/highline-1.6.21.morph
new file mode 100644
index 00000000..5615f6b2
--- /dev/null
+++ b/unmaintained/strata/chef/highline-1.6.21.morph
@@ -0,0 +1,13 @@
+name: highline-1.6.21
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: highline-1.6.21-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build highline.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./highline-1.6.21.gem
diff --git a/unmaintained/strata/chef/hoe-master.morph b/unmaintained/strata/chef/hoe-master.morph
new file mode 100644
index 00000000..1a468789
--- /dev/null
+++ b/unmaintained/strata/chef/hoe-master.morph
@@ -0,0 +1,13 @@
+name: hoe-master
+kind: chunk
+build-system: manual
+products:
+- artifact: hoe-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- rake gem
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./pkg/hoe-3.12.0.gem
diff --git a/unmaintained/strata/chef/ipaddress-0.8.0.morph b/unmaintained/strata/chef/ipaddress-0.8.0.morph
new file mode 100644
index 00000000..fdaa5de6
--- /dev/null
+++ b/unmaintained/strata/chef/ipaddress-0.8.0.morph
@@ -0,0 +1,13 @@
+name: ipaddress-0.8.0
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: ipaddress-0.8.0-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build ipaddress.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./ipaddress-0.8.0.gem
diff --git a/unmaintained/strata/chef/json-1.8.1.morph b/unmaintained/strata/chef/json-1.8.1.morph
new file mode 100644
index 00000000..cf25abca
--- /dev/null
+++ b/unmaintained/strata/chef/json-1.8.1.morph
@@ -0,0 +1,13 @@
+name: json-1.8.1
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: json-1.8.1-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build json.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./json-1.8.1.gem
diff --git a/unmaintained/strata/chef/libpopt.morph b/unmaintained/strata/chef/libpopt.morph
new file mode 100644
index 00000000..6adde30c
--- /dev/null
+++ b/unmaintained/strata/chef/libpopt.morph
@@ -0,0 +1,6 @@
+name: libpopt
+kind: chunk
+build-system: autotools
+configure-commands:
+- autoreconf -if
+- ./configure
diff --git a/unmaintained/strata/chef/libyajl2-1.0.1.morph b/unmaintained/strata/chef/libyajl2-1.0.1.morph
new file mode 100644
index 00000000..7a21831d
--- /dev/null
+++ b/unmaintained/strata/chef/libyajl2-1.0.1.morph
@@ -0,0 +1,13 @@
+name: libyajl2-1.0.1
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: libyajl2-1.0.1-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- USE_SYSTEM_LIBYAJL2=yes gem build libyajl2.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- USE_SYSTEM_LIBYAJL2=yes gem install --install-dir "$DESTDIR/$(gem environment home)"
+ --bindir "$DESTDIR/$PREFIX/bin" --ignore-dependencies --local ./libyajl2-1.0.1.gem
diff --git a/unmaintained/strata/chef/method_source-0.8.2.morph b/unmaintained/strata/chef/method_source-0.8.2.morph
new file mode 100644
index 00000000..5ba20da6
--- /dev/null
+++ b/unmaintained/strata/chef/method_source-0.8.2.morph
@@ -0,0 +1,13 @@
+name: method_source-0.8.1
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: method_source-0.8.1-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build method_source.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./method_source-0.8.1.gem
diff --git a/unmaintained/strata/chef/mime-types-1.25.1.morph b/unmaintained/strata/chef/mime-types-1.25.1.morph
new file mode 100644
index 00000000..453c42d5
--- /dev/null
+++ b/unmaintained/strata/chef/mime-types-1.25.1.morph
@@ -0,0 +1,13 @@
+name: mime-types-1.25.1
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: mime-types-1.25.1-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build mime-types.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./mime-types-1.25.1.gem
diff --git a/unmaintained/strata/chef/mixlib-authentication-1.3.0.morph b/unmaintained/strata/chef/mixlib-authentication-1.3.0.morph
new file mode 100644
index 00000000..8792ff2c
--- /dev/null
+++ b/unmaintained/strata/chef/mixlib-authentication-1.3.0.morph
@@ -0,0 +1,13 @@
+name: mixlib-authentication-1.3.0
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: mixlib-authentication-1.3.0-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build mixlib-authentication.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./mixlib-authentication-1.3.0.gem
diff --git a/unmaintained/strata/chef/mixlib-cli-1.5.0.morph b/unmaintained/strata/chef/mixlib-cli-1.5.0.morph
new file mode 100644
index 00000000..84f3a4b7
--- /dev/null
+++ b/unmaintained/strata/chef/mixlib-cli-1.5.0.morph
@@ -0,0 +1,13 @@
+name: mixlib-cli-1.5.0
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: mixlib-cli-1.5.0-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build mixlib-cli.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./mixlib-cli-1.5.0.gem
diff --git a/unmaintained/strata/chef/mixlib-config-2.1.0.morph b/unmaintained/strata/chef/mixlib-config-2.1.0.morph
new file mode 100644
index 00000000..cc6077a5
--- /dev/null
+++ b/unmaintained/strata/chef/mixlib-config-2.1.0.morph
@@ -0,0 +1,13 @@
+name: mixlib-config-2.1.0
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: mixlib-config-2.1.0-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build mixlib-config.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./mixlib-config-2.1.0.gem
diff --git a/unmaintained/strata/chef/mixlib-log-1.6.0.morph b/unmaintained/strata/chef/mixlib-log-1.6.0.morph
new file mode 100644
index 00000000..ddd956c1
--- /dev/null
+++ b/unmaintained/strata/chef/mixlib-log-1.6.0.morph
@@ -0,0 +1,13 @@
+name: mixlib-log-1.6.0
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: mixlib-log-1.6.0-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build mixlib-log.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./mixlib-log-1.6.0.gem
diff --git a/unmaintained/strata/chef/mixlib-shellout-1.4.0.morph b/unmaintained/strata/chef/mixlib-shellout-1.4.0.morph
new file mode 100644
index 00000000..7087c1c6
--- /dev/null
+++ b/unmaintained/strata/chef/mixlib-shellout-1.4.0.morph
@@ -0,0 +1,13 @@
+name: mixlib-shellout-1.4.0
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: mixlib-shellout-1.4.0-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build mixlib-shellout.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./mixlib-shellout-1.4.0.gem
diff --git a/unmaintained/strata/chef/net-dhcp-1.2.1.morph b/unmaintained/strata/chef/net-dhcp-1.2.1.morph
new file mode 100644
index 00000000..88eb4963
--- /dev/null
+++ b/unmaintained/strata/chef/net-dhcp-1.2.1.morph
@@ -0,0 +1,13 @@
+name: net-dhcp-1.2.1
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: net-dhcp-1.2.1-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build net-dhcp.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./net-dhcp-1.2.1.gem
diff --git a/unmaintained/strata/chef/net-ssh-2.9.1.morph b/unmaintained/strata/chef/net-ssh-2.9.1.morph
new file mode 100644
index 00000000..c06495d5
--- /dev/null
+++ b/unmaintained/strata/chef/net-ssh-2.9.1.morph
@@ -0,0 +1,15 @@
+name: net-ssh-2.9.1
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: net-ssh-2.9.1-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+configure-commands:
+- sed -e '/cert_chain\s*=/d' -e '/signing_key\s*=/d' -i net-ssh.gemspec
+build-commands:
+- gem build net-ssh.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./net-ssh-2.9.1.gem
diff --git a/unmaintained/strata/chef/net-ssh-gateway-1.2.0.morph b/unmaintained/strata/chef/net-ssh-gateway-1.2.0.morph
new file mode 100644
index 00000000..c0425002
--- /dev/null
+++ b/unmaintained/strata/chef/net-ssh-gateway-1.2.0.morph
@@ -0,0 +1,15 @@
+name: net-ssh-gateway-1.2.0
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: net-ssh-gateway-1.2.0-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+configure-commands:
+- sed -e '/cert_chain\s*=/d' -e '/signing_key\s*=/d' -i net-ssh-gateway.gemspec
+build-commands:
+- gem build net-ssh-gateway.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./net-ssh-gateway-1.2.0.gem
diff --git a/unmaintained/strata/chef/net-ssh-multi-1.2.0.morph b/unmaintained/strata/chef/net-ssh-multi-1.2.0.morph
new file mode 100644
index 00000000..fc433a37
--- /dev/null
+++ b/unmaintained/strata/chef/net-ssh-multi-1.2.0.morph
@@ -0,0 +1,15 @@
+name: net-ssh-multi-1.2.0
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: net-ssh-multi-1.2.0-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+configure-commands:
+- sed -e '/cert_chain\s*=/d' -e '/signing_key\s*=/d' -i net-ssh-multi.gemspec
+build-commands:
+- gem build net-ssh-multi.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./net-ssh-multi-1.2.0.gem
diff --git a/unmaintained/strata/chef/ohai-7.4.0.dev.morph b/unmaintained/strata/chef/ohai-7.4.0.dev.morph
new file mode 100644
index 00000000..f47dda35
--- /dev/null
+++ b/unmaintained/strata/chef/ohai-7.4.0.dev.morph
@@ -0,0 +1,13 @@
+name: ohai-7.4.0.dev
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: ohai-7.4.0.dev-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build ohai.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./ohai-7.4.0.dev.gem
diff --git a/unmaintained/strata/chef/plist-master.morph b/unmaintained/strata/chef/plist-master.morph
new file mode 100644
index 00000000..7cf7cbb6
--- /dev/null
+++ b/unmaintained/strata/chef/plist-master.morph
@@ -0,0 +1,13 @@
+name: plist-master
+kind: chunk
+build-system: manual
+products:
+- artifact: plist-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- rake gem
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./pkg/plist-3.1.0.gem
diff --git a/unmaintained/strata/chef/pry-0.10.1.morph b/unmaintained/strata/chef/pry-0.10.1.morph
new file mode 100644
index 00000000..07ebca7a
--- /dev/null
+++ b/unmaintained/strata/chef/pry-0.10.1.morph
@@ -0,0 +1,13 @@
+name: pry-0.10.1
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: pry-0.10.1-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build pry.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./pry-0.10.1.gem
diff --git a/unmaintained/strata/chef/rack-1.5.2.morph b/unmaintained/strata/chef/rack-1.5.2.morph
new file mode 100644
index 00000000..50fd960c
--- /dev/null
+++ b/unmaintained/strata/chef/rack-1.5.2.morph
@@ -0,0 +1,13 @@
+name: rack-1.5.2
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: rack-1.5.2-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build rack.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./rack-1.5.2.gem
diff --git a/unmaintained/strata/chef/sgdisk.morph b/unmaintained/strata/chef/sgdisk.morph
new file mode 100644
index 00000000..e792f9d9
--- /dev/null
+++ b/unmaintained/strata/chef/sgdisk.morph
@@ -0,0 +1,7 @@
+name: sgdisk
+kind: chunk
+build-commands:
+- make
+install-commands:
+- install -D -m 0755 -o root -g root sgdisk "$DESTDIR$PREFIX/bin/sgdisk"
+
diff --git a/unmaintained/strata/chef/slop-3.6.0.morph b/unmaintained/strata/chef/slop-3.6.0.morph
new file mode 100644
index 00000000..32101078
--- /dev/null
+++ b/unmaintained/strata/chef/slop-3.6.0.morph
@@ -0,0 +1,13 @@
+name: slop-3.6.0
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: slop-3.6.0-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build slop.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./slop-3.6.0.gem
diff --git a/unmaintained/strata/chef/systemu-2.6.4.morph b/unmaintained/strata/chef/systemu-2.6.4.morph
new file mode 100644
index 00000000..3cc0a5e2
--- /dev/null
+++ b/unmaintained/strata/chef/systemu-2.6.4.morph
@@ -0,0 +1,13 @@
+name: systemu-2.6.4
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: systemu-2.6.4-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build systemu.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./systemu-2.6.4.gem
diff --git a/unmaintained/strata/chef/wmi-lite-1.0.0.morph b/unmaintained/strata/chef/wmi-lite-1.0.0.morph
new file mode 100644
index 00000000..bb4b4127
--- /dev/null
+++ b/unmaintained/strata/chef/wmi-lite-1.0.0.morph
@@ -0,0 +1,13 @@
+name: wmi-lite-1.0.0
+kind: chunk
+description: Automatically generated by rubygems.to_chunk
+products:
+- artifact: wmi-lite-1.0.0-doc
+ include:
+ - usr/lib/ruby/gems/\d[\w.]*/doc/.*
+build-commands:
+- gem build wmi-lite.gemspec
+install-commands:
+- mkdir -p "$DESTDIR/$(gem environment home)"
+- gem install --install-dir "$DESTDIR/$(gem environment home)" --bindir "$DESTDIR/$PREFIX/bin"
+ --ignore-dependencies --local ./wmi-lite-1.0.0.gem
diff --git a/unmaintained/strata/chef/yajl.morph b/unmaintained/strata/chef/yajl.morph
new file mode 100644
index 00000000..9dbc8dbf
--- /dev/null
+++ b/unmaintained/strata/chef/yajl.morph
@@ -0,0 +1,6 @@
+name: yajl
+kind: chunk
+description: YAJL JSON parsing library
+build-system: cmake
+max-jobs: 1
+
diff --git a/unmaintained/strata/cxmanage.morph b/unmaintained/strata/cxmanage.morph
new file mode 100644
index 00000000..e991794e
--- /dev/null
+++ b/unmaintained/strata/cxmanage.morph
@@ -0,0 +1,36 @@
+name: cxmanage
+kind: stratum
+description: All the tools for calxeda management
+build-depends:
+- morph: strata/tools.morph
+chunks:
+- name: ipmitool
+ repo: upstream:ipmitool
+ ref: 830d5a3787b265e5dde154d2f0e08b10ae9a7bcd
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: pexpect
+ morph: unmaintained/strata/cxmanage/pexpect.morph
+ repo: upstream:pexpect
+ ref: 7a8455f21bb45020f3594c59fc8c85cf738e147c
+ unpetrify-ref: baserock/morph
+- name: pyipmi
+ repo: upstream:pyipmi
+ ref: bb7dba84578c05ba87db3c4186a2989c89e4e519
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
+- name: tftpy
+ repo: upstream:tftpy
+ ref: f3d2fc4c62c1e64dd49adfaf8e65097eb8ea307b
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
+- name: cxmanage
+ repo: upstream:cxmanage
+ ref: 54116d3c486ed7aa49f284e4cad9e6e7c293bea6
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
+ build-depends:
+ - ipmitool
+ - pexpect
+ - pyipmi
+ - tftpy
diff --git a/unmaintained/strata/cxmanage/pexpect.morph b/unmaintained/strata/cxmanage/pexpect.morph
new file mode 100644
index 00000000..09254350
--- /dev/null
+++ b/unmaintained/strata/cxmanage/pexpect.morph
@@ -0,0 +1,10 @@
+name: pexpect
+kind: chunk
+description: |
+ Pexpect is a pure Python module that accomplishes behaviour similar to Expect
+configure-commands:
+- cd pexpect && make
+build-commands:
+- cd pexpect && python setup.py build
+install-commands:
+- cd pexpect && python setup.py install --prefix "$PREFIX" --root "$DESTDIR"
diff --git a/unmaintained/strata/databases.morph b/unmaintained/strata/databases.morph
new file mode 100644
index 00000000..2a47296c
--- /dev/null
+++ b/unmaintained/strata/databases.morph
@@ -0,0 +1,35 @@
+name: databases
+kind: stratum
+description: some popular databases and some utils related to databases
+build-depends:
+- morph: strata/tools.morph
+- morph: strata/nfs.morph
+- morph: strata/python2-core.morph
+chunks:
+- name: postgresql
+ repo: upstream:postgresql
+ ref: d4f8dde3c1c2c90c723ab550e7f449fc75599316
+ unpetrify-ref: REL9_3_4
+ build-system: autotools
+- name: redis
+ morph: unmaintained/strata/databases/redis.morph
+ repo: upstream:redis
+ ref: 9ee59fca9c5c429185d35779c2d5db64005091b0
+ unpetrify-ref: baserock/3.0
+- name: memcached
+ morph: unmaintained/strata/databases/memcached.morph
+ repo: upstream:memcached
+ ref: c5530027c8ea28674358327ab8212ebaf014c848
+ unpetrify-ref: 1.4.22
+- name: psycopg2
+ repo: upstream:python-packages/psycopg2
+ ref: 00cafbe85bb82d85cbfe0f062a73c562433b5bc8
+ unpetrify-ref: 2.5.4
+ build-system: python-distutils
+ build-depends:
+ - postgresql
+- name: python-memcached
+ repo: upstream:python-packages/python-memcached
+ ref: 156ee975ff6e5c69e1d6c58b09bedf03c182c5db
+ unpetrify-ref: master
+ build-system: python-distutils
diff --git a/unmaintained/strata/databases/memcached.morph b/unmaintained/strata/databases/memcached.morph
new file mode 100644
index 00000000..e81a8be1
--- /dev/null
+++ b/unmaintained/strata/databases/memcached.morph
@@ -0,0 +1,21 @@
+name: memcached
+kind: chunk
+build-system: autotools
+configure-commands:
+- perl version.pl
+- touch README
+- autoreconf -fvi
+- ./configure --prefix="$PREFIX"
+install-commands:
+- make install
+- install -D -m 644 scripts/memcached.service "$DESTDIR$PREFIX"/lib/systemd/system/memcached.service
+post-install-commands:
+- mkdir -p "$DESTDIR"/etc/sysconfig
+- |
+ cat <<EOF > "$DESTDIR"/etc/sysconfig/memcached
+ PORT="11211"
+ USER="nobody"
+ MAXCONN="1024"
+ CACHESIZE="64"
+ OPTIONS=""
+ EOF
diff --git a/unmaintained/strata/databases/redis.morph b/unmaintained/strata/databases/redis.morph
new file mode 100644
index 00000000..51f602dd
--- /dev/null
+++ b/unmaintained/strata/databases/redis.morph
@@ -0,0 +1,6 @@
+name: redis
+kind: chunk
+build-commands:
+- make
+install-commands:
+- make PREFIX="$DESTDIR/$PREFIX" install
diff --git a/unmaintained/strata/django.morph b/unmaintained/strata/django.morph
new file mode 100644
index 00000000..01f471f2
--- /dev/null
+++ b/unmaintained/strata/django.morph
@@ -0,0 +1,37 @@
+name: django
+kind: stratum
+description: Stratum with Django and its plugins and dependencies.
+build-depends:
+- morph: strata/foundation.morph
+- morph: strata/python2-core.morph
+chunks:
+- name: django
+ repo: upstream:python-packages/django
+ ref: 811508b0512d3fa6b2328f8647fbf9eace68eceb
+ unpetrify-ref: 1.6.8
+ build-system: python-distutils
+- name: django-appconf
+ repo: upstream:python-packages/django-appconf
+ ref: 0c9835f95b44db1b3eb1a9409f95a3ecd63b8ff5
+ unpetrify-ref: "0.6"
+ build-system: python-distutils
+- name: django-compressor
+ repo: upstream:python-packages/django-compressor
+ ref: e747dce3d7e04fe595bbfed54f9554c2725eb757
+ unpetrify-ref: "1.4"
+ build-system: python-distutils
+ build-depends:
+ - django-appconf
+- name: pyscss
+ repo: upstream:python-packages/pyscss
+ ref: 85e8806e39e840c4402ee813c3e38fefaf9212b4
+ unpetrify-ref: 1.2.1
+ build-system: python-distutils
+- name: django-pyscss
+ repo: upstream:python-packages/django-pyscss
+ ref: 665270b54eea5de5aca379a78673b411ed6b1f04
+ unpetrify-ref: v1.0.6
+ build-system: python-distutils
+ build-depends:
+ - django
+ - pyscss
diff --git a/unmaintained/strata/enlightenment.morph b/unmaintained/strata/enlightenment.morph
new file mode 100644
index 00000000..baba8622
--- /dev/null
+++ b/unmaintained/strata/enlightenment.morph
@@ -0,0 +1,80 @@
+name: enlightenment
+kind: stratum
+description: Enlightenment Desktop and Window Manager
+build-depends:
+- morph: strata/tools.morph
+- morph: strata/x-generic.morph
+- morph: unmaintained/strata/lua51.morph
+- morph: strata/bluetooth.morph
+- morph: strata/multimedia-gstreamer.morph
+- morph: strata/connman-common.morph
+chunks:
+- name: fribidi
+ repo: upstream:fribidi
+ ref: c9916f2ab289126a32febcc4754efc73a011fb0c
+ unpetrify-ref: baserock/morph/0.19.6
+ build-system: autotools
+- name: bullet3
+ morph: unmaintained/strata/enlightenment/bullet3.morph
+ repo: upstream:bullet3
+ ref: 940059ddb3c4476bb9860f79f35b0b1230857f54
+ unpetrify-ref: baserock/morph
+- name: efl
+ morph: unmaintained/strata/enlightenment/efl.morph
+ repo: upstream:enlightenment/efl
+ ref: 3013a7c5cbd728dd9bc5516ffb4bd4f505888bd4
+ unpetrify-ref: v1.12.0
+ build-depends:
+ - bullet3
+ - fribidi
+- name: elementary
+ morph: unmaintained/strata/enlightenment/elementary.morph
+ repo: upstream:enlightenment/elementary
+ ref: c4fbbbf984b7bd1553191c26459bce4589122ad5
+ unpetrify-ref: v1.12.0
+ build-depends:
+ - efl
+- name: evas_generic_loaders
+ morph: unmaintained/strata/enlightenment/evas_generic_loaders.morph
+ repo: upstream:enlightenment/evas_generic_loaders
+ ref: 5d4415ec1e64930452f7d17cbec4c28a0efa8402
+ unpetrify-ref: v1.12.0
+ build-depends:
+ - efl
+- name: enlightenment
+ morph: unmaintained/strata/enlightenment/enlightenment.morph
+ repo: upstream:enlightenment/enlightenment
+ ref: 55165e2576823780a1053b03c5230cc8df8957b5
+ unpetrify-ref: v0.19.1
+ build-depends:
+ - efl
+ - elementary
+- name: imlib2
+ morph: unmaintained/strata/enlightenment/imlib2.morph
+ repo: upstream:enlightenment/imlib2
+ ref: f2f20dc5791a175be398a17fcdc4852a79079d47
+ unpetrify-ref: baserock/1.4.6
+ build-depends:
+ - efl
+ - elementary
+ - enlightenment
+- name: libast
+ morph: unmaintained/strata/enlightenment/libast.morph
+ repo: upstream:enlightenment/libast
+ ref: 0dbc0a5df55474bf61ca166be40e8de2d9e3a031
+ build-depends:
+ - efl
+ - elementary
+ - enlightenment
+ - imlib2
+- name: eterm
+ morph: unmaintained/strata/enlightenment/eterm.morph
+ repo: upstream:enlightenment/eterm
+ ref: 097234f1f27709ff2444e303350764ea3b80b3ad
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - efl
+ - elementary
+ - enlightenment
+ - libast
+ - imlib2
diff --git a/unmaintained/strata/enlightenment/bullet3.morph b/unmaintained/strata/enlightenment/bullet3.morph
new file mode 100644
index 00000000..357e1f67
--- /dev/null
+++ b/unmaintained/strata/enlightenment/bullet3.morph
@@ -0,0 +1,8 @@
+name: bullet3
+kind: chunk
+configure-commands:
+- cmake -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_SHARED_LIBS=ON
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/unmaintained/strata/enlightenment/efl.morph b/unmaintained/strata/enlightenment/efl.morph
new file mode 100644
index 00000000..b2a013ae
--- /dev/null
+++ b/unmaintained/strata/enlightenment/efl.morph
@@ -0,0 +1,9 @@
+name: efl
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix=/usr --with-tests=none --disable-image-loader-gif --enable-systemd
+ --disable-image-loader-tiff
+build-commands:
+- make VPATH=/usr/lib64
+install-commands:
+- make DESTDIR="$DESTDIR" VPATH=/usr/lib64 install
diff --git a/unmaintained/strata/enlightenment/elementary.morph b/unmaintained/strata/enlightenment/elementary.morph
new file mode 100644
index 00000000..3c0bda0d
--- /dev/null
+++ b/unmaintained/strata/enlightenment/elementary.morph
@@ -0,0 +1,8 @@
+name: elementary
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix=/usr
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/unmaintained/strata/enlightenment/enlightenment.morph b/unmaintained/strata/enlightenment/enlightenment.morph
new file mode 100644
index 00000000..90f0c646
--- /dev/null
+++ b/unmaintained/strata/enlightenment/enlightenment.morph
@@ -0,0 +1,8 @@
+name: enlightenment
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix=/usr
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/unmaintained/strata/enlightenment/eterm.morph b/unmaintained/strata/enlightenment/eterm.morph
new file mode 100644
index 00000000..9a98d193
--- /dev/null
+++ b/unmaintained/strata/enlightenment/eterm.morph
@@ -0,0 +1,8 @@
+name: eterm
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix=/usr
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/unmaintained/strata/enlightenment/evas_generic_loaders.morph b/unmaintained/strata/enlightenment/evas_generic_loaders.morph
new file mode 100644
index 00000000..ef36a40b
--- /dev/null
+++ b/unmaintained/strata/enlightenment/evas_generic_loaders.morph
@@ -0,0 +1,8 @@
+name: evas_generic_loaders
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix=/usr
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/unmaintained/strata/enlightenment/imlib2.morph b/unmaintained/strata/enlightenment/imlib2.morph
new file mode 100644
index 00000000..82617ad2
--- /dev/null
+++ b/unmaintained/strata/enlightenment/imlib2.morph
@@ -0,0 +1,8 @@
+name: imlib2
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix=/usr
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/unmaintained/strata/enlightenment/libast.morph b/unmaintained/strata/enlightenment/libast.morph
new file mode 100644
index 00000000..c44e274c
--- /dev/null
+++ b/unmaintained/strata/enlightenment/libast.morph
@@ -0,0 +1,8 @@
+name: libast
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix=/usr
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/unmaintained/strata/java.morph b/unmaintained/strata/java.morph
new file mode 100644
index 00000000..05f7a925
--- /dev/null
+++ b/unmaintained/strata/java.morph
@@ -0,0 +1,22 @@
+name: java
+kind: stratum
+description: |
+ This stratum contains everything necessary to compile and run Java applications
+ and build OpenJDK from source.
+build-depends:
+- morph: strata/core.morph
+- morph: strata/x-common.morph
+- morph: strata/graphics-common.morph
+chunks:
+- name: java-binary
+ morph: unmaintained/strata/java/java-binary.morph
+ repo: github:jmacarthur/openjdk-binary
+ ref: 6f53762e2632c4b9f9afdfa6995a2c696bb9fd43
+ unpetrify-ref: master
+- name: java-ant
+ morph: unmaintained/strata/java/java-ant.morph
+ repo: upstream:java/ant
+ ref: b3509fc3250b0f868076c846d29da80cbdc20681
+ unpetrify-ref: ANT_194
+ build-depends:
+ - java-binary
diff --git a/unmaintained/strata/java/java-ant.morph b/unmaintained/strata/java/java-ant.morph
new file mode 100644
index 00000000..13c490d4
--- /dev/null
+++ b/unmaintained/strata/java/java-ant.morph
@@ -0,0 +1,8 @@
+name: java-ant
+kind: chunk
+build-commands:
+- |
+ export JAVA_HOME=/usr/lib/java-8-openjdk
+ sh build.sh -Ddist.dir="$DESTDIR/usr/lib/ant" dist
+- mkdir -p "${DESTDIR}${PREFIX}/bin"
+- ln -sf "${PREFIX}/lib/ant/bin/ant" "${DESTDIR}${PREFIX}/bin/ant"
diff --git a/unmaintained/strata/java/java-binary.morph b/unmaintained/strata/java/java-binary.morph
new file mode 100644
index 00000000..c75f39b7
--- /dev/null
+++ b/unmaintained/strata/java/java-binary.morph
@@ -0,0 +1,16 @@
+name: java-binary
+description: |
+ This is a temporary solution to the OpenJDK build problem. In the future
+ we expect to be able to build fully from scratch using IcedTea, but for now
+ we need an existing OpenJDK binary to build OpenJDK.
+kind: chunk
+configure-commands: []
+build-commands:
+- cat j2sdk-image-jdk8build.tar.gz_* > jdk-8u20-linux-x64.tar.gz
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX"/bin
+- mkdir -p "$DESTDIR$PREFIX"/lib
+- tar zxf jdk-8u20-linux-x64.tar.gz -C "$DESTDIR$PREFIX"/lib --no-same-owner
+- ln -sfn "$PREFIX"/lib/j2sdk-image "$DESTDIR$PREFIX"/lib/java-8-openjdk
+- ln -sfn "$PREFIX"/lib/j2sdk-image/jre/bin/java "$DESTDIR$PREFIX"/bin/
+- ln -sfn "$PREFIX"/lib/j2sdk-image/jre/bin/javac "$DESTDIR$PREFIX"/bin/
diff --git a/unmaintained/strata/lua51.morph b/unmaintained/strata/lua51.morph
new file mode 100644
index 00000000..d497cf8a
--- /dev/null
+++ b/unmaintained/strata/lua51.morph
@@ -0,0 +1,16 @@
+name: lua51
+kind: stratum
+description: Interpreter for the lua scripting language.
+build-depends:
+- morph: strata/tools.morph
+chunks:
+- name: lua51
+ morph: unmaintained/strata/lua51/lua51.morph
+ repo: upstream:lua
+ ref: 948063437e0350d9ef1649ec3a76d0c24a5c8642
+ unpetrify-ref: baserock/5.1-morph
+- name: luajit2
+ morph: unmaintained/strata/lua51/luajit2.morph
+ repo: upstream:luajit2
+ ref: 880ca300e8fb7b432b9d25ed377db2102e4cb63d
+ unpetrify-ref: v2.0.3
diff --git a/unmaintained/strata/lua51/lua51.morph b/unmaintained/strata/lua51/lua51.morph
new file mode 100644
index 00000000..c8f7daa4
--- /dev/null
+++ b/unmaintained/strata/lua51/lua51.morph
@@ -0,0 +1,11 @@
+name: lua51
+kind: chunk
+configure-commands:
+- sed -e 's/defined(LUA_USE_READLINE)/0/g' src/luaconf.h.orig >src/luaconf.h
+- sed -i -e '/^linux:/{n;s/-lreadline//g;s/-lhistory//g;s/-lncurses//g}' src/Makefile
+build-commands:
+- make debian_linux INSTALL_TOP="$PREFIX" RPATH="$PREFIX/lib"
+install-commands:
+- make INSTALL_TOP="$DESTDIR/$PREFIX" debian_install
+- mkdir -p "$DESTDIR/$PREFIX/lib/pkgconfig"
+- cp lua5.1.pc "$DESTDIR/$PREFIX/lib/pkgconfig/"
diff --git a/unmaintained/strata/lua51/luajit2.morph b/unmaintained/strata/lua51/luajit2.morph
new file mode 100644
index 00000000..72f34f02
--- /dev/null
+++ b/unmaintained/strata/lua51/luajit2.morph
@@ -0,0 +1,7 @@
+name: luajit2
+kind: chunk
+build-commands:
+- make PREFIX="$PREFIX"
+install-commands:
+- make install PREFIX="$PREFIX" DESTDIR="$DESTDIR"
+
diff --git a/unmaintained/strata/lvm.morph b/unmaintained/strata/lvm.morph
new file mode 100644
index 00000000..aa68dd50
--- /dev/null
+++ b/unmaintained/strata/lvm.morph
@@ -0,0 +1,15 @@
+name: lvm
+kind: stratum
+description: |
+ LVM userland tools.
+
+ LVM is a logical volume manager for the Linux kernel. This stratum contains
+ the tools necessary to manage volumes with LVM.
+build-depends:
+- morph: strata/foundation.morph
+chunks:
+- name: lvm2
+ morph: unmaintained/strata/lvm/lvm2.morph
+ repo: upstream:lvm2
+ ref: fa01faaa4aa96de834ba7e8fbb9d9aff908571c3
+ unpetrify-ref: v2_02_115
diff --git a/unmaintained/strata/lvm/lvm2.morph b/unmaintained/strata/lvm/lvm2.morph
new file mode 100644
index 00000000..d9633bb9
--- /dev/null
+++ b/unmaintained/strata/lvm/lvm2.morph
@@ -0,0 +1,32 @@
+name: lvm2
+kind: chunk
+build-system: autotools
+
+configure-commands:
+# We specify --sbindir explicitly due to a bug in .service file generation:
+# if left to the default, @sbindir@ is expanded to the literal string
+# '${exec_prefix}/sbin' in the generated .service files.
+#
+# udev rules *must* go in wherever Systemd is configured to look at. We don't expect
+# Systemd to change anymore.
+- |
+ ./configure --prefix="$PREFIX" \
+ --sbindir="$PREFIX"/sbin \
+ --with-udev-prefix="$PREFIX" \
+ --with-systemdsystemunitdir="$PREFIX"/lib/systemd/system \
+ --enable-applib --enable-cmdlib --enable-pkgconfig --enable-lvmetad \
+ --enable-dmeventd --enable-udev_sync
+
+install-commands:
+- make DESTDIR="$DESTDIR" install
+- make DESTDIR="$DESTDIR" install_system_dirs
+- make DESTDIR="$DESTDIR" install_systemd_generators
+- make DESTDIR="$DESTDIR" install_systemd_units
+- make DESTDIR="$DESTDIR" install_tmpfiles_configuration
+
+# Use lvmetad by default. This means we don't have to use the
+# `lvm2-activation-generator` systemd generator, which is a good thing
+# because I have seen it cause systems to completely fail to boot. Fedora
+# does something similar, see:
+# http://pkgs.fedoraproject.org/cgit/lvm2.git/tree/lvm2-enable-lvmetad-by-default.patch
+- sed -e 's/use_lvmetad = 0/use_lvmetad = 1/' -i "$DESTDIR"/etc/lvm/lvm.conf
diff --git a/unmaintained/strata/multimedia-gstreamer-0.10.morph b/unmaintained/strata/multimedia-gstreamer-0.10.morph
new file mode 100644
index 00000000..3778070b
--- /dev/null
+++ b/unmaintained/strata/multimedia-gstreamer-0.10.morph
@@ -0,0 +1,38 @@
+name: multimedia-gstreamer-0.10
+kind: stratum
+description: Codecs
+build-depends:
+- morph: strata/core.morph
+- morph: strata/foundation.morph
+- morph: strata/multimedia-common.morph
+- morph: strata/sound-server-pulseaudio.morph
+chunks:
+- name: gstreamer@0.10
+ repo: upstream:gstreamer
+ ref: 76fc67b18c38e7f6c9cfacc4e4d0ed11d3b2c548
+ unpetrify-ref: "0.10"
+ build-system: autotools
+ submodules:
+ common:
+ url: upstream:gstreamer-common
+- name: gstreamer-plugins-base@0.10
+ repo: upstream:gstreamer-plugins-base
+ morph: unmaintained/strata/multimedia-gstreamer-0.10/gstreamer-plugins-base@0.10.morph
+ ref: 1e1e6eaf3f0dd11f6618154d9739cbe3e007d206
+ unpetrify-ref: "0.10"
+ build-depends:
+ - gstreamer@0.10
+ submodules:
+ common:
+ url: upstream:gstreamer-common
+- name: gstreamer-plugins-good@0.10
+ repo: upstream:gstreamer-plugins-good
+ ref: 43185275636cf1b52cc12b52fe6dbbc6886f6347
+ unpetrify-ref: baserock/0.10+v4l_fix
+ build-system: autotools
+ build-depends:
+ - gstreamer@0.10
+ - gstreamer-plugins-base@0.10
+ submodules:
+ common:
+ url: upstream:gstreamer-common
diff --git a/unmaintained/strata/multimedia-gstreamer-0.10/gstreamer-plugins-base@0.10.morph b/unmaintained/strata/multimedia-gstreamer-0.10/gstreamer-plugins-base@0.10.morph
new file mode 100644
index 00000000..b5586fd9
--- /dev/null
+++ b/unmaintained/strata/multimedia-gstreamer-0.10/gstreamer-plugins-base@0.10.morph
@@ -0,0 +1,14 @@
+name: gstreamer-plugins-base@0.10
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ NOCONFIGURE=1 ./autogen.sh
+
+ case "$MORPH_ARCH" in
+ x86_32)
+ sed -i -e "s/-O2/& -msse2/" configure
+ ;;
+ esac
+
+ ./configure --prefix="$PREFIX" --sysconfdir=/etc --localstatedir=/var --disable-gtk-doc
diff --git a/unmaintained/strata/networking-utils.morph b/unmaintained/strata/networking-utils.morph
new file mode 100644
index 00000000..da46c629
--- /dev/null
+++ b/unmaintained/strata/networking-utils.morph
@@ -0,0 +1,105 @@
+name: networking-utils
+kind: stratum
+description: |
+ Stratum which contains utils to works with networks: create, enable, filter...
+
+ This stratum requires kernel config flags which are not enabled in the default
+ Baserock kernel found in the BSP strata. See the Openstack BSP stratum to get
+ an idea of what is needed.
+build-depends:
+- morph: strata/foundation.morph
+chunks:
+- name: ebtables
+ morph: unmaintained/strata/networking-utils/ebtables.morph
+ repo: upstream:ebtables
+ ref: f4bdc80ae8c1a79b4ab5dcb8431ad85aea618d66
+ unpetrify-ref: master
+- name: iproute2
+ morph: unmaintained/strata/networking-utils/iproute2.morph
+ repo: upstream:iproute2
+ ref: 50231ad2a554fcb02462bed6405c970833c1baee
+ unpetrify-ref: v3.17.0
+- name: libmnl
+ repo: upstream:libmnl
+ ref: c9f19b98cd8e108617e825e071091df14f78c53a
+ unpetrify-ref: master
+ build-system: autotools
+- name: ipset
+ morph: unmaintained/strata/networking-utils/ipset.morph
+ repo: upstream:ipset
+ ref: cf25c4c50e9996af30499e5b1c3354ab53be7237
+ unpetrify-ref: v6.24
+ build-depends:
+ - libmnl
+- name: libpcap
+ morph: unmaintained/strata/networking-utils/libpcap.morph
+ repo: upstream:libpcap
+ ref: 098a643f817e8a9929c70dfba157e4d399398375
+ unpetrify-ref: libpcap-1.7
+- name: tcpdump
+ morph: unmaintained/strata/networking-utils/tcpdump.morph
+ repo: upstream:tcpdump
+ ref: 8aa5edea1b8846740514dee4158b6c707d38fc13
+ unpetrify-ref: tcpdump-4.7
+ build-depends:
+ - libpcap
+- name: libnet
+ morph: unmaintained/strata/networking-utils/libnet.morph
+ repo: upstream:libnet
+ ref: 05df365769597e1d64d02af931d6127762ff2658
+ unpetrify-ref: libnet-1.2
+- name: iputils
+ morph: unmaintained/strata/networking-utils/iputils.morph
+ repo: upstream:iputils
+ ref: d25e54e25107bc7c5d14737ed65f5f52b54f1472
+ unpetrify-ref: s20140519
+ build-depends:
+ - libpcap
+ - libnet
+- name: libnfnetlink
+ morph: unmaintained/strata/networking-utils/libnfnetlink.morph
+ repo: upstream:libnfnetlink
+ ref: 1166116e34af868bc814aea338c246e49a7a8748
+ unpetrify-ref: libnfnetlink-1.0.1
+- name: libnetfilter_conntrack
+ morph: unmaintained/strata/networking-utils/libnetfilter_conntrack.morph
+ repo: upstream:libnetfilter_conntrack
+ ref: 5ad6ecff6edffd925022372323e42264f61e850d
+ unpetrify-ref: libnetfilter_conntrack-1.0.4
+ build-depends:
+ - libnfnetlink
+ - libmnl
+- name: libnetfilter_cthelper
+ morph: unmaintained/strata/networking-utils/libnetfilter_cthelper.morph
+ repo: upstream:libnetfilter_cthelper
+ ref: b8df12f352db62d26e5116e960d24774d5c9f3b7
+ unpetrify-ref: libnetfilter_cthelper-1.0.0
+ build-depends:
+ - libmnl
+- name: libnetfilter_cttimeout
+ morph: unmaintained/strata/networking-utils/libnetfilter_cttimeout.morph
+ repo: upstream:libnetfilter_cttimeout
+ ref: 329652bef21c831dae1a9a79084b999d40b4eb5b
+ unpetrify-ref: libnetfilter_cttimeout-1.0.0
+ build-depends:
+ - libmnl
+- name: libnetfilter_queue
+ morph: unmaintained/strata/networking-utils/libnetfilter_queue.morph
+ repo: upstream:libnetfilter_queue
+ ref: f5d092dd3145d427c7c2ed668e3ac899875c9612
+ unpetrify-ref: libnetfilter_queue-1.0.2
+ build-depends:
+ - libnfnetlink
+ - libmnl
+- name: conntrack-tools
+ morph: unmaintained/strata/networking-utils/conntrack-tools.morph
+ repo: upstream:conntrack-tools
+ ref: fbe3181be4f2e33509b1c20b95fd55eb3e7075d7
+ unpetrify-ref: conntrack-tools-1.4.2
+ build-depends:
+ - libnfnetlink
+ - libmnl
+ - libnetfilter_conntrack
+ - libnetfilter_cttimeout
+ - libnetfilter_cthelper
+ - libnetfilter_queue
diff --git a/unmaintained/strata/networking-utils/conntrack-tools.morph b/unmaintained/strata/networking-utils/conntrack-tools.morph
new file mode 100644
index 00000000..e0ef7234
--- /dev/null
+++ b/unmaintained/strata/networking-utils/conntrack-tools.morph
@@ -0,0 +1,4 @@
+name: conntrack-tools
+kind: chunk
+build-system: autotools
+max-jobs: 1
diff --git a/unmaintained/strata/networking-utils/ebtables.morph b/unmaintained/strata/networking-utils/ebtables.morph
new file mode 100644
index 00000000..a4d9fc76
--- /dev/null
+++ b/unmaintained/strata/networking-utils/ebtables.morph
@@ -0,0 +1,7 @@
+name: ebtables
+kind: chunk
+build-system: manual
+build-commands:
+- make
+install-commands:
+- make install DESTDIR="$DESTDIR" BINDIR="$PREFIX/sbin"
diff --git a/unmaintained/strata/networking-utils/iproute2.morph b/unmaintained/strata/networking-utils/iproute2.morph
new file mode 100644
index 00000000..7ba04db6
--- /dev/null
+++ b/unmaintained/strata/networking-utils/iproute2.morph
@@ -0,0 +1,10 @@
+name: iproute2
+kind: chunk
+build-commands:
+# arpd binary is dependent on Berkeley DB, which is licensed by Oracle
+# as arpd is not needed for Openstack systems, arpd will not be compiled
+# or installed.
+- sed -i '/^TARGETS/s@arpd@@g' misc/Makefile
+- make
+install-commands:
+- DESTDIR="$DESTDIR" PREFIX="$PREFIX" make install
diff --git a/unmaintained/strata/networking-utils/ipset.morph b/unmaintained/strata/networking-utils/ipset.morph
new file mode 100644
index 00000000..7fe8c6dc
--- /dev/null
+++ b/unmaintained/strata/networking-utils/ipset.morph
@@ -0,0 +1,6 @@
+name: ipset
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./autogen.sh
+- ./configure --prefix="$PREFIX" --enable-static=no --with-kmod=no
diff --git a/unmaintained/strata/networking-utils/iputils.morph b/unmaintained/strata/networking-utils/iputils.morph
new file mode 100644
index 00000000..c9736cc8
--- /dev/null
+++ b/unmaintained/strata/networking-utils/iputils.morph
@@ -0,0 +1,24 @@
+name: iputils
+kind: chunk
+build-system: manual
+pre-configure-commands:
+# gnutls is not currently integrated in definitions so, disabling this
+# is required in order to build ping6. If this is not disabled, it will try
+# to find gnutls/openssl.h header failing to compile ping6.
+- sed -i "s/USE_GNUTLS=yes/USE_GNUTLS=no/" Makefile
+build-commands:
+- make
+- make ninfod
+install-commands:
+- install -D -m 755 clockdiff "$DESTDIR$PREFIX"/bin/clockdiff
+- install -D -m 755 rdisc "$DESTDIR$PREFIX"/bin/rdisc
+- install -D -m 755 tracepath "$DESTDIR$PREFIX"/bin/tracepath
+- install -D -m 755 tracepath6 "$DESTDIR$PREFIX"/bin/tracepath6
+- install -D -m 755 ninfod/ninfod "$DESTDIR$PREFIX"/bin/ninfod
+- install -D -m 755 rarpd "$DESTDIR$PREFIX"/bin/rarpd
+# The following binaries are installed to overwrite busybox binaries.
+- install -D -m 755 traceroute6 "$DESTDIR$PREFIX"/bin/traceroute6
+- install -D -m 755 arping "$DESTDIR$PREFIX"/sbin/arping
+- install -D -m 755 tftpd "$DESTDIR$PREFIX"/sbin/tftpd
+- install -D -m 755 ping "$DESTDIR"/bin/ping
+- install -D -m 755 ping6 "$DESTDIR"/bin/ping6
diff --git a/unmaintained/strata/networking-utils/libnet.morph b/unmaintained/strata/networking-utils/libnet.morph
new file mode 100644
index 00000000..ddb2cf3e
--- /dev/null
+++ b/unmaintained/strata/networking-utils/libnet.morph
@@ -0,0 +1,16 @@
+name: libnet
+kind: chunk
+build-system: manual
+pre-configure-commands:
+# Avoid building the docs as they require doxygen
+- sed -i 's@doc @@' libnet/Makefile.am
+- sed -i 's@doc/.*Makefile@@' libnet/configure.ac
+
+- cd libnet && ./autogen.sh
+configure-commands:
+- cd libnet && ./configure --prefix="$PREFIX" --disable-samples --enable-shared=yes
+ --with-pic
+build-commands:
+- cd libnet && make
+install-commands:
+- cd libnet && make DESTDIR="$DESTDIR" install
diff --git a/unmaintained/strata/networking-utils/libnetfilter_conntrack.morph b/unmaintained/strata/networking-utils/libnetfilter_conntrack.morph
new file mode 100644
index 00000000..ef6ebb48
--- /dev/null
+++ b/unmaintained/strata/networking-utils/libnetfilter_conntrack.morph
@@ -0,0 +1,3 @@
+name: libnetfilter_conntrack
+kind: chunk
+build-system: autotools
diff --git a/unmaintained/strata/networking-utils/libnetfilter_cthelper.morph b/unmaintained/strata/networking-utils/libnetfilter_cthelper.morph
new file mode 100644
index 00000000..7f410a4a
--- /dev/null
+++ b/unmaintained/strata/networking-utils/libnetfilter_cthelper.morph
@@ -0,0 +1,3 @@
+name: libnetfilter_cthelper
+kind: chunk
+build-system: autotools
diff --git a/unmaintained/strata/networking-utils/libnetfilter_cttimeout.morph b/unmaintained/strata/networking-utils/libnetfilter_cttimeout.morph
new file mode 100644
index 00000000..b2281a5b
--- /dev/null
+++ b/unmaintained/strata/networking-utils/libnetfilter_cttimeout.morph
@@ -0,0 +1,3 @@
+name: libnetfilter_cttimeout
+kind: chunk
+build-system: autotools
diff --git a/unmaintained/strata/networking-utils/libnetfilter_queue.morph b/unmaintained/strata/networking-utils/libnetfilter_queue.morph
new file mode 100644
index 00000000..d2b80d38
--- /dev/null
+++ b/unmaintained/strata/networking-utils/libnetfilter_queue.morph
@@ -0,0 +1,3 @@
+name: libnetfilter_queue
+kind: chunk
+build-system: autotools
diff --git a/unmaintained/strata/networking-utils/libnfnetlink.morph b/unmaintained/strata/networking-utils/libnfnetlink.morph
new file mode 100644
index 00000000..f4fe79ab
--- /dev/null
+++ b/unmaintained/strata/networking-utils/libnfnetlink.morph
@@ -0,0 +1,3 @@
+name: libnfnetlink
+kind: chunk
+build-system: autotools
diff --git a/unmaintained/strata/networking-utils/libpcap.morph b/unmaintained/strata/networking-utils/libpcap.morph
new file mode 100644
index 00000000..7c5ee932
--- /dev/null
+++ b/unmaintained/strata/networking-utils/libpcap.morph
@@ -0,0 +1,3 @@
+name: libpcap
+kind: chunk
+build-system: autotools
diff --git a/unmaintained/strata/networking-utils/tcpdump.morph b/unmaintained/strata/networking-utils/tcpdump.morph
new file mode 100644
index 00000000..7a974dab
--- /dev/null
+++ b/unmaintained/strata/networking-utils/tcpdump.morph
@@ -0,0 +1,3 @@
+name: tcpdump
+kind: chunk
+build-system: autotools
diff --git a/unmaintained/strata/ntpd.morph b/unmaintained/strata/ntpd.morph
new file mode 100644
index 00000000..b4f2b857
--- /dev/null
+++ b/unmaintained/strata/ntpd.morph
@@ -0,0 +1,10 @@
+name: ntpd
+kind: stratum
+build-depends:
+- morph: strata/foundation.morph
+chunks:
+- name: ntpd
+ morph: unmaintained/strata/ntpd/ntpd.morph
+ repo: upstream:ntp
+ ref: b2ccf8dd31d1457ae9f0ae270054117179220370
+ unpetrify-ref: ntp-4.2.8p2
diff --git a/unmaintained/strata/ntpd/ntpd.morph b/unmaintained/strata/ntpd/ntpd.morph
new file mode 100644
index 00000000..762762c7
--- /dev/null
+++ b/unmaintained/strata/ntpd/ntpd.morph
@@ -0,0 +1,51 @@
+name: ntpd
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --prefix="$PREFIX" --enable-linuxcaps
+post-install-commands:
+- |
+ cat > ntpd.service << EOF
+ [Unit]
+ Description=Network Time Service
+ After=network.target nss-lookup.target
+ Conflicts=systemd-timesyncd.service
+
+ [Service]
+ Type=forking
+ ExecStart=/usr/bin/ntpd -u ntp:ntp -Ng
+ PrivateTmp=True
+ Restart=on-failure
+
+ [Install]
+ WantedBy=multi-user.target
+ EOF
+- install -D -m 644 ntpd.service "$DESTDIR"/lib/systemd/system/ntpd.service
+- mkdir -p "$DESTDIR"/lib/systemd/system/multi-user.target.wants
+- ln -s /lib/systemd/system/ntpd.service "$DESTDIR"/lib/systemd/system/multi-user.target.wants/ntpd.service
+- |
+ cat > ntp.conf << EOF
+ # We use iburst here to reduce the potential initial delay to set the clock
+ server 0.pool.ntp.org iburst
+ server 1.pool.ntp.org iburst
+ server 2.pool.ntp.org iburst
+ server 3.pool.ntp.org iburst
+
+ # kod - notify client when packets are denied service,
+ # rather than just dropping the packets
+ #
+ # nomodify - deny queries which attempt to modify the state of the server
+ #
+ # notrap - decline to provide mode 6 control message trap service to
+ # matching hosts
+ #
+ # see ntp.conf(5) for more details
+ restrict -4 default limit kod notrap nomodify
+ restrict -6 default limit kod notrap nomodify
+ EOF
+- install -D -m 644 ntp.conf "$DESTDIR"/etc/ntp.conf
+system-integration:
+ ntpd-misc:
+ 00-add-ntpd-user:
+ - groupadd -r ntp
+ - useradd -g ntp -d /home/ntp -s /bin/false -r ntp
diff --git a/unmaintained/strata/ocaml-language.morph b/unmaintained/strata/ocaml-language.morph
new file mode 100644
index 00000000..68e276cc
--- /dev/null
+++ b/unmaintained/strata/ocaml-language.morph
@@ -0,0 +1,11 @@
+name: ocaml-language
+kind: stratum
+description: |
+ OCaml
+build-depends:
+- morph: strata/core.morph
+chunks:
+- name: ocaml
+ morph: unmaintained/strata/ocaml-language/ocaml.morph
+ repo: upstream:ocaml
+ ref: fa7961d5fada53056f38a9ae36615df26352028a
diff --git a/unmaintained/strata/ocaml-language/ocaml.morph b/unmaintained/strata/ocaml-language/ocaml.morph
new file mode 100644
index 00000000..00e36767
--- /dev/null
+++ b/unmaintained/strata/ocaml-language/ocaml.morph
@@ -0,0 +1,8 @@
+name: ocaml
+kind: chunk
+configure-commands:
+- ./configure --prefix "$PREFIX"
+build-commands:
+- make world.opt
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/unmaintained/strata/openstack-clients/appdirs.morph b/unmaintained/strata/openstack-clients/appdirs.morph
new file mode 100644
index 00000000..53d0e476
--- /dev/null
+++ b/unmaintained/strata/openstack-clients/appdirs.morph
@@ -0,0 +1,3 @@
+name: appdirs
+kind: chunk
+build-system: python-distutils
diff --git a/unmaintained/strata/openstack-clients/argparse.morph b/unmaintained/strata/openstack-clients/argparse.morph
new file mode 100644
index 00000000..499df5f5
--- /dev/null
+++ b/unmaintained/strata/openstack-clients/argparse.morph
@@ -0,0 +1,3 @@
+name: argparse
+kind: chunk
+build-system: python-distutils
diff --git a/unmaintained/strata/openstack-clients/cliff-tablib.morph b/unmaintained/strata/openstack-clients/cliff-tablib.morph
new file mode 100644
index 00000000..4b48ba14
--- /dev/null
+++ b/unmaintained/strata/openstack-clients/cliff-tablib.morph
@@ -0,0 +1,3 @@
+name: cliff-tablib
+kind: chunk
+build-system: python-distutils
diff --git a/unmaintained/strata/openstack-clients/os-client-config.morph b/unmaintained/strata/openstack-clients/os-client-config.morph
new file mode 100644
index 00000000..13c473d2
--- /dev/null
+++ b/unmaintained/strata/openstack-clients/os-client-config.morph
@@ -0,0 +1,3 @@
+name: os-client-config
+kind: chunk
+build-system: python-distutils
diff --git a/unmaintained/strata/openstack-clients/pyparsing.morph b/unmaintained/strata/openstack-clients/pyparsing.morph
new file mode 100644
index 00000000..60088544
--- /dev/null
+++ b/unmaintained/strata/openstack-clients/pyparsing.morph
@@ -0,0 +1,6 @@
+name: pyparsing
+kind: chunk
+build-commands:
+- cd src && python setup.py build
+install-commands:
+- cd src && python setup.py install --prefix "$PREFIX" --root "$DESTDIR"
diff --git a/unmaintained/strata/openstack-clients/python-ironicclient.morph b/unmaintained/strata/openstack-clients/python-ironicclient.morph
new file mode 100644
index 00000000..95be0bd8
--- /dev/null
+++ b/unmaintained/strata/openstack-clients/python-ironicclient.morph
@@ -0,0 +1,3 @@
+name: python-ironicclient
+kind: chunk
+build-system: python-distutils
diff --git a/unmaintained/strata/openstack-clients/python-openstackclient.morph b/unmaintained/strata/openstack-clients/python-openstackclient.morph
new file mode 100644
index 00000000..a4c9fae7
--- /dev/null
+++ b/unmaintained/strata/openstack-clients/python-openstackclient.morph
@@ -0,0 +1,3 @@
+name: python-openstackclient
+kind: chunk
+build-system: python-distutils
diff --git a/unmaintained/strata/openstack-clients/tablib.morph b/unmaintained/strata/openstack-clients/tablib.morph
new file mode 100644
index 00000000..821ceb95
--- /dev/null
+++ b/unmaintained/strata/openstack-clients/tablib.morph
@@ -0,0 +1,3 @@
+name: tablib
+kind: chunk
+build-system: python-distutils
diff --git a/unmaintained/strata/openstack-services.morph b/unmaintained/strata/openstack-services.morph
new file mode 100644
index 00000000..18592e76
--- /dev/null
+++ b/unmaintained/strata/openstack-services.morph
@@ -0,0 +1,805 @@
+name: openstack-services
+kind: stratum
+description: Openstack clients and services
+build-depends:
+- morph: strata/erlang.morph
+- morph: unmaintained/strata/django.morph
+- morph: unmaintained/strata/xstatic.morph
+- morph: strata/openstack-clients.morph
+- morph: unmaintained/strata/test-tools.morph
+- morph: strata/python-tools.morph
+chunks:
+- name: erlang-sd_notify
+ morph: unmaintained/strata/openstack-services/erlang-sd_notify.morph
+ repo: upstream:erlang-modules/erlang-sd_notify
+ ref: 99f4689c2c18570680329f822591f95f9341ca10
+ unpetrify-ref: '0.1'
+- name: rabbitmq-codegen
+ morph: unmaintained/strata/openstack-services/rabbitmq-codegen.morph
+ ref: 4dc5ccde2a0b3d638e5754b00abf94196fe9ca32
+ unpetrify-ref: rabbitmq_v3_4_1
+ repo: upstream:rabbitmq-codegen
+- name: rabbitmq-server
+ morph: unmaintained/strata/openstack-services/rabbitmq-server.morph
+ ref: 9afcf9b95d2c53f866e9a33ddce46562f8950ded
+ unpetrify-ref: baserock/master
+ repo: upstream:rabbitmq-server
+ build-depends:
+ - rabbitmq-codegen
+- name: oslo-rootwrap
+ repo: upstream:openstack/oslo-rootwrap
+ ref: f485b93f475b119e3b8fa6c9cf740207e2d2d7ac
+ unpetrify-ref: 1.6.0
+ build-system: python-distutils
+- name: py-amqp
+ repo: upstream:python-packages/py-amqp
+ ref: 875b10d1715def640042c7ff2f42c00a6c07eed1
+ unpetrify-ref: 1.4.6
+ build-system: python-distutils
+- name: librabbitmq
+ morph: unmaintained/strata/openstack-services/librabbitmq.morph
+ repo: upstream:python-packages/librabbitmq
+ ref: ecccbd2c7d92f6e189e362b26def8d980fa50e3b
+ unpetrify-ref: baserock/v1.6.1
+ build-depends:
+ - py-amqp
+ submodules:
+ rabbitmq-codegen:
+ url: upstream:rabbitmq-codegen.git
+ rabbitmq-c:
+ url: upstream:python-packages/rabbitmq-c-github-ask.git
+- name: anyjson
+ repo: upstream:python-packages/anyjson
+ ref: 016506078e94718e1fe750eb5083ab5ba07498c8
+ unpetrify-ref: 0.3.3
+ build-system: python-distutils
+- name: kombu
+ repo: upstream:python-packages/kombu
+ ref: 0287b11ab0698d9c52ef1b1683ced23123d43ba4
+ unpetrify-ref: v3.0.26
+ build-system: python-distutils
+ build-depends:
+ - anyjson
+ - py-amqp
+ - librabbitmq
+- name: sqlalchemy
+ repo: upstream:python-packages/sqlalchemy
+ ref: ff34c480dfd2b8b7c72339d196f5477980a5124c
+ unpetrify-ref: rel_0_9_8
+ build-system: python-distutils
+- name: alembic
+ repo: upstream:python-packages/alembic
+ ref: 6ae4196acc0170ebef29f617b49376b371a8923c
+ unpetrify-ref: rel_0_7_6
+ build-system: python-distutils
+ build-depends:
+ - sqlalchemy
+- name: lockfile
+ repo: upstream:python-packages/lockfile
+ ref: 777758cdf4520271370b3338b86b5c66f9b104f0
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: dogpile-core
+ repo: upstream:python-packages/dogpile-core
+ ref: 3e6f0f86b4161b48898e656039154092426e5cc8
+ unpetrify-ref: rel_0_4_1
+ build-system: python-distutils
+- name: dogpile-cache
+ repo: upstream:python-packages/dogpile-cache
+ ref: 1c753914b335b4391bc5847a87b7c52ca81c2bc6
+ unpetrify-ref: rel_0_5_4
+ build-system: python-distutils
+ build-depends:
+ - dogpile-core
+- name: pyjwt
+ repo: upstream:python-packages/pyjwt
+ ref: 739efeff4c6c1fc30ab5cf5eb0ac337e8ee107d7
+ unpetrify-ref: 0.2.3
+ build-system: python-distutils
+- name: creole
+ repo: upstream:python-packages/creole
+ ref: 6390231688adb5d8678a71cd33204e9bca555d4a
+ unpetrify-ref: v1.2.1
+ build-system: python-distutils
+- name: pygments
+ repo: upstream:python-packages/pygments
+ ref: f41e8c594e76855611b3b3dfca300894bd29f1c4
+ unpetrify-ref: 2.0rc1
+ build-system: python-distutils
+- name: docutils
+ repo: upstream:python-packages/docutils
+ ref: 1976ba91eff979abc3e13e5d8cb68324833af6a0
+ unpetrify-ref: docutils-0.12
+ build-system: python-distutils
+- name: snowballstemmer
+ repo: upstream:python-packages/snowballstemmer.git
+ ref: f0d81ce1606d685029302ea073b59d9437d12569
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: sphinx
+ repo: upstream:python-packages/sphinx
+ ref: e76c9771bad16e68cdb7deb18b4d13de0a718c68
+ unpetrify-ref: 1.3b1
+ build-system: python-distutils
+ build-depends:
+ - pygments
+ - docutils
+ - snowballstemmer
+- name: pystache
+ repo: upstream:python-packages/pystache.git
+ ref: cce3ebd658f28aeb7dd54561554dedf5259303dc
+ unpetrify-ref: baserock/v0.5.4
+ build-system: python-distutils
+ submodules:
+ ext/spec:
+ url: upstream:mustache-spec
+- name: pies
+ repo: upstream:python-packages/pies.git
+ ref: 593dcce07fdb3e8d0053a863a7aba7f2ce8a6c9c
+ unpetrify-ref: 2.6.1
+ build-system: python-distutils
+- name: natsort
+ repo: upstream:python-packages/natsort.git
+ ref: ce94d418c3849e891f0508b41f5bccc4ae1d4e4d
+ unpetrify-ref: 3.5.1
+ build-system: python-distutils
+- name: isort
+ repo: upstream:python-packages/isort.git
+ ref: 9d1b03b6e1fd2f87be1c635d6159a76a131f8155
+ unpetrify-ref: 3.9.0
+ build-system: python-distutils
+ build-depends:
+ - pies
+ - natsort
+- name: pep8
+ repo: upstream:python-packages/pep8.git
+ ref: 164066c4d85f212f5f4a11699b848942c678b947
+ unpetrify-ref: 1.5.7
+ build-system: python-distutils
+- name: pyflakes
+ repo: upstream:python-packages/pyflakes.git
+ ref: 71b7b6776856912d50a0b9a85a8ea2a1dc7eb75c
+ unpetrify-ref: 0.8.1
+ build-system: python-distutils
+- name: smartypants
+ repo: upstream:python-packages/smartypants.git
+ ref: e89b6e7e119694edcd414a556c634d5ca85bff76
+ unpetrify-ref: v1.8.6
+ build-system: python-distutils
+ build-depends:
+ - isort
+ - pep8
+ - pyflakes
+- name: pycco
+ repo: upstream:python-packages/pycco
+ ref: 22e157e525760e843dba391ca85fbe9bd35fdc5b
+ unpetrify-ref: master
+ build-system: python-distutils
+ build-depends:
+ - pygments
+ - pystache
+ - smartypants
+- name: dateutil
+ repo: upstream:python-packages/dateutil
+ ref: 8c6026ba09716a4e164f5420120bfe2ebb2d9d82
+ unpetrify-ref: trunk
+ build-system: python-distutils
+- name: posix-ipc-tarball
+ repo: upstream:python-packages/posix-ipc-tarball
+ ref: f3765db04b903b3671733e07cf1541a51966dd14
+ unpetrify-ref: posix_ipc-0.9.8
+ build-system: python-distutils
+- name: paste
+ repo: upstream:python-packages/paste
+ ref: 4c177fce89fee925f0f4fbfde00ce2e1252562c0
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: repoze-lru
+ repo: upstream:python-packages/repoze-lru
+ ref: 29c8281dee7fe8dae8c66c7c40ce7c058ec2ab0f
+ unpetrify-ref: '0.6'
+ build-system: python-distutils
+- name: routes
+ repo: upstream:python-packages/routes
+ ref: 745a9207d9e48e309e292172543bc21075e65e09
+ unpetrify-ref: v2.1
+ build-system: python-distutils
+ build-depends:
+ - repoze-lru
+- name: passlib
+ repo: upstream:python-packages/passlib
+ ref: f407312597727a08440e41bc8e31d3b3b334c66f
+ unpetrify-ref: 1.6.2
+ build-system: python-distutils
+- name: tempita
+ repo: upstream:python-packages/tempita
+ ref: b2b67795a009e9f825cbd855d766b78a00273f10
+ unpetrify-ref: '0.5'
+ build-system: python-distutils
+- name: numpy
+ repo: upstream:python-packages/numpy.git
+ ref: 65293874fb101907e1648e6b4fafd30d0aa1172a
+ unpetrify-ref: baserock/v1.9.0
+ build-system: python-distutils
+ build-depends:
+ - sphinx
+ submodules:
+ doc/sphinxext:
+ url: upstream:numpydoc.git
+ doc/scipy-sphinx-theme:
+ url: upstream:scipy-sphinx-theme.git
+- name: websockify
+ repo: upstream:python-packages/websockify
+ ref: 2f025741f86419d4ad5702dabf5903db3dbfe77c
+ unpetrify-ref: baserock/v0.6.1-1-g2f02574
+ build-system: python-distutils
+ build-depends:
+ - numpy
+ submodules:
+ include/web-socket-js-project:
+ url: upstream:web-socket-js.git
+- name: httplib2
+ repo: upstream:python-packages/httplib2
+ ref: f9f797223d075874b0031aea832152688ec23fef
+ unpetrify-ref: v0.9.1
+ build-system: python-distutils
+- name: suds
+ repo: upstream:python-packages/suds
+ ref: e7a317f1a20a4d3c86ac85785bb32d24c3d1078f
+ unpetrify-ref: baserock/release-0.4
+ build-system: python-distutils
+- name: jsonrpclib
+ repo: upstream:python-packages/jsonrpclib
+ ref: 53c8ffcfe4dd1718086cc551dce8ac459e8abc67
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: rtslib-fb
+ repo: upstream:python-packages/rtslib-fb
+ ref: 8ffb4739d596fb1aac5d62d173d1e6f80270af9d
+ unpetrify-ref: v2.1.fb52
+ morph: unmaintained/strata/openstack-services/rtslib-fb.morph
+- name: python-pexpect
+ repo: upstream:python-packages/pexpect
+ ref: 671417beb41c21f772687c565196fdde444b053b
+ unpetrify-ref: '3.3'
+ build-system: python-distutils
+- name: ply
+ repo: upstream:python-packages/ply.git
+ ref: 6513f3537d80f483ec9c7e36d52e87f107a57f23
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: jsonpath-rw
+ repo: upstream:python-packages/jsonpath-rw
+ ref: f4cfe56b8e8370116c5275ddcea970e9a68fd75d
+ unpetrify-ref: 1.2.3
+ build-system: python-distutils
+ build-depends:
+ - ply
+- name: logutils
+ repo: upstream:python-packages/logutils.git
+ ref: 095f14efbaaf838b7772bffd36a466abb9668efe
+ unpetrify-ref: 0.3.3
+ build-system: python-distutils
+- name: pecan
+ repo: upstream:python-packages/pecan
+ ref: c7f241fd6bb8a0b10e02b8b43aaf1810c312cfbf
+ unpetrify-ref: 0.8.0
+ build-system: python-distutils
+ build-depends:
+ - logutils
+- name: croniter
+ repo: upstream:python-packages/croniter
+ ref: 0c3aeac05791cb4ece9e30da29442e9cd5b22f36
+ unpetrify-ref: 0.3.5
+ build-system: python-distutils
+ build-depends:
+ - dateutil
+- name: msgpack-python
+ repo: upstream:python-packages/msgpack-python
+ ref: 61bac2f586e82313a0e618093bfed2435cd18983
+ unpetrify-ref: 0.4.2
+ build-system: python-distutils
+- name: qpid-python
+ morph: unmaintained/strata/openstack-services/qpid-python.morph
+ repo: upstream:python-packages/qpid-python
+ ref: 587b0febaf1996db1e483137ed6addb45580ee9e
+ unpetrify-ref: '0.30'
+- name: simplegeneric-tarball
+ repo: upstream:python-packages/simplegeneric-tarball
+ ref: 601fab9b154c557dfd848d531a8969f4697d1aa2
+ unpetrify-ref: simplegeneric_0.8.1.orig
+ build-system: python-distutils
+- name: ipaddr-py
+ morph: unmaintained/strata/openstack-services/ipaddr-py.morph
+ ref: c813f4790d1092b1515ee18fe8270180ed3cc5cb
+ unpetrify-ref: master
+ repo: upstream:python-packages/ipaddr-py
+- name: wsme
+ repo: upstream:python-packages/wsme
+ ref: 99d7668789cc6252398222549599d1363cddb081
+ unpetrify-ref: 0.6.1
+ build-system: python-distutils
+ build-depends:
+ - ipaddr-py
+ - simplegeneric-tarball
+- name: pysnmp
+ repo: upstream:python-packages/pysnmp
+ ref: 1b377afeaf9ee96ab1d48aeebb2b7a6d65a4ac9d
+ unpetrify-ref: release_4_2_5_tag
+ build-system: python-distutils
+- name: thrift
+ morph: unmaintained/strata/openstack-services/thrift.morph
+ repo: upstream:thrift
+ ref: 591e20f9636c37527a70dc03598218c3468a0eff
+ unpetrify-ref: 0.9.2
+- name: retrying
+ repo: upstream:python-packages/retrying
+ ref: cab083eb5791615fadbc0c98ad77a70d64b77d0d
+ unpetrify-ref: v1.3.1
+ build-system: python-distutils
+- name: oslo-context
+ repo: upstream:openstack/oslo-context
+ ref: 1c4757a9fb41e47867bd9b8d390057ad7636b76f
+ unpetrify-ref: 0.2.0
+ build-system: python-distutils
+- name: oslo-middleware
+ repo: upstream:openstack/oslo-middleware
+ ref: bff184a2b5b1a0d3d22508a7544075378aca9e13
+ unpetrify-ref: 1.2.0
+ build-system: python-distutils
+ build-depends:
+ - oslo-context
+- name: oslo-messaging
+ repo: upstream:openstack/oslo-messaging
+ ref: 562c41bb78f578ff9c27633c04ac6dd914c55f5a
+ unpetrify-ref: 1.8.2
+ build-system: python-distutils
+ build-depends:
+ - kombu
+- name: ordereddict
+ repo: upstream:python-packages/ordereddict-tarball
+ ref: 332cd0213829089dd827a32e7c5e64c41ce79cbc
+ unpetrify-ref: ordereddict-1.1
+ build-system: python-distutils
+- name: trollius
+ repo: upstream:python-packages/trollius
+ ref: fe6f8d61b1257bc01cdf4f789aaf4a8ec3d6f8ec
+ unpetrify-ref: trollius-1.0.4
+ build-system: python-distutils
+ build-depends:
+ - ordereddict
+- name: aioeventlet
+ repo: upstream:python-packages/aioeventlet
+ ref: 3cac0d7740592a380a7dadb2ddcdda000cae2bda
+ unpetrify-ref: '0.4'
+ build-system: python-distutils
+ build-depends:
+ - trollius
+- name: urllib3
+ repo: upstream:python-packages/urllib3
+ ref: 8434c77d845255c4002b505c6c2d79c3b35def0d
+ unpetrify-ref: 1.10.4
+ build-system: python-distutils
+- name: oslo-concurrency
+ repo: upstream:openstack/oslo-concurrency
+ ref: a2473ed0a59e4553766ffcb1ee8f06cb98b14a48
+ unpetrify-ref: 1.8.0
+ build-system: python-distutils
+ build-depends:
+ - posix-ipc-tarball
+ - retrying
+- name: oslo-vmware
+ repo: upstream:openstack/oslo-vmware
+ ref: 5de2c31e9d24f40fc7d33ddb1ce407ffdc6f366c
+ unpetrify-ref: 0.11.1
+ build-system: python-distutils
+ build-depends:
+ - oslo-concurrency
+ - suds
+ - urllib3
+ - httplib2
+- name: taskflow
+ repo: upstream:openstack/taskflow
+ ref: 28bece7c7c97199b8d941b16865c3670c323589a
+ unpetrify-ref: 0.7.1
+ build-system: python-distutils
+- name: sqlalchemy-migrate
+ repo: upstream:python-packages/sqlalchemy-migrate
+ ref: e57ee4c3a4247c634980cbeba74d04a01253967d
+ unpetrify-ref: 0.9.6
+ build-system: python-distutils
+ build-depends:
+ - sqlalchemy
+ - tempita
+- name: oauthlib
+ repo: upstream:python-packages/oauthlib
+ ref: fd239fca84644896b1971cf24bc6213d065adb86
+ unpetrify-ref: 0.7.2
+ build-system: python-distutils
+ build-depends:
+ - docutils
+ - creole
+ - pycco
+ - sphinx
+ - pyjwt
+- name: happybase
+ repo: upstream:python-packages/happybase
+ ref: 90a4b7ef741f0ecfe5145693f64c6f7180b9ba3d
+ unpetrify-ref: '0.8'
+ build-system: python-distutils
+ build-depends:
+ - thrift
+- name: osprofiler
+ repo: upstream:python-packages/osprofiler
+ ref: bbe39b517263017c9db56ae1d904d08846eacff7
+ unpetrify-ref: 0.3.0
+ build-system: python-distutils
+- name: pycadf
+ repo: upstream:python-packages/pycadf
+ ref: 9501f4f74c5d800ae43edbe52680e285cf98c710
+ unpetrify-ref: 0.9.0
+ build-system: python-distutils
+ build-depends:
+ - oslo-context
+ - oslo-messaging
+ - posix-ipc-tarball
+- name: keystonemiddleware
+ repo: upstream:openstack/keystonemiddleware
+ ref: 0e63b0e13d0a7919fddd7576c99bc15a45d31a9f
+ unpetrify-ref: 1.5.1
+ build-system: python-distutils
+ build-depends:
+ - pycadf
+ - oslo-context
+- name: oslo-db
+ repo: upstream:openstack/oslo-db
+ ref: 3e6a30c396aa42ef0eccb5b3625af728d8d3f437
+ unpetrify-ref: 1.7.1
+ build-system: python-distutils
+ build-depends:
+ - alembic
+ - sqlalchemy
+ - sqlalchemy-migrate
+- name: glance_store
+ repo: upstream:openstack/glance_store.git
+ ref: ea88e503b617a7ac9a0ae7e537d6517e9992a104
+ unpetrify-ref: 0.4.0
+ build-system: python-distutils
+ build-depends:
+ - ordereddict
+ - oslo-concurrency
+- name: oslo-log
+ repo: upstream:openstack/oslo-log
+ ref: 54e3d0e705accfaa4c73a01fc2ea1480fcc0024e
+ unpetrify-ref: 1.0.0
+ build-system: python-distutils
+ build-depends:
+ - oslo-context
+- name: oslo-policy
+ repo: upstream:openstack/oslo-policy
+ ref: 4c8f38cd1d088c46be314b47f6774e721813c6d9
+ unpetrify-ref: 0.3.2
+ build-system: python-distutils
+- name: semantic-version
+ repo: upstream:python-packages/semantic-version
+ ref: 2174bdcae6e46f5f68f5b8ea984a695db9f41bcf
+ unpetrify-ref: v2.4.1
+ build-system: python-distutils
+- name: glance
+ morph: unmaintained/strata/openstack-services/glance.morph
+ repo: upstream:openstack/glance
+ ref: 93b0d5fce3a41e4a3a549f98f78b6681cbc3ea95
+ unpetrify-ref: 2015.1.0
+ build-depends:
+ - sqlalchemy
+ - anyjson
+ - routes
+ - sqlalchemy-migrate
+ - httplib2
+ - kombu
+ - keystonemiddleware
+ - wsme
+ - oslo-vmware
+ - oslo-concurrency
+ - oslo-context
+ - oslo-log
+ - oslo-policy
+ - paste
+ - oslo-db
+ - oslo-messaging
+ - retrying
+ - osprofiler
+ - ordereddict
+ - glance_store
+ - semantic-version
+ - taskflow
+ - posix-ipc-tarball
+- name: sqlparse
+ repo: upstream:python-packages/sqlparse
+ ref: 991e7348075accae6d08025212251af21e92e664
+ unpetrify-ref: 0.1.13
+ build-system: python-distutils
+- name: pysaml2
+ repo: upstream:python-packages/pysaml2.git
+ ref: 13ff5e8899300c9b359fa1bdfdb3d412be0d7356
+ unpetrify-ref: 2.4.0
+ build-system: python-distutils
+- name: keystone
+ morph: unmaintained/strata/openstack-services/keystone.morph
+ repo: upstream:openstack/keystone
+ ref: 5d3b31f9c3d34599ff8a83eeb7530fc6e0b1b67b
+ unpetrify-ref: 2015.1.0
+ build-depends:
+ - paste
+ - routes
+ - sqlalchemy
+ - sqlalchemy-migrate
+ - passlib
+ - keystonemiddleware
+ - oslo-concurrency
+ - oslo-messaging
+ - oslo-db
+ - oslo-log
+ - oslo-middleware
+ - oslo-policy
+ - oauthlib
+ - dogpile-cache
+ - pycadf
+ - posix-ipc-tarball
+ - pysaml2
+- name: neutron
+ morph: unmaintained/strata/openstack-services/neutron.morph
+ repo: upstream:openstack/neutron
+ ref: 7260e0e3fc2ea479e80e0962624aca7fd38a1f60
+ unpetrify-ref: 2015.1.0
+ build-depends:
+ - paste
+ - routes
+ - httplib2
+ - jsonrpclib
+ - keystonemiddleware
+ - sqlalchemy
+ - alembic
+ - retrying
+ - oslo-db
+ - oslo-messaging
+ - oslo-rootwrap
+ - oslo-concurrency
+ - oslo-context
+ - oslo-log
+ - oslo-middleware
+- name: wsgiref
+ repo: upstream:python-packages/wsgiref.git
+ ref: e8360785eef259394e13b2062407edc3c2cbc1e0
+ unpetrify-ref: baserock/master
+ build-system: python-distutils
+- name: rfc3986
+ repo: upstream:python-packages/python-rfc3986.git
+ ref: 9817ec3e47bca8fba9a7cac56d785e9d644f7473
+ unpetrify-ref: rfc3986-0.2.0
+ build-system: python-distutils
+- name: urwid
+ repo: upstream:python-packages/urwid
+ ref: 838839f7a300a774240d52f943aafd6ff44b2413
+ unpetrify-ref: release-1.3.0
+ build-system: python-distutils
+- name: configshell-fb
+ repo: upstream:python-packages/configshell-fb
+ ref: 8c151ccdd75956da60b2304417c41a60a2c28231
+ unpetrify-ref: v1.1.fb17
+ build-system: python-distutils
+- name: targetcli-fb
+ repo: upstream:python-packages/targetcli
+ ref: c62610f3c2da6b4d364028c18bcc7f0d3da54477
+ unpetrify-ref: v2.1.fb39
+ build-system: python-distutils
+ build-depends:
+ - configshell-fb
+ - rtslib-fb
+- name: sysfsutils
+ repo: upstream:sysfsutils
+ ref: 237bf36e664db92f95b75067bf0f246726993254
+ unpetrify-ref: sysfsutils-2_1_0
+ build-system: autotools
+- name: open-iscsi
+ morph: unmaintained/strata/openstack-services/open-iscsi.morph
+ repo: upstream:open-iscsi
+ ref: 8da14e6f9eeeb4fd03938d40fe1126fe0d110b68
+ unpetrify-ref: master
+- name: nova
+ morph: unmaintained/strata/openstack-services/nova.morph
+ repo: upstream:openstack/nova
+ ref: 8397b6464af520903f546ce4c6d51a2eb5b4c8a8
+ unpetrify-ref: 2015.1.0
+ build-depends:
+ - sqlalchemy
+ - keystonemiddleware
+ - routes
+ - paste
+ - sqlalchemy-migrate
+ - websockify
+ - oslo-db
+ - oslo-rootwrap
+ - oslo-messaging
+ - rfc3986
+ - oslo-concurrency
+ - oslo-context
+ - oslo-log
+ - oslo-messaging
+- name: cinder
+ morph: unmaintained/strata/openstack-services/cinder.morph
+ repo: upstream:openstack/cinder
+ ref: 5987bb2290f629e59b0bcced2f8fe22cdeb9cc6d
+ unpetrify-ref: 2015.1.0
+ build-depends:
+ - anyjson
+ - keystonemiddleware
+ - kombu
+ - oslo-concurrency
+ - oslo-context
+ - oslo-db
+ - oslo-log
+ - oslo-messaging
+ - oslo-middleware
+ - oslo-rootwrap
+ - osprofiler
+ - paste
+ - retrying
+ - routes
+ - taskflow
+ - rtslib-fb
+ - sqlalchemy
+ - sqlalchemy-migrate
+ - suds
+ - oslo-vmware
+- name: pymemcache
+ repo: upstream:python-packages/pymemcache
+ ref: 0646937c2bfebdb557ec2c01f0e42a9af79ad49d
+ unpetrify-ref: v1.2.9
+ build-system: python-distutils
+- name: sysv_ipc-tarball
+ repo: upstream:python-packages/sysv-ipc-tarball.git
+ ref: a77e3a63f004e6ee789fa05e4a5bbc333b1529f1
+ unpetrify-ref: sysv_ipc-0.6.8
+ build-system: python-distutils
+- name: redis-py
+ repo: upstream:python-packages/redis-py
+ ref: 4d0b0afe9c9a431ed50c3e9fb95a0aa88b1f1038
+ unpetrify-ref: 2.10.3
+ build-system: python-distutils
+- name: tooz
+ repo: upstream:python-packages/tooz
+ ref: 8086661f404e61c22f0dd1d07b57a864862a0869
+ unpetrify-ref: 0.13.2
+ build-system: python-distutils
+ build-depends:
+ - pymemcache
+ - msgpack-python
+ - retrying
+ - redis-py
+- name: kafka-python
+ repo: upstream:python-packages/kafka-python
+ ref: 8675c3e3e620df5ba9fd7e570c554b773429bd78
+ unpetrify-ref: v0.9.3
+ build-system: python-distutils
+- name: werkzeug
+ repo: upstream:python-packages/werkzeug
+ ref: 96e49709d627a7766077cff4c98ebf3cad868ceb
+ unpetrify-ref: v0.10.4
+ build-system: python-distutils
+- name: requests-aws
+ repo: upstream:python-packages/python-requests-aws
+ ref: 48fe401c78eb1b1048cd20e2d26015585a7986cb
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: ceilometer
+ repo: upstream:openstack/ceilometer
+ morph: unmaintained/strata/openstack-services/ceilometer.morph
+ ref: b0447ed8e7bee371bf7095c86e47d717abe89edc
+ unpetrify-ref: 2014.1.0
+ build-depends:
+ - retrying
+ - alembic
+ - croniter
+ - jsonpath-rw
+ - kafka-python
+ - keystonemiddleware
+ - msgpack-python
+ - oslo-context
+ - oslo-db
+ - oslo-concurrency
+ - oslo-policy
+ - oslo-rootwrap
+ - pecan
+ - posix-ipc-tarball
+ - oslo-messaging
+ - oslo-middleware
+ - pysnmp
+ - sqlalchemy
+ - sqlalchemy-migrate
+ - tooz
+ - werkzeug
+ - wsme
+ - requests-aws
+- name: django-openstack-auth
+ repo: upstream:openstack/django_openstack_auth
+ ref: 0e1f7b78277850634992a594132921efb83256e0
+ unpetrify-ref: 1.2.0
+ build-system: python-distutils
+- name: pint
+ repo: upstream:python-packages/pint
+ ref: e7e7de5ca2e1c19963be8a918369fb19186f9a73
+ unpetrify-ref: '0.6'
+ build-system: python-distutils
+- name: horizon
+ morph: unmaintained/strata/openstack-services/horizon.morph
+ repo: upstream:openstack/horizon
+ ref: b99cf48ff346494198fb9740495eacc14fa406bf
+ unpetrify-ref: 2015.1.0
+ build-depends:
+ - pint
+ - django-openstack-auth
+ - kombu
+ - oslo-concurrency
+- name: novnc
+ morph: unmaintained/strata/openstack-services/novnc.morph
+ repo: upstream:novnc
+ ref: 97be997f62d59c028fc45323b00e3b93fafe4eb4
+ unpetrify-ref: baserock/v0.5.1
+ submodules:
+ include/web-socket-js-project:
+ url: upstream:web-socket-js
+- name: pyserial
+ repo: upstream:python-packages/pyserial
+ ref: bcfc1ec2fdb9a8c9c867481d7673e85fe512e667
+ unpetrify-ref: release2_7
+ build-system: python-distutils
+- name: tempest-lib
+ repo: upstream:openstack/tempest-lib
+ ref: c307ffc525d896e2071319c8067aec805804f92b
+ unpetrify-ref: 0.5.0
+ build-system: python-distutils
+- name: tempest
+ morph: unmaintained/strata/openstack-services/tempest.morph
+ repo: upstream:openstack/tempest
+ ref: 26149b612d01ad605e4d0f41a2d67280c8088cda
+ unpetrify-ref: '4'
+ build-depends:
+ - tempest-lib
+- name: tftp-hpa
+ morph: unmaintained/strata/openstack-services/tftp-hpa.morph
+ repo: upstream:tftp-hpa
+ ref: 4faf178a509d8091b7ba1e1fa3d13bc68c5ff55f
+ unpetrify-ref: tftp-hpa-5.2
+- name: singledispatch
+ morph: unmaintained/strata/openstack-services/singledispatch.morph
+ repo: upstream:python-packages/singledispatch
+ ref: 92175ba65602a03086d2b1f770f45d88af93fc3e
+ unpetrify-ref: 3.4.0.3
+- name: pysendfile
+ morph: unmaintained/strata/openstack-services/pysendfile.morph
+ repo: upstream:python-packages/pysendfile
+ ref: 6775b2938ef74255239c8e08458369921297b311
+ unpetrify-ref: release-2.0.0
+- name: ironic
+ morph: unmaintained/strata/openstack-services/ironic.morph
+ repo: upstream:openstack/ironic
+ ref: dee609cb7976e9b3cc07c3d342a271c4a347f69f
+ unpetrify-ref: 2015.1.0
+ build-depends:
+ - sqlalchemy
+ - alembic
+ - sqlalchemy-migrate
+ - pysendfile
+ - websockify
+ - oslo-concurrency
+ - oslo-context
+ - oslo-db
+ - oslo-rootwrap
+ - oslo-policy
+ - pecan
+ - wsme
+ - keystonemiddleware
+ - oslo-messaging
+ - retrying
+ - posix-ipc-tarball
diff --git a/unmaintained/strata/openstack-services/ceilometer.morph b/unmaintained/strata/openstack-services/ceilometer.morph
new file mode 100644
index 00000000..f120ce9e
--- /dev/null
+++ b/unmaintained/strata/openstack-services/ceilometer.morph
@@ -0,0 +1,23 @@
+name: ceilometer
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+# Install the configuration files required to
+- mkdir -p "$DESTDIR"/etc/ceilometer
+- install -D -m 644 etc/ceilometer/*.json "$DESTDIR"/etc/ceilometer
+- install -D -m 644 etc/ceilometer/*.yaml "$DESTDIR"/etc/ceilometer
+- install -D -m 644 etc/ceilometer/api_paste.ini "$DESTDIR"/etc/ceilometer/api_paste.ini
+# Install rootwrap.conf
+- install -D -m 640 etc/ceilometer/rootwrap.conf "$DESTDIR"/etc/ceilometer/rootwrap.conf
+# Move rootwrap files to a proper location
+- mkdir -p "$DESTDIR"/etc/ceilometer/rootwrap.d
+- install -D -m 644 etc/ceilometer/rootwrap.d/* "$DESTDIR"/etc/ceilometer/rootwrap.d/
+# Add ceilometer to sudoers controlling which commands will run as a root
+# using the openstack rootwrap.
+- mkdir -p "$DESTDIR"/etc/sudoers.d
+- |
+ install -D -m 0440 /proc/self/fd/0 <<'EOF' "$DESTDIR"/etc/sudoers.d/ceilometer-rootwrap
+ Defaults:ceilometer !requiretty
+
+ ceilometer ALL=(root) NOPASSWD: /usr/bin/ceilometer-rootwrap /etc/ceilometer/rootwrap.conf *
+ EOF
diff --git a/unmaintained/strata/openstack-services/cinder.morph b/unmaintained/strata/openstack-services/cinder.morph
new file mode 100644
index 00000000..a0fc879f
--- /dev/null
+++ b/unmaintained/strata/openstack-services/cinder.morph
@@ -0,0 +1,21 @@
+name: cinder
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+# Install some default configuration files
+- install -D -m 644 etc/cinder/logging_sample.conf "$DESTDIR"/etc/cinder/logging.conf
+- install -D -m 644 etc/cinder/api-paste.ini "$DESTDIR"/etc/cinder/api-paste.ini
+- install -D -m 644 etc/cinder/policy.json "$DESTDIR"/etc/cinder/policy.json
+- install -D -m 640 etc/cinder/rootwrap.conf "$DESTDIR"/etc/cinder/rootwrap.conf
+# Move rootwrap files to a proper location
+- mkdir -p "$DESTDIR"/etc/cinder/rootwrap.d
+- install -D -m 644 etc/cinder/rootwrap.d/* "$DESTDIR"/etc/cinder/rootwrap.d/
+# Add cinder to sudoers controlling which commands will run as a root
+# using the openstack rootwrap.
+- mkdir -p "$DESTDIR"/etc/sudoers.d
+- |
+ install -D -m 0440 /proc/self/fd/0 <<'EOF' "$DESTDIR"/etc/sudoers.d/cinder-rootwrap
+ Defaults:cinder !requiretty
+
+ cinder ALL=(root) NOPASSWD: /usr/bin/cinder-rootwrap /etc/cinder/rootwrap.conf *
+ EOF
diff --git a/unmaintained/strata/openstack-services/erlang-sd_notify.morph b/unmaintained/strata/openstack-services/erlang-sd_notify.morph
new file mode 100644
index 00000000..dd3f66ca
--- /dev/null
+++ b/unmaintained/strata/openstack-services/erlang-sd_notify.morph
@@ -0,0 +1,8 @@
+name: erlang-sd_notify
+kind: chunk
+build-commands:
+- LDFLAGS=-lsystemd REBAR_FLAGS="--verbose 2" make
+install-commands:
+- install -D -m 644 -p ebin/sd_notify.app "$DESTDIR$PREFIX"/lib/erlang/lib/sd_notify-0.1/ebin/sd_notify.app
+- install -D -m 644 -p ebin/sd_notify.beam "$DESTDIR$PREFIX"/lib/erlang/lib/sd_notify-0.1/ebin/sd_notify.beam
+- install -D -m 755 -p priv/sd_notify_drv.so "$DESTDIR$PREFIX"/lib/erlang/lib/sd_notify-0.1/priv/sd_notify_drv.so
diff --git a/unmaintained/strata/openstack-services/glance.morph b/unmaintained/strata/openstack-services/glance.morph
new file mode 100644
index 00000000..3f81a505
--- /dev/null
+++ b/unmaintained/strata/openstack-services/glance.morph
@@ -0,0 +1,29 @@
+name: glance
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+# Install some default configuration files
+- mkdir -p "$DESTDIR"/etc/glance
+- install -m 644 etc/glance-api-paste.ini "$DESTDIR"/etc/glance/
+- install -m 644 etc/glance-registry-paste.ini "$DESTDIR"/etc/glance/
+- install -m 644 etc/glance-search-paste.ini "$DESTDIR"/etc/glance/
+- install -m 644 etc/policy.json "$DESTDIR"/etc/glance/
+- install -m 644 etc/schema-image.json "$DESTDIR"/etc/glance/
+- install -m 644 etc/search-policy.json "$DESTDIR"/etc/glance/
+# Install predefined namespaces for Glance Metadata Definitions
+# Catalog (see more info in its README)
+- cp -r etc/metadefs "$DESTDIR"/etc/glance/
+# Install conf files which are not modified by
+- install -m 644 etc/glance-scrubber.conf "$DESTDIR"/etc/glance/
+- install -m 644 etc/glance-cache.conf "$DESTDIR"/etc/glance/
+- install -m 644 etc/glance-search.conf "$DESTDIR"/etc/glance/
+- |
+ install -m 644 etc/glance-swift.conf.sample \
+ "$DESTDIR"/etc/glance/glance-swift.conf
+- install -m 644 etc/glance-manage.conf "$DESTDIR"/etc/glance/
+- |
+ install -m 644 etc/property-protections-policies.conf.sample \
+ "$DESTDIR"/etc/glance/property-protections-policies.conf
+- |
+ install -m 644 etc/property-protections-roles.conf.sample \
+ "$DESTDIR"/etc/glance/property-protections-roles.conf
diff --git a/unmaintained/strata/openstack-services/horizon.morph b/unmaintained/strata/openstack-services/horizon.morph
new file mode 100644
index 00000000..74930a1e
--- /dev/null
+++ b/unmaintained/strata/openstack-services/horizon.morph
@@ -0,0 +1,63 @@
+name: horizon
+kind: chunk
+configure-commands:
+# Remove unnecessary .mo files they will be generated
+# later during package build.
+- find . -name "django*.mo" -exec rm -f '{}' \;
+build-commands:
+# Compile message strings
+- cd horizon && django-admin.py compilemessages
+- cd openstack_dashboard && django-admin.py compilemessages
+- python setup.py build
+
+# Use the local_settings.py example to compile and compress the css, js, etc files.
+# This is a hack to make SECRET_KEY work.
+- |
+ cp openstack_dashboard/local/local_settings.py.example \
+ openstack_dashboard/local/local_settings.py
+# Collect the static files and compress them.
+- python manage.py collectstatic --noinput
+- python manage.py compress --force
+install-commands:
+# Install horizon in a temporary folder first, and then move things to the
+# right place in $DESTDIR
+- mkdir temproot
+- python setup.py install -O1 --skip-build --prefix "$PREFIX" --root temproot
+# Remove unnecessary .po files
+- find temproot -name django.po -exec rm '{}' \;
+- find temproot -name djangojs.po -exec rm '{}' \;
+
+# Move openstack_dashboard to /var/lib/horizon
+- mkdir -p "$DESTDIR"/var/lib/horizon/
+- |
+ mv temproot/"$PREFIX"/lib/python*/site-packages/openstack_dashboard \
+ "$DESTDIR"/var/lib/horizon/
+- cp manage.py "$DESTDIR"/var/lib/horizon/openstack_dashboard/
+
+# Copy the rest to $DESTDIR
+- cp -a temproot/* "$DESTDIR"
+
+# Copy local_settings to /etc/horizon/openstack_dashboard, so that they
+# can be modified, and link them where openstack_dashboard is installed.
+- mkdir -p "$DESTDIR"/etc/horizon/openstack_dashboard/
+- |
+ cp openstack_dashboard/local/local_settings.py.example \
+ "$DESTDIR"/etc/horizon/openstack_dashboard/local_settings.py
+# Set COMPRESS_OFFLINE=True
+- |
+ echo "COMPRESS_OFFLINE=True" >> \
+ "$DESTDIR"/etc/horizon/openstack_dashboard/local_settings.py
+
+- mkdir -p "$DESTDIR"/var/lib/horizon/openstack_dashboard/local
+- |
+ ln -sf /etc/horizon/openstack_dashboard/local_settings.py \
+ "$DESTDIR"/var/lib/horizon/openstack_dashboard/local/local_settings.py
+
+# Create the static directory (STATIC_ROOT) used in local_settings.py to keep
+# the static objects like css files.
+- mkdir -p "$DESTDIR"/var/lib/horizon/static
+# Copy the compressed static files to horizon.
+- cp -a static/* "$DESTDIR"/var/lib/horizon/static
+
+# Create the horizon document root for apache configuration
+- mkdir -p "$DESTDIR"/var/lib/horizon/.blackhole
diff --git a/unmaintained/strata/openstack-services/ipaddr-py.morph b/unmaintained/strata/openstack-services/ipaddr-py.morph
new file mode 100644
index 00000000..f6691ab7
--- /dev/null
+++ b/unmaintained/strata/openstack-services/ipaddr-py.morph
@@ -0,0 +1,6 @@
+name: ipaddr-py
+kind: chunk
+build-commands:
+- cd trunk && python setup.py build
+install-commands:
+- cd trunk && python setup.py install --prefix "$PREFIX" --root "$DESTDIR"
diff --git a/unmaintained/strata/openstack-services/ironic.morph b/unmaintained/strata/openstack-services/ironic.morph
new file mode 100644
index 00000000..8003dd17
--- /dev/null
+++ b/unmaintained/strata/openstack-services/ironic.morph
@@ -0,0 +1,18 @@
+name: ironic
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+- |
+ mkdir -p "$DESTDIR"/etc/ironic
+ install -m 644 etc/ironic/policy.json "$DESTDIR"/etc/ironic
+ install -m 644 etc/ironic/rootwrap.conf "$DESTDIR"/etc/ironic
+ mkdir -p "$DESTDIR"/etc/ironic/rootwrap.d
+ install -m 644 etc/ironic/rootwrap.d/* "$DESTDIR"/etc/ironic/rootwrap.d/
+
+ # Add ironic to sudoers controlling which commands will run as a root
+ # using the openstack rootwrap.
+ install -D -m 0440 /proc/self/fd/0 <<'EOF' "$DESTDIR"/etc/sudoers.d/ironic-rootwrap
+ Defaults:ironic !requiretty
+
+ ironic ALL=(root) NOPASSWD: /usr/bin/ironic-rootwrap /etc/ironic/rootwrap.conf *
+ EOF
diff --git a/unmaintained/strata/openstack-services/keystone.morph b/unmaintained/strata/openstack-services/keystone.morph
new file mode 100644
index 00000000..836b5d47
--- /dev/null
+++ b/unmaintained/strata/openstack-services/keystone.morph
@@ -0,0 +1,9 @@
+name: keystone
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+# Install some default configuration files
+- mkdir -p "$DESTDIR"/etc/keystone
+- install -m 644 etc/keystone-paste.ini "$DESTDIR"/etc/keystone/
+- install -m 644 etc/policy.json "$DESTDIR"/etc/keystone/
+- install -m 644 etc/logging.conf.sample "$DESTDIR"/etc/keystone/logging.conf
diff --git a/unmaintained/strata/openstack-services/librabbitmq.morph b/unmaintained/strata/openstack-services/librabbitmq.morph
new file mode 100644
index 00000000..b87ce369
--- /dev/null
+++ b/unmaintained/strata/openstack-services/librabbitmq.morph
@@ -0,0 +1,10 @@
+name: librabbitmq
+kind: chunk
+build-system: python-distutils
+configure-commands:
+- (cd rabbitmq-c; rm -rf codegen; ln -sf ../rabbitmq-codegen ./codegen)
+- (cd rabbitmq-c; autoreconf -fvi)
+- (cd rabbitmq-c; automake --add-missing)
+- (cd rabbitmq-c; ./configure --disable-tools --disable-docs)
+- (cd rabbitmq-c; make distdir)
+- mv rabbitmq-c/rabbitmq-c-0.5.3 clib
diff --git a/unmaintained/strata/openstack-services/neutron.morph b/unmaintained/strata/openstack-services/neutron.morph
new file mode 100644
index 00000000..6e203922
--- /dev/null
+++ b/unmaintained/strata/openstack-services/neutron.morph
@@ -0,0 +1,27 @@
+name: neutron
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+- |
+ # Move the configuration files to a proper location
+ mkdir "$DESTDIR"/etc
+ mv "$DESTDIR/$PREFIX"/etc/neutron "$DESTDIR"/etc
+
+ # Remove unused start/stop script
+ rm "$DESTDIR/$PREFIX"/etc/init.d/neutron-server
+
+ # Remove configuration files which will be added by Ansible
+ rm "$DESTDIR"/etc/neutron/neutron.conf
+ rm "$DESTDIR"/etc/neutron/metadata_agent.ini
+ rm "$DESTDIR"/etc/neutron/plugins/ml2/ml2_conf.ini
+ rm "$DESTDIR"/etc/neutron/dhcp_agent.ini
+ rm "$DESTDIR"/etc/neutron/l3_agent.ini
+
+ # Add neutron to sudoers controlling which commands is running as a
+ # root using the openstack rootwrap.
+ mkdir -p "$DESTDIR"/etc/sudoers.d
+ install -D -m 0440 /proc/self/fd/0 <<'EOF' "$DESTDIR"/etc/sudoers.d/neutron-rootwrap
+ Defaults:neutron !requiretty
+
+ neutron ALL=(root) NOPASSWD: /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf *
+ EOF
diff --git a/unmaintained/strata/openstack-services/nova.morph b/unmaintained/strata/openstack-services/nova.morph
new file mode 100644
index 00000000..e5a87daf
--- /dev/null
+++ b/unmaintained/strata/openstack-services/nova.morph
@@ -0,0 +1,24 @@
+name: nova
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+# Install some default configuration files
+- mkdir -p "$DESTDIR"/etc/nova
+- install -m 644 etc/nova/api-paste.ini "$DESTDIR"/etc/nova/
+- install -m 644 etc/nova/cells.json "$DESTDIR"/etc/nova/
+- install -m 644 etc/nova/logging_sample.conf "$DESTDIR"/etc/nova/logging.conf
+- install -m 644 etc/nova/policy.json "$DESTDIR"/etc/nova/
+# Install rootwrap.conf
+- install -m 640 etc/nova/rootwrap.conf "$DESTDIR"/etc/nova/rootwrap.conf
+# Move rootwrap files to a proper location
+- mkdir -p "$DESTDIR"/etc/nova/rootwrap.d
+- install -m 644 etc/nova/rootwrap.d/* "$DESTDIR"/etc/nova/rootwrap.d/
+# Add nova to sudoers controlling which commands will run as a root
+# using the openstack rootwrap.
+- mkdir -p "$DESTDIR"/etc/sudoers.d
+- |
+ install -D -m 0440 /proc/self/fd/0 <<'EOF' "$DESTDIR"/etc/sudoers.d/nova-rootwrap
+ Defaults:nova !requiretty
+
+ nova ALL=(root) NOPASSWD: /usr/bin/nova-rootwrap /etc/nova/rootwrap.conf *
+ EOF
diff --git a/unmaintained/strata/openstack-services/novnc.morph b/unmaintained/strata/openstack-services/novnc.morph
new file mode 100644
index 00000000..858320a0
--- /dev/null
+++ b/unmaintained/strata/openstack-services/novnc.morph
@@ -0,0 +1,11 @@
+name: novnc
+kind: chunk
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX"/share/novnc/utils
+- install -m 444 *html "$DESTDIR$PREFIX"/share/novnc
+- install -m 444 vnc.html "$DESTDIR$PREFIX"/share/novnc/index.html
+- mkdir -p "$DESTDIR$PREFIX"/share/novnc/include
+- install -m 444 include/*.* "$DESTDIR$PREFIX"/share/novnc/include
+- mkdir -p "$DESTDIR$PREFIX"/share/novnc/images
+- install -m 444 images/*.* "$DESTDIR$PREFIX"/share/novnc/images
+- install -d "$DESTDIR"/etc/sysconfig
diff --git a/unmaintained/strata/openstack-services/open-iscsi.morph b/unmaintained/strata/openstack-services/open-iscsi.morph
new file mode 100644
index 00000000..6a0b73b3
--- /dev/null
+++ b/unmaintained/strata/openstack-services/open-iscsi.morph
@@ -0,0 +1,46 @@
+name: open-iscsi
+kind: chunk
+build-commands:
+- make
+install-commands:
+# Rewrite prefix and exec_prefix which are set to "/usr" and "/" respectively
+- make prefix="$PREFIX" exec_prefix="$PREFIX" DESTDIR="$DESTDIR" install
+# Install iscsistart app which is not listed by default in PROGRAMS
+- make prefix="$PREFIX" exec_prefix="$PREFIX" DESTDIR="$DESTDIR" PROGRAMS="usr/iscsistart"
+ install
+post-install-commands:
+# Configure iscsi daemon
+# Point the startup to the installed binary
+- |
+ sed -i -e "s|iscsid.startup = \/sbin\/iscsid|iscsid.startup = "$PREFIX"/sbin/iscsid|" \
+ etc/iscsid.conf
+# Start up a session automatically
+- sed -i -e 's|node.startup = manual|node.startup = automatic|' etc/iscsid.conf
+# Install config file
+- install -D -m 644 etc/iscsid.conf "$DESTDIR"/etc/iscsi
+# Install custom systemd unit file
+- |
+ install -D -m 644 /proc/self/fd/0 << 'EOF' "$DESTDIR$PREFIX"/lib/systemd/system/iscsid.service
+ [Unit]
+ Description=Open iSCSI Daemon
+ After=network.target
+
+ [Service]
+ Type=forking
+ ExecStart=/usr/sbin/iscsid
+
+ [Install]
+ WantedBy=multi-user.target
+ EOF
+# Install iscsi socket unit
+- |
+ install -D -m 644 /proc/self/fd/0 << 'EOF' "$DESTDIR$PREFIX"/lib/systemd/system/iscsid.socket
+ [Unit]
+ Description=Open-iSCSI iscsid Socket
+
+ [Socket]
+ ListenStream=@ISCSIADM_ABSTRACT_NAMESPACE
+
+ [Install]
+ WantedBy=sockets.target
+ EOF
diff --git a/unmaintained/strata/openstack-services/pysendfile.morph b/unmaintained/strata/openstack-services/pysendfile.morph
new file mode 100644
index 00000000..2e2f809b
--- /dev/null
+++ b/unmaintained/strata/openstack-services/pysendfile.morph
@@ -0,0 +1,3 @@
+name: pysendfile
+kind: chunk
+build-system: python-distutils
diff --git a/unmaintained/strata/openstack-services/qpid-python.morph b/unmaintained/strata/openstack-services/qpid-python.morph
new file mode 100644
index 00000000..203b3db5
--- /dev/null
+++ b/unmaintained/strata/openstack-services/qpid-python.morph
@@ -0,0 +1,6 @@
+name: qpid-python
+kind: chunk
+build-commands:
+- cd qpid/python && python setup.py build
+install-commands:
+- cd qpid/python && python setup.py install --prefix "$PREFIX" --root "$DESTDIR"
diff --git a/unmaintained/strata/openstack-services/rabbitmq-codegen.morph b/unmaintained/strata/openstack-services/rabbitmq-codegen.morph
new file mode 100644
index 00000000..2b06aeb5
--- /dev/null
+++ b/unmaintained/strata/openstack-services/rabbitmq-codegen.morph
@@ -0,0 +1,7 @@
+name: rabbitmq-codegen
+kind: chunk
+configure-commands: []
+build-commands: []
+install-commands:
+- mkdir -p "$DESTDIR$PREFIX"/lib/rabbitmq-codegen
+- cp * "$DESTDIR$PREFIX"/lib/rabbitmq-codegen
diff --git a/unmaintained/strata/openstack-services/rabbitmq-server.morph b/unmaintained/strata/openstack-services/rabbitmq-server.morph
new file mode 100644
index 00000000..97b8a126
--- /dev/null
+++ b/unmaintained/strata/openstack-services/rabbitmq-server.morph
@@ -0,0 +1,16 @@
+name: rabbitmq-server
+kind: chunk
+configure-commands:
+- mkdir -p codegen
+- cp /usr/lib/rabbitmq-codegen/* codegen
+build-commands:
+- make
+install-commands:
+- |
+ make install_bin TARGET_DIR="$DESTDIR$PREFIX" \
+ SBIN_DIR="$DESTDIR$PREFIX"/sbin \
+ MAN_DIR="$PREFIX"/share/man \
+ DOC_INSTALL_DIR="$PREFIX"/share
+
+post-install-commands:
+- rm "$DESTDIR$PREFIX"/LICENSE* "$DESTDIR$PREFIX"/INSTALL
diff --git a/unmaintained/strata/openstack-services/rtslib-fb.morph b/unmaintained/strata/openstack-services/rtslib-fb.morph
new file mode 100644
index 00000000..26de3f9b
--- /dev/null
+++ b/unmaintained/strata/openstack-services/rtslib-fb.morph
@@ -0,0 +1,27 @@
+name: rtslib-fb
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+- mkdir -p "$DESTDIR$PREFIX"/lib/systemd/system
+
+# The following systemd unit is from the fedora package see
+# http://pkgs.fedoraproject.org/cgit/python-rtslib.git/tree/target.service for
+# more information
+
+- |
+ install -D -m 0644 /proc/self/fd/0 <<'EOF' "$DESTDIR$PREFIX"/lib/systemd/system/target.service
+ [Unit]
+ Description=Restore LIO kernel target configuration
+ Requires=sys-kernel-config.mount
+ After=sys-kernel-config.mount network.target local-fs.target
+
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+ ExecStart=/usr/bin/targetctl restore
+ ExecStop=/usr/bin/targetctl clear
+ SyslogIdentifier=target
+
+ [Install]
+ WantedBy=multi-user.target
+ EOF
diff --git a/unmaintained/strata/openstack-services/singledispatch.morph b/unmaintained/strata/openstack-services/singledispatch.morph
new file mode 100644
index 00000000..919c7096
--- /dev/null
+++ b/unmaintained/strata/openstack-services/singledispatch.morph
@@ -0,0 +1,3 @@
+name: singledispatch
+kind: chunk
+build-system: python-distutils
diff --git a/unmaintained/strata/openstack-services/tempest.morph b/unmaintained/strata/openstack-services/tempest.morph
new file mode 100644
index 00000000..cffb7d33
--- /dev/null
+++ b/unmaintained/strata/openstack-services/tempest.morph
@@ -0,0 +1,12 @@
+name: tempest
+kind: chunk
+build-system: python-distutils
+post-install-commands:
+# Install files and folders required to run tempest
+- mkdir -p "$DESTDIR"/etc/tempest
+- cp -r tempest "$DESTDIR"/etc/tempest/
+- cp -r tools "$DESTDIR"/etc/tempest/
+- cp setup.py tox.ini "$DESTDIR"/etc/tempest/
+- cp run_tests.sh run_tempest.sh "$DESTDIR"/etc/tempest/
+- cp .testr.conf "$DESTDIR"/etc/tempest/
+- cp etc/logging.conf.sample "$DESTDIR"/etc/tempest/logging.conf
diff --git a/unmaintained/strata/openstack-services/tftp-hpa.morph b/unmaintained/strata/openstack-services/tftp-hpa.morph
new file mode 100644
index 00000000..d466d2d4
--- /dev/null
+++ b/unmaintained/strata/openstack-services/tftp-hpa.morph
@@ -0,0 +1,5 @@
+name: tftp-hpa
+build-system: autotools
+kind: chunk
+install-commands:
+- make INSTALLROOT="$DESTDIR" install
diff --git a/unmaintained/strata/openstack-services/thrift.morph b/unmaintained/strata/openstack-services/thrift.morph
new file mode 100644
index 00000000..39062351
--- /dev/null
+++ b/unmaintained/strata/openstack-services/thrift.morph
@@ -0,0 +1,6 @@
+name: thrift
+kind: chunk
+build-system: autotools
+max-jobs: 1
+pre-configure-commands:
+- ./bootstrap.sh
diff --git a/unmaintained/strata/qt4-sdk.morph b/unmaintained/strata/qt4-sdk.morph
new file mode 100644
index 00000000..527c5f86
--- /dev/null
+++ b/unmaintained/strata/qt4-sdk.morph
@@ -0,0 +1,14 @@
+name: qt4-sdk
+kind: stratum
+description: Qt4 Desktop Environment, IDE and Example Apps
+build-depends:
+- morph: unmaintained/strata/qt4-tools.morph
+chunks:
+- name: qt-creator
+ morph: unmaintained/strata/qt4-sdk/qt-creator.morph
+ repo: upstream:qt-creator
+ ref: d5a6b10634c1a3271012e9578e016772ef077d59
+ unpetrify-ref: baserock/morph/2.7
+ submodules:
+ qbs:
+ url: upstream:qbs
diff --git a/unmaintained/strata/qt4-sdk/qt-creator.morph b/unmaintained/strata/qt4-sdk/qt-creator.morph
new file mode 100644
index 00000000..76d9f7d7
--- /dev/null
+++ b/unmaintained/strata/qt4-sdk/qt-creator.morph
@@ -0,0 +1,9 @@
+name: qt-creator
+kind: chunk
+configure-commands:
+- qmake
+build-commands:
+- make
+install-commands:
+- make install INSTALL_ROOT=$DESTDIR
+- ./qhelpgenerator.sh
diff --git a/unmaintained/strata/qt4-tools.morph b/unmaintained/strata/qt4-tools.morph
new file mode 100644
index 00000000..886e19af
--- /dev/null
+++ b/unmaintained/strata/qt4-tools.morph
@@ -0,0 +1,28 @@
+name: qt4-tools
+kind: stratum
+description: Qt4 Development Libraries and Tools
+build-depends:
+- morph: strata/icu-common.morph
+- morph: strata/tools.morph
+- morph: strata/x-generic.morph
+- morph: unmaintained/strata/multimedia-gstreamer-0.10.morph
+chunks:
+- name: ruby-1.8
+ morph: unmaintained/strata/qt4-tools/ruby-1.8.morph
+ repo: upstream:ruby
+ ref: 7a24f1710028d568ad61d0aa49d5178260178d77
+ unpetrify-ref: baserock/morph/ruby_1_8_7
+- name: ruby-1.9
+ morph: unmaintained/strata/qt4-tools/ruby-1.9.morph
+ repo: upstream:ruby
+ ref: cb3ea602294b5038b5f7ac21d3875a2b52342956
+ unpetrify-ref: baserock/morph/ruby_1_9_3
+ build-depends:
+ - ruby-1.8
+- name: qt4-tools
+ morph: unmaintained/strata/qt4-tools/qt4-tools.morph
+ repo: upstream:qt4-tools
+ ref: a182f020bc1703c20d86ba18f2f6b4ea8889de84
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - ruby-1.9
diff --git a/unmaintained/strata/qt4-tools/qt4-tools.morph b/unmaintained/strata/qt4-tools/qt4-tools.morph
new file mode 100644
index 00000000..bc4cc17e
--- /dev/null
+++ b/unmaintained/strata/qt4-tools/qt4-tools.morph
@@ -0,0 +1,18 @@
+name: qt4-tools
+kind: chunk
+max-jobs: 1
+configure-commands:
+- |
+ arch=$(uname -m)
+ if [ "${arch}" != "${arch//arm/}" ] ; then
+ sed 's/g++-unix.conf)/&\nQMAKE_CXXFLAGS += -fno-strict-volatile-bitfields/' \
+ -i mkspecs/linux-g++/qmake.conf
+ else
+ echo Running on x86, not modifying qmake.conf
+ fi
+- ./configure -v -prefix /usr -opensource -confirm-license
+build-commands:
+- make
+- LD_LIBRARY_PATH="$PWD"/lib QT_PLUGIN_PATH="$PWD"/plugins make docs
+install-commands:
+- make install INSTALL_ROOT="$DESTDIR"
diff --git a/unmaintained/strata/qt4-tools/ruby-1.8.morph b/unmaintained/strata/qt4-tools/ruby-1.8.morph
new file mode 100644
index 00000000..cee282c0
--- /dev/null
+++ b/unmaintained/strata/qt4-tools/ruby-1.8.morph
@@ -0,0 +1,9 @@
+name: ruby-1.8
+kind: chunk
+configure-commands:
+- autoconf
+- ./configure --prefix=/usr --program-suffix=-1.8
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/unmaintained/strata/qt4-tools/ruby-1.9.morph b/unmaintained/strata/qt4-tools/ruby-1.9.morph
new file mode 100644
index 00000000..bc697ada
--- /dev/null
+++ b/unmaintained/strata/qt4-tools/ruby-1.9.morph
@@ -0,0 +1,9 @@
+name: ruby-1.9
+kind: chunk
+configure-commands:
+- autoconf
+- ./configure --prefix=/usr --enable-shared --with-baseruby=/usr/bin/ruby-1.8
+build-commands:
+- make
+install-commands:
+- make DESTDIR="$DESTDIR" install
diff --git a/unmaintained/strata/test-tools.morph b/unmaintained/strata/test-tools.morph
new file mode 100644
index 00000000..fe47cd38
--- /dev/null
+++ b/unmaintained/strata/test-tools.morph
@@ -0,0 +1,133 @@
+name: test-tools
+kind: stratum
+description: Tools and frameworks used for testing
+build-depends:
+- morph: strata/python-common.morph
+chunks:
+- name: python-test-extras
+ repo: upstream:python-packages/python-test-extras.git
+ ref: cdeb596f01241e9c779332e86f6edcd0c2e8e9f0
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: check
+ repo: upstream:check
+ ref: 8c872aca6675e95fa47e7514e28fbdf25fce6170
+ unpetrify-ref: 0.9.8
+ build-system: autotools
+- name: cppunit
+ repo: upstream:cppunit
+ ref: 8133cf2b977f013216f0a41b6fcb740410d83926
+ unpetrify-ref: 1.13.2
+ build-system: autotools
+- name: testtools
+ repo: upstream:python-packages/testtools
+ ref: ee9946228ce5a03a84cf146027de0a8a9a46c4fe
+ unpetrify-ref: testools-1.1.0
+ build-system: python-distutils
+ build-depends:
+ - python-test-extras
+- name: subunit
+ morph: unmaintained/strata/test-tools/subunit.morph
+ repo: upstream:python-packages/subunit
+ ref: e18ffe65a3229d5c1d91be988405d40219db0887
+ unpetrify-ref: 0.0.21
+ build-depends:
+ - python-test-extras
+ - testtools
+ - check
+ - cppunit
+- name: fixtures
+ repo: upstream:python-packages/fixtures
+ ref: 9f9d89ce718463b24cd3910b9a99efb60b3c9e1b
+ unpetrify-ref: 0.3.16
+ build-system: python-distutils
+ build-depends:
+ - testtools
+- name: testrepository
+ repo: upstream:python-packages/testrepository
+ ref: 6419a3dcaabaf09eaf438c6d8d85c90eba7a2b91
+ unpetrify-ref: 0.0.19
+ build-system: python-distutils
+ build-depends:
+ - fixtures
+ - subunit
+ - testtools
+- name: testscenarios
+ repo: upstream:python-packages/testscenarios
+ ref: bccfaa71a2def5590161b6d1a247cf23c45a8b4d
+ unpetrify-ref: trunk
+ build-system: python-distutils
+ build-depends:
+ - testtools
+- name: mox
+ repo: upstream:python-packages/mox
+ ref: 160491d0384285698d726b1af21277f336107f51
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: mock
+ repo: upstream:python-packages/mock
+ ref: 35b35f7ad239005a950f870af57b44dbdc99d66b
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: oslotest
+ repo: upstream:openstack/oslotest
+ ref: cfdb562a6e07728570ca624a8c4faf3f5b61423b
+ unpetrify-ref: 1.2.0
+ build-system: python-distutils
+ build-depends:
+ - fixtures
+ - subunit
+ - testrepository
+ - testscenarios
+ - testtools
+ - mock
+ - mox
+- name: mox3
+ repo: upstream:python-packages/pymox
+ ref: 444fa40f4edb529efbffa2da8dbd97e9b8564b5c
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: mocker
+ repo: upstream:python-packages/mocker
+ ref: f7f87e4ac1c52342162cf2035f5fe3d273f8b07f
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: zake
+ repo: upstream:python-packages/zake
+ ref: 436bab3306aeec420f1281f34bd5d26d7f81038c
+ unpetrify-ref: 0.2.1
+ build-system: python-distutils
+ build-depends:
+ - testtools
+- name: nose
+ repo: upstream:python-packages/nose
+ ref: 08d134270b035dac3310cd877bb0fe9ab678303a
+ unpetrify-ref: release_1.3.4
+ build-system: python-distutils
+- name: beautifulsoup4
+ repo: upstream:python-packages/beautifulsoup4.git
+ ref: bcd7af0e9159d97aa511fb2d879424d1c1c5aadf
+ build-system: python-distutils
+- name: waitress
+ repo: upstream:python-packages/waitress.git
+ ref: b795d573a5a9e6e39b46a6e82da367a6a5db8dbd
+ unpetrify-ref: 0.8.9
+ build-system: python-distutils
+- name: webtest
+ repo: upstream:python-packages/webtest.git
+ ref: 6a24fba456d1c4ac2609b90f1fdc377c595608a4
+ unpetrify-ref: 2.0.16
+ build-system: python-distutils
+ build-depends:
+ - waitress
+ - beautifulsoup4
+- name: testresources
+ repo: upstream:python-packages/testresources
+ ref: ef938bcce0e436f9e9ffef932a898dc248a1d6ea
+ unpetrify-ref: 0.2.7
+ build-system: python-distutils
+ build-depends:
+ - testtools
+ - fixtures
+ - check
+ - cppunit
diff --git a/unmaintained/strata/test-tools/subunit.morph b/unmaintained/strata/test-tools/subunit.morph
new file mode 100644
index 00000000..0d3819ed
--- /dev/null
+++ b/unmaintained/strata/test-tools/subunit.morph
@@ -0,0 +1,3 @@
+name: subunit
+kind: chunk
+build-system: autotools
diff --git a/unmaintained/strata/virtualization.morph b/unmaintained/strata/virtualization.morph
new file mode 100644
index 00000000..d26dbeeb
--- /dev/null
+++ b/unmaintained/strata/virtualization.morph
@@ -0,0 +1,117 @@
+name: virtualization
+kind: stratum
+description: |
+ Virtualization for baserock
+ NOTE: this stratum requires kernel support, please see openstack bsp
+ kernel history to check which config are needed for openvswitch or libvirt,
+ for example.
+build-depends:
+- morph: strata/libsoup-common.morph
+- morph: strata/python2-core.morph
+- morph: strata/python-pygobject.morph
+- morph: strata/connman-common.morph
+- morph: unmaintained/strata/lvm.morph
+- morph: strata/xorg-util-macros-common.morph
+- morph: unmaintained/strata/networking-utils.morph
+- morph: strata/docutils.morph
+chunks:
+- name: yajl
+ morph: unmaintained/strata/virtualization/yajl.morph
+ repo: upstream:yajl
+ ref: 52fc681857228c65c1cb439782da485554875481
+ unpetrify-ref: baserock/morph
+- name: dnsmasq
+ morph: unmaintained/strata/virtualization/dnsmasq.morph
+ repo: upstream:dnsmasq
+ ref: 8471cd938ca41fbe4fee8ae3f657625c92cfb954
+ unpetrify-ref: baserock/morph
+- name: qemu
+ morph: unmaintained/strata/virtualization/qemu.morph
+ repo: upstream:qemu
+ ref: c5691f7ecb32cbe7a95b491314ce070e211fd97d
+ unpetrify-ref: baserock/v2.2.0
+ submodules:
+ roms/openbios:
+ url: upstream:qemu-openbios
+ dtc:
+ url: upstream:device-tree-compiler
+ roms/openhackware:
+ url: upstream:qemu-openhackware
+ roms/seabios:
+ url: upstream:qemu-seabios
+ roms/vgabios:
+ url: upstream:qemu-vgabios
+ roms/u-boot:
+ url: upstream:u-boot
+ roms/SLOF:
+ url: upstream:qemu-SLOF
+ roms/qemu-palcode:
+ url: upstream:qemu-palcode
+ roms/ipxe:
+ url: upstream:qemu-ipxe
+ roms/sgabios:
+ url: upstream:qemu-sgabios
+ pixman:
+ url: upstream:pixman
+- name: libpciaccess
+ repo: upstream:libpciaccess
+ ref: b9c068896914b4132a24839c9ef7f9fcd6282d88
+ unpetrify-ref: master
+ build-system: autotools
+- name: dmidecode
+ morph: unmaintained/strata/virtualization/dmidecode.morph
+ repo: upstream:dmidecode
+ ref: 47a0aa5d6696a83922ee70279b7253a4e55947d5
+ unpetrify-ref: master
+- name: libvirt
+ morph: unmaintained/strata/virtualization/libvirt.morph
+ repo: upstream:libvirt
+ ref: 7b1ceec1e2f141d36ed9b7ef3a660ff8bb34fc53
+ unpetrify-ref: baserock/v1.2.10
+ build-depends:
+ - libpciaccess
+ - dnsmasq
+ - qemu
+ - yajl
+ - dmidecode
+ submodules:
+ gnulib:
+ url: upstream:gnulib
+- name: pycurl
+ repo: upstream:pycurl
+ ref: 5ca370827d88817eeca3c56cbb37e4ddccc16c6e
+ unpetrify-ref: baserock/morph
+ build-system: python-distutils
+- name: urlgrabber
+ repo: upstream:urlgrabber
+ ref: bf0a0be71373dec515bbb54e0613a3b9b0c00b04
+ unpetrify-ref: master
+ build-system: python-distutils
+ build-depends:
+ - pycurl
+- name: libvirt-python
+ repo: upstream:libvirt-python
+ ref: 8e09c79a07b097a6ba9af83be4916fb9c9538500
+ unpetrify-ref: v1.2.10
+ build-system: python-distutils
+ build-depends:
+ - libvirt
+ - urlgrabber
+- name: libosinfo
+ morph: unmaintained/strata/virtualization/libosinfo.morph
+ repo: upstream:libosinfo
+ ref: a86c74c4d3f62bb0e315ab7fc78ec9f7746bdd12
+ unpetrify-ref: baserock/morph
+- name: virt-manager
+ repo: upstream:virt-manager
+ ref: 8b7ebd4538ffbd2d246fdeee4f1bb1c452585575
+ unpetrify-ref: v1.0.1
+ build-system: python-distutils
+ build-depends:
+ - libvirt-python
+ - libosinfo
+- name: openvswitch
+ morph: unmaintained/strata/virtualization/openvswitch.morph
+ repo: upstream:openvswitch
+ ref: a52b0492a4d0398a24ed2a3566ff55ac53fea31f
+ unpetrify-ref: master
diff --git a/unmaintained/strata/virtualization/dmidecode.morph b/unmaintained/strata/virtualization/dmidecode.morph
new file mode 100644
index 00000000..d9ab0fa3
--- /dev/null
+++ b/unmaintained/strata/virtualization/dmidecode.morph
@@ -0,0 +1,7 @@
+name: dmidecode
+kind: chunk
+build-system: manual
+build-commands:
+- make
+install-commands:
+- make install DESTDIR="$DESTDIR" prefix="$PREFIX"
diff --git a/unmaintained/strata/virtualization/dnsmasq.morph b/unmaintained/strata/virtualization/dnsmasq.morph
new file mode 100644
index 00000000..3f4c6c53
--- /dev/null
+++ b/unmaintained/strata/virtualization/dnsmasq.morph
@@ -0,0 +1,10 @@
+name: dnsmasq
+kind: chunk
+build-system: manual
+build-commands:
+- make
+- make -C contrib/wrt
+install-commands:
+- make install PREFIX="$PREFIX" DESTDIR="$DESTDIR"
+- install -D -m 755 contrib/wrt/dhcp_release "$DESTDIR$PREFIX"/bin/dhcp_release
+- install -D -m 755 contrib/wrt/dhcp_lease_time "$DESTDIR$PREFIX"/bin/dhcp_lease_time
diff --git a/unmaintained/strata/virtualization/libosinfo.morph b/unmaintained/strata/virtualization/libosinfo.morph
new file mode 100644
index 00000000..51b41b38
--- /dev/null
+++ b/unmaintained/strata/virtualization/libosinfo.morph
@@ -0,0 +1,11 @@
+name: libosinfo
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ ./autogen.sh --prefix="$PREFIX" \
+ --disable-gtk-doc \
+ --disable-tests \
+ --disable-vala \
+ --with-usb-ids-path=usb.ids --with-pci-ids-path=pci.ids \
+ --disable-werror
diff --git a/unmaintained/strata/virtualization/libvirt.morph b/unmaintained/strata/virtualization/libvirt.morph
new file mode 100644
index 00000000..1687213c
--- /dev/null
+++ b/unmaintained/strata/virtualization/libvirt.morph
@@ -0,0 +1,34 @@
+name: libvirt
+kind: chunk
+build-system: autotools
+configure-commands:
+- |
+ GNULIB_SRCDIR=.gnulib \
+ ./autogen.sh \
+ --without-apparmor --with-attr --without-audit --without-avahi --with-blkid \
+ --without-capng --with-curl --with-dbus --with-fuse --without-glusterfs \
+ --without-hal --without-netcf --without-numactl --without-openwsman \
+ --with-pciaccess --without-readline --without-sanlock --without-sasl \
+ --without-selinux --without-ssh2 --with-systemd-daemon --with-udev \
+ --with-yajl --without-xen --with-qemu --without-uml --without-openvz \
+ --without-vmware --without-phyp --without-xenapi --without-libxl \
+ --without-vbox --without-lxc --without-esx --without-hyperv \
+ --without-parallels --with-test --with-remote --with-libvirtd \
+ --with-init-script=systemd --without-bhyve --without-gnutls --without-polkit \
+ --without-firewalld --without-dtrace --without-numad --with-network \
+ --with-secrets --with-storage-dir --with-storage-fs --with-storage-lvm \
+ --without-storage-iscsi --without-storage-scsi --without-storage-mpath \
+ --without-storage-disk --with-storage-rbd --without-storage-sheepdog \
+ --without-storage-gluster --without-wireshark-dissector --disable-werror \
+ --prefix="$PREFIX"
+post-install-commands:
+# Don't autostart the default network created by libvirt
+- rm -f "$DESTDIR"/etc/libvirt/qemu/networks/autostart/default.xml
+system-integration:
+ libvirt-misc:
+ 01-addgroup:
+ - groupadd libvirt
+ 02-setup_libvirtconf:
+ - sed -i 's/#unix_sock_group = "libvirt"/unix_sock_group = "libvirt"/' /etc/libvirt/libvirtd.conf
+ - sed -i 's/#unix_sock_rw_perms = "0770"/unix_sock_rw_perms = "0770"/' /etc/libvirt/libvirtd.conf
+ - sed -i 's/#unix_sock_ro_perms = "0777"/unix_sock_ro_perms = "0777"/' /etc/libvirt/libvirtd.conf
diff --git a/unmaintained/strata/virtualization/openvswitch.morph b/unmaintained/strata/virtualization/openvswitch.morph
new file mode 100644
index 00000000..06480827
--- /dev/null
+++ b/unmaintained/strata/virtualization/openvswitch.morph
@@ -0,0 +1,11 @@
+name: openvswitch
+kind: chunk
+build-system: autotools
+pre-configure-commands:
+- ./boot.sh
+configure-commands:
+- |
+ ./configure --prefix="$PREFIX" \
+ --localstatedir=/var \
+ --sysconfdir=/etc \
+ --enable-ssl
diff --git a/unmaintained/strata/virtualization/qemu.morph b/unmaintained/strata/virtualization/qemu.morph
new file mode 100644
index 00000000..89067cd2
--- /dev/null
+++ b/unmaintained/strata/virtualization/qemu.morph
@@ -0,0 +1,5 @@
+name: qemu
+kind: chunk
+build-system: autotools
+configure-commands:
+- ./configure --prefix="$PREFIX" --disable-werror
diff --git a/unmaintained/strata/virtualization/yajl.morph b/unmaintained/strata/virtualization/yajl.morph
new file mode 100644
index 00000000..3fac99db
--- /dev/null
+++ b/unmaintained/strata/virtualization/yajl.morph
@@ -0,0 +1,8 @@
+name: yajl
+kind: chunk
+configure-commands:
+- ./configure -p "$PREFIX"
+build-commands:
+- make distro
+install-commands:
+- make install DESTDIR="$DESTDIR"
diff --git a/unmaintained/strata/webtools.morph b/unmaintained/strata/webtools.morph
new file mode 100644
index 00000000..d328fc3a
--- /dev/null
+++ b/unmaintained/strata/webtools.morph
@@ -0,0 +1,18 @@
+name: webtools
+kind: stratum
+description: web things
+build-depends:
+- morph: strata/icu-common.morph
+- morph: strata/tools.morph
+- morph: strata/pcre-utils.morph
+chunks:
+- name: libgit2
+ repo: upstream:libgit2
+ ref: 4b0a36e881506a02b43a4ae3c19c93c919b36eeb
+ unpetrify-ref: master
+ build-system: cmake
+- name: nginx
+ morph: unmaintained/strata/webtools/nginx.morph
+ repo: upstream:nginx
+ ref: 37a582c9ea3e731c115e560d31b26f78535b8fca
+ unpetrify-ref: baserock/v1.7.0
diff --git a/unmaintained/strata/webtools/nginx.morph b/unmaintained/strata/webtools/nginx.morph
new file mode 100644
index 00000000..6f7f04ae
--- /dev/null
+++ b/unmaintained/strata/webtools/nginx.morph
@@ -0,0 +1,14 @@
+name: nginx
+kind: chunk
+configure-commands:
+- |
+ ./configure --prefix=$PREFIX \
+ --conf-path=/etc/nginx/nginx.conf \
+ --pid-path=/etc/nginx/nginx.pid \
+ --error-log-path=/var/log/nginx/error.log \
+ --http-log-path=/var/log/nginx/access.log \
+ --with-http_ssl_module
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce.morph b/unmaintained/strata/xfce.morph
new file mode 100644
index 00000000..24a0fa6c
--- /dev/null
+++ b/unmaintained/strata/xfce.morph
@@ -0,0 +1,159 @@
+name: xfce
+kind: stratum
+description: xfce stratum
+build-depends:
+- morph: strata/gtk2.morph
+- morph: strata/sound-server-pulseaudio.morph
+chunks:
+- name: xfce-dev-tools
+ repo: upstream:xfce/xfce4-dev-tools
+ ref: 9244250ac0c15ba160688758c5dccf97f3f160ef
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: libxfce4util
+ morph: unmaintained/strata/xfce/libxfce4util.morph
+ repo: upstream:xfce/libxfce4util
+ ref: 5f56641e09b081f7d76d3feeee307589b21840c1
+ unpetrify-ref: libxfce4util-4.11.0
+ build-depends:
+ - xfce-dev-tools
+- name: xfconf
+ morph: unmaintained/strata/xfce/xfconf.morph
+ repo: upstream:xfce/xfconf
+ ref: e5261e292130c96b6e62a8c897b1cc85bbb786ac
+ unpetrify-ref: master
+ build-depends:
+ - xfce-dev-tools
+ - libxfce4util
+- name: libxfce4ui
+ morph: unmaintained/strata/xfce/libxfce4ui.morph
+ repo: upstream:xfce/libxfce4ui
+ ref: b9e6a57385ff6f0c15bbc637b76472211e3696b0
+ unpetrify-ref: libxfce4ui-4.11.2
+ build-depends:
+ - xfce-dev-tools
+ - libxfce4util
+ - xfconf
+- name: garcon
+ morph: unmaintained/strata/xfce/garcon.morph
+ repo: upstream:xfce/garcon
+ ref: 69ff09cf0a9ee3ff9518822614637dc2d4f89ce6
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - libxfce4util
+ - libxfce4ui
+- name: perl-uri
+ repo: upstream:libwww-perl/uri
+ ref: 3dd72ded7f043a4f6973781fe594722e2e95f491
+ unpetrify-ref: baserock/morph
+ build-system: cpan
+- name: exo
+ morph: unmaintained/strata/xfce/exo.morph
+ repo: upstream:xfce/exo
+ ref: b985c4b5c72ef116d55bbf746c16a05f26afc045
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - libxfce4util
+ - libxfce4ui
+ - perl-uri
+- name: libwnck
+ morph: unmaintained/strata/xfce/libwnck.morph
+ repo: upstream:libwnck
+ ref: 6792abcdf27aceba1012406d51606e84b065a526
+ unpetrify-ref: baserock/xfce-build
+- name: xfce4-panel
+ morph: unmaintained/strata/xfce/xfce4-panel.morph
+ repo: upstream:xfce/xfce4-panel
+ ref: 6ac8bfcb481781e8e23b101f5c5fdd70cf6d083b
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - libxfce4ui
+ - garcon
+ - exo
+ - libwnck
+- name: thunar
+ morph: unmaintained/strata/xfce/thunar.morph
+ repo: upstream:xfce/thunar
+ ref: 8289f48c200b91cc1e9932e13defb8e6a4765054
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - libxfce4ui
+ - exo
+ - garcon
+ - libwnck
+- name: xfce4-settings
+ morph: unmaintained/strata/xfce/xfce4-settings.morph
+ repo: upstream:xfce/xfce4-settings
+ ref: f04388fae30685b5038358674dec69406ba87f2c
+ unpetrify-ref: xfce4-settings-4.11.3
+ build-depends:
+ - xfce-dev-tools
+ - xfconf
+ - exo
+ - libxfce4ui
+ - garcon
+- name: iceauth
+ repo: upstream:iceauth
+ ref: c07d443d43e53cfe21b53a9a0eafcd6189432867
+ unpetrify-ref: baserock/morph
+ build-system: autotools
+- name: xfce4-session
+ morph: unmaintained/strata/xfce/xfce4-session.morph
+ repo: upstream:xfce/xfce4-session
+ ref: d4e20cbb9b1df864b502e9e8879a538f089fd5d2
+ unpetrify-ref: xfce4-session-4.11.1
+ build-depends:
+ - iceauth
+ - exo
+ - xfce-dev-tools
+ - libxfce4ui
+ - libwnck
+- name: gtk-xfce-engine-2
+ morph: unmaintained/strata/xfce/gtk-xfce-engine-2.morph
+ repo: upstream:xfce/gtk-xfce-engine
+ ref: ed44a71f1a4d76ae850483ece41638bb9a3e7781
+ unpetrify-ref: baserock/morph
+ build-depends:
+ - xfce-dev-tools
+- name: xfdesktop
+ morph: unmaintained/strata/xfce/xfdesktop.morph
+ repo: upstream:xfce/xfdesktop
+ ref: f32d76856e6eee9bc3d772b2fb6c2b8810ae63dc
+ unpetrify-ref: xfdesktop-4.11.8
+ build-depends:
+ - exo
+ - libxfce4ui
+ - xfconf
+ - libwnck
+- name: xfwm4
+ morph: unmaintained/strata/xfce/xfwm4.morph
+ repo: upstream:xfce/xfwm4
+ ref: f5c1c74e1436deff7f16ef92c98097ac3baae290
+ unpetrify-ref: xfwm4-4.11.3_plus_fallback_theme
+ build-depends:
+ - exo
+ - libxfce4util
+ - libxfce4ui
+ - xfconf
+ - libwnck
+- name: xfce4-appfinder
+ morph: unmaintained/strata/xfce/xfce4-appfinder.morph
+ repo: upstream:xfce/xfce4-appfinder
+ ref: 6c2bc7a09dd6e85bb78913cdc8af2292a9361e04
+ unpetrify-ref: xfce4-appfinder-4.11.0
+ build-depends:
+ - exo
+ - libxfce4ui
+ - garcon
+- name: tumbler
+ morph: unmaintained/strata/xfce/tumbler.morph
+ repo: upstream:xfce/tumbler
+ ref: 073c2080c79075fdf574064fa2098c4b5bb79a11
+ unpetrify-ref: tumbler-0.1.30
+ build-depends:
+ - xfce-dev-tools
+- name: elementary-xfce
+ morph: unmaintained/strata/xfce/elementary-xfce.morph
+ repo: upstream:elementary-xfce
+ ref: 9681d40e7a3545c96dfb1670e00514acfad5b089
+ unpetrify-ref: v0.5
diff --git a/unmaintained/strata/xfce/elementary-xfce.morph b/unmaintained/strata/xfce/elementary-xfce.morph
new file mode 100644
index 00000000..978cfdc4
--- /dev/null
+++ b/unmaintained/strata/xfce/elementary-xfce.morph
@@ -0,0 +1,10 @@
+name: elementary-xfce
+kind: chunk
+install-commands:
+- mkdir -p $DESTDIR/usr/share/icons/
+- cp -R elementary-xfce $DESTDIR/usr/share/icons/
+- cp -R elementary-xfce-* $DESTDIR/usr/share/icons/
+- gtk-update-icon-cache -t -f $DESTDIR/usr/share/icons/elementary-xfce
+- gtk-update-icon-cache -t -f $DESTDIR/usr/share/icons/elementary-xfce-dark
+- gtk-update-icon-cache -t -f $DESTDIR/usr/share/icons/elementary-xfce-darker
+- gtk-update-icon-cache -t -f $DESTDIR/usr/share/icons/elementary-xfce-darkest
diff --git a/unmaintained/strata/xfce/exo.morph b/unmaintained/strata/xfce/exo.morph
new file mode 100644
index 00000000..f5096213
--- /dev/null
+++ b/unmaintained/strata/xfce/exo.morph
@@ -0,0 +1,8 @@
+name: exo
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --enable-debug=yes
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce/garcon.morph b/unmaintained/strata/xfce/garcon.morph
new file mode 100644
index 00000000..569197ff
--- /dev/null
+++ b/unmaintained/strata/xfce/garcon.morph
@@ -0,0 +1,8 @@
+name: garcon
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --enable-debug=yes
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce/gtk-xfce-engine-2.morph b/unmaintained/strata/xfce/gtk-xfce-engine-2.morph
new file mode 100644
index 00000000..cf1c2530
--- /dev/null
+++ b/unmaintained/strata/xfce/gtk-xfce-engine-2.morph
@@ -0,0 +1,8 @@
+name: gtk-xfce-engine-2
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --enable-debug=yes
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce/libwnck.morph b/unmaintained/strata/xfce/libwnck.morph
new file mode 100644
index 00000000..bb8d7afa
--- /dev/null
+++ b/unmaintained/strata/xfce/libwnck.morph
@@ -0,0 +1,11 @@
+name: libwnck
+kind: chunk
+build-system: autotools
+configure-commands:
+- gdk-pixbuf-query-loaders > loader.cache
+- NOCONFIGURE=1 ./autogen.sh
+- ./configure --prefix="$PREFIX"
+build-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make
+install-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make install DESTDIR="$DESTDIR"
diff --git a/unmaintained/strata/xfce/libxfce4ui.morph b/unmaintained/strata/xfce/libxfce4ui.morph
new file mode 100644
index 00000000..5fbd342e
--- /dev/null
+++ b/unmaintained/strata/xfce/libxfce4ui.morph
@@ -0,0 +1,8 @@
+name: libxfce4ui
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix=${PREFIX}
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce/libxfce4util.morph b/unmaintained/strata/xfce/libxfce4util.morph
new file mode 100644
index 00000000..60a59126
--- /dev/null
+++ b/unmaintained/strata/xfce/libxfce4util.morph
@@ -0,0 +1,8 @@
+name: libxfce4util
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --enable-debug=yes
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce/thunar.morph b/unmaintained/strata/xfce/thunar.morph
new file mode 100644
index 00000000..51f76ac5
--- /dev/null
+++ b/unmaintained/strata/xfce/thunar.morph
@@ -0,0 +1,9 @@
+name: thunar
+kind: chunk
+configure-commands:
+- gdk-pixbuf-query-loaders > loader.cache
+- ./autogen.sh --prefix="$PREFIX" --enable-debug=yes
+build-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make
+install-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make install
diff --git a/unmaintained/strata/xfce/tumbler.morph b/unmaintained/strata/xfce/tumbler.morph
new file mode 100644
index 00000000..fe27a783
--- /dev/null
+++ b/unmaintained/strata/xfce/tumbler.morph
@@ -0,0 +1,8 @@
+name: tumbler
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --enable-debug=yes
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce/xfce4-appfinder.morph b/unmaintained/strata/xfce/xfce4-appfinder.morph
new file mode 100644
index 00000000..f8d1fcbe
--- /dev/null
+++ b/unmaintained/strata/xfce/xfce4-appfinder.morph
@@ -0,0 +1,8 @@
+name: xfce4-appfinder
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix=${PREFIX}
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce/xfce4-panel.morph b/unmaintained/strata/xfce/xfce4-panel.morph
new file mode 100644
index 00000000..fe85e172
--- /dev/null
+++ b/unmaintained/strata/xfce/xfce4-panel.morph
@@ -0,0 +1,8 @@
+name: xfce4-panel
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --enable-debug=yes
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce/xfce4-session.morph b/unmaintained/strata/xfce/xfce4-session.morph
new file mode 100644
index 00000000..87ffac22
--- /dev/null
+++ b/unmaintained/strata/xfce/xfce4-session.morph
@@ -0,0 +1,9 @@
+name: xfce4-session
+kind: chunk
+configure-commands:
+- gdk-pixbuf-query-loaders > loader.cache
+- ./autogen.sh --prefix="$PREFIX" --enable-debug=yes
+build-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make
+install-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make install
diff --git a/unmaintained/strata/xfce/xfce4-settings.morph b/unmaintained/strata/xfce/xfce4-settings.morph
new file mode 100644
index 00000000..6063dbc1
--- /dev/null
+++ b/unmaintained/strata/xfce/xfce4-settings.morph
@@ -0,0 +1,8 @@
+name: xfce4-settings
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --enable-debug=yes
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce/xfconf.morph b/unmaintained/strata/xfce/xfconf.morph
new file mode 100644
index 00000000..cfbe741b
--- /dev/null
+++ b/unmaintained/strata/xfce/xfconf.morph
@@ -0,0 +1,8 @@
+name: xfconf
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix=${PREFIX}
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce/xfdesktop.morph b/unmaintained/strata/xfce/xfdesktop.morph
new file mode 100644
index 00000000..4af5a905
--- /dev/null
+++ b/unmaintained/strata/xfce/xfdesktop.morph
@@ -0,0 +1,8 @@
+name: xfdesktop
+kind: chunk
+configure-commands:
+- ./autogen.sh --prefix="$PREFIX" --enable-debug=yes
+build-commands:
+- make
+install-commands:
+- make install
diff --git a/unmaintained/strata/xfce/xfwm4.morph b/unmaintained/strata/xfce/xfwm4.morph
new file mode 100644
index 00000000..0c4e2273
--- /dev/null
+++ b/unmaintained/strata/xfce/xfwm4.morph
@@ -0,0 +1,11 @@
+name: xfwm4
+kind: chunk
+configure-commands:
+- gdk-pixbuf-query-loaders > loader.cache
+- ./autogen.sh --prefix="$PREFIX" --enable-debug=yes
+build-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make
+install-commands:
+- GDK_PIXBUF_MODULE_FILE="$(pwd)/loader.cache" make install
+- install -m 0644 index.theme $DESTDIR/usr/share/icons/hicolor
+- gtk-update-icon-cache $DESTDIR/usr/share/icons/hicolor
diff --git a/unmaintained/strata/xstatic.morph b/unmaintained/strata/xstatic.morph
new file mode 100644
index 00000000..e396003b
--- /dev/null
+++ b/unmaintained/strata/xstatic.morph
@@ -0,0 +1,154 @@
+name: xstatic
+kind: stratum
+description: |
+ Stratum with Xstatic and some xstatic libraries.
+
+ XStatic is a packaging standard to package external static files as
+ a python package, so they are easily usable on all OSes.
+
+ This conflicts with the 'everything from Git' policy of Baserock,
+ but it is required right now for the Openstack system to work.
+build-depends:
+- morph: strata/foundation.morph
+- morph: strata/python2-core.morph
+chunks:
+- name: xstatic
+ repo: upstream:xstatic
+ ref: 6c8604a422ba7f176ce6b372a8e182c293d06fb2
+ unpetrify-ref: 1.0.1
+ build-system: python-distutils
+- name: xstatic-angular
+ repo: upstream:xstatic-packages/xstatic-angular
+ ref: dac047df05da5bb20de4e78876bc03820d0c6671
+ unpetrify-ref: 1.3.7.0
+ build-system: python-distutils
+- name: xstatic-angular-animate
+ repo: upstream:xstatic-packages/xstatic-angular-animate
+ ref: 91b9d3197f67213e4e35e9a35ba7196b898731e7
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-angular-bootstrap
+ repo: upstream:xstatic-packages/xstatic-angular-bootstrap
+ ref: b581edb6975175a564fd02766aef2f9043702c80
+ unpetrify-ref: 0.11.0.3
+ build-system: python-distutils
+- name: xstatic-angular-lrdragndrop
+ repo: upstream:xstatic-packages/xstatic-angular-lrdragndrop
+ ref: 55c7494492e6da2a6664aa00941864dd64589396
+ unpetrify-ref: 1.0.2.3
+ build-system: python-distutils
+- name: xstatic-angular-cookies
+ repo: upstream:xstatic-packages/xstatic-angular-cookies
+ ref: 66141a33ae7ad84b82ba9384a8101ae15ccd6da5
+ unpetrify-ref: 1.2.1.1
+ build-system: python-distutils
+- name: xstatic-angular-fileupload
+ repo: upstream:xstatic-packages/xstatic-angular-fileupload
+ ref: 04bcd774dae17cfff5e826fc0874f6403b4a6cae
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-angular-mock
+ repo: upstream:xstatic-packages/xstatic-angular-mock
+ ref: 20fdada109b167bcdcacec22986b43fdb42866f3
+ unpetrify-ref: 1.2.1.1
+ build-system: python-distutils
+- name: xstatic-angular-sanitize
+ repo: upstream:xstatic-packages/xstatic-angular-sanitize
+ ref: 9e0f03ada6fc00f8583903aeb6d9fc6516784999
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-angular-smart-table
+ repo: upstream:xstatic-packages/xstatic-angular-smart-table
+ ref: e0fbf69fb156b995547471d71c5c6a7f88989d47
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-bootstrap-datepicker
+ repo: upstream:xstatic-packages/xstatic-bootstrap-datepicker
+ ref: 60caf41e32d49f9bc715c39570f01449ebfbd37a
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-bootstrap-scss
+ repo: upstream:xstatic-packages/xstatic-bootstrap-scss
+ ref: d81b7b71c6c088406e90d1bdba0e10f0a304bbdc
+ unpetrify-ref: 3.1.1.1
+ build-system: python-distutils
+- name: xstatic-d3
+ repo: upstream:xstatic-packages/xstatic-d3
+ ref: 1e754e73c801fb9315995ffeb95ae51233c4fcaf
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-hogan
+ repo: upstream:xstatic-packages/xstatic-hogan
+ ref: 9e39977f6a6744810b08fa0323147e9f31dbd363
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-font-awesome
+ repo: upstream:xstatic-packages/xstatic-font-awesome
+ ref: c13aad1b95b1d84e73f2565a18a5a8e2bd2194a7
+ unpetrify-ref: 4.2.0.0
+ build-system: python-distutils
+- name: xstatic-jasmine
+ repo: upstream:xstatic-packages/xstatic-jasmine
+ ref: a55f5db1dbe59b23c7d6284250bf4eac1d0143c3
+ unpetrify-ref: 2.1.2.0
+ build-system: python-distutils
+- name: xstatic-jquery
+ repo: upstream:xstatic-packages/xstatic-jquery
+ ref: e91c5bf82535a62c1cfac61b5efb6b5c0157c1f5
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-jquery-bootstrap-wizard
+ repo: upstream:xstatic-packages/xstatic-jquery-bootstrap-wizard
+ ref: 07ae7e3a15b3af3d3d378d1f2412fe503ee42142
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-jquery-migrate
+ repo: upstream:xstatic-packages/xstatic-jquery-migrate
+ ref: 989b3b31106727542dd83810c3b952f90d8cdb8f
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-jquery-quicksearch
+ repo: upstream:xstatic-packages/xstatic-jquery-quicksearch
+ ref: f5221c8c30507340846d97d6db41a782e7c63316
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-jquery-tablesorter
+ repo: upstream:xstatic-packages/xstatic-jquery-tablesorter
+ ref: eb78328391f44a9a88033e1aede1a605902c5551
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-jquery-ui
+ repo: upstream:xstatic-packages/xstatic-jquery-ui
+ ref: b494369430dafd8ac4ddbe90efb9f8ad20a6e6d1
+ unpetrify-ref: 1.11.0.1
+ build-system: python-distutils
+- name: xstatic-magic-search
+ repo: upstream:xstatic-packages/xstatic-magic-search
+ ref: 60d6954a36e54afa1f925324e7b527d235bdb484
+ unpetrify-ref: 0.2.0.1
+ build-system: python-distutils
+- name: xstatic-jsencrypt
+ repo: upstream:xstatic-packages/xstatic-jsencrypt
+ ref: 5c0f088310ecd602e3aaf5e683385b0d27258409
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-qunit
+ repo: upstream:xstatic-packages/xstatic-qunit
+ ref: c3189eaa77c68c149a40b8c0afc8722cf394bd1f
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-rickshaw
+ repo: upstream:xstatic-packages/xstatic-rickshaw
+ ref: 6427ca5406852bc779d6918f487bb0fe3f063e77
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-spin
+ repo: upstream:xstatic-packages/xstatic-spin
+ ref: 74b4c0d0ff12db1f84787246857d5e925ff6883f
+ unpetrify-ref: master
+ build-system: python-distutils
+- name: xstatic-termjs
+ repo: upstream:xstatic-packages/xstatic-termjs
+ ref: a4ac0b809ab0d84c636a760215839bb6d68d0113
+ unpetrify-ref: master
+ build-system: python-distutils
diff --git a/unmaintained/strata/zookeeper-client.morph b/unmaintained/strata/zookeeper-client.morph
new file mode 100644
index 00000000..898cc98c
--- /dev/null
+++ b/unmaintained/strata/zookeeper-client.morph
@@ -0,0 +1,16 @@
+name: zookeeper-client
+kind: stratum
+description: |
+ This stratum installs a small demonstration program for the
+ client side of ZooKeeper. The program can take up to two
+ arguments:
+ (1) The IP address of the ZooKeeper server to connect to
+ (2) The type of client that this will be (default client
+ types are typeOneNode & typeTwoNode)
+build-depends:
+- morph: unmaintained/strata/zookeeper.morph
+chunks:
+- name: zookeeper-client
+ morph: unmaintained/strata/zookeeper/zookeeper-client.morph
+ repo: baserock:tests/zookeeper-test
+ ref: master
diff --git a/unmaintained/strata/zookeeper-server.morph b/unmaintained/strata/zookeeper-server.morph
new file mode 100644
index 00000000..61f71ba1
--- /dev/null
+++ b/unmaintained/strata/zookeeper-server.morph
@@ -0,0 +1,11 @@
+name: zookeeper-server
+kind: stratum
+description: This Stratum installs a zookeeper server and small program to populate
+ it with default data.
+build-depends:
+- morph: unmaintained/strata/zookeeper.morph
+chunks:
+- name: zookeeper-server
+ morph: unmaintained/strata/zookeeper/zookeeper-server.morph
+ repo: baserock:tests/zookeeper-test
+ ref: master
diff --git a/unmaintained/strata/zookeeper.morph b/unmaintained/strata/zookeeper.morph
new file mode 100644
index 00000000..2f3d0f6c
--- /dev/null
+++ b/unmaintained/strata/zookeeper.morph
@@ -0,0 +1,14 @@
+name: zookeeper
+kind: stratum
+description: |
+ This stratum installs zookeeper and its dependencies.
+build-depends:
+- morph: strata/core.morph
+- morph: unmaintained/strata/test-tools.morph
+- morph: unmaintained/strata/java.morph
+chunks:
+- name: zookeeper
+ morph: unmaintained/strata/zookeeper/zookeeper.morph
+ repo: upstream:zookeeper
+ ref: baserock/mikesmith/zookeeper
+ unpetrify-ref: trunk
diff --git a/unmaintained/strata/zookeeper/zookeeper-client.morph b/unmaintained/strata/zookeeper/zookeeper-client.morph
new file mode 100644
index 00000000..7bc99f08
--- /dev/null
+++ b/unmaintained/strata/zookeeper/zookeeper-client.morph
@@ -0,0 +1,17 @@
+name: zookeeper-client
+kind: chunk
+build-commands:
+- mkdir -p "$DESTDIR$PREFIX"/zookeeper-client
+- cp -r * "$DESTDIR$PREFIX"/zookeeper-client
+- make -C "$DESTDIR$PREFIX"/zookeeper-client/ZKTest/Release/
+post-install-commands:
+- |
+ install -D -m 644 /proc/self/fd/0 << 'EOF' "$DESTDIR"/etc/systemd/system/zookeeper-client.service
+ [unit]
+ Description=Zookeeper client init
+ [Service]
+ ExecStart=/usr/zookeeper-client/ZKTest/Release/ZKTest nodeTypeOne 10.24.1.198
+ RemainAfterExit=yes
+ [Install]
+ WantedBy=multi-user.target
+ EOF
diff --git a/unmaintained/strata/zookeeper/zookeeper-server.morph b/unmaintained/strata/zookeeper/zookeeper-server.morph
new file mode 100644
index 00000000..502bbda3
--- /dev/null
+++ b/unmaintained/strata/zookeeper/zookeeper-server.morph
@@ -0,0 +1,30 @@
+name: zookeeper-server
+kind: chunk
+build-commands:
+- mkdir -p "$DESTDIR$PREFIX"/zookeeper_server
+- cp -r * "$DESTDIR$PREFIX"/zookeeper_server
+- make -C "$DESTDIR$PREFIX"/zookeeper_server/zkServerFileSetup/Release/
+post-install-commands:
+- |
+ install -D -m 644 /proc/self/fd/0 << 'EOF' "$DESTDIR"/etc/systemd/system/zookeeper-server.service
+ [unit]
+ Description=Zookeeper server
+ [Service]
+ ExecStart=/usr/zookeeper/bin/zkServer.sh start
+ RemainAfterExit=yes
+ [Install]
+ WantedBy=multi-user.target
+ EOF
+- |
+ install -D -m 644 /proc/self/fd/0 << 'EOF' "$DESTDIR"/etc/systemd/system/zookeeper-init.service
+ [unit]
+ Description=Zookeeper server init
+ [Service]
+ ExecStart=/usr/zookeeper_server/zkServerFileSetup/Release/zkServerFileSetup
+ RemainAfterExit=no
+ [Install]
+ WantedBy=multi-user.target
+ EOF
+- mkdir "$DESTDIR"/etc/systemd/system/multi-user.target.wants
+- ln -s "$DESTDIR"/etc/systemd/system/zookeeper-server.service "$DESTDIR"/etc/systemd/system/multi-user.target.wants/zookeeper-server.service
+- ln -s "$DESTDIR"/etc/systemd/system/zookeeper-init.service "$DESTDIR"/etc/systemd/system/multi-user.target.wants/zookeeper-init.service
diff --git a/unmaintained/strata/zookeeper/zookeeper.morph b/unmaintained/strata/zookeeper/zookeeper.morph
new file mode 100644
index 00000000..db446a1b
--- /dev/null
+++ b/unmaintained/strata/zookeeper/zookeeper.morph
@@ -0,0 +1,14 @@
+name: zookeeper
+kind: chunk
+configure-commands:
+- mkdir -p "$DESTDIR$PREFIX"/lib/zookeeper
+build-commands:
+- ant -p compile_jute
+- mkdir -p "$DESTDIR$PREFIX"/zookeeper
+- cp -r * "$DESTDIR$PREFIX"/zookeeper
+- cd "$DESTDIR$PREFIX"/zookeeper/src/c && autoreconf -i
+- cd "$DESTDIR$PREFIX"/zookeeper/src/c && ./configure --prefix="$PREFIX" --libdir="$PREFIX"/lib/
+- make -C "$DESTDIR$PREFIX"/zookeeper/src/c
+- cd "$DESTDIR$PREFIX"/zookeeper/src/c && make install
+- mv "$DESTDIR$PREFIX"/zookeeper/conf/zoo_sample.cfg "$DESTDIR$PREFIX"/zookeeper/conf/zoo.cfg
+- make -C "$DESTDIR$PREFIX"/zookeeper/src/c zktest-mt
diff --git a/unmaintained/systems/ceph-service-x86_64-generic.morph b/unmaintained/systems/ceph-service-x86_64-generic.morph
new file mode 100644
index 00000000..ba48f0e6
--- /dev/null
+++ b/unmaintained/systems/ceph-service-x86_64-generic.morph
@@ -0,0 +1,70 @@
+name: ceph-service-x86_64-generic
+kind: system
+description: The set of strata required to have a minimal system for a 64-bit x86
+ system + the service daemons for ceph object, block and file storage.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: cpp-common-libs
+ morph: strata/cpp-common-libs.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: network-security
+ morph: strata/network-security.morph
+- name: ceph-service
+ morph: unmaintained/strata/ceph-service.morph
+- name: tools
+ morph: strata/tools.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: ntpd
+ morph: unmaintained/strata/ntpd.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: chef
+ morph: unmaintained/strata/chef.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/ceph
+- extensions/cloud-init
+- extensions/install-essential-files
diff --git a/unmaintained/systems/chef-system-x86_64-container.morph b/unmaintained/systems/chef-system-x86_64-container.morph
new file mode 100644
index 00000000..f9df4d9b
--- /dev/null
+++ b/unmaintained/systems/chef-system-x86_64-container.morph
@@ -0,0 +1,32 @@
+name: chef-system-x86_64-container
+kind: system
+arch: x86_64
+description: Minimal chef system suitable for running in a container
+configuration-extensions:
+- 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
+ artifacts:
+ - build-essential-minimal
+- name: core
+ morph: strata/core.morph
+ artifacts:
+ - core-openssl
+- name: foundation
+ morph: strata/foundation.morph
+ artifacts:
+ - foundation-runtime
+- name: ruby
+ morph: strata/ruby.morph
+ artifacts:
+ - ruby-runtime
+- name: chef
+ morph: unmaintained/strata/chef.morph
+ artifacts:
+ - chef-runtime
diff --git a/unmaintained/systems/cxmanage-system-x86_64-generic.morph b/unmaintained/systems/cxmanage-system-x86_64-generic.morph
new file mode 100644
index 00000000..cb384212
--- /dev/null
+++ b/unmaintained/systems/cxmanage-system-x86_64-generic.morph
@@ -0,0 +1,28 @@
+name: cxmanage-system-x86_64-generic
+kind: system
+description: A baserock development system with calxeda management tools added
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: cxmanage
+ morph: unmaintained/strata/cxmanage.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/fstab
+- extensions/install-essential-files
diff --git a/unmaintained/systems/java-build-system-x86_64-generic.morph b/unmaintained/systems/java-build-system-x86_64-generic.morph
new file mode 100644
index 00000000..2a26b7b1
--- /dev/null
+++ b/unmaintained/systems/java-build-system-x86_64-generic.morph
@@ -0,0 +1,90 @@
+name: java-build-system-x86_64-generic
+kind: system
+description: |
+ A superset of devel-system which can build OpenJDK.
+
+ There are instruction on using and testing java-build-system at:
+ https://wiki.baserock.org/Java.
+
+ For use on 64-bit Intel x86 computers.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: lorry
+ morph: strata/lorry.morph
+- name: baserock-import
+ morph: strata/baserock-import.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: swift
+ morph: strata/swift.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: x-generic
+ morph: strata/x-generic.morph
+- name: cups
+ morph: strata/cups.morph
+- name: java
+ morph: unmaintained/strata/java.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+configuration-extensions:
+- 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/unmaintained/systems/nodejs-system-x86_64.morph b/unmaintained/systems/nodejs-system-x86_64.morph
new file mode 100644
index 00000000..7fba330b
--- /dev/null
+++ b/unmaintained/systems/nodejs-system-x86_64.morph
@@ -0,0 +1,24 @@
+name: nodejs-system-x86_64
+kind: system
+description: A system that is able to build other systems based on the 64-bit x86
+ architecture.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/unmaintained/systems/ocaml-system-x86_64.morph b/unmaintained/systems/ocaml-system-x86_64.morph
new file mode 100644
index 00000000..03f91c1b
--- /dev/null
+++ b/unmaintained/systems/ocaml-system-x86_64.morph
@@ -0,0 +1,20 @@
+name: ocaml-system-x86_64
+kind: system
+description: OCaml base system
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: ocaml-language
+ morph: unmaintained/strata/ocaml-language.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
diff --git a/unmaintained/systems/openstack-system-x86_64.morph b/unmaintained/systems/openstack-system-x86_64.morph
new file mode 100644
index 00000000..32ffb629
--- /dev/null
+++ b/unmaintained/systems/openstack-system-x86_64.morph
@@ -0,0 +1,88 @@
+name: openstack-system-x86_64
+kind: system
+description: Openstack system in baserock for the x86_64 architecture
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: tools
+ morph: strata/tools.morph
+- name: cloudinit-support
+ morph: strata/cloudinit-support.morph
+- name: lvm
+ morph: unmaintained/strata/lvm.morph
+- name: virtualization
+ morph: unmaintained/strata/virtualization.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: networking-utils
+ morph: unmaintained/strata/networking-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: databases
+ morph: unmaintained/strata/databases.morph
+- name: erlang
+ morph: strata/erlang.morph
+- name: apache-httpd-server
+ morph: unmaintained/strata/apache-httpd-server.morph
+- name: django
+ morph: unmaintained/strata/django.morph
+- name: xstatic
+ morph: unmaintained/strata/xstatic.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+- name: openstack-clients
+ morph: strata/openstack-clients.morph
+- name: openstack-services
+ morph: unmaintained/strata/openstack-services.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: ntpd
+ morph: unmaintained/strata/ntpd.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: test-tools
+ morph: unmaintained/strata/test-tools.morph
+- name: swift
+ morph: strata/swift.morph
+- name: python-tools
+ morph: strata/python-tools.morph
+configuration-extensions:
+- 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/openstack-time
+- extensions/fstab
+- extensions/openstack-ironic
+- extensions/install-essential-files
diff --git a/unmaintained/systems/qt4-devel-system-x86_64-generic.morph b/unmaintained/systems/qt4-devel-system-x86_64-generic.morph
new file mode 100644
index 00000000..8022ec72
--- /dev/null
+++ b/unmaintained/systems/qt4-devel-system-x86_64-generic.morph
@@ -0,0 +1,52 @@
+name: qt4-devel-system-x86_64-generic
+kind: system
+description: A system that is able to build other systems based on the 64-bit x86
+ architecture.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer-0.10
+ morph: unmaintained/strata/multimedia-gstreamer-0.10.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: x-generic
+ morph: strata/x-generic.morph
+- name: qt4-tools
+ morph: unmaintained/strata/qt4-tools.morph
+- name: qt4-sdk
+ morph: unmaintained/strata/qt4-sdk.morph
+- name: lua51
+ morph: unmaintained/strata/lua51.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: connman-common
+ morph: strata/connman-common.morph
+- name: enlightenment
+ morph: unmaintained/strata/enlightenment.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/unmaintained/systems/qt5-devel-system-x86_64-generic.morph b/unmaintained/systems/qt5-devel-system-x86_64-generic.morph
new file mode 100644
index 00000000..38d2b0f8
--- /dev/null
+++ b/unmaintained/systems/qt5-devel-system-x86_64-generic.morph
@@ -0,0 +1,54 @@
+name: qt5-devel-system-x86_64-generic
+kind: system
+description: A system that is able to build other systems based on the 64-bit x86
+ architecture.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: x-generic
+ morph: strata/x-generic.morph
+- name: qt5-tools
+ morph: strata/qt5-tools.morph
+- name: qt5-tools-qtwebengine
+ morph: strata/qt5-tools-qtwebengine.morph
+- name: qt5-sdk
+ morph: strata/qt5-sdk.morph
+- name: lua51
+ morph: unmaintained/strata/lua51.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: connman-common
+ morph: strata/connman-common.morph
+- name: enlightenment
+ morph: unmaintained/strata/enlightenment.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/unmaintained/systems/swift-system-x86_64.morph b/unmaintained/systems/swift-system-x86_64.morph
new file mode 100644
index 00000000..442ead93
--- /dev/null
+++ b/unmaintained/systems/swift-system-x86_64.morph
@@ -0,0 +1,34 @@
+name: swift-system-x86_64
+kind: system
+description: A base system for deploying swift nodes
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: swift
+ morph: strata/swift.morph
+- name: ntpd
+ morph: unmaintained/strata/ntpd.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: python-common
+ morph: strata/python-common.morph
+- name: ansible
+ morph: strata/ansible.morph
+- name: openstack-common
+ morph: strata/openstack-common.morph
+configuration-extensions:
+- 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/unmaintained/systems/web-system-x86_64-generic.morph b/unmaintained/systems/web-system-x86_64-generic.morph
new file mode 100644
index 00000000..ec9fa254
--- /dev/null
+++ b/unmaintained/systems/web-system-x86_64-generic.morph
@@ -0,0 +1,43 @@
+name: web-system-x86_64-generic
+kind: system
+description: system with web tools
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: core
+ morph: strata/core.morph
+- name: tools
+ morph: strata/tools.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: nfs
+ morph: strata/nfs.morph
+- name: databases
+ morph: unmaintained/strata/databases.morph
+- name: lighttpd-server
+ morph: strata/lighttpd-server.morph
+- name: webtools
+ morph: unmaintained/strata/webtools.morph
+- name: erlang
+ morph: strata/erlang.morph
+- name: ruby
+ morph: strata/ruby.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: nodejs
+ morph: strata/nodejs.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/unmaintained/systems/xfce-system-x86_64.morph b/unmaintained/systems/xfce-system-x86_64.morph
new file mode 100644
index 00000000..8525a28c
--- /dev/null
+++ b/unmaintained/systems/xfce-system-x86_64.morph
@@ -0,0 +1,79 @@
+name: xfce-system-x86_64
+kind: system
+description: A system with the XFCE desktop
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: python2-core
+ morph: strata/python2-core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: connman-common
+ morph: strata/connman-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: x-generic
+ morph: strata/x-generic.morph
+- name: x-drivers
+ morph: strata/x-drivers.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: gtk-deps
+ morph: strata/gtk-deps.morph
+- name: gtk2
+ morph: strata/gtk2.morph
+- name: tools
+ morph: strata/tools.morph
+- name: devtools
+ morph: strata/devtools.morph
+- name: python-cliapp
+ morph: strata/python-cliapp.morph
+- name: python-pygobject
+ morph: strata/python-pygobject.morph
+- name: python-wsgi
+ morph: strata/python-wsgi.morph
+- name: libsoup-common
+ morph: strata/libsoup-common.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: ostree-core
+ morph: strata/ostree-core.morph
+- name: morph-utils
+ morph: strata/morph-utils.morph
+- name: xfce
+ morph: unmaintained/strata/xfce.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/unmaintained/systems/zookeeper-client-x86_64.morph b/unmaintained/systems/zookeeper-client-x86_64.morph
new file mode 100644
index 00000000..d08ec5f9
--- /dev/null
+++ b/unmaintained/systems/zookeeper-client-x86_64.morph
@@ -0,0 +1,30 @@
+name: zookeeper-client-x86_64
+kind: system
+description: |
+ A system that is able to build other systems based on the 64-bit x86
+ architecture. includes the installation of zookeeper and a test client.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: zookeeper
+ morph: unmaintained/strata/zookeeper.morph
+- name: zookeeper-client
+ morph: unmaintained/strata/zookeeper-client.morph
+- name: test-tools
+ morph: unmaintained/strata/test-tools.morph
+- name: java
+ morph: unmaintained/strata/java.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/unmaintained/systems/zookeeper-server-x86_64.morph b/unmaintained/systems/zookeeper-server-x86_64.morph
new file mode 100644
index 00000000..8b5062be
--- /dev/null
+++ b/unmaintained/systems/zookeeper-server-x86_64.morph
@@ -0,0 +1,30 @@
+name: zookeeper-server-x86_64
+kind: system
+description: |
+ A system that is able to build other systems based on the 64-bit x86
+ architecture. includes the zookeeper server and setup for basic tests
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: zookeeper
+ morph: unmaintained/strata/zookeeper.morph
+- name: zookeeper-server
+ morph: unmaintained/strata/zookeeper-server.morph
+- name: test-tools
+ morph: unmaintained/strata/test-tools.morph
+- name: java
+ morph: unmaintained/strata/java.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/simple-network
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/weston/clusters/weston-qt5-system-x86_64-deploy.morph b/weston/clusters/weston-qt5-system-x86_64-deploy.morph
new file mode 100644
index 00000000..51fda42b
--- /dev/null
+++ b/weston/clusters/weston-qt5-system-x86_64-deploy.morph
@@ -0,0 +1,23 @@
+name: weston-qt5-system-x86_64-deploy
+kind: cluster
+description: |
+ Deploy a stock weston system.
+
+ The resulting image can be copied to a USB and booted from there,
+ as well as in a virtual machine.
+
+systems:
+- morph: weston/systems/weston-qt5-system-x86_64.morph
+ deploy:
+ weston-qt5-system-x86_64:
+ type: extensions/rawdisk
+ location: /weston-qt5-system-x86_64.img
+ DISK_SIZE: 4G
+ KERNEL_ARGS: vga=788
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ initramfs:
+ type: initramfs
+ location: boot/initramfs.gz
diff --git a/weston/clusters/weston-system-x86_64-generic-deploy.morph b/weston/clusters/weston-system-x86_64-generic-deploy.morph
new file mode 100644
index 00000000..2428fddd
--- /dev/null
+++ b/weston/clusters/weston-system-x86_64-generic-deploy.morph
@@ -0,0 +1,23 @@
+name: weston-system-x86_64-generic-deploy
+kind: cluster
+description: |
+ Deploy a stock weston system.
+
+ The resulting image can be copied to a USB and booted from there,
+ as well as in a virtual machine.
+
+systems:
+- morph: weston/systems/weston-system-x86_64-generic.morph
+ deploy:
+ weston-system-x86_64-generic:
+ type: extensions/rawdisk
+ location: /weston-system-x86_64-generic.img
+ DISK_SIZE: 4G
+ KERNEL_ARGS: vga=788
+ INITRAMFS_PATH: boot/initramfs.gz
+ subsystems:
+ - morph: systems/initramfs-x86_64.morph
+ deploy:
+ initramfs:
+ type: extensions/initramfs
+ location: boot/initramfs.gz
diff --git a/weston/systems/weston-qt5-system-x86_64.morph b/weston/systems/weston-qt5-system-x86_64.morph
new file mode 100644
index 00000000..fe426265
--- /dev/null
+++ b/weston/systems/weston-qt5-system-x86_64.morph
@@ -0,0 +1,70 @@
+name: weston-qt5-system-x86_64.morph
+kind: system
+description: A system that is able to build other systems based on the 64-bit x86
+ architecture.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: llvm-common
+ morph: strata/llvm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: weston-common
+ morph: strata/weston-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: x-generic
+ morph: strata/x-generic.morph
+- name: qt5-tools
+ morph: strata/qt5-tools.morph
+- name: qt5-tools-qtmultimedia
+ morph: strata/qt5-tools-qtmultimedia.morph
+- name: qt5-tools-qtwebengine
+ morph: strata/qt5-tools-qtwebengine.morph
+- name: qt5-tools-qtwayland
+ morph: strata/qt5-tools-qtwayland.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: connman-common
+ morph: strata/connman-common.morph
+- name: icu-common
+ morph: strata/icu-common.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/weston/systems/weston-system-armv7lhf-jetson.morph b/weston/systems/weston-system-armv7lhf-jetson.morph
new file mode 100644
index 00000000..61b4d86c
--- /dev/null
+++ b/weston/systems/weston-system-armv7lhf-jetson.morph
@@ -0,0 +1,58 @@
+name: weston-system-armv7lhf-jetson
+kind: system
+description: A weston system for ARMv7 little-endian hard-float NVIDIA Jetson TK1
+ computers.
+arch: armv7lhf
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-jetson
+ morph: strata/bsp-jetson.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: llvm-common
+ morph: strata/llvm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: weston-common
+ morph: strata/weston-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: x-generic
+ morph: strata/x-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files
diff --git a/weston/systems/weston-system-x86_64-generic.morph b/weston/systems/weston-system-x86_64-generic.morph
new file mode 100644
index 00000000..d2ce28e7
--- /dev/null
+++ b/weston/systems/weston-system-x86_64-generic.morph
@@ -0,0 +1,57 @@
+name: weston-system-x86_64-generic
+kind: system
+description: A weston system for a 64-bit x86 system.
+arch: x86_64
+strata:
+- name: build-essential
+ morph: strata/build-essential.morph
+- name: core
+ morph: strata/core.morph
+- name: coreutils-common
+ morph: strata/coreutils-common.morph
+- name: device-management
+ morph: strata/device-management.morph
+- name: foundation
+ morph: strata/foundation.morph
+- name: bsp-x86_64-generic
+ morph: strata/bsp-x86_64-generic.morph
+- name: connectivity
+ morph: strata/connectivity.morph
+- name: bluetooth
+ morph: strata/bluetooth.morph
+- name: libdrm-common
+ morph: strata/libdrm-common.morph
+- name: multimedia-common
+ morph: strata/multimedia-common.morph
+- name: multimedia-gstreamer
+ morph: strata/multimedia-gstreamer.morph
+- name: wayland-generic
+ morph: strata/wayland-generic.morph
+- name: graphics-common
+ morph: strata/graphics-common.morph
+- name: input-common
+ morph: strata/input-common.morph
+- name: llvm-common
+ morph: strata/llvm-common.morph
+- name: mesa-common
+ morph: strata/mesa-common.morph
+- name: sound-server-pulseaudio
+ morph: strata/sound-server-pulseaudio.morph
+- name: weston-common
+ morph: strata/weston-common.morph
+- name: x-common
+ morph: strata/x-common.morph
+- name: x-generic
+ morph: strata/x-generic.morph
+- name: tools
+ morph: strata/tools.morph
+- name: glib-common
+ morph: strata/glib-common.morph
+- name: pcre-utils
+ morph: strata/pcre-utils.morph
+configuration-extensions:
+- extensions/set-hostname
+- extensions/add-config-files
+- extensions/nfsboot
+- extensions/install-files
+- extensions/install-essential-files