100 lines
4.2 KiB
Diff
100 lines
4.2 KiB
Diff
From f6f5ce03c5b8a03180db24a02dda5b30f40b4cee Mon Sep 17 00:00:00 2001
|
|
From: Anton Frolov <af9740@att.com>
|
|
Date: Mon, 25 Sep 2017 12:31:24 -0700
|
|
Subject: [PATCH] Optimize getting endpoint list
|
|
|
|
Currently ListEndpoint.take_action method unconditionally iterates
|
|
over all endpoints and issue GET /v3/services/<ep.service_id>
|
|
request for each endpoint. In case of HTTPS keystone endpoint this
|
|
can take significant amout of time, and it only getting worse in
|
|
case of multiple regions.
|
|
|
|
This commit change this logic to making just two GET requests: first
|
|
it gets endpoint list, then it gets service list, searching service
|
|
in the list instead of issuing GET /v3/services/<id> request.
|
|
|
|
Change-Id: I22b61c0b45b0205a2f5a4608c2473cb7814fe3cf
|
|
Closes-Bug: 1719413
|
|
---
|
|
openstackclient/identity/common.py | 10 ++++++++++
|
|
openstackclient/identity/v3/endpoint.py | 3 ++-
|
|
openstackclient/tests/unit/identity/v3/test_endpoint.py | 2 ++
|
|
releasenotes/notes/bug-1719413-0401d05c91cc9094.yaml | 8 ++++++++
|
|
4 files changed, 22 insertions(+), 1 deletion(-)
|
|
create mode 100644 releasenotes/notes/bug-1719413-0401d05c91cc9094.yaml
|
|
|
|
diff --git a/openstackclient/identity/common.py b/openstackclient/identity/common.py
|
|
index 3dc5adb..e119f66 100644
|
|
--- a/openstackclient/identity/common.py
|
|
+++ b/openstackclient/identity/common.py
|
|
@@ -26,6 +26,16 @@ from osc_lib import utils
|
|
from openstackclient.i18n import _
|
|
|
|
|
|
+def find_service_in_list(service_list, service_id):
|
|
+ """Find a service by id in service list."""
|
|
+
|
|
+ for service in service_list:
|
|
+ if service.id == service_id:
|
|
+ return service
|
|
+ raise exceptions.CommandError(
|
|
+ "No service with a type, name or ID of '%s' exists." % service_id)
|
|
+
|
|
+
|
|
def find_service(identity_client, name_type_or_id):
|
|
"""Find a service by id, name or type."""
|
|
|
|
diff --git a/openstackclient/identity/v3/endpoint.py b/openstackclient/identity/v3/endpoint.py
|
|
index 15760a1..3b4dd0d 100644
|
|
--- a/openstackclient/identity/v3/endpoint.py
|
|
+++ b/openstackclient/identity/v3/endpoint.py
|
|
@@ -167,9 +167,10 @@ class ListEndpoint(command.Lister):
|
|
if parsed_args.region:
|
|
kwargs['region'] = parsed_args.region
|
|
data = identity_client.endpoints.list(**kwargs)
|
|
+ service_list = identity_client.services.list()
|
|
|
|
for ep in data:
|
|
- service = common.find_service(identity_client, ep.service_id)
|
|
+ service = common.find_service_in_list(service_list, ep.service_id)
|
|
ep.service_name = get_service_name(service)
|
|
ep.service_type = service.type
|
|
return (columns,
|
|
diff --git a/openstackclient/tests/unit/identity/v3/test_endpoint.py b/openstackclient/tests/unit/identity/v3/test_endpoint.py
|
|
index 765fbed..fad53fc 100644
|
|
--- a/openstackclient/tests/unit/identity/v3/test_endpoint.py
|
|
+++ b/openstackclient/tests/unit/identity/v3/test_endpoint.py
|
|
@@ -295,6 +295,7 @@ class TestEndpointList(TestEndpoint):
|
|
|
|
# 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]
|
|
|
|
# Get the command object to test
|
|
self.cmd = endpoint.ListEndpoint(self.app, None)
|
|
@@ -726,6 +727,7 @@ class TestEndpointListServiceWithoutName(TestEndpointList):
|
|
|
|
# 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]
|
|
|
|
# Get the command object to test
|
|
self.cmd = endpoint.ListEndpoint(self.app, None)
|
|
diff --git a/releasenotes/notes/bug-1719413-0401d05c91cc9094.yaml b/releasenotes/notes/bug-1719413-0401d05c91cc9094.yaml
|
|
new file mode 100644
|
|
index 0000000..784d19e
|
|
--- /dev/null
|
|
+++ b/releasenotes/notes/bug-1719413-0401d05c91cc9094.yaml
|
|
@@ -0,0 +1,8 @@
|
|
+---
|
|
+fixes:
|
|
+ - |
|
|
+ Fix an issue with ``endpoint list`` working slow because it is issuing one GET
|
|
+ request to /v3/services/<id> Keystone API for each endpoint. In case of HTTPS
|
|
+ keystone endpoint and multiple regions it can take significant amount of time.
|
|
+ [Bug `1719413 <https://bugs.launchpad.net/python-openstackclient/+bug/1719413>`_]
|
|
+
|
|
--
|
|
1.8.3.1
|
|
|