Merge "Added sorting/pagination tests for subnets"
diff --git a/neutron/tests/tempest/api/admin/test_external_network_extension.py b/neutron/tests/tempest/api/admin/test_external_network_extension.py
index ed56144..99e10ee 100644
--- a/neutron/tests/tempest/api/admin/test_external_network_extension.py
+++ b/neutron/tests/tempest/api/admin/test_external_network_extension.py
@@ -53,7 +53,7 @@
             external_gateway_info={'network_id': net['id']})['router']
         self.addCleanup(self.admin_client.delete_router, r['id'])
 
-    @test.idempotent_id('afd8f1b7-a81e-4629-bca8-a367b3a144bb')
+    @test.idempotent_id('eff9443a-2d04-48ee-840e-d955ac564bcd')
     def test_regular_client_blocked_from_creating_external_wild_policies(self):
         net = self.create_network()
         with testtools.ExpectedException(lib_exc.Forbidden):
diff --git a/neutron/tests/tempest/api/test_extension_driver_port_security.py b/neutron/tests/tempest/api/test_extension_driver_port_security.py
index de25d9f..71cc6c0 100644
--- a/neutron/tests/tempest/api/test_extension_driver_port_security.py
+++ b/neutron/tests/tempest/api/test_extension_driver_port_security.py
@@ -53,7 +53,7 @@
         self.assertEqual(network['port_security_enabled'], port_sec_net)
         self.assertEqual(port['port_security_enabled'], expected)
 
-    @test.idempotent_id('05642059-1bfc-4581-9bc9-aaa5db08dd60')
+    @test.idempotent_id('fe7c27b9-f320-4daf-b977-b1547c43daf6')
     @test.requires_ext(extension='port-security', service='network')
     def test_create_port_sec_with_security_group(self):
         network = self.create_network(port_security_enabled=True)
@@ -69,7 +69,7 @@
         self.assertEmpty(port['security_groups'])
 
     @test.attr(type='negative')
-    @test.idempotent_id('05642059-1bfc-4581-9bc9-aaa5db08dd60')
+    @test.idempotent_id('ff11226c-a5ff-4ad4-8480-0840e36e47a9')
     @test.requires_ext(extension='port-security', service='network')
     def test_port_sec_update_port_failed(self):
         network = self.create_network()
diff --git a/neutron/tests/tempest/api/test_flavors_extensions.py b/neutron/tests/tempest/api/test_flavors_extensions.py
index 57ce27d..e0dda0b 100644
--- a/neutron/tests/tempest/api/test_flavors_extensions.py
+++ b/neutron/tests/tempest/api/test_flavors_extensions.py
@@ -63,7 +63,7 @@
         labels = self.admin_client.list_service_profiles(id=service_profile_id)
         self.assertEqual(len(labels['service_profiles']), 0)
 
-    @test.idempotent_id('ec8e15ff-95d0-433b-b8a6-b466bddb1e50')
+    @test.idempotent_id('b12a9487-b6a2-4cff-a69a-fe2a0b64fae6')
     def test_create_update_delete_service_profile(self):
         # Creates a service profile
         description = "service_profile created by tempest"
@@ -86,7 +86,7 @@
                   id=service_profile['id']))
         self.assertEqual(len(labels['service_profiles']), 1)
 
-    @test.idempotent_id('ec8e15ff-95d0-433b-b8a6-b466bddb1e50')
+    @test.idempotent_id('136bcf09-00af-4da7-9b7f-174735d4aebd')
     def test_create_update_delete_flavor(self):
         # Creates a flavor
         description = "flavor created by tempest"
@@ -118,7 +118,7 @@
                          service_profile['metainfo'])
         self.assertTrue(service_profile['enabled'])
 
-    @test.idempotent_id('30abb445-0eea-472e-bd02-8649f54a5968')
+    @test.idempotent_id('362f9658-164b-44dd-8356-151bc9b7be72')
     def test_show_flavor(self):
         # Verifies the details of a flavor
         body = self.admin_client.show_flavor(self.flavor['id'])
@@ -128,7 +128,7 @@
         self.assertEqual(self.flavor['name'], flavor['name'])
         self.assertTrue(flavor['enabled'])
 
-    @test.idempotent_id('e2fb2f8c-45bf-429a-9f17-171c70444612')
+    @test.idempotent_id('eb3dd12e-6dfd-45f4-8393-46e0fa19860e')
     def test_list_flavors(self):
         # Verify flavor lists
         body = self.admin_client.list_flavors(id=33)
