::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
: Copyright (c) 2017 Enea AB and others.
:
: All rights reserved. This program and the accompanying materials
: are made available under the terms of the Apache License, Version 2.0
: which accompanies this distribution, and is available at
: http://www.apache.org/licenses/LICENSE-2.0
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
From: cristinapauna <cristina.pauna@enea.com>
Date: Fri, 25 Nov 2016 16:38:46 +0200
Subject: [PATCH] Fuel rework for multiple libvirt

The current fuel arhitecture assumes that all the VMs
(Jenkins slave, Fuel master and Target nodes) are all on
the same server. There is code that allows the Fuel master
to be on a different machine, but nothing for the Target nodes.
In Enea-Arm lab we have a different server for each.

This commit also adds specific templates for a virtual pod in
the Enea-Arm lab.

Therefore, the following changes are done:
- The default libvirt URI is the machine on which the Target nodes are
- The parameter libvirtUri was added in the dha.yaml file for fuel master
- All virsh calls have "-c" option to explicitly specify the uri; this parameter
  is set only when libvirtUri is explicitly set in the yaml file
- The scenarios dha override now point to the arm template files
- The network templates are not needed for ARM, as the network infra is provided
  by the server on which the Target node VMs reside; the folder is added here
  just for consistency
- The target nodes are created with virsh rather than quemu when the nodes are
  not on the same machine as Jenkins slave (similar logic to what is done for
  remote Fuel master)

Initially only ha scenarios were successfully deployed on virtual pods
The default configuration is for ha scenarios and those have 5 target nodes
while on the noha scenarios there are 4. The noha scenarios failed because
it was trying to parse one extra node.

The dea and dha files need to be modified for each noha scenario so that the
nodes are properly configured.

Signed-off-by: cristinapauna <cristina.pauna@enea.com>
---
 deploy/dha_adapters/hardware_adapter.py            |  5 ++
 deploy/dha_adapters/libvirt_adapter.py             | 42 ++++-----
 deploy/environments/execution_environment.py       | 19 +++--
 deploy/environments/libvirt_environment.py         | 59 ++++++++++++-
 deploy/environments/virtual_fuel.py                |  8 +-
 deploy/install_fuel_master.py                      |  2 +-
 deploy/scenario/ha_heat_ceilometer_scenario.yaml   | 13 +--
 .../ha_nfv-kvm_heat_ceilometer_scenario.yaml       | 13 +--
 .../ha_nfv-ovs_heat_ceilometer_scenario.yaml       | 13 +--
 deploy/scenario/ha_odl-bgpvpn_scenario.yaml        | 13 +--
 .../ha_odl-l2_heat_ceilometer_scenario.yaml        | 13 +--
 .../ha_odl-l2_sfc_heat_ceilometer_scenario.yaml    | 13 +--
 .../ha_odl-l3_heat_ceilometer_scenario.yaml        | 13 +--
 ...ha_onos_nofeature_heat_ceilometer_scenario.yaml | 13 +--
 .../ha_onos_sfc_heat_ceilometer_scenario.yaml      | 13 +--
 .../scenario/ha_vlan_heat_ceilometer_scenario.yaml | 13 +--
 .../scenario/no-ha_heat_ceilometer_scenario.yaml   | 25 ++++++
 .../no-ha_nfv-kvm_heat_ceilometer_scenario.yaml    | 25 ++++++
 ...a_nfv-kvm_nfv-ovs_heat_ceilometer_scenario.yaml | 25 ++++++
 .../no-ha_nfv-ovs_heat_ceilometer_scenario.yaml    | 26 +++++-
 deploy/scenario/no-ha_odl-bgpvpn_scenario.yaml     | 25 ++++++
 .../no-ha_odl-l2_heat_ceilometer_scenario.yaml     | 25 ++++++
 .../no-ha_odl-l2_sfc_heat_ceilometer_scenario.yaml | 25 ++++++
 .../no-ha_odl-l3_heat_ceilometer_scenario.yaml     | 25 ++++++
 ...ha_onos_nofeature_heat_ceilometer_scenario.yaml | 26 ++++++
 .../no-ha_onos_sfc_heat_ceilometer_scenario.yaml   | 25 ++++++
 .../no-ha_vlan_heat_ceilometer_scenario.yaml       | 25 ++++++
 .../arm/virtual_environment/networks/.gitkeep      |  0
 .../arm/virtual_environment/vms/compute.xml        | 57 +++++++++++++
 .../arm/virtual_environment/vms/controller.xml     | 57 +++++++++++++
 .../templates/arm/virtual_environment/vms/fuel.xml | 99 ++++++++++++++++++++++
 31 files changed, 658 insertions(+), 97 deletions(-)
 create mode 100644 deploy/templates/arm/virtual_environment/networks/.gitkeep
 create mode 100644 deploy/templates/arm/virtual_environment/vms/compute.xml
 create mode 100644 deploy/templates/arm/virtual_environment/vms/controller.xml
 create mode 100644 deploy/templates/arm/virtual_environment/vms/fuel.xml

diff --git a/deploy/dha_adapters/hardware_adapter.py b/deploy/dha_adapters/hardware_adapter.py
index aa59581..cf3d77a 100644
--- a/deploy/dha_adapters/hardware_adapter.py
+++ b/deploy/dha_adapters/hardware_adapter.py
@@ -63,3 +63,8 @@ class HardwareAdapter(object):
         vm_definition = self.dha_struct.get('define_vms')
         if vm_definition:
             return vm_definition.get(role)
+    def get_node_uri(self, node_id):
+        vm_libvirt_uri = self.get_node_property(node_id, 'libvirtUri')
+        if vm_libvirt_uri:
+            return '-c %s' % vm_libvirt_uri
+        return ''
diff --git a/deploy/dha_adapters/libvirt_adapter.py b/deploy/dha_adapters/libvirt_adapter.py
index a00f091..34535d1 100644
--- a/deploy/dha_adapters/libvirt_adapter.py
+++ b/deploy/dha_adapters/libvirt_adapter.py
@@ -43,21 +43,21 @@ class LibvirtAdapter(HardwareAdapter):
     def node_power_off(self, node_id):
         vm_name = self.get_node_property(node_id, 'libvirtName')
         log('Power OFF Node %s' % vm_name)
