[config tool][doc]: remove old configurator

remove configurator in misc/config_tools/config_app, since
there is new configurator in misc/config_tools/configurator.
remove related document.

Tracked-On: #7466

Signed-off-by: hangliu1 <hang1.liu@linux.intel.com>
This commit is contained in:
hangliu1 2022-05-12 01:27:24 -04:00 committed by acrnsi-robot
parent a65a347f34
commit 3afb222d90
12 changed files with 0 additions and 4437 deletions

View File

@ -39,7 +39,6 @@ Configuration Tutorials
tutorials/acrn_configuration_tool
tutorials/board_inspector_tool
tutorials/acrn_configurator_tool
tutorials/upgrading_configuration
reference/config-options
reference/config-options-launch

View File

@ -1,226 +0,0 @@
.. _acrn_configurator_tool:
ACRN Configurator Tool
######################
This guide describes all features and uses of the tool.
About the ACRN Configurator Tool
*********************************
The ACRN Configurator tool ``acrn_configurator.py`` provides a web-based
user interface to help you customize your
:ref:`ACRN configuration <acrn_configuration_tool>`. Capabilities:
- reads board information from the specified board configuration file
- provides a GUI to help you configure and validate scenario and
launch configuration files
- generates launch scripts for the specified post-launched User VMs
- dynamically creates a new scenario configuration and adds or deletes VM
settings in it
- dynamically creates a new launch configuration and adds or deletes User VM
settings in it
The tool guides you to configure ACRN in a particular order, due to
dependencies among the different types of configuration files. Here's an
overview of what to expect:
#. Import the board configuration file that you generated via the
:ref:`Board Inspector tool <board_inspector_tool>`.
#. Customize your scenario configuration file by defining hypervisor and
VM settings that will be used to build the ACRN hypervisor.
#. If your scenario has post-launched User VMs, customize launch scripts
that the Service VM will use to create the VMs
and allocate resources to them dynamically at runtime.
Customizing launch scripts involves these steps:
a. Configure settings for all post-launched User VMs in your scenario
and save the configuration in a launch configuration file.
#. Generate the launch scripts. The ACRN Configurator creates one
launch script for each VM defined in the launch configuration file.
Generate a Scenario Configuration File and Launch Scripts
*********************************************************
The following steps describe all options in the ACRN Configurator for generating
a custom scenario configuration file and launch scripts.
#. Make sure the development computer is set up and ready to launch the ACRN
Configurator, according to :ref:`gsg-dev-setup` in the Getting Started Guide.
#. Launch the ACRN Configurator. This example assumes the tool is in the
``~/acrn-work/`` directory. Feel free to modify the command as needed.
.. code-block:: bash
~/acrn-work/acrn-hypervisor/misc/config_tools/config_app/acrn_configurator.py
#. Your web browser should open the website `<http://127.0.0.1:5001/>`_
automatically, or you may need to visit this website manually. The ACRN
Configurator is supported on Chrome and Firefox.
#. Click the **Import Board XML** button and browse to the board
configuration file that you generated via the
:ref:`Board Inspector <board_inspector_tool>`. After the file is uploaded,
make sure the board name is selected in the **Board info** drop-down list
and the board information appears.
#. Start the scenario configuration process by selecting an option from the
**Scenario Settings** menu on the top banner of the UI or by importing a
scenario configuration file via the **Import XML** button. The four options
are described below:
* Click **Create a new scenario** from the **Scenario Settings** menu to
dynamically create a new scenario configuration for the current board.
* Click **Load a default scenario** from the **Scenario Settings** menu to
select a :ref:`predefined scenario configuration <usage-scenarios>`.
* Click the **Scenario Settings** menu and select a scenario from the list
under **scenario setting list**.
.. image:: images/choose_scenario.png
:align: center
:class: drop-shadow
* Click the **Import XML** button to import a customized scenario
configuration file.
The file must be one that was written for the current board. Any mismatch
in the board name and the one found in the scenario configuration file you
are trying to import will lead to an error message.
#. When the scenario configuration file is available for editing, the
configurable items appear below the **Scenario Setting** row. You may
need to scroll down to see them. Example:
.. image:: images/configure_scenario.png
:align: center
:class: drop-shadow
* You can edit these items directly in the text boxes, or you can choose
single or even multiple items from the drop-down list.
* Read-only items are marked as gray.
* Hover the mouse cursor over the item to see the description.
#. Add or delete VMs:
* Click **Add a VM below** in a VM's settings, and then select a VM type
to add a new VM under the current VM.
* Click **Remove this VM** in a VM's settings to remove the VM from the
scenario.
When a VM is added or removed, the ACRN Configurator reassigns the VM IDs for
the remaining VMs by the order of pre-launched User VMs, Service VM, and
post-launched User VMs.
.. image:: images/configure_vm_add.png
:align: center
:class: drop-shadow
#. Click **Export XML** to save the scenario configuration file. A dialog box
appears, enabling you to save the file to a specific folder by inputting the
absolute path to this folder. If you don't specify a path, the file will be
saved to the default folder: ``acrn-hypervisor/../user_config/<board name>``.
Before saving the scenario configuration file, the Configurator validates
the configurable items. If errors exist, the Configurator lists all
incorrectly configured items and shows the errors. Example:
.. image:: images/err_acrn_configuration.png
:align: center
:class: drop-shadow
After the scenario is saved, the page automatically displays the saved
scenario configuration file.
#. To delete a scenario configuration file, click **Export XML** > **Remove**.
The Configurator will delete the loaded file, even if you change the name of
the file in the dialog box.
#. If your scenario has post-launched User VMs, continue to the next step
to create launch scripts for those VMs. If your scenario doesn't have
post-launched User VMs, you can skip to the final step to close the tool.
#. Start the launch script configuration process by
selecting an option from the **Launch Settings** menu on the top banner of
the UI or by importing a launch configuration file via the **Import XML**
button. The four options are described below:
* Click **Create a new launch script** from the **Launch Settings** menu to
dynamically create a new launch configuration for the current board.
* Click **Load a default launch script** from the **Launch Settings** menu to
select a predefined launch configuration.
* Click the **Launch Settings** menu and select a launch configuration
from the list under **launch setting list**.
.. image:: images/choose_launch.png
:align: center
:class: drop-shadow
* Click the **Import XML** button to import a customized launch
configuration file.
#. Select a scenario for the current launch configuration from the
**Select Scenario** drop-down box.
#. When the launch configuration file is available for editing, the
configurable items appear below the **Launch Setting** row. You may need
to scroll down to see them. Example:
.. image:: images/configure_launch.png
:align: center
:class: drop-shadow
* You can edit these items directly in the text boxes, or you can choose
single or even multiple items from the drop-down list.
* Read-only items are marked as gray.
* Hover the mouse cursor over the item to see the description.
#. Add or remove User VM launch scripts:
* Click **Configure a User VM below** to add a User VM launch script.
* Click **Remove this VM** to remove a User VM launch script.
.. image:: images/configure_launch_add.png
:align: center
:class: drop-shadow
#. Click **Export XML** to save the launch configuration file. A dialog box
appears, enabling you to save the file to a specific folder by inputting the
absolute path to this folder. If you don't specify a path, the file will
be saved to the default folder:
``acrn-hypervisor/../user_config/<board name>``.
Before saving the launch configuration file, the Configurator validates the
configurable items. If errors exist, the Configurator lists all incorrectly
configured items and shows the errors.
#. To delete a launch configuration file, click **Export XML** > **Remove**.
The Configurator will delete the loaded file, even if you change the name of
the file in the dialog box.
#. Click **Generate Launch Script** to save the current launch configuration
and then generate a launch script for each VM defined in the launch
configuration.
.. image:: images/generate_launch_script.png
:align: center
:class: drop-shadow
#. Confirm that the launch scripts appear in the
``<board name>/output`` directory.
#. When you are done using the tool, close the browser and press
:kbd:`CTRL` + :kbd:`C` to terminate the
``acrn_configurator.py`` program running in the terminal window.

View File

