summaryrefslogtreecommitdiffstats
path: root/ansible_collections/community/vmware/plugins/modules/vmware_datacenter.py
blob: 8978b59990e9351bd97e6d044d99929ff675c4f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#!/usr/bin/python
# -*- coding: utf-8 -*-

# Copyright: (c) 2015, Joseph Callen <jcallen () csc.com>
# Copyright: (c) 2018, Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

from __future__ import absolute_import, division, print_function
__metaclass__ = type


DOCUMENTATION = r'''
---
module: vmware_datacenter
short_description: Manage VMware vSphere Datacenters
description:
    - This module can be used to manage (create, delete) VMware vSphere Datacenters.
author:
- Joseph Callen (@jcpowermac)
- Kamil Szczygiel (@kamsz)
options:
    datacenter_name:
      description:
      - The name of the datacenter the cluster will be created in.
      required: true
      type: str
    state:
      description:
      - If the datacenter should be present or absent.
      choices: [ present, absent ]
      default: present
      type: str
extends_documentation_fragment:
- community.vmware.vmware.documentation

'''

EXAMPLES = r'''
- name: Create Datacenter
  community.vmware.vmware_datacenter:
    hostname: '{{ vcenter_hostname }}'
    username: '{{ vcenter_username }}'
    password: '{{ vcenter_password }}'
    datacenter_name: '{{ datacenter_name }}'
    state: present
  delegate_to: localhost

- name: Delete Datacenter
  community.vmware.vmware_datacenter:
    hostname: '{{ vcenter_hostname }}'
    username: '{{ vcenter_username }}'
    password: '{{ vcenter_password }}'
    datacenter_name: '{{ datacenter_name }}'
    state: absent
  delegate_to: localhost
  register: datacenter_delete_result
'''

RETURN = r'''#
'''

try:
    from pyVmomi import vim, vmodl
except ImportError:
    pass

from ansible.module_utils.basic import AnsibleModule
from ansible_collections.community.vmware.plugins.module_utils.vmware import PyVmomi, find_datacenter_by_name, vmware_argument_spec, wait_for_task
from ansible.module_utils._text import to_native


class VmwareDatacenterManager(PyVmomi):
    def __init__(self, module):
        super(VmwareDatacenterManager, self).__init__(module)
        self.datacenter_name = self.params.get('datacenter_name')
        self.datacenter_obj = self.get_datacenter()

    def ensure(self):
        state = self.module.params.get('state')

        if state == 'present':
            self.create_datacenter()

        if state == 'absent':
            self.destroy_datacenter()

    def get_datacenter(self):
        try:
            datacenter_obj = find_datacenter_by_name(self.content, self.datacenter_name)
            return datacenter_obj
        except (vmodl.MethodFault, vmodl.RuntimeFault) as runtime_fault:
            self.module.fail_json(msg="Failed to get datacenter '%s'"
                                      " due to : %s" % (self.datacenter_name,
                                                        to_native(runtime_fault.msg)))
        except Exception as generic_exc:
            self.module.fail_json(msg="Failed to get datacenter"
                                      " '%s' due to generic error: %s" % (self.datacenter_name,
                                                                          to_native(generic_exc)))

    def create_datacenter(self):
        folder = self.content.rootFolder
        changed = False
        try:
            if not self.datacenter_obj and not self.module.check_mode:
                changed = True
                folder.CreateDatacenter(name=self.datacenter_name)
            self.module.exit_json(changed=changed)
        except vim.fault.DuplicateName:
            self.module.exit_json(changed=changed)
        except vim.fault.InvalidName as invalid_name:
            self.module.fail_json(msg="Specified datacenter name '%s' is an"
                                      " invalid name : %s" % (self.datacenter_name,
                                                              to_native(invalid_name.msg)))
        except vmodl.fault.NotSupported as not_supported:
            # This should never happen
            self.module.fail_json(msg="Trying to create a datacenter '%s' on"
                                      " an incorrect folder object : %s" % (self.datacenter_name,
                                                                            to_native(not_supported.msg)))
        except (vmodl.RuntimeFault, vmodl.MethodFault) as runtime_fault:
            self.module.fail_json(msg="Failed to create a datacenter"
                                      " '%s' due to : %s" % (self.datacenter_name,
                                                             to_native(runtime_fault.msg)))
        except Exception as generic_exc:
            self.module.fail_json(msg="Failed to create a datacenter"
                                      " '%s' due to generic error: %s" % (self.datacenter_name,
                                                                          to_native(generic_exc)))

    def destroy_datacenter(self):
        results = dict(changed=False)
        try:
            if self.datacenter_obj and not self.module.check_mode:
                task = self.datacenter_obj.Destroy_Task()
                changed, result = wait_for_task(task)
                results['changed'] = changed
                results['result'] = result
            self.module.exit_json(**results)
        except (vim.fault.VimFault, vmodl.RuntimeFault, vmodl.MethodFault) as runtime_fault:
            self.module.fail_json(msg="Failed to delete a datacenter"
                                      " '%s' due to : %s" % (self.datacenter_name,
                                                             to_native(runtime_fault.msg)))
        except Exception as generic_exc:
            self.module.fail_json(msg="Failed to delete a datacenter"
                                      " '%s' due to generic error: %s" % (self.datacenter_name,
                                                                          to_native(generic_exc)))


def main():
    argument_spec = vmware_argument_spec()
    argument_spec.update(
        dict(
            datacenter_name=dict(required=True, type='str'),
            state=dict(default='present', choices=['present', 'absent'], type='str')
        )
    )
    module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True)

    vmware_datacenter_mgr = VmwareDatacenterManager(module)
    vmware_datacenter_mgr.ensure()


if __name__ == '__main__':
    main()