Add tests for L3 conntrack helper

API tests for L3 Conntrack Helper plugin.

Related-Bug: #1823633
Depends-On: https://review.opendev.org/670837
Change-Id: Ie085100f508f7a1cdb0fd4efbcffa1e2b485fbba
diff --git a/neutron_tempest_plugin/api/base.py b/neutron_tempest_plugin/api/base.py
index 71a0e5e..4441dd1 100644
--- a/neutron_tempest_plugin/api/base.py
+++ b/neutron_tempest_plugin/api/base.py
@@ -137,6 +137,7 @@
         cls.keypairs = []
         cls.trunks = []
         cls.network_segment_ranges = []
+        cls.conntrack_helpers = []
 
     @classmethod
     def resource_cleanup(cls):
@@ -153,6 +154,10 @@
             for floating_ip in cls.floating_ips:
                 cls._try_delete_resource(cls.delete_floatingip, floating_ip)
 
+            # Clean up conntrack helpers
+            for cth in cls.conntrack_helpers:
+                cls._try_delete_resource(cls.delete_conntrack_helper, cth)
+
             # Clean up routers
             for router in cls.routers:
                 cls._try_delete_resource(cls.delete_router,
@@ -960,6 +965,55 @@
 
         client.delete_trunk(trunk['id'])
 
+    @classmethod
+    def create_conntrack_helper(cls, router_id, helper, protocol, port,
+                                client=None):
+        """Create a conntrack helper
+
+        Create a conntrack helper and schedule it for later deletion. If a
+        client is passed, then it is used for deleteing the CTH too.
+
+        :param router_id: The ID of the Neutron router associated to the
+        conntrack helper.
+
+        :param helper: The conntrack helper module alias
+
+        :param protocol: The conntrack helper IP protocol used in the conntrack
+        helper.
+
+        :param port: The conntrack helper IP protocol port number for the
+        conntrack helper.
+
+        :param client: network client to be used for creating and cleaning up
+        the conntrack helper.
+        """
+
+        client = client or cls.client
+
+        cth = client.create_conntrack_helper(router_id, helper, protocol,
+                                             port)['conntrack_helper']
+
+        # save ID of router associated with conntrack helper for final cleanup
+        cth['router_id'] = router_id
+
+        # save client to be used later in cls.delete_conntrack_helper for final
+        # cleanup
+        cth['client'] = client
+        cls.conntrack_helpers.append(cth)
+        return cth
+
+    @classmethod
+    def delete_conntrack_helper(cls, cth, client=None):
+        """Delete conntrack helper
+
+        :param client: Client to be used
+        If client is not given it will use the client used to create the
+        conntrack helper, or cls.client if unknown.
+        """
+
+        client = client or cth.get('client') or cls.client
+        client.delete_conntrack_helper(cth['router_id'], cth['id'])
+
 
 class BaseAdminNetworkTest(BaseNetworkTest):