Integration tests cleanup

This patch does a cleanup and fixes some nits found by reviewers
in the original patches [1], some of them are:

- import json instead of jsonutils
- use six.moves.http_client
- put common logic on clients superclass
- use "fails" to indicate negative cases
- stronger comparison in update tests

[1] https://review.openstack.org/#/q/topic:federation_integration_tests

Change-Id: I216fc5d4758e7b09d167d9d26271ddd149c66816
diff --git a/keystone_tempest_plugin/services/identity/clients.py b/keystone_tempest_plugin/services/identity/clients.py
index d8c8692..caf8b52 100644
--- a/keystone_tempest_plugin/services/identity/clients.py
+++ b/keystone_tempest_plugin/services/identity/clients.py
@@ -12,6 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+import json
+
+from six.moves import http_client
 from tempest import config
 from tempest.lib.common import rest_client
 
@@ -48,16 +51,27 @@
 
     def _delete(self, entity_id, **kwargs):
         url = self._build_path(entity_id)
-        return super(Federation, self).delete(url, **kwargs)
+        resp, body = super(Federation, self).delete(url, **kwargs)
+        self.expected_success(http_client.NO_CONTENT, resp.status)
+        return rest_client.ResponseBody(resp, body)
 
     def _get(self, entity_id=None, **kwargs):
         url = self._build_path(entity_id)
-        return super(Federation, self).get(url, **kwargs)
+        resp, body = super(Federation, self).get(url, **kwargs)
+        self.expected_success(http_client.OK, resp.status)
+        body = json.loads(body)
+        return rest_client.ResponseBody(resp, body)
 
     def _patch(self, entity_id, body, **kwargs):
         url = self._build_path(entity_id)
-        return super(Federation, self).patch(url, body, **kwargs)
+        resp, body = super(Federation, self).patch(url, body, **kwargs)
+        self.expected_success(http_client.OK, resp.status)
+        body = json.loads(body)
+        return rest_client.ResponseBody(resp, body)
 
     def _put(self, entity_id, body, **kwargs):
         url = self._build_path(entity_id)
-        return super(Federation, self).put(url, body, **kwargs)
+        resp, body = super(Federation, self).put(url, body, **kwargs)
+        self.expected_success(http_client.CREATED, resp.status)
+        body = json.loads(body)
+        return rest_client.ResponseBody(resp, body)
diff --git a/keystone_tempest_plugin/services/identity/v3/identity_providers_client.py b/keystone_tempest_plugin/services/identity/v3/identity_providers_client.py
index f5c2e44..34f6899 100644
--- a/keystone_tempest_plugin/services/identity/v3/identity_providers_client.py
+++ b/keystone_tempest_plugin/services/identity/v3/identity_providers_client.py
@@ -31,30 +31,19 @@
                        (boolean) and remote_ids (list).
         """
         put_body = json.dumps({'identity_provider': kwargs})
-        resp, body = self._put(idp_id, put_body)
-        self.expected_success(201, resp.status)
-        body = json.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        return self._put(idp_id, put_body)
 
     def list_identity_providers(self):
         """List the identity providers."""
-        resp, body = self._get()
-        self.expected_success(200, resp.status)
-        body = json.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        return self._get()
 
     def show_identity_provider(self, idp_id):
         """Get an identity provider."""
-        resp, body = self._get(idp_id)
-        self.expected_success(200, resp.status)
-        body = json.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        return self._get(idp_id)
 
     def delete_identity_provider(self, idp_id):
         """Delete an identity provider."""
-        resp, body = self._delete(idp_id)
-        self.expected_success(204, resp.status)
-        return rest_client.ResponseBody(resp, body)
+        return self._delete(idp_id)
 
     def update_identity_provider(self, idp_id, **kwargs):
         """Update an identity provider.
