-| 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
-| | ${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}
-| | | ... | cpuset_mems=${cpu_node} | cpu_shared=${True}
-| | | ... | publish=${publish} | command=${command}
-| | Append To List | ${container_groups} | ${group}
+| Construct chain of containers on all DUTs
+| | [Documentation] | Construct 1 chain of 1..N CNFs on all DUT nodes.
+| | ...
+| | ... | *Arguments:*
+| | ... | - chains: Total number of chains. Type: integer
+| | ... | - nodeness: Total number of nodes per chain. Type: integer
+| | ... | - chain_id: Chain ID. Type: integer
+| | ... | - set_nf_cpus: Set False if CPUs allocatation for network function per
+| | ... | SUT/DUT not required. Type: boolean, default value: ${True}
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Construct chain of containers on all DUTs \| 1 \| 1 \| 1 \
+| | ... | \| ${True} \|
+| | ...
+| | [Arguments] | ${chains} | ${nodeness} | ${chain_id} | ${set_nf_cpus}=${True}
+| | ...
+| | :FOR | ${node_id} | IN RANGE | 1 | ${nodeness}+1
+| | | Construct container on all DUTs | chains=${chains} | nodeness=${nodeness}
+| | | ... | chain_id=${chain_id} | node_id=${node_id}
+| | | ... | set_nf_cpus=${set_nf_cpus}