Merge "Update the documention for doc migration"
diff --git a/tempest/api/compute/servers/test_create_server.py b/tempest/api/compute/servers/test_create_server.py
index ffadd96..09479c6 100644
--- a/tempest/api/compute/servers/test_create_server.py
+++ b/tempest/api/compute/servers/test_create_server.py
@@ -38,8 +38,6 @@
     def setup_clients(cls):
         super(ServersTestJSON, cls).setup_clients()
         cls.client = cls.servers_client
-        cls.networks_client = cls.os_primary.networks_client
-        cls.subnets_client = cls.os_primary.subnets_client
 
     @classmethod
     def resource_setup(cls):
@@ -63,20 +61,6 @@
         cls.server = (cls.client.show_server(server_initial['id'])
                       ['server'])
 
-    def _create_net_subnet_ret_net_from_cidr(self, cidr):
-        name_net = data_utils.rand_name(self.__class__.__name__)
-        net = self.networks_client.create_network(name=name_net)
-        self.addCleanup(self.networks_client.delete_network,
-                        net['network']['id'])
-
-        subnet = self.subnets_client.create_subnet(
-            network_id=net['network']['id'],
-            cidr=cidr,
-            ip_version=4)
-        self.addCleanup(self.subnets_client.delete_subnet,
-                        subnet['subnet']['id'])
-        return net
-
     @decorators.attr(type='smoke')
     @decorators.idempotent_id('5de47127-9977-400a-936f-abcfbec1218f')
     def test_verify_server_details(self):
@@ -158,73 +142,6 @@
                         ['server_group'])
         self.assertIn(server['id'], server_group['members'])
 
-    @decorators.idempotent_id('0578d144-ed74-43f8-8e57-ab10dbf9b3c2')
-    @testtools.skipUnless(CONF.service_available.neutron,
-                          'Neutron service must be available.')
-    def test_verify_multiple_nics_order(self):
-        # Verify that the networks order given at the server creation is
-        # preserved within the server.
-        net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24')
-        net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24')
-
-        networks = [{'uuid': net1['network']['id']},
-                    {'uuid': net2['network']['id']}]
-
-        server_multi_nics = self.create_test_server(
-            networks=networks, wait_until='ACTIVE')
-
-        # Cleanup server; this is needed in the test case because with the LIFO
-        # nature of the cleanups, if we don't delete the server first, the port
-        # will still be part of the subnet and we'll get a 409 from Neutron
-        # when trying to delete the subnet. The tear down in the base class
-        # will try to delete the server and get a 404 but it's ignored so
-        # we're OK.
-        self.addCleanup(self.delete_server, server_multi_nics['id'])
-
-        addresses = (self.client.list_addresses(server_multi_nics['id'])
-                     ['addresses'])
-
-        # We can't predict the ip addresses assigned to the server on networks.
-        # Sometimes the assigned addresses are ['19.80.0.2', '19.86.0.2'], at
-        # other times ['19.80.0.3', '19.86.0.3']. So we check if the first
-        # address is in first network, similarly second address is in second
-        # network.
-        addr = [addresses[net1['network']['name']][0]['addr'],
-                addresses[net2['network']['name']][0]['addr']]
-        networks = [netaddr.IPNetwork('19.80.0.0/24'),
-                    netaddr.IPNetwork('19.86.0.0/24')]
-        for address, network in zip(addr, networks):
-            self.assertIn(address, network)
-
-    @decorators.idempotent_id('1678d144-ed74-43f8-8e57-ab10dbf9b3c2')
-    @testtools.skipUnless(CONF.service_available.neutron,
-                          'Neutron service must be available.')
-    def test_verify_duplicate_network_nics(self):
-        # Verify that server creation does not fail when more than one nic
-        # is created on the same network.
-        net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24')
-        net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24')
-
-        networks = [{'uuid': net1['network']['id']},
-                    {'uuid': net2['network']['id']},
-                    {'uuid': net1['network']['id']}]
-
-        server_multi_nics = self.create_test_server(
-            networks=networks, wait_until='ACTIVE')
-        self.addCleanup(self.delete_server, server_multi_nics['id'])
-
-        addresses = (self.client.list_addresses(server_multi_nics['id'])
-                     ['addresses'])
-
-        addr = [addresses[net1['network']['name']][0]['addr'],
-                addresses[net2['network']['name']][0]['addr'],
-                addresses[net1['network']['name']][1]['addr']]
-        networks = [netaddr.IPNetwork('19.80.0.0/24'),
-                    netaddr.IPNetwork('19.86.0.0/24'),
-                    netaddr.IPNetwork('19.80.0.0/24')]
-        for address, network in zip(addr, networks):
-            self.assertIn(address, network)
-
 
 class ServersTestManualDisk(ServersTestJSON):
     disk_config = 'MANUAL'
