From 18e46370422ab0a9698df856356cec0221a53e0e Mon Sep 17 00:00:00 2001 From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 19:26:01 +0100 Subject: [PATCH] [PR #9760/d696bb7b backport][stable-9] proxmox inventory: proposal for #9710 (caching) (#9769) proxmox inventory: proposal for #9710 (caching) (#9760) * Proposal for #9710 * Fixed comments * Fixed trailing whitespace * Fixed changelog fragment (cherry picked from commit d696bb7b8992bfc6535c5e51dd37a00b9b4e22df) Co-authored-by: Dirk S. --- .../fragments/9760-proxmox-inventory.yml | 2 ++ plugins/inventory/proxmox.py | 22 +++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 changelogs/fragments/9760-proxmox-inventory.yml diff --git a/changelogs/fragments/9760-proxmox-inventory.yml b/changelogs/fragments/9760-proxmox-inventory.yml new file mode 100644 index 0000000000..c0405eee32 --- /dev/null +++ b/changelogs/fragments/9760-proxmox-inventory.yml @@ -0,0 +1,2 @@ +bugfixes: + - "proxmox inventory plugin - plugin did not update cache correctly after ``meta: refresh_inventory`` (https://github.com/ansible-collections/community.general/issues/9710, https://github.com/ansible-collections/community.general/pull/9760)." diff --git a/plugins/inventory/proxmox.py b/plugins/inventory/proxmox.py index 3ce4f789a3..f20c82e81f 100644 --- a/plugins/inventory/proxmox.py +++ b/plugins/inventory/proxmox.py @@ -304,12 +304,17 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): def _get_json(self, url, ignore_errors=None): - if not self.use_cache or url not in self._cache.get(self.cache_key, {}): + data = [] + has_data = False - if self.cache_key not in self._cache: - self._cache[self.cache_key] = {'url': ''} + if self.use_cache: + try: + data = self._cache[self.cache_key][url] + has_data = True + except KeyError: + self.update_cache = True - data = [] + if not has_data: s = self._get_session() while True: ret = s.get(url, headers=self.headers) @@ -335,9 +340,8 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): data = data + json['data'] break - self._cache[self.cache_key][url] = data - - return make_unsafe(self._cache[self.cache_key][url]) + self._results[url] = data + return make_unsafe(data) def _get_nodes(self): return self._get_json("%s/api2/json/nodes" % self.proxmox_url) @@ -678,10 +682,14 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): self.exclude_nodes = self.get_option('exclude_nodes') self.cache_key = self.get_cache_key(path) self.use_cache = cache and self.get_option('cache') + self.update_cache = not cache and self.get_option('cache') self.host_filters = self.get_option('filters') self.group_prefix = self.get_option('group_prefix') self.facts_prefix = self.get_option('facts_prefix') self.strict = self.get_option('strict') # actually populate inventory + self._results = {} self._populate() + if self.update_cache: + self._cache[self.cache_key] = self._results