mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Bugfix + sanity checks for stacki_host (#2681)
* fixed validation-modules for plugins/modules/remote_management/stacki/stacki_host.py * sanity fix * added changelog fragment * extra fix to the documentation * Update plugins/modules/remote_management/stacki/stacki_host.py Co-authored-by: Felix Fontein <felix@fontein.de> * Update plugins/modules/remote_management/stacki/stacki_host.py Co-authored-by: Felix Fontein <felix@fontein.de> * rollback params Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
parent
463c576a67
commit
f74b83663b
6 changed files with 54 additions and 46 deletions
4
changelogs/fragments/2681-stacki-host-bugfix.yml
Normal file
4
changelogs/fragments/2681-stacki-host-bugfix.yml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
bugfixes:
|
||||||
|
- stacki_host - when adding a new server, ``rack`` and ``rank`` must be passed, and network parameters are optional (https://github.com/ansible-collections/community.general/pull/2681).
|
||||||
|
minor_changes:
|
||||||
|
- stacki_host - minor refactoring (https://github.com/ansible-collections/community.general/pull/2681).
|
|
@ -12,46 +12,48 @@ DOCUMENTATION = '''
|
||||||
module: stacki_host
|
module: stacki_host
|
||||||
short_description: Add or remove host to stacki front-end
|
short_description: Add or remove host to stacki front-end
|
||||||
description:
|
description:
|
||||||
- Use this module to add or remove hosts to a stacki front-end via API.
|
- Use this module to add or remove hosts to a stacki front-end via API.
|
||||||
- U(https://github.com/StackIQ/stacki)
|
- Information on stacki can be found at U(https://github.com/StackIQ/stacki).
|
||||||
options:
|
options:
|
||||||
name:
|
name:
|
||||||
description:
|
description:
|
||||||
- Name of the host to be added to Stacki.
|
- Name of the host to be added to Stacki.
|
||||||
required: True
|
required: True
|
||||||
type: str
|
type: str
|
||||||
stacki_user:
|
stacki_user:
|
||||||
description:
|
description:
|
||||||
- Username for authenticating with Stacki API, but if not
|
- Username for authenticating with Stacki API, but if not specified, the environment variable C(stacki_user) is used instead.
|
||||||
specified, the environment variable C(stacki_user) is used instead.
|
|
||||||
required: True
|
required: True
|
||||||
type: str
|
type: str
|
||||||
stacki_password:
|
stacki_password:
|
||||||
description:
|
description:
|
||||||
- Password for authenticating with Stacki API, but if not
|
- Password for authenticating with Stacki API, but if not
|
||||||
specified, the environment variable C(stacki_password) is used instead.
|
specified, the environment variable C(stacki_password) is used instead.
|
||||||
required: True
|
required: True
|
||||||
type: str
|
type: str
|
||||||
stacki_endpoint:
|
stacki_endpoint:
|
||||||
description:
|
description:
|
||||||
- URL for the Stacki API Endpoint.
|
- URL for the Stacki API Endpoint.
|
||||||
required: True
|
required: True
|
||||||
type: str
|
type: str
|
||||||
prim_intf_mac:
|
prim_intf_mac:
|
||||||
description:
|
description:
|
||||||
- MAC Address for the primary PXE boot network interface.
|
- MAC Address for the primary PXE boot network interface.
|
||||||
|
- Currently not used by the module.
|
||||||
type: str
|
type: str
|
||||||
prim_intf_ip:
|
prim_intf_ip:
|
||||||
description:
|
description:
|
||||||
- IP Address for the primary network interface.
|
- IP Address for the primary network interface.
|
||||||
|
- Currently not used by the module.
|
||||||
type: str
|
type: str
|
||||||
prim_intf:
|
prim_intf:
|
||||||
description:
|
description:
|
||||||
- Name of the primary network interface.
|
- Name of the primary network interface.
|
||||||
|
- Currently not used by the module.
|
||||||
type: str
|
type: str
|
||||||
force_install:
|
force_install:
|
||||||
description:
|
description:
|
||||||
- Set value to True to force node into install state if it already exists in stacki.
|
- Set value to C(true) to force node into install state if it already exists in stacki.
|
||||||
type: bool
|
type: bool
|
||||||
default: no
|
default: no
|
||||||
state:
|
state:
|
||||||
|
@ -59,6 +61,30 @@ options:
|
||||||
- Set value to the desired state for the specified host.
|
- Set value to the desired state for the specified host.
|
||||||
type: str
|
type: str
|
||||||
choices: [ absent, present ]
|
choices: [ absent, present ]
|
||||||
|
default: present
|
||||||
|
appliance:
|
||||||
|
description:
|
||||||
|
- Applicance to be used in host creation.
|
||||||
|
- Required if I(state) is C(present) and host does not yet exist.
|
||||||
|
type: str
|
||||||
|
default: backend
|
||||||
|
rack:
|
||||||
|
description:
|
||||||
|
- Rack to be used in host creation.
|
||||||
|
- Required if I(state) is C(present) and host does not yet exist.
|
||||||
|
type: int
|
||||||
|
rank:
|
||||||
|
description:
|
||||||
|
- Rank to be used in host creation.
|
||||||
|
- In Stacki terminology, the rank is the position of the machine in a rack.
|
||||||
|
- Required if I(state) is C(present) and host does not yet exist.
|
||||||
|
type: int
|
||||||
|
network:
|
||||||
|
description:
|
||||||
|
- Network to be configured in the host.
|
||||||
|
- Currently not used by the module.
|
||||||
|
type: str
|
||||||
|
default: private
|
||||||
author:
|
author:
|
||||||
- Hugh Ma (@bbyhuy) <Hugh.Ma@flextronics.com>
|
- Hugh Ma (@bbyhuy) <Hugh.Ma@flextronics.com>
|
||||||
'''
|
'''
|
||||||
|
@ -128,7 +154,7 @@ class StackiHost(object):
|
||||||
'PASSWORD': module.params['stacki_password']}
|
'PASSWORD': module.params['stacki_password']}
|
||||||
|
|
||||||
# Get Initial CSRF
|
# Get Initial CSRF
|
||||||
cred_a = self.do_request(self.module, self.endpoint, method="GET")
|
cred_a = self.do_request(self.endpoint, method="GET")
|
||||||
cookie_a = cred_a.headers.get('Set-Cookie').split(';')
|
cookie_a = cred_a.headers.get('Set-Cookie').split(';')
|
||||||
init_csrftoken = None
|
init_csrftoken = None
|
||||||
for c in cookie_a:
|
for c in cookie_a:
|
||||||
|
@ -145,8 +171,7 @@ class StackiHost(object):
|
||||||
login_endpoint = self.endpoint + "/login"
|
login_endpoint = self.endpoint + "/login"
|
||||||
|
|
||||||
# Get Final CSRF and Session ID
|
# Get Final CSRF and Session ID
|
||||||
login_req = self.do_request(self.module, login_endpoint, headers=header,
|
login_req = self.do_request(login_endpoint, headers=header, payload=urlencode(auth_creds), method='POST')
|
||||||
payload=urlencode(auth_creds), method='POST')
|
|
||||||
|
|
||||||
cookie_f = login_req.headers.get('Set-Cookie').split(';')
|
cookie_f = login_req.headers.get('Set-Cookie').split(';')
|
||||||
csrftoken = None
|
csrftoken = None
|
||||||
|
@ -163,8 +188,8 @@ class StackiHost(object):
|
||||||
'Content-type': 'application/json',
|
'Content-type': 'application/json',
|
||||||
'Cookie': login_req.headers.get('Set-Cookie')}
|
'Cookie': login_req.headers.get('Set-Cookie')}
|
||||||
|
|
||||||
def do_request(self, module, url, payload=None, headers=None, method=None):
|
def do_request(self, url, payload=None, headers=None, method=None):
|
||||||
res, info = fetch_url(module, url, data=payload, headers=headers, method=method)
|
res, info = fetch_url(self.module, url, data=payload, headers=headers, method=method)
|
||||||
|
|
||||||
if info['status'] != 200:
|
if info['status'] != 200:
|
||||||
self.module.fail_json(changed=False, msg=info['msg'])
|
self.module.fail_json(changed=False, msg=info['msg'])
|
||||||
|
@ -172,24 +197,16 @@ class StackiHost(object):
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def stack_check_host(self):
|
def stack_check_host(self):
|
||||||
res = self.do_request(self.module, self.endpoint, payload=json.dumps({"cmd": "list host"}), headers=self.header, method="POST")
|
res = self.do_request(self.endpoint, payload=json.dumps({"cmd": "list host"}), headers=self.header, method="POST")
|
||||||
|
return self.hostname in res.read()
|
||||||
if self.hostname in res.read():
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def stack_sync(self):
|
def stack_sync(self):
|
||||||
self.do_request(self.module, self.endpoint, payload=json.dumps({"cmd": "sync config"}), headers=self.header, method="POST")
|
self.do_request(self.endpoint, payload=json.dumps({"cmd": "sync config"}), headers=self.header, method="POST")
|
||||||
self.do_request(self.module, self.endpoint, payload=json.dumps({"cmd": "sync host config"}), headers=self.header, method="POST")
|
self.do_request(self.endpoint, payload=json.dumps({"cmd": "sync host config"}), headers=self.header, method="POST")
|
||||||
|
|
||||||
def stack_force_install(self, result):
|
def stack_force_install(self, result):
|
||||||
data = dict()
|
data = {'cmd': "set host boot {0} action=install".format(self.hostname)}
|
||||||
changed = False
|
self.do_request(self.endpoint, payload=json.dumps(data), headers=self.header, method="POST")
|
||||||
|
|
||||||
data['cmd'] = "set host boot {0} action=install" \
|
|
||||||
.format(self.hostname)
|
|
||||||
self.do_request(self.module, self.endpoint, payload=json.dumps(data), headers=self.header, method="POST")
|
|
||||||
changed = True
|
changed = True
|
||||||
|
|
||||||
self.stack_sync()
|
self.stack_sync()
|
||||||
|
@ -203,7 +220,7 @@ class StackiHost(object):
|
||||||
|
|
||||||
data['cmd'] = "add host {0} rack={1} rank={2} appliance={3}"\
|
data['cmd'] = "add host {0} rack={1} rank={2} appliance={3}"\
|
||||||
.format(self.hostname, self.rack, self.rank, self.appliance)
|
.format(self.hostname, self.rack, self.rank, self.appliance)
|
||||||
self.do_request(self.module, self.endpoint, payload=json.dumps(data), headers=self.header, method="POST")
|
self.do_request(self.endpoint, payload=json.dumps(data), headers=self.header, method="POST")
|
||||||
|
|
||||||
self.stack_sync()
|
self.stack_sync()
|
||||||
|
|
||||||
|
@ -215,7 +232,7 @@ class StackiHost(object):
|
||||||
|
|
||||||
data['cmd'] = "remove host {0}"\
|
data['cmd'] = "remove host {0}"\
|
||||||
.format(self.hostname)
|
.format(self.hostname)
|
||||||
self.do_request(self.module, self.endpoint, payload=json.dumps(data), headers=self.header, method="POST")
|
self.do_request(self.endpoint, payload=json.dumps(data), headers=self.header, method="POST")
|
||||||
|
|
||||||
self.stack_sync()
|
self.stack_sync()
|
||||||
|
|
||||||
|
@ -258,8 +275,7 @@ def main():
|
||||||
.format(module.params['name'])
|
.format(module.params['name'])
|
||||||
# Otherwise, state is present, but host doesn't exists, require more params to add host
|
# Otherwise, state is present, but host doesn't exists, require more params to add host
|
||||||
elif module.params['state'] == 'present' and not host_exists:
|
elif module.params['state'] == 'present' and not host_exists:
|
||||||
for param in ['appliance', 'prim_intf',
|
for param in ['appliance', 'rack', 'rank', 'prim_intf', 'prim_intf_ip', 'network', 'prim_intf_mac']:
|
||||||
'prim_intf_ip', 'network', 'prim_intf_mac']:
|
|
||||||
if not module.params[param]:
|
if not module.params[param]:
|
||||||
missing_params.append(param)
|
missing_params.append(param)
|
||||||
if len(missing_params) > 0: # @FIXME replace with required_if
|
if len(missing_params) > 0: # @FIXME replace with required_if
|
||||||
|
|
|
@ -46,9 +46,6 @@ plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules
|
||||||
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:parameter-type-not-in-doc # missing docs on suboptions
|
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:parameter-type-not-in-doc # missing docs on suboptions
|
||||||
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:undocumented-parameter # missing docs on suboptions
|
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:undocumented-parameter # missing docs on suboptions
|
||||||
plugins/modules/remote_management/manageiq/manageiq_tags.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/remote_management/manageiq/manageiq_tags.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:doc-default-does-not-match-spec
|
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:parameter-type-not-in-doc
|
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:undocumented-parameter
|
|
||||||
plugins/modules/source_control/github/github_deploy_key.py validate-modules:parameter-invalid
|
plugins/modules/source_control/github/github_deploy_key.py validate-modules:parameter-invalid
|
||||||
plugins/modules/system/gconftool2.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/system/gconftool2.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/system/iptables_state.py validate-modules:undocumented-parameter
|
plugins/modules/system/iptables_state.py validate-modules:undocumented-parameter
|
||||||
|
|
|
@ -45,9 +45,6 @@ plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules
|
||||||
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:parameter-type-not-in-doc # missing docs on suboptions
|
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:parameter-type-not-in-doc # missing docs on suboptions
|
||||||
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:undocumented-parameter # missing docs on suboptions
|
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:undocumented-parameter # missing docs on suboptions
|
||||||
plugins/modules/remote_management/manageiq/manageiq_tags.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/remote_management/manageiq/manageiq_tags.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:doc-default-does-not-match-spec
|
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:parameter-type-not-in-doc
|
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:undocumented-parameter
|
|
||||||
plugins/modules/source_control/github/github_deploy_key.py validate-modules:parameter-invalid
|
plugins/modules/source_control/github/github_deploy_key.py validate-modules:parameter-invalid
|
||||||
plugins/modules/system/gconftool2.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/system/gconftool2.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/system/iptables_state.py validate-modules:undocumented-parameter
|
plugins/modules/system/iptables_state.py validate-modules:undocumented-parameter
|
||||||
|
|
|
@ -45,9 +45,6 @@ plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules
|
||||||
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:parameter-type-not-in-doc # missing docs on suboptions
|
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:parameter-type-not-in-doc # missing docs on suboptions
|
||||||
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:undocumented-parameter # missing docs on suboptions
|
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:undocumented-parameter # missing docs on suboptions
|
||||||
plugins/modules/remote_management/manageiq/manageiq_tags.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/remote_management/manageiq/manageiq_tags.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:doc-default-does-not-match-spec
|
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:parameter-type-not-in-doc
|
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:undocumented-parameter
|
|
||||||
plugins/modules/source_control/github/github_deploy_key.py validate-modules:parameter-invalid
|
plugins/modules/source_control/github/github_deploy_key.py validate-modules:parameter-invalid
|
||||||
plugins/modules/system/gconftool2.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/system/gconftool2.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/system/iptables_state.py validate-modules:undocumented-parameter
|
plugins/modules/system/iptables_state.py validate-modules:undocumented-parameter
|
||||||
|
|
|
@ -36,9 +36,6 @@ plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules
|
||||||
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:doc-missing-type # missing docs on suboptions
|
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:doc-missing-type # missing docs on suboptions
|
||||||
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:parameter-type-not-in-doc # missing docs on suboptions
|
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:parameter-type-not-in-doc # missing docs on suboptions
|
||||||
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:undocumented-parameter # missing docs on suboptions
|
plugins/modules/remote_management/manageiq/manageiq_provider.py validate-modules:undocumented-parameter # missing docs on suboptions
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:doc-default-does-not-match-spec
|
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:parameter-type-not-in-doc
|
|
||||||
plugins/modules/remote_management/stacki/stacki_host.py validate-modules:undocumented-parameter
|
|
||||||
plugins/modules/net_tools/nios/nios_a_record.py validate-modules:deprecation-mismatch
|
plugins/modules/net_tools/nios/nios_a_record.py validate-modules:deprecation-mismatch
|
||||||
plugins/modules/net_tools/nios/nios_a_record.py validate-modules:invalid-documentation
|
plugins/modules/net_tools/nios/nios_a_record.py validate-modules:invalid-documentation
|
||||||
plugins/modules/net_tools/nios/nios_aaaa_record.py validate-modules:deprecation-mismatch
|
plugins/modules/net_tools/nios/nios_aaaa_record.py validate-modules:deprecation-mismatch
|
||||||
|
|
Loading…
Reference in a new issue