vultr: improve handling of dicontinued plans (#66792)
* vultr: improve handling of dicontinued plans * add changelog
This commit is contained in:
parent
2dc9841806
commit
78e666dd39
4 changed files with 25 additions and 20 deletions
2
changelogs/fragments/66792-vultr-improve-plan.yml
Normal file
2
changelogs/fragments/66792-vultr-improve-plan.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
minor_changes:
|
||||||
|
- vultr_server_info, vultr_server - Improved handling of discontinued plans (https://github.com/ansible/ansible/issues/66707).
|
|
@ -216,7 +216,7 @@ class Vultr:
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
self.module.fail_json(msg="Could not process response into json: %s" % 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:
|
if not value:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
@ -246,12 +246,13 @@ class Vultr:
|
||||||
return r_data
|
return r_data
|
||||||
if id_key is not None and to_text(r_data[id_key]) == to_text(value):
|
if id_key is not None and to_text(r_data[id_key]) == to_text(value):
|
||||||
return r_data
|
return r_data
|
||||||
|
if not optional:
|
||||||
if id_key:
|
if id_key:
|
||||||
msg = "Could not find %s with ID or %s: %s" % (resource, key, value)
|
msg = "Could not find %s with ID or %s: %s" % (resource, key, value)
|
||||||
else:
|
else:
|
||||||
msg = "Could not find %s with %s: %s" % (resource, key, value)
|
msg = "Could not find %s with %s: %s" % (resource, key, value)
|
||||||
self.module.fail_json(msg=msg)
|
self.module.fail_json(msg=msg)
|
||||||
|
return {}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def normalize_result(resource, schema, remove_missing_keys=True):
|
def normalize_result(resource, schema, remove_missing_keys=True):
|
||||||
|
@ -288,14 +289,16 @@ class Vultr:
|
||||||
|
|
||||||
return self.result
|
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')
|
value = plan or self.module.params.get('plan')
|
||||||
|
|
||||||
return self.query_resource_by_key(
|
return self.query_resource_by_key(
|
||||||
key=key,
|
key=key,
|
||||||
value=value,
|
value=value,
|
||||||
resource='plans',
|
resource='plans',
|
||||||
use_cache=True
|
use_cache=True,
|
||||||
|
id_key='VPSPLANID',
|
||||||
|
optional=optional,
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_firewallgroup(self, firewallgroup=None, key='description'):
|
def get_firewallgroup(self, firewallgroup=None, key='description'):
|
||||||
|
|
|
@ -452,15 +452,6 @@ class AnsibleVultrServer(Vultr):
|
||||||
id_key='DCID',
|
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):
|
def get_firewall_group(self):
|
||||||
return self.query_resource_by_key(
|
return self.query_resource_by_key(
|
||||||
key='description',
|
key='description',
|
||||||
|
@ -642,7 +633,16 @@ class AnsibleVultrServer(Vultr):
|
||||||
return server
|
return server
|
||||||
|
|
||||||
def _update_plan_setting(self, server, start_server):
|
def _update_plan_setting(self, server, start_server):
|
||||||
|
# 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 = self.get_plan()
|
||||||
|
|
||||||
plan_changed = True if plan and plan['VPSPLANID'] != server.get('VPSPLANID') else False
|
plan_changed = True if plan and plan['VPSPLANID'] != server.get('VPSPLANID') else False
|
||||||
if plan_changed:
|
if plan_changed:
|
||||||
server, warned = self._handle_power_status_for_update(server, start_server)
|
server, warned = self._handle_power_status_for_update(server, start_server)
|
||||||
|
|
|
@ -165,7 +165,7 @@ class AnsibleVultrServerInfo(Vultr):
|
||||||
return self.get_firewallgroup(firewallgroup, 'FIREWALLGROUPID').get('description')
|
return self.get_firewallgroup(firewallgroup, 'FIREWALLGROUPID').get('description')
|
||||||
|
|
||||||
def _get_plan_name(self, plan):
|
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):
|
def get_servers(self):
|
||||||
return self.api_query(path="/v1/server/list")
|
return self.api_query(path="/v1/server/list")
|
||||||
|
|
Loading…
Reference in a new issue