aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--patches/opnfv-fuel/upstream-backports/0004-Fuel-rework-for-multiple-libvirt.patch938
1 files changed, 938 insertions, 0 deletions
diff --git a/patches/opnfv-fuel/upstream-backports/0004-Fuel-rework-for-multiple-libvirt.patch b/patches/opnfv-fuel/upstream-backports/0004-Fuel-rework-for-multiple-libvirt.patch
new file mode 100644
index 00000000..110ee587
--- /dev/null
+++ b/patches/opnfv-fuel/upstream-backports/0004-Fuel-rework-for-multiple-libvirt.patch
@@ -0,0 +1,938 @@
+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)
+
+Signed-off-by: cristinapauna <cristina.pauna@enea.com>
+---
+ deploy/dha_adapters/hardware_adapter.py | 5 ++
+ deploy/dha_adapters/libvirt_adapter.py | 36 ++++----
+ 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 +--
+ .../arm/virtual_environment/vms/compute.xml | 57 ++++++++++++
+ .../arm/virtual_environment/vms/controller.xml | 57 ++++++++++++
+ .../templates/arm/virtual_environment/vms/fuel.xml | 100 +++++++++++++++++++++
+ 19 files changed, 380 insertions(+), 93 deletions(-)
+ 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..0a7c2fc 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:
+@@ -115,19 +115,19 @@ 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)
++ 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))
++ 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:
+@@ -137,7 +137,7 @@ class LibvirtAdapter(HardwareAdapter):
+ return mac_list
+
+ def get_name_of_device(self, vm_name, device_type):
+- 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:
+@@ -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..bf5dc69 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..0d52994 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 efe38c8..ccc18d3 100644
+--- a/deploy/install_fuel_master.py
++++ b/deploy/install_fuel_master.py
+@@ -56,7 +56,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/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..34d251b
+--- /dev/null
++++ b/deploy/templates/arm/virtual_environment/vms/fuel.xml
+@@ -0,0 +1,100 @@
++<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>
++
++