1#!/usr/local/bin/python3.8 2# -*- coding: utf-8 -*- 3 4# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 5 6from __future__ import absolute_import, division, print_function 7from ansible_collections.cisco.intersight.plugins.module_utils.intersight import IntersightModule, intersight_argument_spec 8from ansible.module_utils.basic import AnsibleModule 9__metaclass__ = type 10 11ANSIBLE_METADATA = {'metadata_version': '1.1', 12 'status': ['preview'], 13 'supported_by': 'community'} 14 15DOCUMENTATION = r''' 16--- 17module: intersight_target_claim 18short_description: Target claim configuraiton for Cisco Intersight 19description: 20- Target claim configuraiton for Cisco Intersight 21- Used to claim or unclaim a Target from Cisco Intersight 22- For more information see L(Cisco Intersight,https://intersight.com/apidocs). 23extends_documentation_fragment: intersight 24options: 25 claim_code: 26 description: 27 - Claim code required for registering a new Target 28 - Required if I(state=present) 29 type: str 30 required: no 31 device_id: 32 description: 33 - Device id (serial number) of target 34 - Targets containing multiple Target ids (e.g. IMM) can be formatted as <target1_id>&<target2_id> 35 type: dict 36 required: yes 37 state: 38 description: 39 - If C(present), will verify the resource is present and will create if needed. 40 - If C(absent), will verify the resource is absent and will delete if needed. 41 choices: [present, absent] 42 default: present 43author: 44- Brandon Beck (@techBeck03) 45- CiscoUcs (@CiscoUcs) 46version_added: '2.8' 47''' 48 49EXAMPLES = r''' 50- name: Claim new Target 51 cisco.intersight.intersight_target_claim: 52 device_id: "{{ device_id }}" 53 claim_code: "{{ claim_code }}" 54 state: present 55 56- name: Delete a Target (unclaim) 57 cisco.intersight.intersight_target_claim: 58 device_id: "{{ device_id }}" 59 state: absent 60''' 61 62RETURN = r''' 63api_repsonse: 64 description: The API response output returned by the specified resource. 65 returned: always 66 type: dict 67 sample: 68 "api_response": { 69 "Account": { 70 "ClassId": "mo.MoRef", 71 "Moid": "8675309", 72 "ObjectType": "iam.Account", 73 "link": "https://www.intersight.com/api/v1/iam/Accounts/8675309" 74 }, 75 "AccountMoid": "8675309", 76 "Ancestors": null, 77 "ClassId": "asset.DeviceClaim", 78 "CreateTime": "2021-05-10T17:32:13.522665238Z", 79 "Device": { 80 "ClassId": "mo.MoRef", 81 "Moid": "9035768", 82 "ObjectType": "asset.DeviceRegistration", 83 "link": "https://www.intersight.com/api/v1/asset/DeviceRegistrations/9035768" 84 }, 85 "DisplayNames": { 86 "short": [ 87 "FDO241604EM&FDO24161700" 88 ] 89 }, 90 "DomainGroupMoid": "5b4e48a96a636d6d346cd1c5", 91 "ModTime": "2021-05-10T17:32:13.522665238Z", 92 "Moid": "8675309", 93 "ObjectType": "asset.DeviceClaim", 94 "Owners": [ 95 "90357688675309" 96 ], 97 "PermissionResources": null, 98 "SecurityToken": "A95486674376E", 99 "SerialNumber": "FDO86753091&FDO86753092", 100 "SharedScope": "", 101 "Tags": [], 102 "trace_id": "NB3e883980a98adace8f7b9c2409cced1a" 103 } 104''' 105 106 107def main(): 108 argument_spec = intersight_argument_spec 109 argument_spec.update( 110 claim_code=dict(type='str'), 111 device_id=dict(type='str', required=True), 112 state=dict(type='str', choices=['absent', 'present'], default='present'), 113 ) 114 115 module = AnsibleModule( 116 argument_spec, 117 supports_check_mode=True, 118 required_if=[ 119 ('state', 'present', (['claim_code']), False), 120 ] 121 ) 122 123 intersight = IntersightModule(module) 124 intersight.result['api_response'] = {} 125 intersight.result['trace_id'] = '' 126 127 # Check if device already exists in target list 128 target_ids = module.params['device_id'].split('&') 129 target_filter = '' 130 for idx, target_id in enumerate(target_ids): 131 if idx == 0: 132 target_filter += f"contains(TargetId,'{target_id}')" 133 else: 134 target_filter += f" or contains(TargetId,'{target_id}')" 135 intersight.get_resource( 136 resource_path='/asset/Targets', 137 query_params={ 138 "$select": "TargetId,RegisteredDevice", 139 "$filter": target_filter, 140 "$expand": "RegisteredDevice($select=DeviceClaim)" 141 }, 142 return_list=False, 143 ) 144 145 if module.params['state'] == 'present': 146 # Send claim request if device id not already claimed 147 if not intersight.result['api_response']: 148 intersight.configure_resource( 149 moid=None, 150 resource_path='/asset/DeviceClaims', 151 body=dict( 152 SecurityToken=module.params['claim_code'], 153 SerialNumber=module.params['device_id'] 154 ), 155 query_params=None, 156 update_method='post' 157 ) 158 159 elif module.params['state'] == 'absent': 160 # Check if target exists 161 if intersight.result['api_response'].get('Moid'): 162 intersight.delete_resource( 163 moid=intersight.result['api_response'].get('RegisteredDevice').get('DeviceClaim').get('Moid'), 164 resource_path='/asset/DeviceClaims', 165 ) 166 167 module.exit_json(**intersight.result) 168 169 170if __name__ == '__main__': 171 main() 172