Improve performance for awx cli export (#13182)

Co-authored-by: Jesse Wattenbarger <jwattenb@redhat.com>
This commit is contained in:
Artsiom Musin 2023-06-21 16:49:22 +02:00 committed by GitHub
parent 900c4fd8f1
commit 4bae961b5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 18 deletions

View File

@ -162,7 +162,7 @@ class ApiV2(base.Base):
export_key = 'create_approval_template'
rel_option_endpoint = _page.related.get('create_approval_template')
rel_post_fields = utils.get_post_fields(rel_option_endpoint, self._cache)
rel_post_fields = self._cache.get_post_fields(rel_option_endpoint)
if rel_post_fields is None:
log.debug("%s is a read-only endpoint.", rel_endpoint)
continue
@ -202,7 +202,7 @@ class ApiV2(base.Base):
return utils.remove_encrypted(fields)
def _export_list(self, endpoint):
post_fields = utils.get_post_fields(endpoint, self._cache)
post_fields = self._cache.get_post_fields(endpoint)
if post_fields is None:
return None
@ -267,7 +267,7 @@ class ApiV2(base.Base):
def _import_list(self, endpoint, assets):
log.debug("_import_list -- endpoint: %s, assets: %s", endpoint.endpoint, repr(assets))
post_fields = utils.get_post_fields(endpoint, self._cache)
post_fields = self._cache.get_post_fields(endpoint)
changed = False

View File

@ -495,6 +495,7 @@ class TentativePage(str):
class PageCache(object):
def __init__(self):
self.options = {}
self.post_fields = {}
self.pages_by_url = {}
self.pages_by_natural_key = {}
@ -516,6 +517,26 @@ class PageCache(object):
return self.options.setdefault(url, options)
def get_post_fields(self, page):
url = page.endpoint if isinstance(page, Page) else str(page)
key = get_registered_page(url)
if key in self.post_fields:
return self.post_fields[key]
options_page = self.get_options(page)
if 'POST' not in options_page.r.headers.get('Allow', ''):
return None
if 'POST' in options_page.json['actions']:
post_fields = options_page.json['actions']['POST']
else:
log.warning("Insufficient privileges on %s, inferring POST fields from description.", options_page.endpoint)
post_fields = utils.parse_description(options_page.json['description'])
self.post_fields[key] = post_fields
return post_fields
def set_page(self, page):
log.debug("set_page: %s %s", type(page), page.endpoint)
self.pages_by_url[page.endpoint] = page

View File

@ -31,18 +31,3 @@ def remove_encrypted(value):
if isinstance(value, dict):
return {k: remove_encrypted(v) for k, v in value.items()}
return value
def get_post_fields(page, cache):
options_page = cache.get_options(page)
if options_page is None:
return None
if 'POST' not in options_page.r.headers.get('Allow', ''):
return None
if 'POST' in options_page.json['actions']:
return options_page.json['actions']['POST']
else:
log.warning("Insufficient privileges on %s, inferring POST fields from description.", options_page.endpoint)
return parse_description(options_page.json['description'])