summaryrefslogtreecommitdiff
path: root/openstackclient/tests/unit/network
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/tests/unit/network')
-rw-r--r--openstackclient/tests/unit/network/v2/fakes.py101
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py267
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_flavor.py407
-rw-r--r--openstackclient/tests/unit/network/v2/test_port.py131
-rw-r--r--openstackclient/tests/unit/network/v2/test_security_group_rule.py42
5 files changed, 901 insertions, 47 deletions
diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py
index eb965339..7afe3328 100644
--- a/openstackclient/tests/unit/network/v2/fakes.py
+++ b/openstackclient/tests/unit/network/v2/fakes.py
@@ -71,6 +71,10 @@ class TestNetworkV2(utils.TestCommand):
token=fakes.AUTH_TOKEN,
)
+ self.app.client_manager.sdk_connection = mock.Mock()
+ self.app.client_manager.sdk_connection.network = \
+ self.app.client_manager.network
+
self.app.client_manager.identity = (
identity_fakes_v3.FakeIdentityv3Client(
endpoint=fakes.AUTH_URL,
@@ -153,6 +157,31 @@ class FakeAddressScope(object):
return mock.Mock(side_effect=address_scopes)
+class FakeAutoAllocatedTopology(object):
+ """Fake Auto Allocated Topology"""
+
+ @staticmethod
+ def create_one_topology(attrs=None):
+ attrs = attrs or {}
+
+ auto_allocated_topology_attrs = {
+ 'id': 'network-id-' + uuid.uuid4().hex,
+ 'tenant_id': 'project-id-' + uuid.uuid4().hex,
+ }
+
+ auto_allocated_topology_attrs.update(attrs)
+
+ auto_allocated_topology = fakes.FakeResource(
+ info=copy.deepcopy(auto_allocated_topology_attrs),
+ loaded=True)
+
+ auto_allocated_topology.project_id = auto_allocated_topology_attrs[
+ 'tenant_id'
+ ]
+
+ return auto_allocated_topology
+
+
class FakeAvailabilityZone(object):
"""Fake one or more network availability zones (AZs)."""
@@ -386,6 +415,69 @@ class FakeNetwork(object):
return mock.Mock(side_effect=networks)
+class FakeNetworkFlavor(object):
+ """Fake Network Flavor."""
+
+ @staticmethod
+ def create_one_network_flavor(attrs=None):
+ """Create a fake network flavor.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object faking the network flavor
+ """
+ attrs = attrs or {}
+
+ fake_uuid = uuid.uuid4().hex
+ network_flavor_attrs = {
+ 'description': 'network-flavor-description-' + fake_uuid,
+ 'enabled': True,
+ 'id': 'network-flavor-id-' + fake_uuid,
+ 'name': 'network-flavor-name-' + fake_uuid,
+ 'service_type': 'vpn',
+ 'tenant_id': 'project-id-' + uuid.uuid4().hex,
+ }
+
+ # Overwrite default attributes.
+ network_flavor_attrs.update(attrs)
+
+ network_flavor = fakes.FakeResource(
+ info=copy.deepcopy(network_flavor_attrs),
+ loaded=True
+ )
+
+ network_flavor.project_id = network_flavor_attrs['tenant_id']
+ network_flavor.is_enabled = network_flavor_attrs['enabled']
+
+ return network_flavor
+
+ @staticmethod
+ def create_flavor(attrs=None, count=2):
+ """Create multiple fake network flavors.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :param int count:
+ The number of network flavors to fake
+ :return:
+ A list of FakeResource objects faking the network falvors
+ """
+ network_flavors = []
+ for i in range(0, count):
+ network_flavors.append(
+ FakeNetworkFlavor.create_one_network_flavor(attrs)
+ )
+ return network_flavors
+
+ @staticmethod
+ def get_flavor(network_flavors=None, count=2):
+ """Get a list of flavors."""
+ if network_flavors is None:
+ network_flavors = (FakeNetworkFlavor.create_flavor(count))
+ return mock.Mock(side_effect=network_flavors)
+
+
class FakeNetworkSegment(object):
"""Fake one or more network segments."""
@@ -470,13 +562,14 @@ class FakePort(object):
'dns_assignment': [{}],
'dns_name': 'dns-name-' + uuid.uuid4().hex,
'extra_dhcp_opts': [{}],
- 'fixed_ips': [{}],
+ 'fixed_ips': [{'ip_address': '10.0.0.3',
+ 'subnet_id': 'subnet-id-' + uuid.uuid4().hex}],
'id': 'port-id-' + uuid.uuid4().hex,
'mac_address': 'fa:16:3e:a9:4e:72',
'name': 'port-name-' + uuid.uuid4().hex,
'network_id': 'network-id-' + uuid.uuid4().hex,
'port_security_enabled': True,
- 'security_groups': [],
+ 'security_group_ids': [],
'status': 'ACTIVE',
'tenant_id': 'project-id-' + uuid.uuid4().hex,
}
@@ -496,7 +589,7 @@ class FakePort(object):
port.is_admin_state_up = port_attrs['admin_state_up']
port.is_port_security_enabled = port_attrs['port_security_enabled']
port.project_id = port_attrs['tenant_id']
- port.security_group_ids = port_attrs['security_groups']
+ port.security_group_ids = port_attrs['security_group_ids']
return port
@@ -1051,7 +1144,7 @@ class FakeSecurityGroupRule(object):
'description': 'security-group-rule-description-' +
uuid.uuid4().hex,
'direction': 'ingress',
- 'ethertype': 'IPv4',
+ 'ether_type': 'IPv4',
'id': 'security-group-rule-id-' + uuid.uuid4().hex,
'port_range_max': None,
'port_range_min': None,
diff --git a/openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py b/openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py
new file mode 100644
index 00000000..1a231160
--- /dev/null
+++ b/openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py
@@ -0,0 +1,267 @@
+# Copyright (c) 2016, Intel Corporation.
+# All Rights Reserved.
+#
+# 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.
+
+import mock
+
+from openstackclient.network.v2 import network_auto_allocated_topology
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
+from openstackclient.tests.unit.network.v2 import fakes as network_fakes
+
+
+class TestAutoAllocatedTopology(network_fakes.TestNetworkV2):
+ def setUp(self):
+ super(TestAutoAllocatedTopology, self).setUp()
+ self.network = self.app.client_manager.network
+ self.projects_mock = self.app.client_manager.identity.projects
+
+
+class TestCreateAutoAllocatedTopology(TestAutoAllocatedTopology):
+ project = identity_fakes.FakeProject.create_one_project()
+ network_object = network_fakes.FakeNetwork.create_one_network()
+
+ topology = network_fakes.FakeAutoAllocatedTopology.create_one_topology(
+ attrs={'id': network_object.id,
+ 'tenant_id': project.id}
+ )
+
+ columns = (
+ 'id',
+ 'project_id',
+ )
+
+ data = (
+ network_object.id,
+ project.id,
+ )
+
+ def setUp(self):
+ super(TestCreateAutoAllocatedTopology, self).setUp()
+
+ self.cmd = network_auto_allocated_topology.CreateAutoAllocatedTopology(
+ self.app,
+ self.namespace)
+ self.network.get_auto_allocated_topology = mock.Mock(
+ return_value=self.topology)
+
+ def test_create_no_options(self):
+ arglist = []
+ verifylist = []
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.network.get_auto_allocated_topology.assert_called_with(None)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_create_project_option(self):
+ arglist = [
+ '--project', self.project.id,
+ ]
+
+ verifylist = [
+ ('project', self.project.id),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.network.get_auto_allocated_topology.assert_called_with(
+ self.project.id
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_create_project_domain_option(self):
+ arglist = [
+ '--project', self.project.id,
+ '--project-domain', self.project.domain_id,
+ ]
+
+ verifylist = [
+ ('project', self.project.id),
+ ('project_domain', self.project.domain_id),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.network.get_auto_allocated_topology.assert_called_with(
+ self.project.id
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_create_or_show_option(self):
+ arglist = [
+ '--or-show',
+ ]
+
+ verifylist = [
+ ('or_show', True),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+ self.network.get_auto_allocated_topology.assert_called_with(None)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+
+class TestValidateAutoAllocatedTopology(TestAutoAllocatedTopology):
+ project = identity_fakes.FakeProject.create_one_project()
+ network_object = network_fakes.FakeNetwork.create_one_network()
+
+ topology = network_fakes.FakeAutoAllocatedTopology.create_one_topology(
+ attrs={'id': network_object.id,
+ 'tenant_id': project.id}
+ )
+
+ columns = (
+ 'id',
+ 'project_id',
+ )
+
+ data = (
+ network_object.id,
+ project.id,
+ )
+
+ def setUp(self):
+ super(TestValidateAutoAllocatedTopology, self).setUp()
+
+ self.cmd = network_auto_allocated_topology.CreateAutoAllocatedTopology(
+ self.app,
+ self.namespace)
+ self.network.validate_auto_allocated_topology = mock.Mock(
+ return_value=self.topology)
+
+ def test_show_dry_run_no_project(self):
+ arglist = [
+ '--check-resources',
+ ]
+ verifylist = [
+ ('check_resources', True),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.network.validate_auto_allocated_topology.assert_called_with(
+ None)
+
+ def test_show_dry_run_project_option(self):
+ arglist = [
+ '--check-resources',
+ '--project', self.project.id,
+ ]
+ verifylist = [
+ ('check_resources', True),
+ ('project', self.project.id),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.network.validate_auto_allocated_topology.assert_called_with(
+ self.project.id)
+
+ def test_show_dry_run_project_domain_option(self):
+ arglist = [
+ '--check-resources',
+ '--project', self.project.id,
+ '--project-domain', self.project.domain_id,
+ ]
+ verifylist = [
+ ('check_resources', True),
+ ('project', self.project.id),
+ ('project_domain', self.project.domain_id),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.network.validate_auto_allocated_topology.assert_called_with(
+ self.project.id)
+
+
+class TestDeleteAutoAllocatedTopology(TestAutoAllocatedTopology):
+ project = identity_fakes.FakeProject.create_one_project()
+ network_object = network_fakes.FakeNetwork.create_one_network()
+
+ topology = network_fakes.FakeAutoAllocatedTopology.create_one_topology(
+ attrs={'id': network_object.id,
+ 'tenant_id': project.id}
+ )
+
+ def setUp(self):
+ super(TestDeleteAutoAllocatedTopology, self).setUp()
+
+ self.cmd = network_auto_allocated_topology.DeleteAutoAllocatedTopology(
+ self.app,
+ self.namespace)
+ self.network.delete_auto_allocated_topology = mock.Mock(
+ return_value=None)
+
+ def test_delete_no_project(self):
+ arglist = []
+ verifylist = []
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+
+ self.network.delete_auto_allocated_topology.assert_called_once_with(
+ None)
+
+ self.assertIsNone(result)
+
+ def test_delete_project_arg(self):
+ arglist = [
+ '--project', self.project.id,
+ ]
+ verifylist = [
+ ('project', self.project.id),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+
+ self.network.delete_auto_allocated_topology.assert_called_once_with(
+ self.project.id)
+
+ self.assertIsNone(result)
+
+ def test_delete_project_domain_arg(self):
+ arglist = [
+ '--project', self.project.id,
+ '--project-domain', self.project.domain_id,
+ ]
+ verifylist = [
+ ('project', self.project.id),
+ ('project_domain', self.project.domain_id),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+
+ self.network.delete_auto_allocated_topology.assert_called_once_with(
+ self.project.id)
+
+ self.assertIsNone(result)
diff --git a/openstackclient/tests/unit/network/v2/test_network_flavor.py b/openstackclient/tests/unit/network/v2/test_network_flavor.py
new file mode 100644
index 00000000..11e27841
--- /dev/null
+++ b/openstackclient/tests/unit/network/v2/test_network_flavor.py
@@ -0,0 +1,407 @@
+# Copyright (c) 2016, Intel Corporation.
+# All Rights Reserved.
+#
+# 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.
+#
+
+import mock
+
+from osc_lib import exceptions
+
+from openstackclient.network.v2 import network_flavor
+from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes_v3
+from openstackclient.tests.unit.network.v2 import fakes as network_fakes
+from openstackclient.tests.unit import utils as tests_utils
+
+
+class TestNetworkFlavor(network_fakes.TestNetworkV2):
+
+ def setUp(self):
+ super(TestNetworkFlavor, self).setUp()
+
+ # Get a shortcut to the network client
+ self.network = self.app.client_manager.network
+ # Get a shortcut to the ProjectManager Mock
+ self.projects_mock = self.app.client_manager.identity.projects
+ # Get a shortcut to the DomainManager Mock
+ self.domains_mock = self.app.client_manager.identity.domains
+
+
+class TestCreateNetworkFlavor(TestNetworkFlavor):
+
+ project = identity_fakes_v3.FakeProject.create_one_project()
+ domain = identity_fakes_v3.FakeDomain.create_one_domain()
+ # The new network flavor created.
+ new_network_flavor = (
+ network_fakes.FakeNetworkFlavor.create_one_network_flavor())
+ columns = (
+ 'description',
+ 'enabled',
+ 'id',
+ 'name',
+ 'project_id',
+ 'service_type'
+ )
+ data = (
+ new_network_flavor.description,
+ new_network_flavor.enabled,
+ new_network_flavor.id,
+ new_network_flavor.name,
+ new_network_flavor.project_id,
+ new_network_flavor.service_type,
+ )
+
+ def setUp(self):
+ super(TestCreateNetworkFlavor, self).setUp()
+ self.network.create_flavor = mock.Mock(
+ return_value=self.new_network_flavor)
+
+ # Get the command object to test
+ self.cmd = network_flavor.CreateNetworkFlavor(self.app, self.namespace)
+
+ self.projects_mock.get.return_value = self.project
+ self.domains_mock.get.return_value = self.domain
+
+ 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 = [
+ '--service-type', self.new_network_flavor.service_type,
+ self.new_network_flavor.name,
+ ]
+ verifylist = [
+ ('service_type', self.new_network_flavor.service_type),
+ ('name', self.new_network_flavor.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = (self.cmd.take_action(parsed_args))
+
+ self.network.create_flavor.assert_called_once_with(**{
+ 'service_type': self.new_network_flavor.service_type,
+ 'name': self.new_network_flavor.name,
+ })
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_create_all_options(self):
+ arglist = [
+ '--description', self.new_network_flavor.description,
+ '--enable',
+ '--project', self.new_network_flavor.project_id,
+ '--project-domain', self.domain.name,
+ '--service-type', self.new_network_flavor.service_type,
+ self.new_network_flavor.name,
+ ]
+ verifylist = [
+ ('description', self.new_network_flavor.description),
+ ('enable', True),
+ ('project', self.new_network_flavor.project_id),
+ ('project_domain', self.domain.name),
+ ('service_type', self.new_network_flavor.service_type),
+ ('name', self.new_network_flavor.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = (self.cmd.take_action(parsed_args))
+
+ self.network.create_flavor.assert_called_once_with(**{
+ 'description': self.new_network_flavor.description,
+ 'enabled': True,
+ 'tenant_id': self.project.id,
+ 'service_type': self.new_network_flavor.service_type,
+ 'name': self.new_network_flavor.name,
+ })
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_create_disable(self):
+ arglist = [
+ '--disable',
+ '--service-type', self.new_network_flavor.service_type,
+ self.new_network_flavor.name,
+ ]
+ verifylist = [
+ ('disable', True),
+ ('service_type', self.new_network_flavor.service_type),
+ ('name', self.new_network_flavor.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.network.create_flavor.assert_called_once_with(**{
+ 'enabled': False,
+ 'service_type': self.new_network_flavor.service_type,
+ 'name': self.new_network_flavor.name,
+ })
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+
+class TestDeleteNetworkFlavor(TestNetworkFlavor):
+
+ # The network flavor to delete.
+ _network_flavors = (
+ network_fakes.FakeNetworkFlavor.create_flavor(count=2))
+
+ def setUp(self):
+ super(TestDeleteNetworkFlavor, self).setUp()
+ self.network.delete_flavor = mock.Mock(return_value=None)
+ self.network.find_flavor = (
+ network_fakes.FakeNetworkFlavor.get_flavor(
+ network_flavors=self._network_flavors)
+ )
+
+ # Get the command object to test
+ self.cmd = network_flavor.DeleteNetworkFlavor(self.app, self.namespace)
+
+ def test_network_flavor_delete(self):
+ arglist = [
+ self._network_flavors[0].name,
+ ]
+ verifylist = [
+ ('flavor', [self._network_flavors[0].name]),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+ self.network.find_flavor.assert_called_once_with(
+ self._network_flavors[0].name, ignore_missing=False)
+ self.network.delete_flavor.assert_called_once_with(
+ self._network_flavors[0])
+ self.assertIsNone(result)
+
+ def test_multi_network_flavors_delete(self):
+ arglist = []
+ verifylist = []
+
+ for a in self._network_flavors:
+ arglist.append(a.name)
+ verifylist = [
+ ('flavor', arglist),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ calls = []
+ for a in self._network_flavors:
+ calls.append(mock.call(a))
+ self.network.delete_flavor.assert_has_calls(calls)
+ self.assertIsNone(result)
+
+ def test_multi_network_flavors_delete_with_exception(self):
+ arglist = [
+ self._network_flavors[0].name,
+ 'unexist_network_flavor',
+ ]
+ verifylist = [
+ ('flavor',
+ [self._network_flavors[0].name, 'unexist_network_flavor']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ find_mock_result = [self._network_flavors[0], exceptions.CommandError]
+ self.network.find_flavor = (
+ mock.Mock(side_effect=find_mock_result)
+ )
+
+ try:
+ self.cmd.take_action(parsed_args)
+ self.fail('CommandError should be raised.')
+ except exceptions.CommandError as e:
+ self.assertEqual('1 of 2 flavors failed to delete.', str(e))
+
+ self.network.find_flavor.assert_any_call(
+ self._network_flavors[0].name, ignore_missing=False)
+ self.network.find_flavor.assert_any_call(
+ 'unexist_network_flavor', ignore_missing=False)
+ self.network.delete_flavor.assert_called_once_with(
+ self._network_flavors[0]
+ )
+
+
+class TestListNetworkFlavor(TestNetworkFlavor):
+
+ # The network flavors to list up.
+ _network_flavors = (
+ network_fakes.FakeNetworkFlavor.create_flavor(count=2))
+ columns = (
+ 'ID',
+ 'Name',
+ 'Enabled',
+ 'Service Type',
+ 'Description',
+ )
+ data = []
+ for flavor in _network_flavors:
+ data.append((
+ flavor.id,
+ flavor.name,
+ flavor.enabled,
+ flavor.service_type,
+ flavor.description,
+ ))
+
+ def setUp(self):
+ super(TestListNetworkFlavor, self).setUp()
+ self.network.flavors = mock.Mock(
+ return_value=self._network_flavors)
+
+ # Get the command object to test
+ self.cmd = network_flavor.ListNetworkFlavor(self.app, self.namespace)
+
+ def test_network_flavor_list(self):
+ arglist = []
+ verifylist = []
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.network.flavors.assert_called_once_with(**{})
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, list(data))
+
+
+class TestShowNetworkFlavor(TestNetworkFlavor):
+
+ # The network flavor to show.
+ new_network_flavor = (
+ network_fakes.FakeNetworkFlavor.create_one_network_flavor())
+ columns = (
+ 'description',
+ 'enabled',
+ 'id',
+ 'name',
+ 'project_id',
+ 'service_type'
+ )
+ data = (
+ new_network_flavor.description,
+ new_network_flavor.enabled,
+ new_network_flavor.id,
+ new_network_flavor.name,
+ new_network_flavor.project_id,
+ new_network_flavor.service_type,
+ )
+
+ def setUp(self):
+ super(TestShowNetworkFlavor, self).setUp()
+ self.network.find_flavor = mock.Mock(
+ return_value=self.new_network_flavor)
+
+ # Get the command object to test
+ self.cmd = network_flavor.ShowNetworkFlavor(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_all_options(self):
+ arglist = [
+ self.new_network_flavor.name,
+ ]
+ verifylist = [
+ ('flavor', self.new_network_flavor.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.network.find_flavor.assert_called_once_with(
+ self.new_network_flavor.name, ignore_missing=False)
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+
+class TestSetNetworkFlavor(TestNetworkFlavor):
+
+ # The network flavor to set.
+ new_network_flavor = (
+ network_fakes.FakeNetworkFlavor.create_one_network_flavor())
+
+ def setUp(self):
+ super(TestSetNetworkFlavor, self).setUp()
+ self.network.update_flavor = mock.Mock(return_value=None)
+ self.network.find_flavor = mock.Mock(
+ return_value=self.new_network_flavor)
+
+ # Get the command object to test
+ self.cmd = network_flavor.SetNetworkFlavor(self.app, self.namespace)
+
+ def test_set_nothing(self):
+ arglist = [self.new_network_flavor.name, ]
+ verifylist = [
+ ('flavor', self.new_network_flavor.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+
+ attrs = {}
+ self.network.update_flavor.assert_called_with(
+ self.new_network_flavor, **attrs)
+ self.assertIsNone(result)
+
+ def test_set_name_and_enable(self):
+ arglist = [
+ '--name', 'new_network_flavor',
+ '--enable',
+ self.new_network_flavor.name,
+ ]
+ verifylist = [
+ ('name', 'new_network_flavor'),
+ ('enable', True),
+ ('flavor', self.new_network_flavor.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+ attrs = {
+ 'name': "new_network_flavor",
+ 'enabled': True,
+ }
+ self.network.update_flavor.assert_called_with(
+ self.new_network_flavor, **attrs)
+ self.assertIsNone(result)
+
+ def test_set_disable(self):
+ arglist = [
+ '--disable',
+ self.new_network_flavor.name,
+ ]
+ verifylist = [
+ ('disable', True),
+ ('flavor', self.new_network_flavor.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+ attrs = {
+ 'enabled': False,
+ }
+ self.network.update_flavor.assert_called_with(
+ self.new_network_flavor, **attrs)
+ self.assertIsNone(result)
diff --git a/openstackclient/tests/unit/network/v2/test_port.py b/openstackclient/tests/unit/network/v2/test_port.py
index fc626685..80eba3a8 100644
--- a/openstackclient/tests/unit/network/v2/test_port.py
+++ b/openstackclient/tests/unit/network/v2/test_port.py
@@ -57,7 +57,7 @@ class TestPort(network_fakes.TestNetworkV2):
'network_id',
'port_security_enabled',
'project_id',
- 'security_groups',
+ 'security_group_ids',
'status',
)
@@ -82,7 +82,7 @@ class TestPort(network_fakes.TestNetworkV2):
fake_port.network_id,
fake_port.port_security_enabled,
fake_port.project_id,
- utils.format_list(fake_port.security_groups),
+ utils.format_list(fake_port.security_group_ids),
fake_port.status,
)
@@ -251,7 +251,7 @@ class TestCreatePort(TestPort):
verifylist = [
('network', self._port.network_id,),
('enable', True),
- ('security_groups', [secgroup.id]),
+ ('security_group', [secgroup.id]),
('name', 'test-port'),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -261,7 +261,7 @@ class TestCreatePort(TestPort):
self.network.create_port.assert_called_once_with(**{
'admin_state_up': True,
'network_id': self._port.network_id,
- 'security_groups': [secgroup.id],
+ 'security_group_ids': [secgroup.id],
'name': 'test-port',
})
@@ -309,7 +309,7 @@ class TestCreatePort(TestPort):
verifylist = [
('network', self._port.network_id,),
('enable', True),
- ('security_groups', [sg_1.id, sg_2.id]),
+ ('security_group', [sg_1.id, sg_2.id]),
('name', 'test-port'),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -319,7 +319,7 @@ class TestCreatePort(TestPort):
self.network.create_port.assert_called_once_with(**{
'admin_state_up': True,
'network_id': self._port.network_id,
- 'security_groups': [sg_1.id, sg_2.id],
+ 'security_group_ids': [sg_1.id, sg_2.id],
'name': 'test-port',
})
@@ -346,7 +346,7 @@ class TestCreatePort(TestPort):
self.network.create_port.assert_called_once_with(**{
'admin_state_up': True,
'network_id': self._port.network_id,
- 'security_groups': [],
+ 'security_group_ids': [],
'name': 'test-port',
})
@@ -590,7 +590,7 @@ class TestListPort(TestPort):
prt.mac_address,
utils.format_list_of_dicts(prt.fixed_ips),
prt.status,
- utils.format_list(prt.security_groups),
+ utils.format_list(prt.security_group_ids),
prt.device_owner,
))
@@ -727,6 +727,92 @@ class TestListPort(TestPort):
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
+ def test_port_list_fixed_ip_opt_ip_address(self):
+ ip_address = self._ports[0].fixed_ips[0]['ip_address']
+ arglist = [
+ '--fixed-ip', "ip-address=%s" % ip_address,
+ ]
+ verifylist = [
+ ('fixed_ip', [{'ip-address': ip_address}])
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.network.ports.assert_called_once_with(**{
+ 'fixed_ips': ['ip_address=%s' % ip_address]})
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, list(data))
+
+ def test_port_list_fixed_ip_opt_subnet_id(self):
+ subnet_id = self._ports[0].fixed_ips[0]['subnet_id']
+ arglist = [
+ '--fixed-ip', "subnet=%s" % subnet_id,
+ ]
+ verifylist = [
+ ('fixed_ip', [{'subnet': subnet_id}])
+ ]
+
+ self.fake_subnet = network_fakes.FakeSubnet.create_one_subnet(
+ {'id': subnet_id})
+ self.network.find_subnet = mock.Mock(return_value=self.fake_subnet)
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.network.ports.assert_called_once_with(**{
+ 'fixed_ips': ['subnet_id=%s' % subnet_id]})
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, list(data))
+
+ def test_port_list_fixed_ip_opts(self):
+ subnet_id = self._ports[0].fixed_ips[0]['subnet_id']
+ ip_address = self._ports[0].fixed_ips[0]['ip_address']
+ arglist = [
+ '--fixed-ip', "subnet=%s,ip-address=%s" % (subnet_id,
+ ip_address)
+ ]
+ verifylist = [
+ ('fixed_ip', [{'subnet': subnet_id,
+ 'ip-address': ip_address}])
+ ]
+
+ self.fake_subnet = network_fakes.FakeSubnet.create_one_subnet(
+ {'id': subnet_id})
+ self.network.find_subnet = mock.Mock(return_value=self.fake_subnet)
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.network.ports.assert_called_once_with(**{
+ 'fixed_ips': ['subnet_id=%s' % subnet_id,
+ 'ip_address=%s' % ip_address]})
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, list(data))
+
+ def test_port_list_fixed_ips(self):
+ subnet_id = self._ports[0].fixed_ips[0]['subnet_id']
+ ip_address = self._ports[0].fixed_ips[0]['ip_address']
+ arglist = [
+ '--fixed-ip', "subnet=%s" % subnet_id,
+ '--fixed-ip', "ip-address=%s" % ip_address,
+ ]
+ verifylist = [
+ ('fixed_ip', [{'subnet': subnet_id},
+ {'ip-address': ip_address}])
+ ]
+
+ self.fake_subnet = network_fakes.FakeSubnet.create_one_subnet(
+ {'id': subnet_id})
+ self.network.find_subnet = mock.Mock(return_value=self.fake_subnet)
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.network.ports.assert_called_once_with(**{
+ 'fixed_ips': ['subnet_id=%s' % subnet_id,
+ 'ip_address=%s' % ip_address]})
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, list(data))
+
def test_list_port_with_long(self):
arglist = [
'--long',
@@ -801,6 +887,7 @@ class TestSetPort(TestPort):
arglist = [
'--fixed-ip', 'ip-address=10.0.0.11',
self._port.name,
+ '--no-fixed-ip',
]
verifylist = [
('fixed_ip', [{'ip-address': '10.0.0.11'}]),
@@ -1024,7 +1111,7 @@ class TestSetPort(TestPort):
self._port.name,
]
verifylist = [
- ('security_groups', [sg.id]),
+ ('security_group', [sg.id]),
('port', self._port.name),
]
@@ -1032,7 +1119,7 @@ class TestSetPort(TestPort):
result = self.cmd.take_action(parsed_args)
attrs = {
- 'security_groups': [sg.id],
+ 'security_group_ids': [sg.id],
}
self.network.update_port.assert_called_once_with(self._port, **attrs)
self.assertIsNone(result)
@@ -1043,7 +1130,7 @@ class TestSetPort(TestPort):
sg_3 = network_fakes.FakeSecurityGroup.create_one_security_group()
self.network.find_security_group = mock.Mock(side_effect=[sg_2, sg_3])
_testport = network_fakes.FakePort.create_one_port(
- {'security_groups': [sg_1.id]})
+ {'security_group_ids': [sg_1.id]})
self.network.find_port = mock.Mock(return_value=_testport)
arglist = [
'--security-group', sg_2.id,
@@ -1051,13 +1138,13 @@ class TestSetPort(TestPort):
_testport.name,
]
verifylist = [
- ('security_groups', [sg_2.id, sg_3.id]),
+ ('security_group', [sg_2.id, sg_3.id]),
('port', _testport.name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
attrs = {
- 'security_groups': [sg_1.id, sg_2.id, sg_3.id],
+ 'security_group_ids': [sg_2.id, sg_3.id, sg_1.id],
}
self.network.update_port.assert_called_once_with(_testport, **attrs)
self.assertIsNone(result)
@@ -1076,7 +1163,7 @@ class TestSetPort(TestPort):
result = self.cmd.take_action(parsed_args)
attrs = {
- 'security_groups': [],
+ 'security_group_ids': [],
}
self.network.update_port.assert_called_once_with(self._port, **attrs)
self.assertIsNone(result)
@@ -1085,7 +1172,7 @@ class TestSetPort(TestPort):
sg1 = network_fakes.FakeSecurityGroup.create_one_security_group()
sg2 = network_fakes.FakeSecurityGroup.create_one_security_group()
_testport = network_fakes.FakePort.create_one_port(
- {'security_groups': [sg1.id]})
+ {'security_group_ids': [sg1.id]})
self.network.find_port = mock.Mock(return_value=_testport)
self.network.find_security_group = mock.Mock(return_value=sg2)
arglist = [
@@ -1094,13 +1181,13 @@ class TestSetPort(TestPort):
_testport.name,
]
verifylist = [
- ('security_groups', [sg2.id]),
+ ('security_group', [sg2.id]),
('no_security_group', True)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
attrs = {
- 'security_groups': [sg2.id],
+ 'security_group_ids': [sg2.id],
}
self.network.update_port.assert_called_once_with(_testport, **attrs)
self.assertIsNone(result)
@@ -1347,7 +1434,7 @@ class TestUnsetPort(TestPort):
_fake_sg1 = network_fakes.FakeSecurityGroup.create_one_security_group()
_fake_sg2 = network_fakes.FakeSecurityGroup.create_one_security_group()
_fake_port = network_fakes.FakePort.create_one_port(
- {'security_groups': [_fake_sg1.id, _fake_sg2.id]})
+ {'security_group_ids': [_fake_sg1.id, _fake_sg2.id]})
self.network.find_port = mock.Mock(return_value=_fake_port)
self.network.find_security_group = mock.Mock(return_value=_fake_sg2)
arglist = [
@@ -1355,14 +1442,14 @@ class TestUnsetPort(TestPort):
_fake_port.name,
]
verifylist = [
- ('security_groups', [_fake_sg2.id]),
+ ('security_group_ids', [_fake_sg2.id]),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
attrs = {
- 'security_groups': [_fake_sg1.id]
+ 'security_group_ids': [_fake_sg1.id]
}
self.network.update_port.assert_called_once_with(
_fake_port, **attrs)
@@ -1372,14 +1459,14 @@ class TestUnsetPort(TestPort):
_fake_sg1 = network_fakes.FakeSecurityGroup.create_one_security_group()
_fake_sg2 = network_fakes.FakeSecurityGroup.create_one_security_group()
_fake_port = network_fakes.FakePort.create_one_port(
- {'security_groups': [_fake_sg1.id]})
+ {'security_group_ids': [_fake_sg1.id]})
self.network.find_security_group = mock.Mock(return_value=_fake_sg2)
arglist = [
'--security-group', _fake_sg2.id,
_fake_port.name,
]
verifylist = [
- ('security_groups', [_fake_sg2.id]),
+ ('security_group_ids', [_fake_sg2.id]),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
diff --git a/openstackclient/tests/unit/network/v2/test_security_group_rule.py b/openstackclient/tests/unit/network/v2/test_security_group_rule.py
index 5fe9013e..e3538d5f 100644
--- a/openstackclient/tests/unit/network/v2/test_security_group_rule.py
+++ b/openstackclient/tests/unit/network/v2/test_security_group_rule.py
@@ -62,7 +62,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
expected_columns = (
'description',
'direction',
- 'ethertype',
+ 'ether_type',
'id',
'port_range_max',
'port_range_min',
@@ -84,7 +84,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.expected_data = (
self._security_group_rule.description,
self._security_group_rule.direction,
- self._security_group_rule.ethertype,
+ self._security_group_rule.ether_type,
self._security_group_rule.id,
self._security_group_rule.port_range_max,
self._security_group_rule.port_range_min,
@@ -184,7 +184,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.network.create_security_group_rule.assert_called_once_with(**{
'direction': self._security_group_rule.direction,
- 'ethertype': self._security_group_rule.ethertype,
+ 'ethertype': self._security_group_rule.ether_type,
'port_range_max': self._security_group_rule.port_range_max,
'port_range_min': self._security_group_rule.port_range_min,
'protocol': self._security_group_rule.protocol,
@@ -216,7 +216,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.network.create_security_group_rule.assert_called_once_with(**{
'direction': self._security_group_rule.direction,
- 'ethertype': self._security_group_rule.ethertype,
+ 'ethertype': self._security_group_rule.ether_type,
'protocol': self._security_group_rule.protocol,
'remote_ip_prefix': self._security_group_rule.remote_ip_prefix,
'security_group_id': self._security_group.id,
@@ -249,7 +249,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.network.create_security_group_rule.assert_called_once_with(**{
'direction': self._security_group_rule.direction,
- 'ethertype': self._security_group_rule.ethertype,
+ 'ethertype': self._security_group_rule.ether_type,
'port_range_max': self._security_group_rule.port_range_max,
'port_range_min': self._security_group_rule.port_range_min,
'protocol': self._security_group_rule.protocol,
@@ -279,7 +279,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.network.create_security_group_rule.assert_called_once_with(**{
'direction': self._security_group_rule.direction,
- 'ethertype': self._security_group_rule.ethertype,
+ 'ethertype': self._security_group_rule.ether_type,
'protocol': self._security_group_rule.protocol,
'remote_group_id': self._security_group_rule.remote_group_id,
'security_group_id': self._security_group.id,
@@ -308,7 +308,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.network.create_security_group_rule.assert_called_once_with(**{
'direction': self._security_group_rule.direction,
- 'ethertype': self._security_group_rule.ethertype,
+ 'ethertype': self._security_group_rule.ether_type,
'protocol': self._security_group_rule.protocol,
'remote_ip_prefix': self._security_group_rule.remote_ip_prefix,
'security_group_id': self._security_group.id,
@@ -337,7 +337,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.network.create_security_group_rule.assert_called_once_with(**{
'direction': self._security_group_rule.direction,
- 'ethertype': self._security_group_rule.ethertype,
+ 'ethertype': self._security_group_rule.ether_type,
'protocol': self._security_group_rule.protocol,
'remote_ip_prefix': self._security_group_rule.remote_ip_prefix,
'security_group_id': self._security_group.id,
@@ -348,7 +348,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
def test_create_network_options(self):
self._setup_security_group_rule({
'direction': 'egress',
- 'ethertype': 'IPv6',
+ 'ether_type': 'IPv6',
'port_range_max': 443,
'port_range_min': 443,
'protocol': '6',
@@ -358,7 +358,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
arglist = [
'--dst-port', str(self._security_group_rule.port_range_min),
'--egress',
- '--ethertype', self._security_group_rule.ethertype,
+ '--ethertype', self._security_group_rule.ether_type,
'--project', self.project.name,
'--project-domain', self.domain.name,
'--protocol', self._security_group_rule.protocol,
@@ -368,7 +368,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
('dst_port', (self._security_group_rule.port_range_min,
self._security_group_rule.port_range_max)),
('egress', True),
- ('ethertype', self._security_group_rule.ethertype),
+ ('ethertype', self._security_group_rule.ether_type),
('project', self.project.name),
('project_domain', self.domain.name),
('protocol', self._security_group_rule.protocol),
@@ -380,7 +380,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.network.create_security_group_rule.assert_called_once_with(**{
'direction': self._security_group_rule.direction,
- 'ethertype': self._security_group_rule.ethertype,
+ 'ethertype': self._security_group_rule.ether_type,
'port_range_max': self._security_group_rule.port_range_max,
'port_range_min': self._security_group_rule.port_range_min,
'protocol': self._security_group_rule.protocol,
@@ -444,7 +444,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.network.create_security_group_rule.assert_called_once_with(**{
'direction': self._security_group_rule.direction,
- 'ethertype': self._security_group_rule.ethertype,
+ 'ethertype': self._security_group_rule.ether_type,
'port_range_min': self._security_group_rule.port_range_min,
'protocol': self._security_group_rule.protocol,
'remote_ip_prefix': self._security_group_rule.remote_ip_prefix,
@@ -455,7 +455,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
def test_create_ipv6_icmp_type_code(self):
self._setup_security_group_rule({
- 'ethertype': 'IPv6',
+ 'ether_type': 'IPv6',
'port_range_min': 139,
'port_range_max': 2,
'protocol': 'ipv6-icmp',
@@ -479,7 +479,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.network.create_security_group_rule.assert_called_once_with(**{
'direction': self._security_group_rule.direction,
- 'ethertype': self._security_group_rule.ethertype,
+ 'ethertype': self._security_group_rule.ether_type,
'port_range_min': self._security_group_rule.port_range_min,
'port_range_max': self._security_group_rule.port_range_max,
'protocol': self._security_group_rule.protocol,
@@ -490,7 +490,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
def test_create_icmpv6_type(self):
self._setup_security_group_rule({
- 'ethertype': 'IPv6',
+ 'ether_type': 'IPv6',
'port_range_min': 139,
'protocol': 'icmpv6',
})
@@ -512,7 +512,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.network.create_security_group_rule.assert_called_once_with(**{
'direction': self._security_group_rule.direction,
- 'ethertype': self._security_group_rule.ethertype,
+ 'ethertype': self._security_group_rule.ether_type,
'port_range_min': self._security_group_rule.port_range_min,
'protocol': self._security_group_rule.protocol,
'security_group_id': self._security_group.id,
@@ -539,7 +539,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
self.network.create_security_group_rule.assert_called_once_with(**{
'description': self._security_group_rule.description,
'direction': self._security_group_rule.direction,
- 'ethertype': self._security_group_rule.ethertype,
+ 'ethertype': self._security_group_rule.ether_type,
'protocol': self._security_group_rule.protocol,
'remote_ip_prefix': self._security_group_rule.remote_ip_prefix,
'security_group_id': self._security_group.id,
@@ -1039,7 +1039,7 @@ class TestListSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
security_group_rule._format_network_port_range(
_security_group_rule),
_security_group_rule.direction,
- _security_group_rule.ethertype,
+ _security_group_rule.ether_type,
_security_group_rule.remote_group_id,
))
expected_data_no_group.append((
@@ -1299,7 +1299,7 @@ class TestShowSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
columns = (
'description',
'direction',
- 'ethertype',
+ 'ether_type',
'id',
'port_range_max',
'port_range_min',
@@ -1313,7 +1313,7 @@ class TestShowSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
data = (
_security_group_rule.description,
_security_group_rule.direction,
- _security_group_rule.ethertype,
+ _security_group_rule.ether_type,
_security_group_rule.id,
_security_group_rule.port_range_max,
_security_group_rule.port_range_min,