diff --git a/neutron/tests/tempest/api/test_metering_extensions.py b/neutron/tests/tempest/api/test_metering_extensions.py
index 42b8e48..756cd5a 100644
--- a/neutron/tests/tempest/api/test_metering_extensions.py
+++ b/neutron/tests/tempest/api/test_metering_extensions.py
@@ -58,7 +58,7 @@
                  id=metering_label_rule_id))
         self.assertEqual(len(rules['metering_label_rules']), 0)
 
-    @test.idempotent_id('e2fb2f8c-45bf-429a-9f17-171c70444612')
+    @test.idempotent_id('05d7c750-6d26-44d6-82f3-c9dd1f81f358')
     def test_list_metering_labels(self):
         # Verify label filtering
         body = self.admin_client.list_metering_labels(id=33)
@@ -81,7 +81,7 @@
                   id=metering_label['id']))
         self.assertEqual(len(labels['metering_labels']), 1)
 
-    @test.idempotent_id('30abb445-0eea-472e-bd02-8649f54a5968')
+    @test.idempotent_id('cfc500d9-9de6-4847-8803-62889c097d45')
     def test_show_metering_label(self):
         # Verifies the details of a label
         body = self.admin_client.show_metering_label(self.metering_label['id'])
diff --git a/neutron/tests/tempest/api/test_qos.py b/neutron/tests/tempest/api/test_qos.py
index 24ef38b..2d688df 100644
--- a/neutron/tests/tempest/api/test_qos.py
+++ b/neutron/tests/tempest/api/test_qos.py
@@ -75,6 +75,24 @@
         self.assertTrue(retrieved_policy['shared'])
         self.assertEqual([], retrieved_policy['rules'])
 
