objects: switch base plugin class to using subnetpool object

Among non-obvious changes, description field in standardattributes object
extension is now nullable, as in the database. This changes object hashes,
but we should be safe to touch it without providing a new object version
conversion rules because affected objects are not yet exposed to RPC
anywhere.

To avoid object API complexity, base class added support for
get_objects() keyword arguments that are not of list type (in which
case, we pass a single entry list down into _get_collection).

Also, some unit tests were changed to pass correct UUIDs for tenants, to
avoid validation warnings triggered by strict typing for subnetpool
project_id field.

Depends-On: I1c1bf544af4463b0302b62c8cce492932504bb01
Co-Authored-By: Ihar Hrachyshka <ihrachys@redhat.com>
Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db
Change-Id: I1415c7a29af86d377ed31cce40888631a34d4811
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,
+        )