diff -pruN 1:7.6.0-2/debian/changelog 1:7.8.0-2/debian/changelog
--- 1:7.6.0-2/debian/changelog	2021-09-29 15:49:23.000000000 +0000
+++ 1:7.8.0-2/debian/changelog	2022-03-25 10:24:40.000000000 +0000
@@ -1,3 +1,17 @@
+python-neutronclient (1:7.8.0-2) unstable; urgency=medium
+
+  * Uploading to unstable.
+
+ -- Thomas Goirand <zigo@debian.org>  Fri, 25 Mar 2022 11:24:40 +0100
+
+python-neutronclient (1:7.8.0-1) experimental; urgency=medium
+
+  * New upstream release.
+  * Add autopkgtest.
+  * Run all unit tests.
+
+ -- Thomas Goirand <zigo@debian.org>  Sat, 26 Feb 2022 22:55:10 +0100
+
 python-neutronclient (1:7.6.0-2) unstable; urgency=medium
 
   * Uploading to unstable.
diff -pruN 1:7.6.0-2/debian/rules 1:7.8.0-2/debian/rules
--- 1:7.6.0-2/debian/rules	2021-09-29 15:49:23.000000000 +0000
+++ 1:7.8.0-2/debian/rules	2022-03-25 10:24:40.000000000 +0000
@@ -18,7 +18,7 @@ override_dh_auto_install:
 ifeq (,$(findstring nocheck, $(DEB_BUILD_OPTIONS)))
 override_dh_auto_test:
 	# See https://bugs.launchpad.net/python-neutronclient/+bug/1790957
-	pkgos-dh_auto_test --no-py2 'neutronclient\.tests\.unit\.(?!(.*osc\.v2\.fwaas\.test_firewallrule\.TestShowFirewallRule\.test_show_filtered_by_id_or_name.*|.*osc\.v2\.fwaas\.test_firewallrule\.TestListFirewallRule\.test_list_with_long_option.*|.*osc\.v2\.fwaas\.test_firewallrule\.TestCreateFirewallRule\.test_create_with_no_options.*|.*osc\.v2\.fwaas\.test_firewallrule\.TestCreateFirewallRule\.test_create_with_all_params_protocol_any.*))'
+	pkgos-dh_auto_test --no-py2 'neutronclient\.tests\.unit.*'
 endif
 
 #override_dh_installman:
diff -pruN 1:7.6.0-2/debian/tests/control 1:7.8.0-2/debian/tests/control
--- 1:7.6.0-2/debian/tests/control	2021-09-29 15:49:23.000000000 +0000
+++ 1:7.8.0-2/debian/tests/control	2022-03-25 10:24:40.000000000 +0000
@@ -1,3 +1,5 @@
-Tests: client
+Tests: unittests
 Depends:
- python3-neutronclient,
+ @,
+ @builddeps@,
+Restrictions: allow-stderr needs-root
diff -pruN 1:7.6.0-2/debian/tests/unittests 1:7.8.0-2/debian/tests/unittests
--- 1:7.6.0-2/debian/tests/unittests	1970-01-01 00:00:00.000000000 +0000
+++ 1:7.8.0-2/debian/tests/unittests	2022-03-25 10:24:40.000000000 +0000
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+set -e
+
+pkgos-dh_auto_test --no-py2 'neutronclient\.tests\.unit.*'
diff -pruN 1:7.6.0-2/lower-constraints.txt 1:7.8.0-2/lower-constraints.txt
--- 1:7.6.0-2/lower-constraints.txt	2021-09-02 02:27:46.000000000 +0000
+++ 1:7.8.0-2/lower-constraints.txt	2022-01-19 23:35:59.000000000 +0000
@@ -11,7 +11,7 @@ contextlib2==0.4.0
 coverage==4.0
 cryptography==2.7
 debtcollector==1.2.0
-decorator==3.4.0
+decorator==4.1.0
 deprecation==1.0
 docutils==0.11
 dogpile.cache==0.6.5
