aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/robot
diff options
context:
space:
mode:
authorPeter Mikus <pmikus@cisco.com>2017-08-21 11:01:24 +0200
committerPeter Mikus <pmikus@cisco.com>2017-10-09 09:35:05 +0000
commitdf5ed0d9317e2a1d4a7248459cc6aec39f80a052 (patch)
tree7478e6273ef87b81c536c978e30e3435e4ceee2d /resources/libraries/robot
parent08e35e37f7ad3394cea86c22ab7ffd990651c112 (diff)
CSIT-768: Refactor Python container libraries
CSIT-769: Implement L2 RF keywords for container orchestration Change-Id: I7637d1ecc3a45111522b8d6c578b3f88369aff6b Signed-off-by: Peter Mikus <pmikus@cisco.com>
Diffstat (limited to 'resources/libraries/robot')
-rw-r--r--resources/libraries/robot/performance/performance_setup.robot27
-rw-r--r--resources/libraries/robot/performance/performance_utils.robot2
-rw-r--r--resources/libraries/robot/shared/container.robot121
-rw-r--r--resources/libraries/robot/shared/lxc.robot256
-rw-r--r--resources/libraries/robot/shared/memif.robot26
5 files changed, 143 insertions, 289 deletions
diff --git a/resources/libraries/robot/performance/performance_setup.robot b/resources/libraries/robot/performance/performance_setup.robot
index 9f6d5aeac8..73643dac68 100644
--- a/resources/libraries/robot/performance/performance_setup.robot
+++ b/resources/libraries/robot/performance/performance_setup.robot
@@ -372,6 +372,17 @@
| | Configure crypto device on all DUTs | force_init=${True}
| | Configure kernel module on all DUTs | igb_uio | force_load=${True}
+| Set up performance topology with containers
+| | [Documentation]
+| | ... | Suite preparation phase that starts containers
+| | ...
+| | Set Suite Variable | @{container_groups} | @{EMPTY}
+| | Construct VNF containers on all DUTs
+| | Acquire all 'VNF' containers
+| | Create all 'VNF' containers
+| | Configure VPP in all 'VNF' containers
+| | Install VPP in all 'VNF' containers
+
# Suite teardowns
| Tear down 3-node performance topology
@@ -380,12 +391,14 @@
| | ...
| | Teardown traffic generator | ${tg}
-| Tear down 3-node performance topology with LXC
+| Tear down 3-node performance topology with container
| | [Documentation]
-| | ... | Suite teardown phase with traffic generator teardown and LXC destroy.
+| | ... | Suite teardown phase with traffic generator teardown and container
+| | ... | destroy.
| | ...
| | Teardown traffic generator | ${tg}
-| | Destroy '${lxc_count}' LXC containers on all DUT nodes
+| | :FOR | ${group} | IN | @{container_groups}
+| | | Destroy all '${group}' containers
| Tear down 2-node performance topology
| | [Documentation]
@@ -393,12 +406,14 @@
| | ...
| | Teardown traffic generator | ${tg}
-| Tear down 2-node performance topology with LXC
+| Tear down 2-node performance topology with container
| | [Documentation]
-| | ... | Suite teardown phase with traffic generator teardown and LXC destroy.
+| | ... | Suite teardown phase with traffic generator teardown and container
+| | ... | destroy.
| | ...
| | Teardown traffic generator | ${tg}
-| | Destroy '${lxc_count}' LXC containers on all DUT nodes
+| | :FOR | ${group} | IN | @{container_groups}
+| | | Destroy all '${group}' containers
# Tests setups
diff --git a/resources/libraries/robot/performance/performance_utils.robot b/resources/libraries/robot/performance/performance_utils.robot
index e045075686..884bc4831e 100644
--- a/resources/libraries/robot/performance/performance_utils.robot
+++ b/resources/libraries/robot/performance/performance_utils.robot
@@ -23,7 +23,7 @@
| Resource | resources/libraries/robot/shared/default.robot
| Resource | resources/libraries/robot/shared/interfaces.robot
| Resource | resources/libraries/robot/shared/counters.robot
-| Resource | resources/libraries/robot/shared/lxc.robot
+| Resource | resources/libraries/robot/shared/container.robot
| Resource | resources/libraries/robot/shared/memif.robot
| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot
| Resource | resources/libraries/robot/l2/l2_xconnect.robot
diff --git a/resources/libraries/robot/shared/container.robot b/resources/libraries/robot/shared/container.robot
new file mode 100644
index 0000000000..c8c940ba45
--- /dev/null
+++ b/resources/libraries/robot/shared/container.robot
@@ -0,0 +1,121 @@
+# Copyright (c) 2017 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Documentation | Keywords related to linux containers
+| Library | resources.libraries.python.CpuUtils
+| Library | resources.libraries.python.topology.Topology
+
+*** Keywords ***
+| Construct VNF containers on all DUTs
+| | [Documentation] | Construct 1..N VNF container(s) of specific technology on
+| | ... | all DUT nodes.
+| | ...
+| | ${group}= | Set Variable | VNF
+| | ${guest_dir}= | Set Variable | /mnt/host
+| | ${host_dir}= | Set Variable | /tmp
+| | ${skip_cpus}= | Evaluate | ${vpp_cpus}+${system_cpus}
+| | Import Library | resources.libraries.python.ContainerUtils.ContainerManager
+| | ... | engine=${container_engine} | WITH NAME | ${group}
+| | ${duts}= | Get Matches | ${nodes} | DUT*
+| | :FOR | ${dut} | IN | @{duts}
+| | | ${env}= | Create List | LC_ALL="en_US.UTF-8"
+| | | ... | DEBIAN_FRONTEND=noninteractive | ETCDV3_ENDPOINTS=172.17.0.1:2379
+| | | ${cpu_node}= | Get interfaces numa node | ${nodes['${dut}']}
+| | | ... | ${dut1_if1} | ${dut1_if2}
+| | | Run Keyword | ${group}.Construct containers
+| | | ... | name=${dut}_${group} | node=${nodes['${dut}']}
+| | | ... | host_dir=${host_dir} | guest_dir=${guest_dir}
+| | | ... | image=${container_image} | cpu_count=${container_cpus}
+| | | ... | cpu_skip=${skip_cpus} | smt_used=${False} | cpuset_mems=${cpu_node}
+| | | ... | cpu_shared=${False} | env=${env} | count=${container_count}
+| | Append To List | ${container_groups} | ${group}
+
+| Construct ETCD containers on all DUTs
+| | [Documentation] | Construct Docker ETCD container on all DUTs.
+| | ...
+| | ${group}= | Set Variable | ETCD
+| | ${command}= | Set Variable
+| | ... | /usr/local/bin/etcd -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379
+| | ${host_dir}= | Set Variable | /tmp
+| | ${image}= | Set Variable | quay.io/coreos/etcd:v3.2.5
+| | ${publish}= | Create List | 2379:2379
+| | Import Library | resources.libraries.python.ContainerUtils.ContainerManager
+| | ... | engine=Docker | WITH NAME | ${group}
+| | ${duts}= | Get Matches | ${nodes} | DUT*
+| | :FOR | ${dut} | IN | @{duts}
+| | | ${cpu_node}= | Get interfaces numa node | ${nodes['${dut}']}
+| | | ... | ${dut1_if1} | ${dut1_if2}
+| | | Run Keyword | ${group}.Construct container
+| | | ... | name=${dut}_${group} | node=${nodes['${dut}']}
+| | | ... | image=${container_image} | cpu_count=${1} | cpu_skip=${0}
+| | | ... | smt_used=${False} | cpuset_mems=${cpu_node} | cpu_shared=${True}
+| | | ... | publish=${publish} | command=${command}
+| | Append To List | ${container_groups} | ${group}
+
+| Construct Kafka containers on all DUTs
+| | [Documentation] | Construct Docker Kafka container on all DUTs.
+| | ...
+| | ${group}= | Set Variable | Kafka
+| | ${image}= | Set Variable | spotify/kafka
+| | ${publish}= | Create List | 2181:2181 | 9092:9092
+| | Import Library | resources.libraries.python.ContainerUtils.ContainerManager
+| | ... | engine=Docker | WITH NAME | ${group}
+| | ${duts}= | Get Matches | ${nodes} | DUT*
+| | :FOR | ${dut} | IN | @{duts}
+| | | ${env}= | Create List | ADVERTISED_HOST=172.17.0.1 | ADVERTISED_PORT=9092
+| | | ${cpu_node}= | Get interfaces numa node | ${nodes['${dut}']}
+| | | ... | ${dut1_if1} | ${dut1_if2}
+| | | Run Keyword | ${group}.Construct container
+| | | ... | name=${dut}_${group} | node=${nodes['${dut}']} | image=${image}
+| | | ... | cpu_count=${1} | cpu_skip=${0} | cpuset_mems=${cpu_node}
+| | | ... | smt_used=${False} | cpu_shared=${True} | publish=${publish}
+| | | ... | env=${env}
+| | Append To List | ${container_groups} | ${group}
+
+| Acquire all '${group}' containers
+| | [Documentation] | Acquire all container(s) in specific container group on
+| | ... | all DUT nodes.
+| | ...
+| | Run Keyword | ${group}.Acquire all containers
+
+| Create all '${group}' containers
+| | [Documentation] | Create/deploy all container(s) in specific container group
+| | ... | on all DUT nodes.
+| | ...
+| | Run Keyword | ${group}.Create all containers
+
+| Install VPP in all '${group}' containers
+| | [Documentation] | Install VPP on all container(s) in specific container
+| | ... | group on all DUT nodes.
+| | ...
+| | Run Keyword | ${group}.Install VPP In All Containers
+
+| Configure VPP in all '${group}' containers
+| | [Documentation] | Configure VPP on all container(s) in specific container
+| | ... | group on all DUT nodes.
+| | ...
+| | Run Keyword | ${group}.Configure VPP In All Containers
+| | ... | memif_create_lxc.vat
+
+| Stop all '${group}' containers
+| | [Documentation] | Stop all container(s) in specific container group on all
+| | ... | DUT nodes.
+| | ...
+| | Run Keyword | ${group}.Stop all containers
+
+| Destroy all '${group}' containers
+| | [Documentation] | Destroy all container(s) in specific container group on
+| | ... | all DUT nodes.
+| | ...
+| | Run Keyword | ${group}.Destroy all containers
diff --git a/resources/libraries/robot/shared/lxc.robot b/resources/libraries/robot/shared/lxc.robot
deleted file mode 100644
index 52d81dd3e4..0000000000
--- a/resources/libraries/robot/shared/lxc.robot
+++ /dev/null
@@ -1,256 +0,0 @@
-# Copyright (c) 2017 Cisco and/or its affiliates.
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-*** Settings ***
-| Documentation | Keywords related to linux container (LXC)
-| Library | resources.libraries.python.LXCUtils
-| Library | resources.libraries.python.CpuUtils
-| Library | resources.libraries.python.topology.Topology
-
-*** Keywords ***
-| Create LXC container on DUT node
-| | [Documentation] | Setup lxc container on DUT node.
-| | ...
-| | ... | *Arguments:*
-| | ...
-| | ... | - dut_node - DUT node. Type: dictionary
-| | ... | - lxc_name - Name of LXC container. Type: dictionary
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Create LXC container on DUT node \| ${nodes['DUT1']} \
-| | ... | \| DUT1_slave_1 \|
-| | ...
-| | [Arguments] | ${dut_node} | ${lxc_name}
-| | ...
-| | Import Library | resources.libraries.python.LXCUtils
-| | ... | container_name=${lxc_name} | WITH NAME | ${lxc_name}
-| | Run keyword | ${lxc_name}.Set node | ${dut_node}
-| | Run keyword | ${lxc_name}.Create container | force_create=${TRUE}
-| | Run keyword | ${lxc_name}.Mount host dir in container
-
-| Create LXC container on DUT node with cpuset
-| | [Documentation] | Create LXC container on DUT node with cpuset.
-| | ...
-| | ... | *Arguments:*
-| | ...
-| | ... | - dut_node - DUT node. Type: dictionary
-| | ... | - lxc_name - Name of LXC container. Type: dictionary
-| | ... | - skip - number of cpus which will be skipped. Type: integer
-| | ... | - count - number of cpus which will be allocated for lxc. Type:
-| | ... | integer
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Create LXC container on DUT node with cpuset \
-| | ... | \| ${nodes['DUT1']} \| DUT1_slave_1 \| 6 \| 1 \|
-| | ...
-| | [Arguments] | ${dut_node} | ${lxc_name} | ${skip}=${6} | ${count}=${1}
-| | ...
-| | Import Library | resources.libraries.python.LXCUtils
-| | ... | container_name=${lxc_name} | WITH NAME | ${lxc_name}
-| | ${dut_numa}= | Get interfaces numa node | ${dut_node}
-| | ... | ${dut1_if1} | ${dut1_if2}
-| | ${lxc_cpus}= | CPU list per node str | ${dut_node} | ${dut_numa}
-| | ... | skip_cnt=${skip} | cpu_cnt=${count} | smt_used=${False}
-| | Set Suite Variable | ${lxc_cpus}
-| | Run keyword | ${lxc_name}.Set node | ${dut_node}
-| | Run keyword | ${lxc_name}.Create container | force_create=${TRUE}
-| | Run keyword | ${lxc_name}.Mount host dir in container
-| | Run keyword | ${lxc_name}.Container cpuset cpus | 0,${lxc_cpus}
-
-| Create '${nr}' LXC containers on '${dut}' node
-| | [Documentation] | Create and start multiple lxc containers on DUT node.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Create 5 LXC containers on DUT1 node \|
-| | ...
-| | :FOR | ${number} | IN RANGE | 1 | ${nr}+1
-| | | Create LXC container on DUT node | ${nodes['${dut}']}
-| | | ... | ${dut}_${lxc_base_name}_${number}
-
-| Create '${nr}' LXC containers on all DUT nodes
-| | [Documentation] | Create and start multiple LXC containers on all DUT nodes.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Create 5 LXC containers on all DUT nodes \|
-| | ...
-| | ${duts}= | Get Matches | ${nodes} | DUT*
-| | :FOR | ${dut} | IN | @{duts}
-| | | Create '${nr}' LXC containers on '${dut}' node
-
-| Create '${nr}' LXC containers on '${dut}' node with '${count}' cpus
-| | [Documentation] | Create and start multiple LXC containers on DUT node.
-| | ... | Set the cpuset.cpus cgroup profile for pin of cpus.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Create 5 LXC containers on DUT1 node with 2 cpus \|
-| | ...
-| | ${skip_cpus}= | Evaluate | ${vpp_cpus}+${system_cpus}
-| | ${count_int}= | Convert To Integer | ${count}
-| | ${duts}= | Get Matches | ${nodes} | DUT*
-| | :FOR | ${number} | IN RANGE | 1 | ${nr}+1
-| | | ${skip}= | Evaluate | ${skip_cpus} + (${nr} - 1) * ${count}
-| | | Create LXC container on DUT node with cpuset | ${nodes['${dut}']}
-| | | ... | ${dut}_${lxc_base_name}_${number} | ${skip} | ${count_int}
-
-| Create '${nr}' LXC containers on all DUT nodes with '${count}' cpus
-| | [Documentation] | Create and start multiple LXC containers on all DUT nodes.
-| | ... | Set the cpuset.cpus cgroup profile for pin of cpus.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Create 5 LXC containers on all DUT nodes with 2 cpus \|
-| | ...
-| | ${duts}= | Get Matches | ${nodes} | DUT*
-| | :FOR | ${dut} | IN | @{duts}
-| | | Create '${nr}' LXC containers on '${dut}' node with '${count}' cpus
-
-| Destroy LXC container on DUT node
-| | [Documentation] | Stop and destroy LXC container on DUT node.
-| | ...
-| | ... | *Arguments:*
-| | ...
-| | ... | - dut_node - DUT node. Type: dictionary
-| | ... | - lxc_name - Name of LXC container. Type: dictionary
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Destroy LXC container on DUT node \| ${nodes['DUT1']} \
-| | ... | \| DUT1_slave_1 \|
-| | ...
-| | [Arguments] | ${dut_node} | ${lxc_name}
-| | ...
-| | Import Library | resources.libraries.python.LXCUtils
-| | ... | container_name=${lxc_name} | WITH NAME | ${lxc_name}
-| | Run keyword | ${lxc_name}.Set node | ${dut_node}
-| | Run keyword | ${lxc_name}.Destroy container
-
-| Destroy '${nr}' LXC containers on '${dut}' node
-| | [Documentation] | Stop and destroy multiple LXC containers on DUT node.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Destroy 5 LXC containers on DUT1 node \|
-| | ...
-| | :FOR | ${number} | IN RANGE | 1 | ${nr}+1
-| | | Destroy LXC container on DUT node | ${nodes['${dut}']}
-| | | ... | ${dut}_${lxc_base_name}_${number}
-
-| Destroy '${nr}' LXC containers on all DUT nodes
-| | [Documentation] | Stop and destroy multiple LXC containers on all DUT nodes.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Destroy 5 LXC containers on all DUT nodes \|
-| | ...
-| | ${duts}= | Get Matches | ${nodes} | DUT*
-| | :FOR | ${dut} | IN | @{duts}
-| | | Destroy '${nr}' LXC containers on '${dut}' node
-
-| Install VPP on LXC container on DUT node
-| | [Documentation] | Install vpp on LXC container on DUT node.
-| | ...
-| | ... | *Arguments:*
-| | ...
-| | ... | - dut_node - DUT node. Type: dictionary
-| | ... | - lxc_name - Name of LXC container. Type: dictionary
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Install VPP on LXC container on DUT node \| ${nodes['DUT1']} \
-| | ... | \| DUT1_slave_1 \|
-| | ...
-| | [Arguments] | ${dut_node} | ${lxc_name}
-| | ...
-| | Import Library | resources.libraries.python.LXCUtils
-| | ... | container_name=${lxc_name} | WITH NAME | ${lxc_name}
-| | Run keyword | ${lxc_name}.Set node | ${dut_node}
-| | Run keyword | ${lxc_name}.Install VPP in container
-
-| Install VPP on '${nr}' LXC containers on '${dut}' node
-| | [Documentation] | Install VPP on multiple LXC containers on DUT node.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Install VPP on 5 LXC containers on DUT1 node \|
-| | ...
-| | :FOR | ${number} | IN RANGE | 1 | ${nr}+1
-| | | Install VPP on LXC container on DUT node | ${nodes['${dut}']}
-| | | ... | ${dut}_${lxc_base_name}_${number}
-
-| Install VPP on '${nr}' LXC containers on all DUT nodes
-| | [Documentation] | Install VPP on multiple LXC containers on all DUT nodes.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Install VPP on 5 LXC containers on all DUT nodes \|
-| | ...
-| | ${duts}= | Get Matches | ${nodes} | DUT*
-| | :FOR | ${dut} | IN | @{duts}
-| | | Install VPP on '${nr}' LXC containers on '${dut}' node
-
-| Create startup configuration of VPP on LXC container on DUT node
-| | [Documentation] | Create base startup configuration of VPP on LXC container
-| | ... | on DUT node.
-| | ...
-| | ... | *Arguments:*
-| | ...
-| | ... | - dut_node - DUT node. Type: dictionary
-| | ... | - lxc_name - Name of LXC container. Type: dictionary
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Create startup configuration of VPP on LXC container on DUT node \
-| | ... | \| ${nodes['DUT1']} \| DUT1_slave_1 \|
-| | ...
-| | [Arguments] | ${dut_node} | ${lxc_name}
-| | ...
-| | Import Library | resources.libraries.python.VppConfigGenerator
-| | ... | WITH NAME | ${lxc_name}_conf
-| | Run keyword | ${lxc_name}_conf.Set node | ${dut_node}
-| | Run keyword | ${lxc_name}_conf.Add unix CLI listen
-| | Run keyword | ${lxc_name}_conf.Add unix nodaemon
-| | Run keyword | ${lxc_name}_conf.Add unix exec | "/tmp/running.exec"
-| | Run keyword | ${lxc_name}_conf.Add CPU main core | "0"
-| | Run keyword | ${lxc_name}_conf.Add CPU corelist workers | ${lxc_cpus}
-| | Run Keyword | ${lxc_name}_conf.Apply config LXC | ${lxc_name}
-
-| Create startup configuration of VPP on '${nr}' LXC containers on '${dut}' node
-| | [Documentation] | Create base startup configuration of VPP on multiple LXC
-| | ... | container on DUT node.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Create startup configuration of VPP on 1 LXC containers on DUT1 \
-| | ... | node \|
-| | ...
-| | :FOR | ${number} | IN RANGE | 1 | ${nr}+1
-| | | Create startup configuration of VPP on LXC container on DUT node
-| | | ... | ${nodes['${dut}']} | ${dut}_${lxc_base_name}_${number}
-
-| Create startup configuration of VPP on '${nr}' LXC containers on all DUT nodes
-| | [Documentation] | Create base startup configuration of VPP on multiple LXC
-| | ... | container on all DUT nodes.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Create startup configuration of VPP on 1 LXC containers on all \
-| | ... | DUT nodes \|
-| | ...
-| | ${duts}= | Get Matches | ${nodes} | DUT*
-| | :FOR | ${dut} | IN | @{duts}
-| | | Create startup configuration of VPP on '${nr}' LXC containers on '${dut}' node
diff --git a/resources/libraries/robot/shared/memif.robot b/resources/libraries/robot/shared/memif.robot
index 71909af490..a4857feccf 100644
--- a/resources/libraries/robot/shared/memif.robot
+++ b/resources/libraries/robot/shared/memif.robot
@@ -51,29 +51,3 @@
| | Set Interface State | ${dut_node} | ${memif_2} | up
| | Set Test Variable | ${${memif_if1}} | ${memif_1}
| | Set Test Variable | ${${memif_if2}} | ${memif_2}
-
-| Create memif VPP configuration on '${nr}' LXC containers on '${dut}' node
-| | [Documentation] | Create memif configuration of VPP on multiple LXC
-| | ... | container on DUT node.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Create memif VPP configuration on 1 LXC containers on DUT1 node \|
-| | ...
-| | :FOR | ${number} | IN RANGE | 1 | ${nr}+1
-| | | Run Keyword | ${dut}_${lxc_base_name}_${number}.Create VPP cfg in container
-| | | ... | memif_create_lxc.vat | socket1=memif-${dut}_VNF${number}-1
-| | | ... | socket2=memif-${dut}_VNF${number}-2
-
-| Create memif VPP configuration on '${nr}' LXC containers on all DUT nodes
-| | [Documentation] | Create memif configuration of VPP on multiple LXC
-| | ... | container on all DUT nodes.
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Create memif VPP configuration on 1 LXC containers on all \
-| | ... | DUT nodes \|
-| | ...
-| | ${duts}= | Get Matches | ${nodes} | DUT*
-| | :FOR | ${dut} | IN | @{duts}
-| | | Create memif VPP configuration on '${nr}' LXC containers on '${dut}' node