Merge "adding files to the build cache to reduce bandwidth by reusing already downloa...
authorTim Rozet <trozet@redhat.com>
Wed, 16 Sep 2015 19:02:13 +0000 (19:02 +0000)
committerGerrit Code Review <gerrit@172.30.200.206>
Wed, 16 Sep 2015 19:02:13 +0000 (19:02 +0000)
62 files changed:
common/ci/clean.sh
fuel/ci/README
fuel/deploy/README.txt
fuel/deploy/__init__.py
fuel/deploy/baremetal/vms/fuel.xml [deleted file]
fuel/deploy/cloud/configure_environment.py
fuel/deploy/cloud/configure_network.py
fuel/deploy/cloud/configure_nodes.py
fuel/deploy/cloud/configure_settings.py
fuel/deploy/cloud/deploy.py
fuel/deploy/cloud/deployment.py
fuel/deploy/common.py
fuel/deploy/dea.py
fuel/deploy/deploy.py
fuel/deploy/deploy_env.py
fuel/deploy/dha.py
fuel/deploy/dha_adapters/__init__.py
fuel/deploy/dha_adapters/hardware_adapter.py
fuel/deploy/dha_adapters/hp_adapter.py
fuel/deploy/dha_adapters/ipmi_adapter.py
fuel/deploy/dha_adapters/libvirt_adapter.py
fuel/deploy/environments/__init__.py
fuel/deploy/environments/execution_environment.py
fuel/deploy/environments/libvirt_environment.py
fuel/deploy/environments/virtual_fuel.py
fuel/deploy/execution_environment.py [moved from fuel/deploy/setup_execution_environment.py with 67% similarity]
fuel/deploy/install_fuel_master.py
fuel/deploy/reap.py
fuel/deploy/ssh_client.py
fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dea.yaml [new file with mode: 0644]
fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dha.yaml [new file with mode: 0644]
fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dea.yaml [new file with mode: 0644]
fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dha.yaml [moved from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dha.yaml with 89% similarity]
fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dea.yaml [new file with mode: 0644]
fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dha.yaml [new file with mode: 0644]
fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dea.yaml [moved from fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dea.yaml with 98% similarity]
fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dha.yaml [moved from fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dha.yaml with 93% similarity]
fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dea.yaml [moved from fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dea.yaml with 98% similarity]
fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dha.yaml [moved from fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dha.yaml with 93% similarity]
fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dea.yaml [moved from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dea.yaml with 98% similarity]
fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dha.yaml [new file with mode: 0644]
fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dea.yaml [moved from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dea.yaml with 98% similarity]
fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dha.yaml [moved from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dha.yaml with 89% similarity]
fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dea.yaml [moved from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dea.yaml with 98% similarity]
fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dha.yaml [moved from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dha.yaml with 93% similarity]
fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dea.yaml [moved from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dea.yaml with 98% similarity]
fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dha.yaml [moved from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dha.yaml with 93% similarity]
fuel/deploy/templates/hardware_environment/vms/fuel.xml [moved from fuel/deploy/baremetal/vms/fuel_lf.xml with 96% similarity]
fuel/deploy/templates/virtual_environment/conf/ha/dea.yaml [new file with mode: 0644]
fuel/deploy/templates/virtual_environment/conf/ha/dha.yaml [moved from fuel/deploy/libvirt/conf/multinode/dha.yaml with 54% similarity]
fuel/deploy/templates/virtual_environment/networks/fuel1.xml [moved from fuel/deploy/libvirt/networks/fuel1.xml with 100% similarity]
fuel/deploy/templates/virtual_environment/networks/fuel2.xml [moved from fuel/deploy/libvirt/networks/fuel2.xml with 100% similarity]
fuel/deploy/templates/virtual_environment/networks/fuel3.xml [moved from fuel/deploy/libvirt/networks/fuel3.xml with 100% similarity]
fuel/deploy/templates/virtual_environment/networks/fuel4.xml [moved from fuel/deploy/libvirt/networks/fuel4.xml with 100% similarity]
fuel/deploy/templates/virtual_environment/old_conf/ha/dea.yaml [moved from fuel/deploy/libvirt/conf/ha/dea.yaml with 98% similarity]
fuel/deploy/templates/virtual_environment/old_conf/ha/dha.yaml [moved from fuel/deploy/libvirt/conf/ha/dha.yaml with 52% similarity]
fuel/deploy/templates/virtual_environment/old_conf/multinode/dea.yaml [moved from fuel/deploy/libvirt/conf/multinode/dea.yaml with 98% similarity]
fuel/deploy/templates/virtual_environment/old_conf/multinode/dha.yaml [new file with mode: 0644]
fuel/deploy/templates/virtual_environment/vms/compute.xml [moved from fuel/deploy/libvirt/vms/compute.xml with 98% similarity]
fuel/deploy/templates/virtual_environment/vms/controller.xml [moved from fuel/deploy/libvirt/vms/controller.xml with 96% similarity]
fuel/deploy/templates/virtual_environment/vms/fuel.xml [moved from fuel/deploy/libvirt/vms/fuel.xml with 100% similarity]
fuel/deploy/transplant_fuel_settings.py

