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