From 7750fc1cf45a32563225092ec442c96c38ee6769 Mon Sep 17 00:00:00 2001
From: Antonia Gaete <antoniagaete@osuosl.org>
Date: Tue, 12 Nov 2024 17:45:51 +0000
Subject: [PATCH] identity: Migrate 'endpoint' commands to SDK

Change-Id: I71b5ae8a4bbcb2fdebf894d8bd5cc8322c31bdb5
Depends-On: I599ff3e88d4e1e9ffafc638bb74186f2739b5a77
Depends-On: I9aa39810fe94f7ee9b68d34050f4adb9dbdfccb8
---
 openstackclient/identity/common.py            |  29 +-
 openstackclient/identity/v3/endpoint.py       | 177 ++++-----
 .../tests/unit/identity/v3/test_endpoint.py   | 339 +++++++++---------
 ...rate-endpoint-to-sdk-8ca5a34794b6bd7e.yaml |  10 +
 4 files changed, 288 insertions(+), 267 deletions(-)
 create mode 100644 releasenotes/notes/migrate-endpoint-to-sdk-8ca5a34794b6bd7e.yaml

diff --git a/openstackclient/identity/common.py b/openstackclient/identity/common.py
index 9a7f11d1a1..65ff8852ff 100644
--- a/openstackclient/identity/common.py
+++ b/openstackclient/identity/common.py
@@ -88,23 +88,22 @@ def find_service_sdk(identity_client, name_type_or_id):
         raise exceptions.CommandError(e.message)
 
     # search for service type
-    services = identity_client.services()
-    result = None
-    for service in services:
-        if name_type_or_id == service.type:
-            if result:
-                msg = _(
-                    "Multiple service matches found for '%s', "
-                    "use an ID or name to be more specific."
-                )
-                raise exceptions.CommandError(msg % name_type_or_id)
-            result = service
+    services = identity_client.services(type=name_type_or_id)
+    try:
+        service = next(services)
+    except StopIteration:
+        msg = _(
+            "No service with a type, name or ID of '%(query)s' exists."
+        ) % {"query": name_type_or_id}
+        raise exceptions.CommandError(msg)
 
-    if result is None:
-        msg = _("No service with a type, name or ID of '%s' exists.")
-        raise exceptions.CommandError(msg % name_type_or_id)
+    if next(services, None):
+        msg = _(
+            "Multiple service matches found for '%(query)s', use an ID to be more specific."
+        ) % {"query": name_type_or_id}
+        raise exceptions.CommandError(msg)
 
-    return result
+    return service
 
 
 def get_resource(manager, name_type_or_id):
diff --git a/openstackclient/identity/v3/endpoint.py b/openstackclient/identity/v3/endpoint.py
index 4b79fdaa0f..b84edb366c 100644
--- a/openstackclient/identity/v3/endpoint.py
+++ b/openstackclient/identity/v3/endpoint.py
@@ -28,11 +28,31 @@ from openstackclient.identity import common
 LOG = logging.getLogger(__name__)
 
 
-def get_service_name(service):
-    if hasattr(service, 'name'):
-        return service.name
-    else:
-        return ''
+def _format_endpoint(endpoint, service):
+    columns = (
+        'is_enabled',
+        'id',
+        'interface',
+        'region_id',
+        'region_id',
+        'service_id',
+        'url',
+    )
+    column_headers = (
+        'enabled',
+        'id',
+        'interface',
+        'region',
+        'region_id',
+        'service_id',
+        'url',
+        'service_name',
+        'service_type',
+    )
+
+    data = utils.get_item_properties(endpoint, columns)
+    data += (getattr(service, 'name', ''), service.type)
+    return column_headers, data
 
 
 class AddProjectToEndpoint(command.Command):
@@ -112,23 +132,23 @@ class CreateEndpoint(command.ShowOne):
         return parser
 
     def take_action(self, parsed_args):
-        identity_client = self.app.client_manager.identity
-        service = common.find_service(identity_client, parsed_args.service)
+        identity_client = self.app.client_manager.sdk_connection.identity
+        service = common.find_service_sdk(identity_client, parsed_args.service)
 
-        endpoint = identity_client.endpoints.create(
-            service=service.id,
-            url=parsed_args.url,
-            interface=parsed_args.interface,
-            region=parsed_args.region,
-            enabled=parsed_args.enabled,
-        )
+        kwargs = {}
 