-        state = exec_cmd('virsh domstate %s' % vm_name)
+        state = exec_cmd('virsh %s domstate %s' % (self.get_node_uri(node_id), vm_name))
         if state == 'running':
-            exec_cmd('virsh destroy %s' % vm_name, False)
+            exec_cmd('virsh %s destroy %s' % (self.get_node_uri(node_id), vm_name), False)
 
     def node_power_on(self, node_id):
         vm_name = self.get_node_property(node_id, 'libvirtName')
         log('Power ON Node %s' % vm_name)
-        state = exec_cmd('virsh domstate %s' % vm_name)
+        state = exec_cmd('virsh %s domstate %s' % (self.get_node_uri(node_id), vm_name))
         if state == 'shut off':
-            exec_cmd('virsh start %s' % vm_name)
+            exec_cmd('virsh %s start %s' % (self.get_node_uri(node_id), vm_name))
 
     def node_reset(self, node_id):
         vm_name = self.get_node_property(node_id, 'libvirtName')
         log('Reset Node %s' % vm_name)
-        exec_cmd('virsh reset %s' % vm_name)
+        exec_cmd('virsh %s reset %s' % (self.get_node_uri(node_id), vm_name))
 
     def translate(self, boot_order_list):
         translated = []
@@ -73,7 +73,7 @@ class LibvirtAdapter(HardwareAdapter):
         vm_name = self.get_node_property(node_id, 'libvirtName')
         temp_dir = tempfile.mkdtemp()
         log('Set boot order %s on Node %s' % (boot_order_list, vm_name))
-        resp = exec_cmd('virsh dumpxml %s' % vm_name)
+        resp = exec_cmd('virsh %s dumpxml %s' % (self.get_node_uri(node_id), vm_name))
         xml_dump = etree.fromstring(resp, self.parser)
         os = xml_dump.xpath('/domain/os')
         for o in os:
@@ -92,12 +92,12 @@ class LibvirtAdapter(HardwareAdapter):
         xml_file = temp_dir + '/%s.xml' % vm_name
         with open(xml_file, 'w') as f:
             tree.write(f, pretty_print=True, xml_declaration=True)
-        exec_cmd('virsh define %s' % xml_file)
+        exec_cmd('virsh %s define %s' % (self.get_node_uri(node_id), xml_file))
         delete(temp_dir)
 
     def node_zero_mbr(self, node_id):
         vm_name = self.get_node_property(node_id, 'libvirtName')
-        resp = exec_cmd('virsh dumpxml %s' % vm_name)
+        resp = exec_cmd('virsh %s dumpxml %s' % (self.get_node_uri(node_id), vm_name))
         xml_dump = etree.fromstring(resp)
         disks = xml_dump.xpath('/domain/devices/disk')
         for disk in disks:
@@ -114,20 +114,20 @@ 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 --config --live'
-                 % (vm_name, device), False)
+        device = self.get_name_of_device(vm_name, 'cdrom', node_id)
+        exec_cmd('virsh %s change-media %s --eject %s --config --live'
+                 % (self.get_node_uri(node_id), vm_name, device), False)
 
     def node_insert_iso(self, node_id, iso_file):
         vm_name = self.get_node_property(node_id, 'libvirtName')
-        device = self.get_name_of_device(vm_name, 'cdrom')
-        exec_cmd('virsh change-media %s --insert %s %s'
-                 % (vm_name, device, iso_file))
+        device = self.get_name_of_device(vm_name, 'cdrom', node_id)
+        exec_cmd('virsh %s change-media %s --insert %s %s'
+                 % (self.get_node_uri(node_id), vm_name, device, iso_file))
 
     def get_node_pxe_mac(self, node_id):
         mac_list = []
         vm_name = self.get_node_property(node_id, 'libvirtName')
-        resp = exec_cmd('virsh dumpxml %s' % vm_name)
+        resp = exec_cmd('virsh %s dumpxml %s' % (self.get_node_uri(node_id), vm_name))
         xml_dump = etree.fromstring(resp)
         interfaces = xml_dump.xpath('/domain/devices/interface')
         for interface in interfaces:
@@ -136,8 +136,8 @@ class LibvirtAdapter(HardwareAdapter):
                 mac_list.append(mac.get('address').lower())
         return mac_list
 
-    def get_name_of_device(self, vm_name, device_type):
-        resp = exec_cmd('virsh dumpxml %s' % vm_name)
+    def get_name_of_device(self, vm_name, device_type, node_id):
+        resp = exec_cmd('virsh %s dumpxml %s' % (self.get_node_uri(node_id), vm_name))
         xml_dump = etree.fromstring(resp)
         disks = xml_dump.xpath('/domain/devices/disk')
         for disk in disks:
@@ -151,7 +151,7 @@ class LibvirtAdapter(HardwareAdapter):
     def get_virt_net_conf_dir(self):
         return self.dha_struct['virtNetConfDir']
 
