From aeeed4d3712bd6c6a00e7efe832b9490adbf202f Mon Sep 17 00:00:00 2001 From: Jeff Bradberry Date: Fri, 8 May 2020 13:17:19 -0400 Subject: [PATCH] Add more logging --- awxkit/awxkit/api/pages/api.py | 17 +++++++++++------ awxkit/awxkit/api/pages/page.py | 14 +++++--------- awxkit/awxkit/api/pages/roles.py | 7 +++++++ awxkit/awxkit/api/utils.py | 5 +++++ 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/awxkit/awxkit/api/pages/api.py b/awxkit/awxkit/api/pages/api.py index f18a5cce1c..7615113f83 100644 --- a/awxkit/awxkit/api/pages/api.py +++ b/awxkit/awxkit/api/pages/api.py @@ -60,6 +60,7 @@ class ApiV2(base.Base): def _export(self, _page, post_fields): # Drop any (credential_type) assets that are being managed by the Tower instance. if _page.json.get('managed_by_tower'): + log.debug("%s is managed by Tower, skipping.", _page.endpoint) return None if post_fields is None: # Deprecated endpoint or insufficient permissions log.error("Object export failed: %s", _page.endpoint) @@ -78,14 +79,16 @@ class ApiV2(base.Base): rel_endpoint = self._cache.get_page(_page.related[key]) if rel_endpoint is None: # This foreign key is unreadable if post_fields[key].get('required'): - log.error("Foreign key export failed: %s", _page.related[key]) + log.error("Foreign key %r export failed for object %s.", key, _page.endpoint) return None - log.error("Foreign key export failed, setting to null: %s", _page.related[key]) + log.warning("Foreign key %r export failed for object %s, setting to null", key, _page.endpoint) continue - natural_key = rel_endpoint.get_natural_key(self._cache) - if natural_key is None: + rel_natural_key = rel_endpoint.get_natural_key(self._cache) + if rel_natural_key is None: + log.error("Unable to construct a natural key for foreign key %r of object %s.", + key, _page.endpoint) return None # This foreign key has unresolvable dependencies - fields[key] = natural_key + fields[key] = rel_natural_key related = {} for key, rel_endpoint in _page.related.items(): @@ -99,7 +102,8 @@ class ApiV2(base.Base): continue rel_post_fields = utils.get_post_fields(rel_endpoint, self._cache) - if rel_post_fields is None: # This is a read-only endpoint. + if rel_post_fields is None: + log.debug("%s is a read-only endpoint.", rel_endpoint) continue is_attach = 'id' in rel_post_fields # This is not a create-only endpoint. @@ -128,6 +132,7 @@ class ApiV2(base.Base): natural_key = _page.get_natural_key(self._cache) if natural_key is None: + log.error("Unable to construct a natural key for object %s.", _page.endpoint) return None fields['natural_key'] = natural_key diff --git a/awxkit/awxkit/api/pages/page.py b/awxkit/awxkit/api/pages/page.py index 65a6290bb6..3ee1c38490 100644 --- a/awxkit/awxkit/api/pages/page.py +++ b/awxkit/awxkit/api/pages/page.py @@ -319,27 +319,23 @@ class Page(object): return page_cls(self.connection, endpoint=endpoint).get(**kw) def get_natural_key(self, cache=None): - warn = "This object does not have a natural key: %s" - if cache is None: cache = PageCache() if not getattr(self, 'NATURAL_KEY', None): - log.warning(warn, getattr(self, 'endpoint', '')) + log.warning("This object does not have a natural key: %s", getattr(self, 'endpoint', '')) return None natural_key = {} for key in self.NATURAL_KEY: if key in self.related: related_endpoint = cache.get_page(self.related[key]) - if related_endpoint is None: - return None - natural_key[key] = related_endpoint.get_natural_key(cache=cache) + if related_endpoint is not None: + natural_key[key] = related_endpoint.get_natural_key(cache=cache) + else: + natural_key[key] = None elif key in self: natural_key[key] = self[key] - if not natural_key: - log.warning(warn, getattr(self, 'endpoint', '')) - return None natural_key['type'] = self['type'] return natural_key diff --git a/awxkit/awxkit/api/pages/roles.py b/awxkit/awxkit/api/pages/roles.py index 104af818b1..2b317dece1 100644 --- a/awxkit/awxkit/api/pages/roles.py +++ b/awxkit/awxkit/api/pages/roles.py @@ -1,9 +1,14 @@ +import logging + from awxkit.api.resources import resources from . import base from . import page +log = logging.getLogger(__name__) + + class Role(base.Base): NATURAL_KEY = ('name',) @@ -20,6 +25,8 @@ class Role(base.Base): if related_objs: related_endpoint = cache.get_page(related_objs[0]) if related_endpoint is None: + log.error("Unable to obtain content_object %s for role %s", + related_objs[0], self.endpoint) return None natural_key['content_object'] = related_endpoint.get_natural_key(cache=cache) diff --git a/awxkit/awxkit/api/utils.py b/awxkit/awxkit/api/utils.py index 355cdb0158..a3e6739b26 100644 --- a/awxkit/awxkit/api/utils.py +++ b/awxkit/awxkit/api/utils.py @@ -1,6 +1,9 @@ +import logging import re +log = logging.getLogger(__name__) + descRE = re.compile(r'^[*] `(\w+)`: [^(]*\((\w+), ([^)]+)\)') @@ -42,4 +45,6 @@ def get_post_fields(page, cache): 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'])