-        info = {}
-        endpoint._info.pop('links')
-        info.update(endpoint._info)
-        info['service_name'] = get_service_name(service)
-        info['service_type'] = service.type
-        return zip(*sorted(info.items()))
+        kwargs['service_id'] = service.id
+        kwargs['url'] = parsed_args.url
+        kwargs['interface'] = parsed_args.interface
+        kwargs['is_enabled'] = parsed_args.enabled
+
+        if parsed_args.region:
+            region = identity_client.get_region(parsed_args.region)
+            kwargs['region_id'] = region.id
+
+        endpoint = identity_client.create_endpoint(**kwargs)
+
+        return _format_endpoint(endpoint, service=service)
 
 
 class DeleteEndpoint(command.Command):
@@ -145,14 +165,12 @@ class DeleteEndpoint(command.Command):
         return parser
 
     def take_action(self, parsed_args):
-        identity_client = self.app.client_manager.identity
+        identity_client = self.app.client_manager.sdk_connection.identity
         result = 0
         for i in parsed_args.endpoint:
             try:
-                endpoint_id = utils.find_resource(
-                    identity_client.endpoints, i
-                ).id
-                identity_client.endpoints.delete(endpoint_id)
+                endpoint_id = identity_client.find_endpoint(i).id
+                identity_client.delete_endpoint(endpoint_id)
             except Exception as e:
                 result += 1
                 LOG.error(
@@ -208,28 +226,24 @@ class ListEndpoint(command.Lister):
         return parser
 
     def take_action(self, parsed_args):
-        identity_client = self.app.client_manager.identity
+        identity_client = self.app.client_manager.sdk_connection.identity
 
         endpoint = None
         if parsed_args.endpoint:
-            endpoint = utils.find_resource(
-                identity_client.endpoints, parsed_args.endpoint
-            )
+            endpoint = identity_client.find_endpoint(parsed_args.endpoint)
         project = None
         if parsed_args.project:
-            project = common.find_project(
-                identity_client,
+            project = identity_client.find_project(
                 parsed_args.project,
                 parsed_args.project_domain,
             )
 
         if endpoint:
-            columns: tuple[str, ...] = ('ID', 'Name')
-            data = identity_client.endpoint_filter.list_projects_for_endpoint(
-                endpoint=endpoint.id
-            )
+            column_headers = ('ID', 'Name')
+            columns: tuple[str, ...] = ('id', 'name')
+            data = identity_client.endpoint_projects(endpoint=endpoint.id)
         else:
-            columns = (
+            column_headers = (
                 'ID',
                 'Region',
                 'Service Name',
@@ -238,37 +252,41 @@ class ListEndpoint(command.Lister):
                 'Interface',
                 'URL',
             )
+            columns = (
+                'id',
+                'region_id',
+                'service_name',
+                'service_type',
+                'is_enabled',
+                'interface',
+                'url',
+            )
             kwargs = {}
             if parsed_args.service:
-                service = common.find_service(
+                service = common.find_service_sdk(
                     identity_client, parsed_args.service
                 )
-                kwargs['service'] = service.id
+                kwargs['service_id'] = service.id
             if parsed_args.interface:
                 kwargs['interface'] = parsed_args.interface
             if parsed_args.region:
-                kwargs['region'] = parsed_args.region
+                region = identity_client.get_region(parsed_args.region)
+                kwargs['region_id'] = region.id
 
             if project:
-                data = (
-                    identity_client.endpoint_filter.list_endpoints_for_project(
-                        project=project.id
-                    )
+                data = list(
+                    identity_client.project_endpoints(project=project.id)
                 )
             else:
-                data = identity_client.endpoints.list(**kwargs)
-
-            service_list = identity_client.services.list()
+                data = list(identity_client.endpoints(**kwargs))
 
             for ep in data:
-                service = common.find_service_in_list(
-                    service_list, ep.service_id
-                )
-                ep.service_name = get_service_name(service)
+                service = identity_client.find_service(ep.service_id)
+                ep.service_name = getattr(service, 'name', '')
                 ep.service_type = service.type
 
         return (
-            columns,
+            column_headers,
             (
                 utils.get_item_properties(
                     s,
@@ -363,28 +381,34 @@ class SetEndpoint(command.Command):
         return parser
 
     def take_action(self, parsed_args):
-        identity_client = self.app.client_manager.identity
-        endpoint = utils.find_resource(
-            identity_client.endpoints, parsed_args.endpoint
-        )
+        identity_client = self.app.client_manager.sdk_connection.identity
+        endpoint = identity_client.find_endpoint(parsed_args.endpoint)
+
+        kwargs = {}
 
-        service_id = None
         if parsed_args.service:
-            service = common.find_service(identity_client, parsed_args.service)
-            service_id = service.id
-        enabled = None
-        if parsed_args.enabled:
-            enabled = True
-        if parsed_args.disabled:
-            enabled = False
+            service = common.find_service_sdk(
+                identity_client, parsed_args.service
+            )
+            kwargs['service_id'] = service.id
 
-        identity_client.endpoints.update(
+        if parsed_args.enabled:
+            kwargs['is_enabled'] = True
+        if parsed_args.disabled:
+            kwargs['is_enabled'] = False
+
+        if parsed_args.url:
+            kwargs['url'] = parsed_args.url
+
+        if parsed_args.interface:
+            kwargs['interface'] = parsed_args.interface
+
+        if parsed_args.region:
+            kwargs['region_id'] = parsed_args.region
+
+        identity_client.update_endpoint(
             endpoint.id,
-            service=service_id,
-            url=parsed_args.url,
-            interface=parsed_args.interface,
-            region=parsed_args.region,
-            enabled=enabled,
+            **kwargs,
         )
 
 
@@ -404,16 +428,9 @@ class ShowEndpoint(command.ShowOne):
         return parser
 
     def take_action(self, parsed_args):
-        identity_client = self.app.client_manager.identity
-        endpoint = utils.find_resource(
-            identity_client.endpoints, parsed_args.endpoint
-        )
+        identity_client = self.app.client_manager.sdk_connection.identity
+        endpoint = identity_client.find_endpoint(parsed_args.endpoint)
 
-        service = common.find_service(identity_client, endpoint.service_id)
+        service = common.find_service_sdk(identity_client, endpoint.service_id)
 
-        info = {}
-        endpoint._info.pop('links')
-        info.update(endpoint._info)
-        info['service_name'] = get_service_name(service)
-        info['service_type'] = service.type
-        return zip(*sorted(info.items()))
+        return _format_endpoint(endpoint, service)
diff --git a/openstackclient/tests/unit/identity/v3/test_endpoint.py b/openstackclient/tests/unit/identity/v3/test_endpoint.py
index 1dafe48e48..84e10e55ad 100644
--- a/openstackclient/tests/unit/identity/v3/test_endpoint.py
+++ b/openstackclient/tests/unit/identity/v3/test_endpoint.py
@@ -10,6 +10,13 @@
 #   License for the specific language governing permissions and limitations
 #   under the License.
 
+from openstack.identity.v3 import domain as _domain
+from openstack.identity.v3 import endpoint as _endpoint
+from openstack.identity.v3 import project as _project
+from openstack.identity.v3 import region as _region
+from openstack.identity.v3 import service as _service
+from openstack.test import fakes as sdk_fakes
+
 from openstackclient.identity.v3 import endpoint
 from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
 
@@ -37,30 +44,34 @@ class TestEndpoint(identity_fakes.TestIdentityv3):
         self.projects_mock.reset_mock()
 
 
-class TestEndpointCreate(TestEndpoint):
-    service = identity_fakes.FakeService.create_one_service()
-
+class TestEndpointCreate(identity_fakes.TestIdentityv3):
     columns = (
         'enabled',
         'id',
         'interface',
         'region',
+        'region_id',
         'service_id',
+        'url',
         'service_name',
         'service_type',
-        'url',
     )
 
     def setUp(self):
         super().setUp()
 
-        self.endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
-            attrs={'service_id': self.service.id}
+        self.service = sdk_fakes.generate_fake_resource(_service.Service)
+        self.region = sdk_fakes.generate_fake_resource(_region.Region)
+        self.endpoint = sdk_fakes.generate_fake_resource(
+            resource_type=_endpoint.Endpoint,
+            service_id=self.service.id,
+            interface='admin',
+            region_id=self.region.id,
         )
-        self.endpoints_mock.create.return_value = self.endpoint
 
-        # This is the return value for common.find_resource(service)
-        self.services_mock.get.return_value = self.service
+        self.identity_sdk_client.create_endpoint.return_value = self.endpoint
+        self.identity_sdk_client.find_service.return_value = self.service
+        self.identity_sdk_client.get_region.return_value = self.region
 
         # Get the command object to test
         self.cmd = endpoint.CreateEndpoint(self.app, None)
@@ -79,6 +90,9 @@ class TestEndpointCreate(TestEndpoint):
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
+        # Fake endpoints come with a region ID by default, so set it to None
+        setattr(self.endpoint, "region_id", None)
+
         # In base command class ShowOne in cliff, abstract method take_action()
         # returns a two-part tuple with a tuple of column names and a tuple of
         # data to be shown.
@@ -86,25 +100,25 @@ class TestEndpointCreate(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'service': self.service.id,
+            'service_id': self.service.id,
             'url': self.endpoint.url,
             'interface': self.endpoint.interface,
-            'enabled': True,
-            'region': None,
+            'is_enabled': True,
         }
 
-        self.endpoints_mock.create.assert_called_with(**kwargs)
+        self.identity_sdk_client.create_endpoint.assert_called_with(**kwargs)
 
         self.assertEqual(self.columns, columns)
         datalist = (
             True,
             self.endpoint.id,
             self.endpoint.interface,
-            self.endpoint.region,
+            None,
+            None,
             self.service.id,
+            self.endpoint.url,
             self.service.name,
             self.service.type,
-            self.endpoint.url,
         )
         self.assertEqual(datalist, data)
 
@@ -114,14 +128,14 @@ class TestEndpointCreate(TestEndpoint):
             self.endpoint.interface,
             self.endpoint.url,
             '--region',
-            self.endpoint.region,
+            self.region.id,
         ]
         verifylist = [
             ('enabled', True),
             ('service', self.service.id),
             ('interface', self.endpoint.interface),
             ('url', self.endpoint.url),
-            ('region', self.endpoint.region),
+            ('region', self.region.id),
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
@@ -132,25 +146,26 @@ class TestEndpointCreate(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'service': self.service.id,
+            'service_id': self.service.id,
             'url': self.endpoint.url,
             'interface': self.endpoint.interface,
-            'enabled': True,
-            'region': self.endpoint.region,
+            'is_enabled': True,
+            'region_id': self.region.id,
         }
 
-        self.endpoints_mock.create.assert_called_with(**kwargs)
+        self.identity_sdk_client.create_endpoint.assert_called_with(**kwargs)
 
         self.assertEqual(self.columns, columns)
         datalist = (
             True,
             self.endpoint.id,
             self.endpoint.interface,
-            self.endpoint.region,
+            self.region.id,
+            self.region.id,
             self.service.id,
+            self.endpoint.url,
             self.service.name,
             self.service.type,
-            self.endpoint.url,
         )
         self.assertEqual(datalist, data)
 
@@ -169,6 +184,9 @@ class TestEndpointCreate(TestEndpoint):
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
+        # Fake endpoints come with a region ID by default, so set it to None
+        setattr(self.endpoint, "region_id", None)
+
         # In base command class ShowOne in cliff, abstract method take_action()
         # returns a two-part tuple with a tuple of column names and a tuple of
         # data to be shown.
@@ -176,25 +194,25 @@ class TestEndpointCreate(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'service': self.service.id,
+            'service_id': self.service.id,
             'url': self.endpoint.url,
             'interface': self.endpoint.interface,
-            'enabled': True,
-            'region': None,
+            'is_enabled': True,
         }
 
-        self.endpoints_mock.create.assert_called_with(**kwargs)
+        self.identity_sdk_client.create_endpoint.assert_called_with(**kwargs)
 
         self.assertEqual(self.columns, columns)
         datalist = (
             True,
             self.endpoint.id,
             self.endpoint.interface,
-            self.endpoint.region,
+            None,
+            None,
             self.service.id,
+            self.endpoint.url,
             self.service.name,
             self.service.type,
-            self.endpoint.url,
         )
         self.assertEqual(datalist, data)
 
@@ -213,6 +231,10 @@ class TestEndpointCreate(TestEndpoint):
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
+        # Fake endpoints come with a region ID by default, so set it to None
+        setattr(self.endpoint, "region_id", None)
+        setattr(self.endpoint, "is_enabled", False)
+
         # In base command class ShowOne in cliff, abstract method take_action()
         # returns a two-part tuple with a tuple of column names and a tuple of
         # data to be shown.
@@ -220,38 +242,37 @@ class TestEndpointCreate(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'service': self.service.id,
+            'service_id': self.service.id,
             'url': self.endpoint.url,
             'interface': self.endpoint.interface,
-            'enabled': False,
-            'region': None,
+            'is_enabled': False,
         }
 
-        self.endpoints_mock.create.assert_called_with(**kwargs)
+        self.identity_sdk_client.create_endpoint.assert_called_with(**kwargs)
 
         self.assertEqual(self.columns, columns)
         datalist = (
-            True,
+            False,
             self.endpoint.id,
             self.endpoint.interface,
-            self.endpoint.region,
+            None,
+            None,
             self.service.id,
+            self.endpoint.url,
             self.service.name,
             self.service.type,
-            self.endpoint.url,
         )
         self.assertEqual(datalist, data)
 
 
-class TestEndpointDelete(TestEndpoint):
-    endpoint = identity_fakes.FakeEndpoint.create_one_endpoint()
-
+class TestEndpointDelete(identity_fakes.TestIdentityv3):
     def setUp(self):
         super().setUp()
 
-        # This is the return value for utils.find_resource(endpoint)
-        self.endpoints_mock.get.return_value = self.endpoint
-        self.endpoints_mock.delete.return_value = None
+        self.endpoint = sdk_fakes.generate_fake_resource(_endpoint.Endpoint)
+
+        self.identity_sdk_client.find_endpoint.return_value = self.endpoint
+        self.identity_sdk_client.delete_endpoint.return_value = None
 
         # Get the command object to test
         self.cmd = endpoint.DeleteEndpoint(self.app, None)
@@ -267,18 +288,13 @@ class TestEndpointDelete(TestEndpoint):
 
         result = self.cmd.take_action(parsed_args)
 
-        self.endpoints_mock.delete.assert_called_with(
+        self.identity_sdk_client.delete_endpoint.assert_called_with(
             self.endpoint.id,
         )
         self.assertIsNone(result)
 
 
-class TestEndpointList(TestEndpoint):
-    service = identity_fakes.FakeService.create_one_service()
-    endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
-        attrs={'service_id': service.id}
-    )
-
+class TestEndpointList(identity_fakes.TestIdentityv3):
     columns = (
         'ID',
         'Region',
@@ -292,11 +308,19 @@ class TestEndpointList(TestEndpoint):
     def setUp(self):
         super().setUp()
 
-        self.endpoints_mock.list.return_value = [self.endpoint]
+        self.service = sdk_fakes.generate_fake_resource(_service.Service)
+        self.region = sdk_fakes.generate_fake_resource(_region.Region)
+        self.endpoint = sdk_fakes.generate_fake_resource(
+            resource_type=_endpoint.Endpoint,
+            service_id=self.service.id,
+            interface='admin',
+            region_id=self.region.id,
+        )
 
-        # This is the return value for common.find_resource(service)
-        self.services_mock.get.return_value = self.service
-        self.services_mock.list.return_value = [self.service]
+        self.identity_sdk_client.endpoints.return_value = [self.endpoint]
+        self.identity_sdk_client.find_service.return_value = self.service
+        self.identity_sdk_client.services.return_value = [self.service]
+        self.identity_sdk_client.get_region.return_value = self.region
 
         # Get the command object to test
         self.cmd = endpoint.ListEndpoint(self.app, None)
@@ -310,13 +334,13 @@ class TestEndpointList(TestEndpoint):
         # returns a tuple containing the column names and an iterable
         # containing the data to be listed.
         columns, data = self.cmd.take_action(parsed_args)
-        self.endpoints_mock.list.assert_called_with()
+        self.identity_sdk_client.endpoints.assert_called_with()
 
         self.assertEqual(self.columns, columns)
         datalist = (
             (
                 self.endpoint.id,
-                self.endpoint.region,
+                self.region.id,
                 self.service.name,
                 self.service.type,
                 True,
@@ -343,15 +367,15 @@ class TestEndpointList(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'service': self.service.id,
+            'service_id': self.service.id,
         }
-        self.endpoints_mock.list.assert_called_with(**kwargs)
+        self.identity_sdk_client.endpoints.assert_called_with(**kwargs)
 
         self.assertEqual(self.columns, columns)
         datalist = (
             (
                 self.endpoint.id,
-                self.endpoint.region,
+                self.region.id,
                 self.service.name,
                 self.service.type,
                 True,
@@ -380,13 +404,13 @@ class TestEndpointList(TestEndpoint):
         kwargs = {
             'interface': self.endpoint.interface,
         }
-        self.endpoints_mock.list.assert_called_with(**kwargs)
+        self.identity_sdk_client.endpoints.assert_called_with(**kwargs)
 
         self.assertEqual(self.columns, columns)
         datalist = (
             (
                 self.endpoint.id,
-                self.endpoint.region,
+                self.region.id,
                 self.service.name,
                 self.service.type,
                 True,
@@ -399,10 +423,10 @@ class TestEndpointList(TestEndpoint):
     def test_endpoint_list_region(self):
         arglist = [
             '--region',
-            self.endpoint.region,
+            self.region.id,
         ]
         verifylist = [
-            ('region', self.endpoint.region),
+            ('region', self.region.id),
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
@@ -413,15 +437,15 @@ class TestEndpointList(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'region': self.endpoint.region,
+            'region_id': self.region.id,
         }
-        self.endpoints_mock.list.assert_called_with(**kwargs)
+        self.identity_sdk_client.endpoints.assert_called_with(**kwargs)
 
         self.assertEqual(self.columns, columns)
         datalist = (
             (
                 self.endpoint.id,
-                self.endpoint.region,
+                self.region.id,
                 self.service.name,
                 self.service.type,
                 True,
@@ -432,13 +456,13 @@ class TestEndpointList(TestEndpoint):
         self.assertEqual(datalist, tuple(data))
 
     def test_endpoint_list_project_with_project_domain(self):
-        project = identity_fakes.FakeProject.create_one_project()
-        domain = identity_fakes.FakeDomain.create_one_domain()
+        project = sdk_fakes.generate_fake_resource(_project.Project)
+        domain = sdk_fakes.generate_fake_resource(_domain.Domain)
 
-        self.ep_filter_mock.list_endpoints_for_project.return_value = [
+        self.identity_sdk_client.project_endpoints.return_value = [
             self.endpoint
         ]
-        self.projects_mock.get.return_value = project
+        self.identity_sdk_client.find_project.return_value = project
 
         arglist = ['--project', project.name, '--project-domain', domain.name]
         verifylist = [
@@ -451,7 +475,7 @@ class TestEndpointList(TestEndpoint):
         # returns a tuple containing the column names and an iterable
         # containing the data to be listed.
         columns, data = self.cmd.take_action(parsed_args)
-        self.ep_filter_mock.list_endpoints_for_project.assert_called_with(
+        self.identity_sdk_client.project_endpoints.assert_called_with(
             project=project.id
         )
 
@@ -459,7 +483,7 @@ class TestEndpointList(TestEndpoint):
         datalist = (
             (
                 self.endpoint.id,
-                self.endpoint.region,
+                self.region.id,
                 self.service.name,
                 self.service.type,
                 True,
@@ -470,22 +494,20 @@ class TestEndpointList(TestEndpoint):
         self.assertEqual(datalist, tuple(data))
 
 
-class TestEndpointSet(TestEndpoint):
-    service = identity_fakes.FakeService.create_one_service()
-    endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
-        attrs={'service_id': service.id}
-    )
-
+class TestEndpointSet(identity_fakes.TestIdentityv3):
     def setUp(self):
         super().setUp()
 
-        # This is the return value for utils.find_resource(endpoint)
-        self.endpoints_mock.get.return_value = self.endpoint
+        self.service = sdk_fakes.generate_fake_resource(_service.Service)
+        self.endpoint = sdk_fakes.generate_fake_resource(
+            resource_type=_endpoint.Endpoint,
+            service_id=self.service.id,
+            interface='admin',
+        )
 
-        self.endpoints_mock.update.return_value = self.endpoint
-
-        # This is the return value for common.find_resource(service)
-        self.services_mock.get.return_value = self.service
+        self.identity_sdk_client.find_endpoint.return_value = self.endpoint
+        self.identity_sdk_client.update_endpoint.return_value = self.endpoint
+        self.identity_sdk_client.find_service.return_value = self.service
 
         # Get the command object to test
         self.cmd = endpoint.SetEndpoint(self.app, None)
@@ -501,15 +523,8 @@ class TestEndpointSet(TestEndpoint):
 
         result = self.cmd.take_action(parsed_args)
 
-        kwargs = {
-            'enabled': None,
-            'interface': None,
-            'region': None,
-            'service': None,
-            'url': None,
-        }
-        self.endpoints_mock.update.assert_called_with(
-            self.endpoint.id, **kwargs
+        self.identity_sdk_client.update_endpoint.assert_called_with(
+            self.endpoint.id
         )
         self.assertIsNone(result)
 
@@ -525,13 +540,9 @@ class TestEndpointSet(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'enabled': None,
             'interface': 'public',
-            'url': None,
-            'region': None,
-            'service': None,
         }
-        self.endpoints_mock.update.assert_called_with(
+        self.identity_sdk_client.update_endpoint.assert_called_with(
             self.endpoint.id, **kwargs
         )
         self.assertIsNone(result)
@@ -548,13 +559,9 @@ class TestEndpointSet(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'enabled': None,
-            'interface': None,
             'url': 'http://localhost:5000',
-            'region': None,
-            'service': None,
         }
-        self.endpoints_mock.update.assert_called_with(
+        self.identity_sdk_client.update_endpoint.assert_called_with(
             self.endpoint.id, **kwargs
         )
         self.assertIsNone(result)
@@ -571,13 +578,9 @@ class TestEndpointSet(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'enabled': None,
-            'interface': None,
-            'url': None,
-            'region': None,
-            'service': self.service.id,
+            'service_id': self.service.id,
         }
-        self.endpoints_mock.update.assert_called_with(
+        self.identity_sdk_client.update_endpoint.assert_called_with(
             self.endpoint.id, **kwargs
         )
         self.assertIsNone(result)
@@ -594,13 +597,9 @@ class TestEndpointSet(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'enabled': None,
-            'interface': None,
-            'url': None,
-            'region': 'e-rzzz',
-            'service': None,
+            'region_id': 'e-rzzz',
         }
-        self.endpoints_mock.update.assert_called_with(
+        self.identity_sdk_client.update_endpoint.assert_called_with(
             self.endpoint.id, **kwargs
         )
         self.assertIsNone(result)
@@ -617,13 +616,9 @@ class TestEndpointSet(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'enabled': True,
-            'interface': None,
-            'url': None,
-            'region': None,
-            'service': None,
+            'is_enabled': True,
         }
-        self.endpoints_mock.update.assert_called_with(
+        self.identity_sdk_client.update_endpoint.assert_called_with(
             self.endpoint.id, **kwargs
         )
         self.assertIsNone(result)
@@ -640,31 +635,31 @@ class TestEndpointSet(TestEndpoint):
 
         # Set expected values
         kwargs = {
-            'enabled': False,
-            'interface': None,
-            'url': None,
-            'region': None,
-            'service': None,
+            'is_enabled': False,
         }
-        self.endpoints_mock.update.assert_called_with(
+        self.identity_sdk_client.update_endpoint.assert_called_with(
             self.endpoint.id, **kwargs
         )
         self.assertIsNone(result)
 
 
-class TestEndpointShow(TestEndpoint):
-    service = identity_fakes.FakeService.create_one_service()
-    endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
-        attrs={'service_id': service.id}
-    )
-
+class TestEndpointShow(identity_fakes.TestIdentityv3):
     def setUp(self):
         super().setUp()
 
-        self.endpoints_mock.get.return_value = self.endpoint
+        self.service = sdk_fakes.generate_fake_resource(_service.Service)
+        self.region = sdk_fakes.generate_fake_resource(_region.Region)
+        self.endpoint = sdk_fakes.generate_fake_resource(
+            resource_type=_endpoint.Endpoint,
+            service_id=self.service.id,
+            interface='admin',
+            region_id=self.region.id,
+        )
 
-        # This is the return value for common.find_resource(service)
-        self.services_mock.get.return_value = self.service
+        self.identity_sdk_client.find_endpoint.return_value = self.endpoint
+
+        self.identity_sdk_client.find_service.return_value = self.service
+        self.identity_sdk_client.get_region.return_value = self.region
 
         # Get the command object to test
         self.cmd = endpoint.ShowEndpoint(self.app, None)
@@ -682,7 +677,7 @@ class TestEndpointShow(TestEndpoint):
         # returns a two-part tuple with a tuple of column names and a tuple of
         # data to be shown.
         columns, data = self.cmd.take_action(parsed_args)
-        self.endpoints_mock.get.assert_called_with(
+        self.identity_sdk_client.find_endpoint.assert_called_with(
             self.endpoint.id,
         )
 
@@ -691,82 +686,82 @@ class TestEndpointShow(TestEndpoint):
             'id',
             'interface',
             'region',
+            'region_id',
             'service_id',
+            'url',
             'service_name',
             'service_type',
-            'url',
         )
         self.assertEqual(collist, columns)
         datalist = (
             True,
             self.endpoint.id,
             self.endpoint.interface,
-            self.endpoint.region,
+            self.region.id,
+            self.region.id,
             self.service.id,
+            self.endpoint.url,
             self.service.name,
             self.service.type,
-            self.endpoint.url,
         )
         self.assertEqual(datalist, data)
 
 
 class TestEndpointCreateServiceWithoutName(TestEndpointCreate):
-    service = identity_fakes.FakeService.create_one_service(
-        attrs={'service_name': ''}
+    service = sdk_fakes.generate_fake_resource(
+        resource_type=_service.Service,
+        name='',
+    )
+    region = sdk_fakes.generate_fake_resource(_region.Region)
+    endpoint = sdk_fakes.generate_fake_resource(
+        resource_type=_endpoint.Endpoint,
+        service_id=service.id,
+        interface='admin',
+        region_id=region.id,
     )
 
     def setUp(self):
-        super(TestEndpointCreate, self).setUp()
-
-        self.endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
-            attrs={'service_id': self.service.id}
-        )
-
-        self.endpoints_mock.create.return_value = self.endpoint
-
-        # This is the return value for common.find_resource(service)
-        self.services_mock.get.return_value = self.service
+        super().setUp()
 
         # Get the command object to test
         self.cmd = endpoint.CreateEndpoint(self.app, None)
 
 
 class TestEndpointListServiceWithoutName(TestEndpointList):
-    service = identity_fakes.FakeService.create_one_service(
-        attrs={'service_name': ''}
+    service = sdk_fakes.generate_fake_resource(
+        resource_type=_service.Service,
+        name='',
     )
-    endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
-        attrs={'service_id': service.id}
+    region = sdk_fakes.generate_fake_resource(_region.Region)
+    endpoint = sdk_fakes.generate_fake_resource(
+        resource_type=_endpoint.Endpoint,
+        service_id=service.id,
+        interface='admin',
+        region_id=region.id,
     )
 
     def setUp(self):
-        super(TestEndpointList, self).setUp()
-
-        self.endpoints_mock.list.return_value = [self.endpoint]
-
-        # This is the return value for common.find_resource(service)
-        self.services_mock.get.return_value = self.service
-        self.services_mock.list.return_value = [self.service]
+        super().setUp()
 
         # Get the command object to test
         self.cmd = endpoint.ListEndpoint(self.app, None)
 
 
 class TestEndpointShowServiceWithoutName(TestEndpointShow):
-    service = identity_fakes.FakeService.create_one_service(
-        attrs={'service_name': ''}
+    service = sdk_fakes.generate_fake_resource(
+        resource_type=_service.Service,
+        name='',
     )
-    endpoint = identity_fakes.FakeEndpoint.create_one_endpoint(
-        attrs={'service_id': service.id}
+    region = sdk_fakes.generate_fake_resource(_region.Region)
+    endpoint = sdk_fakes.generate_fake_resource(
+        resource_type=_endpoint.Endpoint,
+        service_id=service.id,
+        interface='admin',
+        region_id=region.id,
     )
 
     def setUp(self):
-        super(TestEndpointShow, self).setUp()
-
-        self.endpoints_mock.get.return_value = self.endpoint
-
-        # This is the return value for common.find_resource(service)
-        self.services_mock.get.return_value = self.service
+        super().setUp()
 
         # Get the command object to test
         self.cmd = endpoint.ShowEndpoint(self.app, None)
diff --git a/releasenotes/notes/migrate-endpoint-to-sdk-8ca5a34794b6bd7e.yaml b/releasenotes/notes/migrate-endpoint-to-sdk-8ca5a34794b6bd7e.yaml
new file mode 100644
index 0000000000..ab715d1643
--- /dev/null
+++ b/releasenotes/notes/migrate-endpoint-to-sdk-8ca5a34794b6bd7e.yaml
@@ -0,0 +1,10 @@
+---
+upgrade:
+  - |
+    The following commands have been migrated to SDK:
+
+    - ``endpoint create``
+    - ``endpoint delete``
+    - ``endpoint list``
+    - ``endpoint show``
+    - ``endpoint set``