diff -pruN 1:7.6.0-2/neutronclient/neutron/v2_0/port.py 1:7.8.0-2/neutronclient/neutron/v2_0/port.py
--- 1:7.6.0-2/neutronclient/neutron/v2_0/port.py	2021-09-02 02:27:46.000000000 +0000
+++ 1:7.8.0-2/neutronclient/neutron/v2_0/port.py	2022-01-19 23:35:59.000000000 +0000
@@ -245,15 +245,15 @@ class CreatePort(neutronV20.CreateComman
         parser.add_argument(
             '--vnic-type',
             metavar='<direct | direct-physical | macvtap '
-                    '| normal | baremetal>',
+                    '| normal | baremetal | smart-nic>',
             choices=['direct', 'direct-physical', 'macvtap',
-                     'normal', 'baremetal'],
+                     'normal', 'baremetal', 'smart-nic'],
             type=utils.convert_to_lowercase,
             help=_('VNIC type for this port.'))
         parser.add_argument(
             '--vnic_type',
             choices=['direct', 'direct-physical', 'macvtap',
-                     'normal', 'baremetal'],
+                     'normal', 'baremetal', 'smart-nic'],
             type=utils.convert_to_lowercase,
             help=argparse.SUPPRESS)
         parser.add_argument(
diff -pruN 1:7.6.0-2/neutronclient/tests/unit/test_cli20_port.py 1:7.8.0-2/neutronclient/tests/unit/test_cli20_port.py
--- 1:7.6.0-2/neutronclient/tests/unit/test_cli20_port.py	2021-09-02 02:27:46.000000000 +0000
+++ 1:7.8.0-2/neutronclient/tests/unit/test_cli20_port.py	2022-01-19 23:35:59.000000000 +0000
@@ -214,6 +214,26 @@ class CLITestV20PortJSON(test_cli20.CLIT
         self._test_create_resource(resource, cmd, name, myid, args,
                                    position_names, position_values)
 
+    def test_create_port_vnic_type_smart_nic(self):
+        # Create port: --vnic_type smart-nic netid.
+        resource = 'port'
+        cmd = port.CreatePort(test_cli20.MyApp(sys.stdout), None)
+        name = 'myname'
+        myid = 'myid'
+        netid = 'netid'
+        args = ['--vnic_type', 'smart-nic', netid]
+        position_names = ['binding:vnic_type', 'network_id']
+        position_values = ['smart-nic', netid]
+        self._test_create_resource(resource, cmd, name, myid, args,
+                                   position_names, position_values)
+
+        # Test dashed options
+        args = ['--vnic-type', 'smart-nic', netid]
+        position_names = ['binding:vnic_type', 'network_id']
+        position_values = ['smart-nic', netid]
+        self._test_create_resource(resource, cmd, name, myid, args,
+                                   position_names, position_values)
+
     def test_create_port_with_binding_profile(self):
         resource = 'port'
         cmd = port.CreatePort(test_cli20.MyApp(sys.stdout), None)
diff -pruN 1:7.6.0-2/neutronclient/tests/unit/test_shell.py 1:7.8.0-2/neutronclient/tests/unit/test_shell.py
--- 1:7.6.0-2/neutronclient/tests/unit/test_shell.py	2021-09-02 02:27:46.000000000 +0000
+++ 1:7.8.0-2/neutronclient/tests/unit/test_shell.py	2022-01-19 23:35:59.000000000 +0000
@@ -357,10 +357,10 @@ class ShellTest(testtools.TestCase):
         self.useFixture(fixtures.MockPatchObject(openstack_shell,
                                                  'COMMANDS', None))
         openstack_shell.NeutronShell('2.0')
-        self.assertDictContainsSubset(
+        self.assertLessEqual(
             {'net-create': network.CreateNetwork,
              'net-delete': network.DeleteNetwork,
              'net-list': network.ListNetwork,
              'net-show': network.ShowNetwork,
-             'net-update': network.UpdateNetwork},
-            openstack_shell.COMMANDS['2.0'])
+             'net-update': network.UpdateNetwork}.items(),
+            openstack_shell.COMMANDS['2.0'].items())
diff -pruN 1:7.6.0-2/neutronclient/v2_0/client.py 1:7.8.0-2/neutronclient/v2_0/client.py
--- 1:7.6.0-2/neutronclient/v2_0/client.py	2021-09-02 02:27:46.000000000 +0000
+++ 1:7.8.0-2/neutronclient/v2_0/client.py	2022-01-19 23:35:59.000000000 +0000
@@ -619,12 +619,20 @@ class Client(ClientBase):
     qos_policy_path = "/qos/policies/%s"
     qos_bandwidth_limit_rules_path = "/qos/policies/%s/bandwidth_limit_rules"
     qos_bandwidth_limit_rule_path = "/qos/policies/%s/bandwidth_limit_rules/%s"
+    qos_packet_rate_limit_rules_path = \
+        "/qos/policies/%s/packet_rate_limit_rules"
+    qos_packet_rate_limit_rule_path = \
+        "/qos/policies/%s/packet_rate_limit_rules/%s"
     qos_dscp_marking_rules_path = "/qos/policies/%s/dscp_marking_rules"
     qos_dscp_marking_rule_path = "/qos/policies/%s/dscp_marking_rules/%s"
     qos_minimum_bandwidth_rules_path = \
         "/qos/policies/%s/minimum_bandwidth_rules"
     qos_minimum_bandwidth_rule_path = \
         "/qos/policies/%s/minimum_bandwidth_rules/%s"
+    qos_minimum_packet_rate_rules_path = \
+        "/qos/policies/%s/minimum_packet_rate_rules"
+    qos_minimum_packet_rate_rule_path = \
+        "/qos/policies/%s/minimum_packet_rate_rules/%s"
     qos_rule_types_path = "/qos/rule-types"
     qos_rule_type_path = "/qos/rule-types/%s"
     flavors_path = "/flavors"
@@ -708,7 +716,9 @@ class Client(ClientBase):
                      'qos_policies': 'qos_policy',
                      'policies': 'policy',
                      'bandwidth_limit_rules': 'bandwidth_limit_rule',
+                     'packet_rate_limit_rules': 'packet_rate_limit_rule',
                      'minimum_bandwidth_rules': 'minimum_bandwidth_rule',
+                     'minimum_packet_rate_rules': 'minimum_packet_rate_rule',
                      'rules': 'rule',
                      'dscp_marking_rules': 'dscp_marking_rule',
                      'rule_types': 'rule_type',
@@ -1972,6 +1982,35 @@ class Client(ClientBase):
         return self.post(self.qos_minimum_bandwidth_rules_path % policy,
                          body=body)
 
+    def list_packet_rate_limit_rules(self, policy_id, retrieve_all=True,
+                                     **_params):
+        """Fetches a list of all packet rate limit rules for the given policy
+
+        """
+        return self.list('packet_rate_limit_rules',
+                         self.qos_packet_rate_limit_rules_path %
+                         policy_id, retrieve_all, **_params)
+
+    def show_packet_rate_limit_rule(self, rule, policy, body=None):
+        """Fetches information of a certain packet rate limit rule."""
+        return self.get(self.qos_packet_rate_limit_rule_path %
+                        (policy, rule), body=body)
+
+    def create_packet_rate_limit_rule(self, policy, body=None):
+        """Creates a new packet rate limit rule."""
+        return self.post(self.qos_packet_rate_limit_rules_path % policy,
+                         body=body)
+
+    def update_packet_rate_limit_rule(self, rule, policy, body=None):
+        """Updates a packet rate limit rule."""
+        return self.put(self.qos_packet_rate_limit_rule_path %
+                        (policy, rule), body=body)
+
+    def delete_packet_rate_limit_rule(self, rule, policy):
+        """Deletes a packet rate limit rule."""
+        return self.delete(self.qos_packet_rate_limit_rule_path %
+                           (policy, rule))
+
     def update_minimum_bandwidth_rule(self, rule, policy, body=None):
         """Updates a minimum bandwidth rule."""
         return self.put(self.qos_minimum_bandwidth_rule_path %
@@ -1982,6 +2021,35 @@ class Client(ClientBase):
         return self.delete(self.qos_minimum_bandwidth_rule_path %
                            (policy, rule))
 
+    def list_minimum_packet_rate_rules(self, policy_id, retrieve_all=True,
+                                       **_params):
+        """Fetches a list of all minimum packet rate rules for the given policy
+
+        """
+        return self.list('minimum_packet_rate_rules',
+                         self.qos_minimum_packet_rate_rules_path %
+                         policy_id, retrieve_all, **_params)
+
+    def show_minimum_packet_rate_rule(self, rule, policy, body=None):
+        """Fetches information of a certain minimum packet rate rule."""
+        return self.get(self.qos_minimum_packet_rate_rule_path %
+                        (policy, rule), body=body)
+
+    def create_minimum_packet_rate_rule(self, policy, body=None):
+        """Creates a new minimum packet rate rule."""
+        return self.post(self.qos_minimum_packet_rate_rules_path % policy,
+                         body=body)
+
+    def update_minimum_packet_rate_rule(self, rule, policy, body=None):
+        """Updates a minimum packet rate rule."""
+        return self.put(self.qos_minimum_packet_rate_rule_path %
+                        (policy, rule), body=body)
+
+    def delete_minimum_packet_rate_rule(self, rule, policy):
+        """Deletes a minimum packet rate rule."""
+        return self.delete(self.qos_minimum_packet_rate_rule_path %
+                           (policy, rule))
+
     def create_flavor(self, body=None):
         """Creates a new Neutron service flavor."""
         return self.post(self.flavors_path, body=body)
diff -pruN 1:7.6.0-2/releasenotes/notes/minimum-packet-rate-34576b8fd98a3034.yaml 1:7.8.0-2/releasenotes/notes/minimum-packet-rate-34576b8fd98a3034.yaml
--- 1:7.6.0-2/releasenotes/notes/minimum-packet-rate-34576b8fd98a3034.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 1:7.8.0-2/releasenotes/notes/minimum-packet-rate-34576b8fd98a3034.yaml	2022-01-19 23:35:59.000000000 +0000
@@ -0,0 +1,7 @@
+---
+features:
+  - |
+    Added new client methods for QoS minimum packet rate rule:
+    ``list_minimum_packet_rate_rules``, ``show_minimum_packet_rate_rule``,
+    ``create_minimum_packet_rate_rule``, ``update_minimum_packet_rate_rule``,
+    ``delete_minimum_packet_rate_rule``.
diff -pruN 1:7.6.0-2/releasenotes/notes/paket_rate_limit-1266a2a30f18727f.yaml 1:7.8.0-2/releasenotes/notes/paket_rate_limit-1266a2a30f18727f.yaml
--- 1:7.6.0-2/releasenotes/notes/paket_rate_limit-1266a2a30f18727f.yaml	1970-01-01 00:00:00.000000000 +0000
+++ 1:7.8.0-2/releasenotes/notes/paket_rate_limit-1266a2a30f18727f.yaml	2022-01-19 23:35:59.000000000 +0000
@@ -0,0 +1,7 @@
+---
+features:
+  - |
+    Added new client methods for QoS packet rate limit rule:
+    ``list_packet_rate_limit_rules``, ``show_packet_rate_limit_rule``,
+    ``create_packet_rate_limit_rule``, ``update_packet_rate_limit_rule``,
+    ``delete_packet_rate_limit_rule``.
diff -pruN 1:7.6.0-2/releasenotes/source/index.rst 1:7.8.0-2/releasenotes/source/index.rst
--- 1:7.6.0-2/releasenotes/source/index.rst	2021-09-02 02:27:46.000000000 +0000
+++ 1:7.8.0-2/releasenotes/source/index.rst	2022-01-19 23:35:59.000000000 +0000
@@ -6,6 +6,7 @@
    :maxdepth: 1
 
    unreleased
+   xena
    wallaby
    victoria
    ussuri
diff -pruN 1:7.6.0-2/releasenotes/source/xena.rst 1:7.8.0-2/releasenotes/source/xena.rst
--- 1:7.6.0-2/releasenotes/source/xena.rst	1970-01-01 00:00:00.000000000 +0000
+++ 1:7.8.0-2/releasenotes/source/xena.rst	2022-01-19 23:35:59.000000000 +0000
@@ -0,0 +1,6 @@
+=========================
+Xena Series Release Notes
+=========================
+
+.. release-notes::
+   :branch: stable/xena
diff -pruN 1:7.6.0-2/setup.cfg 1:7.8.0-2/setup.cfg
--- 1:7.6.0-2/setup.cfg	2021-09-02 02:27:46.000000000 +0000
+++ 1:7.8.0-2/setup.cfg	2022-01-19 23:35:59.000000000 +0000
@@ -21,6 +21,7 @@ classifier =
     Programming Language :: Python :: 3.6
     Programming Language :: Python :: 3.7
     Programming Language :: Python :: 3.8
+    Programming Language :: Python :: 3.9
 
 [files]
 packages =
diff -pruN 1:7.6.0-2/tox.ini 1:7.8.0-2/tox.ini
--- 1:7.6.0-2/tox.ini	2021-09-02 02:27:46.000000000 +0000
+++ 1:7.8.0-2/tox.ini	2022-01-19 23:35:59.000000000 +0000
@@ -1,5 +1,5 @@
 [tox]
-envlist = py38,pep8
+envlist = py39,pep8
 minversion = 3.18.0
 skipsdist = True
 ignore_basepython_conflict = True
diff -pruN 1:7.6.0-2/.zuul.yaml 1:7.8.0-2/.zuul.yaml
--- 1:7.6.0-2/.zuul.yaml	2021-09-02 02:27:46.000000000 +0000
+++ 1:7.8.0-2/.zuul.yaml	2022-01-19 23:35:59.000000000 +0000
@@ -2,7 +2,7 @@
     templates:
       - openstack-cover-jobs
       - openstack-lower-constraints-jobs
-      - openstack-python3-xena-jobs
+      - openstack-python3-yoga-jobs
       - publish-openstack-docs-pti
       - check-requirements
       - lib-forward-testing-python3
@@ -64,6 +64,7 @@
         Q_ML2_TENANT_NETWORK_TYPE: vxlan
         Q_ML2_PLUGIN_MECHANISM_DRIVERS: openvswitch
       devstack_plugins:
+        neutron: https://opendev.org/openstack/neutron
         neutron-vpnaas: https://opendev.org/openstack/neutron-vpnaas
 
 - job:
