mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
171 lines
4.8 KiB
Python
171 lines
4.8 KiB
Python
|
#!/usr/bin/python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
# Copyright (c) Contributors to the Ansible project
|
||
|
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||
|
|
||
|
from __future__ import absolute_import, division, print_function
|
||
|
__metaclass__ = type
|
||
|
|
||
|
DOCUMENTATION = r'''
|
||
|
---
|
||
|
author:
|
||
|
- Laszlo Szomor (@lszomor)
|
||
|
module: lvg_rename
|
||
|
short_description: Renames LVM volume groups
|
||
|
description:
|
||
|
- This module renames volume groups using the C(vgchange) command.
|
||
|
extends_documentation_fragment:
|
||
|
- community.general.attributes
|
||
|
attributes:
|
||
|
check_mode:
|
||
|
support: full
|
||
|
diff_mode:
|
||
|
support: full
|
||
|
version_added: 7.1.0
|
||
|
options:
|
||
|
vg:
|
||
|
description:
|
||
|
- The name or UUID of the source VG.
|
||
|
- See V(vgrename(8\)) for valid values.
|
||
|
type: str
|
||
|
required: true
|
||
|
vg_new:
|
||
|
description:
|
||
|
- The new name of the VG.
|
||
|
- See V(lvm(8\)) for valid names.
|
||
|
type: str
|
||
|
required: true
|
||
|
seealso:
|
||
|
- module: community.general.lvg
|
||
|
notes:
|
||
|
- This module does not modify VG renaming-related configurations like C(fstab) entries or boot parameters.
|
||
|
'''
|
||
|
|
||
|
EXAMPLES = r'''
|
||
|
- name: Rename a VG by name
|
||
|
community.general.lvg_rename:
|
||
|
vg: vg_orig_name
|
||
|
vg_new: vg_new_name
|
||
|
|
||
|
- name: Rename a VG by UUID
|
||
|
community.general.lvg_rename:
|
||
|
vg_uuid: SNgd0Q-rPYa-dPB8-U1g6-4WZI-qHID-N7y9Vj
|
||
|
vg_new: vg_new_name
|
||
|
'''
|
||
|
|
||
|
from ansible.module_utils.basic import AnsibleModule
|
||
|
|
||
|
argument_spec = dict(
|
||
|
vg=dict(type='str', required=True,),
|
||
|
vg_new=dict(type='str', required=True,),
|
||
|
)
|
||
|
|
||
|
|
||
|
class LvgRename(object):
|
||
|
def __init__(self, module):
|
||
|
'''
|
||
|
Orchestrates the lvg_rename module logic.
|
||
|
|
||
|
:param module: An AnsibleModule instance.
|
||
|
'''
|
||
|
self.module = module
|
||
|
self.result = {'changed': False}
|
||
|
self.vg_list = []
|
||
|
self._load_params()
|
||
|
|
||
|
def run(self):
|
||
|
"""Performs the module logic."""
|
||
|
|
||
|
self._load_vg_list()
|
||
|
|
||
|
old_vg_exists = self._is_vg_exists(vg=self.vg)
|
||
|
new_vg_exists = self._is_vg_exists(vg=self.vg_new)
|
||
|
|
||
|
if old_vg_exists:
|
||
|
if new_vg_exists:
|
||
|
self.module.fail_json(msg='The new VG name (%s) is already in use.' % (self.vg_new))
|
||
|
else:
|
||
|
self._rename_vg()
|
||
|
else:
|
||
|
if new_vg_exists:
|
||
|
self.result['msg'] = 'The new VG (%s) already exists, nothing to do.' % (self.vg_new)
|
||
|
self.module.exit_json(**self.result)
|
||
|
else:
|
||
|
self.module.fail_json(msg='Both current (%s) and new (%s) VG are missing.' % (self.vg, self.vg_new))
|
||
|
|
||
|
self.module.exit_json(**self.result)
|
||
|
|
||
|
def _load_params(self):
|
||
|
"""Load the parameters from the module."""
|
||
|
|
||
|
self.vg = self.module.params['vg']
|
||
|
self.vg_new = self.module.params['vg_new']
|
||
|
|
||
|
def _load_vg_list(self):
|
||
|
"""Load the VGs from the system."""
|
||
|
|
||
|
vgs_cmd = self.module.get_bin_path('vgs', required=True)
|
||
|
vgs_cmd_with_opts = [vgs_cmd, '--noheadings', '--separator', ';', '-o', 'vg_name,vg_uuid']
|
||
|
dummy, vg_raw_list, dummy = self.module.run_command(vgs_cmd_with_opts, check_rc=True)
|
||
|
|
||
|
for vg_info in vg_raw_list.splitlines():
|
||
|
vg_name, vg_uuid = vg_info.strip().split(';')
|
||
|
self.vg_list.append(vg_name)
|
||
|
self.vg_list.append(vg_uuid)
|
||
|
|
||
|
def _is_vg_exists(self, vg):
|
||
|
'''
|
||
|
Checks VG existence by name or UUID. It removes the '/dev/' prefix before checking.
|
||
|
|
||
|
:param vg: A string with the name or UUID of the VG.
|
||
|
:returns: A boolean indicates whether the VG exists or not.
|
||
|
'''
|
||
|
|
||
|
vg_found = False
|
||
|
dev_prefix = '/dev/'
|
||
|
|
||
|
if vg.startswith(dev_prefix):
|
||
|
vg_id = vg[len(dev_prefix):]
|
||
|
else:
|
||
|
vg_id = vg
|
||
|
|
||
|
vg_found = vg_id in self.vg_list
|
||
|
|
||
|
return vg_found
|
||
|
|
||
|
def _rename_vg(self):
|
||
|
"""Renames the volume group."""
|
||
|
|
||
|
vgrename_cmd = self.module.get_bin_path('vgrename', required=True)
|
||
|
|
||
|
if self.module._diff:
|
||
|
self.result['diff'] = {'before': {'vg': self.vg}, 'after': {'vg': self.vg_new}}
|
||
|
|
||
|
if self.module.check_mode:
|
||
|
self.result['msg'] = "Running in check mode. The module would rename VG %s to %s." % (self.vg, self.vg_new)
|
||
|
self.result['changed'] = True
|
||
|
else:
|
||
|
vgrename_cmd_with_opts = [vgrename_cmd, self.vg, self.vg_new]
|
||
|
dummy, vg_rename_out, dummy = self.module.run_command(vgrename_cmd_with_opts, check_rc=True)
|
||
|
|
||
|
self.result['msg'] = vg_rename_out
|
||
|
self.result['changed'] = True
|
||
|
|
||
|
|
||
|
def setup_module_object():
|
||
|
module = AnsibleModule(argument_spec=argument_spec,
|
||
|
supports_check_mode=True)
|
||
|
return module
|
||
|
|
||
|
|
||
|
def main():
|
||
|
module = setup_module_object()
|
||
|
lvg_rename = LvgRename(module=module)
|
||
|
lvg_rename.run()
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|