@@ -64,10 +53,7 @@
                        enabled (boolean) and remote_ids (list).
         """
         patch_body = json.dumps({'identity_provider': kwargs})
-        resp, body = self._patch(idp_id, patch_body)
-        self.expected_success(200, resp.status)
-        body = json.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        return self._patch(idp_id, patch_body)
 
     def add_protocol_and_mapping(self, idp_id, protocol_id, mapping_id):
         """Add a protocol and mapping to an identity provider."""
diff --git a/keystone_tempest_plugin/services/identity/v3/mapping_rules_client.py b/keystone_tempest_plugin/services/identity/v3/mapping_rules_client.py
index 5554756..b7fcbd7 100644
--- a/keystone_tempest_plugin/services/identity/v3/mapping_rules_client.py
+++ b/keystone_tempest_plugin/services/identity/v3/mapping_rules_client.py
@@ -12,9 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-from oslo_serialization import jsonutils
-
-from tempest.lib.common import rest_client
+import json
 
 from keystone_tempest_plugin.services.identity import clients
 
@@ -25,36 +23,22 @@
 
     def create_mapping_rule(self, mapping_id, rules):
         """Create a mapping rule."""
-        put_body = jsonutils.dumps({'mapping': rules})
-        resp, body = self._put(mapping_id, put_body)
-        self.expected_success(201, resp.status)
-        body = jsonutils.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        put_body = json.dumps({'mapping': rules})
+        return self._put(mapping_id, put_body)
 
     def list_mapping_rules(self):
         """List the mapping rules."""
-        resp, body = self._get()
-        self.expected_success(200, resp.status)
-        body = jsonutils.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        return self._get()
 
     def show_mapping_rule(self, mapping_id):
         """Get a mapping rule."""
-        resp, body = self._get(mapping_id)
-        self.expected_success(200, resp.status)
-        body = jsonutils.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        return self._get(mapping_id)
 
     def delete_mapping_rule(self, mapping_id):
         """Delete a mapping rule."""
-        resp, body = self._delete(mapping_id)
-        self.expected_success(204, resp.status)
-        return rest_client.ResponseBody(resp, body)
+        return self._delete(mapping_id)
 
     def update_mapping_rule(self, mapping_id, rules):
         """Update a mapping rule."""
-        patch_body = jsonutils.dumps({'mapping': rules})
-        resp, body = self._patch(mapping_id, patch_body)
-        self.expected_success(200, resp.status)
-        body = jsonutils.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        patch_body = json.dumps({'mapping': rules})
+        return self._patch(mapping_id, patch_body)
diff --git a/keystone_tempest_plugin/services/identity/v3/service_providers_client.py b/keystone_tempest_plugin/services/identity/v3/service_providers_client.py
index 65ec9cc..093ce0f 100644
--- a/keystone_tempest_plugin/services/identity/v3/service_providers_client.py
+++ b/keystone_tempest_plugin/services/identity/v3/service_providers_client.py
@@ -12,9 +12,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-from oslo_serialization import jsonutils
-
-from tempest.lib.common import rest_client
+import json
 
 from keystone_tempest_plugin.services.identity import clients
 
@@ -31,31 +29,20 @@
                        (str). Optional: description (str), enabled (boolean)
                        and relay_state_prefix (str).
         """
-        put_body = jsonutils.dumps({'service_provider': kwargs})
-        resp, body = self._put(sp_id, put_body)
-        self.expected_success(201, resp.status)
-        body = jsonutils.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        put_body = json.dumps({'service_provider': kwargs})
+        return self._put(sp_id, put_body)
 
     def list_service_providers(self):
         """List the service providers."""
-        resp, body = self._get()
-        self.expected_success(200, resp.status)
-        body = jsonutils.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        return self._get()
 
     def show_service_provider(self, sp_id):
         """Get a service provider."""
-        resp, body = self._get(sp_id)
-        self.expected_success(200, resp.status)
-        body = jsonutils.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        return self._get(sp_id)
 
     def delete_service_provider(self, sp_id):
         """Delete a service provider."""