diff --git a/tempest/api/compute/servers/test_create_server_multi_nic.py b/tempest/api/compute/servers/test_create_server_multi_nic.py
new file mode 100644
index 0000000..3447d85
--- /dev/null
+++ b/tempest/api/compute/servers/test_create_server_multi_nic.py
@@ -0,0 +1,120 @@
+# Copyright 2012 OpenStack Foundation
+# 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 netaddr
+import testtools
+
+from tempest.api.compute import base
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
+
+CONF = config.CONF
+
+
+class ServersTestMultiNic(base.BaseV2ComputeTest):
+
+    @classmethod
+    def setup_credentials(cls):
+        cls.prepare_instance_network()
+        super(ServersTestMultiNic, cls).setup_credentials()
+
+    @classmethod
+    def setup_clients(cls):
+        super(ServersTestMultiNic, cls).setup_clients()
+        cls.client = cls.servers_client
+        cls.networks_client = cls.os_primary.networks_client
+        cls.subnets_client = cls.os_primary.subnets_client
+
+    def _create_net_subnet_ret_net_from_cidr(self, cidr):
+        name_net = data_utils.rand_name(self.__class__.__name__)
+        net = self.networks_client.create_network(name=name_net)
+        self.addCleanup(self.networks_client.delete_network,
+                        net['network']['id'])
+
+        subnet = self.subnets_client.create_subnet(
+            network_id=net['network']['id'],
+            cidr=cidr,
+            ip_version=4)
+        self.addCleanup(self.subnets_client.delete_subnet,
+                        subnet['subnet']['id'])
+        return net
+
+    @decorators.idempotent_id('0578d144-ed74-43f8-8e57-ab10dbf9b3c2')
+    @testtools.skipUnless(CONF.service_available.neutron,
+                          'Neutron service must be available.')
+    def test_verify_multiple_nics_order(self):
+        # Verify that the networks order given at the server creation is
+        # preserved within the server.
+        net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24')
+        net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24')
+
+        networks = [{'uuid': net1['network']['id']},
+                    {'uuid': net2['network']['id']}]
+
+        server_multi_nics = self.create_test_server(
+            networks=networks, wait_until='ACTIVE')
+
+        # Cleanup server; this is needed in the test case because with the LIFO
+        # nature of the cleanups, if we don't delete the server first, the port
+        # will still be part of the subnet and we'll get a 409 from Neutron
+        # when trying to delete the subnet. The tear down in the base class
+        # will try to delete the server and get a 404 but it's ignored so
+        # we're OK.
+        self.addCleanup(self.delete_server, server_multi_nics['id'])
+
+        addresses = (self.client.list_addresses(server_multi_nics['id'])
+                     ['addresses'])
+
+        # We can't predict the ip addresses assigned to the server on networks.
+        # Sometimes the assigned addresses are ['19.80.0.2', '19.86.0.2'], at
+        # other times ['19.80.0.3', '19.86.0.3']. So we check if the first
+        # address is in first network, similarly second address is in second
+        # network.
+        addr = [addresses[net1['network']['name']][0]['addr'],
+                addresses[net2['network']['name']][0]['addr']]
+        networks = [netaddr.IPNetwork('19.80.0.0/24'),
+                    netaddr.IPNetwork('19.86.0.0/24')]
+        for address, network in zip(addr, networks):
+            self.assertIn(address, network)
+
+    @decorators.idempotent_id('1678d144-ed74-43f8-8e57-ab10dbf9b3c2')
+    @testtools.skipUnless(CONF.service_available.neutron,
+                          'Neutron service must be available.')
+    def test_verify_duplicate_network_nics(self):
+        # Verify that server creation does not fail when more than one nic
+        # is created on the same network.
+        net1 = self._create_net_subnet_ret_net_from_cidr('19.80.0.0/24')
+        net2 = self._create_net_subnet_ret_net_from_cidr('19.86.0.0/24')
+
+        networks = [{'uuid': net1['network']['id']},
+                    {'uuid': net2['network']['id']},
+                    {'uuid': net1['network']['id']}]
+
+        server_multi_nics = self.create_test_server(
+            networks=networks, wait_until='ACTIVE')
+        self.addCleanup(self.delete_server, server_multi_nics['id'])
+
+        addresses = (self.client.list_addresses(server_multi_nics['id'])
+                     ['addresses'])
+
+        addr = [addresses[net1['network']['name']][0]['addr'],
+                addresses[net2['network']['name']][0]['addr'],
+                addresses[net1['network']['name']][1]['addr']]
+        networks = [netaddr.IPNetwork('19.80.0.0/24'),
+                    netaddr.IPNetwork('19.86.0.0/24'),
+                    netaddr.IPNetwork('19.80.0.0/24')]
+        for address, network in zip(addr, networks):
+            self.assertIn(address, network)
diff --git a/tempest/lib/services/identity/v3/endpoint_groups_client.py b/tempest/lib/services/identity/v3/endpoint_groups_client.py
index 723aeaa..ce99389 100644
--- a/tempest/lib/services/identity/v3/endpoint_groups_client.py
+++ b/tempest/lib/services/identity/v3/endpoint_groups_client.py
@@ -1,78 +1,78 @@
-# Copyright 2017 AT&T 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.