index da75205..caaf88f 100755 (executable)
@@ -239,8 +239,15 @@ done
 echo "${blue}Checking whether PXE bridge ${pxe_bridge} exists${reset}"
 if ! brctl show ${pxe_bridge} 2>&1 | grep -i 'No such device'; then
   echo "${blue}PXE bridge detected. Removing...${reset}"
-  if ifconfig | grep ${pxe_bridge}; then
-    ifdown ${pxe_bridge}
+  link_state=$(ip link show ${pxe_bridge} | grep -oP 'state \K[^ ]+')
+  if [[ ${link_state} != 'DOWN' ]]; then
+    ip link set dev ${pxe_bridge} down
+    sleep 5
+    link_state=$(ip link show ${pxe_bridge} | grep -oP 'state \K[^ ]+')
+    if [[ ${link_state} != 'DOWN' ]]; then
+      echo "${red}Could not bring DOWN bridge ${pxe_bridge} link state is ${link_state}${reset}"
+      exit 1
+    fi
   fi
   brctl delbr ${pxe_bridge}
   if ifconfig | grep ${pxe_bridge} || brctl show | grep ${pxe_bridge}; then
index 3525d4d..5ecaa7b 100644 (file)
@@ -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
index 33baff1..f42e9ac 100644 (file)
@@ -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 <storage_dir> is not specified, Autodeployment will use
-"<current_working_dir>/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 <pxe_bridge> 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 <iso_file> is not specified, Autodeployment will use "<current_working_dir>/OPNFV.iso"
-as default, if the iso file does not exist, the application will terminate with an error message
 
-<pxe_bridge> 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 <storage_dir> is not specified, Autodeployment will use
+"<current_working_dir>/images" as default, and it will create it, if it hasn't been created before
+
+=>  If optional argument -b <pxe_bridge> 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 "<current_working_dir>/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 "<current_working_dir>/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 "<current_working_dir>/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 <<EOF
+net.bridge.bridge-nf-call-ip6tables = 0
+net.bridge.bridge-nf-call-iptables = 0
+net.bridge.bridge-nf-call-arptables = 0
+EOF
 
