Migrate dvr multinode scenario to zuulv3 syntax

Job neutron-tempest-plugin-dvr-multinode-scenario was the
last job in neutron-tempest-plugin repo defined using
legacy zuulv2 templates.
This commit migrates it to zuulv3 syntax.

It also adds new ansible role "multi-node-setup" which
which creates patch ports between Neutron's external
bridge (br-ex) and infra bridge (br-infra). That is necessary
to provide connectivity to floating IPs, which may be
configured on subnode when dvr is used, from each node.

This patch introduces also new playbook
"dvr-multinode-scenario-pre-run" which is used to be run in
neutron-tempest-plugin-dvr-multinode-scenario job and which
uses "multi-node-setup" role to create those patch ports
on each host used in job.

Change-Id: Ic5bb7649ebb8bf229459f3d9911f64635cbf1e44
diff --git a/roles/multi-node-setup/README.rst b/roles/multi-node-setup/README.rst
new file mode 100644
index 0000000..b57a977
--- /dev/null
+++ b/roles/multi-node-setup/README.rst
@@ -0,0 +1,23 @@
+Set up connection between infra bridge and Neutron external bridge
+
+Network topology used in CI multinode jobs is described In `Devstack documention
+<https://git.openstack.org/cgit/openstack-infra/devstack-gate/tree/multinode_setup_info.txt#n81>`_
+
+In case when DVR is used, there is also additional bridge ``br-infra`` added
+on each node to provide connectivity to floating IPs from main node.
+
+This bridge needs to be connected with bridge used by Neutron as
+external bridge. Typically it is ``br-ex`` and this role adds patch ports
+between those bridges.
+
+**Role Variables**
+
+.. zuul:rolevar:: neutron_external_bridge_name
+   :default: br-ex
+
+   Name of the Neutron external bridge.
+
+.. zuul:rolevar:: infra_bridge_name
+   :default: br-infra
+
+   Name of the infra bridge.
diff --git a/roles/multi-node-setup/defaults/main.yaml b/roles/multi-node-setup/defaults/main.yaml
new file mode 100644
index 0000000..f166fe7
--- /dev/null
+++ b/roles/multi-node-setup/defaults/main.yaml
@@ -0,0 +1,2 @@
+infra_bridge_name: br-infra
+neutron_external_bridge_name: br-ex
diff --git a/roles/multi-node-setup/tasks/main.yaml b/roles/multi-node-setup/tasks/main.yaml
new file mode 100644
index 0000000..043e70f
--- /dev/null
+++ b/roles/multi-node-setup/tasks/main.yaml
@@ -0,0 +1,17 @@
+- name: Ensure the infra bridge exists
+  become: yes
+  openvswitch_bridge:
+    bridge: "{{ infra_bridge_name }}"
+
+- name: Ensure the Neutron external bridge exists
+  become: yes
+  openvswitch_bridge:
+    bridge: "{{ neutron_external_bridge_name }}"
+
+- name: Create patch port between bridges
+  become: yes
+  command: >-
+    ovs-vsctl --may-exist add-port {{ infra_bridge_name }} patch-{{ neutron_external_bridge_name }}
+    -- set interface patch-{{ neutron_external_bridge_name }} type=patch options:peer=patch-{{ infra_bridge_name }}
+    -- --may-exist add-port {{ neutron_external_bridge_name }} patch-{{ infra_bridge_name }}
+    -- set interface patch-{{ infra_bridge_name }} type=patch options:peer=patch-{{ neutron_external_bridge_name }}