-

-from oslo_serialization import jsonutils as json

-

-from tempest.lib.common import rest_client

-

-

-class EndPointGroupsClient(rest_client.RestClient):

-    api_version = "v3"

-

-    def create_endpoint_group(self, **kwargs):

-        """Create endpoint group.

-

-        For a full list of available parameters, please refer to the

-        official API reference:

-        https://developer.openstack.org/api-ref/identity/v3-ext/#create-endpoint-group

-        """

-        post_body = json.dumps({'endpoint_group': kwargs})

-        resp, body = self.post('OS-EP-FILTER/endpoint_groups', post_body)

-        self.expected_success(201, resp.status)

-        body = json.loads(body)

-        return rest_client.ResponseBody(resp, body)

-

-    def update_endpoint_group(self, endpoint_group_id, **kwargs):

-        """Update endpoint group.

-

-        For a full list of available parameters, please refer to the

-        official API reference:

-        https://developer.openstack.org/api-ref/identity/v3-ext/#update-endpoint-group

-        """

-        post_body = json.dumps({'endpoint_group': kwargs})

-        resp, body = self.patch(

-            'OS-EP-FILTER/endpoint_groups/%s' % endpoint_group_id, post_body)

-        self.expected_success(200, resp.status)

-        body = json.loads(body)

-        return rest_client.ResponseBody(resp, body)

-

-    def delete_endpoint_group(self, endpoint_group_id):

-        """Delete endpoint group."""

-        resp_header, resp_body = self.delete(

-            'OS-EP-FILTER/endpoint_groups/%s' % endpoint_group_id)

-        self.expected_success(204, resp_header.status)

-        return rest_client.ResponseBody(resp_header, resp_body)

-

-    def show_endpoint_group(self, endpoint_group_id):

-        """Get endpoint group."""

-        resp_header, resp_body = self.get(

-            'OS-EP-FILTER/endpoint_groups/%s' % endpoint_group_id)

-        self.expected_success(200, resp_header.status)

-        resp_body = json.loads(resp_body)

-        return rest_client.ResponseBody(resp_header, resp_body)

-

-    def check_endpoint_group(self, endpoint_group_id):

-        """Check endpoint group."""