@ -1,45 +0,0 @@
#!/usr/bin/env python3
# Copyright (C) 2019 Intel Corporation.
# SPDX-License-Identifier: BSD-3-Clause
"""Entry for config app.
"""
import os
import sys
import threading
import webbrowser
# flask: Copyright 2010 Pallets
# SPDX-License-Identifier: BSD-3-Clause
# Refer to https://github.com/pallets/flask/blob/master/LICENSE.rst for the permission notice.
from flask import Flask
# flask: Copyright (c) 2013, Marc Brinkmann
# SPDX-License-Identifier: BSD-3-Clause
# Refer to https://pypi.org/project/Flask-Bootstrap/ for the permission notice.
from flask_bootstrap import Bootstrap
import configs
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..'))
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'library'))
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..',
'board_config'))
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..',
'scenario_config'))
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..',
'launch_config'))
from views import CONFIG_APP
APP = Flask(__name__)
APP.config.from_object(configs)
APP.register_blueprint(CONFIG_APP)
APP.jinja_env.add_extension('jinja2.ext.do')
Bootstrap(app=APP)
if __name__ == '__main__':
URL = "http://127.0.0.1:5001/scenario"
threading.Timer(1, lambda: webbrowser.open(URL)).start()
APP.run(port=5001, debug=False)

View File

@ -1,18 +0,0 @@
# Copyright (C) 2019 Intel Corporation.
# SPDX-License-Identifier: BSD-3-Clause
"""Configurations for config app.
"""
import os
BOARD_INFO = None
BOARD_TYPE = None
SCENARIO = None
LAUNCH = None
DEFAULT_CONFIG_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data')
CONFIG_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..', '..', '..', 'user_config')
if not os.path.isdir(CONFIG_PATH):
os.makedirs(CONFIG_PATH)

View File

