Merge "test list the network(ipv6) ip usage stats"
diff --git a/neutron_tempest_plugin/api/test_ports.py b/neutron_tempest_plugin/api/test_ports.py
index c59ee83..f1dfe5c 100644
--- a/neutron_tempest_plugin/api/test_ports.py
+++ b/neutron_tempest_plugin/api/test_ports.py
@@ -15,6 +15,7 @@
import copy
+from neutron_lib import constants as lib_constants
from tempest.common import utils
from tempest.lib import decorators
@@ -60,6 +61,20 @@
body = self.client.list_ports(id=body['port']['id'])['ports'][0]
self.assertEqual('d2', body['description'])
+ @decorators.idempotent_id('3ae162e8-ff00-490c-a423-6a88e48f1ed6')
+ def test_create_update_port_security(self):
+ body = self.create_port(self.network,
+ port_security_enabled=True)
+ self.assertTrue(body['port_security_enabled'])
+ body = self.client.list_ports(id=body['id'])['ports'][0]
+ self.assertTrue(body['port_security_enabled'])
+ body = self.client.update_port(body['id'],
+ port_security_enabled=False,
+ security_groups=[])
+ self.assertFalse(body['port']['port_security_enabled'])
+ body = self.client.list_ports(id=body['port']['id'])['ports'][0]
+ self.assertFalse(body['port_security_enabled'])
+
@decorators.idempotent_id('539fbefe-fb36-48aa-9a53-8c5fbd44e492')
@utils.requires_ext(extension="dns-integration",
service="network")
@@ -137,6 +152,28 @@
self.assertEqual(expected, subnets)
+class PortsIpv6TestJSON(base.BaseNetworkTest):
+
+ _ip_version = lib_constants.IP_VERSION_6
+
+ @classmethod
+ def resource_setup(cls):
+ super(PortsIpv6TestJSON, cls).resource_setup()
+ cls.network = cls.create_network()
+
+ @decorators.idempotent_id('b85879fb-4852-4b99-aa32-3f8a7a6a3f01')
+ def test_add_ipv6_ips_to_port(self):
+ s = self.create_subnet(self.network, ip_version=self._ip_version)
+ port = self.create_port(self.network)
+ # request another IP on the same subnet
+ port['fixed_ips'].append({'subnet_id': s['id']})
+ updated = self.client.update_port(port['id'],
+ fixed_ips=port['fixed_ips'])
+ subnets = [ip['subnet_id'] for ip in updated['port']['fixed_ips']]
+ expected = [s['id'], s['id']]
+ self.assertEqual(expected, subnets)
+
+
class PortsSearchCriteriaTest(base.BaseSearchCriteriaTest):
resource = 'port'
diff --git a/neutron_tempest_plugin/api/test_qos_negative.py b/neutron_tempest_plugin/api/test_qos_negative.py
index 8432c6a..f6c4afc 100644
--- a/neutron_tempest_plugin/api/test_qos_negative.py
+++ b/neutron_tempest_plugin/api/test_qos_negative.py
@@ -67,6 +67,28 @@
self.client.update_qos_policy, policy['id'],
description=LONG_DESCRIPTION_NG)
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('88b54ab0-804b-446c-bc19-8e54222d70ef')
+ def test_get_non_existent_qos_policy(self):
+ non_exist_id = data_utils.rand_name('qos_policy')
+ self.assertRaises(lib_exc.NotFound,
+ self.admin_client.show_qos_policy, non_exist_id)
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('21050859-1284-4bf5-b05a-13846f83988f')
+ def test_update_non_existent_qos_policy(self):
+ non_exist_id = data_utils.rand_name('qos_policy')
+ self.assertRaises(lib_exc.NotFound,
+ self.admin_client.update_qos_policy, non_exist_id,
+ shared=False)
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('09e435b7-44d3-4f9d-8aa8-c295d46b5866')
+ def test_delete_non_existent_qos_policy(self):
+ non_exist_id = data_utils.rand_name('qos_policy')
+ self.assertRaises(lib_exc.NotFound,
+ self.admin_client.delete_qos_policy, non_exist_id)
+
class QosBandwidthLimitRuleNegativeTestJSON(base.BaseAdminNetworkTest):
diff --git a/neutron_tempest_plugin/api/test_routers_negative.py b/neutron_tempest_plugin/api/test_routers_negative.py
index 8700761..86d58e2 100644
--- a/neutron_tempest_plugin/api/test_routers_negative.py
+++ b/neutron_tempest_plugin/api/test_routers_negative.py
@@ -19,6 +19,10 @@
import testtools
from neutron_tempest_plugin.api import base_routers as base
+from neutron_tempest_plugin import config
+
+
+CONF = config.CONF
class RoutersNegativeTestBase(base.BaseRouterTest):
@@ -88,6 +92,23 @@
self.client.add_router_interface_with_port_id,
self.router['id'], invalid_id)
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('dad7a8ba-2726-11eb-82dd-74e5f9e2a801')
+ def test_remove_associated_ports(self):
+ self.client.update_router(
+ self.router['id'],
+ external_gateway_info={
+ 'network_id': CONF.network.public_network_id})
+ network = self.create_network()
+ subnet = self.create_subnet(network)
+ self.create_router_interface(self.router['id'], subnet['id'])
+ port_ids = [
+ item['id'] for item in self.admin_client.list_ports(
+ device_id=self.router['id'])['ports']]
+ for port_id in port_ids:
+ with testtools.ExpectedException(lib_exc.Conflict):
+ self.admin_client.delete_port(port_id)
+
class DvrRoutersNegativeTest(RoutersNegativeTestBase):
diff --git a/neutron_tempest_plugin/scenario/base.py b/neutron_tempest_plugin/scenario/base.py
index 752e536..127701c 100644
--- a/neutron_tempest_plugin/scenario/base.py
+++ b/neutron_tempest_plugin/scenario/base.py
@@ -205,7 +205,6 @@
else:
router = cls.create_admin_router(**kwargs)
LOG.debug("Created router %s", router['name'])
- cls.routers.append(router)
return router
@removals.remove(version='Stein',
diff --git a/neutron_tempest_plugin/scenario/test_ports.py b/neutron_tempest_plugin/scenario/test_ports.py
index 3b0408a..b3aeb87 100644
--- a/neutron_tempest_plugin/scenario/test_ports.py
+++ b/neutron_tempest_plugin/scenario/test_ports.py
@@ -12,6 +12,9 @@
# 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 ipaddress
+
+from oslo_log import log as logging
from tempest.common import waiters
from tempest.lib.common.utils import data_utils
from tempest.lib import decorators
@@ -20,6 +23,7 @@
from neutron_tempest_plugin.scenario import base
from neutron_tempest_plugin.scenario import constants as const
+LOG = logging.getLogger(__name__)
CONF = config.CONF
@@ -78,3 +82,34 @@
self.os_primary.servers_client,
servers[0]['server']['id'])
self._try_delete_resource(self.delete_floatingip, fips[0])
+
+ @decorators.idempotent_id('62e32802-1d21-11eb-b322-74e5f9e2a801')
+ def test_port_with_fixed_ip(self):
+ """Test scenario:
+
+ 1) Get the last IP from the range of Subnet "Allocation pool"
+ 2) Create Port with fixed_ip resolved in #1
+ 3) Create a VM using updated Port in #2 and add Floating IP
+ 4) Check SSH access to VM
+ """
+ ip_range = [str(ip) for ip in ipaddress.IPv4Network(
+ self.subnet['cidr'])]
+ # Because of the tests executed in Parallel the IP may already
+ # be in use, so we'll try using IPs from Allocation pool
+ # (in reverse order) up until Port is successfully created.
+ for ip in reversed(ip_range):
+ try:
+ port = self.create_port(
+ self.network,
+ name=data_utils.rand_name("fixed_ip_port"),
+ security_groups=[self.secgroup['id']],
+ fixed_ips=[{'ip_address': ip}])
+ if port is not None:
+ break
+ except Exception as e:
+ LOG.warn('Failed to create Port, using Fixed_IP:{}, '
+ 'the Error was:{}'.format(ip, e))
+ fip, server = self._create_instance_with_port(port)
+ self.check_connectivity(fip[0]['floating_ip_address'],
+ CONF.validation.image_ssh_user,
+ self.keypair['private_key'])