-        resp, body = self._delete(sp_id)
-        self.expected_success(204, resp.status)
-        return rest_client.ResponseBody(resp, body)
+        return self._delete(sp_id)
 
     def update_service_provider(self, sp_id, **kwargs):
         """Update a service provider.
@@ -65,11 +52,8 @@
                        (str), description (str), enabled (boolean) and
                        relay_state_prefix (str).
         """
-        patch_body = jsonutils.dumps({'service_provider': kwargs})
-        resp, body = self._patch(sp_id, patch_body)
-        self.expected_success(200, resp.status)
-        body = jsonutils.loads(body)
-        return rest_client.ResponseBody(resp, body)
+        patch_body = json.dumps({'service_provider': kwargs})
+        return self._patch(sp_id, patch_body)
 
     def get_service_providers_in_token(self):
         """Get the service providers list present in the token.
diff --git a/keystone_tempest_plugin/tests/api/identity/v3/test_identity_providers.py b/keystone_tempest_plugin/tests/api/identity/v3/test_identity_providers.py
index fbc14c6..ebd00d4 100644
--- a/keystone_tempest_plugin/tests/api/identity/v3/test_identity_providers.py
+++ b/keystone_tempest_plugin/tests/api/identity/v3/test_identity_providers.py
@@ -115,6 +115,10 @@
         # The identity provider should be disabled
         self.assertFalse(idp['enabled'])
 
+        idp_get = self.idps_client.show_identity_provider(
+            idp_id)['identity_provider']
+        self.assertFalse(idp_get['enabled'])
+
     def _assert_protocol_attributes(self, protocol, protocol_id,
                                     mapping_id=None):
         self.assertIn('id', protocol)
diff --git a/keystone_tempest_plugin/tests/api/identity/v3/test_mapping_rules.py b/keystone_tempest_plugin/tests/api/identity/v3/test_mapping_rules.py
index f544671..e7ac47b 100644
--- a/keystone_tempest_plugin/tests/api/identity/v3/test_mapping_rules.py
+++ b/keystone_tempest_plugin/tests/api/identity/v3/test_mapping_rules.py
@@ -50,7 +50,7 @@
 
     @test.attr(type=['negative'])
     @decorators.idempotent_id('341dac45-ce1f-4f15-afdc-1f9a7d7d7c40')
-    def test_mapping_rules_create_without_mandatory_attributes(self):
+    def test_mapping_rules_create_without_mandatory_attributes_fails(self):
         mapping_id = data_utils.rand_uuid_hex()
         self.assertRaises(
             lib_exc.BadRequest,
@@ -96,3 +96,8 @@
             mapping_id, mapping_ref)['mapping']
         self._assert_mapping_rules_attributes(
             mapping, mapping_id, mapping_ref)
+
+        mapping_get = self.mappings_client.show_mapping_rule(mapping_id)[
+            'mapping']
+        self._assert_mapping_rules_attributes(
+            mapping_get, mapping_id, mapping)
diff --git a/keystone_tempest_plugin/tests/api/identity/v3/test_service_providers.py b/keystone_tempest_plugin/tests/api/identity/v3/test_service_providers.py
index 7cecbe0..26363d4 100644
--- a/keystone_tempest_plugin/tests/api/identity/v3/test_service_providers.py
+++ b/keystone_tempest_plugin/tests/api/identity/v3/test_service_providers.py
@@ -161,9 +161,13 @@
         # The service provider should be now disabled
         self.assertFalse(sp['enabled'])
 
+        sp_get = self.sps_client.show_service_provider(sp_id)[
+            'service_provider']
+        self.assertFalse(sp_get['enabled'])
+
     @test.attr(type=['negative'])
     @decorators.idempotent_id('91ce1183-1a15-4598-ae5f-85cfa98a1c77')
-    def test_service_provider_update_with_bad_attributes(self):
+    def test_service_provider_update_with_bad_attributes_fails(self):
         sp_id = data_utils.rand_uuid_hex()
         self._create_sp(sp_id, fixtures.sp_ref())