From a98bf1747db2894394da929d07bde78a1ec19015 Mon Sep 17 00:00:00 2001 From: Szilard Cserey Date: Tue, 18 Aug 2015 19:47:50 +0200 Subject: [PATCH] Autodeployer support for ODL Plugin installation + Fuel 6.1 - Opendaylight plugin installation - Adapting Autodeployer to Fuel 6.1 - restarting blades that couldn't be discovered Fuel in time BGS-87 Autodeployment restarts blade if that has not been discovered by Fuel BGS-90 Fuel 6.1 and Opendaylight Fuel plugin install support for Autodeployer Change-Id: I83aab3f8caf368a70fd3f2b67c7ba1b6191993c6 Signed-off-by: Szilard Cserey --- fuel/ci/README | 67 +- fuel/deploy/README.txt | 165 ++-- fuel/deploy/__init__.py | 8 + fuel/deploy/baremetal/vms/fuel.xml | 87 --- fuel/deploy/cloud/configure_environment.py | 41 +- fuel/deploy/cloud/configure_network.py | 15 +- fuel/deploy/cloud/configure_nodes.py | 34 +- fuel/deploy/cloud/configure_settings.py | 12 + fuel/deploy/cloud/deploy.py | 201 ++--- fuel/deploy/cloud/deployment.py | 87 ++- fuel/deploy/common.py | 63 +- fuel/deploy/dea.py | 51 +- fuel/deploy/deploy.py | 146 +++- fuel/deploy/deploy_env.py | 215 +++++- fuel/deploy/dha.py | 21 +- fuel/deploy/dha_adapters/__init__.py | 8 + fuel/deploy/dha_adapters/hardware_adapter.py | 13 +- fuel/deploy/dha_adapters/hp_adapter.py | 13 +- fuel/deploy/dha_adapters/ipmi_adapter.py | 13 +- fuel/deploy/dha_adapters/libvirt_adapter.py | 17 +- fuel/deploy/environments/__init__.py | 9 +- fuel/deploy/environments/execution_environment.py | 17 +- fuel/deploy/environments/libvirt_environment.py | 30 +- fuel/deploy/environments/virtual_fuel.py | 11 + ...ion_environment.py => execution_environment.py} | 14 +- fuel/deploy/install_fuel_master.py | 60 +- fuel/deploy/reap.py | 21 +- fuel/deploy/ssh_client.py | 12 +- .../conf/ericsson_montreal_lab/ha/dea.yaml | 845 +++++++++++++++++++++ .../conf/ericsson_montreal_lab/ha/dha.yaml | 54 ++ .../conf/linux_foundation_lab/pod1/ha/dea.yaml | 842 ++++++++++++++++++++ .../conf/linux_foundation_lab/pod1/ha/dha.yaml | 8 +- .../conf/linux_foundation_lab/pod2/ha/dea.yaml | 842 ++++++++++++++++++++ .../conf/linux_foundation_lab/pod2/ha/dha.yaml | 49 ++ .../old_conf}/ericsson_montreal_lab/ha/dea.yaml | 42 +- .../old_conf}/ericsson_montreal_lab/ha/dha.yaml | 2 +- .../ericsson_montreal_lab/multinode/dea.yaml | 42 +- .../ericsson_montreal_lab/multinode/dha.yaml | 2 +- .../linux_foundation_lab/pod1/ha/dea.yaml | 42 +- .../old_conf/linux_foundation_lab/pod1/ha/dha.yaml | 49 ++ .../linux_foundation_lab/pod1/multinode/dea.yaml | 42 +- .../linux_foundation_lab/pod1/multinode/dha.yaml | 6 +- .../linux_foundation_lab/pod2/ha/dea.yaml | 38 +- .../linux_foundation_lab/pod2/ha/dha.yaml | 2 +- .../linux_foundation_lab/pod2/multinode/dea.yaml | 38 +- .../linux_foundation_lab/pod2/multinode/dha.yaml | 2 +- .../hardware_environment/vms/fuel.xml} | 2 - .../templates/virtual_environment/conf/ha/dea.yaml | 839 ++++++++++++++++++++ .../virtual_environment/conf/ha}/dha.yaml | 24 +- .../virtual_environment}/networks/fuel1.xml | 0 .../virtual_environment}/networks/fuel2.xml | 0 .../virtual_environment}/networks/fuel3.xml | 0 .../virtual_environment}/networks/fuel4.xml | 0 .../virtual_environment/old_conf}/ha/dea.yaml | 48 +- .../virtual_environment/old_conf}/ha/dha.yaml | 20 +- .../old_conf}/multinode/dea.yaml | 48 +- .../old_conf/multinode/dha.yaml | 44 ++ .../virtual_environment}/vms/compute.xml | 1 - .../virtual_environment}/vms/controller.xml | 4 +- .../virtual_environment}/vms/fuel.xml | 0 fuel/deploy/transplant_fuel_settings.py | 25 +- 61 files changed, 4825 insertions(+), 628 deletions(-) delete mode 100644 fuel/deploy/baremetal/vms/fuel.xml rename fuel/deploy/{setup_execution_environment.py => execution_environment.py} (67%) create mode 100644 fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dea.yaml create mode 100644 fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dha.yaml create mode 100644 fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dea.yaml rename fuel/deploy/{baremetal => templates/hardware_environment}/conf/linux_foundation_lab/pod1/ha/dha.yaml (89%) create mode 100644 fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dea.yaml create mode 100644 fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dha.yaml rename fuel/deploy/{baremetal/conf => templates/hardware_environment/old_conf}/ericsson_montreal_lab/ha/dea.yaml (98%) rename fuel/deploy/{baremetal/conf => templates/hardware_environment/old_conf}/ericsson_montreal_lab/ha/dha.yaml (93%) rename fuel/deploy/{baremetal/conf => templates/hardware_environment/old_conf}/ericsson_montreal_lab/multinode/dea.yaml (98%) rename fuel/deploy/{baremetal/conf => templates/hardware_environment/old_conf}/ericsson_montreal_lab/multinode/dha.yaml (93%) rename fuel/deploy/{baremetal/conf => templates/hardware_environment/old_conf}/linux_foundation_lab/pod1/ha/dea.yaml (98%) create mode 100644 fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dha.yaml rename fuel/deploy/{baremetal/conf => templates/hardware_environment/old_conf}/linux_foundation_lab/pod1/multinode/dea.yaml (98%) rename fuel/deploy/{baremetal/conf => templates/hardware_environment/old_conf}/linux_foundation_lab/pod1/multinode/dha.yaml (89%) rename fuel/deploy/{baremetal/conf => templates/hardware_environment/old_conf}/linux_foundation_lab/pod2/ha/dea.yaml (98%) rename fuel/deploy/{baremetal/conf => templates/hardware_environment/old_conf}/linux_foundation_lab/pod2/ha/dha.yaml (93%) rename fuel/deploy/{baremetal/conf => templates/hardware_environment/old_conf}/linux_foundation_lab/pod2/multinode/dea.yaml (98%) rename fuel/deploy/{baremetal/conf => templates/hardware_environment/old_conf}/linux_foundation_lab/pod2/multinode/dha.yaml (93%) rename fuel/deploy/{baremetal/vms/fuel_lf.xml => templates/hardware_environment/vms/fuel.xml} (96%) create mode 100644 fuel/deploy/templates/virtual_environment/conf/ha/dea.yaml rename fuel/deploy/{libvirt/conf/multinode => templates/virtual_environment/conf/ha}/dha.yaml (54%) rename fuel/deploy/{libvirt => templates/virtual_environment}/networks/fuel1.xml (100%) rename fuel/deploy/{libvirt => templates/virtual_environment}/networks/fuel2.xml (100%) rename fuel/deploy/{libvirt => templates/virtual_environment}/networks/fuel3.xml (100%) rename fuel/deploy/{libvirt => templates/virtual_environment}/networks/fuel4.xml (100%) rename fuel/deploy/{libvirt/conf => templates/virtual_environment/old_conf}/ha/dea.yaml (98%) rename fuel/deploy/{libvirt/conf => templates/virtual_environment/old_conf}/ha/dha.yaml (52%) rename fuel/deploy/{libvirt/conf => templates/virtual_environment/old_conf}/multinode/dea.yaml (98%) create mode 100644 fuel/deploy/templates/virtual_environment/old_conf/multinode/dha.yaml rename fuel/deploy/{libvirt => templates/virtual_environment}/vms/compute.xml (98%) rename fuel/deploy/{libvirt => templates/virtual_environment}/vms/controller.xml (96%) rename fuel/deploy/{libvirt => templates/virtual_environment}/vms/fuel.xml (100%) diff --git a/fuel/ci/README b/fuel/ci/README index 3525d4d..5ecaa7b 100644 --- a/fuel/ci/README +++ b/fuel/ci/README @@ -18,6 +18,69 @@ For more info on usage: ./build.sh -h ./deploy.sh -h -To be able to deploy on a certain metal environment there needs to be a Deplyment Environment Adaptor" executable with propper added to $PATH such that -deploy.sh can call it by $dea [options] as indicated by ./deploy -h. +sudo ./deploy.sh -h +python deploy.py -h + +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] + +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 + + + +* EXAMPLES: + +- Install Fuel Master and deploy OPNFV Cloud from scratch on Hardware Environment: + + sudo ./deploy.sh -iso ~/ISO/opnfv.iso -dea ~/CONF/hardware/dea.yaml -dha ~/CONF/hardware/dha.yaml -s /mnt/images -b pxebr -p ~/PLUGIN + + +- Install Fuel Master and deploy OPNFV Cloud from scratch on Virtual Environment: + + sudo ./deploy.sh -iso ~/ISO/opnfv.iso -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -s /mnt/images -p ~/PLUGIN + + +- Deploy OPNFV Cloud on an already active Environment where Fuel Master VM is running so no need to install Fuel again: + + sudo ./deploy.sh -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml + + => with plugin installation + sudo ./deploy.sh -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN + + => with cleanup after deployment is finished + sudo ./deploy.sh -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN -c + + => no healthcheck after deployment is completed + sudo ./deploy.sh -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN -nh + + +- Install Fuel Master only (and Node VMs when using virtual environment): + + => for virtual environment: + sudo ./deploy.sh -iso ~/ISO/opnfv.iso -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -s /mnt/images + + => for hardware environment: + sudo ./deploy.sh -iso ~/ISO/opnfv.iso -dea ~/CONF/hardware/dea.yaml -dha ~/CONF/hardware/dha.yaml -s /mnt/images -b pxebr + + +- Cleanup a running OPNFV environment: + + sudo ./deploy.sh -co -dha ~/CONF/virtual/dha.yaml \ No newline at end of file diff --git a/fuel/deploy/README.txt b/fuel/deploy/README.txt index 33baff1..f42e9ac 100644 --- a/fuel/deploy/README.txt +++ b/fuel/deploy/README.txt @@ -1,15 +1,16 @@ ======== PREREQUISITES ======== -the following applications and python modules are required to be installed: +the following dependencies and python modules are required to be installed: -- example for Ubuntu environment: +- for Ubuntu: -sudo apt-get install -y libvirt-bin qemu-kvm tightvncserver virt-manager -sshpass fuseiso genisoimage blackbox xterm python-pip -sudo restart libvirt-bin -sudo pip install pyyaml netaddr paramiko lxml scp +sudo apt-get install -y libvirt-bin qemu-kvm python-pip fuseiso mkisofs +sudo apt-get install -y python-dev libz-dev libxml2-dev libxslt-dev +sudo pip install pyyaml netaddr paramiko lxml scp pycrypto ecdsa +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 ======== @@ -24,86 +25,162 @@ 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: - => libvirt/conf/ha + * SR1 configuration files + + => templates/virtual_environment/conf/ha + dea.yaml + dha.yaml + + + * ARNO configuration files + + => templates/virtual_environment/old_conf/ha dea.yaml dha.yaml - => libvirt/conf/multinode + => templates/virtual_environment/old_conf/multinode dea.yaml dha.yaml -- If you wish to deploy OPNFV cloud environment on baremetal +- If you wish to deploy OPNFV cloud environment on hardware use as example the following configuration files: - => baremetal/conf/ericsson_montreal_lab/ha + * SR1 configuration files + + => templates/hardware_environment/conf/ericsson_montreal_lab/ha dea.yaml dha.yaml - => baremetal/conf/ericsson_montreal_lab/multinode + => templates/hardware_environment/conf/linux_foundation_lab/pod1/ha dea.yaml dha.yaml - => baremetal/conf/linux_foundation_lab/ha + => templates/hardware_environment/conf/linux_foundation_lab/pod2/ha dea.yaml dha.yaml - => baremetal/conf/linux_foundation_lab/multinode + + * ARNO configuration files + + => templates/hardware_environment/old_conf/ericsson_montreal_lab/ha dea.yaml dha.yaml + => templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode + dea.yaml + dha.yaml ---- Step.2 Run Autodeployment: + => templates/hardware_environment/old_conf/linux_foundation_lab/ha + dea.yaml + dha.yaml + + => templates/hardware_environment/old_conf/linux_foundation_lab/multinode + dea.yaml + dha.yaml -usage: python deploy.py [-h] [-nf] [-s [STORAGE_DIR]] [-b [PXE_BRIDGE]] - [iso_file] dea_file dha_file -positional arguments: - iso_file ISO File [default: OPNFV.iso] - dea_file Deployment Environment Adapter: dea.yaml - dha_file Deployment Hardware Adapter: 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] optional arguments: - -h, --help show this help message and exit - -nf Do not install Fuel Master (and Node VMs when using - libvirt) - -s [STORAGE_DIR] Storage Directory [default: images] - -b [PXE_BRIDGE] Linux Bridge for booting up the Fuel Master VM [default: - pxebr] + -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 -* WARNING: +* EXAMPLES: -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 +- Install Fuel Master and deploy OPNFV Cloud from scratch on Hardware Environment: -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 + sudo python deploy.py -iso ~/ISO/opnfv.iso -dea ~/CONF/hardware/dea.yaml -dha ~/CONF/hardware/dha.yaml -s /mnt/images -b pxebr -p ~/PLUGIN -IF optional argument 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 - is not required for Autodeployment in virtual environment, even if it is specified -it will not be used at all +- 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 -p ~/PLUGIN -* EXAMPLES: -- Install Fuel Master and deploy OPNFV Cloud from scratch on Baremetal Environment +- 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 + + => with plugin installation + sudo python deploy.py -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN + + => with cleanup after deployment is finished + sudo python deploy.py -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN -c + + => no healthcheck after deployment is completed + sudo python deploy.py -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN -nh + + +- 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 + + => 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 + + +- 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 -sudo python deploy.py ~/ISO/opnfv.iso ~/CONF/baremetal/dea.yaml ~/CONF/baremetal/dha.yaml -s /mnt/images -b pxebr +=> 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 -- Install Fuel Master and deploy OPNFV Cloud from scratch on Virtual Environment +=> If optional argument -p FUEL_PLUGINS_DIR is not specified, no plugins will be installed in Fuel -sudo python deploy.py ~/ISO/opnfv.iso ~/CONF/virtual/dea.yaml ~/CONF/virtual/dha.yaml -s /mnt/images +--- Networking considerations --- +For Virtual Environment: -- Deploy OPNFV Cloud on an already active Environment where Fuel Master VM is running - so no need to install Fuel again +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 -sudo python deploy.py -nf ~/CONF/baremetal/dea.yaml ~/CONF/baremetal/dha.yaml +Add these lines to /etc/sysctl.conf -sudo python deploy.py -nf ~/CONF/virtual/dea.yaml ~/CONF/virtual/dha.yaml +cat >> /etc/sysctl.conf < - fuel - 8290304 - 8290304 - 2 - - /machine - - - hvm - - - - - - - - - - - SandyBridge - - - - - - - destroy - restart - restart - - - - - - /usr/bin/kvm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fuel/deploy/cloud/configure_environment.py b/fuel/deploy/cloud/configure_environment.py index d0037d7..2d68c1b 100644 --- a/fuel/deploy/cloud/configure_environment.py +++ b/fuel/deploy/cloud/configure_environment.py @@ -1,6 +1,13 @@ +############################################################################### +# 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 common -import os -import shutil from configure_settings import ConfigureSettings from configure_network import ConfigureNetwork @@ -14,6 +21,9 @@ exec_cmd = common.exec_cmd parse = common.parse err = common.err log = common.log +delete = common.delete +create_dir_if_not_exists = common.create_dir_if_not_exists + class ConfigureEnvironment(object): @@ -21,7 +31,6 @@ class ConfigureEnvironment(object): self.env_id = None self.dea = dea self.yaml_config_dir = yaml_config_dir - self.env_name = self.dea.get_property('environment_name') self.release_id = release_id self.node_id_roles_dict = node_id_roles_dict self.required_networks = [] @@ -36,21 +45,20 @@ class ConfigureEnvironment(object): def configure_environment(self): log('Configure environment') - if os.path.exists(self.yaml_config_dir): - log('Deleting existing config directory %s' % self.yaml_config_dir) - shutil.rmtree(self.yaml_config_dir) - log('Creating new config directory %s' % self.yaml_config_dir) - os.makedirs(self.yaml_config_dir) - - mode = self.dea.get_property('environment_mode') + delete(self.yaml_config_dir) + create_dir_if_not_exists(self.yaml_config_dir) + env_name = self.dea.get_env_name() + env_mode = self.dea.get_env_mode() + env_net_segment_type = self.dea.get_env_net_segment_type() log('Creating environment %s release %s, mode %s, network-mode neutron' - ', net-segment-type vlan' % (self.env_name, self.release_id, mode)) + ', net-segment-type %s' + % (env_name, self.release_id, env_mode, env_net_segment_type)) exec_cmd('fuel env create --name %s --release %s --mode %s ' - '--network-mode neutron --net-segment-type vlan' - % (self.env_name, self.release_id, mode)) + '--network-mode neutron --net-segment-type %s' + % (env_name, self.release_id, env_mode, env_net_segment_type)) - if not self.env_exists(self.env_name): - err('Failed to create environment %s' % self.env_name) + if not self.env_exists(env_name): + err('Failed to create environment %s' % env_name) self.config_settings() self.config_network() self.config_nodes() @@ -68,6 +76,3 @@ class ConfigureEnvironment(object): nodes = ConfigureNodes(self.yaml_config_dir, self.env_id, self.node_id_roles_dict, self.dea) nodes.config_nodes() - - - diff --git a/fuel/deploy/cloud/configure_network.py b/fuel/deploy/cloud/configure_network.py index 295eb90..0027894 100644 --- a/fuel/deploy/cloud/configure_network.py +++ b/fuel/deploy/cloud/configure_network.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 common import yaml import io @@ -11,6 +21,8 @@ parse = common.parse err = common.err check_file_exists = common.check_file_exists log = common.log +backup = common.backup + class ConfigureNetwork(object): @@ -41,6 +53,7 @@ class ConfigureNetwork(object): network_yaml = ('%s/network_%s.yaml' % (self.yaml_config_dir, self.env_id)) check_file_exists(network_yaml) + backup(network_yaml) network_config = self.dea.get_property('network') @@ -58,4 +71,4 @@ class ConfigureNetwork(object): network.update(net_id[network['name']]) with io.open(network_yaml, 'w') as stream: - yaml.dump(network_config, stream, default_flow_style=False) \ No newline at end of file + yaml.dump(network_config, stream, default_flow_style=False) diff --git a/fuel/deploy/cloud/configure_nodes.py b/fuel/deploy/cloud/configure_nodes.py index a2f2a10..06199d2 100644 --- a/fuel/deploy/cloud/configure_nodes.py +++ b/fuel/deploy/cloud/configure_nodes.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 common import yaml import io @@ -12,6 +22,7 @@ parse = common.parse err = common.err check_file_exists = common.check_file_exists log = common.log +backup = common.backup class ConfigureNodes(object): @@ -39,18 +50,18 @@ class ConfigureNodes(object): def modify_node_network_schemes(self, node_id, roles_blade): log('Modify network transformations for node %s' % node_id) type = self.dea.get_node_property(roles_blade[1], 'transformations') - transformations = self.dea.get_transformations(type) - - for node_file in glob.glob('%s/deployment_%s/*_%s.yaml' - % (self.yaml_config_dir, self.env_id, - node_id)): + transformations = self.dea.get_property(type) + deployment_dir = '%s/deployment_%s' % ( + self.yaml_config_dir, self.env_id) + backup(deployment_dir) + for node_file in glob.glob(deployment_dir + '/*_%s.yaml' % node_id): with io.open(node_file) as stream: - node = yaml.load(stream) + node = yaml.load(stream) - node['network_scheme']['transformations'] = transformations + node['network_scheme'].update(transformations) with io.open(node_file, 'w') as stream: - yaml.dump(node, stream, default_flow_style=False) + yaml.dump(node, stream, default_flow_style=False) def download_deployment_config(self): log('Download deployment config for environment %s' % self.env_id) @@ -77,6 +88,7 @@ class ConfigureNodes(object): interface_yaml = ('%s/node_%s/interfaces.yaml' % (self.yaml_config_dir, node_id)) check_file_exists(interface_yaml) + backup(interface_yaml) with io.open(interface_yaml) as stream: interfaces = yaml.load(stream) @@ -84,10 +96,10 @@ class ConfigureNodes(object): net_name_id = {} for interface in interfaces: for network in interface['assigned_networks']: - net_name_id[network['name']] = network['id'] + net_name_id[network['name']] = network['id'] type = self.dea.get_node_property(roles_blade[1], 'interfaces') - interface_config = self.dea.get_interfaces(type) + interface_config = self.dea.get_property(type) for interface in interfaces: interface['assigned_networks'] = [] @@ -99,4 +111,4 @@ class ConfigureNodes(object): interface['assigned_networks'].append(net) with io.open(interface_yaml, 'w') as stream: - yaml.dump(interfaces, stream, default_flow_style=False) \ No newline at end of file + yaml.dump(interfaces, stream, default_flow_style=False) diff --git a/fuel/deploy/cloud/configure_settings.py b/fuel/deploy/cloud/configure_settings.py index ac0afdc..fa918fd 100644 --- a/fuel/deploy/cloud/configure_settings.py +++ b/fuel/deploy/cloud/configure_settings.py @@ -1,3 +1,12 @@ +############################################################################### +# 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 common import yaml import io @@ -11,6 +20,8 @@ parse = common.parse err = common.err check_file_exists = common.check_file_exists log = common.log +backup = common.backup + class ConfigureSettings(object): @@ -40,6 +51,7 @@ class ConfigureSettings(object): settings_yaml = ('%s/settings_%s.yaml' % (self.yaml_config_dir, self.env_id)) check_file_exists(settings_yaml) + backup(settings_yaml) settings = self.dea.get_property('settings') diff --git a/fuel/deploy/cloud/deploy.py b/fuel/deploy/cloud/deploy.py index c423834..1534f0b 100644 --- a/fuel/deploy/cloud/deploy.py +++ b/fuel/deploy/cloud/deploy.py @@ -1,7 +1,17 @@ -import time +############################################################################### +# 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 yaml import io -import sys +import glob import common from dea import DeploymentEnvironmentAdapter @@ -22,173 +32,94 @@ log = common.log commafy = common.commafy ArgParser = common.ArgParser + class Deploy(object): - def __init__(self, dea_file, macs_file): + def __init__(self, dea_file, blade_node_file, plugins_dir, + no_health_check): self.dea = DeploymentEnvironmentAdapter(dea_file) - self.macs_file = macs_file + self.blade_node_file = blade_node_file + self.plugins_dir = plugins_dir + self.no_health_check = no_health_check self.macs_per_blade = {} self.blades = self.dea.get_node_ids() - self.node_ids_dict = {} - self.node_id_roles_dict = {} - self.supported_release = None + self.blade_node_dict = {} + self.node_roles_dict = {} self.env_id = None - self.wanted_release = self.dea.get_wanted_release() - - 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']]) - exec_cmd('fuel env --env %s --delete' % env[E['id']]) - all_env_erased = False - for i in range(WAIT_LOOP): - env_list = parse(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']]) - exec_cmd('fuel node --node-id %s --delete-from-db' - % node[N['id']]) - exec_cmd('cobbler system remove --name node-%s' - % node[N['id']], False) - - def check_previous_installation(self): - log('Check previous installation') - env_list = parse(exec_cmd('fuel env list')) - if env_list: - self.cleanup_fuel_environments(env_list) - node_list = parse(exec_cmd('fuel node list')) - if node_list: - self.cleanup_fuel_nodes(node_list) - - def check_supported_release(self): - log('Check supported release: %s' % self.wanted_release) - release_list = parse(exec_cmd('fuel release -l')) - for release in release_list: - if release[R['name']] == self.wanted_release: - self.supported_release = release - break - if not self.supported_release: - err('This Fuel does not contain the following release: %s' - % self.wanted_release) - - def check_prerequisites(self): - log('Check prerequisites') - self.check_supported_release() - self.check_previous_installation() - - def get_mac_addresses(self): - with io.open(self.macs_file, 'r') as stream: - self.macs_per_blade = yaml.load(stream) - - 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.node_ids_dict.iteritems(): - if not node_id: - return False - return True - - def not_discovered_blades_summary(self): - summary = '' - for blade, node_id in self.node_ids_dict.iteritems(): - if not node_id: - summary += '\n[blade %s]' % blade - return summary - - def node_discovery(self, node_list, discovered_macs): - for node in node_list: - if (node[N['status']] == 'discover' and - node[N['online']] == 'True' 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.node_ids_dict[blade] = node[N['id']] - - def discovery_waiting_loop(self, discovered_macs): - WAIT_LOOP = 320 - SLEEP_TIME = 10 - all_discovered = False - for i in range(WAIT_LOOP): - node_list = parse(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 wait_for_discovered_blades(self): - log('Wait for discovered blades') - discovered_macs = [] - for blade in self.blades: - self.node_ids_dict[blade] = None - 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()) + self.wanted_release = self.dea.get_property('wanted_release') + + def get_blade_node_mapping(self): + with io.open(self.blade_node_file, 'r') as stream: + self.blade_node_dict = yaml.load(stream) def assign_roles_to_cluster_node_ids(self): - self.node_id_roles_dict = {} - for blade, node_id in self.node_ids_dict.iteritems(): + self.node_roles_dict = {} + for blade, node in self.blade_node_dict.iteritems(): roles = commafy(self.dea.get_node_role(blade)) - self.node_id_roles_dict[node_id] = (roles, blade) + self.node_roles_dict[node] = (roles, blade) def configure_environment(self): + release_list = parse(exec_cmd('fuel release -l')) + for release in release_list: + if release[R['name']] == self.wanted_release: + break config_env = ConfigureEnvironment(self.dea, YAML_CONF_DIR, - self.supported_release[R['id']], - self.node_id_roles_dict) + release[R['id']], + self.node_roles_dict) config_env.configure_environment() self.env_id = config_env.env_id def deploy_cloud(self): dep = Deployment(self.dea, YAML_CONF_DIR, self.env_id, - self.node_id_roles_dict) + self.node_roles_dict, self.no_health_check) dep.deploy() + def install_plugins(self): + log('Installing Fuel Plugins') + if self.plugins_dir and os.path.isdir(self.plugins_dir): + for f in glob.glob('%s/*.rpm' % self.plugins_dir): + log('Found plugin %s, installing ...' % f) + r, c = exec_cmd('fuel plugins --install %s' % f, False) + if c > 0 and 'does not update installed package' not in r: + err('Installation of Fuel Plugin %s failed' % f) + def deploy(self): - self.get_mac_addresses() - self.check_prerequisites() - self.wait_for_discovered_blades() + + self.install_plugins() + + self.get_blade_node_mapping() + self.assign_roles_to_cluster_node_ids() + self.configure_environment() + self.deploy_cloud() + def parse_arguments(): parser = ArgParser(prog='python %s' % __file__) + parser.add_argument('-nh', dest='no_health_check', action='store_true', + default=False, + help='Don\'t run health check after deployment') parser.add_argument('dea_file', action='store', help='Deployment Environment Adapter: dea.yaml') - parser.add_argument('macs_file', action='store', - help='Blade MAC addresses: macs.yaml') + parser.add_argument('blade_node_file', action='store', + help='Blade Node mapping: blade_node.yaml') + parser.add_argument('plugins_dir', nargs='?', action='store', + help='Plugins directory') args = parser.parse_args() check_file_exists(args.dea_file) - check_file_exists(args.macs_file) - return (args.dea_file, args.macs_file) + check_file_exists(args.blade_node_file) + return (args.dea_file, args.blade_node_file, args.plugins_dir, + args.no_health_check) + def main(): - dea_file, macs_file = parse_arguments() + dea_file, blade_node_file, plugins_dir, no_health_check = parse_arguments() - deploy = Deploy(dea_file, macs_file) + deploy = Deploy(dea_file, blade_node_file, plugins_dir, no_health_check) deploy.deploy() if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/fuel/deploy/cloud/deployment.py b/fuel/deploy/cloud/deployment.py index 0054c5b..43bd4b6 100644 --- a/fuel/deploy/cloud/deployment.py +++ b/fuel/deploy/cloud/deployment.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 common import os import shutil @@ -15,20 +25,26 @@ run_proc = common.run_proc parse = common.parse err = common.err log = common.log +literal_unicode = common.literal_unicode +literal_unicode_representer = common.literal_unicode_representer +yaml.add_representer(literal_unicode, literal_unicode_representer) +backup = common.backup class Deployment(object): - def __init__(self, dea, yaml_config_dir, env_id, node_id_roles_dict): + def __init__(self, dea, yaml_config_dir, env_id, node_id_roles_dict, + no_health_check): self.dea = dea self.yaml_config_dir = yaml_config_dir self.env_id = env_id self.node_id_roles_dict = node_id_roles_dict + self.no_health_check = no_health_check def download_deployment_info(self): log('Download deployment info for environment %s' % self.env_id) - deployment_dir = '%s/deployment_%s' \ - % (self.yaml_config_dir, self.env_id) + deployment_dir = ('%s/deployment_%s' + % (self.yaml_config_dir, self.env_id)) if os.path.exists(deployment_dir): shutil.rmtree(deployment_dir) exec_cmd('fuel deployment --env %s --download --dir %s' @@ -39,21 +55,54 @@ class Deployment(object): exec_cmd('fuel --env %s deployment --upload --dir %s' % (self.env_id, self.yaml_config_dir)) + def __update_opnfv_dict(self, opnfv_dict, key, node_type, val): + if val: + if key not in opnfv_dict: + opnfv_dict.update({key: {}}) + opnfv_dict[key].update({node_type: val}) + def config_opnfv(self): log('Configure OPNFV settings on environment %s' % self.env_id) - opnfv_compute = self.dea.get_opnfv('compute') - opnfv_controller = self.dea.get_opnfv('controller') self.download_deployment_info() + + opnfv = {'opnfv': {}} + dns_list = self.dea.get_dns_list() + host_list = self.dea.get_hosts() + + ntp_list_for_controller = '' + for ntp in self.dea.get_ntp_list(): + ntp_list_for_controller += 'server %s\n' % ntp + + ntp_list_for_compute = '' + for controller_file in glob.glob( + '%s/deployment_%s/*controller*.yaml' + % (self.yaml_config_dir, self.env_id)): + with io.open(controller_file) as stream: + controller = yaml.load(stream) + ntp_list_for_compute += 'server %s\n' % controller['fqdn'] + + self.__update_opnfv_dict( + opnfv['opnfv'], 'dns', 'controller', dns_list[:]) + self.__update_opnfv_dict( + opnfv['opnfv'], 'dns', 'compute', dns_list[:]) + self.__update_opnfv_dict( + opnfv['opnfv'], 'ntp', 'controller', + literal_unicode(ntp_list_for_controller)) + self.__update_opnfv_dict( + opnfv['opnfv'], 'ntp', 'compute', + literal_unicode(ntp_list_for_compute)) + + if host_list: + opnfv['opnfv'].update({'hosts': host_list}) + for node_file in glob.glob('%s/deployment_%s/*.yaml' % (self.yaml_config_dir, self.env_id)): - with io.open(node_file) as stream: - node = yaml.load(stream) - if node['role'] == 'compute': - node.update(opnfv_compute) - else: - node.update(opnfv_controller) - with io.open(node_file, 'w') as stream: - yaml.dump(node, stream, default_flow_style=False) + with io.open(node_file) as stream: + node = yaml.load(stream) + node.update(opnfv) + with io.open(node_file, 'w') as stream: + yaml.dump(node, stream, default_flow_style=False) + self.upload_deployment_info() def run_deploy(self): @@ -103,11 +152,15 @@ class Deployment(object): def health_check(self): log('Now running sanity and smoke health checks') - log(exec_cmd('fuel health --env %s --check sanity,smoke --force' - % self.env_id)) - + r = exec_cmd('fuel health --env %s --check sanity,smoke --force' + % self.env_id) + log(r) + if 'failure' in r: + err('Healthcheck failed!') + def deploy(self): self.config_opnfv() self.run_deploy() self.verify_node_status() - self.health_check() \ No newline at end of file + if not self.no_health_check: + self.health_check() diff --git a/fuel/deploy/common.py b/fuel/deploy/common.py index dc12637..3472e89 100644 --- a/fuel/deploy/common.py +++ b/fuel/deploy/common.py @@ -1,8 +1,19 @@ +############################################################################### +# 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 subprocess import sys import os import logging import argparse +import shutil +import errno N = {'id': 0, 'status': 1, 'name': 2, 'cluster': 3, 'ip': 4, 'mac': 5, 'roles': 6, 'pending_roles': 7, 'online': 8} @@ -21,6 +32,7 @@ out_handler = logging.FileHandler('autodeploy.log', mode='w') out_handler.setFormatter(formatter) LOG.addHandler(out_handler) + def exec_cmd(cmd, check=True): process = subprocess.Popen(cmd, stdout=subprocess.PIPE, @@ -35,6 +47,7 @@ def exec_cmd(cmd, check=True): return response return response, return_code + def run_proc(cmd): process = subprocess.Popen(cmd, stdout=subprocess.PIPE, @@ -42,14 +55,16 @@ def run_proc(cmd): shell=True) return process + 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) + parsed = [e.strip() for e in l.split('|')] + parsed_list.append(parsed) return parsed_list + def clean(lines): parsed_list = [] parsed = [] @@ -62,42 +77,80 @@ def clean(lines): parsed_list.append(parsed) return parsed if len(parsed_list) == 1 else parsed_list + def err(message): LOG.error('%s\n' % message) sys.exit(1) + +def warn(message): + LOG.warning('%s\n' % message) + + def check_file_exists(file_path): if not os.path.isfile(file_path): err('ERROR: File %s not found\n' % file_path) + def check_dir_exists(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(file) + 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 delete_file(file): - if os.path.exists(file): - os.remove(file) def check_if_root(): r = exec_cmd('whoami') if r != 'root': 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) + +class literal_unicode(unicode): + pass + + +def literal_unicode_representer(dumper, data): + return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|') + + +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/fuel/deploy/dea.py b/fuel/deploy/dea.py index 61ebea3..9c1ebfc 100644 --- a/fuel/deploy/dea.py +++ b/fuel/deploy/dea.py @@ -1,8 +1,20 @@ +############################################################################### +# 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) @@ -19,6 +31,15 @@ class DeploymentEnvironmentAdapter(object): 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_mode(self): + return self.get_property('environment')['mode'] + + 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'] @@ -48,8 +69,6 @@ class DeploymentEnvironmentAdapter(object): return node[property_name] def get_node_role(self, node_id): - role_list = [] - return self.get_node_property(node_id, 'role') def get_node_ids(self): @@ -69,14 +88,20 @@ class DeploymentEnvironmentAdapter(object): def get_network_names(self): return self.network_names - def get_interfaces(self, type): - return self.dea_struct['interfaces'][type] - - def get_transformations(self, type): - return self.dea_struct['transformations'][type] - - def get_opnfv(self, role): - return {'opnfv': self.dea_struct['opnfv'][role]} - - def get_wanted_release(self): - return self.dea_struct['wanted_release'] \ No newline at end of file + 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_hosts(self): + opnfv = self.get_property('opnfv') + hosts_list = [] + for host in opnfv['hosts']: + if host['address'] and host['fqdn']: + hosts_list.append(host) + return hosts_list diff --git a/fuel/deploy/deploy.py b/fuel/deploy/deploy.py index 33c6f9f..304db66 100644 --- a/fuel/deploy/deploy.py +++ b/fuel/deploy/deploy.py @@ -1,34 +1,46 @@ +############################################################################### +# 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 shutil import io import re import sys import netaddr -import uuid import yaml from dea import DeploymentEnvironmentAdapter from dha import DeploymentHardwareAdapter from install_fuel_master import InstallFuelMaster from deploy_env import CloudDeploy -from setup_execution_environment import ExecutionEnvironment +from execution_environment import ExecutionEnvironment import common log = common.log exec_cmd = common.exec_cmd err = common.err +warn = common.warn check_file_exists = common.check_file_exists check_dir_exists = common.check_dir_exists create_dir_if_not_exists = common.create_dir_if_not_exists +delete = common.delete check_if_root = common.check_if_root ArgParser = common.ArgParser FUEL_VM = 'fuel' PATCH_DIR = 'fuel_patch' -WORK_DIR = 'deploy' +WORK_DIR = '~/deploy' CWD = os.getcwd() + class cd: + def __init__(self, new_path): self.new_path = os.path.expanduser(new_path) @@ -42,15 +54,22 @@ class cd: class AutoDeploy(object): - def __init__(self, without_fuel, storage_dir, pxe_bridge, iso_file, - dea_file, dha_file): - self.without_fuel = without_fuel + 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): + 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.dea = DeploymentEnvironmentAdapter(dea_file) + self.fuel_plugins_dir = fuel_plugins_dir + 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() @@ -101,7 +120,7 @@ class AutoDeploy(object): exec_cmd('find . | cpio -pd %s' % tmp_new_dir) with cd(tmp_new_dir): exec_cmd('fusermount -u %s' % tmp_orig_dir) - shutil.rmtree(tmp_orig_dir) + delete(tmp_orig_dir) exec_cmd('chmod -R 755 %s' % tmp_new_dir) def patch(self, tmp_new_dir, new_iso): @@ -111,7 +130,7 @@ class AutoDeploy(object): with cd(tmp_new_dir): exec_cmd('cat %s | patch -p0' % ks_path) - shutil.rmtree('.rr_moved') + delete('.rr_moved') isolinux = 'isolinux/isolinux.cfg' log('isolinux.cfg before: %s' % exec_cmd('grep netmask %s' % isolinux)) @@ -137,8 +156,10 @@ class AutoDeploy(object): f.write(data) def deploy_env(self): - dep = CloudDeploy(self.dha, self.fuel_conf['ip'], self.fuel_username, - self.fuel_password, self.dea_file, WORK_DIR) + dep = CloudDeploy(self.dea, self.dha, self.fuel_conf['ip'], + self.fuel_username, self.fuel_password, + self.dea_file, self.fuel_plugins_dir, WORK_DIR, + self.no_health_check) return dep.deploy() def setup_execution_environment(self): @@ -146,19 +167,36 @@ class AutoDeploy(object): 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-%s' % (CWD, str(uuid.uuid1())) - os.makedirs(self.tmp_dir) + self.tmp_dir = '%s/fueltmp' % CWD + delete(self.tmp_dir) + create_dir_if_not_exists(self.tmp_dir) def deploy(self): - check_if_root() self.collect_fuel_info() - if not self.without_fuel: + if not self.no_fuel: self.setup_execution_environment() self.create_tmp_dir() self.install_fuel_master() - shutil.rmtree(self.tmp_dir) - return self.deploy_env() + if not self.fuel_only: + return self.deploy_env() + return True + + 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 + return True def check_bridge(pxe_bridge, dha_path): with io.open(dha_path) as yaml_file: @@ -167,22 +205,51 @@ def check_bridge(pxe_bridge, dha_path): 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 UP' not in r: - err('Linux Bridge {0} is not Active, ' - 'bring it UP first: [ip link set dev {0} up]' % 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 Opendaylight Fuel Plugin will not be installed!' % msg) + def parse_arguments(): parser = ArgParser(prog='python %s' % __file__) - parser.add_argument('-nf', dest='without_fuel', action='store_true', + 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('iso_file', nargs='?', action='store', + 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') + 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_file', action='store', + 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_file', action='store', + parser.add_argument('-dha', dest='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, @@ -191,31 +258,40 @@ def parse_arguments(): default='pxebr', 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') args = parser.parse_args() log(args) - check_file_exists(args.dea_file) check_file_exists(args.dha_file) - if not args.without_fuel: + if not args.cleanup_only: + check_file_exists(args.dea_file) + check_fuel_plugins_dir(args.fuel_plugins_dir) + + if not args.no_fuel and not args.cleanup_only: log('Using OPNFV ISO file: %s' % args.iso_file) check_file_exists(args.iso_file) log('Using image directory: %s' % args.storage_dir) create_dir_if_not_exists(args.storage_dir) check_bridge(args.pxe_bridge, args.dha_file) - return (args.without_fuel, args.storage_dir, args.pxe_bridge, - args.iso_file, args.dea_file, 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': args.iso_file, 'dea_file': args.dea_file, + 'dha_file': args.dha_file, + 'fuel_plugins_dir': args.fuel_plugins_dir} + return kwargs def main(): - without_fuel, storage_dir, pxe_bridge, iso_file, dea_file, dha_file = \ - parse_arguments() + kwargs = parse_arguments() - d = AutoDeploy(without_fuel, storage_dir, pxe_bridge, iso_file, - dea_file, dha_file) - sys.exit(d.deploy()) + d = AutoDeploy(**kwargs) + sys.exit(d.run()) if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/fuel/deploy/deploy_env.py b/fuel/deploy/deploy_env.py index 084f37e..4953bde 100644 --- a/fuel/deploy/deploy_env.py +++ b/fuel/deploy/deploy_env.py @@ -1,7 +1,18 @@ +############################################################################### +# 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 from ssh_client import SSHClient import common @@ -10,38 +21,58 @@ exec_cmd = common.exec_cmd err = common.err check_file_exists = common.check_file_exists log = common.log +parse = common.parse +commafy = common.commafy +N = common.N +E = common.E +R = common.R +RO = common.RO CLOUD_DEPLOY_FILE = 'deploy.py' +BLADE_RESTART_TIMES = 3 +PLUGINS_DIR = '~/plugins' class CloudDeploy(object): - def __init__(self, dha, fuel_ip, fuel_username, fuel_password, dea_file, - work_dir): + def __init__(self, dea, dha, fuel_ip, fuel_username, fuel_password, + dea_file, fuel_plugins_dir, work_dir, no_health_check): + 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.fuel_plugins_dir = fuel_plugins_dir self.work_dir = work_dir + self.no_health_check = no_health_check self.file_dir = os.path.dirname(os.path.realpath(__file__)) self.ssh = SSHClient(self.fuel_ip, self.fuel_username, self.fuel_password) - self.macs_file = '%s/macs.yaml' % self.file_dir + self.blade_node_file = '%s/blade_node.yaml' % self.file_dir 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 upload_cloud_deployment_files(self): - dest ='~/%s/' % self.work_dir - with self.ssh as s: - s.exec_cmd('rm -rf %s' % self.work_dir, check=False) - s.exec_cmd('mkdir ~/%s' % self.work_dir) - s.scp_put(self.dea_file, dest) - s.scp_put(self.macs_file, dest) - s.scp_put('%s/common.py' % self.file_dir, dest) - s.scp_put('%s/dea.py' % self.file_dir, dest) + 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(self.blade_node_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) for f in glob.glob('%s/cloud/*' % self.file_dir): - s.scp_put(f, dest) + s.scp_put(f, self.work_dir) + + def upload_plugin_files(self): + with self.ssh as s: + s.exec_cmd('rm -rf %s' % PLUGINS_DIR, False) + 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 power_off_nodes(self): for node_id in self.node_ids: @@ -56,34 +87,172 @@ class CloudDeploy(object): self.dha.node_set_boot_order(node_id, boot_order_list[:]) def get_mac_addresses(self): - macs_per_node = {} + self.macs_per_blade = {} for node_id in self.node_ids: - macs_per_node[node_id] = self.dha.get_node_pxe_mac(node_id) - with io.open(self.macs_file, 'w') as stream: - yaml.dump(macs_per_node, stream, default_flow_style=False) + 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)) - macs_file = '%s/%s' % (self.work_dir, os.path.basename(self.macs_file)) + blade_node_file = '%s/%s' % ( + self.work_dir, os.path.basename(self.blade_node_file)) with self.ssh as s: - status = s.run('python %s %s %s' - % (deploy_app, dea_file, macs_file)) + status = s.run('python %s %s %s %s %s' + % (('-nh' if self.no_health_check else ''), + deploy_app, dea_file, blade_node_file, + PLUGINS_DIR)) return status - def deploy(self): + 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) - self.power_off_nodes() + 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) - self.set_boot_order(['pxe', 'disk']) + 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.blade_node_file, 'w') as stream: + yaml.dump(self.blade_node_dict, 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' 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] = 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 deploy(self): + + self.set_boot_order_nodes() + + self.check_prerequisites() + self.get_mac_addresses() - check_file_exists(self.macs_file) + self.wait_for_discovered_blades() self.upload_cloud_deployment_files() + self.upload_plugin_files() + return self.run_cloud_deploy(CLOUD_DEPLOY_FILE) diff --git a/fuel/deploy/dha.py b/fuel/deploy/dha.py index bf9a951..1feee60 100644 --- a/fuel/deploy/dha.py +++ b/fuel/deploy/dha.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 @@ -5,15 +15,20 @@ from dha_adapters.libvirt_adapter import LibvirtAdapter from dha_adapters.ipmi_adapter import IpmiAdapter from dha_adapters.hp_adapter import HpAdapter + 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 == 'libvirt': + return LibvirtAdapter(yaml_path) + if type == 'ipmi': + return IpmiAdapter(yaml_path) + if type == 'hp': + return HpAdapter(yaml_path) return super(DeploymentHardwareAdapter, cls).__new__(cls) diff --git a/fuel/deploy/dha_adapters/__init__.py b/fuel/deploy/dha_adapters/__init__.py index e69de29..fb73157 100644 --- a/fuel/deploy/dha_adapters/__init__.py +++ b/fuel/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/fuel/deploy/dha_adapters/hardware_adapter.py b/fuel/deploy/dha_adapters/hardware_adapter.py index a8d0121..29e04f1 100644 --- a/fuel/deploy/dha_adapters/hardware_adapter.py +++ b/fuel/deploy/dha_adapters/hardware_adapter.py @@ -1,7 +1,18 @@ +############################################################################### +# 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) @@ -45,4 +56,4 @@ class HardwareAdapter(object): return node['username'], node['password'] def get_disks(self): - return self.dha_struct['disks'] \ No newline at end of file + return self.dha_struct['disks'] diff --git a/fuel/deploy/dha_adapters/hp_adapter.py b/fuel/deploy/dha_adapters/hp_adapter.py index 8cfec34..51f55f3 100644 --- a/fuel/deploy/dha_adapters/hp_adapter.py +++ b/fuel/deploy/dha_adapters/hp_adapter.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 common from ipmi_adapter import IpmiAdapter from ssh_client import SSHClient @@ -10,6 +20,7 @@ DEV = {'pxe': 'bootsource5', ROOT = '/system1/bootconfig1' + class HpAdapter(IpmiAdapter): def __init__(self, yaml_path): @@ -22,4 +33,4 @@ class HpAdapter(IpmiAdapter): 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)) + % (ROOT, DEV[dev], order + 1)) diff --git a/fuel/deploy/dha_adapters/ipmi_adapter.py b/fuel/deploy/dha_adapters/ipmi_adapter.py index 1bef898..25aa36e 100644 --- a/fuel/deploy/dha_adapters/ipmi_adapter.py +++ b/fuel/deploy/dha_adapters/ipmi_adapter.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 common import time from hardware_adapter import HardwareAdapter @@ -6,6 +16,7 @@ log = common.log exec_cmd = common.exec_cmd err = common.err + class IpmiAdapter(HardwareAdapter): def __init__(self, yaml_path): @@ -104,4 +115,4 @@ class IpmiAdapter(HardwareAdapter): exec_cmd('%s chassis bootdev cdrom' % cmd_prefix) elif dev == 'disk': exec_cmd('%s chassis bootdev disk options=persistent' - % cmd_prefix) \ No newline at end of file + % cmd_prefix) diff --git a/fuel/deploy/dha_adapters/libvirt_adapter.py b/fuel/deploy/dha_adapters/libvirt_adapter.py index 1eca548..b285c16 100644 --- a/fuel/deploy/dha_adapters/libvirt_adapter.py +++ b/fuel/deploy/dha_adapters/libvirt_adapter.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 common from lxml import etree from hardware_adapter import HardwareAdapter @@ -10,6 +20,7 @@ DEV = {'pxe': 'network', 'disk': 'hd', 'iso': 'cdrom'} + class LibvirtAdapter(HardwareAdapter): def __init__(self, yaml_path): @@ -88,7 +99,8 @@ class LibvirtAdapter(HardwareAdapter): 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' % (vm_name, device), False) + 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') @@ -119,3 +131,6 @@ class LibvirtAdapter(HardwareAdapter): device = target.get('dev') if device: return device + + def get_virt_net_conf_dir(self): + return self.dha_struct['virtNetConfDir'] diff --git a/fuel/deploy/environments/__init__.py b/fuel/deploy/environments/__init__.py index c274feb..fb73157 100644 --- a/fuel/deploy/environments/__init__.py +++ b/fuel/deploy/environments/__init__.py @@ -1 +1,8 @@ -__author__ = 'eszicse' +############################################################################### +# 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/fuel/deploy/environments/execution_environment.py b/fuel/deploy/environments/execution_environment.py index 4f612a6..63be5cd 100644 --- a/fuel/deploy/environments/execution_environment.py +++ b/fuel/deploy/environments/execution_environment.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 common @@ -10,6 +20,7 @@ check_dir_exists = common.check_dir_exists check_file_exists = common.check_file_exists check_if_root = common.check_if_root + class ExecutionEnvironment(object): def __init__(self, storage_dir, dha_file, root_dir): @@ -54,8 +65,8 @@ class ExecutionEnvironment(object): uuid.getparent().remove(uuid) disks = vm_xml.xpath('/domain/devices/disk') for disk in disks: - if (disk.get('type') == 'file' - and disk.get('device') == 'disk'): + if (disk.get('type') == 'file' and + disk.get('device') == 'disk'): sources = disk.xpath('source') for source in sources: disk.remove(source) @@ -64,4 +75,4 @@ class ExecutionEnvironment(object): 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) \ No newline at end of file + exec_cmd('virsh define %s' % temp_vm_file) diff --git a/fuel/deploy/environments/libvirt_environment.py b/fuel/deploy/environments/libvirt_environment.py index e156fd2..785eeca 100644 --- a/fuel/deploy/environments/libvirt_environment.py +++ b/fuel/deploy/environments/libvirt_environment.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 @@ -11,7 +21,6 @@ check_dir_exists = common.check_dir_exists check_file_exists = common.check_file_exists check_if_root = common.check_if_root -NET_DIR = 'libvirt/networks' class LibvirtEnvironment(ExecutionEnvironment): @@ -19,17 +28,18 @@ class LibvirtEnvironment(ExecutionEnvironment): super(LibvirtEnvironment, self).__init__( storage_dir, dha_file, root_dir) self.dea = dea - self.network_dir = '%s/%s' % (self.root_dir, NET_DIR) + 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): if node_id == self.fuel_node_id: - disk_size = disk_sizes['fuel'] + disk_size = disk_sizes['fuel'] else: - roles = self.dea.get_node_role(node_id) - role = 'controller' if 'controller' in roles else 'compute' - disk_size = disk_sizes[role] + roles = self.dea.get_node_role(node_id) + role = 'controller' if 'controller' in roles else 'compute' + disk_size = disk_sizes[role] exec_cmd('fallocate -l %s %s' % (disk_size, disk_path)) def create_vms(self): @@ -48,6 +58,10 @@ class LibvirtEnvironment(ExecutionEnvironment): self.define_vm(vm_name, temp_vm_file, disk_path) exec_cmd('rm -fr %s' % 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) @@ -82,11 +96,11 @@ class LibvirtEnvironment(ExecutionEnvironment): self.delete_vm(node_id) def setup_environment(self): - check_if_root() check_dir_exists(self.network_dir) self.cleanup_environment() - self.create_vms() self.create_networks() + self.create_vms() + self.start_vms() def cleanup_environment(self): self.delete_vms() diff --git a/fuel/deploy/environments/virtual_fuel.py b/fuel/deploy/environments/virtual_fuel.py index f8b6791..cb8be63 100644 --- a/fuel/deploy/environments/virtual_fuel.py +++ b/fuel/deploy/environments/virtual_fuel.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 common @@ -8,6 +18,7 @@ log = common.log check_file_exists = common.check_file_exists check_if_root = common.check_if_root + class VirtualFuel(ExecutionEnvironment): def __init__(self, storage_dir, pxe_bridge, dha_file, root_dir): diff --git a/fuel/deploy/setup_execution_environment.py b/fuel/deploy/execution_environment.py similarity index 67% rename from fuel/deploy/setup_execution_environment.py rename to fuel/deploy/execution_environment.py index d97fcde..e671463 100644 --- a/fuel/deploy/setup_execution_environment.py +++ b/fuel/deploy/execution_environment.py @@ -1,12 +1,20 @@ +############################################################################### +# 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 sys import os import common from environments.libvirt_environment import LibvirtEnvironment from environments.virtual_fuel import VirtualFuel -from dea import DeploymentEnvironmentAdapter exec_cmd = common.exec_cmd err = common.err @@ -16,7 +24,9 @@ check_file_exists = common.check_file_exists check_if_root = common.check_if_root ArgParser = common.ArgParser + class ExecutionEnvironment(object): + def __new__(cls, storage_dir, pxe_bridge, dha_path, dea): with io.open(dha_path) as yaml_file: diff --git a/fuel/deploy/install_fuel_master.py b/fuel/deploy/install_fuel_master.py index b9b7809..da313b0 100644 --- a/fuel/deploy/install_fuel_master.py +++ b/fuel/deploy/install_fuel_master.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 common import time import os @@ -7,14 +17,17 @@ from dha_adapters.libvirt_adapter import LibvirtAdapter log = common.log err = common.err clean = common.clean +delete = common.delete TRANSPLANT_FUEL_SETTINGS = 'transplant_fuel_settings.py' BOOTSTRAP_ADMIN = '/usr/local/sbin/bootstrap_admin_node' +FUEL_CLIENT_CONFIG = '/etc/fuel/client/config.yaml' + class InstallFuelMaster(object): - def __init__(self, dea_file, dha_file, fuel_ip, fuel_username, fuel_password, - fuel_node_id, iso_file, work_dir): + def __init__(self, dea_file, dha_file, fuel_ip, fuel_username, + fuel_password, fuel_node_id, iso_file, work_dir): self.dea_file = dea_file self.dha = LibvirtAdapter(dha_file) self.fuel_ip = fuel_ip @@ -22,6 +35,7 @@ class InstallFuelMaster(object): 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.file_dir = os.path.dirname(os.path.realpath(__file__)) self.ssh = SSHClient(self.fuel_ip, self.fuel_username, @@ -67,8 +81,9 @@ class InstallFuelMaster(object): log('Waiting for one minute for Fuel to stabilize') time.sleep(60) - log('Eject ISO') - self.dha.node_eject_iso(self.fuel_node_id) + self.delete_deprecated_fuel_client_config_from_fuel_6_1() + + self.post_install_cleanup() log('Fuel Master installed successfully !') @@ -89,7 +104,7 @@ class InstallFuelMaster(object): self.ssh.close() if not success: - err('Could not SSH into Fuel VM %s' % self.fuel_ip) + err('Could not SSH into Fuel VM %s' % self.fuel_ip) def wait_until_fuel_menu_up(self): WAIT_LOOP = 60 @@ -123,17 +138,16 @@ class InstallFuelMaster(object): return ret def inject_own_astute_yaml(self): - dest ='~/%s/' % self.work_dir - with self.ssh as s: - s.exec_cmd('rm -rf %s' % self.work_dir, check=False) - s.exec_cmd('mkdir ~/%s' % self.work_dir) - s.scp_put(self.dea_file, dest) - s.scp_put('%s/common.py' % self.file_dir, dest) - s.scp_put('%s/dea.py' % self.file_dir, dest) - s.scp_put('%s/transplant_fuel_settings.py' % self.file_dir, dest) + 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' + s.run('python %s/%s %s/%s' % (self.work_dir, TRANSPLANT_FUEL_SETTINGS, self.work_dir, os.path.basename(self.dea_file))) @@ -153,4 +167,22 @@ class InstallFuelMaster(object): time.sleep(SLEEP_TIME) if not install_completed: + self.post_install_cleanup() err('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) + log('Remove ISO directory %s' % self.iso_dir) + delete(self.iso_dir) + + def delete_deprecated_fuel_client_config_from_fuel_6_1(self): + with self.ssh as s: + response, error = s.exec_cmd('fuel -v', False) + if (error and + 'DEPRECATION WARNING' in error and + '6.1.0' 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/fuel/deploy/reap.py b/fuel/deploy/reap.py index 8a8681a..1c21891 100644 --- a/fuel/deploy/reap.py +++ b/fuel/deploy/reap.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 common import time import os @@ -65,6 +75,7 @@ DISKS = {'fuel': '30G', 'controller': '30G', 'compute': '30G'} + class Reap(object): def __init__(self, dea_file, dha_file, comment): @@ -219,7 +230,7 @@ class Reap(object): def reap_network_settings(self): network_file = ('%s/network_%s.yaml' - % (self.temp_dir, self.env_id)) + % (self.temp_dir, self.env_id)) data = self.read_yaml(network_file) network = {} network['networking_parameters'] = data['networking_parameters'] @@ -230,7 +241,7 @@ class Reap(object): 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_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}) @@ -302,12 +313,14 @@ class Reap(object): self.reap_settings() self.finale() + def usage(): print ''' Usage: python reap.py ''' + def parse_arguments(): parser = ArgParser(prog='python %s' % __file__) parser.add_argument('dea_file', nargs='?', action='store', @@ -320,11 +333,13 @@ def parse_arguments(): args = parser.parse_args() return (args.dea_file, args.dha_file, args.comment) + def main(): dea_file, dha_file, comment = parse_arguments() r = Reap(dea_file, dha_file, comment) r.reap() + if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/fuel/deploy/ssh_client.py b/fuel/deploy/ssh_client.py index 0ec2edc..0f6b8c7 100644 --- a/fuel/deploy/ssh_client.py +++ b/fuel/deploy/ssh_client.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 paramiko import common import scp @@ -34,7 +44,7 @@ class SSHClient(object): def __exit__(self, type, value, traceback): self.close() - def exec_cmd(self, command, sudo=False, timeout=TIMEOUT, check=True): + 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, diff --git a/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dea.yaml new file mode 100644 index 0000000..cdb4aec --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dea.yaml @@ -0,0 +1,845 @@ +title: Deployment Environment Adapter (DEA) +# DEA API version supported +version: +created: +comment: Test environment Ericsson Montreal +environment: + name: opnfv_virt + mode: ha + net_segment_type: gre +wanted_release: Juno on Ubuntu 14.04.1 +nodes: +- id: 1 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 2 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 3 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 4 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 5 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 6 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: +fuel: + ADMIN_NETWORK: + ipaddress: 10.40.0.2 + netmask: 255.255.255.0 + dhcp_pool_start: 10.40.0.3 + dhcp_pool_end: 10.40.0.254 + DNS_UPSTREAM: 10.118.32.193 + DNS_DOMAIN: opnfvericsson.ca + DNS_SEARCH: opnfvericsson.ca + FUEL_ACCESS: + user: admin + password: admin + HOSTNAME: opnfv + NTP1: 10.118.34.219 + NTP2: + NTP3: +interfaces_1: + eth0: + - fuelweb_admin + eth2: + - public + - management + - storage + - private +transformations_1: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-ex + - action: add-br + name: br-floating + provider: ovs + - action: add-patch + bridges: + - br-floating + - br-ex + mtu: 65000 + provider: ovs + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth2.320 + - action: add-port + bridge: br-storage + name: eth2.220 + - action: add-port + bridge: br-mesh + name: eth2.20 + - action: add-port + bridge: br-ex + name: eth0 +transformations_2: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth2.320 + - action: add-port + bridge: br-storage + name: eth2.220 + - action: add-port + bridge: br-mesh + name: eth2.20 +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + dns_nameservers: + - 10.118.32.193 + floating_ranges: + - - 10.118.34.226 + - 10.118.34.230 + gre_id_range: + - 2 + - 65535 + internal_cidr: 192.168.111.0/24 + internal_gateway: 192.168.111.1 + net_l23_provider: ovs + segmentation_type: gre + vlan_range: + - 2022 + - 2023 + networks: + - cidr: 10.118.34.192/24 + gateway: 10.118.34.193 + ip_ranges: + - - 10.118.34.220 + - 10.118.34.225 + meta: + cidr: 10.118.34.192/24 + configurable: true + floating_range_var: floating_ranges + ip_range: + - 10.118.34.220 + - 10.118.34.225 + 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: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.254 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: cidr + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: 320 + name: management + vlan_start: 320 + - 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: 220 + name: storage + vlan_start: 220 + - cidr: 192.168.2.0/24 + gateway: null + ip_ranges: + - - 192.168.2.1 + - 192.168.2.254 + meta: + assign_vip: 192.168.2.0/24 + configurable: true + map_priority: 2 + name: private + notation: cidr + render_addr_mask: private + render_type: cidr + seg_type: gre + use_gateway: false + vlan_start: 20 + name: private + vlan_start: 20 + - cidr: 10.40.0.0/24 + gateway: 10.40.0.2 + ip_ranges: + - - 10.40.0.3 + - 10.40.255.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: + access: + email: + description: Email address for Administrator + label: Email + regex: + error: Invalid email + source: ^\S+@\S+$ + type: text + value: admin@localhost + weight: 40 + metadata: + label: 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$)(?![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$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 10 + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: false + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + 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 + type: checkbox + value: false + weight: 40 + murano: + description: If selected, Murano component will be installed + label: Install Murano + restrictions: + - cluster:net_provider != 'neutron' + type: checkbox + value: false + weight: 20 + sahara: + description: If selected, Sahara component will be installed + label: Install Sahara + type: checkbox + value: false + weight: 10 + common: + auth_key: + description: Public key(s) to include in authorized_keys on deployed nodes + label: Public Key + type: textarea + value: '' + weight: 70 + auto_assign_floating_ip: + description: If selected, OpenStack will automatically assign a floating IP + to a new instance + 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. + label: OpenStack debug logging + type: checkbox + value: false + weight: 20 + libvirt_type: + 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: 30 + nova_quota: + description: Quotas are used to limit CPU and memory usage for tenants. Enabling + quotas will increase load on the Nova database. + label: Nova quotas + type: checkbox + value: false + weight: 25 + puppet_debug: + description: Debug puppet logging mode provides more information, but requires + more disk space. + 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. + label: Resume guests state on host boot + type: checkbox + value: true + weight: 60 + 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. + label: Use qcow format for images + type: checkbox + value: true + weight: 50 + use_vcenter: + type: hidden + value: false + weight: 30 + corosync: + group: + description: '' + label: Group + type: text + value: 226.94.1.1 + weight: 10 + metadata: + 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_dns: + dns_list: + description: List of upstream DNS servers, separated by comma + label: DNS list + regex: + error: Invalid IP address list + source: ^\*$|^(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3}(?:\s*,\s*(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3})*$ + type: text + value: 10.118.32.193 + weight: 10 + metadata: + label: Host OS DNS Servers + weight: 90 + 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: + label: External MongoDB + restrictions: + - action: hide + condition: settings:additional_components.mongo.value == false + weight: 20 + 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 + external_ntp: + metadata: + label: Host OS NTP Servers + weight: 100 + ntp_list: + description: List of upstream NTP servers, separated by comma + label: NTP server list + regex: + error: Invalid NTP server list + source: ^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(?:\.\d{1,3}){3})\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(\.\d{1,3}){3})\s*)*$ + type: text + value: 10.118.34.219 + weight: 10 + kernel_params: + kernel: + description: Default kernel parameters + label: Initial parameters + type: text + value: console=ttyS0,9600 console=tty0 net.ifnames=0 biosdevname=0 rootdelay=90 + nomodeset + weight: 45 + metadata: + label: Kernel parameters + weight: 40 + murano_settings: + metadata: + label: Murano Settings + restrictions: + - action: hide + condition: settings:additional_components.murano.value == false + weight: 20 + murano_repo_url: + description: '' + label: Murano Repository URL + type: text + value: http://storage.apps.openstack.org/ + weight: 10 + neutron_mellanox: + metadata: + enabled: true + label: Mellanox Neutron components + restrictions: + - action: hide + condition: not ('experimental' in version:feature_groups) + toggleable: false + weight: 50 + plugin: + label: Mellanox drivers and SR-IOV plugin + type: radio + value: disabled + values: + - data: disabled + description: If selected, Mellanox drivers, Neutron and Cinder plugin will + not be installed. + label: Mellanox drivers and plugins disabled + restrictions: + - settings:storage.iser.value == true + - data: drivers_only + description: If selected, Mellanox Ethernet drivers will be installed to support + networking over Mellanox NIC. Mellanox Neutron plugin will not be installed. + label: Install only Mellanox drivers + restrictions: + - settings:common.libvirt_type.value != 'kvm' + - data: ethernet + description: If selected, both Mellanox Ethernet drivers and Mellanox network + acceleration (Neutron) plugin will be installed. + label: Install Mellanox drivers and SR-IOV plugin + restrictions: + - settings:common.libvirt_type.value != 'kvm' or not (cluster:net_provider + == 'neutron' and networking_parameters:segmentation_type == 'vlan') + weight: 60 + vf_num: + description: Note that one virtual function will be reserved to the storage + network, in case of choosing iSER. + label: Number of virtual NICs + restrictions: + - settings:neutron_mellanox.plugin.value != 'ethernet' + type: text + value: '16' + weight: 70 + opendaylight: + metadata: + enabled: true + label: OpenDaylight plugin + plugin_id: 1 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + toggleable: true + weight: 70 + 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 + use_vxlan: + description: Configure neutron to use VXLAN tunneling + label: Use vxlan + restrictions: + - action: disable + condition: networking_parameters:segmentation_type == 'vlan' + message: Neutron with GRE segmentation required + type: checkbox + value: true + weight: 20 + vni_range_end: + description: VXLAN VNI IDs range end + label: VNI range end + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10000' + weight: 31 + vni_range_start: + description: VXLAN VNI IDs range start + label: VNI range start + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10' + weight: 30 + provision: + metadata: + label: Provision + weight: 80 + method: + description: Which provision method to use for this cluster. + label: Provision method + type: radio + value: image + values: + - data: image + description: Copying pre-built images on a disk. + label: Image + - data: cobbler + description: Install from scratch using anaconda or debian-installer. + label: (DEPRECATED) Classic (use anaconda or debian-installer) + 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: false + weight: 10 + metadata: + label: Public network assignment + restrictions: + - action: hide + condition: cluster:net_provider != 'neutron' + weight: 50 + repo_setup: + metadata: + always_editable: true + 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. + + For more details, please refer to the documentation (https://docs.mirantis.com/openstack/fuel/fuel-6.1/operations.html#external-ubuntu-ops). + + ' + extra_priority: null + type: custom_repo_configuration + value: + - name: ubuntu + priority: null + section: main universe multiverse + suite: trusty + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-updates + priority: null + section: main universe multiverse + suite: trusty-updates + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-security + priority: null + section: main universe multiverse + suite: trusty-security + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: mos + priority: 1050 + section: main restricted + suite: mos6.1 + type: deb + uri: http://10.40.0.2:8080/2014.2.2-6.1/ubuntu/x86_64 + - name: mos-updates + priority: 1050 + section: main restricted + suite: mos6.1-updates + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-security + priority: 1050 + section: main restricted + suite: mos6.1-security + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-holdback + priority: 1100 + section: main restricted + suite: mos6.1-holdback + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: Auxiliary + priority: 1150 + section: main restricted + suite: auxiliary + type: deb + uri: http://10.40.0.2:8080/2014.2.2-6.1/ubuntu/auxiliary + 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 + 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: + label: Storage + 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) + restrictions: + - settings:storage.images_ceph.value == false + 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_ceph: + description: Configures Cinder to store volumes in Ceph RBD images. + label: Ceph RBD for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.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 + syslog: + metadata: + label: Syslog + 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 + 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 + workloads_collector: + enabled: + type: hidden + value: true + metadata: + label: Workloads Collector User + restrictions: + - action: hide + condition: 'true' + weight: 10 + password: + type: password + value: pBkLbu1k + tenant: + type: text + value: services + user: + type: text + value: fuel_stats_user diff --git a/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dha.yaml new file mode 100644 index 0000000..6227e5f --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dha.yaml @@ -0,0 +1,54 @@ +title: Deployment Hardware Adapter (DHA) +# DHA API version supported +version: +created: +comment: Test environment Ericsson Montreal + +# Adapter to use for this definition +adapter: hp + +# Node list. +# Mandatory property is id, all other properties are adapter specific. + +nodes: +- id: 1 + pxeMac: 14:58:D0:54:7A:D8 + ipmiIp: 10.118.32.198 + ipmiUser: + ipmiPass: +- id: 2 + pxeMac: 14:58:D0:55:E2:E0 + ipmiIp: 10.118.32.202 + ipmiUser: + ipmiPass: +- id: 3 + pxeMac: 9C:B6:54:8A:25:C0 + ipmiIp: 10.118.32.213 + ipmiUser: + ipmiPass: +- id: 4 + pxeMac: 14:58:D0:54:28:80 + ipmiIp: 10.118.32.201 + ipmiUser: + ipmiPass: +- id: 5 + pxeMac: 14:58:D0:54:E7:88 + ipmiIp: 10.118.32.203 + ipmiUser: + ipmiPass: +- id: 6 + pxeMac: 14:58:D0:54:7A:28 + ipmiIp: 10.118.32.205 + ipmiUser: + ipmiPass: +# Adding the Fuel node as node id 7 which may not be correct - please +# adjust as needed. +- id: 7 + libvirtName: fuel-opnfv + libvirtTemplate: templates/hardware_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +disks: + fuel: 50G \ No newline at end of file diff --git a/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dea.yaml new file mode 100644 index 0000000..29720e5 --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dea.yaml @@ -0,0 +1,842 @@ +title: Deployment Environment Adapter (DEA) +# DEA API version supported +version: +created: +comment: Config for LF POD1 - HA deployment with Ceph +environment: + name: opnfv_virt + mode: ha + net_segment_type: gre +wanted_release: Juno on Ubuntu 14.04.1 +nodes: +- id: 1 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 2 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 3 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 4 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 5 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: +fuel: + ADMIN_NETWORK: + ipaddress: 10.20.0.2 + netmask: 255.255.0.0 + dhcp_pool_start: 10.20.0.3 + dhcp_pool_end: 10.20.0.254 + DNS_UPSTREAM: 8.8.8.8 + DNS_DOMAIN: domain.tld + DNS_SEARCH: domain.tld + FUEL_ACCESS: + user: admin + password: admin + HOSTNAME: opnfv + NTP1: 0.pool.ntp.org + NTP2: 1.pool.ntp.org + NTP3: 2.pool.ntp.org +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-ex + - action: add-br + name: br-floating + provider: ovs + - action: add-patch + bridges: + - br-floating + - br-ex + mtu: 65000 + provider: ovs + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth1.300 + - action: add-port + bridge: br-storage + name: eth1.301 + - action: add-port + bridge: br-mesh + name: eth1.302 + - action: add-port + bridge: br-ex + name: eth0 +transformations_2: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth1.300 + - action: add-port + bridge: br-storage + name: eth1.301 + - action: add-port + bridge: br-mesh + name: eth1.302 +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + dns_nameservers: + - 8.8.4.4 + - 8.8.8.8 + floating_ranges: + - - 172.30.9.80 + - 172.30.9.89 + gre_id_range: + - 2 + - 65535 + internal_cidr: 192.168.111.0/24 + internal_gateway: 192.168.111.1 + net_l23_provider: ovs + segmentation_type: gre + vlan_range: + - 1000 + - 1030 + networks: + - cidr: 172.30.9.0/24 + gateway: 172.30.9.1 + ip_ranges: + - - 172.30.9.70 + - 172.30.9.79 + meta: + cidr: 172.30.9.0/24 + configurable: true + floating_range_var: floating_ranges + ip_range: + - 172.30.9.70 + - 172.30.9.79 + 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: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.254 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: cidr + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: 300 + name: management + vlan_start: 300 + - 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: 301 + name: storage + vlan_start: 301 + - cidr: 192.168.2.0/24 + gateway: null + ip_ranges: + - - 192.168.2.1 + - 192.168.2.254 + meta: + assign_vip: 192.168.2.0/24 + configurable: true + map_priority: 2 + name: private + notation: cidr + render_addr_mask: private + render_type: cidr + seg_type: gre + use_gateway: false + vlan_start: 302 + name: private + vlan_start: 302 + - cidr: 10.20.0.0/24 + gateway: 10.20.0.2 + ip_ranges: + - - 10.20.0.3 + - 10.20.255.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: + access: + email: + description: Email address for Administrator + label: Email + regex: + error: Invalid email + source: ^\S+@\S+$ + type: text + value: admin@localhost + weight: 40 + metadata: + label: 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$)(?![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$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 10 + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: false + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + 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 + type: checkbox + value: false + weight: 40 + murano: + description: If selected, Murano component will be installed + label: Install Murano + restrictions: + - cluster:net_provider != 'neutron' + type: checkbox + value: false + weight: 20 + sahara: + description: If selected, Sahara component will be installed + label: Install Sahara + type: checkbox + value: false + weight: 10 + common: + auth_key: + description: Public key(s) to include in authorized_keys on deployed nodes + label: Public Key + type: textarea + value: '' + weight: 70 + auto_assign_floating_ip: + description: If selected, OpenStack will automatically assign a floating IP + to a new instance + 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. + label: OpenStack debug logging + type: checkbox + value: false + weight: 20 + libvirt_type: + 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: 30 + nova_quota: + description: Quotas are used to limit CPU and memory usage for tenants. Enabling + quotas will increase load on the Nova database. + label: Nova quotas + type: checkbox + value: false + weight: 25 + puppet_debug: + description: Debug puppet logging mode provides more information, but requires + more disk space. + 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. + label: Resume guests state on host boot + type: checkbox + value: true + weight: 60 + 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. + label: Use qcow format for images + type: checkbox + value: true + weight: 50 + use_vcenter: + type: hidden + value: false + weight: 30 + corosync: + group: + description: '' + label: Group + type: text + value: 226.94.1.1 + weight: 10 + metadata: + 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_dns: + dns_list: + description: List of upstream DNS servers, separated by comma + label: DNS list + regex: + error: Invalid IP address list + source: ^\*$|^(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3}(?:\s*,\s*(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3})*$ + type: text + value: 8.8.4.4, 8.8.8.8 + weight: 10 + metadata: + label: Host OS DNS Servers + weight: 90 + 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: + label: External MongoDB + restrictions: + - action: hide + condition: settings:additional_components.mongo.value == false + weight: 20 + 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 + external_ntp: + metadata: + label: Host OS NTP Servers + weight: 100 + ntp_list: + description: List of upstream NTP servers, separated by comma + label: NTP server list + regex: + error: Invalid NTP server list + source: ^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(?:\.\d{1,3}){3})\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(\.\d{1,3}){3})\s*)*$ + type: text + value: 0.pool.ntp.org, 1.pool.ntp.org + weight: 10 + kernel_params: + kernel: + description: Default kernel parameters + label: Initial parameters + type: text + value: console=ttyS0,9600 console=tty0 net.ifnames=0 biosdevname=0 rootdelay=90 + nomodeset + weight: 45 + metadata: + label: Kernel parameters + weight: 40 + murano_settings: + metadata: + label: Murano Settings + restrictions: + - action: hide + condition: settings:additional_components.murano.value == false + weight: 20 + murano_repo_url: + description: '' + label: Murano Repository URL + type: text + value: http://storage.apps.openstack.org/ + weight: 10 + neutron_mellanox: + metadata: + enabled: true + label: Mellanox Neutron components + restrictions: + - action: hide + condition: not ('experimental' in version:feature_groups) + toggleable: false + weight: 50 + plugin: + label: Mellanox drivers and SR-IOV plugin + type: radio + value: disabled + values: + - data: disabled + description: If selected, Mellanox drivers, Neutron and Cinder plugin will + not be installed. + label: Mellanox drivers and plugins disabled + restrictions: + - settings:storage.iser.value == true + - data: drivers_only + description: If selected, Mellanox Ethernet drivers will be installed to support + networking over Mellanox NIC. Mellanox Neutron plugin will not be installed. + label: Install only Mellanox drivers + restrictions: + - settings:common.libvirt_type.value != 'kvm' + - data: ethernet + description: If selected, both Mellanox Ethernet drivers and Mellanox network + acceleration (Neutron) plugin will be installed. + label: Install Mellanox drivers and SR-IOV plugin + restrictions: + - settings:common.libvirt_type.value != 'kvm' or not (cluster:net_provider + == 'neutron' and networking_parameters:segmentation_type == 'vlan') + weight: 60 + vf_num: + description: Note that one virtual function will be reserved to the storage + network, in case of choosing iSER. + label: Number of virtual NICs + restrictions: + - settings:neutron_mellanox.plugin.value != 'ethernet' + type: text + value: '16' + weight: 70 + opendaylight: + metadata: + enabled: true + label: OpenDaylight plugin + plugin_id: 1 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + toggleable: true + weight: 70 + 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 + use_vxlan: + description: Configure neutron to use VXLAN tunneling + label: Use vxlan + restrictions: + - action: disable + condition: networking_parameters:segmentation_type == 'vlan' + message: Neutron with GRE segmentation required + type: checkbox + value: true + weight: 20 + vni_range_end: + description: VXLAN VNI IDs range end + label: VNI range end + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10000' + weight: 31 + vni_range_start: + description: VXLAN VNI IDs range start + label: VNI range start + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10' + weight: 30 + provision: + metadata: + label: Provision + weight: 80 + method: + description: Which provision method to use for this cluster. + label: Provision method + type: radio + value: image + values: + - data: image + description: Copying pre-built images on a disk. + label: Image + - data: cobbler + description: Install from scratch using anaconda or debian-installer. + label: (DEPRECATED) Classic (use anaconda or debian-installer) + 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: false + weight: 10 + metadata: + label: Public network assignment + restrictions: + - action: hide + condition: cluster:net_provider != 'neutron' + weight: 50 + repo_setup: + metadata: + always_editable: true + 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. + + For more details, please refer to the documentation (https://docs.mirantis.com/openstack/fuel/fuel-6.1/operations.html#external-ubuntu-ops). + + ' + extra_priority: null + type: custom_repo_configuration + value: + - name: ubuntu + priority: null + section: main universe multiverse + suite: trusty + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-updates + priority: null + section: main universe multiverse + suite: trusty-updates + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-security + priority: null + section: main universe multiverse + suite: trusty-security + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: mos + priority: 1050 + section: main restricted + suite: mos6.1 + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/x86_64 + - name: mos-updates + priority: 1050 + section: main restricted + suite: mos6.1-updates + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-security + priority: 1050 + section: main restricted + suite: mos6.1-security + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-holdback + priority: 1100 + section: main restricted + suite: mos6.1-holdback + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: Auxiliary + priority: 1150 + section: main restricted + suite: auxiliary + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/auxiliary + 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 + 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: + label: Storage + 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) + restrictions: + - settings:storage.images_ceph.value == false + 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_ceph: + description: Configures Cinder to store volumes in Ceph RBD images. + label: Ceph RBD for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.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 + syslog: + metadata: + label: Syslog + 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 + 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 + workloads_collector: + enabled: + type: hidden + value: true + metadata: + label: Workloads Collector User + restrictions: + - action: hide + condition: 'true' + weight: 10 + password: + type: password + value: pBkLbu1k + tenant: + type: text + value: services + user: + type: text + value: fuel_stats_user diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dha.yaml similarity index 89% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dha.yaml rename to fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dha.yaml index 8db72f0..724d6d8 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dha.yaml @@ -1,7 +1,7 @@ title: Deployment Hardware Adapter (DHA) # DHA API version supported -version: 1.1 -created: Fri May 8 08:03:49 UTC 2015 +version: +created: comment: Config for LF POD1 # Adapter to use for this definition @@ -40,10 +40,10 @@ nodes: # adjust as needed. - id: 6 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel_lf.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme disks: - fuel: 30G \ No newline at end of file + fuel: 50G \ No newline at end of file diff --git a/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dea.yaml new file mode 100644 index 0000000..2b9319c --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dea.yaml @@ -0,0 +1,842 @@ +title: Deployment Environment Adapter (DEA) +# DEA API version supported +version: +created: +comment: Config for LF POD2 - HA deployment with Ceph +environment: + name: opnfv_virt + mode: ha + net_segment_type: gre +wanted_release: Juno on Ubuntu 14.04.1 +nodes: +- id: 1 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 2 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 3 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 4 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 5 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: +fuel: + ADMIN_NETWORK: + ipaddress: 10.20.0.2 + netmask: 255.255.0.0 + dhcp_pool_start: 10.20.0.3 + dhcp_pool_end: 10.20.0.254 + DNS_UPSTREAM: 8.8.8.8 + DNS_DOMAIN: domain.tld + DNS_SEARCH: domain.tld + FUEL_ACCESS: + user: admin + password: admin + HOSTNAME: opnfv + NTP1: 0.pool.ntp.org + NTP2: 1.pool.ntp.org + NTP3: 2.pool.ntp.org +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-ex + - action: add-br + name: br-floating + provider: ovs + - action: add-patch + bridges: + - br-floating + - br-ex + mtu: 65000 + provider: ovs + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth1.300 + - action: add-port + bridge: br-storage + name: eth1.301 + - action: add-port + bridge: br-mesh + name: eth1.302 + - action: add-port + bridge: br-ex + name: eth0 +transformations_2: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth1.300 + - action: add-port + bridge: br-storage + name: eth1.301 + - action: add-port + bridge: br-mesh + name: eth1.302 +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + dns_nameservers: + - 8.8.4.4 + - 8.8.8.8 + floating_ranges: + - - 172.30.10.83 + - 172.30.10.92 + gre_id_range: + - 2 + - 65535 + internal_cidr: 192.168.111.0/24 + internal_gateway: 192.168.111.1 + net_l23_provider: ovs + segmentation_type: gre + vlan_range: + - 1000 + - 1030 + networks: + - cidr: 172.30.10.0/24 + gateway: 172.30.10.1 + ip_ranges: + - - 172.30.10.73 + - 172.30.10.82 + meta: + cidr: 172.30.10.0/24 + configurable: true + floating_range_var: floating_ranges + ip_range: + - 172.30.10.73 + - 172.30.10.82 + 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: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.254 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: cidr + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: 300 + name: management + vlan_start: 300 + - 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: 301 + name: storage + vlan_start: 301 + - cidr: 192.168.2.0/24 + gateway: null + ip_ranges: + - - 192.168.2.1 + - 192.168.2.254 + meta: + assign_vip: 192.168.2.0/24 + configurable: true + map_priority: 2 + name: private + notation: cidr + render_addr_mask: private + render_type: cidr + seg_type: gre + use_gateway: false + vlan_start: 302 + name: private + vlan_start: 302 + - cidr: 10.20.0.0/24 + gateway: 10.20.0.2 + ip_ranges: + - - 10.20.0.3 + - 10.20.255.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: + access: + email: + description: Email address for Administrator + label: Email + regex: + error: Invalid email + source: ^\S+@\S+$ + type: text + value: admin@localhost + weight: 40 + metadata: + label: 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$)(?![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$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 10 + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: false + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + 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 + type: checkbox + value: false + weight: 40 + murano: + description: If selected, Murano component will be installed + label: Install Murano + restrictions: + - cluster:net_provider != 'neutron' + type: checkbox + value: false + weight: 20 + sahara: + description: If selected, Sahara component will be installed + label: Install Sahara + type: checkbox + value: false + weight: 10 + common: + auth_key: + description: Public key(s) to include in authorized_keys on deployed nodes + label: Public Key + type: textarea + value: '' + weight: 70 + auto_assign_floating_ip: + description: If selected, OpenStack will automatically assign a floating IP + to a new instance + 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. + label: OpenStack debug logging + type: checkbox + value: false + weight: 20 + libvirt_type: + 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: 30 + nova_quota: + description: Quotas are used to limit CPU and memory usage for tenants. Enabling + quotas will increase load on the Nova database. + label: Nova quotas + type: checkbox + value: false + weight: 25 + puppet_debug: + description: Debug puppet logging mode provides more information, but requires + more disk space. + 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. + label: Resume guests state on host boot + type: checkbox + value: true + weight: 60 + 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. + label: Use qcow format for images + type: checkbox + value: true + weight: 50 + use_vcenter: + type: hidden + value: false + weight: 30 + corosync: + group: + description: '' + label: Group + type: text + value: 226.94.1.1 + weight: 10 + metadata: + 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_dns: + dns_list: + description: List of upstream DNS servers, separated by comma + label: DNS list + regex: + error: Invalid IP address list + source: ^\*$|^(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3}(?:\s*,\s*(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3})*$ + type: text + value: 8.8.4.4, 8.8.8.8 + weight: 10 + metadata: + label: Host OS DNS Servers + weight: 90 + 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: + label: External MongoDB + restrictions: + - action: hide + condition: settings:additional_components.mongo.value == false + weight: 20 + 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 + external_ntp: + metadata: + label: Host OS NTP Servers + weight: 100 + ntp_list: + description: List of upstream NTP servers, separated by comma + label: NTP server list + regex: + error: Invalid NTP server list + source: ^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(?:\.\d{1,3}){3})\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(\.\d{1,3}){3})\s*)*$ + type: text + value: 0.pool.ntp.org, 1.pool.ntp.org + weight: 10 + kernel_params: + kernel: + description: Default kernel parameters + label: Initial parameters + type: text + value: console=ttyS0,9600 console=tty0 net.ifnames=0 biosdevname=0 rootdelay=90 + nomodeset + weight: 45 + metadata: + label: Kernel parameters + weight: 40 + murano_settings: + metadata: + label: Murano Settings + restrictions: + - action: hide + condition: settings:additional_components.murano.value == false + weight: 20 + murano_repo_url: + description: '' + label: Murano Repository URL + type: text + value: http://storage.apps.openstack.org/ + weight: 10 + neutron_mellanox: + metadata: + enabled: true + label: Mellanox Neutron components + restrictions: + - action: hide + condition: not ('experimental' in version:feature_groups) + toggleable: false + weight: 50 + plugin: + label: Mellanox drivers and SR-IOV plugin + type: radio + value: disabled + values: + - data: disabled + description: If selected, Mellanox drivers, Neutron and Cinder plugin will + not be installed. + label: Mellanox drivers and plugins disabled + restrictions: + - settings:storage.iser.value == true + - data: drivers_only + description: If selected, Mellanox Ethernet drivers will be installed to support + networking over Mellanox NIC. Mellanox Neutron plugin will not be installed. + label: Install only Mellanox drivers + restrictions: + - settings:common.libvirt_type.value != 'kvm' + - data: ethernet + description: If selected, both Mellanox Ethernet drivers and Mellanox network + acceleration (Neutron) plugin will be installed. + label: Install Mellanox drivers and SR-IOV plugin + restrictions: + - settings:common.libvirt_type.value != 'kvm' or not (cluster:net_provider + == 'neutron' and networking_parameters:segmentation_type == 'vlan') + weight: 60 + vf_num: + description: Note that one virtual function will be reserved to the storage + network, in case of choosing iSER. + label: Number of virtual NICs + restrictions: + - settings:neutron_mellanox.plugin.value != 'ethernet' + type: text + value: '16' + weight: 70 + opendaylight: + metadata: + enabled: true + label: OpenDaylight plugin + plugin_id: 1 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + toggleable: true + weight: 70 + 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 + use_vxlan: + description: Configure neutron to use VXLAN tunneling + label: Use vxlan + restrictions: + - action: disable + condition: networking_parameters:segmentation_type == 'vlan' + message: Neutron with GRE segmentation required + type: checkbox + value: true + weight: 20 + vni_range_end: + description: VXLAN VNI IDs range end + label: VNI range end + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10000' + weight: 31 + vni_range_start: + description: VXLAN VNI IDs range start + label: VNI range start + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10' + weight: 30 + provision: + metadata: + label: Provision + weight: 80 + method: + description: Which provision method to use for this cluster. + label: Provision method + type: radio + value: image + values: + - data: image + description: Copying pre-built images on a disk. + label: Image + - data: cobbler + description: Install from scratch using anaconda or debian-installer. + label: (DEPRECATED) Classic (use anaconda or debian-installer) + 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: false + weight: 10 + metadata: + label: Public network assignment + restrictions: + - action: hide + condition: cluster:net_provider != 'neutron' + weight: 50 + repo_setup: + metadata: + always_editable: true + 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. + + For more details, please refer to the documentation (https://docs.mirantis.com/openstack/fuel/fuel-6.1/operations.html#external-ubuntu-ops). + + ' + extra_priority: null + type: custom_repo_configuration + value: + - name: ubuntu + priority: null + section: main universe multiverse + suite: trusty + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-updates + priority: null + section: main universe multiverse + suite: trusty-updates + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-security + priority: null + section: main universe multiverse + suite: trusty-security + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: mos + priority: 1050 + section: main restricted + suite: mos6.1 + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/x86_64 + - name: mos-updates + priority: 1050 + section: main restricted + suite: mos6.1-updates + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-security + priority: 1050 + section: main restricted + suite: mos6.1-security + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-holdback + priority: 1100 + section: main restricted + suite: mos6.1-holdback + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: Auxiliary + priority: 1150 + section: main restricted + suite: auxiliary + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/auxiliary + 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 + 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: + label: Storage + 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) + restrictions: + - settings:storage.images_ceph.value == false + 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_ceph: + description: Configures Cinder to store volumes in Ceph RBD images. + label: Ceph RBD for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.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 + syslog: + metadata: + label: Syslog + 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 + 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 + workloads_collector: + enabled: + type: hidden + value: true + metadata: + label: Workloads Collector User + restrictions: + - action: hide + condition: 'true' + weight: 10 + password: + type: password + value: pBkLbu1k + tenant: + type: text + value: services + user: + type: text + value: fuel_stats_user diff --git a/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dha.yaml new file mode 100644 index 0000000..f34d79f --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dha.yaml @@ -0,0 +1,49 @@ +title: Deployment Hardware Adapter (DHA) +# DHA API version supported +version: +created: +comment: Config for LF POD2 + +# Adapter to use for this definition +adapter: ipmi + +# Node list. +# Mandatory property is id, all other properties are adapter specific. + +nodes: +- id: 1 + pxeMac: 00:25:B5:A0:00:2A + ipmiIp: 172.30.8.75 + ipmiUser: admin + ipmiPass: octopus +- id: 2 + pxeMac: 00:25:B5:A0:00:3A + ipmiIp: 172.30.8.65 + ipmiUser: admin + ipmiPass: octopus +- id: 3 + pxeMac: 00:25:B5:A0:00:4A + ipmiIp: 172.30.8.74 + ipmiUser: admin + ipmiPass: octopus +- id: 4 + pxeMac: 00:25:B5:A0:00:5A + ipmiIp: 172.30.8.73 + ipmiUser: admin + ipmiPass: octopus +- id: 5 + pxeMac: 00:25:B5:A0:00:6A + ipmiIp: 172.30.8.72 + ipmiUser: admin + ipmiPass: octopus +# Adding the Fuel node as node id 6 which may not be correct - please +# adjust as needed. +- id: 6 + libvirtName: fuel-opnfv + libvirtTemplate: templates/hardware_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +disks: + fuel: 50G \ No newline at end of file diff --git a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dea.yaml index dc8014d..6ea3b72 100644 --- a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Tue May 5 15:33:07 UTC 2015 +version: +created: comment: Test environment Ericsson Montreal -environment_name: opnfv -environment_mode: ha +environment: + name: opnfv_virt + mode: ha + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -31,6 +33,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.40.0.2 @@ -47,17 +54,16 @@ fuel: NTP1: 10.118.34.219 NTP2: NTP3: -interfaces: - interfaces_1: - eth0: - - fuelweb_admin - eth2: - - public - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - fuelweb_admin + eth2: + - public + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -136,7 +142,8 @@ transformations: bridges: - br-eth2 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -203,9 +210,6 @@ transformations: bridges: - br-eth2 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dha.yaml similarity index 93% rename from fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dha.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dha.yaml index 1f87d52..eed9ad6 100644 --- a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dha.yaml @@ -45,7 +45,7 @@ nodes: # adjust as needed. - id: 7 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme diff --git a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dea.yaml index 328dd6b..87ecdaa 100644 --- a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Tue May 5 15:33:07 UTC 2015 +version: +created: comment: Test environment Ericsson Montreal -environment_name: opnfv -environment_mode: multinode +environment: + name: opnfv_virt + mode: multinode + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -31,6 +33,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.40.0.2 @@ -47,17 +54,16 @@ fuel: NTP1: 10.118.34.219 NTP2: NTP3: -interfaces: - interfaces_1: - eth0: - - fuelweb_admin - eth2: - - public - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - fuelweb_admin + eth2: + - public + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -130,7 +136,8 @@ transformations: bridges: - br-eth2 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -197,9 +204,6 @@ transformations: bridges: - br-eth2 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dha.yaml similarity index 93% rename from fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dha.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dha.yaml index 1f87d52..eed9ad6 100644 --- a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dha.yaml @@ -45,7 +45,7 @@ nodes: # adjust as needed. - id: 7 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dea.yaml index c2e568a..ba66bdd 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Thu May 21 13:34:13 CEST 2015 +version: +created: comment: Config for LF POD1 - HA deployment with Ceph -environment_name: opnfv -environment_mode: ha +environment: + name: opnfv_virt + mode: ha + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -27,6 +29,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -43,17 +50,16 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - public - eth1: - - fuelweb_admin - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -110,7 +116,8 @@ transformations: bridges: - br-eth1 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -159,9 +166,6 @@ transformations: bridges: - br-eth1 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dha.yaml new file mode 100644 index 0000000..a7fc7c0 --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dha.yaml @@ -0,0 +1,49 @@ +title: Deployment Hardware Adapter (DHA) +# DHA API version supported +version: +created: +comment: Config for LF POD1 + +# Adapter to use for this definition +adapter: ipmi + +# Node list. +# Mandatory property is id, all other properties are adapter specific. + +nodes: +- id: 1 + pxeMac: 00:25:b5:b0:00:ef + ipmiIp: 172.30.8.69 + ipmiUser: admin + ipmiPass: octopus +- id: 2 + pxeMac: 00:25:b5:b0:00:cf + ipmiIp: 172.30.8.78 + ipmiUser: admin + ipmiPass: octopus +- id: 3 + pxeMac: 00:25:b5:b0:00:8f + ipmiIp: 172.30.8.68 + ipmiUser: admin + ipmiPass: octopus +- id: 4 + pxeMac: 00:25:b5:b0:00:6f + ipmiIp: 172.30.8.77 + ipmiUser: admin + ipmiPass: octopus +- id: 5 + pxeMac: 00:25:b5:b0:00:4f + ipmiIp: 172.30.8.67 + ipmiUser: admin + ipmiPass: octopus +# Adding the Fuel node as node id 6 which may not be correct - please +# adjust as needed. +- id: 6 + libvirtName: fuel-opnfv + libvirtTemplate: templates/hardware_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +disks: + fuel: 30G \ No newline at end of file diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dea.yaml index d268404..35b1c3f 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Tue May 5 15:33:07 UTC 2015 +version: +created: comment: Config for LF POD1 - Multinode deployment with Ceph -environment_name: opnfv -environment_mode: multinode +environment: + name: opnfv_virt + mode: multinode + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -27,6 +29,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -43,17 +50,16 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - public - eth1: - - fuelweb_admin - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -110,7 +116,8 @@ transformations: bridges: - br-eth1 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -159,9 +166,6 @@ transformations: bridges: - br-eth1 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dha.yaml similarity index 89% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dha.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dha.yaml index d7f00c7..2dcab1f 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dha.yaml @@ -1,7 +1,7 @@ title: Deployment Hardware Adapter (DHA) # DHA API version supported -version: 1.1 -created: Fri May 8 08:03:49 UTC 2015 +version: +created: comment: Config for LF Pod1 # Adapter to use for this definition @@ -40,7 +40,7 @@ nodes: # adjust as needed. - id: 6 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel_lf.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dea.yaml index 5a0f367..d7fba48 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dea.yaml @@ -3,8 +3,10 @@ title: Deployment Environment Adapter (DEA) version: created: comment: Config for LF POD2 - HA deployment with Ceph -environment_name: opnfv -environment_mode: ha +environment: + name: opnfv_virt + mode: ha + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -27,6 +29,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -43,17 +50,16 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - public - eth1: - - fuelweb_admin - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -110,7 +116,8 @@ transformations: bridges: - br-eth1 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -159,9 +166,6 @@ transformations: bridges: - br-eth1 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dha.yaml similarity index 93% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dha.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dha.yaml index 1a6d8bf..fdcd545 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dha.yaml @@ -40,7 +40,7 @@ nodes: # adjust as needed. - id: 6 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel_lf.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dea.yaml index d6548f7..4814017 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dea.yaml @@ -3,8 +3,10 @@ title: Deployment Environment Adapter (DEA) version: created: comment: Config for LF POD2 - Multinode deployment with Ceph -environment_name: opnfv -environment_mode: multinode +environment: + name: opnfv_virt + mode: multinode + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -27,6 +29,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -43,17 +50,16 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - public - eth1: - - fuelweb_admin - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -110,7 +116,8 @@ transformations: bridges: - br-eth1 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -159,9 +166,6 @@ transformations: bridges: - br-eth1 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dha.yaml similarity index 93% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dha.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dha.yaml index 1a6d8bf..fdcd545 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dha.yaml @@ -40,7 +40,7 @@ nodes: # adjust as needed. - id: 6 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel_lf.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme diff --git a/fuel/deploy/baremetal/vms/fuel_lf.xml b/fuel/deploy/templates/hardware_environment/vms/fuel.xml similarity index 96% rename from fuel/deploy/baremetal/vms/fuel_lf.xml rename to fuel/deploy/templates/hardware_environment/vms/fuel.xml index 31b5490..e3e3f80 100644 --- a/fuel/deploy/baremetal/vms/fuel_lf.xml +++ b/fuel/deploy/templates/hardware_environment/vms/fuel.xml @@ -36,7 +36,6 @@ /usr/libexec/qemu-kvm - @@ -62,7 +61,6 @@ - diff --git a/fuel/deploy/templates/virtual_environment/conf/ha/dea.yaml b/fuel/deploy/templates/virtual_environment/conf/ha/dea.yaml new file mode 100644 index 0000000..e0e2fe6 --- /dev/null +++ b/fuel/deploy/templates/virtual_environment/conf/ha/dea.yaml @@ -0,0 +1,839 @@ +title: Deployment Environment Adapter (DEA) +# DEA API version supported +version: +created: +comment: Small libvirt setup +environment: + name: opnfv_virt + mode: ha + net_segment_type: gre +wanted_release: Juno on Ubuntu 14.04.1 +nodes: +- id: 1 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 2 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 3 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 4 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: +fuel: + ADMIN_NETWORK: + ipaddress: 10.20.0.2 + netmask: 255.255.255.0 + dhcp_pool_start: 10.20.0.3 + dhcp_pool_end: 10.20.0.254 + DNS_UPSTREAM: 10.118.32.193 + DNS_DOMAIN: opnfvericsson.ca + DNS_SEARCH: opnfvericsson.ca + FUEL_ACCESS: + user: admin + password: admin + HOSTNAME: opnfv_virt + NTP1: 10.118.34.219 + NTP2: + NTP3: +interfaces_1: + eth0: + - fuelweb_admin + - management + eth1: + - storage + eth2: + - private + eth3: + - public +transformations_1: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-ex + - action: add-br + name: br-floating + provider: ovs + - action: add-patch + bridges: + - br-floating + - br-ex + mtu: 65000 + provider: ovs + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth0.101 + - action: add-port + bridge: br-storage + name: eth1.102 + - action: add-port + bridge: br-mesh + name: eth2.103 + - action: add-port + bridge: br-ex + name: eth3 +transformations_2: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth0.101 + - action: add-port + bridge: br-storage + name: eth1.102 + - action: add-port + bridge: br-mesh + name: eth2.103 +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + dns_nameservers: + - 10.118.32.193 + 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 + net_l23_provider: ovs + segmentation_type: gre + vlan_range: + - 1000 + - 1030 + networks: + - 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: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.254 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: cidr + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: 101 + name: management + vlan_start: 101 + - 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.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: private + render_type: cidr + seg_type: gre + use_gateway: false + vlan_start: 103 + name: private + vlan_start: 103 + - 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: + access: + email: + description: Email address for Administrator + label: Email + regex: + error: Invalid email + source: ^\S+@\S+$ + type: text + value: admin@localhost + weight: 40 + metadata: + label: 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$)(?![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$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 10 + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: false + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + 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 + type: checkbox + value: false + weight: 40 + murano: + description: If selected, Murano component will be installed + label: Install Murano + restrictions: + - cluster:net_provider != 'neutron' + type: checkbox + value: false + weight: 20 + sahara: + description: If selected, Sahara component will be installed + label: Install Sahara + type: checkbox + value: false + weight: 10 + common: + auth_key: + description: Public key(s) to include in authorized_keys on deployed nodes + label: Public Key + type: textarea + value: '' + weight: 70 + auto_assign_floating_ip: + description: If selected, OpenStack will automatically assign a floating IP + to a new instance + 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. + label: OpenStack debug logging + type: checkbox + value: false + weight: 20 + libvirt_type: + label: Hypervisor type + type: radio + value: qemu + 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: 30 + nova_quota: + description: Quotas are used to limit CPU and memory usage for tenants. Enabling + quotas will increase load on the Nova database. + label: Nova quotas + type: checkbox + value: false + weight: 25 + puppet_debug: + description: Debug puppet logging mode provides more information, but requires + more disk space. + 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. + label: Resume guests state on host boot + type: checkbox + value: true + weight: 60 + 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. + label: Use qcow format for images + type: checkbox + value: true + weight: 50 + use_vcenter: + type: hidden + value: false + weight: 30 + corosync: + group: + description: '' + label: Group + type: text + value: 226.94.1.1 + weight: 10 + metadata: + 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_dns: + dns_list: + description: List of upstream DNS servers, separated by comma + label: DNS list + regex: + error: Invalid IP address list + source: ^\*$|^(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3}(?:\s*,\s*(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3})*$ + type: text + value: 10.118.32.193 + weight: 10 + metadata: + label: Host OS DNS Servers + weight: 90 + 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: + label: External MongoDB + restrictions: + - action: hide + condition: settings:additional_components.mongo.value == false + weight: 20 + 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 + external_ntp: + metadata: + label: Host OS NTP Servers + weight: 100 + ntp_list: + description: List of upstream NTP servers, separated by comma + label: NTP server list + regex: + error: Invalid NTP server list + source: ^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(?:\.\d{1,3}){3})\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(\.\d{1,3}){3})\s*)*$ + type: text + value: 10.118.34.219 + weight: 10 + kernel_params: + kernel: + description: Default kernel parameters + label: Initial parameters + type: text + value: console=ttyS0,9600 console=tty0 net.ifnames=0 biosdevname=0 rootdelay=90 + nomodeset + weight: 45 + metadata: + label: Kernel parameters + weight: 40 + murano_settings: + metadata: + label: Murano Settings + restrictions: + - action: hide + condition: settings:additional_components.murano.value == false + weight: 20 + murano_repo_url: + description: '' + label: Murano Repository URL + type: text + value: http://storage.apps.openstack.org/ + weight: 10 + neutron_mellanox: + metadata: + enabled: true + label: Mellanox Neutron components + restrictions: + - action: hide + condition: not ('experimental' in version:feature_groups) + toggleable: false + weight: 50 + plugin: + label: Mellanox drivers and SR-IOV plugin + type: radio + value: disabled + values: + - data: disabled + description: If selected, Mellanox drivers, Neutron and Cinder plugin will + not be installed. + label: Mellanox drivers and plugins disabled + restrictions: + - settings:storage.iser.value == true + - data: drivers_only + description: If selected, Mellanox Ethernet drivers will be installed to support + networking over Mellanox NIC. Mellanox Neutron plugin will not be installed. + label: Install only Mellanox drivers + restrictions: + - settings:common.libvirt_type.value != 'kvm' + - data: ethernet + description: If selected, both Mellanox Ethernet drivers and Mellanox network + acceleration (Neutron) plugin will be installed. + label: Install Mellanox drivers and SR-IOV plugin + restrictions: + - settings:common.libvirt_type.value != 'kvm' or not (cluster:net_provider + == 'neutron' and networking_parameters:segmentation_type == 'vlan') + weight: 60 + vf_num: + description: Note that one virtual function will be reserved to the storage + network, in case of choosing iSER. + label: Number of virtual NICs + restrictions: + - settings:neutron_mellanox.plugin.value != 'ethernet' + type: text + value: '16' + weight: 70 + opendaylight: + metadata: + enabled: true + label: OpenDaylight plugin + plugin_id: 1 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + toggleable: true + weight: 70 + 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 + use_vxlan: + description: Configure neutron to use VXLAN tunneling + label: Use vxlan + restrictions: + - action: disable + condition: networking_parameters:segmentation_type == 'vlan' + message: Neutron with GRE segmentation required + type: checkbox + value: true + weight: 20 + vni_range_end: + description: VXLAN VNI IDs range end + label: VNI range end + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10000' + weight: 31 + vni_range_start: + description: VXLAN VNI IDs range start + label: VNI range start + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10' + weight: 30 + provision: + metadata: + label: Provision + weight: 80 + method: + description: Which provision method to use for this cluster. + label: Provision method + type: radio + value: image + values: + - data: image + description: Copying pre-built images on a disk. + label: Image + - data: cobbler + description: Install from scratch using anaconda or debian-installer. + label: (DEPRECATED) Classic (use anaconda or debian-installer) + 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: false + weight: 10 + metadata: + label: Public network assignment + restrictions: + - action: hide + condition: cluster:net_provider != 'neutron' + weight: 50 + repo_setup: + metadata: + always_editable: true + 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. + + For more details, please refer to the documentation (https://docs.mirantis.com/openstack/fuel/fuel-6.1/operations.html#external-ubuntu-ops). + + ' + extra_priority: null + type: custom_repo_configuration + value: + - name: ubuntu + priority: null + section: main universe multiverse + suite: trusty + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-updates + priority: null + section: main universe multiverse + suite: trusty-updates + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-security + priority: null + section: main universe multiverse + suite: trusty-security + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: mos + priority: 1050 + section: main restricted + suite: mos6.1 + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/x86_64 + - name: mos-updates + priority: 1050 + section: main restricted + suite: mos6.1-updates + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-security + priority: 1050 + section: main restricted + suite: mos6.1-security + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-holdback + priority: 1100 + section: main restricted + suite: mos6.1-holdback + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: Auxiliary + priority: 1150 + section: main restricted + suite: auxiliary + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/auxiliary + 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 + 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: + label: Storage + 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) + restrictions: + - settings:storage.images_ceph.value == false + 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_ceph: + description: Configures Cinder to store volumes in Ceph RBD images. + label: Ceph RBD for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.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 + syslog: + metadata: + label: Syslog + 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 + 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 + workloads_collector: + enabled: + type: hidden + value: true + metadata: + label: Workloads Collector User + restrictions: + - action: hide + condition: 'true' + weight: 10 + password: + type: password + value: pBkLbu1k + tenant: + type: text + value: services + user: + type: text + value: fuel_stats_user diff --git a/fuel/deploy/libvirt/conf/multinode/dha.yaml b/fuel/deploy/templates/virtual_environment/conf/ha/dha.yaml similarity index 54% rename from fuel/deploy/libvirt/conf/multinode/dha.yaml rename to fuel/deploy/templates/virtual_environment/conf/ha/dha.yaml index d862f64..224e9bd 100644 --- a/fuel/deploy/libvirt/conf/multinode/dha.yaml +++ b/fuel/deploy/templates/virtual_environment/conf/ha/dha.yaml @@ -1,7 +1,7 @@ title: Deployment Hardware Adapter (DHA) # DHA API version supported -version: 1.1 -created: Sat Apr 25 16:26:22 UTC 2015 +version: +created: comment: Small libvirt setup # Adapter to use for this definition @@ -13,30 +13,26 @@ adapter: libvirt nodes: - id: 1 libvirtName: controller1 - libvirtTemplate: libvirt/vms/controller.xml + libvirtTemplate: templates/virtual_environment/vms/controller.xml - id: 2 libvirtName: compute1 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 3 libvirtName: compute2 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 4 libvirtName: compute3 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 5 - libvirtName: compute4 - libvirtTemplate: libvirt/vms/compute.xml -- id: 6 - libvirtName: compute5 - libvirtTemplate: libvirt/vms/compute.xml -- id: 7 libvirtName: fuel-master - libvirtTemplate: libvirt/vms/fuel.xml + libvirtTemplate: templates/virtual_environment/vms/fuel.xml isFuel: yes username: root password: r00tme +virtNetConfDir: templates/virtual_environment/networks + disks: - fuel: 30G + fuel: 50G controller: 30G compute: 30G diff --git a/fuel/deploy/libvirt/networks/fuel1.xml b/fuel/deploy/templates/virtual_environment/networks/fuel1.xml similarity index 100% rename from fuel/deploy/libvirt/networks/fuel1.xml rename to fuel/deploy/templates/virtual_environment/networks/fuel1.xml diff --git a/fuel/deploy/libvirt/networks/fuel2.xml b/fuel/deploy/templates/virtual_environment/networks/fuel2.xml similarity index 100% rename from fuel/deploy/libvirt/networks/fuel2.xml rename to fuel/deploy/templates/virtual_environment/networks/fuel2.xml diff --git a/fuel/deploy/libvirt/networks/fuel3.xml b/fuel/deploy/templates/virtual_environment/networks/fuel3.xml similarity index 100% rename from fuel/deploy/libvirt/networks/fuel3.xml rename to fuel/deploy/templates/virtual_environment/networks/fuel3.xml diff --git a/fuel/deploy/libvirt/networks/fuel4.xml b/fuel/deploy/templates/virtual_environment/networks/fuel4.xml similarity index 100% rename from fuel/deploy/libvirt/networks/fuel4.xml rename to fuel/deploy/templates/virtual_environment/networks/fuel4.xml diff --git a/fuel/deploy/libvirt/conf/ha/dea.yaml b/fuel/deploy/templates/virtual_environment/old_conf/ha/dea.yaml similarity index 98% rename from fuel/deploy/libvirt/conf/ha/dea.yaml rename to fuel/deploy/templates/virtual_environment/old_conf/ha/dea.yaml index 907bf90..36f91ab 100644 --- a/fuel/deploy/libvirt/conf/ha/dea.yaml +++ b/fuel/deploy/templates/virtual_environment/old_conf/ha/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Sat Apr 25 16:26:22 UTC 2015 +version: +created: comment: Small libvirt setup -environment_name: opnfv_virt -environment_mode: ha +environment: + name: opnfv_virt + mode: ha + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -31,6 +33,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -47,19 +54,18 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - fuelweb_admin - - management - eth1: - - storage - eth2: - - private - eth3: - - public -transformations: - transformations_1: +interfaces_1: + eth0: + - fuelweb_admin + - management + eth1: + - storage + eth2: + - private + eth3: + - public +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -126,7 +132,8 @@ transformations: bridges: - br-eth2 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -185,9 +192,6 @@ transformations: bridges: - br-eth2 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 @@ -416,7 +420,7 @@ settings: libvirt_type: label: Hypervisor type type: radio - value: kvm + value: qemu values: - data: kvm description: Choose this type of hypervisor if you run OpenStack on hardware diff --git a/fuel/deploy/libvirt/conf/ha/dha.yaml b/fuel/deploy/templates/virtual_environment/old_conf/ha/dha.yaml similarity index 52% rename from fuel/deploy/libvirt/conf/ha/dha.yaml rename to fuel/deploy/templates/virtual_environment/old_conf/ha/dha.yaml index 6b6efb0..9b5a774 100644 --- a/fuel/deploy/libvirt/conf/ha/dha.yaml +++ b/fuel/deploy/templates/virtual_environment/old_conf/ha/dha.yaml @@ -1,7 +1,7 @@ title: Deployment Hardware Adapter (DHA) # DHA API version supported -version: 1.1 -created: Sat Apr 25 16:26:22 UTC 2015 +version: +created: comment: Small libvirt setup # Adapter to use for this definition @@ -13,29 +13,31 @@ adapter: libvirt nodes: - id: 1 libvirtName: controller1 - libvirtTemplate: libvirt/vms/controller.xml + libvirtTemplate: templates/virtual_environment/vms/controller.xml - id: 2 libvirtName: controller2 - libvirtTemplate: libvirt/vms/controller.xml + libvirtTemplate: templates/virtual_environment/vms/controller.xml - id: 3 libvirtName: controller3 - libvirtTemplate: libvirt/vms/controller.xml + libvirtTemplate: templates/virtual_environment/vms/controller.xml - id: 4 libvirtName: compute1 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 5 libvirtName: compute2 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 6 libvirtName: compute3 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 7 libvirtName: fuel-master - libvirtTemplate: libvirt/vms/fuel.xml + libvirtTemplate: templates/virtual_environment/vms/fuel.xml isFuel: yes username: root password: r00tme +virtNetConfDir: templates/virtual_environment/networks + disks: fuel: 30G controller: 30G diff --git a/fuel/deploy/libvirt/conf/multinode/dea.yaml b/fuel/deploy/templates/virtual_environment/old_conf/multinode/dea.yaml similarity index 98% rename from fuel/deploy/libvirt/conf/multinode/dea.yaml rename to fuel/deploy/templates/virtual_environment/old_conf/multinode/dea.yaml index dfd8382..471e141 100644 --- a/fuel/deploy/libvirt/conf/multinode/dea.yaml +++ b/fuel/deploy/templates/virtual_environment/old_conf/multinode/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Sat Apr 25 16:26:22 UTC 2015 +version: +created: comment: Small libvirt setup -environment_name: opnfv_virt -environment_mode: multinode +environment: + name: opnfv_virt + mode: multinode + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -31,6 +33,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -47,19 +54,18 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - fuelweb_admin - - management - eth1: - - storage - eth2: - - private - eth3: - - public -transformations: - transformations_1: +interfaces_1: + eth0: + - fuelweb_admin + - management + eth1: + - storage + eth2: + - private + eth3: + - public +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -126,7 +132,8 @@ transformations: bridges: - br-eth2 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -185,9 +192,6 @@ transformations: bridges: - br-eth2 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 @@ -416,7 +420,7 @@ settings: libvirt_type: label: Hypervisor type type: radio - value: kvm + value: qemu values: - data: kvm description: Choose this type of hypervisor if you run OpenStack on hardware diff --git a/fuel/deploy/templates/virtual_environment/old_conf/multinode/dha.yaml b/fuel/deploy/templates/virtual_environment/old_conf/multinode/dha.yaml new file mode 100644 index 0000000..75cff2a --- /dev/null +++ b/fuel/deploy/templates/virtual_environment/old_conf/multinode/dha.yaml @@ -0,0 +1,44 @@ +title: Deployment Hardware Adapter (DHA) +# DHA API version supported +version: +created: +comment: Small libvirt setup + +# 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: compute4 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 6 + libvirtName: compute5 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 7 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +virtNetConfDir: templates/virtual_environment/networks + +disks: + fuel: 30G + controller: 30G + compute: 30G diff --git a/fuel/deploy/libvirt/vms/compute.xml b/fuel/deploy/templates/virtual_environment/vms/compute.xml similarity index 98% rename from fuel/deploy/libvirt/vms/compute.xml rename to fuel/deploy/templates/virtual_environment/vms/compute.xml index 86a7613..fbef4bd 100644 --- a/fuel/deploy/libvirt/vms/compute.xml +++ b/fuel/deploy/templates/virtual_environment/vms/compute.xml @@ -7,7 +7,6 @@ hvm - diff --git a/fuel/deploy/libvirt/vms/controller.xml b/fuel/deploy/templates/virtual_environment/vms/controller.xml similarity index 96% rename from fuel/deploy/libvirt/vms/controller.xml rename to fuel/deploy/templates/virtual_environment/vms/controller.xml index 9e49b0f..3ff2821 100644 --- a/fuel/deploy/libvirt/vms/controller.xml +++ b/fuel/deploy/templates/virtual_environment/vms/controller.xml @@ -1,7 +1,7 @@ controller - 2097152 - 2097152 + 8388608 + 8388608 2 hvm diff --git a/fuel/deploy/libvirt/vms/fuel.xml b/fuel/deploy/templates/virtual_environment/vms/fuel.xml similarity index 100% rename from fuel/deploy/libvirt/vms/fuel.xml rename to fuel/deploy/templates/virtual_environment/vms/fuel.xml diff --git a/fuel/deploy/transplant_fuel_settings.py b/fuel/deploy/transplant_fuel_settings.py index bb4f9b6..d2aece8 100644 --- a/fuel/deploy/transplant_fuel_settings.py +++ b/fuel/deploy/transplant_fuel_settings.py @@ -1,3 +1,13 @@ +############################################################################### +# 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 common import io @@ -6,12 +16,16 @@ from dea import DeploymentEnvironmentAdapter check_file_exists = common.check_file_exists +ASTUTE_YAML = '/etc/fuel/astute.yaml' + + def usage(): print ''' Usage: python transplant_fuel_settings.py ''' + def parse_arguments(): if len(sys.argv) != 2: usage() @@ -20,6 +34,7 @@ def parse_arguments(): check_file_exists(dea_file) return dea_file + def transplant(dea, astute): fuel_conf = dea.get_fuel_config() for key in fuel_conf.iterkeys(): @@ -30,17 +45,17 @@ def transplant(dea, astute): astute[key] = fuel_conf[key] return astute + def main(): dea_file = parse_arguments() - astute_yaml = '/etc/fuel/astute.yaml' - check_file_exists(astute_yaml) + check_file_exists(ASTUTE_YAML) dea = DeploymentEnvironmentAdapter(dea_file) - with io.open(astute_yaml) as stream: + with io.open(ASTUTE_YAML) as stream: astute = yaml.load(stream) transplant(dea, astute) - with io.open(astute_yaml, 'w') as stream: + with io.open(ASTUTE_YAML, 'w') as stream: yaml.dump(astute, stream, default_flow_style=False) if __name__ == '__main__': - main() \ No newline at end of file + main() -- 2.16.6