-        resp_header, resp_body = self.head(

-            'OS-EP-FILTER/endpoint_groups/%s' % endpoint_group_id)

-        self.expected_success(200, resp_header.status)

-        return rest_client.ResponseBody(resp_header, resp_body)

-

-    def list_endpoint_groups(self):

-        """Get endpoint groups."""

-        resp_header, resp_body = self.get('OS-EP-FILTER/endpoint_groups')

-        self.expected_success(200, resp_header.status)

-        resp_body = json.loads(resp_body)

-        return rest_client.ResponseBody(resp_header, resp_body)

+# Copyright 2017 AT&T 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.
+
+from oslo_serialization import jsonutils as json
+
+from tempest.lib.common import rest_client
+
+
+class EndPointGroupsClient(rest_client.RestClient):
+    api_version = "v3"
+
+    def create_endpoint_group(self, **kwargs):
+        """Create endpoint group.
+
+        For a full list of available parameters, please refer to the
+        official API reference:
+        https://developer.openstack.org/api-ref/identity/v3-ext/#create-endpoint-group
+        """
+        post_body = json.dumps({'endpoint_group': kwargs})
+        resp, body = self.post('OS-EP-FILTER/endpoint_groups', post_body)
+        self.expected_success(201, resp.status)
+        body = json.loads(body)
+        return rest_client.ResponseBody(resp, body)
+
+    def update_endpoint_group(self, endpoint_group_id, **kwargs):
+        """Update endpoint group.
+
+        For a full list of available parameters, please refer to the
+        official API reference:
+        https://developer.openstack.org/api-ref/identity/v3-ext/#update-endpoint-group
+        """
+        post_body = json.dumps({'endpoint_group': kwargs})
+        resp, body = self.patch(
+            'OS-EP-FILTER/endpoint_groups/%s' % endpoint_group_id, post_body)
+        self.expected_success(200, resp.status)
+        body = json.loads(body)
+        return rest_client.ResponseBody(resp, body)
+
+    def delete_endpoint_group(self, endpoint_group_id):
+        """Delete endpoint group."""
+        resp_header, resp_body = self.delete(
+            'OS-EP-FILTER/endpoint_groups/%s' % endpoint_group_id)
+        self.expected_success(204, resp_header.status)
+        return rest_client.ResponseBody(resp_header, resp_body)
+
+    def show_endpoint_group(self, endpoint_group_id):
+        """Get endpoint group."""
+        resp_header, resp_body = self.get(
+            'OS-EP-FILTER/endpoint_groups/%s' % endpoint_group_id)
+        self.expected_success(200, resp_header.status)
+        resp_body = json.loads(resp_body)
+        return rest_client.ResponseBody(resp_header, resp_body)
+
+    def check_endpoint_group(self, endpoint_group_id):
+        """Check endpoint group."""
+        resp_header, resp_body = self.head(
+            'OS-EP-FILTER/endpoint_groups/%s' % endpoint_group_id)
+        self.expected_success(200, resp_header.status)
+        return rest_client.ResponseBody(resp_header, resp_body)
+
+    def list_endpoint_groups(self):
+        """Get endpoint groups."""
+        resp_header, resp_body = self.get('OS-EP-FILTER/endpoint_groups')
+        self.expected_success(200, resp_header.status)
+        resp_body = json.loads(resp_body)
+        return rest_client.ResponseBody(resp_header, resp_body)
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index 7690d3b..9b8c7a0 100644
--- a/tempest/scenario/manager.py
+++ b/tempest/scenario/manager.py
@@ -238,6 +238,23 @@
         volume = self.volumes_client.show_volume(volume['id'])['volume']
         return volume
 
+    def create_volume_snapshot(self, volume_id, name=None, description=None,
+                               metadata=None, force=False):
+        name = name or data_utils.rand_name(
+            self.__class__.__name__ + '-snapshot')
+        snapshot = self.snapshots_client.create_snapshot(
+            volume_id=volume_id,
+            force=force,
+            display_name=name,
+            description=description,
+            metadata=metadata)['snapshot']
+        self.addCleanup(self.snapshots_client.wait_for_resource_deletion,
+                        snapshot['id'])
+        self.addCleanup(self.snapshots_client.delete_snapshot, snapshot['id'])
+        waiters.wait_for_volume_resource_status(self.snapshots_client,
+                                                snapshot['id'], 'available')
+        return snapshot
+
     def create_volume_type(self, client=None, name=None, backend_name=None):
         if not client:
             client = self.os_admin.volume_types_v2_client