@ -1,515 +0,0 @@
# Copyright (C) 2019 Intel Corporation.
# SPDX-License-Identifier: BSD-3-Clause
"""Controller for config app.
"""
import os
from xmlschema import XMLSchema11
from xmlschema.validators import Xsd11Element, XsdSimpleType, XsdAtomicBuiltin, Xsd11ComplexType, Xsd11Group, Xsd11Attribute
import lxml.etree as etree
class XmlConfig:
"""The core class to analyze and modify acrn config xml files"""
def __init__(self, path=None, default=True):
self._xml_path = path
self._default = default
self._curr_xml = None
self._curr_xml_tree = None
@staticmethod
def _get_xml_type(xml_file):
"""
get the config type by file.
:param xml_file: the file path of xml file.
:return: the xml type.
:raises: ValueError, OSError, SyntaxError.
"""
xml_type = ''
if os.path.splitext(xml_file)[1] != '.xml':
return xml_type
try:
tree = etree.parse(xml_file)
root = tree.getroot()
if 'user_vm_launcher' in root.attrib:
xml_type = 'user_vm_launcher'
elif 'scenario' in root.attrib:
xml_type = 'scenario'
elif 'board' in root.attrib:
xml_type = 'board'
elif 'board_setting' in root.attrib:
xml_type = 'board_setting'
except ValueError:
print('xml parse error: {}'.format(xml_file))
xml_type = ''
except OSError:
print('xml open error: {}'.format(xml_file))
xml_type = ''
except SyntaxError:
print('xml syntax error: {}'.format(xml_file))
xml_type = ''
return xml_type
def list_all(self, xml_type=None):
"""
list all xml config files by type.
:param xml_type: the xml type.
:return: he list of xml config files.
"""
xmls = []
user_xmls = []
if self._xml_path is None or not os.path.exists(self._xml_path):
return xmls, user_xmls
for test_file in os.listdir(self._xml_path):
test_file_path = os.path.join(self._xml_path, test_file)
if os.path.isfile(test_file_path):
if XmlConfig._get_xml_type(test_file_path) == xml_type:
xmls.append(os.path.splitext(test_file)[0])
user_path = os.path.join(self._xml_path, 'user_defined')
if os.path.isdir(user_path):
for test_file in os.listdir(user_path):
test_file_path = os.path.join(user_path, test_file)
if os.path.isfile(test_file_path):
if XmlConfig._get_xml_type(test_file_path) == xml_type:
user_xmls.append(os.path.splitext(test_file)[0])
return xmls, user_xmls
def set_curr(self, xml):
"""
set current xml file to analyze.
:param xml: the xml file.
:return: None.
:raises: ValueError, OSError, SyntaxError.
"""
if self._xml_path is None or xml is None:
return
try:
self._curr_xml = xml
xml_path = os.path.join(self._xml_path, self._curr_xml + '.xml') \
if self._default \
else os.path.join(self._xml_path, 'user_defined', self._curr_xml + '.xml')
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse(xml_path, parser)
self._curr_xml_tree = tree
except ValueError:
print('xml parse error: {}'.format(xml))
self._curr_xml = None
self._curr_xml_tree = None
except OSError:
print('xml open error: {}'.format(xml))
self._curr_xml = None
self._curr_xml_tree = None
except SyntaxError:
print('xml syntax error: {}'.format(xml))
self._curr_xml = None
self._curr_xml_tree = None
def get_curr(self):
"""
get current xml config file.
:return: current xml config file name.
"""
return self._curr_xml
def get_curr_root(self):
"""
get the xml root of current xml config file.
:return: the xml root of current xml config file.
"""
if self._curr_xml_tree is None:
return None
return self._curr_xml_tree.getroot()
def get_curr_value(self, *args):
"""
get the value of the element by its path.
:param args: the path of the element.
:return: the value of the element.
"""
if self._curr_xml_tree is None:
return None
dest_node = self._get_dest_node(*args)
if dest_node is None:
return None
if dest_node.text is None or dest_node.text.strip() == '':
return ''
return dest_node.text
def set_curr_value(self, value, *args):
"""
set the value of the element by its path.
:param value: the value of the element.
:param args: the path of the element.
:return: None.
"""
if self._curr_xml_tree is None:
return
dest_node = self._get_dest_node(*args)
dest_node.text = value
def set_curr_list(self, values, *args):
"""
set a list of sub element for the element by its path.
:param values: the list of values of the element.
:param args: the path of the element.
:return: None.
"""
if self._curr_xml_tree is None:
return
tag = args[-1]
args = args[:-1]
dest_node = self._get_dest_node(*args)
new_node_desc = None
for node in list(dest_node):
if node.tag == tag:
if 'desc' in node.attrib:
new_node_desc = node.attrib['desc']
dest_node.remove(node)
for value in values:
new_node = etree.SubElement(dest_node, tag)
new_node.text = value
if new_node_desc is not None:
new_node.attrib['desc'] = new_node_desc
def set_curr_attr(self, attr_name, attr_value, *args):
"""
set the attribute of the element by its path.
:param attr_name: the attribute name of the element.
:param attr_value: the attribute value of the element.
:param args: the path of the element.
:return: None.
"""
if self._curr_xml_tree is None:
return
dest_node = self._get_dest_node(*args)
dest_node.attrib[attr_name] = attr_value
def add_curr_value(self, key, desc, value, *args):
"""
add a sub element for the element by its path.
:param key: the tag of the sub element.
:param desc: the attribute desc of the sub element.
:param value: the value of the sub element.
:param args: the path of the element.
:return: None.
"""
if self._curr_xml_tree is None:
return
dest_node = self._get_dest_node(*args)
if key in ['vm']:
etree.SubElement(dest_node, key, attrib={'id': value, 'desc': desc})
else:
new_node = etree.SubElement(dest_node, key, attrib={'desc': desc})
new_node.text = value
def get_curr_elem(self, *args):
"""
get elements for current path.
:param args: the path of the element.
:return: current element.
"""
if self._curr_xml_tree is None:
return
dest_node = self._get_dest_node(*args)
return dest_node
def clone_curr_elem(self, elem, *args):
"""
clone elements for current path.
:param elem: the element to clone.
:param args: the path of the element.
:return: None.
"""
if self._curr_xml_tree is None:
return
dest_node = self._get_dest_node(*args)
dest_node.append(elem)
def insert_curr_elem(self, index, elem, *args):
"""
insert elements for current path.
:param index: the location for the element to insert.
:param elem: the element to insert.
:param args: the path of the element.
:return: None.
"""
if self._curr_xml_tree is None:
return
dest_node = self._get_dest_node(*args)
dest_node.insert(index, elem)
def delete_curr_elem(self, *args):
"""
delete the element by its path.
:param args: the path of the element.
:return: None.
"""
if self._curr_xml_tree is None:
return
father_node = self._get_dest_node(*args[:-1])
dest_node = self._get_dest_node(*args)
father_node.remove(dest_node)
def delete_curr_key(self, *args):
"""
delete the element by its path.
:param args: the path of the element.
:return: None.
"""
if self._curr_xml_tree is None:
return
dest_node = self._get_dest_node(*args)
self._curr_xml_tree.getroot().remove(dest_node)
def _get_dest_node(self, *args):
"""
get the destination element by its path.
:param args: the path of the element.
:return: the destination element.
"""
if self._curr_xml_tree is None:
return None
dest_node = self._curr_xml_tree.getroot()
path = '.'
for arg in args:
# tag:attr=xxx
# tag:attr
# tag
tag = None
attr_name = None
attr_value = None
if ':' not in arg:
tag = arg
elif '=' not in arg:
# tag = arg.split(':')[0]
# attr_name = arg.split(':')[1]
raise Exception('unsupported xml path: tag:attr')
else:
tag = arg.split(':')[0]
attr = arg.split(':')[1]
attr_name = attr.split('=')[0]
attr_value = attr.split('=')[1]
if attr_value is None:
path += ("/" + tag)
else:
path += ("/" + tag + "[@" + attr_name + "='" + attr_value + "']")
dest_node = dest_node.findall(path)
if dest_node is not None and dest_node != []:
return dest_node[0]
raise Exception('can not find node by {} from xml'.format(args))
def save(self, xml=None, user_defined=False):
"""
save current xml to file.
:param xml: the file name to save; if not specified, save current xml to default names.
:param user_defined: save to user defined folder or default folder.
:return: None.
"""
if self._curr_xml_tree is None:
return
if xml is None:
xml = self._curr_xml
xml_path = self._xml_path
if user_defined:
xml_path = os.path.join(self._xml_path, 'user_defined')
if not os.path.isdir(xml_path):
os.makedirs(xml_path)
self._curr_xml_tree.write(os.path.join(xml_path, xml+'.xml'), encoding='utf-8', pretty_print=True)
def _format_xml(self, element, depth=0):
i = "\n" + depth * " "
if element:
if not element.text or not element.text.strip():
element.text = i + " "
if not element.tail or not element.tail.strip():
element.tail = i
for element in element:
self._format_xml(element, depth + 1)
if not element.tail or not element.tail.strip():
element.tail = i
else:
if depth and (not element.tail or not element.tail.strip()):
element.tail = i
def get_acrn_config_element(xsd_file):
"""
return the root element for the xsd file
:param xsd_file: the input xsd schema file
:return: the root element of the xsd file
"""
# schema = XMLSchema11(xsd_file)
xsd_doc = etree.parse(xsd_file)
xsd_doc.xinclude()
schema = XMLSchema11(etree.tostring(xsd_doc, encoding="unicode"))
xsd_element_root = schema.root_elements[0]
acrn_config_element_root = xsd_2_acrn_config_element(xsd_element_root)
# doc_dict = acrn_config_element_2_doc_dict(acrn_config_element_root, {})
# enum_dict = acrn_config_element_2_enum_dict(acrn_config_element_root, {})
# xpath_dict = acrn_config_element_2_xpath_dict(acrn_config_element_root, {})
# from pprint import pprint
# pprint(acrn_config_element_root)
# pprint(xpath_dict)
return acrn_config_element_root
def xsd_2_acrn_config_element(xsd_element, layer=0, index=0, path=''):
"""
translate XSD element to ACRN config element
:param xsd_element: the xsd element
:param layer: current layer
:param index: current index of current layer
:param path: path of current element
:return: ACRN config element
"""
acrn_config_element = {
'name': xsd_element.name,
'type': None,
'path': path+'/'+xsd_element.name,
'layer': layer,
'index': index,
'doc': None,
'configurable': 'y',
'readonly': 'n',
'multiselect': 'n',
'default': xsd_element.default,
'attributes': None,
# 'minOccurs': None,
# 'maxOccurs': None,
'enumeration': None,
'sub_elements': None
}
if isinstance(xsd_element.type, Xsd11ComplexType):
acrn_config_element['type'] = xsd_element.type.name
for xsd_component in xsd_element.type.iter_components():
if isinstance(xsd_component, Xsd11Group):
if acrn_config_element['sub_elements'] is None:
acrn_config_element['sub_elements'] = {'all':[], 'choice':[], 'sequence':[]}
index = 0
for sub_xsd_component in xsd_component.iter_components():
if isinstance(sub_xsd_component, Xsd11Element):
sub_acrn_config_element = xsd_2_acrn_config_element(sub_xsd_component, layer+1,
index, path+'/'+xsd_element.name)
acrn_config_element['sub_elements'][xsd_component.model].append(sub_acrn_config_element)
index += 1
else:
if isinstance(xsd_element.type, XsdAtomicBuiltin):
acrn_config_element['type'] = xsd_element.type.name
elif isinstance(xsd_element.type.base_type, XsdSimpleType):
acrn_config_element['type'] = xsd_element.type.base_type.name
else:
acrn_config_element['type'] = xsd_element.type.name
if xsd_element.type.enumeration:
acrn_config_element['enumeration'] = xsd_element.type.enumeration
annotation = None
if hasattr(xsd_element, 'annotation') and xsd_element.annotation:
annotation = xsd_element.annotation
elif hasattr(xsd_element.type, 'annotation') and xsd_element.type.annotation:
annotation = xsd_element.type.annotation
if annotation:
if annotation.documentation:
doc_list = [documentation.text for documentation in annotation.documentation]
acrn_config_element['doc'] = '\n'.join(doc_list)
for key in annotation.elem.keys():
if key.endswith('configurable'):
acrn_config_element['configurable'] = annotation.elem.get(key)
elif key.endswith('readonly'):
acrn_config_element['readonly'] = annotation.elem.get(key)
elif key.endswith('multiselect'):
acrn_config_element['multiselect'] = annotation.elem.get(key)
if xsd_element.attributes:
attrs = []
for attr in xsd_element.attributes.iter_components():
if isinstance(attr, Xsd11Attribute):
attrs.append({'name': attr.name, 'type': attr.type.name})
acrn_config_element['attributes'] = attrs
return acrn_config_element
def acrn_config_element_2_doc_dict(acrn_config_element, doc_dict):
"""
get the dictionary for documentation of all configurable elements by ACRN config element.
:param acrn_config_element: the ACRN config element
:param doc_dict: the dictionary to save documentation of all configurable elements
:return: the dictionary to save documentation of all configurable elements
"""
if 'doc' in acrn_config_element and 'path' in acrn_config_element \
and acrn_config_element['path'] not in doc_dict:
if acrn_config_element['doc']:
doc_dict[acrn_config_element['path']] = acrn_config_element['doc']
else:
doc_dict[acrn_config_element['path']] = acrn_config_element['name']
if 'sub_elements' in acrn_config_element and acrn_config_element['sub_elements']:
for order_type in acrn_config_element['sub_elements']:
for element in acrn_config_element['sub_elements'][order_type]:
doc_dict = acrn_config_element_2_doc_dict(element, doc_dict)
return doc_dict
def acrn_config_element_2_enum_dict(acrn_config_element, enum_dict):
"""
get the dictionary for enumeration of all configurable elements by ACRN config element.
:param acrn_config_element: the ACRN config element
:param enum_dict: the dictionary to save enumeration of all configurable elements
:return: the dictionary to save enumeration of all configurable elements
"""
if 'enumeration' in acrn_config_element and 'path' in acrn_config_element \
and acrn_config_element['path'] not in enum_dict \
and acrn_config_element['enumeration']:
enum_dict[acrn_config_element['path']] = acrn_config_element['enumeration']
if 'sub_elements' in acrn_config_element and acrn_config_element['sub_elements']:
for order_type in acrn_config_element['sub_elements']:
for element in acrn_config_element['sub_elements'][order_type]:
enum_dict = acrn_config_element_2_enum_dict(element, enum_dict)
return enum_dict
def acrn_config_element_2_xpath_dict(acrn_config_element, xpath_dict):
"""
get the dictionary for xpath of all configurable elements by ACRN config element.
:param acrn_config_element: the ACRN config element
:param xpath_dict: the dictionary to save xpath of all configurable elements
:return: the dictionary to save xpath of all configurable elements
"""
if acrn_config_element['path'] not in xpath_dict.keys():
xpath_dict[acrn_config_element['path']] = {
'name': acrn_config_element['name'],
'type': acrn_config_element['type'],
'layer': acrn_config_element['layer'],
'index': acrn_config_element['index'],
'doc': acrn_config_element['doc'] if acrn_config_element['doc'] else acrn_config_element['name'],
'configurable': acrn_config_element['configurable'],
'readonly': acrn_config_element['readonly'],
'multiselect': acrn_config_element['multiselect'],
'default': acrn_config_element['default'],
'attributes': acrn_config_element['attributes'],
# 'minOccurs': None,
# 'maxOccurs': None,
'enumeration': acrn_config_element['enumeration']
}
if 'sub_elements' in acrn_config_element and acrn_config_element['sub_elements']:
for order_type in acrn_config_element['sub_elements']:
for element in acrn_config_element['sub_elements'][order_type]:
enum_dict = acrn_config_element_2_xpath_dict(element, xpath_dict)
return xpath_dict

View File