+    @test.idempotent_id('ee263db4-009a-4641-83e5-d0e83506ba4c')
+    def test_shared_policy_update(self):
+        policy = self.create_qos_policy(name='test-policy',
+                                        description='',
+                                        shared=True)
+
+        self.admin_client.update_qos_policy(policy['id'],
+                                            description='test policy desc2')
+        retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
+        retrieved_policy = retrieved_policy['policy']
+        self.assertTrue(retrieved_policy['shared'])
+
+        self.admin_client.update_qos_policy(policy['id'],
+                                            shared=False)
+        retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
+        retrieved_policy = retrieved_policy['policy']
+        self.assertFalse(retrieved_policy['shared'])
+
     @test.idempotent_id('1cb42653-54bd-4a9a-b888-c55e18199201')
     def test_delete_policy(self):
         policy = self.admin_client.create_qos_policy(
@@ -287,6 +305,16 @@
         with testtools.ExpectedException(exceptions.NotFound):
             self.admin_client.show_qos_policy(policy['id'])
 
+    @test.idempotent_id('fb384bde-a973-41c3-a542-6f77a092155f')
+    def test_get_policy_that_is_shared(self):
+        policy = self.create_qos_policy(
+            name='test-policy-shared',
+            description='shared policy',
+            shared=True,
+            tenant_id=self.admin_client.tenant_id)
+        obtained_policy = self.client.show_qos_policy(policy['id'])['policy']
+        self.assertEqual(obtained_policy, policy)
+
 
 class QosBandwidthLimitRuleTestJSON(base.BaseAdminNetworkTest):
     @classmethod
@@ -521,7 +549,7 @@
         self.admin_client.delete_rbac_policy(wildcard_rbac['id'])
         self.client.list_rbac_policies(id=client_rbac['id'])
 
-    @test.idempotent_id('328b1f70-d424-11e5-a57f-54ee756c66df')
+    @test.idempotent_id('1997b00c-0c75-4e43-8ce2-999f9fa555ee')
     def test_net_bound_shared_policy_wildcard_and_tenant_id_wild_remains(self):
         client_rbac, wildcard_rbac = self._create_net_bound_qos_rbacs()
         # remove client_rbac policy the wildcard share should remain
@@ -683,7 +711,7 @@
     def resource_setup(cls):
         super(QosDscpMarkingRuleTestJSON, cls).resource_setup()
 
-    @test.idempotent_id('8a59b00b-3e9c-4787-92f8-93a5cdf5e378')
+    @test.idempotent_id('f5cbaceb-5829-497c-9c60-ad70969e9a08')
     def test_rule_create(self):
         policy = self.create_qos_policy(name='test-policy',
                                         description='test policy',
@@ -712,7 +740,7 @@
         self.assertEqual(qos_consts.RULE_TYPE_DSCP_MARK,
                          policy_rules[0]['type'])
 
-    @test.idempotent_id('8a59b00b-ab01-4787-92f8-93a5cdf5e378')
+    @test.idempotent_id('08553ffe-030f-4037-b486-7e0b8fb9385a')
     def test_rule_create_fail_for_the_same_type(self):
         policy = self.create_qos_policy(name='test-policy',
                                         description='test policy',
@@ -725,7 +753,7 @@
                           policy_id=policy['id'],
                           dscp_mark=self.VALID_DSCP_MARK2)
 
-    @test.idempotent_id('149a6988-2568-47d2-931e-2dbc858943b3')
+    @test.idempotent_id('76f632e5-3175-4408-9a32-3625e599c8a2')
     def test_rule_update(self):
         policy = self.create_qos_policy(name='test-policy',
                                         description='test policy',
@@ -741,7 +769,7 @@
         retrieved_policy = retrieved_policy['dscp_marking_rule']
         self.assertEqual(self.VALID_DSCP_MARK2, retrieved_policy['dscp_mark'])
 
-    @test.idempotent_id('67ee6efd-7b33-4a68-927d-275b4f8ba958')
+    @test.idempotent_id('74f81904-c35f-48a3-adae-1f5424cb3c18')
     def test_rule_delete(self):
         policy = self.create_qos_policy(name='test-policy',
                                         description='test policy',
@@ -759,14 +787,14 @@
                           self.admin_client.show_dscp_marking_rule,
                           policy['id'], rule['id'])
 
-    @test.idempotent_id('f211222c-5808-46cb-a961-983bbab6b852')
+    @test.idempotent_id('9cb8ef5c-96fc-4978-9ee0-e3b02bab628a')
     def test_rule_create_rule_nonexistent_policy(self):
         self.assertRaises(
             exceptions.NotFound,
             self.admin_client.create_dscp_marking_rule,
             'policy', self.VALID_DSCP_MARK1)
 
-    @test.idempotent_id('a4a2e7ad-786f-4927-a85a-e545a93bd274')
+    @test.idempotent_id('bf6002ea-29de-486f-b65d-08aea6d4c4e2')
     def test_rule_create_forbidden_for_regular_tenants(self):
         self.assertRaises(
             exceptions.Forbidden,
@@ -783,7 +811,7 @@
             self.admin_client.create_dscp_marking_rule,
             policy['id'], 58)
 
-    @test.idempotent_id('ce0bd0c2-54d9-4e29-85f1-cfb36ac3ebe2')
+    @test.idempotent_id('c565131d-4c80-4231-b0f3-9ae2be4de129')
     def test_get_rules_by_policy(self):
         policy1 = self.create_qos_policy(name='test-policy1',
                                          description='test policy1',
diff --git a/neutron/tests/tempest/api/test_subnetpools.py b/neutron/tests/tempest/api/test_subnetpools.py
index d70b785..52fe787 100644
--- a/neutron/tests/tempest/api/test_subnetpools.py
+++ b/neutron/tests/tempest/api/test_subnetpools.py
@@ -32,19 +32,20 @@
         cls._subnetpool_data = {'prefixes': prefixes,
                                 'min_prefixlen': min_prefixlen}
 
-    def _create_subnetpool(self, is_admin=False, **kwargs):
+    @classmethod
+    def _create_subnetpool(cls, is_admin=False, **kwargs):
         if 'name' not in kwargs:
             name = data_utils.rand_name(SUBNETPOOL_NAME)
         else:
             name = kwargs.pop('name')
 
         if 'prefixes' not in kwargs:
-            kwargs['prefixes'] = self._subnetpool_data['prefixes']
+            kwargs['prefixes'] = cls._subnetpool_data['prefixes']
 
         if 'min_prefixlen' not in kwargs:
-            kwargs['min_prefixlen'] = self._subnetpool_data['min_prefixlen']
+            kwargs['min_prefixlen'] = cls._subnetpool_data['min_prefixlen']
 
-        return self.create_subnetpool(name=name, is_admin=is_admin, **kwargs)
+        return cls.create_subnetpool(name=name, is_admin=is_admin, **kwargs)
 
 
 class SubnetPoolsTest(SubnetPoolsTestBase):
@@ -339,3 +340,62 @@
             network_id=subnet_v6['network_id'], ip_version=4,
             subnetpool_id=pool_id_v4)['subnet']
         self.assertEqual(subnet_v4['network_id'], subnet_v6['network_id'])
+
+
+class SubnetPoolsSearchCriteriaTest(base.BaseSearchCriteriaTest,
+                                    SubnetPoolsTestBase):
+
+    resource = 'subnetpool'
+
+    list_kwargs = {'shared': False}
+
+    @classmethod
+    def resource_setup(cls):
+        super(SubnetPoolsSearchCriteriaTest, cls).resource_setup()
+        for name in cls.resource_names:
+            cls._create_subnetpool(name=name)
+
+    @test.attr(type='smoke')
+    @test.idempotent_id('6e3f842e-6bfb-49cb-82d3-0026be4e8e04')
+    def test_list_sorts_asc(self):
+        self._test_list_sorts_asc()
+
+    @test.attr(type='smoke')
+    @test.idempotent_id('f336859b-b868-438c-a6fc-2c06374115f2')
+    def test_list_sorts_desc(self):
+        self._test_list_sorts_desc()
+
+    @test.attr(type='smoke')
+    @test.idempotent_id('1291fae7-c196-4372-ad59-ce7988518f7b')
+    def test_list_pagination(self):
+        self._test_list_pagination()
+
+    @test.attr(type='smoke')
+    @test.idempotent_id('ddb20d14-1952-49b4-a17e-231cc2239a52')
+    def test_list_pagination_with_marker(self):
+        self._test_list_pagination_with_marker()
+
+    @test.attr(type='smoke')
+    @test.idempotent_id('b3bd9665-2769-4a43-b50c-31b1add12891')
+    def test_list_pagination_with_href_links(self):
+        self._test_list_pagination_with_href_links()
+
+    @test.attr(type='smoke')
+    @test.idempotent_id('1ec1f325-43b0-406e-96ce-20539e38a61d')
+    def test_list_pagination_page_reverse_asc(self):
+        self._test_list_pagination_page_reverse_asc()
+
+    @test.attr(type='smoke')
+    @test.idempotent_id('f43a293e-4aaa-48f4-aeaf-de63a676357c')
+    def test_list_pagination_page_reverse_desc(self):
+        self._test_list_pagination_page_reverse_desc()
+
+    @test.attr(type='smoke')
+    @test.idempotent_id('73511385-839c-4829-8ac1-b5ad992126c4')
+    def test_list_pagination_page_reverse_with_href_links(self):
+        self._test_list_pagination_page_reverse_with_href_links()
+
+    @test.attr(type='smoke')
+    @test.idempotent_id('82a13efc-c18f-4249-b8ec-cec7cf26fbd6')
+    def test_list_no_pagination_limit_0(self):
+        self._test_list_no_pagination_limit_0()
diff --git a/neutron/tests/tempest/api/test_subnetpools_negative.py b/neutron/tests/tempest/api/test_subnetpools_negative.py
index a9a7d55..052c3cd 100644
--- a/neutron/tests/tempest/api/test_subnetpools_negative.py
+++ b/neutron/tests/tempest/api/test_subnetpools_negative.py
@@ -267,3 +267,14 @@
         self.assertRaises(lib_exc.BadRequest, self.client.update_subnetpool,
                           created_subnetpool['id'],
                           address_scope_id=address_scope['id'])
+
+    @test.attr(type='negative')
+    @test.idempotent_id('2f66dc2f-cc32-4caa-91ec-0c0cd7c46d70')
+    def test_update_subnetpool_tenant_id(self):
+        subnetpool = self._create_subnetpool()
+        self.assertRaises(
+            lib_exc.BadRequest,
+            self.admin_client.update_subnetpool,
+            subnetpool['id'],
+            tenant_id=self.admin_client.tenant_id,
+        )
diff --git a/neutron/tests/tempest/scenario/test_basic.py b/neutron/tests/tempest/scenario/test_basic.py
index 8fa6aea..c05e1c2 100644
--- a/neutron/tests/tempest/scenario/test_basic.py
+++ b/neutron/tests/tempest/scenario/test_basic.py
@@ -14,6 +14,7 @@
 #    under the License.
 from oslo_log import log as logging
 from tempest.common import waiters
+from tempest import test
 
 from neutron.tests.tempest import config
 from neutron.tests.tempest.scenario import base
@@ -30,6 +31,8 @@
     # Default to ipv4.
     _ip_version = 4
 
+
+    @test.idempotent_id('de07fe0a-e955-449e-b48b-8641c14cd52e')
     def test_basic_instance(self):
         network = self.create_network()
         subnet = self.create_subnet(network)