diff --git a/tempest/scenario/test_stamp_pattern.py b/tempest/scenario/test_stamp_pattern.py
index debd664..3632648 100644
--- a/tempest/scenario/test_stamp_pattern.py
+++ b/tempest/scenario/test_stamp_pattern.py
@@ -16,9 +16,7 @@
 from oslo_log import log as logging
 import testtools
 
-from tempest.common import waiters
 from tempest import config
-from tempest.lib.common.utils import data_utils
 from tempest.lib.common.utils import test_utils
 from tempest.lib import decorators
 from tempest.lib import exceptions as lib_exc
@@ -57,20 +55,6 @@
         if not CONF.volume_feature_enabled.snapshot:
             raise cls.skipException("Cinder volume snapshots are disabled")
 
-    def _create_volume_snapshot(self, volume):
-        snapshot_name = data_utils.rand_name('scenario-snapshot')
-        snapshot = self.snapshots_client.create_snapshot(
-            volume_id=volume['id'], display_name=snapshot_name)['snapshot']
-        self.addCleanup(self.snapshots_client.wait_for_resource_deletion,
-                        snapshot['id'])
-        self.addCleanup(self.snapshots_client.delete_snapshot, snapshot['id'])
-        waiters.wait_for_volume_resource_status(self.volumes_client,
-                                                volume['id'], 'available')
-        waiters.wait_for_volume_resource_status(self.snapshots_client,
-                                                snapshot['id'], 'available')
-        self.assertEqual(snapshot_name, snapshot['name'])
-        return snapshot
-
     def _wait_for_volume_available_on_the_system(self, ip_address,
                                                  private_key):
         ssh = self.get_remote_client(ip_address, private_key=private_key)
@@ -116,7 +100,7 @@
         self.nova_volume_detach(server, volume)
 
         # snapshot the volume
-        volume_snapshot = self._create_volume_snapshot(volume)
+        volume_snapshot = self.create_volume_snapshot(volume['id'])
 
         # snapshot the instance
         snapshot_image = self.create_server_snapshot(server=server)
diff --git a/tempest/scenario/test_volume_boot_pattern.py b/tempest/scenario/test_volume_boot_pattern.py
index 96d0474..b6f3b38 100644
--- a/tempest/scenario/test_volume_boot_pattern.py
+++ b/tempest/scenario/test_volume_boot_pattern.py
@@ -69,21 +69,6 @@
 
         return self.create_server(image_id='', **create_kwargs)
 
-    def _create_snapshot_from_volume(self, vol_id):
-        snap_name = data_utils.rand_name(
-            self.__class__.__name__ + '-snapshot')
-        snap = self.snapshots_client.create_snapshot(
-            volume_id=vol_id,
-            force=True,
-            display_name=snap_name)['snapshot']
-        self.addCleanup(
-            self.snapshots_client.wait_for_resource_deletion, snap['id'])
-        self.addCleanup(self.snapshots_client.delete_snapshot, snap['id'])
-        waiters.wait_for_volume_resource_status(self.snapshots_client,
-                                                snap['id'], 'available')
-        self.assertEqual(snap_name, snap['name'])
-        return snap
-
     def _delete_server(self, server):
         self.servers_client.delete_server(server['id'])
         waiters.wait_for_server_termination(self.servers_client, server['id'])
@@ -147,7 +132,7 @@
 
         # snapshot a volume
         LOG.info("Creating snapshot from volume: %s", volume_origin['id'])
-        snapshot = self._create_snapshot_from_volume(volume_origin['id'])
+        snapshot = self.create_volume_snapshot(volume_origin['id'], force=True)
 
         # create a 3rd instance from snapshot
         LOG.info("Creating third instance from snapshot: %s", snapshot['id'])