@ -1,5 +0,0 @@
Flask==1.1.1
flask_bootstrap==3.3.7.1
xmlschema==1.4.1
lxml==4.6.2
defusedxml==0.7.1

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +0,0 @@
* {
font-size: 12px;
line-height: 1.428;
}
ul.nav li.dropdown:hover ul.dropdown-menu {
display: block;
}

View File

@ -1,210 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.0.3/js/bootstrap.min.js"></script>
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.10.0/css/bootstrap-select.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.10.0/js/bootstrap-select.min.js"></script>
<link href="../static/styles.css" rel="stylesheet" type="text/css">
<script src="../static/main.js" type="text/javascript"></script>
</head>
<body>
<div class="modal fade" id="create_modal" tabindex="-1" role="dialog" aria-labelledby="createModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="createModalLabel"></h4>
</div>
<div class="modal-body">
<div class="form-group row">
<label for="create_name" class="col-sm-3 control-label">Name: </label>
<div class="col-sm-6">
<input type="text" class="form-control" id="create_name"
value="">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" id="create_btn" data-id="" class="btn btn-primary">OK
</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="load_scenario_modal" tabindex="-1" role="dialog" aria-labelledby="loadScenarioModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="loadScenarioModalLabel">Load Default Scenario Settings</h4>
</div>
<div class="modal-body">
<div class="form-group row">
<label for="load_scenario_name" class="col-sm-3 control-label">Default Scenario Setting: </label>
<div class="dropdown col-sm-6">
<select class="selectpicker" data-width="auto" id="load_scenario_name">
{% if scenarios[0] %}
{% for sc in scenarios[0] %}
<option value="{{sc}}">{{sc}}</option>
{% endfor %}
{% endif %}
</select>
</div>
</div>
<div class="form-group row">
<label for="load_scenario_name2" class="col-sm-3 control-label">Scenario Setting Name: </label>
<div class="col-sm-6">
<input type="text" class="form-control" id="load_scenario_name2"
value="{{scenarios[0][0] if scenarios[0] else ''}}">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" id="load_scenario_btn" data-id="scenario" class="btn btn-primary">OK
</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="load_launch_modal" tabindex="-1" role="dialog" aria-labelledby="loadLaunchModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="loadLaunchModalLabel">Load Default Launch Settings</h4>
</div>
<div class="modal-body">
<div class="form-group row">
<label for="load_launch_name" class="col-sm-3 control-label">Default Launch Setting: </label>
<div class="dropdown col-sm-6">
<select class="selectpicker" data-width="auto" id="load_launch_name">
{% if launches[0] %}
{% for lc in launches[0] %}
<option value="{{lc}}">{{lc}}</option>
{% endfor %}
{% endif %}
</select>
</div>
</div>
<div class="form-group row">
<label for="load_launch_name2" class="col-sm-3 control-label">Launch Setting Name: </label>
<div class="col-sm-6">
<input type="text" class="form-control" id="load_launch_name2"
value="{{launches[0][0] if launches[0] else ''}}">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" id="load_launch_btn" data-id="launch" class="btn btn-primary">OK
</button>
</div>
</div>
</div>
</div>
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="{{ url_for('CONFIG_APP.scenarios') }}">ACRN Configurator</a>
</div>
<ul class="nav navbar-nav">
<li class="dropdown">
<a href="{{ url_for('CONFIG_APP.scenarios') }}">
Scenario Settings<span class="caret"></span></a>
<ul class="dropdown-menu">
{% if board_info %}
<li><a href="" data-toggle="modal" data-target="#create_modal" class="create_menu"
data-id="scenario">Create a new scenario</a></li>
<li><a href="" data-toggle="modal" data-target="#load_scenario_modal" class="load_menu"
data-id="scenario">Load a default scenario</a></li>
<small class="text-muted">scenario setting list</small>
{% for sc in scenarios[1] %}
<li><a href="{{ url_for('CONFIG_APP.scenario', scenario_name=sc) }}">{{sc}}</a></li>
{% endfor %}
{% else %}
<text class="form-control" id="err_msg" data-toggle="tooltip"
title="No board selected or not supported board">No Setting
</text>
{% endif %}
</ul>
</li>
<li class="dropdown">
<a href="{{ url_for('CONFIG_APP.launches') }}">Launch Settings <span
class="caret"></span></a>
<ul class="dropdown-menu">
{% if board_info %}
<li><a href="" data-toggle="modal" data-target="#create_modal" class="create_menu"
data-id="launch">Create a new Launch script</a></li>
<li><a href="" data-toggle="modal" data-target="#load_launch_modal" class="load_menu"
data-id="launch">Load a default launch script</a></li>
<small class="text-muted">launch setting list</small>
{% for lc in launches[1] %}
<li><a href="{{ url_for('CONFIG_APP.launch', launch_name=lc) }}">{{lc}}</a></li>
{% endfor %}
{% else %}
<text class="form-control" id="err_msg" data-toggle="tooltip"
title="No board selected or not supported board">No Setting
</text>
{% endif %}
</ul>
</li>
</ul>
</div>
</nav>
<form class="form-horizontal" action="" enctype="multipart/form-data" method='POST'>
<div class="form-group">
<label class="col-sm-1 control-label" style="text-align: left;">&nbsp;&nbsp;Board info:</label>
<div class="col-sm-2">
<div class="dropdown">
<select class="selectpicker" id="board_info">
<option disabled selected value> -- Select an option -- </option>
{% for bi in board_info_list %}
{% if bi==board_info %}
<option value="{{bi}}" selected="selected">{{bi}}</option>
{% else %}
<option value="{{bi}}">{{bi}}</option>
{% endif%}
{% endfor %}
</select>
</div>
</div>
<label class="col-sm-1 control-label">&nbsp;&nbsp;Board name:</label>
<text class="col-sm-2 control-label" id="board_type" style="text-align: left;">{{board_type if board_type != None else ''}}</text>
<div class="col-sm-6">
<form action="" enctype="multipart/form-data" method='POST'>
<label for="board_info_file" class="custom-file-upload btn btn-primary" id="board_info_file2"
style="border: 1px solid #ccc; display: inline-block; padding: 6px 12px;
cursor: pointer; border-radius:5px; ">
Import Board XML</label>
<input type="file" name="file" id="board_info_file" class="col-sm-6 btn btn-primary"
style="display: none;">
</form>
</div>
</div>
<div class="form-group">
<label class="col-sm-1"></label>
<text class="col-sm-2 control-label" id="bios_info" style="white-space: pre-line">{{bios_info if bios_info != None else ''}}</text>
<label class="col-sm-1"></label>
<text class="col-sm-2" id="base_board_info" style="white-space: pre-line">{{base_board_info if base_board_info != None else ''}}</text>
</div>
</form>
<hr class="col-sm-12">
{% block body_content %}
{% endblock %}
</body>
</html>

View File