+and then reload configuration:
+sysctl -p /etc/sysctl.conf
index e69de29..fb73157 100644 (file)
@@ -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/baremetal/vms/fuel.xml b/fuel/deploy/baremetal/vms/fuel.xml
deleted file mode 100644 (file)
index 9f1eeac..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-<domain type='kvm'>
-  <name>fuel</name>
-  <memory unit='KiB'>8290304</memory>
-  <currentMemory unit='KiB'>8290304</currentMemory>
-  <vcpu placement='static'>2</vcpu>
-  <resource>
-    <partition>/machine</partition>
-  </resource>
-  <os>
-    <type arch='x86_64' machine='pc-i440fx-utopic'>hvm</type>
-    <boot dev='hd'/>
-    <boot dev='cdrom'/>
-    <bootmenu enable='no'/>
-  </os>
-  <features>
-    <acpi/>
-    <apic/>
-    <pae/>
-  </features>
-  <cpu mode='custom' match='exact'>
-    <model fallback='allow'>SandyBridge</model>
-  </cpu>
-  <clock offset='utc'>
-    <timer name='rtc' tickpolicy='catchup'/>
-    <timer name='pit' tickpolicy='delay'/>
-    <timer name='hpet' present='no'/>
-  </clock>
-  <on_poweroff>destroy</on_poweroff>
-  <on_reboot>restart</on_reboot>
-  <on_crash>restart</on_crash>
-  <pm>
-    <suspend-to-mem enabled='no'/>
-    <suspend-to-disk enabled='no'/>
-  </pm>
-  <devices>
-    <emulator>/usr/bin/kvm</emulator>
-    <disk type='file' device='disk'>
-      <driver name='qemu' type='raw'/>
-      <source file='/mnt/images/vFuel.raw'/>
-      <target dev='vda' bus='virtio'/>
-    </disk>
-    <disk type='block' device='cdrom'>
-      <driver name='qemu' type='raw'/>
-      <target dev='hda' bus='ide'/>
-      <readonly/>
-    </disk>
-    <controller type='usb' index='0' model='ich9-ehci1'>
-    </controller>
-    <controller type='usb' index='0' model='ich9-uhci1'>
-      <master startport='0'/>
-    </controller>
-    <controller type='usb' index='0' model='ich9-uhci2'>
-      <master startport='2'/>
-    </controller>
-    <controller type='usb' index='0' model='ich9-uhci3'>
-      <master startport='4'/>
-    </controller>
-    <controller type='pci' index='0' model='pci-root'/>
-    <controller type='virtio-serial' index='0'>
-    </controller>
-    <controller type='ide' index='0'>
-    </controller>
-    <interface type='bridge'>
-      <source bridge='vfuelnet'/>
-      <model type='virtio'/>
-    </interface>
-    <serial type='pty'>
-      <target port='0'/>
-    </serial>
-    <console type='pty'>
-      <target type='serial' port='0'/>
-    </console>
-    <input type='mouse' bus='ps2'/>
-    <input type='keyboard' bus='ps2'/>
-    <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='sv'>
-      <listen type='address' address='127.0.0.1'/>
-    </graphics>
-    <sound model='ich6'>
-    </sound>
-    <video>
-      <model type='cirrus' vram='9216' heads='1'/>
-    </video>
-    <memballoon model='virtio'>
-    </memballoon>
-  </devices>
-  <seclabel type='dynamic' model='apparmor' relabel='yes'/>
-</domain>
index d0037d7..2d68c1b 100644 (file)
@@ -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()
-
-
-
index 295eb90..0027894 100644 (file)
@@ -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)
index a2f2a10..e76d222 100644 (file)
@@ -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('%s/node_%s' % (self.yaml_config_dir, node_id))
 
         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)
index ac0afdc..fa918fd 100644 (file)
@@ -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')
 
index c423834..1534f0b 100644 (file)
@@ -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()
index 0054c5b..43bd4b6 100644 (file)
@@ -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()
index dc12637..ab2bf68 100644 (file)
@@ -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 subprocess
 import sys
 import os
 import logging
 import argparse
+import shutil
+import stat
+import errno
 
 N = {'id': 0, 'status': 1, 'name': 2, 'cluster': 3, 'ip': 4, 'mac': 5,
      'roles': 6, 'pending_roles': 7, 'online': 8}