@@ -177,7 +162,7 @@
         boot_volume = self._create_volume_from_image()
 
         # Create a snapshot
-        boot_snapshot = self._create_snapshot_from_volume(boot_volume['id'])
+        boot_snapshot = self.create_volume_snapshot(boot_volume['id'])
 
         # Create a server from a volume snapshot
         server = self._boot_instance_from_resource(
@@ -229,9 +214,8 @@
         self._delete_server(instance)
 
     @decorators.idempotent_id('cb78919a-e553-4bab-b73b-10cf4d2eb125')
-    @testtools.skipIf(CONF.volume.storage_protocol.lower() in ['ceph', 'nfs'],
-                      'Currently, {} does not support volume encryption'
-                      .format(CONF.volume.storage_protocol))
+    @testtools.skipUnless(CONF.compute_feature_enabled.attach_encrypted_volume,
+                          'Encrypted volume attach is not supported')
     @test.services('compute', 'volume')
     def test_boot_server_from_encrypted_volume_luks(self):
         # Create an encrypted volume
diff --git a/tempest/tests/lib/services/identity/v3/test_endpoint_groups_client.py b/tempest/tests/lib/services/identity/v3/test_endpoint_groups_client.py
index 8b034e6..c724f0a 100644
--- a/tempest/tests/lib/services/identity/v3/test_endpoint_groups_client.py
+++ b/tempest/tests/lib/services/identity/v3/test_endpoint_groups_client.py
@@ -1,162 +1,162 @@
-# Copyright 2017 AT&T 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.

-

-from tempest.lib.services.identity.v3 import endpoint_groups_client

-from tempest.tests.lib import fake_auth_provider

-from tempest.tests.lib.services import base

-

-

-class TestEndPointGroupsClient(base.BaseServiceTest):

-    FAKE_CREATE_ENDPOINT_GROUP = {

-        "endpoint_group": {

-            "id": 1,

-            "name": "FAKE_ENDPOINT_GROUP",

-            "description": "FAKE SERVICE ENDPOINT GROUP",

-            "filters": {

-                "service_id": 1

-            }

-        }

-    }

-

-    FAKE_ENDPOINT_GROUP_INFO = {

-        "endpoint_group": {

-            "id": 1,

-            "name": "FAKE_ENDPOINT_GROUP",

-            "description": "FAKE SERVICE ENDPOINT GROUP",

-            "links": {

-                "self": "http://example.com/identity/v3/OS-EP-FILTER/" +

-                        "endpoint_groups/1"

-            },

-            "filters": {

-                "service_id": 1

-            }

-        }

-    }

-

-    FAKE_LIST_ENDPOINT_GROUPS = {

-        "endpoint_groups": [

-            {

-                "id": 1,

-                "name": "SERVICE_GROUP1",

-                "description": "FAKE SERVICE ENDPOINT GROUP",

-                "links": {

-                    "self": "http://example.com/identity/v3/OS-EP-FILTER/" +

-                            "endpoint_groups/1"

-                },

-                "filters": {

-                    "service_id": 1

-                }

-            },

-            {

-                "id": 2,

-                "name": "SERVICE_GROUP2",

-                "description": "FAKE SERVICE ENDPOINT GROUP",

-                "links": {

-                    "self": "http://example.com/identity/v3/OS-EP-FILTER/" +

-                            "endpoint_groups/2"

-                },

-                "filters": {

-                    "service_id": 2

-                }

-            }

-        ]

-    }

-

-    def setUp(self):

-        super(TestEndPointGroupsClient, self).setUp()

-        fake_auth = fake_auth_provider.FakeAuthProvider()

-        self.client = endpoint_groups_client.EndPointGroupsClient(

-            fake_auth, 'identity', 'regionOne')

-

-    def _test_create_endpoint_group(self, bytes_body=False):

-        self.check_service_client_function(

-            self.client.create_endpoint_group,

-            'tempest.lib.common.rest_client.RestClient.post',

-            self.FAKE_CREATE_ENDPOINT_GROUP,

-            bytes_body,

-            status=201,

-            name="FAKE_ENDPOINT_GROUP",

-            filters={'service_id': "1"})

-

-    def _test_show_endpoint_group(self, bytes_body=False):

-        self.check_service_client_function(

-            self.client.show_endpoint_group,

-            'tempest.lib.common.rest_client.RestClient.get',

-            self.FAKE_ENDPOINT_GROUP_INFO,

-            bytes_body,

-            endpoint_group_id="1")

-

-    def _test_check_endpoint_group(self, bytes_body=False):

-        self.check_service_client_function(

-            self.client.check_endpoint_group,

-            'tempest.lib.common.rest_client.RestClient.head',

-            {},

-            bytes_body,

-            status=200,

-            endpoint_group_id="1")

-

-    def _test_update_endpoint_group(self, bytes_body=False):

-        self.check_service_client_function(

-            self.client.update_endpoint_group,

-            'tempest.lib.common.rest_client.RestClient.patch',

-            self.FAKE_ENDPOINT_GROUP_INFO,

-            bytes_body,

-            endpoint_group_id="1",

-            name="NewName")

-

-    def _test_list_endpoint_groups(self, bytes_body=False):

-        self.check_service_client_function(

-            self.client.list_endpoint_groups,

-            'tempest.lib.common.rest_client.RestClient.get',

-            self.FAKE_LIST_ENDPOINT_GROUPS,

-            bytes_body)

-

-    def test_create_endpoint_group_with_str_body(self):

-        self._test_create_endpoint_group()

-

-    def test_create_endpoint_group_with_bytes_body(self):

-        self._test_create_endpoint_group(bytes_body=True)

-

-    def test_show_endpoint_group_with_str_body(self):

-        self._test_show_endpoint_group()

-

-    def test_show_endpoint_group_with_bytes_body(self):

-        self._test_show_endpoint_group(bytes_body=True)

-

-    def test_check_endpoint_group_with_str_body(self):

-        self._test_check_endpoint_group()

-

-    def test_check_endpoint_group_with_bytes_body(self):

-        self._test_check_endpoint_group(bytes_body=True)

-

-    def test_list_endpoint_groups_with_str_body(self):

-        self._test_list_endpoint_groups()

-

-    def test_list_endpoint_groups_with_bytes_body(self):

-        self._test_list_endpoint_groups(bytes_body=True)

-

-    def test_update_endpoint_group_with_str_body(self):

-        self._test_update_endpoint_group()

-

-    def test_update_endpoint_group_with_bytes_body(self):

-        self._test_update_endpoint_group(bytes_body=True)

-

-    def test_delete_endpoint_group(self):

-        self.check_service_client_function(

-            self.client.delete_endpoint_group,

-            'tempest.lib.common.rest_client.RestClient.delete',

-            {},

-            endpoint_group_id="1",

-            status=204)

+# Copyright 2017 AT&T 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.
+
+from tempest.lib.services.identity.v3 import endpoint_groups_client
+from tempest.tests.lib import fake_auth_provider
+from tempest.tests.lib.services import base
+
+
+class TestEndPointGroupsClient(base.BaseServiceTest):
+    FAKE_CREATE_ENDPOINT_GROUP = {
+        "endpoint_group": {
+            "id": 1,
+            "name": "FAKE_ENDPOINT_GROUP",
+            "description": "FAKE SERVICE ENDPOINT GROUP",
+            "filters": {
+                "service_id": 1
+            }
+        }
+    }
+
+    FAKE_ENDPOINT_GROUP_INFO = {
+        "endpoint_group": {
+            "id": 1,
+            "name": "FAKE_ENDPOINT_GROUP",
+            "description": "FAKE SERVICE ENDPOINT GROUP",
+            "links": {
+                "self": "http://example.com/identity/v3/OS-EP-FILTER/" +
+                        "endpoint_groups/1"
+            },
+            "filters": {
+                "service_id": 1
+            }
+        }
+    }
+
+    FAKE_LIST_ENDPOINT_GROUPS = {
+        "endpoint_groups": [
+            {
+                "id": 1,
+                "name": "SERVICE_GROUP1",
+                "description": "FAKE SERVICE ENDPOINT GROUP",
+                "links": {
+                    "self": "http://example.com/identity/v3/OS-EP-FILTER/" +
+                            "endpoint_groups/1"
+                },
+                "filters": {
+                    "service_id": 1
+                }
+            },
+            {
+                "id": 2,
+                "name": "SERVICE_GROUP2",
+                "description": "FAKE SERVICE ENDPOINT GROUP",
+                "links": {
+                    "self": "http://example.com/identity/v3/OS-EP-FILTER/" +
+                            "endpoint_groups/2"
+                },
+                "filters": {
+                    "service_id": 2
+                }
+            }
+        ]
+    }
+
+    def setUp(self):
+        super(TestEndPointGroupsClient, self).setUp()
+        fake_auth = fake_auth_provider.FakeAuthProvider()
+        self.client = endpoint_groups_client.EndPointGroupsClient(
+            fake_auth, 'identity', 'regionOne')
+
+    def _test_create_endpoint_group(self, bytes_body=False):
+        self.check_service_client_function(
+            self.client.create_endpoint_group,
+            'tempest.lib.common.rest_client.RestClient.post',
+            self.FAKE_CREATE_ENDPOINT_GROUP,
+            bytes_body,
+            status=201,
+            name="FAKE_ENDPOINT_GROUP",
+            filters={'service_id': "1"})
+
+    def _test_show_endpoint_group(self, bytes_body=False):
+        self.check_service_client_function(
+            self.client.show_endpoint_group,
+            'tempest.lib.common.rest_client.RestClient.get',
+            self.FAKE_ENDPOINT_GROUP_INFO,
+            bytes_body,
+            endpoint_group_id="1")
+
+    def _test_check_endpoint_group(self, bytes_body=False):
+        self.check_service_client_function(
+            self.client.check_endpoint_group,
+            'tempest.lib.common.rest_client.RestClient.head',
+            {},
+            bytes_body,
+            status=200,
+            endpoint_group_id="1")
+
+    def _test_update_endpoint_group(self, bytes_body=False):
+        self.check_service_client_function(
+            self.client.update_endpoint_group,
+            'tempest.lib.common.rest_client.RestClient.patch',
+            self.FAKE_ENDPOINT_GROUP_INFO,
+            bytes_body,
+            endpoint_group_id="1",
+            name="NewName")
+
+    def _test_list_endpoint_groups(self, bytes_body=False):
+        self.check_service_client_function(
+            self.client.list_endpoint_groups,
+            'tempest.lib.common.rest_client.RestClient.get',
+            self.FAKE_LIST_ENDPOINT_GROUPS,
+            bytes_body)
+
+    def test_create_endpoint_group_with_str_body(self):
+        self._test_create_endpoint_group()
+
+    def test_create_endpoint_group_with_bytes_body(self):
+        self._test_create_endpoint_group(bytes_body=True)
+
+    def test_show_endpoint_group_with_str_body(self):
+        self._test_show_endpoint_group()
+
+    def test_show_endpoint_group_with_bytes_body(self):
+        self._test_show_endpoint_group(bytes_body=True)
+
+    def test_check_endpoint_group_with_str_body(self):
+        self._test_check_endpoint_group()
+
+    def test_check_endpoint_group_with_bytes_body(self):
+        self._test_check_endpoint_group(bytes_body=True)
+
+    def test_list_endpoint_groups_with_str_body(self):
+        self._test_list_endpoint_groups()
+
+    def test_list_endpoint_groups_with_bytes_body(self):
+        self._test_list_endpoint_groups(bytes_body=True)
+
+    def test_update_endpoint_group_with_str_body(self):
+        self._test_update_endpoint_group()
+
+    def test_update_endpoint_group_with_bytes_body(self):
+        self._test_update_endpoint_group(bytes_body=True)
+
+    def test_delete_endpoint_group(self):
+        self.check_service_client_function(
+            self.client.delete_endpoint_group,
+            'tempest.lib.common.rest_client.RestClient.delete',
+            {},
+            endpoint_group_id="1",
+            status=204)