From af2db33a0ebab98700c3c03ea84a6ba9b987c5b5 Mon Sep 17 00:00:00 2001 From: Jonas Bjurel Date: Fri, 30 Sep 2016 20:28:22 +0200 Subject: [PATCH] Preparing the experimental branch for improved Danube CI/CD experiments Fast forwarded to commit:cf93e6ee11c96de090b04196cc96b4a6b0948928 Change-Id: I13d10d870e8ffc7317ab03f8810592d5b2205875 Signed-off-by: Jonas Bjurel --- INFO | 12 +- LICENSE.rst | 8 +- README | 10 + build/Makefile | 259 +++++++ build/README | 22 + build/add_opnfv_packages | 23 + build/apply_patches | 18 + build/cache.mk | 55 ++ build/cache.sh | 203 ++++++ build/check_dependencies.sh | 41 ++ build/config.mk | 41 ++ build/docker/Dockerfile | 43 ++ build/docker/Makefile | 42 ++ build/docker/README | 25 + build/docker/runcontext | 130 ++++ build/docker/ubuntu-builder/install_docker.sh | 36 + build/docker/ubuntu-builder/setcontext | 20 + build/f_isoroot/Makefile | 51 ++ build/f_isoroot/README | 16 + build/f_isoroot/cache.mk | 37 + build/f_isoroot/f_bgpvpn-pluginbuild/Makefile | 91 +++ build/f_isoroot/f_bgpvpn-pluginbuild/config.mk | 12 + build/f_isoroot/f_bootstrap/Makefile | 46 ++ build/f_isoroot/f_bootstrap/README | 24 + .../f_bootstrap/post-scripts/00_post_example.sh | 14 + .../f_bootstrap/post-scripts/03_install_repo.sh | 34 + .../f_bootstrap/pre-scripts/00_pre_example.sh | 14 + .../f_collectd-ceilometer-pluginbuild/Makefile | 91 +++ .../f_collectd-ceilometer-pluginbuild/config.mk | 13 + .../packages.yaml | 9 + build/f_isoroot/f_isolinux/Makefile | 49 ++ build/f_isoroot/f_kscfg/Makefile | 50 ++ build/f_isoroot/f_kscfg/README | 18 + build/f_isoroot/f_kscfg/ks.cfg.patch | 31 + build/f_isoroot/f_kvm-pluginbuild/Makefile | 92 +++ build/f_isoroot/f_kvm-pluginbuild/config.mk | 12 + build/f_isoroot/f_odlpluginbuild/Makefile | 82 +++ build/f_isoroot/f_odlpluginbuild/config.mk | 16 + build/f_isoroot/f_onosfwpluginbuild/Makefile | 90 +++ build/f_isoroot/f_onosfwpluginbuild/config.mk | 11 + .../f_isoroot/f_ovs-nsh-dpdk-pluginbuild/Makefile | 91 +++ .../f_isoroot/f_ovs-nsh-dpdk-pluginbuild/config.mk | 12 + build/f_isoroot/f_repobuild/Makefile | 91 +++ build/f_isoroot/f_repobuild/config.mk | 13 + .../f_isoroot/f_repobuild/fuel_bootstrap_cli.yaml | 75 ++ build/f_isoroot/f_repobuild/opnfv_mirror_conf.py | 57 ++ build/f_isoroot/f_repobuild/select_ubuntu_repo.sh | 40 + build/f_isoroot/f_vsperfpluginbuild/Makefile | 92 +++ build/f_isoroot/f_vsperfpluginbuild/config.mk | 12 + build/f_isoroot/f_yardstick-pluginbuild/Makefile | 92 +++ build/f_isoroot/f_yardstick-pluginbuild/config.mk | 13 + build/fuel_build_loop | 31 + build/install/apt-ftparchive-deb.conf | 35 + build/install/apt-ftparchive-release.conf | 18 + build/install/apt-ftparchive-udeb.conf | 33 + build/install/install.sh | 482 +++++++++++++ build/install/uninstall.sh | 79 ++ build/patch-packages/Makefile | 26 + build/patch-packages/tools/correct_deps | 78 ++ build/patch-packages/tools/deb_pack | 63 ++ build/patch-packages/tools/deb_unpack | 58 ++ build/patch-packages/tools/udeb_pack | 38 + build/patch-packages/tools/udeb_unpack | 58 ++ build/patch-packages/tr_example/Makefile | 30 + .../patch-repos/0010-bootstrap_admin_node.sh.patch | 83 +++ build/patch-repos/0020-isolinux.cfg.patch | 21 + .../0030-repo-multi-arch-local-mirrors.patch | 59 ++ ...ls-to-add-files-with-path-longer-then-240.patch | 24 + ...en-revoke-to-increase-keystone-performanc.patch | 44 ++ .../0001-Reduce-ceilometer-memory-usage.patch | 30 + ...ntel-82599-10-Gigabit-NIC-as-DPDK-capable.patch | 22 + build/repo_info.sh | 63 ++ build/select_closest_fuel_mirror.py | 35 + ci/README | 101 +++ ci/build.sh | 269 +++++++ ci/clean_cache.sh | 38 + ci/deploy.sh | 264 +++++++ deploy/README | 171 +++++ deploy/README.templater | 371 ++++++++++ deploy/__init__.py | 8 + deploy/cloud/configure_environment.py | 73 ++ deploy/cloud/configure_network.py | 69 ++ deploy/cloud/configure_nodes.py | 202 ++++++ deploy/cloud/configure_settings.py | 75 ++ deploy/cloud/deploy.py | 112 +++ deploy/cloud/deployment.py | 232 ++++++ deploy/common.py | 202 ++++++ deploy/config/dea_base.yaml | 801 +++++++++++++++++++++ .../default/fuel/config/dea-pod-override.yaml | 255 +++++++ .../devel-pipeline/default/fuel/config/dha.yaml | 109 +++ .../elx/fuel/config/dea-pod-override.yaml | 252 +++++++ .../labs/devel-pipeline/elx/fuel/config/dha.yaml | 110 +++ .../huawei-ch/fuel/config/dea-pod-override.yaml | 253 +++++++ .../devel-pipeline/huawei-ch/fuel/config/dha.yaml | 47 ++ .../intel-sc/fuel/config/dea-pod-override.yaml | 251 +++++++ .../devel-pipeline/intel-sc/fuel/config/dha.yaml | 110 +++ deploy/config/plugins/fuel-bgpvpn_0.0.1.yaml | 22 + deploy/config/plugins/fuel-bgpvpn_0.0.2.yaml | 31 + deploy/config/plugins/fuel-bgpvpn_0.0.3.yaml | 30 + deploy/config/plugins/fuel-bgpvpn_0.9.0.yaml | 30 + deploy/config/plugins/fuel-nfvkvm_0.0.1.yaml | 27 + deploy/config/plugins/fuel-nfvkvm_0.0.2.yaml | 34 + deploy/config/plugins/fuel-nfvkvm_0.9.0.yaml | 34 + deploy/config/plugins/fuel-nfvovs_0.0.1.yaml | 28 + deploy/config/plugins/fuel-nfvovs_0.0.2.yaml | 35 + deploy/config/plugins/fuel-nshovs_0.0.1.yaml | 44 ++ deploy/config/plugins/fuel-nshovs_0.9.0.yaml | 37 + deploy/config/plugins/fuel-odl_0.0.1.yaml | 91 +++ deploy/config/plugins/fuel-odl_0.0.2.yaml | 91 +++ deploy/config/plugins/fuel-odl_0.0.3.yaml | 117 +++ deploy/config/plugins/fuel-odl_0.9.0.yaml | 143 ++++ deploy/config/plugins/fuel-onos_0.0.1.yaml | 33 + deploy/config/plugins/fuel-onos_0.0.2.yaml | 33 + deploy/config/plugins/fuel-onos_0.0.3.yaml | 38 + deploy/dea.py | 105 +++ deploy/deploy-config.py | 467 ++++++++++++ deploy/deploy.py | 423 +++++++++++ deploy/deploy_env.py | 285 ++++++++ deploy/dha.py | 38 + deploy/dha_adapters/__init__.py | 8 + deploy/dha_adapters/amt_adapter.py | 100 +++ deploy/dha_adapters/hardware_adapter.py | 65 ++ deploy/dha_adapters/hp_adapter.py | 37 + deploy/dha_adapters/ipmi_adapter.py | 114 +++ deploy/dha_adapters/libvirt_adapter.py | 173 +++++ deploy/dha_adapters/zte_adapter.py | 32 + deploy/environments/__init__.py | 8 + deploy/environments/execution_environment.py | 100 +++ deploy/environments/libvirt_environment.py | 107 +++ deploy/environments/virtual_fuel.py | 143 ++++ deploy/execution_environment.py | 37 + deploy/fuel_patch/ks.cfg.patch | 19 + deploy/install_fuel_master.py | 222 ++++++ deploy/reap.py | 413 +++++++++++ deploy/scenario/README | 159 ++++ deploy/scenario/ha_heat_ceilometer_scenario.yaml | 86 +++ .../ha_nfv-kvm_heat_ceilometer_scenario.yaml | 173 +++++ .../ha_nfv-ovs_heat_ceilometer_scenario.yaml | 134 ++++ deploy/scenario/ha_odl-bgpvpn_scenario.yaml | 104 +++ .../ha_odl-l2_heat_ceilometer_scenario.yaml | 104 +++ .../ha_odl-l2_sfc_heat_ceilometer_scenario.yaml | 119 +++ .../ha_odl-l3_heat_ceilometer_scenario.yaml | 120 +++ ...ha_onos_nofeature_heat_ceilometer_scenario.yaml | 115 +++ .../ha_onos_sfc_heat_ceilometer_scenario.yaml | 95 +++ .../scenario/ha_vlan_heat_ceilometer_scenario.yaml | 129 ++++ .../scenario/no-ha_heat_ceilometer_scenario.yaml | 62 ++ .../no-ha_nfv-kvm_heat_ceilometer_scenario.yaml | 151 ++++ ...a_nfv-kvm_nfv-ovs_heat_ceilometer_scenario.yaml | 114 +++ .../no-ha_nfv-ovs_heat_ceilometer_scenario.yaml | 112 +++ deploy/scenario/no-ha_odl-bgpvpn_scenario.yaml | 81 +++ .../no-ha_odl-l2_heat_ceilometer_scenario.yaml | 82 +++ .../no-ha_odl-l2_sfc_heat_ceilometer_scenario.yaml | 98 +++ .../no-ha_odl-l3_heat_ceilometer_scenario.yaml | 97 +++ ...ha_onos_nofeature_heat_ceilometer_scenario.yaml | 93 +++ .../no-ha_onos_sfc_heat_ceilometer_scenario.yaml | 73 ++ .../no-ha_vlan_heat_ceilometer_scenario.yaml | 103 +++ deploy/scenario/scenario.yaml | 83 +++ deploy/ssh_client.py | 103 +++ deploy/templater.py | 204 ++++++ .../virtual_environment/noha/networks/fuel1.xml | 12 + .../virtual_environment/noha/networks/fuel2.xml | 5 + .../virtual_environment/noha/networks/fuel3.xml | 5 + .../virtual_environment/noha/networks/fuel4.xml | 12 + .../virtual_environment/noha/vms/compute.xml | 91 +++ .../virtual_environment/noha/vms/controller.xml | 91 +++ .../ericsson/virtual_environment/noha/vms/fuel.xml | 93 +++ .../vms/ericsson_montreal_lab/fuel.xml | 91 +++ deploy/templates/hardware_environment/vms/fuel.xml | 91 +++ .../virtual_environment/noha/networks/fuel1.xml | 12 + .../virtual_environment/noha/networks/fuel2.xml | 5 + .../virtual_environment/noha/networks/fuel3.xml | 5 + .../virtual_environment/noha/networks/fuel4.xml | 12 + .../intel/virtual_environment/noha/vms/compute.xml | 91 +++ .../virtual_environment/noha/vms/controller.xml | 91 +++ .../intel/virtual_environment/noha/vms/fuel.xml | 93 +++ deploy/templates/plugins/.gitkeep | 0 deploy/templates/templater/base_dea_template.yaml | 24 + .../virtual_environment/networks/fuel1.xml | 12 + .../virtual_environment/networks/fuel2.xml | 6 + .../virtual_environment/networks/fuel3.xml | 5 + .../virtual_environment/networks/fuel4.xml | 12 + .../templates/virtual_environment/vms/compute.xml | 67 ++ .../virtual_environment/vms/controller.xml | 64 ++ deploy/templates/virtual_environment/vms/fuel.xml | 64 ++ .../virtual_environment_noha/networks/fuel1.xml | 12 + .../virtual_environment_noha/networks/fuel2.xml | 5 + .../virtual_environment_noha/networks/fuel3.xml | 5 + .../virtual_environment_noha/networks/fuel4.xml | 12 + .../virtual_environment_noha/vms/compute.xml | 64 ++ .../virtual_environment_noha/vms/controller.xml | 64 ++ .../virtual_environment_noha/vms/fuel.xml | 65 ++ deploy/transplant_fuel_settings.py | 116 +++ docs/buildprocedure/build.instruction.rst | 305 ++++++++ docs/buildprocedure/index.rst | 16 + docs/conf.py | 28 + docs/installationprocedure/img/addnodes.png | Bin 0 -> 24089 bytes docs/installationprocedure/img/compute.png | Bin 0 -> 25978 bytes docs/installationprocedure/img/computelist.png | Bin 0 -> 67975 bytes docs/installationprocedure/img/fuelconsole1.png | Bin 0 -> 8269 bytes docs/installationprocedure/img/fuelmenu1.png | Bin 0 -> 9276 bytes docs/installationprocedure/img/fuelmenu2.png | Bin 0 -> 9774 bytes docs/installationprocedure/img/fuelmenu3.png | Bin 0 -> 9783 bytes docs/installationprocedure/img/fuelmenu4.png | Bin 0 -> 8843 bytes docs/installationprocedure/img/fuelmenu5.png | Bin 0 -> 20442 bytes docs/installationprocedure/img/fuelmenu6.png | Bin 0 -> 10322 bytes docs/installationprocedure/img/grub-1.png | Bin 0 -> 388991 bytes docs/installationprocedure/img/health.png | Bin 0 -> 51840 bytes docs/installationprocedure/img/interfaceconf.png | Bin 0 -> 25676 bytes docs/installationprocedure/img/interfaces.png | Bin 0 -> 58851 bytes docs/installationprocedure/img/network.png | Bin 0 -> 55423 bytes docs/installationprocedure/img/neutronl3.png | Bin 0 -> 40478 bytes docs/installationprocedure/img/newenv.png | Bin 0 -> 37483 bytes docs/installationprocedure/img/nodes.png | Bin 0 -> 9155 bytes docs/installationprocedure/img/offloadingmodes.png | Bin 0 -> 23017 bytes docs/installationprocedure/img/other.png | Bin 0 -> 41526 bytes docs/installationprocedure/img/plugin_install.png | Bin 0 -> 17431 bytes docs/installationprocedure/img/plugins.png | Bin 0 -> 52382 bytes docs/installationprocedure/img/verifynet.png | Bin 0 -> 33162 bytes docs/installationprocedure/index.rst | 15 + .../installation.instruction.rst | 691 ++++++++++++++++++ docs/releasenotes/index.rst | 16 + docs/releasenotes/release-notes.rst | 260 +++++++ onboarding.txt | 7 + prototypes/sfc_tacker/README | 54 ++ prototypes/sfc_tacker/poc.tacker-up.sh | 385 ++++++++++ 225 files changed, 18021 insertions(+), 5 deletions(-) create mode 100644 README create mode 100644 build/Makefile create mode 100644 build/README create mode 100644 build/add_opnfv_packages create mode 100644 build/apply_patches create mode 100644 build/cache.mk create mode 100755 build/cache.sh create mode 100755 build/check_dependencies.sh create mode 100644 build/config.mk create mode 100644 build/docker/Dockerfile create mode 100644 build/docker/Makefile create mode 100644 build/docker/README create mode 100755 build/docker/runcontext create mode 100755 build/docker/ubuntu-builder/install_docker.sh create mode 100755 build/docker/ubuntu-builder/setcontext create mode 100644 build/f_isoroot/Makefile create mode 100644 build/f_isoroot/README create mode 100644 build/f_isoroot/cache.mk create mode 100644 build/f_isoroot/f_bgpvpn-pluginbuild/Makefile create mode 100644 build/f_isoroot/f_bgpvpn-pluginbuild/config.mk create mode 100644 build/f_isoroot/f_bootstrap/Makefile create mode 100644 build/f_isoroot/f_bootstrap/README create mode 100755 build/f_isoroot/f_bootstrap/post-scripts/00_post_example.sh create mode 100755 build/f_isoroot/f_bootstrap/post-scripts/03_install_repo.sh create mode 100755 build/f_isoroot/f_bootstrap/pre-scripts/00_pre_example.sh create mode 100644 build/f_isoroot/f_collectd-ceilometer-pluginbuild/Makefile create mode 100644 build/f_isoroot/f_collectd-ceilometer-pluginbuild/config.mk create mode 100644 build/f_isoroot/f_collectd-ceilometer-pluginbuild/packages.yaml create mode 100644 build/f_isoroot/f_isolinux/Makefile create mode 100644 build/f_isoroot/f_kscfg/Makefile create mode 100644 build/f_isoroot/f_kscfg/README create mode 100644 build/f_isoroot/f_kscfg/ks.cfg.patch create mode 100644 build/f_isoroot/f_kvm-pluginbuild/Makefile create mode 100644 build/f_isoroot/f_kvm-pluginbuild/config.mk create mode 100644 build/f_isoroot/f_odlpluginbuild/Makefile create mode 100644 build/f_isoroot/f_odlpluginbuild/config.mk create mode 100644 build/f_isoroot/f_onosfwpluginbuild/Makefile create mode 100644 build/f_isoroot/f_onosfwpluginbuild/config.mk create mode 100644 build/f_isoroot/f_ovs-nsh-dpdk-pluginbuild/Makefile create mode 100644 build/f_isoroot/f_ovs-nsh-dpdk-pluginbuild/config.mk create mode 100644 build/f_isoroot/f_repobuild/Makefile create mode 100644 build/f_isoroot/f_repobuild/config.mk create mode 100644 build/f_isoroot/f_repobuild/fuel_bootstrap_cli.yaml create mode 100755 build/f_isoroot/f_repobuild/opnfv_mirror_conf.py create mode 100755 build/f_isoroot/f_repobuild/select_ubuntu_repo.sh create mode 100644 build/f_isoroot/f_vsperfpluginbuild/Makefile create mode 100644 build/f_isoroot/f_vsperfpluginbuild/config.mk create mode 100644 build/f_isoroot/f_yardstick-pluginbuild/Makefile create mode 100644 build/f_isoroot/f_yardstick-pluginbuild/config.mk create mode 100755 build/fuel_build_loop create mode 100644 build/install/apt-ftparchive-deb.conf create mode 100644 build/install/apt-ftparchive-release.conf create mode 100644 build/install/apt-ftparchive-udeb.conf create mode 100755 build/install/install.sh create mode 100755 build/install/uninstall.sh create mode 100644 build/patch-packages/Makefile create mode 100755 build/patch-packages/tools/correct_deps create mode 100755 build/patch-packages/tools/deb_pack create mode 100755 build/patch-packages/tools/deb_unpack create mode 100755 build/patch-packages/tools/udeb_pack create mode 100755 build/patch-packages/tools/udeb_unpack create mode 100644 build/patch-packages/tr_example/Makefile create mode 100644 build/patch-repos/0010-bootstrap_admin_node.sh.patch create mode 100644 build/patch-repos/0020-isolinux.cfg.patch create mode 100644 build/patch-repos/0030-repo-multi-arch-local-mirrors.patch create mode 100644 build/patch-repos/0040-xorriso-fails-to-add-files-with-path-longer-then-240.patch create mode 100644 build/patch-repos/build/repos/fuel-library/0001-Disable-token-revoke-to-increase-keystone-performanc.patch create mode 100644 build/patch-repos/build/repos/fuel-library/0001-Reduce-ceilometer-memory-usage.patch create mode 100644 build/patch-repos/build/repos/fuel-nailgun/0010-Mark-Intel-82599-10-Gigabit-NIC-as-DPDK-capable.patch create mode 100755 build/repo_info.sh create mode 100755 build/select_closest_fuel_mirror.py create mode 100644 ci/README create mode 100755 ci/build.sh create mode 100755 ci/clean_cache.sh create mode 100755 ci/deploy.sh create mode 100644 deploy/README create mode 100644 deploy/README.templater create mode 100644 deploy/__init__.py create mode 100644 deploy/cloud/configure_environment.py create mode 100644 deploy/cloud/configure_network.py create mode 100644 deploy/cloud/configure_nodes.py create mode 100644 deploy/cloud/configure_settings.py create mode 100644 deploy/cloud/deploy.py create mode 100644 deploy/cloud/deployment.py create mode 100644 deploy/common.py create mode 100644 deploy/config/dea_base.yaml create mode 100644 deploy/config/labs/devel-pipeline/default/fuel/config/dea-pod-override.yaml create mode 100644 deploy/config/labs/devel-pipeline/default/fuel/config/dha.yaml create mode 100644 deploy/config/labs/devel-pipeline/elx/fuel/config/dea-pod-override.yaml create mode 100644 deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml create mode 100644 deploy/config/labs/devel-pipeline/huawei-ch/fuel/config/dea-pod-override.yaml create mode 100644 deploy/config/labs/devel-pipeline/huawei-ch/fuel/config/dha.yaml create mode 100644 deploy/config/labs/devel-pipeline/intel-sc/fuel/config/dea-pod-override.yaml create mode 100644 deploy/config/labs/devel-pipeline/intel-sc/fuel/config/dha.yaml create mode 100644 deploy/config/plugins/fuel-bgpvpn_0.0.1.yaml create mode 100644 deploy/config/plugins/fuel-bgpvpn_0.0.2.yaml create mode 100644 deploy/config/plugins/fuel-bgpvpn_0.0.3.yaml create mode 100644 deploy/config/plugins/fuel-bgpvpn_0.9.0.yaml create mode 100644 deploy/config/plugins/fuel-nfvkvm_0.0.1.yaml create mode 100644 deploy/config/plugins/fuel-nfvkvm_0.0.2.yaml create mode 100644 deploy/config/plugins/fuel-nfvkvm_0.9.0.yaml create mode 100644 deploy/config/plugins/fuel-nfvovs_0.0.1.yaml create mode 100644 deploy/config/plugins/fuel-nfvovs_0.0.2.yaml create mode 100644 deploy/config/plugins/fuel-nshovs_0.0.1.yaml create mode 100644 deploy/config/plugins/fuel-nshovs_0.9.0.yaml create mode 100644 deploy/config/plugins/fuel-odl_0.0.1.yaml create mode 100644 deploy/config/plugins/fuel-odl_0.0.2.yaml create mode 100644 deploy/config/plugins/fuel-odl_0.0.3.yaml create mode 100644 deploy/config/plugins/fuel-odl_0.9.0.yaml create mode 100644 deploy/config/plugins/fuel-onos_0.0.1.yaml create mode 100644 deploy/config/plugins/fuel-onos_0.0.2.yaml create mode 100644 deploy/config/plugins/fuel-onos_0.0.3.yaml create mode 100644 deploy/dea.py create mode 100644 deploy/deploy-config.py create mode 100755 deploy/deploy.py create mode 100644 deploy/deploy_env.py create mode 100644 deploy/dha.py create mode 100644 deploy/dha_adapters/__init__.py create mode 100644 deploy/dha_adapters/amt_adapter.py create mode 100644 deploy/dha_adapters/hardware_adapter.py create mode 100644 deploy/dha_adapters/hp_adapter.py create mode 100644 deploy/dha_adapters/ipmi_adapter.py create mode 100644 deploy/dha_adapters/libvirt_adapter.py create mode 100644 deploy/dha_adapters/zte_adapter.py create mode 100644 deploy/environments/__init__.py create mode 100644 deploy/environments/execution_environment.py create mode 100644 deploy/environments/libvirt_environment.py create mode 100644 deploy/environments/virtual_fuel.py create mode 100644 deploy/execution_environment.py create mode 100644 deploy/fuel_patch/ks.cfg.patch create mode 100644 deploy/install_fuel_master.py create mode 100644 deploy/reap.py create mode 100644 deploy/scenario/README create mode 100644 deploy/scenario/ha_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/ha_nfv-kvm_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/ha_nfv-ovs_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/ha_odl-bgpvpn_scenario.yaml create mode 100644 deploy/scenario/ha_odl-l2_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/ha_odl-l2_sfc_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/ha_odl-l3_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/ha_onos_nofeature_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/ha_onos_sfc_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/ha_vlan_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/no-ha_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/no-ha_nfv-kvm_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/no-ha_nfv-kvm_nfv-ovs_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/no-ha_nfv-ovs_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/no-ha_odl-bgpvpn_scenario.yaml create mode 100644 deploy/scenario/no-ha_odl-l2_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/no-ha_odl-l2_sfc_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/no-ha_odl-l3_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/no-ha_onos_nofeature_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/no-ha_onos_sfc_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/no-ha_vlan_heat_ceilometer_scenario.yaml create mode 100644 deploy/scenario/scenario.yaml create mode 100644 deploy/ssh_client.py create mode 100755 deploy/templater.py create mode 100644 deploy/templates/ericsson/virtual_environment/noha/networks/fuel1.xml create mode 100644 deploy/templates/ericsson/virtual_environment/noha/networks/fuel2.xml create mode 100644 deploy/templates/ericsson/virtual_environment/noha/networks/fuel3.xml create mode 100644 deploy/templates/ericsson/virtual_environment/noha/networks/fuel4.xml create mode 100644 deploy/templates/ericsson/virtual_environment/noha/vms/compute.xml create mode 100644 deploy/templates/ericsson/virtual_environment/noha/vms/controller.xml create mode 100644 deploy/templates/ericsson/virtual_environment/noha/vms/fuel.xml create mode 100644 deploy/templates/hardware_environment/vms/ericsson_montreal_lab/fuel.xml create mode 100644 deploy/templates/hardware_environment/vms/fuel.xml create mode 100644 deploy/templates/intel/virtual_environment/noha/networks/fuel1.xml create mode 100644 deploy/templates/intel/virtual_environment/noha/networks/fuel2.xml create mode 100644 deploy/templates/intel/virtual_environment/noha/networks/fuel3.xml create mode 100644 deploy/templates/intel/virtual_environment/noha/networks/fuel4.xml create mode 100644 deploy/templates/intel/virtual_environment/noha/vms/compute.xml create mode 100644 deploy/templates/intel/virtual_environment/noha/vms/controller.xml create mode 100644 deploy/templates/intel/virtual_environment/noha/vms/fuel.xml create mode 100644 deploy/templates/plugins/.gitkeep create mode 100644 deploy/templates/templater/base_dea_template.yaml create mode 100644 deploy/templates/virtual_environment/networks/fuel1.xml create mode 100644 deploy/templates/virtual_environment/networks/fuel2.xml create mode 100644 deploy/templates/virtual_environment/networks/fuel3.xml create mode 100644 deploy/templates/virtual_environment/networks/fuel4.xml create mode 100644 deploy/templates/virtual_environment/vms/compute.xml create mode 100644 deploy/templates/virtual_environment/vms/controller.xml create mode 100644 deploy/templates/virtual_environment/vms/fuel.xml create mode 100644 deploy/templates/virtual_environment_noha/networks/fuel1.xml create mode 100644 deploy/templates/virtual_environment_noha/networks/fuel2.xml create mode 100644 deploy/templates/virtual_environment_noha/networks/fuel3.xml create mode 100644 deploy/templates/virtual_environment_noha/networks/fuel4.xml create mode 100644 deploy/templates/virtual_environment_noha/vms/compute.xml create mode 100644 deploy/templates/virtual_environment_noha/vms/controller.xml create mode 100644 deploy/templates/virtual_environment_noha/vms/fuel.xml create mode 100644 deploy/transplant_fuel_settings.py create mode 100644 docs/buildprocedure/build.instruction.rst create mode 100644 docs/buildprocedure/index.rst create mode 100644 docs/conf.py create mode 100644 docs/installationprocedure/img/addnodes.png create mode 100644 docs/installationprocedure/img/compute.png create mode 100644 docs/installationprocedure/img/computelist.png create mode 100644 docs/installationprocedure/img/fuelconsole1.png create mode 100644 docs/installationprocedure/img/fuelmenu1.png create mode 100644 docs/installationprocedure/img/fuelmenu2.png create mode 100644 docs/installationprocedure/img/fuelmenu3.png create mode 100644 docs/installationprocedure/img/fuelmenu4.png create mode 100644 docs/installationprocedure/img/fuelmenu5.png create mode 100644 docs/installationprocedure/img/fuelmenu6.png create mode 100644 docs/installationprocedure/img/grub-1.png create mode 100644 docs/installationprocedure/img/health.png create mode 100644 docs/installationprocedure/img/interfaceconf.png create mode 100644 docs/installationprocedure/img/interfaces.png create mode 100644 docs/installationprocedure/img/network.png create mode 100644 docs/installationprocedure/img/neutronl3.png create mode 100644 docs/installationprocedure/img/newenv.png create mode 100644 docs/installationprocedure/img/nodes.png create mode 100644 docs/installationprocedure/img/offloadingmodes.png create mode 100644 docs/installationprocedure/img/other.png create mode 100644 docs/installationprocedure/img/plugin_install.png create mode 100644 docs/installationprocedure/img/plugins.png create mode 100644 docs/installationprocedure/img/verifynet.png create mode 100644 docs/installationprocedure/index.rst create mode 100644 docs/installationprocedure/installation.instruction.rst create mode 100644 docs/releasenotes/index.rst create mode 100644 docs/releasenotes/release-notes.rst create mode 100644 prototypes/sfc_tacker/README create mode 100755 prototypes/sfc_tacker/poc.tacker-up.sh diff --git a/INFO b/INFO index 892db0756..37a1e3cf3 100644 --- a/INFO +++ b/INFO @@ -2,8 +2,8 @@ Project: Fuel based OPNFV installer (Fuel@OPNFV) Project Creation Date: 2015.07.07 Project Category: Integration and testing Lifecycle State: Incubation -Primary Contact: jonas.bjurel@ericsson.com -Project Lead: jonas.bjurel@ericsson.com +Primary Contact: gelkinbard@mirantis.com +Project Lead: gelkinbard@mirantis.com Jira Project Name: Fuel based OPNFV installer Jira Project Prefix: FUEL Mailing list tag: [fuel] @@ -11,12 +11,16 @@ IRC: Server:freenode.net Channel:#opnfv-fuel Repository: fuel Committers: +gelkinbard@mirantis.com +nikolas.hermanns@ericsson.com jonas.bjurel@ericsson.com stefan.k.berg@ericsson.com daniel.smith@ericsson.com -szilard.cserey@ericsson.com +szilard.cserey@gmail.com mskalski@mirantis.com ruijing.guo@intel.com +fzhadaev@mirantis.com +Alexandru.Avadanii@enea.com Link to TSC approval of the project: http://meetbot.opnfv.org/meetings/opnfv-meeting/2015/opnfv-meeting.2015-07-07-13.59.log.html -Link(s) to approval of additional committers: +Link(s) to approval of additional committers: http://ircbot.wl.linuxfoundation.org/meetings/opnfv-fuel/2016/opnfv-fuel.2016-04-28-11.49.html diff --git a/LICENSE.rst b/LICENSE.rst index efee103a7..67ef17d2a 100644 --- a/LICENSE.rst +++ b/LICENSE.rst @@ -1,4 +1,10 @@ -Copyright 2015 Open Platform for NFV Project, Inc. and its contributors +LICENSE +======= +This document is protected/licensed under the following conditions +(c) Jonas Bjurel (Ericsson AB) +Licensed under a Creative Commons Attribution 4.0 International License. +You should have received a copy of the license along with this work. +If not, see . Open Platform for NFV Project Software Licence ============================================== diff --git a/README b/README new file mode 100644 index 000000000..4629763a3 --- /dev/null +++ b/README @@ -0,0 +1,10 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + diff --git a/build/Makefile b/build/Makefile new file mode 100644 index 000000000..59d9096c6 --- /dev/null +++ b/build/Makefile @@ -0,0 +1,259 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +SHELL = /bin/bash + +# This file will be created if needed by runcontext to contain proxy +# settings. +-include environment.mk + +############################################################################ +# BEGIN of variables to customize +# +#Input args +export MOSVERSION = 9.0 +export ISOSRC = file:$(shell pwd)/fuel-$(MOSVERSION).iso +export ISOCACHE = $(shell pwd)/$(shell basename $(ISOSRC)) +export PRODNO = "OPNFV_FUEL" +export REVSTATE = "P0000" +export USER ?= $(shell whoami) +export BUILD_DATE = $(shell date --utc +%Y-%m-%d:%H:%M) +export OPNFV_GIT_SHA = $(shell git rev-parse HEAD) +# Store in /etc/fuel_build_id on fuel master +export BUILD_ID := $(PRODNO)_$(BUILD_DATE)_$(OPNFV_GIT_SHA) + +ifdef BUILD_FUEL_PLUGINS +$(warning Overriding plugin build selection to $(BUILD_FUEL_PLUGINS)) +export NEWISO = $(shell pwd)/release/unofficial-opnfv-${REVSTATE}.iso +else +export NEWISO = $(shell pwd)/release/opnfv-${REVSTATE}.iso +endif + +# Note! Invoke with "make REVSTATE=RXXXX all" to make release build! +# Invoke with ICOCACHE=/full/path/to/iso if cached ISO is in non-standard location. + +# Build variables +export BUILD_BASE := $(shell pwd) +export DEB_DEST := $(BUILD_BASE)/release/packages/ubuntu/pool/main +export UDEB_DEST := $(BUILD_BASE)/release/packages/ubuntu/pool/debian-installer +export PUPPET_DEST := $(BUILD_BASE)/release/puppet/modules +export VERSION_FILE := $(BUILD_BASE)/.versions +export DOCKERIMG = opnfv.org/ubuntu-builder:14.04 +export TOPDIR := $(shell pwd) +export REPOINFO := $(BUILD_BASE)/repo_info.sh + +# Use snapshots +# Use nearby repositories +export MIRROR_UBUNTU_URL := $(shell ./f_isoroot/f_repobuild/select_ubuntu_repo.sh --url) +export MIRROR_UBUNTU := $(shell echo "$(MIRROR_UBUNTU_URL)" | cut -d'/' -f3 ) +export MIRROR_UBUNTU_ROOT := $(shell echo -n '/' ; echo "$(MIRROR_UBUNTU_URL)" | cut -d'/' -f4-) + +export LATEST_MIRROR_ID_URL := http://$(shell ./select_closest_fuel_mirror.py) + +export MIRROR_MOS_UBUNTU ?= $(shell echo "$(LATEST_MIRROR_ID_URL)" | cut -d'/' -f3) +export LATEST_TARGET_UBUNTU := $(shell curl -sSf "$(MIRROR_MOS_UBUNTU)/mos-repos/ubuntu/$(MOSVERSION).target.txt" | head -1) +export MIRROR_MOS_UBUNTU_ROOT := /mos-repos/ubuntu/$(LATEST_TARGET_UBUNTU) + +export LATEST_TARGET_CENTOS := $(shell curl -sSf "$(LATEST_MIRROR_ID_URL)/mos-repos/centos/mos$(MOSVERSION)-centos7/os.target.txt" | head -1) +export MIRROR_FUEL := "$(LATEST_MIRROR_ID_URL)/mos-repos/centos/mos$(MOSVERSION)-centos7/$(LATEST_TARGET_CENTOS)/x86_64" + +# uncomment and use: make print-VARIABLE +#print-% : ; @echo $* = $($*) + +#Build subclasses + +SUBDIRS := f_isoroot + +# f_example is only an example of how to generate a .deb package and +# should not be enabled in official builds. +#SUBDIRS += f_example + +ORIGDIR := $(TOPDIR)/origiso +# +# END of variables to customize +############################################################################# + +# Fuel-main destination path and fuel-* submodule patching, for full list check: +# https://github.com/openstack/fuel-main/blob/stable/mitaka/repos.mk#L32-L44 +FUEL_MAIN_DIR := /tmp/fuel-main +FUEL_PATCHES := $(shell find $(BUILD_BASE)/patch-repos -name '*.patch' | sort) + +SUBCLEAN = $(addsuffix .clean,$(SUBDIRS)) + +.PHONY: all +all: + @docker version >/dev/null 2>&1 || (echo 'No Docker installation available'; exit 1) + @make -C docker + @lsb_release -a | grep Ubuntu > /dev/null 2>&1 || (echo 'Ubuntu is the only supported Linux distribution for this build system'; exit 1) + @KERNEL_VER=$$(uname -r); \ + KERNEL_ARRAY=($${KERNEL_VER//./ }); \ + if [ $${KERNEL_ARRAY[0]} -lt 3 ] || [[ $${KERNEL_ARRAY[0]} -eq 3 && $${KERNEL_ARRAY[1]} -lt 19 ]] ; then (echo 'Kernel version must be 3.19 or newer'; exit 1) ; fi + @docker/runcontext $(DOCKERIMG) wget -q www.google.com -O /dev/null || (echo 'No docker network connectivity or name server - check your network- and docker settings'; exit 1) + @docker/runcontext $(DOCKERIMG) $(MAKE) $(MAKEFLAGS) iso + + +############################################################################ +# BEGIN of Include definitions +# +include config.mk +include cache.mk +# +# END Include definitions +############################################################################# + +$(ISOCACHE): + # Clone Fuel to non-persistent location and build + sudo rm -rf $(FUEL_MAIN_DIR) + git clone $(FUEL_MAIN_REPO) $(FUEL_MAIN_DIR) + git -C $(FUEL_MAIN_DIR) checkout $(FUEL_MAIN_TAG) + @echo "fuel" `git -C $(FUEL_MAIN_DIR) rev-parse HEAD` >> $(VERSION_FILE) + # Remove Docker optimizations, otherwise multistrap will fail during + # Fuel build. + sudo rm -f /etc/apt/apt.conf.d/docker* + # + # Need to replace the old Docker v. 1.5.0 with a later version to be + # able to access the Docker remote repository! + sudo apt-get install apt-transport-https ca-certificates -y + sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D + echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list + sudo apt-get update -y + sudo apt-get install docker-engine -y + sudo sh -c 'echo DOCKER_OPTS=\"--bip 172.45.0.1/24\" > /etc/default/docker' + sudo service docker stop || exit 0 + sudo service docker start + + cd $(FUEL_MAIN_DIR) && ./prepare-build-env.sh + # Verify that Docker is alive + sudo docker info + # fuel-main Makefiles do not like `make -C` + cd $(FUEL_MAIN_DIR) && make repos + $(REPOINFO) -r $(FUEL_MAIN_DIR) > gitinfo_fuel.txt + # OPNFV patches at Fuel build time + # Need to be commited in order for them to be considered by the Fuel + # build system + $(foreach patch,$(FUEL_PATCHES),git \ + -C $(subst $(BUILD_BASE)/patch-repos,$(FUEL_MAIN_DIR),$(dir $(patch))) \ + am --whitespace=nowarn --committer-date-is-author-date $(patch) || \ + (echo 'Error: Failed patching Fuel repos!' ; exit 1);) + + # Repeat build up to three times + sudo -E ./fuel_build_loop + cp $(FUEL_MAIN_DIR)/build/artifacts/fuel*.iso . + # Store artifact in cache straight away if caching is enabled + # (no .cacheid will be present unless this is a cached build) + test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0 + +.PHONY: mount-origiso umount-origiso +mount-origiso: $(ISOCACHE) + @echo "Mounting original ISO in $(ORIGDIR)" + @mkdir -p $(ORIGDIR) + @fuseiso $(ISOCACHE) $(ORIGDIR) + +umount-origiso: + @echo "Unmounting original ISO from $(ORIGDIR)" + @fusermount -u $(ORIGDIR) + @rmdir $(ORIGDIR) + +.PHONY: $(SUBDIRS) +$(SUBDIRS): + @mkdir -p release/packages/ubuntu/pool/main release/packages/ubuntu/pool/debian-installer release/puppet/modules release/isoroot + $(MAKE) -C $@ -f Makefile release + +.PHONY: patch-packages +patch-packages: + ORIGISO=$(ISOCACHE) REVSTATE=$(REVSTATE) $(MAKE) -C $@ -f Makefile release + +.PHONY: clean $(SUBCLEAN) +clean: $(SUBCLEAN) + $(MAKE) -C patch-packages -f Makefile clean + @rm -f *.iso + @rm -Rf release + @rm -Rf newiso + @rm -Rf .versions + @rm -f $(NEWISO) + @rm -f $(BUILD_BASE)/gitinfo_*.txt + +.PHONY: deepclean +deepclean: clean clean-cache + make -C docker clean + docker rmi opnfv.org/ubuntu-builder:14.04 &>/dev/null || exit 0 + docker rmi opnfv.org/ubuntu-builder:latest &>/dev/null || exit 0 + docker rmi ubuntu:14.04 &>/dev/null || exit 0 + @if docker images | grep -q "ubuntu *14.04"; then \ + echo "Error: ubuntu:14.04 still present!"; \ + exit 1; \ + fi + @if docker images | grep -q "opnfv.org/ubuntu-builder"; then \ + echo "Error: opnfv.org/ubuntu-builder still present!"; \ + exit 1; \ + fi + +$(SUBCLEAN): %.clean: + $(MAKE) -C $* -f Makefile clean + +.PHONY: setup-env +setup-env: + @if [ -f environment.mk ]; then \ + sudo bash -c "cat environment.mk >> /etc/environment"; \ + fi + +# Todo: Make things smarter - we shouldn't need to clean everything +# betwen make invocations. +.PHONY: iso +iso: setup-env $(ISOCACHE) $(SUBDIRS) patch-packages + $(REPOINFO) . > gitinfo_main.txt + install/install.sh iso $(ISOCACHE) $(NEWISO) $(PRODNO) $(REVSTATE) + @printf "\n\nProduct ISO is $(NEWISO)\n\n" + +# Start a bash shell in docker for Makefile debugging +.PHONY: debug +debug: + @docker version >/dev/null 2>&1 || (echo 'No Docker installation available'; exit 1) + @make -C docker + docker/runcontext $(DOCKERIMG) debug + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + +# Create a unique hash to be used for getting and putting cache, based on: +# - The commit ID of the full Fuel repo structre +# - The contents of all local Fuel patches +.cacheid: + git clone $(FUEL_MAIN_REPO) $(FUEL_MAIN_DIR) + git -C $(FUEL_MAIN_DIR) checkout $(FUEL_MAIN_TAG) + make -C $(FUEL_MAIN_DIR) repos + $(REPOINFO) -r $(FUEL_MAIN_DIR) > .cachedata + $(foreach patch,$(FUEL_PATCHES),sha1sum $(patch) >> .cachedata;) + sha1sum fuel_build_loop >> .cachedata + sha1sum config.mk >> .cachedata + sha1sum Makefile >> .cachedata + $(CACHETOOL) getbiweek >> .cachedata + cat .cachedata | $(CACHETOOL) getid > .cacheid + # Not removing fuel-main as it is re-used in build + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: $(SUBCLEANCACHE) + rm -f .cachedata .cacheid + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: .cacheid + @if $(CACHETOOL) check $(shell cat .cacheid); then \ + $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\ + else \ + exit 0;\ + fi + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: .cacheid + @tar cf - fuel*.iso gitinfo_fuel.txt | $(CACHETOOL) put $(shell cat .cacheid) diff --git a/build/README b/build/README new file mode 100644 index 000000000..a6e15694c --- /dev/null +++ b/build/README @@ -0,0 +1,22 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +This purpose of this framework is to: + +1) Build fuel baseline from upstream OpenStack Fuel repos (builds in a docker container to isolate dependencies from host + and full re-producability) +2) Apply arbitrary changes to the fuel baseline, consistent and non volatile: + - Add arbitrary packages with puppet modules for install and config. to be applied on controllers as well as computes. + - Change any stack-, or other pack config. using puppet + - Apply patches to the baseline. + - Etc. +3) Re factor/rebuild the .iso image for deployment (also builds in a container, for the same reason as mentioned above) + +For detailed instructions on how to add content, configuration, build and deply - please see: DOC/ diff --git a/build/add_opnfv_packages b/build/add_opnfv_packages new file mode 100644 index 000000000..44af92ea7 --- /dev/null +++ b/build/add_opnfv_packages @@ -0,0 +1,23 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# Format of this file: +# +#TEXT>old package>url for replacement package +# +# Note! No spaces! +# The TEXT can be anything it is just for information display. +# Iff the packages is new, i.e. not replacing an existing package +# the old package should be specified as NONE. +# Note! For new packages a puppet manifest must actually install it. +# Easiest is to just add it to add_packages.pp. (The same might +# of course be true for an exising package if it isn't already +# is being installed). +# diff --git a/build/apply_patches b/build/apply_patches new file mode 100644 index 000000000..6925ff6b7 --- /dev/null +++ b/build/apply_patches @@ -0,0 +1,18 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# Format of this file: +# +#TR>old package>url for replacement package +# +# Note! No spaces! +# Example: +#FIX>foo_0.0.1.deb>https://example.org/foo_0.0.2.deb + diff --git a/build/cache.mk b/build/cache.mk new file mode 100644 index 000000000..f6db01797 --- /dev/null +++ b/build/cache.mk @@ -0,0 +1,55 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################# +# Cache operations - only used when building through ci/build.sh +# +# This is the global cache implementation, providing the main target "cache" +# which is called from ci/build.sh, and recursively calling the cache +# operations clean-cache, get-cache and put-cache on all $(SUBDIRS). +############################################################################# + + +export CACHETOOL := $(BUILD_BASE)/cache.sh + +# Call sub caches +SUBGETCACHE = $(addsuffix .getcache,$(SUBDIRS)) +$(SUBGETCACHE): %.getcache: + $(MAKE) -C $* -f Makefile get-cache + +SUBPUTCACHE = $(addsuffix .putcache,$(SUBDIRS)) +$(SUBPUTCACHE): %.putcache: + $(MAKE) -C $* -f Makefile put-cache + +SUBCLEANCACHE = $(addsuffix .cleancache,$(SUBDIRS)) +$(SUBCLEANCACHE): %.cleancache: + $(MAKE) -C $* -f Makefile clean-cache + +# Overlay implementation: +# - clean +# - clean cache identities +# - get caches +# - build iso +# - store caches +.PHONY: cached-all +cached-all: clean clean-cache $(SUBCLEANCACHE) get-cache $(SUBGETCACHE) iso put-cache $(SUBPUTCACHE) + @echo "Cached build is complete" + + +# cache: The target for ci/build.sh +.PHONY: cache +cache: + @if [ -z "${CACHEBASE}" ]; then \ + echo "CACHEBASE not set, are you really building through build.sh?"; \ + exit 1; \ + fi + @docker version >/dev/null 2>&1 || (echo 'No Docker installation available'; exit 1) + @make -C docker + docker/runcontext $(DOCKERIMG) $(MAKE) $(MAKEFLAGS) cached-all diff --git a/build/cache.sh b/build/cache.sh new file mode 100755 index 000000000..d4b2c45dd --- /dev/null +++ b/build/cache.sh @@ -0,0 +1,203 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + + +exit_trap() { + if [ -d "$TMPDIR" ]; then + rm -rf $TMPDIR + fi +} + +trap exit_trap EXIT + +CACHETRANSPORT=${CACHETRANSPORT:-"curl --silent"} +CACHEMAXAGE=${CACHEMAXAGE:-$[14*24*3600]} +CACHEDEBUG=${CACHEDEBUG:-1} +PLUGINS_MATCH="${BUILD_BASE}/f_isoroot/*/" + +debugmsg () { + if [ "$CACHEDEBUG" -eq 1 ]; then + echo "$@" >&2 + fi +} + +errorexit () { + echo "$@" >&2 + exit 1 +} + +# Generate a unique number every two weeks - a service routine that +# can be used when generating the SHA1 to make sure that the cache is +# rebuilt bi-weekly even if no pruning of the cache is taking place. +getbiweek () { + echo "$(date +'%G')$[10#$(date +'%V')/2]" +} + +# Get a SHA1 based on what's piped into the cache command +getid() { + debugmsg "Generating sha1sum" + sha1sum | sed 's/ .*//' +} + + +# Put in cache +put() { + if check $1; then + debugmsg "SHA1 $1 already in cache, skipping storage" + else + debugmsg "Storing SHA1 $1 in cache" + ${CACHETRANSPORT} -T - ${CACHEBASE}/$1.blob + echo "Expires: $[`date +"%s"` + $CACHEMAXAGE]" | ${CACHETRANSPORT} -T - ${CACHEBASE}/$1.meta + fi + exit 0 +} + +# Get from cache +get() { + local rc + + ${CACHETRANSPORT} -o - ${CACHEBASE}/$1.blob 2>/dev/null + rc=$? + + if [ $rc -eq 0 ]; then + echo "Got SHA1 $1 from cache" 2>/dev/null + else + echo "Tried to get SHA1 $1 from cache but failed" 2>/dev/null + fi + + return $? +} + +# Check if in cache +check() { + local rc + + ${CACHETRANSPORT} ${CACHEBASE}/$1.meta &>/dev/null + rc=$? + + if [ $rc -eq 0 ]; then + debugmsg "Checking for SHA1 $1 in cache and found it, rc = $rc" + else + debugmsg "Checking for SHA1 $1 in cache and failed, rc = $rc" + fi + + return $rc +} + +# Verify that SHA1 seems to be a SHA1... +validSHA1() { + if [ $(echo $1 | wc -c) -ne 41 ]; then + return 1 + else + return 0 + fi +} + +# Figure out commit ID from URI and tag/branch/commit ID +getcommitid() { + if echo $2 | grep -q '^refs/changes/'; then + REF=`echo $2 | sed "s,refs\/changes\/\(.*\),\1,"` + else + REF=$2 + fi + + echo "Repo is $1, ref is ${REF}" >&2 + + HEADMATCH=`git ls-remote $1 | grep "refs/heads/${REF}$" | awk '{ print $1 }'` + TAGMATCH=`git ls-remote $1 | grep "refs/tags/${REF}$" | awk '{ print $1 }'` + CHANGEMATCH=`git ls-remote $1 | grep "refs/changes/${REF}$" | awk '{ print $1 }'` + + if [ -n "$HEADMATCH" ]; then + echo "$HEADMATCH" + elif [ -n "$TAGMATCH" ]; then + echo "$TAGMATCH" + elif [ -n "$CHANGEMATCH" ]; then + echo "Warning: ${REF} is a change!" >&2 + TMPDIR=`mktemp -d /tmp/cacheXXXXX` + cd $TMPDIR + git clone $1 &>/dev/null || errorexit "Could not clone $1" + cd * || errorexit "Could not enter clone of $1" + git fetch $1 refs/changes/$REF &>/dev/null || errorexit "Could not fetch change" + git checkout FETCH_HEAD &>/dev/null || errorexit "Could not checkout FETCH_HEAD" + git show HEAD &>/dev/null || errorexit "Could not find commit $2" + git show HEAD | head -1 | awk '{ print $2 }' + else + TMPDIR=`mktemp -d /tmp/cacheXXXXX` + cd $TMPDIR + git clone $1 &>/dev/null || errorexit "Could not clone $1" + cd * || errorexit "Could not enter clone of $1" + git show $2 &>/dev/null || errorexit "Could not find commit $2" + git show $2 | head -1 | awk '{ print $2 }' + fi +} + +packages() { + local PLUGINS_SHA1='' + + # globbing expansion is alphabetical + for plugin in $PLUGINS_MATCH ; do + if [ -f "${plugin}packages.yaml" ] + then + PLUGINS_SHA1+=$(sha1sum ${plugin}packages.yaml) + fi + done + + if [ -n "${PLUGINS_SHA1}" ] + then + echo -n $PLUGINS_SHA1 | sha1sum + fi +} + +if [ -z "$CACHEBASE" ]; then + errorexit "CACHEBASE not set - exiting..." +fi + +case $1 in + getbiweek) + if [ $# -ne 1 ]; then + errorexit "No arguments can be given to getbiweek!" + fi + getbiweek + ;; + getcommitid) + if [ $# -ne 3 ]; then + errorexit "Arg 1 needs to be URI and arg 2 tag/branch/commit" + fi + shift + getcommitid $@ + ;; + getid) + if [ $# -ne 1 ]; then + errorexit "No arguments can be given to getid!" + fi + getid + ;; + get|check|put) + if [ $# -ne 2 ]; then + errorexit "Only one argument, the SHA1 sum, can be given to getid!" + else + if ! validSHA1 $2; then + errorexit "Invalid SHA1 format!" + fi + fi + + $1 $2 + exit $rc + ;; + packages) + if [ $# -ne 1 ]; then + errorexit "No arguments can be given to packages!" + fi + packages + ;; + *) + errorexit "I only know about getcommitid, getid, check, get and put!" +esac diff --git a/build/check_dependencies.sh b/build/check_dependencies.sh new file mode 100755 index 000000000..cbcb98ab3 --- /dev/null +++ b/build/check_dependencies.sh @@ -0,0 +1,41 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# Given a file as input, this script verifies that all URIs in the file can +# be fetched. + +if [ $# -ne 1 ]; then + echo "Usage: $(basename $0) " + exit 1 +fi + +if [ ! -e $1 ]; then + echo "Could not open $1" + exit 1 +fi + +echo "Checking dependencies in $1" +rc=0 +for uri in `cat $1` +do + if ! curl -sfr 0-100 $uri > /dev/null; then + echo "Failed fetching $uri" >&2 + rc=1 + fi +done + +if [ $rc -ne 0 ]; then + echo "ERROR checking dependencies in $1" +else + echo "Dependencies OK" +fi + +exit $rc diff --git a/build/config.mk b/build/config.mk new file mode 100644 index 000000000..f78043e18 --- /dev/null +++ b/build/config.mk @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +FUEL_MAIN_REPO := https://github.com/openstack/fuel-main +FUEL_MAIN_TAG := 9.0.1 +MOS_VERSION = 9.0 +OPENSTACK_VERSION = mitaka-9.0 + +# Pinning down exact Fuel repo versions for Fuel 9.0.1 +export FUELLIB_COMMIT?=e283b62750d9e26355981b3ad3be7c880944ae0f +export NAILGUN_COMMIT?=e2b85bafb68c348f25cb7cceda81edc668ba2e64 +export PYTHON_FUELCLIENT_COMMIT?=67d8c693a670d27c239d5d175f3ea2a0512c498c +export FUEL_AGENT_COMMIT?=7ffbf39caf5845bd82b8ce20a7766cf24aa803fb +export FUEL_NAILGUN_AGENT_COMMIT?=46fa0db0f8944f9e67699d281d462678aaf4db26 +export ASTUTE_COMMIT?=390b257240d49cc5e94ed5c4fcd940b5f2f6ec64 +export OSTF_COMMIT?=f09c98ff7cc71ee612b2450f68a19f2f9c64345a +export FUEL_MIRROR_COMMIT?=d1ef06b530ce2149230953bb3810a88ecaff870c +export FUELMENU_COMMIT?=0ed9e206ed1c6271121d3acf52a6bf757411286b +export SHOTGUN_COMMIT?=781a8cfa0b6eb290e730429fe2792f2b6f5e0c11 +export NETWORKCHECKER_COMMIT?=fcb47dd095a76288aacf924de574e39709e1f3ca +export FUELUPGRADE_COMMIT?=c1c4bac6a467145ac4fac73e4a7dd2b00380ecfb +export FUEL_UI_COMMIT?=90de7ef4477230cb7335453ed26ed4306ca6f04f + +# for the patches applying purposes +export GIT_COMMITTER_NAME?=Fuel OPNFV +export GIT_COMMITTER_EMAIL?=fuel@opnfv.org + +DOCKER_REPO := http://get.docker.com/builds/Linux/x86_64 +DOCKER_TAG := docker-latest + +.PHONY: get-fuel-repo +get-fuel-repo: + @echo $(FUEL_MAIN_REPO) $(FUEL_MAIN_TAG) + diff --git a/build/docker/Dockerfile b/build/docker/Dockerfile new file mode 100644 index 000000000..b38ea4c64 --- /dev/null +++ b/build/docker/Dockerfile @@ -0,0 +1,43 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +FROM ubuntu:14.04 +ENV http_proxy INSERT_HTTP_PROXY +ENV https_proxy INSERT_HTTPS_PROXY +ENV no_proxy INSERT_NO_PROXY +ENV DEBIAN_FRONTEND noninteractive + +RUN apt-get update +RUN apt-get install -y software-properties-common python-software-properties \ + make python-setuptools python-all dpkg-dev debhelper ruby-json \ + fuseiso git genisoimage bind9-host wget curl lintian tmux lxc iptables \ + ca-certificates sudo apt-utils lsb-release dosfstools debmirror p7zip-full \ + build-essential ruby-dev rubygems-integration python-pip git rpm createrepo dpkg-dev + +RUN gem install fpm +RUN pip install fuel-plugin-builder + +RUN echo "ALL ALL=NOPASSWD: ALL" > /etc/sudoers.d/open-sudo +RUN echo "Defaults env_keep += \"ftp_proxy http_proxy https_proxy no_proxy RSYNC_PROXY RSYNC_CONNECT_PROG npm_config_registry\"" > /etc/sudoers.d/keep-proxies +# Keeping PWD is needed to build as root +RUN echo "Defaults env_keep += \"PWD\"" > /etc/sudoers.d/keep-pwd +# Keeping variables for ISO build +RUN echo "Defaults env_keep += \"MIRROR_UBUNTU MIRROR_UBUNTU_ROOT MIRROR_MOS_UBUNTU MIRROR_MOS_UBUNTU_ROOT MIRROR_FUEL LATEST_TARGET_UBUNTU UBUNTU_ARCH\"" > /etc/sudoers.d/keep-mos +RUN chmod 0440 /etc/sudoers.d/open-sudo +RUN chmod 0440 /etc/sudoers.d/keep-proxies +RUN chmod 0440 /etc/sudoers.d/keep-pwd +RUN chmod 0440 /etc/sudoers.d/keep-mos +RUN chmod 4755 /bin/fusermount + +ADD ./setcontext /root/setcontext +RUN chmod +x /root/setcontext + +VOLUME /var/lib/docker diff --git a/build/docker/Makefile b/build/docker/Makefile new file mode 100644 index 000000000..d4423b0a2 --- /dev/null +++ b/build/docker/Makefile @@ -0,0 +1,42 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +SHELL = /bin/bash +FILES = $(wildcard ubuntu-builder/*) runcontext +DOCKER_VER := $(shell [[ "$$(docker version --format '{{.Client.Version}}')" =~ ([0-9]+)\.([0-9]+) ]] && echo $$(( $${BASH_REMATCH[1]} * 100 + $${BASH_REMATCH[2]} ))) + +# Don't use -f flag when docker is newer than 1.9 +# https://docs.docker.com/engine/deprecated/#/f-flag-on-docker-tag +ifeq ($(shell echo "$(DOCKER_VER)>109" | bc), 1) + tag_flags := +else + tag_flags := -f +endif + +.PHONY: all +all: .docker + +.docker: $(FILES) + cp Dockerfile ubuntu-builder/Dockerfile + # Only add proxy ENVs where set in host - needed to pull the base Ubuntu image + test -n "${http_proxy}" && sed -i "s;INSERT_HTTP_PROXY;${http_proxy};" ubuntu-builder/Dockerfile || exit 0 + test -n "${https_proxy}" && sed -i "s;INSERT_HTTPS_PROXY;${https_proxy};" ubuntu-builder/Dockerfile || exit 0 + test -n "${no_proxy}" && sed -i "s;INSERT_NO_PROXY;${no_proxy};" ubuntu-builder/Dockerfile || exit 0 + test -n "${HTTP_PROXY}" && sed -i "s;INSERT_HTTP_PROXY;${HTTP_PROXY};" ubuntu-builder/Dockerfile || exit 0 + test -n "${HTTPS_PROXY}" && sed -i "s;INSERT_HTTPS_PROXY;${HTTPS_PROXY};" ubuntu-builder/Dockerfile || exit 0 + test -n "${NO_PROXY}" && sed -i "s;INSERT_NO_PROXY;${NO_PROXY};" ubuntu-builder/Dockerfile || exit 0 + sed -i '/INSERT_/d' ubuntu-builder/Dockerfile + /usr/bin/docker build --rm=true --no-cache=true -t opnfv.org/ubuntu-builder:14.04 ubuntu-builder + /usr/bin/docker tag ${tag_flags} opnfv.org/ubuntu-builder:14.04 opnfv.org/ubuntu-builder + touch .docker + +.PHONY: clean +clean: + rm -f .docker ubuntu-builder/Dockerfile diff --git a/build/docker/README b/build/docker/README new file mode 100644 index 000000000..e5ccdfab6 --- /dev/null +++ b/build/docker/README @@ -0,0 +1,25 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +The makefile on this level is used for *creating* the Docker image +used for building in Ubuntu 12.04 context. + +There are two requirements before running make on this level: + +1. You need to have Docker installed on your system + +2. If in a corporate network, make sure to have a valid DNS config in + your /etc/default/docker, e.g: + + DOCKER_OPTS=" --dns=8.8.8.8 --dns=8.8.8.4" + +The top level makefile will refer to the "runcontext" file in order to +run the build process as the current user with the current working +directory available to the container. diff --git a/build/docker/runcontext b/build/docker/runcontext new file mode 100755 index 000000000..daad663ac --- /dev/null +++ b/build/docker/runcontext @@ -0,0 +1,130 @@ +#!/bin/bash +set -e +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +# + +############################################################################ +# BEGIN of Exit handlers +# + +do_exit () { + CID=`cat $CID_FILE /dev/null 2>&1 + docker rm -f $CID > /dev/null 2>&1 + docker rmi -f $IID > /dev/null 2>&1 + set -e +} + +# +# End of Exit handlers +############################################################################ + +trap do_exit SIGINT SIGTERM EXIT + +context=$1 +shift +USER_ID=`id -u` +USER=`whoami` +GROUP_ID=`id -g` + +GITROOT=`git rev-parse --show-toplevel` +CID_FILE=`mktemp -u -t runcontext.XXXXXXXXXX` +CONTEXT_DIR=`mktemp -d ${GITROOT}/.docker_contextXXXXXX` + +# If RSYNC_CONNECT_PROG is used, we need to copy all of +# the SSH structure, should one of the keys need to be +# used. +if [ -n "$RSYNC_CONNECT_PROG" -a -x $HOME/.ssh ]; then + cp -rp $HOME/.ssh $CONTEXT_DIR + rm -f $CONTEXT_DIR/.ssh/known_hosts +else + mkdir $CONTEXT_DIR/.ssh +fi + +# Disable verification of unknown keys +cat >> $CONTEXT_DIR/.ssh/config < $CONTEXT_DIR/Dockerfile < $envfile + test -n "$my_http_proxy" && echo "export http_proxy=$my_http_proxy" >> $envfile + test -n "$my_https_proxy" && echo "export https_proxy=$my_https_proxy" >> $envfile + test -n "$my_no_proxy" && echo "export no_proxy=$my_no_proxy" >> $envfile + test -n "$RSYNC_PROXY" && echo "export RSYNC_PROXY=$RSYNC_PROXY" >> $envfile + test -n "$RSYNC_CONNECT_PROG" && echo "export RSYNC_CONNECT_PROG=$RSYNC_CONNECT_PROG" >> $envfile + echo "export npm_config_registry=http://registry.npmjs.org/" >> $envfile +else + echo "No need to generate environment.mk" + rm -f $envfile +fi + +# Evaluate the need for bind mounting the cache directory +if [ -n "$CACHEBASE" ]; then + if echo $CACHEBASE | grep -q '^file://'; then + CACHEMOUNT="-v $(echo $CACHEBASE | sed 's;file://;;'):$(echo $CACHEBASE | sed 's;file://;;')" + fi +fi + +RUN_CONTEXT_OPT="--cidfile $CID_FILE --privileged=true --rm \ + -e HOME=$HOME -e CACHEDEBUG -e CACHETRANSPORT -e CACHEMAXAGE -e CACHEBASE \ + -e BUILD_FUEL_PLUGINS -e MIRROR_UBUNTU -e MIRROR_UBUNTU_ROOT \ + -e MIRROR_MOS_UBUNTU -e MIRROR_MOS_UBUNTU_ROOT -e MIRROR_FUEL \ + -e LATEST_TARGET_UBUNTU -e UBUNTU_ARCH \ + -u $USER_ID:$GROUP_ID -w $PWD \ + -v $GITROOT:$GITROOT -v /sys/fs/cgroup:/sys/fs/cgroup:ro $CACHEMOUNT" + +# Passing "debug" puts up an interactive bash shell +if [ "$1" == "debug" ]; then + echo command: docker run ${RUN_CONTEXT_OPT} $IID bash + docker run -i -t ${RUN_CONTEXT_OPT} $IID bash +else + echo command: docker run ${RUN_CONTEXT_OPT} $IID $@ + docker run -t ${RUN_CONTEXT_OPT} $IID $@ +fi + diff --git a/build/docker/ubuntu-builder/install_docker.sh b/build/docker/ubuntu-builder/install_docker.sh new file mode 100755 index 000000000..47c3a52ec --- /dev/null +++ b/build/docker/ubuntu-builder/install_docker.sh @@ -0,0 +1,36 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# From prepare-build-env.sh of Fuel +# Check if docker is installed +if hash docker 2>/dev/null; then + echo "Docker binary found, checking if service is running..." + ps cax | grep docker > /dev/null + if [ $? -eq 0 ]; then + echo "Docker is running." + else + echo "Process is not running, starting it..." + sudo service docker start + fi +else + # Install docker repository + # Check that HTTPS transport is available to APT + if [ ! -e /usr/lib/apt/methods/https ]; then + sudo apt-get update + sudo apt-get -y install -y apt-transport-https + fi + # Add the repository to APT sources + echo deb http://mirror.yandex.ru/mirrors/docker/ docker main | sudo tee /etc/apt/sources.list.d/docker.list + # Import the repository key + sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 + # Install docker + sudo apt-get update + sudo apt-get -y install lxc-docker-1.7.1 +fi diff --git a/build/docker/ubuntu-builder/setcontext b/build/docker/ubuntu-builder/setcontext new file mode 100755 index 000000000..bc28994a9 --- /dev/null +++ b/build/docker/ubuntu-builder/setcontext @@ -0,0 +1,20 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +# +SETUSER=$1 +SETUID=$2 +SETGID=$3 +SETHOME=$4 + +getent group $SETUSER || /usr/sbin/groupadd --gid $SETGID $SETUSER +getent passwd $SETUSER || /usr/sbin/adduser --system --uid=$SETUID --gid=$SETGID --home $SETHOME --shell /bin/bash $SETUSER +/usr/sbin/usermod -a -G fuse $SETUSER +exit 0 diff --git a/build/f_isoroot/Makefile b/build/f_isoroot/Makefile new file mode 100644 index 000000000..448f4158c --- /dev/null +++ b/build/f_isoroot/Makefile @@ -0,0 +1,51 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# Add Fuel plugin build targets here +# Plugins disabled for the Fuel Mitaka uplift. Please re-enable your plugin as you have +# verified it! +PLUGINS ?= f_odlpluginbuild f_onosfwpluginbuild f_vsperfpluginbuild f_ovs-nsh-dpdk-pluginbuild f_yardstick-pluginbuild f_kvm-pluginbuild f_bgpvpn-pluginbuild f_collectd-ceilometer-pluginbuild +#PLUGINS = f_odlpluginbuild f_onosfwpluginbuild f_ovsnfv-dpdk-pluginbuild f_vsperfpluginbuild f_ovs-nsh-dpdk-pluginbuild f_bgpvpn-pluginbuild +export PLUGINS +#NON_8-0_REBASED_PLUGINS = f_bgpvpn-pluginbuild + +# If the BUILD_FUEL_PLUGINS environment variable is set, only build the plugins +# indicated therein. +# Temporarilu disabling f_repobuild that currently have some issues on +# Fuel Mitaka. +ifdef BUILD_FUEL_PLUGINS +export BUILD_FUEL_PLUGINS +SUBDIRS = f_kscfg f_bootstrap f_isolinux f_repobuild $(BUILD_FUEL_PLUGINS) +$(warning Overriding plugin build selection to $(BUILD_FUEL_PLUGINS)) +else +SUBDIRS = f_kscfg f_bootstrap f_isolinux f_repobuild $(PLUGINS) +endif +SUBCLEAN = $(addsuffix .clean,$(SUBDIRS)) + +.PHONY: all +all: $(SUBDIRS) + +.PHONY: $(SUBDIRS) +$(SUBDIRS): + @mkdir -p release + $(MAKE) -C $@ -f Makefile release + +.PHONY: clean $(SUBCLEAN) +clean: $(SUBCLEAN) + @rm -Rf release + +$(SUBCLEAN): %.clean: + $(MAKE) -C $* -f Makefile clean + +.PHONY: release +release: $(SUBDIRS) + @cp -Rvp release/* ../release/isoroot + +include cache.mk diff --git a/build/f_isoroot/README b/build/f_isoroot/README new file mode 100644 index 000000000..eb54c0827 --- /dev/null +++ b/build/f_isoroot/README @@ -0,0 +1,16 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +This is to (a) replace/patch existing Fuel ISO files as well +as adding new information directly into the ISO structure + +Please separate changes into "patches" and new content into +"additions". Both directories will be anchored at the ISO file +root. diff --git a/build/f_isoroot/cache.mk b/build/f_isoroot/cache.mk new file mode 100644 index 000000000..2df3b6bd1 --- /dev/null +++ b/build/f_isoroot/cache.mk @@ -0,0 +1,37 @@ +############################################################################## +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################# +# Cache operations - only used when building through ci/build.sh +# +# This file is only meant for a top Makefile which is only calling its +# own SUBDIRS, without building any cachable artifact by itself. +############################################################################# + +# Call sub caches +SUBGETCACHE = $(addsuffix .getcache,$(SUBDIRS)) +$(SUBGETCACHE): %.getcache: + $(MAKE) -C $* -f Makefile get-cache + +SUBPUTCACHE = $(addsuffix .putcache,$(SUBDIRS)) +$(SUBPUTCACHE): %.putcache: + $(MAKE) -C $* -f Makefile put-cache + +SUBCLEANCACHE = $(addsuffix .cleancache,$(SUBDIRS)) +$(SUBCLEANCACHE): %.cleancache: + $(MAKE) -C $* -f Makefile clean-cache + +.PHONY: get-cache +get-cache: $(SUBGETCACHE) + +.PHONY: put-cache +put-cache: $(SUBPUTCACHE) + +.PHONY: clean-cache +clean-cache: $(SUBCLEANCACHE) diff --git a/build/f_isoroot/f_bgpvpn-pluginbuild/Makefile b/build/f_isoroot/f_bgpvpn-pluginbuild/Makefile new file mode 100644 index 000000000..8ce28fcf8 --- /dev/null +++ b/build/f_isoroot/f_bgpvpn-pluginbuild/Makefile @@ -0,0 +1,91 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +############################################################################ +# BEGIN of Include definitions +# +include config.mk +# +# END Include definitions +############################################################################# + + +.PHONY: all +all: .bgpvpnbuild + +.PHONY: clean +clean: + @rm -f .bgpvpnbuild ../release/opnfv/bgpvpn*.rpm bgpvpn*.rpm + @rm -f $(BUILD_BASE)/gitinfo_bgpvpnplugin.txt gitinfo_bgpvpnplugin.txt + +.PHONY: release +release:.bgpvpnbuild + @rm -f ../release/opnfv/bgpvpn*.rpm + @mkdir -p ../release/bgpvpn + @cp bgpvpn*.rpm ../release/opnfv/ + cp gitinfo_bgpvpnplugin.txt $(BUILD_BASE) + +.bgpvpnbuild: + rm -rf fuel-plugin-bgpvpn + git clone $(BGPVPN_REPO) + cd fuel-plugin-bgpvpn; \ + git checkout $(BGPVPN_BRANCH); \ + if [ ! -z $(BGPVPN_CHANGE) ]; then \ + git fetch $(BGPVPN_REPO) $(BGPVPN_CHANGE); \ + git checkout FETCH_HEAD; \ + fi + fpb --debug --build fuel-plugin-bgpvpn/ + mv fuel-plugin-bgpvpn/bgpvpn*.rpm . + $(REPOINFO) -r . > gitinfo_bgpvpnplugin.txt + rm -rf fuel-plugin-bgpvpn + touch .bgpvpnbuild + # Store artifact in cache straight away if caching is enabled + # (no .cacheid will be present unless this is a cached build) + test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0 + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + + +# Create a unique hash to be used for getting and putting cache, based on: +# - The SHA1 hash of the HEAD on the plugin repo's $(BGPVPN_BRANCH) +# - The contents of this Makefile +.cacheid: + @if [ ! -z $(BGPVPN_CHANGE) ]; then \ + $(CACHETOOL) getcommitid $(BGPVPN_REPO) $(BGPVPN_CHANGE) > .cachedata; \ + else \ + $(CACHETOOL) getcommitid $(BGPVPN_REPO) $(BGPVPN_BRANCH) > .cachedata; \ + fi + sha1sum Makefile >> .cachedata + sha1sum config.mk >> .cachedata + echo -n $(UBUNTU_ARCH) | sha1sum | awk {'print $$1'} >> .cachedata + cat .cachedata | $(CACHETOOL) getid > .cacheid + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + rm -f .cachedata .cacheid + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: .cacheid + @if $(CACHETOOL) check $(shell cat .cacheid); then \ + $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\ + else \ + echo "No cache item found for $(shell cat .cacheid)" ;\ + exit 0;\ + fi + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: .cacheid + @tar cf - .bgpvpnbuild bgpvpn*.rpm gitinfo_bgpvpnplugin.txt | $(CACHETOOL) put $(shell cat .cacheid) diff --git a/build/f_isoroot/f_bgpvpn-pluginbuild/config.mk b/build/f_isoroot/f_bgpvpn-pluginbuild/config.mk new file mode 100644 index 000000000..ba6fb73ff --- /dev/null +++ b/build/f_isoroot/f_bgpvpn-pluginbuild/config.mk @@ -0,0 +1,12 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +BGPVPN_BRANCH?=master +BGPVPN_REPO?="https://github.com/openstack/fuel-plugin-bgpvpn.git" +BGPVPN_CHANGE?=3349842af5724be63a74a82c9060848d9d3d299e diff --git a/build/f_isoroot/f_bootstrap/Makefile b/build/f_isoroot/f_bootstrap/Makefile new file mode 100644 index 000000000..1c08405ab --- /dev/null +++ b/build/f_isoroot/f_bootstrap/Makefile @@ -0,0 +1,46 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +.PHONY: all +all: + @mkdir -p release/opnfv/bootstrap/pre.d + @mkdir -p release/opnfv/bootstrap/post.d + @mkdir -p release/usr/local/sbin + @cp pre-scripts/* release/opnfv/bootstrap/pre.d + @cp post-scripts/* release/opnfv/bootstrap/post.d + +.PHONY: clean +clean: + @rm -rf release + +.PHONY: release +release:all + @cp -Rvp release/* ../release + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + @echo "clean-cache not implemented" + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: + @echo "get-cache not implemented" + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: + @echo "put-cache not implemented" diff --git a/build/f_isoroot/f_bootstrap/README b/build/f_isoroot/f_bootstrap/README new file mode 100644 index 000000000..5da954ca4 --- /dev/null +++ b/build/f_isoroot/f_bootstrap/README @@ -0,0 +1,24 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +This function modifies the adds hooks to the beginning and end of +/usr/local/sbin/bootstrap_admin_nodes.sh, which is run as the +last post step from ks.cfg + +This enables other functions to place scripts into two directories +run either at the beginning or the end of the bootstrap procedure: + + /opt/opnfv/bootstrap/pre.d + /opt/opnfv/bootstrap/post.d + +These will be run in lexical order at pre or post. + +CI note: Using pre.d, it would be possible to "inject" a pre-defined +astute.yaml for Fuel. diff --git a/build/f_isoroot/f_bootstrap/post-scripts/00_post_example.sh b/build/f_isoroot/f_bootstrap/post-scripts/00_post_example.sh new file mode 100755 index 000000000..4dfeca58e --- /dev/null +++ b/build/f_isoroot/f_bootstrap/post-scripts/00_post_example.sh @@ -0,0 +1,14 @@ +#/bin/sh +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +date +echo "This is an example file run at post-bootstrap." +exit 0 diff --git a/build/f_isoroot/f_bootstrap/post-scripts/03_install_repo.sh b/build/f_isoroot/f_bootstrap/post-scripts/03_install_repo.sh new file mode 100755 index 000000000..be17e7e0a --- /dev/null +++ b/build/f_isoroot/f_bootstrap/post-scripts/03_install_repo.sh @@ -0,0 +1,34 @@ +#/bin/sh +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +echo "Installing pre-build repo" +if [ ! -d /opt/opnfv/nailgun ]; then + echo "Error - found no repo!" + exit 1 +fi + +mkdir -p /var/www/nailgun +mv /opt/opnfv/nailgun/* /var/www/nailgun +if [ $? -ne 0 ]; then + echo "Error moving repos to their correct location!" + exit 1 +fi +rmdir /opt/opnfv/nailgun +if [ $? -ne 0 ]; then + echo "Error removing /opt/opnfv/nailgun directory!" + exit 1 +fi +mv /opt/opnfv/fuel_bootstrap_cli.yaml /etc/fuel-bootstrap-cli/fuel_bootstrap_cli.yaml +if [ $? -ne 0 ]; then + echo "Error moving bootstrap image configuration!" + exit 1 +fi +echo "Done installing pre-build repo" diff --git a/build/f_isoroot/f_bootstrap/pre-scripts/00_pre_example.sh b/build/f_isoroot/f_bootstrap/pre-scripts/00_pre_example.sh new file mode 100755 index 000000000..3eaffa523 --- /dev/null +++ b/build/f_isoroot/f_bootstrap/pre-scripts/00_pre_example.sh @@ -0,0 +1,14 @@ +#/bin/sh +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +date +echo "This is an example file run at pre-bootstrap." +exit 0 diff --git a/build/f_isoroot/f_collectd-ceilometer-pluginbuild/Makefile b/build/f_isoroot/f_collectd-ceilometer-pluginbuild/Makefile new file mode 100644 index 000000000..17bc36d91 --- /dev/null +++ b/build/f_isoroot/f_collectd-ceilometer-pluginbuild/Makefile @@ -0,0 +1,91 @@ +############################################################################## +# Copyright (c) 2016 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# ruijing.guo@intel.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +############################################################################ +# BEGIN of Include definitions +# +include config.mk +# +# END Include definitions +############################################################################# + +.PHONY: all +all: .fastpathmetrics + +.PHONY: clean +clean: + @rm -f .fastpathmetrics ../release/opnfv/fuel-plugin-collectd-ceilometer-*.rpm fuel-plugin-collectd-ceilometer-*.rpm + @rm -f $(BUILD_BASE)/gitinfo_collectd-ceilometer-plugin.txt gitinfo_collectd-ceilometer-plugin.txt + +.PHONY: release +release:.fastpathmetrics + @rm -f ../release/opnfv/fuel-plugin-collectd-ceilometer-*.rpm + @mkdir -p ../release/opnfv + @cp fuel-plugin-collectd-ceilometer*.rpm ../release/opnfv/ + cp gitinfo_collectd-ceilometer-plugin.txt $(BUILD_BASE) + +.fastpathmetrics: + @rm -rf fastpathmetrics + git clone $(COLLECTD_CEILOMETER_REPO) + cd fastpathmetrics; \ + git checkout $(COLLECTD_CEILOMETER_BRANCH); \ + if [ ! -z $(COLLECTD_CEILOMETER_CHANGE) ]; then \ + git fetch $(COLLECTD_CEILOMETER_REPO) $(COLLECTD_CEILOMETER_CHANGE); \ + git checkout FETCH_HEAD; \ + fi + fpb --debug --build fastpathmetrics/src/fuel-plugin + @mv fastpathmetrics/src/fuel-plugin/fuel-plugin-collectd-ceilometer*.rpm . + $(REPOINFO) -r . > gitinfo_collectd-ceilometer-plugin.txt + @rm -rf fastpathmetrics + @touch .fastpathmetrics + # Store artifact in cache straight away if caching is enabled + # (no .cacheid will be present unless this is a cached build) + test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0 + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + + +# Create a unique hash to be used for getting and putting cache, based on: +# - The SHA1 hash of the HEAD on the plugin repo's $(COLLECTD_CEILOMETER_BRANCH) +# - The contents of this Makefile +.cacheid: + @if [ ! -z $(COLLECTD_CEILOMETER_CHANGE) ]; then \ + $(CACHETOOL) getcommitid $(COLLECTD_CEILOMETER_REPO) $(COLLECTD_CEILOMETER_CHANGE) > .cachedata; \ + else \ + $(CACHETOOL) getcommitid $(COLLECTD_CEILOMETER_REPO) $(COLLECTD_CEILOMETER_BRANCH) > .cachedata; \ + fi + @sha1sum Makefile | awk {'print $$1'} >> .cachedata + @sha1sum config.mk | awk {'print $$1'} >> .cachedata + @echo -n $(UBUNTU_ARCH) | sha1sum | awk {'print $$1'} >> .cachedata + @cat .cachedata | $(CACHETOOL) getid > .cacheid + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + @rm -f .cachedata .cacheid + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: .cacheid + @if $(CACHETOOL) check $(shell cat .cacheid); then \ + $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\ + else \ + echo "No cache item found for $(shell cat .cacheid)" ;\ + exit 0;\ + fi + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: .cacheid + @tar cf - .fastpathmetrics fuel-plugin-collectd-ceilometer*.rpm gitinfo_collectd-ceilometer-plugin.txt | $(CACHETOOL) put $(shell cat .cacheid) diff --git a/build/f_isoroot/f_collectd-ceilometer-pluginbuild/config.mk b/build/f_isoroot/f_collectd-ceilometer-pluginbuild/config.mk new file mode 100644 index 000000000..0106213d3 --- /dev/null +++ b/build/f_isoroot/f_collectd-ceilometer-pluginbuild/config.mk @@ -0,0 +1,13 @@ +############################################################################## +# Copyright (c) 2016 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# ruijing.guo@intel.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +COLLECTD_CEILOMETER_BRANCH?=3ddf95235ef62de5fb9a520b3aa8f120518b0077 +COLLECTD_CEILOMETER_REPO?=http://gerrit.opnfv.org/gerrit/fastpathmetrics +COLLECTD_CEILOMETER_CHANGE?= diff --git a/build/f_isoroot/f_collectd-ceilometer-pluginbuild/packages.yaml b/build/f_isoroot/f_collectd-ceilometer-pluginbuild/packages.yaml new file mode 100644 index 000000000..1ba7201f4 --- /dev/null +++ b/build/f_isoroot/f_collectd-ceilometer-pluginbuild/packages.yaml @@ -0,0 +1,9 @@ +############################################################################## +# Copyright (c) 2016 OPNFV. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +packages: + - "collectd" diff --git a/build/f_isoroot/f_isolinux/Makefile b/build/f_isoroot/f_isolinux/Makefile new file mode 100644 index 000000000..f3e09b234 --- /dev/null +++ b/build/f_isoroot/f_isolinux/Makefile @@ -0,0 +1,49 @@ +############################################################################## +# Copyright (c) 2016 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +.PHONY: all +all: isolinux.cfg.iso + @mkdir -p release/isolinux + grep -q OpenStack_Fuel isolinux.cfg.iso + sed "s/OpenStack_Fuel/$(PRODNO)_$(REVSTATE)/g" isolinux.cfg.iso > isolinux.cfg + @cp isolinux.cfg release/isolinux/isolinux.cfg + @cp isolinux.cfg.iso release/isolinux/isolinux.cfg.orig + +isolinux.cfg.iso: + 7z -so x $(ISOCACHE) isolinux/isolinux.cfg > isolinux.cfg.iso + +.PHONY: clean +clean: + @rm -rf release isolinux.cfg.iso isolinux.cfg + +.PHONY: release +release: all + @cp -Rvp release/* ../release + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + @echo "clean-cache not implemented" + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: + @echo "get-cache not implemented" + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: + @echo "put-cache not implemented" diff --git a/build/f_isoroot/f_kscfg/Makefile b/build/f_isoroot/f_kscfg/Makefile new file mode 100644 index 000000000..cfd433f8d --- /dev/null +++ b/build/f_isoroot/f_kscfg/Makefile @@ -0,0 +1,50 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +.PHONY: all +all: ks.cfg.iso + @mkdir -p release + grep -q OpenStack_Fuel ks.cfg.iso + sed "s/OpenStack_Fuel/$(PRODNO)_$(REVSTATE)/g" ks.cfg.iso > ks.cfg + /usr/bin/patch -p0 < ks.cfg.patch + @cp ks.cfg.iso release/ks.cfg.orig + @cp ks.cfg release/ks.cfg + +ks.cfg.iso: + 7z -so x $(ISOCACHE) ks.cfg > ks.cfg.iso + +.PHONY: clean +clean: + @rm -rf release ks.cfg.iso ks.cfg + +.PHONY: release +release: all + @cp -Rvp release/* ../release + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + @echo "clean-cache not implemented" + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: + @echo "get-cache not implemented" + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: + @echo "put-cache not implemented" diff --git a/build/f_isoroot/f_kscfg/README b/build/f_isoroot/f_kscfg/README new file mode 100644 index 000000000..c85efde77 --- /dev/null +++ b/build/f_isoroot/f_kscfg/README @@ -0,0 +1,18 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +This function modifies the ks.cfg of the Fuel master to +make copy whatever is in the top level opnfv directory +of the ISO (populated by, for example, f_configfrontend) to +/opt/opnfv. In the end this is where the installation +parts will evolve. + +This is also the place to force the installation to overwrite +the disk (set forceformat="yes" instead of "no"). diff --git a/build/f_isoroot/f_kscfg/ks.cfg.patch b/build/f_isoroot/f_kscfg/ks.cfg.patch new file mode 100644 index 000000000..a6840e479 --- /dev/null +++ b/build/f_isoroot/f_kscfg/ks.cfg.patch @@ -0,0 +1,31 @@ +*** /dev/null 2016-04-26 10:10:11.481587709 +0200 +--- ks.cfg 2016-04-26 10:10:11.481587709 +0200 +*************** +*** 579,584 **** +--- 579,592 ---- + + EOF + ++ ######### OPNFV addition BEGIN ############ ++ # Copy data into /opt/opnfv ++ # TODO: This ought to be a package instead! ++ mkdir -p /opt/opnfv ++ cp -r ${SOURCE}/opnfv /opt ++ cp ${SOURCE}/gitinfo.txt / ++ ######### OPNFV addition END ############ ++ + # Unmounting source + umount -f ${SOURCE} + rm -rf ${SOURCE} +*************** +*** 647,650 **** + /etc/sysconfig/network-scripts/ifcfg-${ifname%%:*} > \ + /mnt/sysimage/etc/sysconfig/network-scripts/ifcfg-${adminif} + fi +! %end +\ No newline at end of file +--- 655,658 ---- + /etc/sysconfig/network-scripts/ifcfg-${ifname%%:*} > \ + /mnt/sysimage/etc/sysconfig/network-scripts/ifcfg-${adminif} + fi +! %end diff --git a/build/f_isoroot/f_kvm-pluginbuild/Makefile b/build/f_isoroot/f_kvm-pluginbuild/Makefile new file mode 100644 index 000000000..81309ef87 --- /dev/null +++ b/build/f_isoroot/f_kvm-pluginbuild/Makefile @@ -0,0 +1,92 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +############################################################################ +# BEGIN of Include definitions +# +include config.mk +# +# END Include definitions +############################################################################# + +.PHONY: all +all: .kvmbuild + +.PHONY: clean +clean: + @rm -f .kvmbuild ../release/opnfv/fuel-plugin-kvm*.rpm fuel-plugin-kvm*.rpm + @rm -f $(BUILD_BASE)/gitinfo_kvm-plugin.txt gitinfo_kvm-plugin.txt + +.PHONY: release +release:.kvmbuild + @rm -f ../release/opnfv/fuel-plugin-kvm*.rpm + @mkdir -p ../release/opnfv + @cp fuel-plugin-kvm*.rpm ../release/opnfv/ + cp gitinfo_kvm-plugin.txt $(BUILD_BASE) + +.kvmbuild: + @rm -rf kvmfornfv + ../../docker/ubuntu-builder/install_docker.sh + git clone $(KVMFORNFV_REPO) + cd kvmfornfv; \ + git checkout $(KVMFORNFV_BRANCH); \ + if [ ! -z $(KVMFORNFV_CHANGE) ]; then \ + git fetch $(KVMFORNFV_REPO) $(KVMFORNFV_CHANGE); \ + git checkout FETCH_HEAD; \ + fi + cd kvmfornfv/fuel-plugin; \ + INCLUDE_DEPENDENCIES=true fpb --debug --build ./ + @mv kvmfornfv/fuel-plugin/fuel-plugin-kvm*.rpm . + $(REPOINFO) -r . > gitinfo_kvm-plugin.txt + @rm -rf kvmfornfv + @touch .kvmbuild + # Store artifact in cache straight away if caching is enabled + # (no .cacheid will be present unless this is a cached build) + test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0 + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + + +# Create a unique hash to be used for getting and putting cache, based on: +# - The SHA1 hash of the HEAD on the plugin repo's $(KVMFORNFV_BRANCH) +# - The contents of this Makefile +.cacheid: + @if [ ! -z $(KVMFORNFV_CHANGE) ]; then \ + $(CACHETOOL) getcommitid $(KVMFORNFV_REPO) $(KVMFORNFV_CHANGE) > .cachedata; \ + else \ + $(CACHETOOL) getcommitid $(KVMFORNFV_REPO) $(KVMFORNFV_BRANCH) > .cachedata; \ + fi + @sha1sum Makefile | awk {'print $$1'} >> .cachedata + @sha1sum config.mk | awk {'print $$1'} >> .cachedata + @echo -n $(UBUNTU_ARCH) | sha1sum | awk {'print $$1'} >> .cachedata + @cat .cachedata | $(CACHETOOL) getid > .cacheid + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + @rm -f .cachedata .cacheid + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: .cacheid + @if $(CACHETOOL) check $(shell cat .cacheid); then \ + $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\ + else \ + echo "No cache item found for $(shell cat .cacheid)" ;\ + exit 0;\ + fi + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: .cacheid + @tar cf - .kvmbuild fuel-plugin-kvm*.rpm gitinfo_kvm-plugin.txt | $(CACHETOOL) put $(shell cat .cacheid) diff --git a/build/f_isoroot/f_kvm-pluginbuild/config.mk b/build/f_isoroot/f_kvm-pluginbuild/config.mk new file mode 100644 index 000000000..eaef3d414 --- /dev/null +++ b/build/f_isoroot/f_kvm-pluginbuild/config.mk @@ -0,0 +1,12 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +KVMFORNFV_BRANCH=stable/colorado +KVMFORNFV_REPO=https://gerrit.opnfv.org/gerrit/kvmfornfv +KVMFORNFV_CHANGE=e6588d1d59d7ac24f25f644650e6845561dd441b diff --git a/build/f_isoroot/f_odlpluginbuild/Makefile b/build/f_isoroot/f_odlpluginbuild/Makefile new file mode 100644 index 000000000..bf811f25f --- /dev/null +++ b/build/f_isoroot/f_odlpluginbuild/Makefile @@ -0,0 +1,82 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# mskalski@mirantis.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +include config.mk + +.PHONY: all +all: .odlbuild + +.PHONY: clean +clean: + @rm -f .odlbuild ../release/opnfv/opendaylight*.rpm opendaylight*.rpm + @rm -f $(BUILD_BASE)/gitinfo_odlplugin.txt gitinfo_odlplugin.txt + @rm -rf fuel-plugins + +.PHONY: release +release:.odlbuild + @rm -f ../release/opnfv/opendaylight*.rpm + @mkdir -p ../release/opnfv + @cp opendaylight*.rpm ../release/opnfv/ + cp gitinfo_odlplugin.txt $(BUILD_BASE) +.odlbuild: + rm -rf fuel-plugin-opendaylight + git clone -b $(FUEL_PLUGIN_ODL_BRANCH) $(FUEL_PLUGIN_ODL_REPO) + cd fuel-plugin-opendaylight; \ + if [ -n $(FUEL_PLUGIN_ODL_CHANGE) ]; then \ + git checkout $(FUEL_PLUGIN_ODL_CHANGE); \ + fi + fpb --debug --build fuel-plugin-opendaylight/ + mv fuel-plugin-opendaylight/opendaylight*.rpm . + $(REPOINFO) -r . > gitinfo_odlplugin.txt + rm -rf fuel-plugin-opendaylight + touch .odlbuild + # Store artifact in cache straight away if caching is enabled + # (no .cacheid will be present unless this is a cached build) + test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0 + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + + +# Create a unique hash to be used for getting and putting cache, based on: +# - The SHA1 hash of the HEAD on the plugin repo's $(FUEL_PLUGIN_ODL_BRANCH) +# - The contents of this Makefile +.cacheid: + if [ -n $(FUEL_PLUGIN_ODL_CHANGE) ]; then \ + $(CACHETOOL) getcommitid $(FUEL_PLUGIN_ODL_REPO) $(FUEL_PLUGIN_ODL_CHANGE) > .cachedata; \ + else \ + $(CACHETOOL) getcommitid $(FUEL_PLUGIN_ODL_REPO) $(FUEL_PLUGIN_ODL_BRANCH) > .cachedata; \ + fi + @sha1sum Makefile | awk {'print $$1'} >> .cachedata + @sha1sum config.mk | awk {'print $$1'} >> .cachedata + @echo -n $(UBUNTU_ARCH) | sha1sum | awk {'print $$1'} >> .cachedata + cat .cachedata | $(CACHETOOL) getid > .cacheid + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + rm -f .cachedata .cacheid + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: .cacheid + @if $(CACHETOOL) check $(shell cat .cacheid); then \ + $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\ + else \ + echo "No cache item found for $(shell cat .cacheid)" ;\ + exit 0;\ + fi + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: .cacheid + @tar cf - .odlbuild opendaylight*.rpm gitinfo_odlplugin.txt | $(CACHETOOL) put $(shell cat .cacheid) diff --git a/build/f_isoroot/f_odlpluginbuild/config.mk b/build/f_isoroot/f_odlpluginbuild/config.mk new file mode 100644 index 000000000..7074ee2e0 --- /dev/null +++ b/build/f_isoroot/f_odlpluginbuild/config.mk @@ -0,0 +1,16 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +FUEL_PLUGIN_ODL_BRANCH ?= master +FUEL_PLUGIN_ODL_CHANGE ?= 58cf41ff4e9ed928bf024b166776b9df1a2e517b +FUEL_PLUGIN_ODL_REPO ?= https://github.com/openstack/fuel-plugin-opendaylight.git + +export ODL_TARBALL_LOCATION?=https://nexus.opendaylight.org/content/repositories/public/org/opendaylight/integration/distribution-karaf/0.4.3-Beryllium-SR3/distribution-karaf-0.4.3-Beryllium-SR3.tar.gz +export ODL_VERSION_NUMBER?=0.4.3 +export ODL_BORON_TARBALL_LOCATION?=http://artifacts.opnfv.org/fuel/colorado/vendor/distribution-karaf-0.5.0-Boron-RC3.5.tar.gz diff --git a/build/f_isoroot/f_onosfwpluginbuild/Makefile b/build/f_isoroot/f_onosfwpluginbuild/Makefile new file mode 100644 index 000000000..02ba02951 --- /dev/null +++ b/build/f_isoroot/f_onosfwpluginbuild/Makefile @@ -0,0 +1,90 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +############################################################################ +# BEGIN of Include definitions +# +include config.mk +# +# END Include definitions +############################################################################# + +.PHONY: all +all: .onosbuild + +.PHONY: clean +clean: + @rm -f .onosbuild ../release/opnfv/onos*.rpm onos*.rpm + @rm -f $(BUILD_BASE)/gitinfo_onos-plugin.txt gitinfo_onos-plugin.txt + +.PHONY: release +release:.onosbuild + @rm -f ../release/opnfv/onos*.rpm + @mkdir -p ../release/opnfv + @cp onos*.rpm ../release/opnfv/ + cp gitinfo_onos-plugin.txt $(BUILD_BASE) + +.onosbuild: + @rm -rf fuel-plugin-onos + git clone $(ONOS_REPO) + cd fuel-plugin-onos; \ + git checkout $(ONOS_BRANCH); \ + if [ ! -z $(ONOS_CHANGE) ]; then \ + git fetch $(ONOS_REPO) $(ONOS_CHANGE); \ + git checkout FETCH_HEAD; \ + fi + INCLUDE_DEPENDENCIES=true fpb --debug --build fuel-plugin-onos/ + @mv fuel-plugin-onos/onos*.rpm . + $(REPOINFO) -r . > gitinfo_onos-plugin.txt + @rm -rf fuel-plugin-onos + @touch .onosbuild + # Store artifact in cache straight away if caching is enabled + # (no .cacheid will be present unless this is a cached build) + test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0 + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + + +# Create a unique hash to be used for getting and putting cache, based on: +# - The SHA1 hash of the HEAD on the plugin repo's $(ONOS_BRANCH) +# - The contents of this Makefile +.cacheid: + @if [ ! -z $(ONOS_CHANGE) ]; then \ + $(CACHETOOL) getcommitid $(ONOS_REPO) $(ONOS_CHANGE) > .cachedata; \ + else \ + $(CACHETOOL) getcommitid $(ONOS_REPO) $(ONOS_BRANCH) > .cachedata; \ + fi + @sha1sum Makefile | awk {'print $$1'} >> .cachedata + @sha1sum config.mk | awk {'print $$1'} >> .cachedata + @echo -n $(UBUNTU_ARCH) | sha1sum | awk {'print $$1'} >> .cachedata + @cat .cachedata | $(CACHETOOL) getid > .cacheid + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + @rm -f .cachedata .cacheid + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: .cacheid + @if $(CACHETOOL) check $(shell cat .cacheid); then \ + $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\ + else \ + echo "No cache item found for $(shell cat .cacheid)" ;\ + exit 0;\ + fi + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: .cacheid + @tar cf - .onosbuild onos*.rpm gitinfo_onos-plugin.txt | $(CACHETOOL) put $(shell cat .cacheid) diff --git a/build/f_isoroot/f_onosfwpluginbuild/config.mk b/build/f_isoroot/f_onosfwpluginbuild/config.mk new file mode 100644 index 000000000..19d9d00d0 --- /dev/null +++ b/build/f_isoroot/f_onosfwpluginbuild/config.mk @@ -0,0 +1,11 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +ONOS_BRANCH=Mitaka +ONOS_REPO=git://git.openstack.org/openstack/fuel-plugin-onos diff --git a/build/f_isoroot/f_ovs-nsh-dpdk-pluginbuild/Makefile b/build/f_isoroot/f_ovs-nsh-dpdk-pluginbuild/Makefile new file mode 100644 index 000000000..2d0d202af --- /dev/null +++ b/build/f_isoroot/f_ovs-nsh-dpdk-pluginbuild/Makefile @@ -0,0 +1,91 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +############################################################################ +# BEGIN of Include definitions +# +include config.mk +# +# END Include definitions +############################################################################# + +.PHONY: all +all: .ovsbuild + +.PHONY: clean +clean: + @rm -f .ovsbuild ../release/opnfv/fuel-plugin-ovs-*.rpm fuel-plugin-ovs-*.rpm + @rm -f $(BUILD_BASE)/gitinfo_ovs-nsh-dpdk-plugin.txt gitinfo_ovs-nsh-dpdk-plugin.txt + +.PHONY: release +release:.ovsbuild + @rm -f ../release/opnfv/fuel-plugin-ovs-*.rpm + @mkdir -p ../release/opnfv + @cp fuel-plugin-ovs*.rpm ../release/opnfv/ + cp gitinfo_ovs-nsh-dpdk-plugin.txt $(BUILD_BASE) + +.ovsbuild: + @rm -rf fuel-plugin-ovs + ../../docker/ubuntu-builder/install_docker.sh + git clone $(OVS_NSH_DPDK_REPO) + cd fuel-plugin-ovs; \ + git checkout $(OVS_NSH_DPDK_BRANCH); \ + if [ ! -z $(OVS_NSH_DPDK_CHANGE) ]; then \ + git fetch $(OVS_NSH_DPDK_REPO) $(OVS_NSH_DPDK_CHANGE); \ + git checkout FETCH_HEAD; \ + fi + INCLUDE_DEPENDENCIES=true fpb --debug --build fuel-plugin-ovs/ + @mv fuel-plugin-ovs/fuel-plugin-ovs*.rpm . + $(REPOINFO) -r . > gitinfo_ovs-nsh-dpdk-plugin.txt + @rm -rf fuel-plugin-ovs + @touch .ovsbuild + # Store artifact in cache straight away if caching is enabled + # (no .cacheid will be present unless this is a cached build) + test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0 + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + + +# Create a unique hash to be used for getting and putting cache, based on: +# - The SHA1 hash of the HEAD on the plugin repo's $(OVS_NSH_DPDK_BRANCH) +# - The contents of this Makefile +.cacheid: + @if [ ! -z $(OVS_NSH_DPDK_CHANGE) ]; then \ + $(CACHETOOL) getcommitid $(OVS_NSH_DPDK_REPO) $(OVS_NSH_DPDK_CHANGE) > .cachedata; \ + else \ + $(CACHETOOL) getcommitid $(OVS_NSH_DPDK_REPO) $(OVS_NSH_DPDK_BRANCH) > .cachedata; \ + fi + @sha1sum Makefile | awk {'print $$1'} >> .cachedata + @sha1sum config.mk | awk {'print $$1'} >> .cachedata + @echo -n $(UBUNTU_ARCH) | sha1sum | awk {'print $$1'} >> .cachedata + @cat .cachedata | $(CACHETOOL) getid > .cacheid + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + @rm -f .cachedata .cacheid + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: .cacheid + @if $(CACHETOOL) check $(shell cat .cacheid); then \ + $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\ + else \ + echo "No cache item found for $(shell cat .cacheid)" ;\ + exit 0;\ + fi + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: .cacheid + @tar cf - .ovsbuild fuel-plugin-ovs*.rpm gitinfo_ovs-nsh-dpdk-plugin.txt | $(CACHETOOL) put $(shell cat .cacheid) diff --git a/build/f_isoroot/f_ovs-nsh-dpdk-pluginbuild/config.mk b/build/f_isoroot/f_ovs-nsh-dpdk-pluginbuild/config.mk new file mode 100644 index 000000000..8effbd26b --- /dev/null +++ b/build/f_isoroot/f_ovs-nsh-dpdk-pluginbuild/config.mk @@ -0,0 +1,12 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +OVS_NSH_DPDK_BRANCH?=074aadce66ef3cf322a00a3cff5c57deb84088b5 +OVS_NSH_DPDK_REPO?=https://review.openstack.org/openstack/fuel-plugin-ovs +OVS_NSH_DPDK_CHANGE?= diff --git a/build/f_isoroot/f_repobuild/Makefile b/build/f_isoroot/f_repobuild/Makefile new file mode 100644 index 000000000..7c6b16304 --- /dev/null +++ b/build/f_isoroot/f_repobuild/Makefile @@ -0,0 +1,91 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +SHELL := /bin/bash +TOP := $(shell pwd) +TMP_ROOT_DIR := $(shell echo "$(MIRROR_UBUNTU_ROOT)" | cut -d "/" -f2) + +include ../../config.mk +include config.mk + +export MOS_VERSION +export OPENSTACK_VERSION + +.PHONY: all +all: nailgun + +nailgun: + sudo apt-get install -y git libxml2-dev libxslt-dev python-dev python-pip libz-dev libyaml-dev createrepo python-yaml + rm -Rf nailgun + sudo mkdir -p /var/www/nailgun + git clone $(FUEL_MIRROR_REPO) + cd fuel-mirror && git checkout -q $(FUEL_MIRROR_COMMIT) + sudo pip install -U -r ./fuel-mirror/requirements.txt + sudo pip install ./fuel-mirror + sudo pip install ./fuel-mirror/contrib/fuel_mirror + ./opnfv_mirror_conf.py + sudo fuel-mirror --debug --config ./opnfv-config.yaml create --group ubuntu --pattern=ubuntu + sudo chmod -R 755 /var/www/nailgun + cp -Rp /var/www/nailgun . + # On the end we want to have ubuntu repository in mirrors/ubuntu directory + -if [ "$(MIRROR_UBUNTU_ROOT)" != "/ubuntu/" ]; then \ + mkdir -p nailgun/mirrors/ubuntu;\ + mv nailgun/mirrors$(MIRROR_UBUNTU_ROOT)* nailgun/mirrors/ubuntu;\ + [ "$(MIRROR_UBUNTU_ROOT)" != "/" ] && rm -rf nailgun/mirrors/$(TMP_ROOT_DIR);\ + fi + # Store artifact in cache straight away if caching is enabled + # (no .cacheid will be present unless this is a cached build) + test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0 + +.PHONY: clean +clean: + @rm -rf ../release/opnfv/nailgun nailgun fuel-mirror opnfv-config.yaml ubuntu.yaml + +.PHONY: release +release:nailgun + @rm -Rf ../release/opnfv/nailgun + @mkdir -p ../release/opnfv + @cp -Rp nailgun ../release/opnfv/nailgun + @cp fuel_bootstrap_cli.yaml ../release/opnfv/ + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + +# Create a unique hash to be used for getting and putting cache, based on: +# - Year and week (causing the cache to be rebuilt weekly) +# - The contents of this Makefile +.cacheid: + date +"Repocache %G%V" > .cachedata + sha1sum Makefile >> .cachedata + sha1sum config.mk >> .cachedata + $(CACHETOOL) packages >> .cachedata + echo -n $(UBUNTU_ARCH) | sha1sum | awk {'print $$1'} >> .cachedata + cat .cachedata | $(CACHETOOL) getid > .cacheid + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + rm -f .cachedata .cacheid + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: .cacheid + @if $(CACHETOOL) check $(shell cat .cacheid); then \ + $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\ + else \ + echo "No cache item found for $(shell cat .cacheid)" ;\ + exit 0;\ + fi + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: .cacheid + @tar cf - nailgun | $(CACHETOOL) put $(shell cat .cacheid) diff --git a/build/f_isoroot/f_repobuild/config.mk b/build/f_isoroot/f_repobuild/config.mk new file mode 100644 index 000000000..d81732849 --- /dev/null +++ b/build/f_isoroot/f_repobuild/config.mk @@ -0,0 +1,13 @@ +############################################################################## +# Copyright (c) 2016 Ericsson AB and others. +# mskalski@mirantis.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +FUEL_MIRROR_REPO?=https://github.com/openstack/fuel-mirror +# Point to the commit where 302 redirects are handled +# https://bugs.launchpad.net/fuel/mitaka/+bug/1593674 +FUEL_MIRROR_COMMIT?=192a3d9f8f993afb12c5108dd9339c6688c23e11 diff --git a/build/f_isoroot/f_repobuild/fuel_bootstrap_cli.yaml b/build/f_isoroot/f_repobuild/fuel_bootstrap_cli.yaml new file mode 100644 index 000000000..fcf4257f1 --- /dev/null +++ b/build/f_isoroot/f_repobuild/fuel_bootstrap_cli.yaml @@ -0,0 +1,75 @@ +############################################################################## +# Copyright (c) 2015,2016 Ericsson AB and others. +# mskalski@mirantis.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- + root_ssh_authorized_file: /root/.ssh/id_rsa.pub + extend_kopts: "biosdevname=0 net.ifnames=1 debug ignore_loglevel log_buf_len=10M print_fatal_signals=1 LOGLEVEL=8" + ubuntu_release: trusty + extra_dirs: + - /usr/share/fuel_bootstrap_cli/files/trusty + output_dir: /tmp/ + kernel_flavor: linux-image-generic-lts-trusty + packages: + - fuel-agent + - hwloc + - hpsa-dkms + - i40e-dkms + - linux-firmware + - linux-firmware-nonfree + - linux-headers-generic + - live-boot + - live-boot-initramfs-tools + - mc + - mcollective + - msmtp-mta + - multipath-tools + - multipath-tools-boot + - nailgun-agent + - nailgun-mcagents + - network-checker + - ntp + - openssh-client + - openssh-server + - squashfs-tools + - ubuntu-minimal + - vim + - wget + - xz-utils + bootstrap_images_dir: /var/www/nailgun/bootstraps + active_bootstrap_symlink: /var/www/nailgun/bootstraps/active_bootstrap + flavor: ubuntu + http_proxy: "" + https_proxy: "" + repos: + - name: ubuntu + section: "main universe multiverse" + uri: "http://127.0.0.1:8080/mirrors/ubuntu" + priority: + suite: trusty + type: deb + - name: ubuntu-updates + section: "main universe multiverse" + uri: "http://127.0.0.1:8080/mirrors/ubuntu" + priority: + suite: trusty-updates + type: deb + - name: ubuntu-security + section: "main universe multiverse" + uri: "http://127.0.0.1:8080/mirrors/ubuntu" + priority: + suite: trusty-security + type: deb + - name: mos + section: "main restricted" + uri: "http://127.0.0.1:8080/ubuntu/x86_64" + priority: 1050 + suite: mos9.0 + type: deb + skip_default_img_build: false + direct_repo_addresses: + - "127.0.0.1" diff --git a/build/f_isoroot/f_repobuild/opnfv_mirror_conf.py b/build/f_isoroot/f_repobuild/opnfv_mirror_conf.py new file mode 100755 index 000000000..1c7eb591a --- /dev/null +++ b/build/f_isoroot/f_repobuild/opnfv_mirror_conf.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# mskalski@mirantis.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import os +import yaml + +current_snapshot = os.environ["LATEST_TARGET_UBUNTU"] +mos_version = os.environ['MOS_VERSION'] +openstack_version = os.environ['OPENSTACK_VERSION'] +mos_ubuntu = os.environ['MIRROR_MOS_UBUNTU'] +mos_ubuntu_root = os.environ['MIRROR_MOS_UBUNTU_ROOT'] +mirror_ubuntu = os.environ['MIRROR_UBUNTU_URL'] +if os.environ.get('BUILD_FUEL_PLUGINS'): + plugins = os.environ['BUILD_FUEL_PLUGINS'] +else: + plugins = os.environ['PLUGINS'] + + +configuration_file = open('fuel-mirror/contrib/fuel_mirror/etc/config.yaml').read() +conf = yaml.load(configuration_file) +conf['pattern_dir'] = '.' +conf['openstack_version'] = openstack_version +conf['mos_version'] = mos_version + +with open('opnfv-config.yaml', 'w') as outfile: + outfile.write( yaml.dump(conf, default_flow_style=False) ) + +pattern_file = open('fuel-mirror/contrib/fuel_mirror/data/ubuntu.yaml').read() +pattern = yaml.load(pattern_file) +pattern['mos_baseurl'] = "http://{}{}".format(mos_ubuntu, mos_ubuntu_root) +pattern['ubuntu_baseurl'] = mirror_ubuntu +for group in pattern['groups']['mos']: + group['uri'] = pattern['mos_baseurl'] +for group in pattern['groups']['ubuntu']: + group['uri'] = pattern['ubuntu_baseurl'] + +for plugin in plugins.split(): + path = "../{}/packages.yaml".format(plugin) + if os.path.isfile(path): + f = open(path).read() + plugin_yaml = yaml.load(f) + plugin_set = set(plugin_yaml['packages']) + main_set = set(pattern['packages']) + new_packages = plugin_set - main_set + print "Plugin {} require new packages: {}".format(plugin, ', '.join(new_packages)) + pattern['packages'] = pattern['packages'] + list(new_packages) + +pattern['requirements']['ubuntu'] = pattern['packages'] + +with open('ubuntu.yaml', 'w') as outfile: + outfile.write( yaml.safe_dump(pattern, default_flow_style=False) ) diff --git a/build/f_isoroot/f_repobuild/select_ubuntu_repo.sh b/build/f_isoroot/f_repobuild/select_ubuntu_repo.sh new file mode 100755 index 000000000..20b3485a1 --- /dev/null +++ b/build/f_isoroot/f_repobuild/select_ubuntu_repo.sh @@ -0,0 +1,40 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2015,2016 Ericsson AB and others. +# mskalski@mirantis.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# Try to choose close ubuntu mirror from mirrors.txt, but "whitewash" this +# against the full repo list to removed mirrors not up-to-date. + +# Some Ubuntu mirrors seem less reliable for this type of mirroring - +# as they are discoved they can be added to the blacklist below in order +# for them not to be considered. +BLACKLIST="mirror.clibre.uqam.ca" + +#NOTE: For now the mirror selection is disabled due to issues not yet +# understood/resolved. +#for url in $((curl -s https://launchpad.net/ubuntu/+archivemirrors | \ +# grep -P -B8 "statusUP|statusSIX" | \ +# grep -o -P "(f|ht)tp.*\"" | \ +# sed 's/"$//' | sort | uniq; \ +# curl -s http://mirrors.ubuntu.com/mirrors.txt | sort | uniq) | \ +# sort | uniq -d) +#do +# host=$(echo $url | cut -d'/' -f3) +# echo ${BLACKLIST} | grep -q ${host} && continue +# if curl -s -o /dev/null --head --fail "$url"; then +# echo $url +# exit 0 +# else +# continue +# fi +#done + +# If no suitable local mirror can be found, +# the default archive is returned instead. +echo "http://archive.ubuntu.com/ubuntu/" diff --git a/build/f_isoroot/f_vsperfpluginbuild/Makefile b/build/f_isoroot/f_vsperfpluginbuild/Makefile new file mode 100644 index 000000000..73de611ff --- /dev/null +++ b/build/f_isoroot/f_vsperfpluginbuild/Makefile @@ -0,0 +1,92 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +############################################################################ +# BEGIN of Include definitions +# +include config.mk +# +# END Include definitions +############################################################################# + +.PHONY: all +all: .vsperfbuild + +.PHONY: clean +clean: + @rm -f .vsperfbuild ../release/opnfv/fuel-plugin-vsperf*.rpm fuel-plugin-vsperf*.rpm + @rm -f $(BUILD_BASE)/gitinfo_vsperf-plugin.txt gitinfo_vsperf-plugin.txt + +.PHONY: release +release:.vsperfbuild + @rm -f ../release/opnfv/fuel-plugin-vsperf*.rpm + @mkdir -p ../release/opnfv + @cp fuel-plugin-vsperf*.rpm ../release/opnfv/ + cp gitinfo_vsperf-plugin.txt $(BUILD_BASE) + +.vsperfbuild: + @rm -rf vswitchperf + ../../docker/ubuntu-builder/install_docker.sh + git clone $(VSPERF_REPO) vswitchperf + cd vswitchperf; \ + git checkout $(VSPERF_BRANCH); \ + if [ ! -z $(VSPERF_CHANGE) ]; then \ + git fetch $(VSPERF_REPO) $(VSPERF_CHANGE); \ + git checkout FETCH_HEAD; \ + fi + cd vswitchperf; \ + INCLUDE_DEPENDENCIES=true fpb --debug --build fuel-plugin-vsperf/ + @mv vswitchperf/fuel-plugin-vsperf/fuel-plugin-vsperf*.rpm . + $(REPOINFO) -r . > gitinfo_vsperf-plugin.txt + @rm -rf fuel-plugin-vsperf + @touch .vsperfbuild + # Store artifact in cache straight away if caching is enabled + # (no .cacheid will be present unless this is a cached build) + test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0 + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + + +# Create a unique hash to be used for getting and putting cache, based on: +# - The SHA1 hash of the HEAD on the plugin repo's $(VSPERF_BRANCH) +# - The contents of this Makefile +.cacheid: + @if [ ! -z $(VSPERF_CHANGE) ]; then \ + $(CACHETOOL) getcommitid $(VSPERF_REPO) $(VSPERF_CHANGE) > .cachedata; \ + else \ + $(CACHETOOL) getcommitid $(VSPERF_REPO) $(VSPERF_BRANCH) > .cachedata; \ + fi + @sha1sum Makefile | awk {'print $$1'} >> .cachedata + @sha1sum config.mk | awk {'print $$1'} >> .cachedata + @echo -n $(UBUNTU_ARCH) | sha1sum | awk {'print $$1'} >> .cachedata + @cat .cachedata | $(CACHETOOL) getid > .cacheid + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + @rm -f .cachedata .cacheid + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: .cacheid + @if $(CACHETOOL) check $(shell cat .cacheid); then \ + $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\ + else \ + echo "No cache item found for $(shell cat .cacheid)" ;\ + exit 0;\ + fi + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: .cacheid + @tar cf - .vsperfbuild fuel-plugin-vsperf*.rpm gitinfo_vsperf-plugin.txt | $(CACHETOOL) put $(shell cat .cacheid) diff --git a/build/f_isoroot/f_vsperfpluginbuild/config.mk b/build/f_isoroot/f_vsperfpluginbuild/config.mk new file mode 100644 index 000000000..35f4059f1 --- /dev/null +++ b/build/f_isoroot/f_vsperfpluginbuild/config.mk @@ -0,0 +1,12 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +VSPERF_BRANCH?=5a0c6772d255aeb0ab1e6246c91bbeb56bb3a239 +VSPERF_REPO?=https://gerrit.opnfv.org/gerrit/vswitchperf.git +VSPERF_CHANGE?= diff --git a/build/f_isoroot/f_yardstick-pluginbuild/Makefile b/build/f_isoroot/f_yardstick-pluginbuild/Makefile new file mode 100644 index 000000000..32de3b3f4 --- /dev/null +++ b/build/f_isoroot/f_yardstick-pluginbuild/Makefile @@ -0,0 +1,92 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# ruijing.guo@intel.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +############################################################################ +# BEGIN of Include definitions +# +include config.mk +# +# END Include definitions +############################################################################# + +.PHONY: all +all: .yardstickbuild + +.PHONY: clean +clean: + @rm -f .yardstickbuild ../release/opnfv/fuel-plugin-yardstick*.rpm fuel-plugin-yardstick*.rpm + @rm -f $(BUILD_BASE)/gitinfo_yardstick-plugin.txt gitinfo_yardstick-plugin.txt + +.PHONY: release +release:.yardstickbuild + @rm -f ../release/opnfv/fuel-plugin-yardstick*.rpm + @mkdir -p ../release/opnfv + @cp fuel-plugin-yardstick*.rpm ../release/opnfv/ + cp gitinfo_yardstick-plugin.txt $(BUILD_BASE) + +.yardstickbuild: + @rm -rf yardstick + git clone $(YARDSTICK_REPO) yardstick + cd yardstick; \ + git checkout $(YARDSTICK_BRANCH); \ + if [ ! -z $(YARDSTICK_CHANGE) ]; then \ + git fetch $(YARDSTICK_REPO) $(YARDSTICK_CHANGE); \ + git checkout FETCH_HEAD; \ + fi + cd yardstick; \ + INCLUDE_DEPENDENCIES=true fpb --debug --build fuel-plugin/ + @mv yardstick/fuel-plugin/fuel-plugin-yardstick*.rpm . + $(REPOINFO) -r . > gitinfo_yardstick-plugin.txt + @rm -rf fuel-plugin-yardstick + @touch .yardstickbuild + # Store artifact in cache straight away if caching is enabled + # (no .cacheid will be present unless this is a cached build) + test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0 + +############################################################################# +# Cache operations - only used when building through ci/build.sh +############################################################################# + + +# Create a unique hash to be used for getting and putting cache, based on: +# - The SHA1 hash of the HEAD on the plugin repo's $(YARDSTICK_BRANCH) +# - The contents of this Makefile +.cacheid: + @if [ ! -z $(YARDSTICK_CHANGE) ]; then \ + $(CACHETOOL) getcommitid $(YARDSTICK_REPO) $(YARDSTICK_CHANGE) > .cachedata; \ + else \ + $(CACHETOOL) getcommitid $(YARDSTICK_REPO) $(YARDSTICK_BRANCH) > .cachedata; \ + fi + @sha1sum Makefile | awk {'print $$1'} >> .cachedata + @sha1sum config.mk | awk {'print $$1'} >> .cachedata + @echo -n $(UBUNTU_ARCH) | sha1sum | awk {'print $$1'} >> .cachedata + @cat .cachedata | $(CACHETOOL) getid > .cacheid + +# Clean local data related to caching - called prior to ordinary build +.PHONY: clean-cache +clean-cache: clean + @rm -f .cachedata .cacheid + +# Try to download cache - called prior to ordinary build +.PHONY: get-cache +get-cache: .cacheid + @if $(CACHETOOL) check $(shell cat .cacheid); then \ + $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\ + else \ + echo "No cache item found for $(shell cat .cacheid)" ;\ + exit 0;\ + fi + +# Store cache if not already stored - called after ordinary build +.PHONY: put-cache +put-cache: .cacheid + @tar cf - .yardstickbuild fuel-plugin-yardstick*.rpm gitinfo_yardstick-plugin.txt | $(CACHETOOL) put $(shell cat .cacheid) diff --git a/build/f_isoroot/f_yardstick-pluginbuild/config.mk b/build/f_isoroot/f_yardstick-pluginbuild/config.mk new file mode 100644 index 000000000..88b1ea604 --- /dev/null +++ b/build/f_isoroot/f_yardstick-pluginbuild/config.mk @@ -0,0 +1,13 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@eicsson.com +# ruijing.guo@intel.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +YARDSTICK_BRANCH?=86b9fc4f434c72bd276e4bf1ce7d7f5a04b150b2 +YARDSTICK_REPO?=https://gerrit.opnfv.org/gerrit/yardstick.git +YARDSTICK_CHANGE?= diff --git a/build/fuel_build_loop b/build/fuel_build_loop new file mode 100755 index 000000000..324f28c1a --- /dev/null +++ b/build/fuel_build_loop @@ -0,0 +1,31 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2016 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +echo "MIRROR_MOS_UBUNTU_ROOT=${MIRROR_MOS_UBUNTU_ROOT}" +echo "MIRROR_FUEL=${MIRROR_FUEL}" + +maxcount=3 +cnt=0 +rc=1 +while [ $cnt -lt $maxcount ] && [ $rc -ne 0 ] +do + cnt=$[cnt + 1] + echo -e "\n\n\n*** Starting build attempt # $cnt" + cd /tmp/fuel-main + make iso + rc=$? + if [ $rc -ne 0 ]; then + echo "### Build failed with rc $rc ###" + else + echo "### Build successful at attempt # $cnt" + fi +done +exit $rc diff --git a/build/install/apt-ftparchive-deb.conf b/build/install/apt-ftparchive-deb.conf new file mode 100644 index 000000000..0d15aec6f --- /dev/null +++ b/build/install/apt-ftparchive-deb.conf @@ -0,0 +1,35 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +Dir { + ArchiveDir "."; +}; + +TreeDefault { + Directory "pool"; +}; + +BinDirectory "pool/main" { + Packages "dists/trusty/main/binary-amd64/Packages"; + BinOverride "./indices/override.trusty.main"; + ExtraOverride "./indices/override.trusty.extra.main"; +}; + +Default { + Packages { + Extensions ".deb"; + Compress ". gzip"; + }; +}; + +Contents { + Compress "gzip"; +}; + diff --git a/build/install/apt-ftparchive-release.conf b/build/install/apt-ftparchive-release.conf new file mode 100644 index 000000000..02706bd7d --- /dev/null +++ b/build/install/apt-ftparchive-release.conf @@ -0,0 +1,18 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +APT::FTPArchive::Release::Origin "Ubuntu"; +APT::FTPArchive::Release::Label "Ubuntu"; +APT::FTPArchive::Release::Suite "trusty"; +APT::FTPArchive::Release::Version "1.04"; +APT::FTPArchive::Release::Codename "trusty"; +APT::FTPArchive::Release::Architectures "amd64"; +APT::FTPArchive::Release::Components "main"; +APT::FTPArchive::Release::Description "Ubuntu Trusty Tahr 14.04 LTS"; diff --git a/build/install/apt-ftparchive-udeb.conf b/build/install/apt-ftparchive-udeb.conf new file mode 100644 index 000000000..3b5b239a6 --- /dev/null +++ b/build/install/apt-ftparchive-udeb.conf @@ -0,0 +1,33 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +Dir { + ArchiveDir "."; +}; + +TreeDefault { + Directory "pool"; +}; + +BinDirectory "pool/debian-installer" { + Packages "dists/trusty/main/debian-installer/binary-amd64/Packages"; + BinOverride "./indices/override.trusty.main.debian-installer"; +}; + +Default { + Packages { + Extensions ".udeb"; + Compress ". gzip"; + }; +}; + +Contents { + Compress "gzip"; +}; diff --git a/build/install/install.sh b/build/install/install.sh new file mode 100755 index 000000000..c63241974 --- /dev/null +++ b/build/install/install.sh @@ -0,0 +1,482 @@ +#!/bin/bash -e +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + + +my_exit() { + rc=$? + + cd /tmp + + if [ -n "$TMP_HOSTMOUNT" ]; then + if [ -d "$TMP_HOSTMOUNT" ]; then + fusermount -u $TMP_HOSTMOUNT + rmdir $TMP_HOSTMOUNT + fi + fi + + if [ -d "$TMP_OLDISO" ]; then + fusermount -u $TMP_OLDISO + rmdir $TMP_OLDISO + fi + + if [ -f "$CONF" ]; then + rm $CONF + fi + + if [ -d "$TMP_ISOPUPPET" ]; then + rm -Rf $TMP_ISOPUPPET + fi +} + +get_deb_name() { + ar p $1 control.tar.gz | tar xzO ./control | grep "^Package:.* " | sed 's/.* //' + if [ $PIPESTATUS -ne 0 ]; then + echo "Error in get_deb_name($1)" + exit 1 + fi +} + +get_deb_rev() { + ar p $1 control.tar.gz | tar xzO ./control | grep "^Version:.* " | sed 's/.* //' + if [ $PIPESTATUS -ne 0 ]; then + echo "Error in get_deb_rev($1)" + exit 1 + fi +} + + +# Added logic for ".orig" files: +# 1. Is there an .orig file for the new file? +# 2. If the file is not present in base ISO -> Error! +# 3. If the file is changed i base ISO -> Error! (need manual rebase) +# 4. If there is no .orig file, but file is present in base ISO: Error! +verify_orig_files() { + OLDDIR=$1 + NEWDIR=$2 + + pushd $NEWDIR >/dev/null + for f in $(find * -type f -name '*.orig') + do + origfile=$NEWDIR/$f + oldfile=$OLDDIR/$(echo $f | sed 's/.orig$//') + newfile=$NEWDIR/$(echo $f | sed 's/.orig$//') + + origfile=${newfile}.orig + # If no corresponding base file, error + if [ ! -f $oldfile ]; then + printf "\n\n\n\n" + echo "Error: found ${newfile} but no" + echo "Error: ${oldfile}" + echo "Error: Manual rebase is needed!" + printf "\n\n\n\n" + exit 1 + fi + + # If orig file differs from base file, error + if ! diff -q $origfile $oldfile > /dev/null; then + printf "\n\n\n\n" + echo "Error: $origfile differs from" + echo "Error: $oldfile!" + echo "Error: Manual rebase is needed!" + printf "\n\n\n\n" + exit 1 + fi + + done + + + # Check that there we're not overwriting oldfiles without having a ".orig" copy + for f in $(find * -type f ! -name '*.orig') + do + newfile=$NEWDIR/$(echo $f | sed 's/.orig$//') + origfile=${newfile}.orig + oldfile=$OLDDIR/$f + if [ -f $oldfile ]; then + if [ ! -f $origfile ]; then + printf "\n\n\n\n" + echo "Error: Will overwrite $oldfile, but there is no" + echo "Error: $origfile!" + echo "Error: You need to create the `basename $origfile`!" + printf "\n\n\n\n" + exit 1 + fi + fi + done + + + popd >/dev/null +} + +prep_make_live() { + DEST=$TMP_HOSTMOUNT + REPO=$DEST/var/www/nailgun/ubuntu/fuelweb/x86_64 + echo "Live install" + ssh-copy-id root@$FUELHOST + sshfs root@1${FUELHOST}:/ $TMP_HOSTMOUNT + + if [ -f $REPO/dists/trusty/main/binary-amd64/Packages.backup ]; then + echo "Error - found backup file for Packages!" + exit 1 + fi + + if [ -f $REPO/dists/trusty/main/binary-amd64/Packages.gz.backup ]; then + echo "Error - found backup file for Packages.gz!" + exit 1 + fi + + if [ -f $REPO/dists/trusty/Release.backup ]; then + echo "Error - found backup file for Release!" + exit 1 + fi + + if [ -d $DEST/etc/puppet.backup ]; then + echo "Error - found backup file for Puppet!" + exit 1 + fi + + cp $REPO/dists/trusty/main/binary-amd64/Packages $REPO/dists/trusty/main/binary-amd64/Packages.backup + cp $REPO/dists/trusty/main/binary-amd64/Packages.gz $REPO/dists/trusty/main/binary-amd64/Packages.gz.backup + cp $REPO/dists/trusty/Release $REPO/dists/trusty/Release.backup + cp -Rvp $DEST/etc/puppet $DEST/etc/puppet.backup +} + +post_make_live() { + if [ -d $TOP/release/puppet/modules ]; then + echo "Installing into Puppet:" + cd $TOP/release/puppet/modules + if [ `ls -1 | wc -l` -gt 0 ]; then + for dir in * + do + echo " $dir" + cp -Rp $dir $DEST/etc/puppet/modules + done + fi + fi +} + +make_live() { + prep_make_live + copy_packages + post_make_live +} + + +prep_make_iso() { + DEST=$TOP/newiso + REPO=$DEST/ubuntu + echo "Preparing ISO..." + echo "Unpack of old ISO..." + if [ -d newiso ]; then + chmod -R 755 newiso + rm -rf newiso + fi + mkdir newiso + fusermount -u $TMP_OLDISO 2>/dev/null || cat /dev/null + fuseiso -p $ORIGISO $TMP_OLDISO + sleep 1 + cd $TMP_OLDISO + find . | cpio -pd $TOP/newiso + cd .. + fusermount -u $TMP_OLDISO + rm -Rf $TMP_OLDISO + chmod -R 755 $TOP/newiso +} + +make_iso_image() { + echo "Making ISO..." + cd $DEST + find . -name TRANS.TBL -exec rm {} \; + rm -rf rr_moved + + mkisofs --quiet -r -V "$VOLUMEID" -publisher "$PUBLISHER" \ + -p `git rev-parse --verify HEAD` -J -R -b isolinux/isolinux.bin \ + -no-emul-boot \ + -boot-load-size 4 -boot-info-table \ + --hide-rr-moved \ + --joliet-long \ + -x "lost+found" -o $NEWISO . + + isoinfo -d -i $NEWISO +} + +# iso_copy_puppet: Create a new puppet-slave.tgz for the iso +iso_copy_puppet() { + echo "Installing into Puppet..." + mkdir -p $TMP_ISOPUPPET/release/puppet + cd $TMP_ISOPUPPET/release/puppet + tar xzf $DEST/puppet-slave.tgz + cd $TOP/release/puppet/modules + + # Remove all .orig files before copying as they now have been verfied + + if [ -d $TOP/release/puppet/modules ]; then + if [ `ls -1 | wc -l` -gt 0 ]; then + verify_orig_files $TMP_ISOPUPPET/release/puppet $TOP/release/puppet/modules + find $TOP/release/puppet/modules -type f -name '*.orig' -exec rm {} \; + for dir in $TOP/release/puppet/modules/* + do + echo " $dir" + cp -Rp $dir $TMP_ISOPUPPET/release/puppet + done + fi + fi + + cd $TMP_ISOPUPPET/release/puppet + tar czf $DEST/puppet-slave.tgz . + cd $TOP + rm -Rf $TMP_ISOPUPPET +} + +# iso_modify_image: Add/patch files in the ISO root +iso_modify_image () { + # TODO: Add logic for ".orig" files (hey! make a function!), which would look + # something like: + # 1. Is there an .orig file? + # 2. If the file is not present in origiso -> Error exit + # 3. If the file is changed in origiso -> Error exit (need manual rebase) + # 4. Otherwise continue, but don't copy orig file (or maybe we should?) + # ... and corresponding reverse logic: + # 1. If there is no .orig file, but file is present in origiso -> Error exit + echo "Modify ISO files (wild copy)..." + + verify_orig_files $DEST $TOP/release/isoroot + # Remove all .orig files before copying as they now have been verfied + find $TOP/release/isoroot -type f -name '*.orig' -exec rm {} \; + + cd $TOP/release/isoroot + cp -Rvp . $DEST + + # Add all Git info files + sort $TOP/gitinfo*.txt > $DEST/gitinfo.txt + cp $DEST/gitinfo.txt $REPORTFILE +} + +make_iso() { + prep_make_iso + copy_packages + #iso_copy_puppet + iso_modify_image + make_iso_image +} + +copy_packages() { + echo "Copying Debian packages..." + cd $TOP/release/packages/ubuntu/pool/debian-installer + + for udeb in `ls -1 | grep '\.udeb$'` + do + echo " $udeb" + cp $udeb $REPO/pool/debian-installer + echo "Did not expect a package here, not supported" + exit 1 + done + + cd $TOP/release/packages/ubuntu/pool/main + for deb in `ls -1 | grep '\.deb$'` + do + echo " $deb" + cp $deb $REPO/pool/main + echo "Did not expect a package here, not supported" + exit 1 + done + + echo "Running Fuel package patch file" + pushd $REPO/pool/main > /dev/null + + for line in `cat $TOP/apply_patches | grep -v "^#" | grep -v "^$"`; do + echo "Line is $line" + echo "Did not expect a line here, not supported" + exit 1 + ref=`echo $line | cut -d '>' -f 1` + origpkg=`echo $line| cut -d '>' -f 2` + url=`echo $line | cut -d '>' -f 3` + + if [ -z "$origpkg" ]; then + echo "Error: No origpkg for patching" + exit 1 + fi + + if [ -z "$url" ]; then + echo "Error: No url for patching" + exit 1 + fi + + if [ -z "$ref" ]; then + echo "Error: No reference text for patching" + exit 1 + fi + + echo "CM: Patching Fuel package for $ref" | tee -a $REPORTFILE + echo "CM: Replacing package $origpkg with $url" | tee -a $REPORTFILE + oldrev=`get_deb_rev $origpkg` + rm $origpkg + wget --quiet $url + topkg=`basename $url` + echo "CM: MD5 of new package:" | tee -a $REPORTFILE + md5sum $topkg | tee -a $REPORTFILE + + patchname=`get_deb_name $topkg` + patchrev=`get_deb_rev $topkg` + echo "Correcting dependencies towards $patchname rev $patchrev - old rev $oldrev" | tee -a $REPORTFILE + $TOP/patch-packages/tools/correct_deps $patchname $oldrev $patchrev | tee -a $REPORTFILE + if [ $PIPESTATUS -ne 0 ]; then + exit 1 + fi + done + + printf "Done running Fuel patch file\n\n" + echo "Running add packages file" + for line in `cat $TOP/add_opnfv_packages | grep -v "^#" | grep -v "^$"`; do + echo "Line is $line" + echo "Did not expect a line here, not supported" + exit 1 + ref=`echo $line | cut -d '>' -f 1` + origpkg=`echo $line| cut -d '>' -f 2` + url=`echo $line | cut -d '>' -f 3` + + if [ -z "$origpkg" ]; then + echo "Error: No origpkg for patching" + exit 1 + fi + + if [ -z "$url" ]; then + echo "Error: No url for patching" + exit 1 + fi + + if [ -z "$ref" ]; then + echo "Error: No reference text for patching" + exit 1 + fi + + if [ "$origpkg" != "NONE" ]; then + echo "CM: Patching added package for $ref" | tee -a $REPORTFILE + echo "CM: Replacing package $origpkg with $url" | tee -a $REPORTFILE + oldrev=`get_deb_rev $origpkg` + rm $origpkg + else + echo "CM: Adding previoulsy uninstalled package for $ref" tee -a $REPORTFILE + fi + wget --quiet $url + topkg=`basename $url` + echo "CM: MD5 of new package:" | tee -a $REPORTFILE + md5sum $topkg | tee -a $REPORTFILE + if [ "$origpkg" != "NONE" ]; then + patchname=`get_deb_name $topkg` + patchrev=`get_deb_rev $topkg` + echo "Correcting dependencies towards $patchname rev $patchrev - old rev $oldrev" | tee -a $REPORTFILE + $TOP/patch-packages/tools/correct_deps $patchname $oldrev $patchrev | tee -a $REPORTFILE + if [ $PIPESTATUS -ne 0 ]; then + exit 1 + fi + fi + done + printf "Done running add packages file\n\n" + + popd > /dev/null + + if [ -f $TOP/patch-packages/release/patch-replacements ]; then + echo "Applying package patches" | tee -a $REPORTFILE + pushd $REPO/pool/main > /dev/null + printf "\n\n" | tee -a $REPORTFILE + for line in `cat $TOP/patch-packages/release/patch-replacements` + do + echo "Did not expect a line here, not supported" + exit 1 + frompkg=`echo $line | cut -d ">" -f 1` + topkg=`echo $line | cut -d ">" -f 2` + echo "CM: Applying patch to $frompkg" | tee -a $REPORTFILE + echo "CM: New package rev after patch: $topkg" | tee -a $REPORTFILE + + if [ ! -f $frompkg ]; then + echo "Error: Can't find $frompkg in repo" + exit 1 + else + oldrev=`get_deb_rev $frompkg` + echo "Removing $frompkg from repo" + rm $frompkg + fi + + if [ ! -f $TOP/patch-packages/release/packages/$topkg ]; then + echo "Error: Can't find $topkg in patch release" + exit 1 + else + echo "Adding $topkg to repo" + cp $TOP/patch-packages/release/packages/$topkg . + fi + + patchname=`get_deb_name $topkg` + patchrev=`get_deb_rev $topkg` + echo "Correcting dependencies towards $patchname rev $patchrev - old rev $oldrev" | tee -a $REPORTFILE + $TOP/patch-packages/tools/correct_deps $patchname $oldrev $patchrev | tee -a $REPORTFILE + if [ $PIPESTATUS -ne 0 ]; then + exit 1 + fi + done + popd > /dev/null + fi + + echo "Generating metadata..." + pushd $REPO > /dev/null + + # The below methods are from 15B + APT_REL_CONF="$TOP/install/apt-ftparchive-release.conf" + APT_DEB_CONF="$TOP/install/apt-ftparchive-deb.conf" + APT_UDEB_CONF="$TOP/install/apt-ftparchive-udeb.conf" + + echo Not running echo apt-ftparchive -c "${APT_REL_CONF}" generate "${APT_DEB_CONF}" + echo Not running apt-ftparchive -c "${APT_REL_CONF}" generate "${APT_DEB_CONF}" + echo Not running apt-ftparchive generate "${APT_UDEB_CONF}" + echo Not running apt-ftparchive generate "${APT_UDEB_CONF}" + + # Fuel also needs this index file + # cat dists/trusty/main/binary-amd64/Packages | \ + # awk '/^Package:/{pkg=$2} + # /^Version:/{print pkg ": \"" $2 "\""}' > ubuntu-versions.yaml + # cp ubuntu-versions.yaml $DEST + + # apt-ftparchive -c "${APT_REL_CONF}" release dists/trusty/ > dists/trusty/Release + # gzip -9cf dists/trusty/Release > dists/trusty/Release.gz + + popd > /dev/null + +} + + +############################################################################# + +trap my_exit EXIT + +CONF=`mktemp /tmp/XXXXXXX` +MODE=$1 +TOP=`pwd` + +if [ $MODE = "iso" ]; then + PUBLISHER="OPNFV" + TMP_OLDISO=`mktemp -d /tmp/XXXXXXX` + TMP_ISOPUPPET=`mktemp -d /tmp/XXXXXXX` + ORIGISO=$2 + NEWISO=$3 + VOLUMEID="$4_$5" + REPORTFILE="${NEWISO}.txt" + echo "Opening reportfile at $REPORTFILE" + touch $REPORTFILE + if [ ! -f $ORIGISO ]; then + echo "Can't find original iso at $ORIGISO" + rm $CONF + exit 1 + fi + + make_iso +else + echo "Unknown mode: $MODE" + exit 1 +fi diff --git a/build/install/uninstall.sh b/build/install/uninstall.sh new file mode 100755 index 000000000..a9e74bc39 --- /dev/null +++ b/build/install/uninstall.sh @@ -0,0 +1,79 @@ +#!/bin/bash -e +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + + +my_exit() { + cd /tmp + if [ -d "$MOUNT" ]; then + fusermount -u $MOUNT + rmdir $MOUNT + fi +} +trap my_exit EXIT + +echo "Live uninstall is currently disabled as it is not tested" +exit 1 + +TOP=`pwd` +MOUNT=`mktemp -d /tmp/XXXXXXX` +ssh-copy-id root@10.20.0.2 +sshfs root@10.20.0.2:/ $MOUNT + +DEST=$MOUNT +REPO=$DEST/var/www/nailgun/ubuntu/fuelweb/x86_64 + +cd $REPO +if [ ! -f $REPO/dists/trusty/main/binary-amd64/Packages.backup ]; then + echo "Error - didn't find backup file for Packages!" + exit 1 +fi + +if [ ! -f $REPO/dists/trusty/main/binary-amd64/Packages.gz.backup ]; then + echo "Error - didn't find backup file for Packages.gz!" + exit 1 +fi + +if [ ! -f $REPO/dists/trusty/Release.backup ]; then + echo "Error - didn't find backup file for Release!" + exit 1 +fi + +if [ ! -f $DEST/etc/puppet/manifests/site.pp.backup ]; then + echo "Error - didn't find backup file for site.pp!" + exit 1 +fi + +echo "Removing Debian packages:" +cd $TOP/release/pool/main +for deb in *.deb +do + echo " $deb" + rm -Rf $REPO/pool/main/$deb +done +cd $REPO + +echo "Removing Puppet modules:" +cd $TOP/puppet/modules +for dir in * +do + echo " $dir" + rm -Rf $DEST/etc/puppet/modules/$dir +done +cd $REPO + +echo "Restoring backups of datafiles" + +rm -f $REPO/dists/trusty/main/binary-amd64/Packages $REPO/dists/trusty/main/binary-amd64/Packages.gz +rm -f $REPO/dists/trusty/Release $DEST/etc/puppet/manifests/site.pp +mv $REPO/dists/trusty/main/binary-amd64/Packages.backup $REPO/dists/trusty/main/binary-amd64/Packages +mv $REPO/dists/trusty/main/binary-amd64/Packages.gz.backup $REPO/dists/trusty/main/binary-amd64/Packages.gz +mv $REPO/dists/trusty/Release.backup $REPO/dists/trusty/Release +mv $DEST/etc/puppet/manifests/site.pp.backup $DEST/etc/puppet/manifests/site.pp diff --git a/build/patch-packages/Makefile b/build/patch-packages/Makefile new file mode 100644 index 000000000..339c9e7cf --- /dev/null +++ b/build/patch-packages/Makefile @@ -0,0 +1,26 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +SUBDIRS := +SUBCLEAN = $(addsuffix .clean,$(SUBDIRS)) + +.PHONY: $(SUBDIRS) $(SUBCLEAN) clean +$(SUBDIRS): + @mkdir -p release/packages + ORIGISO=$(ORIGISO) REVSTATE=$(REVSTATE) $(MAKE) -C $@ -f Makefile release + +release: $(SUBDIRS) + @echo $(ORIGISO) + +clean: $(SUBCLEAN) + @rm -Rf release + +$(SUBCLEAN): %.clean: + $(MAKE) -C $* -f Makefile clean diff --git a/build/patch-packages/tools/correct_deps b/build/patch-packages/tools/correct_deps new file mode 100755 index 000000000..cfb7d538f --- /dev/null +++ b/build/patch-packages/tools/correct_deps @@ -0,0 +1,78 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + + +patch_package () { + deb=$1 + pkgdep=$2 + newrev=$3 + + + tmpdir=`mktemp -d /tmp/patchXXXXX` + + cp $deb $tmpdir + pushd $tmpdir > /dev/null + + mkdir -p repack + dpkg -x $deb repack + + mkdir -p repack/DEBIAN + dpkg -e $deb repack/DEBIAN + + + pushd repack/DEBIAN > /dev/null + + echo "Before: `cat control | grep '^Depends:'`" + sed -i "s/$pkgdep (\([^ ]*\) [^)]*)/$pkgdep (\1 $newrev)/" control + echo "After: `cat control | grep '^Depends:'`" + popd > /dev/null + + fakeroot dpkg-deb --build repack + + popd > /dev/null + + cp $tmpdir/repack.deb $deb + rm -Rf $tmpdir +} + +# Name of package for which to check dependencies to +PKGDEP=$1 +# The old revision of the package in question +OLDREV=$2 +# The new revision of the package in question +NEWREV=$3 + +if [ -z "$PKGDEP" ]; then + echo "No package dependency name" + exit 1 +fi + +if [ -z "$OLDREV" ]; then + echo "No old rev" + exit 1 +fi + +if [ -z "$NEWREV" ]; then + echo "No new rev" + exit 1 +fi + + +for deb in *.deb +do + ar p $deb control.tar.gz | tar xzO ./control | grep -q "^Depends:.* ${PKGDEP} ([^ ]* ${OLDREV})" + if [ $? -eq 0 ]; then + name=`ar p $deb control.tar.gz | tar xzO ./control | grep "^Package:.* " | sed 's/.* //'` + echo "**** Changing dependencies line in $deb ($name) ****" + patch_package $deb $PKGDEP $NEWREV + fi +done + diff --git a/build/patch-packages/tools/deb_pack b/build/patch-packages/tools/deb_pack new file mode 100755 index 000000000..f5d42dec3 --- /dev/null +++ b/build/patch-packages/tools/deb_pack @@ -0,0 +1,63 @@ +#!/bin/bash -e +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + + +my_exit() { + + if [ -d "$ISOROOT" ]; then + fusermount -u $ISOROOT + fi +} + +ME=$(basename $0) + +trap my_exit EXIT + +REV="$(echo $1 | tr '_' '-')" +if [ -z "$REV" ]; then + echo "$ME: Error - no revision info provided" + exit 1 +fi + +if [ ! -d package ]; then + echo "$ME: Error - package directory does not exist" + exit 1 +fi + +echo "Stepping revision number to $REV" + + +revision_step () +{ + REV=$1 + + sed -i "s/^\(Version:.*$\)/\1-eri$REV/" package/DEBIAN/control +} + +md5sum_gen () +{ + pushd package + find * -type f | grep -v "^DEBIAN/" | xargs md5sum | sort > DEBIAN/md5sums + popd +} + +revision_step $REV +md5sum_gen +fakeroot dpkg-deb --build package +PKGNAME=`grep "^Package: " package/DEBIAN/control | awk '{ print $2 }'` +PKGREV=`grep "^Version: " package/DEBIAN/control | awk '{ print $2 }'` +mv package.deb ${PKGNAME}_${PKGREV}.deb + +ORIGPKG=`cat .package` + +# Add patch into file read by install.sh +echo "$ORIGPKG>${PKGNAME}_${PKGREV}.deb" > patch-replacements + diff --git a/build/patch-packages/tools/deb_unpack b/build/patch-packages/tools/deb_unpack new file mode 100755 index 000000000..aaa60b743 --- /dev/null +++ b/build/patch-packages/tools/deb_unpack @@ -0,0 +1,58 @@ +#!/bin/bash -e +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + + +my_exit() { + + if [ -d "$ISOROOT" ]; then + fusermount -u $ISOROOT + fi +} + +ME=$(basename $0) + +trap my_exit EXIT + + +if [ -z "$1" ]; then + echo "$ME: Error - No package specified" + exit 1 +fi + +if [ -z "$2" ]; then + echo "$ME: Error - No ISO path specified" + exit 1 +fi + +DEB=$1 +ORIGISO=$2 +DEST=package + +if [ -e $DEST -o -d $DEST ]; then + echo "$ME: Error - $DEST already exists" + exit 1 +fi + +ISOROOT=`mktemp -d /tmp/XXXXXXX` +fuseiso -p $ORIGISO $ISOROOT +sleep 1 + +if [ ! -f $ISOROOT/ubuntu/pool/main/$DEB ];then + echo "Could not find package $DEB in source ISO!" +fi + +mkdir -p $DEST +dpkg -x $ISOROOT/ubuntu/pool/main/$DEB $DEST + +mkdir -p $DEST/DEBIAN +dpkg -e $ISOROOT/ubuntu/pool/main/$DEB $DEST/DEBIAN + +echo $DEB > .package \ No newline at end of file diff --git a/build/patch-packages/tools/udeb_pack b/build/patch-packages/tools/udeb_pack new file mode 100755 index 000000000..e961a7320 --- /dev/null +++ b/build/patch-packages/tools/udeb_pack @@ -0,0 +1,38 @@ +#!/bin/bash -e +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + + +my_exit() { + + if [ -d "$ISOROOT" ]; then + fusermount -u $ISOROOT + fi +} + +ME=$(basename $0) + +trap my_exit EXIT + +if [ ! -d udebPackage ]; then + echo "$ME: Error - package directory does not exist" + exit 1 +fi + +echo "Stepping revision number to $REV" + + +fakeroot dpkg-deb --build -Zgzip udebPackage +PKGNAME=`grep "^Package: " udebPackage/DEBIAN/control | awk '{ print $2 }'` +PKGREV=`grep "^Version: " udebPackage/DEBIAN/control | awk '{ print $2 }'` +ARCH=`grep "^Architecture: " udebPackage/DEBIAN/control | awk '{ print $2 }'` +mv udebPackage.deb ${PKGNAME}_${PKGREV}_${ARCH}.udeb + +ORIGPKG=`cat .udebpackage` diff --git a/build/patch-packages/tools/udeb_unpack b/build/patch-packages/tools/udeb_unpack new file mode 100755 index 000000000..ed9cd21aa --- /dev/null +++ b/build/patch-packages/tools/udeb_unpack @@ -0,0 +1,58 @@ +#!/bin/bash -e +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + + +my_exit() { + + if [ -d "$ISOROOT" ]; then + fusermount -u $ISOROOT + fi +} + +ME=$(basename $0) + +trap my_exit EXIT + + +if [ -z "$1" ]; then + echo "$ME: Error - No package specified" + exit 1 +fi + +if [ -z "$2" ]; then + echo "$ME: Error - No ISO path specified" + exit 1 +fi + +DEB=$1 +ORIGISO=$2 +DEST=udebPackage + +if [ -e $DEST -o -d $DEST ]; then + echo "$ME: Error - $DEST already exists" + exit 1 +fi + +ISOROOT=`mktemp -d /tmp/XXXXXXX` +fuseiso -p $ORIGISO $ISOROOT +sleep 1 + +if [ ! -f $ISOROOT/ubuntu/pool/debian-installer/$DEB ];then + echo "Could not find package $DEB in source ISO!" +fi + +mkdir -p $DEST +dpkg -x $ISOROOT/ubuntu/pool/debian-installer/$DEB $DEST + +mkdir -p $DEST/DEBIAN +dpkg -e $ISOROOT/ubuntu/pool/debian-installer/$DEB $DEST/DEBIAN + +echo $DEB > .udebpackage diff --git a/build/patch-packages/tr_example/Makefile b/build/patch-packages/tr_example/Makefile new file mode 100644 index 000000000..b7cab3590 --- /dev/null +++ b/build/patch-packages/tr_example/Makefile @@ -0,0 +1,30 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +TOP := $(shell pwd) + +.PHONY: all +all: + +.PHONY: clean +clean: + @rm -rf package + @rm -rf *.deb + @rm -rf patch-replacements + @rm -rf .package + +.PHONY: release +release: + ../tools/deb_unpack python-oslo.messaging_1.3.0-fuel5.1~mira4_all.deb $(ORIGISO) + @mkdir -p package/etc + @echo "Hello, world" > package/etc/hello.txt + ../tools/deb_pack $(REVSTATE) + @cp *.deb ../release/packages + @cat patch-replacements >> ../release/patch-replacements diff --git a/build/patch-repos/0010-bootstrap_admin_node.sh.patch b/build/patch-repos/0010-bootstrap_admin_node.sh.patch new file mode 100644 index 000000000..d3769adfb --- /dev/null +++ b/build/patch-repos/0010-bootstrap_admin_node.sh.patch @@ -0,0 +1,83 @@ +From: Fuel OPNFV +Date: Mon, 13 Jun 2016 22:23:57 +0200 +Subject: OPNFV: Additions to bootstrap_admin_node.sh + +--- +diff --git a/iso/bootstrap_admin_node.sh b/iso/bootstrap_admin_node.sh +index 3197c91..e035145 100755 +--- a/iso/bootstrap_admin_node.sh ++++ b/iso/bootstrap_admin_node.sh +@@ -339,8 +339,22 @@ fuelmenu --save-only --iface=$ADMIN_INTERFACE || fail + set +x + echo "Done!" + ++### OPNFV addition BEGIN ++shopt -s nullglob ++for script in /opt/opnfv/bootstrap/pre.d/*.sh ++do ++ echo "Pre script: $script" >> /root/pre.log 2>&1 ++ $script >> /root/pre.log 2>&1 ++done ++shopt -u nullglob ++### OPNFV addition END ++ ++# Enable sshd ++systemctl enable sshd ++systemctl start sshd ++ + if [[ "$showmenu" == "yes" || "$showmenu" == "YES" ]]; then +- fuelmenu || fail ++ fuelmenu + else + # Give user 15 seconds to enter fuelmenu or else continue + echo +@@ -360,9 +374,10 @@ else + fi + fi + ++# OPNFV: Disabled to speedup installation in offline env. + # Enable online base MOS repos (security, updates) if we run an ISO installation +-[ -f /etc/fuel_build_id ] && \ +- yum-config-manager --enable mos${FUEL_RELEASE}-security mos${FUEL_RELEASE}-updates --save ++#[ -f /etc/fuel_build_id ] && \ ++# yum-config-manager --enable mos${FUEL_RELEASE}-security mos${FUEL_RELEASE}-updates --save + + if [ ! -f "${ASTUTE_YAML}" ]; then + echo ${fuelmenu_fail_message} +@@ -377,7 +392,5 @@ if [ ! -f /etc/fuel_build_id ]; then + +-# Enable sshd +-systemctl enable sshd +-systemctl start sshd ++systemctl reload sshd + + # Enable iptables + systemctl enable iptables.service +@@ -532,6 +545,16 @@ systemctl start ntpd + + bash /etc/rc.local + ++### OPNFV addition BEGIN ++shopt -s nullglob ++for script in /opt/opnfv/bootstrap/post.d/*.sh ++do ++ echo "Post script: $script" >> /root/post.log 2>&1 ++ $script >> /root/post.log 2>&1 ++done ++shopt -u nullglob ++### OPNFV addition END ++ + if [ "`get_bootstrap_skip`" = "False" ]; then + build_ubuntu_bootstrap bs_status || true + else +@@ -571,8 +571,8 @@ + fi + + #Check if repo is accessible +-echo "Checking for access to updates repository..." +-repourl=$(yum repolist all -v | awk '{if ($1 ~ "baseurl" && $3 ~ "updates") print $3}' | head -1) ++echo "Checking for access to updates repository/mirrorlist..." ++repourl=$(yum repolist all -v | awk '{if ($1 ~ "baseurl|mirrors" && $3 ~ "updates") print $3}' | head -1) + if urlaccesscheck check "$repourl" ; then + UPDATE_ISSUES=0 + else diff --git a/build/patch-repos/0020-isolinux.cfg.patch b/build/patch-repos/0020-isolinux.cfg.patch new file mode 100644 index 000000000..f09be2a7f --- /dev/null +++ b/build/patch-repos/0020-isolinux.cfg.patch @@ -0,0 +1,21 @@ +From: Fuel OPNFV +Date: Mon, 13 Jun 2016 22:23:57 +0200 +Subject: OPNFV: showmenu=yes in isolinux.cfg + +--- +diff --git a/iso/isolinux/isolinux.cfg b/iso/isolinux/isolinux.cfg +index c6b1ed9..77a4b18 100644 +--- a/iso/isolinux/isolinux.cfg ++++ b/iso/isolinux/isolinux.cfg +@@ -19,9 +19,9 @@ label nailgun + menu label ^1. Fuel Install (Static IP) + menu default + kernel vmlinuz +- append initrd=initrd.img net.ifnames=0 biosdevname=0 inst.repo=cdrom:LABEL=will_be_substituted_with_ISO_VOLUME_ID:/ inst.ks=cdrom:LABEL=will_be_substituted_with_ISO_VOLUME_ID:/ks.cfg ip=10.20.0.2::10.20.0.1:255.255.255.0:fuel.domain.tld:eth0:off::: nameserver=10.20.0.1 ++ append initrd=initrd.img net.ifnames=0 biosdevname=0 inst.repo=cdrom:LABEL=will_be_substituted_with_ISO_VOLUME_ID:/ inst.ks=cdrom:LABEL=will_be_substituted_with_ISO_VOLUME_ID:/ks.cfg ip=10.20.0.2::10.20.0.1:255.255.255.0:fuel.domain.tld:eth0:off::: nameserver=10.20.0.1 showmenu=yes + + label nailgunifname + menu label ^2. Fuel Advanced Install (Static IP) + kernel vmlinuz +- append initrd=initrd.img inst.repo=cdrom:LABEL=will_be_substituted_with_ISO_VOLUME_ID:/ inst.ks=cdrom:LABEL=will_be_substituted_with_ISO_VOLUME_ID:/ks.cfg ip=10.20.0.2::10.20.0.1:255.255.255.0:fuel.domain.tld:adminif:off::: nameserver=10.20.0.1 ifname=adminif:XX:XX:XX:XX:XX:XX ++ append initrd=initrd.img inst.repo=cdrom:LABEL=will_be_substituted_with_ISO_VOLUME_ID:/ inst.ks=cdrom:LABEL=will_be_substituted_with_ISO_VOLUME_ID:/ks.cfg ip=10.20.0.2::10.20.0.1:255.255.255.0:fuel.domain.tld:adminif:off::: nameserver=10.20.0.1 ifname=adminif:XX:XX:XX:XX:XX:XX showmenu=yes diff --git a/build/patch-repos/0030-repo-multi-arch-local-mirrors.patch b/build/patch-repos/0030-repo-multi-arch-local-mirrors.patch new file mode 100644 index 000000000..d40428743 --- /dev/null +++ b/build/patch-repos/0030-repo-multi-arch-local-mirrors.patch @@ -0,0 +1,59 @@ +From: Stanislaw Kardach +Date: Thu, 25 Feb 2016 13:31:19 +0100 +Subject: repo mirror: Allow multi-arch local mirrors + +This patch allows specifying multiple architectures via UBUNTU_ARCH in +form of a list of space separated architectures. The first architecture +in the list is considered primary and will be used for building all the +deb packages by fuel-main. Additional architectures are added to allow +targets of other architectures to use the mirror. +NOTE: this imposes a requirement that all packages built are arch +independent (which is true so far). + +Signed-off-by: Stanislaw Kardach +Signed-off-by: Alexandru Avadanii +--- + mirror/ubuntu/module.mk | 2 +- + sandbox.mk | 2 +- + config.mk | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/mirror/ubuntu/module.mk b/mirror/ubuntu/module.mk +index 7a9466e..fe1ada2 100644 +--- a/mirror/ubuntu/module.mk ++++ b/mirror/ubuntu/module.mk +@@ -81,7 +81,7 @@ $(BUILD_DIR)/mirror/ubuntu/mirror.done: + --root=$(MIRROR_MOS_UBUNTU_ROOT) \ + --dist=$(MIRROR_MOS_UBUNTU_SUITE) \ + --section=$(subst $(space),$(comma),$(MIRROR_MOS_UBUNTU_SECTION)) \ +- --arch=$(UBUNTU_ARCH) \ ++ --arch=$(shell echo $(UBUNTU_ARCH) | tr ' ' ',') \ + $(LOCAL_MIRROR_UBUNTU)/ + rm -rf $(LOCAL_MIRROR_UBUNTU)/.temp $(LOCAL_MIRROR_UBUNTU)/project + $(ACTION.TOUCH) +diff --git a/sandbox.mk b/sandbox.mk +index 4bc3962..5ffddbd 100644 +--- a/sandbox.mk ++++ b/sandbox.mk +@@ -188,7 +188,7 @@ touch $(SANDBOX_UBUNTU)/etc/init.d/.legacy-bootordering + mkdir -p $(SANDBOX_UBUNTU)/usr/sbin + cp -a $(BUILD_DIR)/policy-rc.d $(SANDBOX_UBUNTU)/usr/sbin + echo "Running debootstrap" +-sudo debootstrap --no-check-gpg --include=ca-certificates --arch=$(UBUNTU_ARCH) $(MIRROR_UBUNTU_SUITE) $(SANDBOX_UBUNTU) $(MIRROR_UBUNTU_METHOD)://$(MIRROR_UBUNTU)$(MIRROR_UBUNTU_ROOT) ++sudo debootstrap --no-check-gpg --include=ca-certificates --arch=$(word 1,$(UBUNTU_ARCH)) $(MIRROR_UBUNTU_SUITE) $(SANDBOX_UBUNTU) $(MIRROR_UBUNTU_METHOD)://$(MIRROR_UBUNTU)$(MIRROR_UBUNTU_ROOT) + if [ -e $(SANDBOX_UBUNTU)/etc/resolv.conf ]; then sudo cp -a $(SANDBOX_UBUNTU)/etc/resolv.conf $(SANDBOX_UBUNTU)/etc/resolv.conf.orig; fi + sudo cp /etc/resolv.conf $(SANDBOX_UBUNTU)/etc/resolv.conf + if [ -e $(SANDBOX_UBUNTU)/etc/hosts ]; then sudo cp -a $(SANDBOX_UBUNTU)/etc/hosts $(SANDBOX_UBUNTU)/etc/hosts.orig; fi +diff --git a/config.mk b/config.mk +index 74ee039..45a3b30 100644 +--- a/config.mk ++++ b/config.mk +@@ -49,7 +49,7 @@ UBUNTU_MINOR:=04 + UBUNTU_RELEASE_NUMBER:=$(UBUNTU_MAJOR).$(UBUNTU_MINOR) + UBUNTU_KERNEL_FLAVOR?=lts-trusty + UBUNTU_NETBOOT_FLAVOR?=netboot +-UBUNTU_ARCH:=amd64 ++UBUNTU_ARCH?=amd64 + UBUNTU_IMAGE_RELEASE:=$(UBUNTU_MAJOR)$(UBUNTU_MINOR) + SEPARATE_IMAGES?=/boot,ext2 /,ext4 + diff --git a/build/patch-repos/0040-xorriso-fails-to-add-files-with-path-longer-then-240.patch b/build/patch-repos/0040-xorriso-fails-to-add-files-with-path-longer-then-240.patch new file mode 100644 index 000000000..734523040 --- /dev/null +++ b/build/patch-repos/0040-xorriso-fails-to-add-files-with-path-longer-then-240.patch @@ -0,0 +1,24 @@ +From: Artem Silenkov +Date: Tue, 22 Sep 2015 21:54:44 +0300 +Subject: [PATCH] xorriso fails to add files with path longer then 240 + +joliet-long option added to xorriso command line + +Change-Id: I97016cf3e6a554f44d839740ba7d210337435cdc +Related-Bug: #1498619 +--- + iso/module.mk | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/iso/module.mk b/iso/module.mk +index 8995378..0073068 100644 +--- a/iso/module.mk ++++ b/iso/module.mk +@@ -174,6 +174,7 @@ $(ISO_PATH): $(BUILD_DIR)/iso/isoroot.done + -V $(ISO_VOLUME_ID) -p $(ISO_VOLUME_PREP) \ + -J -R \ + -graft-points \ ++ -joliet-long \ + -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table \ + -isohybrid-mbr /usr/lib/syslinux/isohdpfx.bin \ + -eltorito-alt-boot -e images/efiboot.img -no-emul-boot \ diff --git a/build/patch-repos/build/repos/fuel-library/0001-Disable-token-revoke-to-increase-keystone-performanc.patch b/build/patch-repos/build/repos/fuel-library/0001-Disable-token-revoke-to-increase-keystone-performanc.patch new file mode 100644 index 000000000..4d5be493b --- /dev/null +++ b/build/patch-repos/build/repos/fuel-library/0001-Disable-token-revoke-to-increase-keystone-performanc.patch @@ -0,0 +1,44 @@ +From ba542dde34743b276547b7ca3c6591feb9000877 Mon Sep 17 00:00:00 2001 +From: iberezovskiy +Date: Mon, 19 Sep 2016 12:35:05 +0300 +Subject: [PATCH] Disable token revoke to increase keystone performance + +Change-Id: I4df816369093908ad1eac372f38c92155efbe8e0 +Closes-bug: #1625077 +--- + .../openstack_tasks/manifests/keystone/keystone.pp | 2 ++ + tests/noop/spec/hosts/keystone/keystone_spec.rb | 5 +++++ + 2 files changed, 7 insertions(+) + +diff --git a/deployment/puppet/openstack_tasks/manifests/keystone/keystone.pp b/deployment/puppet/openstack_tasks/manifests/keystone/keystone.pp +index 3162287..ba9d7df 100644 +--- a/deployment/puppet/openstack_tasks/manifests/keystone/keystone.pp ++++ b/deployment/puppet/openstack_tasks/manifests/keystone/keystone.pp +@@ -327,6 +327,8 @@ class openstack_tasks::keystone::keystone { + memcache_pool_unused_timeout => '60', + cache_memcache_servers => $memcache_servers, + policy_driver => 'keystone.policy.backends.sql.Policy', ++ # Set revoke_by_id to false according to LP #1625077 ++ revoke_by_id => false, + } + + Package<| title == 'keystone'|> ~> Service<| title == 'keystone'|> +diff --git a/tests/noop/spec/hosts/keystone/keystone_spec.rb b/tests/noop/spec/hosts/keystone/keystone_spec.rb +index b29e691..3c0f847 100644 +--- a/tests/noop/spec/hosts/keystone/keystone_spec.rb ++++ b/tests/noop/spec/hosts/keystone/keystone_spec.rb +@@ -176,6 +176,11 @@ describe manifest do + should contain_class('keystone').with('sync_db' => primary_controller) + end + ++ it 'should declare keystone class with revoke_by_id set to false' do ++ # Set revoke_by_id to false according to LP #1625077 ++ should contain_class('keystone').with('revoke_by_id' => false) ++ end ++ + it 'should configure keystone with paramters' do + should contain_keystone_config('token/caching').with(:value => 'false') + should contain_keystone_config('cache/enabled').with(:value => 'true') +-- +1.7.9.5 + diff --git a/build/patch-repos/build/repos/fuel-library/0001-Reduce-ceilometer-memory-usage.patch b/build/patch-repos/build/repos/fuel-library/0001-Reduce-ceilometer-memory-usage.patch new file mode 100644 index 000000000..f7fe06884 --- /dev/null +++ b/build/patch-repos/build/repos/fuel-library/0001-Reduce-ceilometer-memory-usage.patch @@ -0,0 +1,30 @@ +From 38315ee3945a5444de13918eb29e7771eb9927c7 Mon Sep 17 00:00:00 2001 +From: Michael Polenchuk +Date: Thu, 8 Sep 2016 19:25:14 +0300 +Subject: [PATCH 1/1] Reduce ceilometer memory usage + +Change-Id: I8b1a97bd710c859a3543d1aed8226313f35f4f10 +--- + .../manifests/ceilometer/controller.pp | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/deployment/puppet/openstack_tasks/manifests/ceilometer/controller.pp b/deployment/puppet/openstack_tasks/manifests/ceilometer/controller.pp +index 2c63ff0..1dda109 100644 +--- a/deployment/puppet/openstack_tasks/manifests/ceilometer/controller.pp ++++ b/deployment/puppet/openstack_tasks/manifests/ceilometer/controller.pp +@@ -234,5 +234,12 @@ class openstack_tasks::ceilometer::controller { + Ceilometer_config<| title == 'oslo_messaging_rabbit/kombu_compression' |> { value => $kombu_compression } + } + } ++ ++ # Reduce memory usage ++ ceilometer_config { ++ 'DEFAULT/executor_thread_pool_size': value => ceiling($service_workers*0.5); ++ 'notification/pipeline_processing_queues': value => ceiling($service_workers*1.5); ++ 'oslo_messaging_rabbit/rabbit_qos_prefetch_count': value => 5; ++ } + } + } +-- +1.7.9.5 + diff --git a/build/patch-repos/build/repos/fuel-nailgun/0010-Mark-Intel-82599-10-Gigabit-NIC-as-DPDK-capable.patch b/build/patch-repos/build/repos/fuel-nailgun/0010-Mark-Intel-82599-10-Gigabit-NIC-as-DPDK-capable.patch new file mode 100644 index 000000000..d486f2354 --- /dev/null +++ b/build/patch-repos/build/repos/fuel-nailgun/0010-Mark-Intel-82599-10-Gigabit-NIC-as-DPDK-capable.patch @@ -0,0 +1,22 @@ +From: Fuel OPNFV +Date: Wed, 3 Aug 2016 09:41:21 +0200 +Subject: [PATCH] Mark Intel 82599 10 Gigabit NIC as DPDK capable + +This NIC is used on Ericsson POD2 but Fuel doesn't allow to activate +DPDK on it. +--- + nailgun/nailgun/fixtures/openstack.yaml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/nailgun/nailgun/fixtures/openstack.yaml b/nailgun/nailgun/fixtures/openstack.yaml +index 74fa509..d08a4fc 100644 +--- a/nailgun/nailgun/fixtures/openstack.yaml ++++ b/nailgun/nailgun/fixtures/openstack.yaml +@@ -2215,3 +2215,3 @@ + "14e4:163f", "14e4:168d", "14e4:16a1", "14e4:16a2", "14e4:16ad", +- "14e4:16ae", "14e4:163e", "14e4:16a4" ++ "14e4:16ae", "14e4:163e", "14e4:16a4", "8086:10f8" + ] +-- +1.9.1 + diff --git a/build/repo_info.sh b/build/repo_info.sh new file mode 100755 index 000000000..347ede7f7 --- /dev/null +++ b/build/repo_info.sh @@ -0,0 +1,63 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +usage() { + cat < + + -r + Recursively list all repos found starting at + -h + Display help text +EOF +} + +repoinfo() { + repotop=$(git -C $1 rev-parse --show-toplevel) + origin=$(git -C $repotop config --get remote.origin.url) + sha1=$(git -C $repotop rev-parse HEAD) + echo "$origin: $sha1" +} + + +if [ $# -eq 2 ]; then + case $1 in + -r) + RECURSE=1 + shift + ;; + -h) + usage + exit 0 + ;; + *) + echo "Error, argument $1 not known" >&2 + usage + exit 1 + esac +fi + +if [ $# -gt 1 ]; then + echo "Error, too many arguments" >&2 + usage + exit 1 +fi + +abspath=$(readlink -f $1) + +if [ -n "$RECURSE" ]; then + for dir in $(find $abspath -type d -name .git) + do + repoinfo $(readlink -f $dir/..) + done +else + repoinfo $abspath +fi diff --git a/build/select_closest_fuel_mirror.py b/build/select_closest_fuel_mirror.py new file mode 100755 index 000000000..0fdc69eac --- /dev/null +++ b/build/select_closest_fuel_mirror.py @@ -0,0 +1,35 @@ +#!/usr/bin/python +############################################################################## +# Copyright (c) 2016 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# Select closest fuel mirror based on latency measured with ping. +# Failsafe: The us1 mirror + +from subprocess import Popen,PIPE +import re +from operator import itemgetter + +mirrors = [ "us1", "cz1" ] +FNULL = open('/dev/null', 'w') +try: + re_avg = re.compile(r'.* = [^/]*/([^/]*).*') + + pingtime = {} + for mirror in mirrors: + fqdn = "mirror.seed-"+mirror+".fuel-infra.org" + pingtime[fqdn] = 0 + pipe = Popen("ping -c 3 " + fqdn + " | tail -1",shell = True, stdout=PIPE, stderr=FNULL) + avg = pipe.communicate()[0] + pipe.stdout.close() + pingtime[fqdn] = float(re_avg.split(avg)[1]) + + print sorted(pingtime.items(), key=itemgetter(1))[0][0] +except: + print "mirror.seed-"+mirrors[0]+".fuel-infra.org" diff --git a/ci/README b/ci/README new file mode 100644 index 000000000..46698a739 --- /dev/null +++ b/ci/README @@ -0,0 +1,101 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +Abstract +======== +The fuel/ci directory holds all Fuel@OPNFV programatic abstractions for +the OPNFV community release and continous integration pipeline. +There are two Fuel@OPNF autonomous scripts fo this, complying to the OPNFV CI pipeline guideline: + - build.sh + - deploy.sh + +USAGE +===== +For usage information of the CI/CD scripts, please run: +./build.sh -h +./deploy.sh -h + +Details on the CI/CD deployment framework +========================================= + +Overview and purpose +-------------------- +The CI/CD deployment script relies on a configuration structure, providing base +installer configuration (part of fuel repo: deploy/config), per POD specific +configuration (part of a separate classified POD configuration repo: securedlab +, plugin configuration (part of fuel repo: deploy/config/plugins), and +deployment scenario configuration (part of fuel repo: deploy/scenario). + +- The base installer configuration resembles the least common denominator of all + HW/POD environment and deployment scenarios (These configurations are + normally carried by the the installer projects in this case (fuel@OPNFV). +- Per POD specific configuration specifies POD unique parameters, the POD + parameter possible to alter is governed by the Fuel@OPNFV project. +- Plugin configuration - providing configuration of a specific plugin. + these configurations maintain there own namespace and are normally maintained + by collaborative projects building Fuel@OPNFV plugins +- Deployment scenario configuration - provides a high level, POD/HW environment + independent scenario configuration for a specifiv deployment. It defines what + features/plugins that shall be deployed - as well needed overrides of the base + installer-, POD/HW environment- configurations. Objects allowed to override + is governed by the Fuel@OPNFV project. + +Executing a deployment +---------------------- +deploy.sh must be executed locally at the target lab/pod/jumpserver +A configuration structure must be provided - see the section below. +It is straight forward to execute a deployment task - as an example: +sudo deploy.sh -b file:///home/jenkins/config -l LF-1 -p POD-2 -s +os_odl-l2_ha -i file:///home/jenkins/MyIso.iso + +-b and -i arguments should be expressed in URI style (eg: file://... +or http://.... The resources can thus be local or remote. + +Configuration repository structure +---------------------------------- +The CI deployment engine relies on a configuration directory/file structure +pointed to by the -b option described above. +Normally this points to the secure classified OPNFV securedlab repo to which +only jenkins and andmins have access to, but you may point to any local or +remote strcture fullfilling the diectory/file structure below. +The reason that this configuration structure needs to be secure/hidden +is that there are security sensitive information in the various configuration +files. +A local stripped version of this configuration structure with virtual +deployment configurations also exist under build/config/. +Following configuration directory and file structure should be adheare to: + +TOP +! ++---- labs + ! + +---- lab-name-1 + ! ! + ! +---- pod-name-1 + ! ! ! + ! ! +---- fuel + ! ! ! + ! ! +---- config + ! ! ! + ! ! +---- dea-pod-override.yaml + ! ! ! + ! ! +---- dha.yaml + ! ! + ! +---- pod-name-2 + ! ! + ! + +---- lab-name-2 + ! ! + + +Creating a deployment scenario +------------------------------ +Please find deploy/scenario/README for instructions on how to create a new +deployment scenario. \ No newline at end of file diff --git a/ci/build.sh b/ci/build.sh new file mode 100755 index 000000000..82049cdcd --- /dev/null +++ b/ci/build.sh @@ -0,0 +1,269 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################ +# BEGIN of usage description +# +usage () +{ +cat | more << EOF +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +`basename $0`: Builds the Fuel@OPNFV stack + +usage: `basename $0` [-s spec-file] [-c cache-URI] [-l log-file] [-f flags] + [output-directory] + +OPTIONS: + -s spec-file (NOTE! DEPRECATED!) + define the build-spec file, default ../build/config.mk. The script only + verifies that the spec-file exists. + -c cache base URI + specifies the base URI to a build cache to be used/updated, supported + methods are http://, ftp:// and file:// + -l log-file + specifies the output log-file (stdout and stderr), if not specified + logs are output to console as normal + -v + version tag to be applied to the build result + -r + alternative remote access method script/program. curl is default. + -f flag[...] + build flags: + s: Do nothing, succeed + f: Do nothing, fail + D: Debug mode + P: Clear the local cache before building. This flag is only + valid if the "-c cache-URI" options has been specified and + and the method in the cache-URI is file:// (local cache). + + -h help, prints this help text + + output-directory, specifies the directory for the output artifacts + (.iso file). If no output-directory is specified, the current path + when calling the script is used. + + +Description: + +build.sh builds the opnfv .iso artifact. +To reduce build time it uses build caches on a local or remote location. A +cache is rebuilt and uploaded if either of the below conditions are met: +1) The P(opulate) flag is set and the -c cache-base-URI is provided and set + to the method file:// , if -c is + not provided the cache will stay local. +2) If a cache is invalidated by the make system - the exact logic is encoded + in the cache.mk of the different parts of the build. +3) A valid cache does not exist on the specified -c cache-base-URI. + +A cache has a blob (binary data) and a meta file in the format of: + .blob + .meta + +Logging is by default to console, but can be directed elsewhere with the -l +option in which case both stdout and stderr is redirected to that destination. + +Built in unit testing of components is enabled by adding the t(est) flag. + +Return codes: + - 0 Success! + - 1-99 Unspecified build error + - 100-199 Build system internal error (not build it self) + - 101 Build system instance busy + - 200 Build failure + +Examples: + build -c http://opnfv.org/artifactory/fuel/cache \ + -d ~/jenkins/genesis/fuel/ci/output -f ti + +NOTE: At current the build scope is set to the git root of the repository, -d + destination locations outside that scope will not work! +EOF +} +# +# END of usage description +############################################################################ + +############################################################################ +# BEGIN of function error_exit + +error_exit() { + echo "$@" >&2 + exit 1 +} + +# +# END of function error_exit +############################################################################ + + +############################################################################ +# BEGIN of shorthand variables for internal use +# +SCRIPT_DIR=$(readlink -f $(dirname ${BASH_SOURCE[0]})) +BUILD_BASE=$(readlink -e ${SCRIPT_DIR}/../build/) +RESULT_DIR="${BUILD_BASE}/release" +BUILD_SPEC="${BUILD_BASE}/config.mk" +LOCAL_CACHE_ARCH_NAME="${LOCAL_CACHE_ARCH_NAME:-fuel-cache}" + +# +# END of variables to customize +############################################################################ + +############################################################################ +# BEGIN of script assigned default variables +# +export CACHEBASE="file://$HOME/cache" +export CACHETRANSPORT="curl --silent" +CLEAR_CACHE=0 +MAKE_ARGS="" + +# +# END of script assigned variables +############################################################################ + +build() { + echo "CI build parameters:" + echo "SCRIPT_DIR = $SCRIPT_DIR" + echo "BUILD_BASE = $BUILD_BASE" + echo "RESULT_DIR = $RESULT_DIR" + echo "BUILD_SPEC = $BUILD_SPEC" + echo "LOCAL_CACHE_ARCH_NAME = $LOCAL_CACHE_ARCH_NAME" + echo "CLEAR_CACHE = $CLEAR_CACHE" + echo "DEBUG = $DEBUG" + echo "OUTPUT_DIR = $OUTPUT_DIR" + echo "BUILD_LOG = $BUILD_LOG" + echo "MAKE_ARGS = $MAKE_ARGS" + echo "CACHEBASE = $CACHEBASE" + echo "CACHETRANSPORT = $CACHETRANSPORT" + + + if [ "$CLEAR_CACHE" -eq 1 ]; then + echo $CACHEBASE | grep -q '^file://' $CACHE_BASE + if [ $? -ne 0 ]; then + error_exit "Can't clear a non-local cache!" + else + CACHEDIR=$(echo $CACHEBASE | sed 's;file://;;') + echo "Clearing local cache at $CACHEDIR..." + rm -rvf $CACHEDIR/* + fi + fi + + echo make ${MAKE_ARGS} cache + + cd ${BUILD_BASE} + if make ${MAKE_ARGS} cache; then + echo "Copying build result into $OUTPUT_DIR" + sort ${BUILD_BASE}/gitinfo*.txt > ${OUTPUT_DIR}/gitinfo.txt + cp ${RESULT_DIR}/*.iso ${OUTPUT_DIR} + cp ${RESULT_DIR}/*.iso.txt ${OUTPUT_DIR} + else + error_exit "Build failed" + fi +} + +############################################################################ +# BEGIN of main +# +while getopts "s:c:l:v:f:r:f:h" OPTION +do + case $OPTION in + s) + BUILD_SPEC=${OPTARG} + if [ ! -f ${BUILD_SPEC} ]; then + echo "spec file does not exist: $BUILD_SPEC - exiting ...." + exit 100 + fi + ;; + c) + # This value is used by cache.sh + export CACHEBASE=${OPTARG} + ;; + l) + BUILD_LOG=$(readlink -f ${OPTARG}) + ;; + v) + MAKE_ARGS+="REVSTATE=${OPTARG}" + ;; + r) + # This value is used by cache.sh + export CACHETRANSPORT=${OPTARG} + ;; + h) + usage + rc=0 + exit $rc + ;; + f) + BUILD_FLAGS=${OPTARG} + for ((i=0; i<${#BUILD_FLAGS};i++)); do + case ${BUILD_FLAGS:$i:1} in + s) + exit 0 + ;; + + f) + exit 1 + ;; + + P) + CLEAR_CACHE=1 + ;; + + D) + DEBUG=1 + ;; + + *) + error_exit "${BUILD_FLAGS:$i:1} is not a valid build flag - exiting ...." + ;; + esac + done + ;; + + *) + echo "${OPTION} is not a valid argument" + rc=100 + exit $rc + ;; + esac +done + +# Get output directory +shift $[$OPTIND - 1] +case $# in + 0) + # No directory on command line + OUTPUT_DIR=$(pwd) + ;; + 1) + # Directory on command line + OUTPUT_DIR=$(readlink -f $1) + ;; + *) + error_exit "Too many arguments" + ;; +esac +mkdir -p $OUTPUT_DIR || error_exit "Could not access output directory $OUTPUT_DIR" + + +if [ -n "${BUILD_LOG}" ]; then + touch ${BUILD_LOG} || error_exit "Could not write to log file ${BUILD_LOG}" + build 2>&1 | tee ${BUILD_LOG} +else + build +fi + +rc=$? +exit $rc + +# +# END of main +############################################################################ diff --git a/ci/clean_cache.sh b/ci/clean_cache.sh new file mode 100755 index 000000000..177fe821b --- /dev/null +++ b/ci/clean_cache.sh @@ -0,0 +1,38 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2016 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# Clean the build cache according to its expiry date. Invoke with the cache +# directory as the first argument. + +if [ -z "$1" ]; then + echo "No cache directory specified, exiting..." + exit 1 +else + CACHEDIR=$1 + echo "Operating on cache $CACHEDIR" +fi + +NOW=$(date '+%s') + +cd $CACHEDIR +echo "Step 1, cleaning orphaned meta and blob files" +ls *.meta *.blob | sed 's/\..*//' | sort | uniq -u | xargs -n 1 -I {} sh -c "rm -vf {}.*" +echo "Step 2, cleaning expired files" +for cache in $(ls -1 *.meta | sed 's/\..*//') +do + blob=${cache}.blob + meta=${cache}.meta + expiry=$(grep Expires: $meta | sed 's/Expires: *//') + if [ $expiry -le $NOW ]; then + echo "$cache expired $(date -d "@$expiry"), removing..." + rm -f $blob $meta + fi +done + diff --git a/ci/deploy.sh b/ci/deploy.sh new file mode 100755 index 000000000..8411714eb --- /dev/null +++ b/ci/deploy.sh @@ -0,0 +1,264 @@ +#!/bin/bash +set -e +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################ +# BEGIN of Exit handlers +# +do_exit () { + clean + echo "Exiting ..." +} +# +# End of Exit handlers +############################################################################ + +############################################################################ +# BEGIN of usage description +# +usage () +{ +cat << EOF +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +`basename $0`: Deploys the Fuel@OPNFV stack + +usage: `basename $0` -b base-uri [-B PXE Bridge] [-f] [-F] [-H] -l lab-name -p pod-name -s deploy-scenario [-S image-dir] [-T timeout] -i iso + -s deployment-scenario [-S optional Deploy-scenario path URI] + [-R optional local relen repo (containing deployment Scenarios] + +OPTIONS: + -b Base-uri for the stack-configuration structure + -B PXE Bridge for booting of Fuel master + -d Dry-run + -f Deploy on existing Fuel master + -e Do not launch environment deployment + -F Do only create a Fuel master + -h Print this message and exit + -H No health check + -l Lab-name + -L Deployment log path and file name + -p Pod-name + -s Deploy-scenario short-name/base-file-name + -S Storage dir for VM images + -T Timeout, in minutes, for the deploy. + -i iso url + +Description: +Deploys the Fuel@OPNFV stack on the indicated lab resource + +This script provides the Fuel@OPNFV deployment abstraction +It depends on the OPNFV official configuration directory/file structure +and provides a fairly simple mechanism to execute a deployment. +Input parameters to the build script is: +-b Base URI to the configuration directory (needs to be provided in a URI + style, it can be a local resource: file:// or a remote resource http(s)://) +-B PXE Bridge for booting of Fuel master. It can be specified several times, + or as a comma separated list of bridges, or both: -B br1 -B br2,br3 + One NIC connected to each specified bridge will be created in the Fuel VM, + in the same order as provided in the command line. The default is pxebr. +-d Dry-run - Produces deploy config files (config/dea.yaml and + config/dha.yaml), but does not execute deploy +-f Deploy on existing Fuel master +-e Do not launch environment deployment +-F Do only create a Fuel master +-h Print this message and exit +-H Do not run fuel built in health-check after successfull deployment +-l Lab name as defined in the configuration directory, e.g. lf +-L Deployment log path and name, eg. -L /home/jenkins/logs/job888.log.tar.gz +-p POD name as defined in the configuration directory, e.g. pod-1 +-s Deployment-scenario, this points to a deployment/test scenario file as + defined in the configuration directory: + e.g fuel-ocl-heat-ceilometer_scenario_0.0.1.yaml + or a deployment short-name as defined by scenario.yaml in the deployment + scenario path. +-S Storage dir for VM images, default is fuel/deploy/images +-T Timeout, in minutes, for the deploy. It defaults to using the DEPLOY_TIMEOUT + environment variable when defined, or to the default in deploy.py otherwise +-i .iso image to be deployed (needs to be provided in a URI + style, it can be a local resource: file:// or a remote resource http(s)://) + +NOTE: Root priviledges are needed for this script to run + + +Examples: +sudo `basename $0` -b file:///home/jenkins/lab-config -l lf -p pod1 -s ha_odl-l3_heat_ceilometer -i file:///home/jenkins/myiso.iso +EOF +} + +# +# END of usage description +############################################################################ + +############################################################################ +# BEGIN of deployment clean-up +# +clean() { + echo "Cleaning up deploy tmp directories" + rm -rf ${SCRIPT_PATH}/ISO +} +# +# END of deployment clean-up +############################################################################ + +############################################################################ +# BEGIN of shorthand variables for internal use +# +SCRIPT_PATH=$(readlink -f $(dirname ${BASH_SOURCE[0]})) +DEPLOY_DIR=$(cd ${SCRIPT_PATH}/../deploy; pwd) +PXE_BRIDGE='' +NO_HEALTH_CHECK='' +USE_EXISTING_FUEL='' +FUEL_CREATION_ONLY='' +NO_DEPLOY_ENVIRONMENT='' +STORAGE_DIR='' +DRY_RUN=0 +if ! [ -z $DEPLOY_TIMEOUT ]; then + DEPLOY_TIMEOUT="-dt $DEPLOY_TIMEOUT" +else + DEPLOY_TIMEOUT="" +fi +# +# END of variables to customize +############################################################################ + +############################################################################ +# BEGIN of main +# +while getopts "b:B:dfFHl:L:p:s:S:T:i:he" OPTION +do + case $OPTION in + b) + BASE_CONFIG_URI=${OPTARG} + if [[ ! $BASE_CONFIG_URI == file://* ]] && \ + [[ ! $BASE_CONFIG_URI == http://* ]] && \ + [[ ! $BASE_CONFIG_URI == https://* ]] && \ + [[ ! $BASE_CONFIG_URI == ftp://* ]]; then + echo "-b $BASE_CONFIG_URI - Not given in URI style" + usage + exit 1 + fi + ;; + B) + for bridge in ${OPTARG//,/ }; do + PXE_BRIDGE+=" -b $bridge" + done + ;; + d) + DRY_RUN=1 + ;; + f) + USE_EXISTING_FUEL='-nf' + ;; + F) + FUEL_CREATION_ONLY='-fo' + ;; + e) + NO_DEPLOY_ENVIRONMENT='-nde' + ;; + H) + NO_HEALTH_CHECK='-nh' + ;; + l) + TARGET_LAB=${OPTARG} + ;; + L) + DEPLOY_LOG="-log ${OPTARG}" + ;; + p) + TARGET_POD=${OPTARG} + ;; + s) + DEPLOY_SCENARIO=${OPTARG} + ;; + S) + if [[ ${OPTARG} ]]; then + STORAGE_DIR="-s ${OPTARG}" + fi + ;; + T) + DEPLOY_TIMEOUT="-dt ${OPTARG}" + ;; + i) + ISO=${OPTARG} + if [[ ! $ISO == file://* ]] && \ + [[ ! $ISO == http://* ]] && \ + [[ ! $ISO == https://* ]] && \ + [[ ! $ISO == ftp://* ]]; then + echo "-i $ISO - Not given in URI style" + usage + exit 1 + fi + ;; + h) + usage + exit 0 + ;; + *) + echo "${OPTION} is not a valid argument" + echo "Arguments not according to new argument style" + echo "Trying old-style compatibility mode" + pushd ${DEPLOY_DIR} > /dev/null + python deploy.py "$@" + popd > /dev/null + exit 0 + ;; + esac +done + +if [[ $EUID -ne 0 ]]; then + echo "This script must be run as root" 1>&2 + exit 1 +fi + +if [ -z $BASE_CONFIG_URI ] || [ -z $TARGET_LAB ] || \ + [ -z $TARGET_POD ] || [ -z $DEPLOY_SCENARIO ] || \ + [ -z $ISO ]; then + echo "Arguments not according to new argument style" + echo "Trying old-style compatibility mode" + pushd ${DEPLOY_DIR} > /dev/null + python deploy.py "$@" + popd > /dev/null + exit 0 +fi + +# Enable the automatic exit trap +trap do_exit SIGINT SIGTERM EXIT + +# Set no restrictive umask so that Jenkins can removeeee any residuals +umask 0000 + +clean + +pushd ${DEPLOY_DIR} > /dev/null +# Prepare the deploy config files based on lab/pod information, deployment +# scenario, etc. + +echo "python deploy-config.py -dha ${BASE_CONFIG_URI}/labs/${TARGET_LAB}/${TARGET_POD}/fuel/config/dha.yaml -deab file://${DEPLOY_DIR}/config/dea_base.yaml -deao ${BASE_CONFIG_URI}/labs/${TARGET_LAB}/${TARGET_POD}/fuel/config/dea-pod-override.yaml -scenario-base-uri file://${DEPLOY_DIR}/scenario -scenario ${DEPLOY_SCENARIO} -plugins file://${DEPLOY_DIR}/config/plugins -output ${SCRIPT_PATH}/config" + +python deploy-config.py -dha ${BASE_CONFIG_URI}/labs/${TARGET_LAB}/${TARGET_POD}/fuel/config/dha.yaml -deab file://${DEPLOY_DIR}/config/dea_base.yaml -deao ${BASE_CONFIG_URI}/labs/${TARGET_LAB}/${TARGET_POD}/fuel/config/dea-pod-override.yaml -scenario-base-uri file://${DEPLOY_DIR}/scenario -scenario ${DEPLOY_SCENARIO} -plugins file://${DEPLOY_DIR}/config/plugins -output ${SCRIPT_PATH}/config + +if [ $DRY_RUN -eq 0 ]; then + # Download iso if it doesn't already exists locally + if [[ $ISO == file://* ]]; then + ISO=${ISO#file://} + else + mkdir -p ${SCRIPT_PATH}/ISO + curl -o ${SCRIPT_PATH}/ISO/image.iso $ISO + ISO=${SCRIPT_PATH}/ISO/image.iso + fi + # Start deployment + echo "python deploy.py $DEPLOY_LOG $STORAGE_DIR $PXE_BRIDGE $USE_EXISTING_FUEL $FUEL_CREATION_ONLY $NO_HEALTH_CHECK $NO_DEPLOY_ENVIRONMENT -dea ${SCRIPT_PATH}/config/dea.yaml -dha ${SCRIPT_PATH}/config/dha.yaml -iso $ISO $DEPLOY_TIMEOUT" + python deploy.py $DEPLOY_LOG $STORAGE_DIR $PXE_BRIDGE $USE_EXISTING_FUEL $FUEL_CREATION_ONLY $NO_HEALTH_CHECK $NO_DEPLOY_ENVIRONMENT -dea ${SCRIPT_PATH}/config/dea.yaml -dha ${SCRIPT_PATH}/config/dha.yaml -iso $ISO $DEPLOY_TIMEOUT +fi +popd > /dev/null + +# +# END of main +############################################################################ diff --git a/deploy/README b/deploy/README new file mode 100644 index 000000000..ee6bc3156 --- /dev/null +++ b/deploy/README @@ -0,0 +1,171 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# peter.barabas@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +======== PREREQUISITES ======== + +the following dependencies and python modules are required to be installed: + +- for Ubuntu: + +sudo apt-get update +sudo apt-get install -y libvirt-bin qemu-kvm python-pip fuseiso mkisofs \ +genisoimage ipmitool +sudo apt-get install -y python-dev libz-dev libxml2-dev libxslt-dev libyaml-dev +sudo pip install pyyaml netaddr paramiko lxml scp pycrypto ecdsa amt + +During libvirt install the user is added to the libvirtd group, so you have to +logout then login back again + + +======== PREPARE and RUN the OPNFV Autodeployment ======== + + +--- Step.1 Prepare the DEA and DHA configuration files and the OPNFV ISO file + +Make sure that you are using the right DEA - Deployment Environment Adapter and +DHA - Deployment Hardware Adapter configuration files, the ones provided are only templates +you will have to modify them according to your needs + +- If wou wish to deploy OPNFV cloud environment on top of KVM/Libvirt + virtualization use as example the following configuration files: + + => templates/virtual_environment/conf/ha + dea.yaml + dha.yaml + + +- If you wish to deploy OPNFV cloud environment on hardware + use as example the following configuration files: + + => templates/hardware_environment/conf/ericsson_montreal_lab/pod1/ha + dea.yaml + dha.yaml + + => templates/hardware_environment/conf/linux_foundation_lab/pod1/ha + dea.yaml + dha.yaml + + => templates/hardware_environment/conf/linux_foundation_lab/pod2/ha + dea.yaml + dha.yaml + + +--- Step.2 Run Autodeployment --- + +usage: python ./deploy.py [-h] [-nf] [-nh] [-fo] [-co] [-c] [-iso [ISO_FILE]] + [-dea [DEA_FILE]] [-dha [DHA_FILE]] [-s STORAGE_DIR] + [-b PXE_BRIDGE] [-p FUEL_PLUGINS_DIR] + [-pc FUEL_PLUGINS_CONF_DIR] [-np] + [-dt DEPLOY_TIMEOUT] [-nde] + +optional arguments: + -h, --help show this help message and exit + -nf Do not install Fuel Master (and Node VMs when using + libvirt) + -nh Don't run health check after deployment + -fo Install Fuel Master only (and Node VMs when using + libvirt) + -co Cleanup VMs and Virtual Networks according to what is + defined in DHA + -c Cleanup after deploy + -iso [ISO_FILE] ISO File [default: OPNFV.iso] + -dea [DEA_FILE] Deployment Environment Adapter: dea.yaml + -dha [DHA_FILE] Deployment Hardware Adapter: dha.yaml + -s STORAGE_DIR Storage Directory [default: images] + -b PXE_BRIDGE Linux Bridge for booting up the Fuel Master VM + [default: pxebr] + -p FUEL_PLUGINS_DIR Fuel Plugins directory + -pc FUEL_PLUGINS_CONF_DIR + Fuel Plugins Configuration directory + -np Do not install Fuel Plugins + -dt DEPLOY_TIMEOUT Deployment timeout (in minutes) [default: 240] + -nde Do not launch environment deployment + -log [LOG_FILE] Deployment log path and file name + +* EXAMPLES: + +- Install Fuel Master and deploy OPNFV Cloud from scratch on Hardware Environment: + + sudo python deploy.py -iso ~/ISO/opnfv.iso -dea ~/CONF/hardware/dea.yaml -dha ~/CONF/hardware/dha.yaml -s /mnt/images -b pxebr -log ~/Deployment-888.log.tar.gz + + +- Install Fuel Master and deploy OPNFV Cloud from scratch on Virtual Environment: + + sudo python deploy.py -iso ~/ISO/opnfv.iso -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -s /mnt/images -log ~/Deployment-888.log.tar.gz + + +- Deploy OPNFV Cloud on an already active Environment where Fuel Master VM is running so no need to install Fuel again: + + sudo python deploy.py -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -log ~/Deployment-888.log.tar.gz + + => with plugin installation + sudo python deploy.py -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -log ~/Deployment-888.log.tar.gz + + => with cleanup after deployment is finished + sudo python deploy.py -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -c -log ~/Deployment-888.log.tar.gz + + => no healthcheck after deployment is completed + sudo python deploy.py -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -nh -log ~/Deployment-888.log.tar.gz + + +- Install Fuel Master only (and Node VMs when using virtual environment): + + => for virtual environment: + sudo python deploy.py -iso ~/ISO/opnfv.iso -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -s /mnt/images -log ~/Deployment-888.log.tar.gz + + => for hardware environment: + sudo python deploy.py -iso ~/ISO/opnfv.iso -dea ~/CONF/hardware/dea.yaml -dha ~/CONF/hardware/dha.yaml -s /mnt/images -b pxebr -log ~/Deployment-888.log.tar.gz + + +- Cleanup a running OPNFV environment: + + sudo python deploy.py -co -dha ~/CONF/virtual/dha.yaml + + +* WARNINGS: + +=> If optional argument -s is not specified, Autodeployment will use +"/images" as default, and it will create it, if it hasn't been created before + +=> If optional argument -b is not specified, Autodeployment will use "pxebr" as default, +if the bridge does not exist, the application will terminate with an error message + +=> If argument -iso [ISO_FILE] is not specified, Autodeployment will use "/OPNFV.iso" +as default, if the iso file does not exist, the application will terminate with an error message + +=> If argument -dea [DEA_FILE] is not specified, Autodeployment will use "/dea.yaml" +as default, if DEA file does not exist, the application will terminate with an error message + +=> If argument -dha [DHA_FILE] is not specified, Autodeployment will use "/dha.yaml" +as default, if DHA file does not exist, the application will terminate with an error message + +=> Optional argument -b PXE_BRIDGE is not required for Autodeployment in virtual environment, + even if it is specified it will not be used at all because virtual environment is using a different virtual network setup + +=> If optional argument -p FUEL_PLUGINS_DIR is not specified, no external plugins will be installed in Fuel + + +--- Networking considerations --- + +For Virtual Environment: + +There are some NAT, IPTABLE conflicts on the edge of libvirt bridging and Fuel Master +according to http://wiki.libvirt.org/page/Networking +netfilter on the bridges should be disabled + +Add these lines to /etc/sysctl.conf + +cat >> /etc/sysctl.conf < start + abort_after: + timeout = True + break + if not deploy_id: + deploy_id = self._start_deploy_task() + sts, prg, msg = self._deployment_status(deploy_id) + if sts == 'error': + log('Error during deployment: {}'.format(msg)) + break + if sts == 'running': + log('Environmnent deploymnet progress: {}%'.format(prg)) + elif sts == 'ready': + ready = True + break + time.sleep(SLEEP_TIME) + except (DeployNotStart, NodesGoOffline) as e: + log(e) + attempts += 1 + deploy_id = None + time.sleep(SLEEP_TIME * attempts) + + if timeout: + err('Deployment timed out, environment %s is not operational, ' + 'snapshot will not be performed' + % self.env_id) + if ready: + log('Environment %s successfully deployed' + % self.env_id) + else: + self.collect_error_logs() + err('Deployment failed, environment %s is not operational' + % self.env_id, self.collect_logs) + + def _start_deploy_task(self): + out, _ = exec_cmd('fuel2 env deploy {}'.format(self.env_id), False) + id = self._deployment_task_id(out) + return id + + def _deployment_task_id(self, response): + response = str(response) + if response.startswith('Deployment task with id'): + for s in response.split(): + if s.isdigit(): + return int(s) + raise DeployNotStart('Unable to start deployment: {}'.format(response)) + + def _deployment_status(self, id): + task = self._task_fields(id) + if task['status'] == 'error': + if task['message'].endswith( + 'offline. Remove them from environment and try again.'): + raise NodesGoOffline(task['message']) + return task['status'], task['progress'], task['message'] + + def _task_fields(self, id): + try: + out, _ = exec_cmd('fuel2 task show {} -f json'.format(id), False) + task_info = json.loads(out) + properties = {} + # for 9.0 this can be list of dicts or dict + # see https://bugs.launchpad.net/fuel/+bug/1625518 + if isinstance(task_info, list): + for d in task_info: + properties.update({d['Field']: d['Value']}) + else: + return task_info + return properties + except ValueError as e: + err('Unable to fetch task info: {}'.format(e)) + + def collect_logs(self): + log('Cleaning out any previous deployment logs') + exec_cmd('rm -f /var/log/remote/fuel-snapshot-*', False) + exec_cmd('rm -f /root/deploy-*', False) + log('Generating Fuel deploy snap-shot') + if exec_cmd('fuel snapshot < /dev/null &> snapshot.log', False)[1] <> 0: + log('Could not create a Fuel snapshot') + else: + exec_cmd('mv /root/fuel-snapshot* /var/log/remote/', False) + + log('Collecting all Fuel Snapshot & deploy log files') + r, _ = exec_cmd('tar -czhf /root/deploy-%s.log.tar.gz /var/log/remote' % time.strftime("%Y%m%d-%H%M%S"), False) + log(r) + + def verify_node_status(self): + node_list = parse(exec_cmd('fuel --env %s node' % self.env_id)) + failed_nodes = [] + for node in node_list: + if node[N['status']] != 'ready': + failed_nodes.append((node[N['id']], node[N['status']])) + + if failed_nodes: + summary = '' + for node, status in failed_nodes: + summary += '[node %s, status %s]\n' % (node, status) + err('Deployment failed: %s' % summary, self.collect_logs) + + def health_check(self): + log('Now running sanity and smoke health checks') + r = exec_cmd('fuel health --env %s --check sanity,smoke --force' % self.env_id) + log(r) + if 'failure' in r: + err('Healthcheck failed!', self.collect_logs) + + def deploy(self): + self.run_deploy() + self.verify_node_status() + if not self.no_health_check: + self.health_check() + self.collect_logs() diff --git a/deploy/common.py b/deploy/common.py new file mode 100644 index 000000000..51b70fe46 --- /dev/null +++ b/deploy/common.py @@ -0,0 +1,202 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# peter.barabas@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import subprocess +import sys +import os +import logging +import argparse +import shutil +import stat +import errno +import time +import shlex + +N = {'id': 0, 'status': 1, 'name': 2, 'cluster': 3, 'ip': 4, 'mac': 5, + 'roles': 6, 'pending_roles': 7, 'online': 8, 'group_id': 9} +E = {'id': 0, 'status': 1, 'name': 2, 'release_id': 3, 'pending_release_id': 4} +R = {'id': 0, 'name': 1, 'state': 2, 'operating_system': 3, 'version': 4} +RO = {'name': 0, 'conflicts': 1} +CWD = os.getcwd() +LOG = logging.getLogger(__name__) +LOG.setLevel(logging.DEBUG) +formatter = logging.Formatter('%(message)s') +out_handler = logging.StreamHandler(sys.stdout) +out_handler.setFormatter(formatter) +LOG.addHandler(out_handler) +LOGFILE = 'autodeploy.log' +if os.path.isfile(LOGFILE): + os.remove(LOGFILE) +out_handler = logging.FileHandler(LOGFILE, mode='w') +out_handler.setFormatter(formatter) +LOG.addHandler(out_handler) +os.chmod(LOGFILE, 0664) + + +def mask_arguments(cmd, mask_args, mask_str): + cmd_line = shlex.split(cmd) + for pos in mask_args: + # Don't mask the actual command; also check if we don't reference + # beyond bounds + if pos == 0 or pos >= len(cmd_line): + continue + cmd_line[pos] = mask_str + return ' '.join(cmd_line) + + +def exec_cmd(cmd, check=True, attempts=1, delay=5, verbose=False, mask_args=[], mask_str='*****'): + masked_cmd = mask_arguments(cmd, mask_args, mask_str) + + # a negative value means forever + while attempts != 0: + attempts = attempts - 1 + process = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True) + (response, stderr) = process.communicate() + return_code = process.returncode + if return_code == 0 or attempts == 0: + break + time.sleep(delay) + if verbose: + log('%d attempts left: %s' % (attempts, masked_cmd)) + + response = response.strip() + if check: + if return_code > 0: + stderr = stderr.strip() + print("Failed command: " + str(masked_cmd)) + print("Command returned response: " + str(stderr)) + print("Command return code: " + str(return_code)) + raise Exception(stderr) + else: + print("Command: " + str(masked_cmd)) + print(str(response)) + return response + return response, return_code + + +def run_proc(cmd): + process = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + shell=True) + return process + + +def run_proc_wait_terminated(process): + response = process.communicate()[0].strip() + return_code = process.returncode + return response, return_code + + +def run_proc_kill(process): + response = process.kill() + return response + + +def parse(printout): + parsed_list = [] + lines = printout.splitlines() + for l in lines[2:]: + parsed = [e.strip() for e in l.split('|')] + parsed_list.append(parsed) + return parsed_list + + +def clean(lines): + parsed_list = [] + parsed = [] + for l in lines.strip().splitlines(): + parsed = [] + cluttered = [e.strip() for e in l.split(' ')] + for p in cluttered: + if p: + parsed.append(p) + parsed_list.append(parsed) + return parsed if len(parsed_list) == 1 else parsed_list + + +def err(message, fun = None, *args): + LOG.error('%s\n' % message) + if fun: + fun(*args) + sys.exit(1) + + +def warn(message): + LOG.warning('%s\n' % message) + + +def check_file_exists(file_path): + if not os.path.dirname(file_path): + file_path = '%s/%s' % (CWD, file_path) + if not os.access(file_path, os.R_OK): + err('ERROR: File %s not found\n' % file_path) + + +def check_dir_exists(dir_path): + if not os.path.dirname(dir_path): + dir_path = '%s/%s' % (CWD, dir_path) + if not os.path.isdir(dir_path): + err('ERROR: Directory %s not found\n' % dir_path) + + +def create_dir_if_not_exists(dir_path): + if not os.path.isdir(dir_path): + log('Creating directory %s' % dir_path) + os.makedirs(dir_path) + + +def delete(f): + if os.path.isfile(f): + log('Deleting file %s' % f) + os.remove(f) + elif os.path.isdir(f): + log('Deleting directory %s' % f) + shutil.rmtree(f) + + +def commafy(comma_separated_list): + l = [c.strip() for c in comma_separated_list.split(',')] + return ','.join(l) + + +def check_if_root(): + uid = os.getuid() + if uid != 0: + err('You need be root to run this application') + + +def log(message): + LOG.debug('%s\n' % message) + + +class ArgParser(argparse.ArgumentParser): + + def error(self, message): + sys.stderr.write('ERROR: %s\n' % message) + self.print_help() + sys.exit(2) + + +def backup(path): + src = path + dst = path + '_orig' + delete(dst) + try: + shutil.copytree(src, dst) + except OSError as e: + if e.errno == errno.ENOTDIR: + shutil.copy(src, dst) + else: + raise diff --git a/deploy/config/dea_base.yaml b/deploy/config/dea_base.yaml new file mode 100644 index 000000000..c1a0606bc --- /dev/null +++ b/deploy/config/dea_base.yaml @@ -0,0 +1,801 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +dea-base-config-metadata: + title: 'Deployment Environment Adapter Base configuration' + # DEA API version supported + version: '0.4' + created: 'Fri Jun 10 2016' + comment: 'Rebased for Fuel 9' +environment: + net_segment_type: tun +fuel: + FUEL_ACCESS: + password: admin + user: admin +wanted_release: Mitaka on Ubuntu 14.04 +settings: + editable: + access: + email: + description: Email address for Administrator + label: Email + regex: + error: Invalid email + source: ^\S+@\S+$ + type: text + value: admin@localhost + weight: 40 + metadata: + group: general + label: OpenStack Access + weight: 10 + password: + description: Password for Administrator + label: Password + regex: + error: Empty password + source: \S + type: password + value: admin + weight: 20 + tenant: + description: Tenant (project) name for Administrator + label: Tenant + regex: + error: Invalid tenant name + source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?!ironic$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 30 + user: + description: Username for Administrator + label: Username + regex: + error: Invalid username + source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?!ironic$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 10 + additional_components: + ceilometer: + description: If selected, Ceilometer and Aodh components will be installed + label: Install Ceilometer and Aodh + type: checkbox + value: true + weight: 60 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 50 + ironic: + description: If selected, Ironic component will be installed + label: Install Ironic + restrictions: + - cluster:net_provider != 'neutron' or networking_parameters:segmentation_type != 'vlan': Ironic + requires Neutron with VLAN segmentation. + - settings:storage.images_ceph.value == true and settings:storage.objects_ceph.value == false: Ironic + requires Swift or RadosGW for Glance images. + type: checkbox + value: false + weight: 80 + metadata: + group: openstack_services + label: Additional Components + weight: 10 + mongo: + description: If selected, You can use external Mongo DB as ceilometer backend + label: Use external Mongo DB + restrictions: + - settings:additional_components.ceilometer.value == false: External Mongo + aims to be an external backend for Ceilometer. Without Ceilometer enabled, + External Mongo is useless and should not be installed. + type: checkbox + value: false + weight: 70 + murano: + description: If selected, Murano component will be installed + label: Install Murano + type: checkbox + value: false + weight: 20 + murano-cfapi: + description: If selected, Murano service broker will be installed + label: Install Murano service broker for Cloud Foundry + restrictions: + - condition: settings:additional_components.murano.value == false + message: Murano should be enabled + - action: hide + condition: not ('experimental' in version:feature_groups) + type: checkbox + value: false + weight: 30 + sahara: + description: If selected, Sahara component will be installed + label: Install Sahara + type: checkbox + value: false + weight: 10 + cgroups: + metadata: + always_editable: true + group: general + label: Cgroups conguration for services + restrictions: + - action: hide + condition: 'true' + weight: 90 + common: + auth_key: + group: security + type: hidden + value: '' + weight: 70 + auto_assign_floating_ip: + description: If selected, OpenStack will automatically assign a floating IP + to a new instance + group: network + label: Auto assign floating IP + restrictions: + - action: hide + condition: cluster:net_provider == 'neutron' + type: checkbox + value: false + weight: 40 + debug: + description: Debug logging mode provides more information, but requires more + disk space. + group: logging + label: OpenStack debug logging + type: checkbox + value: false + weight: 20 + libvirt_type: + group: compute + label: Hypervisor type + type: radio + value: kvm + values: + - data: kvm + description: Choose this type of hypervisor if you run OpenStack on hardware + label: KVM + - data: qemu + description: Choose this type of hypervisor if you run OpenStack on virtual + hosts. + label: QEMU + weight: 30 + metadata: + label: Common + weight: 10 + nova_quota: + description: Quotas are used to limit CPU and memory usage for tenants. Enabling + quotas will increase load on the Nova database. + group: compute + label: Nova quotas + type: checkbox + value: false + weight: 30 + propagate_task_deploy: + type: hidden + value: false + weight: 12 + puppet_debug: + description: Debug puppet logging mode provides more information, but requires + more disk space. + group: logging + label: Puppet debug logging + type: checkbox + value: true + weight: 20 + resume_guests_state_on_host_boot: + description: Whether to resume previous guests state when the host reboots. + If enabled, this option causes guests assigned to the host to resume their + previous state. If the guest was running a restart will be attempted when + nova-compute starts. If the guest was not running previously, a restart + will not be attempted. + group: compute + label: Resume guests state on host boot + type: checkbox + value: true + weight: 50 + task_deploy: + type: hidden + value: true + weight: 11 + use_cow_images: + description: For most cases you will want qcow format. If it's disabled, raw + image format will be used to run VMs. OpenStack with raw format currently + does not support snapshotting. + group: storage + label: Use qcow format for images + type: checkbox + value: true + weight: 60 + use_vcenter: + type: hidden + value: false + weight: 30 + corosync: + group: + description: '' + label: Group + type: text + value: 226.94.1.1 + weight: 10 + metadata: + group: general + label: Corosync + restrictions: + - action: hide + condition: 'true' + weight: 50 + port: + description: '' + label: Port + type: text + value: '12000' + weight: 20 + verified: + description: Set True only if multicast is configured correctly on router. + label: Need to pass network verification. + type: checkbox + value: false + weight: 10 + external_mongo: + hosts_ip: + description: IP Addresses of MongoDB. Use comma to split IPs + label: MongoDB hosts IP + regex: + error: Invalid hosts ip sequence + source: ^(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?),)*((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ + type: text + value: '' + weight: 30 + metadata: + group: openstack_services + label: External MongoDB + restrictions: + - action: hide + condition: settings:additional_components.mongo.value == false + message: Ceilometer and MongoDB are not enabled on the Additional Components + section + weight: 30 + mongo_db_name: + description: Mongo database name + label: Database name + regex: + error: Invalid database name + source: ^\w+$ + type: text + value: ceilometer + weight: 30 + mongo_password: + description: Mongo database password + label: Password + regex: + error: Password contains spaces + source: ^\S*$ + type: password + value: ceilometer + weight: 30 + mongo_replset: + description: Name for Mongo replication set + label: Replset + type: text + value: '' + weight: 30 + mongo_user: + description: Mongo database username + label: Username + regex: + error: Empty username + source: ^\w+$ + type: text + value: ceilometer + weight: 30 + kernel_params: + kernel: + description: Default kernel parameters + label: Initial parameters + type: text + value: console=tty0 net.ifnames=0 biosdevname=0 rootdelay=90 nomodeset + metadata: + group: general + label: Kernel parameters + weight: 60 + murano_settings: + metadata: + group: openstack_services + label: Murano Settings + restrictions: + - action: hide + condition: settings:additional_components.murano.value == false + message: Murano is not enabled on the Additional Components section + weight: 20 + murano_glance_artifacts_plugin: + description: If selected glance artifact repository will be enabled + label: Enable glance artifact repository + type: checkbox + value: true + weight: 40 + murano_repo_url: + description: '' + label: Murano Repository URL + type: text + value: http://storage.apps.openstack.org/ + weight: 10 + neutron_advanced_configuration: + metadata: + group: network + label: Neutron Advanced Configuration + restrictions: + - action: hide + condition: cluster:net_provider != 'neutron' + weight: 20 + neutron_dvr: + description: Enable Distributed Virtual Routers in Neutron + label: Neutron DVR + restrictions: + - ? networking_parameters:segmentation_type != 'vlan' and settings:neutron_advanced_configuration.neutron_l2_pop.value + == false + : DVR requires L2 population to be enabled. + type: checkbox + value: false + weight: 20 + neutron_l2_pop: + description: Enable L2 population mechanism in Neutron + label: Neutron L2 population + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: checkbox + value: false + weight: 10 + neutron_l3_ha: + description: 'Enable High Availability features for Virtual Routers in Neutron + + Requires at least 2 Controller nodes to function properly + + ' + label: Neutron L3 HA + restrictions: + - condition: settings:neutron_advanced_configuration.neutron_dvr.value == + true + message: Neutron DVR must be disabled in order to use Neutron L3 HA + type: checkbox + value: false + weight: 30 + neutron_qos: + description: Enable Neutron QoS advanced service plug-in + label: Neutron QoS + type: checkbox + value: false + weight: 40 + operator_user: + authkeys: + description: Public SSH keys to include to operator user's authorized keys, + one per line. + label: Authorized SSH keys + type: textarea + value: '' + weight: 80 + homedir: + description: Home directory for operator user + label: Home directory + regex: + error: Invalid path + source: ^/\S + type: text + value: /home/fueladmin + weight: 70 + metadata: + group: general + label: Operating System Access + weight: 15 + name: + description: Username for operator user + label: Username + regex: + error: Empty username + source: \S + type: text + value: fueladmin + weight: 50 + password: + description: Password for operator user + label: Password + regex: + error: Empty password + source: \S + type: password + value: mCKyMCwhzrt7d6E8WQzxg5WS + weight: 60 + sudo: + description: Sudoers configuration directives for operator user, one per line. + label: Sudoers configuration + type: textarea + value: 'ALL=(ALL) NOPASSWD: ALL' + weight: 90 + provision: + metadata: + group: general + label: Provision + restrictions: + - action: hide + condition: 'false' + weight: 80 + method: + type: hidden + value: image + packages: + label: Initial packages + type: textarea + value: 'acl + + anacron + + bash-completion + + bridge-utils + + bsdmainutils + + build-essential + + cloud-init + + curl + + daemonize + + debconf-utils + + gdisk + + grub-pc + + hpsa-dkms + + hwloc + + i40e-dkms + + linux-firmware + + linux-firmware-nonfree + + linux-headers-generic-lts-trusty + + linux-image-generic-lts-trusty + + lvm2 + + mcollective + + mdadm + + multipath-tools + + multipath-tools-boot + + nailgun-agent + + nailgun-mcagents + + network-checker + + ntp + + openssh-client + + openssh-server + + puppet + + python-amqp + + ruby-augeas + + ruby-ipaddress + + ruby-json + + ruby-netaddr + + ruby-openstack + + ruby-shadow + + ruby-stomp + + telnet + + ubuntu-minimal + + ubuntu-standard + + uuid-runtime + + vim + + virt-what + + vlan + + ' + weight: 10 + public_network_assignment: + assign_to_all_nodes: + description: When disabled, public network will be assigned to controllers + only + label: Assign public network to all nodes + type: checkbox + value: true + weight: 10 + metadata: + group: network + label: Public network assignment + restrictions: + - action: hide + condition: cluster:net_provider != 'neutron' + weight: 10 + public_ssl: + cert_data: + description: Certificate and private key data, concatenated into a single + file + label: Certificate + restrictions: + - action: hide + condition: (settings:public_ssl.cert_source.value != 'user_uploaded') or + (settings:public_ssl.horizon.value == false and settings:public_ssl.services.value + == false) + type: file + value: '' + weight: 40 + cert_source: + description: From where we'll get certificate and private key + label: Select source for certificate + restrictions: + - action: hide + condition: settings:public_ssl.horizon.value == false and settings:public_ssl.services.value + == false + type: radio + value: self_signed + values: + - data: self_signed + description: Generate private key and certificate that will be signed by + this key + label: Self-signed + - data: user_uploaded + description: Use pre-generated key and certificate + label: I have my own keypair with certificate + weight: 30 + horizon: + description: Secure access to Horizon enabling HTTPS instead of HTTP + label: HTTPS for Horizon + restrictions: + - settings:public_ssl.services.value == false: TLS for OpenStack public endpoints + should be enabled + type: checkbox + value: false + weight: 20 + hostname: + description: Your DNS entries should point to this name. Self-signed certificates + also will use this hostname + label: DNS hostname for public TLS endpoints + restrictions: + - action: hide + condition: settings:public_ssl.horizon.value == false and settings:public_ssl.services.value + == false + type: text + value: public.fuel.local + weight: 50 + metadata: + group: security + label: Public TLS + weight: 110 + services: + description: Enable TLS termination on HAProxy for OpenStack services + label: TLS for OpenStack public endpoints + type: checkbox + value: false + weight: 10 + repo_setup: + metadata: + always_editable: true + group: general + label: Repositories + weight: 50 + repos: + description: 'Please note: the first repository will be considered the operating + system mirror that will be used during node provisioning. + + To create a local repository mirror on the Fuel master node, please follow + the instructions provided by running "fuel-createmirror --help" on the Fuel + master node. + + Please make sure your Fuel master node has Internet access to the repository + before attempting to create a mirror. + + ' + extra_priority: null + type: custom_repo_configuration + value: + - name: ubuntu + priority: null + section: main universe multiverse + suite: trusty + type: deb + uri: http://10.20.0.2:8080/mirrors/ubuntu/ + - name: ubuntu-updates + priority: null + section: main universe multiverse + suite: trusty-updates + type: deb + uri: http://10.20.0.2:8080/mirrors/ubuntu/ + - name: ubuntu-security + priority: null + section: main universe multiverse + suite: trusty-security + type: deb + uri: http://10.20.0.2:8080/mirrors/ubuntu/ + - name: mos + priority: 1050 + section: main restricted + suite: mos9.0 + type: deb + uri: http://10.20.0.2:8080/mitaka-9.0/ubuntu/x86_64 + - name: Auxiliary + priority: 1150 + section: main restricted + suite: auxiliary + type: deb + uri: http://10.20.0.2:8080/mitaka-9.0/ubuntu/auxiliary + service_user: + homedir: + type: hidden + value: /var/lib/fuel + metadata: + group: general + label: Service user account + restrictions: + - action: hide + condition: 'true' + weight: 10 + name: + type: hidden + value: fuel + password: + type: hidden + value: sCTOC4CkNSTLuNKUQDNUV1Bp + root_password: + type: hidden + value: r00tme + sudo: + type: hidden + value: 'ALL=(ALL) NOPASSWD: ALL' + storage: + admin_key: + type: hidden + value: AQDir1pXAAAAABAAm8r2rR0FuVsV8LRo6u9GgQ== + bootstrap_osd_key: + type: hidden + value: AQDir1pXAAAAABAAK5E2MNhWdIpOBzjXJTVqcg== + ephemeral_ceph: + description: Configures Nova to store ephemeral volumes in RBD. This works + best if Ceph is enabled for volumes and images, too. Enables live migration + of all types of Ceph backed VMs (without this option, live migration will + only work with VMs launched from Cinder volumes). + label: Ceph RBD for ephemeral volumes (Nova) + type: checkbox + value: false + weight: 75 + fsid: + type: hidden + value: 7a5db523-ae79-489d-b5d1-7a31fdaba6ef + images_ceph: + description: Configures Glance to use the Ceph RBD backend to store images. + If enabled, this option will prevent Swift from installing. + label: Ceph RBD for images (Glance) + restrictions: + - settings:storage.images_vcenter.value == true: Only one Glance backend could + be selected. + type: checkbox + value: false + weight: 30 + images_vcenter: + description: Configures Glance to use the vCenter/ESXi backend to store images. + If enabled, this option will prevent Swift from installing. + label: VMware vCenter/ESXi datastore for images (Glance) + restrictions: + - action: hide + condition: settings:common.use_vcenter.value != true + - condition: settings:storage.images_ceph.value == true + message: Only one Glance backend could be selected. + type: checkbox + value: false + weight: 35 + metadata: + group: storage + label: Storage Backends + weight: 60 + mon_key: + type: hidden + value: AQDir1pXAAAAABAAp92Dw8/kmDdhMvpgaPMKiQ== + objects_ceph: + description: Configures RadosGW front end for Ceph RBD. This exposes S3 and + Swift API Interfaces. If enabled, this option will prevent Swift from installing. + label: Ceph RadosGW for objects (Swift API) + type: checkbox + value: false + weight: 80 + osd_pool_size: + description: Configures the default number of object replicas in Ceph. This + number must be equal to or lower than the number of deployed 'Ceph OSD' + nodes. + label: Ceph object replication factor + regex: + error: Invalid number + source: ^[1-9]\d*$ + type: text + value: '3' + weight: 85 + radosgw_key: + type: hidden + value: AQDir1pXAAAAABAAUH+qP9FohG5wGr/+oQ2rFw== + volumes_block_device: + description: High performance block device storage. It is recommended to have + at least one Cinder Block Device + label: Cinder Block device driver + restrictions: + - settings:storage.volumes_ceph.value == true + type: checkbox + value: false + weight: 15 + volumes_ceph: + description: Configures Cinder to store volumes in Ceph RBD images. + label: Ceph RBD for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value == true or settings:storage.volumes_block_device.value + == true + type: checkbox + value: true + weight: 20 + volumes_lvm: + description: It is recommended to have at least one Cinder node. + label: Cinder LVM over iSCSI for volumes + restrictions: + - settings:storage.volumes_ceph.value == true + type: checkbox + value: false + weight: 10 +workloads_collector: + enabled: + type: hidden + value: true + metadata: + group: general + label: Workloads Collector User + restrictions: + - action: hide + condition: 'true' + weight: 10 + password: + type: password + value: JWMZX9JjUK1g4AsC7tHvpXvm + tenant: + type: text + value: services + user: + type: text + value: fuel_stats_user diff --git a/deploy/config/labs/devel-pipeline/default/fuel/config/dea-pod-override.yaml b/deploy/config/labs/devel-pipeline/default/fuel/config/dea-pod-override.yaml new file mode 100644 index 000000000..32b2cfb22 --- /dev/null +++ b/deploy/config/labs/devel-pipeline/default/fuel/config/dea-pod-override.yaml @@ -0,0 +1,255 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +dea-pod-override-config-metadata: + title: 'Deployment Environment Adapter POD override for Development Pipeline - Ericsson ELX version' + version: '0.3' + created: 'Fri Jun 10 2016' + comment: 'Rebased for Fuel 9' +environment: + name: opnfv_virt +interfaces_1: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + ens6: + - public +interfaces_dpdk: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + - interface_properties: + dpdk: + enabled: true + ens6: + - public +interfaces_vlan: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + ens6: + - public +fuel: + ADMIN_NETWORK: + dhcp_pool_end: 10.20.0.254 + dhcp_pool_start: 10.20.0.3 + ipaddress: 10.20.0.2 + netmask: 255.255.255.0 + ssh_network: 10.20.0.0/24 + DNS_DOMAIN: domain.tld + DNS_SEARCH: domain.tld + DNS_UPSTREAM: 8.8.8.8, 8.8.4.4 + HOSTNAME: fuel + NTP1: 0.ubuntu.pool.ntp.org + NTP2: 1.ubuntu.pool.ntp.org + NTP3: 2.ubuntu.pool.ntp.org +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + configuration_template: null + dns_nameservers: + - 8.8.8.8 + - 8.8.4.4 + floating_name: admin_floating_net + floating_ranges: + - - 172.16.0.130 + - 172.16.0.254 + gre_id_range: + - 2 + - 65535 + internal_cidr: 192.168.111.0/24 + internal_gateway: 192.168.111.1 + internal_name: admin_internal_net + net_l23_provider: ovs + segmentation_type: tun + vlan_range: + - 1000 + - 1030 + networks: + - cidr: 192.168.1.0/24 + gateway: null + ip_ranges: + - - 192.168.1.1 + - 192.168.1.254 + meta: + cidr: 192.168.1.0/24 + configurable: true + map_priority: 2 + name: storage + notation: cidr + render_addr_mask: storage + render_type: cidr + use_gateway: false + vlan_start: 102 + name: storage + vlan_start: 102 + - cidr: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.253 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: ip_ranges + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: null + name: management + vlan_start: null + - cidr: 192.168.2.0/24 + gateway: null + ip_ranges: + - - 192.168.2.1 + - 192.168.2.254 + meta: + cidr: 192.168.2.0/24 + configurable: true + map_priority: 2 + name: private + notation: cidr + render_addr_mask: null + render_type: cidr + seg_type: tun + use_gateway: false + vlan_start: 103 + name: private + vlan_start: 103 + - cidr: 172.16.0.0/24 + gateway: 172.16.0.1 + ip_ranges: + - - 172.16.0.2 + - 172.16.0.126 + meta: + cidr: 172.16.0.0/24 + configurable: true + floating_range_var: floating_ranges + ip_range: + - 172.16.0.2 + - 172.16.0.126 + map_priority: 1 + name: public + notation: ip_ranges + render_addr_mask: public + render_type: null + use_gateway: true + vips: + - haproxy + - vrouter + vlan_start: null + name: public + vlan_start: null + - cidr: 10.20.0.0/24 + gateway: 10.20.0.2 + ip_ranges: + - - 10.20.0.3 + - 10.20.0.254 + meta: + configurable: false + map_priority: 0 + notation: ip_ranges + render_addr_mask: null + render_type: null + unmovable: true + use_gateway: true + name: fuelweb_admin + vlan_start: null +settings: + editable: + external_dns: + dns_list: + description: List of upstream DNS servers + label: DNS list + max: 3 + regex: + error: Invalid IP address + source: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ + type: text_list + value: + - 8.8.8.8 + - 8.8.4.4 + weight: 10 + metadata: + group: network + label: Host OS DNS Servers + weight: 30 + external_ntp: + metadata: + group: network + label: Host OS NTP Servers + weight: 40 + ntp_list: + description: List of upstream NTP servers + label: NTP server list + regex: + error: Invalid NTP server + source: ^[a-zA-Z\d]+[-\.\da-zA-Z]*$ + type: text_list + value: + - 0.ubuntu.pool.ntp.org + - 1.ubuntu.pool.ntp.org + - 2.ubuntu.pool.ntp.org + weight: 10 + syslog: + metadata: + enabled: false + group: logging + label: Syslog + toggleable: true + weight: 50 + syslog_port: + description: Remote syslog port + label: Port + regex: + error: Invalid syslog port + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '514' + weight: 20 + syslog_server: + description: Remote syslog hostname + label: Hostname + regex: + error: Invalid hostname + source: ^[a-zA-Z\d]+[-\.\da-zA-Z]*$ + type: text + value: '' + weight: 10 + syslog_transport: + label: Syslog transport protocol + type: radio + value: tcp + values: + - data: udp + description: '' + label: UDP + - data: tcp + description: '' + label: TCP + weight: 30 + diff --git a/deploy/config/labs/devel-pipeline/default/fuel/config/dha.yaml b/deploy/config/labs/devel-pipeline/default/fuel/config/dha.yaml new file mode 100644 index 000000000..0374c5d29 --- /dev/null +++ b/deploy/config/labs/devel-pipeline/default/fuel/config/dha.yaml @@ -0,0 +1,109 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +dha-pod-config-metadata: + title: Deployment Hardware Adapter (DHA) for fuel development pipeline - default version + version: 0.0.3 + created: Feb 1 2016 + comment: Default Fuel8 version + +# Adapter to use for this definition +adapter: libvirt + +# Node list. +# Mandatory property is id, all other properties are adapter specific. + +nodes: +- id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml +- id: 2 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 3 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 4 + libvirtName: compute3 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 5 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +virtNetConfDir: templates/virtual_environment/networks + +disks: + fuel: 100G + controller: 100G + compute: 100G + +# Here the infrastructure VMs can be defined. +# The entries are not mandatory! If it is left empty +# the default defined in deploy/templates will +# be used. +define_vms: + fuel: + vcpu: + value: 2 + memory: + attribute_equlas: + unit: KiB + value: 8388608 + currentMemory: + attribute_equlas: + unit: KiB + value: 8388608 + devices: + interface: + # With attribute_equlas someone can define which + # interface type is meant + attribute_equlas: + type: network + # This will overwrite the type of the model of + # the interface + model: + attribute: + type: virtio + controller: + vcpu: + value: 4 + memory: + attribute_equlas: + unit: KiB + value: 10485760 + currentMemory: + attribute_equlas: + unit: KiB + value: 10485760 + devices: + interface: + attribute_equlas: + type: network + model: + attribute: + type: e1000 + compute: + memory: + attribute_equlas: + unit: KiB + value: 6291456 + currentMemory: + attribute_equlas: + unit: KiB + value: 6291456 + devices: + interface: + attribute_equlas: + type: network + model: + attribute: + type: e1000 diff --git a/deploy/config/labs/devel-pipeline/elx/fuel/config/dea-pod-override.yaml b/deploy/config/labs/devel-pipeline/elx/fuel/config/dea-pod-override.yaml new file mode 100644 index 000000000..cb80e3855 --- /dev/null +++ b/deploy/config/labs/devel-pipeline/elx/fuel/config/dea-pod-override.yaml @@ -0,0 +1,252 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +dea-pod-override-config-metadata: + title: 'Deployment Environment Adapter POD override for Development Pipeline - Ericsson ELX version' + version: '0.3' + created: 'Fri Jun 10 2016' + comment: 'Rebased for Fuel 9' +environment: + name: opnfv_virt +interfaces_1: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + ens6: + - public +interfaces_dpdk: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + - interface_properties: + dpdk: + enabled: true + ens6: + - public +interfaces_vlan: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + ens6: + - public +fuel: + ADMIN_NETWORK: + dhcp_pool_end: 10.20.0.254 + dhcp_pool_start: 10.20.0.3 + ipaddress: 10.20.0.2 + netmask: 255.255.255.0 + ssh_network: 10.20.0.0/24 + DNS_DOMAIN: domain.tld + DNS_SEARCH: domain.tld + DNS_UPSTREAM: 147.214.6.234 + HOSTNAME: fuel + NTP1: time1.ericsson.se + NTP2: time2.ericsson.se + NTP3: time2.ericsson.se +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + configuration_template: null + dns_nameservers: + - 147.214.6.234 + floating_name: admin_floating_net + floating_ranges: + - - 172.16.0.130 + - 172.16.0.254 + gre_id_range: + - 2 + - 65535 + internal_cidr: 192.168.111.0/24 + internal_gateway: 192.168.111.1 + internal_name: admin_internal_net + net_l23_provider: ovs + segmentation_type: tun + vlan_range: + - 1000 + - 1030 + networks: + - cidr: 192.168.1.0/24 + gateway: null + ip_ranges: + - - 192.168.1.1 + - 192.168.1.254 + meta: + cidr: 192.168.1.0/24 + configurable: true + map_priority: 2 + name: storage + notation: cidr + render_addr_mask: storage + render_type: cidr + use_gateway: false + vlan_start: 102 + name: storage + vlan_start: 102 + - cidr: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.253 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: ip_ranges + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: null + name: management + vlan_start: null + - cidr: 192.168.2.0/24 + gateway: null + ip_ranges: + - - 192.168.2.1 + - 192.168.2.254 + meta: + cidr: 192.168.2.0/24 + configurable: true + map_priority: 2 + name: private + notation: cidr + render_addr_mask: null + render_type: cidr + seg_type: tun + use_gateway: false + vlan_start: 103 + name: private + vlan_start: 103 + - cidr: 172.16.0.0/24 + gateway: 172.16.0.1 + ip_ranges: + - - 172.16.0.2 + - 172.16.0.126 + meta: + cidr: 172.16.0.0/24 + configurable: true + floating_range_var: floating_ranges + ip_range: + - 172.16.0.2 + - 172.16.0.126 + map_priority: 1 + name: public + notation: ip_ranges + render_addr_mask: public + render_type: null + use_gateway: true + vips: + - haproxy + - vrouter + vlan_start: null + name: public + vlan_start: null + - cidr: 10.20.0.0/24 + gateway: 10.20.0.2 + ip_ranges: + - - 10.20.0.3 + - 10.20.0.254 + meta: + configurable: false + map_priority: 0 + notation: ip_ranges + render_addr_mask: null + render_type: null + unmovable: true + use_gateway: true + name: fuelweb_admin + vlan_start: null +settings: + editable: + external_dns: + dns_list: + description: List of upstream DNS servers + label: DNS list + max: 3 + regex: + error: Invalid IP address + source: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ + type: text_list + value: + - 147.214.6.234 + weight: 10 + metadata: + group: network + label: Host OS DNS Servers + weight: 30 + external_ntp: + metadata: + group: network + label: Host OS NTP Servers + weight: 40 + ntp_list: + description: List of upstream NTP servers + label: NTP server list + regex: + error: Invalid NTP server + source: ^[a-zA-Z\d]+[-\.\da-zA-Z]*$ + type: text_list + value: + - time1.ericsson.se + - time2.ericsson.se + weight: 10 + syslog: + metadata: + enabled: false + group: logging + label: Syslog + toggleable: true + weight: 50 + syslog_port: + description: Remote syslog port + label: Port + regex: + error: Invalid syslog port + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '514' + weight: 20 + syslog_server: + description: Remote syslog hostname + label: Hostname + regex: + error: Invalid hostname + source: ^[a-zA-Z\d]+[-\.\da-zA-Z]*$ + type: text + value: '' + weight: 10 + syslog_transport: + label: Syslog transport protocol + type: radio + value: tcp + values: + - data: udp + description: '' + label: UDP + - data: tcp + description: '' + label: TCP + weight: 30 + diff --git a/deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml b/deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml new file mode 100644 index 000000000..c2352f924 --- /dev/null +++ b/deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml @@ -0,0 +1,110 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +dha-pod-config-metadata: + title: Deployment Hardware Adapter (DHA) for fuel development pipeline - Ericsson ELX version + version: 0.0.3 + created: Feb 2 2016 + comment: ELX Fuel 9 version + +# Adapter to use for this definition +adapter: libvirt + +# Node list. +# Mandatory property is id, all other properties are adapter specific. + +nodes: +- id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml +- id: 2 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 3 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 4 + libvirtName: compute3 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 5 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +virtNetConfDir: templates/virtual_environment/networks + +disks: + fuel: 100G + controller: 100G + compute: 100G + +# Here the infrastructure VMs can be defined. +# The entries are not mandatory! If it is left empty +# the default defined in deploy/templates will +# be used. +define_vms: + fuel: + vcpu: + value: 2 + memory: + attribute_equlas: + unit: KiB + value: 8388608 + currentMemory: + attribute_equlas: + unit: KiB + value: 8388608 + devices: + interface: + # With attribute_equlas someone can define which + # interface type is meant + attribute_equlas: + type: network + # This will overwrite the type of the model of + # the interface + model: + attribute: + type: virtio + controller: + vcpu: + value: 4 + memory: + attribute_equlas: + unit: KiB + value: 10485760 + currentMemory: + attribute_equlas: + unit: KiB + value: 10485760 + devices: + interface: + attribute_equlas: + type: network + model: + attribute: + type: e1000 + compute: + memory: + attribute_equlas: + unit: KiB + value: 6291456 + currentMemory: + attribute_equlas: + unit: KiB + value: 6291456 + devices: + interface: + attribute_equlas: + type: network + model: + attribute: + type: e1000 + diff --git a/deploy/config/labs/devel-pipeline/huawei-ch/fuel/config/dea-pod-override.yaml b/deploy/config/labs/devel-pipeline/huawei-ch/fuel/config/dea-pod-override.yaml new file mode 100644 index 000000000..92cc0e616 --- /dev/null +++ b/deploy/config/labs/devel-pipeline/huawei-ch/fuel/config/dea-pod-override.yaml @@ -0,0 +1,253 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +dea-pod-override-config-metadata: + title: 'Deployment Environment Adapter POD override for Development Pipeline - Huawei-China version' + version: '0.3' + created: 'Jun 14 2016' + comment: 'Rebased for Fuel 9' +environment: + name: opnfv_virt +interfaces_1: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + ens6: + - public +interfaces_dpdk: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + - interface_properties: + dpdk: + enabled: true + ens6: + - public +interfaces_vlan: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + ens6: + - public +fuel: + ADMIN_NETWORK: + dhcp_pool_end: 10.20.0.254 + dhcp_pool_start: 10.20.0.3 + ipaddress: 10.20.0.2 + netmask: 255.255.255.0 + ssh_network: 10.20.0.0/24 + DNS_DOMAIN: domain.tld + DNS_SEARCH: domain.tld + DNS_UPSTREAM: 114.114.114.114 + HOSTNAME: fuel + NTP1: 0.fuel.pool.ntp.org + NTP2: 1.fuel.pool.ntp.org + NTP3: 2.fuel.pool.ntp.org +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + configuration_template: null + dns_nameservers: + - 114.114.114.114 + floating_name: admin_floating_net + floating_ranges: + - - 172.16.0.130 + - 172.16.0.254 + gre_id_range: + - 2 + - 65535 + internal_cidr: 192.168.111.0/24 + internal_gateway: 192.168.111.1 + internal_name: admin_internal_net + net_l23_provider: ovs + segmentation_type: tun + vlan_range: + - 1000 + - 1030 + networks: + - cidr: 192.168.1.0/24 + gateway: null + ip_ranges: + - - 192.168.1.1 + - 192.168.1.254 + meta: + cidr: 192.168.1.0/24 + configurable: true + map_priority: 2 + name: storage + notation: cidr + render_addr_mask: storage + render_type: cidr + use_gateway: false + vlan_start: 102 + name: storage + vlan_start: 102 + - cidr: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.253 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: ip_ranges + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: null + name: management + vlan_start: null + - cidr: 192.168.2.0/24 + gateway: null + ip_ranges: + - - 192.168.2.1 + - 192.168.2.254 + meta: + cidr: 192.168.2.0/24 + configurable: true + map_priority: 2 + name: private + notation: cidr + render_addr_mask: null + render_type: cidr + seg_type: tun + use_gateway: false + vlan_start: 103 + name: private + vlan_start: 103 + - cidr: 172.16.0.0/24 + gateway: 172.16.0.1 + ip_ranges: + - - 172.16.0.2 + - 172.16.0.126 + meta: + cidr: 172.16.0.0/24 + configurable: true + floating_range_var: floating_ranges + ip_range: + - 172.16.0.2 + - 172.16.0.126 + map_priority: 1 + name: public + notation: ip_ranges + render_addr_mask: public + render_type: null + use_gateway: true + vips: + - haproxy + - vrouter + vlan_start: null + name: public + vlan_start: null + - cidr: 10.20.0.0/24 + gateway: 10.20.0.2 + ip_ranges: + - - 10.20.0.3 + - 10.20.0.254 + meta: + configurable: false + map_priority: 0 + notation: ip_ranges + render_addr_mask: null + render_type: null + unmovable: true + use_gateway: true + name: fuelweb_admin + vlan_start: null +settings: + editable: + external_dns: + dns_list: + description: List of upstream DNS servers + label: DNS list + max: 3 + regex: + error: Invalid IP address + source: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ + type: text_list + value: + - 114.114.114.114 + weight: 10 + metadata: + group: network + label: Host OS DNS Servers + weight: 30 + external_ntp: + metadata: + group: network + label: Host OS NTP Servers + weight: 40 + ntp_list: + description: List of upstream NTP servers + label: NTP server list + regex: + error: Invalid NTP server + source: ^[a-zA-Z\d]+[-\.\da-zA-Z]*$ + type: text_list + value: + - 0.fuel.pool.ntp.org + - 1.fuel.pool.ntp.org + - 2.fuel.pool.ntp.org + weight: 10 + syslog: + metadata: + enabled: false + group: logging + label: Syslog + toggleable: true + weight: 50 + syslog_port: + description: Remote syslog port + label: Port + regex: + error: Invalid syslog port + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '514' + weight: 20 + syslog_server: + description: Remote syslog hostname + label: Hostname + regex: + error: Invalid hostname + source: ^[a-zA-Z\d]+[-\.\da-zA-Z]*$ + type: text + value: '' + weight: 10 + syslog_transport: + label: Syslog transport protocol + type: radio + value: tcp + values: + - data: udp + description: '' + label: UDP + - data: tcp + description: '' + label: TCP + weight: 30 + diff --git a/deploy/config/labs/devel-pipeline/huawei-ch/fuel/config/dha.yaml b/deploy/config/labs/devel-pipeline/huawei-ch/fuel/config/dha.yaml new file mode 100644 index 000000000..d8f904362 --- /dev/null +++ b/deploy/config/labs/devel-pipeline/huawei-ch/fuel/config/dha.yaml @@ -0,0 +1,47 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +dha-pod-config-metadata: + title: Deployment Hardware Adapter (DHA) for fuel development pipeline - default version + version: 0.0.4 + created: Jun 14 2016 + comment: Huawei-Ch Fuel9 version + +# Adapter to use for this definition +adapter: libvirt + +# Node list. +# Mandatory property is id, all other properties are adapter specific. + +nodes: +- id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml +- id: 2 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 3 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 4 + libvirtName: compute3 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 5 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +virtNetConfDir: templates/virtual_environment/networks + +disks: + fuel: 100G + controller: 100G + compute: 100G diff --git a/deploy/config/labs/devel-pipeline/intel-sc/fuel/config/dea-pod-override.yaml b/deploy/config/labs/devel-pipeline/intel-sc/fuel/config/dea-pod-override.yaml new file mode 100644 index 000000000..ed7c63fac --- /dev/null +++ b/deploy/config/labs/devel-pipeline/intel-sc/fuel/config/dea-pod-override.yaml @@ -0,0 +1,251 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +dea-pod-override-config-metadata: + title: 'Deployment Environment Adapter POD override for Development Pipeline - Intel Santa Clara, CA, USA version' + version: '0.1' + created: 'Wed Sept 7 2016' + comment: 'For Fuel 9' +environment: + name: opnfv_virt +interfaces_1: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + ens6: + - public +interfaces_dpdk: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + - interface_properties: + dpdk: + enabled: true + ens6: + - public +interfaces_vlan: + ens3: + - fuelweb_admin + - storage + ens4: + - management + ens5: + - private + ens6: + - public +fuel: + ADMIN_NETWORK: + dhcp_pool_end: 10.20.0.254 + dhcp_pool_start: 10.20.0.3 + ipaddress: 10.20.0.2 + netmask: 255.255.255.0 + ssh_network: 10.20.0.0/24 + DNS_DOMAIN: domain.tld + DNS_SEARCH: domain.tld + DNS_UPSTREAM: 10.248.2.1 + HOSTNAME: fuel + NTP1: 10.20.0.1 + NTP2: null + NTP3: null +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + configuration_template: null + dns_nameservers: + - 10.248.2.1 + floating_name: admin_floating_net + floating_ranges: + - - 172.16.0.130 + - 172.16.0.254 + gre_id_range: + - 2 + - 65535 + internal_cidr: 192.168.111.0/24 + internal_gateway: 192.168.111.1 + internal_name: admin_internal_net + net_l23_provider: ovs + segmentation_type: tun + vlan_range: + - 1000 + - 1030 + networks: + - cidr: 192.168.1.0/24 + gateway: null + ip_ranges: + - - 192.168.1.1 + - 192.168.1.254 + meta: + cidr: 192.168.1.0/24 + configurable: true + map_priority: 2 + name: storage + notation: cidr + render_addr_mask: storage + render_type: cidr + use_gateway: false + vlan_start: 102 + name: storage + vlan_start: 102 + - cidr: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.253 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: ip_ranges + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: null + name: management + vlan_start: null + - cidr: 192.168.2.0/24 + gateway: null + ip_ranges: + - - 192.168.2.1 + - 192.168.2.254 + meta: + cidr: 192.168.2.0/24 + configurable: true + map_priority: 2 + name: private + notation: cidr + render_addr_mask: null + render_type: cidr + seg_type: tun + use_gateway: false + vlan_start: 103 + name: private + vlan_start: 103 + - cidr: 172.16.0.0/24 + gateway: 172.16.0.1 + ip_ranges: + - - 172.16.0.2 + - 172.16.0.126 + meta: + cidr: 172.16.0.0/24 + configurable: true + floating_range_var: floating_ranges + ip_range: + - 172.16.0.2 + - 172.16.0.126 + map_priority: 1 + name: public + notation: ip_ranges + render_addr_mask: public + render_type: null + use_gateway: true + vips: + - haproxy + - vrouter + vlan_start: null + name: public + vlan_start: null + - cidr: 10.20.0.0/24 + gateway: 10.20.0.2 + ip_ranges: + - - 10.20.0.3 + - 10.20.0.254 + meta: + configurable: false + map_priority: 0 + notation: ip_ranges + render_addr_mask: null + render_type: null + unmovable: true + use_gateway: true + name: fuelweb_admin + vlan_start: null +settings: + editable: + external_dns: + dns_list: + description: List of upstream DNS servers + label: DNS list + max: 3 + regex: + error: Invalid IP address + source: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ + type: text_list + value: + - 147.214.6.234 + weight: 10 + metadata: + group: network + label: Host OS DNS Servers + weight: 30 + external_ntp: + metadata: + group: network + label: Host OS NTP Servers + weight: 40 + ntp_list: + description: List of upstream NTP servers + label: NTP server list + regex: + error: Invalid NTP server + source: ^[a-zA-Z\d]+[-\.\da-zA-Z]*$ + type: text_list + value: + - 10.20.0.1 + weight: 10 + syslog: + metadata: + enabled: false + group: logging + label: Syslog + toggleable: true + weight: 50 + syslog_port: + description: Remote syslog port + label: Port + regex: + error: Invalid syslog port + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '514' + weight: 20 + syslog_server: + description: Remote syslog hostname + label: Hostname + regex: + error: Invalid hostname + source: ^[a-zA-Z\d]+[-\.\da-zA-Z]*$ + type: text + value: '' + weight: 10 + syslog_transport: + label: Syslog transport protocol + type: radio + value: tcp + values: + - data: udp + description: '' + label: UDP + - data: tcp + description: '' + label: TCP + weight: 30 + diff --git a/deploy/config/labs/devel-pipeline/intel-sc/fuel/config/dha.yaml b/deploy/config/labs/devel-pipeline/intel-sc/fuel/config/dha.yaml new file mode 100644 index 000000000..837293950 --- /dev/null +++ b/deploy/config/labs/devel-pipeline/intel-sc/fuel/config/dha.yaml @@ -0,0 +1,110 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +dha-pod-config-metadata: + title: Deployment Hardware Adapter (DHA) for fuel development pipeline - Intel Santa Clara, CA. USA version + version: 0.0.1 + created: Sept 7 2016 + comment: Intel Santa Clara, CA, USA Fuel 9 version + +# Adapter to use for this definition +adapter: libvirt + +# Node list. +# Mandatory property is id, all other properties are adapter specific. + +nodes: +- id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml +- id: 2 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 3 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 4 + libvirtName: compute3 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 5 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +virtNetConfDir: templates/virtual_environment/networks + +disks: + fuel: 100G + controller: 100G + compute: 100G + +# Here the infrastructure VMs can be defined. +# The entries are not mandatory! If it is left empty +# the default defined in deploy/templates will +# be used. +define_vms: + fuel: + vcpu: + value: 2 + memory: + attribute_equlas: + unit: KiB + value: 8388608 + currentMemory: + attribute_equlas: + unit: KiB + value: 8388608 + devices: + interface: + # With attribute_equlas someone can define which + # interface type is meant + attribute_equlas: + type: network + # This will overwrite the type of the model of + # the interface + model: + attribute: + type: virtio + controller: + vcpu: + value: 4 + memory: + attribute_equlas: + unit: KiB + value: 10485760 + currentMemory: + attribute_equlas: + unit: KiB + value: 10485760 + devices: + interface: + attribute_equlas: + type: network + model: + attribute: + type: e1000 + compute: + memory: + attribute_equlas: + unit: KiB + value: 6291456 + currentMemory: + attribute_equlas: + unit: KiB + value: 6291456 + devices: + interface: + attribute_equlas: + type: network + model: + attribute: + type: e1000 + diff --git a/deploy/config/plugins/fuel-bgpvpn_0.0.1.yaml b/deploy/config/plugins/fuel-bgpvpn_0.0.1.yaml new file mode 100644 index 000000000..94f17c126 --- /dev/null +++ b/deploy/config/plugins/fuel-bgpvpn_0.0.1.yaml @@ -0,0 +1,22 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: BGPVPN fuel Plugin configuration template + version: 0.1 + created: Wed Jan 13 2016 + comment: None + +bgpvpn: + metadata: + enabled: true + restrictions: + - "cluster:net_provider != 'neutron'": "Only neutron is supported by BGPVPN-plugin" + label: "BGPVPN plugin" + weight: 90 diff --git a/deploy/config/plugins/fuel-bgpvpn_0.0.2.yaml b/deploy/config/plugins/fuel-bgpvpn_0.0.2.yaml new file mode 100644 index 000000000..f7ab89b37 --- /dev/null +++ b/deploy/config/plugins/fuel-bgpvpn_0.0.2.yaml @@ -0,0 +1,31 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +plugin-config-metadata: + title: BGPVPN fuel Plugin configuration template + version: 0.2 + created: Fri Feb 05 2016 + comment: None + +bgpvpn: + metadata: + class: plugin + default: false + enabled: false + label: BGPVPN plugin + toggleable: true + versions: + - metadata: + always_editable: false + enabled: true + label: BGPVPN plugin + plugin_version: 0.8.0 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by BGPVPN-plugin + weight: 90 + weight: 70 diff --git a/deploy/config/plugins/fuel-bgpvpn_0.0.3.yaml b/deploy/config/plugins/fuel-bgpvpn_0.0.3.yaml new file mode 100644 index 000000000..aeea9e450 --- /dev/null +++ b/deploy/config/plugins/fuel-bgpvpn_0.0.3.yaml @@ -0,0 +1,30 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +plugin-config-metadata: + title: BGPVPN fuel Plugin configuration template + version: 0.3 + created: 08-Mar-16 + comment: None + +bgpvpn: + metadata: + class: plugin + default: false + enabled: true + label: BGPVPN plugin + toggleable: true + versions: + - metadata: + always_editable: false + label: BGPVPN plugin + plugin_version: 0.8.0 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by BGPVPN-plugin + weight: 90 + weight: 70 diff --git a/deploy/config/plugins/fuel-bgpvpn_0.9.0.yaml b/deploy/config/plugins/fuel-bgpvpn_0.9.0.yaml new file mode 100644 index 000000000..1aa1259ca --- /dev/null +++ b/deploy/config/plugins/fuel-bgpvpn_0.9.0.yaml @@ -0,0 +1,30 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +plugin-config-metadata: + title: BGPVPN fuel Plugin configuration template + version: 0.9.0 + created: 29.06.2016 + comment: None + +bgpvpn: + metadata: + class: plugin + default: false + enabled: true + label: BGPVPN plugin + toggleable: true + versions: + - metadata: + always_editable: false + label: BGPVPN plugin + plugin_version: 0.9.0 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by BGPVPN-plugin + weight: 90 + weight: 70 diff --git a/deploy/config/plugins/fuel-nfvkvm_0.0.1.yaml b/deploy/config/plugins/fuel-nfvkvm_0.0.1.yaml new file mode 100644 index 000000000..170424edb --- /dev/null +++ b/deploy/config/plugins/fuel-nfvkvm_0.0.1.yaml @@ -0,0 +1,27 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: NFV QEMU-KVM fuel Plugin configuration template + version: 0.1 + created: Wed Jan 6 2016 + comment: None + +fuel-plugin-qemu: + metadata: + enabled: true + label: fuel-plugin-qemu + # plugin_id: Assigned during installation + toggleable: true + weight: 70 + use_kvm: + label: 'EXPERIMENTAL: KVM enhancements for NFV' + type: checkbox + value: true + weight: 20 diff --git a/deploy/config/plugins/fuel-nfvkvm_0.0.2.yaml b/deploy/config/plugins/fuel-nfvkvm_0.0.2.yaml new file mode 100644 index 000000000..842e1e10d --- /dev/null +++ b/deploy/config/plugins/fuel-nfvkvm_0.0.2.yaml @@ -0,0 +1,34 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: NFV QEMU-KVM fuel Plugin configuration template + version: 0.2 + created: Tue Feb 9 2016 + comment: None + +fuel-plugin-qemu: + metadata: + #chosen_id: Assigned during installation + class: plugin + default: false + enabled: true + label: fuel-plugin-qemu + toggleable: true + versions: + - metadata: + always_editable: false + #plugin_id: 1 Assigned during installation + plugin_version: 0.5.2 + use_kvm: + label: 'EXPERIMENTAL: KVM enhancements for NFV' + type: checkbox + value: true + weight: 20 + weight: 70 diff --git a/deploy/config/plugins/fuel-nfvkvm_0.9.0.yaml b/deploy/config/plugins/fuel-nfvkvm_0.9.0.yaml new file mode 100644 index 000000000..85f3221f7 --- /dev/null +++ b/deploy/config/plugins/fuel-nfvkvm_0.9.0.yaml @@ -0,0 +1,34 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: NFV KVM fuel Plugin configuration template + version: 0.9.0 + created: 27.07.2016 + comment: None + +fuel-plugin-kvm: + metadata: + #chosen_id: Assigned during installation + class: plugin + default: false + enabled: true + label: fuel-plugin-kvm + toggleable: true + versions: + - metadata: + always_editable: false + #plugin_id: 1 Assigned during installation + plugin_version: 0.9.0 + use_kvm: + label: 'EXPERIMENTAL: KVM enhancements for NFV' + type: checkbox + value: true + weight: 20 + weight: 70 diff --git a/deploy/config/plugins/fuel-nfvovs_0.0.1.yaml b/deploy/config/plugins/fuel-nfvovs_0.0.1.yaml new file mode 100644 index 000000000..fdaba2a21 --- /dev/null +++ b/deploy/config/plugins/fuel-nfvovs_0.0.1.yaml @@ -0,0 +1,28 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: NFV OVS fuel Plugin configuration template + version: 0.1 + created: Wed Jan 6 2016 + comment: None + +fuel-plugin-ovsnfv: + fuel-plugin-ovsnfv_text: + description: Description for text field + label: Text field + type: text + value: Set default value + weight: 25 + metadata: + enabled: true + label: Userspace OVS support + # plugin_id: Assigned during installation + toggleable: true + weight: 70 diff --git a/deploy/config/plugins/fuel-nfvovs_0.0.2.yaml b/deploy/config/plugins/fuel-nfvovs_0.0.2.yaml new file mode 100644 index 000000000..902938211 --- /dev/null +++ b/deploy/config/plugins/fuel-nfvovs_0.0.2.yaml @@ -0,0 +1,35 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: NFV OVS fuel Plugin configuration template + version: 0.2 + created: Mon Feb 15 2016 + comment: Rebased for new plugin arch + +fuel-plugin-ovsnfv: + metadata: + #chosen_id: Assigned during installation + class: plugin + default: false + enabled: true + label: Userspace OVS support + toggleable: true + versions: + - fuel-plugin-ovsnfv_text: + description: Specify compute node interface to which OVS-DPDK binds + label: NIC for DPDK + type: text + value: ens1f1 + weight: 25 + metadata: + always_editable: false + #plugin_id: Assigned during installation + plugin_version: 0.0.1 + weight: 70 diff --git a/deploy/config/plugins/fuel-nshovs_0.0.1.yaml b/deploy/config/plugins/fuel-nshovs_0.0.1.yaml new file mode 100644 index 000000000..ec3ac38a9 --- /dev/null +++ b/deploy/config/plugins/fuel-nshovs_0.0.1.yaml @@ -0,0 +1,44 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: NSHOVS fuel Plugin configuration template + version: 0.1 + created: Wed Feb 17 2016 + comment: None + +fuel-plugin-ovs: + metadata: + #chosen_id: Choosen at install time + class: plugin + default: false + enabled: true + label: Openvswitch with NSH support + toggleable: true + versions: + - dpdk-bind-nic: + label: Network device + type: text + value: eth2 + weight: 40 + metadata: + always_editable: false + #plugin_id: Choosen at install time + plugin_version: 0.5.2 + use_dpdk: + label: Use dpdk + type: checkbox + value: false + weight: 20 + use_dppd: + label: Use dppd + type: checkbox + value: false + weight: 20 + weight: 70 diff --git a/deploy/config/plugins/fuel-nshovs_0.9.0.yaml b/deploy/config/plugins/fuel-nshovs_0.9.0.yaml new file mode 100644 index 000000000..b5caae039 --- /dev/null +++ b/deploy/config/plugins/fuel-nshovs_0.9.0.yaml @@ -0,0 +1,37 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: NSHOVS fuel Plugin configuration template + version: 0.2 + created: Jun 30 2016 + comment: None + +fuel-plugin-ovs: + metadata: + #chosen_id: Choosen at install time + class: plugin + default: false + enabled: true + label: Openvswitch with NSH support + toggleable: true + versions: + - install_dpdk: + type: "checkbox" + weight: 20 + value: false + label: "Install DPDK" + install_nsh: + type: "checkbox" + weight: 20 + value: false + label: "Install NSH" + metadata: + plugin_version: 0.9.0 + weight: 70 diff --git a/deploy/config/plugins/fuel-odl_0.0.1.yaml b/deploy/config/plugins/fuel-odl_0.0.1.yaml new file mode 100644 index 000000000..53c510557 --- /dev/null +++ b/deploy/config/plugins/fuel-odl_0.0.1.yaml @@ -0,0 +1,91 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: OpenDaylight fuel Plugin configuration template + version: 0.1 + created: Mon Dec 28 2015 + comment: None + +opendaylight: + metadata: + # chosen_id: Assigned during installation + class: plugin + default: false + enabled: true + label: OpenDaylight plugin + toggleable: true + versions: + - enable_gbp: + label: GBP features + type: checkbox + value: false + weight: 14 + enable_l3_odl: + label: Use ODL to manage L3 traffic + restrictions: + - networking_parameters:segmentation_type == 'vlan': Use tunneling segmentation + type. + - settings:public_network_assignment.assign_to_all_nodes.value == false: Assign + public network to all nodes + type: checkbox + value: true + weight: 12 + enable_sfc: + label: SFC features + type: checkbox + value: false + weight: 13 + metadata: + always_editable: false + odl_features: + default: + - config + - standard + - region + - package + - kar + - ssh + - management + gbp: + - odl-groupbasedpolicy-base + - odl-groupbasedpolicy-ofoverlay + ovs: + - odl-ovsdb-openstack + - odl-restconf-all + - odl-aaa-authn + - odl-dlux-all + sfc: + - odl-sfc-core + - odl-sfc-sb-rest + - odl-sfc-ui + - odl-sfc-netconf + - odl-sfc-ovs + - odl-sfcofl2 + - odl-sfc-test-consumer + vpn: + - odl-vpnservice-api + - odl-vpnservice-impl + - odl-vpnservice-impl-rest + - odl-vpnservice-impl-ui + - odl-vpnservice-core + # plugin_id: Assigned during installation + plugin_version: 0.8.0 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + rest_api_port: + description: Port on which ODL REST API will be available. + label: Port number + regex: + error: Invalid port number + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '8282' + weight: 40 + weight: 70 diff --git a/deploy/config/plugins/fuel-odl_0.0.2.yaml b/deploy/config/plugins/fuel-odl_0.0.2.yaml new file mode 100644 index 000000000..bd2ef5bb2 --- /dev/null +++ b/deploy/config/plugins/fuel-odl_0.0.2.yaml @@ -0,0 +1,91 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: OpenDaylight fuel Plugin configuration template + version: 0.2 + created: Tue Jan 26 2016 + comment: Rebased to Fuel8 and BE ODL plugin +opendaylight: + metadata: + # chosen_id: Assigned during installation + class: plugin + default: false + enabled: true + label: OpenDaylight plugin + toggleable: true + versions: + - enable_gbp: + label: GBP features + type: checkbox + value: false + weight: 14 + enable_l3_odl: + label: Use ODL to manage L3 traffic + restrictions: + - networking_parameters:segmentation_type == 'vlan': Use tunneling segmentation + type. + - settings:public_network_assignment.assign_to_all_nodes.value == false: Assign + public network to all nodes + type: checkbox + value: false + weight: 12 + enable_sfc: + label: SFC features + type: checkbox + value: false + weight: 13 + metadata: + always_editable: false + odl_features: + default: + - config + - standard + - region + - package + - kar + - ssh + - management + gbp: + - odl-groupbasedpolicy-base + - odl-groupbasedpolicy-ofoverlay + ovs: + - odl-ovsdb-openstack + - odl-restconf-all + - odl-aaa-authn + - odl-dlux-all + sfc: + - odl-sfc-core + - odl-sfc-sb-rest + - odl-sfc-ui + - odl-sfc-netconf + - odl-sfc-ovs + - odl-sfcofl2 + - odl-sfc-test-consumer + vpn: + - odl-vpnservice-api + - odl-vpnservice-impl + - odl-vpnservice-impl-rest + - odl-vpnservice-impl-ui + - odl-vpnservice-core + - odl-vpnservice-openstack + # plugin_id: Assigned during installation + plugin_version: 0.8.0 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + rest_api_port: + description: Port on which ODL REST API will be available. + label: Port number + regex: + error: Invalid port number + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '8282' + weight: 40 + weight: 70 diff --git a/deploy/config/plugins/fuel-odl_0.0.3.yaml b/deploy/config/plugins/fuel-odl_0.0.3.yaml new file mode 100644 index 000000000..5c0078dbf --- /dev/null +++ b/deploy/config/plugins/fuel-odl_0.0.3.yaml @@ -0,0 +1,117 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: OpenDaylight fuel Plugin configuration template + version: 0.3 + created: 04.03.2016 + comment: Added bgpvpn feature +opendaylight: + metadata: + # chosen_id: Assigned during installation + class: plugin + default: false + enabled: true + label: OpenDaylight plugin + toggleable: true + versions: + - enable_gbp: + label: GBP features + type: checkbox + value: false + weight: 14 + enable_l3_odl: + label: Use ODL to manage L3 traffic + restrictions: + - networking_parameters:segmentation_type == 'vlan': Use tunneling segmentation + type. + - settings:public_network_assignment.assign_to_all_nodes.value == false: Assign + public network to all nodes + type: checkbox + value: false + weight: 12 + enable_sfc: + label: SFC features + type: checkbox + value: false + weight: 13 + enable_bgpvpn: + weight: 13 + type: "checkbox" + value: false + label: "BGPVPN extensions" + description: + > + This enables the bgpvpn extension of neutron togethere with the + corresponding sdnvpn features in odl. This feature will disable + the standart ovsdb feature from ODL. + restrictions: + - condition: "settings:bgpvpn == null or settings:bgpvpn.metadata.enabled == false" + strict: false + message: "BGPVPN (fuel-plugin-bgpvpn) plugin must be installed and enabled." + - networking_parameters:segmentation_type == 'vlan': This feature works only with segmentation_type != vlan + - condition: "settings:fuel-plugin-ovs == null or settings:fuel-plugin-ovs.metadata.enabled == false" + strict: false + message: "Openvswitch with NSH support (fuel-plugin-ovs) must be installed and enabled." + bgpvpn_gateway: + weight: 13 + type: "text" + value: "0.0.0.0" + description: "Define the default gateway for BGPVPN" + label: "Default Gateway" + restrictions: + - settings:opendaylight.enable_bgpvpn.value == false: Only needed if BGPVPN is enabled. + regex: + source: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ + error: 'Invalid ip number' + metadata: + always_editable: false + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + odl_features: + default: + - config + - standard + - region + - package + - kar + - ssh + - management + odl-default: + - odl-restconf-all + - odl-aaa-authn + - odl-dlux-all + gbp: + - odl-groupbasedpolicy-neutronmapper + - odl-groupbasedpolicy-ofoverlay + ovs: + - odl-ovsdb-openstack + sfc: + - odl-sfc-model + - odl-sfc-provider + - odl-sfc-provider-rest + - odl-sfc-sb-rest + - odl-sfc-ui + - odl-sfc-netconf + - odl-sfc-ovs + - odl-sfcofl2 + vpn: + - odl-vpnservice-openstack + # plugin_id: Assigned during installation + plugin_version: 0.8.1 + rest_api_port: + value: '8282' + label: 'Port number' + description: 'Port on which ODL REST API will be available.' + weight: 40 + type: "text" + regex: + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + error: 'Invalid port number' + weight: 70 diff --git a/deploy/config/plugins/fuel-odl_0.9.0.yaml b/deploy/config/plugins/fuel-odl_0.9.0.yaml new file mode 100644 index 000000000..6caf4834f --- /dev/null +++ b/deploy/config/plugins/fuel-odl_0.9.0.yaml @@ -0,0 +1,143 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: OpenDaylight fuel Plugin configuration template + version: 0.4 + created: 30.06.2016 + comment: Add new field for boron version +opendaylight: + metadata: + #chosen_id: Assigned during installation + class: plugin + default: false + enabled: true + label: OpenDaylight plugin + toggleable: true + versions: + - bgpvpn_gateway: + description: Define the default gateway for BGPVPN + label: Default Gateway + regex: + error: Invalid ip number + source: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ + restrictions: + - settings:opendaylight.enable_bgpvpn.value == false: Only needed if BGPVPN + is enabled. + type: text + value: 0.0.0.0 + weight: 50 + enable_bgpvpn: + description: 'This enables the bgpvpn extension of neutron togethere with + the corresponding sdnvpn features in odl. This feature will disable the + standart ovsdb feature from ODL. + + ' + label: BGPVPN extensions + restrictions: + - condition: settings:bgpvpn == null or settings:bgpvpn.metadata.enabled + == false + message: BGPVPN (fuel-plugin-bgpvpn) plugin must be installed and enabled. + strict: false + - networking_parameters:segmentation_type == 'vlan': This feature works + only with segmentation_type != vlan + type: checkbox + value: false + weight: 40 + enable_l3_odl: + label: Use ODL to manage L3 traffic + restrictions: + - networking_parameters:segmentation_type == 'vlan': Use tunneling segmentation + type. + - settings:public_network_assignment.assign_to_all_nodes.value == false: Assign + public network to all nodes + type: checkbox + value: false + weight: 10 + enable_sfc: + label: SFC features + type: checkbox + value: false + weight: 20 + sfc_class: + description: 'Classifier determines what traffic needs to be chained based + on policy based on yang model. The OpenDayLight actually supports the + OVSDB NetVirt and the GBP classifier in case of SFC. + + ' + label: Classifier used by SFC + restrictions: + - action: hide + condition: settings:opendaylight.enable_sfc.value == false + type: select + value: ncr + values: + - data: ncr + label: NetVirt + - data: gcr + label: GBP + weight: 21 + metadata: + default_credentials: + password: admin + user: admin + hot_pluggable: false + jetty_port: 8181 + odl_features: + default: + - config + - standard + - region + - package + - kar + - ssh + - management + gcr: + - odl-groupbasedpolicy-ovssfc + ncr: + - odl-ovsdb-sfc + - odl-ovsdb-sfc-rest + odl-default: + - odl-restconf-all + - odl-aaa-authn + - odl-dlux-all + ovs: + - odl-ovsdb-openstack + sfc: + - odl-sfc-model + - odl-sfc-provider + - odl-sfc-provider-rest + - odl-sfc-ovs + - odl-sfc-openflow-renderer + vpn: + - odl-vpnservice-openstack + odl_deb: opendaylight + experimental_odl_deb: opendaylight-boron + use_experimental_odl: + - enable_sfc + #plugin_id: Assigned during installation + plugin_version: 0.9.0 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + odl_v2: + description: V2 version is considered as experimental + label: Use V2 ML2 driver + type: checkbox + value: true + weight: 60 + rest_api_port: + description: Port on which ODL REST API will be available. + label: Port number + regex: + error: Invalid port number + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '8282' + weight: 70 + weight: 70 diff --git a/deploy/config/plugins/fuel-onos_0.0.1.yaml b/deploy/config/plugins/fuel-onos_0.0.1.yaml new file mode 100644 index 000000000..54ecdc0dc --- /dev/null +++ b/deploy/config/plugins/fuel-onos_0.0.1.yaml @@ -0,0 +1,33 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: ONOS fuel Plugin configuration template + version: 0.1 + created: Wed Jan 7 2016 + comment: None + +onos: + metadata: + enabled: true + label: onos plugin + # plugin_id: Assigned during installation + restrictions: + - cluster:net_provider != 'neutron': Neutron only + toggleable: true + weight: 70 + public_eth: + description: Please note that onos needs an independent eth for public + network when interfaces of nodes are configured, or L3 traffic to + internet will fail! + Defualt is eth3. + label: Public Ethernet Port + type: text + value: eth3 + weight: 20 diff --git a/deploy/config/plugins/fuel-onos_0.0.2.yaml b/deploy/config/plugins/fuel-onos_0.0.2.yaml new file mode 100644 index 000000000..1d0b54d04 --- /dev/null +++ b/deploy/config/plugins/fuel-onos_0.0.2.yaml @@ -0,0 +1,33 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: ONOS fuel Plugin configuration template + version: 0.2 + created: Fre Jan 29 2016 + comment: None + +onos: + metadata: + # chosen_id: Assigned during installation + class: plugin + default: false + enabled: true + label: onos plugin + toggleable: true + versions: + - metadata: + always_editable: false + # plugin_id: Assigned during installation + plugin_version: 0.8.0 + restrictions: + - cluster:net_provider != 'neutron': Neutron only + - settings:public_network_assignment.assign_to_all_nodes.value == false: Assign + public network to all nodes + weight: 70 diff --git a/deploy/config/plugins/fuel-onos_0.0.3.yaml b/deploy/config/plugins/fuel-onos_0.0.3.yaml new file mode 100644 index 000000000..16f753144 --- /dev/null +++ b/deploy/config/plugins/fuel-onos_0.0.3.yaml @@ -0,0 +1,38 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +plugin-config-metadata: + title: ONOS fuel Plugin configuration template + version: 0.3 + created: Wed Jun 8 2016 + comment: add sfc feature + +onos: + metadata: + # chosen_id: Assigned during installation + class: plugin + default: false + enabled: true + label: onos plugin + toggleable: true + versions: + - enable_sfc: + label: SFC features + type: checkbox + value: true + weight: 13 + metadata: + hot_pluggable: false + # plugin_id: Assigned during installation + plugin_version: 0.9.0 + restrictions: + - cluster:net_provider != 'neutron': Neutron only + - settings:public_network_assignment.assign_to_all_nodes.value == false: Assign + public network to all nodes + weight: 70 diff --git a/deploy/dea.py b/deploy/dea.py new file mode 100644 index 000000000..1ac048e06 --- /dev/null +++ b/deploy/dea.py @@ -0,0 +1,105 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import yaml +import io +import netaddr + + +class DeploymentEnvironmentAdapter(object): + + def __init__(self, yaml_path): + self.dea_struct = None + self.parse_yaml(yaml_path) + self.network_names = [] + self.collect_network_names() + + def modify_ip(self, ip_addr, index, val): + ip_str = str(netaddr.IPAddress(ip_addr)) + decimal_list = map(int, ip_str.split('.')) + decimal_list[index] = val + return '.'.join(map(str, decimal_list)) + + def parse_yaml(self, yaml_path): + with io.open(yaml_path) as yaml_file: + self.dea_struct = yaml.load(yaml_file) + + def get_env_name(self): + return self.get_property('environment')['name'] + + def get_env_net_segment_type(self): + return self.get_property('environment')['net_segment_type'] + + def get_fuel_config(self): + return self.dea_struct['fuel'] + + def get_fuel_ip(self): + fuel_conf = self.get_fuel_config() + return fuel_conf['ADMIN_NETWORK']['ipaddress'] + + def get_fuel_netmask(self): + fuel_conf = self.get_fuel_config() + return fuel_conf['ADMIN_NETWORK']['netmask'] + + def get_fuel_gateway(self): + ip = self.get_fuel_ip() + return self.modify_ip(ip, 3, 1) + + def get_fuel_hostname(self): + fuel_conf = self.get_fuel_config() + return fuel_conf['HOSTNAME'] + + def get_fuel_dns(self): + fuel_conf = self.get_fuel_config() + return fuel_conf['DNS_UPSTREAM'] + + def get_node_property(self, node_id, property_name): + for node in self.dea_struct['nodes']: + if node['id'] == node_id and property_name in node: + return node[property_name] + + def get_node_roles(self, node_id): + return self.get_node_property(node_id, 'role') + + def get_node_main_role(self, node_id, fuel_node_id): + if node_id == fuel_node_id: + return 'fuel' + roles = self.get_node_roles(node_id) + return 'controller' if 'controller' in roles else 'compute' + + def get_node_ids(self): + node_ids = [] + for node in self.dea_struct['nodes']: + node_ids.append(node['id']) + return node_ids + + def get_property(self, property_name): + return self.dea_struct[property_name] + + def collect_network_names(self): + self.network_names = [] + for network in self.dea_struct['network']['networks']: + self.network_names.append(network['name']) + + def get_network_names(self): + return self.network_names + + def get_dns_list(self): + settings = self.get_property('settings') + dns_list = settings['editable']['external_dns']['dns_list']['value'] + return [d.strip() for d in dns_list.split(',')] + + def get_ntp_list(self): + settings = self.get_property('settings') + ntp_list = settings['editable']['external_ntp']['ntp_list']['value'] + return [n.strip() for n in ntp_list.split(',')] + + def get_blade_node_map(self): + return self.dea_struct['blade_node_map'] diff --git a/deploy/deploy-config.py b/deploy/deploy-config.py new file mode 100644 index 000000000..2a09aa351 --- /dev/null +++ b/deploy/deploy-config.py @@ -0,0 +1,467 @@ +#!/usr/bin/python +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + +############################################################################### +# Description +# This script constructs the final deployment dea.yaml and dha.yaml files +# The dea.yaml get's constructed from (in reverse priority): +# 1) dea-base +# 2) dea-pod-override +# 3) deployment-scenario dea-override-config section +# +# The dha.yaml get's constructed from (in reverse priority): +# 1) pod dha +# 2) deployment-scenario dha-override-config section +############################################################################### + + +import os +import yaml +import sys +import urllib2 +import calendar +import time +import collections +import hashlib + +from functools import reduce +from operator import or_ +from common import ( + log, + exec_cmd, + err, + warn, + check_file_exists, + create_dir_if_not_exists, + delete, + check_if_root, + ArgParser, +) + + +def parse_arguments(): + parser = ArgParser(prog='python %s' % __file__) + parser.add_argument('-dha', dest='dha_uri', action='store', + default=False, + help='dha configuration file FQDN URI', + required=True) + parser.add_argument('-deab', dest='dea_base_uri', action='store', + default=False, + help='dea base configuration FQDN URI', + required=True) + parser.add_argument('-deao', dest='dea_pod_override_uri', + action='store', + default=False, + help='dea POD override configuration FQDN URI', + required=True) + parser.add_argument('-scenario-base-uri', + dest='scenario_base_uri', + action='store', + default=False, + help='Deployment scenario base directory URI', + required=True) + parser.add_argument('-scenario', dest='scenario', action='store', + default=False, + help=('Deployment scenario short-name (priority), ' + 'or base file name (in the absense of a ' + 'shortname defenition)'), + required=True) + + parser.add_argument('-plugins', dest='plugins_uri', action='store', + default=False, + help='Plugin configurations directory URI', + required=True) + parser.add_argument('-output', dest='output_path', action='store', + default=False, + help='Local path for resulting output configuration files', + required=True) + args = parser.parse_args() + kwargs = {'dha_uri': args.dha_uri, + 'dea_base_uri': args.dea_base_uri, + 'dea_pod_override_uri': args.dea_pod_override_uri, + 'scenario_base_uri': args.scenario_base_uri, + 'scenario': args.scenario, + 'plugins_uri': args.plugins_uri, + 'output_path': args.output_path} + return kwargs + + +def warning(msg): + red = '\033[0;31m' + NC = '\033[0m' + print('%(red)s WARNING: %(msg)s %(NC)s' % {'red': red, + 'msg': msg, + 'NC': NC}) + + +def setup_yaml(): + represent_dict_order = lambda self, data: self.represent_mapping('tag:yaml.org,2002:map', data.items()) + yaml.add_representer(collections.OrderedDict, represent_dict_order) + + +def sha_uri(uri): + response = urllib2.urlopen(uri) + data = response.read() + sha1 = hashlib.sha1() + sha1.update(data) + return sha1.hexdigest() + + +def merge_fuel_plugin_version_list(list1, list2): + final_list = [] + # When the plugin version in not there in list1 it will + # not be copied + for e_l1 in list1: + plugin_version = e_l1.get('metadata', {}).get('plugin_version') + plugin_version_found = False + for e_l2 in list2: + if plugin_version == e_l2.get('metadata', {}).get('plugin_version'): + final_list.append(dict(merge_dicts(e_l1, e_l2))) + plugin_version_found = True + if not plugin_version_found: + final_list.append(e_l1) + return final_list + + +def merge_networks(list_1, list_2): + new_nets = {x.get('name'): x for x in list_2} + + return [new_nets.get(net.get('name'), net) for net in list_1] + + +def merge_dicts(dict1, dict2): + for k in set(dict1).union(dict2): + if k in dict1 and k in dict2: + if isinstance(dict1[k], dict) and isinstance(dict2[k], dict): + yield (k, dict(merge_dicts(dict1[k], dict2[k]))) + continue + if isinstance(dict1[k], list) and isinstance(dict2[k], list): + if k == 'versions': + yield (k, + merge_fuel_plugin_version_list(dict1[k], dict2[k])) + continue + if k == 'networks': + yield (k, + merge_networks(dict1[k], dict2[k])) + continue + + # If one of the values is not a dict nor a list, + # you can't continue merging it. + # Value from second dict overrides one in first if exists. + if k in dict2: + yield (k, dict2[k]) + else: + yield (k, dict1[k]) + + +def get_node_ifaces_and_trans(nodes, nid): + for node in nodes: + if node['id'] == nid: + if 'transformations' in node and 'interfaces' in node: + return (node['interfaces'], node['transformations']) + else: + return None + + return None + + +class DeployConfig(object): + def __init__(self): + self.kwargs = parse_arguments() + self.dea_conf = dict() + self.dea_metadata = dict() + self.dea_pod_ovr_metadata = dict() + self.dea_pod_ovr_nodes = None + self.scenario_metadata = dict() + self.modules = [] + self.module_uris = [] + self.module_titles = [] + self.module_versions = [] + self.module_createds = [] + self.module_shas = [] + self.module_comments = [] + self.dha_pod_conf = dict() + self.dha_metadata = dict() + + def process_dea_base(self): + # Generate final dea.yaml by merging following config files/fragments in reverse priority order: + # "dea-base", "dea-pod-override", "deplyment-scenario/module-config-override" + # and "deployment-scenario/dea-override" + print('Generating final dea.yaml configuration....') + + # Fetch dea-base, extract and purge meta-data + print('Parsing dea-base from: ' + self.kwargs["dea_base_uri"] + "....") + response = urllib2.urlopen(self.kwargs["dea_base_uri"]) + dea_conf = yaml.load(response.read()) + + dea_metadata = dict() + dea_metadata['title'] = dea_conf['dea-base-config-metadata']['title'] + dea_metadata['version'] = dea_conf['dea-base-config-metadata']['version'] + dea_metadata['created'] = dea_conf['dea-base-config-metadata']['created'] + dea_metadata['sha'] = sha_uri(self.kwargs["dea_base_uri"]) + dea_metadata['comment'] = dea_conf['dea-base-config-metadata']['comment'] + self.dea_metadata = dea_metadata + dea_conf.pop('dea-base-config-metadata') + self.dea_conf = dea_conf + + def process_dea_pod_override(self): + # Fetch dea-pod-override, extract and purge meta-data, merge with previous dea data structure + print('Parsing the dea-pod-override from: ' + self.kwargs["dea_pod_override_uri"] + "....") + response = urllib2.urlopen(self.kwargs["dea_pod_override_uri"]) + dea_pod_override_conf = yaml.load(response.read()) + + if dea_pod_override_conf: + metadata = dict() + metadata['title'] = dea_pod_override_conf['dea-pod-override-config-metadata']['title'] + metadata['version'] = dea_pod_override_conf['dea-pod-override-config-metadata']['version'] + metadata['created'] = dea_pod_override_conf['dea-pod-override-config-metadata']['created'] + metadata['sha'] = sha_uri(self.kwargs["dea_pod_override_uri"]) + metadata['comment'] = dea_pod_override_conf['dea-pod-override-config-metadata']['comment'] + self.dea_pod_ovr_metadata = metadata + + print('Merging dea-base and dea-pod-override configuration ....') + dea_pod_override_conf.pop('dea-pod-override-config-metadata') + + # Copy the list of original nodes, which holds info on their transformations + if 'nodes' in dea_pod_override_conf: + self.dea_pod_ovr_nodes = list(dea_pod_override_conf['nodes']) + if dea_pod_override_conf: + self.dea_conf = dict(merge_dicts(self.dea_conf, dea_pod_override_conf)) + + def get_scenario_uri(self): + response = urllib2.urlopen(self.kwargs["scenario_base_uri"] + "/scenario.yaml") + scenario_short_translation_conf = yaml.load(response.read()) + if self.kwargs["scenario"] in scenario_short_translation_conf: + scenario_uri = (self.kwargs["scenario_base_uri"] + + "/" + + scenario_short_translation_conf[self.kwargs["scenario"]]['configfile']) + else: + scenario_uri = self.kwargs["scenario_base_uri"] + "/" + self.kwargs["scenario"] + + return scenario_uri + + def get_scenario_config(self): + self.scenario_metadata['uri'] = self.get_scenario_uri() + response = urllib2.urlopen(self.scenario_metadata['uri']) + return yaml.load(response.read()) + + def process_modules(self): + scenario_conf = self.get_scenario_config() + if scenario_conf["stack-extensions"]: + for module in scenario_conf["stack-extensions"]: + print('Loading configuration for module: ' + + module["module"] + + ' and merging it to final dea.yaml configuration....') + response = urllib2.urlopen(self.kwargs["plugins_uri"] + + '/' + + module["module-config-name"] + + '_' + + module["module-config-version"] + + '.yaml') + module_conf = yaml.load(response.read()) + self.modules.append(module["module"]) + self.module_uris.append(self.kwargs["plugins_uri"] + + '/' + + module["module-config-name"] + + '_' + + module["module-config-version"] + + '.yaml') + self.module_titles.append(str(module_conf['plugin-config-metadata']['title'])) + self.module_versions.append(str(module_conf['plugin-config-metadata']['version'])) + self.module_createds.append(str(module_conf['plugin-config-metadata']['created'])) + self.module_shas.append(sha_uri(self.kwargs["plugins_uri"] + + '/' + + module["module-config-name"] + + '_' + + module["module-config-version"] + + '.yaml')) + self.module_comments.append(str(module_conf['plugin-config-metadata']['comment'])) + module_conf.pop('plugin-config-metadata') + self.dea_conf['settings']['editable'].update(module_conf) + + scenario_module_override_conf = module.get('module-config-override') + if scenario_module_override_conf: + dea_scenario_module_override_conf = {} + dea_scenario_module_override_conf['settings'] = {} + dea_scenario_module_override_conf['settings']['editable'] = {} + dea_scenario_module_override_conf['settings']['editable'][module["module"]] = scenario_module_override_conf + self.dea_conf = dict(merge_dicts(self.dea_conf, dea_scenario_module_override_conf)) + + def process_scenario_config(self): + # Fetch deployment-scenario, extract and purge meta-data, merge deployment-scenario/ + # dea-override-configith previous dea data structure + print('Parsing deployment-scenario from: ' + self.kwargs["scenario"] + "....") + + scenario_conf = self.get_scenario_config() + + metadata = dict() + if scenario_conf: + metadata['title'] = scenario_conf['deployment-scenario-metadata']['title'] + metadata['version'] = scenario_conf['deployment-scenario-metadata']['version'] + metadata['created'] = scenario_conf['deployment-scenario-metadata']['created'] + metadata['sha'] = sha_uri(self.scenario_metadata['uri']) + metadata['comment'] = scenario_conf['deployment-scenario-metadata']['comment'] + self.scenario_metadata = metadata + scenario_conf.pop('deployment-scenario-metadata') + else: + print("Deployment scenario file not found or is empty") + print("Cannot continue, exiting ....") + sys.exit(1) + + dea_scenario_override_conf = scenario_conf["dea-override-config"] + if dea_scenario_override_conf: + print('Merging dea-base-, dea-pod-override- and deployment-scenario ' + 'configuration into final dea.yaml configuration....') + self.dea_conf = dict(merge_dicts(self.dea_conf, dea_scenario_override_conf)) + + self.process_modules() + + # Fetch plugin-configuration configuration files, extract and purge meta-data, + # merge/append with previous dea data structure, override plugin-configuration with + # deploy-scenario/module-config-override + + if self.dea_pod_ovr_nodes: + for node in self.dea_conf['nodes']: + data = get_node_ifaces_and_trans(self.dea_pod_ovr_nodes, node['id']) + if data: + print("Honoring original interfaces and transformations for " + "node %d to %s, %s" % (node['id'], data[0], data[1])) + node['interfaces'] = data[0] + node['transformations'] = data[1] + + def dump_dea_config(self): + # Dump final dea.yaml including configuration management meta-data to argument provided + # directory + path = self.kwargs["output_path"] + if not os.path.exists(path): + os.makedirs(path) + print('Dumping final dea.yaml to ' + path + '/dea.yaml....') + with open(path + '/dea.yaml', "w") as f: + f.write("\n".join([("title: DEA.yaml file automatically generated from the " + 'configuration files stated in the "configuration-files" ' + "fragment below"), + "version: " + str(calendar.timegm(time.gmtime())), + "created: " + time.strftime("%d/%m/%Y %H:%M:%S"), + "comment: none\n"])) + + f.write("\n".join(["configuration-files:", + " dea-base:", + " uri: " + self.kwargs["dea_base_uri"], + " title: " + self.dea_metadata['title'], + " version: " + self.dea_metadata['version'], + " created: " + self.dea_metadata['created'], + " sha1: " + sha_uri(self.kwargs["dea_base_uri"]), + " comment: " + self.dea_metadata['comment'] + "\n"])) + + f.write("\n".join([" pod-override:", + " uri: " + self.kwargs["dea_pod_override_uri"], + " title: " + self.dea_pod_ovr_metadata['title'], + " version: " + self.dea_pod_ovr_metadata['version'], + " created: " + self.dea_pod_ovr_metadata['created'], + " sha1: " + self.dea_pod_ovr_metadata['sha'], + " comment: " + self.dea_pod_ovr_metadata['comment'] + "\n"])) + + f.write("\n".join([" deployment-scenario:", + " uri: " + self.scenario_metadata['uri'], + " title: " + self.scenario_metadata['title'], + " version: " + self.scenario_metadata['version'], + " created: " + self.scenario_metadata['created'], + " sha1: " + self.scenario_metadata['sha'], + " comment: " + self.scenario_metadata['comment'] + "\n"])) + + f.write(" plugin-modules:\n") + for k, _ in enumerate(self.modules): + f.write("\n".join([" - module: " + self.modules[k], + " uri: " + self.module_uris[k], + " title: " + self.module_titles[k], + " version: " + self.module_versions[k], + " created: " + self.module_createds[k], + " sha-1: " + self.module_shas[k], + " comment: " + self.module_comments[k] + "\n"])) + + yaml.dump(self.dea_conf, f, default_flow_style=False) + + def process_dha_pod_config(self): + # Load POD dha and override it with "deployment-scenario/dha-override-config" section + print('Generating final dha.yaml configuration....') + print('Parsing dha-pod yaml configuration....') + response = urllib2.urlopen(self.kwargs["dha_uri"]) + dha_pod_conf = yaml.load(response.read()) + + dha_metadata = dict() + dha_metadata['title'] = dha_pod_conf['dha-pod-config-metadata']['title'] + dha_metadata['version'] = dha_pod_conf['dha-pod-config-metadata']['version'] + dha_metadata['created'] = dha_pod_conf['dha-pod-config-metadata']['created'] + dha_metadata['sha'] = sha_uri(self.kwargs["dha_uri"]) + dha_metadata['comment'] = dha_pod_conf['dha-pod-config-metadata']['comment'] + self.dha_metadata = dha_metadata + dha_pod_conf.pop('dha-pod-config-metadata') + self.dha_pod_conf = dha_pod_conf + + scenario_conf = self.get_scenario_config() + dha_scenario_override_conf = scenario_conf["dha-override-config"] + # Only virtual deploy scenarios can override dha.yaml since there + # is no way to programatically override a physical environment: + # wireing, IPMI set-up, etc. + # For Physical environments, dha.yaml overrides will be silently ignored + if dha_scenario_override_conf and (dha_pod_conf['adapter'] == 'libvirt' + or dha_pod_conf['adapter'] == 'esxi' + or dha_pod_conf['adapter'] == 'vbox'): + print('Merging dha-pod and deployment-scenario override information to final dha.yaml configuration....') + self.dha_pod_conf = dict(merge_dicts(self.dha_pod_conf, dha_scenario_override_conf)) + + def dump_dha_config(self): + # Dump final dha.yaml to argument provided directory + path = self.kwargs["output_path"] + print('Dumping final dha.yaml to ' + path + '/dha.yaml....') + with open(path + '/dha.yaml', "w") as f: + f.write("\n".join([("title: DHA.yaml file automatically generated from " + "the configuration files stated in the " + '"configuration-files" fragment below'), + "version: " + str(calendar.timegm(time.gmtime())), + "created: " + time.strftime("%d/%m/%Y %H:%M:%S"), + "comment: none\n"])) + + f.write("configuration-files:\n") + + f.write("\n".join([" dha-pod-configuration:", + " uri: " + self.kwargs["dha_uri"], + " title: " + self.dha_metadata['title'], + " version: " + self.dha_metadata['version'], + " created: " + self.dha_metadata['created'], + " sha-1: " + self.dha_metadata['sha'], + " comment: " + self.dha_metadata['comment'] + "\n"])) + + f.write("\n".join([" deployment-scenario:", + " uri: " + self.scenario_metadata['uri'], + " title: " + self.scenario_metadata['title'], + " version: " + self.scenario_metadata['version'], + " created: " + self.scenario_metadata['created'], + " sha-1: " + self.scenario_metadata['sha'], + " comment: " + self.scenario_metadata['comment'] + "\n"])) + + yaml.dump(self.dha_pod_conf, f, default_flow_style=False) + + +def main(): + setup_yaml() + + deploy_config = DeployConfig() + deploy_config.process_dea_base() + deploy_config.process_dea_pod_override() + deploy_config.process_scenario_config() + deploy_config.dump_dea_config() + + deploy_config.process_dha_pod_config() + deploy_config.dump_dha_config() + + +if __name__ == '__main__': + main() diff --git a/deploy/deploy.py b/deploy/deploy.py new file mode 100755 index 000000000..f491929e0 --- /dev/null +++ b/deploy/deploy.py @@ -0,0 +1,423 @@ +#!/usr/bin/python +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import os +import io +import re +import sys +import yaml +import errno +import signal +import netaddr + +from dea import DeploymentEnvironmentAdapter +from dha import DeploymentHardwareAdapter +from install_fuel_master import InstallFuelMaster +from deploy_env import CloudDeploy +from execution_environment import ExecutionEnvironment + +from common import ( + log, + exec_cmd, + err, + warn, + check_file_exists, + check_dir_exists, + create_dir_if_not_exists, + delete, + check_if_root, + ArgParser, +) + +FUEL_VM = 'fuel' +PATCH_DIR = 'fuel_patch' +WORK_DIR = '~/deploy' +CWD = os.getcwd() +MOUNT_STATE_VAR = 'AUTODEPLOY_ISO_MOUNTED' + + +class cd: + + def __init__(self, new_path): + self.new_path = os.path.expanduser(new_path) + + def __enter__(self): + self.saved_path = CWD + os.chdir(self.new_path) + + def __exit__(self, etype, value, traceback): + os.chdir(self.saved_path) + + +class AutoDeploy(object): + + def __init__(self, no_fuel, fuel_only, no_health_check, cleanup_only, + cleanup, storage_dir, pxe_bridge, iso_file, dea_file, + dha_file, fuel_plugins_dir, fuel_plugins_conf_dir, + no_plugins, deploy_timeout, no_deploy_environment, deploy_log): + self.no_fuel = no_fuel + self.fuel_only = fuel_only + self.no_health_check = no_health_check + self.cleanup_only = cleanup_only + self.cleanup = cleanup + self.storage_dir = storage_dir + self.pxe_bridge = pxe_bridge + self.iso_file = iso_file + self.dea_file = dea_file + self.dha_file = dha_file + self.fuel_plugins_dir = fuel_plugins_dir + self.fuel_plugins_conf_dir = fuel_plugins_conf_dir + self.no_plugins = no_plugins + self.deploy_timeout = deploy_timeout + self.no_deploy_environment = no_deploy_environment + self.deploy_log = deploy_log + self.dea = (DeploymentEnvironmentAdapter(dea_file) + if not cleanup_only else None) + self.dha = DeploymentHardwareAdapter(dha_file) + self.fuel_conf = {} + self.fuel_node_id = self.dha.get_fuel_node_id() + self.fuel_username, self.fuel_password = self.dha.get_fuel_access() + self.tmp_dir = None + + def modify_ip(self, ip_addr, index, val): + ip_str = str(netaddr.IPAddress(ip_addr)) + decimal_list = map(int, ip_str.split('.')) + decimal_list[index] = val + return '.'.join(map(str, decimal_list)) + + def collect_fuel_info(self): + self.fuel_conf['ip'] = self.dea.get_fuel_ip() + self.fuel_conf['gw'] = self.dea.get_fuel_gateway() + self.fuel_conf['dns1'] = self.dea.get_fuel_dns() + self.fuel_conf['netmask'] = self.dea.get_fuel_netmask() + self.fuel_conf['hostname'] = self.dea.get_fuel_hostname() + self.fuel_conf['showmenu'] = 'yes' + + def install_fuel_master(self): + log('Install Fuel Master') + new_iso = ('%s/deploy-%s' + % (self.tmp_dir, os.path.basename(self.iso_file))) + self.patch_iso(new_iso) + self.iso_file = new_iso + self.install_iso() + + def delete_old_fuel_env(self): + log('Delete old Fuel Master environments if present') + try: + old_dep = CloudDeploy(self.dea, self.dha, self.fuel_conf['ip'], + self.fuel_username, self.fuel_password, + self.dea_file, self.fuel_plugins_conf_dir, + WORK_DIR, self.no_health_check, + self.deploy_timeout, + self.no_deploy_environment, self.deploy_log) + with old_dep.ssh: + old_dep.check_previous_installation() + except Exception as e: + log('Could not delete old env: %s' % str(e)) + + def install_iso(self): + fuel = InstallFuelMaster(self.dea_file, self.dha_file, + self.fuel_conf['ip'], self.fuel_username, + self.fuel_password, self.fuel_node_id, + self.iso_file, WORK_DIR, + self.fuel_plugins_dir, self.no_plugins) + fuel.install() + + def patch_iso(self, new_iso): + tmp_orig_dir = '%s/origiso' % self.tmp_dir + tmp_new_dir = '%s/newiso' % self.tmp_dir + try: + self.copy(tmp_orig_dir, tmp_new_dir) + self.patch(tmp_new_dir, new_iso) + except Exception as e: + exec_cmd('fusermount -u %s' % tmp_orig_dir, False) + os.environ.pop(MOUNT_STATE_VAR, None) + delete(self.tmp_dir) + err(e) + + def copy(self, tmp_orig_dir, tmp_new_dir): + log('Copying...') + os.makedirs(tmp_orig_dir) + os.makedirs(tmp_new_dir) + exec_cmd('fuseiso %s %s' % (self.iso_file, tmp_orig_dir)) + os.environ[MOUNT_STATE_VAR] = tmp_orig_dir + with cd(tmp_orig_dir): + exec_cmd('find . | cpio -pd %s' % tmp_new_dir) + exec_cmd('fusermount -u %s' % tmp_orig_dir) + os.environ.pop(MOUNT_STATE_VAR, None) + delete(tmp_orig_dir) + exec_cmd('chmod -R 755 %s' % tmp_new_dir) + + def patch(self, tmp_new_dir, new_iso): + log('Patching...') + patch_dir = '%s/%s' % (CWD, PATCH_DIR) + ks_path = '%s/ks.cfg.patch' % patch_dir + + with cd(tmp_new_dir): + exec_cmd('cat %s | patch -p0' % ks_path) + delete('.rr_moved') + isolinux = 'isolinux/isolinux.cfg' + log('isolinux.cfg before: %s' + % exec_cmd('grep ip= %s' % isolinux)) + self.update_fuel_isolinux(isolinux) + log('isolinux.cfg after: %s' + % exec_cmd('grep ip= %s' % isolinux)) + + iso_label = self.parse_iso_volume_label(self.iso_file) + log('Volume label: %s' % iso_label) + + iso_linux_bin = 'isolinux/isolinux.bin' + exec_cmd('mkisofs -quiet -r -J -R -b %s ' + '-no-emul-boot -boot-load-size 4 ' + '-boot-info-table -hide-rr-moved ' + '-joliet-long ' + '-x "lost+found:" -V %s -o %s .' + % (iso_linux_bin, iso_label, new_iso)) + + delete(tmp_new_dir) + + def update_fuel_isolinux(self, file): + with io.open(file) as f: + data = f.read() + for key, val in self.fuel_conf.iteritems(): + # skip replacing these keys, as the format is different + if key in ['ip', 'gw', 'netmask', 'hostname']: + continue + + pattern = r'%s=[^ ]\S+' % key + replace = '%s=%s' % (key, val) + data = re.sub(pattern, replace, data) + + # process networking parameters + ip = ':'.join([self.fuel_conf['ip'], + '', + self.fuel_conf['gw'], + self.fuel_conf['netmask'], + self.fuel_conf['hostname'], + 'eth0:off:::']) + + data = re.sub(r'ip=[^ ]\S+', 'ip=%s' % ip, data) + + with io.open(file, 'w') as f: + f.write(data) + + def parse_iso_volume_label(self, iso_filename): + label_line = exec_cmd('isoinfo -d -i %s | grep -i "Volume id: "' % iso_filename) + # cut leading text: 'Volume id: ' + return label_line[11:] + + def deploy_env(self): + dep = CloudDeploy(self.dea, self.dha, self.fuel_conf['ip'], + self.fuel_username, self.fuel_password, + self.dea_file, self.fuel_plugins_conf_dir, + WORK_DIR, self.no_health_check, self.deploy_timeout, + self.no_deploy_environment, self.deploy_log) + return dep.deploy() + + def setup_execution_environment(self): + exec_env = ExecutionEnvironment(self.storage_dir, self.pxe_bridge, + self.dha_file, self.dea) + exec_env.setup_environment() + + def cleanup_execution_environment(self): + exec_env = ExecutionEnvironment(self.storage_dir, self.pxe_bridge, + self.dha_file, self.dea) + exec_env.cleanup_environment() + + def create_tmp_dir(self): + self.tmp_dir = '%s/fueltmp' % CWD + delete(self.tmp_dir) + create_dir_if_not_exists(self.tmp_dir) + + def deploy(self): + self.collect_fuel_info() + if not self.no_fuel: + self.delete_old_fuel_env() + self.setup_execution_environment() + self.create_tmp_dir() + self.install_fuel_master() + if not self.fuel_only: + return self.deploy_env() + # Exit status + return 0 + + def run(self): + check_if_root() + if self.cleanup_only: + self.cleanup_execution_environment() + else: + deploy_success = self.deploy() + if self.cleanup: + self.cleanup_execution_environment() + return deploy_success + # Exit status + return 0 + + +def check_bridge(pxe_bridge, dha_path): + # Assume that bridges on remote nodes exists, we could ssh but + # the remote user might not have a login shell. + if os.environ.get('LIBVIRT_DEFAULT_URI'): + return + + with io.open(dha_path) as yaml_file: + dha_struct = yaml.load(yaml_file) + if dha_struct['adapter'] != 'libvirt': + log('Using Linux Bridge %s for booting up the Fuel Master VM' + % pxe_bridge) + r = exec_cmd('ip link show %s' % pxe_bridge) + if pxe_bridge in r and 'state DOWN' in r: + err('Linux Bridge {0} is not Active, bring' + ' it UP first: [ip link set dev {0} up]'.format(pxe_bridge)) + + +def check_fuel_plugins_dir(dir): + msg = None + if not dir: + msg = 'Fuel Plugins Directory not specified!' + elif not os.path.isdir(dir): + msg = 'Fuel Plugins Directory does not exist!' + elif not os.listdir(dir): + msg = 'Fuel Plugins Directory is empty!' + if msg: + warn('%s No external plugins will be installed!' % msg) + + +def parse_arguments(): + parser = ArgParser(prog='python %s' % __file__) + parser.add_argument('-nf', dest='no_fuel', action='store_true', + default=False, + help='Do not install Fuel Master (and Node VMs when ' + 'using libvirt)') + parser.add_argument('-nh', dest='no_health_check', action='store_true', + default=False, + help='Don\'t run health check after deployment') + parser.add_argument('-fo', dest='fuel_only', action='store_true', + default=False, + help='Install Fuel Master only (and Node VMs when ' + 'using libvirt)') + parser.add_argument('-co', dest='cleanup_only', action='store_true', + default=False, + help='Cleanup VMs and Virtual Networks according to ' + 'what is defined in DHA') + parser.add_argument('-c', dest='cleanup', action='store_true', + default=False, + help='Cleanup after deploy') + if {'-iso', '-dea', '-dha', '-h'}.intersection(sys.argv): + parser.add_argument('-iso', dest='iso_file', action='store', nargs='?', + default='%s/OPNFV.iso' % CWD, + help='ISO File [default: OPNFV.iso]') + parser.add_argument('-dea', dest='dea_file', action='store', nargs='?', + default='%s/dea.yaml' % CWD, + help='Deployment Environment Adapter: dea.yaml') + parser.add_argument('-dha', dest='dha_file', action='store', nargs='?', + default='%s/dha.yaml' % CWD, + help='Deployment Hardware Adapter: dha.yaml') + else: + parser.add_argument('iso_file', action='store', nargs='?', + default='%s/OPNFV.iso' % CWD, + help='ISO File [default: OPNFV.iso]') + parser.add_argument('dea_file', action='store', nargs='?', + default='%s/dea.yaml' % CWD, + help='Deployment Environment Adapter: dea.yaml') + parser.add_argument('dha_file', action='store', nargs='?', + default='%s/dha.yaml' % CWD, + help='Deployment Hardware Adapter: dha.yaml') + parser.add_argument('-s', dest='storage_dir', action='store', + default='%s/images' % CWD, + help='Storage Directory [default: images]') + parser.add_argument('-b', dest='pxe_bridge', action='append', + default=[], + help='Linux Bridge for booting up the Fuel Master VM ' + '[default: pxebr]') + parser.add_argument('-p', dest='fuel_plugins_dir', action='store', + help='Fuel Plugins directory') + parser.add_argument('-pc', dest='fuel_plugins_conf_dir', action='store', + help='Fuel Plugins Configuration directory') + parser.add_argument('-np', dest='no_plugins', action='store_true', + default=False, help='Do not install Fuel Plugins') + parser.add_argument('-dt', dest='deploy_timeout', action='store', + default=240, help='Deployment timeout (in minutes) ' + '[default: 240]') + parser.add_argument('-nde', dest='no_deploy_environment', + action='store_true', default=False, + help=('Do not launch environment deployment')) + parser.add_argument('-log', dest='deploy_log', + action='store', default='../ci/.', + help=('Path and name of the deployment log archive')) + + args = parser.parse_args() + log(args) + + if not args.pxe_bridge: + args.pxe_bridge = ['pxebr'] + + check_file_exists(args.dha_file) + + check_dir_exists(os.path.dirname(args.deploy_log)) + + if not args.cleanup_only: + check_file_exists(args.dea_file) + check_fuel_plugins_dir(args.fuel_plugins_dir) + + iso_abs_path = os.path.abspath(args.iso_file) + if not args.no_fuel and not args.cleanup_only: + log('Using OPNFV ISO file: %s' % iso_abs_path) + check_file_exists(iso_abs_path) + log('Using image directory: %s' % args.storage_dir) + create_dir_if_not_exists(args.storage_dir) + for bridge in args.pxe_bridge: + check_bridge(bridge, args.dha_file) + + + kwargs = {'no_fuel': args.no_fuel, 'fuel_only': args.fuel_only, + 'no_health_check': args.no_health_check, + 'cleanup_only': args.cleanup_only, 'cleanup': args.cleanup, + 'storage_dir': args.storage_dir, 'pxe_bridge': args.pxe_bridge, + 'iso_file': iso_abs_path, 'dea_file': args.dea_file, + 'dha_file': args.dha_file, + 'fuel_plugins_dir': args.fuel_plugins_dir, + 'fuel_plugins_conf_dir': args.fuel_plugins_conf_dir, + 'no_plugins': args.no_plugins, + 'deploy_timeout': args.deploy_timeout, + 'no_deploy_environment': args.no_deploy_environment, + 'deploy_log': args.deploy_log} + return kwargs + + +def handle_signals(signal_num, frame): + signal.signal(signal.SIGINT, signal.SIG_IGN) + signal.signal(signal.SIGTERM, signal.SIG_IGN) + + log('Caught signal %s, cleaning up and exiting.' % signal_num) + + mount_point = os.environ.get(MOUNT_STATE_VAR) + if mount_point: + log('Unmounting ISO from "%s"' % mount_point) + # Prevent 'Device or resource busy' errors when unmounting + os.chdir('/') + exec_cmd('fusermount -u %s' % mount_point, True) + # Be nice and remove our environment variable, even though the OS would + # would clean it up anyway + os.environ.pop(MOUNT_STATE_VAR) + + sys.exit(1) + + +def main(): + signal.signal(signal.SIGINT, handle_signals) + signal.signal(signal.SIGTERM, handle_signals) + kwargs = parse_arguments() + d = AutoDeploy(**kwargs) + sys.exit(d.run()) + +if __name__ == '__main__': + main() diff --git a/deploy/deploy_env.py b/deploy/deploy_env.py new file mode 100644 index 000000000..93dc3959b --- /dev/null +++ b/deploy/deploy_env.py @@ -0,0 +1,285 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import os +import io +import yaml +import glob +import time +import shutil + +from ssh_client import SSHClient + +from common import ( + err, + log, + exec_cmd, + parse, + N, + E, + R, + delete, +) + +CLOUD_DEPLOY_FILE = 'deploy.py' +BLADE_RESTART_TIMES = 3 + + +class CloudDeploy(object): + + def __init__(self, dea, dha, fuel_ip, fuel_username, fuel_password, + dea_file, fuel_plugins_conf_dir, work_dir, no_health_check, + deploy_timeout, no_deploy_environment, deploy_log): + self.dea = dea + self.dha = dha + self.fuel_ip = fuel_ip + self.fuel_username = fuel_username + self.fuel_password = fuel_password + self.dea_file = dea_file + self.updated_dea_file = ( + '%s/.%s' % (os.path.dirname(self.dea_file), + os.path.basename(self.dea_file))) + shutil.copy2(self.dea_file, self.updated_dea_file) + self.fuel_plugins_conf_dir = fuel_plugins_conf_dir + self.work_dir = work_dir + self.no_health_check = no_health_check + self.deploy_timeout = deploy_timeout + self.no_deploy_environment = no_deploy_environment + self.deploy_log = deploy_log + self.file_dir = os.path.dirname(os.path.realpath(__file__)) + self.ssh = SSHClient(self.fuel_ip, self.fuel_username, + self.fuel_password) + self.node_ids = self.dha.get_node_ids() + self.wanted_release = self.dea.get_property('wanted_release') + self.blade_node_dict = {} + self.macs_per_blade = {} + + def merge_plugin_config_files_to_dea_file(self): + plugins_conf_dir = ( + self.fuel_plugins_conf_dir if self.fuel_plugins_conf_dir + else '%s/plugins_conf' % os.path.dirname(self.dea_file)) + if os.path.isdir(plugins_conf_dir): + with io.open(self.updated_dea_file) as stream: + updated_dea = yaml.load(stream) + for plugin_file in glob.glob('%s/*.yaml' % plugins_conf_dir): + with io.open(plugin_file) as stream: + plugin_conf = yaml.load(stream) + updated_dea['settings']['editable'].update(plugin_conf) + with io.open(self.updated_dea_file, 'w') as stream: + yaml.dump(updated_dea, stream, default_flow_style=False) + + def upload_cloud_deployment_files(self): + with self.ssh as s: + s.exec_cmd('rm -rf %s' % self.work_dir, False) + s.exec_cmd('mkdir %s' % self.work_dir) + s.scp_put(self.updated_dea_file, '%s/%s' % ( + self.work_dir, os.path.basename(self.dea_file))) + s.scp_put('%s/common.py' % self.file_dir, self.work_dir) + s.scp_put('%s/dea.py' % self.file_dir, self.work_dir) + for f in glob.glob('%s/cloud/*' % self.file_dir): + s.scp_put(f, self.work_dir) + + def power_off_nodes(self): + for node_id in self.node_ids: + self.dha.node_power_off(node_id) + + def power_on_nodes(self): + for node_id in self.node_ids: + self.dha.node_power_on(node_id) + + def set_boot_order(self, boot_order_list): + for node_id in self.node_ids: + self.dha.node_set_boot_order(node_id, boot_order_list[:]) + + def get_mac_addresses(self): + self.macs_per_blade = {} + for node_id in self.node_ids: + self.macs_per_blade[node_id] = self.dha.get_node_pxe_mac(node_id) + + def run_cloud_deploy(self, deploy_app): + log('START CLOUD DEPLOYMENT') + deploy_app = '%s/%s' % (self.work_dir, deploy_app) + dea_file = '%s/%s' % (self.work_dir, os.path.basename(self.dea_file)) + with self.ssh as s: + status = s.run('python %s %s %s %s %s' % ( + deploy_app, + ('-nh' if self.no_health_check else ''), + ('-dt %s' % + self.deploy_timeout if self.deploy_timeout else ''), + ('-nde' if self.no_deploy_environment else ''), + dea_file)) + return status + + def check_supported_release(self): + log('Check supported release: %s' % self.wanted_release) + found = False + release_list = parse(self.ssh.exec_cmd('fuel release -l')) + for release in release_list: + if release[R['name']] == self.wanted_release: + found = True + break + if not found: + err('This Fuel does not contain the following release: %s' + % self.wanted_release) + + def check_previous_installation(self): + log('Check previous installation') + env_list = parse(self.ssh.exec_cmd('fuel env list')) + if env_list: + self.cleanup_fuel_environments(env_list) + node_list = parse(self.ssh.exec_cmd('fuel node list')) + if node_list: + self.cleanup_fuel_nodes(node_list) + + def cleanup_fuel_environments(self, env_list): + WAIT_LOOP = 60 + SLEEP_TIME = 10 + for env in env_list: + log('Deleting environment %s' % env[E['id']]) + self.ssh.exec_cmd('fuel env --env %s --delete --force' + % env[E['id']]) + all_env_erased = False + for i in range(WAIT_LOOP): + env_list = parse(self.ssh.exec_cmd('fuel env list')) + if env_list: + time.sleep(SLEEP_TIME) + else: + all_env_erased = True + break + if not all_env_erased: + err('Could not erase these environments %s' + % [(env[E['id']], env[E['status']]) for env in env_list]) + + def cleanup_fuel_nodes(self, node_list): + for node in node_list: + if node[N['status']] == 'discover': + log('Deleting node %s' % node[N['id']]) + self.ssh.exec_cmd('fuel node --node-id %s --delete-from-db ' + '--force' % node[N['id']]) + self.ssh.exec_cmd('cobbler system remove --name node-%s' + % node[N['id']], False) + + def check_prerequisites(self): + log('Check prerequisites') + with self.ssh: + self.check_supported_release() + self.check_previous_installation() + + def wait_for_discovered_blades(self): + log('Wait for discovered blades') + discovered_macs = [] + restart_times = BLADE_RESTART_TIMES + + for blade in self.node_ids: + self.blade_node_dict[blade] = None + + with self.ssh: + all_discovered = self.discovery_waiting_loop(discovered_macs) + + while not all_discovered and restart_times != 0: + restart_times -= 1 + for blade in self.get_not_discovered_blades(): + self.dha.node_reset(blade) + with self.ssh: + all_discovered = self.discovery_waiting_loop(discovered_macs) + + if not all_discovered: + err('Not all blades have been discovered: %s' + % self.not_discovered_blades_summary()) + + with io.open(self.updated_dea_file) as stream: + updated_dea = yaml.load(stream) + updated_dea.update({'blade_node_map': self.blade_node_dict}) + with io.open(self.updated_dea_file, 'w') as stream: + yaml.dump(updated_dea, stream, default_flow_style=False) + + def discovery_waiting_loop(self, discovered_macs): + WAIT_LOOP = 360 + SLEEP_TIME = 10 + all_discovered = False + for i in range(WAIT_LOOP): + node_list = parse(self.ssh.exec_cmd('fuel node list')) + if node_list: + self.node_discovery(node_list, discovered_macs) + if self.all_blades_discovered(): + all_discovered = True + break + else: + time.sleep(SLEEP_TIME) + return all_discovered + + def node_discovery(self, node_list, discovered_macs): + for node in node_list: + if (node[N['status']] == 'discover' and + (node[N['online']] == 'True' or + node[N['online']] == '1') and + node[N['mac']] not in discovered_macs): + discovered_macs.append(node[N['mac']]) + blade = self.find_mac_in_dict(node[N['mac']]) + if blade: + log('Blade %s discovered as Node %s with MAC %s' + % (blade, node[N['id']], node[N['mac']])) + self.blade_node_dict[blade] = int(node[N['id']]) + + def find_mac_in_dict(self, mac): + for blade, mac_list in self.macs_per_blade.iteritems(): + if mac in mac_list: + return blade + + def all_blades_discovered(self): + for blade, node_id in self.blade_node_dict.iteritems(): + if not node_id: + return False + return True + + def not_discovered_blades_summary(self): + summary = '' + for blade, node_id in self.blade_node_dict.iteritems(): + if not node_id: + summary += '\n[blade %s]' % blade + return summary + + def get_not_discovered_blades(self): + not_discovered_blades = [] + for blade, node_id in self.blade_node_dict.iteritems(): + if not node_id: + not_discovered_blades.append(blade) + return not_discovered_blades + + def set_boot_order_nodes(self): + self.power_off_nodes() + self.set_boot_order(['pxe', 'disk']) + self.power_on_nodes() + + def get_put_deploy_log(self): + with self.ssh as s: + s.scp_get("deploy-*", local=self.deploy_log) + + def deploy(self): + + self.set_boot_order_nodes() + + self.check_prerequisites() + + self.get_mac_addresses() + + self.wait_for_discovered_blades() + + self.merge_plugin_config_files_to_dea_file() + + self.upload_cloud_deployment_files() + + delete(self.updated_dea_file) + + rc = self.run_cloud_deploy(CLOUD_DEPLOY_FILE) + + self.get_put_deploy_log() + + return rc diff --git a/deploy/dha.py b/deploy/dha.py new file mode 100644 index 000000000..3f09da40a --- /dev/null +++ b/deploy/dha.py @@ -0,0 +1,38 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import yaml +import io + +from dha_adapters.libvirt_adapter import LibvirtAdapter +from dha_adapters.ipmi_adapter import IpmiAdapter +from dha_adapters.hp_adapter import HpAdapter +from dha_adapters.amt_adapter import AmtAdapter +from dha_adapters.zte_adapter import ZteAdapter + +class DeploymentHardwareAdapter(object): + + def __new__(cls, yaml_path): + with io.open(yaml_path) as yaml_file: + dha_struct = yaml.load(yaml_file) + type = dha_struct['adapter'] + + if cls is DeploymentHardwareAdapter: + if type == 'libvirt': + return LibvirtAdapter(yaml_path) + if type == 'ipmi': + return IpmiAdapter(yaml_path) + if type == 'hp': + return HpAdapter(yaml_path) + if type == 'amt': + return AmtAdapter(yaml_path) + if type == 'zte': + return ZteAdapter(yaml_path) + return super(DeploymentHardwareAdapter, cls).__new__(cls) diff --git a/deploy/dha_adapters/__init__.py b/deploy/dha_adapters/__init__.py new file mode 100644 index 000000000..fb73157f9 --- /dev/null +++ b/deploy/dha_adapters/__init__.py @@ -0,0 +1,8 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### diff --git a/deploy/dha_adapters/amt_adapter.py b/deploy/dha_adapters/amt_adapter.py new file mode 100644 index 000000000..02025b9dd --- /dev/null +++ b/deploy/dha_adapters/amt_adapter.py @@ -0,0 +1,100 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# liyi.meng@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +from hardware_adapter import HardwareAdapter + +from common import ( + log, + exec_cmd, + err, +) + + +''' +This is hardware adapter for Intel AMT based system. It use amttool to interact + with the targeting node. It dose not support vPro v9. if the targeting system + is v9 or later, we need to consider a new adpater with using lib + like https://github.com/sdague/amt +''' +class AmtAdapter(HardwareAdapter): + + def __init__(self, yaml_path): + super(AmtAdapter, self).__init__(yaml_path) + #amttool dose not allow you change bios setting permanently. + # so we have to make a workaround to make it IPMI like. + self.boot_order = {} + + def node_get_boot_dev(self, node_id): + if node_id in self.boot_order: + dev = self.boot_order[node_id][0] + if dev == 'pxe': + return 'PXE-boot' + elif dev == 'iso': + return 'cd-boot' + elif dev == 'disk': + return 'HD-boot' + else: + return 'HD-boot' + + def get_access_info(self, node_id): + ip = self.get_node_property(node_id, 'amtIp') + username = self.get_node_property(node_id, 'amtUser') + password = self.get_node_property(node_id, 'amtPass') + return ip, username, password + + def amt_cmd(self, node_id): + ip, username, password = self.get_access_info(node_id) + # We first Setup password for amttool, then use ping to wake up the node over LAN + cmd = 'export AMT_PASSWORD={0};' \ + 'ping {1} -W 5 -c 1 -q;' \ + 'yes | amttool {1}'.format(password, ip) + return cmd + + def get_node_pxe_mac(self, node_id): + mac_list = [] + mac_list.append(self.get_node_property(node_id, 'pxeMac').lower()) + return mac_list + + def node_power_on(self, node_id): + log('Power ON Node %s' % node_id) + cmd_prefix = self.amt_cmd(node_id) + resp, ret = exec_cmd('{0} info'.format(cmd_prefix), check=False) + if 'Powerstate: S0' not in resp: + dev = self.node_get_boot_dev(node_id) + resp, ret = exec_cmd('{0} powerup {1}'.format(cmd_prefix, dev), check=False) + if 'pt_status: success' not in resp: + err('Could Not Power ON Node %s' % node_id) + + def node_power_off(self, node_id): + log('Power OFF Node %s' % node_id) + cmd_prefix = self.amt_cmd(node_id) + resp, ret = exec_cmd('{0} info'.format(cmd_prefix), check=False) + if "Powerstate: S0" in resp: + resp, ret = exec_cmd('{0} powerdown'.format(cmd_prefix), check=False) + if 'pt_status: success' not in resp: + err('Could Not Power OFF Node %s' % node_id) + + def node_reset(self, node_id): + log('RESET Node %s' % node_id) + cmd_prefix = self.amt_cmd(node_id) + dev = self.node_get_boot_dev(node_id) + resp, ret = exec_cmd('{0} info'.format(cmd_prefix), check=False) + if 'Powerstate: S0' in resp: + resp, ret = exec_cmd('{0} reset {1}'.format(cmd_prefix, dev), check=False) + if 'pt_status: success' not in resp: + err('Could Not RESET Node %s' % node_id) + else: + err('Cannot RESET Node %s because it\'s not Active, state: %s' + % (node_id, resp)) + + def node_set_boot_order(self, node_id, boot_order_list): + log('Set boot order %s on Node %s' % (boot_order_list, node_id)) + self.boot_order[node_id] = boot_order_list + diff --git a/deploy/dha_adapters/hardware_adapter.py b/deploy/dha_adapters/hardware_adapter.py new file mode 100644 index 000000000..aa59581ee --- /dev/null +++ b/deploy/dha_adapters/hardware_adapter.py @@ -0,0 +1,65 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import yaml +import io + + +class HardwareAdapter(object): + + def __init__(self, yaml_path): + self.dha_struct = None + self.parse_yaml(yaml_path) + + def parse_yaml(self, yaml_path): + with io.open(yaml_path) as yaml_file: + self.dha_struct = yaml.load(yaml_file) + + def get_adapter_type(self): + return self.dha_struct['adapter'] + + def get_all_node_ids(self): + node_ids = [] + for node in self.dha_struct['nodes']: + node_ids.append(node['id']) + node_ids.sort() + return node_ids + + def get_fuel_node_id(self): + for node in self.dha_struct['nodes']: + if 'isFuel' in node and node['isFuel']: + return node['id'] + + def get_node_ids(self): + node_ids = [] + fuel_node_id = self.get_fuel_node_id() + for node in self.dha_struct['nodes']: + if node['id'] != fuel_node_id: + node_ids.append(node['id']) + node_ids.sort() + return node_ids + + def get_node_property(self, node_id, property_name): + for node in self.dha_struct['nodes']: + if node['id'] == node_id and property_name in node: + return node[property_name] + + def get_fuel_access(self): + for node in self.dha_struct['nodes']: + if 'isFuel' in node and node['isFuel']: + return node['username'], node['password'] + + def get_disks(self): + return self.dha_struct['disks'] + + def get_vm_definition(self, role): + vm_definition = self.dha_struct.get('define_vms') + if vm_definition: + return vm_definition.get(role) diff --git a/deploy/dha_adapters/hp_adapter.py b/deploy/dha_adapters/hp_adapter.py new file mode 100644 index 000000000..6434da868 --- /dev/null +++ b/deploy/dha_adapters/hp_adapter.py @@ -0,0 +1,37 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +from ipmi_adapter import IpmiAdapter +from ssh_client import SSHClient + +from common import ( + log, +) + +DEV = {'pxe': 'bootsource5', + 'disk': 'bootsource3', + 'iso': 'bootsource1'} + +ROOT = '/system1/bootconfig1' + + +class HpAdapter(IpmiAdapter): + + def __init__(self, yaml_path): + super(HpAdapter, self).__init__(yaml_path) + + def node_set_boot_order(self, node_id, boot_order_list): + log('Set boot order %s on Node %s' % (boot_order_list, node_id)) + ip, username, password, ipmiport = self.get_access_info(node_id) + ssh = SSHClient(ip, username, password) + with ssh as s: + for order, dev in enumerate(boot_order_list): + s.exec_cmd('set %s/%s bootorder=%s' + % (ROOT, DEV[dev], order + 1)) diff --git a/deploy/dha_adapters/ipmi_adapter.py b/deploy/dha_adapters/ipmi_adapter.py new file mode 100644 index 000000000..7cc930554 --- /dev/null +++ b/deploy/dha_adapters/ipmi_adapter.py @@ -0,0 +1,114 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# (c) 2016 Enea Software AB +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import time +from hardware_adapter import HardwareAdapter + +from common import ( + log, + exec_cmd, + err, +) + + +class IpmiAdapter(HardwareAdapter): + + def __init__(self, yaml_path, attempts=20, delay=3): + super(IpmiAdapter, self).__init__(yaml_path) + self.attempts = attempts + self.delay = delay + + def get_access_info(self, node_id): + ip = self.get_node_property(node_id, 'ipmiIp') + username = self.get_node_property(node_id, 'ipmiUser') + password = self.get_node_property(node_id, 'ipmiPass') + ipmiport = self.get_node_property(node_id, 'ipmiPort') + return ip, username, password, ipmiport + + def ipmi_cmd(self, node_id): + ip, username, password, ipmiport = self.get_access_info(node_id) + cmd = 'ipmitool -I lanplus -A password' + cmd += ' -H %s -U %s -P %s' % (ip, username, password) + if ipmiport: + cmd += ' -p %d' % int(ipmiport) + return cmd + + def get_node_pxe_mac(self, node_id): + mac_list = [] + mac_list.append(self.get_node_property(node_id, 'pxeMac').lower()) + return mac_list + + def node_get_state(self, node_id): + state = exec_cmd('%s chassis power status' % self.ipmi_cmd(node_id), + attempts=self.attempts, delay=self.delay, + verbose=True, + mask_args=[8,10]) + return state + + def _node_power_cmd(self, node_id, cmd): + expected = 'Chassis Power is %s' % cmd + if self.node_get_state(node_id) == expected: + return + + pow_cmd = '%s chassis power %s' % (self.ipmi_cmd(node_id), cmd) + exec_cmd(pow_cmd, attempts=self.attempts, delay=self.delay, + verbose=True, + mask_args=[8,10]) + + attempts = self.attempts + while attempts: + time.sleep(self.delay) + state = self.node_get_state(node_id) + attempts -= 1 + if state == expected: + return + elif attempts != 0: + # reinforce our will, but allow the command to fail, + # we know our message got across once already... + exec_cmd(pow_cmd, check=False, mask_args=[8,10]) + + err('Could not set chassis %s for node %s' % (cmd, node_id)) + + def node_power_on(self, node_id): + log('Power ON Node %s' % node_id) + self._node_power_cmd(node_id, 'on') + + def node_power_off(self, node_id): + log('Power OFF Node %s' % node_id) + self._node_power_cmd(node_id, 'off') + + def node_reset(self, node_id): + log('RESET Node %s' % node_id) + cmd = '%s chassis power reset' % self.ipmi_cmd(node_id) + exec_cmd(cmd, attempts=self.attempts, delay=self.delay, + verbose=True, + mask_args=[8,10]) + + def node_set_boot_order(self, node_id, boot_order_list): + log('Set boot order %s on Node %s' % (boot_order_list, node_id)) + boot_order_list.reverse() + cmd_prefix = self.ipmi_cmd(node_id) + for dev in boot_order_list: + if dev == 'pxe': + exec_cmd('%s chassis bootdev pxe options=persistent' + % cmd_prefix, attempts=self.attempts, delay=self.delay, + verbose=True, + mask_args=[8,10]) + elif dev == 'iso': + exec_cmd('%s chassis bootdev cdrom' % cmd_prefix, + attempts=self.attempts, delay=self.delay, + verbose=True, + mask_args=[8,10]) + elif dev == 'disk': + exec_cmd('%s chassis bootdev disk options=persistent' + % cmd_prefix, attempts=self.attempts, delay=self.delay, + verbose=True, + mask_args=[8,10]) diff --git a/deploy/dha_adapters/libvirt_adapter.py b/deploy/dha_adapters/libvirt_adapter.py new file mode 100644 index 000000000..466f134ae --- /dev/null +++ b/deploy/dha_adapters/libvirt_adapter.py @@ -0,0 +1,173 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +from lxml import etree +from hardware_adapter import HardwareAdapter +import tempfile +import os + +from common import ( + log, + exec_cmd, + err, + delete, +) + +DEV = {'pxe': 'network', + 'disk': 'hd', + 'iso': 'cdrom'} + +VOL_XML_TEMPLATE = ''' + {name} + {size!s} + + + +''' + +DEFAULT_POOL = 'jenkins' + +class LibvirtAdapter(HardwareAdapter): + + def __init__(self, yaml_path): + super(LibvirtAdapter, self).__init__(yaml_path) + self.parser = etree.XMLParser(remove_blank_text=True) + + def node_power_off(self, node_id): + vm_name = self.get_node_property(node_id, 'libvirtName') + log('Power OFF Node %s' % vm_name) + state = exec_cmd('virsh domstate %s' % vm_name) + if state == 'running': + exec_cmd('virsh destroy %s' % vm_name, False) + + def node_power_on(self, node_id): + vm_name = self.get_node_property(node_id, 'libvirtName') + log('Power ON Node %s' % vm_name) + state = exec_cmd('virsh domstate %s' % vm_name) + if state == 'shut off': + exec_cmd('virsh start %s' % vm_name) + + def node_reset(self, node_id): + vm_name = self.get_node_property(node_id, 'libvirtName') + log('Reset Node %s' % vm_name) + exec_cmd('virsh reset %s' % vm_name) + + def translate(self, boot_order_list): + translated = [] + for boot_dev in boot_order_list: + if boot_dev in DEV: + translated.append(DEV[boot_dev]) + else: + err('Boot device %s not recognized' % boot_dev) + return translated + + def node_set_boot_order(self, node_id, boot_order_list): + boot_order_list = self.translate(boot_order_list) + vm_name = self.get_node_property(node_id, 'libvirtName') + temp_dir = tempfile.mkdtemp() + log('Set boot order %s on Node %s' % (boot_order_list, vm_name)) + resp = exec_cmd('virsh dumpxml %s' % vm_name) + xml_dump = etree.fromstring(resp, self.parser) + os = xml_dump.xpath('/domain/os') + for o in os: + for bootelem in ['boot', 'bootmenu']: + boot = o.xpath(bootelem) + for b in boot: + o.remove(b) + for dev in boot_order_list: + b = etree.Element('boot') + b.set('dev', dev) + o.append(b) + bmenu = etree.Element('bootmenu') + bmenu.set('enable', 'no') + o.append(bmenu) + tree = etree.ElementTree(xml_dump) + xml_file = temp_dir + '/%s.xml' % vm_name + with open(xml_file, 'w') as f: + tree.write(f, pretty_print=True, xml_declaration=True) + exec_cmd('virsh define %s' % xml_file) + delete(temp_dir) + + def node_zero_mbr(self, node_id): + vm_name = self.get_node_property(node_id, 'libvirtName') + resp = exec_cmd('virsh dumpxml %s' % vm_name) + xml_dump = etree.fromstring(resp) + disks = xml_dump.xpath('/domain/devices/disk') + for disk in disks: + if disk.get('device') == 'disk': + sources = disk.xpath('source') + for source in sources: + disk_file = source.get('file') + disk_size = exec_cmd('qemu-img info ' + '%s |grep \"virtual size:\"' + % disk_file).split()[2] + delete(disk_file) + exec_cmd('qemu-img create -f qcow2 %s %s' % (disk_file, + disk_size)) + + def node_eject_iso(self, node_id): + vm_name = self.get_node_property(node_id, 'libvirtName') + device = self.get_name_of_device(vm_name, 'cdrom') + exec_cmd('virsh change-media %s --eject %s --config --live' + % (vm_name, device), False) + + def node_insert_iso(self, node_id, iso_file): + vm_name = self.get_node_property(node_id, 'libvirtName') + device = self.get_name_of_device(vm_name, 'cdrom') + exec_cmd('virsh change-media %s --insert %s %s' + % (vm_name, device, iso_file)) + + def get_node_pxe_mac(self, node_id): + mac_list = [] + vm_name = self.get_node_property(node_id, 'libvirtName') + resp = exec_cmd('virsh dumpxml %s' % vm_name) + xml_dump = etree.fromstring(resp) + interfaces = xml_dump.xpath('/domain/devices/interface') + for interface in interfaces: + macs = interface.xpath('mac') + for mac in macs: + mac_list.append(mac.get('address').lower()) + return mac_list + + def get_name_of_device(self, vm_name, device_type): + resp = exec_cmd('virsh dumpxml %s' % vm_name) + xml_dump = etree.fromstring(resp) + disks = xml_dump.xpath('/domain/devices/disk') + for disk in disks: + if disk.get('device') == device_type: + targets = disk.xpath('target') + for target in targets: + device = target.get('dev') + if device: + return device + + def get_virt_net_conf_dir(self): + return self.dha_struct['virtNetConfDir'] + + def upload_iso(self, iso_file): + size = os.path.getsize(iso_file) + vol_name = os.path.basename(iso_file) + vol_xml = VOL_XML_TEMPLATE.format(name=vol_name, unit='bytes', + size=size, format_type='raw') + fd, fname = tempfile.mkstemp(text=True, suffix='deploy') + os.write(fd, vol_xml) + os.close(fd) + + log(vol_xml) + pool = DEFAULT_POOL # FIXME + exec_cmd('virsh vol-create --pool %s %s' % (pool, fname)) + vol_path = exec_cmd('virsh vol-path --pool %s %s' % (pool, vol_name)) + + exec_cmd('virsh vol-upload %s %s' % (vol_path, iso_file), + attempts=5, delay=10, verbose=True) + + delete(fname) + + return vol_path diff --git a/deploy/dha_adapters/zte_adapter.py b/deploy/dha_adapters/zte_adapter.py new file mode 100644 index 000000000..da651ca15 --- /dev/null +++ b/deploy/dha_adapters/zte_adapter.py @@ -0,0 +1,32 @@ +############################################################################### +# Copyright (c) 2016 Ericsson AB, ZTE and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import time +from ipmi_adapter import IpmiAdapter + +from common import ( + log, + exec_cmd, + err, +) + + +class ZteAdapter(IpmiAdapter): + + def __init__(self, yaml_path, attempts=100): + super(ZteAdapter, self).__init__(yaml_path, attempts) + + def node_reset(self, node_id): + log('RESET Node %s' % node_id) + cmd = '%s chassis power cycle' % self.ipmi_cmd(node_id) + exec_cmd(cmd, attempts=self.attempts, delay=self.delay, + verbose=True, + mask_args=[8,10]) + diff --git a/deploy/environments/__init__.py b/deploy/environments/__init__.py new file mode 100644 index 000000000..fb73157f9 --- /dev/null +++ b/deploy/environments/__init__.py @@ -0,0 +1,8 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### diff --git a/deploy/environments/execution_environment.py b/deploy/environments/execution_environment.py new file mode 100644 index 000000000..3812902aa --- /dev/null +++ b/deploy/environments/execution_environment.py @@ -0,0 +1,100 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +from lxml import etree +from dha_adapters.libvirt_adapter import LibvirtAdapter + +from common import ( + exec_cmd, + log, + delete, +) + + +class ExecutionEnvironment(object): + + def __init__(self, storage_dir, dha_file, root_dir): + self.storage_dir = storage_dir + self.dha = LibvirtAdapter(dha_file) + self.root_dir = root_dir + self.parser = etree.XMLParser(remove_blank_text=True) + self.fuel_node_id = self.dha.get_fuel_node_id() + + def delete_vm(self, node_id): + vm_name = self.dha.get_node_property(node_id, 'libvirtName') + r, c = exec_cmd('virsh dumpxml %s' % vm_name, False) + if c: + return + self.undefine_vm_delete_disk(r, vm_name) + + def undefine_vm_delete_disk(self, printout, vm_name): + disk_files = [] + xml_dump = etree.fromstring(printout, self.parser) + disks = xml_dump.xpath('/domain/devices/disk') + for disk in disks: + sources = disk.xpath('source') + for source in sources: + source_file = source.get('file') + if source_file: + disk_files.append(source_file) + log('Deleting VM %s with disks %s' % (vm_name, disk_files)) + exec_cmd('virsh destroy %s' % vm_name, False) + exec_cmd('virsh undefine --managed-save --remove-all-storage %s' % vm_name, False) + + def overwrite_xml(self, vm_xml, vm_definition_overwrite): + if not vm_definition_overwrite: + return + for key, value in vm_definition_overwrite.iteritems(): + if key == 'attribute_equlas': + continue + if key == 'value': + vm_xml.text = str(value) + return + if key == 'attribute': + for attr_key, attr_value in value.iteritems(): + vm_xml.set(attr_key, str(attr_value)) + return + + if isinstance(value, dict): + only_when_attribute = value.get('attribute_equlas') + for xml_element in vm_xml.xpath(key): + if only_when_attribute: + for attr_key, attr_value in \ + only_when_attribute.iteritems(): + if attr_value != xml_element.get(attr_key): + continue + self.overwrite_xml(xml_element, value) + + def define_vm(self, vm_name, temp_vm_file, disk_path, + vm_definition_overwrite): + log('Creating VM %s with disks %s' % (vm_name, disk_path)) + with open(temp_vm_file) as f: + vm_xml = etree.parse(f) + names = vm_xml.xpath('/domain/name') + for name in names: + name.text = vm_name + uuids = vm_xml.xpath('/domain/uuid') + for uuid in uuids: + uuid.getparent().remove(uuid) + self.overwrite_xml(vm_xml.xpath('/domain')[0], + vm_definition_overwrite) + disks = vm_xml.xpath('/domain/devices/disk') + for disk in disks: + if (disk.get('type') == 'file' and + disk.get('device') == 'disk'): + sources = disk.xpath('source') + for source in sources: + disk.remove(source) + source = etree.Element('source') + source.set('file', disk_path) + disk.append(source) + with open(temp_vm_file, 'w') as f: + vm_xml.write(f, pretty_print=True, xml_declaration=True) + exec_cmd('virsh define %s' % temp_vm_file) diff --git a/deploy/environments/libvirt_environment.py b/deploy/environments/libvirt_environment.py new file mode 100644 index 000000000..c9fa41fd7 --- /dev/null +++ b/deploy/environments/libvirt_environment.py @@ -0,0 +1,107 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +from lxml import etree +import glob +from execution_environment import ExecutionEnvironment +import tempfile + +from common import ( + exec_cmd, + log, + check_dir_exists, + check_file_exists, + delete, +) + + +class LibvirtEnvironment(ExecutionEnvironment): + + def __init__(self, storage_dir, dha_file, dea, root_dir): + super(LibvirtEnvironment, self).__init__( + storage_dir, dha_file, root_dir) + self.dea = dea + self.network_dir = '%s/%s' % (self.root_dir, + self.dha.get_virt_net_conf_dir()) + self.node_ids = self.dha.get_all_node_ids() + self.net_names = self.collect_net_names() + + def create_storage(self, node_id, disk_path, disk_sizes): + role = self.dea.get_node_main_role(node_id, self.fuel_node_id) + disk_size = disk_sizes[role] + exec_cmd('qemu-img create -f qcow2 %s %s' % (disk_path, disk_size)) + + def create_vms(self): + temp_dir = tempfile.mkdtemp() + disk_sizes = self.dha.get_disks() + for node_id in self.node_ids: + vm_name = self.dha.get_node_property(node_id, 'libvirtName') + vm_template = '%s/%s' % (self.root_dir, + self.dha.get_node_property( + node_id, 'libvirtTemplate')) + check_file_exists(vm_template) + disk_path = '%s/%s.raw' % (self.storage_dir, vm_name) + self.create_storage(node_id, disk_path, disk_sizes) + temp_vm_file = '%s/%s' % (temp_dir, vm_name) + exec_cmd('cp %s %s' % (vm_template, temp_vm_file)) + vm_definition_overwrite = self.dha.get_vm_definition( + self.dea.get_node_main_role(node_id, self.fuel_node_id)) + self.define_vm(vm_name, temp_vm_file, disk_path, + vm_definition_overwrite) + delete(temp_dir) + + def start_vms(self): + for node_id in self.node_ids: + self.dha.node_power_on(node_id) + + def create_networks(self): + for net_file in glob.glob('%s/*' % self.network_dir): + exec_cmd('virsh net-define %s' % net_file) + for net in self.net_names: + log('Creating network %s' % net) + exec_cmd('virsh net-autostart %s' % net) + exec_cmd('virsh net-start %s' % net) + + def delete_networks(self): + for net in self.net_names: + log('Deleting network %s' % net) + exec_cmd('virsh net-destroy %s' % net, False) + exec_cmd('virsh net-undefine %s' % net, False) + + def get_net_name(self, net_file): + with open(net_file) as f: + net_xml = etree.parse(f) + name_list = net_xml.xpath('/network/name') + for name in name_list: + net_name = name.text + return net_name + + def collect_net_names(self): + net_list = [] + for net_file in glob.glob('%s/*' % self.network_dir): + name = self.get_net_name(net_file) + net_list.append(name) + return net_list + + def delete_vms(self): + for node_id in self.node_ids: + self.delete_vm(node_id) + + + def setup_environment(self): + check_dir_exists(self.network_dir) + self.cleanup_environment() + self.create_networks() + self.create_vms() + self.start_vms() + + def cleanup_environment(self): + self.delete_vms() + self.delete_networks() diff --git a/deploy/environments/virtual_fuel.py b/deploy/environments/virtual_fuel.py new file mode 100644 index 000000000..b1a76e479 --- /dev/null +++ b/deploy/environments/virtual_fuel.py @@ -0,0 +1,143 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +from lxml import etree +from execution_environment import ExecutionEnvironment +import tempfile +import os +import re +import time + +from common import ( + exec_cmd, + check_file_exists, + check_if_root, + delete, + log, +) + +VOL_XML_TEMPLATE = ''' + {name} + {size!s} + + + +''' + +DEFAULT_POOL = 'jenkins' + +def get_size_and_unit(s): + p = re.compile('^(\d+)\s*(\D+)') + m = p.match(s) + if m == None: + return None, None + size = m.groups()[0] + unit = m.groups()[1] + return size, unit + +class VirtualFuel(ExecutionEnvironment): + + def __init__(self, storage_dir, pxe_bridge, dha_file, root_dir): + super(VirtualFuel, self).__init__(storage_dir, dha_file, root_dir) + self.pxe_bridge = pxe_bridge + self.temp_dir = tempfile.mkdtemp() + self.vm_name = self.dha.get_node_property(self.fuel_node_id, + 'libvirtName') + self.vm_template = '%s/%s' % (self.root_dir, + self.dha.get_node_property( + self.fuel_node_id, 'libvirtTemplate')) + check_file_exists(self.vm_template) + with open(self.vm_template) as f: + self.vm_xml = etree.parse(f) + + self.temp_vm_file = '%s/%s' % (self.temp_dir, self.vm_name) + self.update_vm_template_file() + + def __del__(self): + delete(self.temp_dir) + + def update_vm_template_file(self): + with open(self.temp_vm_file, "wc") as f: + self.vm_xml.write(f, pretty_print=True, xml_declaration=True) + + def del_vm_nics(self): + interfaces = self.vm_xml.xpath('/domain/devices/interface') + for interface in interfaces: + interface.getparent().remove(interface) + + def add_vm_nic(self, bridge): + interface = etree.Element('interface') + interface.set('type', 'bridge') + source = etree.SubElement(interface, 'source') + source.set('bridge', bridge) + model = etree.SubElement(interface, 'model') + model.set('type', 'virtio') + + devices = self.vm_xml.xpath('/domain/devices') + if devices: + device = devices[0] + device.append(interface) + else: + err('No devices!') + + def create_volume(self, pool, name, su, img_type='qcow2'): + log('Creating image using Libvirt volumes in pool %s, name: %s' % + (pool, name)) + size, unit = get_size_and_unit(su) + if size == None: + err('Could not determine size and unit of %s' % s) + + vol_xml = VOL_XML_TEMPLATE.format(name=name, unit=unit, size=size, + format_type=img_type) + fname = os.path.join(self.temp_dir, '%s_vol.xml' % name) + with file(fname, 'w') as f: + f.write(vol_xml) + + exec_cmd('virsh vol-create --pool %s %s' % (pool, fname)) + vol_path = exec_cmd('virsh vol-path --pool %s %s' % (pool, name)) + + delete(fname) + + return vol_path + + def create_image(self, disk_path, disk_size): + if os.environ.get('LIBVIRT_DEFAULT_URI') == None: + exec_cmd('qemu-img create -f qcow2 %s %s' % (disk_path, disk_size)) + else: + pool = DEFAULT_POOL # FIXME + name = os.path.basename(disk_path) + disk_path = self.create_volume(pool, name, disk_size) + + return disk_path + + def create_vm(self): + stamp = time.strftime("%Y%m%d%H%M%S") + disk_path = '%s/%s-%s.raw' % (self.storage_dir, self.vm_name, stamp) + disk_sizes = self.dha.get_disks() + disk_size = disk_sizes['fuel'] + disk_path = self.create_image(disk_path, disk_size) + + self.del_vm_nics() + for bridge in self.pxe_bridge: + self.add_vm_nic(bridge) + self.update_vm_template_file() + + vm_definition_overwrite = self.dha.get_vm_definition('fuel') + + self.define_vm(self.vm_name, self.temp_vm_file, disk_path, + vm_definition_overwrite) + + def setup_environment(self): + check_if_root() + self.cleanup_environment() + self.create_vm() + + def cleanup_environment(self): + self.delete_vm(self.fuel_node_id) diff --git a/deploy/execution_environment.py b/deploy/execution_environment.py new file mode 100644 index 000000000..b8e861c4a --- /dev/null +++ b/deploy/execution_environment.py @@ -0,0 +1,37 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import yaml +import io +import os + +from environments.libvirt_environment import LibvirtEnvironment +from environments.virtual_fuel import VirtualFuel + + +class ExecutionEnvironment(object): + + def __new__(cls, storage_dir, pxe_bridge, dha_path, dea): + + with io.open(dha_path) as yaml_file: + dha_struct = yaml.load(yaml_file) + + type = dha_struct['adapter'] + + root_dir = os.path.dirname(os.path.realpath(__file__)) + + if cls is ExecutionEnvironment: + if type == 'libvirt': + return LibvirtEnvironment(storage_dir, dha_path, dea, root_dir) + + if type in ['ipmi', 'hp', 'amt', 'zte']: + return VirtualFuel(storage_dir, pxe_bridge, dha_path, root_dir) + + return super(ExecutionEnvironment, cls).__new__(cls) diff --git a/deploy/fuel_patch/ks.cfg.patch b/deploy/fuel_patch/ks.cfg.patch new file mode 100644 index 000000000..8c9cebc0f --- /dev/null +++ b/deploy/fuel_patch/ks.cfg.patch @@ -0,0 +1,19 @@ +*** ks.cfg.orig 2016-01-25 08:56:16.406241267 +0100 +--- ks.cfg 2016-01-25 14:31:11.417761494 +0100 +*************** +*** 98,104 **** + default_drive=`echo ${drives} ${removable_drives} | awk '{print $1}'` + + installdrive=${installdrive:-undefined} +! forceformat=${forceformat:-no} + for I in $(cat /proc/cmdline); do + case "$I" in + *=*) +--- 98,104 ---- + default_drive=`echo ${drives} ${removable_drives} | awk '{print $1}'` + + installdrive=${installdrive:-undefined} +! forceformat=${forceformat:-yes} + for I in $(cat /proc/cmdline); do + case "$I" in + *=*) diff --git a/deploy/install_fuel_master.py b/deploy/install_fuel_master.py new file mode 100644 index 000000000..a0e28b033 --- /dev/null +++ b/deploy/install_fuel_master.py @@ -0,0 +1,222 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + +import time +import os +import glob +from ssh_client import SSHClient +from dha_adapters.libvirt_adapter import LibvirtAdapter + +from common import ( + log, + err, + clean, + delete, +) + +TRANSPLANT_FUEL_SETTINGS = 'transplant_fuel_settings.py' +BOOTSTRAP_ADMIN = 'bootstrap_admin_node' +FUEL_CLIENT_CONFIG = '/etc/fuel/client/config.yaml' +PLUGINS_DIR = '~/plugins' +LOCAL_PLUGIN_FOLDER = '/opt/opnfv' +IGNORABLE_FUEL_ERRORS = ['does not update installed package', + 'Couldn\'t resolve host'] + + +class InstallFuelMaster(object): + + def __init__(self, dea_file, dha_file, fuel_ip, fuel_username, + fuel_password, fuel_node_id, iso_file, work_dir, + fuel_plugins_dir, no_plugins): + self.dea_file = dea_file + self.dha = LibvirtAdapter(dha_file) + self.fuel_ip = fuel_ip + self.fuel_username = fuel_username + self.fuel_password = fuel_password + self.fuel_node_id = fuel_node_id + self.iso_file = iso_file + self.iso_dir = os.path.dirname(self.iso_file) + self.work_dir = work_dir + self.fuel_plugins_dir = fuel_plugins_dir + self.no_plugins = no_plugins + self.file_dir = os.path.dirname(os.path.realpath(__file__)) + self.ssh = SSHClient(self.fuel_ip, self.fuel_username, + self.fuel_password) + + def install(self): + log('Start Fuel Installation') + + self.dha.node_power_off(self.fuel_node_id) + + if os.environ.get('LIBVIRT_DEFAULT_URI'): + log('Upload ISO to pool') + self.iso_file = self.dha.upload_iso(self.iso_file) + else: + log('Zero the MBR') + self.dha.node_zero_mbr(self.fuel_node_id) + + self.dha.node_set_boot_order(self.fuel_node_id, ['disk', 'iso']) + + try: + self.proceed_with_installation() + except Exception as e: + self.post_install_cleanup() + err(e) + + def proceed_with_installation(self): + log('Eject ISO') + self.dha.node_eject_iso(self.fuel_node_id) + + log('Insert ISO %s' % self.iso_file) + self.dha.node_insert_iso(self.fuel_node_id, self.iso_file) + + self.dha.node_power_on(self.fuel_node_id) + + log('Waiting for Fuel master to accept SSH') + self.wait_for_node_up() + + log('Wait until Fuel menu is up') + fuel_menu_pid = self.wait_until_fuel_menu_up() + + log('Inject our own astute.yaml and fuel_bootstrap_cli.yaml settings') + self.inject_own_astute_and_bootstrap_yaml() + + log('Let the Fuel deployment continue') + log('Found FUEL menu as PID %s, now killing it' % fuel_menu_pid) + self.ssh_exec_cmd('kill %s' % fuel_menu_pid, False) + + log('Wait until installation is complete') + self.wait_until_installation_completed() + + log('Waiting for one minute for Fuel to stabilize') + time.sleep(60) + + self.delete_deprecated_fuel_client_config() + + if not self.no_plugins: + + self.collect_plugin_files() + + self.install_plugins() + + self.post_install_cleanup() + + log('Fuel Master installed successfully !') + + def collect_plugin_files(self): + with self.ssh as s: + s.exec_cmd('mkdir %s' % PLUGINS_DIR) + if self.fuel_plugins_dir: + for f in glob.glob('%s/*.rpm' % self.fuel_plugins_dir): + s.scp_put(f, PLUGINS_DIR) + + def install_plugins(self): + log('Installing Fuel Plugins') + plugin_files = [] + with self.ssh as s: + for plugin_location in [PLUGINS_DIR, LOCAL_PLUGIN_FOLDER]: + s.exec_cmd('mkdir -p %s' % plugin_location) + r = s.exec_cmd('find %s -type f -name \'*.rpm\'' + % plugin_location) + plugin_files.extend(r.splitlines()) + for f in plugin_files: + log('Found plugin %s, installing ...' % f) + r, e = s.exec_cmd('fuel plugins --install %s' % f, False) + printout = r + e if e else r + if e and all([err not in printout + for err in IGNORABLE_FUEL_ERRORS]): + raise Exception('Installation of Fuel Plugin %s ' + 'failed: %s' % (f, e)) + + def wait_for_node_up(self): + WAIT_LOOP = 240 + SLEEP_TIME = 10 + success = False + for i in range(WAIT_LOOP): + try: + self.ssh.open() + success = True + break + except Exception: + log('Trying to SSH into Fuel VM %s ... sleeping %s seconds' + % (self.fuel_ip, SLEEP_TIME)) + time.sleep(SLEEP_TIME) + finally: + self.ssh.close() + + if not success: + raise Exception('Could not SSH into Fuel VM %s' % self.fuel_ip) + + def wait_until_fuel_menu_up(self): + WAIT_LOOP = 60 + SLEEP_TIME = 10 + CMD = 'pgrep -f fuelmenu' + fuel_menu_pid = None + with self.ssh: + for i in range(WAIT_LOOP): + ret = self.ssh.exec_cmd(CMD) + fuel_menu_pid = ret.strip() + if not fuel_menu_pid: + time.sleep(SLEEP_TIME) + else: + break + if not fuel_menu_pid: + raise Exception('Could not find the Fuel Menu Process ID') + return fuel_menu_pid + + def ssh_exec_cmd(self, cmd, check=True): + with self.ssh: + ret = self.ssh.exec_cmd(cmd, check=check) + return ret + + def inject_own_astute_and_bootstrap_yaml(self): + with self.ssh as s: + s.exec_cmd('rm -rf %s' % self.work_dir, False) + s.exec_cmd('mkdir %s' % self.work_dir) + s.scp_put(self.dea_file, self.work_dir) + s.scp_put('%s/common.py' % self.file_dir, self.work_dir) + s.scp_put('%s/dea.py' % self.file_dir, self.work_dir) + s.scp_put('%s/transplant_fuel_settings.py' + % self.file_dir, self.work_dir) + log('Modifying Fuel astute') + s.run('python %s/%s %s/%s' + % (self.work_dir, TRANSPLANT_FUEL_SETTINGS, + self.work_dir, os.path.basename(self.dea_file))) + + def wait_until_installation_completed(self): + WAIT_LOOP = 360 + SLEEP_TIME = 10 + CMD = 'pgrep -f %s' % BOOTSTRAP_ADMIN + + install_completed = False + with self.ssh: + for i in range(WAIT_LOOP): + ret = self.ssh.exec_cmd(CMD) + if not ret: + install_completed = True + break + else: + time.sleep(SLEEP_TIME) + + if not install_completed: + raise Exception('Fuel installation did not complete') + + def post_install_cleanup(self): + log('Eject ISO file %s' % self.iso_file) + self.dha.node_eject_iso(self.fuel_node_id) + delete(self.iso_dir) + + def delete_deprecated_fuel_client_config(self): + with self.ssh as s: + response, error = s.exec_cmd('fuel -v', False) + if (error and + 'DEPRECATION WARNING' in error and FUEL_CLIENT_CONFIG in error): + log('Delete deprecated fuel client config %s' % FUEL_CLIENT_CONFIG) + with self.ssh as s: + s.exec_cmd('rm %s' % FUEL_CLIENT_CONFIG, False) diff --git a/deploy/reap.py b/deploy/reap.py new file mode 100644 index 000000000..69c98d10c --- /dev/null +++ b/deploy/reap.py @@ -0,0 +1,413 @@ +#!/usr/bin/python +############################################################################### +# Copyright (c) 2015, 2016 Ericsson AB and others. +# szilard.cserey@ericsson.com +# peter.barabas@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import time +import os +import yaml +import glob +import shutil +import tempfile +import re +import netaddr +import templater + +from common import ( + N, + E, + R, + ArgParser, + exec_cmd, + parse, + err, + log, + delete, + commafy, +) + +DEA_1 = ''' +title: Deployment Environment Adapter (DEA) +# DEA API version supported +version: 1.1 +created: {date} +comment: {comment} +''' + +DHA_1 = ''' +title: Deployment Hardware Adapter (DHA) +# DHA API version supported +version: 1.1 +created: {date} +comment: {comment} + +# Adapter to use for this definition +# adapter: [ipmi|libvirt] +adapter: + +# Node list. +# Mandatory properties are id and role. +# All other properties are adapter specific. +# For Non-Fuel nodes controlled by: +# - ipmi adapter you need to provide: +# pxeMac +# ipmiIp +# ipmiUser +# ipmiPass +# and you *MAY* provide (optional, not added by reap.py): +# ipmiPort +# - libvirt adapter you need to provide: +# libvirtName: +# libvirtTemplate: [libvirt/vms/controller.xml | libvirt/vms/compute.xml] +# +# For the Fuel Node you need to provide: +# libvirtName: +# libvirtTemplate: libvirt/vms/fuel.xml +# isFuel: yes +# username: root +# password: r00tme +''' + +DHA_2 = ''' +# Adding the Fuel node as node id {node_id} +# which may not be correct - please adjust as needed. +''' + +DISKS = {'fuel': '100G', + 'controller': '100G', + 'compute': '100G'} + + +class Reap(object): + + def __init__(self, dea_file, dha_file, comment, base_dea, template): + self.dea_file = dea_file + self.dha_file = dha_file + self.comment = comment + self.base_dea = base_dea + self.template = template + self.temp_dir = None + self.env = None + self.env_id = None + self.last_node = None + + def get_env(self): + env_list = parse(exec_cmd('fuel env')) + if len(env_list) == 0: + err('No environment deployed') + elif len(env_list) > 1: + err('More than 1 environment deployed') + self.env = env_list[0] + self.env_id = self.env[E['id']] + + def download_config(self, config_type): + log('Download %s config for environment %s' + % (config_type, self.env_id)) + exec_cmd('fuel %s --env %s --download --dir %s' + % (config_type, self.env_id, self.temp_dir)) + + def download_node_config(self, nodeid): + log('Download node %s config for environment %s to %s' + % (nodeid, self.env_id,self.temp_dir)) + exec_cmd('fuel deployment --node-id %s --env %s --default --dir %s' + % (nodeid, self.env_id, self.temp_dir)) + + def write(self, file, text, newline=True): + mode = 'a' if os.path.isfile(file) else 'w' + with open(file, mode) as f: + f.write('%s%s' % (text, ('\n' if newline else ''))) + + def write_yaml(self, file, data, newline=True): + self.write(file, yaml.dump(data, default_flow_style=False).strip(), + newline) + + def get_node_by_id(self, node_list, node_id): + for node in node_list: + if node[N['id']] == node_id: + return node + + def reap_interface(self, node_id, interfaces): + interface, mac = self.get_interface(node_id) + if_name = None + if interfaces: + if_name = self.check_dict_exists(interfaces, interface) + if not if_name: + if_name = 'interfaces_%s' % str(len(interfaces) + 1) + interfaces[if_name] = interface + return if_name, mac + + def reap_transformation(self, node_id, roles, transformations): + main_role = 'controller' if 'controller' in roles else 'compute' + node_file = glob.glob('%s/deployment_%s/%s.yaml' + % (self.temp_dir, self.env_id, node_id)) + tr_name = None + with open(node_file[0]) as f: + node_config = yaml.load(f) + transformation = {'transformations': + node_config['network_scheme']['transformations']} + if transformations: + tr_name = self.check_dict_exists(transformations, transformation) + if not tr_name: + tr_name = 'transformations_%s' % str(len(transformations) + 1) + transformations[tr_name] = transformation + return tr_name + + def check_dict_exists(self, main_dict, dict): + for key, val in main_dict.iteritems(): + if cmp(dict, val) == 0: + return key + + def reap_nodes_interfaces_transformations(self): + node_list = parse(exec_cmd('fuel node')) + real_node_ids = [node[N['id']] for node in node_list] + real_node_ids.sort() + min_node = real_node_ids[0] + interfaces = {} + transformations = {} + dea_nodes = [] + dha_nodes = [] + + for real_node_id in real_node_ids: + node_id = int(real_node_id) - int(min_node) + 1 + self.last_node = node_id + node = self.get_node_by_id(node_list, real_node_id) + roles = commafy(node[N['roles']]) + if not roles: + err('Fuel Node %s has no role' % real_node_id) + dea_node = {'id': node_id, + 'role': roles} + dha_node = {'id': node_id} + if_name, mac = self.reap_interface(real_node_id, interfaces) + log('reap transformation for node %s' % real_node_id) + tr_name = self.reap_transformation(real_node_id, roles, + transformations) + dea_node.update( + {'interfaces': if_name, + 'transformations': tr_name}) + + dha_node.update( + {'pxeMac': mac if mac else None, + 'ipmiIp': None, + 'ipmiUser': None, + 'ipmiPass': None, + 'libvirtName': None, + 'libvirtTemplate': None}) + + dea_nodes.append(dea_node) + dha_nodes.append(dha_node) + + self.write_yaml(self.dha_file, {'nodes': dha_nodes}, False) + self.write_yaml(self.dea_file, {'nodes': dea_nodes}) + self.write_yaml(self.dea_file, interfaces) + self.write_yaml(self.dea_file, transformations) + self.reap_fuel_node_info() + self.write_yaml(self.dha_file, {'disks': DISKS}) + + def reap_fuel_node_info(self): + dha_nodes = [] + dha_node = { + 'id': self.last_node + 1, + 'libvirtName': None, + 'libvirtTemplate': None, + 'isFuel': True, + 'username': 'root', + 'password': 'r00tme'} + + dha_nodes.append(dha_node) + + self.write(self.dha_file, DHA_2.format(node_id=dha_node['id']), False) + self.write_yaml(self.dha_file, dha_nodes) + + def reap_environment_info(self): + network_file = ('%s/network_%s.yaml' + % (self.temp_dir, self.env_id)) + network = self.read_yaml(network_file) + + env = {'environment': + {'name': self.env[E['name']], + 'net_segment_type': + network['networking_parameters']['segmentation_type']}} + self.write_yaml(self.dea_file, env) + wanted_release = None + rel_list = parse(exec_cmd('fuel release')) + for rel in rel_list: + if rel[R['id']] == self.env[E['release_id']]: + wanted_release = rel[R['name']] + self.write_yaml(self.dea_file, {'wanted_release': wanted_release}) + + def reap_fuel_settings(self): + data = self.read_yaml('/etc/fuel/astute.yaml') + fuel = {} + del data['ADMIN_NETWORK']['mac'] + del data['ADMIN_NETWORK']['interface'] + for key in ['ADMIN_NETWORK', 'HOSTNAME', 'DNS_DOMAIN', 'DNS_SEARCH', + 'DNS_UPSTREAM', 'NTP1', 'NTP2', 'NTP3', 'FUEL_ACCESS']: + fuel[key] = data[key] + for key in fuel['ADMIN_NETWORK'].keys(): + if key not in ['ipaddress', 'netmask', + 'dhcp_pool_start', 'dhcp_pool_end', 'ssh_network']: + del fuel['ADMIN_NETWORK'][key] + + ## FIXME(armband): Factor in support for adding public/other interfaces. + ## TODO: Following block expects interface name(s) to be lowercase only + interfaces_list = exec_cmd('ip -o -4 a | grep -e "e[nt][hopsx].*"') + for interface in re.split('\n', interfaces_list): + # Sample output line from above cmd: + # 3: eth1 inet 10.0.2.10/24 scope global eth1 valid_lft forever ... + ifcfg = re.split(r'\s+', interface) + ifcfg_name = ifcfg[1] + ifcfg_ipaddr = ifcfg[3] + + # Filter out admin interface (device name is not known, match IP) + current_network = netaddr.IPNetwork(ifcfg_ipaddr) + if str(current_network.ip) == fuel['ADMIN_NETWORK']['ipaddress']: + continue + + # Read ifcfg-* network interface config file, write IFCFG_ + ifcfg_sec = 'IFCFG_%s' % ifcfg_name.upper() + fuel[ifcfg_sec] = {} + ifcfg_data = {} + ifcfg_f = ('/etc/sysconfig/network-scripts/ifcfg-%s' % ifcfg_name) + with open(ifcfg_f) as f: + for line in f: + if line.startswith('#'): + continue + (key, val) = line.split('=') + ifcfg_data[key.lower()] = val.rstrip() + + # Keep only needed info (e.g. filter-out type=Ethernet). + fuel[ifcfg_sec]['ipaddress'] = ifcfg_data['ipaddr'] + fuel[ifcfg_sec]['device'] = ifcfg_data['device'] + fuel[ifcfg_sec]['netmask'] = str(current_network.netmask) + fuel[ifcfg_sec]['gateway'] = ifcfg_data['gateway'] + + self.write_yaml(self.dea_file, {'fuel': fuel}) + + def reap_network_settings(self): + network_file = ('%s/network_%s.yaml' + % (self.temp_dir, self.env_id)) + data = self.read_yaml(network_file) + network = {} + network['networking_parameters'] = data['networking_parameters'] + network['networks'] = data['networks'] + for net in network['networks']: + del net['id'] + del net['group_id'] + self.write_yaml(self.dea_file, {'network': network}) + + def reap_settings(self): + settings_file = '%s/settings_%s.yaml' % (self.temp_dir, self.env_id) + settings = self.read_yaml(settings_file) + self.write_yaml(self.dea_file, {'settings': settings}) + + def get_interface(self, real_node_id): + exec_cmd('fuel node --node-id %s --network --download --dir %s' + % (real_node_id, self.temp_dir)) + interface_file = ('%s/node_%s/interfaces.yaml' + % (self.temp_dir, real_node_id)) + interfaces = self.read_yaml(interface_file) + interface_config = {} + pxe_mac = None + for interface in interfaces: + networks = [] + for network in interface['assigned_networks']: + networks.append(network['name']) + if network['name'] == 'fuelweb_admin': + pxe_mac = interface['mac'] + if networks: + interface_config[interface['name']] = networks + return interface_config, pxe_mac + + def read_yaml(self, yaml_file): + with open(yaml_file) as f: + data = yaml.load(f) + return data + + def intro(self): + delete(self.dea_file) + delete(self.dha_file) + + self.temp_dir = tempfile.mkdtemp() + date = time.strftime('%c') + self.write(self.dea_file, + DEA_1.format(date=date, comment=self.comment), False) + self.write(self.dha_file, + DHA_1.format(date=date, comment=self.comment)) + self.get_env() + + # Need to download deployment with explicit node ids + node_list = parse(exec_cmd('fuel node')) + real_node_ids = [node[N['id']] for node in node_list] + real_node_ids.sort() + self.download_node_config(','.join(real_node_ids)) + + self.download_config('settings') + self.download_config('network') + + def create_base_dea(self): + templater = templater.Templater(self.dea_file, + self.template, + self.base_dea) + templater.run() + + def finale(self): + log('DEA file is available at %s' % self.dea_file) + log('DHA file is available at %s (this is just a template)' + % self.dha_file) + if self.base_dea: + log('DEA base file is available at %s' % self.base_dea) + shutil.rmtree(self.temp_dir) + + def reap(self): + self.intro() + self.reap_environment_info() + self.reap_nodes_interfaces_transformations() + self.reap_fuel_settings() + self.reap_network_settings() + self.reap_settings() + if self.base_dea: + self.create_base_dea() + self.finale() + + +def parse_arguments(): + parser = ArgParser(prog='python %s' % __file__) + parser.add_argument('dea_file', nargs='?', action='store', + default='dea.yaml', + help='Deployment Environment Adapter: dea.yaml') + parser.add_argument('dha_file', nargs='?', action='store', + default='dha.yaml', + help='Deployment Hardware Adapter: dha.yaml') + parser.add_argument('comment', nargs='?', action='store', help='Comment') + parser.add_argument('-base_dea', + dest='base_dea', + help='Create specified base DEA file from "dea_file"') + parser.add_argument('-template', + dest='template', + nargs='?', + default='base_dea_template.yaml', + help='Base DEA is generated from this template') + args = parser.parse_args() + return (args.dea_file, + args.dha_file, + args.comment, + args.base_dea, + args.template) + + +def main(): + dea_file, dha_file, comment, base_dea, template = parse_arguments() + + r = Reap(dea_file, dha_file, comment, base_dea, template) + r.reap() + + +if __name__ == '__main__': + main() diff --git a/deploy/scenario/README b/deploy/scenario/README new file mode 100644 index 000000000..e32262d0d --- /dev/null +++ b/deploy/scenario/README @@ -0,0 +1,159 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +Abstract: +--------- +The directory contains configuration files for different OPNFV deployment +feature scenarios used by Fuel@OPNFV, eg.: +- High availability configuration +- Type of SDN controller to be deployed +- OPNFV collaboration project features to be deployed. +- Provisioning of any other sevices + +Creating a new plugin +--------------------- +Creating a new plugin involves creating a plugin config yaml file in +/deploy/config/plugins. The filename should comply to following structure: +fuel-.yaml. +The plugin configuration must include plugin configuration metadata as below: + +plugin-config-metadata: + title: + version: + created: + comment: + +Moreover, naturaly the plugin configuration must include the plugin yaml +fragment, eg: + +opendaylight: + metadata: + enabled: true + label: OpenDaylight Lithium plugin +....... + +Creating a new deployment scenario +---------------------------------- +Creating a new deployment scenario involve creating a deployment scenario +yaml file under deploy/scenario/. The filename should comply to following +format: ___..._.yaml + +The deployment configuration file must contain configuration metadata as stated +below: + +deployment-scenario-metadata: + title: + version: + created: + comment: + +To include fuel plugins, use the stack-extentions key: +stack-extensions, eg: + +stack-extensions: + - module: opendaylight + module-config-name: fuel-odl + module-config-version: 0.0.1 + module-config-override: + # Module config overrides + rest_api_port: + value: '8282' + enable_gbp: + value: false + enable_l3_odl: + value: true + enable_sfc: + value: false + +"module-config-name" and "module-config-version" must correspond to how +the plugin configuration yaml was named. +Everything under the "module-config-override" overrides the corresponding +keys in the plugin config yaml file, this can for instance be used to configure +the plugin. + +Everything under the "dea-override-config" overrides corresponding keys in the dea_base.yaml and dea_pod_override.yaml. +You must at least provide {environment:{mode:'value},{net_segment_type:'value'} +and {nodes:....} in order to configure the HA mode, network segmentation types +and role to node assignments. +Other ovverides may also be used to enable stack features such as ceph, heat, +etc. +Example: + +dea-override-config: + environment: + mode: ha + net_segment_type: tun + nodes: + - id: 1 + interfaces: interfaces_1 + role: mongo,controller,opendaylight + - id: 2 + interfaces: interfaces_1 + role: mongo,controller + - id: 3 + interfaces: interfaces_1 + role: mongo,controller + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 5 + interfaces: interfaces_1 + role: ceph-osd,compute + + settings: + editable: + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: true + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + storage: + ephemeral_ceph: + description: Configures Nova to store ephemeral volumes in RBD. This works + best if Ceph is enabled for volumes and images, too. Enables live migration + of all types of Ceph backed VMs (without this option, live migration will + only work with VMs launched from Cinder volumes). + label: Ceph RBD for ephemeral volumes (Nova) + type: checkbox + value: true + weight: 75 + images_ceph: + description: Configures Glance to use the Ceph RBD backend to store images. + If enabled, this option will prevent Swift from installing. + label: Ceph RBD for images (Glance) + restrictions: + - settings:storage.images_vcenter.value == true: Only one Glance backend could + be selected. + type: checkbox + value: true + weight: 30 + +Optionally you may override the pod dha defenition under the +"dha-override-config" key. + +Short names +----------- +scenario.yaml provides a mapping between a deployment scenario short-name +and one or several deployment scenario configuration yaml files. + +Other +----- +These configuration files are used by deploy.sh provided by Fuel@OPNFV, e.g. +deploy.sh will clone this repo when deploying. diff --git a/deploy/scenario/ha_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..4051c478a --- /dev/null +++ b/deploy/scenario/ha_heat_ceilometer_scenario.yaml @@ -0,0 +1,86 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: OpenStack-only, HA deployment + version: 0.0.3 + created: Jan 26 2016 + comment: Rebased to Fuel8 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + nodes: + - id: 1 + interfaces: interfaces_1 + role: controller + - id: 2 + interfaces: interfaces_1 + role: mongo, controller + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,controller + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 5 + interfaces: interfaces_1 + role: ceph-osd,compute + +dha-override-config: + nodes: + - id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 2 + libvirtName: controller2 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 3 + libvirtName: controller3 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 4 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 5 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 6 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/ha_nfv-kvm_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_nfv-kvm_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..1217f7273 --- /dev/null +++ b/deploy/scenario/ha_nfv-kvm_heat_ceilometer_scenario.yaml @@ -0,0 +1,173 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: NFV KVM HA deployment + version: 0.0.6 + created: 27.07.2016 + comment: Ceph cannot be assigned to compute, ceph is collocated with one of the controllers + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: fuel-plugin-kvm + module-config-name: fuel-nfvkvm + module-config-version: 0.9.0 + module-config-override: + # Module config overrides + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + nodes: + - id: 1 + interfaces: interfaces_1 + role: controller,mongo + - id: 2 + interfaces: interfaces_1 + role: controller + - id: 3 + interfaces: interfaces_1 + role: controller + - id: 4 + interfaces: interfaces_1 + role: compute,ceph-osd + - id: 5 + interfaces: interfaces_1 + role: compute,ceph-osd + + settings: + editable: + storage: + ephemeral_ceph: + description: Configures Nova to store ephemeral volumes in RBD. This works best if Ceph is enabled for volumes and images, too. Enables live migration of all types of Ceph backed VMs (without this option, live migration will only work with VMs launched from Cinder volumes). + label: Ceph RBD for ephemeral volumes (Nova) + type: checkbox + value: false + weight: 75 + images_ceph: + description: Configures Glance to use the Ceph RBD backend to store images. If enabled, this option will prevent Swift from installing. + label: Ceph RBD for images (Glance) + restrictions: + - settings:storage.images_vcenter.value == true: Only one Glance backend could be selected. + type: checkbox + value: false + weight: 30 + images_vcenter: + description: Configures Glance to use the vCenter/ESXi backend to store images. If enabled, this option will prevent Swift from installing. + label: VMware vCenter/ESXi datastore for images (Glance) + restrictions: + - action: hide + condition: settings:common.use_vcenter.value != true + - condition: settings:storage.images_ceph.value == true + message: Only one Glance backend could be selected. + type: checkbox + value: false + weight: 35 + iser: + description: 'High performance block storage: Cinder volumes over iSER protocol (iSCSI over RDMA). This feature requires SR-IOV capabilities in the NIC, and will use a dedicated virtual function for the storage network.' + label: iSER protocol for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value != true or settings:common.libvirt_type.value != 'kvm' + - action: hide + condition: not ('experimental' in version:feature_groups) + type: checkbox + value: false + weight: 11 + metadata: + group: storage + label: Storage Backends + weight: 60 + objects_ceph: + description: Configures RadosGW front end for Ceph RBD. This exposes S3 and Swift API Interfaces. If enabled, this option will prevent Swift from installing. + label: Ceph RadosGW for objects (Swift API) + type: checkbox + value: false + weight: 80 + osd_pool_size: + description: Configures the default number of object replicas in Ceph. This number must be equal to or lower than the number of deployed 'Storage - Ceph OSD' nodes. + label: Ceph object replication factor + regex: + error: Invalid number + source: ^[1-9]\d*$ + type: text + value: '2' + weight: 85 + volumes_block_device: + description: High performance block device storage. It is recommended to have at least one Storage - Cinder Block Device + label: Cinder Block device driver + restrictions: + - settings:storage.volumes_ceph.value == true + type: checkbox + value: false + weight: 15 + volumes_ceph: + description: Configures Cinder to store volumes in Ceph RBD images. + label: Ceph RBD for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value == true or settings:storage.volumes_block_device.value == true + type: checkbox + value: true + weight: 20 + volumes_lvm: + description: It is recommended to have at least one Storage - Cinder LVM node. + label: Cinder LVM over iSCSI for volumes + restrictions: + - settings:storage.volumes_ceph.value == true + type: checkbox + value: false + weight: 10 + +dha-override-config: + nodes: + - id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 2 + libvirtName: controller2 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 3 + libvirtName: controller3 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 4 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 5 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 6 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/ha_nfv-ovs_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_nfv-ovs_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..51deb4e28 --- /dev/null +++ b/deploy/scenario/ha_nfv-ovs_heat_ceilometer_scenario.yaml @@ -0,0 +1,134 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: NFV OVS HA deployment + version: 0.9.0 + created: Jul 12 2016 + comment: Rebased to Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: fuel-plugin-ovs + module-config-name: fuel-nshovs + module-config-version: 0.9.0 + module-config-override: + metadata: + versions: + - install_dpdk: + value: true + metadata: + plugin_version: 0.9.0 + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + fuel: + FEATURE_GROUPS: + - experimental + environment: + net_segment_type: vlan + nodes: + - id: 1 + interfaces: interfaces_vlan + role: controller + - id: 2 + interfaces: interfaces_vlan + role: mongo,controller + - id: 3 + interfaces: interfaces_vlan + role: ceph-osd,controller + - id: 4 + interfaces: interfaces_dpdk + role: ceph-osd,compute + attributes: attributes_1 + - id: 5 + interfaces: interfaces_dpdk + role: ceph-osd,compute + attributes: attributes_1 + + attributes_1: + hugepages: + dpdk: + value: 128 + nova: + value: + '2048': 1024 + + network: + networking_parameters: + segmentation_type: vlan + vlan_range: + - 1000 + - 1030 + networks: + - cidr: null + gateway: null + ip_ranges: [] + meta: + configurable: false + map_priority: 2 + name: private + neutron_vlan_range: true + notation: null + render_addr_mask: null + render_type: null + seg_type: vlan + use_gateway: false + vlan_start: null + name: private + vlan_start: null + +dha-override-config: + nodes: + - id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 2 + libvirtName: controller2 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 3 + libvirtName: controller3 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 4 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 5 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 6 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/ha_odl-bgpvpn_scenario.yaml b/deploy/scenario/ha_odl-bgpvpn_scenario.yaml new file mode 100644 index 000000000..7d52e77e2 --- /dev/null +++ b/deploy/scenario/ha_odl-bgpvpn_scenario.yaml @@ -0,0 +1,104 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ODL HA BGPVPN deployment + version: 0.9.0 + created: 29.06.2016 + comment: Fuel ODL HA with BGPVPN, Ceph, Ceilometer and Heat Rebased for Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: opendaylight + module-config-name: fuel-odl + module-config-version: 0.9.0 + module-config-override: + metadata: + versions: + - enable_bgpvpn: + value: true + metadata: + plugin_version: 0.9.0 + + - module: bgpvpn + module-config-name: fuel-bgpvpn + module-config-version: 0.9.0 + + - module: fuel-plugin-ovs + module-config-name: fuel-nshovs + module-config-version: 0.9.0 + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + nodes: + - id: 1 + interfaces: interfaces_1 + role: controller,opendaylight + - id: 2 + interfaces: interfaces_1 + role: mongo,controller + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,controller + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 5 + interfaces: interfaces_1 + role: ceph-osd,compute + + +dha-override-config: + nodes: + - id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 2 + libvirtName: controller2 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 3 + libvirtName: controller3 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 4 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 5 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 6 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/ha_odl-l2_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_odl-l2_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..90c89aedc --- /dev/null +++ b/deploy/scenario/ha_odl-l2_heat_ceilometer_scenario.yaml @@ -0,0 +1,104 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ODL-L2 HA deployment + version: 0.0.4 + created: Jun 02 2016 + comment: Rebased to Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: opendaylight + module-config-name: fuel-odl + module-config-version: 0.9.0 + module-config-override: +# Note that the module substitionion does not support arrays +# This is a quick fix +# - module: opendaylight +# module-config-name: fuel-odl +# module-config-version: 0.0.2 +# module-config-override: + # Module config overrides +# rest_api_port: +# value: '8282' +# enable_gbp: +# value: false +# enable_l3_odl: +# value: false +# enable_sfc: +# value: false + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + nodes: + - id: 1 + interfaces: interfaces_1 + role: controller,opendaylight + - id: 2 + interfaces: interfaces_1 + role: mongo,controller + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,controller + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 5 + interfaces: interfaces_1 + role: ceph-osd,compute + +dha-override-config: + nodes: + - id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 2 + libvirtName: controller2 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 3 + libvirtName: controller3 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 4 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 5 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 6 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/ha_odl-l2_sfc_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_odl-l2_sfc_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..e6aef2aba --- /dev/null +++ b/deploy/scenario/ha_odl-l2_sfc_heat_ceilometer_scenario.yaml @@ -0,0 +1,119 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ODL-L2 SFC HA deployment + version: 0.0.1 + created: Feb 10 2016 + comment: Rebased to Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: fuel-plugin-ovs + module-config-name: fuel-nshovs + module-config-version: 0.9.0 + module-config-override: + metadata: + versions: + - install_nsh: + value: true + metadata: + plugin_version: 0.9.0 + - module: opendaylight + module-config-name: fuel-odl + module-config-version: 0.9.0 + module-config-override: + metadata: + versions: + - enable_sfc: + value: true + metadata: + plugin_version: 0.9.0 +# Note that the module substitionion does not support arrays +# This is a quick fix +# - module: opendaylight +# module-config-name: fuel-odl +# module-config-version: 0.0.2 +# module-config-override: + # Module config overrides +# rest_api_port: +# value: '8282' +# enable_gbp: +# value: false +# enable_l3_odl: +# value: false +# enable_sfc: +# value: false + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + nodes: + - id: 1 + interfaces: interfaces_1 + role: controller,opendaylight + - id: 2 + interfaces: interfaces_1 + role: mongo,controller + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,controller + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 5 + interfaces: interfaces_1 + role: ceph-osd,compute +dha-override-config: + nodes: + - id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 2 + libvirtName: controller2 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 3 + libvirtName: controller3 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 4 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 5 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 6 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/ha_odl-l3_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_odl-l3_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..967e7d295 --- /dev/null +++ b/deploy/scenario/ha_odl-l3_heat_ceilometer_scenario.yaml @@ -0,0 +1,120 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ODL-L3 HA deployment + version: 0.0.5 + created: Jun 02 2016 + comment: Rebased to Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +# Note that the module substitionion does not support arrays +# This is a quick fix +stack-extensions: + - module: opendaylight + module-config-name: fuel-odl + module-config-version: 0.9.0 + module-config-override: + metadata: + versions: + - enable_l3_odl: + value: true + metadata: + plugin_version: 0.9.0 + + - module: fuel-plugin-ovs + module-config-name: fuel-nshovs + module-config-version: 0.9.0 + +# - module: opendaylight +# module-config-name: fuel-odl +# module-config-version: 0.0.2 +# module-config-override: +# # Module config overrides +# rest_api_port: +# value: '8282' +# enable_gbp: +# value: false +# enable_l3_odl: +# value: true +# enable_sfc: +# value: false + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + nodes: + - id: 1 + interfaces: interfaces_1 + role: controller,opendaylight + - id: 2 + interfaces: interfaces_1 + role: mongo,controller + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,controller + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 5 + interfaces: interfaces_1 + role: ceph-osd,compute + settings: + editable: + public_network_assignment: + assign_to_all_nodes: + value: true + +dha-override-config: + nodes: + - id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 2 + libvirtName: controller2 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 3 + libvirtName: controller3 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 4 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 5 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 6 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/ha_onos_nofeature_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_onos_nofeature_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..f813458d0 --- /dev/null +++ b/deploy/scenario/ha_onos_nofeature_heat_ceilometer_scenario.yaml @@ -0,0 +1,115 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ONOS HA deployment + version: 0.0.6 + created: Jun 08 2016 + comment: Rebased to Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: onos + module-config-name: fuel-onos + module-config-version: 0.0.3 + module-config-override: + metadata: + class: plugin + default: false + enabled: true + label: onos plugin + toggleable: true + versions: + - enable_sfc: + label: SFC features + type: checkbox + value: false + weight: 13 + metadata: + hot_pluggable: false + plugin_version: 0.9.0 + restrictions: + - cluster:net_provider != 'neutron': Neutron only + - settings:public_network_assignment.assign_to_all_nodes.value == false: Assign + public network to all nodes + weight: 70 + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + environment: + net_segment_type: tun + nodes: + - id: 1 + interfaces: interfaces_1 + role: controller,onos + - id: 2 + interfaces: interfaces_1 + role: mongo,controller + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,controller + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 5 + interfaces: interfaces_1 + role: ceph-osd,compute + settings: + editable: + public_network_assignment: + assign_to_all_nodes: + value: true +dha-override-config: + nodes: + - id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 2 + libvirtName: controller2 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 3 + libvirtName: controller3 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 4 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 5 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 6 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/ha_onos_sfc_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_onos_sfc_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..32fbfcf6c --- /dev/null +++ b/deploy/scenario/ha_onos_sfc_heat_ceilometer_scenario.yaml @@ -0,0 +1,95 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ONOS HA deployment + version: 0.0.6 + created: Jun 08 2016 + comment: Rebased to Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: onos + module-config-name: fuel-onos + module-config-version: 0.0.3 + module-config-override: + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + environment: + net_segment_type: tun + nodes: + - id: 1 + interfaces: interfaces_1 + role: controller,onos + - id: 2 + interfaces: interfaces_1 + role: mongo,controller + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,controller + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 5 + interfaces: interfaces_1 + role: ceph-osd,compute + settings: + editable: + public_network_assignment: + assign_to_all_nodes: + value: true +dha-override-config: + nodes: + - id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 2 + libvirtName: controller2 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 3 + libvirtName: controller3 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 4 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 5 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 6 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/ha_vlan_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_vlan_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..d1d5191f0 --- /dev/null +++ b/deploy/scenario/ha_vlan_heat_ceilometer_scenario.yaml @@ -0,0 +1,129 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: OpenStack-only, HA deployment with VLAN segmentation + version: 0.0.2 + created: Jan 19 2016 + comment: Rebased to Fuel8 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + environment: + mode: ha + net_segment_type: vlan + name: opnfv-vlan-noha + nodes: + - id: 1 + interfaces: interfaces_1 + role: controller + - id: 2 + interfaces: interfaces_1 + role: mongo,controller + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,controller + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 5 + interfaces: interfaces_1 + role: ceph-osd,compute + + settings: + editable: + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: true + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + storage: + ephemeral_ceph: + description: Configures Nova to store ephemeral volumes in RBD. This works + best if Ceph is enabled for volumes and images, too. Enables live migration + of all types of Ceph backed VMs (without this option, live migration will + only work with VMs launched from Cinder volumes). + label: Ceph RBD for ephemeral volumes (Nova) + type: checkbox + value: true + weight: 75 + images_ceph: + description: Configures Glance to use the Ceph RBD backend to store images. + If enabled, this option will prevent Swift from installing. + label: Ceph RBD for images (Glance) + restrictions: + - settings:storage.images_vcenter.value == true: Only one Glance backend could + be selected. + type: checkbox + value: true + weight: 30 + +dha-override-config: +# These overrides only take effect for virtual deployment scenarios + nodes: + - id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 2 + libvirtName: controller2 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 3 + libvirtName: controller3 + libvirtTemplate: templates/virtual_environment/vms/controller.xml + - id: 4 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 5 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml + - id: 6 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/no-ha_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..3dd5f841e --- /dev/null +++ b/deploy/scenario/no-ha_heat_ceilometer_scenario.yaml @@ -0,0 +1,62 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: OpenStack-only, No-HA deployment + version: 0.0.2 + created: Jan 26 2016 + comment: Fuel OpenStack-only with Ceph, Ceilometer and Heat, No-HA deployment rebased with Fuel8 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + nodes: + - id: 1 + interfaces: interfaces_1 + role: mongo,controller + - id: 2 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + +dha-override-config: +# disks: +# contrail: 500G + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/no-ha_nfv-kvm_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_nfv-kvm_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..4661a263d --- /dev/null +++ b/deploy/scenario/no-ha_nfv-kvm_heat_ceilometer_scenario.yaml @@ -0,0 +1,151 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: NFV KVM NO-HA deployment + version: 0.0.5 + created: Aug 03 2016 + comment: Ceph cannot be assigned to compute, using a seperate node for it + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: fuel-plugin-kvm + module-config-name: fuel-nfvkvm + module-config-version: 0.9.0 + module-config-override: + # Module config overrides + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + environment: + net_segment_type: tun + nodes: + - id: 1 + interfaces: interfaces_1 + role: mongo,controller + - id: 2 + interfaces: interfaces_1 + role: ceph-osd + - id: 3 + interfaces: interfaces_1 + role: compute + - id: 4 + interfaces: interfaces_1 + role: compute + + settings: + editable: + storage: + ephemeral_ceph: + description: Configures Nova to store ephemeral volumes in RBD. This works best if Ceph is enabled for volumes and images, too. Enables live migration of all types of Ceph backed VMs (without this option, live migration will only work with VMs launched from Cinder volumes). + label: Ceph RBD for ephemeral volumes (Nova) + type: checkbox + value: false + weight: 75 + images_ceph: + description: Configures Glance to use the Ceph RBD backend to store images. If enabled, this option will prevent Swift from installing. + label: Ceph RBD for images (Glance) + restrictions: + - settings:storage.images_vcenter.value == true: Only one Glance backend could be selected. + type: checkbox + value: false + weight: 30 + images_vcenter: + description: Configures Glance to use the vCenter/ESXi backend to store images. If enabled, this option will prevent Swift from installing. + label: VMware vCenter/ESXi datastore for images (Glance) + restrictions: + - action: hide + condition: settings:common.use_vcenter.value != true + - condition: settings:storage.images_ceph.value == true + message: Only one Glance backend could be selected. + type: checkbox + value: false + weight: 35 + iser: + description: 'High performance block storage: Cinder volumes over iSER protocol (iSCSI over RDMA). This feature requires SR-IOV capabilities in the NIC, and will use a dedicated virtual function for the storage network.' + label: iSER protocol for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value != true or settings:common.libvirt_type.value != 'kvm' + - action: hide + condition: not ('experimental' in version:feature_groups) + type: checkbox + value: false + weight: 11 + metadata: + group: storage + label: Storage Backends + weight: 60 + objects_ceph: + description: Configures RadosGW front end for Ceph RBD. This exposes S3 and Swift API Interfaces. If enabled, this option will prevent Swift from installing. + label: Ceph RadosGW for objects (Swift API) + type: checkbox + value: false + weight: 80 + osd_pool_size: + description: Configures the default number of object replicas in Ceph. This number must be equal to or lower than the number of deployed 'Storage - Ceph OSD' nodes. + label: Ceph object replication factor + regex: + error: Invalid number + source: ^[1-9]\d*$ + type: text + value: '1' + weight: 85 + volumes_block_device: + description: High performance block device storage. It is recommended to have at least one Storage - Cinder Block Device + label: Cinder Block device driver + restrictions: + - settings:storage.volumes_ceph.value == true + type: checkbox + value: false + weight: 15 + volumes_ceph: + description: Configures Cinder to store volumes in Ceph RBD images. + label: Ceph RBD for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value == true or settings:storage.volumes_block_device.value == true + type: checkbox + value: true + weight: 20 + volumes_lvm: + description: It is recommended to have at least one Storage - Cinder LVM node. + label: Cinder LVM over iSCSI for volumes + restrictions: + - settings:storage.volumes_ceph.value == true + type: checkbox + value: false + weight: 10 + +dha-override-config: +# disks: +# contrail: 500G + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/no-ha_nfv-kvm_nfv-ovs_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_nfv-kvm_nfv-ovs_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..87364e83a --- /dev/null +++ b/deploy/scenario/no-ha_nfv-kvm_nfv-ovs_heat_ceilometer_scenario.yaml @@ -0,0 +1,114 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: NFV KVM and OVS No-HA deployment + version: 0.0.1 + created: Jan 6 2016 + comment: NFV KVM and OVS + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: fuel-plugin-qemu + module-config-name: fuel-nfvkvm + module-config-version: 0.0.1 + module-config-override: + # Module config overrides + + - module: fuel-plugin-ovsnfv + module-config-name: fuel-nfvovs + module-config-version: 0.0.1 + module-config-override: + # Module config overrides + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + environment: + mode: ha + net_segment_type: tun + nodes: + - id: 1 + interfaces: interfaces_1 + role: mongo,controller + - id: 2 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + settings: + editable: + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: true + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + storage: + ephemeral_ceph: + description: Configures Nova to store ephemeral volumes in RBD. This works + best if Ceph is enabled for volumes and images, too. Enables live migration + of all types of Ceph backed VMs (without this option, live migration will + only work with VMs launched from Cinder volumes). + label: Ceph RBD for ephemeral volumes (Nova) + type: checkbox + value: true + weight: 75 + images_ceph: + description: Configures Glance to use the Ceph RBD backend to store images. + If enabled, this option will prevent Swift from installing. + label: Ceph RBD for images (Glance) + restrictions: + - settings:storage.images_vcenter.value == true: Only one Glance backend could + be selected. + type: checkbox + value: true + weight: 30 + +dha-override-config: +# disks: +# contrail: 500G + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/no-ha_nfv-ovs_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_nfv-ovs_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..7ab76cbcf --- /dev/null +++ b/deploy/scenario/no-ha_nfv-ovs_heat_ceilometer_scenario.yaml @@ -0,0 +1,112 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: NFV OVS NO-HA deployment + version: 0.9.0 + created: Jul 12 2016 + comment: NFV OVS NO-HA Rebased for Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: fuel-plugin-ovs + module-config-name: fuel-nshovs + module-config-version: 0.9.0 + module-config-override: + metadata: + versions: + - install_dpdk: + value: true + metadata: + plugin_version: 0.9.0 + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + fuel: + FEATURE_GROUPS: + - experimental + environment: + net_segment_type: vlan + nodes: + - id: 1 + interfaces: interfaces_vlan + role: mongo,controller + - id: 2 + interfaces: interfaces_dpdk + role: ceph-osd,compute + attributes: attributes_1 + - id: 3 + interfaces: interfaces_dpdk + role: ceph-osd,compute + attributes: attributes_1 + - id: 4 + interfaces: interfaces_dpdk + role: ceph-osd,compute + attributes: attributes_1 + + attributes_1: + hugepages: + dpdk: + value: 128 + nova: + value: + '2048': 1024 + + network: + networking_parameters: + segmentation_type: vlan + vlan_range: + - 1000 + - 1030 + networks: + - cidr: null + gateway: null + ip_ranges: [] + meta: + configurable: false + map_priority: 2 + name: private + neutron_vlan_range: true + notation: null + render_addr_mask: null + render_type: null + seg_type: vlan + use_gateway: false + vlan_start: null + name: private + vlan_start: null + +dha-override-config: +# disks: +# contrail: 500G + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/no-ha_odl-bgpvpn_scenario.yaml b/deploy/scenario/no-ha_odl-bgpvpn_scenario.yaml new file mode 100644 index 000000000..6f21ea2c8 --- /dev/null +++ b/deploy/scenario/no-ha_odl-bgpvpn_scenario.yaml @@ -0,0 +1,81 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ODL HA BGPVPN deployment + version: 0.9.0 + created: 29.06.2016 + comment: Fuel ODL No HA with BGPVPN, Ceph, Ceilometer and Heat Rebased for Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: opendaylight + module-config-name: fuel-odl + module-config-version: 0.9.0 + module-config-override: + metadata: + versions: + - enable_bgpvpn: + value: true + metadata: + plugin_version: 0.9.0 + + - module: bgpvpn + module-config-name: fuel-bgpvpn + module-config-version: 0.9.0 + + - module: fuel-plugin-ovs + module-config-name: fuel-nshovs + module-config-version: 0.9.0 + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + + nodes: + - id: 1 + interfaces: interfaces_1 + role: mongo,controller + - id: 2 + interfaces: interfaces_1 + role: ceph-osd,opendaylight + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + +dha-override-config: +# disks: +# contrail: 500G + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/no-ha_odl-l2_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_odl-l2_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..f8787d780 --- /dev/null +++ b/deploy/scenario/no-ha_odl-l2_heat_ceilometer_scenario.yaml @@ -0,0 +1,82 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ODL-L2 No-HA deployment + version: 0.0.3 + created: Jun 02 2016 + comment: Rebased to Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: opendaylight + module-config-name: fuel-odl + module-config-version: 0.9.0 + module-config-override: +# Note that the module substitionion does not support arrays +# This is a quick fix +# - module: opendaylight +# module-config-name: fuel-odl +# module-config-version: 0.0.2 +# module-config-override: +# # Module config overrides +# rest_api_port: +# value: '8282' +# enable_gbp: +# value: false +# enable_l3_odl: +# value: false +# enable_sfc: +# value: false + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + + nodes: + - id: 1 + interfaces: interfaces_1 + role: mongo,controller + - id: 2 + interfaces: interfaces_1 + role: ceph-osd,opendaylight + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + +dha-override-config: +# disks: +# contrail: 500G + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/no-ha_odl-l2_sfc_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_odl-l2_sfc_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..a8d9ed848 --- /dev/null +++ b/deploy/scenario/no-ha_odl-l2_sfc_heat_ceilometer_scenario.yaml @@ -0,0 +1,98 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ODL-L2-SFC No-HA deployment + version: 0.0.2 + created: Feb 10 2016 + comment: Fuel ODL-L2 SFC No HA with Ceph, Ceilometer and Heat Rebased for Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: fuel-plugin-ovs + module-config-name: fuel-nshovs + module-config-version: 0.9.0 + module-config-override: + metadata: + versions: + - install_nsh: + value: true + metadata: + plugin_version: 0.9.0 + - module: opendaylight + module-config-name: fuel-odl + module-config-version: 0.9.0 + module-config-override: + metadata: + versions: + - enable_sfc: + value: true + metadata: + plugin_version: 0.9.0 + +# Note that the module substitionion does not support arrays +# This is a quick fix +# - module: opendaylight +# module-config-name: fuel-odl +# module-config-version: 0.0.2 +# module-config-override: +# # Module config overrides +# rest_api_port: +# value: '8282' +# enable_gbp: +# value: false +# enable_l3_odl: +# value: false +# enable_sfc: +# value: false + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + nodes: + - id: 1 + interfaces: interfaces_1 + role: mongo,controller + - id: 2 + interfaces: interfaces_1 + role: ceph-osd,opendaylight + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + +dha-override-config: +# disks: +# contrail: 500G + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/no-ha_odl-l3_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_odl-l3_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..0c8415f78 --- /dev/null +++ b/deploy/scenario/no-ha_odl-l3_heat_ceilometer_scenario.yaml @@ -0,0 +1,97 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ODL-L3 No-HA deployment + version: 0.0.4 + created: Jun 02 2016 + comment: Rebased to Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +# Note that the module substitionion does not support arrays +# This is a quick fix +stack-extensions: + - module: opendaylight + module-config-name: fuel-odl + module-config-version: 0.9.0 + module-config-override: + metadata: + versions: + - enable_l3_odl: + value: true + metadata: + plugin_version: 0.9.0 + + - module: fuel-plugin-ovs + module-config-name: fuel-nshovs + module-config-version: 0.9.0 + +# - module: opendaylight +# module-config-name: fuel-odl +# module-config-version: 0.0.2 +# module-config-override: + # Module config overrides +# rest_api_port: +# value: '8282' +# enable_gbp: +# value: false +# enable_l3_odl: +# value: true +# enable_sfc: +# value: false + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + nodes: + - id: 1 + interfaces: interfaces_1 + role: mongo,controller + - id: 2 + interfaces: interfaces_1 + role: ceph-osd,opendaylight + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + settings: + editable: + public_network_assignment: + assign_to_all_nodes: + value: true + +dha-override-config: +# disks: +# contrail: 500G + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/no-ha_onos_nofeature_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_onos_nofeature_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..f5c00f0c9 --- /dev/null +++ b/deploy/scenario/no-ha_onos_nofeature_heat_ceilometer_scenario.yaml @@ -0,0 +1,93 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ONOS No-HA deployment + version: 0.0.5 + created: Jun 08 2016 + comment: ONOS No HA with Ceph, Ceilometer and Heat - Rebased for Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: onos + module-config-name: fuel-onos + module-config-version: 0.0.3 + module-config-override: + metadata: + class: plugin + default: false + enabled: true + label: onos plugin + toggleable: true + versions: + - enable_sfc: + label: SFC features + type: checkbox + value: false + weight: 13 + metadata: + hot_pluggable: false + plugin_version: 0.9.0 + restrictions: + - cluster:net_provider != 'neutron': Neutron only + - settings:public_network_assignment.assign_to_all_nodes.value == false: Assign + public network to all nodes + weight: 70 + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + environment: + net_segment_type: tun + name: onos_no-ha + nodes: + - id: 1 + interfaces: interfaces_1 + role: mongo,controller,onos + - id: 2 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + settings: + editable: + public_network_assignment: + assign_to_all_nodes: + value: true +dha-override-config: +# disks: +# contrail: 500G + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/no-ha_onos_sfc_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_onos_sfc_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..587346ef4 --- /dev/null +++ b/deploy/scenario/no-ha_onos_sfc_heat_ceilometer_scenario.yaml @@ -0,0 +1,73 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: ONOS No-HA deployment + version: 0.0.5 + created: Jun 08 2016 + comment: ONOS No HA with Ceph, Ceilometer and Heat - Rebased for Fuel9 + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + - module: onos + module-config-name: fuel-onos + module-config-version: 0.0.3 + module-config-override: + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + environment: + net_segment_type: tun + name: onos_no-ha + nodes: + - id: 1 + interfaces: interfaces_1 + role: mongo,controller,onos + - id: 2 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + settings: + editable: + public_network_assignment: + assign_to_all_nodes: + value: true +dha-override-config: +# disks: +# contrail: 500G + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/no-ha_vlan_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_vlan_heat_ceilometer_scenario.yaml new file mode 100644 index 000000000..567ea9867 --- /dev/null +++ b/deploy/scenario/no-ha_vlan_heat_ceilometer_scenario.yaml @@ -0,0 +1,103 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################### # Description: +# This .yaml configuration file defines the configuration of the fuel +# deployment and is passed as an argument to deploy.sh +# eg. deploy.sh -c https://artifact.opnfv.org/fuel/config +# This will make build.sh fetch this configuration file and configure the +# deployment accordingly. +# After the deployment, a copy of this file gets uploaded to fuel: +# /root/deploy-config.yaml, as well as the sha-1 sum of this file: +# /root/deploy-config.sha1 +############################################################################## + +############################################################################## +# deployment configuration meta-data +deployment-scenario-metadata: + title: OpenStack-only, No-HA deployment with VLAN segmentation + version: 0.0.1 + created: Jan 12 2016 + comment: Fuel OpenStack-only with VLAN segmentation, Ceph, Ceilometer and Heat, No-HA deployment + +############################################################################## +# Stack extentions are opnfv added value features in form of a fuel-plugin +# plug-ins listed below will be enabled and configured according to the +# /_.yaml +# It does so by copying the config file to the local plugin config directory +stack-extensions: + +############################################################################## +# By editing the override-config sections below, you can override arbitrary +# configuration name-space settings +dea-override-config: + environment: + mode: ha + net_segment_type: vlan + name: opnfv-vlan-noha + nodes: + - id: 1 + interfaces: interfaces_1 + role: mongo,controller + - id: 2 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 3 + interfaces: interfaces_1 + role: ceph-osd,compute + - id: 4 + interfaces: interfaces_1 + role: ceph-osd,compute + settings: + editable: + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: true + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + storage: + ephemeral_ceph: + description: Configures Nova to store ephemeral volumes in RBD. This works + best if Ceph is enabled for volumes and images, too. Enables live migration + of all types of Ceph backed VMs (without this option, live migration will + only work with VMs launched from Cinder volumes). + label: Ceph RBD for ephemeral volumes (Nova) + type: checkbox + value: true + weight: 75 + images_ceph: + description: Configures Glance to use the Ceph RBD backend to store images. + If enabled, this option will prevent Swift from installing. + label: Ceph RBD for images (Glance) + restrictions: + - settings:storage.images_vcenter.value == true: Only one Glance backend could + be selected. + type: checkbox + value: true + weight: 30 + +dha-override-config: +# These overrides only take effect for virtual deployment scenarios + +############################################################################## +# The verification pipeline may populate the section below with arbitrary +# testing information, which post deploy can be retreived from the fuel master: +# /root/deploy-config.yaml +test: diff --git a/deploy/scenario/scenario.yaml b/deploy/scenario/scenario.yaml new file mode 100644 index 000000000..648ff22b3 --- /dev/null +++ b/deploy/scenario/scenario.yaml @@ -0,0 +1,83 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +############################################################################## +# Description: +# This configuration file defines translation between a short deployment +# scenario name and an actual deployment scenario configuration file +# +# Short deployment scenario names are aligned between installer, test, and +# releng projects according to below pattern. +# os-[controller]-[feature]-[mode](-[optionalparameter]) +# +# Please note that the mechanism to get the details regarding the scenarios +# is different currently which needs to be aligned as well. +############################################################################## + +############################################################################## +# Short scenario name convention to be followed: +# os---[-] +# controler: nosdn|odl|onos|ocl|... +# feaure: nofeature | [vlan]_[kvm]_[ovs]_[vlan]_.... +# mode: ha|noha +############################################################################## + +os-nosdn-nofeature-ha: + configfile: ha_heat_ceilometer_scenario.yaml + +os-nosdn-nofeature-noha: + configfile: no-ha_heat_ceilometer_scenario.yaml + +os-odl_l3-nofeature-ha: + configfile: ha_odl-l3_heat_ceilometer_scenario.yaml + +os-odl_l3-nofeature-noha: + configfile: no-ha_odl-l3_heat_ceilometer_scenario.yaml + +os-odl_l2-nofeature-ha: + configfile: ha_odl-l2_heat_ceilometer_scenario.yaml + +os-odl_l2-nofeature-noha: + configfile: no-ha_odl-l2_heat_ceilometer_scenario.yaml + +os-onos-nofeature-ha: + configfile: ha_onos_nofeature_heat_ceilometer_scenario.yaml + +os-onos-nofeature-noha: + configfile: no-ha_onos_nofeature_heat_ceilometer_scenario.yaml + +os-onos-sfc-ha: + configfile: ha_onos_sfc_heat_ceilometer_scenario.yaml + +os-onos-sfc-noha: + configfile: no-ha_onos_sfc_heat_ceilometer_scenario.yaml + +os-nosdn-kvm-ha: + configfile: ha_nfv-kvm_heat_ceilometer_scenario.yaml + +os-nosdn-kvm-noha: + configfile: no-ha_nfv-kvm_heat_ceilometer_scenario.yaml + +os-nosdn-ovs-ha: + configfile: ha_nfv-ovs_heat_ceilometer_scenario.yaml + +os-nosdn-ovs-noha: + configfile: no-ha_nfv-ovs_heat_ceilometer_scenario.yaml + +os-odl_l2-bgpvpn-ha: + configfile: ha_odl-bgpvpn_scenario.yaml + +os-odl_l2-bgpvpn-noha: + configfile: no-ha_odl-bgpvpn_scenario.yaml + +os-odl_l2-sfc-ha: + configfile: ha_odl-l2_sfc_heat_ceilometer_scenario.yaml + +os-odl_l2-sfc-noha: + configfile: no-ha_odl-l2_sfc_heat_ceilometer_scenario.yaml diff --git a/deploy/ssh_client.py b/deploy/ssh_client.py new file mode 100644 index 000000000..24119dbfa --- /dev/null +++ b/deploy/ssh_client.py @@ -0,0 +1,103 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# peter.barabas@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import paramiko +import scp + +from common import ( + log, + err, +) + +TIMEOUT = 600 + +class SSHClient(object): + + def __init__(self, host, username, password): + self.host = host + self.username = username + self.password = password + self.client = None + + def open(self, timeout=TIMEOUT): + self.client = paramiko.SSHClient() + self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + self.client.connect(self.host, username=self.username, + password=self.password, look_for_keys=False, + timeout=timeout) + + def close(self): + if self.client is not None: + self.client.close() + self.client = None + + def __enter__(self): + self.open() + return self + + def __exit__(self, type, value, traceback): + self.close() + + def exec_cmd(self, command, check=True, sudo=False, timeout=TIMEOUT): + if sudo and self.username != 'root': + command = "sudo -S -p '' %s" % command + stdin, stdout, stderr = self.client.exec_command(command, + timeout=timeout) + if sudo: + stdin.write(self.password + '\n') + stdin.flush() + response = stdout.read().strip() + error = stderr.read().strip() + + if check: + if error: + self.close() + raise Exception(error) + else: + return response + return response, error + + def run(self, command): + transport = self.client.get_transport() + transport.set_keepalive(1) + chan = transport.open_session() + chan.exec_command(command) + while not chan.exit_status_ready(): + if chan.recv_ready(): + data = chan.recv(1024) + while data: + log(data.strip()) + data = chan.recv(1024) + + if chan.recv_stderr_ready(): + error_buff = chan.recv_stderr(1024) + while error_buff: + log(error_buff.strip()) + error_buff = chan.recv_stderr(1024) + return chan.recv_exit_status() + + def scp_get(self, remote, local='.', dir=False): + try: + with scp.SCPClient(self.client.get_transport(), + sanitize=lambda x: x, + socket_timeout=TIMEOUT) as _scp: + _scp.get(remote, local, dir) + except Exception as e: + err(e) + + def scp_put(self, local, remote='.', dir=False): + try: + with scp.SCPClient(self.client.get_transport(), + sanitize=lambda x: x, + socket_timeout=TIMEOUT) as _scp: + _scp.put(local, remote, dir) + except Exception as e: + err(e) diff --git a/deploy/templater.py b/deploy/templater.py new file mode 100755 index 000000000..bda60c7fe --- /dev/null +++ b/deploy/templater.py @@ -0,0 +1,204 @@ +#!/usr/bin/env python +############################################################################### +# Copyright (c) 2016 Ericsson AB and others. +# peter.barabas@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import io +import re +import yaml +import urllib2 +from common import( + err, + ArgParser, +) + + +TAG_START = '%{' +TAG_END = '}' +DELIMITER = '/' + + +class Templater(object): + def __init__(self, base_file, template_file, output_file): + self.template_file = template_file + self.output_file = output_file + self.base = self.load_yaml(base_file) + + def is_url(self, filespec): + regex = re.compile('^([^/:]+)://') + return re.search(regex, filespec) + + def load_template(self, filespec): + try: + if(self.is_url(filespec)): + response = urllib2.urlopen(filespec) + return response.read() + else: + with io.open(filespec) as f: + return f.readlines() + except Exception as error: + err('Error opening template file: %s' % error) + + def load_yaml(self, filespec): + try: + if(self.is_url(filespec)): + response = urllib2.urlopen(filespec) + return yaml.load(response) + else: + with io.open(filespec) as f: + return yaml.load(f) + except Exception as error: + err('Error opening YAML file: %s' % error) + + def save_yaml(self, filename, content): + try: + with io.open(filename, 'w') as yaml_file: + yaml_file.write(content) + except Exception as error: + err('Error writing YAML file: %s' % error) + + def get_indent(self, line): + return len(line) - len(line.lstrip(' ')) + + def format_fragment(self, fragment, indent): + result = '' + is_first_line = True + + for line in fragment.splitlines(): + # Skip indenting the first line as it is already indented + if is_first_line: + line += '\n' + is_first_line = False + else: + line = ' ' * indent + line + '\n' + + result += line + + return result.rstrip('\n') + + def format_substitution(self, string): + if isinstance(string, basestring): + return string + else: + return yaml.dump(string, default_flow_style=False) + + def parse_interface_tag(self, tag): + # Remove 'interface(' prefix, trailing ')' and split arguments + args = tag[len('interface('):].rstrip(')').split(',') + + if len(args) == 1 and not args[0]: + err('No arguments for interface().') + elif len(args) == 2 and (not args[0] or not args[1]): + err('Empty argument for interface().') + elif len(args) > 2: + err('Too many arguments for interface().') + else: + return args + + def get_interface_from_network(self, interfaces, network): + nics = self.base[interfaces] + for nic in nics: + if network in nics[nic]: + return nic + + err('Network not found: %s' % network) + + def get_role_interfaces(self, role): + nodes = self.base['nodes'] + for node in nodes: + if role in node['role']: + return node['interfaces'] + + err('Role not found: %s' % role) + + def lookup_interface(self, args): + nodes = self.base['nodes'] + + if len(args) == 1: + interfaces = nodes[0]['interfaces'] + if len(args) == 2: + interfaces = self.get_role_interfaces(args[1]) + + return self.get_interface_from_network(interfaces, args[0]) + + def parse_include_tag(self, tag): + # Remove 'include(' prefix and trailing ')' + filename = tag[len('include('):].rstrip(')') + + if not filename: + err('No argument for include().') + + return filename + + def include_file(self, filename): + fragment = self.load_yaml(filename) + return yaml.dump(fragment, default_flow_style=False) + + def parse_tag(self, tag, indent): + fragment = '' + + if 'interface(' in tag: + args = self.parse_interface_tag(tag) + fragment = self.lookup_interface(args) + elif 'include(' in tag: + filename = self.parse_include_tag(tag) + fragment = self.include_file(filename) + else: + path = tag.split(DELIMITER) + fragment = self.base + for i in path: + if i in fragment: + fragment = fragment.get(i) + else: + err('Error: key "%s" does not exist in base YAML file' % i) + + fragment = self.format_substitution(fragment) + + return self.format_fragment(fragment, indent) + + def run(self): + result = '' + + regex = re.compile(re.escape(TAG_START) + r'([a-z].+)' + re.escape(TAG_END), + flags=re.IGNORECASE) + for line in self.load_template(self.template_file): + indent = self.get_indent(line) + result += re.sub(regex, + lambda match: self.parse_tag(match.group(1), indent), + line) + + self.save_yaml(self.output_file, result) + + +def parse_arguments(): + description = '''Process 'template_file' using 'base_file' as source for +template variable substitution and write the results to 'output_file'.''' + + parser = ArgParser(prog='python %s' % __file__, + description=description) + parser.add_argument('base_file', + help='Base YAML file or URL') + parser.add_argument('template_file', + help='Template file or URL') + parser.add_argument('output_file', + help='Output filename') + + args = parser.parse_args() + return(args.base_file, args.template_file, args.output_file) + + +def main(): + base_file, template_file, output_file = parse_arguments() + + templater = Templater(base_file, template_file, output_file) + templater.run() + + +if __name__ == '__main__': + main() diff --git a/deploy/templates/ericsson/virtual_environment/noha/networks/fuel1.xml b/deploy/templates/ericsson/virtual_environment/noha/networks/fuel1.xml new file mode 100644 index 000000000..7b2b15423 --- /dev/null +++ b/deploy/templates/ericsson/virtual_environment/noha/networks/fuel1.xml @@ -0,0 +1,12 @@ + + fuel1 + + + + + + + + + + diff --git a/deploy/templates/ericsson/virtual_environment/noha/networks/fuel2.xml b/deploy/templates/ericsson/virtual_environment/noha/networks/fuel2.xml new file mode 100644 index 000000000..615c92094 --- /dev/null +++ b/deploy/templates/ericsson/virtual_environment/noha/networks/fuel2.xml @@ -0,0 +1,5 @@ + + fuel2 + + + diff --git a/deploy/templates/ericsson/virtual_environment/noha/networks/fuel3.xml b/deploy/templates/ericsson/virtual_environment/noha/networks/fuel3.xml new file mode 100644 index 000000000..2383e6c1f --- /dev/null +++ b/deploy/templates/ericsson/virtual_environment/noha/networks/fuel3.xml @@ -0,0 +1,5 @@ + + fuel3 + + + diff --git a/deploy/templates/ericsson/virtual_environment/noha/networks/fuel4.xml b/deploy/templates/ericsson/virtual_environment/noha/networks/fuel4.xml new file mode 100644 index 000000000..5b69f912d --- /dev/null +++ b/deploy/templates/ericsson/virtual_environment/noha/networks/fuel4.xml @@ -0,0 +1,12 @@ + + fuel4 + + + + + + + + + + diff --git a/deploy/templates/ericsson/virtual_environment/noha/vms/compute.xml b/deploy/templates/ericsson/virtual_environment/noha/vms/compute.xml new file mode 100644 index 000000000..310ce292a --- /dev/null +++ b/deploy/templates/ericsson/virtual_environment/noha/vms/compute.xml @@ -0,0 +1,91 @@ + + compute + 8388608 + 8388608 + 2 + + hvm + + + + + + + + + + + SandyBridge + Intel + + + + + + + + + + + + + + + + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/templates/ericsson/virtual_environment/noha/vms/controller.xml b/deploy/templates/ericsson/virtual_environment/noha/vms/controller.xml new file mode 100644 index 000000000..d0d0ef14c --- /dev/null +++ b/deploy/templates/ericsson/virtual_environment/noha/vms/controller.xml @@ -0,0 +1,91 @@ + + controller + 8388608 + 8388608 + 2 + + hvm + + + + + + + + + + + SandyBridge + Intel + + + + + + + + + + + + + + + + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/templates/ericsson/virtual_environment/noha/vms/fuel.xml b/deploy/templates/ericsson/virtual_environment/noha/vms/fuel.xml new file mode 100644 index 000000000..223a65805 --- /dev/null +++ b/deploy/templates/ericsson/virtual_environment/noha/vms/fuel.xml @@ -0,0 +1,93 @@ + + fuel + 2097152 + 2097152 + 2 + + /machine + + + hvm + + + + + + + + + + + SandyBridge + Intel + + + + + + + + + + + + + + + + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/templates/hardware_environment/vms/ericsson_montreal_lab/fuel.xml b/deploy/templates/hardware_environment/vms/ericsson_montreal_lab/fuel.xml new file mode 100644 index 000000000..fe547b811 --- /dev/null +++ b/deploy/templates/hardware_environment/vms/ericsson_montreal_lab/fuel.xml @@ -0,0 +1,91 @@ + + fuel + 8290304 + 8290304 + 4 + + /machine + + + hvm + + + + + + + + + + + SandyBridge + + + + + + + destroy + restart + restart + + + + + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system_u:object_r:svirt_image_t:s0:c52,c932 + + diff --git a/deploy/templates/hardware_environment/vms/fuel.xml b/deploy/templates/hardware_environment/vms/fuel.xml new file mode 100644 index 000000000..8d8dd4494 --- /dev/null +++ b/deploy/templates/hardware_environment/vms/fuel.xml @@ -0,0 +1,91 @@ + + fuel + 8290304 + 8290304 + 4 + + /machine + + + hvm + + + + + + + + + + + SandyBridge + + + + + + + destroy + restart + restart + + + + + + /usr/libexec/qemu-kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system_u:object_r:svirt_image_t:s0:c52,c932 + + diff --git a/deploy/templates/intel/virtual_environment/noha/networks/fuel1.xml b/deploy/templates/intel/virtual_environment/noha/networks/fuel1.xml new file mode 100644 index 000000000..7b2b15423 --- /dev/null +++ b/deploy/templates/intel/virtual_environment/noha/networks/fuel1.xml @@ -0,0 +1,12 @@ + + fuel1 + + + + + + + + + + diff --git a/deploy/templates/intel/virtual_environment/noha/networks/fuel2.xml b/deploy/templates/intel/virtual_environment/noha/networks/fuel2.xml new file mode 100644 index 000000000..615c92094 --- /dev/null +++ b/deploy/templates/intel/virtual_environment/noha/networks/fuel2.xml @@ -0,0 +1,5 @@ + + fuel2 + + + diff --git a/deploy/templates/intel/virtual_environment/noha/networks/fuel3.xml b/deploy/templates/intel/virtual_environment/noha/networks/fuel3.xml new file mode 100644 index 000000000..2383e6c1f --- /dev/null +++ b/deploy/templates/intel/virtual_environment/noha/networks/fuel3.xml @@ -0,0 +1,5 @@ + + fuel3 + + + diff --git a/deploy/templates/intel/virtual_environment/noha/networks/fuel4.xml b/deploy/templates/intel/virtual_environment/noha/networks/fuel4.xml new file mode 100644 index 000000000..5b69f912d --- /dev/null +++ b/deploy/templates/intel/virtual_environment/noha/networks/fuel4.xml @@ -0,0 +1,12 @@ + + fuel4 + + + + + + + + + + diff --git a/deploy/templates/intel/virtual_environment/noha/vms/compute.xml b/deploy/templates/intel/virtual_environment/noha/vms/compute.xml new file mode 100644 index 000000000..310ce292a --- /dev/null +++ b/deploy/templates/intel/virtual_environment/noha/vms/compute.xml @@ -0,0 +1,91 @@ + + compute + 8388608 + 8388608 + 2 + + hvm + + + + + + + + + + + SandyBridge + Intel + + + + + + + + + + + + + + + + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/templates/intel/virtual_environment/noha/vms/controller.xml b/deploy/templates/intel/virtual_environment/noha/vms/controller.xml new file mode 100644 index 000000000..d0d0ef14c --- /dev/null +++ b/deploy/templates/intel/virtual_environment/noha/vms/controller.xml @@ -0,0 +1,91 @@ + + controller + 8388608 + 8388608 + 2 + + hvm + + + + + + + + + + + SandyBridge + Intel + + + + + + + + + + + + + + + + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/templates/intel/virtual_environment/noha/vms/fuel.xml b/deploy/templates/intel/virtual_environment/noha/vms/fuel.xml new file mode 100644 index 000000000..b8af5a633 --- /dev/null +++ b/deploy/templates/intel/virtual_environment/noha/vms/fuel.xml @@ -0,0 +1,93 @@ + + fuel + 2097152 + 2097152 + 2 + + /machine + + + hvm + + + + + + + + + + + SandyBridge + Intel + + + + + + + + + + + + + + + + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/templates/plugins/.gitkeep b/deploy/templates/plugins/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/deploy/templates/templater/base_dea_template.yaml b/deploy/templates/templater/base_dea_template.yaml new file mode 100644 index 000000000..bdc1b2684 --- /dev/null +++ b/deploy/templates/templater/base_dea_template.yaml @@ -0,0 +1,24 @@ +############################################################################## +# Copyright (c) 2015, 2016 Ericsson AB and others. +# jonas.bjurel@ericsson.com +# peter.barabas@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +dea-base-config-metadata: + title: 'Deployment Environment Adapter Base configuration' + # DEA API version supported + version: '0.4' + created: 'Fri Jun 10 2016' + comment: 'Rebased for Fuel 9' +environment: + net_segment_type: %{network/networking_parameters/segmentation_type} +fuel: + FUEL_ACCESS: + %{fuel/FUEL_ACCESS} +wanted_release: %{wanted_release} +settings: + %{settings} diff --git a/deploy/templates/virtual_environment/networks/fuel1.xml b/deploy/templates/virtual_environment/networks/fuel1.xml new file mode 100644 index 000000000..7b2b15423 --- /dev/null +++ b/deploy/templates/virtual_environment/networks/fuel1.xml @@ -0,0 +1,12 @@ + + fuel1 + + + + + + + + + + diff --git a/deploy/templates/virtual_environment/networks/fuel2.xml b/deploy/templates/virtual_environment/networks/fuel2.xml new file mode 100644 index 000000000..558788664 --- /dev/null +++ b/deploy/templates/virtual_environment/networks/fuel2.xml @@ -0,0 +1,6 @@ + + fuel2 + + + + diff --git a/deploy/templates/virtual_environment/networks/fuel3.xml b/deploy/templates/virtual_environment/networks/fuel3.xml new file mode 100644 index 000000000..2383e6c1f --- /dev/null +++ b/deploy/templates/virtual_environment/networks/fuel3.xml @@ -0,0 +1,5 @@ + + fuel3 + + + diff --git a/deploy/templates/virtual_environment/networks/fuel4.xml b/deploy/templates/virtual_environment/networks/fuel4.xml new file mode 100644 index 000000000..5b69f912d --- /dev/null +++ b/deploy/templates/virtual_environment/networks/fuel4.xml @@ -0,0 +1,12 @@ + + fuel4 + + + + + + + + + + diff --git a/deploy/templates/virtual_environment/vms/compute.xml b/deploy/templates/virtual_environment/vms/compute.xml new file mode 100644 index 000000000..0bff88827 --- /dev/null +++ b/deploy/templates/virtual_environment/vms/compute.xml @@ -0,0 +1,67 @@ + + compute + 8388608 + 8388608 + 2 + + hvm + + + + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/templates/virtual_environment/vms/controller.xml b/deploy/templates/virtual_environment/vms/controller.xml new file mode 100644 index 000000000..422aa39e2 --- /dev/null +++ b/deploy/templates/virtual_environment/vms/controller.xml @@ -0,0 +1,64 @@ + + controller + 8388608 + 8388608 + 2 + + hvm + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/templates/virtual_environment/vms/fuel.xml b/deploy/templates/virtual_environment/vms/fuel.xml new file mode 100644 index 000000000..e2a05d86e --- /dev/null +++ b/deploy/templates/virtual_environment/vms/fuel.xml @@ -0,0 +1,64 @@ + + fuel + 2097152 + 2097152 + 2 + + /machine + + + hvm + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/templates/virtual_environment_noha/networks/fuel1.xml b/deploy/templates/virtual_environment_noha/networks/fuel1.xml new file mode 100644 index 000000000..7b2b15423 --- /dev/null +++ b/deploy/templates/virtual_environment_noha/networks/fuel1.xml @@ -0,0 +1,12 @@ + + fuel1 + + + + + + + + + + diff --git a/deploy/templates/virtual_environment_noha/networks/fuel2.xml b/deploy/templates/virtual_environment_noha/networks/fuel2.xml new file mode 100644 index 000000000..615c92094 --- /dev/null +++ b/deploy/templates/virtual_environment_noha/networks/fuel2.xml @@ -0,0 +1,5 @@ + + fuel2 + + + diff --git a/deploy/templates/virtual_environment_noha/networks/fuel3.xml b/deploy/templates/virtual_environment_noha/networks/fuel3.xml new file mode 100644 index 000000000..2383e6c1f --- /dev/null +++ b/deploy/templates/virtual_environment_noha/networks/fuel3.xml @@ -0,0 +1,5 @@ + + fuel3 + + + diff --git a/deploy/templates/virtual_environment_noha/networks/fuel4.xml b/deploy/templates/virtual_environment_noha/networks/fuel4.xml new file mode 100644 index 000000000..5b69f912d --- /dev/null +++ b/deploy/templates/virtual_environment_noha/networks/fuel4.xml @@ -0,0 +1,12 @@ + + fuel4 + + + + + + + + + + diff --git a/deploy/templates/virtual_environment_noha/vms/compute.xml b/deploy/templates/virtual_environment_noha/vms/compute.xml new file mode 100644 index 000000000..95db87984 --- /dev/null +++ b/deploy/templates/virtual_environment_noha/vms/compute.xml @@ -0,0 +1,64 @@ + + compute + 8388608 + 8388608 + 2 + + hvm + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/templates/virtual_environment_noha/vms/controller.xml b/deploy/templates/virtual_environment_noha/vms/controller.xml new file mode 100644 index 000000000..422aa39e2 --- /dev/null +++ b/deploy/templates/virtual_environment_noha/vms/controller.xml @@ -0,0 +1,64 @@ + + controller + 8388608 + 8388608 + 2 + + hvm + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/templates/virtual_environment_noha/vms/fuel.xml b/deploy/templates/virtual_environment_noha/vms/fuel.xml new file mode 100644 index 000000000..e9d454530 --- /dev/null +++ b/deploy/templates/virtual_environment_noha/vms/fuel.xml @@ -0,0 +1,65 @@ + + fuel + 2097152 + 2097152 + 2 + + /machine + + + hvm + + + + + + + + + + + destroy + restart + restart + + /usr/bin/kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/transplant_fuel_settings.py b/deploy/transplant_fuel_settings.py new file mode 100644 index 000000000..993b0dcce --- /dev/null +++ b/deploy/transplant_fuel_settings.py @@ -0,0 +1,116 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import sys +import io +import yaml +import re +import os +from dea import DeploymentEnvironmentAdapter + +from common import ( + check_file_exists, + exec_cmd, + log, +) + +ASTUTE_YAML = '/etc/fuel/astute.yaml' +FUEL_BOOTSTRAP_CLI_YAML = '/opt/opnfv/fuel_bootstrap_cli.yaml' + + +def usage(): + print ''' + Usage: + python transplant_fuel_settings.py + ''' + + +def parse_arguments(): + if len(sys.argv) != 2: + usage() + sys.exit(1) + dea_file = sys.argv[-1] + check_file_exists(dea_file) + return dea_file + +def write_ifcfg_file(key, fuel_conf): + config = ('BOOTPROTO=none\n' + 'ONBOOT=yes\n' + 'TYPE=Ethernet\n' + 'NM_CONTROLLED=yes\n') + for skey in ('ipaddress', 'device', 'netmask', 'gateway'): + if not fuel_conf[key].get(skey): + log('Warning: missing key %s for %s' % (skey, key)) + config += '%s=\n' % skey.upper() + elif skey == 'ipaddress': + config += 'IPADDR=%s\n' % fuel_conf[key][skey] + else: + config += '%s=%s\n' % (skey.upper(), fuel_conf[key][skey]) + + fname = os.path.join('/etc/sysconfig/network-scripts/', + key.lower().replace('_','-')) + with open(fname, 'wc') as f: + f.write(config) + +def transplant(dea, astute): + fuel_conf = dea.get_fuel_config() + require_network_restart = False + for key in fuel_conf.iterkeys(): + if key == 'ADMIN_NETWORK': + for skey in fuel_conf[key].iterkeys(): + astute[key][skey] = fuel_conf[key][skey] + elif re.match('^IFCFG', key): + log('Adding interface configuration for: %s' % key.lower()) + require_network_restart = True + write_ifcfg_file(key, fuel_conf) + if astute.has_key(key): + astute.pop(key, None) + else: + astute[key] = fuel_conf[key] + if require_network_restart: + admin_ifcfg = '/etc/sysconfig/network-scripts/ifcfg-eth0' + exec_cmd('echo "DEFROUTE=no" >> %s' % admin_ifcfg) + log('At least one interface was reconfigured, restart network manager') + exec_cmd('systemctl restart network') + return astute + + +def transplant_bootstrap(astute, fuel_bootstrap_cli): + if 'BOOTSTRAP' in astute: + for skey in astute['BOOTSTRAP'].iterkeys(): + # FIXME: astute.yaml repos point to public ones instead of + # local mirrors, this filter should be removed when in sync + if skey != 'repos': + fuel_bootstrap_cli[skey] = astute['BOOTSTRAP'][skey] + return fuel_bootstrap_cli + +def main(): + dea_file = parse_arguments() + check_file_exists(ASTUTE_YAML) + check_file_exists(FUEL_BOOTSTRAP_CLI_YAML) + dea = DeploymentEnvironmentAdapter(dea_file) + log('Reading astute file %s' % ASTUTE_YAML) + with io.open(ASTUTE_YAML) as stream: + astute = yaml.load(stream) + log('Initiating transplant') + transplant(dea, astute) + with io.open(ASTUTE_YAML, 'w') as stream: + yaml.dump(astute, stream, default_flow_style=False) + log('Transplant done') + # Update bootstrap config yaml with info from DEA/astute.yaml + with io.open(FUEL_BOOTSTRAP_CLI_YAML) as stream: + fuel_bootstrap_cli = yaml.load(stream) + transplant_bootstrap(astute, fuel_bootstrap_cli) + with io.open(FUEL_BOOTSTRAP_CLI_YAML, 'w') as stream: + yaml.dump(fuel_bootstrap_cli, stream, default_flow_style=False) + + +if __name__ == '__main__': + main() diff --git a/docs/buildprocedure/build.instruction.rst b/docs/buildprocedure/build.instruction.rst new file mode 100644 index 000000000..d755ee5fb --- /dev/null +++ b/docs/buildprocedure/build.instruction.rst @@ -0,0 +1,305 @@ +.. This document is protected/licensed under the following conditions +.. (c) Jonas Bjurel (Ericsson AB) +.. Licensed under a Creative Commons Attribution 4.0 International License. +.. You should have received a copy of the license along with this work. +.. If not, see . + +======== +Abstract +======== + +This document describes how to build the Fuel deployment tool for the +Colorado release of OPNFV build system, dependencies and required +system resources. + +============ +Introduction +============ + +This document describes the build system used to build the Fuel +deployment tool for the Colorado release of OPNFV, required +dependencies and minimum requirements on the host to be used for the +build system. + +The Fuel build system is designed around Docker containers such that +dependencies outside of the build system can be kept to a minimum. It +also shields the host from any potential dangerous operations +performed by the build system. + +The audience of this document is assumed to have good knowledge in +network and Unix/Linux administration. + +============ +Requirements +============ + +Minimum Hardware Requirements +============================= + +- ~30 GB available disc + +- 4 GB RAM + +Minimum Software Requirements +============================= + +The build host should run Ubuntu 14.04 or 16.04 operating system. + +On the host, the following packages must be installed: + +- An x86_64 host (Bare-metal or VM) with Ubuntu 14.04 LTS installed + + - **Note:** Builds on Wily (Ubuntu 15.x) are currently not supported + - A kernel equal- or later than 3.19 (Vivid), simply available through + +.. code-block:: bash + + $ sudo apt-get install linux-generic-lts-vivid + +- docker - see https://docs.docker.com/installation/ubuntulinux/ for + installation notes for Ubuntu 14.04. Note: use the latest version from + Docker (docker-engine) and not the one in Ubuntu 14.04. + +- git (simply available through $ sudo apt-get install git) + +- make (simply available through $ sudo apt-get install make) + +- curl (simply available through $ sudo apt-get install curl) + +============ +Preparations +============ + +Setting up the Docker build container +===================================== + +After having installed Docker, add yourself to the docker group: + +.. code-block:: bash + + $ sudo usermod -a -G docker [userid] + +Also make sure to define relevant DNS servers part of the global +DNS chain in your configuration file. +Uncomment, and modify the values appropriately. + +For example: + +.. code-block:: bash + + DOCKER_OPTS=" --dns=8.8.8.8 --dns=8.8.8.4" + +Then restart docker: + +.. code-block:: bash + + $ sudo service docker restart + +Setting up OPNFV Gerrit in order to being able to clone the code +---------------------------------------------------------------- + +- Start setting up OPNFV gerrit by creating a SSH key (unless you + don't already have one), create one with ssh-keygen + +- Add your generated public key in OPNFV Gerrit + (this requires a Linux foundation account, create one if you do not + already have one) + +- Select "SSH Public Keys" to the left and then "Add Key" and paste + your public key in. + +Clone the OPNFV code Git repository with your SSH key +----------------------------------------------------- + +Now it is time to clone the code repository: + +.. code-block:: bash + + $ git clone ssh://@gerrit.opnfv.org:29418/fuel + +Now you should have the OPNFV fuel repository with the Fuel +directories stored locally on your build host. + +Check out the Colorado release: + +.. code-block:: bash + + $ cd fuel + $ git checkout colorado.1.0 + +Clone the OPNFV code Git repository without a SSH key +----------------------------------------------------- + +You can also opt to clone the code repository without a SSH key: + +.. code-block:: bash + + $ git clone https://gerrit.opnfv.org/gerrit/fuel + +Make sure to checkout the release tag as described above. + +Support for building behind a http/https/rsync proxy +==================================================== + +The build system is able to make use of a web proxy setup if the +http_proxy, https_proxy, no_proxy (if needed) and RSYNC_PROXY or +RSYNC_CONNECT_PROG environment variables have been set before invoking make. + +The proxy setup must permit port 80 (http) and 443 (https). +Rsync protocol is currently not used during build process. + +Important note about the host Docker daemon settings +---------------------------------------------------- + +The Docker daemon on the host must be configured to use the http proxy +for it to be able to pull the base Ubuntu 14.04 image from the Docker +registry before invoking make! In Ubuntu this is done by adding a line +like: + +.. code-block:: bash + + export http_proxy="http://10.0.0.1:8888/" + +to /etc/default/docker and restarting the Docker daemon. + +Setting proxy environment variables prior to build +-------------------------------------------------- + +The build system will make use the following environment variables +that needs to be exported to subshells by using export (bash) or +setenv (csh/tcsh). + +.. code-block:: bash + + http_proxy (or HTTP_PROXY) + https_proxy (or HTTP_PROXY) + no_proxy (or NO_PROXY) + RSYNC_PROXY + RSYNC_CONNECT_PROG + +As an example, these are the settings that were put in the user's +.bashrc when verifying the proxy build functionality: + +.. code-block:: bash + + export RSYNC_PROXY=10.0.0.1:8888 + export http_proxy=http://10.0.0.1:8888 + export https_proxy=http://10.0.0.1:8888 + export no_proxy=localhost,127.0.0.1,.consultron.com,.sock + +Using a ssh proxy for the rsync connection +------------------------------------------ + +If the proxy setup is not allowing the rsync protocol, an alternative +solution is to use a SSH tunnel to a machine capable of accessing the +outbound port 873. Set the RSYNC_CONNECT_PROG according to the rsync +manual page (for example to "ssh @ nc %H 873") +to enable this. Also note that netcat needs to be installed on the +remote system! + +Make sure that the ssh command also refers to the user on the remote +system, as the command itself will be run from the Docker build container +as the root user (but with the invoking user's SSH keys). + +Configure your build environment +================================ + +** Configuring the build environment should not be performed if building +standard Colorado release ** + +Select the versions of the components you want to build by editing the +fuel/build/config.mk file. + +Non official build: Selecting which plugins to build +==================================================== + +In order to cut the build time for unofficial builds (made by an +individual developer locally), the selection if which Fuel plugins to +build (if any) can be done by environment variable +"BUILD_FUEL_PLUGINS" prior to building. + +Only the plugin targets from fuel/build/f_isoroot/Makefile that are +specified in the environment variable will then be built. In order to +completely disable the building of plugins, the environment variable +is set to " ". When using this functionality, the resulting iso file +will be prepended with the prefix "unofficial-" to clearly indicate +that this is not a full build. + +This method of plugin selection is not meant to be used from within +Gerrit! + +======== +Building +======== + +There are two methods available for building Fuel: + +- A low level method using Make + +- An abstracted method using build.sh + +Low level build method using make +================================= + +The low level method is based on Make: + +From the directory, invoke + +Following targets exist: + +- none/all - this will: + + - Initialize the docker build environment + + - Build Fuel from upstream (as defined by fuel-build/config-spec) + + - Build the OPNFV defined plugins/features from upstream + + - Build the defined additions to fuel (as defined by the structure + of this framework) + + - Apply changes and patches to fuel (as defined by the structure of + this framework) + + - Reconstruct a fuel .iso image + +- clean - this will remove all artifacts from earlier builds. + +- debug - this will simply enter the build container without starting a build, from here you can start a build by enter "make iso" + +If the build is successful, you will find the generated ISO file in +the subdirectory! + +Abstracted build method using build.sh +====================================== + +The abstracted build method uses the script which +allows you to: + +- Create and use a build cache - significantly speeding up the + build time if upstream repositories have not changed. + +- push/pull cache and artifacts to an arbitrary URI (http(s):, file:, ftp:) + +For more info type . + +========= +Artifacts +========= + +The artifacts produced are: + +- - Which represents the bootable Fuel image, XXXX is + replaced with the build identity provided to the build system + +- - Which holds version metadata. + +========== +References +========== + +1) `OPNFV Installation instruction for the Colorado release of OPNFV when using Fuel as a deployment tool `_: http://artifacts.opnfv.org/fuel/colorado/docs/installationprocedure/index.html + +2) `OPNFV Build instruction for the Colorado release of OPNFV when using Fuel as a deployment tool `_: http://artifacts.opnfv.org/fuel/colorado/docs/buildprocedure/index.html + +3) `OPNFV Release Note for the Colorado release of OPNFV when using Fuel as a deployment tool `_: http://artifacts.opnfv.org/fuel/colorado/docs/releasenotes/index.html diff --git a/docs/buildprocedure/index.rst b/docs/buildprocedure/index.rst new file mode 100644 index 000000000..4f88814b5 --- /dev/null +++ b/docs/buildprocedure/index.rst @@ -0,0 +1,16 @@ +.. This document is protected/licensed under the following conditions +.. (c) Jonas Bjurel (Ericsson AB) +.. Licensed under a Creative Commons Attribution 4.0 International License. +.. You should have received a copy of the license along with this work. +.. If not, see . + +********************************* +Build instruction for Fuel\@OPNFV +********************************* + +.. toctree:: + :numbered: + :maxdepth: 2 + + build.instruction.rst + diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..6cd69313d --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,28 @@ +# SPDX-license-identifier: Apache-2.0 +############################################################################## +# Copyright (c) 2016 Linux Foundation and others. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# Copied from releng/docs/etc/conf.py +extensions = ['sphinxcontrib.httpdomain', + 'sphinx.ext.autodoc', + 'sphinx.ext.viewcode', + 'sphinx.ext.napoleon'] + +needs_sphinx = '1.3' +master_doc = 'index' +pygments_style = 'sphinx' + +html_use_index = False +numfig = True +html_logo = 'opnfv-logo.png' + +latex_domain_indices = False +latex_logo = 'opnfv-logo.png' + +# addtional config +latex_elements = {'figure_align': 'H'} diff --git a/docs/installationprocedure/img/addnodes.png b/docs/installationprocedure/img/addnodes.png new file mode 100644 index 0000000000000000000000000000000000000000..b6240569223cc73256730c1d645fc582de517005 GIT binary patch literal 24089 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 literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/compute.png b/docs/installationprocedure/img/compute.png new file mode 100644 index 0000000000000000000000000000000000000000..fc1cf0f2274759152924c22d6b373103bf7f821e GIT binary patch literal 25978 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 B2r~cx literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/computelist.png b/docs/installationprocedure/img/computelist.png new file mode 100644 index 0000000000000000000000000000000000000000..474196536700104e6be9542145b0b048f6412994 GIT binary patch literal 67975 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%0DUq4@-OB(p z=f_(Xt4^Ks{Oh-8Lzo)@Xx_Kw+XBysazNABB zzZ>JMO$+Q7U{dsEEG<)q{LJKEQ`80Jp`1HCXy8~{&PMg1Mn!zVr8;56K`p(Kp_X(( zy8*GViDl}!ZwzC!NbRu=CVjhtbRX7YJ=W7!#3_~c*Fb4i+R|OSnhtV%bd1I$at9Un zvD(x#!+k6>vSIkwYMWy+qz(&mz-u`yb}`CP`AQycTPZvBS~fVRshIM;b#@ilXyhFO~aXX`aNxA0;tJfIq% z;?ZG*nS#2OL#1%QOEr7hT~dE|$Hq*~W9O0W)e4(q%ccpbI`;gO_Ol7Flu$9wIrC##v z^+FL|X32d6yiQ^}9#54#6Mi%W-+GZeS-D+DhtCEcZib$&N0vrnGKGj|{u?ofpw(zI ziVfXk5HB$-9+UdRl&eU2bWvz#%nv`AMZaso4*jY!ipKlfyDdmF4kbxaR#K%BlcS^K zli)2%P>)C()Fmp4nNtOppQxx9bK#iS-*a<3cL<}f`cinqHZ@8i&t=*5Y39}mg(2Z> zd=XRIIfp=O*drgdv2A+*eh#!>Y|B-rjFAIkq23lIRNv$Yqmgp=?#Gu_itqp+BVMPb zI3C{2bGei|%k05&<5-7`g`NxHg2>F;;s;55xM*X6Ng$os+nO0ezJf?f;^wEAg!Tyv zc+f`i-d3x;%b?Zg$yBxsfJcM*wtu83YtpecFLK z0v9-zD41{PX=9Z7=K5<)1QOKu9V1u^j10RJ{NaO3$4Ol?J2!UdD2OSDxAwo_9JrgV zmK;5bzZG|D+^HDKU1+B>Nlqig9p+)U4J%Oyc}cGQEFVFF9VEq`wtWWGVQxz_v>Ssu z<+WsFEBoF=c$I|QHPJJ-P1mO|7%4X4sPx=>kTpJ@mYc}*e5YF3p~skn;+~gI+N8h3 z(w`;c-yp`h@3GEKht4}{0EO;B)cYCqZyg+!RZ;~7mN?4H9#f}dZY-iqvltUT&`>;o z$v;nbN+Lmte_}TFeIB^hD&ZR?XGf33%6hvxh4G%3bv8Py-V#f}$F(;pE=zGVDoM?b zr19scUKvqd_CRKl+x@2?t5HM&Y(hFjz~|?6+Kp8wJ*ELo zvlB^?w*9Wp?3kygUm5GEC(pjdD5Bw5f-AJ*wQ&=-DqEaMz2%D>>kV;Wln{6mKe|ob zeI-Rj(osGTzPsn=gI9zZ2h#)J@8%f?+#$oMbEc0z!)_bxbi1`3R!s$NzV8?P0cUCT z^68ZW!n{RgKVAc}kSdEkeWa5f#ng{LCl8TT+nO#H(4 zM$P%O9V?LaySZiU0j*J)&n_|AS;jE7TaD*Q#rG(Aq^!D>e-1Q%m(FG_&j91#!dmR) zR=jh8Fb9W(+=sxjqlba-&)@$AKl-@@Lk} ziMG#kg4LfMETqc&`j^R%9lBPPWTY%ux^YpmTol4)Tcjfku38B%DYpdKbfAMjfn&0d zkG)xW?Y1x@)Y3*Dj~4#Mk=kvT9nc~(|K+3xl1uqmc#h}$?QhbOCR!>Cu49|y7X5wC%O~{k zXMKw`HTifI)$MCK`X}U^BWr}tDBJGFB|myh+*I8pHxaPduK<_u()OOErO!oE@8Aap z=Y*>B!~pC3(KuYQWW>@&IMOQK0rG>6&`l;J;VHvuvd^XHZg(HBUqx$QC4FJ3?V3WB zu=xbj1CAYj_9%E^C_}A)0|?_!F5+2r4kP=uNvP*=7dyXB%}-6r<&CM+L>Hzf#ID|h zvWdATle^gMj@*Mz38*M-If5wY{pWMmL5(RaGp|j~G3q7U7Q}qgYUPJwe9}cFw zvcI1?G&EL~m%ub3o{8cc%yk4p=ZlB?{UAfs1LY2q++Qe{J_qEFNx2DnrF%$a*?Plj zgm_?3eN+pg?(!`g51NZ0*V$qug_ZhwP@*s1ZnWCj_5%pDO=M%cXzD4cB;!QuoZqk%)F54^Ka*21S+O*ib51HvpjaC743HeHel~mu6Lpb&V50$iK+&h$vLO*@yhLps@_y7Ger>Fj<}PsY zGW5gFpWOoi*$!q5zOVAO*On$mWa<|RGws@ocb6U>a}|88L)+0tVflvE3=ThszdJ@1 z4qNkPil!bM9>PQdmfTIV(}c9&;6LCz(0p4vCV4+LY)ZyOov(44HK?rc=eu%2-MbeV zf9;B}6LOPxsVdRroXi|94lW$*%-1*PI|7*H&{YS%bR7XoK%j)Up<&JPL=9KhA6W;g z)vlh)gaBPn9We%5GQ&Q{-^Wki#Ea$sFt_q7e)$zr8Ld@L#nU18xL4MVVI+3L<>E*?n4DzWINof#8S6c{F&y z(J_K}>;Mv487Ium*(a{iWN5P^qM_*=u>H$pHO3>85gYxh; zF5e6pl3LQJ_(w>O*=DX3TO*QBdBB>G!$&_hW+zbJ9oyu@h} zltmaKV^pS(=oW{fI7`3TjBd-D&?mHw;e-&+-TL-OJ~&;1bT6`aPw$F$MTLMTpBx4C z^h5w9<3(i}J0P*o61ldn2*r9BL0!q+Mil(`{AggU_beFvNc@D`>eb!qJNW#FOeBY; zLCyr3{0SuuF7he3vLto0=1_;8!#XH^ogR%{#r+s_!=bvJh~B~U@Jxp-{eGL0lUNs~ zxcKkcho$KQxek2@SCoE{N*OEM2PXX2uU@(Bt=XN*G^a0aB(uRPg*QPvk2aAZvwiN} zMq&IkEW&i}-65+8A(-URr!y*VzI}J}aQ?z*1+T%Up}{wIFjvVjOJsXuJ4=M~b$yly z)g-UtUlE|yv-F&Lvsm2=e;mBFUvq__8*RGN2UG3Saw!LnBtE|O!OZ`*`EO_g|6nYp07RK z`Z!Maa^~an`Z%g&$CFR%zn6fwk5d%5Z~NV`fLs2aPGI;##6@ zVWK2xaEH*iTW||O8x8L6+PF&u2u^T^;Ly0c2X_xnaBsYUhUPWr+&jkm?ikO`# z-6c>A^9H}dpUZ#+IGOK`X7{Aq^l4wQnuW&UMd-&NVug)~E=1Vx z1lD5FURQHJg_VPtz`5dt7wWrZ{I(Bd6<)i^thkb7a{RIGf4}vb@W=YnTc7^)wvLU% ztYSt*$~HC@_NH|toyQl5ihUNhd$e-7ZO;;ykbsBl>H}rKyz%W+Qmy|Jr;=OD$iTd3 zWe6AQ&(F`7bUQIoGV#fLD~(jHKU|_x^8K4&*zb)39I8NgTOkpv{WO#4HUBF4WB~GYNPB_w}!kJ`gK-nyLNwY`0;V4*Ix3B%|fP zP);w^7yI(7AN=!xJe|Wv9Yl_Rq)X8 zS&CyMc4#m2Fj$Q-G%rOOa3+LHK+w|o$EWPn0KouA%zQl27>$$nJgVkh7@^u#k`D1|m2v26l9caS z{I+6tW~=%69a{uJg7XI9pu+@IB$MsZS58jPN8xNreszZJMn7K^GYg9O!je&0!7Dzr zFM}vro%067>f3&U)ObM!*II}Gn?@S*6-`YBD2$H2_hHC3$5@wZ*U*L1mZYXnjO2^l zMTnuzo3cTp{q&Im59UL^y}{#TfW%Nk~K|BSQmV#xc^;8^H=(nP-F+RE@I9$U+oP^OS zlP1APoAe*n8Z%j3)9_gHo}~kPbAfl}34$`XrZB<=2i604KxBlV{pT{>+WC<|sS$Md zl2!|8>FBJYCqi4xB&=kV7);xU%@*t^|C`!O+G&Pn^b5# zJam|(rQI=>I92UBrz1?BT4+jevwwv^F-H^Z>zI1)5XeW zrW~~HXRYG_nh0o8@8QLmDX#srIGU8>FnM2h1p5$n?nSF2!+b?$BnPx^OJyT}ZS=X! z%N`=|yfp~N6}{3$GZ$v?^GD5(?(5Iu8l014H?IrdoH@B)IywBU*+v+`kAL#X^eZGI zA>odq$rJnX-G1)NcSU-GjtW^RtOzpyfk9!MvE=?*%H9Qw9f|#UcF7Ovn!z{kGIt+4 z+F(&2@Iem}yoIX7I@J}l_?#?W`B%iZ&qR!DMQCC#o&Fkx=q_)p-sJ#L93(FBK0otP z=1I_YN5!RQ$@R&j0@j?gK`0pVsqDqGt-UUMMg9DiT*ifWm*4Hh#knZ$ZCt-_CsD@E z_ZD}%-gk=ayg^rxS@AIHjj`H|r1!HF!7@Dc3SJ2})q&kN_0f&-iz4gI58N^sx*ZMJ z=8!D=uvT(>pS5*YH@i^JW>8KvL}!gmiJ?w34vkEWJ@>xJ#Jm97IHX5#=~?KndUJn)K_v%V)}WW9dHIFt%&5 zUDy4}ntoYu@oIB9m`@6PH z^6I-t+}D|p>ppa*bLi;Y0VPq<8X;++GTF9%BeE-7OFiv6tq(C3lA)@!3V(_6JvM7n z_e+}k#!Ec#stckMv>#_tNjf&SIT+qT^BCpe%-A@vn@WkiBP?5(afR2GRUgncs{cm_ zu7Z@}ryw8&4|kjp%6^^uWYdN|2(k?5kUF3>&>p6F~(EC#mu5XQ6o=sGrgS11l6mq}>AJJB(STv) zVGXd2wy8{dRd{9jgAuqhq@pY!e@5*fll&=??|SvSUl@(q^YJ7wB`4iz2iZ`X2@0|7QXAz)sGT5t}-L^X#V^kQxVU>W0j!>ob-TUzX0=$jQpu z@#ro!zx?MnLY}m;ygZ4L+4^JGcJy7VIvrr_`NhStyU&vMQ)FHwE3V94H-QXY9CoaI zSAh)0`FfY9E+PrMI|=+}8vfS}`hV`xe=XqDUa%}DCkG53vZ&EtMC#1S@9%2Y-sM2{7uTk%g0dy6_9MCU__>?s>rO5QUvF}-;4;y?7P#Rs;} zJ3BiO+`{^d)x?)}H4E?l6}o;gxP8u3G0>ZVKnMOm&B}l6!~b$x*CziN-Y?t8ccPLJwVn*zs8OydILL;48nUvk=i&U=D^nd^p z_4=3?z4q1eMOuYFETiPUlKp8;^(<=^5HVlHd%B5&t?R0LO~yt>3$K2i_hpK$QAhYT&Nj)H+ zg6%^n^~L^_%jp%bA}P^k?>j7DV(W2u2h7h@$_c%SaqaXs6YZ*pYCynP?Af3x8>ph# z{@VpcxE!(9O5h>v^-wz89BYU-;O5|bVBs+nUtA(K-{`{QLS*Gg7O7 z_;U^=-HD6+mik-1%J)!CsT}BiJWJAZduQ+7aOCNAa;7QTIGZ5XNWGl!B|o)Cu0zL` zLKu2X)HV~OF!Nx5?8(-?ZzrxiZB7C{N0eKu`;T&p-Oujy? z-TIh0;C=w3TNUzx^;b}rgoF$@Uk(?peOQ6^QvF44_q@nGPH^{j>Z2$H_m4zpwsnsi zG;bz>+F>xqssv~_3D0KczGm=nTE<_y?XYz2*>1kj5W>Oa+v%1P4G3F3`znVxDA{d3 zr0=g9=h3b4VEeCP3K1@zZVo3hLIiPdUj3~5!myP5Y;~q+XxTJ)!bw${Ht1Xemk^uC z5MmdsN}qs&$DpR~E9Dxh6lQR`*BVrU+{(${`gi){49Kub$!Yr{>X0*2xQq~XsViJ# zkXm!-OQykV^yv|_X4v!?EUoIxj*j>sO&C)HO+t*d=dmm4RpQX>1`VoCjiUJ}gotP? zC0r6>Y%f|iB_zzo9$b3Ix`fkcjk2v^1=Z}7_M0hh8$N{oIoU3MX*a0dGX2hHxGwa7 z)*1-rKi?Fjpg4G#V9LsSsoIsfCX)OZC3&&9BCLjn6{^19VJ7s!<3u={b9yo>%hzo+ z{R`H3`}sAJXuZjJPQU1bzfV>nLiaO=1NyPAa|U@W3;b>f>U%czjd!-9Rj~MW8@-fg z`)d*fo8J*EFiE6+Qh7A?>cS_>64USe`$A~yf%x!F8|->&9qMpAY4)x5ipi#&L3?F>i?Haa}e#+k?BkM}BXYgZ7*(21rY-r3sK5(=#w zdQ_Bp(#anu@1x)4U=3%6!==Z?lKWi;MYasmRU=wGuuwIFCf7~WXK6bB?*%Ig)VO5$ zB$*XqM2kPt8qNY4@;jQhGZF8`FMSR)r*t_FY#_6^LK3PRb`>Xo|2wRb%SnXFeYgkn z!zI*IYLfL1z4@Z+tZi)G!MCVEih1#Rnr;|lpC*%b=b9HCyZ<@PbaPe~ zXZ<$lk6qh&VgMQ3!f$S?#ixYz8q5})=Fox-9^28bby7YkcmVe04mW81SaF*^l>wzJ zw+#Ozp^(SpDd$tuhusBEqBl8c6{S;3k#YU1NDL+BEzhD*`h9@?<9GEd?R*{pU{cTK zXi8A6>)o0EL*W{sekI3o#PO$KE1_l+E`68&y0(Yy^yLo7jnZqZz5m1lgoXyM9J-X* zH|8X!+Bl^jY^4=oV$2VCLI%EW{;&z>L}7^(;Ks*as?`_Ajm&IH=K-i`c*%n3%#X^H znOE9+P%va%>}91F%0kxOI>0(9A9MtT0zOeP)8us?9>YmWCTD6b|67^eILEIiEt!dT89Y3RMRHvOm~&*=(1wjX$hsXlCtI1$0&LyTugk zXQ#%FX5E`KUI#UZ!cH^1#ub|U53Yp2d#~M&aE;GKcS!8SkxV6v^cAD9>v3i8P^qwLr#BHL4Z_o8*hf?M^L<)J4t|=A zMY=3t<3;nUbP_fu)j{esh4|F{+*@NW4@6j0>0(Qa6RnQFNtTJsM4qstA5uZw7wj@Q zaffju<}?-x>4qhsFYIBRMw06Ov#%mC5#z%u9Bizg{=&W4n4RM1U8n7XB4q6b3Swhc zl~2BKv@!P9_zF++h^msvsS8FgFPH1&E+nP^kE|GCbJbU{$<^HsSoin!JgyWrn~Z%&^9zKHse|f)#O{F%6TSLu!W%V6(XRc zNS(rjfJ7&jXK^#~GUnX+chMaskYA#P87%_5`B`~kS$FrUKsP3`d@xzvT4*FDk^7^9 zJd>)s%64`Fj43=ifY0_tj1ic%LXoN2#J9gJ*L8lU2Aqu5W+v@#7%(-(7jW*cPjwqB z?zQ9cDzSA0z>{a&8N||EpJbMlIc)L`egpi@%J^APB0W9sXqPq&2xegXFh}z_nDT6y znI1xdGlq9E$k8M~x7LkUH>2jV=~^{iPUUl+Qc_Q_c!(#P792^jd}}WQE`d(c@~ohuEPy8;b{xkyM=T;idmw0$V#AG5`OP zfGlgSA)_;>5zYNuF<|>}|5fKjqZ*>|ll$@eQTc=4s|3wmU#$CM^IK5Scx-#CIy$rx zDfqoT35c*DB=eGqE#?7Lks(LhFirTb=gN_21-g2|@mi8C_7Q$s-U)|!yahBV++S2p z%bYWjApK93zfWeQ4E@sew1=E~5^Cg~?O9klFXG#(??>1c2TIF~@7M~$Oe`d0Vy*x) z3cHv+U_!?Adm>w)i-i0Oa@X*>tB-Rj8`WTNb!*R~e(QZ;!FcD-MGWdL6P`4M;IMlf zAI*TP>o~(*+L6ZH)OD$bC{FMfqXf!|nZ-rhXOn85ttO@R^vHz~FI6pSu(6)O>k%IP zH^xGDSp*b*_w5TV7Q*mFXz(OvB&zDm0udfAXBcc;^nR-bQy9MEK@{Aa!cjg*N$dHW zDsG#}!0$SyFf-u3&CN^i@(<+>#1OHI+vs^Mt$E!&N@A-*mm%j7p*j9GSG|QN-O9Bm zj-&}BY9z8ZWVw3wu(_KM;CpwFLmV11A9$U9sRhYw4{Nj@7s}SU@3D=(U!rIDj#J@p zG!|iCKtT9qn*&EBBB0e}S32R_NC!0eM`jC81RX#s!xg5l=~urM3QJ^EleKR!jw{D} zEH1i^Kfx)8_IzC8_o(LH*ug?R2FX~hNP8Gg5X^#sDQNHWF+zU9Ai`Gk6pLRXO^|FGnPQ?m)&2^oz z9N*B*rpt~ed1MiLQuZJt9(=iIV?s@lcTpiS&ebTN(tM%PgONiwU%pQ7Vx${XP;bv- zs-*Hu7#DM`$(BJcE(tn{0@5*C&dPX+YsuY@eGm!Wu8QvN z?hOtri`F0QDG@uwlUo+kRWF}-2u;>>efo|69E=;&&l5BiWN}`w=#riktJZW?X4#JJ zc{J^_nYLCW0hY~zt|x`jiMCfjdPNcOFOViQ5aDFBwY6C-xRi0D$%Ru>Qy0Bwhs8)f z?H5@?V_+I$wW7sMg3GL7zs84@(b@$5P6f4I6YbLUS|KYEu`XTpkDc$#KSz~J(;$6I z?Bl2O+Yr%pjNXe@`mhL8QbGBuqerECTP|qXw?-i+%K7$tpfqOpLwpsEWn|`~?&1R0 zW(!}L(ZFK0Ca?coV`VsO;>nKCsD*Hl=FlHpc_)AqFjIa~Gcqu|ef!qBDV6Ty^VgPy zZsYq(S9b75kBu2k>=j;8#4T1B!_`0_FeoSp5rLCs-i(lzkB^?7en9xe;Ru`!o1MUO zMbOY-elpi;Wt&s+sg6=lA0KIHX~D7o_{a|s=h z73qI$68JwpeEwIPLaR@6jEqjTt+fU^X4*$h3#b_KS z`!fn}J+1H9bQSIV1+JPtLp~>V{pNbg`VOIfmJCAJPA*iV%nPqOCWSMa86x2RHw`dV za*X*vD)^K1)JL*JW2z5WP)u(t$vzaQ+d-y7SV?&I2ji3d5`IMB7c#-8vXC4Zm+5kf znkVd65EdLc>Lz<*X_sJhlDVpX&df-KgeKIn%X1mXWx&q=JrmLY$C$J}?1!PnY39qZ z8+7Y~772;_Kz?sDw+Vr8*ZV)_aYOqpDFXgR`}!=|H2dH6ra!fNVoZqsna2(3X$~Dl zz;=h^r(>o1^ejW~^=;9y+IVyt)v@bQ?b#?*LUWl%reJDm`sCnk3AD`{!$ZPE$^v6` zpUFOtOn(oz%(B^3MU>+^@c@6=T{<0k^3{!LMF7mhK_L$JgijJIZ+N*S*FnnN1WLj| zRQqMe^YinQQ+}hq8015LGeSUp{yHNOrv|+JM9a_0Hf> z-BO{}zx4AS?h&ye>GQ5C^ob5$kTULS2BmT0yNca4(&3-fvMLc?yE~AJE1s}eetyY~ z=PJR-<*SvON9s5^LVLicR%c-Cd=Y#RT%~!uN*Uq1l>p6ZqZAT7F6KwHTl(CtvA5MGfbN0@n zg}lZ)YUwaExcB~~d+ed%%(7`oNhsP1u*7@TRcIWRByz;kzxk&BPO{6Dwj}8AI{bHvm65&1B0+KDHvuFou1$2-k%!*g|bINY3{VCksUrBgxzm*?OB zPD!jGON`xqzjTj6;&yhf!o;_M2<%M^G64IqYo%N`bM88b8ll|G|E65|#_zOT#QIpe z8V5SGSO{1q_k4(-$rK|EQW9!Bu8G@);et_zUS_Sfa{>St+H~A3V<`M< zU2CZ{$PltI`bQJUKY~upoZV5dsupDecCx1Np1*3olYTNeCS@Gq^t&i#Qs*R>>$kW? z+t>O3*o%1E_#R>hbc&H@1vRD8hkbkR8ZCEve(s#VF!nCs(9#n4~yJ z<*0$N5^fYxEI@QaR6e#O=3qvWgmT~G!Gt=Rh$P8M;>hRL&)W!A<}|;CmFopwm28 z4b{J;pXt{guILUM&oIZ{Eb<1d281^o`q=)0pJqD)#^@M%s#C~=z|Y(Ea7ucy-!uxj zqMnt(;AYwW^Jg{8(lPKP+LvFvK|?XFuQcj>S&=>#0)SK1 zkN0}|>gpOg=Vw14!)BZrio1MyY;5EFUe23$ZZ>tPn~mEYa89?yQ8K|rfehAXI9NTL zq!1NFn^vJ;k}M<7H20Wz9sUR*z`FyiSne&A=F=MDZdYH#UU(e;AtRg42R%|t*P$Qs zU@1dH+NSCqsB)AwBPVS9hGd89?chH`5E`y3yGv7`{!=GRVR_L<%bqE=k>4#Y0J z%WQwU8r4<_-w8aN*M$KMC*fX8cgy^{@J5XxBK2jK=+(>V4N-#D4i)OAfbJq67*5Ht z=tWfec+x$GsQ9e;pT@&n)cSPD7iGyyl&UgOH9NUIfQ!zwH6@icy80|<+ULxw&Bn;R zfdjVa8J=XvHIf=1!DHppA%2yES?<*eE|G1dRN@KY))UzBhO8K_2Pr?(Z{Va@bGV)M zyWh1`g{Vwu%*r7e$GIABbF{RK=}Xz;Nk5<;k^2wQr9DGhj2^Wx4Z%fug~hF(tdkTR z8bUpY@E7Rn?i`Sh45Xc`R9=Ro3eX7(w&*rE5V#Hvj7!0V?3O^xU zCPbzxo6b&ue>gng!Go-a{RJ{zKizM0(h-D76m8f^XqX)hv5+8^ z89rQ;HFZ?mkj5@^GNo{5y$$2@7C?K&>ozbl2to#cIS(~>6R{wK+4v7PSOOqr6%PS=z;)LaZY9pOGJue+*-5mGf50KRZD3| zM16NF%A;F(__47F1^D|JL(+n;z)ZJpOU7cjp&>M~q0td&twn*&7k^R^qaFZKm;IC{ z%UV)iHQ+TTM>)>Qyyj8;Geqht>TKGGmXK97c7JOpOVd(=v(yOMv{AqRqU>-rGeC== zfODSSdyU=xWm!f?!=rc{z+B?fS+LTal!&+Ord!T+H#!9~edFH+qAC;s0GrXBMcbN! z*R)7f_pxXv3&i_cA!Tm31rDLiKCNgF9i9pF3ANy`+Zv6Ft4&v{yQop(s_?!adr5=! zHptd6z~iyAFpH3&8z<&rgrdSX-ftAOM)lzU5=BGg!oz$=TeFsnS$J1v#XQJ}u0RYrI~$s!*jE7cE7-z%RouA3n97znV;hU%B_h2CD*DFcKDRw<5Jh zce0XLoqQ?q@iRHiLb3wBPy_GItB;o&@V0gZF%&Y~Yd#g*)#K%)C9YPUWk<58S%J~B zU1w@xMR8*Y$DR|b{WNWr{CB(>78^IRO8UvUQEN%b-drg|B3x2xpvt@hhnM9ADr$Il z_owl6kzsau*ZDp0kPYDc0?IVN6rmKtG{AO=dCJ7X;9}mIW7Ht9fG%G<+afAoyTp8@ zSeYsM*SBtGhzwf9eV5D+#I@VF9YVjebbCRE`FI$oE+{P;e=sgkwqN>LU_N(c!_K9K zwosn|FlTYt}XMMMoK?_9U zmxeIdL%!jiXri$PnP>~t46Y6&xW@D@G~s1VYcaLQqqF?;CGP~PG!MV%i>gykkEN5e z8&5hpzdM{IJM`T&%pfBg2;~=r+|Y2|7K_#6xpMWq}W|U!3z|{DBZU zt2SCMEYn{7V5IijAIk4}Sq{WvSAH1IaWxnf& zuDFl|?~=;xr3IofsTTK(#9H0n{d$O^M`Sg5n-PMS^ zw!cW#WcDk~u-xml$B!V$;*U@CW;18=tHM-?Y%AxGd>G7NNeAas?`ou%7(A@`xer`) zDPB`(eVj*tSjh9^sKH zcQGTpItgx-uJST(r0ZKBUQrr@rGTF}Ey@zMrb=WZt(e5LEoJi&#{O)EL0J2JJe!Z1{ zSqwXtT>Cmo(0VG-4mXkxq3U(b7&q%*Be)938P$i@f4=WO4`Wrv5@Hifa0v@h+|5M6 zczdogt2h!E{2C7*Ux#^aVJ`>hpv)%nH#4Ql7JW{T26H zWqE;d3nk7k`=c*J2ya&(#E64Kl3w9v-5X0sPHe?{QRIolFqWqWTvistvuUqhZ7#n0 zasB#t`{`=Y?IZcwVn+5eH>TZ@gtTaHB|?)G=LrDMeDy{9pQ5)67b3E4B}^0npaV+? zdOPdoa);LSL4qME)5#k2AzB&{yt?9~Kia>kmzs}^kTB{Pd?d;_ximPPHXZmnEP-1g z5uQ@h9oDWePWVbZ4+%2f!V<6eY);CGLz2`eG_$dB zO>rB#*I{`U3%7lzs zh{k$J#OD24|FyH&iY9}7n6Es%c$Lz5DjTVzNKk1*@{4Pq3@;s*Y~!YRpnx&L0)R4C zd`K|&P;V6S&2?2Gk2i&_I#=;y?b0ZANj!&Hh4$lFqIA~cc^}0r4`8D;cnw$QtbZ~C zPay}j=QW))daU{pL#am*&`->;zEF?XN$-om?tn|Qz3)xRgAZDr8+!kEW@soehk*Q| zwi;vYpX%xMbgawm6shA`acn7yiQbW++i`BDCKB4{n3w71D}gBs-=j8%p4c~RmE66SMz-=hwWAOEk)bC zIUG+Fwx4(Y0(tAjhPV%Hsyi9)TsR$Or^UGK1% zG*u$iZR$UNNSH19_JI`0yO0{13jENikk98Fg-xP3-v}Hun87^FuxO-aFaiV@u8zW658La!`|BxEoJ@_@S};B@X%WSoD{non1p|Zhu&~ENKu2 z2M14@J#@@9Y7@{RF{6Hcu44TmHCMX&{>8mn^&FI4=Nguk0qy80OI&Ot*q`^NK}rfw z2l%bb_cqicb{Wp%=vet=BK9@m64VItuK6%nzW-d7%*~8cT;iLfSBF9EeCea-Fb;^c zf^^2zms+mX<}$aKq9f_<-ZL^HggP`bBqhbfpuV=Kd%-PC0=M)Z1B%#XPc$fLIYv<4=_6&u}!1JMsrJ=u@7+J9zI!}mUl{dQ;Z|qeZeVe zPXpR$Gzo2S#i8x>u3}d8Ky9SwVCHCDoNwVVNI3dqMk+wv+SQ&COFaw6;^QBZG1(L~ zmm&)|7KW~Jep0ok)u0!wbhICSt-tuu_`C;2>_u33B8X<)~ zq#m(=u(n%q$El2c&>aBRqPV0ezn7Y|KU(pKxa3NC*$)neL3|FHS~j7NmU7m)tz({0 z!pHR<%n|>aui6dhpm%MgV8-$7=bDrEQ+M1JcT*MY(sq&%WOcn^gzYJJc*4OW+cd z=cp7T=C@fw^7JaUTtY?56Y=t5qN6*Rqs7rh^aLEjQP)$v-QT*GE{9=O=)cO=7*gHn zAqrkdQuSo+h!0^@zz3)>u|c>mq6T2sKNmJ1{L>H(y1sxdatY z@b6>4FW?`zw70j--p!^lp*@drg&P`Ww|cs$-?&gj+#PMkfE3~&D=OyJ+1opJHs3C; zj<@x1q4hR35;;}Q(>tj@{Y7jFp5D&`2fv$@$8=rLdS}sQMcXdihrE%$t|fKb&G;Ol zo%1#1_rbJfvZLXk!vu*9ooF;E>)^v-i&xfTG?PI%yhP?YAUb zu5k(?@3&=d=M52^7(=%w|9FtRL#ZNGhyFsRChGvno zh28oB%!q=GwdQl0T%W)4S;E_^@!>ew8QP8xiTaggP9c~iVRz0&MKlS3YQR;ZK} z8d=uHA&H3L^YZQ@of!Z?C<6-#2}O9syQV5+K3i7_ee2-$JqdNQES|165cdE*=Id_K zs`QQRk82}$i|t}FXYt7VkD#9y=^aulp9GW0d`9mudF+jWcxxBiEw&XA$~OIL*v*ih zX%qbnOy0t(2oJMUbj;q~5*tpE`pI7+6-_6rH{f36ECW-^ka(=W^QRKj_{T%j{nUYj zAt94AFB#_3`Tg}H;u3WaOE?T%R@$mWA1Wb(3GOio{bExT;R#r9Wuk95m_7#rjwGZP5oHxmjy;*IeUE2bU!kt#H#n{#mdP2oe(M(yy z4!$qwkg5QK761@=&r$7b*-j%;FsVG~dh?Uz#89X3>({drj_Ur@3VfYShZYqC;-~O< zHad~C{D?waLZW(ND+C-T_EsPY1p)s^eb8NDCsyv&&u9%;*hL*EkVzNlSxRj4L{vGx zJoRhhEG*=L%yGD}PL%b=Eb@~gPmQo=Z8}P%b_s#sUj_U)7Q5eMlx0${`WIi+8C5ZE zmbX8IA(iJjgP8TWaENY0o3!!Hf z@t;_y%%Mk7C^%WE;5rG`P|=#0t-GdC9vK-qS}3ewO3?j-`puXybMvLxJDSiC1kYTn z{zNInR6Ei9_}jY7Qq+*Um{AB{R1NBLEPh#5GanPAy}ScRaH2n;qI|hZ{B+!!Xyudd zAq3x7j2h7L-XfhbcK9YU=BwK_Ps{s|sl*Yzw#j8)T51uY^$moQ;$z6KwW=+pW_NGd z@94utj++f6&uNvI7R^hMklr){CB)Pqk!huZ2I}U$5T-<&m@XrPa&Ls_H37|f<| zz$hoN(NuGgg@N?QyO{2p*7Gig8gUrWI{u`cQ0!AwA(dZ?`swScBcP+Uk2dhmyFcjG za8dCYD<~Z_RK}Hx|0AL`x5l?Mxqqq6Cux%e1cFed5FtY$sBh7!a=O3yrpOmeT9HaW z0+$3V>`GvNn}CIKokIPnIeSA7_EEPQn)7mvl@yM!SR2KRTVtn_E^I*xLjOloCoC_1 zLpG5Nb;@&pe^bytKW+ETDC$0u-|JSl5=AkSlZvI)mfY4)|Rv!QbA6fHE6FIeXrVR};;r@=xh}1Fb$9U1o1~=b z_wV34#PZPS|D6r#vFNSjS>&pKQLckbiih8<639YQ zh|{Q%O*|1rN;-F zhA_%GaLz`wTsJFX2NdJb8U-7hY;Ihco6pV$&w*n#3a4)x@6Phb1d;VL5_^%ykIJ@) zHvG2gTe;}Azk1LN@B{3lLsmy(OcTVYq2xs+i(VQbJE%&pUrA>QKO()+h%qZ)v9_EG zxH#YG<-Fnsp%<;Vbvb&@W(B<{h{EvT!LCjo%W^i9-#i()3mUh-38oxm9lDd8cQavP z0)2p!icp4%-XGdjglfK$&LE+uf|7IUw0PSmoH16o!w1m6$Q9~V8af^`eco-wOIkN{ zOf>F(@a=v$)qH`(>chx(l{Xj{8nS((oLd2>v$vg_q>{iT$Z|xS7v04Ox!lt?t#+GC z!P7KGfDKRWkB*Kdkms^dkNV9IUzQT+Lsi%-}ElOIj)5zQsMci%J}s2WLnOs~~Z;EKO79A^Ri9 zn*qK)3h)31wSuNIVx4CXZ;r$+4_m_(B&X#eA3m_ExFN=O->&^chc;6qX@}Ic- zm+}%45ptMQLDVHt885D(k(?9@&ZWb(68ze)`sUgCy!no`TqOXYfuZ5|Yp`0oXB-Cl z;@>p0v?wo9oY5N=oJ<}hY~zs6`>1ZO4LD53jB7acPNt@wOP%DF@S4s#Qb%S*T(#Jq z7nh0*`mM7SB)&O2dj~XoHi_coGA(76%Axvvmu>m{GkR`h zc(ZNt5b(Kssjk&u#YQPAFZT6&29Ha}tJ_~Q+{6K9<|jTEidl6WtCKMvy@T~E(*alA zeGpGCdD(8^;<3Ib_r+sU;8@irXjovyzw@~8JMVgWu?>mN6h8wCNWntc?!=RToQLzdsOyUe1#Ki?erC z^isF{&Q0lXIEHZTnr!@jB`Cu5VW*|=A5Uzf9xmZI!O@+aN(Ip2FvdfPmlr*mk$uDV z(2#*Up}A1{snLzhFN~U}R!Bv;%a?`Nc#YZBx_7RZy|0o6F#+)#C_mmYW5Fv1h zxH4b=kKpb9r@m}CUF=GE+8Uj*BwzZcl95=eb;>wXO6_;+X`b2EEyl)Tr;X0lv;H%n ztihueObiT@Hg)!b8K5411fD!L@BZGmWo5PA;GZ0e5xZUp|HB;ODMz5;3#aRj^_~j- zf)ObA_vw%S3&8$=_DBnWa0uo8_@|nQ_JdDsauNx%!5C!!49LfpX-y5mcH_{!iAfwX zfhYU{LZ{GUZ_lZpml>-}r=w0B`5))^#K}K*wqPPwxz;xE{(lpr=Irh*$Fr%TAWg{z zgA%na0a8CZ4551i7-atx)tL`nQ&5YBT;-JucyQ6zzo!9MY$-t9*Pq@oB&6k|fS6AGxyd~|{HK3`l8O@L IpNzi!H(;{sHvj+t literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/fuelconsole1.png b/docs/installationprocedure/img/fuelconsole1.png new file mode 100644 index 0000000000000000000000000000000000000000..61703cab109cc994ff1014256d0d682af2ee9d2d GIT binary patch literal 8269 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 literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/fuelmenu1.png b/docs/installationprocedure/img/fuelmenu1.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7a0edb25faa2fd60b99d5e0c07d2b3645a94eb GIT binary patch literal 9276 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 literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/grub-1.png b/docs/installationprocedure/img/grub-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e64b793733fd7732e21d0e89398db35da6f5a854 GIT binary patch literal 388991 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%0DFrM{(@2%sQB5-vQRoI$&1DTj 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

;ZwAXmd{$GZAT}eEj%* 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

}_Nv-q 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 literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/interfaces.png b/docs/installationprocedure/img/interfaces.png new file mode 100644 index 0000000000000000000000000000000000000000..291e434f6bdf3bb13e17dd3b8db2b06c3bdb87ec GIT binary patch literal 58851 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 z

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 literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/network.png b/docs/installationprocedure/img/network.png new file mode 100644 index 0000000000000000000000000000000000000000..7bef050641d26f31308c175079d21fb1c4336fc2 GIT binary patch literal 55423 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 literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/newenv.png b/docs/installationprocedure/img/newenv.png new file mode 100644 index 0000000000000000000000000000000000000000..d6bc2827f8a032520412ddebab142924e73a8f6c GIT binary patch literal 37483 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 MboFyt=akR{0DJdJ&j0`b literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/nodes.png b/docs/installationprocedure/img/nodes.png new file mode 100644 index 0000000000000000000000000000000000000000..771e4813d9c35907e0649b0b24411351e4034758 GIT binary patch literal 9155 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 literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/offloadingmodes.png b/docs/installationprocedure/img/offloadingmodes.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3cb17bcbbda52ad7c9cca33912b8b2ef4db9a5 GIT binary patch literal 23017 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%0AyA=fABKL6>D6(IVGlSHAt*R#Z>OZdjb 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 N69Y?q+-1+?zXEw@i`xJI literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/other.png b/docs/installationprocedure/img/other.png new file mode 100644 index 0000000000000000000000000000000000000000..c088488dc4c60233ca21449ae050178da8f7a72e GIT binary patch literal 41526 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 literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/plugin_install.png b/docs/installationprocedure/img/plugin_install.png new file mode 100644 index 0000000000000000000000000000000000000000..ff50633edd39da2917eb6a567f4727f71d5ed6e3 GIT binary patch literal 17431 zcmc({cUV)~);GE=h@yxML8@*k3Q`1>4qH(XK|qQqC5WQb5PGNy8^nsBR8b%(N|gi! z5+H<7R62K2!T*T67ntfIeTx{#q0bpy(&aL1p0uJFL;ID1|7mTfU?%YWpHQ#)CB;eA`04v!20JyW? zJ;2o)2EC``f7kEcJ#T+ESO8-iQ6B(~0>&55TL-7pDbUaFPxPJm{_$z%9n|?L^~OpA zrV{3PWMq~bT3Avt_sXF6b@ly3hzfY(U&e?I_iDsEf@px`a5(A7rtR`5;{k^u9LJsTUI7HXX%@_8BVIT56-y_N5i0ie8@QFw5Tr$62$9Uc1N8*vM8 zn}(_jMJb0Zt)~PEA#l2)bVw?4L%AwQHV?bus(`Y~=Va4gxT8oMd?WQpn@hs8Q~=O) z`gy(9vuiOfXbj%6=*Y`bVPBQLlq8du)`{j^H)0K!v0RzEHuCHqwATJ!>Svz-0E5cgURb;tw8zwE?FSdkDN^d{8t49}aOgaKYc3Gz@-h5Lr9{lX>T*t|m1eFpC56xx^FodEj51K4vZY|mlTc-TmQaI^AiBn94*mJ3(%6fDP?A-51sn` z&X?1dF|SaUr21N5?OlHy0cvnsq3ENc6esQSeC9~k$hR@(qo+IKDX|-p+w(&uEac33 z4qj0?)aFlN(t;XGj{(52;_~ZJ6?mOV4E_vW7`*G*gCB4ask&SKxevE@;;wE3ewXIg z>BT1s&6Mj%0YIc*N!8aq;3Qw2Q@UU43D1TtuXhhrD-}*8JM)j*60UjaVA7m^-vIzt zJC*BulG( zc*t-SF=rc3A6|S+b1C$GY^(Sn<7u5daVz`y)H5FNZ2g|H4S2;y2C@ zuP5t2Jz=b-p6$rWj$;x%7ds{naylib1=;%nAjig+uhX5J`o8 zjnu#m0O)>A%ey_;^++m<@g!!^+zOnTqFb4!mDQg=tQ_F9{_*AU-B`$JgJ#KH3- z0AO#_A-p}CZNjf%BNZ+-c++9yd+W&QtWIL|QJeT}&0q3ExBiTI*J9t(2;QY9PWeLK zoeO%y({Cf%_5whOKOgw>?_s{eAR^IbTQp}nh`bHf>TqGnG~?y&uQpz0;oHbsli$GU z97ggu3}jP-gd|4Diwhp(#A7?9YGV3m!FdqhIdqjImN+(PCHRz>`99ocg>3SzRT1fZMc#} zea>tgC~z4G(Lh08&_yBi@aQ!>eV;W%zj=a)uc{5li%Jr;J}}20b%&ZlQTfX@;?!iy zgur5Jl8UT6>NKrK-)2|{KHM%oMs9aX^``Dw1!ts}K+h_HK%}^?_FPi3bUIg3_Wbp6$SeKVTe4 zJ5Ag@9xuN0?dRS-g=KR}*?o5X)FloT*uz%c5`koeBcb%OyNGODydU$XjB>8I4+JzHxTY+lvVeh_aO5g;LXAu zIlX#mwv#KItEK+N>3v+>V!@gUS_YFOU$vi>B=1P?BU|?{BfSwPszptyhoTK;%*KNSUT~I!!VQ zsm8PL2?zGf^EltR;KxUFdF91SnFVs@DJ>o_Gx3vemgw)%|3+*`+4^i#`C9g3#g~bn zj+4P95*$RMIYgM#$hg}hqyELo!>robJaec%Nk47Lyp|jT;orMzu%%@3*NkL!8z_miv4pWw;+MS8k4SW6JzCY;i zN7*tcj~>LQ)>0Rulo&5PJX~nPmC!~UUrG0PKpJkKTsi^cn1&rbH$_1r>2TJXEq7yx zOwIFU!5pQmTT)%Gsx2zTTP2tW^pbbM67-`O;xXRsEuX)} zV&$lvbm39j{NdG@*UL5#gGxwHG7ed9JwAqd5zqL86JE$PutYlMvR6&-*IDnCEipMl z$mqC1#O844#2-)v^o_0{(V`csXGUgQS#huWLKidSH(U$$v#h_iS}Q*(L0jQZ<*ys! zG}y4!SB|~x7}{ihxKQcOWL{+*Q`~oSDx&FQ^!1fFt=PEX8pLX_E2 z-HU>1yH!P>AdsBJgPNS(I91TH-F;zAD_YuVS{lrF3<>GE+EsAND>?lqI^%t_7p-Nr z=KGq_l9&YH>rqb(ecpVmIq#n(Ssg-rWAP|E3ephgxFm*~ennmPyhGXjQ`kVg%j6=l z0$hmfqEKTo^%5Rh{-nXV=^uxLHl!Xi^;C~-mm0JY^4WA-{d|Ys$9xtqN~UCox=Hr;`;6$ z>!kU-hRKWVM+O{UeLlRefG+iM&V6Zlk`1FH>=M2;(E`YtEN*B3XK_(W6#88TwDGJGX!9P6 z1J^zWy%lh^3w*NpU;#I56|-#gF|`$IC!CuNk*|$!UGiKVPMC-u>73Md)^Ydd)wx`5 zkj^ki=S zFHIqBM+^%NTfyV(o4t0Qwb%C->$@8BvM9&31hFNqkpcy$LER0_Sk(~=XPF7D|cJQV!JL zJp}JD6*ai|)h0Qf135F>S2k=gIZUM`}Wr$V}UORfuxr`=BS zuBkghZ~kIlW|&i@%QGeATjX;v9=O)oAlE}}^4hd$vMbz?nGZ#~8CO@SBA^?x%YA{B zut#aTthAC^l|Ka4;rlQ}1I66;&3Lazf+17XH_h8edKHH51d*~DgI-MOb$$JqZ~AVM zz;ueICSSxCQ_yx+vWt4^IAxYY`9NQLrOT}-?)rh$R&CLHjLiD!HNgVEMr$-BJ`{>m zFFjV%BsL7yUDTLT+5z(jW676a!uJ&DbrPWu?nz#1F`^#KSS|~lR44mgTDD^_z9e7I z9@qHtGr>Id7VNp%{f7+a$lYh9gj;7{4$m@rgl}L@^B=G(vv2U73|uV?@v6Q%ZarB- zr!Qa4zLlCIN^l@xQ83y=NOH#mvQ~`<*a2p7ys;{0dY;7i$4);p{}Ea;ss3a{g0$eK zm#{SwGtZvczR|JX{4}2Fu1gn!79(Hfq zS2`<~UpTrB-zO97aWRBrnu!ySm7sW&i&>ia5^8b0t5o6n>_(<+?FO~?;zF>SK{gguXC(3)B`7G=I1 zXK)9eODlC$`Q@3U(-j|K-(DpZVf8%w!mb+XcTRe=sFzr(mE=+4v56o=y6RZ}B2>}B zn6)07Nm@_SjW!lI*xsR`ot?m%Ye&zIy;w!sOcL20`+Z4vxAkmn!sgJc7s^=gufAS9 zHPBC*vKQS4+@?cO-4R5w;cW!?QW$f+cF zOqNw_&7EN+Xdc0vmpa6M&mDvDFPlisrJ3KiXRQT8pHAAh51&q2-mPmGj9XYCx6$7$igM4DlJJ3rO!xA_umUi*t~`d_CE`^q z;w2=$_zLP9N9{WNc3#QWrnYb>y=Q)VfBu-tSy%GAt%`fFHQn|f3TA8xuN4w`-W<|;XUx-YyAGH5?6+LN?Z-;@REK(H^t;xw z<0h{CD`UcODC-czblW!N7f(?qovvP8p>aOqSY$>JRg;W3t-W!4RVOm+N(3wC+k>DM zxTiADA=Rtv#7C6S=j0}&1_H_r%pk3_Ce50?YJTeybh7N=5CH*gdq|hJ8M>$A)u?VT zOi>DlSKEN6B*|5Ufq(-(zyPKWY1tNUTz(cutK#Vlbtxv3EV3K!R#FqSj`-!6+}B%& z`W~!)j#hYNI+*~bd;*sI@Z9W=*%f@Xdf9N9jTB*ci|GkJ>lZ&|tM2Aj5TOq5`Kn<*9?;2oee;$tLX8^qlaRTpb_qDk*m(-#Z%i@e^FAp7hl4(-K z$Cd;*${$yUbaj5S%e99zRPnS$-9&YHcf<9r}8jXntFki=I7+F#jn--*PXy3vCnw4e3IIV|0Y zB;je6^h6lWt>0SbVv8sFSfh)>P)#;$nzi(h|1)3( z$>s%BEkXS+Tt^Y4;?#RgSYwHTncN=_*92R7ig`KAU4A4(Ib;@tmyfKvx zZ+kI6{q{3y4Zpmb>{|L~NMAcxEm)xN2+NhV%k2x&F%(C)6%$iu$1{Em*dnF`fXjKo zINv6f8}&VEskCL2@Mlg-&;%%LI-^|8BY^Wz(~pgA5iXD=YnoYk}I^Ul)9-0pA1KF@O zmmk%k83%bRR>e=)OeJ5O#@7h)mK^3lvP99Ans<|VSu?q%E#?e1Ci;A3_dtu$+TiDDpnd+rCGRMA)NsD`hmFf0U+!+b83UxZ~!)H?e$9b}$ zx+g}ZWAK9*VQ20Ny4PA~f-Em~u4iv26HA*dM8ESctl}&}7MzmF&d|&fL{0mX3SZ%NG6?brrP*yu)2ACQlI z8`t}1aQ_w7;P29~6?(#W%G>~b2k^VdDCL`Me7EjgW64n?7v^b0kcajmbY(_{w2Q9H zIlL1(YJl1gvT@4R3t-794uys&1WzeBlKpq11UhkQXNd(Tm$7AiNT=(iI>V%OvItiS z#aPcySYv5|6jy3@MHFNbudaYWg><+nG~TH9qqpO*891*-{G(|4FmaYf@YYH#3qs-$~%O6scMGYXKrTpxdv_d$xr1~N~I0Un> z+&R8v*moQ(Nl8_hqveeo$#W{ojx5uRuJ_8-u-#`%H>Neq7IN+40U$kp%zL~l{~^n@ zaWp6A&sWCbQzfm-bNP7d__bEF337>ROSjIyC0+HTqJlYH`0DaUBLMKuU2-_@^PqSs z)3e3tO{QCup-Bskit>3KFYTb5+-wl~(lQ5Oy-#Kx4o$Z`ucPr1eltWU&h7N22bZcw-yxMx3 z6kA=frB+i-CAM;lr}hIii4qZNKdHu9jzgCvBG~=Zc)ESPk8It3Yxrcl&q)%8k`Tl%q%w;3|WZIDrV-ikJ>(*ph z8l~oPpIQ$Ho0XH>W1R6Sm_(3DmRt^bcB|(|Gzk~`VWvCoV7!!V+_#R_QjdY%iPE29 zjqadx>B7{>Q(J)FVWZb;gLVd0B*@!UZ@4-;K_lEPpq22Kl?QTM>ZT|4%6z@wkM<_< z!?XY(b!WW5YyK%uwgbUY03oxRzRZLey zZIgWtP5$reQ;{dASihwwc`*ZXH_(pgtoC*9aS+vVO*1=Jni@{pis!n7Sou0!-3}7= zlkv>$KxFQEVBpq1n%d=G$ylERU-%`F%R%-*nJZdu7Tbb^*s;Rg&03I^Z7xTbUAyH` zP3y~6Fgc`uWBCfFV8n){yEZpZT2`y1h+z}o>fBa9b&?m|2rH?0+%}*iV1C)A?XE39 zKVeSoevoblc4sYqZ{>EC*ds;i^mUIb9}6TsXd0#VP<;#$w(Zo%!5oer+^8U9wz1bw z*Lu+!&~450=aU>(O%@v;lw=Q9zda=_ztd6&D^|p7I;Q<>YF#!2OUO{t?tS$dwv=69 z+sOCid9dOwC_A@Ve5~s8HIX*|d&>pa~J?8F2ATPTBqYI93pEbW5_ zvg1KPn|z{+oHX??plR51;_ecvZIV^n=~mV~Oh(?Alokwo4=!aWdsg}Sze$~+J?&}h zWptDRFm39F-n{fiH>Tt+h;0e9u?@SCwo$RK1IYm@^HiDiV z7OW#uK&FzeLjQ(tI0EI-(#Jcct9qp;pZoP{8~T`;4cCq^HasR00oOSh-{o`9ntm#X zHi)*R6jDNq8g>a%;!`r=^rDFd${2e~WkxgTsC=eZtk;`czOv@L`pnhaIbV#GcZkC{XTvCp`S^2=4K@c>4#Cl zN&<(X`t(=Fni&mivsZiNfP-Se*5A1=jxJh>5sKe(zI|DB5-b_AQG?oW>L%Aqe@`td zChNCFWv9}QWRg;TzH%|lo2sCa-(oiwf(qNHmn#|Zg!|feNC_5uuLEnMfjD1G=0&im zEHP}yPO;W4-*uPf(~3M9?XBJMkO%%U2vmB0F@=o1@KS^sg&AyfivdXGJxzpl z__C@#(_ai!?RF&vr3UqUn9rwsXaqL}^;=Zy&}{DzQn!PQpZ*4RzZ%)uMrVoCzGZ|J zg{sg0wo}K$>}~)X6hoq&Y~_6jkh_HZ5nIQIPS1*mSfO7k4abPi{TQ<>G$a?6iuYn9 zP<2a1ff~=jL}M##MzQN)%}mN*e1cK-%4?I5`A2%b(jcIWez<}ck3b(?|9xT6QJ)z> zN;LHx{&Dt%AQ0)Q8H&Em%_$zo-mO86ka2rI%n(1?8m)!kv>55gn<7$ZKi_dOrk%NAfd9Q~vA`%uphb#$e0po6~PLfE8# zPw>j;S{HQdEnBps6R63GND05!b}bVLa&n6h^=DnbYRG}G9Prv$qbICuEuXdkH8BYI z6Sa-S^>r+bu#hT>i8TY>UT8Zv+HuDwBu*@+qsTa!FqkaTVo-giWpLv8ZR zT?x)guAwZ$_%jlApqd5tyS@#EQ5-{=-86o^PLfVQ>U!LwuN zs8c~F(!*_ybyAav0=?{@h)WE}^k*&r{EmMU=Q?}_3INP?-Lxcr^`Ku<vKK|?fkXXv}em(fts7NA$rWVCY*Tv-UHPw z6>;P;bpSXHGRD0K1Y(G>s-`BX_k2FTIJ{Kqn>SiIHU^&d@BYKaW8Ah4PKb&^&V7To zgSuyV_bYggZfNM}6%eRF7AcN3B+VG-u;kTdgPwMjK|Y*jF0d0ANgfx-r@N~+j%;?k=YHVyTR4mvA2ym;l{}=$P+8)A>`vIWp+MleW&=1*D zvTY!Ng%mYR!bcJzj7*%!`;BZWU1iA;KdD1 z@HVvrD@Hk_PImU_n!Nmuw%WL2!PHB6(oq%)6|x~4t6F~&mrw3k(df(JTTS2{Si8w! zlIt=3h$j`fco>h28kGcX?)+T*r(fmvTvp<(>XXwS%O0bqioVfnkk@b};Wkari3G>fk-ijtW6)F>TvQx4~kOmjo{X;S8M!%UkksdRUpHdpu6a)h|9O;I}gvU zO+;oI@ukT=8Tu`wK$?)NP##eb-s>Yq9xb|LeitoSwJTOffs5&J&3DJy9){9#$Lig%^{$1E#I*HV(IUnto#v02>96Sg z^)m1-*chjCER(FaDR<6u_bsiVIP5WF51@56$G}wMnz(3gy?yJ$(5X**f%JC9$^Qtd zzn;uX6QhtYCr@U``%iy{=fC3=W&3yP8mZp88Mps_gNOq$$^RT9Sga6)4*&`{B}xM8 z14cvMpwFgIj@KHhV_X1!LNu>MG~Dn-w@gIGF3o!I^UpxmEw3Yw_ahA=M8<^mo3Jd) zC8y$hVFv}P-{ks(h6M{5(Q8QJFfAdg3zg=f;Z=PB8e*K;nWh~E8dv%h^lax9#IFt) z`PT)9*Plw41??GcY$Sv)Dy7nr;2)niZv$$qKK4;L9A*Z>hq>#5blB?0&dGj%N|P*@@_)RCmap`@VsiJIyD;vvtT6Vbar6+=d}ahyp%<% zc<+n->SZQrBt;Q<-ySy^AR*mp=^E8N3|bvkDPVV zw~L2r^a<@~RQK%-y!x;w`|e6U>#~7BQ z25<_veT==)r^p^WR6@7t3d#W4EB)cy*TNYL&1KBx$Fr1w_(5%3pQ76VxvYM|F|$&A zs;J(Mu5F#q@1=KI)G^&ZLxWt>Y|YP9xTLRBgZEv-CNF z)2W1xe|NDS^Z9h9@peKXoi$i+wyX#h-{B?Jd%fwfC0;l=33;vvBBImdJrlD&=afAj zKZInT`#dbUu0V)7;V zyo=#CemBDQMhHkmMvN2Bbz~Rkw;nAS$`%>j6vi2eoK;g$@?<|r!8w)>Vq02^k(7Iz zvme|Up;c0Sb%p!vnp!s{{h|CHTYbLBL}S|Aw;we7tXabXZ-=g3>gm9{i=aO)_4Mt# zO~0(Y|7QxJNp9VXsgjxw$ z=T!iBA(E+hg%#VZk}gOPsJ{!2o7%|BQ?Xjk*d+byK z1&qp#_B^ot%GuK&PYaj!G6w)Ri%`DnM+0Nbn;vwwgn5iRxJB&x{x~z#SV!~1Cb$PJ ze_vNBS188s2r~~g`|MKQ!T7mBbTDOZvvxS&-Ph64vA!~Zf2A}UDBhkT4l+ZXi+Ne^ zZ9|LOm9(n~38!L924_Y-{|5TeB*0r8>@ekRbS|%?nye`%Z)31_CbXw*Jv%(zuZ$)A z#7U}Q0i5Z1q_?j!9}qdfsnp&QH{-YWABV|*+=ocUfojZcw%Esx$+tb;jRg-hbzw70 z{G;B>{Y*A@PS3Ji92Cl-+{@nr9A#{pHcvA?BvwlCAgd0k%nv>~tsK1?pV|K3d$dO5BAhZn zhwmWSpq7}OF^fW>!jo3n1bbJV)B@wFPu}mAf9p=kjpFYbDg~SE;HZMrYY(@u-^4BO zyQ}av>k){J$3f(x_U`V``Bhv&cJ7?QA05G%gMQ1f<`L2@iA_6oG7x8om=)Y+~iJvr({PaNJ z4v3kKX2%IYGL$24!C!h(r3j{Z&)nu)9qYWsb^y2UgYRJ}V^bEiXS2K6y`7L?3?ig{ zTdIdEecx6fQhgJiSb{x$jBWRsrMec(h{5O!aDvQ&zFn_+njQBL=*ZXP|wN z**BRwcn#mpi(N26?GqCeeqL21@w{ur<%eI{g8H)60%h~F|1}yUkz4a!Uu^~EgI~hM z`}DQWWRGSzb!y!p^smib&HQ3#nJF;WlnaWtGisNI_Q{+zw%5mr{}eg^*|=p75tjzN zu!ps5_bnf>h7ezQaXXo-D|E*++#AAP)Z@qBp2!XCqn4$Hs~X#+?^dGnOB?`z;=4L| zRmvwN3Wrv7JQWX_iMGi%Rvhz^L$!uy^K^sJ**>vEmyo{GlA_>hS1{P@yk>@q{HKCh z>l2q*GLy+ID$TH)Gb2kEiccAN6K-BOTMAAXxU{`6u*O6 zs|a)DWC!uB2n4~$+qD@A`!qwXeI``17_u7B1yBDIvoXV~(>sAkl_gL6LlMtzO$OPzwL)mT@m}Fs$2qz#4LJ&jl6UppwuAh~-#a zd-Eg97AftDXPwWWNdCuVeG8h!NyifXLvFf)Y5FEdN~E&IBEa}X-H~N6vG{N9EzV&% z_r9-jgOoR&%*Bn4=g&OB$9nWlrB#lWA8W_@RJ0m1z+iAJkrsAAS1{hKOg&0^s2fc_ z$MjVT$@#I7q;n25iTBMK@lneQx+L^e8~b3dzAE|_k6M8BE`BhAuSCzv;4FaTY_DTu zj=LvW_ajR6cNN=*XmoUM_RTN$gJDLnl%1|pmM+3LsYv{>Hx!Lp$1m*WnSJe$DT#=5 z*XK=t)s3n6FlP;!dh_~Rva2y3O4aG91ufqWr+C{tDC@cTZ3h9MnOmv-2aO&#$)Ai7 zbHg-)Fa14orVs;FiR6YEQ17@u$`%;n1sa<*P-GYJ6Sw9mFp^>k=AX&@ zRRPe1rQTeH(iDF0b5dYDbz=Cte%co`6Kl;;Zyk|`^y(@zF)-C#nQ%ByCx5mK^k{fu z6t8GB?t0&@Y&NDT{^qyir~A5Ao-X=q8~5T=k zl8LJ++O{uFIw4E#Gt;hv;^~!9%R}E(nuu>B)Slc+$@8hB1S#*zjCaZu1^^9VEn5qA zZ?Sa-X<@u`ysdLBE$xO2Z;QYZbai>uE}FNK>WR9*ljm+rIbaB0o> zDby{{b}w~2#Hlt{Cpg5Zc;+2z$FE{b+O>`J_`BfV0)9mTdCl%%&}HIiY%>W5TKH>h zcMaPXW2JJPbdX0m>8tWdUkq+im8ttI;o{qX`70l&0w83J3piXT<&hTpn};(NpX`~c z_;(|f=vo@V^!0#J?LRxju)y6Au2M0(z|9hy%OFCsq4AeO9ElmJo>1?>V#~Gxs>$py6rK@X@Wy>PS;D z_-CLG%9?{zfRe85i-b^eA2oh?cR{Z(_FuXq`oDBX>r6Z-J8lJj&jyuWQ`UMmh1nWw z>8o~LAoZOp!gxcFo@jikuW@(#5(*ww~FDrWh zC*@)3enjXs-rJVj&VQ0e{3;CnL!r97O*v5HUvi+;U)wJJNX+F2go?@1{Xr%Lh%B9S z#mDOsuRl6Xm2DChCp)T0AIB4ovuojtr%*o^PES1q6(fU#;0^_slkZyIxZ~(XHki`g z2iT{AhmVi^%PZp7gy_Dfvq#_0ZX2*pq6=MQ`}OT1PsW>Bj%VWyi^_yOT1=P{r*q!e zp-DlCtwb3!If7f$+=G0HtM^kabw(+)zFx0>gyp0o))2&I(cGb`>r?^Az3~`)pqXgE ztmZT2w;s_+rK5YI%RzIe=GD1h%$-Qrn?XRcxq|w9liff;Xx{m0* z3A*r?$wNsG0ld0_*`3*;uMo_oJA-VOSD2%rzrCqib#<@o^G^CeA>}fTB|{7Fwb8ew zI{`Ib|K9R&pN1;xnYs}s<|0MYaf*ivGWx+AkL&uR!o`~;`5A?#Q-xfrdDv?{LHx`O>laBA@=-uB3$n0FfD;s-Z=t`?AL;S$K6ETyneZdzZ{-pV`GN1-fLk zh>Fwcw4le32UcOWo&^*&dYXWJPi7na2IBRHqJOzBZM<=1Ayc?VOiiH1qKx~8GM68M z*=GJ?R%f{IOs=mDehc991ygwNRiEtLcOpY>ot`1jWx=NZukl@ZQM64tew<@AZkMh4 zxo5#^GvFwltHNGk+m5gEqr!YBm7&R9s6e?2`-%l6v!pqtie3u-$lX4*9!lY|A zlAVHHmXW1yXTn-Y-#{Z~vS~CHXGLfxAVlYIc0+WiCpbReMG{ieFZjcWn;< zcLZcl{JA3_%bDj9SAtfr|GW)oGpmd`amoCh17@MmK6czY(Ti;T&b7sH-An|%iM9l4T{#bc%_Z`9PP*td;@T~r|dl#Kp>RrmvPlPwD3$pIkAMAp+H7k+S z|Bnnr*FLuZHSn3>EAwJ-r}OoWuWD}w(%a&ozM+mHnN9LG>OK0M&wM<{>N`KP;c{LD zdfAgudWDPHza743=^~T=8Do#^J)}zZ$W?{UE;6_4OLb*}*lG=QInYC&-!eP9GO%iD zLI0Ral-_*f|Mk!%u|ezzl02^{2IO~H@*v67CBfw)Y_DykEe9o7gR+pSMe6mHhez{` zNlaff_=kc(pV-BS%iL76mC$|!Wf9VxS_hH~rHE+jbhm_j7m%@fe>(|0$1e;;%)!fx zyZqw7t`i`(6sGL?#OT%XPe>cbh z8Nw=w*!iW+|BTT<#5{{JymbDo3smvhyGM=}BSi}yo?(Ygbe!_-$qP2Ze# zoetn$_%yy8{i)wHJuo9-|KN1Lk4JT9d=z?O&a@A-caZJ=!`@Nl7(q_U{O)bD5G}VA zSi7A6ssHxUnX?;qHb_VLgYt=xQWyBYw&LVx6u(7meir|+!8DVFoV%fUfEUbt_!_K| zV!=-5=||_hx!qaIAjKT0D(0AAXp@=NT(&sVuis#Jwp1Lb5vd#jH&JC5;6yVhas$1m zp?I}|pu_k;@4mvh9&Z9@L#{~&bMo|$jHi&uq3f8%1Mr_Zao!zxd`swdz-?{g6+p9q!ma(dg}>I<^N@W*e9q{ zNhug3&PZR~4a{GXtC-K$dOjs@4U#By2Or#mn_)xuFTLvjxa0r#FO2jKDH^(7w;?(o zE=vRt$Mof>>n+vXwwRnU29c8v*9sCy>DXYgb_syju8&0OhZ2WPnko_goWOZg5Q&WB zb?*zCk+?7uKO*)P+Rrh5La{nr210|#q~Y-k;zSTS+2@rD81Q24}^eUYZM>M2`CPS?pN?r`d=J!lZ!5Dhjxc#wMDbVHrd-4e9v^TyhfmPo|=?2Yglzb)U5e5}9I z=(pk02emVKwLvZ5j<_n-`=w@oZHePE%N$Deys49KoMYFSs?uj&wB`3;bk+@3Qt5{4 zlJI?6JoeyyxhL(RtT4SU3NE*&H$GGK3Fz|9-E?_d(GRz398}P57`f&XVYDU}EB$e- zpc%jEU_I8Zh@aX0=T1}EH_ce*)P#bd#*RDo#0mC$pK3z0Rg=angD_?tfy^Ok9rUm# z)_Uvc-~d%T3EY)|M7Ly1ex^UbCmw3o5TkCo2@)osPdRCROYwLR&bEI3+V)!T>U!B( zaV%&kPo))?c2rFo4T@!WsPrmrq7F5tbTPnCa z8a~Xwn+A_BNta4}=`J-C+}w`JzKsEQMBBEx+Za4yYwJ%Z$@J9e?!yyY_jT&pb>i z-?X#Ud#SbH^&L)0YD%Aub-b-MOJJvJY zHKe9Wex@+CmMw=Fx2;ZuuOna+t`kos0cNO_@I}})9bU@kgaMlm*1^#fsu8Y5wsD-K zG##@&Ukc?uyhdJUt(C2x^E1q=GcI82Lg6ig5%y=Hh8cB^e)bR@=O@be)+~DwWd}6H zB7gW9M4d0|2AJe)RcKU=Q{`i_J$J(zGF5{oTq35Fd;UxjWjQH|%U})l2+5vI3sP(f z`nRK8tcozX*`-MaR_ugQ8fDq+mt307_e|MkqomXcX;b?$qDZ@Ukw;j&N?(xeOql~= zMFhw^x>iYa;V>_>xjXcD>qZMs^?uX`lmos|zF`>UiyvE<2xok)MhWqshR&w~WKrV` zzP-mB7kZI)-g%?stPTJ;L8rS^)yxIs^*>kIs@duZ;rqG<;nH}Jju-q^O)hVy4sZ;I zYuy1U0Ki^FnXdo*Y=nUs>)leZ%M1|)?E?^2_&eV0@_VB7Mkn~a1?Et&-uZm4go`u& z`c?)Qw*Yw>iWv&p$jjz1lvR2u-$0xb2Le)UsA`yAb_d@jnt^ia)#G+UioBzZGS@&C zlKPoya_|)7r_$vvgWQV+%CAAb_`F!W!2Oj*sTC^7xJY&$7Xi_uNo%0B>fBF5p^-0O zyB*!ibontEd^<$bomHB)?a9A4NZnEa({+m^h{0m#R3rzjL+0Im?)tI}FGV**UgqtM zvew&s;$ZH~uJ>TuKm;c#AUylB5PkED2VP~6!R!A2ag>vI+s;xFa(72%{FxbzFPU9L JU$`ChzW^AlH46X$ literal 0 HcmV?d00001 diff --git a/docs/installationprocedure/img/plugins.png b/docs/installationprocedure/img/plugins.png new file mode 100644 index 0000000000000000000000000000000000000000..8f7ea596fdd6ced1c5471fb2c32168965fc8f0e1 GIT binary patch literal 52382 zcmb@tWmFtdw>DTw>9%5ZRS ztJ`v0;IE&ZMAe;?Y)zb8e>fNerZ%?L#`KPc4#vhdj%Kz_7f{{&06+vtiU=yZWu30O zdMT?sFatr{>H%peNzIzq?uc*T&DRg+E0>JhR$FiDX{w9 z*aBZ0@`W&}iv3ckBp*vIW+ocLdY%}34Ahm1x#flZ;?0*M2)j4Zt&>7yGdWE~$|_d_ zA&P?+^h==#ZM%(ZJ0$}No~^g;Q0`N%tZ&`<9*k~=_rD-k4M}^m8g2f4HBP!HFcu{L z)HU3NUPpXrXLuC#gI^_5=LF=iV9lj9x`_kc&3*iRWe?6(NY;2WVO~5&HTxaw9K7Eq z^*u7|7TlgIj!A@`JHO6c?xRqJ$}Y4!w4H=hfgL^9y~}g==_58BXJA5uA?``|E9$luHW92bnvM&n68@`~E zqI5l$+Tx08GQ^v-KlBqkPnJjrXxF5;E*hwKP**rWXUHengjwz$Gw)9|Q4pTxpnpLQ zF`fOp}p;KLdt56}c#j z7XsQa`m_QbdEYDMh9SOHak*&ouzhnN4u!RRjEDNfT&xNK$medJR2cXfVB%5>f2E-; z4z3mO7W38f+fmF3ry>>q1>3~|Wxg0IA+a6}v$73hY09RQqQnLOv3~g~Wl&YevEOIa zjTr+etzlr00<^_WN42;rthr#Os4-9t#?~j1W0lbg;PJ)@ zN6m_DD}lusD`TJA5nb2-2`Wg%%^x#s-w}mfTSlldqN~x<73tNO@a5_dEDL2A)Xeu3 z6Cvi9lgE3g_oN!5%+1*&(X*v+vzW=uXSM{<5eJ)%NfRDNd;w_$A*|-@TNB zTR@*6@)^0xf}8`h&E0>MfB;H0QE?o-l}D7dPzav<`i3&WWc4wU0vP}c?~0GRWA;|% z54;mD{aaiu8I8iq_5^dY9e7Yt3Lb5ZGTR(Mi}EDYB}rj|bUwScC%HW#t2q;X8`YwH ziS*KzFkC**7*cvI&1=-)nA>`Wa5N-vh9w~7>fxOYe1q8Kw#s_X2?$U{3nQT-F4>u5 zN9>`GPA}4ABrGQ+Or_D4i>G@vVK1QeCDhG2}ywxov6r7|v1g*jjsdAr54N zi8@JQ=5p^)c~g>WboEUOwf#*VfF~jOIt)dTsUd;OGh~6L!DTz~DNvxp<%r%|Kzp5fiFL*0ogQjE&i>fDB|84 zoeC0i3ZXHmVp#53vWN=R&7TTWO0mN?@f#H+CcT=xhSsb*fGVnajGnDOu`&!1==xg_ zyv&HLR~kqpw#*!v(0KrKUNS;*76}k_7$6Si(tYn34+B7>6*)v_Mf;a+X%-?T0?_!>Brc@kay?W>=RN&xy)-}<=7}j?~(Wq57ug`|(oDi;h%Car0X4hU)C1%tE z0D@Gczkq{BqxzLQqW2jvHBdCxBzItkCiQt0G$xgSoArw`}wS>Wgr+uMZ4TCrc zwT)%nA+uJgmO==Q*vYgvKKy?g$p4eMOqn3n4nacJVKOYJtgn$PI4&ybx@sS9pU`cY zt1Sq4!&TQ(4kr!aZ#2p&&6L&?cTy2`K7*xQ%o^fc6p&NvjzCy}Sy=QZa#}oDJJ4c% z&Uw4W*gB~KUlAOcDhT=_Rnb?N5@<~M&JX}@ZLPe|Ly$+crImW3FlUg$a9k3HV~15L z_mcSQ)1Zc__kS-;_HVmp25Di6FdtGuxtJKv#Dvp zq_M5NJv1l?wL(wZYn+~D)0?hOvf9J#siiBXIPj#RVrE7WxV*h}c67Y}*?|{`V9d)q ze7D8h^L}A&?k620ASx<)e0+>SDdXVca$Xtty*g#4qD}Bkce#I_QtBh5-utD~&!rY= z<76~{e(z780PUf1WAcPT@ff%OCNgGpz~yvFaMsB{F=5;U5e4PqHBLm3)8kZK(!Orq z!r8?|Rz~I%#NEZJnw}nGyu{1PYa%+v^YG?Zxcoa0&g<|1yQi`Agaq_tMR-80aC&l* zk%FQG<^7d|mG#BpQa|x`5A%0*b@lI7R(hf{l27R@(K0f_g<=}?DOuNtTH^;>TU$MO zc{@8hBO@bWVPP96!}_eh-CsIOvla-Zqc6QD+>Pn=POG!Fy2#4SnMy;WDqHg3YLFgmW;6g!e&Q zBnpos2G!xJH`v*7am9)~cY zYk+gm8;poQC`pzun##a7w}?XcwIEgaS7k*_)4MKhvQ*{#h&?`#l$`waV;|E;U~hl_ z*5?56$|W?u}0=M~mx5cqK2 zSTg}c5hQ&~eIZDd6;-V1-{IlmH8eC3if1%xVf|WKS`e`r@0_FH@)>T_X-39|a9GVy ziHpkX>iQ5A$by29aGegu(sL?63*iMz=J2Dx99pwV%v-f}!7KSpybJ^Lfr64!nhc$h zvG(EN;mc}sX>l<*IpydlwOl@RJ-y9Q;(e^-chm8v?7>OMp2EakLm}@u=J3$OCk`bH z$hGV$_Vdk6Yn{fkZ;ayelKsiFckkf8-&>Obr~(c~LIwt69v*fQLzmlqTrqf9U#b-< z=V|7re)Qp_$Vf?@fN;=+bdJ);2JN$6Pn1jdzkdB{e{}`OgD0r1Oa>Ds66PV4Yh$+}k4~BP&y;X%*VOI9wbhUJh-* zu>yd22m+iELJxRW%i5Wj9aHdx_}g zg0>18QWm9^S5YD%300Gl$jHdbO3PYNaT-mH`ppjyd#%FGR zH)?g)C{|b}UePY9GC$8D>FGi@s;Z^}K8)8lH>{cC=;cnU3)S=U^NQ(Ke=fHJNlDyt zI5Njqn{1r#FLC%hoNPl_?M06Mpyh9#a&>~fZ*cI$baj}~2+sm>_H{>l{fZGLZ`Xgm zcZyAC62Dfkm`>bme?(Ql+}+u|FDeEL#%lNBN12PwZatc0n&gqC7S8XUaJO=NiH~lA zoM8C_B#IS*I0-T|G&C6*8Rqmci$+L4@3XM9G=lPTto0q+fARc}1s^{MOIcJ1O~Y1K7L2UCj8Fjj8cpG*a><_^EVVwD zXHf)U2kp8WcM>YPmTY?3=9cpDgo`93WSltB-Vd2isPIzMRSp2$N zd{a}?lpo48^R+hTaDiTYx-Guisz3Un3`4AW9c)&^uYt=erTS4&M$BOf-S^|n&qOY) zGS|Gm-a&TlJ`;BsYEMBTB%cL*ynKB4C+)WbVGSuMg-H@ev95&Emkp$!^4LeJ<%2E^V zEDjRdNJ&Ypl1zI+7}2!Xn{9d%s2t!L1{7*qRbzK<9hc>TH&D-kn0}K5<8Y z8o0An7h`kCok+*r;nt}yUE2PKW0SHv;g#&!{bF~v;B4u`EpO4e&D~Y)HW-2tE!2+9 zVanC*vU~QyE|TV+&ezl1KfaQ$<;~4GRF`V>u@TRa9=YO9m9%a_m*(rn%gfph*NfgK z+t9l%_zJ0td zW;FpK%d=wi!p7H7<7(d4yXV{m+m+VGXTr8eXwTz5Q8?%0yV~pNjNiK@F{!z)e-B5e z%S$kh`}Yk*c#RI2`G3@rI(Z2%ynVsWECZ@rDZDp}X_ZBOUU`xG9q};`{F=l{jTBDk zCl$Ba*!Wd4qRLjj|K*m6V1XWAmVk<&61wJmY=LhdC>XT6pGllYP_#ti?zFc45|-cx z$3Pi-3m++iQ{uYx(1RRrwWaSeOd&^cv@zI8{GN&2wn?bwCBp39VSiC$08F!G z4Ug~fIg3rS?p)V>?fKaCPe1$7 z)C?4x5$J3WCn&07dTvX%_^joUzsY*B1F3O2Wsi}#=6S7HC!hLO|B4wrT$_Z((7k3D zr6n5v=SMD)?GRr}rKqCbcx;vQ=AHECu!PIuzK^BM5u^RY!_eQXT7TN!E9?)sRla62 zereZ_x|Q(1;JZ%De%!IvyIASoHNe2&8cI=vDj*}9=DOFfTXS_2BJ%ss=m};igUjm< zVe&U_H{UWzgHSi**M%yTy;K6%Hg#B8)49;hboN@{3w1IqG|372#A5B~`MgGOd8{3H zTjNybzW;l)5iRM5VFEAS(jRl`I-8ixvr#v)=slF|vWCVKojrq6nHWkg@%r+Azt(t} z-+huV+p8W|6!6?beg!>ykdd3#`U#OYr|o$x3c?qnuUE`WuJo=;%}yrT+18x~@J&bu zQ;04tCE-~2)pe4;k;1}!;9(k?dX$q@%X+%37cPy(3ec>yvQ}vG6pbb1A?cyzCST}# zdz_N(qmcb_v9Kh;DT~EqzEGAQ&oAViJ-yIgja7HMLQPYJ>887roP_=bcV|d0Zs8*V zkNZKl}Lw7)9vQlVq zxPyoDO#FdMN~^B9sJ$4Zt-CxZ#&|_!;}_qw+4I0Ii)Sf$bQwFf6YYj$0$3r0f)cKq~KS_#HV&U}t5(l_{3 z4%z$CdF0q0!*=}dGf5{K-uzu1W@1iTZPBW%rbV%@ylA|*QAaN6)V*W-T-?uwg0W$4dYUq`|cg7 z`}j8uAnpDw`*mhWV` zENy$=SC-fPq3N`^`Mz3bJ5FbHq`78k{q=a$ z$wp)I@R#HL=w$6t!71$#492cE&e7~AMiL%1pt2Bx;jwlNtGO*%X{PIcL1`xSr))x_ zkaQGqG}{yK|E+PjH{sX1YD1Z&dFVohA`X%lxYpxM%&r_?t8?*YGtMV1IzqeUwKK|y zx$a|y-ez8g3tgu@{a|0Gt)@Ww3}pSTxg%hjUWz_T0A3w`859v60--CETw`;-kD@Y=msp8MJjTEG>^?yNH4M9EnUJRzkZF}q0$dZ6u0iKiF%U-kzR^S`9 z3gCohl*QUzty}8HWd3%Gb3R?{oyu`A9G)YzC=SuHn6uLHHC0Vfrd3>)11a5ZG7bJd zC==PMdp}Esfjlc&DW>K9O@V=LQ5lSWJ6YN=USA=(gHg`~40Lc!wcuF2vQD z@I;~uuGxcBXx#%vp@9K!5eL7qjWg=o=*Wsmsyaxu?3{g8_KCMZIiBdS!%55x2tVgY z$-BfA#8KYBr3f)RfQcY6*URW*@@pS^1|opJZHk~y6dSRmDQH<=7~ zxQ-SF%Wv7@nr>!nf@PUW{giq6P-B`|bP@oND~+!HLMgU`43q@AT1#rm-1e~t&yEF| zR+S4y(EJk0jjV&=A+9vV@{%A(OBwK}S56#!UQX&GLUYqj*Sh#?&ewkH9II3VL=Bkp z9%7L_9E*Xv^T+xkj@t{3@HusfrLlI2H$%k=;88d4-Z2xNVPaWvD$n6^sk?aRn{^~H zh>WSAqkdyzOLqf2u?zGoV5@0il6w0c)#nQDADwZ~3@V=+SKumRv$!6QJh@~r#P#$n zIy=n!mw$I_aq3D#ElDjh3LpYWinMc$ms<;OZRz@n6#R8d9M74PuFwLWwY4`TDp81M z%tIx50@OMQq3Z%~djkCGY@8Cb^Wuy+mCdkXmXP9;2>9c8zc{=eqi@1DMO=IonZWRy zc>B1tY}I7aRTCkH(Y&J?c39I%pXI%I2}Rp10BD~r7m`<#0Dfj&UaYJ119Ave;!YCB z@s8uoo5Pg2*DN3%-cOk1@%GX5yntV0ehAXd{1iacl#;`xG!6lP_<1|LHjkf>#}zd9 z&nZl^Fb-sF9_;)2ZJuyyRfxd@cDZ$Ndj-XF{0lBTfM*SlCpn><(hWPi=A)Q z-FQ%Wn(Ds~9)bt_7^pRM4%5uP^>{1gent zM;1L4S~@x_GqX6_wzN()Ej3CwA^ok|jmM9~L2*z&Y)w%tZEP0I8m-hCG_4&S9S3)` zAJ0*8J-4IPHdZwZo^P|S+01KSjBUqdE;77njcc%Lq&#=eI_LSCg~5!<`_J*kT{xM| zy(*WE;PmQ~DTv)DfzF%)P^MPqw2fh|FTxzuD}UvGMz4oL3XM~;S}(;-(Q=yW`&8T@ z@igs=P)etB)O0Ub$*bp0t{~l$boEC2`TotYTy8(7R$y7n21CSpEO2szFu&tRsF%!& zo+?g(*NHR;w_;qkK1UnX)jGM_X?HZ+rA7XiY5xfZMS1a_HpHQT&9qW%sOgJ0*X>&F zAkSiH=bKMmY-#cG%F0w(&gI-M<>m>LCu^?vJ}rR}0(X}`<;`lKocCQ!H3X~T&F&_t zPNus*8HxggT1raR8kLhrOrU+5$krO&8$6P7P{`P3B~ujl2`-6a{E+Wk4J8^_}rd3mH@kwV{Yn;U*jBSNhR z6fJrfUzl!Yn!I;E3(o~uk=;vrtQQT}^d@5*N95)g!MeQ1r23=FN!}cn7&t@)WCd^aU0{+lUu>a~MDl zL6jjlePaFCsNLK=Kv4xvXOao$R5>gLDvv>u5BC%a%K-e=`r#+i-Tgr6lTP;Y?fYGF zomjPn0M%rW+tqAT20Zma;o+QNj(v&j<7v$Q$_0>>Uh9QQg7%wlJ?`k^H3oE9%34;->JaBYf7==|{I@j`b#vc5iJDUAmJFDxj)Z9TRWU zo6qUF0%s@KN9epf{n~2UJ+wT1Z~XN3aNZtz0zH0N>a$A{k!5Gil7Aii2bm`cDTB>; zmZ!GMaY=fc+1k7yCm?3>r)f>Iim29h?7O;8HG-C5;HX4@dc!pfRH!9&o{piILT+vw z`izroCby{g@`|nWkrs~__~_Fj4|}n3nKn=VsO8(MAOV1djM3aL<;`e<*l2A1Nmmz; z?x>b@iJ|-gV=V_}tADHZ`;(Gfw6f^6SP9ME=X>JW0h{?{{kh%{Vv>?)x`E#Z^ZC4n zFU#lVBfbBM7C#sGD4=kXUC*nmdi7?J&AY#^xb|Z*S*a@hK;wk1_i{In9M@2W4&q~P zxV^qDE|pts)S6h;Cef9dv6~lF)jTO-GQv)$aGGyjoHS?6I5;qA)O6gX3H+Tmd)&4f zw=g*Vx#OkK_hnFpK7Mqa6%p~JjzC_L#BIJIwgB(MMM`Ys6hnD;dh+9enx}AX_MRAzIOW&M z?pgjuc^PhYFcDq0N&24%$!Bxr)BCe*Q`JN{1 z0ike|o(oNe`4zCecH(RE(fg{=2#KGXfY@nKI{V%2 zxf$8~x>Zz+;$paQU2Z{gSbQ{F3+l0R&`4hy%6NpexX6FIV@)QrB%ZBWP2 zGzuHmptA1k%gdv61ks}=l*TW=)itF8&gZ4!fPPee)ge0qLLoCE2Z>CSTih;+v-$lw zM_+=ACy>T>Gw$bISiHaP!BIO^4et+|yf};Q6aPYsXph42P!FUt?yIv!+d8`9FCOoe z!e4Na|M{d~b@21``TpJ+4vv_0tEi}G&EvifYI=UH2k=WJZ0faL`QFbY&&YQ;!Ksa5XFs z`e&*tO6JjhHC*cMqaK#psyG;*y4Vyh!Z`oU;~RKKVE%+W9~O7F@(HXO(Q+!OLpMZy z8kNqR$fZ_`mUVN!`w8vbPU#=nF;4!{Z|<+l3Xn&`O+O%oYhxa>Qv?agbHMKC3$v;IFz2tA6t~qWjN;|j&k5hKF zAv)rl@)qJKvsx&*FQz$vhNyU~Y3&!JV~l)y#RT~049Q&W>Om5|3us@FMR+IiqQw+2 zsUsArFj-$gllJ1^SQ`bL9;N<#|GZFhR4H$xKf2<+W976%g7V^j4gm(*c_)=H$stjJ z9BiDB1&cb$&%{pm|8<04omHW1pUBVV#Ng6)Tue(l*=oJ*=JYRiKH(vEJ`WO(S~qu8 zSKl1^`uGmdVEn-O_yNc>4?&F}!6e4)V*;k;=H@Wk!6V?2^d0wVFc|w&)V;R5JEI5H zAzE0FiE_Xi2@tWG;C~$?Z*g68rH#m@^!wR0tE-Jl_nK?C<(~5oGN+0F^E#<1Dd0~f z%zP>-ROp;RYO;Uc1#B#5%Hhxt`prXDaxx3t2?C2RS9mBN9@_dgtJahT6|siHL`NwQ zv^JLw>Y8D_US;OWcIE zpBB3-@9!1R4V{yj_m4vhi-T7MESmE@2VH(GTbYof3x)mG=X5?vB7(ydjs7knUpY@V znlWyYEM?4SPA~IpCCw!)xHT4>*r^WWQ(InVe2f$!@>e>SzA|c~0egq8IAdNh{ce8- zG8c{52atw2e@AQY$VSqC7O=`UdAkjkZ!&nU+{}vc?NL=L*S%W|_M!7NUj1-=Dat7G zHw7I4Xu*L2Z~L3+aTP}nN}NM-=7y#t>(esX)|k-4TIgU~SR>EI8$~-g4JSwYYe@Db z@8mB!fR&vUApigZh`<+SY`8>!EE=1V>3Eg#J1^snI9t6;hg%+hEB;K$GLOpbcH(sP z=#NP#au-zm*~G}=?qg@0B?2~q3a)OZ2JhnSF;R{9BUHTZ_z4C&W~d*HlaWL{`QP^< z_wf+T%I8VsExP47umH13$NT3kW;cE)31CZ1^ zFCz*ek4`?S#aU5_v>Nb0$MQ6qS@P2JOMjZ~;}$p_Z1`=aAozUSMI% zoAu(ix<Y?dVOpCg>C|@U%tBX)9}Mztnr!UZP`{zHQelV%gRxm-otuq zcFz9pqs0a<@4Cb${>mEjM&1*M)REelxz(_|NSroS<%2N4e~KF)`S`4=w#nncat|D9 z|4wJ#FN^oh_-r*yL(>=@;U^d?gP`14VY<#@5Yxcl3{ENJpzR>cz}>cQ{h4=$#-GGW zqQ1*P<}j@m{uh6n3q{Zm#TqCesPv4=lPw5A-rgGkG46}?@zj@WHIvk?A-Ed;_^D_>W{~Np?puL{K`yIo~Y|U za*e_6VV>39a{VVW9ewe#j534@9}NsUpi*`5e2kp;n92{Ezd?M-MnI_l|;O9=*z(;yC z=MJYN@_Nmp4ge?wz&DNm-LzRUlO#v4oL?Ee0_W!Tjvbl>#btgZ?S-fY`=6^v zJws`C7ub`X&9y?Uw2e&}pHqm}QQdSIQdgxjm<4?HSFg$4Tl*W@-Q3pAOUsBx!;@EK zx>B5dH9Ygl4j&l%+u|13YJFY1$QYZ`uI@Yk_UCr-={cP*{U*^Va~^edMhmQ^dw-=I zuQLo##?))Q&K9s*Ag5vPcspzSyPwN{-RIh`pS2LmdvbpDa)xM~AJ*jhDAzUjuJr0IZ?+Q#d zWfwHwLiDyRo|?)PO};1P$A;yHrX534tpAE>dSiaVzel@19l5d!^f~-#5pi3sxdr1caR;F#?>}90aoXJ)jLNa zuWD9Uh1~AvOBKnvSP$Z5xHNO+_tZ$sJnR}q&TKaKZ!XHC{+-MFD)c_}*fB#|_SIt# z{R-}t?4Q2Mz8PW|m&WRB4o66L5f`y;?&0tKp5uTW_oY(RnOC77X-Ugqp{#-|t*G3d zr?Gx$C|8gz+TYnWOl>6=K8|7(s7#V@U!MAm@m-*b!S41pGM#-wPZmgXDJ|=x>`hj~ zH|N<4olCnzZL7bHeDrc{KF9ScQWC?Id2CK;V` zr>KSMj@KAdmLv_?N@bND7qOLUc5}?6J&7_LnytrO2++%n_zVK1WK$OpOr&;%RqTX| z!Lj71dABk^nw(fsAcm}du{T_A675J&%^o)6m-HDCTlR{9wuXf@gDSbcgT1{MVR3ZN z^lTE**Y2tiQ4BtGw>m-9l)6Lc4;2gnNZFiHT;jO=1_mDLQMm*Jr zbfEG>YMsR&Om2#QAMo zD9Np*t*nb~-MSOMIJfI;C#}e}^-hEP*v}zUjiYOQ@Gf=QES*b=8BuN=xh=b8eD5=tC7X#Z; z!*XRBaFR#8^Ht^Y&yIY3r)oAd9ci(V+JiM9xS7<0LY%dQ1?wDXVt}Yv* zZu`ys*w$up(k59X$m}IVgaMb1np>#^pY5+4OCY^Q|30s+BfPJ@rr(A|-HakfFnN1f zaZ%3}9`@rDYP4-$1#{<5IJ3{RDXC4IBtqbr6e>k{#j9b)`A#|2{!s2kukAUK;LqEZ zMg-(Dlo<^0FS29qF(zcp7o(UoGaIhXe}$!9B%Jul?J0L}G}hYSIu}P7a3y&5Z=uqJ zne{e)7go}W#G4u@enKeMbs+nXsgA03zrX4ZIKpRJ%d`c1w0=HS*O1fWS>RuRvA>G9 zGWg(Ep0mF?^ApnFF5)y_jB*bx2NV?8W#EDN2iRkd^w^;tO0qxq&Y1rm^l;mh{Wo1i z6aN1nnn+>h+`6qlxv^}kHjOPyc3-a}g({E2+7qh00DT=XI$LZ_AsU+NreeHj^*CIhCfOYe{(SKxArtFYpthcx}G)4 zPJ=6$3d-Q%Jgv+?hahQ3tAVCQF~-lH`U0Z2KDsxY{VjfT~fTz z=0_?75j5Z%Fv6njzGW9Pz3kamI;J9D)B2PF;duZ>qQr!W8X}*QKhkGyc|kQkK8{=6 zG^(Om-PGFJIxF-$uHAgUtwEYXNMyx%={1&@X+=rst-WpBbn|U}uz#Y4dCMvLt?1{p((U4@P(#Pkb5;0t^`?;Yu3od#YwE41lFYBv??@aqxLEGT?Qg6%0td8L2 z_*QZ+@PvIkC{WzC=7FBSKEVHuS!QbuHJ#M`cv!#{-<|MiGinV3uE2W#5^BV6EU}YH zY<0R%AXn;y*E=m-_){4tC3XbZH*T=n$2gYk(&en@zgV2-^^kt&GMDWIacIYalbem~}Y(lAcR$gccy?J!hC zKDy&{cQd$HJ+Fq|2>t!@MR$Vzg#eb+ol^~YAAz6aE0Xx3OK9U8 zIR8+U@hxLY(Kp)uxvMHLi=K*xu7&D;1w{2YE+uxW8^q_2+B>!0q#-dlXIf2P=OOFd zrK^4Nxuk;LY76qWvg*n64a>bHxbldwv+G>wPt^{iTqy7J!7f1&!&&ydFP+Ej54MH{ zcJZ#uQ>rhl_)m+QGb3V?$MV>PD7WkvRZaecl`%Q*FL3ZO-?`o&N6!POV<{*R2y-gZ znb*Hm%*w?*Y_=YjKO+eH^X?l9v!q)YeNuE1>eAe>J zc;|97I0_yS*Uj1=by;ds+KYE==TkeVv1la_9xRmB!I?UXK@~c3xiL5({q+D3e`Ree zjE-(ox0fAK;F$c!V;kER+6yhUKVea4l_2RtsGf602SYx^3R5@D>vS zh;xg$EB@j?Q|wQU(Tn7+)Y#w(S4 zbT$oM(c^zFF?m|;j#XY|@Vz?00`hMA2Bie}RSD?%WMVxOeGOZF3D%cbc^uBWB70J6 zm(a`1DG>ocpYCg0979Drfkfy~{wQq<(+$c+F72C(I zhcau%3f7wzjRylN9|8qSL7aT?S7}dc=%e8D^XB5@5|I(ElP&>XoN}T7G@NP@&}{Qv z6ONXVa4Ij4L?NP&$3O*&p6??b0`ziTKO;l*afM6Q+n;t{y10Px0k@c}t2Gu$Sxmpf zqj25#$D3+i?BZVXF=;T3B*I~pz2xLPf6VeYDh%5_{cV z$1FOuHzjlN`goyG?{h8ktE<|3f!cvf%|uTYw0rPT_ib9>ZMPz2Xx|1GzNdOF09A-D zx@gR^>h;;%Qtd{C$~AgqL@Ki1Vb>x3`@#9S53T2x<&3V5tiZiRMdj|wUehl&Td%{v zFNhenr>FmS|qM-}ihhaLN>Y`8A>Kzu1s(vahd@(uI`!?@o#t18>qc>v?ib z8@C`+N=ibW=Pf$qx3403pMI@o{BX65f3F2E_mnR@%Vv)u?dr?)2ozh*Y;Mf7^Kx%N zcA`nB&*k=}9JLXqY4L06yGh!w!%TxtB}6b&0C@6%A&K?e_wzsZhH&EWe}X>$4FUbbe$33*nx0SNO(L+$rsDgsgGX$C6r`9@jk#Y) zKut2`57%9T-9+ktZsM;>r2dRCLp=$@H%|44z^#ApWe7FuI&nOV;YN7|b!sjsU%iDO zV!wdvL*;5%x!V_2Q`;4=4v1kY@AR#)fqYm`8v@q`Ld%d37T+7K_rwRWr z`hZoPIF0@vbN15+n@x{XsRlRu^5irho~EqZ?GAL%GbpaV0$w^NPcZ0{rJV*wk7)gt zEQXqCc#EOG?Qx-r{H6dG27Y1N3oj>q&pIK2{V$gTD7MSyW7{tGYhybeXD2G4g0yQL zlrGB;Gz}i22CkkGkws!u%PlJ-=^t)z!46XMAaQ55O?>=t`!C(+oB|jcvL9|O&?o-? z14&ZfRcn{+NT;?(B4h?ViM{j(ig#Ck63q#hRG}*N7>*y4TgtD0F$N(Qaa4%3#vl`% zHySQZb0lTt*ZiSpJ+(i1>Gmy;$e1JL82*O?%HK?^kN)|$p(6%*2!p0S|E;QZ_POqY zXFaY6nkNN#e{VZCTK^kwQnLWNra?9n#OagrZZ*~>8^T?uGM=3MA(0vaQX~ZMe`4gp z)9Cz7oL*b9w=%{HSdQ;c)=X~jJllUIhe>Z+Mi=05F_Ssag6Zm>&$NJ^R&+crY(S{j zW}(nb&z{$36xfKX{{^k=@CtGV$(_f#m%mqASn_GjrIY}LC z($3V=k7q=c9#FF}0YAnTZZ*cCHZ@+C5WcoBAA|(S~4o(`AVS!i2;{M9!qRhhq z3aXzRH@^MX9n)r*qVWY(!9s$w&2~y$U`Ypotca!SE`qE znBOz+Tpt5}gDa4}l?o7v06lx5;KAK4dv*DnD?45P&N4v*f(D{U4_ct_&u2EGufJ$) znls*stnB_5kJHi!@AkiP0sb#Iox}G-T(Iev4G)h`xDs!^-79Ew{`r|Iysk|u{qIfR^i1y=VdLsl=k6^}{qh(Xn?()$ zZFe$9Er?1Lftwzer&_6z0UpRvNfL6)wi z?hHGrfbr0CCNT0Dc@-ATQ9EoEg_mF-fYeA~TDg9t)T7%}|0Z3H<*)c0+*SvC^OV(OFLu6fe}CADgepF$^v*T7PX3@0 zR*4DV=)^_V6~#m4Vb<8tAowLvX>9Z==vXf?Kxbfy#-r}+6qHgS08|kU_V&axVSthD#s1moI0WN4y|kYOhfw)(PD{NS=xGfwTmEd zaTiv7>nj{~@QUgxO~jOy!Z9@fklYi#<_V}H_|T<*GytH@`!j4dIM>;MY7C6cf|C(? z2ZY0=v#0^0ihPvs0?)UZwo1$?3!>}IM)F#MT~AXdjIkUnA5E_$yuQoiK>%SS7Uxlp zn{Us2A$94=g@joLBFmHk4Si~an)5&UWFe+lMHTP|zkV!Ktpt-g-duzBtTN5H^VqBu zcAFV0%aGWthCiC^6<2uW}V9w2yd3l7a8xCeI{hv1Dn2?V#` z!4nAXE{z7Kksyt`b#RwPXXo5=@7#CZnQzUVKRy;~(`y3_8+w;K^{Xm_)pXSOVt{qd zNkY(7@WU*7CrHz!SBhjbzX4Ejvf?i`{%U1yy~?k|maO)o`^3k_hPji2KlcIE8yuHZ zgrm1zYvhk2hjZiv#us#9d)@9;Xzb`mdtY)H?4Q=P=btPqwTXjAw_H51i2!A`i#LtF z=DrZ0Bha#|&X=OOKeE5`+6zN*TrO7?=;ce41G>4sJ=i(tf*4fKh(S;FYJ(rR_W@4L zy;BDhu(SV~#PN5damXN&Ms?v-Ry-c@hw?KN1D7T;?fu2!l2@`{g1u9;lFx+G=0Rf; z+5Q_Kpn7`t1jr`q`})3Ll}y#~&b-JR8OFqB7bz#+7aBBx_4(K{yjv6xX~D^LwC=lg z&vWvt;$~KjLRQx^2j31uDh?42xBBa$pMhth5(+tW6WmJKcFH06)0SslZzHqh%;zIe zRhZw_$HzA5+&HNcHLEAeCKfunYe%43-PC}BEDIh#MTX`<4)~~I$RJpX)ccQK> zA7~v??S6bw)Butb)4>?PqI!n&$}H^@i&+K_w{y|~?gQ;%Ut#s$CYoB3X zrQ=}%%V7nL5H0eAJQsT?T!O39#kVMFx5k@J)yte3Z$~b=)n%3jA3rnA!p<4}uHXp> z)E)wfD=(}$O$%DPuh7TSDfAgx;li#gWz7tjzdxox6_h9HyH^PAY%{hEou#uf-%eAy z0(b<&37R$6xSA5>SB7*tJr|#fc6$Z_9WG#A&MOHcfG_y?cu95Loi}Z0&kZ}XOtsLf zjRR;MU?ZW;@^|f~7{TTo&amghrMdymaRTQ&g(-4X1=d*-Rkw~j*q|aHkR$X0_4dqK z6ak&#B7L(|{xH~hdgTrm^XAS4_(Am%LP(gU;qWZG{OrpNzoJbi{35OL)U*>{FC$`; zY2&r1qZHGH`t$goLi-A8&(HLxUiNz~ORIGHe$3o0nmwINvR3N!6z&N~BMNi4Glo&o zsMmN>6R|+dz_(X(H^MeT)=45pRglw{;R};=%0x`{#Y9A(ij5_nwC@OP08-5Mb zS!^^$;F7uDIr|!zx!L!HIat3{Q%h7>jj>20NY1kcJ$*%#?BgjLJF-Nym9JW+&T>Mo zwAqN-a=xx@mB`t_t{oTT;1A4HSs(aPp5`RT^} zDn7-mo-=##Z+98${4`Xjtdtv|-JjxZ44L=<*(!o;vozIyX_Q;!emCzzUgDzi_M8M8 z%wM)WzSp{OHs><_osOA7#d7AFeM->0I&OqAPidsgBRLQ395~X!g$u%4FwrK z9vB$pFww!&xqR<#WCaTQ)d&^C-r?YSGPz|AHrQ>nz;V4n943cYME54z=P#f2R`~jR zI?B~mtI<+7j#Cx#9918*R_`B5vzKF!?u>0h+zng~YL&q(x{Kq#@;G?H_ITLT0>(6z zBqa8)#)k`@i9^T}!i;6|?v_4xFuBMD8*At4cHrR3;<-{RspG+JGIx)glFg|#3)MI! zFyIZ*4keK-EjCR|#;Se!l=jw<{b}UoR_3nnoqgatF?@~gc?TW zHV&)&Lrp%~Fh{-@ASuGQkv22gruN2JPHx5Ww!0g{+I7s##`&M`E@!k{?X?^SBLzmu zmh@os+LRg<>sK!1;${3dE6&eT_dQg4e6Y!|^a4E3DxoSBrD8vQAGt4qmeJ7qk?y*sZZ-16Dv@AhZ@quHG+?Ks2o~o6)A#XlKiYqG z%vxFfH~Wb3q%*f14fLv=3UyP=eD2{F3f*^sg*{zC1388P=iqBcuM@?6R373MCdkED zhALM9#=Gt9F^a5{1KE%g&Yu1d)G+bc=dPQhtD@7N0XC8zosA7yTAN_fkVSV$^*e{e z_!r9a6-LGrvddN7B@{qTPcHKt}$uxtbUyvLoxRF zo8&h|e_0i_FQhB+7I9{MkY*Ppm)m5>1=}iavx3a*uBT3@2e&h*zuzAYL2#UDw zfE`;Zng3$5D+NJjIFImfui>@pC@ro6uHN+fp{oJ1gk!JWP}^WOeWxs9GgM#l{)*ZS zB{H+&$_|&1pyg(P_u<9vx_Qu=AgFYcWX^Ryh3@}tCbEv($KLo<3W6Tt0e-MQ&gG*s zE2I@xILizRTDN(NieBuumFVEXb!a}HUwoCpYkxN;u(^NjKClklE`Q&tj(h8z1Bz*) zP&vU$!hmu5|t2RXc~Xy}{nK z*POSFRB-}x+=6|wxz0D@)mwVQ@(^>K3?=ui;y*x7Uppr+99-ieeeQCnb~2Rmr-Ztk zy@f|?-lWPy@IZfl5I;s`Xcm+20gAJ)*!IUjfzwFr_`!d4?67RO%owt8hAjl<7pnsr zVaKhV2cV~pGT{5|aFI+(lXRg4d+N8B4?y}Rz`0`&VYv+)$i$x#Ou1ugB&+cy4?ykZ zz$?FpV^F|859>O&76e*m0KU=$hy+&J;ukEVtA7P8Iq;c%^3dJbg=s4B$SMX=+P-!z ze!)d1a1z`YJ(W3aFT>Yh+p(2LKQez!)a4j0UVb~5x_xu=m1<$RiUhfk*|2qFhw}HZ zN*(pK-3yrypBqPX5^etLMnUF?nA!ACuJ(CyQ#V8`I)OgG3F1Z$v^Re!?Gpdx#iP#l zQOK(&4&dthc+(U(W#70v>#lINqMqZ9h-vCno6D=&`I>SuZ9E?*O2uZzU(1F2TarUz zJ(b3il)EGP8FN#`^>=gF^;t(vfR(@C%~gmbbl26d?ulvKr=LQnY@n^CH{Vxu zH!BPc?K;vqgV>f%DZ}){8Lsk#BFtBRAm`2e?mB5+2p7WiG?RIeO*`2F)Nw*^k;u6D zjBEu7iK+wr#xt^9rEVNfmdMFl$I?sId%vWBxEzs-maS`&8>LG;B~i zJMc=RlOGEjPBh4GyE!}y%uI^zB72*#@_4Gd-1~N>#Vg9zT}prIU_KokK4g32yr(Ft z8P8v!%;wa?%6NZm*8PZ@T9tleXz^-smZ#&YU<-XbhG5%4$5(I5n+$H6Bq25FFt5)| zm(yfp-*Lu$b%ith!cSBE!0oa0FKwY%uJ>*|!`O?3%L_N_WSt8ve&|sqcK3xZ(k3uDtU)-B!yQ#)mc@dln*=AcmR5o&4H37w zQdQMu*$8iyh0q~1_j8v0>wEFTIz+Aa$mphUgg@nCUDNrA?UbYgtRA{_-qJh5KXOLg z-~GZ7mvw|M4msJ9+v$3ID|p{JuOWo}#+%&@(opP1VMTG%HH5;f$7lEP#~qa<7v3+* zKuZ;Q7@}2Wa5=K}6tN2nFIy1lQW8b(^WTr$1yRZ)S^fG9d@9p~PnRKh9wG1zYEDbx zr4@@_OJ;047A97EsN16rMNGSjX~m<(+a=B7A5qXkMq@eZ8I{`d2FVT=CIz2b$wU*E zT5IP#1~{UZIW=wW%%VG`1$NF?EFva=GL``Eq29HYijR-S>=rT4>b+0>ylcmPV7PGl zW%FS->+?Ld3{F?ur_$?NI|JH{`2i}t8BV<!Ewh zr@fm;tI^#`W5<*`M;4o$&%7X9fn02C6!6i=h{z%?u?Xu*x`mw9q?0bRsQ3_1eaqzF zuDaVXaW%ZGY)Q;})?a2ykS-8+U`13TUY_lpKp%ye$lCwKM5E~5uYSz8A5yIy?eKRC7IBJ`*h7Q<@R;F4<3Ae;j>zuu~>G?Lsy4den%tB zQ|0F#iy#&=9D@%(iC8d8x|ZS*J$0FS^|WzHDMsU2)Ix}rlLY)@X0FfqTg~9x!(|FJO?S#sZ`%}v+1S!~iHY&G8G zC-q(IF}9%5G5x2>bNl75SyGdZ-$Y}US~gd(pTv8pUD18U0NHj0&yo?WY*52bdEAu`%LoH4NI^@OTIa^l82p%2>U_xaV?$pL_`>=T*>@0qOwe-huW!k4n zUAZCn5O49EZ*O?bW=W+*V29-%80|y0yMJRa2~fBqPv!-4Q+?V&9a1c*B z&Lqsry_$t#5V;g^6jg*)6m*4VKJ1*F-!-fCs)d(5-I|3=w4jBVjbXLC2aC!g1&ws| z1NjbNH^P1wsUf1o!LKli>gq9${_r~|$69$Cotp`6318*_{ty_Jd;2qt*q%l*EyZpF zy3U%59?lXY^w$`!uvW{1{1p6PekC8j5&ctvWB1^7*bT;wgmV8H9>Mc(r89K6xQq&g zxRG^G}lw#KHYSUi}&~<$(#0Y~bN@8+aJd|(2CkWg=*yHWe&?MpE8&Of+ zKybR6TTb)`@|i97kPg|JL!r=Gu0?){5wP<$q{ZlogSxr`t(H45v}k~d+jnl53u!2+ z1?MhmXyp|VU%}ii6Xl|gB)6vxOkjay5Nm_qL>F5{DkyShFd|LF`LhU6Zf`pkD5v$b zOZ5FN-^prNTHRwBlTZgA>A(&i{DigDblQR`3FQ&JG07S;*8v@tj$ThXHe!7)QgK#c z>JabqA6SVG$cX9r-UvJvGZS#dQPZ-B6`#%&@rYI=JLVwvX}5Y}_ti|qwP8TuHQLC@ z$z_HOxVM92dU;_~FSz#XM)cZXNARF>V$L%ENBcx#;*_TQg~FTlkE0hhA)&@F|B|BJ zu@B!g&v$(@+zZyaE-nT+(nOCBN!T18e2>l%k{8CMQq@BfU##e_#=rKJ%b)gfOcwFh zG$w)y_CEn>z1-;7V88n zp&X`x8(Uvl!)ZT|EkInZGv@G`#FhJoy5=fzWxjThl1@lK~ ztI`E!3Ye;i-%dB-o7=H!3KSm{e&uHM9a(fWZK8a~%*Ix>quzsLEU4TOOaF+?D`^pQ zFjHSI+1n^YQ++}(v03qw`PflO>$0J8Y~Mj1tLcmi*BbWab6SDqi$B^49xL+z7?J?% z_lH0K6#oyChks8tIv6xNH?nhcbIZzxcg~{Ss5l-4y~QOXvw1@*4a50>`(Zs0E@@|1 z+F`WJZ{L0)*Ip2BuJfXMc2<{`QlI3rk7FawBe7D=6XEE7cC**Cp=6jJb(q#@$O$Dudb&1(aW;T)}OF3 z)cc)W)iul!!FU~1SoPz+(^4Pv68Keon^4GMuX8x1?=19^M8yA}c*}Rq~6oX^l?* z%%;Qs2?+b>(DS7#SiQjlNsTujoA(bBN*L;V{$hdJRkXGT9W4~RE>++5wd1GuI22Mk z{0%svh^{q%-%2QoW{S7vmP#?QR7B@DI&`bE>nvm}Muud1T=2}TW+^-)-8d4UJV>!S zuq|67meY2b(@?o_&-^19=-)RrmUf{%aN6R|HzR?u>3Ne~>=jLP1=)1ssYZ4}`p@eS z0;ei(kJ!A=OC%5#LqJd`f67gt(sZwR%DX?OVJcML46vRoT}c9-jIj2;r!iu=KM_^SC@20qbwe-t~IVrb3rV= z{Gs8Ax|h?QZiBQ(I|k&jR20cj6ETIe{CnsNmK1B-g*JAlIks-Gk#!3_A31B#Wqb0vJW!3NJ z)X5M;AO;ZV>HS^Z3KiE8ZD+UXl0Jt_(VqxURzBvEvTSezwcwC02ico#qd<||KJFFW&H{{X$wE|}#qL;Q{Q5%&`)Y+2PFdN^hzuu0lx$85?t{Q_ z1~a5N8hTR3QbN{5-Q0`Fh-W4{`bEO7(ynPndD%nV;V*KEHPX0wnoxg2BLcS6{|Zu? zw!_agQ|W2F=iu@YdgQCLkDhH(kUf&xV4T#F^ zH%~02CjAXcQsN{eoV4muC>^Mvrjd)~9M zdzwnGaJoCqIFgo8!RW74;-Xt-N>d3g7}PCOSV z8XX_INY}sMmhCs~`GU!U+j&&-%j}f2v2fZXl|x8YT%u~P0Ziq+O1x9H;3i&HSW`tK zP&J>)p){g?p-}&vvzbu`+FSq@HLkf>C&0cyvEjPkzPD8W5{JkgYTTbRcL!Izk`j}c z@bpoW-E9s+?+K~ms$`*&m#CUsiM>infZcV5NJTKPvW)>rW1g&!-nB~BV_4dmYo--N zvGC2%=;y8RI2*SEXpg)7j@_WNqDLXgrh|Ntr3D8O-FQFpIKYlOzku1?B9Lc+DoFNR?5W{qH7Uwu&sdq z{$#QNu1TbFluL$v956L802}cp9c;(LFw4YD7O;wu=|)tHC>H9T_OO{LjJM2D6BnSC zA|S*iOe9_@i;wF?M)SdJbep-}59y>>Jd~E`+A`tpQBJY82P1Y9&4Od~U8OGw33eUcfm(lP0?4(KpPcFC$lDzSDC?=Fa!jAf?NS znr5fo2PK$13|QH}b_CSr7``&;L@$e2y1uHu_c9$ygQbg!ar&aW@yzMRr;N@uGO-or zB)~a)BY85)!b!R5bLu&vdFeH3LUYbzeos53Nn3s$_EpX8Bi?IMQ=k9iKP2U%9Zf(! zTR(ya=CrhZwB`nH3N;EEf%cq&iwik&&v{=_OPL#O4;1ZZk^ zXpdn3cJ;FZ~dlCHtprY>&k zdv~|Jse(aD^?koqxq6UM%2=CWqYPbj>7V0rG$gvt6dAS$T0^BGh9K8ZfoZ-e&O6pi zQ*(=Y+`75#xvNZ`C*l`T^~z%q!%_FcjPz;r)NTo3;Oa^#IVE3`R)2U)220x z&i#m#Dj$0mig@A&KueSp*L!Um&WRba}1n>*>+4_C(hnw@5? zv>t#s!X2}KAnK35LaE4-xV**J%`TZSIIk=GfC!l0dncE-#5qJDY=1#8Uaf}oDuI(&n2y@l(*3(AR z4+JRm;BJY;ckxIU;g+nT$z|8-|&d)qG#xJtS@Djk22B z(CqheF}k+j53h%S&EjE(eUovlu+(7I2S6PH6M(V5DgU6rCYE@~wejMUe$CqQ^k z3-S*(nC3v7WBx(~6$aV0!AW|QH7_0SkR_-j8a1B}_Gs*3?0v#5(G?UK#$Q|ScOKW* zb3_p38GiKcgfVFr4L5CTSTn3MbQ0ox>1FgTe zn`5kjA|6~wONT=qkp+@iJEGXl@B;iIBT;KC}>eg4=@eYc-^Q30R7oT z(csHp&0Uz@=Loe$JHfmp!0l`?iQC`y0NXs;u`&GoQAC|pg8~)4YvttJ1L<-=uu4tuFuOQ_RNIoGFAzv&+q2l?6BUp{0 z(6HXNSO)qnV)Ns9F+fIt!@>Dq(7&pUO)-G*?aRiuFwoIq31=YCqp$y>fT~Q1hULkj zBsU{FXGQ8oqin#glI3M^mjBk7SN{0c8P?G}#mEV1)aF?7BM{E=XCFWJ=;90@klk9b zW&oavke2eVl=S|FZ@P) zS;*=kw(mpkY|G8fcCLHAQQez?Legb;pv#U<-&VL}c;UCdBLFs;@*z@68=<4K_hR&T zdJ%3sxr3oX)jJ8i!)kM7MuG(NizX{;F669c;cx!;a7@2MhOPcvnz04^XLkQUQ}WS80NZQn{z5}AiB%rHrQSn2 zSNzhzu8B{vN&~3R0zjzyeX8z6i%l}Q#&x*f3k3#;G2M)n(K2q^$O?z7&zaedR@Hf3 zbrh#tqToKaNh>b+HDB^;{94S!Xh-MIog|5(0^j}om8-2In7V&iBP@_dlHSaUD17`! z@*2+0u*DL(@q&GQP(umO;^l;!K)m3!+9gXRU0&nOkq?T3c0MBYGZKvpv#uit+@K@XdqwcBab5O>%SJYLNHx4tl zO_w5x6%ybRN-4H+Jv;C(nQ6z39o!z=N-@no<20=rqY<1F6af!;4Y(cu1+R#QXKNP; zrygerKK%3RpT`Dl#J+EB;m;TabR`$B9C-KNQ(2yE(bp?ahThLf5M8sq*8uCTym zD3S}_J+&J$XqzUG;?~mvhQgOd@-c;y9E*=XVfhi#J+Kjiov7{_jMcKce6H?$*~0?&RuIXOvjxm~5ToD2mA`Lk$s7$nH*$u@wYKX+Q{EmisQ#?DTiTv3ctbf{V zTZvl!D`zFZ?H_I$7!F6*NqPI~XY(B6SwdK!Th=^;)5*`0N+LIxyPyjG^eu_sI3gN(&Kr+BbVM z>MvT2{K97qn+h$t(M`6W7hhkUA~cG0m==M2_#69PsdH#5`v(Vy7WkFh*+LVh{w2?f zW!27U-I)W0%BP{UwY$xn)7*<8t_if9< z*~!i;Ml!E6e64Qe@feFiazlLQw-HEo{Zz5c@Uw$S!JaU2C3jVqpH|5)+xdOpo_BFh z8o){y8#c55Rg(~E%KZ{%w#~Hu{rz8ArJMRLFdMF^Q9Je@wUzvB62O>0Pm6OF5po;g zMp{Lyf3kSKw~^b;IvoAAx$qk%A&gPQ^KZ+{nC&nb`8#~DW3h`&<6=;e+}|d@CRKA1 z@O|rM=vHAggHrT;%3Uz~%+z*iw=%p^LZa)~dXXj$%*!pJ+v|y`$tMIB%40Sc8cDb4 zkwR$A#BqIT9eQEnaPQ#BFH+HvR7CA?Sfu<#N z8#(%Yuw^THL!Kyx#}T7{!nr$MBgD%4N!ta}>*9$*V(MUXGvGZ;#!W~Vukv|DoH4Ox zp(clfMBGIER~CHSV)-=Zg;MywkC7P0!Q2TpZ{zF+z*JRDju`S%4bMqtuHRTfd|)mGvby z1(&^^UxJ#N?e*kOkEa$B?bC4d&4%TK5~zTzLUGPcJCUvpBM&>@T#4niMVN>r z#;r`Gut)H(0+A-m>(S-i*L2XUPrJ?Yl}FG2#@J;x@cZuMEn(XKVsjc*2^{jg`IU#g?eU`g6fQZ ziDtQ5UBmaq4ewL|pz7hEWxxk+z7_gpY#`7^&F($$eTD>xa*+sEy_fO5WH7YM(ccwQ zl&$pbhqZ)fO3`(;3k`m2`%jF&gv@yawp#RhJNRp+sBoNZ?`~gAmU*6KC@b>^H>F%Y z)I8caO853ZUv44k)?*f4tiI;kO(<)!DCrOybP;~aU&L>q-*ee~)Zfwk!^(pB_acYH zBdN!n7;p}zhiY1y=Eq4i`jVz**5O+U0z_m#Fzs;&nUg8O>Z<1PPli<` zEP|%?=e!SpehhStor!&pN1kLV8FIc?{V675a~DB}hE14J7cPRZP|S?`32mxWBi!T3 z4Z$YJ0y5HdE5(rSlT1D^f;pyP`XQDtZ_bMJSIh$Q9k@qy&N;LnTh=EeW)hnGsL7jn z+OwDBirev=`k&eBuu-%PlXWO(ap{7ZkH5+VuPI3@uwai{O;S08K5yF*@%exSL``k7 zIo~vUaaMOR8L7#Lvy4R{OiW2B3V`mqPC!Jlc3KkHf2lHDNwjDyJIuj^cvk(q2F8oc z={p?tI5tP)K5=O03>cIKER6w(ENH2F-u&XawaXXWP!hDc;A3ex5^>b#pY1U0IQ{@M z{P5pd`akQ+%T688^xhM4@bDA1$1%Nu*!UsLPq54z^t*a{fpH@}Jw2mrkAmBw`aV84 zKw8Pc^&91KkVaiz@qrp1Io9I;dy4u0-(%6)$NC?EWg)tHdT7dgq)`^tsIjSsAW-XP zADWV?s;bgb#T*1yCSrb!T2@t6HSVA*Uvt5I7N^K0^zslTdfy#&gj}LoohglJ>APF4 zKl#yUoR6_y+k89S^f|=8nm>S!`dG8&?$=ywTZ8lk3TT(Lr%AdjD5kh;Y|vAv9Q_%vf%_jP%h%JMN9+MI3O1N_E{!uyMUZ!QfY7)9`xi1%fo zY<oPqkn|@bGh`-d6E(%cO8``B%Q~v#z zIbNB~cq8_{H!0fn780siH%aouK5~4!wO`z9iA*p3ESut zyjA91g)dleD^qdA@87;yNg=s17*b+1ximplaK67H2Oc{$*m;^n@i3Gj#>OVs!y8u^ z;0zao$GVgE76zxLF-qtbeV&&o(%6s-B*6gtRCD80q0>}C68h$h`_1lMWT(GZ>}|IL zGN=}dH2&$!dO$qA!q@lIlz0_oES*U5!pCH%)$$Ie+KE>_6UeGO_$E{HIYYUU-#mLv6U@bwq;soC;hO@@+fDqdGGGpJI4QmL}&i3-Bhoq-ury|N;D#TMzyU^)17?@;8B^Z2~g(OSd;` z2g&B_4xO7E~X*QT(OMh!tDh0QXVmvuCt4<};BQ5?a>9`@7B zE`wix?KCz`->TNcb2-@-eWap}VoZ=T$gV%@%NudiZGJwivPeY)V8ej|sHwOP_4A=r zoEnsR#7|c}6*qN2e88XO?Zhr$)yvd9+uh2;n2k>FG5OLuCB6>U$8kH$ku=?~L*Z#{ zJ(J1Kdvp73=)~{(FyJziRUia@E4|KT-wxq}Ii7Gwp zS)Ydi60~{XK9AXGU8<&jxs;qiJPoMoMDtv8mynhwQo=$>P%(@_XfHgg5?tbuSz6W-!-K7Ke`7^$Ifr?0Hq0@7`^t7;%tkVJ1uJrVzaS7_=O) z;@OJZQ-SMQ1LEu0=ZLt(Niyqr?+z#&tLoQEYXOh5#>e!!-M#|Fq4jElVfr;lmSO5$|yqJQ8^=UXu=w7BlL@tX%l18F63@7H? zfp&oB!zig#mg>NRP1GPc$F~DPDoXG@vaP{T#0X3z;_NqA%`W0O_I*6Hr^{ub##Fqz zYNYk#UUb%~mbqu~?!+bP-5eq{Ci8yzZ0GLi(qYj^RyDueXMO+1D9hwU>^MVJR-)1n zx;aoLi>=S}KqiD}Ih8QI-#5VSI-U@a=zqx6JUYQ0I2r}pXd1b{9Oe^n4xZBoYkRNf zGPG3*?QTQeMJBWuEYp3|HX}yvQ8SK#sySg#Rq>9*j4dI4rz_-wxdUH#Z8kEh@q@`F zKpzf*{+-C`ldup*ybgaN{&QJJvsj~0y{o6k@Ty2E$ir>Nl-;S#!`A-NQ<>geYsbcBhC>2}?YJP(yAMo36u z-GbT^a6`P8Jjj(ULG8+)eU{nvFK_ZG+S==E4;#`b$&gb{Ku^<33&3@7v>k`}e$+WE zfoJIeu#*n_d3@thMl!9qZYntd%uS~Ff8((KUda9Lk2~sLJO>pmNmVS^U$R3XH+{!15HbnIwYp)U zYaYSII>F||Nl4G%O4L6=KM+dy;h9{Ecf+I6h2sIU;pjpP^F-b8(^WfBQ?0ft74{pS zgfxeed4+FNgaYdOp;}8xz9xHU8{aq0#1{u(&)?cC-rxH7-0mBWf2?0zoGE(uG~=ot zevpB$m`Evn=Tgr6<%&nz?LY;uorOw;J8G+5WPoD<`gqCR90K@mJtgPMv z?Flqb173$W>^=iMc-)VK_)L8FnSx2~#aCk;5ai7h^!J~4-rq$U9EU*i7`H|JccUJn z>OJ&GF^cahsKuxwcAYxJp!}MpI?RUjnDBqY-tnxCgV|Z zLgneO4t*mkB7gC9CGz`A_9FvFP%=FC9TQ1#rEcl<#X&M{nE4E&T0SYplc2XNPK~Et zzFP7#8r6FX7j01ns9!%q%Q#N8>+W`{1v7Jj78Amr*P-8|X|h_qr%MyQe3ul>#E)7- z1NnJ4){c)f95Tkw2ZbM03T@>-Q76i|rBc&25{tfC+M~UYL_UEZWrjyNE_?4TfIcHO?tci?`-xr)3JN|F`)T!t z1sgm$T0;|uOert9AWT#zvT0LVc*3lt8{2U9bZpQW@J-BxJZo9&f=b7R2;k!{g z_aXTSE}|Ohqut3~Lo@%QInR}O$pi*iQJdGrt#U+abKGm|p84~>?Z&{QgFS(gvj8nB zSW)=)+ur;q7i~WK!Z*7P@@4nq8L|TrOkbfplv7orD1`7@5Rs!{r@9AQ*=oMu)mzsu zvaDWoru)Ze_WjBA5D$?SJ=~+)2!L}2t&>49dNWMb(RxV#8UM@FWL&MMAn%iJ&-_Pt zP&-<=(^a>WBlcl!NNoR+=No3_rQ$!M28+y)h01&y3kklh`i&KTG=%D4-$!D+l%-Lf zm(+MIk5_3sVz@mcw8*V@ch%K2R#^|}BK5BS1H{G$IHMkpu9MDaChi;5OG_EOD(g+Y z5rWB~X3mf9TK=dj(YB%!Ij6&}If^FFk}~rhe47#hXlYVX9lh2drl=0M(Oq`N-~>U& z?&m3G@`!h3JF8S-?sk1A70ut-j#l2Jv$xGZ<#sDaKAWHVc#_DTUudrbVix2i(e)aG zD!e12Je5GCf#1_eL@W|^RXhc`%%1J!qI%5iXLjwf6jpcDrv9C+!3IIQ(XVWHg)DPZ ztYG9B-I^P6e2g(Wo#DSNxb@PWOlv5-&JT6Tjd%uKjE>%%9d1Z56()$X*OD*x+xHjY z=TqhUIzri-u79BSt%u9QW6CWWn@MP%0(z@_Fo;c2k@a`lGMxGP{Qo{H*%om1`(M*5 zsbwUV(VGUQjFEJjt56S9-4Yw;_+*pR`cje4S3mFPDZ6WIeXmktiYQ>? zfByHpV9!vl;QqLK54Sk0fn8@y;C3Y|^PcOBVf?%Qz9{V1tc)0~0dh7yzj7Y8 z`nBAsL+(SO`{oRVfq!ZNl&|o|pAgc&!6-puAts4hxfUn?J4dY+mBAAIfj65@B$cK@Y-)C4!whX8aiS8?f6IuS^!o=>f~_Q zTZ`SaPvh%dh@31XS_5KI`%!iWC3W2pMX=O2+Il!M{?yi~lT@9*^gv%_;gjIdH+k=v zTrsDff%Hj#-+mP=aI7?+!Ncm%K0W^$&1AyDS1Dh9$}&?z60^5c=rZYa2%FgJWCPaY zUts`6s=27alw*rR!)b%$V!`&I%dkqm%LMxBtHFMHhol)~iOu0^AUc_P%zUfO<ci<~yj#zTzkM9H)yxd-l8&n{olKaSO*C zv`_oTV?h<6o$PV4V#**9mm zMuq=t0u&2e4n%#73GW#u+POEyn;v6lYi+&;DSnMT}+c z__4*Cp*4qmZC;03*sNLP#myBL$UoYDwF@jgMSuPrm`MJ2!ofpJYt}AN>3Xo_XHZ66 zo*a|ubj$7s7D=Ep$w7*G+&1|O-=*yzC?`#&Ei2UzA{rLyJ&_(`*)JfN;$gFRA^^=Xe{eB1d8#!gZmxd#=d=z&n@mdw% z;iwr?cMD9zc{i6oV{g8C9j_6B-&LG!pHqi zyBhdoxb@~&r;v+WBB$NtfRH7FzF8K?vH!pJx=D$P2hQzL2pg1YN=r%k)q}gM^(eh# zue(j1JJ}Ce7WA(750-dEZr~`X^vUb2T_)c>hdFMoB~c!IDjoTy8~9a?w4WBvCvMRX z@UDO0Oo64oi16@Z<=*4ROVn`&i9x{9W>M1MX&5bSNcRs~h^0E01j~p_x@Hve62u0P zX=RSCKOaXz=AgVcvuF&#%iq_=mVe|eeL0^Oy{mx~TRg_LY&~y15{wjSH%I>sMVFuR zEn72`1^@1?>p%?S*7;takFo*6R2|b4N!PxUEDlZ<38R;aM zlfV`%DkrA*c$3VvlM-oVUvwX|JOO>6#M9q9E&s*1ws-Jy?~5R7L1{yU^ABGY;V@R% zqQ@Sb@bQkOQiCbN=Y8jRRwIo^+DrE{yBUT_zjsR3O1$f(&Bd>3HgA{iE$0vRdB{C> z_A*MJ2mLI}YQ9+%7*$7gtU1)DuDL|!6sqtcJA|Ay60<}Ps*TL_<-e(OVVKtH zUK}j3%i_VS)bf;gh%ufA{n&8YI=d=MqJU5O`)c-9C)AjA{~&%GI{{rEcgKb$;>Fke z>UGXWeVYYxi}qKjn~0dygafbo0$-=em6jg~FlvDrzssepO8L7(_#4SvWK0Y6)jgqu ze4sIcQj_*|7dM%x%f`Y{@#9LS;LtvC30k3W(dq9^D;L-dMW2F|Gkq@R=0o!0m*cpS z76st6eEvrhWOV2032St%=vc49v)_Jum3?04CL0$j6ZieRu5S73D-+_F-toDrstQ5( zZjr||2i-$F)ycU9eQM4XBK|WAo!Mb9#w|}Vi?j?73DM517rZA5)wc8alu2ijC>ZpMaQYkJDdWdAGaU=!9y6{g7I_I^ zyTb1r$t=6<-R^1)b07jEhxc`f5f1=-KKf|W&QpxKq3toXQLt#&t}J|GYcHXx+x z2~y5v0oOzGdGB#)KmpE1`uF#iuI;83p%^3m+a^hMcCAj#`yy7E9$kd;Xm1^=m6TJ08*~ z11|hu3zO-;b!3=yn9H-&~fRE(V*Zt)$spOnVqQN-OHw85Kl@659=r z?Z_`(?JRjN?u-pJ+d*H;?>(G+#Y<4OQ@{M-4}Ku$6~h5Gb^~iT0>9Zby?Xkx7X?Nn z`)G{Sxlbj^ygfc+wiPn;;y&Jo{Rju&6*c$c)>#Er+V#o3_8MmT_%0SidN3X{k}5Xwl;C#jV9%i@Uo^fDlr{t++#RclQ=| zN`pHIQV0;-Halyt^|$q}=pH`YO)sVQ@~Q1Qquq@p z%l*n#`qh?)H+SC>V|GvrTMr!_PgM?z6aqt{#k!Xnmmm}rH6sS+pt^7U_j zS_6n1&p-3rhvq-D)LX-^z!mh3?T=bRmGF3?$gmu9vV=ikR$FoLi=_-SQjWn*LG z9ANlI^P{}5)3LJ3pR}7Kd5#al$0Hc5PW$>*^$Hm9zFX?-mYM={sRge+lR0l{y0UfC zX~hlr00+d=t7%XGQ<+&G1j%2JWF*%y8aE$~*1&wsKf&WV~-Tzu-bcbE1)LC+<6FRh=ZnIoo`sDIW=K*sDbN0@R~y zQ^UZ=3NOMz$)y^x^7@nZg7^bsT88RtnWo?RPbg-QRWiQP`_sBWB2{{)oi!$c|K%5^ zF(z%PZP^PFt9A%oea8G2W8GYMg9ukU;e5;QHcxtCMS=${io~$VV%`8wOJ)e^vyecPk}(I&zIn3!`Rua^3F*i^PpBD)~`D=`sLssfx2M| z&YWaQ4N@=sy_0N*I?o#Bk2m(|4rnE5@OKPUrD)CJpbo)IkxPTj#~Y$GTd`;U{0LJ6 zm$9JCJuNSfyx;qYH61U!Z7x^n?m@YLf2kd5Ohuq8DgC~t@~6h)?5M)p@3X#_wd6l6 zl)#8QOx=-AK1*7W!@2LWMnKojlI;v1UkJ(|ntLlDDc^z<<@xi_U?2-*RVK!1;x=TD z*Bx}$-Y`%z)ZyNgR-~bi?kbs9Wp);0-V&cY){a+!Tca(~#B4g3*7CA8($L*{=SjlT zGcDbaIOxG^_ys1)@o6eQSltXw=BeDnppbrde;CG){NCkR8<0xSnDzR?jvR3}OkB-d zY>7)PBYC-xE%=-FY!~NrqxEjasinqvI$>2?WxF-u*t4X;63pXw@T4Wipr@xpfgb|@ zehcR|?iCTFi>WAX;jOoKdq5^5e~^rjN8(foQgPM&CN2>g463hajtPr{!-9HvyAVS! z%UL$$BUycr2A^dzP^97bo@k9#E1E@tt~+}CS|?971DG|W0>1R?Q)F`Aw4)EDXd4^( z70wi-8+@(*4ZF^jyW_Ln?xt)=DmlPi8yQKFnRZq)9@AVj{AqYiE4!NH;!2H+-fNf> z!yNZi8>5Za-kYRr2{WjqnHdA^TRHG~Q?fZCOSVg5f(t*bc_|Ff6wZHTl!%bQ(v{3# z6^VSA9K5EkUzFva`;prDHo7Zd8Vnn%YjOXGN#fq;-ykcwHagnRs9CNSqEgYA&tg87 ztR4`Ir%Oqtq&Q89rPvNTSjXtlbB&@$TTrc>)9q5Ei-m2yAy&c%36Mqth}Je{4*w~8 z`iUp6Ex#PD*zqb+#E%KFgZVqrGrQC*T>9f3lB3a2vmHSg#GR?V?;#+C^)J5DfH86g zYA}SgoDqxTU_#3MNUA^bMq#-$J0?Vl{Uj7{a`_xw7i31GQ(jLo!dhP9xcYf-cV}H0 z-P<YyG1e@8O|2;Ta6>%e6=GRp{tw=UqFlZEQ3z#<$9_zkdCiiK+M$2uVS#PYh)u$Ph@LBPt7#pNuCO>hhNsza0m@zaV z+5JT3;mk~KR@T<|_yVsGMCL%(5ObUu1xQu7f7lg3Cy{OnSLZMA|D_H{vJvWPcQOFL^nXT-1!$0Ag#LC{*I)KU zG9m3F+2g@^@8qcIb0>0!4YQgaL6`0)juN zs|tMPq?_={+_2dTXcmYgde_|^K71HocWmK&ZgL{&bY!U`qn3hPF(0EP>shq9gB)ap% zXjT3Pmb>T(gB|Q#Hqg1xjYjU5%^OLJnmG$yI>6=Ys8up+K^1xAEu5%tm7i|Qx1D7% z$8*9dgMT9Ngx!e}xwvHkalB-P3asz|UeQ$cP7!2>G?A^r{Qg)jgPmB1+ z^gpLa{tlLX?1X2OW{De;L`lUJjKk^pP1-H2v^r9hcE2^7fwV6mD2TH+IGB@woP5+Z zP5eDUsHHq$Bu0yT#$iWF%Y_qNE|*EyH|2M>J7rF|;}j4qd+3O`gJGbl9&v0Q@rhC~ z%B8e;rDh%Bnug1APDVvCkaO5d`prHRR@or*u+8qZrH%~@S0IjS@EVOt-z7&WOLixl zQHNq}HpRa5$Ud?7m}SbL!kb;P>9sC+`l8*g!KebnPwLyYWWhyCPY;dU%6pu z9Skn`@tc)F6VI*rb0-lFPC*pX2TIzc;s=qY$fu-&L*~!7;_jiH|4A1)|LL`8qp81-%*A;tVh0H&tq*WHgCG`oxw@>hhqXTXqz_)j)YRtn?B2+6P{)s)1yP$ zSJg8%`wW{?4;6BHBQO`wM)Gleda@o!2k17io%7l)Br!WmUm-kzw?~r5;8d$kziNwpb`5yjFJ)z-epMsEe29}}-VyDgT3l8%Z3W*yj`2{+8MJ{EUz;Q+FG z(F$>6RHVE!u%16JMKS>eglO;oezE%F;QcQfy#LLP4QQw~JOq`j-1Az7t!iLfEDf%s z=L6QARL|3Pa4=ahRFWoy^dxe<*>-eJ){E11rDE1_>RcfO!amxqqn;+CV#`9f#N@Ai z)+@cJ={>|wPB(uch@l0a(jJZYm~` z%e|qN%MtI&5E`brpt2)C|Uh zhl9K_P7ftmJ!tS9Agg&i9ia3XdHdz2{gL>0XCeo4)Z==}uKMn2k9OC4Ybflpjxvnz zHcBl=ZYP&+bbVKMZ>YVg#%7IS4_ZV?I?47OYt~Fs85MC!W10?;H;%mxSWM94j>xE; zlNo9Y$(?)OM;;7lckxG}XARa2YQ7Q)U2_}Qki}IobDGoEO(#!YWYkjtOlaa}gJWZF za9C3?92*`jL&C0NZvq+?2?oH`P*I||YaJr!-Zt+;S~r?!a=w+8y}z85d7t3EcN6H%K*EDhhUMo0q8r`)qBO76i#?av2TG?mW`C^Q@4ox)F5VAe7O^ zDmm=WlhJnmxpXo(K`{4BY*gp%)~drk%ScycC;eK$<64;Edjgx6}2%yNl-rG_hx z%)Oc>XaCC7BvSCaU_54iT{D=S_2AHSXS=FajWv}>fa+IJ(9d_;Cn|t7%TfGrk|UC{ zw^&iMe9$nBEg!;%xC|F|z6$>Gp{8RqjFtHDJx97W{tlX(o=q(Ir{nQStqTglTXUmF zBSbcF=*hBu6Cw2YUG;NEEWVNF3;yEiwfJ&PX6*@cJ<=t=(GNQ6+NUBR5sgZ zt&5GjH_lOWxniOzbj|Jszm%Av+)KU+`xMtK0vZL;pBp`wNy|B29c}CkRmw`5?PZXi z&g7dW!owaW)kzWVP({NB1-~Nb)D3j6)^AnB1WpEQsln6JQ`eZ>fEy`Dz!;M|SrHiM zY~E-tth?}k`uuswkwrgk!aZg_$Jz5NHzO;YA^Wa2sE2kaGsAAPRxvucXzMMtindAx z+qk4Bs$Yv@XHIl23L3K7)f`DtxjsI*j`4Ch@aCD7GZPcrQyU>KJ?=K|Q}wId7X9JO zvpFFg=`te<+g~r~lf;h*MUG~s-j=bkR81#gfcZ*$1?~YOg$rXB{e|dKtC^``{9!|M zYAVvJh1m(~@#Emo;++?Kwn=^F=c^AoLcAw8w8>W#~q_j zlc=1*KdT`SBfmTX16ym{$RIC`R z;s~r=e{J{z$avB5u}OANREs&B^<&chz3)mG0|j1wlFI_zC9?_1^GiZGWyV9meq*79 zKUsU*pMdi?Uu~&imChmQ6k^$E~Xml!4LhbE9!gLbW|$z_>$IXLxR7r9&&P&l(p za5U6+{XT%K^Hh|2$vjo2J*~ger_gUbM1Qy+T6L3DH9)Cr+`6wZze)cEb+L2gNDv{- zf+d?>Fn;JCe`~X(peiB~? zT#*9+?5PmEH!)l1m&sbBd8u4AG{a!TD1Yb1Lvjc|mQ)%&;}%_nU5GlHmb+eumt!vz$_h^7TD?p?(eH7r_K`GuI(3Hi8= zOh##2{U~*B9pM?vHD$@wzO>-sdHt4HwyR?rAod~-m{b-+P&a$H735j(&AnR`3OJ$> z8r{%SaW*)<4LZ_JU-2Yw7!Jq8rRI_Bo<{QdzumfQFiO2zopPA&sZ;6kSt6dG5toq^ zcgfj@v!u#)KgWrF7anZ;fG0-ZBHj}KJvZ^CR)Hm5!r`3KlHpbR`!10PyzFXK77g`W z9t;)aD|9L~H!R8*sQBx-*AW9f0< zaLeeQJ;(g)Q;lON(!e}j1=`naIq_}lTK$PUp^Ie{5STTq`VtTjUk0c`*p}yoFr}T} z6=i>gk>LS7I6uT->Q1iVi1<(JA@bm8rsz*wf{A!NCw3O_ASl5P% ze302H9Q4rUe1-Qc+|jEkD=x9#)^fLPO;&nx*@^bwXb;3SFD|ZWk#*#-!smz zo|;-PgU}h-9S1bYhVZ{1g>(Ml2>?B~bWW8+3qz>z*j0N;#dz71)I|1yuRYSAWds`7 zbclJJ9DcVu^QQMRzaZma8gBOd(V&LtHL&HLqbPWW_I*vRwXNNA>(} zHpBLbZ*LNf9FREj>GjHuAKJG^MbvaxqTOjKtix9Bx_?9_@34Uyf52w|pk!bDm^zRA zOiWA+0qe7Bp9`=<{C|cT{x24*f8lVP?dA_1S+D{XVB`p$@9OM?!{K%vEOHZ7GcFrC2`eigov5!}n7xcXze$8ma&z4PR+GKneUoe>Ll|A8Lnf{O|M zUoC**#q>V9qb}QA)2Qs`Y;B)x z$JESX=HDWXV$H5RmxkFR>&dk&)BpSZT%1OE;Dp)%^b~-W7hGJ@D>gVYG*2|kEnPP# zRgkBc9;B|#f$91_SQZ3~xe<1=-TgSO0RHC|$3N5{kYhVd?J(bZ$8xotB_3@k5;7rO zAC9#aoK&PMgqTG<)HJR|ywP)OX?-e}M{8uH;h$Dw=Q25w4Afg30AwTTD-ST=+3qD} zY$w5^qB2^6@Ve8F(* z(97(8ccrxT&2_PJ@J6Ds86e*}aA}N{H1K*|H6hV%n&IelwUZP}sq0#@uGT2g?gshC zOcYvaS>hyZeXN}3IZhJ!&w0p2EN~!tVE0o?9U3Z5(AW#G1FTZvpy&SZT=p}sXjxZF zvVK=w#`4k|x4VMOw9B>H=r*Li^8$%803s2WA5C(^4y<_yMo4S)7`_Oi=I5UQJ)?*} zj1pDY=-^PGi7v^!9D8ztzM19L##9@^G<$czY-}AH82jcxf+BMK{0+fB_fhcIrgET$ zBr#MSh$>vKP4rhTtujZz2D|S@RoO>9LmjgUPOMWWof`W4Xe-h^dCxP~uDp*z13Wbc zm!+MY%I9~>8%6$t>jt5H@rQiFNn>Jy)I4x3>%&mwN}sc%EvK#9^y7#f{>I}I%@7sg zOoz^4EVSDMbs5D|NU(tMNLXZKdCOS%jv_-&0Dx?aIkDue%r~!^k(bi9&*I!?6Nv`FNL9N z)dd@8>=|hvQ6GQglTU9Yy;|Dn0x{4UlYs`JL`G<{UP3t_*h2qutUR||Erm&sDOBAl zEdR$hdTHLNn{{FuxtCJWoV`Ta@7IP$N12%1xOzEzEp!uTw%92E!rkf=YsU^~CALlU1oqA z@{6d&9^HhioO!g5=_lEf-oXn4iMOujDhzgI#AYknBdMtlv2hrCFto~Hn2^;f@ARar z-JSK0+SI9Z$;1V}na^#V@t-I*{8H2=@(-e)FGsEebn&=NaKBaEK((S|HOqXdR?UDU z=_U~8-!QBw1aq2@7^tww~E+Z&Z zn{UgeH~brU<~?0^HC!_q9`S_y#EHgUU})tZqI=0HA!&h4Z8rBdVvRu8k_;lh;v=QT zANdRm%RC$h$DBo2I1RxcP{@Ke6o+R!a*veIWP)EF@WUI%iYi5xUF^-5^|8$?KE;V% zoA13Vz(V`BVLH0$>?f%n^9HobE3rx6Nfd2XOhKk5Z1OAky!x4U#xVQuUy>0pX*$eT ziEkL3chhKv=0%p$gM+zyr12<5-RWt6OCksEOLUoJI7n)b?GAeGkoiqIwHcvY_>X>K#6M1#{)*&1Z3<*+H^*g9`d?ntg5$_l3TWzQ0%BS=V^QK?GwhoKS};ZJLv4EG%;8acJ+ z!cY6Q07)_*o8>vpa$l-8OKFMv_X>a!UNglMYtG?}6M!W2YAI@6lKl*jq^f$)Eyo?StCU8cjfJX#j<8;~B& zLli^+CsOwakkMOK(Lat)+f;8z4aW8d9(xWvMjj&is1#K85RS=Dchf4yR*xf z+r^k3K4ziunfb2uF3rOfc~#=JO@BhNz*q{m9%_y(*R4Q`(PSNl&;cC}pa^iCOqtPD z#((pQ%T!h5W3c?w=Smn0Vp;K#vTQTWJCZHqca60Ba0a*Ws@;x^m-==1FCa}UV@Nh$ zx@94LK`TnM#^|E;ded zCuc7sS2UdMw7>iQC(Ll!gDr7M1i5hH?Mb$#Vg7T4iOFkR;O1cph%XeP*X{O3mKyyQ zUsb>fNHCw{>?HEl^sjx4&h!@s6)^t9o(Jj3FZ3WmbJ9g+e5E?AKS}Y@{bbZNcAF_W z#C93X$oL`e-vh}NSAvoj&N?lF76bV6M#O^+L*JBr^m#MgTZYv>CY?U`F!-O*m-p}A z=Q4y!YYhAq!_G+nT<3p;0EO~@|4JNHeEaq-Cgx>DL(JLklTY8Kk@g)lXlU_&V%UF} z6e58b_LZjwYxn+d(|Z3yjO1^3dT~R-eLj!NW81JEbyu*Cjt&sDvHN$wD-R1dH_WbX z8#6Gp<>}LBmb%KavV}Lrz?}qtx50ZGH0=RpMrfD2bDGn9joRDQ9_RazgeuFvXlH^}KG5vh z@?GO?Uz^XnkP#B%i^0GH!mZ9g!p#h)**3M;+Uqrq*Le3!+R%)*DyND2JWWn>bvvYK zLC)CUan!cPLB{8z{1*u>w0BU74j$_RkUjKztItFGh;2lo4Z{fRySttl1`HRm?$2VK z91AytWf_+`_LF&f_4PBLki(?Z^W?3a zgOJM0i_IYyz7@mrgi|+XIXR2@?L2iKGh!WIF&q1v>-H;{&k@<7@Du(9w6DoA-qws| z2L?`}2U(O~`$AI>c0ZR3L#CtSjdj$m$CO@dS|*kyO}~uS68WO;W})u{n@2qOO++#0 zGq)3@_gmJD{O)wu$GNf~LkV*;gw65nFVvqFV_wlzvyO!tf6p5_o@@lW9Ul#zc~FQ6 zG?2ZnG>uBXy-e?!8JMuGVed=OfSF06oH_B`;bOV@ zRNAx(&laDTpG?B-Y-dGeOKYB!#@Q2C5S>j)c^~)`N+QCja%%f+GdTER!z*FI+ki=o zFnzjfLHn#6rBd3KpDCN6uP*od%PE%t-J1^-CQwnDB(x;9yOi)TKwF!qX*s}W=o1Cl z?kzgC^J(>FB6@_fNXKDNn3OW9<)wq#LAQ0#q&8Qg$jvYc)W*jxFyXmBqAPSM`mzB| zefpc5Y^?OqhamlUHdWLI6~s;6`|!-~e9H+ymy9n?_Z$?WHJrT1au6C+K$ca}N>Jhw z;HWZ(mkchb|VsbEqIye+H*U79x<#>#l zjzxZM#pfA?@a4$VRIvY5TOl~8H9Rf&6w{M{ii%*twLjjPGDH7rDZetLhMxA3OYYbA zE;II3Z!&Jzx^N6`d$p}A#O4tny@B5D2Wy434r3-01#m|3)XG6ug)#Hhpggu&2drGpj%n_& zrtI#Wn?R$_xb^wzOp#)s!JqBMueA@9we!x8O{+%s&#RgJNpYgLP`ZaM-jxS82(>bvB54VP%S z1)l<(pQPl{j;0D!U8|1UJhg7O?Swhif|-lci<1Y`cH>}$29s_eRA}Ni zR@}v}_W|}-L-PU=tkP(8=zqApUZRpiTHr2Cc+eRik}NL1Ru(m83$>fhXE%miOuMRx zPOKb?HobNnFSq~=Uvx}Kql&PsOWVCf=JxpwM{P?cvX^?s7X|vlI)#EBONLSzJy+6= z3!x5pw)Mtpd7rv$)yPrQ~D7 zGCt1X-muiXo=Egd&2=+iTBW&8(S_j!xEg30$G0tME4#JOS~*NO_Qz%Q<^-`&!S=~z zLKG$4ipnNb#eRK{=DX`(72lde0G!kBoY}*z`XfMdV9~c)mzn7#(CGOZ$LBwxAb}xe zC$IFmNx5(sGt9K}9vqpbgKhk8Y!M$TGa8bb4yB0U^BAO;wk-=)o-QT^eM!TZ$g(F5 z=L-#khCT!aCI%V_Rhx=M;*z0$Ww1`ezRJn2WWfm1?y{?m%CKO(s@(oEVA?YRw=0mC z6>f_KIEd_r)j$%T{wVN1f{9(3Xb+PuB5!^;$HdoLtcvu8KfScQ?R{oemw6BE8b9fu zftN<#E(SpFWDQAIB3Ay@jRoPCHs?4|xjyX}Yn!wB-Tg%5s<*YqpVhbGor5 zAUOET?~hTDp3vhTIVB1{`ISF;&xHM<_7CU@V@-H>j5)v>YOZQ;=c`~T$)8A6$XeGH zlU1ODvM+3SH$q&=m|sN()FatgZWgZl8K~*!PuU?o4YK*QHd}_r3dkVwR|gTzDJmT$ zukcEawj6ETE_4;QmZ0*7@Cy|&>L=poWg7XQvP(t|^OKOB1hTWodKp_U)%%o-*x&m*7dWUa8_oIb#FMDe42?Eq2xd`NXctaf?&sWXldEf5 z-M&*GSa96A*<$xUhNNzNHs3dX`5pC-81lt@|Hz2vpRof29X$@rZA=#P9{|yPm_OQi zivk(v>=~v1kJ7)fY2rML@rI9p?I)>S?AL$9r+{t(k767&I^4{5ANbK^^e^1z-`v>0 zxv_t9WB=yH{>_bf{xB{*6#_y^|L7T}w>%QXm;k|-9VQU_FleTN%_K0E_xBy7cCUcP zgvq0{O3FMEl}k>%h3gD}Ljlkw0?}x1pt#Nk)vmrnj0HsF>Tfaex{(>y7)?WEJJ-=Q zS;U~#0$%U8XUF*ZL^)WLB_wIDmcXWARX)LM$C4)`0F;ClePSn8mDaJ@&m?%{2Z z?CNj6=3sI4cH`|WGFAo0pwz%okr>6;$nu}1d2`6noNFz zJj5K@rOG=$LusWWIsDMfu+ZK=KJ&UHLo^n*Guf9HWiCK}|6Ib+wcaseCrq0GC}U+u zxL(2OZXqb4@|!B;o%Cqklq^s5L7-o1VWYB>QJu$nMYE`gd4OAsd}OI%EY2JgC3Y1C zn%x&*QDC`Ue67{oTQZq$&d7>o=Y`L^d1YZ*WM|lnc`{R$6DU~6GApHG)70vM0KG!C z1W#JK>-J)f%nOoR=df`>cPYH(n9fV3;i!%!h51%CM*kBv|xic!H!g9+d;_Hop zYvm8zCjXPDnpKyD;PVgF$)%W>n4dp?&Xr=Iy$$#q`2v9dzwGM%WZ#yYub=pOHp}m= z0nlJaC!iJnqs@(r^KOe@h^2b`$*7{@CI$`d{R?10LR|#MRD6VXYc$UzY(a7H^C@u)Mde!yyfwr}9LZ;a5cKDgu z*)iz$VxuD9rP|hNPbOJYC8`8Oz@mFRPDnE5!yd)5?hJ7r5x5i41VknGH-Ow}*Y2uf zvDmh2^4S<(=N}=B3Gb#z%_}~pIEt!vry6gNOnD62*?fuMHH`T%m!2@ zWL;_PIdK+|;m9RuJX8u)Bzmv%Iy>eQF+?5^Fbe>nb=A`gFQt^rftw(@HUE z;X*ygP9K)F>@IQT^<4HY<6*$IiuIZ|lbk3p8SwJE4S|FZf-i01SIZekH;ELXCr)iO zpi*@=zZ*h|UHrHhcf#zK_S-)9&=zum%LrsJ$z(fH`w>uxn3EcJEH`4zE9euJ3GPv< z%SV+C6)qP*JM_hq)VEym;MD4Sk@IzSP#hdWqD)^@Kj&hY|BU~;wdcUsDhledHUo~y z-YR9*e2&dg;$~jX9pYj&ydA&9kgLRZV_V^?2L?0 zFfq$UfGCLf41bAbb#{;0%e0Uuz9EgF#zqy|1+Yoaj{uGL8Mt2mkVA}&2foZc%Neg9 z`?j^8D%?j?{d0B=&Hsp^>?pJVC+YvPcj+H5(SO0}^#8}$qUVz+H^_i>&1|h+nRHImXeY3j`nm^*;p4op(B1IK z*z}1+l-FTKq`n*!F`Od%UcM6_zg^WGs@+M18^^JB85`L|0|k} z{ZZi$bE-g|-(NyHWHa_Tw}+r1V3cj@cnLr7cHm8A2=&yQG(KLxQ1Ubs_vDQ946%jf z8O^5&tDbwlvk-tJ75xuLdej*DP=fl8*+LSq$5I(38q2L}fm zTUA^01|JY@08%^8ulPQF7Y}%n{D2Bnh)Eu`Nf#=@&}Z`oAS&EQq|{pF%u!ak4Dy(f zf&V?S#Iv{R;!c{KU-$Mf` z_Vwx)ciVA9+8u0o*7h`|)xv|P2W+~Ti0Tk>z6C$)5YT&ngXo_!CWO?Y%rG+FwcmOo zFcKT4@3&QTEh=3t!D#YizShq{F;Ys337u_VVx9fveq9eAf%Y7WZ~JdQfrailJuY7s z13R5s(N{=fLbj6G`Upm@wk#r9oerUN7^U8Rr^=4c(_PNmC$wPu<%tA}A?(+ucei!> zD;OZlR#6lm`%xgKU*k}Q=Bu8QJ-b&GL(6Z@;EyYo+|QStdA-3-(>dJv4!f`@+4}2h zvk`WTsPc9Gd zuh?gGYghM@O=7rUiXiYbJkq3Fo&{V#uV4Z913$U6DzXHZz1mcYAl{Y$%VLaS@Yoe% z?NZ*>XFhx-utbz0*#AC;okXIWIyGHw@e|Lm>axk5Pili)!)rG=AEB{Ze~}J!L%!h) zG$(Xg3^9G{6hY_Jd2<6}e^>r#_2MTb6nd42Y1oyvL!__Y(!2_0$YdO{GpNpvHEmSU zxEam>MB59vSJWsi^FC?2J#ay}jJx@KSvYhTBABZJ!MZ776cjot^@Pn5LeEpZwGl}F z_==EEAnT_1U+~I#zy`<4yE|lVMCC@-EWA@}oVvKZRC%?Nm8sl7j0f75uRv_AV`bTk zp04JTWTYG(!_x^i-(}+dYTij+8gCxzDKNN$BRi-bdZr#;4{4B4%-37PP)fbR2ftUk zdk0uOBgG)%Y}J|W0kqOcek%3uY%_M}=TF?o#hh^Q1zsQ2x1e?@JpG}UQ;@*GEgGk5(W zO%v#zt-T@sDI8epz5`Rh_4IN6cKT^i%jU+hC6A+Jhs1uohhKv~>S$%7^o9VUSSrxS zao3Pp#v2A>I=t5!2mRg2SR!T~1>8UQ9{2J~QL5wV;zaqkhEni)ip#%=#ixqor0P9d z*ADK!hFs;*Ro%k~^sq#aq#tJ;bV|)T9!yE5VwP;)z=G~) z3N<;CgRQzw?mijfJ_K=nrD~RvB531sT@SL1E`qco+s_4SCchCpYW`Is@istW-*l0# zwR&ZJ54?OKtkHV;g`paL6vvLhH2oNk;0fnxEL$A~EuU9=fB)?G`EKwDBQ9Q6T^eH; zCuk$VuvFnLF2O3FK~m9vf-~|UTvm%MqC8~Vudfovoc_6O?orW*H8z!*pavSk`(u1Y zvEN(Aw)$0is9sA>t>IXpUM6QM?QuFs@q>oV8g{PYHUp-xCh(|(Au4!>fSiD2Hi_j5 zT9b%9@M2zpZ4`+RwbjoEEe%sqT(xvG+W!+wRnYCYQJ6q*Va zlA}}QgpqkRZ+WFE%9L#*-LOcxUDK7|kmSvsfNW;Q{E{C-J_|J9(G0Vjd44{9i|F-C zhxu=3KRFr}>#a-jbm%ArH>QT#+}2`&@O35T0oAJiO4WNDuBSYCh6yN#qRo2$DP|?(*{z~JBuw1 zQegz``lFd*nP0!IRCE@r49`|tfO4)-;mk|7w(tOt5N8ij zdz3)d?9Zeal!|4d)}ohQ!Faq=A`P&7xDUv^MDQ0;mtUr1xQn6{N`$g7KUJfxm|SwV zH%dO?A-R=zhu)^+QP%q0aA&ri!nf6BO28Q}ijPuX+@Xtd(AAn;ZEJ$t%4bF!&=(9; z-Z74x5jlr!Eri=10e)&^{c6gGwFe)XJNup+zv(DWPq_q%-u+0wW&0?VD|+Q$+z|!W zPAi)Hc~G|994aQ~3fL!4-j`7jfEs~*@V|Nd>)z#z8{avuVp;J+RV^85~)Y^6} ztorLLY(-_jtb%skuWNAlquP1UaSc}wbPRC-5jfsjg5G=UNZJHTyF*a!z^gUB16~cZ zH{^Y=E4Ar%G`I^_4^%0RO#z<2jsDMezgr4jDO;5`QMM>rz5&;qb0PjA^N~!?>tSSJ&RDxik|CAJmk3tJL zckz!JAP{J2LwOx~iSHq$77WW(in3IXhZ1yPLaNS~|JgID0_gx`hFN4EQK1 zrs0!wykhNxHFwQ+=5FoP1hH#mtnq`0i(_NAvEdPV6G6YY$Gq|80#Q>r+pje7$-G`! zTjBNwKhe@n2-#Lb_QeZAzp6kC86ER)f^=+k5kJaGzdL$T%Uf6w@E$eLa^D?Y&LsD> zpM?>GSl>ZGx9;asxpanz+qh z8u~repv$`739m2h98AA zE5{UEga!>M0+B}(nIF3FG!`el^kq1TVQC?fr+u8Sx4Di|I8slO*i}>J0ddU{bJ_yM z9k*Rqnx$0(G%*IZpCiFW%QHRgbGSZ_loc|@BnIn^7nZ1!kRV@WIBd7uz(mgxa%Axm zGw(m2@-mLpL-pq#JUr7Jp4JZDlY~nhBzGR6V)2F0sDbxG@+!5Ih^(tXOh+NAIPAH? zB;VOm_|*F1o2{U7oU(QqHHYo?Rz9xS%U_$K43$MNxc;qtk(Ix&@H2{tILqm2TYD^J zUJ}hh)jqGC`gFm2h>1cbqU4b0^)QpYoen9wSu{$1C@ z#!TVlkQ^;QS3G$g@iNx~)6yO^8h(Pn=tQ6v!sSw(j0+>Fgprlq0Le6dEte_5R?|&X zw%IKV4$`8h!y@RDHPp~7sB4rgK$JSzy}KcDRvGd1zO?D?nD*H}amQ#42hSTWoM3Z1 z*Di06xqUP~|3uU7?6XVM?}SZlN9~V9C0uyPu91_Rrcd~uwEkgNI%1NE5ox8Ik+D51 zw?eP1^77Xxoj9m4(@teH883OWs@WOs%8nR_6pCnS62f<$cQ3#Was0csM5ca#1&}q7 z@*g)c80cyJ`doj$zG~GvB##J;Ynt9_%7-M;HL@d8tNK?F1EWF23F?#thdKgg7bRQ6o z?K|q~WUSgMW$|lw_l}P9kH$v%mlGnkjXyD;Q%`<~|12-(M<`OrOP7-WJY_+hkHz`p zx3{lfL7g-?gs-)TVN^KA%Ap zg`h!kH4AGbVhq3W8OaH&AM!g4apLqFKGCZD{yJa8YcvO|I|~x47L1fCRBX2~-18Mv z4yWtBb?{w+6(W=Qc~=cudNEur59?ABU)%t38}`KoWvCi*j1>ft%q=NRHlkedK6Fpt zs~dI-0tgLq;G(ze1U2kQr<*Uw(!Nxw8`4!O#|O^yGJ8HVvdR9pUG}uNSOlFtEpK~5 zrYa}dBsXNxPk!Nv|AG4z*^t02WWNK1pozaZ+;Pkmk4!r_-3<9)vv3nmVl0wcvh*9X zU%&V}Cr_i7_i@efCXA12k=9^A@p=``Ca$+7?6FAIxa+Lk@iuh5?^w8u+B5TR1WTly z7C#HY0*-(6z6o?yr~?I}o7r`o4tuTcUg(kR?6k%A^SJLrKEy?o9BaO9ugz#ya9DH| zCF_mFBJK>4nZ(S|>erWti}iDwS~Q6QX<(l|#1>P*+c?VAZYvb(78NZ2aRT&%=d;@B zSaJ~X5BS^Wh8Dx_{DV&ee2YcjEjhQ_dTAqw|HN6tcNG1wj^xoUS*k0c5M60J(H zLy!WfV7vv8Cg1D!uG^<&?D<5#wxTCoUV4X4KG>SoUDF7_z3;FjxE~!W&J2mLRf*$pT{Twx5L5>dHo4Z~$4Xbol*y=!@~Fzp$bE&kTTZ z&i7;lG4v`@IWU9bU6MF3XavL1+ECsJHS=|l@3EmncckI*`3GN#QB&xlC7w=B0DZ&&q#Mr4#eL*kkCm0iIyxS7^`Z><`mv69^nGCZJc?{(q``)kF|jVR z@(E>g&pZTw*?@!jdnP_M3Vb+P7K-`{5zh7}+%U>MY%WDduW}9=DwiNRBE^wN#_Exg z5$e7^xm3HCr~4`5VKT>>n(OOp01X4f?CLW6)CDRB{J*|a{XgAU1MYVIEWX$K1@vem z%#fb)KOD7#5pS}aE=!fl>)We_$JV-wi+e5DJv}{PfB{!WN5@Z}K22d`11Y(Dy|ShE zZ&8s#*=XqzfhMOFxhap+r+cR1{(%AIK-nU)ZBl*>ZT%w;{%gPII?G|n5TSN&Z%@yU zrIX{|zu&jET38YNBnw-nVc&}ib$R+7)z-$}D2D*x#87i`a#B*76TDuux3_mMG>=U$ z4a-vf`0)cjGjj_24_dZ2vD4vx7i6)ohGyyYefrG;QA`p=TA5_3Hcw84twCZg`!)H3 zLsN}$pk<@pX9@AP_BJ4-?4U-!xlXCPqM1jCc_h`LtnW`UZJhL0G&Up9V^GV}or~F(%rtmeu+BGZbt{!C&H9ENm)pBBe||m3saTaF2k?5I z5-Cpkb#@j0_`t@-CMXziDB(sAwqMN&4wudN{JPlUCwAd{s`DOrtDGuyy(x2olV+N6 zCfc2W_DUZ=WYwsKRjNYAzqs^vl?GKSMhZ)+RNS;tubh`eS*@a>zW#EUwVR0DxOhUg zbm~&0V|G?6tBjI@vZ|^Q03=nhq{2-pC@AFQoySI2JgR%qyH>MpFzq^9Kw z_mQ_^%`~W};REAxjuOtVRnE8Rv)S+!8srEe;P|u`pCR|WRTJ49j`IC0+g5|T-OWuY zm%mh_;_3|?@Hd+We0;oc5RXpIIsJRP@K-YJ*5)RNyeuzI%s7&QoQj*}^mh~{W?hjh zx|Hi6QMf4<5`y9s(wCy9CNHSGb-!Yrf3|l|Wj|Ps40+VDdObf;HojYrAvNfh1s?>9 zY%G+G(!Z~0ZS~!YC+?Gy0@zp?hX>|xff9CIY3cB0qcPXz*&6-J%gb`!%0e-2uGSZU z;GdxfaqvK0UA?=TyD|=zq?Al~X{jqwdQw*9j18yV^>PXpV(;IE4G|D|##gAs4ICX$ zzF51lv$OA7TEd9R%gZ||#*u;2yJ}rG_?%Ll`QioKcmJj!Y#o%dIzks=ZLq^NtJBDm z+q#8o%#M!ZZ60RdQSImlzltjYDL;jMtcY!bhE0CCvvWR?NNF@Fk>W%&v*snj!z1V* z6I&)%udIY4R$i`ePO!1Djr1Jt?T-p2BHH)`dV6~r85jr-k5G@-)@En9<2J~{!nt7f zxDEF>BCgJ$1MKiP#Y;EPEquZa<=8=Z(EVRhTmXyZF9q7x`H4lj7rLpC|46}ep0ikeD3;fj}H$_?v$`bI^M*Jszf3)18?(i4gCH6J3GhL z{N~NsTWL76@I4sy-PNbA-k_o5FHBEQFE0nQefw74uFsH~N6(0ig2X^iZ;D4lMMcHH zaQKVk9jNet3x;pZj9W%ZDhkj{eMVIW(#}x!N#kmG-Y64)ogT zqA%;}phK8gnb~>BmACO5%M)VHR47%m9LX4>Gz>{TdU*s5*(JbL$URXxteh`d;BL1ti8nAmIH4IgRY09llxwl zi<|W$FTzVN%Xq28(5kiU?d6ey423d9(qIQRyc{KKZ|`OUmbW2`i;Lg(_vz#9sA`9M zr!vkA@WNZo?k}J_a`uST91(1RR@G%1vpJrXpSc9+ojq*r9>UwVj95t8zu0!j_+T9Nk|ZHm(_GYN||#(jERF z#P$30Ex)UywJ9C4K}Bp>W?cIRnO&iGs=TeeU6BS8kj0axNX$^6$sVCeA4ViEq8t5| zcspn0z0yD{h+CnN)$EXYE6V2gncR7y?w~CYmfS-Xb9`*dhEp4?H#0Q_N16MV{P)t* zQZ80Gh#VQ0#R0N!k~?bJojzpI)zww2k64~3*UuyyABBQ=mNYdM@Lk>n3qaf5Q~bE^ zvUPPl5+`kLWMt$nFYo5&_R;l6m3Nol_2KI3DpXjl^iwX`9fXQgf@Arl&quCWQq^rYoiNT-Q|oyJWt3x#aosHRMAXKWMk-}YsDC+vd@4X z`SQ!jkpi9<15iD&csjygUmLtoGF};8+F0mm&l+$l0JVe`%mVnpmUG#xPV;r=#mcv{ z0<0}+W3x^x0VOhL8F;zH9=)_%dXMvs#{u^XihE2316_&{OK)=B-BO(Hwqwncv;<{LmYI(AaQgl|cZw`^D{_K7b$2$(`NDVDcxe(x?`U zd2B?nzkT|*kR!n#me!OZ`}w=t!3~NZ`EwEny649ci#P=n8R@M<%{koFP?EWClyP$2 zv%+c;rY_jr%&=L;8{O;l0l@!L^ zof>%13b@~VZ%*J}t%JkmeGq*ggc(ec)wpQ!Q#WP`r7V=yi!)>pKH`>yzf>;nh*|I` zHJ4hW{^y_R)7#r|(`c`V{MA*;4F-Z|T*B<5lH_HlUNnB>u4N-+vWI?#EP}ypnP0bg z3(YG`Cw5!)0?1u=WiXPqPeUoI=Ct;NeSFBE5F3`IXU{GMf#HLPo#C|QAM?Iv27{W- z%;T4h#vS#6W3%-%AJvHTSKk+L@@ofM8P`xyG1J2KXnC&}_rA;-;aB}sX9g)2I$yt) z0g(qdXJ=|v-OoBnW#rG>*SS)Rx0RF*C&T-DaOZOey?YbnJ74aVcZ zIu-5hWWV1dVYLQ716%7yZEJWn-Vv~-u2f$jD;WMb99n;HelIW;IvVJnQz9LiO1n_% zz2b#H&%#lqUfb>ZqbqQL7W>EW)aD*MvSBWcms%)_q3^Jn?}5xKGaa)7Y^mPHcLtO$ zS6zI>PhGB;81HJS{D{gTRJ?S`TaJSnX&^i}#{^ig56G)%g_ zy{Wd+L#p0G*V(p?cHFnGNeDm@8$saKE;Ye+t#OcYyCN1sV#`bA!z+=VGLa*Esh+7l zzxx|E=N3ENhUm>j)RRi&;rRZrh;b~!y)~jWe=EqWqVeo+ruW?1vtIn745t46ya?uw z2c}YF4ffxJmfBv29sLEwaV`JE2VP&J3+pTx%pCyq5&&Iz8iJ%tMDqzNyW*x&vRXK6 z_CR{GeCSq&xp82iWaOCQ=6mNQ<7q}@c|;m7CH#Gv>uVWdUsC`mjc=z<5Lls#$|RMl zuI3lyX8Ovq8ia+RVXaq$W2N$CW#R*YrUya&UT<7`*l(ShutE^qr#Ybv{Z3PVSB~ltr_p~$2|IDb@a{Zu~*jmj#;U$6lO?)T-7oL8++zh*y$7a{_nj+IICx{P-I#rCqI zmC-GK`P+c&g)V-u&YXy)B${LPq-^9P&laS*g7}Ua4k#UOC$L*jM^(^qnr~&!55AcB zc_FOb{zpPRG%{EHP2b2!WFuV=HONDdUt3FrkqOMQd9|IovCB&CGo6ICu|39%fZ5 z#^?Oz^!GoodCq>F88gIS^thhfpC;z)-0x}*A`k1b@8CTAaye-fw2RyIAjTTo`wxEZ zw|^|w5~{n=8sp2jgyQ8uYfBnhpP=9WxhEiBN_5rs;jb^WxfSyN_aXocD-McVYA=7i zbv@8BS}zy)svB0ezm%-ClIgKhsuB7O1;_-=3G!?kid;tPB1{j57>um}ZY28c=Y7N@ zcZ3q45uhVdpxBnoz^y)kb#F)Ha;lr;6n%8eC8hKBaFxY0Y%{=H(-0zStVGrIc$F61 z-SV<_v=(&G$n(+~Bwry#Bq2*O6+h&ix286%B=!yZ0%aq2wR;n*Kfims2OS3@Uz^LO z1&md!NTJ(HG$t=+V)?~)HcABUCCuF$d)Ny~T;!yM*L1Op_9-~!{A)dT=avV0z_y3= z4)CCR*+3A!Dgd{PCX)sSEK?_loXXnbUKk})q^#I zeA>%n>^x{bGAjk*IUrp#4Tpt&W zODB)rvZ~HlV5_jmS)RbuH75Y9%{lSV_!xhuFaEMkOu|^TpU+LT=9B6)@OCGLR2Q9W zI_OESu)iBzs|}2<4!<#KzsZ8{@c4}AH9ZzPpDN+jr%RsU4kHw=z$K7Bq5?o;{_ z>!PHT8Z^v|9Kji#J??*_Q|w%_V^Xn}DlcvU1Zbas^f$0t*C^4gEpCv*z^yt;h;tOy z8Y(HhQ+PU~)*f*$Sa$d1nEJ|%|9;KTt%K6TD0cUP?=`_Hwmk_97jhfZq~J|v^Ud}2 z4nFU_j-U7P5#%Hx(4hiyPyA-C?j+Zod@XqWy%0jc+-f=xNu;mM0k*bPzEEP&*tKcw zyyyDWK;zA_#g}<~Bf5m|c@7@^(y|Lp80wPoZTB(3xC4TBqG`AYJ!Hxop)fT-h`Q3i&nT&w@PP{8E_%-K zZ=3C;zgaXNtqQJZk&^}-EJ-_Cy18!bf`V&NB4T$w0?xW81 zgWIk)1C45ni)iWS_0%>-rt?lf83IiKz1gFhE*t0J@`_3r`M>95X1G<4+`vwLaSeQ@ z_vWCaoA?V>fhp|dT@GEFJ^jURX=UBrTRUdAbb1tLW z-(rOIX+E6>%bDrc@C6+h=`?;h_@y?5N5B2^m$ZX|Ekmr|e%$Q7NPM)9KY6^1bL7_i zT~w7u^~m-lB~E~D{&x^D6&(P+zLjLZ7h<}T_tQV=m&AqvzV1s*YcakhyG_t`T=Ava zZOb7;z;9Giuje2$dV}*dqW=T-p5OI3!yK-I%=tMIp#aF_$?8<0r6l4Pk&#`c z5!<4UM49Q`Kx{s?F(^)Xwhh*9@$VpZHJ&c!IF=$H*exCy$u%^m-3AkmVr#aVe;+9A zQ61B~^WH<%D=wMh2%1ayGqWV`L2}N7Z^Fn}yb4Q zj8_bkuy_1qXC}ItD}Hj?=8U0%3YVKd!E+5Zka0OKNxryF+L1US(ro$cy4RBdXWLJj z_R!Jh?qAGiqepyEpHS!jde!$3z;Y8seV%`E-|=8(PRY_0x!2a;R50xV#SE9PYO_Oe zws7>_^Z8F1fhTh_oqG`)<1dWtb3tQ0-+R(ddvm`;WV^YhMUb_7U#wPHl7nR`BJNV)PS6p;=$bKqr z5?w8Sq)eq%FY6*Y-j3;8y_F4&Xv1vY#@6oGlzLk9lb*Xu$sW7p1|bHX0`0(~-258> z+^<}$;#Pd#Edt~MALS9tCMmCHQ8MXbWJf@$=Y~=P0t;VF=v5euHFa?bY3$7d98av` zPd)HpscLdlo&p@>ikJkcSKR5{Ui7Vd*T?(Bs?KQhNORvj7Tgs}8;l=Vo=*0$My5qf zMzjZNVgb&OA4gkmTMbwtHbQ&4%AzLOGNw|2<~D9}bSs+Q%c&otC2Q(mWJ`6&KYY$+ z8FKeD^mypm1?Vt1Vu72*Ud=$W&3kE^H^79NzY@EiKRZLKCyEGu*yxhqzytXdDVE~_ z@0*!2qV7hO@Ptj;qrq)^wdCyIh#v!Zz1P8cb0Q-#08rEju3desEeV@K;GVTA z@6>vtpbm%m=zTr6;>vi~?Q7h0*385Ga*!@G_c{tWGRB$ZW7Uz|Y}{)uU%k%s3#}TzEx|ON=RE!<@VczGK0FbVhqR+UmG@AoDSS2d=uhrOSw9v(CoH`pzBGvGu2=Pf zzy-cOD9Z1vYnPmW&-JMpoiF6xb3NatmyasmiHtW3rb`jlL56}JN5I9kW%NKniZBfQ zAJk(}x=qz89q zqa9Fll&t>vy&j!5E6vpQ!3=#(zu|u5b&w>8?c;~1%_4sRka;Yspxz`!I?P#9URUj@ zIsz9NKYiocAbzHn&oDI*+RHG(KnE0H=?$6TVzJl6z5&GL3q%U1^hDZf>p$;`7stIj zp|J&zqABUUosl+dnH~(sDiackCwMJD5W~b#^V`l?`KCoJ%?JQCkl(F=rL+lr*yQeJ znPS&yW53+=+qINn(B#V0hCx6fohsUw!YUHeVo7~uJ%1%TX3Nw$?= z!}Wcsz2HHms%>AnRR=!$9EZx<+eWDq?o%HN(zY+6No2ln`c{mI=h#=_C-YkCHb`M> z`1-h@tf&4G@LJaw_yO*kkkb6}p=$De=&-G(xF*II;-UHFaAa?o_}u0CP>j(LIp2Fs z^f~795XkUx*W7>cGj184IV7;ed8+u40iierFjpBK#pW8`1N+l3s?S`_uJIdC``0-= z2E)a$B7Jjl(}M9yYZTDoNW3|ISi+4U>4sQ^;3r=Kbb+(CINjH~+{qM}A?M0*wXbC@ ztW=6yi6wLuIY%EZ0Te*?vwDO6dmKA0d^wYWU^ip_Ep&4J{{1t zHP6%O?#w>^%r}NvbHl+v^^n8GxaMzuxe#$0Nq8DtWK%(Re34n6V#rw{wqY1MuN|P_ zwP)T;Gbpr+2o0M8KuuKS)Cnga5I*M1o;lM0x%M?#kXP0JdqHYc+0N<%nYrGvXjnBq zuMs@(bJiRaX8*F?02UDaGZRpy2(qC2X}78Q#_sIHC*&ZkLoVqd%23z8$Ngf3i_``upeg*~%Vr zebYt}vD3`w=xgWqOIm8++-zd1M$J=J(n*lHjq<2nGMxClsF8PXWxSCoY$&D$-aEL4a!((0mzoY*vd=?hn*U46BTd049e))^|cg>d$K z3T(5AW>!&P$S^9TG0PH>lHG3Ssbh5uI_jJZz3zC7-GCl=Lx1h#UDUO~@=}cGakp25 zIk2qC5l3CiHEXwPkI2Izg!vufN3>Ppl%V<~0N6^$QE}JtD~*ROfUWJK^_&XlLBhlD zThv`!essDbcKl1KTE6UOxFG*3gzsYAmIeU&-IpiKnqK1QXgS>F{P#`mTRWmG1d~OV zQ#_Ie9`>ox(aop%#yJ>l@*2 zg;|4Q8ugd00i9(wFaE~LR`hP)F=RZ08Ih~|ZfGiB=cDYX@e8Z$<5d);x4~ob+U>P3 zVmYHSk*;r?ecS#MY*^V&yD^>K%dWxsnz8dp>&7jZrLkc;;B2fe*=ozta;+ghu_6eo z@yI!^U4Bf;>v**F^v@psWWX7uy?0|xE?$ubat6}9n%}(|1}N|gg7!i-X)AeMDp|00vo=|Z0nEKuC;BR2UlC26g7Z- z(t$8GPMD*G%b3>_i?v_+;QMpZzkx`#B%(O^m)mQ8#A!w8G+V}>wrh0vUcUSH+9&^r zAI`5oOm0Tnt?lH~n+S&8=&5p^@)pXhA`aXi@(u7l|8euZdR~|R)No(Oy@k>ts05>D z!KXwrEs=X@aK;roPg2}@A@R*?_3zBUDTFK*?ckQv%`b22q4p`o6P8+{v+W7Bun~j1 zb0@JyO3$B0n9$b3;6+Ahc}z6_Ma7)v(TLrwtoHWQHrYiza~x{U(mDH%oU$Ymno(mX zyAy8P>kkZb_hqIy74;yp$v4K0%jSmUzc*`#$jEzHcvVDepcr14-uQEWHgTQW=KfL5 z3D}t4E6bKNH*a@I|Ivn&`QY?G^H4k$3uZlcc2P+{K9UTr6P$JEmWp+bD?GgY`+0%9GJusx zmV#rerMtZ7kJ$ob{Kj)LXdg`qoXLO??a)UO%P1BpM1TzS?3~auk@uG3^X!i5jMQA| z47D8$5Q5*P*4kejB%=MU0c`(E1|oF!j#*Rs4c!>Hrke`Cp(Xv6XwH{iPMmIWAN=;3 z%20kFhv$uCrl0%bTf$X(?Lj;w$vn939d9an)~*6;Vor{DqI<($yuDpK+R`(sq7NJ7 zoHJpw>fHgcHxmc6M_^RPqW06zP@hY`&@};!ogpu}iiG1|5T2C{?_tfz4 z6K&evd*SbVBKbM2g0<_ozj%TJlKr-=cimk=d(BK8D!=5nDJUH$cy7>pWF6= zq{AJCkIiD#jI=Na65)JmZ-$_n?R81X^V>eMK4>ih45@ZkOJRBR*UsqXSDl!;NXQzr z^j=2SJG!IcJGPm$Wx%z@se?Z1&=_Oq|Mday(;^h9hwBB+|z&S|k4|`Zt_vQIxvL=V4_Mt;n z-J9w&!euRkqdcCQ$K}Ui|6iq}hhwkj549P_Bbdawfl&$1WCO^47sdfj%IdRqh3>n| zEWx)HzftqL<`NDUFPpVrv~Q;g7V_q9eZhf#jwv}IprTf1ZQrGp1Y=Ap7$}tmz}tFK zI2}=6@zur)+r=zT;Y+}uHwQ$0OKbHAW{fkO4={`w_jP_uf{4qNRSrb(c(3^#pm83r zTS?)Yt+xTP1FOM;-R1O`W}nV;ErE51#oJM-NRL*)Id3`SrQmTKCrx zPOTEZ@Arbb8|EE3@QOfaUdP-$cr76FJbNuX;AU^KDk#-|x0J`=TEvC%aaBZF-Xf_a z+Z>RzUnrXsR;|82;3{ONXgKjd;`kFc_T(EM4up(1ZGnRYm=ixHK|0eOTSPh@wQoDG zNxKK~^YkCbtdZRIngbl;FTo-!XaSdol_$=)m~q@MH*dj2S>3d=<3b%aH9|)UE%dU| zfCV}J`EkFVI}KZZi!2um(E5{bbRGeZePC8wUt`I}|KtlMykwI$=)248Z2fXhwzwg^ z#hoC<`LF`+s_;r?^SD=ohS002kmp4xdxNtTPG{G5$9wGUX?p&nRWWVCh^n;n{Oo;2 zxDfuH^hzRilcMY8@bs)u(g)vgT%#!okYa-Cj^L1hy<-1FTsETtTL=iTci}ZjZU{cGFM2_#L~b_Mz>~q$huak33gqy8Y=iq=Ar= zZ*}3j(jTit{BLT^XQ$tiPPE89q;@_HeCoU99KD^kTrz4jp3MP@KH>ZuDrywQ^Cg> z6d^^G$tleWNCIdGi7F^N$MuMx(~CPe+)8A;PZ%fmX#8`qNi;GhOPN)2A9mM2@KY)V zzi59jI9sD(1599d4c(7AwQmD&Mt_h588AahXqXlq<~ktEj?J!ExbDG-$2k_>n_1&v zW~A^PRA!LYZukA1HJnDEhWMSQJZksDlXJ6eEb?iPMMYwl$?5M5)7>mSqR3}-ZR}S8G!@D-;HPE66Cm_?w^01dDVaY5o(#u zKV>A8P?RUtYjl0Ce}zyY`S||L73ty-I*WdETMgWLeIb*zd47V3{9wO`-e)!T+l9Dm z)pXJ>b`tI63M$u`)?2OIPQ#DVO7`9VS{s}2r{19x@muq{obt09XJADU_Immxw0meL zj}kLyq<;1E_(&1_{jYc38!$!KxUB4Imggzzzqn6ap#ox|qj?({MZdDgw!siU5>kC^w^W!FK|r}BZz|(x&QhmJ3+Z0 zQ^e4yOrXs6&W_>GX2vDW3iS)}KZZUXuL(4OH16<;5B2|{FxNrLI)E1|phE%(vI)j= z1qNJm=%S0rZn`hb_(^_{y*FYcx3Iy3`+**fCQgO%(Zj<-#RSdA;k~#zsym4|M>@1J zof_7T2QTV2DIF_oLTqe_VTng@*11nCAoZ;fe4IffI2KbR3xe77>k%XueZVXPQAE~S z_qNL+g|55sHaRR{5E8b#yogsQFo48gp>Me=>Snwj=+tv9n`fVGg=|_DH=)sKv%Ry^7k75)X>$;f1{Ac0$=&C%GeRbm(%czbCy_ra{Dcm zd6oJ6_C`ipvbN1HwRx2A&BX{?Oe6)2jjf|VVB5TW`Ihe|G?#qC9G4nS(V?7b0~W{$2PPnfwauO>U3_}*0Y5PC-J4E-dU07RDB)9MItr6k`0nhp6f!O~ z6&2uhH;$Ecmt*bB5^M_1UiiYln(qjHxGiK!1GROe^9q7!ilG2vZd=HFCoy6D4$gM~)_bTXt? zzSci~{+v3St|R3$UbbG6N`Zj8M?&Y04LxteUlzN9=mqulRi&kU@>QA)sYqW8O4WP~ zirUxZC;{@{*saaYw--CZ%DA~KEX*uI>VAE7j2`^Nu{jgyS)!Qvmkh|+@8of+FP;2u zkYyaj4Bzb+<8}S`>1$ri5{YDtNxip3q@-u1af36Xlg{vlRiPwmVo@c(r2WH2p>BWY zfJo5h-4F8tDBEgpZ&bTN;}pDnZz5~9?why88#8n0!h6DU5#Eae!T@qC zDIny%T;8QiN(wN4bOZ%80`4vGLq;xv&G!ldD)2r^Xg=1gN3|get9Ni_M0ve zm+>I)8U@D-YqK=UPS=7<{XSorY%nSu7FQhpM+y2HgK^=>UsYZz)XUAx%r4TlKd8MC z^m?v+O&{Lj&&4f_B#Xu(N9lE88mJ>0{-H!`-@J6<)jndyk?FUC)Y?6s)zs8>_eRUcUi$GYH$fN-XIK-ZP%po_&3N#KgqDzP{u?$wSQb$KiFomLyJXJG5a6 zZP(kTmYtd*Yu(*HDn78YyZwAZ;8cVISkElNj!f5G)7u#F(ExGuRs$&2?8?tsJ28=^ zToFIq6kZJPQ3^>F%Qox%JH&TLDEt}0E_1bpVxPofaF~-40z$D0o!>$?)2R?NHFb6O z{WEgtsu&(={x;2UtIg>db$jqP66O5l!J1Q%)u@4&lG%LkG&eu!#@0#6$;anTG9uiH z3%X@0em*gF772W4kS_i}5J!uw%un=w&b@;L!8PtR3!NUagdv6{m8npsRh6Bc&EvSr z>3zDKs$H9N`hDE{?XF;0nV6=grnFzUc;WY@lQ6VWHTuY39&foQRl+dfKT&85En{Vm zcr`s8d&q=!sYCHA=R4l`;h`b5su_;;!=+d%STwfm5$aOvDPp7trJo;EL5gsyST$OV z08Ixv8UR$yM0+0_V{)lW*%6%Qxt@(9vC!c9>{`C(N-%U#CK*#yxe}H3; zOmrz#v*j$LtL71Y$x(E$M!&<}luTWi34QfFtUl#~>A z_B#LzNy^QwPOFMoO&UuoZ;z0WFeWBOfL|a0Mfl^#k78nCoQkL)HHzrmh_nsW4UM%S z5Xjo(BnAcn2096OqAUv&Uq3&3mKl_A(U!xTJ9@hs49#16{}#Z45@NBjYdWoKG#EO+ zZ@)Z0s;jGi4h;nge*AEKeR*cosy<^n@N*S2HQo60E4enlc)`KR&Ph&DF*luW?6UDq zt+h}-3;)PvfRaA4loj6*_lDhEy9z{0{JArW>kEuW$X!4B6I(bX|Affk2~W^mBPwMZZ6TXNNQndwgR=|>7w~_m1?x=m2dz&dUNhmvy;-{MLMRCn24 z%TmwST{q4d4ZG&}$4jzbK~}Iuy}X(jmmHsbpf%d;QjaE#al_LyGY^LJ!_da&?&37c ztA24cSHpxP9uftbpFfah=|HC^>rL2K$E9W{{XSKVYgNX{uPiQb?fCPj+Lu(0r;LJ-PT#m&hYEm9F^vtZ9S27sp%SH(iGSnq3~0ELo8{`x}wc;xZ+ zqe%w849!{Sh*iA~Gc-Q@n?Poi1H0=rJ%ItCg5vZ>2BN6Z792G?H1f*deio$(jkttO zq`b}!L@$xZsc(U?3r(5zoBl3ar^!-q`NqbOapG(Z`Z|^~b~*=b zmh0-lu76v3x#+KF+VDiyrp*=9QPF)&JM90R^cf+w(b@L2ZFX^W$lcNS^&nxOv$(|Z z-Qp36BE8@1_grSy{n3{V%7+yQ&i@6PQOs$ar_i!mF)%S$e}r#tngJOc)}xYP9J-!L z(qBP_(XKiA2^}xHXT7YiH^%x(nGV>-$KNn4-7?2r`U$e}F}kisAJZgDTWE0ZZ%E%p zhq|2}%8+(aH#8OO+ZYaBdj|&F%G%iBnICxCnS(ogKhpiny%ATpA>vDzrCzz1S641c z>%7&Zd^`Dd$NOdfNB+}G7d#*Nv$KzvGKxm+S(18K8X88%N$^84YV)F-bL@oV>cjty z)P9NS{^S0P@{T$}pR(7?z-xkid5RpJ&I*;#W%o+i2bPw{pBcOd;d8Il-LHjIbH8ur z48AkjA2enhk8pYynXza$nY#ZMu$=jkLdjVb5*M@8?!oh&8;u`z5%nK8jBlx*?@q&3 zPhM|pUvQNzZP^ycJ!}nb8LD;NH_&%cD&5&bC2czXiwopVH48c^;+XYUgWQ{YF**Zk zFrcm$DF2*|nlE8;NAOHzRHGUZYSj~<3p+#Ij{n1|A6t@4FNG#EKuKe9*e~WA$u?H+ z|N8FNZTo%0Zev;(!P)J|gmWipi>0QfR`dqhaNePY-3OKZ%!yzz_qh}7-4H>8)_61U z{r}a03AJ`~M|ajPhoZK$(C0_5v&Ux7dvV>H(w^&k*ng$>YWZ&;NCYwgA@jOMSH}Zy z^MfGcWmZn&X3|j4A)!KlCsITAL>qlKrRfI*z(HoF8`blNDN+pr(Q^wq^~ zKN_S--LdQz>!UVbj8Sc=MZ@{1!bY;th!*Ta$@I)}1@0(41-|@eiru~8=Z4QlB9d3C zh$1nmybSSz+ScvVq8y0X&}71W0UP#FM+`%cO*Qp}@)4pC6=M}cxP}~b!lRMndkPPq z5^fKr$rVI7y=~q6yYgDZrW^+q=D#o3?^NT}8{;~@p(Gf3dy32YAAJer6PKqNJq62C z$#2diqlrN022%E?l{S|yo%!9}u(oE$v;fY2!8RYN%tyq?8rmV>{}_A7fFzcbwrx$b z0<5U&dKNhVptY)r!z7~IhU!jCbXr02z?(x=|;*9P${A_7hY195lN zpQPL*0UI{Ae~4wcc`{KULKo$Mxye}n88FFz>5HfDz>4N{ptzO(I6@eckt`^l9P~zN zIt=Tj$wmB+J`zAQMWM5$58aOc73-~voQ_atdOVR((bR!Y9&H#J`wV5$zjU9(vV*+5 zyyNQQ?d@&)_v@3Ughu=hy%51M_v||sXtKCLuZN*P%3;=FZv<+UM&s*-o9O3TWIcHC}R zq$x7E{BD>s2FdB{|@ojk*^IyN-nd!qGGCCX($;Q zS&d^2)a(o;Yl#mrCSe?ykQ~dX6i#t*vdbO%IleocyN=o5J5L5D?P) z4^u&N9=JTYpviq|(hQNGM_ETYChZEdbz{L>_($K3HY zR}dq84lX4b^vIQ`a;^QwsGpgh=TUuJaeWSx`p`33d#}sID zKK`$&x&5!&-ZCn#uH6!?2tk6o6GE^6Avgp}(BSSCAV6@JLW&Ry2^xZXfKa%*6%N6j z!ZlDp;qLT)zweyUJ?_2T_w?w|{4MrkuU)K1<}>HqsX*T^l=u)xQ`tKWv*I>Fi67MO z!0J`Klgx&vD|IL(X_a(vE;h=iXsY!72}w18(SqjPjVhVKQzNruERFV%#^O8)B~C{N>>~%^DNApa7`OPUtqpy78LERp zVzJo?JH}rs@}>sceOXq9p6{jWsDqs+oc|6p7B<|3 z&&H&gVd-pl)k382^EvZNANdh?3QVW!l{8_{&=%mFDK!dznAQ4ICHB2Fxr}`|p-f-! z0W&ko-&cK}obz?3Ibx`$6<$!0d@{iuh-gc#+Y@Zb(ehY~JeCWkQzF0M+I~u#rcPY* z>HgdKxra`TdcmZ-;4W?8+kjrgzUUY)t)cn9&nUl8`m1ciTHX~-6Rjil1KnSNKanET zjEpa8Ggy#9A6C*^*g^GrA=Xr@RCUIb*@t3OCbIYCwMk#6KWLth#;t^8Ez{e-j7qtH~DOr2KVTHR8n)a7zAV zE84$L!2%Pi>xFq}J#*n|oz-fFg(;c|9T=v%LzUUg--WoE8bkKyl73GCGEm5K6H|2u z+R#_889vV=Lj3Wv#e_IQ4;p^SXEo%n;JFi)g+keAkhRrExafoFWy!xU$8vN2!Q_Be z2+-)x%*PEHu!f58+zy&`)rnBf|oNR=C5 z+YD%0Evp(}upT?Eyj+;lNQ(vVe}+Ae4+em(ys+VG5)cSFVsgFj3;N1@5J7&)eeQYD z)2MLoZBGmW4L&e}Kp$}kR2KH%Y^SjLta#kLuW4|UX(AiyAX6Oj<(2kybE~eY126!0 zPfrcv4e#;sTy2GkA&#NaJW6$93-07s5mNY1Kj3?1kUh-;j%P!|>}PHqFeT^6$?KYa zJN}TMARw95R98o6_Sn<}hlD(Nuc8tylT%Pwy0f*FlwfsZ_8-wW6;FxOcmnULDn(Os9b2NRpsJrI|ESgNeqtf-txn!l1yrjr4tSpIrbUH?(8pPklfi(639oeiv|j~OwaaiSF*`phfeX^0uBXOY z5%cjCA#S4U?qx-AaPYnq#OH0uVu;XFg+Jg?1DR-ACEaZG0zt#5mdF;VmjvIXM8~-Y z%JtKyFV)gv*0Qp)!4_R+6-TN5DKH_o5R)@1^1zDGNsdG={(S8sieP6qH)Aye%$X?C+VPMW`J9gr(s~c%{kj0jVvc{D}@5R+8X6KH}dr;lI zyZuxlvaw6~;q>_avB)VI2(;gvF#;yBwzi_qSxPnS)kuIeaELDYd_7iQ-8i1Z$v$L- zvcg@isx&PkB_AH7`0gPxr8(p`j|lKsIQ=tKo(qRv4_TI+rf?c=k>LP}mV(EF$ASjqykWT`q-+94> z2Xb4#CN04g#o8D-_NeU+6qJ4d(%qfu*F`uFkd|+1Y4$f(LQ6upEY+8!9x4V z$j(yV+2$lLMh2eDUk4#QX$6T4uaoazV%Bz}+5eFk_2dU+H6zG7CwjVFyeYFgxQk7oyD?OWS9J$ zy?tL@$fzHKm2{y@8@E@A#!{cA==`;#{nvXvWfBgS(zC{=P}wFXM++~w#y0jZy@cIC(pvuIyN2I4A<$-VYm>2{}v-N6N^vbU2gqjxYGg zDp~wFgF2;|DRmz8*%M@ehdEv@d&&?`+BkF?D$<>^%l_^ccAv5w=24NE_rakc6n@AR zKzc178KHr^$y}Cb+A6CRZq3c(o9av)K4a3eXVI9EHlI%mKiu?w5ulaU4QBK$OM1W2 zFwsrR(AyUl&0Khc<3Tn`Y>G)wY)YOm`cg;5=M6n{>A9XIWV1?O>jxgsMTskz)B2f3L=134`FqSI>LNaTVkU6{i=>n* zDd<*r5=w+q({%f0eU;R$?S5%e(M{Z&qc}6Zor7n?&~ok2@H$wwoPbL{71K!Qp(v!nhK62` zr0&OGcDp`!ZA99m#mPcd`mP@!9*V0%U1eFJ%gf^Vbj&K-R7mrA$9>*Jb2_oBbFMrJ zo*T>|jxqkM31eR|Cf7YqtH0Rv&~-wZ16|!MZkznrnM#Yjp$>xJVRDAKhy8Ux@hz0O zPPAuIb#vo5vIV8?a16^+RKXw!uBDS~+S}5;;Emb@S`=3 z35ubAy5yiy(!;p*DS@3Klk08u)B@IADv^wq0pbNGN57I#+z(fCMA(HV>5?7RqZL}H z73L#A!#DQXx60SEE0wdmPoVWScCUy|@nq%H{Ud0Uh&_`LYO4zZKrN?qh9@?4{zpfT zo@|TXSyK?ww%uU};Q?p}Mz8hYbGnFa6hL#=S-trm@>=7M6Ut%#k0Qtb*m^g z!$$&k9xv#Nx&2UuG}$5dJVUZ=u5?2A&Ye@&rmGapww;^gQTNLa-2W_pnhg-2;k+g4 zdT-*HndzFcJTl04VZ*NxRZ_7JNHTF_RrwaCVX7aVTN0*PExl>27vk>kgoOP|+*Wxl zEE)pTkaU-G)L%UonaQXhUy(@H@`xMomnUulb>+UY(Yrc1VQfDZxE-oik%WF{uqDJ* zH$b(GIJYR!y!o!@jUjifzniM0i_A62>Zg#wh*O0ru_rXg=jkyb$C;ic8HHlLuS`nD zyoY?&Gl@jNif73+MMcaa;zP1PkgMN!eiENoMrtH#AmH@l_>;zf&H!%&m_*{s&7b=B zWm^r;&8P*Ts#31z%X+D3oUN_574!=-93$G6I;lTl&-tG5^v5e;(C;V?fOsPWUG`5# z9)_63b9G=uz`dIp-HJtfq@T|GD2@yXJ0+&~J-~c!a@nhJz_HDl&5}S5J#2Z_Kt`wV zgg z*mdBE)KF1%h=pzfqm-ZfjkEV{;7N#}i>`!Xdy*>0<6qJq5-Dp=1;U>Fv05b5dN;E- z=xqAwH(JKVb=QSQx9l38?hl+)b;U*v`y*?$NO#BB*M1{(4JnP2l6m^4gOtl^xd&Ga z7ff{}RmT&k+8X#!^VH+kUG_=O!=g+8%GfV?w@0fq+%wg8M&qDcJEW;AliM)mp z-jw5Mh23`Tc4mwghU9aWJ1y9-`bKLa!oSx$vi$CaJ59w_--_xzY|7+$rWZsvPS8iT zP2%9u&h;59L*`EmdsyVm&AL@tRm238+0VT-=_Vd0{Z7Plg1HrT$wBp5mZ-y-;+<60 z_RJ{y;wxpI-pXYv17pDl%l5-S81^Fkcpb6Z^77VBL!ek)@T~*|ffsoo_?BJ*2px)4 z6|L!@ed?Yz9BNTPwg;y0(OOdtvJe8L&FLvL`RR$Mmr^>uyLm=nL-b`X=hKSTu*=7R zZ(TN_!I9#YSGeT`tnob~vAg=_-l7m^&3n3DdAAgq?a)@G*jJ^C@x3*!PU^5%YEYzM zDKW|JLIzEp-8aAM1FFf1&7$xDJ7NS8C)4Y2mBgEt%T3~th-Ji-iVxHDbhb%md#QVY z|Nb~e5u1?}JJlr24?VNp0ZMN36C$2Z&cnHTJ-wLwlBx+Z0h1AQ!WfI+HK~CyK}RkX zjb_9>>zo%&WBvYFdm#3;Xr>XZk6-u2#&hFj;|gcjz)U6UngVC*eh&@Vlis*8gIV6T zTn!O0G@jYl3S#9fwOMu(F~Mz{pfNso7q4tg*wAjEH&9P9^`|`D)k#lm% zhm1qXaLeRI)ORwX8Yq%QMakZ(xk|E&n7(nGXMXM(6PEkyVmb?zE)C!8@AJWKk5lBgjYs?$@u0c{a8G(Shd~sUqPJ(?Wdzp8V^H0 z^PF~j0)h6a$mLN2Iwt+!Ryq}%>y1fI9Ysbc{@T&>4gk}y-L+pQ0|Sd@=DQ2O6SFe7 z5(a&jd*x9#PbLnJ0HECmBkNd|ihLKwUJu-p0m%4(7{*KJkGA9kU(4NK-O0%dd#s*% z`FW6C=GBYeCr=KTq9Q};cmo%X+thWElm1W$O(X!GWA?+}sqSdOF2y-w>vfruNO2(< z{c1lYmknS98roNNH&9zLP=>OCq=Or74Oz=F^Fm*b6#XgYF8w&gIF(P$+#P@C5r^dO zy7=M(Zn&3I!!%gLzn=afpo)%5-Bw0m+Q z+q|_2#QW^~oq?7)nfO{eoAQ*}d5rmbCv`-fiz~G(JH%H`^=>s@R(W$XA?z9)mVf-X zGwBh0H3|>6p`I^~m#tS+*Rw^iEG1@=F=396&)B0f&epeNG<@(0d%l$@4XZ?G_m3h6 zUZsJClb_Ay=!uaeMmG>8qhXUxQk!bKfqX@Me%q8VIcLW1jaB>JqS260uvDsR{bJj( zWb=uEB0D|Q^tWW*(1D7@tw(tvPVWWzQJZfan~4MINXB|*g@;uEe`V#}dAMPYZ)ZC5 z%hgAx#J3!aG;Sn$wKV2EBNSg0!BBjl;vq1fvT*JAeM$JpLd0aC){6s^R=_-1I0WCm zrwm4dNw0)*UPQmz6Y_+|VS7tS@R{uQyDU6ICry`2uw_7gG`LXs5}*mxgs$&wGRG>0 zqv9zncJ2d=W9c4zj&k>kJiEk1#dSaJr&wUp51}gE<)GyvBad#MDA;@sT_@UA#)<{gDo(#FtSoZ6xm@xjMTItFL|R!ve+9Lpw-{Qbos|8i@D~`du@%2 z7TdnmeSqW<87Q-JRFh3W%V_}o5vrm_JVbUJaq`D)Mr?rJQ3|y6=nvSFP{aMU*Ql~L z@th2(6N;LTkO#IupDJ?^-56ckC|Ia=wR1?{6VXzx_b~WAa0U3^ox28?Ah%+&k`4R^ zR&DAfH|xJ(&Dkc<;nQU_Z|7-w@H;SADsh#OBlW$%Twv;m9=)VSd~8LD6Ayv)BnWWm zp{g&Fi`@?Pp?VB~JUS*c4`r}8t9^vukKUnqPrAR>>vRHa@9fvlZI##m_C}N1YI<;g zKYDIfItg33gq=v&+`+`=#QoC2M*mu+%j;mSdg1$tNZ0TzGx#VxJ2`Xkc~=M>e@lkY zu_aI61>L-3w6*@G*hAT^0#%}qpuF{Bdyu;)M#eJ_3P6 zVb6ui8jYuXoEOpycZwbU0Bdp?c8;TVO81wO$3Nvex@8`1J;@L`x#^EPSQ28|Lw?Ff z^fPgIwF%rHBNxzAf-$kRo{q@2(54>@pu7Ukn0-lykKmDay)%~`m)Vg5dmZ1H ztk%7|2Xg~+>zj!|jp#yUh?Jhn7x?bSfC2V7zv#TLK!S)UZB`9X+bUaQ{QlD zg~w`jWtwMlQ6dEdN{6EO4=~I*hThJ5;Awi5Le}JiGPEpd=bAn49K{_~UL#P2;U7cm z{#1(;^@}x{cTQJ*JIZPH0)p;R-)=cN9mLD`g{+k~^l1)4?Y!N*7aft-ICc=ztw0v> zd3X^cz4fpH?Wp;AF5LL4Z{sXEF)2wEvcDRe3uSwo;K558LXBk0{-{wg1YFQ{gZUJ) zZu!RW@~f5F=7!|v1{-%O+34TB}Qv6j%$#TFiip3t9~;q(L?>Ey-|KF zN^FL+pn(0eTKITW&)N?qhoTu67muf^@wo1Ux}Tp(A@Un@M^%_koq=ejES5EJ8stZi zB4KPa;`BD(h%81C4$HAA#m(u24ZeD|3~3 zC`LLQW2t;D!4@qq%ySwNHtUaeGyF);_<8W`jeV9>9S@Ug+QJj98wh3j%?eSRD7bQU zd}xcz)4DlT-v>2Fo+1eoI^dQvmiTH{SiM+n792rdvb@}=iZm1u@YB%ygR3CCtnrAV~};LnpacrK$Xw=+Py7ZmqZ2 z7k;&avAnj39mRrblBLIGD(#WeCJx-oAaR8V3>Y zEfJb^q{#1>lqmRCGYz7ZMGt+OVyowlrZd6+TPtmFtqUCfM8e*sbn5(47X(^?jGrL+ zZ8yAi@G!;8v=uNq@%t~&@aduDHn|z}#ThleN@`uIY2NM@wF!(1<*ad6eU5QgjHa)- z6@tv~m=6m*wJAbVHy$fqMXE1(Jz$D-XOdjg(g8&I1r_gm!7`D(IWQuCj-CAIJPqH$ zChN=R1q0V_H3i_Hy}Va`+UjB?WH&v{GkKj)uM*{{dvN@%j3-qkBR$&Mte(x0yH>(W zMdVhtjdcwdCPTH2?G3+{aw`1wM$;xmqP%@sKp-cR?W=>6eL>^NxS2n3RaE`n8!n{2 zndl%Vm8R&7%wB@%48hND`fjS$_FEx9k90jF3h~eQ06soUj`gEK18$SZ`|Q5CF*fLD zJ0F>NL+SPkt!Tf+N_lQdDmwsVj+z6oEX-B6OKPgdQ-G-%ekEV|^E@KL`>MTyP9?6P z{+Wol@TN&suox{nansX#tM)$vNU5G#Rp?p}cDRqwTx~BygMy~f<$B_BU8zySX7nwo zMO_^0a?9=2i1__wC)qqtlgql8L8AATX3&RtI5K*{1LbvwrFESl?!wno+C+=ZCf?#O zKUB(Xwvp#QJA2H{EO~Y0=zr;l4BB~}&*!IL6a+(aJVym3pT|~w19{n3DcH2m_NXcyPoc?QQ5cAUTT;L$4A_^jv zQL^skJ&%KNYWGp_1f11wv2r+;6%);8>F--#`p<3zdk6KYB`3F2b;wxtOyCxg+dt50 z!Q8)Xko^M|((&IhmE1FnY99(tuq8iXZ<%Nh`8IH+O1gJgV0 zP`bt=^ZBK7_o&n2SmlUUg%a7M(S+-)dXryktE84WV9DtDHZB}=3*=QJ91-E#JUA42 z!<$>^mt+pt*M&`WDyP4HEGUuk73)~}psNKX%lCo=N}I)2R%OkpttFEF$6h0^X_mf6 z-(d~dogO9Ai!Rl3gv$3jvJsazGxf$tZMq-XgE<`T7l7>7)3cbTW<1@Xjm^yL>#@W=2nt!kZ)rlQ>H)NHh`851YHVA#!xqIgCB zGa50UJ)^M-)yvJTtZZ~8=deY#%| zBye2W72=WEa!h)ylM1s?Pb>P}vQG?qBBvpAP!fX0fj3Z1YEewWfh(jpXW{fw&CJy3 zKB(~Utxs45OL7U9)+KN(lvEA~yoxb{l0##dSd@aQ(I5yRqd4+GJz zW#ZR9a?w++&tDh+_H8|?aKxU}hUMLP7j&5(A9_-vN;NArVH# z4w+V9R?{Owo!}Y^am@MRKJcM}g8?abNi03)OFvTY60Q+vC%c$zwWK+miVu4kYepfV ztCW*KFEOw)&rwU?%j$AC)pDaEZ)Q20q2O4~l03wtbFoinzT3D?xMcJu7Y8I-jC7?f ziaA(tH?x|E2Fxv`sy01^=>PWjEWqk`#PuEZG=#3sB53jcI;eTM&BqX?!z;#I-9GOf z#Wz_b@Woiqhkn0brn62X%vd(O(2I3-y190Z?7yEN!})VNr0E2P-4E{DcT>iv7eO6f zKneRk=lbCN?M2(HDcBu!j=~tez2CX?=gXyaJ^C`xF=5a4A(hmjEWaALC5RZ8Y*MM; z`A)W4FT<}@%n$j^^{h(Rbo$TA;MCrk50!M0fvo!k<+LU2V}x_B3a5Ep7n%Sn=%(HSxmG;2Ci{xwN-qelwOVEAxGHO0niP9gwy*!$>hiD4fzUua-g z*my=@q?4R)S4rX%&{rQRGWZD9U(TCzIlY4*U{*O=BzV6%wn;}ik~tQVwa}}pb-tfiR7LL`bfI>qqU?-zR$ujx4h_#K-VA0{nfx7^FiJ4$qDxCx2Oy7zQ9`28GM=+Gr zE-bxJs|tz_W7UHwlxJ`pV?I2+6IpJQ1dfOr1*ihulav z9llRZ-4iT46-~c+ZexXn`V4T+r#M!3x~H~8+kc$Td`0=f)~}Oh$9{?Gj34JXt?-wg zLSBO_rs)RI@&D5<@K4XDiPb_>v?uHo{RbJ`eZt|5`sS{~qa8**^3wbscQB<$r(bip zR@aZ4{HUr7^_Bmej!iZFRLsezAk(Sm9QxIeF!}a4h;ePx+TWp&xlH4vvwy_y%iNRo zJhc$OA(WQFu+o1jB?Vt>{iKZ@kZElJeU2T4(UIKx5}&DYbLLlknY^kayqZ48^8Ba? z5p!2snp~mU9$pX5s{+SX`xe$5x&HvY0>L{8%13_*BxkP%&Yh#>{#t!w7Cn{vI29Go zs_akaY(9|b6QsDiASgGT3>%Wic7Wfg5J#mWdu?kl2XD^H```dz7QZ1EpE2?#x&^*= zbBtD|STmWPg8B-bTZ=neD87KGHCfwE}DH`CqpA8ex0_s z-Z;%OFy`|{-F+Y>lI_)IdTg(*!;5|5kzhafvo4Kpycu1;dXRVTi5*JCakE4bgFa=KVf&6$^x{+B zl9ov(Nu(jQr2bIS#>|w!eB6*mZ#g@C*DrH0VgG4J)gLbropdi<@e_jKir9_tU;#&M z2{#dfv8|cu)HbtnJ0n7R_7PXmL)&(dLuao-bmlu*G--M6$&!a(`nzeH$Av>w82hY$ zz%33P8Y(I;6uXab%h@d^OGd^HTEX(sHv?duy;;jnDqa|S6Yo0rGeQM zbO3ePFE1OOoJk|qaNhk=A!ETDI|}T05i^-;H(Pj&7b~z*d-jjkBo>y9+kKso_>j*^ z{;#;_umlE76&npF--)a2IS8KA5$HODIsxxdE0#L3@ftk5 zbKlK{%pd=&-!rG1Z1=G9oIj@d9Xa)S8gYx8Q-5f6-s#vb{ANGgyYMuwe6fJjZ*a?=*$awODoKFH{4u8=I0@RbQHxwEF z;!Xgwz5gm%bUc9LJ_W6u(<9Fs z2NF5a(a>gRXV2VUEUFtA_-yo(06d!dywwHEvI(1-3-1mF=*;Y_HE#+$>M`h-!T+0B z6Oe`wfcS0SJw=lw?=HA_sClD+*u03i{rlkO12@*GUyno@-#c|~JcFGP;#e7{pB&~{ zkzlLkLeA!TM8f&2lTqSVIa15By4V{&iLK6xV=#2!ncD#P3Ng2u?-SSzZ&Q_ENZpLe&T*+F=D=<@VG@PjR-8!XkTs=F*8Aq zqcI5Rp%@~M6$I|R8O<<(Y3A_aS?lunY4wunZpYzs**BJ-%Lr6rX|E@cHAucpu~uP^ zZghBSOXjvKg0r8MT&%h1gb5*QqVfDh()>s#bB_Sj}%hxlbpwBcz7ySOpk z2qEbGNQblW@*z3Nyw{q#=}tvsQdXqT#b=@{)j!0>tYhVrCCh7`2`U$Bz|bj_a&|;` ze@r^(<$8#%iqV?^5jA2$x>wvaAB3?@xGUTiVQwV!g;c^RlyVxuJy$nM-ZtA^0bK28 zWTnOp>=CYtDoq)ht5kbQRVVqU6&GUOJ{jHzONNmRoRVkX%OLq_S0h6AZh;cEbYf>Q zeejQ7AgARI!ze1lx>e`?!1;3lY>Mq}2H$1$jB5njf#0d!?@*`RW@hmvoRRdqFkS&dMkeT6c3}3HW!xR|U=xunXy|{d3Oi91f25=Vj2Q>G z+3AP;xV$s!fLh;>QNU@ew=6Ob7ydBInzsA&>kY1pG2LqaT5tgoDkRFO4l`XmX!df` z*0K3)W0hM{HoU1Pa*}!ggB-?R(U{B$44Cu_fcK z3ia20Xe?UTdQrjRHhkHWx$L{K$MFpvc6~Cmcleos?AF$ylhc-Pxa{FJWHFIg`M&h= zE)~eBHLFLodhoV$OsVMlZQRXN6pe5&4%PIc_DoMW+md|7(O7KOw+xIOk2FyqkNt%P zzbRo*+urwo(Vu)1TFJHs?ys){m$$d89^bI9J_0SEJ1uUud`0oEX40u_0mFLGzWYBX z{=c)+$`F`OzX5Lxfk$OG?dG=Me#J;qPCBhK23? zvqmEt0L6lReAd-~sNwk}Z62`M``@R#1-xT#DJ`dOmC)-cS2RI?406KDVby2yxTrkZ z)@BeT!2xvDdSQSY>!=d;Kpd+=(=3LIahbVZZ5hB=t*0wr6odSmH}_u*MQ6!fs6Lkj z;C#WI1vL=ov|`$1y}$psaOySLvS4ahv0|_j8Xu*Yt*Wt*x@z~v zTi@P#mc@!d_foOjXF{GUPdS<2aQ#t;VlKFpfXlu}*IIjPnqR*5*>e3;Sc*}mF@`{SsJEuuXlY!jKr!Pi1N*x>P7)zqA!*vbgIABAbL*Sstu(qG!jeBdNa zBAd9e#rNS?qst#+UAv@fMOeW_@cnr*a%VTq{#*8MIc+@9zt@rhtw*a@sOC!MX5 z8;4KtHIh{=tJ~Vg_VH$KepKePP^EhftbIp?RzQi8UQtr}yj$jCOwH^cW>BB)l{Z*U z;%6A=UmsbYt69~qU(L5VaOX))edkn)b?7-yQl3$6v7AaA&%17%n)y?%S3*rnhiV?j z;WQ&MH-3ERzDI7UGTDG*`Z1fJFIB-C=J1z>0Rf?}i6#^zC7#LcMA41mq_4e%U4Je^ ztM3IWun|GQCLL|9DOQ*I;Zk?T0zUS{-dtiFoM#Cn4Y)L$`~84CB_=hnC>8Y!pCA$6 z53E;V)ds~3h*4I|2_}>ia=&^FZ)z!u?p?tr2*Ec3KF)inzx>6bY@yAuD%kf7@9cZE zZLum9UX`wB_erSJMU{0_$HFE^efBhakUAp!cm0*SHMl^hZ6;=)mN$ou)B56$RMu4_ z_0LLUYZR)pQ(AGLjhzCWZ9Nsj+iUn!=kxxznAxUluP7QT6OB@KRw6L(>q532@()H} z*VLg{SP_dni#sI&YwfK_FMs4BBKRfjJ9l*BUIZ&@FC}mBSAN085e5I;z{JpS)P(Y3 zR9Nbe47y+P6U%w)-(A)6hQBo?dU9z3?Os<-7P>TujVeQ-=uSRPX$Y$?reC99Z->c~ zQw}n_WHtHh;&Uls%&QJ3I?X+>cT_@w5welmhf?#=&zX&dov_cA#vP|WUqV$y=tG!@ zvqCGbDSF3T$8{~HXCo#`Jpfvm>6uNiMdWh<0c8veTp698i?@v|scY&`RccykjO{JI z=W#Rh-CUWden%2=>;3c}34!)e$rTuZT3Uo1E;M@$iLbGCjnKp7Cmd91;mt3NPClj1 znVuD^>KFY$?Jiyo?YRt@OB~u||wYw!cG}PYxSXe2UYiozp_* zDPJ3uI^?q|G#5|WUY#q~&MmBUx!yiQTjz{z$m|z09Q52dSTp|NSD$pi`+n2F8q4zX z*JfKVUR*;i8Pn^n6f7o|;ZA{^^ou7u@)wz;Druj3d2q%iYb-u7h(LpFm0CPSghg~b zm+f51U*4p2R3+2CiR9ae0g58iS-#=6is8Rf^X=*{lLyMbrsP=JQp*Tqq&^-+0M?aJ zMjr_zytoA}*kJA6@g9QaOc8LkqIF)EhAGNv*&W@fcU~FAfqL9`wHkgkUq1f;1JHSj z*?JFS_2@{BgJV`NHG%0)KW-Ws-v|%LjgW6Y%VLu*%0Yh$z!J)S_K%#qV~pY`?rjva zU$nKq2`+wumVNZW_|~9oLV@>6FYgp`6kte=3^=2FNi{vCwMGZ&zoqO2g9N0H_O5CW zSR<}D^5}W>V#4KSwmiopNQ`I7?>nAsJ^L&2H8oob4mpAYczV{Z#2r)cxjQlF;+`f!Ry5<7c@3nFv&~y>E;C_5J-D zfT`{LUm$S*7ZcHcXMF$PykNxxqL!yzV6E;o)IcQ6D?tNsnYD z#sUhz4Hwq1#*!Ie;NXotQ0d)boTYjyKWt7OJOKEW80i9YieEZh*b`SlP3L~JQHQ|X zW`As|_#b}Y|AW2$|FM?^J9JP9YkYrYC3mFE1R`L8c>5{ax))R`ZN zmViC0&^UtLjZ|r@f|j6SKSp$%5}?ahYwPRp0D7o+`I~n?nk4-E`~bz>r%%5&Qn7+M zy1S)Wh|je&7h_UW=YeY>th4>_ae6 zDLO?AEc`#?;lIzDr13Ky>))M5xKy`p#rU)9nfwwcJv&Y6d!E3qcY5J}m-KsUE15I+ z=a7n6lgUz$YzMDr`yZ7D$G*;RQclQq`17-b#CKmx{VtZ5u}+6LlllW4{gYJZ%@ZZ7 z+jshj>TVB*>X!ZMY^=N`kvFC`!==WlX8P^fF?&`I*JHQ$G%tSQW>9fE8;{n<@ZTzn zmwes%!Vx8CRv8}W0Qn%d8xmEs=R45y_~JF_ePV&b?R8IxEJ~=@?);{#+p_rn{F6sP z$3?+N2BCxZcBd2^y>C3iUOxfJgS?AZxzRfCUd=2Thor?`w>rkUR}WiX7d_vg^VKHV zi+6v`xpn0)oRZ=o+|Ep$_P!IEElo6V%VHBv+-cq| zQdy(1mY5Xahg%uC>{M~(ou|nun3uAKM`|IRHd_rHp{{%ICi>opL|N$W}Tf_>0g z_xSvN75+Gk+-3sTu0>rf z$Bp*kPkH|`q`?x^m#FixhaN@p$#9cHb}RNwFVg3R*#n zT_3jXbCn}EnDM4;bS1vPb<$GH7)(?RAkxezopjH__r$^jZ>$_^)>#C|Qby&kf;4L6 zgH;o3ou#vmdX}euC(Jy%45gN(9GACy>?;+;aMqV-O~u+B^R8E=N=utt9sTYs=d9B7 zTtt7DwN%tkf{b@CI3JtjyR<;#@ll?w6Cf5b%2m8^&)gG-8=Y;KO(hH=`v2Nw#O9e# zHB^BU1!&@1PWKWAtiVV5B^}OK&ykxO#&hMY>45TvNuc0;XCYNOtod{-+!)h<+YO38 zrR7>BJRBS~O|AU8(fci@U5cafiGFgTz9;?G#Y`1_NTT@Nj>`ArYu=NeWT?*G;HM+r zSGn7(6+L7cqDl`}dVxdbdCS);bO991Z>SpxsxRaHhp=&}x!$YllsHq1JoE_#)WsiS z(ARXo&if?rNE*ZR3@7qk)MPtMj7KBOio)~|+Tfqc4!p8s+bhhg|7UKrl6$>NDfAHR zTl=y}AF&X;lnsp5IrhZQ#=0jK<;xPMs^>rLoDJkwj`6@`n))P+id53AZK~9BixG0S z!994+d#71S7Sc8~cZaj^C(RAKiEMx0?&!CS4g?PsBGDD>K6~)z9>0@K{A49xX3m06 z#hQpOK^|V?#eL$)czdib?XGmp3U<#rl2!_2jj4#M72EsLZqe|kb6^75-7)?n;2A+PO1<*jr&YxbeDI=%Zir)@Tk zH&oxug0McUG$$_8n9CAK_HAl;M`l=@z6(|@NzFA{??q|bEtO&!jG7eBTN^8Y@6V=< zoYI0h?gTwHGms_=f`93{nqL(NHwIWJBGHC8BWy#{U-5RYj#Xbg&1_lrHKsdkTV~k1 z>At(14YD`6y{QS-Vq+3o8b10O`P?MKq~!V03W3so#mQ-XUXP~sW_%@d)VJU(>C5E)>pqn&VapL=AT{d#|+Ej?Q1pRQg3u3 zekaYpg5u~Vxk4VwQm0fzD6J<7h{7V^yAqHq_Ykg$G&W9*Cvx2}pW8oj(re_gta%4R z)kw%DpFQIGQxqFLZ8PgJ{aW1i$RNPz%fyM{YyzH#MUA(pg6=k|8hmGfHOb~|gc2Fn9}<@QqcK=8cP5r*|vzqE<@HjiGTQ^4`=UO3?68p)nxVvDCjAV;TXr6Kfy@8wI!iybZX=ntJa z$*t3OZrW@3e13{2kEz3DnnSJ$UUI`nTrn$!7nK8xm1py9Mm1frDbP$AWbjODDd*D& z8N|J_4U1~eTvpuAsdxpVFJsKYMz0sv=4@JQLS@r*Wv%(3W276Su?#!W{S=}`$u!%d z9<{MBZRgec<`{ZIf#|W#8u{eiL)bDC3)`tf1<@%onvc@t6=UuGk2NQ0-!};5k2l{H zgnkB$NtC{4E;|@n7qMB892gX*Uaa0>3MVBY0T4N7!8BuRbkP1|M43r+RMh^4GB#ss z=GCA52}hV<^#f;eiTKIpi4~pknYve5yzrQ%@59<~l8P~fZq-pTiGztR-&kqjuG7(4 zH{fDp0M}4gUjs~V3)xx*mjir&dcAo4l86 z?>2MTvcucBPm^%(9e|TpP!q57*m1O;hfsC&qgVSFKIhvTLil?lu=u;qT%Rqb#c}d{4EF z3gTtJ*f_aYBvWL8g;s|CrY{m6y1Arc=+WE78ocgEgjVUX)E?eF_v_UU~~r9 zi}u6tldrX1X3narswT3|I_oD_+{wkj`hJ|=)&3NJ{qTVG{{O4Be~S~12Egn-y|n58 zuIu#NXh`0uo*B?Zwiv5;S9_o@Sp#+Ao}APNO>AtS{@XMCM|?lwMuxits6KZ0_DHbM zI!`y(0mcC6T_nuf$LD64b2%uDnKZoH%o!mGOd9LiRwzmTmm1p3<&~QpuFS*J>aOc(&LaDTset=@UzYEvd4D;tJmC57F{TZQ zDk?+nr;u=i;JZUFqk1Enf6CS@%>p6~_2nBEcW1qzjho5(kc2ZWMc`IF2}}Pc2v+z5 Z`rGA6lSkAeKEUsR. + +**************************************** +Installation instruction for Fuel\@OPNFV +**************************************** + +.. toctree:: + :numbered: + :maxdepth: 2 + + installation.instruction.rst diff --git a/docs/installationprocedure/installation.instruction.rst b/docs/installationprocedure/installation.instruction.rst new file mode 100644 index 000000000..2d6889bf8 --- /dev/null +++ b/docs/installationprocedure/installation.instruction.rst @@ -0,0 +1,691 @@ +.. This document is protected/licensed under the following conditions +.. (c) Jonas Bjurel (Ericsson AB) +.. Licensed under a Creative Commons Attribution 4.0 International License. +.. You should have received a copy of the license along with this work. +.. If not, see . + +======== +Abstract +======== + +This document describes how to install the Colorado release of +OPNFV when using Fuel as a deployment tool, covering its usage, +limitations, dependencies and required system resources. + +============ +Introduction +============ + +This document provides guidelines on how to install and +configure the Colorado release of OPNFV when using Fuel as a +deployment tool, including required software and hardware configurations. + +Although the available installation options give a high degree of +freedom in how the system is set-up, including architecture, services +and features, etc., said permutations may not provide an OPNFV +compliant reference architecture. This instruction provides a +step-by-step guide that results in an OPNFV Colorado compliant +deployment. + +The audience of this document is assumed to have good knowledge in +networking and Unix/Linux administration. + +======= +Preface +======= + +Before starting the installation of the Colorado release of +OPNFV, using Fuel as a deployment tool, some planning must be +done. + +Retrieving the ISO image +======================== + +First of all, the Fuel deployment ISO image needs to be retrieved, the +Fuel .iso image of the Colorado release can be found at *Reference: 2* + +Building the ISO image +====================== + +Alternatively, you may build the Fuel .iso from source by cloning the +opnfv/fuel git repository. To retrieve the repository for the Colorado +release use the following command: + +.. code-block:: bash + + $ git clone https://gerrit.opnfv.org/gerrit/fuel + +Check-out the Colorado release tag to set the HEAD to the +baseline required to replicate the Colorado release: + +.. code-block:: bash + + $ git checkout colorado.1.0 + +Go to the fuel directory and build the .iso: + +.. code-block:: bash + + $ cd fuel/build; make all + +For more information on how to build, please see *Reference: 14* + +Other preparations +================== + +Next, familiarize yourself with Fuel by reading the following documents: + +- Fuel Installation Guide, please see *Reference: 8* + +- Fuel User Guide, please see *Reference: 9* + +- Fuel Developer Guide, please see *Reference: 10* + +- Fuel Plugin Developers Guide, please see *Reference: 11* + +Prior to installation, a number of deployment specific parameters must be collected, those are: + +#. Provider sub-net and gateway information + +#. Provider VLAN information + +#. Provider DNS addresses + +#. Provider NTP addresses + +#. Network overlay you plan to deploy (VLAN, VXLAN, FLAT) + +#. How many nodes and what roles you want to deploy (Controllers, Storage, Computes) + +#. Monitoring options you want to deploy (Ceilometer, Syslog, etc.). + +#. Other options not covered in the document are available in the links above + + +This information will be needed for the configuration procedures +provided in this document. + +===================== +Hardware requirements +===================== + +The following minimum hardware requirements must be met for the +installation of Colorado using Fuel: + ++--------------------+------------------------------------------------------+ +| **HW Aspect** | **Requirement** | +| | | ++====================+======================================================+ +| **# of nodes** | Minimum 5 (3 for non redundant deployment): | +| | | +| | - 1 Fuel deployment master (may be virtualized) | +| | | +| | - 3(1) Controllers (1 colocated mongo/ceilometer | +| | role, 2 Ceph-OSD roles) | +| | | +| | - 1 Compute (1 co-located Ceph-OSD role) | +| | | ++--------------------+------------------------------------------------------+ +| **CPU** | Minimum 1 socket x86_AMD64 with Virtualization | +| | support | ++--------------------+------------------------------------------------------+ +| **RAM** | Minimum 16GB/server (Depending on VNF work load) | +| | | ++--------------------+------------------------------------------------------+ +| **Disk** | Minimum 256GB 10kRPM spinning disks | +| | | ++--------------------+------------------------------------------------------+ +| **Networks** | 4 Tagged VLANs (PUBLIC, MGMT, STORAGE, PRIVATE) | +| | | +| | 1 Un-Tagged VLAN for PXE Boot - ADMIN Network | +| | | +| | Note: These can be allocated to a single NIC - | +| | or spread out over multiple NICs as your hardware | +| | supports. | ++--------------------+------------------------------------------------------+ + +=============================== +Help with Hardware Requirements +=============================== + +Calculate hardware requirements: + +For information on compatible hardware types available for use, please see *Reference: 11*. + +When choosing the hardware on which you will deploy your OpenStack +environment, you should think about: + +- CPU -- Consider the number of virtual machines that you plan to deploy in your cloud environment and the CPU per virtual machine. + +- Memory -- Depends on the amount of RAM assigned per virtual machine and the controller node. + +- Storage -- Depends on the local drive space per virtual machine, remote volumes that can be attached to a virtual machine, and object storage. + +- Networking -- Depends on the Choose Network Topology, the network bandwidth per virtual machine, and network storage. + +================================================ +Top of the rack (TOR) Configuration requirements +================================================ + +The switching infrastructure provides connectivity for the OPNFV +infrastructure operations, tenant networks (East/West) and provider +connectivity (North/South); it also provides needed connectivity for +the Storage Area Network (SAN). +To avoid traffic congestion, it is strongly suggested that three +physically separated networks are used, that is: 1 physical network +for administration and control, one physical network for tenant private +and public networks, and one physical network for SAN. +The switching connectivity can (but does not need to) be fully redundant, +in such case it comprises a redundant 10GE switch pair for each of the +three physically separated networks. + +The physical TOR switches are **not** automatically configured from +the Fuel OPNFV reference platform. All the networks involved in the OPNFV +infrastructure as well as the provider networks and the private tenant +VLANs needs to be manually configured. + +Manual configuration of the Colorado hardware platform should +be carried out according to the OPNFV Pharos specification: + + +========================================== +OPNFV Software installation and deployment +========================================== + +This section describes the installation of the OPNFV installation +server (Fuel master) as well as the deployment of the full OPNFV +reference platform stack across a server cluster. + +Install Fuel master +=================== + +#. Mount the Colorado Fuel ISO file/media as a boot device to the jump host server. + +#. Reboot the jump host to establish the Fuel server. + + - The system now boots from the ISO image. + + - Select "Fuel Install (Static IP)" (See figure below) + + - Press [Enter]. + + .. figure:: img/grub-1.png + +#. Wait until the Fuel setup screen is shown (Note: This can take up to 30 minutes). + +#. In the "Fuel User" section - Confirm/change the default password (See figure below) + + - Enter "admin" in the Fuel password input + + - Enter "admin" in the Confirm password input + + - Select "Check" and press [Enter] + + .. figure:: img/fuelmenu1.png + +#. In the "Network Setup" section - Configure DHCP/Static IP information for your FUEL node - For example, ETH0 is 10.20.0.2/24 for FUEL booting and ETH1 is DHCP in your corporate/lab network (see figure below). + + - Configure eth1 or other network interfaces here as well (if you have them present on your FUEL server). + + .. figure:: img/fuelmenu2.png + +#. In the "PXE Setup" section (see figure below) - Change the following fields to appropriate values (example below): + + - DHCP Pool Start 10.20.0.3 + + - DHCP Pool End 10.20.0.254 + + - DHCP Pool Gateway 10.20.0.2 (IP address of Fuel node) + + .. figure:: img/fuelmenu3.png + +#. In the "DNS & Hostname" section (see figure below) - Change the following fields to appropriate values: + + - Hostname + + - Domain + + - Search Domain + + - External DNS + + - Hostname to test DNS + + - Select and press [Enter] + + .. figure:: img/fuelmenu4.png + + +#. OPTION TO ENABLE PROXY SUPPORT - In the "Bootstrap Image" section (see figure below), edit the following fields to define a proxy. (**NOTE:** cannot be used in tandem with local repository support) + + - Navigate to "HTTP proxy" and enter your http proxy address + + - Select and press [Enter] + + .. figure:: img/fuelmenu5.png + +#. In the "Time Sync" section (see figure below) - Change the following fields to appropriate values: + + - NTP Server 1 + + - NTP Server 2 + + - NTP Server 3 + + .. figure:: img/fuelmenu6.png + +#. Start the installation. + + - Select Quit Setup and press Save and Quit. + + - The installation will now start, wait until the login screen is shown. + +Boot the Node Servers +===================== + +After the Fuel Master node has rebooted from the above steps and is at +the login prompt, you should boot the Node Servers (Your +Compute/Control/Storage blades, nested or real) with a PXE booting +scheme so that the FUEL Master can pick them up for control. + +#. Enable PXE booting + + - For every controller and compute server: enable PXE Booting as the first boot device in the BIOS boot order menu, and hard disk as the second boot device in the same menu. + +#. Reboot all the control and compute blades. + +#. Wait for the availability of nodes showing up in the Fuel GUI. + + - Connect to the FUEL UI via the URL provided in the Console (default: https://10.20.0.2:8443) + + - Wait until all nodes are displayed in top right corner of the Fuel GUI: Total nodes and Unallocated nodes (see figure below). + + .. figure:: img/nodes.png + +Install additional Plugins/Features on the FUEL node +==================================================== + +#. SSH to your FUEL node (e.g. root@10.20.0.2 pwd: r00tme) + +#. Select wanted plugins/features from the /opt/opnfv/ directory. + +#. Install the wanted plugin with the command + + .. code-block:: bash + + $ fuel plugins --install /opt/opnfv/-..rpm + + Expected output (see figure below): + + .. code-block:: bash + + Plugin ....... was successfully installed. + + .. figure:: img/plugin_install.png + +Create an OpenStack Environment +=============================== + +#. Connect to Fuel WEB UI with a browser (default: https://10.20.0.2:8443) (login: admin/admin) + +#. Create and name a new OpenStack environment, to be installed. + + .. figure:: img/newenv.png + +#. Select "" and press + +#. Select "compute virtulization method". + + - Select "QEMU-KVM as hypervisor" and press + +#. Select "network mode". + + - Select "Neutron with ML2 plugin" + + - Select "Neutron with tunneling segmentation" (Required when using the ODL or ONOS plugins) + + - Press + +#. Select "Storage Back-ends". + + - Select "Ceph for block storage" and press + +#. Select "additional services" you wish to install. + + - Check option "Install Ceilometer and Aodh" and press + +#. Create the new environment. + + - Click Button + +Configure the network environment +================================= + +#. Open the environment you previously created. + +#. Open the networks tab and select the "default" Node Networks group to on the left pane (see figure below). + + .. figure:: img/network.png + +#. Update the Public network configuration and change the following fields to appropriate values: + + - CIDR to + + - IP Range Start to + + - IP Range End to + + - Gateway to + + - Check . + + - Set appropriate VLAN id. + +#. Update the Storage Network Configuration + + - Set CIDR to appropriate value (default 192.168.1.0/24) + + - Set IP Range Start to appropriate value (default 192.168.1.1) + + - Set IP Range End to appropriate value (default 192.168.1.254) + + - Set vlan to appropriate value (default 102) + +#. Update the Management network configuration. + + - Set CIDR to appropriate value (default 192.168.0.0/24) + + - Set IP Range Start to appropriate value (default 192.168.0.1) + + - Set IP Range End to appropriate value (default 192.168.0.254) + + - Check . + + - Set appropriate VLAN id. (default 101) + +#. Update the Private Network Information + + - Set CIDR to appropriate value (default 192.168.2.0/24 + + - Set IP Range Start to appropriate value (default 192.168.2.1) + + - Set IP Range End to appropriate value (default 192.168.2.254) + + - Check . + + - Set appropriate VLAN tag (default 103) + +#. Select the "Neutron L3" Node Networks group on the left pane. + + .. figure:: img/neutronl3.png + +#. Update the Floating Network configuration. + + - Set the Floating IP range start (default 172.16.0.130) + + - Set the Floating IP range end (default 172.16.0.254) + + - Set the Floating network name (default admin_floating_net) + +#. Update the Internal Network configuration. + + - Set Internal network CIDR to an appropriate value (default 192.168.111.0/24) + + - Set Internal network gateway to an appropriate value + + - Set the Internal network name (default admin_internal_net) + +#. Update the Guest OS DNS servers. + + - Set Guest OS DNS Server values appropriately + +#. Save Settings. + +#. Select the "Other" Node Networks group on the left pane (see figure below). + + .. figure:: img/other.png + +#. Update the Public network assignment. + + - Check the box for "Assign public network to all nodes" (Required by OpenDaylight) + +#. Update Host OS DNS Servers. + + - Provide the DNS server settings + +#. Update Host OS NTP Servers. + + - Provide the NTP server settings + +Select Hypervisor type +====================== + +#. In the FUEL UI of your Environment, click the "Settings" Tab + +#. Select "Compute" on the left side pane (see figure below) + + - Check the KVM box and press "Save settings" + + .. figure:: img/compute.png + +Enable Plugins +============== + +#. In the FUEL UI of your Environment, click the "Settings" Tab + +#. Select Other on the left side pane (see figure below) + + - Enable and configure the plugins of your choice + + .. figure:: img/plugins.png + +Allocate nodes to environment and assign functional roles +========================================================= + +#. Click on the "Nodes" Tab in the FUEL WEB UI (see figure below). + + .. figure:: img/addnodes.png + +#. Assign roles (see figure below). + + - Click on the <+Add Nodes> button + + - Check , and optionally an SDN Controller role (OpenDaylight controller/ONOS) in the "Assign Roles" Section. + + - Check one node which you want to act as a Controller from the bottom half of the screen + + - Click . + + - Click on the <+Add Nodes> button + + - Check the and roles. + + - Check the two next nodes you want to act as Controllers from the bottom half of the screen + + - Click + + - Click on <+Add Nodes> button + + - Check the and roles. + + - Check the Nodes you want to act as Computes from the bottom half of the screen + + - Click . + + .. figure:: img/computelist.png + +#. Configure interfaces (see figure below). + + - Check Select to select all allocated nodes + + - Click + + - Assign interfaces (bonded) for mgmt-, admin-, private-, public- and storage networks + + - Click + + .. figure:: img/interfaceconf.png + +OPTIONAL - Set Local Mirror Repos +================================= + +The following steps must be executed if you are in an environment with +no connection to the Internet. The Fuel server delivers a local repo +that can be used for installation / deployment of openstack. + +#. In the Fuel UI of your Environment, click the Settings Tab and select General from the left pane. + + - Replace the URI values for the "Name" values outlined below: + + - "ubuntu" URI="deb http://:8080/mirrors/ubuntu/ trusty main universe multiverse" + + - "ubuntu-security" URI="deb http://:8080/mirrors/ubuntu/ trusty-security main universe multiverse" + + - "ubuntu-updates" URI="deb http://:8080/mirrors/ubuntu/ trusty-updates main universe multiverse" + + - "mos" URI="deb http://::8080/mitaka-9.0/ubuntu/x86_64 mos9.0 main restricted" + + - "Auxiliary" URI="deb http://:8080/mitaka-9.0/ubuntu/auxiliary auxiliary main restricted" + + - Click at the bottom to Save your changes + +Target specific configuration +============================= + +#. Set up targets for provisioning with non-default "Offloading Modes" + + Some target nodes may require additional configuration after they are + PXE booted (bootstrapped); the most frequent changes are in defaults + for ethernet devices' "Offloading Modes" settings (e.g. some targets' + ethernet drivers may strip VLAN traffic by default). + + If your target ethernet drivers have wrong "Offloading Modes" defaults, + in "Configure interfaces" page (described above), expand affected + interface's "Offloading Modes" and [un]check the relevant settings + (see figure below): + + .. figure:: img/offloadingmodes.png + +#. Set up targets for "Verify Networks" with non-default "Offloading Modes" + + **NOTE**: Check *Reference 15* for an updated and comprehensive list of + known issues and/or limitations, including "Offloading Modes" not being + applied during "Verify Networks" step. + + Setting custom "Offloading Modes" in Fuel GUI will only apply those settings + during provisiong and **not** during "Verify Networks", so if your targets + need this change, you have to apply "Offloading Modes" settings by hand + to bootstrapped nodes. + + **E.g.**: Our driver has "rx-vlan-filter" default "on" (expected "off") on + the Openstack interface(s) "eth1", preventing VLAN traffic from passing + during "Verify Networks". + + - From Fuel master console identify target nodes admin IPs (see figure below): + + .. code-block:: bash + + $ fuel nodes + + .. figure:: img/fuelconsole1.png + + - SSH into each of the target nodes and disable "rx-vlan-filter" on the + affected physical interface(s) allocated for OpenStack traffic (eth1): + + .. code-block:: bash + + $ ssh root@10.20.0.6 ethtool -K eth1 rx-vlan-filter off + + - Repeat the step above for all affected nodes/interfaces in the POD. + +Verify Networks +=============== + +It is important that the Verify Networks action is performed as it will verify +that communicate works for the networks you have setup, as well as check that +packages needed for a successful deployment can be fetched. + +#. From the FUEL UI in your Environment, Select the Networks Tab and select "Connectivity check" on the left pane (see figure below) + + - Select + + - Continue to fix your topology (physical switch, etc) until the "Verification Succeeded" and "Your network is configured correctly" message is shown + + .. figure:: img/verifynet.png + +Deploy Your Environment +======================= + +#. Deploy the environment. + + - In the Fuel GUI, click on the "Dashboard" Tab. + + - Click on in the "Ready to Deploy?" section + + - Examine any information notice that pops up and click + + Wait for your deployment to complete, you can view the "Dashboard" + Tab to see the progress and status of your deployment. + +========================= +Installation health-check +========================= + +#. Perform system health-check (see figure below) + + - Click the "Health Check" tab inside your Environment in the FUEL Web UI + + - Check