Migrate CI jobs to Ubuntu Focal

Jobs for master branch are moved to be run on Ubuntu Focal.
All jobs for Stein, Train and Ussuri will be still run on Ubuntu
Bionic.

We also need to switch to legacy ebtables implementation in the
linuxbridge job because ebtables-nft implementation don't
supports syntax for source and destination ipv4 address in arp
tables. Please check bug [1] for more details.

Additionally scenario tests for port forwarding are now marked as
unstable as we have some problem with port forwarding on Ubuntu Focal.
See [2] for details.

Also test test_floating_ip_update is now marked as unstable as it is
failing pretty often on Ubuntu Focal. See [3] for details.

This patch also changes ovn hash used to be installed on the nodes
in the ovn scenario job with Ussuri release as this job is still run
on Ubuntu Bionic and we need to bump this hash there.

This patch additionally switches neutron-tempest-plugin-bgpvpn-bagpipe
jobs for master and ussuri to be non-voting due to bug [4].

This patch also switches neutron-tempest-plugin-designate-scenario
to be non-voting due to the bug [5]

[1] https://bugs.launchpad.net/neutron/+bug/1889779
[2] https://bugs.launchpad.net/neutron/+bug/1896735
[3] https://bugs.launchpad.net/neutron/+bug/1897326
[4] https://bugs.launchpad.net/networking-bagpipe/+bug/1897408
[5] https://bugs.launchpad.net/neutron/+bug/1891309

Related-Bug: #1896735

Change-Id: I9252b6a8786c43524ba0ebaa59b480ef8e489ff1
diff --git a/neutron_tempest_plugin/scenario/test_floatingip.py b/neutron_tempest_plugin/scenario/test_floatingip.py
index 7c59d3a..d541642 100644
--- a/neutron_tempest_plugin/scenario/test_floatingip.py
+++ b/neutron_tempest_plugin/scenario/test_floatingip.py
@@ -392,6 +392,7 @@
 
     same_network = None
 
