diff options
author | Ansible Core Team <info@ansible.com> | 2020-03-09 09:40:35 +0000 |
---|---|---|
committer | Matt Martz <matt@sivel.net> | 2020-03-23 11:14:21 -0500 |
commit | 675129ae19700121bd1122dc63040e4d3cdb3936 (patch) | |
tree | 3e94858e8ae083df61917ee51c22115fa356da2e /lib/ansible | |
parent | 3149db08698887fe4581d1fe52a01eed314d2b29 (diff) | |
download | ansible-675129ae19700121bd1122dc63040e4d3cdb3936.tar.gz |
Migrated to cisco.ucs
Diffstat (limited to 'lib/ansible')
22 files changed, 0 insertions, 5200 deletions
diff --git a/lib/ansible/module_utils/remote_management/ucs.py b/lib/ansible/module_utils/remote_management/ucs.py deleted file mode 100644 index bbb0a407a5..0000000000 --- a/lib/ansible/module_utils/remote_management/ucs.py +++ /dev/null @@ -1,97 +0,0 @@ -# This code is part of Ansible, but is an independent component. -# This particular file snippet, and this file snippet only, is BSD licensed. -# Modules you write using this snippet, which is embedded dynamically by Ansible -# still belong to the author of the module, and may assign their own license -# to the complete work. -# -# (c) 2016 Red Hat Inc. -# (c) 2019 Cisco Systems Inc. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -import traceback - -from ansible.module_utils.basic import missing_required_lib - -UCSMSDK_IMP_ERR = None -try: - import ucsmsdk - HAS_UCSMSDK = True -except Exception: - UCSMSDK_IMP_ERR = traceback.format_exc() - HAS_UCSMSDK = False - -ucs_argument_spec = dict( - hostname=dict(type='str', required=True), - username=dict(type='str', default='admin'), - password=dict(type='str', required=True, no_log=True), - port=dict(type='int', default=None), - use_ssl=dict(type='bool', default=True), - use_proxy=dict(type='bool', default=True), - proxy=dict(type='str', default=None), -) - - -class UCSModule(): - - def __init__(self, module): - self.module = module - self.result = {} - if not HAS_UCSMSDK: - self.module.fail_json(msg=missing_required_lib('ucsmsdk'), exception=UCSMSDK_IMP_ERR) - self.login() - - def __del__(self): - self.logout() - - def login(self): - from ucsmsdk.ucshandle import UcsHandle - - # use_proxy=yes (default) and proxy=None (default) should be using the system defined proxy - # use_proxy=yes (default) and proxy=value should use the provided proxy - # use_proxy=no (user) should not be using a proxy - if self.module.params['use_proxy']: - proxy = self.module.params['proxy'] - else: - # force no proxy to be used. Note that proxy=None in UcsHandle will - # use the system proxy so we must set to something else - proxy = {} - - try: - handle = UcsHandle( - ip=self.module.params['hostname'], - username=self.module.params['username'], - password=self.module.params['password'], - port=self.module.params['port'], - secure=self.module.params['use_ssl'], - proxy=proxy - ) - handle.login() - except Exception as e: - self.result['msg'] = str(e) - self.module.fail_json(**self.result) - self.login_handle = handle - - def logout(self): - if hasattr(self, 'login_handle'): - self.login_handle.logout() - return True - return False diff --git a/lib/ansible/modules/remote_management/ucs/ucs_disk_group_policy.py b/lib/ansible/modules/remote_management/ucs/ucs_disk_group_policy.py deleted file mode 100644 index cf296a924a..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_disk_group_policy.py +++ /dev/null @@ -1,422 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community'} - -DOCUMENTATION = r''' ---- -module: ucs_disk_group_policy -short_description: Configures disk group policies on Cisco UCS Manager -description: -- Configures disk group policies on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - Desired state of the disk group policy. - - If C(present), will verify that the disk group policy is present and will create if needed. - - If C(absent), will verify that the disk group policy is absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name of the disk group policy. - This name can be between 1 and 16 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after the policy is created. - required: yes - description: - description: - - The user-defined description of the storage profile. - Enter up to 256 characters. - "You can use any characters or spaces except the following:" - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - raid_level: - description: - - "The RAID level for the disk group policy. This can be one of the following:" - - "stripe - UCS Manager shows RAID 0 Striped" - - "mirror - RAID 1 Mirrored" - - "mirror-stripe - RAID 10 Mirrored and Striped" - - "stripe-parity - RAID 5 Striped Parity" - - "stripe-dual-parity - RAID 6 Striped Dual Parity" - - "stripe-parity-stripe - RAID 50 Striped Parity and Striped" - - "stripe-dual-parity-stripe - RAID 60 Striped Dual Parity and Striped" - choices: [stripe, mirror, mirror-stripe, stripe-parity, stripe-dual-parity, stripe-parity-stripe, stripe-dual-parity-stripe] - default: stripe - configuration_mode: - description: - - "Disk group configuration mode. Choose one of the following:" - - "automatic - Automatically configures the disks in the disk group." - - "manual - Enables you to manually configure the disks in the disk group." - choices: [automatic, manual] - default: automatic - num_drives: - description: - - Specify the number of drives for the disk group. - - This can be from 0 to 24. - - Option only applies when configuration mode is automatic. - default: 1 - drive_type: - description: - - Specify the drive type to use in the drive group. - - "This can be one of the following:" - - "unspecified — Selects the first available drive type, and applies that to all drives in the group." - - "HDD — Hard disk drive" - - "SSD — Solid state drive" - - Option only applies when configuration mode is automatic. - choices: [unspecified, HDD, SSD] - default: unspecified - num_ded_hot_spares: - description: - - Specify the number of hot spares for the disk group. - - This can be from 0 to 24. - - Option only applies when configuration mode is automatic. - default: unspecified - num_glob_hot_spares: - description: - - Specify the number of global hot spares for the disk group. - - This can be from 0 to 24. - - Option only applies when configuration mode is automatic. - default: unspecified - min_drive_size: - description: - - Specify the minimum drive size or unspecified to allow all drive sizes. - - This can be from 0 to 10240 GB. - - Option only applies when configuration mode is automatic. - default: 'unspecified' - use_remaining_disks: - description: - - Specifies whether you can use all the remaining disks in the disk group or not. - - Option only applies when configuration mode is automatic. - choices: ['yes', 'no'] - default: 'no' - manual_disks: - description: - - List of manually configured disks. - - Options are only used when you choose manual configuration_mode. - suboptions: - name: - description: - - The name of the local LUN. - required: yes - slot_num: - description: - - The slot number of the specific disk. - role: - description: - - "The role of the disk. This can be one of the following:" - - "normal - Normal" - - "ded-hot-spare - Dedicated Hot Spare" - - "glob-hot-spare - Glob Hot Spare" - span_id: - description: - - The Span ID of the specific disk. - default: 'unspecified' - state: - description: - - If C(present), will verify disk slot is configured within policy. - If C(absent), will verify disk slot is absent from policy. - choices: [ present, absent ] - default: present - virtual_drive: - description: - - Configuration of virtual drive options. - suboptions: - access_policy: - description: - - Configure access policy to virtual drive. - choices: [blocked, hidden, platform-default, read-only, read-write, transport-ready] - default: platform-default - drive_cache: - description: - - Configure drive caching. - choices: [disable, enable, no-change, platform-default] - default: platform-default - io_policy: - description: - - Direct or Cached IO path. - choices: [cached, direct, platform-default] - default: platform-default - read_policy: - description: - - Read access policy to virtual drive. - choices: [normal, platform-default, read-ahead] - default: platform-default - strip_size: - description: - - Virtual drive strip size. - choices: [ present, absent ] - default: platform-default - write_cache_policy: - description: - - Write back cache policy. - choices: [always-write-back, platform-default, write-back-good-bbu, write-through] - default: platform-default - org_dn: - description: - - The distinguished name (dn) of the organization where the resource is assigned. - default: org-root -requirements: -- ucsmsdk -author: -- Sindhu Sudhir (@sisudhir) -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -- Brett Johnson (@sdbrett) -version_added: '2.8' -''' - -EXAMPLES = r''' -- name: Configure Disk Group Policy - ucs_disk_group_policy: - hostname: 172.16.143.150 - username: admin - password: password - name: DEE-DG - raid_level: mirror - configuration_mode: manual - manual_disks: - - slot_num: '1' - role: normal - - slot_num: '2' - role: normal - -- name: Remove Disk Group Policy - ucs_disk_group_policy: - name: DEE-DG - hostname: 172.16.143.150 - username: admin - password: password - state: absent - -- name: Remove Disk from Policy - ucs_disk_group_policy: - hostname: 172.16.143.150 - username: admin - password: password - name: DEE-DG - description: Testing Ansible - raid_level: stripe - configuration_mode: manual - manual_disks: - - slot_num: '1' - role: normal - - slot_num: '2' - role: normal - state: absent - virtual_drive: - access_policy: platform-default - io_policy: direct - strip_size: 64KB -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def configure_disk_policy(ucs, module, dn): - from ucsmsdk.mometa.lstorage.LstorageDiskGroupConfigPolicy import LstorageDiskGroupConfigPolicy - from ucsmsdk.mometa.lstorage.LstorageDiskGroupQualifier import LstorageDiskGroupQualifier - from ucsmsdk.mometa.lstorage.LstorageLocalDiskConfigRef import LstorageLocalDiskConfigRef - - if not module.check_mode: - try: - # create if mo does not already exist - mo = LstorageDiskGroupConfigPolicy( - parent_mo_or_dn=module.params['org_dn'], - name=module.params['name'], - descr=module.params['description'], - raid_level=module.params['raid_level'], - ) - if module.params['configuration_mode'] == 'automatic': - LstorageDiskGroupQualifier( - parent_mo_or_dn=mo, - num_drives=module.params['num_drives'], - drive_type=module.params['drive_type'], - use_remaining_disks=module.params['use_remaining_disks'], - num_ded_hot_spares=module.params['num_ded_hot_spares'], - num_glob_hot_spares=module.params['num_glob_hot_spares'], - min_drive_size=module.params['min_drive_size'], - ) - else: # configuration_mode == 'manual' - for disk in module.params['manual_disks']: - if disk['state'] == 'absent': - child_dn = dn + '/slot-' + disk['slot_num'] - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - ucs.login_handle.remove_mo(mo_1) - else: # state == 'present' - LstorageLocalDiskConfigRef( - parent_mo_or_dn=mo, - slot_num=disk['slot_num'], - role=disk['role'], - span_id=disk['span_id'], - ) - - if module.params['virtual_drive']: - _configure_virtual_drive(module, mo) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - except Exception as e: # generic Exception handling because SDK can throw a variety - ucs.result['msg'] = "setup error: %s " % str(e) - module.fail_json(**ucs.result) - - ucs.result['changed'] = True - - -def check_disk_policy_props(ucs, module, mo, dn): - props_match = True - - # check top-level mo props - kwargs = dict(descr=module.params['description']) - kwargs['raid_level'] = module.params['raid_level'] - if mo.check_prop_match(**kwargs): - # top-level props match, check next level mo/props - if module.params['configuration_mode'] == 'automatic': - child_dn = dn + '/disk-group-qual' - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - kwargs = dict(num_drives=module.params['num_drives']) - kwargs['drive_type'] = module.params['drive_type'] - kwargs['use_remaining_disks'] = module.params['use_remaining_disks'] - kwargs['num_ded_hot_spares'] = module.params['num_ded_hot_spares'] - kwargs['num_glob_hot_spares'] = module.params['num_glob_hot_spares'] - kwargs['min_drive_size'] = module.params['min_drive_size'] - props_match = mo_1.check_prop_match(**kwargs) - - else: # configuration_mode == 'manual' - for disk in module.params['manual_disks']: - child_dn = dn + '/slot-' + disk['slot_num'] - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - if disk['state'] == 'absent': - props_match = False - else: # state == 'present' - kwargs = dict(slot_num=disk['slot_num']) - kwargs['role'] = disk['role'] - kwargs['span_id'] = disk['span_id'] - if not mo_1.check_prop_match(**kwargs): - props_match = False - break - if props_match: - if module.params['virtual_drive']: - props_match = check_virtual_drive_props(ucs, module, dn) - else: - props_match = False - return props_match - - -def check_virtual_drive_props(ucs, module, dn): - child_dn = dn + '/virtual-drive-def' - mo_1 = ucs.login_handle.query_dn(child_dn) - return mo_1.check_prop_match(**module.params['virtual_drive']) - - -def _configure_virtual_drive(module, mo): - from ucsmsdk.mometa.lstorage.LstorageVirtualDriveDef import LstorageVirtualDriveDef - LstorageVirtualDriveDef(parent_mo_or_dn=mo, **module.params['virtual_drive']) - - -def _virtual_drive_argument_spec(): - return dict( - access_policy=dict(type='str', default='platform-default', - choices=["blocked", "hidden", "platform-default", "read-only", "read-write", - "transport-ready"]), - drive_cache=dict(type='str', default='platform-default', - choices=["disable", "enable", "no-change", "platform-default"]), - io_policy=dict(type='str', default='platform-default', - choices=["cached", "direct", "platform-default"]), - read_policy=dict(type='str', default='platform-default', - choices=["normal", "platform-default", "read-ahead"]), - strip_size=dict(type='str', default='platform-default', - choices=["1024KB", "128KB", "16KB", "256KB", "32KB", "512KB", "64KB", "8KB", - "platform-default"]), - write_cache_policy=dict(type='str', default='platform-default', - choices=["always-write-back", "platform-default", "write-back-good-bbu", - "write-through"]), - ) - - -def main(): - manual_disk = dict( - slot_num=dict(type='str', required=True), - role=dict(type='str', default='normal', choices=['normal', 'ded-hot-spare', 'glob-hot-spare']), - span_id=dict(type='str', default='unspecified'), - state=dict(type='str', default='present', choices=['present', 'absent']), - ) - - argument_spec = ucs_argument_spec - argument_spec.update( - org_dn=dict(type='str', default='org-root'), - name=dict(type='str', required=True), - description=dict(type='str', aliases=['descr'], default=''), - raid_level=dict( - type='str', - default='stripe', - choices=[ - 'stripe', - 'mirror', - 'mirror-stripe', - 'stripe-parity', - 'stripe-dual-parity', - 'stripe-parity-stripe', - 'stripe-dual-parity-stripe', - ], - ), - num_drives=dict(type='str', default='1'), - configuration_mode=dict(type='str', default='automatic', choices=['automatic', 'manual']), - num_ded_hot_spares=dict(type='str', default='unspecified'), - num_glob_hot_spares=dict(type='str', default='unspecified'), - drive_type=dict(type='str', default='unspecified', choices=['unspecified', 'HDD', 'SSD']), - use_remaining_disks=dict(type='str', default='no', choices=['yes', 'no']), - min_drive_size=dict(type='str', default='unspecified'), - manual_disks=dict(type='list', elements='dict', options=manual_disk), - state=dict(type='str', default='present', choices=['present', 'absent']), - virtual_drive=dict(type='dict', options=_virtual_drive_argument_spec()), - ) - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - ) - ucs = UCSModule(module) - # UCSModule creation above verifies ucsmsdk is present and exits on failure. - # Additional imports are done below or in called functions. - - ucs.result['changed'] = False - props_match = False - # dn is <org_dn>/disk-group-config-<name> - dn = module.params['org_dn'] + '/disk-group-config-' + module.params['name'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - if module.params['state'] == 'absent': - # mo must exist but all properties do not have to match - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - ucs.result['changed'] = True - else: # state == 'present' - props_match = check_disk_policy_props(ucs, module, mo, dn) - - if module.params['state'] == 'present' and not props_match: - configure_disk_policy(ucs, module, dn) - - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_dns_server.py b/lib/ansible/modules/remote_management/ucs/ucs_dns_server.py deleted file mode 100644 index 235fe81e58..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_dns_server.py +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community'} - -DOCUMENTATION = r''' ---- -module: ucs_dns_server - -short_description: Configure DNS servers on Cisco UCS Manager - -extends_documentation_fragment: -- ucs - -description: -- Configure DNS servers on Cisco UCS Manager. - -options: - state: - description: - - If C(absent), will remove a DNS server. - - If C(present), will add or update a DNS server. - choices: [absent, present] - default: present - type: str - - dns_server: - description: - - DNS server IP address. - - Enter a valid IPV4 Address. - - UCS Manager supports up to 4 DNS Servers - aliases: [ name ] - type: str - - description: - description: - - A user-defined description of the DNS server. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - type: str - - delegate_to: - description: - - Where the module will be run - default: localhost - type: str - -requirements: -- ucsmsdk - -author: -- John McDonough (@movinalot) -- CiscoUcs (@CiscoUcs) - -version_added: "2.8" -''' - -EXAMPLES = r''' -- name: Configure DNS server - ucs_dns_server: - hostname: 172.16.143.150 - username: admin - password: password - dns_server: 10.10.10.10 - description: DNS Server IP address - state: present - delegate_to: localhost - -- name: Remove DNS server - ucs_dns_server: - hostname: 172.16.143.150 - username: admin - password: password - dns_server: 10.10.10.10 - state: absent - delegate_to: localhost -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def run_module(): - argument_spec = ucs_argument_spec - argument_spec.update( - dns_server=dict(type='str', aliases=['name']), - description=dict(type='str', aliases=['descr'], default=''), - state=dict(type='str', default='present', choices=['present', 'absent']), - delegate_to=dict(type='str', default='localhost'), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - required_if=[ - ['state', 'present', ['dns_server']], - ], - ) - # UCSModule verifies ucsmsdk is present and exits on failure. - # Imports are below for UCS object creation. - ucs = UCSModule(module) - from ucsmsdk.mometa.comm.CommDnsProvider import CommDnsProvider - - err = False - changed = False - - try: - mo_exists = False - props_match = False - - dn = 'sys/svc-ext/dns-svc/dns-' + module.params['dns_server'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - - if module.params['state'] == 'absent': - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - changed = True - else: - if mo_exists: - # check top-level mo props - kwargs = dict(descr=module.params['description']) - if mo.check_prop_match(**kwargs): - props_match = True - - if not props_match: - if not module.check_mode: - # update/add mo - mo = CommDnsProvider(parent_mo_or_dn='sys/svc-ext/dns-svc', - name=module.params['dns_server'], - descr=module.params['description']) - ucs.login_handle.add_mo(mo, modify_present=True) - ucs.login_handle.commit() - changed = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -def main(): - run_module() - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_ip_pool.py b/lib/ansible/modules/remote_management/ucs/ucs_ip_pool.py deleted file mode 100644 index 02e576eb37..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_ip_pool.py +++ /dev/null @@ -1,296 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_ip_pool -short_description: Configures IP address pools on Cisco UCS Manager -description: -- Configures IP address pools and blocks of IP addresses on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify IP pool is present and will create if needed. - - If C(absent), will verify IP pool is absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name of the IP address pool. - - This name can be between 1 and 32 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after the IP address pool is created. - required: yes - description: - description: - - The user-defined description of the IP address pool. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr, descrption ] - order: - description: - - The Assignment Order field. - - "This can be one of the following:" - - "default - Cisco UCS Manager selects a random identity from the pool." - - "sequential - Cisco UCS Manager selects the lowest available identity from the pool." - choices: [default, sequential] - default: default - first_addr: - description: - - The first IPv4 address in the IPv4 addresses block. - - This is the From field in the UCS Manager Add IPv4 Blocks menu. - last_addr: - description: - - The last IPv4 address in the IPv4 addresses block. - - This is the To field in the UCS Manager Add IPv4 Blocks menu. - subnet_mask: - description: - - The subnet mask associated with the IPv4 addresses in the block. - default: 255.255.255.0 - default_gw: - description: - - The default gateway associated with the IPv4 addresses in the block. - default: 0.0.0.0 - primary_dns: - description: - - The primary DNS server that this block of IPv4 addresses should access. - default: 0.0.0.0 - secondary_dns: - description: - - The secondary DNS server that this block of IPv4 addresses should access. - default: 0.0.0.0 - ipv6_first_addr: - description: - - The first IPv6 address in the IPv6 addresses block. - - This is the From field in the UCS Manager Add IPv6 Blocks menu. - ipv6_last_addr: - description: - - The last IPv6 address in the IPv6 addresses block. - - This is the To field in the UCS Manager Add IPv6 Blocks menu. - ipv6_prefix: - description: - - The network address prefix associated with the IPv6 addresses in the block. - default: '64' - ipv6_default_gw: - description: - - The default gateway associated with the IPv6 addresses in the block. - default: '::' - ipv6_primary_dns: - description: - - The primary DNS server that this block of IPv6 addresses should access. - default: '::' - ipv6_secondary_dns: - description: - - The secondary DNS server that this block of IPv6 addresses should access. - default: '::' - org_dn: - description: - - Org dn (distinguished name) - default: org-root -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.5' -''' - -EXAMPLES = r''' -- name: Configure IPv4 address pools - ucs_ip_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: ip-A - order: sequential - first_addr: 192.168.0.10 - last_addr: 192.168.0.19 - subnet_mask: 255.255.255.0 - default_gw: 192.168.0.1 - primary_dns: 172.16.143.136 -- name: Configure IPv6 address pools - ucs_ip_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: ipv6-B - ipv6_first_addr: fe80::1cae:7992:d7a1:ed07 - ipv6_last_addr: fe80::1cae:7992:d7a1:edfe - ipv6_default_gw: fe80::1cae:7992:d7a1:ecff - -- name: Remove IPv4 address pools - ucs_ip_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: ip-A - state: absent -- name: Remove IPv6 address pools - ucs_ip_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: ipv6-B - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - org_dn=dict(type='str', default='org-root'), - name=dict(type='str', required=True), - descr=dict(type='str', default='', aliases=['descrption', 'description']), - order=dict(type='str', default='default', choices=['default', 'sequential']), - first_addr=dict(type='str'), - last_addr=dict(type='str'), - subnet_mask=dict(type='str', default='255.255.255.0'), - default_gw=dict(type='str', default='0.0.0.0'), - primary_dns=dict(type='str', default='0.0.0.0'), - secondary_dns=dict(type='str', default='0.0.0.0'), - ipv6_first_addr=dict(type='str'), - ipv6_last_addr=dict(type='str'), - ipv6_prefix=dict(type='str', default='64'), - ipv6_default_gw=dict(type='str', default='::'), - ipv6_primary_dns=dict(type='str', default='::'), - ipv6_secondary_dns=dict(type='str', default='::'), - state=dict(type='str', default='present', choices=['present', 'absent']), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - ) - # UCSModule verifies ucsmsdk is present and exits on failure. Imports are below ucs object creation. - ucs = UCSModule(module) - - err = False - - from ucsmsdk.mometa.ippool.IppoolPool import IppoolPool - from ucsmsdk.mometa.ippool.IppoolBlock import IppoolBlock - from ucsmsdk.mometa.ippool.IppoolIpV6Block import IppoolIpV6Block - - changed = False - try: - mo_exists = False - props_match = False - # dn is <org_dn>/ip-pool-<name> - dn = module.params['org_dn'] + '/ip-pool-' + module.params['name'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - - if module.params['state'] == 'absent': - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - changed = True - else: - if mo_exists: - # check top-level mo props - kwargs = dict(assignment_order=module.params['order']) - kwargs['descr'] = module.params['descr'] - if (mo.check_prop_match(**kwargs)): - # top-level props match, check next level mo/props - if module.params['last_addr'] and module.params['first_addr']: - # ipv4 block specified, check properties - block_dn = dn + '/block-' + module.params['first_addr'] + '-' + module.params['last_addr'] - mo_1 = ucs.login_handle.query_dn(block_dn) - if mo_1: - kwargs = dict(subnet=module.params['subnet_mask']) - kwargs['def_gw'] = module.params['default_gw'] - kwargs['prim_dns'] = module.params['primary_dns'] - kwargs['sec_dns'] = module.params['secondary_dns'] - if (mo_1.check_prop_match(**kwargs)): - # ipv4 block exists and properties match - props_match = True - else: - # no ipv4 block specified, but top-level props matched - props_match = True - - # only check ipv6 props if the top-level and ipv4 props matched - if props_match and module.params['ipv6_last_addr'] and module.params['ipv6_first_addr']: - # ipv6 block specified, check properties - block_dn = dn + '/v6block-' + module.params['ipv6_first_addr'].lower() + '-' + module.params['ipv6_last_addr'].lower() - mo_1 = ucs.login_handle.query_dn(block_dn) - if mo_1: - kwargs = dict(prefix=module.params['ipv6_prefix']) - kwargs['def_gw'] = module.params['ipv6_default_gw'] - kwargs['prim_dns'] = module.params['ipv6_primary_dns'] - kwargs['sec_dns'] = module.params['ipv6_secondary_dns'] - if (mo_1.check_prop_match(**kwargs)): - # ipv6 block exists and properties match - props_match = True - else: - # no ipv6 block specified, but previous checks matched - props_match = True - - if not props_match: - if not module.check_mode: - # create if mo does not already exist - mo = IppoolPool( - parent_mo_or_dn=module.params['org_dn'], - name=module.params['name'], - descr=module.params['descr'], - assignment_order=module.params['order'], - ) - - if module.params['last_addr'] and module.params['first_addr']: - mo_1 = IppoolBlock( - parent_mo_or_dn=mo, - to=module.params['last_addr'], - r_from=module.params['first_addr'], - subnet=module.params['subnet_mask'], - def_gw=module.params['default_gw'], - prim_dns=module.params['primary_dns'], - sec_dns=module.params['secondary_dns'], - ) - - if module.params['ipv6_last_addr'] and module.params['ipv6_first_addr']: - mo_1 = IppoolIpV6Block( - parent_mo_or_dn=mo, - to=module.params['ipv6_last_addr'], - r_from=module.params['ipv6_first_addr'], - prefix=module.params['ipv6_prefix'], - def_gw=module.params['ipv6_default_gw'], - prim_dns=module.params['ipv6_primary_dns'], - sec_dns=module.params['ipv6_secondary_dns'], - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - - changed = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_lan_connectivity.py b/lib/ansible/modules/remote_management/ucs/ucs_lan_connectivity.py deleted file mode 100644 index c226963fc7..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_lan_connectivity.py +++ /dev/null @@ -1,354 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_lan_connectivity -short_description: Configures LAN Connectivity Policies on Cisco UCS Manager -description: -- Configures LAN Connectivity Policies on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify LAN Connectivity Policies are present and will create if needed. - - If C(absent), will verify LAN Connectivity Policies are absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name of the LAN Connectivity Policy. - - This name can be between 1 and 16 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after the policy is created. - required: yes - description: - description: - - A description of the LAN Connectivity Policy. - - Cisco recommends including information about where and when to use the policy. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - vnic_list: - description: - - List of vNICs used by the LAN Connectivity Policy. - - vNICs used by the LAN Connectivity Policy must be created from a vNIC template. - suboptions: - name: - description: - - The name of the vNIC. - required: yes - vnic_template: - description: - - The name of the vNIC template. - required: yes - adapter_policy: - description: - - The name of the Ethernet adapter policy. - - A user defined policy can be used, or one of the system defined policies. - order: - description: - - String specifying the vNIC assignment order (e.g., '1', '2'). - default: 'unspecified' - state: - description: - - If C(present), will verify vnic is configured within policy. - If C(absent), will verify vnic is absent from policy. - choices: [ present, absent ] - default: present - version_added: '2.8' - iscsi_vnic_list: - description: - - List of iSCSI vNICs used by the LAN Connectivity Policy. - suboptions: - name: - description: - - The name of the iSCSI vNIC. - required: yes - overlay_vnic: - description: - - The LAN vNIC associated with this iSCSI vNIC. - iscsi_adapter_policy: - description: - - The iSCSI adapter policy associated with this iSCSI vNIC. - mac_address: - description: - - The MAC address associated with this iSCSI vNIC. - - If the MAC address is not set, Cisco UCS Manager uses a derived MAC address. - default: derived - vlan_name: - description: - - The VLAN used for the iSCSI vNIC. - default: default - state: - description: - - If C(present), will verify iscsi vnic is configured within policy. - If C(absent), will verify iscsi vnic is absent from policy. - choices: [ present, absent ] - default: present - version_added: '2.8' - org_dn: - description: - - Org dn (distinguished name) - default: org-root -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.5' -''' - -EXAMPLES = r''' -- name: Configure LAN Connectivity Policy - ucs_lan_connectivity: - hostname: 172.16.143.150 - username: admin - password: password - name: Cntr-FC-Boot - vnic_list: - - name: eno1 - vnic_template: Cntr-Template - adapter_policy: Linux - - name: eno2 - vnic_template: Container-NFS-A - adapter_policy: Linux - - name: eno3 - vnic_template: Container-NFS-B - adapter_policy: Linux - iscsi_vnic_list: - - name: iSCSIa - overlay_vnic: eno1 - iscsi_adapter_policy: default - vlan_name: Container-MGMT-VLAN - - name: iSCSIb - overlay_vnic: eno3 - iscsi_adapter_policy: default - vlan_name: Container-TNT-A-NFS - -- name: Remove LAN Connectivity Policy - ucs_lan_connectivity: - hostname: 172.16.143.150 - username: admin - password: password - name: Cntr-FC-Boot - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def configure_lan_connectivity(ucs, module, dn): - from ucsmsdk.mometa.vnic.VnicLanConnPolicy import VnicLanConnPolicy - from ucsmsdk.mometa.vnic.VnicEther import VnicEther - from ucsmsdk.mometa.vnic.VnicIScsiLCP import VnicIScsiLCP - from ucsmsdk.mometa.vnic.VnicVlan import VnicVlan - - if not module.check_mode: - try: - # create if mo does not already exist - mo = VnicLanConnPolicy( - parent_mo_or_dn=module.params['org_dn'], - name=module.params['name'], - descr=module.params['description'], - ) - - if module.params.get('vnic_list'): - for vnic in module.params['vnic_list']: - if vnic['state'] == 'absent': - child_dn = dn + '/ether-' + vnic['name'] - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - ucs.login_handle.remove_mo(mo_1) - else: # state == 'present' - mo_1 = VnicEther( - addr='derived', - parent_mo_or_dn=mo, - name=vnic['name'], - adaptor_profile_name=vnic['adapter_policy'], - nw_templ_name=vnic['vnic_template'], - order=vnic['order'], - ) - - if module.params.get('iscsi_vnic_list'): - for iscsi_vnic in module.params['iscsi_vnic_list']: - if iscsi_vnic['state'] == 'absent': - child_dn = dn + '/iscsi-' + iscsi_vnic['name'] - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - ucs.login_handle.remove_mo(mo_1) - else: # state == 'present' - mo_1 = VnicIScsiLCP( - parent_mo_or_dn=mo, - name=iscsi_vnic['name'], - adaptor_profile_name=iscsi_vnic['iscsi_adapter_policy'], - vnic_name=iscsi_vnic['overlay_vnic'], - addr=iscsi_vnic['mac_address'], - ) - VnicVlan( - parent_mo_or_dn=mo_1, - vlan_name=iscsi_vnic['vlan_name'], - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - except Exception as e: # generic Exception handling because SDK can throw a variety of exceptions - ucs.result['msg'] = "setup error: %s " % str(e) - module.fail_json(**ucs.result) - - ucs.result['changed'] = True - - -def check_vnic_props(ucs, module, dn): - props_match = True - - if module.params.get('vnic_list'): - # check vnicEther props - for vnic in module.params['vnic_list']: - child_dn = dn + '/ether-' + vnic['name'] - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - if vnic['state'] == 'absent': - props_match = False - break - else: # state == 'present' - kwargs = dict(adaptor_profile_name=vnic['adapter_policy']) - kwargs['order'] = vnic['order'] - kwargs['nw_templ_name'] = vnic['vnic_template'] - if not (mo_1.check_prop_match(**kwargs)): - props_match = False - break - else: # mo_1 did not exist - if vnic['state'] == 'present': - props_match = False - break - - return props_match - - -def check_iscsi_vnic_props(ucs, module, dn): - props_match = True - - if module.params.get('iscsi_vnic_list'): - # check vnicIScsiLCP props - for iscsi_vnic in module.params['iscsi_vnic_list']: - child_dn = dn + '/iscsi-' + iscsi_vnic['name'] - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - if iscsi_vnic['state'] == 'absent': - props_match = False - break - else: # state == 'present' - kwargs = dict(vnic_name=iscsi_vnic['overlay_vnic']) - kwargs['adaptor_profile_name'] = iscsi_vnic['iscsi_adapter_policy'] - kwargs['addr'] = iscsi_vnic['mac_address'] - if (mo_1.check_prop_match(**kwargs)): - # check vlan - child_dn = child_dn + '/vlan' - mo_2 = ucs.login_handle.query_dn(child_dn) - if mo_2: - kwargs = dict(vlan_name=iscsi_vnic['vlan_name']) - if not (mo_2.check_prop_match(**kwargs)): - props_match = False - break - else: # mo_1 props did not match - props_match = False - break - else: # mo_1 did not exist - if iscsi_vnic['state'] == 'present': - props_match = False - break - - return props_match - - -def check_lan_connecivity_props(ucs, module, mo, dn): - props_match = False - - # check top-level mo props - kwargs = dict(descr=module.params['description']) - if (mo.check_prop_match(**kwargs)): - # top-level props match, check next level mo/props - # check vnic 1st - props_match = check_vnic_props(ucs, module, dn) - - if props_match: - props_match = check_iscsi_vnic_props(ucs, module, dn) - - return props_match - - -def main(): - vnic = dict( - name=dict(type='str', required=True), - vnic_template=dict(type='str', required=True), - adapter_policy=dict(type='str', default=''), - order=dict(type='str', default='unspecified'), - state=dict(type='str', default='present', choices=['present', 'absent']), - ) - iscsi_vnic = dict( - name=dict(type='str', required=True), - overlay_vnic=dict(type='str', default=''), - iscsi_adapter_policy=dict(type='str', default=''), - mac_address=dict(type='str', default='derived'), - vlan_name=dict(type='str', default='default'), - state=dict(type='str', default='present', choices=['present', 'absent']), - ) - - argument_spec = ucs_argument_spec - argument_spec.update( - org_dn=dict(type='str', default='org-root'), - name=dict(type='str', required=True), - description=dict(type='str', aliases=['descr'], default=''), - vnic_list=dict(type='list', elements='dict', options=vnic), - iscsi_vnic_list=dict(type='list', elements='dict', options=iscsi_vnic), - state=dict(type='str', default='present', choices=['present', 'absent']), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - ) - ucs = UCSModule(module) - # UCSModule creation above verifies ucsmsdk is present and exits on failure. - # Additional imports are done below or in called functions. - - ucs.result['changed'] = False - props_match = False - # dn is <org_dn>/lan-conn-pol-<name> - dn = module.params['org_dn'] + '/lan-conn-pol-' + module.params['name'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - if module.params['state'] == 'absent': - # mo must exist but all properties do not have to match - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - ucs.result['changed'] = True - else: # state == 'present' - props_match = check_lan_connecivity_props(ucs, module, mo, dn) - - if module.params['state'] == 'present' and not props_match: - configure_lan_connectivity(ucs, module, dn) - - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_mac_pool.py b/lib/ansible/modules/remote_management/ucs/ucs_mac_pool.py deleted file mode 100644 index ddd9fcf871..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_mac_pool.py +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_mac_pool -short_description: Configures MAC address pools on Cisco UCS Manager -description: -- Configures MAC address pools and MAC address blocks on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify MAC pool is present and will create if needed. - - If C(absent), will verify MAC pool is absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name of the MAC pool. - - This name can be between 1 and 32 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after the MAC pool is created. - required: yes - description: - description: - - A description of the MAC pool. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr, descrption ] - order: - description: - - The Assignment Order field. - - "This can be one of the following:" - - "default - Cisco UCS Manager selects a random identity from the pool." - - "sequential - Cisco UCS Manager selects the lowest available identity from the pool." - choices: [default, sequential] - default: default - first_addr: - description: - - The first MAC address in the block of addresses. - - This is the From field in the UCS Manager MAC Blocks menu. - last_addr: - description: - - The last MAC address in the block of addresses. - - This is the To field in the UCS Manager Add MAC Blocks menu. - org_dn: - description: - - The distinguished name (dn) of the organization where the resource is assigned. - default: org-root -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.5' -''' - -EXAMPLES = r''' -- name: Configure MAC address pool - ucs_mac_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: mac-A - first_addr: 00:25:B5:00:66:00 - last_addr: 00:25:B5:00:67:F3 - order: sequential - -- name: Remove MAC address pool - ucs_mac_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: mac-A - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - org_dn=dict(type='str', default='org-root'), - name=dict(type='str', required=True), - descr=dict(type='str', default='', aliases=['description', 'descrption']), - order=dict(type='str', default='default', choices=['default', 'sequential']), - first_addr=dict(type='str'), - last_addr=dict(type='str'), - state=dict(default='present', choices=['present', 'absent'], type='str'), - ) - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - ) - # UCSModule verifies ucsmsdk is present and exits on failure. Imports are below ucs object creation. - ucs = UCSModule(module) - - err = False - - from ucsmsdk.mometa.macpool.MacpoolPool import MacpoolPool - from ucsmsdk.mometa.macpool.MacpoolBlock import MacpoolBlock - - changed = False - try: - mo_exists = False - props_match = False - # dn is <org_dn>/mac-pool-<name> - dn = module.params['org_dn'] + '/mac-pool-' + module.params['name'] - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - - if module.params['state'] == 'absent': - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - changed = True - else: - if mo_exists: - # check top-level mo props - kwargs = dict(assignment_order=module.params['order']) - kwargs['descr'] = module.params['descr'] - if (mo.check_prop_match(**kwargs)): - # top-level props match, check next level mo/props - if module.params['last_addr'] and module.params['first_addr']: - # mac address block specified, check properties - block_dn = dn + '/block-' + module.params['first_addr'].upper() + '-' + module.params['last_addr'].upper() - mo_1 = ucs.login_handle.query_dn(block_dn) - if mo_1: - props_match = True - else: - # no MAC address block specified, but top-level props matched - props_match = True - - if not props_match: - if not module.check_mode: - # create if mo does not already exist - mo = MacpoolPool( - parent_mo_or_dn=module.params['org_dn'], - name=module.params['name'], - descr=module.params['descr'], - assignment_order=module.params['order'], - ) - - if module.params['last_addr'] and module.params['first_addr']: - mo_1 = MacpoolBlock( - parent_mo_or_dn=mo, - to=module.params['last_addr'], - r_from=module.params['first_addr'], - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - changed = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_managed_objects.py b/lib/ansible/modules/remote_management/ucs/ucs_managed_objects.py deleted file mode 100644 index 965207af78..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_managed_objects.py +++ /dev/null @@ -1,263 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community'} - -DOCUMENTATION = r''' ---- -module: ucs_managed_objects -short_description: Configures Managed Objects on Cisco UCS Manager -description: -- Configures Managed Objects on Cisco UCS Manager. -- The Python SDK module, Python class within the module (UCSM Class), and all properties must be directly specified. -- More information on the UCSM Python SDK and how to directly configure Managed Objects is available at L(UCSM Python SDK,http://ucsmsdk.readthedocs.io/). -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify that the Managed Objects are present and will create if needed. - - If C(absent), will verify that the Managed Objects are absent and will delete if needed. - choices: [ absent, present ] - default: present - objects: - description: - - List of managed objects to configure. Each managed object has suboptions the specify the Python SDK module, class, and properties to configure. - suboptions: - module: - description: - - Name of the Python SDK module implementing the required class. - required: yes - class_name: - description: - - Name of the Python class that will be used to configure the Managed Object. - required: yes - properties: - description: - - List of properties to configure on the Managed Object. See the UCSM Python SDK for information on properties for each class. - required: yes - children: - description: - - Optional list of child objects. Each child has its own module, class, and properties suboptions. - - The parent_mo_or_dn property for child objects is automatically set as the list of children is configured. - required: yes -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.8' -''' - -EXAMPLES = r''' -- name: Configure Network Control Policy - ucs_managed_objects: - hostname: 172.16.143.150 - username: admin - password: password - objects: - - module: ucsmsdk.mometa.nwctrl.NwctrlDefinition - class: NwctrlDefinition - properties: - parent_mo_or_dn: org-root - cdp: enabled - descr: '' - lldp_receive: enabled - lldp_transmit: enabled - name: Enable-CDP-LLDP - -- name: Remove Network Control Policy - ucs_managed_objects: - hostname: 172.16.143.150 - username: admin - password: password - objects: - - module: ucsmsdk.mometa.nwctrl.NwctrlDefinition - class: NwctrlDefinition - properties: - parent_mo_or_dn: org-root - name: Enable-CDP-LLDP - state: absent - -- name: Configure Boot Policy Using JSON objects list with children - ucs_managed_objects: - hostname: 172.16.143.150 - username: admin - password: password - objects: - - { - "module": "ucsmsdk.mometa.lsboot.LsbootPolicy", - "class": "LsbootPolicy", - "properties": { - "parent_mo_or_dn": "org-root", - "name": "Python_SDS", - "enforce_vnic_name": "yes", - "boot_mode": "legacy", - "reboot_on_update": "no" - }, - "children": [ - { - "module": "ucsmsdk.mometa.lsboot.LsbootVirtualMedia", - "class": "LsbootVirtualMedia", - "properties": { - "access": "read-only-local", - "lun_id": "0", - "order": "2" - } - }, - { - "module": "ucsmsdk.mometa.lsboot.LsbootStorage", - "class": "LsbootStorage", - "properties": { - "order": "1" - }, - "children": [ - { - "module": "ucsmsdk.mometa.lsboot.LsbootLocalStorage", - "class": "LsbootLocalStorage", - "properties": {}, - "children": [ - { - "module": "ucsmsdk.mometa.lsboot.LsbootDefaultLocalImage", - "class": "LsbootDefaultLocalImage", - "properties": { - "order": "1" - } - } - ] - } - ] - } - ] - } - -- name: Remove Boot Policy Using JSON objects list - ucs_managed_objects: - hostname: 172.16.143.150 - username: admin - password: password - objects: - - { - "module": "ucsmsdk.mometa.lsboot.LsbootPolicy", - "class": "LsbootPolicy", - "properties": { - "parent_mo_or_dn": "org-root", - "name": "Python_SDS" - } - } - state: absent - - -''' - -RETURN = r''' -# -''' - -import traceback - -IMPORT_IMP_ERR = None -try: - from importlib import import_module - HAS_IMPORT_MODULE = True -except Exception: - IMPORT_IMP_ERR = traceback.format_exc() - HAS_IMPORT_MODULE = False - -from copy import deepcopy -import json -from ansible.module_utils.basic import AnsibleModule, missing_required_lib -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def traverse_objects(module, ucs, managed_object, mo=''): - props_match = False - - mo_module = import_module(managed_object['module']) - mo_class = getattr(mo_module, managed_object['class']) - - if not managed_object['properties'].get('parent_mo_or_dn'): - managed_object['properties']['parent_mo_or_dn'] = mo - - mo = mo_class(**managed_object['properties']) - - existing_mo = ucs.login_handle.query_dn(mo.dn) - - if module.params['state'] == 'absent': - # mo must exist, but all properties do not have to match - if existing_mo: - if not module.check_mode: - ucs.login_handle.remove_mo(existing_mo) - ucs.login_handle.commit() - ucs.result['changed'] = True - else: - if existing_mo: - # check mo props - kwargs = dict(managed_object['properties']) - # remove parent info and passwords because those aren't presented in the actual props - kwargs.pop('parent_mo_or_dn', None) - kwargs.pop('pwd', None) - kwargs.pop('password', None) - if existing_mo.check_prop_match(**kwargs): - props_match = True - - if not props_match: - if not module.check_mode: - try: - ucs.login_handle.add_mo(mo, modify_present=True) - ucs.login_handle.commit() - except Exception as e: - ucs.result['err'] = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = True - - if managed_object.get('children'): - for child in managed_object['children']: - # explicit deep copy of child object since traverse_objects may modify parent mo information - copy_of_child = deepcopy(child) - traverse_objects(module, ucs, copy_of_child, mo) - - -def main(): - object_dict = dict( - module=dict(type='str', required=True), - class_name=dict(type='str', aliases=['class'], required=True), - properties=dict(type='dict', required=True), - children=dict(type='list'), - ) - argument_spec = ucs_argument_spec - argument_spec.update( - objects=dict(type='list', elements='dict', options=object_dict, required=True), - state=dict(type='str', choices=['present', 'absent'], default='present'), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - ) - - if not HAS_IMPORT_MODULE: - module.fail_json(msg=missing_required_lib('importlib'), exception=IMPORT_IMP_ERR) - ucs = UCSModule(module) - - ucs.result['err'] = False - # note that all objects specified in the object list report a single result (including a single changed). - ucs.result['changed'] = False - - for managed_object in module.params['objects']: - traverse_objects(module, ucs, managed_object) - - if ucs.result['err']: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_ntp_server.py b/lib/ansible/modules/remote_management/ucs/ucs_ntp_server.py deleted file mode 100644 index 096c13915b..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_ntp_server.py +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_ntp_server -short_description: Configures NTP server on Cisco UCS Manager -extends_documentation_fragment: -- ucs -description: -- Configures NTP server on Cisco UCS Manager. -options: - state: - description: - - If C(absent), will remove an NTP server. - - If C(present), will add or update an NTP server. - choices: [absent, present] - default: present - - ntp_server: - description: - - NTP server IP address or hostname. - - Enter up to 63 characters that form a valid hostname. - - Enter a valid IPV4 Address. - aliases: [ name ] - default: "" - - description: - description: - - A user-defined description of the NTP server. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - default: "" - -requirements: -- ucsmsdk -author: -- John McDonough (@movinalot) -- CiscoUcs (@CiscoUcs) -version_added: "2.7" -''' - -EXAMPLES = r''' -- name: Configure NTP server - ucs_ntp_server: - hostname: 172.16.143.150 - username: admin - password: password - ntp_server: 10.10.10.10 - description: Internal NTP Server by IP address - state: present - -- name: Configure NTP server - ucs_ntp_server: - hostname: 172.16.143.150 - username: admin - password: password - ntp_server: pool.ntp.org - description: External NTP Server by hostname - state: present - -- name: Remove NTP server - ucs_ntp_server: - hostname: 172.16.143.150 - username: admin - password: password - ntp_server: 10.10.10.10 - state: absent - -- name: Remove NTP server - ucs_ntp_server: - hostname: 172.16.143.150 - username: admin - password: password - ntp_server: pool.ntp.org - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def run_module(): - argument_spec = ucs_argument_spec - argument_spec.update( - ntp_server=dict(type='str', aliases=['name']), - description=dict(type='str', aliases=['descr'], default=''), - state=dict(type='str', default='present', choices=['present', 'absent']), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - required_if=[ - ['state', 'present', ['ntp_server']], - ], - ) - # UCSModule verifies ucsmsdk is present and exits on failure. Imports are below ucs object creation. - ucs = UCSModule(module) - - err = False - - from ucsmsdk.mometa.comm.CommNtpProvider import CommNtpProvider - - changed = False - try: - mo_exists = False - props_match = False - - dn = 'sys/svc-ext/datetime-svc/ntp-' + module.params['ntp_server'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - - if module.params['state'] == 'absent': - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - changed = True - else: - if mo_exists: - # check top-level mo props - kwargs = dict(descr=module.params['description']) - if mo.check_prop_match(**kwargs): - props_match = True - - if not props_match: - if not module.check_mode: - # update/add mo - mo = CommNtpProvider(parent_mo_or_dn='sys/svc-ext/datetime-svc', - name=module.params['ntp_server'], - descr=module.params['description']) - ucs.login_handle.add_mo(mo, modify_present=True) - ucs.login_handle.commit() - changed = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -def main(): - run_module() - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_org.py b/lib/ansible/modules/remote_management/ucs/ucs_org.py deleted file mode 100644 index df0ba1961b..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_org.py +++ /dev/null @@ -1,225 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community'} - -DOCUMENTATION = r''' ---- -module: ucs_org - -short_description: Manages UCS Organizations for UCS Manager - -description: - - Manages UCS Organizations for UCS Manager. - -extends_documentation_fragment: ucs - -options: - state: - description: - - If C(absent), will remove organization. - - If C(present), will create or update organization. - choices: [absent, present] - default: present - type: str - - org_name: - description: - - The name of the organization. - - Enter up to 16 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ name ] - type: str - - parent_org_path: - description: - - A forward slash / separated hierarchical path from the root organization to the parent of the organization to be added or updated. - - UCS Manager supports a hierarchical structure of organizations up to five levels deep not including the root organization. - - For example the parent_org_path for an organization named level5 could be root/level1/level2/level3/level4/level5 - default: root - type: str - - description: - description: - - A user-defined description of the organization. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - type: str - - delegate_to: - description: - - Where the module will be run - default: localhost - type: str - -requirements: - - ucsmsdk - -author: - - John McDonough (@movinalot) - - CiscoUcs (@CiscoUcs) -version_added: "2.8" -''' - -EXAMPLES = r''' -- name: Add UCS Organization - ucs_org: - hostname: "{{ ucs_hostname }}" - username: "{{ ucs_username }}" - password: "{{ ucs_password }}" - org_name: test - description: testing org - state: present - delegate_to: localhost - -- name: Update UCS Organization - ucs_org: - hostname: "{{ ucs_hostname }}" - username: "{{ ucs_username }}" - password: "{{ ucs_password }}" - org_name: test - description: Testing org - state: present - delegate_to: localhost - -- name: Add UCS Organization - ucs_org: - hostname: "{{ ucs_hostname }}" - username: "{{ ucs_username }}" - password: "{{ ucs_password }}" - org_name: level1 - parent_org_path: root - description: level1 org - state: present - delegate_to: localhost - -- name: Add UCS Organization - ucs_org: - hostname: "{{ ucs_hostname }}" - username: "{{ ucs_username }}" - password: "{{ ucs_password }}" - org_name: level2 - parent_org_path: root/level1 - description: level2 org - state: present - -- name: Add UCS Organization - ucs_org: - hostname: "{{ ucs_hostname }}" - username: "{{ ucs_username }}" - password: "{{ ucs_password }}" - org_name: level3 - parent_org_path: root/level1/level2 - description: level3 org - state: present - -- name: Remove UCS Organization - ucs_org: - hostname: "{{ ucs_hostname }}" - username: "{{ ucs_username }}" - password: "{{ ucs_password }}" - org_name: level2 - parent_org_path: root/level1/ - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - org_name=dict(type='str', aliases=['name']), - parent_org_path=dict(type='str', default='root'), - description=dict(type='str', aliases=['descr']), - state=dict(type='str', default='present', choices=['present', 'absent']), - delegate_to=dict(type='str', default='localhost'), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - required_if=[ - ['state', 'present', ['org_name']], - ], - ) - - # UCSModule verifies ucsmsdk is present and exits on failure. - # Imports are below for UCS object creation. - ucs = UCSModule(module) - from ucsmsdk.mometa.org.OrgOrg import OrgOrg - - err = False - changed = False - requested_state = module.params['state'] - - kwargs = dict() - - if module.params['description'] is not None: - kwargs['descr'] = module.params['description'] - - try: - parent_org_dn = 'org-' + module.params['parent_org_path'].replace('/', '/org-') - dn = parent_org_dn + '/org-' + module.params['org_name'] - - mo = ucs.login_handle.query_dn(dn) - - # Determine state change - if mo: - # Object exists, if it should exist has anything changed? - if requested_state == 'present': - # Do some or all Object properties not match, that is a change - if not mo.check_prop_match(**kwargs): - changed = True - - # Object does not exist but should, that is a change - else: - if requested_state == 'present': - changed = True - - # Object exists but should not, that is a change - if mo and requested_state == 'absent': - changed = True - - # Apply state if not check_mode - if changed and not module.check_mode: - if requested_state == 'absent': - ucs.login_handle.remove_mo(mo) - else: - kwargs['parent_mo_or_dn'] = parent_org_dn - kwargs['name'] = module.params['org_name'] - if module.params['description'] is not None: - kwargs['descr'] = module.params['description'] - - mo = OrgOrg(**kwargs) - ucs.login_handle.add_mo(mo, modify_present=True) - ucs.login_handle.commit() - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_query.py b/lib/ansible/modules/remote_management/ucs/ucs_query.py deleted file mode 100644 index 0736e24ae0..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_query.py +++ /dev/null @@ -1,171 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community'} - -DOCUMENTATION = r''' ---- -module: ucs_query - -short_description: Queries UCS Manager objects by class or distinguished name - -description: - -Queries UCS Manager objects by class or distinguished name. - -extends_documentation_fragment: ucs - -options: - class_ids: - description: - - One or more UCS Manager Class IDs to query. - - As a comma separated list - type: str - - distinguished_names: - description: - - One or more UCS Manager Distinguished Names to query. - - As a comma separated list - type: str - - delegate_to: - description: - - Where the module will be run - default: localhost - type: str - -requirements: - - ucsmsdk - -author: - - John McDonough (@movinalot) - - CiscoUcs (@CiscoUcs) -version_added: "2.10" -''' - -EXAMPLES = r''' -- name: Query UCS Class ID - ucs_query: - hostname: "{{ ucs_hostname }}" - username: "{{ ucs_username }}" - password: "{{ ucs_password }}" - class_ids: computeBlade - delegate_to: localhost - -- name: Query UCS Class IDs - ucs_query: - hostname: "{{ ucs_hostname }}" - username: "{{ ucs_username }}" - password: "{{ ucs_password }}" - class_ids: computeBlade, fabricVlan - delegate_to: localhost - -- name: Query UCS Distinguished Name - ucs_query: - hostname: "{{ ucs_hostname }}" - username: "{{ ucs_username }}" - password: "{{ ucs_password }}" - distinguished_names: org-root - delegate_to: localhost - -- name: Query UCS Distinguished Names - ucs_query: - hostname: "{{ ucs_hostname }}" - username: "{{ ucs_username }}" - password: "{{ ucs_password }}" - distinguished_names: org-root, sys/rack-unit-1, sys/chassis-1/blade-2 - delegate_to: localhost -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def retrieve_class_id(class_id, ucs): - return ucs.login_handle.query_classid(class_id) - - -def retrieve_distinguished_name(distinguished_name, ucs): - return ucs.login_handle.query_dn(distinguished_name) - - -def make_mo_dict(ucs_mo): - obj_dict = {} - for mo_property in ucs_mo.prop_map.values(): - obj_dict[mo_property] = getattr(ucs_mo, mo_property) - return obj_dict - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - class_ids=dict(type='str'), - distinguished_names=dict(type='str'), - delegate_to=dict(type='str', default='localhost'), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=False, - mutually_exclusive=[ - ['class_ids', 'distinguished_names'], - ], - ) - - # UCSModule verifies ucsmsdk is present and exits on failure. - # Imports are below for UCS object creation. - ucs = UCSModule(module) - err = False - query_result = {} - - try: - if module.params['class_ids']: - class_ids = [ - x.strip() for x in module.params['class_ids'].split(',') - ] - for class_id in class_ids: - query_result[class_id] = [] - ucs_mos = retrieve_class_id(class_id, ucs) - if ucs_mos: - for ucs_mo in ucs_mos: - query_result[class_id].append(make_mo_dict(ucs_mo)) - - ucs.result['objects'] = query_result - - elif module.params['distinguished_names']: - distinguished_names = [ - x.strip() - for x in module.params['distinguished_names'].split(',') - ] - for distinguished_name in distinguished_names: - query_result[distinguished_name] = {} - ucs_mo = retrieve_distinguished_name(distinguished_name, ucs) - - if ucs_mo: - query_result[distinguished_name] = make_mo_dict(ucs_mo) - - ucs.result['objects'] = query_result - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - if err: - module.fail_json(**ucs.result) - - ucs.result['changed'] = False - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_san_connectivity.py b/lib/ansible/modules/remote_management/ucs/ucs_san_connectivity.py deleted file mode 100644 index 2f12092a58..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_san_connectivity.py +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_san_connectivity -short_description: Configures SAN Connectivity Policies on Cisco UCS Manager -description: -- Configures SAN Connectivity Policies on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify SAN Connectivity Policies are present and will create if needed. - - If C(absent), will verify SAN Connectivity Policies are absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name of the SAN Connectivity Policy. - - This name can be between 1 and 16 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after the policy is created. - required: yes - description: - description: - - A description of the policy. - - Cisco recommends including information about where and when to use the policy. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - wwnn_pool: - description: - - Name of the WWNN pool to use for WWNN assignment. - default: default - vhba_list: - description: - - List of vHBAs used by the SAN Connectivity Policy. - - vHBAs used by the SAN Connectivity Policy must be created from a vHBA template. - - "Each list element has the following suboptions:" - - "= name" - - " The name of the virtual HBA (required)." - - "= vhba_template" - - " The name of the virtual HBA template (required)." - - "- adapter_policy" - - " The name of the Fibre Channel adapter policy." - - " A user defined policy can be used, or one of the system defined policies (default, Linux, Solaris, VMware, Windows, WindowsBoot)" - - " [Default: default]" - - "- order" - - " String specifying the vHBA assignment order (e.g., '1', '2')." - - " [Default: unspecified]" - org_dn: - description: - - Org dn (distinguished name) - default: org-root -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.5' -''' - -EXAMPLES = r''' -- name: Configure SAN Connectivity Policy - ucs_san_connectivity: - hostname: 172.16.143.150 - username: admin - password: password - name: Cntr-FC-Boot - wwnn_pool: WWNN-Pool - vhba_list: - - name: Fabric-A - vhba_template: vHBA-Template-A - adapter_policy: Linux - - name: Fabric-B - vhba_template: vHBA-Template-B - adapter_policy: Linux - -- name: Remove SAN Connectivity Policy - ucs_san_connectivity: - hostname: 172.16.143.150 - username: admin - password: password - name: Cntr-FC-Boot - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - org_dn=dict(type='str', default='org-root'), - name=dict(type='str'), - descr=dict(type='str'), - wwnn_pool=dict(type='str', default='default'), - vhba_list=dict(type='list'), - state=dict(type='str', default='present', choices=['present', 'absent']), - san_connectivity_list=dict(type='list'), - ) - - # Note that use of san_connectivity_list is an experimental feature which allows multiple resource updates with a single UCSM connection. - # Support for san_connectivity_list may change or be removed once persistent UCS connections are supported. - # Either san_connectivity_list or name is required (user can specify either a list or single resource). - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - required_one_of=[ - ['san_connectivity_list', 'name'], - ], - mutually_exclusive=[ - ['san_connectivity_list', 'name'], - ], - ) - ucs = UCSModule(module) - - err = False - - from ucsmsdk.mometa.vnic.VnicSanConnPolicy import VnicSanConnPolicy - from ucsmsdk.mometa.vnic.VnicFcNode import VnicFcNode - from ucsmsdk.mometa.vnic.VnicFc import VnicFc - from ucsmsdk.mometa.vnic.VnicFcIf import VnicFcIf - - changed = False - try: - # Only documented use is a single resource, but to also support experimental - # feature allowing multiple updates all params are converted to a san_connectivity_list below. - - if module.params['san_connectivity_list']: - # directly use the list (single resource and list are mutually exclusive - san_connectivity_list = module.params['san_connectivity_list'] - else: - # single resource specified, create list from the current params - san_connectivity_list = [module.params] - for san_connectivity in san_connectivity_list: - mo_exists = False - props_match = False - # set default params. Done here to set values for lists which can't be done in the argument_spec - if not san_connectivity.get('descr'): - san_connectivity['descr'] = '' - if not san_connectivity.get('wwnn_pool'): - san_connectivity['wwnn_pool'] = 'default' - if san_connectivity.get('vhba_list'): - for vhba in san_connectivity['vhba_list']: - if not vhba.get('adapter_policy'): - vhba['adapter_policy'] = '' - if not vhba.get('order'): - vhba['order'] = 'unspecified' - # dn is <org_dn>/san-conn-pol-<name> - dn = module.params['org_dn'] + '/san-conn-pol-' + san_connectivity['name'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - # check top-level mo props - kwargs = dict(descr=san_connectivity['descr']) - if (mo.check_prop_match(**kwargs)): - # top-level props match, check next level mo/props - # vnicFcNode object - child_dn = dn + '/fc-node' - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - kwargs = dict(ident_pool_name=san_connectivity['wwnn_pool']) - if (mo_1.check_prop_match(**kwargs)): - if not san_connectivity.get('vhba_list'): - props_match = True - else: - # check vnicFc props - for vhba in san_connectivity['vhba_list']: - child_dn = dn + '/fc-' + vhba['name'] - mo_2 = ucs.login_handle.query_dn(child_dn) - kwargs = {} - kwargs['adaptor_profile_name'] = vhba['adapter_policy'] - kwargs['order'] = vhba['order'] - kwargs['nw_templ_name'] = vhba['vhba_template'] - if (mo_2.check_prop_match(**kwargs)): - props_match = True - - if module.params['state'] == 'absent': - # mo must exist but all properties do not have to match - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - changed = True - else: - if not props_match: - if not module.check_mode: - # create if mo does not already exist - mo = VnicSanConnPolicy( - parent_mo_or_dn=module.params['org_dn'], - name=san_connectivity['name'], - descr=san_connectivity['descr'], - ) - mo_1 = VnicFcNode( - parent_mo_or_dn=mo, - ident_pool_name=san_connectivity['wwnn_pool'], - addr='pool-derived', - ) - if san_connectivity.get('vhba_list'): - for vhba in san_connectivity['vhba_list']: - mo_2 = VnicFc( - parent_mo_or_dn=mo, - name=vhba['name'], - adaptor_profile_name=vhba['adapter_policy'], - nw_templ_name=vhba['vhba_template'], - order=vhba['order'], - ) - mo_2_1 = VnicFcIf( - parent_mo_or_dn=mo_2, - name='default', - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - changed = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_service_profile_template.py b/lib/ansible/modules/remote_management/ucs/ucs_service_profile_template.py deleted file mode 100644 index 8a900df837..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_service_profile_template.py +++ /dev/null @@ -1,516 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community'} - -DOCUMENTATION = r''' ---- -module: ucs_service_profile_template -short_description: Configures Service Profile Templates on Cisco UCS Manager -description: -- Configures Service Profile Templates on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify Service Profile Templates are present and will create if needed. - - If C(absent), will verify Service Profile Templates are absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name of the service profile template. - - This name can be between 2 and 32 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - This name must be unique across all service profiles and service profile templates within the same organization. - required: yes - template_type: - description: - - "The template type field which can be one of the following:" - - "initial-template — Any service profiles created from this template are not updated if the template changes." - - "updating-template — Any service profiles created from this template are updated if the template changes." - choices: [initial-template, updating-template] - default: initial-template - uuid_pool: - description: - - Specifies how the UUID will be set on a server associated with a service profile created from this template. - - "The uuid_pool option can be the name of the UUID pool to use or '' (the empty string)." - - An empty string will use the UUID assigned to the server by the manufacturer, and the - - UUID remains unassigned until a service profile created from this template is associated with a server. At that point, - - the UUID is set to the UUID value assigned to the server by the manufacturer. If the service profile is later moved to - - a different server, the UUID is changed to match the new server." - default: default - description: - description: - - A user-defined description of the service profile template. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - storage_profile: - description: - - The name of the storage profile you want to associate with service profiles created from this template - local_disk_policy: - description: - - The name of the local disk policy you want to associate with service profiles created from this template. - lan_connectivity_policy: - description: - - The name of the LAN connectivity policy you want to associate with service profiles created from this template. - iqn_pool: - description: - - The name of the IQN pool (initiator) you want to apply to all iSCSI vNICs for service profiles created from this template. - san_connectivity_policy: - description: - - The name of the SAN connectivity policy you want to associate with service profiles created from this template. - vmedia_policy: - description: - - The name of the vMedia policy you want to associate with service profiles created from this template. - boot_policy: - description: - - The name of the boot order policy you want to associate with service profiles created from this template. - default: default - maintenance_policy: - description: - - The name of the maintenance policy you want to associate with service profiles created from this template. - server_pool: - description: - - The name of the server pool you want to associate with this service profile template. - server_pool_qualification: - description: - - The name of the server pool policy qualification you want to use for this service profile template. - power_state: - description: - - The power state to be applied when a service profile created from this template is associated with a server. - choices: [up, down] - default: up - host_firmware_package: - description: - - The name of the host firmware package you want to associate with service profiles created from this template. - bios_policy: - description: - - The name of the BIOS policy you want to associate with service profiles created from this template. - ipmi_access_profile: - description: - - The name of the IPMI access profile you want to associate with service profiles created from this template. - sol_policy: - description: - - The name of the Serial over LAN (SoL) policy you want to associate with service profiles created from this template. - mgmt_ip_pool: - description: - - The name of the management IP pool you want to use with service profiles created from this template. - default: ext-mgmt - power_control_policy: - description: - - The name of the power control policy you want to associate with service profiles created from this template. - default: default - power_sync_policy: - description: - - The name of the power sync policy you want to associate with service profiles created from this template. - scrub_policy: - description: - - The name of the scrub policy you want to associate with service profiles created from this template. - kvm_mgmt_policy: - description: - - The name of the KVM management policy you want to associate with service profiles created from this template. - graphics_card_policy: - description: - - The name of the graphics card policy you want to associate with service profiles created from this template. - threshold_policy: - description: - - The name of the threshold policy you want to associate with service profiles created from this template. - default: default - user_label: - description: - - The User Label you want to assign to service profiles created from this template. - mgmt_interface_mode: - description: - - The Management Interface you want to assign to service profiles created from this template. - choices: ['', in-band] - mgmt_vnet_name: - description: - - A VLAN selected from the associated VLAN group. - mgmt_inband_pool_name: - description: - - How the inband management IPv4 address is derived for the server associated with this service profile. - org_dn: - description: - - Org dn (distinguished name) - default: org-root -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.8' -''' - -EXAMPLES = r''' -- name: Configure Service Profile Template with LAN/SAN Connectivity and all other options defaulted - ucs_service_profile_template: - hostname: 172.16.143.150 - username: admin - password: password - name: DEE-Ctrl - template_type: updating-template - uuid_pool: UUID-Pool - storage_profile: DEE-StgProf - lan_connectivity_policy: Cntr-FC-Boot - iqn_pool: iSCSI-Boot-A - san_connectivity_policy: Cntr-FC-Boot - boot_policy: DEE-vMedia - maintenance_policy: default - server_pool: Container-Pool - host_firmware_package: 3.1.2b - bios_policy: Docker - -- name: Remove Service Profile Template - ucs_service_profile_template: - hostname: 172.16.143.150 - username: admin - password: password - name: DEE-Ctrl - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def configure_service_profile_template(ucs, module): - from ucsmsdk.mometa.ls.LsServer import LsServer - from ucsmsdk.mometa.vnic.VnicConnDef import VnicConnDef - from ucsmsdk.mometa.vnic.VnicIScsiNode import VnicIScsiNode - from ucsmsdk.mometa.ls.LsRequirement import LsRequirement - from ucsmsdk.mometa.ls.LsPower import LsPower - from ucsmsdk.mometa.lstorage.LstorageProfileBinding import LstorageProfileBinding - from ucsmsdk.mometa.mgmt.MgmtInterface import MgmtInterface - from ucsmsdk.mometa.mgmt.MgmtVnet import MgmtVnet - from ucsmsdk.mometa.vnic.VnicIpV4MgmtPooledAddr import VnicIpV4MgmtPooledAddr - - if not module.check_mode: - try: - # create if mo does not already exist - mo = LsServer( - parent_mo_or_dn=module.params['org_dn'], - bios_profile_name=module.params['bios_policy'], - boot_policy_name=module.params['boot_policy'], - descr=module.params['description'], - ext_ip_state='pooled', - ext_ip_pool_name=module.params['mgmt_ip_pool'], - # graphics_card_policy_name=module.params['graphics_card_policy'], - host_fw_policy_name=module.params['host_firmware_package'], - ident_pool_name=module.params['uuid_pool'], - kvm_mgmt_policy_name=module.params['kvm_mgmt_policy'], - local_disk_policy_name=module.params['local_disk_policy'], - maint_policy_name=module.params['maintenance_policy'], - mgmt_access_policy_name=module.params['ipmi_access_profile'], - name=module.params['name'], - power_policy_name=module.params['power_control_policy'], - power_sync_policy_name=module.params['power_sync_policy'], - scrub_policy_name=module.params['scrub_policy'], - sol_policy_name=module.params['sol_policy'], - stats_policy_name=module.params['threshold_policy'], - type=module.params['template_type'], - usr_lbl=module.params['user_label'], - vmedia_policy_name=module.params['vmedia_policy'], - ) - - if module.params['storage_profile']: - # Storage profile - mo_1 = LstorageProfileBinding( - parent_mo_or_dn=mo, - storage_profile_name=module.params['storage_profile'], - ) - - if module.params['mgmt_interface_mode']: - # Management Interface - mo_1 = MgmtInterface( - parent_mo_or_dn=mo, - mode=module.params['mgmt_interface_mode'], - ip_v4_state='pooled', - ) - mo_2 = MgmtVnet( - parent_mo_or_dn=mo_1, - id='1', - name=module.params['mgmt_vnet_name'], - ) - VnicIpV4MgmtPooledAddr( - parent_mo_or_dn=mo_2, - name=module.params['mgmt_inband_pool_name'], - ) - - # LAN/SAN connectivity policy - mo_1 = VnicConnDef( - parent_mo_or_dn=mo, - lan_conn_policy_name=module.params['lan_connectivity_policy'], - san_conn_policy_name=module.params['san_connectivity_policy'], - ) - - if module.params['iqn_pool']: - # IQN pool - mo_1 = VnicIScsiNode( - parent_mo_or_dn=mo, - iqn_ident_pool_name=module.params['iqn_pool'] - ) - - # power state - admin_state = 'admin-' + module.params['power_state'] - mo_1 = LsPower( - parent_mo_or_dn=mo, - state=admin_state, - ) - - if module.params['server_pool']: - # server pool - mo_1 = LsRequirement( - parent_mo_or_dn=mo, - name=module.params['server_pool'], - qualifier=module.params['server_pool_qualification'], - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - except Exception as e: # generic Exception handling because SDK can throw a variety of exceptions - ucs.result['msg'] = "setup error: %s " % str(e) - module.fail_json(**ucs.result) - - ucs.result['changed'] = True - - -def check_storage_profile_props(ucs, module, dn): - props_match = False - - child_dn = dn + '/profile-binding' - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - kwargs = dict(storage_profile_name=module.params['storage_profile']) - if mo_1.check_prop_match(**kwargs): - props_match = True - elif not module.params['storage_profile']: - # no storage profile mo or desired state - props_match = True - - return props_match - - -def check_connectivity_policy_props(ucs, module, dn): - props_match = False - - child_dn = dn + '/conn-def' - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - kwargs = dict(lan_conn_policy_name=module.params['lan_connectivity_policy']) - kwargs['san_conn_policy_name'] = module.params['san_connectivity_policy'] - if mo_1.check_prop_match(**kwargs): - props_match = True - elif not module.params['lan_connectivity_policy'] and not module.params['san_connectivity_policy']: - # no mo and no desired state - props_match = True - - return props_match - - -def check_iqn_pool_props(ucs, module, dn): - props_match = False - - child_dn = dn + '/iscsi-node' - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - kwargs = dict(iqn_ident_pool_name=module.params['iqn_pool']) - if mo_1.check_prop_match(**kwargs): - props_match = True - elif not module.params['iqn_pool']: - # no mo and no desired state - props_match = True - - return props_match - - -def check_inband_management_props(ucs, module, dn): - props_match = False - - child_dn = dn + '/iface-in-band' - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - kwargs = dict(mode=module.params['mgmt_interface_mode']) - if mo_1.check_prop_match(**kwargs): - child_dn = child_dn + '/network' - mo_2 = ucs.login_handle.query_dn(child_dn) - if mo_2: - kwargs = dict(name=module.params['mgmt_vnet_name']) - if mo_2.check_prop_match(**kwargs): - child_dn = child_dn + '/ipv4-pooled-addr' - mo_3 = ucs.login_handle.query_dn(child_dn) - if mo_3: - kwargs = dict(name=module.params['mgmt_inband_pool_name']) - if mo_3.check_prop_match(**kwargs): - props_match = True - elif not module.params['mgmt_interface_mode']: - # no mo and no desired state - props_match = True - - return props_match - - -def check_power_props(ucs, module, dn): - props_match = False - - child_dn = dn + '/power' - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - kwargs = dict(state=module.params['power_state']) - if mo_1.check_prop_match(**kwargs): - props_match = True - elif not module.params['power_state']: - # no mo and no desired state - props_match = True - - return props_match - - -def check_server_pool(ucs, module, dn): - props_match = False - - child_dn = dn + '/pn-req' - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - kwargs = dict(name=module.params['server_pool']) - kwargs['qualifier'] = module.params['server_pool_qualification'] - if mo_1.check_prop_match(**kwargs): - props_match = True - elif not module.params['server_pool']: - # no pn-req object and no server pool name provided - props_match = True - - return props_match - - -def check_serivce_profile_templates_props(ucs, module, mo, dn): - props_match = False - - # check top-level mo props - kwargs = dict(bios_profile_name=module.params['bios_policy']) - kwargs['boot_policy_name'] = module.params['boot_policy'] - kwargs['descr'] = module.params['description'] - kwargs['ext_ip_pool_name'] = module.params['mgmt_ip_pool'] - # kwargs['graphics_card_policy_name'] = module.params['graphics_card_policy'] - kwargs['host_fw_policy_name'] = module.params['host_firmware_package'] - kwargs['ident_pool_name'] = module.params['uuid_pool'] - kwargs['kvm_mgmt_policy_name'] = module.params['kvm_mgmt_policy'] - kwargs['local_disk_policy_name'] = module.params['local_disk_policy'] - kwargs['maint_policy_name'] = module.params['maintenance_policy'] - kwargs['mgmt_access_policy_name'] = module.params['ipmi_access_profile'] - kwargs['power_policy_name'] = module.params['power_control_policy'] - kwargs['power_sync_policy_name'] = module.params['power_sync_policy'] - kwargs['scrub_policy_name'] = module.params['scrub_policy'] - kwargs['sol_policy_name'] = module.params['sol_policy'] - kwargs['stats_policy_name'] = module.params['threshold_policy'] - kwargs['type'] = module.params['template_type'] - kwargs['usr_lbl'] = module.params['user_label'] - kwargs['vmedia_policy_name'] = module.params['vmedia_policy'] - - if mo.check_prop_match(**kwargs): - # top-level props match, check next level mo/props - # code below should discontinue checks once any mismatch is found - - # check storage profile 1st - props_match = check_storage_profile_props(ucs, module, dn) - - if props_match: - props_match = check_connectivity_policy_props(ucs, module, dn) - - if props_match: - props_match = check_iqn_pool_props(ucs, module, dn) - - if props_match: - props_match = check_inband_management_props(ucs, module, dn) - - if props_match: - props_match = check_power_props(ucs, module, dn) - - if props_match: - props_match = check_server_pool(ucs, module, dn) - - return props_match - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - org_dn=dict(type='str', default='org-root'), - name=dict(type='str', required=True), - bios_policy=dict(type='str', default=''), - boot_policy=dict(type='str', default='default'), - description=dict(type='str', aliases=['descr'], default=''), - mgmt_ip_pool=dict(type='str', default='ext-mgmt'), - graphics_card_policy=dict(type='str', default=''), - host_firmware_package=dict(type='str', default=''), - uuid_pool=dict(type='str', default='default'), - kvm_mgmt_policy=dict(type='str', default=''), - local_disk_policy=dict(type='str', default=''), - maintenance_policy=dict(type='str', default=''), - ipmi_access_profile=dict(type='str', default=''), - power_control_policy=dict(type='str', default='default'), - power_sync_policy=dict(type='str', default=''), - scrub_policy=dict(type='str', default=''), - sol_policy=dict(type='str', default=''), - threshold_policy=dict(type='str', default='default'), - template_type=dict(type='str', default='initial-template', choices=['initial-template', 'updating-template']), - user_label=dict(type='str', default=''), - vmedia_policy=dict(type='str', default=''), - storage_profile=dict(type='str', default=''), - lan_connectivity_policy=dict(type='str', default=''), - iqn_pool=dict(type='str', default=''), - san_connectivity_policy=dict(type='str', default=''), - server_pool=dict(type='str', default=''), - server_pool_qualification=dict(type='str', default=''), - power_state=dict(type='str', default='up', choices=['up', 'down']), - mgmt_interface_mode=dict(type='str', default='', choices=['', 'in-band']), - mgmt_vnet_name=dict(type='str', default=''), - mgmt_inband_pool_name=dict(type='str', default=''), - state=dict(type='str', default='present', choices=['present', 'absent']), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - ) - ucs = UCSModule(module) - # UCSModule creation above verifies ucsmsdk is present and exits on failure. - # Additional imports are done below or in called functions. - - ucs.result['changed'] = False - props_match = False - # dn is <org_dn>/ls-<name> - dn = module.params['org_dn'] + '/ls-' + module.params['name'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - if module.params['state'] == 'absent': - # mo must exist but all properties do not have to match - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - ucs.result['changed'] = True - else: # state == 'present' - props_match = check_serivce_profile_templates_props(ucs, module, mo, dn) - - if module.params['state'] == 'present' and not props_match: - configure_service_profile_template(ucs, module) - - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_storage_profile.py b/lib/ansible/modules/remote_management/ucs/ucs_storage_profile.py deleted file mode 100644 index 7e1121fdcc..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_storage_profile.py +++ /dev/null @@ -1,253 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_storage_profile -short_description: Configures storage profiles on Cisco UCS Manager -description: -- Configures storage profiles on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify that the storage profile is present and will create if needed. - - If C(absent), will verify that the storage profile is absent and will delete if needed. - choices: [ absent, present ] - default: present - name: - description: - - The name of the storage profile. - - This name can be between 1 and 16 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after profile is created. - required: yes - description: - description: - - The user-defined description of the storage profile. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - local_luns: - description: - - List of Local LUNs used by the storage profile. - suboptions: - name: - description: - - The name of the local LUN. - required: yes - size: - description: - - Size of this LUN in GB. - - The size can range from 1 to 10240 GB. - default: '1' - auto_deploy: - description: - - Whether the local LUN should be automatically deployed or not. - choices: [ auto-deploy, no-auto-deploy ] - default: auto-deploy - expand_to_avail: - description: - - Specifies that this LUN can be expanded to use the entire available disk group. - - For each service profile, only one LUN can use this option. - - Expand To Available option is not supported for already deployed LUN. - type: bool - default: 'no' - fractional_size: - description: - - Fractional size of this LUN in MB. - default: '0' - disk_policy_name: - description: - - The disk group configuration policy to be applied to this local LUN. - state: - description: - - If C(present), will verify local LUN is present on profile. - If C(absent), will verify local LUN is absent on profile. - choices: [ absent, present ] - default: present - org_dn: - description: - - The distinguished name (dn) of the organization where the resource is assigned. - default: org-root -requirements: -- ucsmsdk -author: -- Sindhu Sudhir (@sisudhir) -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.7' -''' - -EXAMPLES = r''' -- name: Configure Storage Profile - ucs_storage_profile: - hostname: 172.16.143.150 - username: admin - password: password - name: DEE-StgProf - local_luns: - - name: Boot-LUN - size: '60' - disk_policy_name: DEE-DG - - name: Data-LUN - size: '200' - disk_policy_name: DEE-DG - -- name: Remove Storage Profile - ucs_storage_profile: - hostname: 172.16.143.150 - username: admin - password: password - name: DEE-StgProf - state: absent - -- name: Remove Local LUN from Storage Profile - ucs_storage_profile: - hostname: 172.16.143.150 - username: admin - password: password - name: DEE-StgProf - local_luns: - - name: Data-LUN - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - local_lun = dict( - name=dict(type='str', required=True), - state=dict(type='str', default='present', choices=['present', 'absent']), - size=dict(type='str', default='1'), - auto_deploy=dict(type='str', default='auto-deploy', choices=['auto-deploy', 'no-auto-deploy']), - expand_to_avail=dict(type='str', default='no', choices=['no', 'yes']), - fractional_size=dict(type='str', default='0'), - disk_policy_name=dict(type='str', default=''), - ) - argument_spec = ucs_argument_spec - argument_spec.update( - org_dn=dict(type='str', default='org-root'), - name=dict(type='str', required=True), - description=dict(type='str', aliases=['descr'], default=''), - local_luns=dict(type='list', elements='dict', options=local_lun), - state=dict(type='str', default='present', choices=['present', 'absent']), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - ) - ucs = UCSModule(module) - - err = False - - # UCSModule creation above verifies ucsmsdk is present and exits on failure. Additional imports are done below. - from ucsmsdk.mometa.lstorage.LstorageProfile import LstorageProfile - from ucsmsdk.mometa.lstorage.LstorageDasScsiLun import LstorageDasScsiLun - - ucs.result['changed'] = False - try: - mo_exists = False - props_match = False - # dn is <org_dn>/profile-<name> - dn = module.params['org_dn'] + '/profile-' + module.params['name'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - - if module.params['state'] == 'absent': - # mo must exist but all properties do not have to match - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - ucs.result['changed'] = True - else: - if mo_exists: - # check top-level mo props - kwargs = dict(descr=module.params['description']) - if mo.check_prop_match(**kwargs): - # top-level props match, check next level mo/props - if not module.params.get('local_luns'): - props_match = True - else: - # check local lun props - for lun in module.params['local_luns']: - child_dn = dn + '/das-scsi-lun-' + lun['name'] - mo_1 = ucs.login_handle.query_dn(child_dn) - if lun['state'] == 'absent': - if mo_1: - props_match = False - break - else: - if mo_1: - kwargs = dict(size=str(lun['size'])) - kwargs['auto_deploy'] = lun['auto_deploy'] - kwargs['expand_to_avail'] = lun['expand_to_avail'] - kwargs['fractional_size'] = str(lun['fractional_size']) - kwargs['local_disk_policy_name'] = lun['disk_policy_name'] - if mo_1.check_prop_match(**kwargs): - props_match = True - else: - props_match = False - break - - if not props_match: - if not module.check_mode: - # create if mo does not already exist - mo = LstorageProfile( - parent_mo_or_dn=module.params['org_dn'], - name=module.params['name'], - descr=module.params['description'], - ) - - if module.params.get('local_luns'): - for lun in module.params['local_luns']: - if lun['state'] == 'absent': - child_dn = dn + '/das-scsi-lun-' + lun['name'] - mo_1 = ucs.login_handle.query_dn(child_dn) - ucs.login_handle.remove_mo(mo_1) - else: - mo_1 = LstorageDasScsiLun( - parent_mo_or_dn=mo, - name=lun['name'], - size=str(lun['size']), - auto_deploy=lun['auto_deploy'], - expand_to_avail=lun['expand_to_avail'], - fractional_size=str(lun['fractional_size']), - local_disk_policy_name=lun['disk_policy_name'], - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - ucs.result['changed'] = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_timezone.py b/lib/ansible/modules/remote_management/ucs/ucs_timezone.py deleted file mode 100644 index 9abf83718e..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_timezone.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_timezone -short_description: Configures timezone on Cisco UCS Manager -description: -- Configures timezone on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(absent), will unset timezone. - - If C(present), will set or update timezone. - choices: [absent, present] - default: present - - admin_state: - description: - - The admin_state setting - - The enabled admin_state indicates the timezone configuration is utilized by UCS Manager. - - The disabled admin_state indicates the timezone configuration is ignored by UCS Manager. - choices: [disabled, enabled] - default: enabled - - description: - description: - - A user-defined description of the timezone. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - default: "" - - timezone: - description: - - The timezone name. - - Time zone names are from the L(tz database,https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) - - The timezone name is case sensitive. - - The timezone name can be between 0 and 510 alphanumeric characters. - - You cannot use spaces or any special characters other than - - "\"-\" (hyphen), \"_\" (underscore), \"/\" (backslash)." - -requirements: -- ucsmsdk -author: -- John McDonough (@movinalot) -- CiscoUcs (@CiscoUcs) -version_added: '2.7' -''' - -EXAMPLES = r''' -- name: Configure Time Zone - ucs_timezone: - hostname: 172.16.143.150 - username: admin - password: password - state: present - admin_state: enabled - timezone: America/Los_Angeles - description: 'Time Zone for Los Angeles' - -- name: Unconfigure Time Zone - ucs_timezone: - hostname: 172.16.143.150 - username: admin - password: password - state: absent - admin_state: disabled -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def run_module(): - argument_spec = ucs_argument_spec - argument_spec.update( - timezone=dict(type='str'), - description=dict(type='str', aliases=['descr'], default=''), - admin_state=dict(type='str', default='enabled', choices=['disabled', 'enabled']), - state=dict(type='str', default='present', choices=['present', 'absent']), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - required_if=[ - ['state', 'present', ['timezone']], - ], - ) - ucs = UCSModule(module) - - err = False - - changed = False - try: - mo_exists = False - props_match = False - - dn = 'sys/svc-ext/datetime-svc' - - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - - if module.params['state'] == 'absent': - # mo must exist but all properties do not have to match - if mo_exists: - if not module.check_mode: - mo.timezone = "" - mo.descr = "" - ucs.login_handle.add_mo(mo, modify_present=True) - ucs.login_handle.commit() - changed = True - else: - if mo_exists: - # check top-level mo props - kwargs = dict(descr=module.params['description']) - kwargs['timezone'] = module.params['timezone'] - kwargs['admin_state'] = module.params['admin_state'] - if mo.check_prop_match(**kwargs): - props_match = True - - if not props_match: - if not module.check_mode: - # update mo, timezone mo always exists - mo.timezone = module.params['timezone'] - mo.descr = module.params['description'] - mo.admin_state = module.params['admin_state'] - ucs.login_handle.add_mo(mo, modify_present=True) - ucs.login_handle.commit() - changed = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -def main(): - run_module() - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_uuid_pool.py b/lib/ansible/modules/remote_management/ucs/ucs_uuid_pool.py deleted file mode 100644 index b2a67569cf..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_uuid_pool.py +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_uuid_pool -short_description: Configures server UUID pools on Cisco UCS Manager -description: -- Configures server UUID pools and UUID blocks on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify UUID pool is present and will create if needed. - - If C(absent), will verify UUID pool is absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name of the UUID pool. - - This name can be between 1 and 32 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after the UUID pool is created. - required: yes - description: - description: - - "The user-defined description of the UUID pool." - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - prefix: - description: - - UUID prefix used for the range of server UUIDs. - - "If no value is provided, the system derived prefix will be used (equivalent to selecting 'derived' option in UI)." - - "If the user provides a value, the user provided prefix will be used (equivalent to selecting 'other' option in UI)." - - A user provided value should be in the format XXXXXXXX-XXXX-XXXX. - order: - description: - - The Assignment Order field. - - "This can be one of the following:" - - "default - Cisco UCS Manager selects a random identity from the pool." - - "sequential - Cisco UCS Manager selects the lowest available identity from the pool." - choices: [default, sequential] - default: default - first_uuid: - description: - - The first UUID in the block of UUIDs. - - This is the From field in the UCS Manager UUID Blocks menu. - last_uuid: - description: - - The last UUID in the block of UUIDs. - - This is the To field in the UCS Manager Add UUID Blocks menu. - org_dn: - description: - - The distinguished name (dn) of the organization where the resource is assigned. - default: org-root -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.7' -''' - -EXAMPLES = r''' -- name: Configure UUID address pool - ucs_uuid_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: UUID-Pool - order: sequential - first_uuid: 0000-000000000001 - last_uuid: 0000-000000000078 - -- name: Remove UUID address pool - ucs_uuid_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: UUID-Pool - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - org_dn=dict(type='str', default='org-root'), - name=dict(type='str', required=True), - description=dict(type='str', aliases=['descr'], default=''), - order=dict(type='str', default='default', choices=['default', 'sequential']), - prefix=dict(type='str', default=''), - first_uuid=dict(type='str'), - last_uuid=dict(type='str'), - state=dict(default='present', choices=['present', 'absent'], type='str'), - ) - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - ) - # UCSModule verifies ucsmsdk is present and exits on failure. Imports are below ucs object creation. - ucs = UCSModule(module) - - err = False - - from ucsmsdk.mometa.uuidpool.UuidpoolPool import UuidpoolPool - from ucsmsdk.mometa.uuidpool.UuidpoolBlock import UuidpoolBlock - - ucs.result['changed'] = False - try: - mo_exists = False - props_match = False - # dn is <org_dn>/uuid-pool-<name> - dn = module.params['org_dn'] + '/uuid-pool-' + module.params['name'] - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - - if module.params['state'] == 'absent': - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - ucs.result['changed'] = True - else: - if mo_exists: - # check top-level mo props - kwargs = dict(assignment_order=module.params['order']) - kwargs['descr'] = module.params['description'] - if module.params['prefix']: - kwargs['prefix'] = module.params['prefix'] - if mo.check_prop_match(**kwargs): - # top-level props match, check next level mo/props - if module.params['last_uuid'] and module.params['first_uuid']: - # uuid address block specified, check properties - block_dn = dn + '/block-from-' + module.params['first_uuid'].upper() + '-to-' + module.params['last_uuid'].upper() - mo_1 = ucs.login_handle.query_dn(block_dn) - if mo_1: - props_match = True - else: - # no UUID address block specified, but top-level props matched - props_match = True - - if not props_match: - if not module.check_mode: - # create if mo does not already exist - if not module.params['prefix']: - module.params['prefix'] = 'derived' - mo = UuidpoolPool( - parent_mo_or_dn=module.params['org_dn'], - name=module.params['name'], - descr=module.params['description'], - assignment_order=module.params['order'], - prefix=module.params['prefix'] - ) - - if module.params['last_uuid'] and module.params['first_uuid']: - mo_1 = UuidpoolBlock( - parent_mo_or_dn=mo, - to=module.params['last_uuid'], - r_from=module.params['first_uuid'], - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - ucs.result['changed'] = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_vhba_template.py b/lib/ansible/modules/remote_management/ucs/ucs_vhba_template.py deleted file mode 100644 index 4572562d28..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_vhba_template.py +++ /dev/null @@ -1,273 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_vhba_template -short_description: Configures vHBA templates on Cisco UCS Manager -description: -- Configures vHBA templates on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify vHBA templates are present and will create if needed. - - If C(absent), will verify vHBA templates are absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name of the virtual HBA template. - - This name can be between 1 and 16 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after the template is created. - required: yes - description: - description: - - A user-defined description of the template. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - fabric: - description: - - The Fabric ID field. - - The name of the fabric interconnect that vHBAs created with this template are associated with. - choices: [A, B] - default: A - redundancy_type: - description: - - The Redundancy Type used for template pairing from the Primary or Secondary redundancy template. - - "primary — Creates configurations that can be shared with the Secondary template." - - Any other shared changes on the Primary template are automatically synchronized to the Secondary template. - - "secondary — All shared configurations are inherited from the Primary template." - - "none - Legacy vHBA template behavior. Select this option if you do not want to use redundancy." - choices: [none, primary, secondary] - default: none - vsan: - description: - - The VSAN to associate with vHBAs created from this template. - default: default - template_type: - description: - - The Template Type field. - - "This can be one of the following:" - - "initial-template — vHBAs created from this template are not updated if the template changes." - - "updating-template - vHBAs created from this template are updated if the template changes." - choices: [initial-template, updating-template] - default: initial-template - max_data: - description: - - The Max Data Field Size field. - - The maximum size of the Fibre Channel frame payload bytes that the vHBA supports. - - Enter an string between '256' and '2112'. - default: '2048' - wwpn_pool: - description: - - The WWPN pool that a vHBA created from this template uses to derive its WWPN address. - default: default - qos_policy: - description: - - The QoS policy that is associated with vHBAs created from this template. - pin_group: - description: - - The SAN pin group that is associated with vHBAs created from this template. - stats_policy: - description: - - The statistics collection policy that is associated with vHBAs created from this template. - default: default - org_dn: - description: - - Org dn (distinguished name) - default: org-root -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.5' -''' - -EXAMPLES = r''' -- name: Configure vHBA template - ucs_vhba_template: - hostname: 172.16.143.150 - username: admin - password: password - name: vHBA-A - fabric: A - vsan: VSAN-A - wwpn_pool: WWPN-Pool-A - -- name: Remote vHBA template - ucs_vhba_template: - hostname: 172.16.143.150 - username: admin - password: password - name: vHBA-A - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - org_dn=dict(type='str', default='org-root'), - name=dict(type='str'), - descr=dict(type='str'), - fabric=dict(type='str', default='A', choices=['A', 'B']), - redundancy_type=dict(type='str', default='none', choices=['none', 'primary', 'secondary']), - vsan=dict(type='str', default='default'), - template_type=dict(type='str', default='initial-template', choices=['initial-template', 'updating-template']), - max_data=dict(type='str', default='2048'), - wwpn_pool=dict(type='str', default='default'), - qos_policy=dict(type='str'), - pin_group=dict(type='str'), - stats_policy=dict(type='str', default='default'), - state=dict(type='str', default='present', choices=['present', 'absent']), - vhba_template_list=dict(type='list'), - ) - - # Note that use of vhba_template_list is an experimental feature which allows multiple resource updates with a single UCSM connection. - # Support for vhba_template_list may change or be removed once persistent UCS connections are supported. - # Either vhba_template_list or name is required (user can specify either a list of single resource). - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - required_one_of=[ - ['vhba_template_list', 'name'] - ], - mutually_exclusive=[ - ['vhba_template_list', 'name'] - ], - ) - ucs = UCSModule(module) - - err = False - - from ucsmsdk.mometa.vnic.VnicSanConnTempl import VnicSanConnTempl - from ucsmsdk.mometa.vnic.VnicFcIf import VnicFcIf - - changed = False - try: - # Only documented use is a single resource, but to also support experimental - # feature allowing multiple updates all params are converted to a vhba_template_list below. - - if module.params['vhba_template_list']: - # directly use the list (single resource and list are mutually exclusive - vhba_template_list = module.params['vhba_template_list'] - else: - # single resource specified, create list from the current params - vhba_template_list = [module.params] - for vhba_template in vhba_template_list: - mo_exists = False - props_match = False - # set default params. Done here to set values for lists which can't be done in the argument_spec - if not vhba_template.get('descr'): - vhba_template['descr'] = '' - if not vhba_template.get('fabric'): - vhba_template['fabric'] = 'A' - if not vhba_template.get('redundancy_type'): - vhba_template['redundancy_type'] = 'none' - if not vhba_template.get('vsan'): - vhba_template['vsan'] = 'default' - if not vhba_template.get('template_type'): - vhba_template['template_type'] = 'initial-template' - if not vhba_template.get('max_data'): - vhba_template['max_data'] = '2048' - if not vhba_template.get('wwpn_pool'): - vhba_template['wwpn_pool'] = 'default' - if not vhba_template.get('qos_policy'): - vhba_template['qos_policy'] = '' - if not vhba_template.get('pin_group'): - vhba_template['pin_group'] = '' - if not vhba_template.get('stats_policy'): - vhba_template['stats_policy'] = 'default' - # dn is <org_dn>/san-conn-templ-<name> - dn = module.params['org_dn'] + '/san-conn-templ-' + vhba_template['name'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - # check top-level mo props - kwargs = dict(descr=vhba_template['descr']) - kwargs['switch_id'] = vhba_template['fabric'] - kwargs['redundancy_pair_type'] = vhba_template['redundancy_type'] - kwargs['templ_type'] = vhba_template['template_type'] - kwargs['max_data_field_size'] = vhba_template['max_data'] - kwargs['ident_pool_name'] = vhba_template['wwpn_pool'] - kwargs['qos_policy_name'] = vhba_template['qos_policy'] - kwargs['pin_to_group_name'] = vhba_template['pin_group'] - kwargs['stats_policy_name'] = vhba_template['stats_policy'] - if (mo.check_prop_match(**kwargs)): - # top-level props match, check next level mo/props - child_dn = dn + '/if-default' - mo_1 = ucs.login_handle.query_dn(child_dn) - if mo_1: - kwargs = dict(name=vhba_template['vsan']) - if (mo_1.check_prop_match(**kwargs)): - props_match = True - - if module.params['state'] == 'absent': - # mo must exist but all properties do not have to match - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - changed = True - else: - if not props_match: - if not module.check_mode: - # create if mo does not already exist - mo = VnicSanConnTempl( - parent_mo_or_dn=module.params['org_dn'], - name=vhba_template['name'], - descr=vhba_template['descr'], - switch_id=vhba_template['fabric'], - redundancy_pair_type=vhba_template['redundancy_type'], - templ_type=vhba_template['template_type'], - max_data_field_size=vhba_template['max_data'], - ident_pool_name=vhba_template['wwpn_pool'], - qos_policy_name=vhba_template['qos_policy'], - pin_to_group_name=vhba_template['pin_group'], - stats_policy_name=vhba_template['stats_policy'], - ) - - mo_1 = VnicFcIf( - parent_mo_or_dn=mo, - name=vhba_template['vsan'], - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - changed = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_vlan_find.py b/lib/ansible/modules/remote_management/ucs/ucs_vlan_find.py deleted file mode 100644 index 005275ffc2..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_vlan_find.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community'} - -DOCUMENTATION = r''' ---- -module: ucs_vlan_find -short_description: Find VLANs on Cisco UCS Manager -description: -- Find VLANs on Cisco UCS Manager based on different criteria. -extends_documentation_fragment: ucs -options: - pattern: - description: - - Regex pattern to find within the name property of the fabricVlan class. - - This is required if C(vlanid) parameter is not supplied. - type: str - fabric: - description: - - "The fabric configuration of the VLAN. This can be one of the following:" - - "common - The VLAN applies to both fabrics and uses the same configuration parameters in both cases." - - "A — The VLAN only applies to fabric A." - - "B — The VLAN only applies to fabric B." - choices: [common, A, B] - default: common - type: str - vlanid: - description: - - The unique string identifier assigned to the VLAN. - - A VLAN ID can be between '1' and '3967', or between '4048' and '4093'. - - This is required if C(pattern) parameter is not supplied. - type: str -requirements: -- ucsmsdk -author: -- David Martinez (@dx0xm) -- CiscoUcs (@CiscoUcs) -version_added: '2.9' -''' - -EXAMPLES = r''' -- name: Get all vlans in fabric A - ucs_vlan_find: - hostname: 172.16.143.150 - username: admin - password: password - fabric: 'A' - pattern: '.' -- name: Confirm if vlan 15 is present - ucs_vlan_find: - hostname: 172.16.143.150 - username: admin - password: password - vlanid: '15' -''' - -RETURN = r''' -vlan_list: - description: basic details of vlans found - returned: on success - type: list - sample: [ - { - "id": "0", - "name": "vlcloud1" - } - ] -''' - - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - fabric=dict(type='str', default='common', choices=['common', 'A', 'B']), - pattern=dict(type='str'), - vlanid=dict(type='str') - ) - - module = AnsibleModule( - argument_spec=argument_spec, - supports_check_mode=True, - required_one_of=[['pattern', 'vlanid']] - ) - - ucs = UCSModule(module) - - filtls = ['(cloud,"ethlan")'] - if module.params['fabric'] != 'common': - filtls.append('(switch_id,"' + module.params['fabric'] + '")') - if module.params['vlanid']: - filtls.append('(id,"' + module.params['vlanid'] + '")') - else: - filtls.append('(name,"' + module.params['pattern'] + '")') - - object_dict = ucs.login_handle.query_classid("fabricVlan", filter_str=' and '.join(filtls)) - - if object_dict is None: - module.fail_json(msg="Failed to query vlan objects") - - vlnlist = [] - for ob in object_dict: - vlnlist.append(dict(name=ob.name, id=ob.id)) - - module.exit_json(changed=False, - vlan_list=vlnlist) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_vlans.py b/lib/ansible/modules/remote_management/ucs/ucs_vlans.py deleted file mode 100644 index 4293a52d46..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_vlans.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_vlans -short_description: Configures VLANs on Cisco UCS Manager -description: -- Configures VLANs on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify VLANs are present and will create if needed. - - If C(absent), will verify VLANs are absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name assigned to the VLAN. - - The VLAN name is case sensitive. - - This name can be between 1 and 32 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after the VLAN is created. - required: yes - multicast_policy: - description: - - The multicast policy associated with this VLAN. - - This option is only valid if the Sharing Type field is set to None or Primary. - default: '' - fabric: - description: - - "The fabric configuration of the VLAN. This can be one of the following:" - - "common - The VLAN applies to both fabrics and uses the same configuration parameters in both cases." - - "A — The VLAN only applies to fabric A." - - "B — The VLAN only applies to fabric B." - - For upstream disjoint L2 networks, Cisco recommends that you choose common to create VLANs that apply to both fabrics. - choices: [common, A, B] - default: common - id: - description: - - The unique string identifier assigned to the VLAN. - - A VLAN ID can be between '1' and '3967', or between '4048' and '4093'. - - You cannot create VLANs with IDs from 4030 to 4047. This range of VLAN IDs is reserved. - - The VLAN IDs you specify must also be supported on the switch that you are using. - - VLANs in the LAN cloud and FCoE VLANs in the SAN cloud must have different IDs. - - Optional if state is absent. - required: yes - sharing: - description: - - The Sharing Type field. - - "Whether this VLAN is subdivided into private or secondary VLANs. This can be one of the following:" - - "none - This VLAN does not have any secondary or private VLANs. This is a regular VLAN." - - "primary - This VLAN can have one or more secondary VLANs, as shown in the Secondary VLANs area. This VLAN is a primary VLAN in the private VLAN domain." - - "isolated - This is a private VLAN associated with a primary VLAN. This VLAN is an Isolated VLAN." - - "community - This VLAN can communicate with other ports on the same community VLAN as well as the promiscuous port. This VLAN is a Community VLAN." - choices: [none, primary, isolated, community] - default: none - native: - description: - - Designates the VLAN as a native VLAN. - choices: ['yes', 'no'] - default: 'no' -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.5' -''' - -EXAMPLES = r''' -- name: Configure VLAN - ucs_vlans: - hostname: 172.16.143.150 - username: admin - password: password - name: vlan2 - id: '2' - native: 'yes' - -- name: Remove VLAN - ucs_vlans: - hostname: 172.16.143.150 - username: admin - password: password - name: vlan2 - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - name=dict(type='str', required=True), - multicast_policy=dict(type='str', default=''), - fabric=dict(type='str', default='common', choices=['common', 'A', 'B']), - id=dict(type='str'), - sharing=dict(type='str', default='none', choices=['none', 'primary', 'isolated', 'community']), - native=dict(type='str', default='no', choices=['yes', 'no']), - state=dict(type='str', default='present', choices=['present', 'absent']), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - required_if=[ - ['state', 'present', ['id']], - ], - ) - ucs = UCSModule(module) - - err = False - - # UCSModule creation above verifies ucsmsdk is present and exits on failure, so additional imports are done below. - from ucsmsdk.mometa.fabric.FabricVlan import FabricVlan - - changed = False - try: - mo_exists = False - props_match = False - # dn is fabric/lan/net-<name> for common vlans or fabric/lan/[A or B]/net-<name> for A or B - dn_base = 'fabric/lan' - if module.params['fabric'] != 'common': - dn_base += '/' + module.params['fabric'] - dn = dn_base + '/net-' + module.params['name'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - - if module.params['state'] == 'absent': - # mo must exist but all properties do not have to match - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - changed = True - else: - if mo_exists: - # check top-level mo props - kwargs = dict(id=module.params['id']) - kwargs['default_net'] = module.params['native'] - kwargs['sharing'] = module.params['sharing'] - kwargs['mcast_policy_name'] = module.params['multicast_policy'] - if (mo.check_prop_match(**kwargs)): - props_match = True - - if not props_match: - if not module.check_mode: - # create if mo does not already exist - mo = FabricVlan( - parent_mo_or_dn=dn_base, - name=module.params['name'], - id=module.params['id'], - default_net=module.params['native'], - sharing=module.params['sharing'], - mcast_policy_name=module.params['multicast_policy'], - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - changed = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_vnic_template.py b/lib/ansible/modules/remote_management/ucs/ucs_vnic_template.py deleted file mode 100644 index 18f7f61326..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_vnic_template.py +++ /dev/null @@ -1,376 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_vnic_template -short_description: Configures vNIC templates on Cisco UCS Manager -description: -- Configures vNIC templates on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify vNIC templates are present and will create if needed. - - If C(absent), will verify vNIC templates are absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name of the vNIC template. - - This name can be between 1 and 16 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after the template is created. - required: yes - description: - description: - - A user-defined description of the vNIC template. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - fabric: - description: - - The Fabric ID field specifying the fabric interconnect associated with vNICs created from this template. - - If you want fabric failover enabled on vNICs created from this template, use of of the following:" - - "A-B to use Fabric A by default with failover enabled." - - "B-A to use Fabric B by default with failover enabled." - - "Do not enable vNIC fabric failover under the following circumstances:" - - "- If the Cisco UCS domain is running in Ethernet switch mode. vNIC fabric failover is not supported in that mode." - - "- If you plan to associate one or more vNICs created from this template to a server with an adapter that does not support fabric failover." - choices: [A, B, A-B, B-A] - default: A - redundancy_type: - description: - - The Redundancy Type used for vNIC redundancy pairs during fabric failover. - - "This can be one of the following:" - - "primary — Creates configurations that can be shared with the Secondary template." - - "secondary — All shared configurations are inherited from the Primary template." - - "none - Legacy vNIC template behavior. Select this option if you do not want to use redundancy." - choices: [none, primary, secondary] - default: none - peer_redundancy_template: - description: - - The Peer Redundancy Template. - - The name of the vNIC template sharing a configuration with this template. - - If the redundancy_type is primary, the name of the secondary template should be provided. - - If the redundancy_type is secondary, the name of the primary template should be provided. - - Secondary templates can only configure non-shared properties (name, description, and mac_pool). - aliases: [ peer_redundancy_templ ] - target: - description: - - The possible target for vNICs created from this template. - - The target determines whether or not Cisco UCS Manager automatically creates a VM-FEX port profile with the appropriate settings for the vNIC template. - - "This can be one of the following:" - - "adapter — The vNICs apply to all adapters. No VM-FEX port profile is created if you choose this option." - - "vm - The vNICs apply to all virtual machines. A VM-FEX port profile is created if you choose this option." - default: adapter - template_type: - description: - - The Template Type field. - - "This can be one of the following:" - - "initial-template — vNICs created from this template are not updated if the template changes." - - "updating-template - vNICs created from this template are updated if the template changes." - choices: [initial-template, updating-template] - default: initial-template - vlans_list: - description: - - List of VLANs used by the vNIC template. - - "Each list element has the following suboptions:" - - "= name" - - " The name of the VLAN (required)." - - "- native" - - " Designates the VLAN as a native VLAN. Only one VLAN in the list can be a native VLAN." - - " [choices: 'no', 'yes']" - - " [Default: 'no']" - - "- state" - - " If present, will verify VLAN is present on template." - - " If absent, will verify VLAN is absent on template." - - " choices: [present, absent]" - - " default: present" - cdn_source: - description: - - CDN Source field. - - "This can be one of the following options:" - - "vnic-name - Uses the vNIC template name of the vNIC instance as the CDN name. This is the default option." - - "user-defined - Uses a user-defined CDN name for the vNIC template. If this option is chosen, cdn_name must also be provided." - choices: [vnic-name, user-defined] - default: vnic-name - cdn_name: - description: - - CDN Name used when cdn_source is set to user-defined. - mtu: - description: - - The MTU field. - - The maximum transmission unit, or packet size, that vNICs created from this vNIC template should use. - - Enter a string between '1500' and '9000'. - - If the vNIC template has an associated QoS policy, the MTU specified here must be equal to or less than the MTU specified in the QoS system class. - default: '1500' - mac_pool: - description: - - The MAC address pool that vNICs created from this vNIC template should use. - qos_policy: - description: - - The quality of service (QoS) policy that vNICs created from this vNIC template should use. - network_control_policy: - description: - - The network control policy that vNICs created from this vNIC template should use. - pin_group: - description: - - The LAN pin group that vNICs created from this vNIC template should use. - stats_policy: - description: - - The statistics collection policy that vNICs created from this vNIC template should use. - default: default - org_dn: - description: - - Org dn (distinguished name) - default: org-root -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.5' -''' - -EXAMPLES = r''' -- name: Configure vNIC template - ucs_vnic_template: - hostname: 172.16.143.150 - username: admin - password: password - name: vNIC-A - fabric: A - vlans_list: - - name: default - native: 'yes' - -- name: Configure vNIC template with failover - ucs_vnic_template: - hostname: 172.16.143.150 - username: admin - password: password - name: vNIC-A-B - fabric: A-B - vlans_list: - - name: default - native: 'yes' - state: present - -- name: Remove vNIC template - ucs_vnic_template: - hostname: 172.16.143.150 - username: admin - password: password - name: vNIC-A - state: absent - -- name: Remove another vNIC template - ucs_vnic_template: - hostname: 172.16.143.150 - username: admin - password: password - name: vNIC-A-B - state: absent - -- name: Remove VLAN from template - ucs_vnic_template: - hostname: 172.16.143.150 - username: admin - password: password - name: vNIC-A-B - fabric: A-B - vlans_list: - - name: default - native: 'yes' - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - org_dn=dict(type='str', default='org-root'), - name=dict(type='str', required=True), - description=dict(type='str', aliases=['descr'], default=''), - fabric=dict(type='str', default='A', choices=['A', 'B', 'A-B', 'B-A']), - redundancy_type=dict(type='str', default='none', choices=['none', 'primary', 'secondary']), - peer_redundancy_template=dict(type='str', aliases=['peer_redundancy_templ'], default=''), - target=dict(type='str', default='adapter', choices=['adapter', 'vm']), - template_type=dict(type='str', default='initial-template', choices=['initial-template', 'updating-template']), - vlans_list=dict(type='list'), - cdn_source=dict(type='str', default='vnic-name', choices=['vnic-name', 'user-defined']), - cdn_name=dict(type='str', default=''), - mtu=dict(type='str', default='1500'), - mac_pool=dict(type='str', default=''), - qos_policy=dict(type='str', default=''), - network_control_policy=dict(type='str', default=''), - pin_group=dict(type='str', default=''), - stats_policy=dict(type='str', default='default'), - state=dict(type='str', default='present', choices=['present', 'absent']), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - required_if=[ - ['cdn_source', 'user-defined', ['cdn_name']], - ], - ) - ucs = UCSModule(module) - - err = False - - # UCSModule creation above verifies ucsmsdk is present and exits on failure. Additional imports are done below. - from ucsmsdk.mometa.vnic.VnicLanConnTempl import VnicLanConnTempl - from ucsmsdk.mometa.vnic.VnicEtherIf import VnicEtherIf - - changed = False - try: - mo_exists = False - props_match = False - # dn is <org_dn>/lan-conn-templ-<name> - dn = module.params['org_dn'] + '/lan-conn-templ-' + module.params['name'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - - if module.params['state'] == 'absent': - # mo must exist but all properties do not have to match - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - changed = True - else: - # set default params for lists which can't be done in the argument_spec - if module.params.get('vlans_list'): - for vlan in module.params['vlans_list']: - if not vlan.get('native'): - vlan['native'] = 'no' - if not vlan.get('state'): - vlan['state'] = 'present' - # for target 'adapter', change to internal UCS Manager spelling 'adaptor' - if module.params['target'] == 'adapter': - module.params['target'] = 'adaptor' - if mo_exists: - # check top-level mo props - kwargs = dict(descr=module.params['description']) - kwargs['switch_id'] = module.params['fabric'] - kwargs['redundancy_pair_type'] = module.params['redundancy_type'] - kwargs['peer_redundancy_templ_name'] = module.params['peer_redundancy_template'] - kwargs['ident_pool_name'] = module.params['mac_pool'] - # do not check shared props if this is a secondary template - if module.params['redundancy_type'] != 'secondary': - kwargs['target'] = module.params['target'] - kwargs['templ_type'] = module.params['template_type'] - kwargs['cdn_source'] = module.params['cdn_source'] - kwargs['admin_cdn_name'] = module.params['cdn_name'] - kwargs['mtu'] = module.params['mtu'] - kwargs['qos_policy_name'] = module.params['qos_policy'] - kwargs['nw_ctrl_policy_name'] = module.params['network_control_policy'] - kwargs['pin_to_group_name'] = module.params['pin_group'] - kwargs['stats_policy_name'] = module.params['stats_policy'] - if mo.check_prop_match(**kwargs): - # top-level props match, check next level mo/props - if not module.params.get('vlans_list'): - props_match = True - else: - # check vlan props - for vlan in module.params['vlans_list']: - child_dn = dn + '/if-' + str(vlan['name']) - mo_1 = ucs.login_handle.query_dn(child_dn) - if vlan['state'] == 'absent': - if mo_1: - props_match = False - break - else: - if mo_1: - kwargs = dict(default_net=vlan['native']) - if mo_1.check_prop_match(**kwargs): - props_match = True - else: - props_match = False - break - - if not props_match: - if not module.check_mode: - # create if mo does not already exist - # secondary template only sets non shared props - if module.params['redundancy_type'] == 'secondary': - mo = VnicLanConnTempl( - parent_mo_or_dn=module.params['org_dn'], - name=module.params['name'], - descr=module.params['description'], - switch_id=module.params['fabric'], - redundancy_pair_type=module.params['redundancy_type'], - peer_redundancy_templ_name=module.params['peer_redundancy_template'], - ident_pool_name=module.params['mac_pool'], - ) - else: - mo = VnicLanConnTempl( - parent_mo_or_dn=module.params['org_dn'], - name=module.params['name'], - descr=module.params['description'], - switch_id=module.params['fabric'], - redundancy_pair_type=module.params['redundancy_type'], - peer_redundancy_templ_name=module.params['peer_redundancy_template'], - target=module.params['target'], - templ_type=module.params['template_type'], - cdn_source=module.params['cdn_source'], - admin_cdn_name=module.params['cdn_name'], - mtu=module.params['mtu'], - ident_pool_name=module.params['mac_pool'], - qos_policy_name=module.params['qos_policy'], - nw_ctrl_policy_name=module.params['network_control_policy'], - pin_to_group_name=module.params['pin_group'], - stats_policy_name=module.params['stats_policy'], - ) - - if module.params.get('vlans_list'): - for vlan in module.params['vlans_list']: - if vlan['state'] == 'absent': - child_dn = dn + '/if-' + str(vlan['name']) - mo_1 = ucs.login_handle.query_dn(child_dn) - ucs.login_handle.remove_mo(mo_1) - else: - mo_1 = VnicEtherIf( - parent_mo_or_dn=mo, - name=str(vlan['name']), - default_net=vlan['native'], - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - changed = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_vsans.py b/lib/ansible/modules/remote_management/ucs/ucs_vsans.py deleted file mode 100644 index 35b42b5033..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_vsans.py +++ /dev/null @@ -1,201 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_vsans -short_description: Configures VSANs on Cisco UCS Manager -description: -- Configures VSANs on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify VSANs are present and will create if needed. - - If C(absent), will verify VSANs are absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name assigned to the VSAN. - - This name can be between 1 and 32 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after the VSAN is created. - required: yes - vsan_id: - description: - - The unique identifier assigned to the VSAN. - - The ID can be a string between '1' and '4078', or between '4080' and '4093'. '4079' is a reserved VSAN ID. - - In addition, if you plan to use FC end-host mode, the range between '3840' to '4079' is also a reserved VSAN ID range. - - Optional if state is absent. - required: yes - vlan_id: - description: - - The unique string identifier assigned to the VLAN used for Fibre Channel connections. - - Note that Cisco UCS Manager uses VLAN '4048'. See the UCS Manager configuration guide if you want to assign '4048' to a VLAN. - - Optional if state is absent. - required: yes - fc_zoning: - description: - - Fibre Channel zoning configuration for the Cisco UCS domain. - - "Fibre Channel zoning can be set to one of the following values:" - - "disabled — The upstream switch handles Fibre Channel zoning, or Fibre Channel zoning is not implemented for the Cisco UCS domain." - - "enabled — Cisco UCS Manager configures and controls Fibre Channel zoning for the Cisco UCS domain." - - If you enable Fibre Channel zoning, do not configure the upstream switch with any VSANs that are being used for Fibre Channel zoning. - choices: [disabled, enabled] - default: disabled - fabric: - description: - - "The fabric configuration of the VSAN. This can be one of the following:" - - "common - The VSAN maps to the same VSAN ID in all available fabrics." - - "A - The VSAN maps to the a VSAN ID that exists only in fabric A." - - "B - The VSAN maps to the a VSAN ID that exists only in fabric B." - choices: [common, A, B] - default: common -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.5' -''' - -EXAMPLES = r''' -- name: Configure VSAN - ucs_vsans: - hostname: 172.16.143.150 - username: admin - password: password - name: vsan110 - vsan_id: '110' - vlan_id: '110' - -- name: Remove VSAN - ucs_vsans: - hostname: 172.16.143.150 - username: admin - password: password - name: vsan110 -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - name=dict(type='str'), - vsan_id=dict(type='str'), - vlan_id=dict(type='str'), - fc_zoning=dict(type='str', default='disabled', choices=['disabled', 'enabled']), - fabric=dict(type='str', default='common', choices=['common', 'A', 'B']), - state=dict(type='str', default='present', choices=['present', 'absent']), - vsan_list=dict(type='list'), - ) - - # Note that use of vsan_list is an experimental feature which allows multiple resource updates with a single UCSM connection. - # Support for vsan_list may change or be removed once persistent UCS connections are supported. - # Either vsan_list or name/vsan_id/vlan_id is required (user can specify either a list or single resource). - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - required_one_of=[ - ['vsan_list', 'name'] - ], - mutually_exclusive=[ - ['vsan_list', 'name'] - ], - ) - ucs = UCSModule(module) - - err = False - - from ucsmsdk.mometa.fabric.FabricVsan import FabricVsan - - changed = False - try: - # Only documented use is a single resource, but to also support experimental - # feature allowing multiple updates all params are converted to a vsan_list below. - - if module.params['vsan_list']: - # directly use the list (single resource and list are mutually exclusive - vsan_list = module.params['vsan_list'] - else: - # single resource specified, create list from the current params - vsan_list = [module.params] - for vsan in vsan_list: - mo_exists = False - props_match = False - # set default params. Done here to set values for lists which can't be done in the argument_spec - if not vsan.get('fc_zoning'): - vsan['fc_zoning'] = 'disabled' - if not vsan.get('fabric'): - vsan['fabric'] = 'common' - # dn is fabric/san/net-<name> for common vsans or fabric/san/[A or B]/net-<name> for A or B - dn_base = 'fabric/san' - if vsan['fabric'] != 'common': - dn_base += '/' + vsan['fabric'] - dn = dn_base + '/net-' + vsan['name'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - - if module.params['state'] == 'absent': - # mo must exist but all properties do not have to match - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - changed = True - else: - if mo_exists: - # check top-level mo props - kwargs = dict(id=vsan['vsan_id']) - kwargs['fcoe_vlan'] = vsan['vlan_id'] - kwargs['zoning_state'] = vsan['fc_zoning'] - if (mo.check_prop_match(**kwargs)): - props_match = True - - if not props_match: - if not module.check_mode: - # create if mo does not already exist - mo = FabricVsan( - parent_mo_or_dn=dn_base, - name=vsan['name'], - id=vsan['vsan_id'], - fcoe_vlan=vsan['vlan_id'], - zoning_state=vsan['fc_zoning'], - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - changed = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/modules/remote_management/ucs/ucs_wwn_pool.py b/lib/ansible/modules/remote_management/ucs/ucs_wwn_pool.py deleted file mode 100644 index fc77c9c891..0000000000 --- a/lib/ansible/modules/remote_management/ucs/ucs_wwn_pool.py +++ /dev/null @@ -1,238 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'certified'} - -DOCUMENTATION = r''' ---- -module: ucs_wwn_pool -short_description: Configures WWNN or WWPN pools on Cisco UCS Manager -description: -- Configures WWNNs or WWPN pools on Cisco UCS Manager. -extends_documentation_fragment: ucs -options: - state: - description: - - If C(present), will verify WWNNs/WWPNs are present and will create if needed. - - If C(absent), will verify WWNNs/WWPNs are absent and will delete if needed. - choices: [present, absent] - default: present - name: - description: - - The name of the World Wide Node Name (WWNN) or World Wide Port Name (WWPN) pool. - - This name can be between 1 and 32 alphanumeric characters. - - "You cannot use spaces or any special characters other than - (hyphen), \"_\" (underscore), : (colon), and . (period)." - - You cannot change this name after the WWNN or WWPN pool is created. - required: yes - purpose: - description: - - Specify whether this is a node (WWNN) or port (WWPN) pool. - - Optional if state is absent. - choices: [node, port] - required: yes - description: - description: - - A description of the WWNN or WWPN pool. - - Enter up to 256 characters. - - "You can use any characters or spaces except the following:" - - "` (accent mark), \ (backslash), ^ (carat), \" (double quote), = (equal sign), > (greater than), < (less than), or ' (single quote)." - aliases: [ descr ] - order: - description: - - The Assignment Order field. - - "This can be one of the following:" - - "default - Cisco UCS Manager selects a random identity from the pool." - - "sequential - Cisco UCS Manager selects the lowest available identity from the pool." - choices: [default, sequential] - default: default - first_addr: - description: - - The first initiator in the World Wide Name (WWN) block. - - This is the From field in the UCS Manager Add WWN Blocks menu. - last_addr: - description: - - The last initiator in the World Wide Name (WWN) block. - - This is the To field in the UCS Manager Add WWN Blocks menu. - - For WWxN pools, the pool size must be a multiple of ports-per-node + 1. - - For example, if there are 7 ports per node, the pool size must be a multiple of 8. - - If there are 63 ports per node, the pool size must be a multiple of 64. - org_dn: - description: - - Org dn (distinguished name) - default: org-root -requirements: -- ucsmsdk -author: -- David Soper (@dsoper2) -- CiscoUcs (@CiscoUcs) -version_added: '2.5' -''' - -EXAMPLES = r''' -- name: Configure WWNN/WWPN pools - ucs_wwn_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: WWNN-Pool - purpose: node - first_addr: 20:00:00:25:B5:48:00:00 - last_addr: 20:00:00:25:B5:48:00:0F -- ucs_wwn_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: WWPN-Pool-A - purpose: port - order: sequential - first_addr: 20:00:00:25:B5:48:0A:00 - last_addr: 20:00:00:25:B5:48:0A:0F - -- name: Remove WWNN/WWPN pools - ucs_wwn_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: WWNN-Pool - state: absent -- ucs_wwn_pool: - hostname: 172.16.143.150 - username: admin - password: password - name: WWPN-Pool-A - state: absent -''' - -RETURN = r''' -# -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.remote_management.ucs import UCSModule, ucs_argument_spec - - -def main(): - argument_spec = ucs_argument_spec - argument_spec.update( - org_dn=dict(type='str', default='org-root'), - name=dict(type='str'), - purpose=dict(type='str', choices=['node', 'port']), - descr=dict(type='str'), - order=dict(type='str', default='default', choices=['default', 'sequential']), - first_addr=dict(type='str'), - last_addr=dict(type='str'), - state=dict(type='str', default='present', choices=['present', 'absent']), - wwn_list=dict(type='list'), - ) - - # Note that use of wwn_list is an experimental feature which allows multiple resource updates with a single UCSM connection. - # Support for wwn_list may change or be removed once persistent UCS connections are supported. - # Either wwn_list or name is required (user can specify either a list or single resource). - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - required_one_of=[ - ['wwn_list', 'name'] - ], - mutually_exclusive=[ - ['wwn_list', 'name'] - ], - ) - ucs = UCSModule(module) - - err = False - - from ucsmsdk.mometa.fcpool.FcpoolInitiators import FcpoolInitiators - from ucsmsdk.mometa.fcpool.FcpoolBlock import FcpoolBlock - - changed = False - try: - # Only documented use is a single resource, but to also support experimental - # feature allowing multiple updates all params are converted to a wwn_list below. - - if module.params['wwn_list']: - # directly use the list (single resource and list are mutually exclusive - wwn_list = module.params['wwn_list'] - else: - # single resource specified, create list from the current params - wwn_list = [module.params] - for wwn in wwn_list: - mo_exists = False - props_match = False - # set default params. Done here to set values for lists which can't be done in the argument_spec - if not wwn.get('descr'): - wwn['descr'] = '' - if not wwn.get('order'): - wwn['order'] = 'default' - # dn is <org_dn>/wwn-pool-<name> for WWNN or WWPN - dn = module.params['org_dn'] + '/wwn-pool-' + wwn['name'] - - mo = ucs.login_handle.query_dn(dn) - if mo: - mo_exists = True - - if module.params['state'] == 'absent': - if mo_exists: - if not module.check_mode: - ucs.login_handle.remove_mo(mo) - ucs.login_handle.commit() - changed = True - else: - # append purpose param with suffix used by UCSM - purpose_param = wwn['purpose'] + '-wwn-assignment' - if mo_exists: - # check top-level mo props - kwargs = dict(assignment_order=wwn['order']) - kwargs['descr'] = wwn['descr'] - kwargs['purpose'] = purpose_param - if (mo.check_prop_match(**kwargs)): - # top-level props match, check next level mo/props - if 'last_addr' in wwn and 'first_addr' in wwn: - block_dn = dn + '/block-' + wwn['first_addr'].upper() + '-' + wwn['last_addr'].upper() - mo_1 = ucs.login_handle.query_dn(block_dn) - if mo_1: - props_match = True - else: - props_match = True - - if not props_match: - if not module.check_mode: - # create if mo does not already exist - mo = FcpoolInitiators( - parent_mo_or_dn=module.params['org_dn'], - name=wwn['name'], - descr=wwn['descr'], - assignment_order=wwn['order'], - purpose=purpose_param, - ) - if 'last_addr' in wwn and 'first_addr' in wwn: - mo_1 = FcpoolBlock( - parent_mo_or_dn=mo, - to=wwn['last_addr'], - r_from=wwn['first_addr'], - ) - - ucs.login_handle.add_mo(mo, True) - ucs.login_handle.commit() - changed = True - - except Exception as e: - err = True - ucs.result['msg'] = "setup error: %s " % str(e) - - ucs.result['changed'] = changed - if err: - module.fail_json(**ucs.result) - module.exit_json(**ucs.result) - - -if __name__ == '__main__': - main() diff --git a/lib/ansible/plugins/doc_fragments/ucs.py b/lib/ansible/plugins/doc_fragments/ucs.py deleted file mode 100644 index 5c2c08add9..0000000000 --- a/lib/ansible/plugins/doc_fragments/ucs.py +++ /dev/null @@ -1,73 +0,0 @@ -# -*- coding: utf-8 -*- - -# This code is part of Ansible, but is an independent component. -# This particular file snippet, and this file snippet only, is BSD licensed. -# Modules you write using this snippet, which is embedded dynamically by Ansible -# still belong to the author of the module, and may assign their own license -# to the complete work. -# -# (c) 2016 Red Hat Inc. -# (c) 2020 Cisco Systems Inc. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - - -class ModuleDocFragment(object): - # Cisco UCS doc fragment - DOCUMENTATION = ''' -notes: - - Examples can be used with the L(UCS Platform Emulator, https://cs.co/ucspe). -options: - hostname: - description: - - IP address or hostname of Cisco UCS Manager. - type: str - required: yes - username: - description: - - Username for Cisco UCS Manager authentication. - type: str - default: admin - password: - description: - - Password for Cisco UCS Manager authentication. - type: str - required: yes - port: - description: - - Port number to be used during connection (by default uses 443 for https and 80 for http connection). - type: int - use_ssl: - description: - - If C(no), an HTTP connection will be used instead of the default HTTPS connection. - type: bool - default: yes - use_proxy: - description: - - If C(no), will not use the proxy as defined by system environment variable. - type: bool - default: yes - proxy: - description: - - If use_proxy is no, specfies proxy to be used for connection. - e.g. 'http://proxy.xy.z:8080' - type: str -''' |