From 4375c9943265f472f6ac5d2d9a9c6a18ca030ae2 Mon Sep 17 00:00:00 2001 From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com> Date: Thu, 4 Mar 2021 08:32:42 +0100 Subject: [PATCH] Bugfix/manageiq inventory (#720) (#1962) * Extending modules with resource_id * Added documentation * Revert previous PR * Added filter for active vm's * Added changelog fragment * Update changelogs/fragments/720-cloudforms_inventory.yml Co-authored-by: Felix Fontein (cherry picked from commit ac95ff5b455ceb624abdd88f9065b98b469d901a) Co-authored-by: phospi --- .../fragments/720-cloudforms_inventory.yml | 2 + scripts/inventory/cloudforms.py | 49 +++++++++++++++---- 2 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 changelogs/fragments/720-cloudforms_inventory.yml diff --git a/changelogs/fragments/720-cloudforms_inventory.yml b/changelogs/fragments/720-cloudforms_inventory.yml new file mode 100644 index 0000000000..f5675205d1 --- /dev/null +++ b/changelogs/fragments/720-cloudforms_inventory.yml @@ -0,0 +1,2 @@ +bugfixes: + - cloudforms inventory - fixed issue that non-existing (archived) VMs were synced (https://github.com/ansible-collections/community.general/pull/720). diff --git a/scripts/inventory/cloudforms.py b/scripts/inventory/cloudforms.py index 72b4419cc8..3514698d59 100644 --- a/scripts/inventory/cloudforms.py +++ b/scripts/inventory/cloudforms.py @@ -216,9 +216,9 @@ class CloudFormsInventory(object): parser.add_argument('--debug', action='store_true', default=False, help='Show debug output while running (default: False)') self.args = parser.parse_args() - def _get_json(self, url): + def _http_request(self, url): """ - Make a request and return the JSON + Make a request and return the result converted from JSON """ results = [] @@ -231,7 +231,8 @@ class CloudFormsInventory(object): try: results = json.loads(ret.text) except ValueError: - warnings.warn("Unexpected response from {0} ({1}): {2}".format(self.cloudforms_url, ret.status_code, ret.reason)) + warnings.warn( + "Unexpected response from {0} ({1}): {2}".format(self.cloudforms_url, ret.status_code, ret.reason)) results = {} if self.args.debug: @@ -245,11 +246,18 @@ class CloudFormsInventory(object): return results - def _get_hosts(self): + def _get_json(self, endpoint, url_suffix): """ - Get all hosts by paging through the results + Make a request by given url, split request by configured limit, + go through all sub-requests and return the aggregated data received + by cloudforms + + :param endpoint: api endpoint to access + :param url_suffix: additional api parameters + """ - limit = self.cloudforms_limit + + limit = int(self.cloudforms_limit) page = 0 last_page = False @@ -258,14 +266,35 @@ class CloudFormsInventory(object): while not last_page: offset = page * limit - ret = self._get_json("%s/api/vms?offset=%s&limit=%s&expand=resources,tags,hosts,&attributes=ipaddresses" % (self.cloudforms_url, offset, limit)) - results += ret['resources'] - if ret['subcount'] < limit: + url = "%s%s?offset=%s&limit=%s%s" % ( + self.cloudforms_url, endpoint, offset, limit, url_suffix) + + if self.args.debug: + print("Connecting to url '%s'" % url) + + ret = self._http_request(url) + results += [ret] + + if 'subcount' in ret: + if ret['subcount'] < limit: + last_page = True + page += 1 + else: last_page = True - page += 1 return results + def _get_hosts(self): + """ + Get all hosts + """ + endpoint = "/api/vms" + url_suffix = "&expand=resources,tags,hosts,&attributes=active,ipaddresses&filter[]=active=true" + results = self._get_json(endpoint, url_suffix) + resources = [item for sublist in results for item in sublist['resources']] + + return resources + def update_cache(self): """ Make calls to cloudforms and save the output in a cache