1
+ #!/usr/bin/python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ ANSIBLE_METADATA = {
5
+ 'metadata_version' : '1.0' ,
6
+ 'status' : ['stableinterface' ],
7
+ 'supported_by' : 'futuriste'
8
+ }
9
+
10
+ DOCUMENTATION = '''
11
+ ---
12
+ module: proxmox_pool
13
+
14
+ short_description: Manages pools in Proxmox
15
+
16
+ options:
17
+ name:
18
+ required: true
19
+ aliases: [ "pool", "poolid" ]
20
+ description:
21
+ - Name of the PVE pool to manage.
22
+ state:
23
+ required: false
24
+ default: "present"
25
+ choices: [ "present", "absent" ]
26
+ description:
27
+ - Specifies whether the pool should exist or not.
28
+ comment:
29
+ required: false
30
+ description:
31
+ - Optionally sets the pool's comment in PVE.
32
+
33
+ author:
34
+ - Guiffo Joel (@futuriste)
35
+ '''
36
+
37
+ EXAMPLES = '''
38
+ - name: Create Administrators pool
39
+ proxmox_pool:
40
+ name: Administrators
41
+ - name: Create Dev Users pool's
42
+ proxmox_pool:
43
+ name: pool_dev
44
+ comment: Dev Users allowed to access on this pool.
45
+ '''
46
+
47
+ RETURN = '''
48
+ updated_fields:
49
+ description: Fields that were modified for an existing pool
50
+ type: list
51
+ pool:
52
+ description: Information about the pool fetched from PVE after this task completed.
53
+ type: json
54
+ '''
55
+
56
+ from ansible .module_utils .basic import AnsibleModule
57
+ from ansible .module_utils ._text import to_text
58
+ from ansible .module_utils .pvesh import ProxmoxShellError
59
+ import ansible .module_utils .pvesh as pvesh
60
+
61
+ class ProxmoxPool (object ):
62
+ def __init__ (self , module ):
63
+ self .module = module
64
+ self .name = module .params ['name' ]
65
+ self .state = module .params ['state' ]
66
+ self .comment = module .params ['comment' ]
67
+
68
+ def lookup (self ):
69
+ try :
70
+ return pvesh .get ("pools/{}" .format (self .name ))
71
+ except ProxmoxShellError as e :
72
+ self .module .fail_json (msg = e .message , status_code = e .status_code , ** result )
73
+
74
+ def remove_pool (self ):
75
+ try :
76
+ pvesh .delete ("pools/{}" .format (self .name ))
77
+ return (True , None )
78
+ except ProxmoxShellError as e :
79
+ return (False , e .message )
80
+
81
+ def create_pool (self ):
82
+ new_pool = {}
83
+ if self .comment is not None :
84
+ new_pool ['comment' ] = self .comment
85
+
86
+ try :
87
+ pvesh .create ("pools" , poolid = self .name , ** new_pool )
88
+ return (True , None )
89
+ except ProxmoxShellError as e :
90
+ return (False , e .message )
91
+
92
+ def modify_pool (self ):
93
+ lookup = self .lookup ()
94
+ staged_pool = {}
95
+
96
+ if self .comment is not None :
97
+ staged_pool ['comment' ] = self .comment
98
+
99
+ updated_fields = []
100
+ error = None
101
+
102
+ for key in staged_pool :
103
+ staged_value = to_text (staged_pool [key ]) if isinstance (staged_pool [key ], str ) else staged_pool [key ]
104
+ if key not in lookup or staged_value != lookup [key ]:
105
+ updated_fields .append (key )
106
+
107
+ if self .module .check_mode :
108
+ self .module .exit_json (changed = bool (updated_fields ), expected_changes = updated_fields )
109
+
110
+ if not updated_fields :
111
+ # No changes necessary
112
+ return (updated_fields , error )
113
+
114
+ try :
115
+ pvesh .set ("pools/{}" .format (self .name ), ** staged_pool )
116
+ except ProxmoxShellError as e :
117
+ error = e .message
118
+
119
+ return (updated_fields , error )
120
+
121
+ def main ():
122
+ # Refer to https://pve.proxmox.com/pve-docs/api-viewer/index.html
123
+ module = AnsibleModule (
124
+ argument_spec = dict (
125
+ name = dict (type = 'str' , required = True , aliases = ['pool' , 'poolid' ]),
126
+ state = dict (default = 'present' , choices = ['present' , 'absent' ], type = 'str' ),
127
+ comment = dict (default = None , type = 'str' ),
128
+ ),
129
+ supports_check_mode = True
130
+ )
131
+
132
+ pool = ProxmoxPool (module )
133
+
134
+ changed = False
135
+ error = None
136
+ result = {}
137
+ result ['name' ] = pool .name
138
+ result ['state' ] = pool .state
139
+
140
+ if pool .state == 'absent' :
141
+ if pool .lookup () is not None :
142
+ if module .check_mode :
143
+ module .exit_json (changed = True )
144
+
145
+ (changed , error ) = pool .remove_pool ()
146
+
147
+ if error is not None :
148
+ module .fail_json (name = pool .name , msg = error )
149
+ elif pool .state == 'present' :
150
+ if not pool .lookup ():
151
+ if module .check_mode :
152
+ module .exit_json (changed = True )
153
+
154
+ (changed , error ) = pool .create_pool ()
155
+ else :
156
+ # modify pool (note: this function is check mode aware)
157
+ (updated_fields , error ) = pool .modify_pool ()
158
+
159
+ if updated_fields :
160
+ changed = True
161
+ result ['updated_fields' ] = updated_fields
162
+
163
+ if error is not None :
164
+ module .fail_json (name = pool .name , msg = error )
165
+
166
+ lookup = pool .lookup ()
167
+ if lookup is not None :
168
+ result ['pool' ] = lookup
169
+
170
+ result ['changed' ] = changed
171
+
172
+ module .exit_json (** result )
173
+
174
+ if __name__ == '__main__' :
175
+ main ()
0 commit comments