-    def upload_iso(self, iso_file):
+    def upload_iso(self, node_id, iso_file):
         size = os.path.getsize(iso_file)
         vol_name = os.path.basename(iso_file)
         vol_xml = VOL_XML_TEMPLATE.format(name=vol_name, unit='bytes',
@@ -162,10 +162,10 @@ class LibvirtAdapter(HardwareAdapter):
 
         log(vol_xml)
         pool = DEFAULT_POOL # FIXME
-        exec_cmd('virsh vol-create --pool %s %s' % (pool, fname))
-        vol_path = exec_cmd('virsh vol-path --pool %s %s' % (pool, vol_name))
+        exec_cmd('virsh %s vol-create --pool %s %s' % (self.get_node_uri(node_id), pool, fname))
+        vol_path = exec_cmd('virsh %s vol-path --pool %s %s' % (self.get_node_uri(node_id), pool, vol_name))
 
-        exec_cmd('virsh vol-upload %s %s' % (vol_path, iso_file),
+        exec_cmd('virsh %s vol-upload %s %s' % (self.get_node_uri(node_id), vol_path, iso_file),
                  attempts=5, delay=10, verbose=True)
 
         delete(fname)
diff --git a/deploy/environments/execution_environment.py b/deploy/environments/execution_environment.py
index 7a0b474..db25229 100644
--- a/deploy/environments/execution_environment.py
+++ b/deploy/environments/execution_environment.py
@@ -29,12 +29,12 @@ class ExecutionEnvironment(object):
 
     def delete_vm(self, node_id):
         vm_name = self.dha.get_node_property(node_id, 'libvirtName')
-        r, c = exec_cmd('virsh dumpxml %s' % vm_name, False)
+        r, c = exec_cmd('virsh %s dumpxml %s' % (self.dha.get_node_uri(node_id), vm_name), False)
         if c:
             return
-        self.undefine_vm_delete_disk(r, vm_name)
+        self.undefine_vm_delete_disk(r, vm_name, node_id)
 
-    def undefine_vm_delete_disk(self, printout, vm_name):
+    def undefine_vm_delete_disk(self, printout, vm_name, node_id):
         disk_files = []
         xml_dump = etree.fromstring(printout, self.parser)
         disks = xml_dump.xpath('/domain/devices/disk')
@@ -45,8 +45,13 @@ class ExecutionEnvironment(object):
                 if source_file:
                     disk_files.append(source_file)
         log('Deleting VM %s with disks %s' % (vm_name, disk_files))
-        exec_cmd('virsh destroy %s' % vm_name, False)
-        exec_cmd('virsh undefine --managed-save --remove-all-storage %s' % vm_name, False)
+        exec_cmd('virsh %s destroy %s' % (self.dha.get_node_uri(node_id), vm_name), False)
+        r, c = exec_cmd('virsh %s undefine --managed-save --remove-all-storage %s' %
+                        (self.dha.get_node_uri(node_id), vm_name), False)
+        if c:
+            exec_cmd('virsh %s undefine --managed-save --remove-all-storage --nvram %s' %
+                     (self.dha.get_node_uri(node_id), vm_name), False)
+
         for file in disk_files:
             delete(file)
 
@@ -75,7 +80,7 @@ class ExecutionEnvironment(object):
                 self.overwrite_xml(xml_element, value)
 
     def define_vm(self, vm_name, temp_vm_file, disk_path,
-                  vm_definition_overwrite):
+                  vm_definition_overwrite, node_id):
         log('Creating VM %s with disks %s' % (vm_name, disk_path))
         with open(temp_vm_file) as f:
             vm_xml = etree.parse(f)
@@ -99,4 +104,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)
+        exec_cmd('virsh %s define %s' % (self.dha.get_node_uri(node_id), temp_vm_file))
diff --git a/deploy/environments/libvirt_environment.py b/deploy/environments/libvirt_environment.py
index 07a47fd..08d669b 100644
--- a/deploy/environments/libvirt_environment.py
+++ b/deploy/environments/libvirt_environment.py
@@ -12,6 +12,9 @@ from lxml import etree
 import glob
 from execution_environment import ExecutionEnvironment
 import tempfile
+import os
+import re
+import time
 
 from common import (
     exec_cmd,
@@ -21,6 +24,25 @@ from common import (
     delete,
 )
 
+VOL_XML_TEMPLATE = '''<volume type='file'>
+  <name>{name}</name>
+  <capacity unit='{unit}'>{size!s}</capacity>
+  <target>
+    <format type='{format_type}'/>
+  </target>
+</volume>'''
+
+DEFAULT_POOL = 'jenkins'
+
+def get_size_and_unit(s):
+    p = re.compile('^(\d+)\s*(\D+)')
+    m = p.match(s)
+    if m == None:
+        return None, None
+    size = m.groups()[0]
+    unit = m.groups()[1]
+    return size, unit
+
 
 class LibvirtEnvironment(ExecutionEnvironment):
 
@@ -33,10 +55,39 @@ class LibvirtEnvironment(ExecutionEnvironment):
         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):
+    def create_volume(self, pool, name, su, node_id, temp_dir, img_type='raw'):
+        log('Creating image using Libvirt volumes in pool %s, name: %s, uri: %s' %
+            (pool, name, self.dha.get_node_uri(node_id)))
+        size, unit = get_size_and_unit(su)
+        if size == None:
+            err('Could not determine size and unit of %s' % s)
+
+        vol_xml = VOL_XML_TEMPLATE.format(name=name, unit=unit, size=size,
+                                          format_type=img_type)
+        fname = os.path.join(temp_dir, '%s_vol.xml' % name)
+        with file(fname, 'w') as f:
+            f.write(vol_xml)
+
+        exec_cmd('virsh %s vol-create --pool %s %s' %
+                 (self.dha.get_node_uri(node_id), pool, fname))
+        vol_path = exec_cmd('virsh %s vol-path --pool %s %s' %
+                            (self.dha.get_node_uri(node_id), pool, name))
+
+        delete(fname)
+        return vol_path
+
+
+    def create_storage(self, node_id, disk_path, disk_sizes, temp_dir):
         role = self.dea.get_node_main_role(node_id, self.fuel_node_id)
         disk_size = disk_sizes[role]
-        exec_cmd('qemu-img create -f raw %s %s' % (disk_path, disk_size))
+        if os.environ.get('LIBVIRT_DEFAULT_URI') == None:
+            exec_cmd('qemu-img create -f raw %s %s' % (disk_path, disk_size))
+        else:
+            pool = DEFAULT_POOL # FIXME
+            name = os.path.basename(disk_path)
+            disk_path = self.create_volume(pool, name, disk_size, node_id, temp_dir)
+        return disk_path
+
 
     def create_vms(self):
         temp_dir = tempfile.mkdtemp()
@@ -48,13 +99,13 @@ class LibvirtEnvironment(ExecutionEnvironment):
                                          node_id, 'libvirtTemplate'))
             check_file_exists(vm_template)
             disk_path = '%s/%s.raw' % (self.storage_dir, vm_name)