@@ -20,6 +32,7 @@ LOG.addHandler(out_handler)
 out_handler = logging.FileHandler('autodeploy.log', mode='w')
 out_handler.setFormatter(formatter)
 LOG.addHandler(out_handler)
+os.chmod('autodeploy.log', stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
 
 def exec_cmd(cmd, check=True):
     process = subprocess.Popen(cmd,
@@ -35,6 +48,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 +56,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 +78,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
index 61ebea3..9c1ebfc 100644 (file)
@@ -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
index 33c6f9f..1acce42 100644 (file)
@@ -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,23 +205,63 @@ 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',
-                        default='%s/OPNFV.iso' % CWD,
-                        help='ISO File [default: OPNFV.iso]')
-    parser.add_argument('dea_file', action='store',
-                        help='Deployment Environment Adapter: dea.yaml')
-    parser.add_argument('dha_file', action='store',
-                        help='Deployment Hardware Adapter: dha.yaml')
+    parser.add_argument('-nh', dest='no_health_check', action='store_true',
+                        default=False,
+                        help='Don\'t run health check after deployment')
+    parser.add_argument('-fo', dest='fuel_only', action='store_true',
+                        default=False,
+                        help='Install Fuel Master only (and Node VMs when '
+                             'using libvirt)')
+    parser.add_argument('-co', dest='cleanup_only', action='store_true',
+                        default=False,
+                        help='Cleanup VMs and Virtual Networks according to '
+                             'what is defined in DHA')
+    parser.add_argument('-c', dest='cleanup', action='store_true',
+                        default=False,
+                        help='Cleanup after deploy')
+    if {'-iso', '-dea', '-dha', '-h'}.intersection(sys.argv):
+        parser.add_argument('-iso', dest='iso_file', action='store', nargs='?',
+                            default='%s/OPNFV.iso' % CWD,
+                            help='ISO File [default: OPNFV.iso]')
+        parser.add_argument('-dea', dest='dea_file', action='store', nargs='?',
+                            default='%s/dea.yaml' % CWD,
+                            help='Deployment Environment Adapter: dea.yaml')
+        parser.add_argument('-dha', dest='dha_file', action='store', nargs='?',
+                            default='%s/dha.yaml' % CWD,
+                            help='Deployment Hardware Adapter: dha.yaml')
+    else:
+        parser.add_argument('iso_file', action='store', nargs='?',
+                            default='%s/OPNFV.iso' % CWD,
+                            help='ISO File [default: OPNFV.iso]')
+        parser.add_argument('dea_file', action='store', nargs='?',
+                            default='%s/dea.yaml' % CWD,
+                            help='Deployment Environment Adapter: dea.yaml')
+        parser.add_argument('dha_file', action='store', nargs='?',
+                            default='%s/dha.yaml' % CWD,
+                            help='Deployment Hardware Adapter: dha.yaml')
     parser.add_argument('-s', dest='storage_dir', action='store',
                         default='%s/images' % CWD,
                         help='Storage Directory [default: images]')
@@ -191,31 +269,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()
index 084f37e..4953bde 100644 (file)
@@ -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)
index bf9a951..1feee60 100644 (file)
@@ -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)
index e69de29..fb73157 100644 (file)
@@ -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
+###############################################################################
index a8d0121..29e04f1 100644 (file)
@@ -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']
index 8cfec34..51f55f3 100644 (file)
@@ -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))
index 1bef898..25aa36e 100644 (file)
@@ -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)
index 1eca548..b285c16 100644 (file)
@@ -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']
index c274feb..fb73157 100644 (file)
@@ -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
+###############################################################################
index 4f612a6..63be5cd 100644 (file)
@@ -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)
index e156fd2..785eeca 100644 (file)
@@ -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()
index f8b6791..cb8be63 100644 (file)
@@ -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):
similarity index 67%
rename from fuel/deploy/setup_execution_environment.py
rename to fuel/deploy/execution_environment.py
index d97fcde..e671463 100644 (file)
@@ -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:
index b9b7809..9a2599c 100644 (file)
@@ -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
@@ -110,12 +125,9 @@ class InstallFuelMaster(object):
         return fuel_menu_pid
 
     def get_fuel_menu_pid(self, printout, search):
