3.15. vm

3.15.1. double_qemu_setup suite

3.15.1.1. Configure QEMU vhost and run it

Setup Qemu with 4 vhost-user interfaces and 4 namespaces. Each call will be different object instance.

Arguments: - dut_node - Node where to setup qemu. Type: dict - sock1 - Socket path for first Vhost-User interface. Type: string - sock2 - Socket path for second Vhost-User interface. Type: string - sock3 - Socket path for third Vhost-User interface. Type: string - sock4 - Socket path for forth Vhost-User interface. Type: string - ip1 - IP address for namespace 1. Type: string - ip2 - IP address for namespace 2. Type: string - ip3 - IP address for namespace 3. Type: string - ip4 - IP address for namespace 4. Type: string - prefix_length - IP prefix length. Type: int - qemu_name - Qemu instance name by which the object will be accessed. Type: string - mac_ID - MAC address ID used to differentiate qemu instances and namespaces assigned to them. Type: string

Example:

| Setup QEMU Vhost And Run| {nodes[‘DUT1’]} | /tmp/sock1 | /tmp/sock2 | /tmp/sock3 | /tmp/sock4 | 16.0.0.1 | 16.0.0.2 | 16.0.0.3 | 16.0.0.4 | 24 | qemu_instance_1 | 06 |


Import Library  resources.libraries.python.QemuUtils \  WITH NAME  ${qemu_name}
${qemu_add_vhost}=  Replace Variables  ${qemu_name}.Qemu Add Vhost User If
${qemu_set_node}=  Replace Variables  ${qemu_name}.Qemu Set Node
${qemu_start}=  Replace Variables  ${qemu_name}.Qemu Start
Run keyword  ${qemu_add_vhost}  ${sock1}  mac=52:54:00:00:${mac_ID}:01
Run keyword  ${qemu_add_vhost}  ${sock2}  mac=52:54:00:00:${mac_ID}:02
Run keyword  ${qemu_add_vhost}  ${sock3}  mac=52:54:00:00:${mac_ID}:03
Run keyword  ${qemu_add_vhost}  ${sock4}  mac=52:54:00:00:${mac_ID}:04
Run keyword  ${qemu_set_node}  ${dut_node}
${vm}=  Run keyword  ${qemu_start}
${vhost1}=  Get Vhost User If Name By Sock  ${vm}  ${sock1}
${vhost2}=  Get Vhost User If Name By Sock  ${vm}  ${sock2}
${vhost3}=  Get Vhost User If Name By Sock  ${vm}  ${sock3}
${vhost4}=  Get Vhost User If Name By Sock  ${vm}  ${sock4}
Set Interface State  ${vm}  ${vhost1}  up  if_type=name
Set Interface State  ${vm}  ${vhost2}  up  if_type=name
Set Interface State  ${vm}  ${vhost3}  up  if_type=name
Set Interface State  ${vm}  ${vhost4}  up  if_type=name
Setup Network Namespace  ${vm}  nmspace1  ${vhost1}  ${ip1}  ${prefix_length}
Setup Network Namespace  ${vm}  nmspace2  ${vhost2}  ${ip2}  ${prefix_length}
Setup Network Namespace  ${vm}  nmspace3  ${vhost3}  ${ip3}  ${prefix_length}
Setup Network Namespace  ${vm}  nmspace4  ${vhost4}  ${ip4}  ${prefix_length}
Set Test Variable  ${${qemu_name}}  ${vm}

3.15.1.2. Tear down QEMU

Stop specific qemu instance running on ${dut_node}, ${vm} is VM node info dictionary returned by qemu_start or None. Arguments: - dut_node - Node where to clean qemu. Type: dict - vm - VM node info dictionary. Type: string - qemu_name - Qemu instance by name. Type: string

Example:

| Tear down QEMU | ${node[‘DUT1’]} | ${vm} | qemu_node_1 |


${set_node}=  Replace Variables  ${qemu_name}.Qemu Set Node
${kill}=  Replace Variables  ${qemu_name}.Qemu Kill
${clear_socks}=  Replace Variables  ${qemu_name}.Qemu Clear Socks
Run Keyword  ${set_node}  ${dut_node}
Run Keyword  ${kill}
Run Keyword  ${clear_socks}
Run Keyword If  ${vm} is not None  Disconnect  ${vm}

3.15.2. qemu suite

3.15.2.1. QEMU build list should exist

Return TRUE if variable QEMU_BUILD exist, otherwise FALSE


${ret}  ${tmp}=  Run Keyword And Ignore Error  Variable Should Exist  @{QEMU_BUILD}
Return From Keyword If  "${ret}" == "PASS"  ${TRUE}
Return From Keyword  ${FALSE}

3.15.2.2. Is QEMU ready on node

Check if QEMU was built on the node before


${ret}=  QEMU build list should exist
Return From Keyword If  ${ret} == ${FALSE}  ${FALSE}
${ret}  ${tmp}=  Run Keyword And Ignore Error  Should Contain  ${QEMU_BUILD}  ${node['host']}
Return From Keyword If  "${ret}" == "PASS"  ${TRUE}
Return From Keyword  ${FALSE}

3.15.2.3. Add node to QEMU build list

Add node to the list of nodes with builded QEMU (global variable QEMU_BUILD)


${ret}=  QEMU build list should exist
Run Keyword If  ${ret} == ${TRUE}  Append To List  ${QEMU_BUILD}  ${node['host']}  ELSE  Set Global Variable  @{QEMU_BUILD}  ${node['host']}

3.15.2.4. Build QEMU on node

Build QEMU from sources on the Node. Nodes with successful QEMU build are stored in global variable list QEMU_BUILD

Arguments: - node - Node on which to build qemu. Type: dictionary - force_install - If True, then remove previous build. Type: bool - apply_patch - If True, then apply patches from qemu_patches dir. Type: bool

Example:

| Build QEMU on node | ${node[‘DUT1’]} | False | False |


${ready}=  Is QEMU ready on node  ${node}
Return From Keyword If  ${ready} == ${TRUE}
Build QEMU  ${node}
Add node to QEMU build list  ${node}

3.15.2.5. Build QEMU on all DUTs

Build QEMU from sources on all DUTs. Nodes with successful QEMU build are stored in global variable list QEMU_BUILD

Arguments: - force_install - If True, then remove previous build. Type: bool - apply_patch - If True, then apply patches from qemu_patches dir. Type: bool

Example:

| Build QEMU on all DUTs | False | False |


${duts}=  Get Matches  ${nodes}  DUT*
: FOR  ${dut}  IN  @{duts}
\    Build QEMU on node  ${nodes['${dut}']}  ${force_install}  ${apply_patch}

3.15.2.6. Stop and clear QEMU

Stop QEMU, clear used sockets and close SSH connection running on ${dut}, ${vm} is VM node info dictionary returned by qemu_start or None.


Qemu Set Node  ${dut}
Qemu Kill
Qemu Clear Socks
Run Keyword If  ${vm} is not None  Disconnect  ${vm}

3.15.2.7. Kill Qemu on all DUTs

Kill QEMU processes on all DUTs.


${duts}=  Get Matches  ${nodes}  DUT*
: FOR  ${dut}  IN  @{duts}
\    Qemu Set Node  ${nodes['${dut}']}
\    Qemu Kill