-            self.create_storage(node_id, disk_path, disk_sizes)
+            disk_path = self.create_storage(node_id, disk_path, disk_sizes, temp_dir)
             temp_vm_file = '%s/%s' % (temp_dir, vm_name)
             exec_cmd('cp %s %s' % (vm_template, temp_vm_file))
             vm_definition_overwrite = self.dha.get_vm_definition(
                  self.dea.get_node_main_role(node_id, self.fuel_node_id))
             self.define_vm(vm_name, temp_vm_file, disk_path,
-                           vm_definition_overwrite)
+                           vm_definition_overwrite, node_id)
         delete(temp_dir)
 
     def start_vms(self):
diff --git a/deploy/environments/virtual_fuel.py b/deploy/environments/virtual_fuel.py
index fcfa532..5f50f40 100644
--- a/deploy/environments/virtual_fuel.py
+++ b/deploy/environments/virtual_fuel.py
@@ -99,8 +99,10 @@ class VirtualFuel(ExecutionEnvironment):
         with file(fname, 'w') as f:
             f.write(vol_xml)
 
-        exec_cmd('virsh vol-create --pool %s %s' % (pool, fname))
-        vol_path = exec_cmd('virsh vol-path --pool %s %s' % (pool, name))
+        exec_cmd('virsh %s vol-create --pool %s %s' %
+                 (self.dha.get_node_uri(self.fuel_node_id), pool, fname))
+        vol_path = exec_cmd('virsh %s vol-path --pool %s %s' %
+                            (self.dha.get_node_uri(self.fuel_node_id), pool, name))
 
         delete(fname)
 
@@ -131,7 +133,7 @@ class VirtualFuel(ExecutionEnvironment):
         vm_definition_overwrite = self.dha.get_vm_definition('fuel')
 
         self.define_vm(self.vm_name, self.temp_vm_file, disk_path,
-                       vm_definition_overwrite)
+                       vm_definition_overwrite, self.fuel_node_id)
 
     def setup_environment(self):
         self.cleanup_environment()
diff --git a/deploy/install_fuel_master.py b/deploy/install_fuel_master.py
index 2d89c8e..2615818 100644
--- a/deploy/install_fuel_master.py
+++ b/deploy/install_fuel_master.py
@@ -59,7 +59,7 @@ class InstallFuelMaster(object):
 
         if os.environ.get('LIBVIRT_DEFAULT_URI'):
             log('Upload ISO to pool')
-            self.iso_file = self.dha.upload_iso(self.iso_file)
+            self.iso_file = self.dha.upload_iso(self.fuel_node_id, self.iso_file)
         else:
             log('Zero the MBR')
             self.dha.node_zero_mbr(self.fuel_node_id)
diff --git a/deploy/scenario/ha_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_heat_ceilometer_scenario.yaml
index 4051c47..78fa80d 100644
--- a/deploy/scenario/ha_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/ha_heat_ceilometer_scenario.yaml
@@ -58,22 +58,23 @@ dha-override-config:
   nodes:
   - id: 1
     libvirtName: controller1
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 2
     libvirtName: controller2
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 3
     libvirtName: controller3
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 4
     libvirtName: compute1
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 5
     libvirtName: compute2
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 6
     libvirtName: fuel-master
-    libvirtTemplate: templates/virtual_environment/vms/fuel.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
     isFuel: yes
     username: root
     password: r00tme
diff --git a/deploy/scenario/ha_nfv-kvm_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_nfv-kvm_heat_ceilometer_scenario.yaml
index 1217f72..bcdda61 100644
--- a/deploy/scenario/ha_nfv-kvm_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/ha_nfv-kvm_heat_ceilometer_scenario.yaml
@@ -145,22 +145,23 @@ dha-override-config:
   nodes:
   - id: 1
     libvirtName: controller1
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 2
     libvirtName: controller2
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 3
     libvirtName: controller3
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 4
     libvirtName: compute1
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 5
     libvirtName: compute2
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 6
     libvirtName: fuel-master
-    libvirtTemplate: templates/virtual_environment/vms/fuel.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
     isFuel: yes
     username: root
     password: r00tme
diff --git a/deploy/scenario/ha_nfv-ovs_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_nfv-ovs_heat_ceilometer_scenario.yaml
index 51deb4e..bee2d1a 100644
--- a/deploy/scenario/ha_nfv-ovs_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/ha_nfv-ovs_heat_ceilometer_scenario.yaml
@@ -107,22 +107,23 @@ dha-override-config:
   nodes:
   - id: 1
     libvirtName: controller1
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 2
     libvirtName: controller2
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 3
     libvirtName: controller3
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 4
     libvirtName: compute1
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 5
     libvirtName: compute2
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 6
     libvirtName: fuel-master
-    libvirtTemplate: templates/virtual_environment/vms/fuel.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
     isFuel: yes
     username: root
     password: r00tme
diff --git a/deploy/scenario/ha_odl-bgpvpn_scenario.yaml b/deploy/scenario/ha_odl-bgpvpn_scenario.yaml
index 7d52e77..46efc4b 100644
--- a/deploy/scenario/ha_odl-bgpvpn_scenario.yaml
+++ b/deploy/scenario/ha_odl-bgpvpn_scenario.yaml
@@ -77,22 +77,23 @@ dha-override-config:
   nodes:
   - id: 1
     libvirtName: controller1
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 2
     libvirtName: controller2
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 3
     libvirtName: controller3
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 4
     libvirtName: compute1
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 5
     libvirtName: compute2
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 6
     libvirtName: fuel-master
-    libvirtTemplate: templates/virtual_environment/vms/fuel.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
     isFuel: yes
     username: root
     password: r00tme