-        fuel_menu_pid = None
         for line in printout.splitlines():
-            if search in line:
-                fuel_menu_pid = clean(line)[1]
-                break
-        return fuel_menu_pid
+            if line.endswith(search):
+                return clean(line)[1]
 
     def ssh_exec_cmd(self, cmd, check=True):
         with self.ssh:
@@ -123,17 +135,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 +164,42 @@ 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)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
index 8a8681a..1c21891 100644 (file)
@@ -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 <dea_file> <dha_file> <comment>
     '''
 
+
 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()
index 0ec2edc..0f6b8c7 100644 (file)
@@ -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 (file)
index 0000000..cdb4aec
--- /dev/null
@@ -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 (file)
index 0000000..6227e5f
--- /dev/null
@@ -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: <username>
+  ipmiPass: <password>
+- id: 2
+  pxeMac: 14:58:D0:55:E2:E0
+  ipmiIp: 10.118.32.202
+  ipmiUser: <username>
+  ipmiPass: <password>
+- id: 3
+  pxeMac: 9C:B6:54:8A:25:C0
+  ipmiIp: 10.118.32.213
+  ipmiUser: <username>
+  ipmiPass: <password>
+- id: 4
+  pxeMac: 14:58:D0:54:28:80
+  ipmiIp: 10.118.32.201
+  ipmiUser: <username>
+  ipmiPass: <password>
+- id: 5
+  pxeMac: 14:58:D0:54:E7:88
+  ipmiIp: 10.118.32.203
+  ipmiUser: <username>
+  ipmiPass: <password>
+- id: 6
+  pxeMac: 14:58:D0:54:7A:28
+  ipmiIp: 10.118.32.205
+  ipmiUser: <username>
+  ipmiPass: <password>
+# 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 (file)
index 0000000..29720e5
--- /dev/null
@@ -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
@@ -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 (file)
index 0000000..2b9319c
--- /dev/null
@@ -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 (file)
index 0000000..f34d79f
--- /dev/null
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 (file)
index 0000000..a7fc7c0
--- /dev/null
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -36,7 +36,6 @@
     <emulator>/usr/libexec/qemu-kvm</emulator>
     <disk type='file' device='disk'>
       <driver name='qemu' type='raw'/>
-      <source file='/home/opnfv/images/vFuel.raw'/>
       <target dev='vda' bus='virtio'/>
     </disk>
     <disk type='block' device='cdrom'>
@@ -62,7 +61,6 @@
     <controller type='virtio-serial' index='0'>
     </controller>
     <interface type='bridge'>
-      <source bridge='pxebr'/>
       <model type='virtio'/>
     </interface>
     <serial type='pty'>
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 (file)
index 0000000..e0e2fe6
--- /dev/null
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
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 (file)
index 0000000..75cff2a
--- /dev/null
@@ -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
@@ -7,7 +7,6 @@
     <type arch='x86_64' machine='pc-1.0'>hvm</type>
     <boot dev='network'/>
     <boot dev='hd'/>
-    <bootmenu enable='yes'/>
     <bios rebootTimeout='30000'/>
   </os>
   <features>
@@ -1,7 +1,7 @@
 <domain type='kvm'>
   <name>controller</name>
-  <memory unit='KiB'>2097152</memory>
-  <currentMemory unit='KiB'>2097152</currentMemory>
+  <memory unit='KiB'>8388608</memory>
+  <currentMemory unit='KiB'>8388608</currentMemory>
   <vcpu placement='static'>2</vcpu>
   <os>
     <type arch='x86_64' machine='pc-1.0'>hvm</type>
index bb4f9b6..d2aece8 100644 (file)
@@ -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 <deafile>
     '''
 
+
 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()