summaryrefslogtreecommitdiff
path: root/openstackclient/tests/unit/network
diff options
context:
space:
mode:
authorSlawek Kaplonski <skaplons@redhat.com>2021-04-07 23:40:16 +0200
committerSlawek Kaplonski <skaplons@redhat.com>2021-06-07 15:34:30 +0200
commitfa8c8d26a7696d169b0b9d5aaf6b723d8feee08a (patch)
tree4cc52ef83217b250b394b69e11cdc4f2e46e0c50 /openstackclient/tests/unit/network
parent82fcf1dbe56ee5dc2cbcba0bab3440afeba6d6ff (diff)
downloadpython-openstackclient-fa8c8d26a7696d169b0b9d5aaf6b723d8feee08a.tar.gz
Add support for Neutron's L3 conntrack helper resource
Neutron has got CRUD API for L3 conntrack helper since some time. This patch adds support for it in the OSC. OpenStack SDK supports that since [1] This patch also bumps minimum OpenStack SDK version to the 0.56.0 as that version introduced support for the Neutron's L3 conntrack helper. [1] https://review.opendev.org/c/openstack/openstacksdk/+/782870 Change-Id: I55604182ae50b6ad70c8bc1f7efad8859f191269
Diffstat (limited to 'openstackclient/tests/unit/network')
-rw-r--r--openstackclient/tests/unit/network/v2/fakes.py75
-rw-r--r--openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py316
2 files changed, 391 insertions, 0 deletions
diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py
index e5023d43..ab77d719 100644
--- a/openstackclient/tests/unit/network/v2/fakes.py
+++ b/openstackclient/tests/unit/network/v2/fakes.py
@@ -1973,3 +1973,78 @@ class FakeFloatingIPPortForwarding(object):
)
return mock.Mock(side_effect=port_forwardings)
+
+
+class FakeL3ConntrackHelper(object):
+ """"Fake one or more L3 conntrack helper"""
+
+ @staticmethod
+ def create_one_l3_conntrack_helper(attrs=None):
+ """Create a fake L3 conntrack helper.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object with protocol, port, etc.
+ """
+ attrs = attrs or {}
+ router_id = (
+ attrs.get('router_id') or 'router-id-' + uuid.uuid4().hex
+ )
+ # Set default attributes.
+ ct_attrs = {
+ 'id': uuid.uuid4().hex,
+ 'router_id': router_id,
+ 'helper': 'tftp',
+ 'protocol': 'tcp',
+ 'port': randint(1, 65535),
+ }
+
+ # Overwrite default attributes.
+ ct_attrs.update(attrs)
+
+ ct = fakes.FakeResource(
+ info=copy.deepcopy(ct_attrs),
+ loaded=True
+ )
+ return ct
+
+ @staticmethod
+ def create_l3_conntrack_helpers(attrs=None, count=2):
+ """Create multiple fake L3 Conntrack helpers.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :param int count:
+ The number of L3 Conntrack helper rule to fake
+ :return:
+ A list of FakeResource objects faking the Conntrack helpers
+ """
+ ct_helpers = []
+ for i in range(0, count):
+ ct_helpers.append(
+ FakeL3ConntrackHelper.create_one_l3_conntrack_helper(attrs)
+ )
+ return ct_helpers
+
+ @staticmethod
+ def get_l3_conntrack_helpers(ct_helpers=None, count=2):
+ """Get a list of faked L3 Conntrack helpers.
+
+ If ct_helpers list is provided, then initialize the Mock object
+ with the list. Otherwise create one.
+
+ :param List ct_helpers:
+ A list of FakeResource objects faking conntrack helpers
+ :param int count:
+ The number of L3 conntrack helpers to fake
+ :return:
+ An iterable Mock object with side_effect set to a list of faked
+ L3 conntrack helpers
+ """
+ if ct_helpers is None:
+ ct_helpers = (
+ FakeL3ConntrackHelper.create_l3_conntrack_helpers(count)
+ )
+
+ return mock.Mock(side_effect=ct_helpers)
diff --git a/openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py b/openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py
new file mode 100644
index 00000000..1676c9ff
--- /dev/null
+++ b/openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py
@@ -0,0 +1,316 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+from unittest import mock
+
+from osc_lib import exceptions
+
+from openstackclient.network.v2 import l3_conntrack_helper
+from openstackclient.tests.unit.network.v2 import fakes as network_fakes
+from openstackclient.tests.unit import utils as tests_utils
+
+
+class TestConntrackHelper(network_fakes.TestNetworkV2):
+
+ def setUp(self):
+ super(TestConntrackHelper, self).setUp()
+ # Get a shortcut to the network client
+ self.network = self.app.client_manager.network
+ self.router = network_fakes.FakeRouter.create_one_router()
+ self.network.find_router = mock.Mock(return_value=self.router)
+
+
+class TestCreateL3ConntrackHelper(TestConntrackHelper):
+
+ def setUp(self):
+ super(TestCreateL3ConntrackHelper, self).setUp()
+ attrs = {'router_id': self.router.id}
+ self.ct_helper = (
+ network_fakes.FakeL3ConntrackHelper.create_one_l3_conntrack_helper(
+ attrs))
+ self.columns = (
+ 'helper',
+ 'id',
+ 'port',
+ 'protocol',
+ 'router_id'
+ )
+
+ self.data = (
+ self.ct_helper.helper,
+ self.ct_helper.id,
+ self.ct_helper.port,
+ self.ct_helper.protocol,
+ self.ct_helper.router_id
+ )
+ self.network.create_conntrack_helper = mock.Mock(
+ return_value=self.ct_helper)
+
+ # Get the command object to test
+ self.cmd = l3_conntrack_helper.CreateConntrackHelper(self.app,
+ self.namespace)
+
+ def test_create_no_options(self):
+ arglist = []
+ verifylist = []
+
+ # Missing required args should bail here
+ self.assertRaises(tests_utils.ParserException, self.check_parser,
+ self.cmd, arglist, verifylist)
+
+ def test_create_default_options(self):
+ arglist = [
+ '--helper', 'tftp',
+ '--protocol', 'udp',
+ '--port', '69',
+ self.router.id,
+ ]
+
+ verifylist = [
+ ('helper', 'tftp'),
+ ('protocol', 'udp'),
+ ('port', 69),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = (self.cmd.take_action(parsed_args))
+
+ self.network.create_conntrack_helper.assert_called_once_with(
+ self.router.id,
+ **{'helper': 'tftp', 'protocol': 'udp',
+ 'port': 69}
+ )
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_create_wrong_options(self):
+ arglist = [
+ '--protocol', 'udp',
+ '--port', '69',
+ self.router.id,
+ ]
+
+ self.assertRaises(
+ tests_utils.ParserException,
+ self.check_parser,
+ self.cmd, arglist, None)
+
+
+class TestDeleteL3ConntrackHelper(TestConntrackHelper):
+
+ def setUp(self):
+ super(TestDeleteL3ConntrackHelper, self).setUp()
+ attrs = {'router_id': self.router.id}
+ self.ct_helper = (
+ network_fakes.FakeL3ConntrackHelper.create_one_l3_conntrack_helper(
+ attrs))
+ self.network.delete_conntrack_helper = mock.Mock(
+ return_value=None)
+
+ # Get the command object to test
+ self.cmd = l3_conntrack_helper.DeleteConntrackHelper(self.app,
+ self.namespace)
+
+ def test_delete(self):
+ arglist = [
+ self.ct_helper.router_id,
+ self.ct_helper.id
+ ]
+ verifylist = [
+ ('conntrack_helper_ids', [self.ct_helper.id]),
+ ('router', self.ct_helper.router_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+ self.network.delete_conntrack_helper.assert_called_once_with(
+ self.ct_helper.id, self.router.id,
+ ignore_missing=False)
+ self.assertIsNone(result)
+
+ def test_delete_error(self):
+ arglist = [
+ self.router.id,
+ self.ct_helper.id
+ ]
+ verifylist = [
+ ('conntrack_helper_ids', [self.ct_helper.id]),
+ ('router', self.router.id),
+ ]
+ self.network.delete_conntrack_helper.side_effect = Exception(
+ 'Error message')
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action, parsed_args)
+
+
+class TestListL3ConntrackHelper(TestConntrackHelper):
+
+ def setUp(self):
+ super(TestListL3ConntrackHelper, self).setUp()
+ attrs = {'router_id': self.router.id}
+ ct_helpers = (
+ network_fakes.FakeL3ConntrackHelper.create_l3_conntrack_helpers(
+ attrs, count=3))
+ self.columns = (
+ 'ID',
+ 'Router ID',
+ 'Helper',
+ 'Protocol',
+ 'Port',
+ )
+ self.data = []
+ for ct_helper in ct_helpers:
+ self.data.append((
+ ct_helper.id,
+ ct_helper.router_id,
+ ct_helper.helper,
+ ct_helper.protocol,
+ ct_helper.port,
+ ))
+ self.network.conntrack_helpers = mock.Mock(
+ return_value=ct_helpers)
+
+ # Get the command object to test
+ self.cmd = l3_conntrack_helper.ListConntrackHelper(self.app,
+ self.namespace)
+
+ def test_conntrack_helpers_list(self):
+ arglist = [
+ self.router.id
+ ]
+ verifylist = [
+ ('router', self.router.id),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.network.conntrack_helpers.assert_called_once_with(
+ self.router.id)
+ self.assertEqual(self.columns, columns)
+ list_data = list(data)
+ self.assertEqual(len(self.data), len(list_data))
+ for index in range(len(list_data)):
+ self.assertEqual(self.data[index], list_data[index])
+
+
+class TestSetL3ConntrackHelper(TestConntrackHelper):
+
+ def setUp(self):
+ super(TestSetL3ConntrackHelper, self).setUp()
+ attrs = {'router_id': self.router.id}
+ self.ct_helper = (
+ network_fakes.FakeL3ConntrackHelper.create_one_l3_conntrack_helper(
+ attrs))
+ self.network.update_conntrack_helper = mock.Mock(return_value=None)
+
+ # Get the command object to test
+ self.cmd = l3_conntrack_helper.SetConntrackHelper(self.app,
+ self.namespace)
+
+ def test_set_nothing(self):
+ arglist = [
+ self.router.id,
+ self.ct_helper.id,
+ ]
+ verifylist = [
+ ('router', self.router.id),
+ ('conntrack_helper_id', self.ct_helper.id),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = (self.cmd.take_action(parsed_args))
+
+ self.network.update_conntrack_helper.assert_called_once_with(
+ self.ct_helper.id, self.router.id
+ )
+ self.assertIsNone(result)
+
+ def test_set_port(self):
+ arglist = [
+ self.router.id,
+ self.ct_helper.id,
+ '--port', '124',
+ ]
+ verifylist = [
+ ('router', self.router.id),
+ ('conntrack_helper_id', self.ct_helper.id),
+ ('port', 124),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = (self.cmd.take_action(parsed_args))
+
+ self.network.update_conntrack_helper.assert_called_once_with(
+ self.ct_helper.id, self.router.id, port=124
+ )
+ self.assertIsNone(result)
+
+
+class TestShowL3ConntrackHelper(TestConntrackHelper):
+
+ def setUp(self):
+ super(TestShowL3ConntrackHelper, self).setUp()
+ attrs = {'router_id': self.router.id}
+ self.ct_helper = (
+ network_fakes.FakeL3ConntrackHelper.create_one_l3_conntrack_helper(
+ attrs))
+ self.columns = (
+ 'helper',
+ 'id',
+ 'port',
+ 'protocol',
+ 'router_id'
+ )
+
+ self.data = (
+ self.ct_helper.helper,
+ self.ct_helper.id,
+ self.ct_helper.port,
+ self.ct_helper.protocol,
+ self.ct_helper.router_id
+ )
+ self.network.get_conntrack_helper = mock.Mock(
+ return_value=self.ct_helper)
+
+ # Get the command object to test
+ self.cmd = l3_conntrack_helper.ShowConntrackHelper(self.app,
+ self.namespace)
+
+ def test_show_no_options(self):
+ arglist = []
+ verifylist = []
+
+ # Missing required args should bail here
+ self.assertRaises(tests_utils.ParserException, self.check_parser,
+ self.cmd, arglist, verifylist)
+
+ def test_show_default_options(self):
+ arglist = [
+ self.router.id,
+ self.ct_helper.id,
+ ]
+ verifylist = [
+ ('router', self.router.id),
+ ('conntrack_helper_id', self.ct_helper.id),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = (self.cmd.take_action(parsed_args))
+
+ self.network.get_conntrack_helper.assert_called_once_with(
+ self.ct_helper.id, self.router.id
+ )
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)