diff --git a/deploy/scenario/ha_odl-l2_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_odl-l2_heat_ceilometer_scenario.yaml
index 90c89ae..50dde30 100644
--- a/deploy/scenario/ha_odl-l2_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/ha_odl-l2_heat_ceilometer_scenario.yaml
@@ -77,22 +77,23 @@ dha-override-config:
   nodes:
   - id: 1
     libvirtName: controller1
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 2
     libvirtName: controller2
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 3
     libvirtName: controller3
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 4
     libvirtName: compute1
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 5
     libvirtName: compute2
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 6
     libvirtName: fuel-master
-    libvirtTemplate: templates/virtual_environment/vms/fuel.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
     isFuel: yes
     username: root
     password: r00tme
diff --git a/deploy/scenario/ha_odl-l2_sfc_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_odl-l2_sfc_heat_ceilometer_scenario.yaml
index c478948..e20ec1a 100644
--- a/deploy/scenario/ha_odl-l2_sfc_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/ha_odl-l2_sfc_heat_ceilometer_scenario.yaml
@@ -95,22 +95,23 @@ dha-override-config:
   nodes:
   - id: 1
     libvirtName: controller1
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 2
     libvirtName: controller2
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 3
     libvirtName: controller3
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 4
     libvirtName: compute1
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 5
     libvirtName: compute2
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 6
     libvirtName: fuel-master
-    libvirtTemplate: templates/virtual_environment/vms/fuel.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
     isFuel: yes
     username: root
     password: r00tme
diff --git a/deploy/scenario/ha_odl-l3_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_odl-l3_heat_ceilometer_scenario.yaml
index 967e7d2..322dd27 100644
--- a/deploy/scenario/ha_odl-l3_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/ha_odl-l3_heat_ceilometer_scenario.yaml
@@ -93,22 +93,23 @@ dha-override-config:
   nodes:
   - id: 1
     libvirtName: controller1
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 2
     libvirtName: controller2
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 3
     libvirtName: controller3
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 4
     libvirtName: compute1
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 5
     libvirtName: compute2
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 6
     libvirtName: fuel-master
-    libvirtTemplate: templates/virtual_environment/vms/fuel.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
     isFuel: yes
     username: root
     password: r00tme
diff --git a/deploy/scenario/ha_onos_nofeature_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_onos_nofeature_heat_ceilometer_scenario.yaml
index f813458..88b8f6b 100644
--- a/deploy/scenario/ha_onos_nofeature_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/ha_onos_nofeature_heat_ceilometer_scenario.yaml
@@ -88,22 +88,23 @@ dha-override-config:
   nodes:
   - id: 1
     libvirtName: controller1
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 2
     libvirtName: controller2
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 3
     libvirtName: controller3
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 4
     libvirtName: compute1
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 5
     libvirtName: compute2
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 6
     libvirtName: fuel-master
-    libvirtTemplate: templates/virtual_environment/vms/fuel.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
     isFuel: yes
     username: root
     password: r00tme
diff --git a/deploy/scenario/ha_onos_sfc_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_onos_sfc_heat_ceilometer_scenario.yaml
index 32fbfcf..c390172 100644
--- a/deploy/scenario/ha_onos_sfc_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/ha_onos_sfc_heat_ceilometer_scenario.yaml
@@ -68,22 +68,23 @@ dha-override-config:
   nodes:
   - id: 1
     libvirtName: controller1
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 2
     libvirtName: controller2
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 3
     libvirtName: controller3
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 4
     libvirtName: compute1
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 5
     libvirtName: compute2
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 6
     libvirtName: fuel-master
-    libvirtTemplate: templates/virtual_environment/vms/fuel.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
     isFuel: yes
     username: root
     password: r00tme
diff --git a/deploy/scenario/ha_vlan_heat_ceilometer_scenario.yaml b/deploy/scenario/ha_vlan_heat_ceilometer_scenario.yaml
index d1d5191..65b8b20 100644
--- a/deploy/scenario/ha_vlan_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/ha_vlan_heat_ceilometer_scenario.yaml
@@ -102,22 +102,23 @@ dha-override-config:
   nodes:
   - id: 1
     libvirtName: controller1
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 2
     libvirtName: controller2
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 3
     libvirtName: controller3
-    libvirtTemplate: templates/virtual_environment/vms/controller.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
   - id: 4
     libvirtName: compute1
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 5
     libvirtName: compute2
-    libvirtTemplate: templates/virtual_environment/vms/compute.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
   - id: 6
     libvirtName: fuel-master
-    libvirtTemplate: templates/virtual_environment/vms/fuel.xml
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
     isFuel: yes
     username: root
     password: r00tme
diff --git a/deploy/scenario/no-ha_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_heat_ceilometer_scenario.yaml
index 3dd5f84..d738154 100644
--- a/deploy/scenario/no-ha_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/no-ha_heat_ceilometer_scenario.yaml
@@ -41,17 +41,42 @@ dea-override-config:
   - id: 1
     interfaces: interfaces_1
     role: mongo,controller,congress
+    transformations: transformations_1
   - id: 2
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 3
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 4
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
 
 dha-override-config:
+ nodes:
+  - id: 1
+    libvirtName: controller1
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
+  - id: 2
+    libvirtName: compute1
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 3
+    libvirtName: compute2
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 4
+    libvirtName: compute3
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 5
+    libvirtName: fuel-master
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
+    isFuel: yes
+    username: root
+    password: r00tme
+
 #  disks:
 #    contrail: 500G
 
diff --git a/deploy/scenario/no-ha_nfv-kvm_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_nfv-kvm_heat_ceilometer_scenario.yaml
index 4661a26..7ade095 100644
--- a/deploy/scenario/no-ha_nfv-kvm_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/no-ha_nfv-kvm_heat_ceilometer_scenario.yaml
@@ -48,15 +48,19 @@ dea-override-config:
   - id: 1
     interfaces: interfaces_1
     role: mongo,controller
+    transformations: transformations_1
   - id: 2
     interfaces: interfaces_1
     role: ceph-osd
+    transformations: transformations_2
   - id: 3
     interfaces: interfaces_1
     role: compute
+    transformations: transformations_2
   - id: 4
     interfaces: interfaces_1
     role: compute
+    transformations: transformations_2
 
   settings:
     editable:
@@ -141,6 +145,27 @@ dea-override-config:
           weight: 10
 
 dha-override-config:
+ nodes:
+  - id: 1
+    libvirtName: controller1
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
+  - id: 2
+    libvirtName: compute1
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 3
+    libvirtName: compute2
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 4
+    libvirtName: compute3
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 5
+    libvirtName: fuel-master
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
+    isFuel: yes
+    username: root
+    password: r00tme
+
 #  disks:
 #    contrail: 500G
 
diff --git a/deploy/scenario/no-ha_nfv-kvm_nfv-ovs_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_nfv-kvm_nfv-ovs_heat_ceilometer_scenario.yaml
index 87364e8..a3f0864 100644
--- a/deploy/scenario/no-ha_nfv-kvm_nfv-ovs_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/no-ha_nfv-kvm_nfv-ovs_heat_ceilometer_scenario.yaml
@@ -55,15 +55,19 @@ dea-override-config:
   - id: 1
     interfaces: interfaces_1
     role: mongo,controller
+    transformations: transformations_1
   - id: 2
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 3
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 4
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   settings:
     editable:
       additional_components:
@@ -104,6 +108,27 @@ dea-override-config:
           weight: 30
 
 dha-override-config:
+ nodes:
+  - id: 1
+    libvirtName: controller1
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
+  - id: 2
+    libvirtName: compute1
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 3
+    libvirtName: compute2
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 4
+    libvirtName: compute3
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 5
+    libvirtName: fuel-master
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
+    isFuel: yes
+    username: root
+    password: r00tme
+
 #  disks:
 #    contrail: 500G
 
diff --git a/deploy/scenario/no-ha_nfv-ovs_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_nfv-ovs_heat_ceilometer_scenario.yaml
index 7ab76cb..f4e0adc 100644
--- a/deploy/scenario/no-ha_nfv-ovs_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/no-ha_nfv-ovs_heat_ceilometer_scenario.yaml
@@ -56,19 +56,22 @@ dea-override-config:
   - id: 1
     interfaces: interfaces_vlan
     role: mongo,controller
+    transformations: transformations_1
   - id: 2
     interfaces: interfaces_dpdk
     role: ceph-osd,compute
     attributes: attributes_1
+    transformations: transformations_2
   - id: 3
     interfaces: interfaces_dpdk
     role: ceph-osd,compute
     attributes: attributes_1
+    transformations: transformations_2
   - id: 4
     interfaces: interfaces_dpdk
     role: ceph-osd,compute
     attributes: attributes_1
-
+    transformations: transformations_2
   attributes_1:
     hugepages:
       dpdk:
@@ -102,6 +105,27 @@ dea-override-config:
       vlan_start: null
 
 dha-override-config:
+ nodes:
+  - id: 1
+    libvirtName: controller1
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
+  - id: 2
+    libvirtName: compute1
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 3
+    libvirtName: compute2
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 4
+    libvirtName: compute3
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 5
+    libvirtName: fuel-master
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
+    isFuel: yes
+    username: root
+    password: r00tme
+
 #  disks:
 #    contrail: 500G
 
diff --git a/deploy/scenario/no-ha_odl-bgpvpn_scenario.yaml b/deploy/scenario/no-ha_odl-bgpvpn_scenario.yaml
index 6f21ea2..e92a741 100644
--- a/deploy/scenario/no-ha_odl-bgpvpn_scenario.yaml
+++ b/deploy/scenario/no-ha_odl-bgpvpn_scenario.yaml
@@ -60,22 +60,47 @@ dea-override-config:
   - id: 1
     interfaces: interfaces_1
     role: mongo,controller
+    transformations: transformations_1
   - id: 2
     interfaces: interfaces_1
     role: ceph-osd,opendaylight
+    transformations: transformations_2
   - id: 3
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 4
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   settings:
     editable:
       public_network_assignment:
         assign_to_all_nodes:
           value: true
 
 dha-override-config:
+ nodes:
+  - id: 1
+    libvirtName: controller1
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
+  - id: 2
+    libvirtName: compute1
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 3
+    libvirtName: compute2
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 4
+    libvirtName: compute3
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 5
+    libvirtName: fuel-master
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
+    isFuel: yes
+    username: root
+    password: r00tme
+
 #  disks:
 #    contrail: 500G
 
diff --git a/deploy/scenario/no-ha_odl-l2_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_odl-l2_heat_ceilometer_scenario.yaml
index f8787d7..1efa89a 100644
--- a/deploy/scenario/no-ha_odl-l2_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/no-ha_odl-l2_heat_ceilometer_scenario.yaml
@@ -61,17 +61,42 @@ dea-override-config:
   - id: 1
     interfaces: interfaces_1
     role: mongo,controller
+    transformations: transformations_1
   - id: 2
     interfaces: interfaces_1
     role: ceph-osd,opendaylight
+    transformations: transformations_2
   - id: 3
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 4
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
 
 dha-override-config:
+ nodes:
+  - id: 1
+    libvirtName: controller1
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
+  - id: 2
+    libvirtName: compute1
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 3
+    libvirtName: compute2
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 4
+    libvirtName: compute3
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 5
+    libvirtName: fuel-master
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
+    isFuel: yes
+    username: root
+    password: r00tme
+
 #  disks:
 #    contrail: 500G
 
diff --git a/deploy/scenario/no-ha_odl-l2_sfc_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_odl-l2_sfc_heat_ceilometer_scenario.yaml
index 90a45d5..b1fe773 100644
--- a/deploy/scenario/no-ha_odl-l2_sfc_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/no-ha_odl-l2_sfc_heat_ceilometer_scenario.yaml
@@ -80,17 +80,42 @@ dea-override-config:
   - id: 1
     interfaces: interfaces_1
     role: mongo,controller,tacker
+    transformations: transformations_1
   - id: 2
     interfaces: interfaces_1
     role: ceph-osd,opendaylight
+    transformations: transformations_2
   - id: 3
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 4
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
 
 dha-override-config:
+ nodes:
+  - id: 1
+    libvirtName: controller1
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
+  - id: 2
+    libvirtName: compute1
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 3
+    libvirtName: compute2
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 4
+    libvirtName: compute3
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 5
+    libvirtName: fuel-master
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
+    isFuel: yes
+    username: root
+    password: r00tme
+
 #  disks:
 #    contrail: 500G
 
diff --git a/deploy/scenario/no-ha_odl-l3_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_odl-l3_heat_ceilometer_scenario.yaml
index 0c8415f..b59a049 100644
--- a/deploy/scenario/no-ha_odl-l3_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/no-ha_odl-l3_heat_ceilometer_scenario.yaml
@@ -71,15 +71,19 @@ dea-override-config:
   - id: 1
     interfaces: interfaces_1
     role: mongo,controller
+    transformations: transformations_1
   - id: 2
     interfaces: interfaces_1
     role: ceph-osd,opendaylight
+    transformations: transformations_2
   - id: 3
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 4
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   settings:
     editable:
       public_network_assignment:
@@ -87,6 +91,27 @@ dea-override-config:
           value: true
 
 dha-override-config:
+ nodes:
+  - id: 1
+    libvirtName: controller1
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
+  - id: 2
+    libvirtName: compute1
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 3
+    libvirtName: compute2
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 4
+    libvirtName: compute3
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 5
+    libvirtName: fuel-master
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
+    isFuel: yes
+    username: root
+    password: r00tme
+
 #  disks:
 #    contrail: 500G
 
diff --git a/deploy/scenario/no-ha_onos_nofeature_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_onos_nofeature_heat_ceilometer_scenario.yaml
index f5c00f0..e51dd56 100644
--- a/deploy/scenario/no-ha_onos_nofeature_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/no-ha_onos_nofeature_heat_ceilometer_scenario.yaml
@@ -68,21 +68,47 @@ dea-override-config:
   - id: 1
     interfaces: interfaces_1
     role: mongo,controller,onos
+    transformations: transformations_1
   - id: 2
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 3
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 4
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   settings:
     editable:
       public_network_assignment:
         assign_to_all_nodes:
           value: true
+
 dha-override-config:
+ nodes:
+  - id: 1
+    libvirtName: controller1
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
+  - id: 2
+    libvirtName: compute1
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 3
+    libvirtName: compute2
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 4
+    libvirtName: compute3
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 5
+    libvirtName: fuel-master
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
+    isFuel: yes
+    username: root
+    password: r00tme
+
 #  disks:
 #    contrail: 500G
 
diff --git a/deploy/scenario/no-ha_onos_sfc_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_onos_sfc_heat_ceilometer_scenario.yaml
index 587346e..21a2be2 100644
--- a/deploy/scenario/no-ha_onos_sfc_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/no-ha_onos_sfc_heat_ceilometer_scenario.yaml
@@ -48,21 +48,46 @@ dea-override-config:
   - id: 1
     interfaces: interfaces_1
     role: mongo,controller,onos
+    transformations: transformations_1
   - id: 2
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 3
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 4
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   settings:
     editable:
       public_network_assignment:
         assign_to_all_nodes:
           value: true
 dha-override-config:
+ nodes:
+  - id: 1
+    libvirtName: controller1
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
+  - id: 2
+    libvirtName: compute1
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 3
+    libvirtName: compute2
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 4
+    libvirtName: compute3
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 5
+    libvirtName: fuel-master
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
+    isFuel: yes
+    username: root
+    password: r00tme
+
 #  disks:
 #    contrail: 500G
 
diff --git a/deploy/scenario/no-ha_vlan_heat_ceilometer_scenario.yaml b/deploy/scenario/no-ha_vlan_heat_ceilometer_scenario.yaml
index 567ea98..ada5b7e 100644
--- a/deploy/scenario/no-ha_vlan_heat_ceilometer_scenario.yaml
+++ b/deploy/scenario/no-ha_vlan_heat_ceilometer_scenario.yaml
@@ -45,15 +45,19 @@ dea-override-config:
   - id: 1
     interfaces: interfaces_1
     role: mongo,controller
+    transformations: transformations_1
   - id: 2
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 3
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   - id: 4
     interfaces: interfaces_1
     role: ceph-osd,compute
+    transformations: transformations_2
   settings:
     editable:
       additional_components:
@@ -94,6 +98,27 @@ dea-override-config:
           weight: 30
 
 dha-override-config:
+ nodes:
+  - id: 1
+    libvirtName: controller1
+    libvirtTemplate: templates/arm/virtual_environment/vms/controller.xml
+  - id: 2
+    libvirtName: compute1
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 3
+    libvirtName: compute2
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 4
+    libvirtName: compute3
+    libvirtTemplate: templates/arm/virtual_environment/vms/compute.xml
+  - id: 5
+    libvirtName: fuel-master
+    libvirtTemplate: templates/arm/virtual_environment/vms/fuel.xml
+    libvirtUri: qemu+ssh://jenkins@10.0.2.5/system
+    isFuel: yes
+    username: root
+    password: r00tme
+
 # These overrides only take effect for virtual deployment scenarios
 
 ##############################################################################
