diff --git a/changelogs/fragments/66792-vultr-improve-plan.yml b/changelogs/fragments/66792-vultr-improve-plan.yml new file mode 100644 index 00000000000..fe1144dfa33 --- /dev/null +++ b/changelogs/fragments/66792-vultr-improve-plan.yml @@ -0,0 +1,2 @@ +minor_changes: + - vultr_server_info, vultr_server - Improved handling of discontinued plans (https://github.com/ansible/ansible/issues/66707). diff --git a/lib/ansible/module_utils/vultr.py b/lib/ansible/module_utils/vultr.py index b047c939bad..86ebdb8c0c1 100644 --- a/lib/ansible/module_utils/vultr.py +++ b/lib/ansible/module_utils/vultr.py @@ -216,7 +216,7 @@ class Vultr: except ValueError as e: self.module.fail_json(msg="Could not process response into json: %s" % e) - def query_resource_by_key(self, key, value, resource='regions', query_by='list', params=None, use_cache=False, id_key=None): + def query_resource_by_key(self, key, value, resource='regions', query_by='list', params=None, use_cache=False, id_key=None, optional=False): if not value: return {} @@ -246,12 +246,13 @@ class Vultr: return r_data if id_key is not None and to_text(r_data[id_key]) == to_text(value): return r_data - - if id_key: - msg = "Could not find %s with ID or %s: %s" % (resource, key, value) - else: - msg = "Could not find %s with %s: %s" % (resource, key, value) - self.module.fail_json(msg=msg) + if not optional: + if id_key: + msg = "Could not find %s with ID or %s: %s" % (resource, key, value) + else: + msg = "Could not find %s with %s: %s" % (resource, key, value) + self.module.fail_json(msg=msg) + return {} @staticmethod def normalize_result(resource, schema, remove_missing_keys=True): @@ -288,14 +289,16 @@ class Vultr: return self.result - def get_plan(self, plan=None, key='name'): + def get_plan(self, plan=None, key='name', optional=False): value = plan or self.module.params.get('plan') return self.query_resource_by_key( key=key, value=value, resource='plans', - use_cache=True + use_cache=True, + id_key='VPSPLANID', + optional=optional, ) def get_firewallgroup(self, firewallgroup=None, key='description'): diff --git a/lib/ansible/modules/cloud/vultr/vultr_server.py b/lib/ansible/modules/cloud/vultr/vultr_server.py index cbeb77772af..1d12a79c9a8 100644 --- a/lib/ansible/modules/cloud/vultr/vultr_server.py +++ b/lib/ansible/modules/cloud/vultr/vultr_server.py @@ -452,15 +452,6 @@ class AnsibleVultrServer(Vultr): id_key='DCID', ) - def get_plan(self): - return self.query_resource_by_key( - key='name', - value=self.module.params.get('plan'), - resource='plans', - use_cache=True, - id_key='VPSPLANID', - ) - def get_firewall_group(self): return self.query_resource_by_key( key='description', @@ -642,7 +633,16 @@ class AnsibleVultrServer(Vultr): return server def _update_plan_setting(self, server, start_server): - plan = self.get_plan() + # Verify the exising plan is not discontined by Vultr and therefore won't be found by the API + server_plan = self.get_plan(plan=server.get('VPSPLANID'), optional=True) + if not server_plan: + plan = self.get_plan(optional=True) + if not plan: + self.module.warn("The plan used to create the server is not longer available as well as the desired plan. Assuming same plan, keeping as is.") + return server + else: + plan = self.get_plan() + plan_changed = True if plan and plan['VPSPLANID'] != server.get('VPSPLANID') else False if plan_changed: server, warned = self._handle_power_status_for_update(server, start_server) diff --git a/lib/ansible/modules/cloud/vultr/vultr_server_info.py b/lib/ansible/modules/cloud/vultr/vultr_server_info.py index d4eb761a6ee..afa3ed92c27 100644 --- a/lib/ansible/modules/cloud/vultr/vultr_server_info.py +++ b/lib/ansible/modules/cloud/vultr/vultr_server_info.py @@ -165,7 +165,7 @@ class AnsibleVultrServerInfo(Vultr): return self.get_firewallgroup(firewallgroup, 'FIREWALLGROUPID').get('description') def _get_plan_name(self, plan): - return self.get_plan(plan, 'VPSPLANID').get('name') + return self.get_plan(plan, 'VPSPLANID', optional=True).get('name') or 'N/A' def get_servers(self): return self.api_query(path="/v1/server/list")