+    @test.unstable_test("bug 1897326")
     @decorators.idempotent_id('1bdd849b-03dd-4b8f-994f-457cf8a36f93')
     def test_floating_ip_update(self):
         """Test updating FIP with another port.
diff --git a/neutron_tempest_plugin/scenario/test_port_forwardings.py b/neutron_tempest_plugin/scenario/test_port_forwardings.py
index da1db1b..3158ea0 100644
--- a/neutron_tempest_plugin/scenario/test_port_forwardings.py
+++ b/neutron_tempest_plugin/scenario/test_port_forwardings.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from neutron_lib import constants
+from neutron_lib.utils import test
 from oslo_log import log
 from tempest.lib.common.utils import data_utils
 from tempest.lib import decorators
@@ -108,6 +109,7 @@
                     "Timed out waiting for message from server {!r} ".format(
                         server['id'])))
 
+    @test.unstable_test("bug 1896735")
     @decorators.idempotent_id('ab40fc48-ca8d-41a0-b2a3-f6679c847bfe')
     def test_port_forwarding_to_2_servers(self):
         udp_sg_rule = {'protocol': constants.PROTO_NAME_UDP,
@@ -123,6 +125,7 @@
         # And now test UDP port forwarding using nc
         self._test_udp_port_forwarding(servers)
 
+    @test.unstable_test("bug 1896735")
     @decorators.idempotent_id('aa19d46c-a4a6-11ea-bb37-0242ac130002')
     def test_port_forwarding_editing_and_deleting_tcp_rule(self):
         server = self._prepare_resources(
diff --git a/playbooks/linuxbridge-scenario-pre-run.yaml b/playbooks/linuxbridge-scenario-pre-run.yaml
new file mode 100644
index 0000000..26586f6
--- /dev/null
+++ b/playbooks/linuxbridge-scenario-pre-run.yaml
@@ -0,0 +1,7 @@
+- hosts: all
+  tasks:
+    # TODO(slaweq): remove it when nftables will support syntax for src and
+    # destination IP addresses in arp tables:
+    - include_role:
+        name: legacy_ebtables
+      when: ansible_distribution_release | lower == 'focal'
diff --git a/zuul.d/master_jobs.yaml b/zuul.d/master_jobs.yaml
index 45862c8..2c4fc02 100644
--- a/zuul.d/master_jobs.yaml
+++ b/zuul.d/master_jobs.yaml
@@ -158,6 +158,9 @@
     name: neutron-tempest-plugin-scenario-linuxbridge
     parent: neutron-tempest-plugin-scenario
     timeout: 10000
+    roles:
+      - zuul: openstack/neutron
+    pre-run: playbooks/linuxbridge-scenario-pre-run.yaml
     vars:
       network_api_extensions: *api_extensions
       devstack_localrc:
@@ -202,10 +205,6 @@
         ENABLE_CHASSIS_AS_GW: true
         OVN_L3_CREATE_PUBLIC_NETWORK: true
         OVN_DBS_LOG_LEVEL: dbg
-        # TODO(mjozefcz): Stop compiling OVS modules when meter action in kernel
-        # will be released in Ubuntu Bionic.
-        # More info: https://mail.openvswitch.org/pipermail/ovs-discuss/2018-December/048009.html
-        OVN_BUILD_MODULES: True
         ENABLE_TLS: True
         OVN_IGMP_SNOOPING_ENABLE: True
       devstack_services:
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index db4d6e1..afab1d3 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -3,7 +3,11 @@
     check:
       jobs:
         - neutron-tempest-plugin-api
-        - neutron-tempest-plugin-designate-scenario
+        - neutron-tempest-plugin-designate-scenario:
+            # TODO(slaweq): switch it to be voting when bug
+            # https://bugs.launchpad.net/neutron/+bug/1891309
+            # will be fixed
+            voting: false
         - neutron-tempest-plugin-scenario-linuxbridge
         - neutron-tempest-plugin-scenario-openvswitch
         - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
@@ -44,7 +48,11 @@
     check:
       jobs:
         - neutron-tempest-plugin-api-rocky
-        - neutron-tempest-plugin-designate-scenario-rocky
+        - neutron-tempest-plugin-designate-scenario-rocky:
+            # TODO(slaweq): switch it to be voting when bug
+            # https://bugs.launchpad.net/neutron/+bug/1891309
+            # will be fixed
+            voting: false
         - neutron-tempest-plugin-scenario-linuxbridge-rocky
         - neutron-tempest-plugin-scenario-openvswitch-rocky
         - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-rocky
@@ -63,7 +71,11 @@
     check:
       jobs:
         - neutron-tempest-plugin-api-stein
-        - neutron-tempest-plugin-designate-scenario-stein
+        - neutron-tempest-plugin-designate-scenario-stein:
+            # TODO(slaweq): switch it to be voting when bug
+            # https://bugs.launchpad.net/neutron/+bug/1891309
+            # will be fixed
+            voting: false
         - neutron-tempest-plugin-scenario-linuxbridge-stein
         - neutron-tempest-plugin-scenario-openvswitch-stein
         - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-stein
@@ -82,7 +94,11 @@
     check:
       jobs:
         - neutron-tempest-plugin-api-train
-        - neutron-tempest-plugin-designate-scenario-train
+        - neutron-tempest-plugin-designate-scenario-train:
+            # TODO(slaweq): switch it to be voting when bug
+            # https://bugs.launchpad.net/neutron/+bug/1891309
+            # will be fixed
+            voting: false
         - neutron-tempest-plugin-scenario-linuxbridge-train
         - neutron-tempest-plugin-scenario-openvswitch-train
         - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-train
@@ -101,7 +117,11 @@
     check:
       jobs:
         - neutron-tempest-plugin-api-ussuri
-        - neutron-tempest-plugin-designate-scenario-ussuri
+        - neutron-tempest-plugin-designate-scenario-ussuri:
+            # TODO(slaweq): switch it to be voting when bug
+            # https://bugs.launchpad.net/neutron/+bug/1891309
+            # will be fixed
+            voting: false
         - neutron-tempest-plugin-scenario-linuxbridge-ussuri
         - neutron-tempest-plugin-scenario-openvswitch-ussuri
         - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-ussuri
@@ -131,9 +151,17 @@
         - neutron-tempest-plugin-sfc
         - neutron-tempest-plugin-sfc-train
         - neutron-tempest-plugin-sfc-ussuri
-        - neutron-tempest-plugin-bgpvpn-bagpipe
+        - neutron-tempest-plugin-bgpvpn-bagpipe:
+            # TODO(slaweq): switch it to be voting when bug
+            # https://bugs.launchpad.net/networking-bagpipe/+bug/1897408
+            # will be fixed
+            voting: false
         - neutron-tempest-plugin-bgpvpn-bagpipe-train
-        - neutron-tempest-plugin-bgpvpn-bagpipe-ussuri
+        - neutron-tempest-plugin-bgpvpn-bagpipe-ussuri:
+            # TODO(slaweq): switch it to be voting when bug
+            # https://bugs.launchpad.net/networking-bagpipe/+bug/1897408
+            # will be fixed
+            voting: false
         - neutron-tempest-plugin-fwaas-train:
             # TODO(slaweq): switch it to be voting when bug
             # https://bugs.launchpad.net/neutron/+bug/1858645 will be fixed
@@ -150,5 +178,8 @@
     gate:
       jobs:
         - neutron-tempest-plugin-sfc
-        - neutron-tempest-plugin-bgpvpn-bagpipe
+        # TODO(slaweq): make bgpvpn-bagpipe job gating again when
+        # https://bugs.launchpad.net/networking-bagpipe/+bug/1897408
+        # will be fixed
+        #- neutron-tempest-plugin-bgpvpn-bagpipe
         - neutron-tempest-plugin-dynamic-routing
diff --git a/zuul.d/stein_jobs.yaml b/zuul.d/stein_jobs.yaml
index 1c9e299..b132cfc 100644
--- a/zuul.d/stein_jobs.yaml
+++ b/zuul.d/stein_jobs.yaml
@@ -1,6 +1,7 @@
 - job:
     name: neutron-tempest-plugin-api-stein
     parent: neutron-tempest-plugin-api
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/stein
     vars:
       branch_override: stable/stein
@@ -78,6 +79,7 @@
 - job:
     name: neutron-tempest-plugin-scenario-openvswitch-stein
     parent: neutron-tempest-plugin-scenario-openvswitch
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/stein
     vars:
       branch_override: stable/stein
@@ -88,6 +90,7 @@
 - job:
     name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-stein
     parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/stein
     vars:
       branch_override: stable/stein
@@ -98,6 +101,7 @@
 - job:
     name: neutron-tempest-plugin-scenario-linuxbridge-stein
     parent: neutron-tempest-plugin-scenario-linuxbridge
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/stein
     vars:
       branch_override: stable/stein
@@ -108,6 +112,7 @@
 - job:
     name: neutron-tempest-plugin-dvr-multinode-scenario-stein
     parent: neutron-tempest-plugin-dvr-multinode-scenario
+    nodeset: openstack-two-node-bionic
     override-checkout: stable/stein
     vars:
       network_api_extensions_common: *api_extensions
@@ -116,6 +121,7 @@
 - job:
     name: neutron-tempest-plugin-designate-scenario-stein
     parent: neutron-tempest-plugin-designate-scenario
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/stein
     required-projects:
       - openstack/devstack-gate
diff --git a/zuul.d/train_jobs.yaml b/zuul.d/train_jobs.yaml
index 132873b..ab560e0 100644
--- a/zuul.d/train_jobs.yaml
+++ b/zuul.d/train_jobs.yaml
@@ -1,6 +1,7 @@
 - job:
     name: neutron-tempest-plugin-api-train
     parent: neutron-tempest-plugin-api
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/train
     vars:
       branch_override: stable/train
@@ -83,6 +84,7 @@
 - job:
     name: neutron-tempest-plugin-scenario-openvswitch-train
     parent: neutron-tempest-plugin-scenario-openvswitch
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/train
     vars:
       branch_override: stable/train
@@ -93,6 +95,7 @@
 - job:
     name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-train
     parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/train
     vars:
       branch_override: stable/train
@@ -103,6 +106,7 @@
 - job:
     name: neutron-tempest-plugin-scenario-linuxbridge-train
     parent: neutron-tempest-plugin-scenario-linuxbridge
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/train
     vars:
       branch_override: stable/train
@@ -113,6 +117,7 @@
 - job:
     name: neutron-tempest-plugin-dvr-multinode-scenario-train
     parent: neutron-tempest-plugin-dvr-multinode-scenario
+    nodeset: openstack-two-node-bionic
     override-checkout: stable/train
     vars:
       network_api_extensions_common: *api_extensions
@@ -121,6 +126,7 @@
 - job:
     name: neutron-tempest-plugin-designate-scenario-train
     parent: neutron-tempest-plugin-designate-scenario
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/train
     vars:
       branch_override: stable/train
@@ -129,6 +135,7 @@
 - job:
     name: neutron-tempest-plugin-sfc-train
     parent: neutron-tempest-plugin-sfc
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/train
     vars:
       branch_override: stable/train
@@ -137,6 +144,7 @@
 - job:
     name: neutron-tempest-plugin-bgpvpn-bagpipe-train
     parent: neutron-tempest-plugin-bgpvpn-bagpipe
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/train
     vars:
       branch_override: stable/train
@@ -145,6 +153,7 @@
 - job:
     name: neutron-tempest-plugin-fwaas-train
     parent: neutron-tempest-plugin-fwaas-ussuri
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/train
     vars:
       branch_override: stable/train
diff --git a/zuul.d/ussuri_jobs.yaml b/zuul.d/ussuri_jobs.yaml
index a9e578e..e15cf55 100644
--- a/zuul.d/ussuri_jobs.yaml
+++ b/zuul.d/ussuri_jobs.yaml
@@ -1,6 +1,7 @@
 - job:
     name: neutron-tempest-plugin-api-ussuri
     parent: neutron-tempest-plugin-api
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/ussuri
     vars:
       branch_override: stable/ussuri
@@ -87,6 +88,7 @@
 - job:
     name: neutron-tempest-plugin-scenario-openvswitch-ussuri
     parent: neutron-tempest-plugin-scenario-openvswitch
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/ussuri
     vars:
       branch_override: stable/ussuri
@@ -97,6 +99,7 @@
 - job:
     name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-ussuri
     parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/ussuri
     vars:
       branch_override: stable/ussuri
@@ -107,6 +110,7 @@
 - job:
     name: neutron-tempest-plugin-scenario-linuxbridge-ussuri
     parent: neutron-tempest-plugin-scenario-linuxbridge
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/ussuri
     vars:
       branch_override: stable/ussuri
@@ -117,16 +121,24 @@
 - job:
     name: neutron-tempest-plugin-scenario-ovn-ussuri
     parent: neutron-tempest-plugin-scenario-ovn
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/ussuri
     vars:
       branch_override: stable/ussuri
       network_api_extensions: *api_extensions
       devstack_localrc:
         NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+        # TODO(mjozefcz): Stop compiling OVS modules when meter action in kernel
+        # will be released in Ubuntu Bionic.
+        # More info: https://mail.openvswitch.org/pipermail/ovs-discuss/2018-December/048009.html
+        OVN_BUILD_MODULES: True
+        # TODO(skaplons): v2.13.1 is incompatible with kernel 4.15.0-118, sticking to commit hash until new v2.13 tag is created
+        OVS_BRANCH: 0047ca3a0290f1ef954f2c76b31477cf4b9755f5
 
 - job:
     name: neutron-tempest-plugin-dvr-multinode-scenario-ussuri
     parent: neutron-tempest-plugin-dvr-multinode-scenario
+    nodeset: openstack-two-node-bionic
     override-checkout: stable/ussuri
     vars:
       network_api_extensions_common: *api_extensions
@@ -135,6 +147,7 @@
 - job:
     name: neutron-tempest-plugin-designate-scenario-ussuri
     parent: neutron-tempest-plugin-designate-scenario
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/ussuri
     vars:
       branch_override: stable/ussuri
@@ -143,6 +156,7 @@
 - job:
     name: neutron-tempest-plugin-sfc-ussuri
     parent: neutron-tempest-plugin-sfc
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/ussuri
     vars:
       branch_override: stable/ussuri
@@ -151,6 +165,7 @@
 - job:
     name: neutron-tempest-plugin-bgpvpn-bagpipe-ussuri
     parent: neutron-tempest-plugin-bgpvpn-bagpipe
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/ussuri
     vars:
       branch_override: stable/ussuri
@@ -159,6 +174,7 @@
 - job:
     name: neutron-tempest-plugin-fwaas-ussuri
     parent: neutron-tempest-plugin-base
+    nodeset: openstack-single-node-bionic
     timeout: 10800
     override-checkout: stable/ussuri
     required-projects:
@@ -182,6 +198,7 @@
 - job:
     name: neutron-tempest-plugin-dynamic-routing-ussuri
     parent: neutron-tempest-plugin-dynamic-routing
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/ussuri
     vars:
       branch_override: stable/ussuri
@@ -190,6 +207,7 @@
 - job:
     name: neutron-tempest-plugin-vpnaas-ussuri
     parent: neutron-tempest-plugin-vpnaas
+    nodeset: openstack-single-node-bionic
     override-checkout: stable/ussuri
     vars:
       branch_override: stable/ussuri