diff --git a/deploy/templates/arm/virtual_environment/networks/.gitkeep b/deploy/templates/arm/virtual_environment/networks/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/deploy/templates/arm/virtual_environment/vms/compute.xml b/deploy/templates/arm/virtual_environment/vms/compute.xml
new file mode 100644
index 0000000..db3ba29
--- /dev/null
+++ b/deploy/templates/arm/virtual_environment/vms/compute.xml
@@ -0,0 +1,57 @@
+<domain type='kvm'>
+  <name>compute</name>
+  <memory unit='KiB'>8392704</memory>
+  <currentMemory unit='KiB'>8392704</currentMemory>
+  <vcpu placement='static'>6</vcpu>
+  <os>
+    <type arch='aarch64' machine='virt-2.6'>hvm</type>
+    <loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>
+  </os>
+  <features>
+    <gic version='3'/>
+  </features>
+  <cpu mode='host-model'>
+    <model fallback='allow'/>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>restart</on_crash>
+  <devices>
+    <emulator>/usr/bin/kvm</emulator>
+    <disk type='file' device='disk'>
+      <driver name='qemu' type='raw' cache='none' io='native'/>
+      <source file='disk.raw'/>
+      <target dev='vda' bus='virtio'/>
+      <boot order='2'/>
+      <address type='virtio-mmio'/>
+    </disk>
+    <controller type='scsi' index='0' model='virtio-scsi'>
+      <address type='virtio-mmio'/>
+    </controller>
+    <controller type='pci' index='0' model='pcie-root'/>
+    <interface type='bridge'>
+      <source bridge='admin8_br'/>
+      <model type='virtio'/>
+      <boot order='1'/>
+      <address type='virtio-mmio'/>
+    </interface>
+    <interface type='bridge'>
+      <source bridge='public8_br'/>
+      <model type='virtio'/>
+      <address type='virtio-mmio'/>
+    </interface>
+    <interface type='bridge'>
+      <source bridge='trunk8_br'/>
+      <model type='virtio'/>
+      <address type='virtio-mmio'/>
+    </interface>
+    <serial type='pty'>
+      <target port='0'/>
+    </serial>
+    <console type='pty'>
+      <target type='serial' port='0'/>
+    </console>
+  </devices>
+</domain>
+
diff --git a/deploy/templates/arm/virtual_environment/vms/controller.xml b/deploy/templates/arm/virtual_environment/vms/controller.xml
new file mode 100644
index 0000000..6bd0385
--- /dev/null
+++ b/deploy/templates/arm/virtual_environment/vms/controller.xml
@@ -0,0 +1,57 @@
+<domain type='kvm'>
+  <name>controller</name>
+  <memory unit='KiB'>8392704</memory>
+  <currentMemory unit='KiB'>8392704</currentMemory>
+  <vcpu placement='static'>6</vcpu>
+  <os>
+    <type arch='aarch64' machine='virt-2.6'>hvm</type>
+    <loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>
+  </os>
+  <features>
+    <gic version='3'/>
+  </features>
+  <cpu mode='host-model'>
+    <model fallback='allow'/>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>restart</on_crash>
+  <devices>
+    <emulator>/usr/bin/kvm</emulator>
+    <disk type='file' device='disk'>
+      <driver name='qemu' type='raw' cache='none' io='native'/>
+      <source file='disk.raw'/>
+      <target dev='vda' bus='virtio'/>
+      <boot order='2'/>
+      <address type='virtio-mmio'/>
+    </disk>
+    <controller type='scsi' index='0' model='virtio-scsi'>
+      <address type='virtio-mmio'/>
+    </controller>
+    <controller type='pci' index='0' model='pcie-root'/>
+    <interface type='bridge'>
+      <source bridge='admin8_br'/>
+      <model type='virtio'/>
+      <boot order='1'/>
+      <address type='virtio-mmio'/>
+    </interface>
+    <interface type='bridge'>
+      <source bridge='public8_br'/>
+      <model type='virtio'/>
+      <address type='virtio-mmio'/>
+    </interface>
+    <interface type='bridge'>
+      <source bridge='trunk8_br'/>
+      <model type='virtio'/>
+      <address type='virtio-mmio'/>
+    </interface>
+    <serial type='pty'>
+      <target port='0'/>
+    </serial>
+    <console type='pty'>
+      <target type='serial' port='0'/>
+    </console>
+  </devices>
+</domain>
+
diff --git a/deploy/templates/arm/virtual_environment/vms/fuel.xml b/deploy/templates/arm/virtual_environment/vms/fuel.xml
new file mode 100644
index 0000000..ad7c67f
--- /dev/null
+++ b/deploy/templates/arm/virtual_environment/vms/fuel.xml
@@ -0,0 +1,99 @@
+<domain type='kvm'>
+  <name>fuel</name>
+  <memory unit='KiB'>8290304</memory>
+  <currentMemory unit='KiB'>8290304</currentMemory>
+  <vcpu placement='static'>4</vcpu>
+  <resource>
+    <partition>/machine</partition>
+  </resource>
+  <os>
+    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
+    <boot dev='hd'/>
+    <boot dev='cdrom'/>
+    <bootmenu enable='no'/>
+  </os>
+  <features>
+    <acpi/>
+    <apic/>
+    <pae/>
+  </features>
+  <cpu mode='host-model'>
+    <model fallback='allow'/>
+  </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/libexec/qemu-kvm</emulator>
+    <disk type='block' device='cdrom'>
+      <driver name='qemu' type='raw'/>
+      <target dev='hdc' bus='ide'/>
+      <readonly/>
+    </disk>
+    <disk type='file' device='disk'>
+      <driver name='qemu' type='raw' cache='none' io='native'/>
+      <source file='disk.raw'/>
+      <target dev='vda' bus='virtio'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
+    </disk>
+    <controller type='usb' index='0' model='ich9-ehci1'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x7'/>
+    </controller>
+    <controller type='usb' index='0' model='ich9-uhci1'>
+      <master startport='0'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0' multifunction='on'/>
+    </controller>
+    <controller type='usb' index='0' model='ich9-uhci2'>
+      <master startport='2'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x1'/>
+    </controller>
+    <controller type='usb' index='0' model='ich9-uhci3'>
+      <master startport='4'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x2'/>
+    </controller>
+    <controller type='pci' index='0' model='pci-root'/>
+    <controller type='ide' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+    </controller>
+    <controller type='virtio-serial' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
+    </controller>
+    <interface type='bridge'>
+      <source bridge='admin8_br0'/>
+      <model type='virtio'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+    </interface>
+    <interface type='bridge'>
+      <source bridge='public8_br0'/>
+      <model type='virtio'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+    </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'>
+      <listen type='address' address='127.0.0.1'/>
+    </graphics>
+    <video>
+      <model type='vga' vram='16384' heads='1'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+    </video>
+    <memballoon model='virtio'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
+    </memballoon>
+  </devices>
+</domain>