@ -1,407 +0,0 @@
{% extends 'base.html' %}
{% block body_content %}
<div class="modal fade" id="save_modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="myModalLabel">Save Launch XML</h4>
</div>
<div class="modal-body">
<div class="form-group row">
<label for="new_launch_name" class="col-sm-3 control-label">Launch XML Name: </label>
<div class="col-sm-6">
<input type="text" class="form-control" id="new_launch_name"
value={{launch}}>
</div>
</div>
<div class="form-group row" id="src_path_row">
<label for="src_path" class="col-sm-3 control-label"
title="the path to save config xmls; if no path is specified,
the launch scripts will be generated into misc/acrn-config/xmls/config-xmls/[board]/output and overwirte the previous files.">
Launch XML Path: </label>
<div class="col-sm-9">
<input type="text" class="form-control" id="src_path" value=""
placeholder="[acrn-hypervisor]/../user_config/">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" id="remove_launch" class="btn btn-default" data-dismiss="modal">Remove</button>
<button type="button" id="save_launch" data-id="" class="btn btn-primary">Submit
</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="add_launch_modal" tabindex="-1" role="dialog" aria-labelledby="addlaunchModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="addlaunchModalLabel">Configure User VM for Post-launched VM</h4>
</div>
<div class="modal-body">
<div class="form-group row">
<label for="add_launch_type" class="col-sm-3 control-label">VM : </label>
<div class="dropdown col-sm-6">
<select class="selectpicker" data-width="auto" id="add_launch_type">
</select>
</div>
</div>
<div class="form-group row">
<label for="new_launch_name2" class="col-sm-3 control-label">Launch Name : </label>
<div class="col-sm-6">
<input type="text" class="form-control" id="new_launch_name2"
value={{ launch }}>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" id="add_launch_submit" data-id="" class="btn btn-primary" data-dismiss="modal">Submit
</button>
</div>
</div>
</div>
</div>
<form class="form-horizontal" role="form" method="post">
<div class="form-group">
<label for="old_launch_name" class="col-sm-2 control-label" style="text-align: left;">&nbsp;&nbsp;Launch
Setting:</label>
<div class="col-sm-3">
<text class="form-control" id="old_launch_name" readonly>{{launch}}</text>
</div>
<div class="col-sm-1 col-sm-offset-1">
{% if board_info != None %}
<label for="launch_file" class="btn btn-primary" id="scenario_file2"
style="border: 1px solid #ccc; display: inline-block; padding: 6px 12px;
cursor: pointer; border-radius:5px; ">
Import XML</label>
<input type="file" name="file" id="launch_file" class="col-sm-1 btn btn-primary" style="display: none;">
{% else %}
<label class="btn"
style="border: 1px solid #ccc; display: inline-block; padding: 6px 12px;
cursor: pointer; border-radius:5px; ">
Import XML</label>
<input type="file" name="file" class="col-sm-1" style="display: none;" disabled>
{% endif %}
</div>
{% if board_info != None and root != None %}
<div class="col-sm-1">
<button type="button" class="btn btn-primary" data-id="save" data-toggle="modal" data-target="#save_modal"
id="export_launch_xml">Export XML
</button>
</div>
<div class="col-sm-1">
<button type="button" id="generate_launch_script" class="btn btn-primary" data-id="generate_launch_script"
data-toggle="modal" data-target="#save_modal">Generate Launch Script
</button>
</div>
{% else %}
<div class="col-sm-1">
<button type="button" disabled class="btn btn-primary">Export XML</button>
</div>
<div class="col-sm-1">
<button type="button" disabled class="btn btn-primary">Generate Launch Script</button>
</div>
{% endif %}
</div>
<div class="form-group">
<label for="scenario_name" class="col-sm-2 control-label" style="text-align: left;">&nbsp;&nbsp;Select
Scenario:</label>
<div class="dropdown col-sm-9">
<select class="selectpicker" data-width="auto" id="scenario_name">
<option style="display:none">
<option disabled selected value> -- Select an option -- </option>
{% for sc in scenarios[1] %}
{% if root !=None and root.attrib['scenario'] == sc%}
<option value="{{sc}}" selected>{{sc}}</option>
{% else %}
<option value="{{sc}}">{{sc}}</option>
{% endif %}
{% endfor %}
</select>
</div>
</div>
{% if board_info != None and root != None %}
<table class="table table-hover" id="tab">
{% for vm in root|list %}
<tr>
<td>
<div class="form-group">
<label class="col-sm-3 control-label">User VM: </label>
<label class="col-sm-1 control-label" id="vm">{{vm.attrib['id']}}</label>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">VM ID: </label>
<label class="col-sm-1 control-label" id="vm_id">
{{post_launch_vm_list[vm.attrib['id']|int-1][0] if post_launch_vm_list|length>=1 else ''}}</label>
</div>
<div class="form-group">
<button type="button" class="col-sm-6 btn" id="add_launch_vm" data-id="{{vm.attrib['id']}}" data-toggle="modal"
data-target="#add_launch_modal">Configure a User VM below</button>
</div>
<div class="form-group">
<button type="button" class="col-sm-6 btn" id="remove_launch_vm" data-id="{{vm.attrib['id']}}">
Remove this VM</button>
</div>
</td>
<td>
{% for elem in vm|list %}
{% if elem|list == [] and ('configurable' not in elem.attrib or elem.attrib['configurable'] !=
'0') %}
<div class="form-group">
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{elem.attrib['desc'] if 'desc' in elem.attrib else elem.tag}}">{{elem.tag}}</label>
<label class="col-sm-2 control-label"></label>
{% set elem_text = '' if elem.text == None else elem.text %}
{% if ','.join(['user_vm', elem.tag]) not in launch_item_values %}
<div class="col-sm-6">
{% if 'readonly' in elem.attrib and elem.attrib['readonly'] == 'true' %}
{% if elem.tag == 'kernel_cmdline' %}
<textarea type="text" class="form-control"
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag}}" readonly>{{elem_text}}</textarea>
{% else %}
<input type="text" class="form-control"
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag}}" value="{{elem_text}}" readonly/>
{% endif %}
{% else %}
{% if elem.tag == 'kernel_cmdline' %}
<textarea type="text" class="form-control" style="height:120px"
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag}}">{{elem_text}}</textarea>
{% else %}
<input type="text" class="form-control" value="{{elem_text}}"
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag}}"/>
{% endif %}
{% endif %}
</div>
{% else %}
<div class="dropdown col-sm-6">
{% if 'readonly' in elem.attrib and elem.attrib['readonly'] == 'true' %}
<select class="selectpicker" data-width="auto" title="" disabled
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag}}">
{% else %}
<select class="selectpicker" data-width="auto" title=""
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag}}">
{% endif %}
<option disabled selected value> -- Select an option -- </option>
{% for item_value in launch_item_values[','.join(['user_vm', elem.tag])] %}
{% if item_value == elem_text %}
<option value="{{item_value}}" selected="selected">{{item_value}}</option>
{% else %}
<option value="{{item_value}}">{{item_value}}</option>
{% endif %}
{% endfor %}
</select>
</div>
{% endif %}
<p id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag}}_err" class="col-sm-3"></p>
</div>
{% elif elem|list != [] %}
{% if 'multiselect' not in elem.attrib or elem.attrib['multiselect'] != 'true' %}
{% set first_multi_child = {'block': 0, 'network': 0, 'input': 0, 'pcpu_id': 0, 'shm_region': 0,
'passthrough_devices': 0, 'virtio_devices': 0, 'sriov_devices': 0, 'communication_vuart': 0} %}
{% for sub_elem in elem|list %}
{% set sub_elem_text = '' if sub_elem.text == None else sub_elem.text %}
{% if 'configurable' not in sub_elem.attrib or sub_elem.attrib['configurable'] != '0' %}
<div class="form-group">
{% if 'id' not in elem.attrib %}
{% if elem.tag in first_multi_child.keys() and first_multi_child[elem.tag] == 0 %}
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{sub_elem.attrib['desc'] if 'desc' in sub_elem.attrib else sub_elem.tag}}">
{{elem.tag}}</label>
{% do first_multi_child.update({elem.tag: first_multi_child[elem.tag]+1}) %}
{% elif sub_elem.tag in ['pcpu_id', 'shm_region', 'communication_vuart'] and first_multi_child[sub_elem.tag] == 0 %}
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{sub_elem.attrib['desc'] if 'desc' in sub_elem.attrib else sub_elem.tag}}">
{{elem.tag}}</label>
{% else %}
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{sub_elem.attrib['desc'] if 'desc' in sub_elem.attrib else sub_elem.tag}}">
</label>
{% endif %}
<label class="col-sm-2 control-label" data-toggle="tooltip"
title="{{sub_elem.attrib['desc'] if 'desc' in sub_elem.attrib else sub_elem.tag}}">
{{sub_elem.tag}}</label>
{% if ','.join(['user_vm', elem.tag, sub_elem.tag]) not in launch_item_values
and elem.tag not in ['cpu_affinity', 'shm_regions', 'communication_vuarts']%}
<div class="col-sm-5">
{% if 'readonly' in sub_elem.attrib and sub_elem.attrib['readonly'] == 'true' %}
<input type="text" class="form-control" readonly
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+','+sub_elem.tag}}"
value="{{sub_elem_text}}">
{% else %}
<input type="text" class="form-control"
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+','+sub_elem.tag}}"
value="{{sub_elem_text}}">
{% endif %}
</div>
{% if elem.tag in ['virtio_devices'] and sub_elem.tag in ['block', 'network', 'input'] %}
<div class="col-sm-1">
<button type="button" class="btn" id="add_virtio_{{sub_elem.tag}}_{{first_multi_child[sub_elem.tag]}}">+</button>
{% if first_multi_child[sub_elem.tag] == 0 %}
<button type="button" disabled class="btn" id="remove_virtio_{{sub_elem.tag}}_{{first_multi_child[sub_elem.tag]}}">-</button>
{% else %}
<button type="button" class="btn" id="remove_virtio_{{sub_elem.tag}}_{{first_multi_child[sub_elem.tag]}}">-</button>
{% endif %}
</div>
{% do first_multi_child.update({sub_elem.tag: first_multi_child[sub_elem.tag]+1}) %}
{% endif%}
{% else %}
{% if elem.tag == 'cpu_affinity' %}
{% set item_key = ','.join(['user_vm', elem.tag]) %}
{% elif elem.tag in ['shm_regions', 'communication_vuarts'] %}
{% set item_key = ','.join(['user_vm:id='+vm.attrib['id'], elem.tag, sub_elem.tag]) %}
{% else %}
{% set item_key = ','.join(['user_vm', elem.tag, sub_elem.tag]) %}
{% endif %}
<div class="dropdown col-sm-6">
{% if 'readonly' in sub_elem.attrib and sub_elem.attrib['readonly'] == 'true' %}
<select class="selectpicker" data-width="auto" disabled
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+','+sub_elem.tag}}">
{% else %}
<select class="selectpicker" data-width="auto"
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+','+sub_elem.tag}}">
{% endif %}
<option disabled selected value> -- Select an option -- </option>
{% for item_value in launch_item_values[item_key] %}
{% if item_value == sub_elem_text %}
<option value="{{item_value}}" selected="selected">{{item_value}}</option>
{% else %}
<option value="{{item_value}}">{{item_value}}</option>
{% endif %}
{% endfor %}
</select>
{% if elem.tag in ['cpu_affinity', 'shm_regions', 'communication_vuarts'] %}
<button type="button" class="btn" id="add_shm_{{first_multi_child[sub_elem.tag]}}">+</button>
{% if not first_multi_child[sub_elem.tag] %}
<button type="button" disabled class="btn" id="remove_shm_{{first_multi_child[sub_elem.tag]}}">-</button>
{% else %}
<button type="button" class="btn" id="remove_shm_{{first_multi_child[sub_elem.tag]}}">-</button>
{% endif %}
{% do first_multi_child.update({sub_elem.tag: first_multi_child[sub_elem.tag]+1}) %}
{% endif %}
</div>
{% endif %}
<p id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+','+sub_elem.tag}}_err" class="col-sm-3"></p>
{% else %}
{% if elem.tag in first_multi_child.keys() and first_multi_child[elem.tag] == 0 %}
{% do first_multi_child.update({elem.tag: first_multi_child[elem.tag]+1}) %}
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{sub_elem.attrib['desc'] if 'desc' in sub_elem.attrib else sub_elem.tag}}">
{{elem.tag+' '+elem.attrib['id']}}</label>
{% else %}
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{sub_elem.attrib['desc'] if 'desc' in sub_elem.attrib else sub_elem.tag}}">
</label>
{% endif %}
<label class="col-sm-2 control-label" data-toggle="tooltip"
title="{{sub_elem.attrib['desc'] if 'desc' in sub_elem.attrib else sub_elem.tag}}">
{{sub_elem.tag}}</label>
{% if ','.join(['user_vm', elem.tag, sub_elem.tag]) not in launch_item_values %}
<div class="col-sm-6">
{% if 'readonly' in sub_elem.attrib and sub_elem.attrib['readonly'] == 'true' %}
<input type="text" class="form-control" readonly
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}"
value="{{sub_elem_text}}">
{% else %}
<input type="text" class="form-control"
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}"
value="{{sub_elem_text}}">
{% endif %}
</div>
{% else %}
<div class="dropdown col-sm-6">
{% if 'readonly' in sub_elem.attrib and sub_elem.attrib['readonly'] == 'true' %}
<select class="selectpicker" data-width="auto" disabled
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}">
{% else %}
<select class="selectpicker" data-width="auto"
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}">
{% endif %}
<option disabled selected value> -- Select an option -- </option>
{% for item_value in launch_item_values[','.join(['user_vm', elem.tag, sub_elem.tag])] %}
{% if item_value == sub_elem_text %}
<option value="{{item_value}}" selected="selected">{{item_value}}</option>
{% else %}
<option value="{{item_value}}">{{item_value}}</option>
{% endif %}
{% endfor %}
</select>
</div>
<p id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}_err"
class="col-sm-3"></p>
{% endif %}
{% endif %}
</div>
{% endif %}
{% endfor %}
{% elif 'configurable' not in elem.attrib or elem.attrib['configurable'] != '0' %}
<div class="form-group">
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{elem.attrib['desc'] if 'desc' in elem.attrib else elem.tag}}">{{elem.tag}}</label>
<label class="col-sm-2 control-label" data-toggle="tooltip"
title="{{elem.attrib['desc'] if 'desc' in elem.attrib else elem.tag}}"></label>
<div class="dropdown col-sm-9">
{% if 'readonly' in elem.attrib and elem.attrib['readonly'] == 'true' %}
<select class="selectpicker" data-width="auto" disabled
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+','+elem.tag[:-1]}}" multiple>
{% else %}
<select class="selectpicker" data-width="auto" disabled
id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+','+elem.tag[:-1]}}" multiple>
{% endif %}
{% if ','.join(['user_vm', elem.tag]) not in launch_item_values %}
{% set x=1 %}
{% for sub_elem in elem|list %}
<option value="{{sub_elem.text}}" selected="selected">{{sub_elem.text}}</option>
{% endfor %}
{% else %}
{% set selected_list = [] %}
{% for sub_elem in elem|list %}
{% do selected_list.append(sub_elem.text) %}
{% endfor %}
{% for item_value in launch_item_values[','.join(['user_vm', elem.tag])] %}
{% if item_value in selected_list %}
<option value="{{item_value}}" selected="selected">{{item_value}}</option>
{% else %}
<option value="{{item_value}}">{{item_value}}</option>
{% endif %}
{% endfor %}
{% endif %}
</select>
</div>
<p id="{{'user_vm:id='+vm.attrib['id']+','+elem.tag+','+elem.tag[:-1]}}_err" class="col-sm-3"></p>
</div>
{% endif %}
{% endif %}
{% endfor %}
</td>
</tr>
{% endfor %}
<tr><td>
<button type="button" class="btn" id="add_launch_script" data-toggle="modal" data-id="-1"
data-target="#add_launch_modal">Configure a User VM</button>
</td></tr>
</table>
{% else %}
<text class="form-control" id="err_msg">No setting available. Select one board info and make sure the launch xml
exists.
</text>
{% endif %}
</form>
{% endblock %}

