Redesign OpenstackModule class

don't inherit OpenstackModule class from AnsibleModule class to
prevent occasional overriding Ansible methods or vars and failing
module.

Change-Id: Ic34fff0c938eb87cc0d2c5e98fbafed64bf349f6
This commit is contained in:
Sagi Shnaidman
2020-04-23 14:39:26 +03:00
parent 7e4fbcf568
commit f3610ad0e1
5 changed files with 307 additions and 66 deletions

View File

@@ -469,11 +469,11 @@ def _network_args(module, cloud):
nics = module.params['nics']
if not isinstance(nics, list):
module.fail_json(msg='The \'nics\' parameter must be a list.')
module.fail(msg='The \'nics\' parameter must be a list.')
for num, net in enumerate(_parse_nics(nics)):
if not isinstance(net, dict):
module.fail_json(
module.fail(
msg='Each entry in the \'nics\' parameter must be a dict.')
if net.get('net-id'):
@@ -481,7 +481,7 @@ def _network_args(module, cloud):
elif net.get('net-name'):
by_name = cloud.get_network(net['net-name'])
if not by_name:
module.fail_json(
module.fail(
msg='Could not find network by net-name: %s' %
net['net-name'])
resolved_net = net.copy()
@@ -493,7 +493,7 @@ def _network_args(module, cloud):
elif net.get('port-name'):
by_name = cloud.get_port(net['port-name'])
if not by_name:
module.fail_json(
module.fail(
msg='Could not find port by port-name: %s' %
net['port-name'])
resolved_net = net.copy()
@@ -614,6 +614,7 @@ def _check_security_groups(module, cloud, server):
class ServerModule(OpenStackModule):
deprecated_names = ('os_server', 'openstack.cloud.os_server')
argument_spec = dict(
name=dict(required=True),
@@ -658,6 +659,7 @@ class ServerModule(OpenStackModule):
)
def run(self):
state = self.params['state']
image = self.params['image']
boot_volume = self.params['boot_volume']
@@ -666,12 +668,12 @@ class ServerModule(OpenStackModule):
if state == 'present':
if not (image or boot_volume):
self.fail_json(
self.fail(
msg="Parameter 'image' or 'boot_volume' is required "
"if state == 'present'"
)
if not flavor and not flavor_ram:
self.fail_json(
self.fail(
msg="Parameter 'flavor' or 'flavor_ram' is required "
"if state == 'present'"
)
@@ -685,7 +687,7 @@ class ServerModule(OpenStackModule):
def _exit_hostvars(self, server, changed=True):
hostvars = self.conn.get_openstack_vars(server)
self.exit_json(
self.exit(
changed=changed, server=server, id=server.id, openstack=hostvars)
def _get_server_state(self):
@@ -693,7 +695,7 @@ class ServerModule(OpenStackModule):
server = self.conn.get_server(self.params['name'])
if server and state == 'present':
if server.status not in ('ACTIVE', 'SHUTOFF', 'PAUSED', 'SUSPENDED'):
self.fail_json(
self.fail(
msg="The instance is available but not Active state: " + server.status)
(ip_changed, server) = _check_ips(self, self.conn, server)
(sg_changed, server) = _check_security_groups(self, self.conn, server)
@@ -702,7 +704,7 @@ class ServerModule(OpenStackModule):
if server and state == 'absent':
return True
if state == 'absent':
self.exit_json(changed=False, result="not present")
self.exit(changed=False, result="not present")
return True
def _create_server(self):
@@ -715,23 +717,23 @@ class ServerModule(OpenStackModule):
image_id = self.conn.get_image_id(
self.params['image'], self.params['image_exclude'])
if not image_id:
self.fail_json(
self.fail(
msg="Could not find image %s" % self.params['image'])
if flavor:
flavor_dict = self.conn.get_flavor(flavor)
if not flavor_dict:
self.fail_json(msg="Could not find flavor %s" % flavor)
self.fail(msg="Could not find flavor %s" % flavor)
else:
flavor_dict = self.conn.get_flavor_by_ram(flavor_ram, flavor_include)
if not flavor_dict:
self.fail_json(msg="Could not find any matching flavor")
self.fail(msg="Could not find any matching flavor")
nics = _network_args(self, self.conn)
self.params['meta'] = _parse_meta(self.params['meta'])
bootkwargs = dict(
bootkwargs = self.check_versioned(
name=self.params['name'],
image=image_id,
flavor=flavor_dict['id'],
@@ -788,8 +790,8 @@ class ServerModule(OpenStackModule):
timeout=self.params['timeout'],
delete_ips=self.params['delete_fip'])
except Exception as e:
self.fail_json(msg="Error in deleting vm: %s" % e.message)
self.exit_json(changed=True, result='deleted')
self.fail(msg="Error in deleting vm: %s" % e)
self.exit(changed=True, result='deleted')
def main():

View File

@@ -10,33 +10,33 @@ short_description: Retrieve information about one or more compute instances
author: Monty (@emonty)
description:
- Retrieve information about server instances from OpenStack.
- This module was called C(openstack.cloud.server_facts) before Ansible 2.9, returning C(ansible_facts).
- This module was called C(os_server_facts) before Ansible 2.9, returning C(ansible_facts).
Note that the M(openstack.cloud.server_info) module no longer returns C(ansible_facts)!
notes:
- The result contains a list of servers.
options:
server:
description:
- restrict results to servers with names or UUID matching
this glob expression (e.g., <web*>).
type: str
detailed:
description:
- when true, return additional detail about servers at the expense
of additional API calls.
type: bool
default: 'no'
filters:
description:
- restrict results to servers matching a dictionary of
filters
type: dict
all_projects:
description:
- Whether to list servers from all projects or just the current auth
scoped project.
type: bool
default: 'no'
server:
description:
- restrict results to servers with names or UUID matching
this glob expression (e.g., <web*>).
type: str
detailed:
description:
- when true, return additional detail about servers at the expense
of additional API calls.
type: bool
default: 'no'
filters:
description:
- restrict results to servers matching a dictionary of
filters
type: dict
all_projects:
description:
- Whether to list servers from all projects or just the current auth
scoped project.
type: bool
default: 'no'
requirements:
- "python >= 3.6"
- "openstacksdk"
@@ -57,13 +57,13 @@ EXAMPLES = '''
msg: "{{ result.openstack_servers }}"
'''
import fnmatch
from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule
class ServerInfoModule(OpenStackModule):
deprecated_names = ('os_server_info', 'openstack.cloud.os_server_info')
argument_spec = dict(
server=dict(required=False),
detailed=dict(required=False, type='bool', default=False),
@@ -72,26 +72,16 @@ class ServerInfoModule(OpenStackModule):
)
def run(self):
is_old_facts = self._name == 'openstack.cloud.server_facts'
if is_old_facts:
self.deprecate("The 'openstack.cloud.server_facts' module has been renamed to 'openstack.cloud.server_info', "
"and the renamed one no longer returns ansible_facts", version='2.13')
openstack_servers = self.conn.search_servers(
detailed=self.params['detailed'], filters=self.params['filters'],
all_projects=self.params['all_projects'])
kwargs = self.check_versioned(
detailed=self.params['detailed'],
filters=self.params['filters'],
all_projects=self.params['all_projects']
)
if self.params['server']:
# filter servers by name
pattern = self.params['server']
# TODO(mordred) This is handled by sdk now
openstack_servers = [server for server in openstack_servers
if fnmatch.fnmatch(server['name'], pattern)
or fnmatch.fnmatch(server['id'], pattern)]
if is_old_facts:
self.exit_json(changed=False, ansible_facts=dict(
openstack_servers=openstack_servers))
else:
self.exit_json(changed=False, openstack_servers=openstack_servers)
kwargs['name_or_id'] = self.params['server']
openstack_servers = self.conn.search_servers(**kwargs)
self.exit(changed=False, openstack_servers=openstack_servers)
def main():