View File

@ -1,482 +0,0 @@
{% extends 'base.html' %}
{% block body_content %}
<div class="modal fade" id="save_modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="myModalLabel">Save Scenario XML</h4>
</div>
<div class="modal-body">
<div class="form-group row">
<label for="new_scenario_name" class="col-sm-3 control-label">Scenario XML Name: </label>
<div class="col-sm-6">
<input type="text" class="form-control" id="new_scenario_name"
value={{ scenario }}>
</div>
</div>
<div class="form-group row" id="src_path_row">
<label for="src_path" class="col-sm-3 control-label"
title="the path to save config xmls; if no path is specified,
the source files will be generated into default path and overwirte the previous files.">
Scenario XML Path: </label>
<div class="col-sm-9">
<input type="text" class="form-control" id="src_path" value=""
placeholder="[acrn-hypervisor]/../user_config/">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" id="remove_scenario" class="btn btn-default" data-dismiss="modal">Remove</button>
<button type="button" id="save_scenario" data-id="" class="btn btn-primary">Submit
</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="add_vm_modal" tabindex="-1" role="dialog" aria-labelledby="addVMModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="addVMModalLabel">Add a new VM</h4>
</div>
<div class="modal-body">
<div class="form-group row">
<label for="add_vm_type" class="col-sm-3 control-label">VM type: </label>
<div class="dropdown col-sm-6">
<select class="selectpicker" data-width="auto" id="add_vm_type">
<option value="PRE_STD_VM">PRE_STD_VM</option>
<option value="PRE_RT_VM">PRE_RT_VM</option>
<option value="SAFETY_VM">SAFETY_VM</option>
<option value="SERVICE_VM">SERVICE_VM</option>
<option value="POST_STD_VM">POST_STD_VM</option>
<option value="POST_RT_VM">POST_RT_VM</option>
</select>
</div>
</div>
<div class="form-group row">
<label for="new_scenario_name2" class="col-sm-3 control-label">Scenario Name: </label>
<div class="col-sm-6">
<input type="text" class="form-control" id="new_scenario_name2"
value={{ scenario }}>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" id="add_vm_submit" data-id="" class="btn btn-primary" data-dismiss="modal">Submit
</button>
</div>
</div>
</div>
</div>
<form class="form-horizontal" role="form" method="post">
<div class="form-group">
<label for="old_scenario_name" class="col-sm-2 control-label" style="text-align: left;">&nbsp;&nbsp;Scenario
Setting:</label>
<div class="col-sm-3">
<text class="form-control" id="old_scenario_name" readonly>{{scenario}}</text>
</div>
<div class="col-sm-1 col-sm-offset-1">
{% if board_info != None %}
<label for="scenario_file" class="btn btn-primary" id="scenario_file2"
style="border: 1px solid #ccc; display: inline-block; padding: 6px 12px;
cursor: pointer; border-radius:5px; ">
Import XML</label>
<input type="file" name="file" id="scenario_file" class="col-sm-1 btn btn-primary" style="display: none;">
{% else %}
<label for="scenario_file" class="btn"
style="border: 1px solid #ccc; display: inline-block; padding: 6px 12px;
cursor: pointer; border-radius:5px; ">
Import XML</label>
<input type="file" name="file" class="col-sm-1" style="display: none;" disabled>
{% endif %}
</div>
{% if board_info != None and root != None and scenario_item_values %}
<div class="col-sm-1">
<button type="button" data-id="" class="btn btn-primary" data-toggle="modal" data-target="#save_modal"
id="export_scenario_xml">Export XML
</button>
</div>
{% else %}
<div class="col-sm-1">
<button type="button" disabled class="btn btn-primary" data-toggle="modal" data-target="#save_modal">Export XML
</button>
</div>
{% endif %}
</div>
{% if board_info != None and root != None and scenario_item_values %}
<table class="table table-hover" id="tab">
{% for vm in root|list %}
{% set first_multi_child = {'IVSHMEM_REGION': 0, 'communication_vuart': 1} %}
{% if xpath_dict['/'.join(['/acrn-config', vm.tag])]['configurable'] == 'y' or
vm.xpath(xpath_dict['/'.join(['/acrn-config', vm.tag])]['configurable'])%}
<tr>
<td>
{% if vm.tag != 'vm' %}
{% set vm_type = 'hv' %}
<div class="form-group">
<label class="col-sm-1 control-label">HV </label>
</div>
<div class="form-group">
<button type="button" class="btn" id="add_vm" data-id="-1" data-toggle="modal"
data-target="#add_vm_modal">Add a VM below</button>
</div>
{% else %}
{% set vm_type = 'vm:id='+vm.attrib['id'] %}
<div class="form-group">
<label class="col-sm-1 control-label">VM: </label>
<label class="col-sm-1 control-label" id="vm">{{vm.attrib['id']}}</label>
</div>
<div class="form-group">
<button type="button" class="btn" id="add_vm" data-id="{{vm.attrib['id']}}" data-toggle="modal"
data-target="#add_vm_modal">Add a VM below</button>
</div>
<div class="form-group">
<button type="button" class="btn" id="remove_vm" data-id="{{vm.attrib['id']}}">
Remove this VM</button>
</div>
{% endif %}
</td>
<td>
{% for elem in vm|list %}
{% set elem_text = elem.text if elem.text != None else '' %}
{% if elem|list == [] and (xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['configurable']
== 'y' or elem.xpath(xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['configurable']))%}
<div class="form-group">
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['doc']}}">{{elem.tag}}</label>
<label class="col-sm-2 control-label"></label>
{% if ','.join([vm.tag, elem.tag]) not in scenario_item_values %}
<div class="col-sm-6">
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['readonly'] == 'y' %}
<input type="text" class="form-control" id="{{vm_type+','+elem.tag}}"
value="{{elem_text}}" readonly>
{% else %}
<input type="text" class="form-control" id="{{vm_type+','+elem.tag}}"
value="{{elem_text}}">
{% endif %}
</div>
{% else %}
<div class="dropdown col-sm-6">
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['readonly'] == 'y' %}
<select class="selectpicker" data-width="auto"
id="{{vm_type+','+elem.tag}}" disabled>
{% else %}
<select class="selectpicker" data-width="auto"
id="{{vm_type+','+elem.tag}}">
{% endif %}
<option disabled selected value> -- Select an option -- </option>
{% for item_value in scenario_item_values[','.join([vm.tag, elem.tag])] %}
{% if item_value == elem_text %}
<option value="{{item_value}}" selected="selected">{{item_value}}</option>
{% else %}
<option value="{{item_value}}">{{item_value}}</option>
{% endif %}
{% endfor %}
</select>
</div>
{% endif %}
<p id="{{vm_type+','+elem.tag}}_err" class="col-sm-3"></p>
</div>
{% elif elem|list != [] and (xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['configurable']
== 'y' or elem.xpath(xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['configurable']))%}
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['multiselect'] != 'y' %}
{% set first_child = [] %}
{% for sub_elem in elem|list %}
{% set sub_elem_text = sub_elem.text if sub_elem.text != None else '' %}
{% if sub_elem.tag in ['RDT', 'IVSHMEM', 'SSRAM'] %}
{% for sub_elem_2 in sub_elem|list %}
{% set sub_elem_2_text = sub_elem_2.text if sub_elem_2.text != None else '' %}
{% if ','.join([vm.tag, elem.tag, sub_elem.tag, sub_elem_2.tag]) in scenario_item_values %}
<div class="form-group">
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['doc']}}">
</label>
<label class="col-sm-2 control-label" data-toggle="tooltip"
title="{{xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag, sub_elem_2.tag])]['doc']}}">
{{sub_elem.tag}}&nbsp;&nbsp;&nbsp;&nbsp;{{sub_elem_2.tag}}</label>
<div class="dropdown col-sm-6">
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag, sub_elem_2.tag])]['readonly'] == 'y' %}
<select class="selectpicker" data-width="auto"
id="{{vm_type+','+elem.tag+','+sub_elem.tag+','+sub_elem_2.tag}}" disabled>
{% else %}
<select class="selectpicker" data-width="auto"
id="{{vm_type+','+elem.tag+','+sub_elem.tag+','+sub_elem_2.tag}}">
{% endif %}
<option disabled selected value> -- Select an option -- </option>
{% for item_value in scenario_item_values[vm_type+','+elem.tag+','+sub_elem.tag+','+sub_elem_2.tag] %}
{% if item_value == sub_elem_2.text %}
<option value="{{item_value}}" selected="selected">{{item_value}}</option>
{% else %}
<option value="{{item_value}}">{{item_value}}</option>
{% endif %}
{% endfor %}
</select>
</div>
<p id="{{vm_type+','+elem.tag+','+sub_elem.tag+','+sub_elem_2.tag}}_err" class="col-sm-3"></p>
</div>
{% else %}
<div class="form-group">
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['doc']}}">
</label>
<label class="col-sm-2 control-label" data-toggle="tooltip"
title="{{xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag, sub_elem_2.tag])]['doc']}}">
{{sub_elem.tag}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{sub_elem_2.tag}}</label>
{% if sub_elem_2.tag in ['IVSHMEM_REGION'] %}
<div class="col-sm-5">
{% else %}
<div class="col-sm-6">
{% endif %}
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag, sub_elem_2.tag])]['readonly'] == 'y' %}
<input type="text" class="form-control"
id="{{vm_type+','+elem.tag+','+sub_elem.tag+','+sub_elem_2.tag}}"
readonly vaule="{{sub_elem_2_text}}"></input>
{% else %}
<input type="text" class="form-control"
id="{{vm_type+','+elem.tag+','+sub_elem.tag+','+sub_elem_2.tag}}" value="{{sub_elem_2_text}}"></input>
{% endif %}
</div>
{% if sub_elem_2.tag in ['IVSHMEM_REGION'] %}
<div class="col-sm-1">
<button type="button" class="btn" id="add_ivshmem_{{sub_elem.tag}}_{{first_multi_child[sub_elem_2.tag]}}">+</button>
{% if first_multi_child[sub_elem_2.tag] == 0 %}
<button type="button" disabled class="btn" id="remove_ivshmem_{{sub_elem.tag}}_{{first_multi_child[sub_elem_2.tag]}}">-</button>
{% else %}
<button type="button" class="btn" id="remove_ivshmem_{{sub_elem.tag}}_{{first_multi_child[sub_elem_2.tag]}}">-</button>
{% endif %}
</div>
{% do first_multi_child.update({sub_elem_2.tag: first_multi_child[sub_elem_2.tag]+1}) %}
{% endif%}
{% if sub_elem_2.tag in ['IVSHMEM_REGION'] %}
<p id="{{vm_type+','+elem.tag+','+sub_elem.tag+','+sub_elem_2.tag+','+(first_multi_child[sub_elem_2.tag]-1)|string()}}_err" class="col-sm-3"></p>
{% else %}
<p id="{{vm_type+','+elem.tag+','+sub_elem.tag+','+sub_elem_2.tag}}_err" class="col-sm-3"></p>
{% endif %}
</div>
{% endif %}
{% endfor %}
{% else %}
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag])]['configurable'] == 'y' or
sub_elem.xpath(xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag])]['configurable'])%}
<div class="form-group">
{% if 'id' not in elem.attrib %}
{% if not first_child %}
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['doc']}}">
{{elem.tag}}</label>
{% else %}
<label class="col-sm-1 control-label" data-toggle="tooltip">
</label>
{% endif %}
<label class="col-sm-2 control-label" data-toggle="tooltip"
title="{{xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag])]['doc']}}">
{{sub_elem.tag}}</label>
{% if ','.join([vm.tag, elem.tag, sub_elem.tag]) not in scenario_item_values
and elem.tag != 'cpu_affinity' and elem.tag != 'pci_devs' %}
{% if sub_elem.tag in ['bootargs', 'kern_args'] %}
<div class="col-sm-6">
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag])]['readonly'] == 'y' %}
<textarea type="text" class="form-control" style="height:120px"
id="{{vm_type+','+elem.tag+','+sub_elem.tag}}"
readonly>{{sub_elem_text}}</textarea>
{% else %}
<textarea type="text" class="form-control" style="height:120px"
id="{{vm_type+','+elem.tag+','+sub_elem.tag}}">{{sub_elem_text}}</textarea>
{% endif %}
</div>
{% else %}
<div class="col-sm-6">
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag])]['readonly'] == 'y' %}
<input type="text" class="form-control"
id="{{vm_type+','+elem.tag+','+sub_elem.tag}}"
value="{{sub_elem_text}}" readonly>
{% else %}
<input type="text" class="form-control"
id="{{vm_type+','+elem.tag+','+sub_elem.tag}}"
value="{{sub_elem_text}}">
{% endif %}
</div>
{% endif %}
{% else %}
{% set item_key = ','.join([vm.tag, elem.tag, sub_elem.tag]) if elem.tag != 'cpu_affinity'
and elem.tag != 'pci_devs' else ','.join([vm.tag, elem.tag]) %}
<div class="dropdown col-sm-6">
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag])]['readonly'] == 'y' %}
<select class="selectpicker" data-width="auto"
id="{{vm_type+','+elem.tag+','+sub_elem.tag}}" disabled>
{% else %}
<select class="selectpicker" data-width="auto"
id="{{vm_type+','+elem.tag+','+sub_elem.tag}}">
{% endif %}
<option disabled selected value> -- Select an option -- </option>
{% for item_value in scenario_item_values[item_key] %}
{% if item_value == sub_elem_text %}
<option value="{{item_value}}" selected="selected">{{item_value}}</option>
{% else %}
<option value="{{item_value}}">{{item_value}}</option>
{% endif %}
{% endfor %}
</select>
{% if elem.tag == 'cpu_affinity' %}
<button type="button" class="btn" id="add_vcpu_{{first_child|length}}">+</button>
{% if not first_child %}
<button type="button" disabled class="btn" id="remove_vcpu_{{first_child|length}}">-</button>
{% else %}
<button type="button" class="btn" id="remove_vcpu_{{first_child|length}}">-</button>
{% endif %}
{% elif elem.tag == 'pci_devs' %}
<button type="button" class="btn" id="add_pci_dev_{{first_child|length}}">+</button>
{% if not first_child %}
<button type="button" disabled class="btn" id="remove_pci_dev_{{first_child|length}}">-</button>
{% else %}
<button type="button" class="btn" id="remove_pci_dev_{{first_child|length}}">-</button>
{% endif %}
{% else %}
{% endif%}
</div>
{% endif %}
{% do first_child.append(1) %}
<p id="{{vm_type+','+elem.tag+','+sub_elem.tag}}_err" class="col-sm-3"></p>
{% else %}
{% if not first_child %}
{% do first_child.append(1) %}
<label class="col-sm-1 control-label" data-toggle="tooltip"
id="{{vm_type+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}_label1"
title="{{xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['doc']}}">
{{elem.tag+' '+elem.attrib['id']}}</label>
{% else %}
<label class="col-sm-1 control-label" data-toggle="tooltip"
id="{{vm_type+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}_label1">
</label>
{% endif %}
<label class="col-sm-2 control-label" data-toggle="tooltip"
id="{{vm_type+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}_label2"
title="{{xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag])]['doc']}}">
{{sub_elem.tag}}</label>
{% if (','.join([vm.tag, elem.tag, sub_elem.tag]) not in scenario_item_values) and
((elem.tag!='vuart' and elem.tag!='legacy_vuart') or sub_elem.tag!='base') %}
<div class="col-sm-6"
id="{{vm_type+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}_config">
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag])]['readonly'] == 'y' %}
<input type="text" class="form-control"
id="{{vm_type+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}"
value="{{sub_elem_text}}" readonly>
{% else %}
<input type="text" class="form-control"
id="{{vm_type+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}"
value="{{sub_elem_text}}">
{% endif %}
</div>
{% else %}
<div class="dropdown col-sm-6">
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag, sub_elem.tag])]['readonly'] == 'y' %}
<select class="selectpicker" data-width="auto" disabled
id="{{vm_type+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}">
{% else %}
<select class="selectpicker" data-width="auto"
id="{{vm_type+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}">
{% endif %}
{% set key = ('vm='+vm.attrib['id']+','+elem.tag+'='+elem.attrib['id']+','+sub_elem.tag)
if (elem.tag in ['vuart', 'legacy_vuart'] and sub_elem.tag=='base')
else ','.join([vm.tag, elem.tag, sub_elem.tag]) %}
<option disabled selected value> -- Select an option -- </option>
{% for item_value in scenario_item_values[key] %}
{% if item_value == sub_elem_text %}
<option value="{{item_value}}" selected="selected">{{item_value}}</option>
{% else %}
<option value="{{item_value}}">{{item_value}}</option>
{% endif %}
{% endfor %}
</select>
{% if elem.tag in ['communication_vuart'] and sub_elem.tag in ['base'] %}
<button type="button" class="btn" id="add_{{elem.tag}}_{{first_multi_child[elem.tag]}}">+</button>
{% if first_multi_child[elem.tag] == 1 %}
<button type="button" disabled class="btn" id="remove_{{elem.tag}}_{{first_multi_child[elem.tag]}}">-</button>
{% else %}
<button type="button" class="btn" id="remove_{{elem.tag}}_{{first_multi_child[elem.tag]}}">-</button>
{% endif %}
{% do first_multi_child.update({elem.tag: first_multi_child[elem.tag]+1}) %}
{% endif%}
</div>
{% endif %}
<p id="{{vm_type+','+elem.tag+':id='+elem.attrib['id']+','+sub_elem.tag}}_err"
class="col-sm-3"></p>
{% endif %}
</div>
{% endif %}
{% endif %}
{% endfor %}
{% elif xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['configurable'] == 'y' or
elem.xpath(xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['configurable'])%}
<div class="form-group">
<label class="col-sm-1 control-label" data-toggle="tooltip"
title="{{xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['doc']}}">{{elem.tag}}</label>
<label class="col-sm-2 control-label" data-toggle="tooltip"></label>
<div class="dropdown col-sm-6">
{% if xpath_dict['/'.join(['/acrn-config', vm.tag, elem.tag])]['readonly'] == 'y' %}
<select class="selectpicker" data-width="auto" disabled
id="{{vm_type+','+elem.tag+','+elem.tag[:-1]}}"
multiple>
{% else %}
<select class="selectpicker" data-width="auto"
id="{{vm_type+','+elem.tag+','+elem.tag[:-1]}}"
multiple>
{% endif %}
{% if ','.join([vm.tag, elem.tag]) not in scenario_item_values %}
{% set x=1 %}
{% for sub_elem in elem|list %}
<option value="{{sub_elem.text}}" selected="selected">{{sub_elem.text}}</option>
{% endfor %}
{% else %}
{% set selected_list = [] %}
{% for sub_elem in elem|list %}
{% do selected_list.append(sub_elem.text) %}
{% endfor %}
{% for item_value in scenario_item_values[','.join([vm.tag, elem.tag])] %}
{% if item_value in selected_list %}
<option value="{{item_value}}" selected="selected">{{item_value}}</option>
{% else %}
<option value="{{item_value}}">{{item_value}}</option>
{% endif %}
{% endfor %}
{% endif %}
</select>
</div>
<p id="{{vm_type+','+elem.tag+','+elem.tag[:-1]}}_err" class="col-sm-3"></p>
</div>
{% endif %}
{% endif %}
{% endfor %}
</td>
</tr>
{% endif %}
{% endfor %}
</table>
{% else %}
<text class="form-control" id="err_msg">No setting available. Select one board info and make sure the scenario xml
exists.
</text>
{% endif %}
</form>
{% endblock %}

File diff suppressed because it is too large Load Diff