Browse code

Add new Cloudstack module cs_vpc_offering (#34797)

* Add new Cloudstack module cs_vpc_offering

* fix documentation

* fix returns list

* state=absent example minimalization

dpassante authored on 2018/01/13 05:40:35
Showing 4 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,285 @@
0
+#!/usr/bin/python
1
+# -*- coding: utf-8 -*-
2
+#
3
+# Copyright (c) 2017, David Passante (@dpassante)
4
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
+
6
+ANSIBLE_METADATA = {'metadata_version': '1.1',
7
+                    'status': ['preview'],
8
+                    'supported_by': 'community'}
9
+
10
+DOCUMENTATION = '''
11
+---
12
+module: cs_vpc_offering
13
+short_description: Manages vpc offerings on Apache CloudStack based clouds.
14
+description:
15
+    - Create, update, enable, disable and remove CloudStack VPC offerings.
16
+version_added: '2.5'
17
+author: "David Passante (@dpassante)"
18
+options:
19
+  name:
20
+    description:
21
+      - The name of the vpc offering
22
+    required: true
23
+  state:
24
+    description:
25
+      - State of the vpc offering.
26
+    choices: [ enabled, present, disabled, absent ]
27
+    required: false
28
+    default: present
29
+  display_text:
30
+    description:
31
+      - Display text of the vpc offerings
32
+    required: false
33
+  service_capabilities:
34
+    description:
35
+      - Desired service capabilities as part of vpc offering.
36
+    aliases: [ service_capability ]
37
+  service_offering:
38
+    description:
39
+      - The name or ID of the service offering for the VPC router appliance.
40
+    required: false
41
+  supported_services:
42
+    description:
43
+      - Services supported by the vpc offering
44
+    aliases: [ supported_service ]
45
+    required: false
46
+  service_providers:
47
+    description:
48
+      - provider to service mapping. If not specified, the provider for the service will be mapped to the default provider on the physical network
49
+    aliases: [ service_provider ]
50
+    required: false
51
+  poll_async:
52
+    description:
53
+      - Poll async jobs until job has finished.
54
+    default: true
55
+extends_documentation_fragment: cloudstack
56
+'''
57
+
58
+EXAMPLES = '''
59
+# Create a vpc offering and enable it
60
+- local_action:
61
+    module: cs_vpc_offering
62
+    name: "my_vpc_offering"
63
+    display_text: "vpc offering description"
64
+    state: enabled
65
+    supported_services: [ Dns, Dhcp ]
66
+    service_providers:
67
+      - {service: 'dns', provider: 'virtualrouter'}
68
+      - {service: 'dhcp', provider: 'virtualrouter'}
69
+
70
+# Remove a vpc offering
71
+- local_action:
72
+    module: cs_vpc_offering
73
+    name: "my_vpc_offering"
74
+    state: absent
75
+'''
76
+
77
+RETURN = '''
78
+---
79
+id:
80
+  description: UUID of the vpc offering.
81
+  returned: success
82
+  type: string
83
+  sample: a6f7a5fc-43f8-11e5-a151-feff819cdc9f
84
+name:
85
+  description: The name of the vpc offering
86
+  returned: success
87
+  type: string
88
+  sample: MyCustomVPCOffering
89
+display_text:
90
+  description: The display text of the vpc offering
91
+  returned: success
92
+  type: string
93
+  sample: My vpc offering
94
+state:
95
+  description: The state of the vpc offering
96
+  returned: success
97
+  type: string
98
+  sample: Enabled
99
+service_offering_id:
100
+  description: The service offering ID.
101
+  returned: success
102
+  type: string
103
+  sample: c5f7a5fc-43f8-11e5-a151-feff819cdc9f
104
+is_default:
105
+  description: Whether VPC offering is the default offering or not.
106
+  returned: success
107
+  type: bool
108
+  sample: false
109
+region_level:
110
+  description: Indicated if the offering can support region level vpc.
111
+  returned: success
112
+  type: bool
113
+  sample: false
114
+distributed:
115
+  description: Indicates if the vpc offering supports distributed router for one-hop forwarding.
116
+  returned: success
117
+  type: bool
118
+  sample: false
119
+'''
120
+
121
+from ansible.module_utils.basic import AnsibleModule
122
+from ansible.module_utils.cloudstack import (
123
+    AnsibleCloudStack,
124
+    cs_argument_spec,
125
+    cs_required_together,
126
+)
127
+
128
+
129
+class AnsibleCloudStackVPCOffering(AnsibleCloudStack):
130
+
131
+    def __init__(self, module):
132
+        super(AnsibleCloudStackVPCOffering, self).__init__(module)
133
+        self.returns = {
134
+            'serviceofferingid': 'service_offering_id',
135
+            'isdefault': 'is_default',
136
+            'distributedvpcrouter': 'distributed',
137
+            'supportsregionLevelvpc': 'region_level',
138
+        }
139
+        self.vpc_offering = None
140
+
141
+    def get_vpc_offering(self):
142
+        if self.vpc_offering:
143
+            return self.vpc_offering
144
+
145
+        args = {
146
+            'name': self.module.params.get('name'),
147
+        }
148
+        vo = self.query_api('listVPCOfferings', **args)
149
+
150
+        if vo:
151
+            self.vpc_offering = vo['vpcoffering'][0]
152
+
153
+        return self.vpc_offering
154
+
155
+    def get_service_offering_id(self):
156
+        service_offering = self.module.params.get('service_offering')
157
+        if not service_offering:
158
+            return None
159
+
160
+        args = {
161
+            'issystem': True
162
+        }
163
+
164
+        service_offerings = self.query_api('listServiceOfferings', **args)
165
+        if service_offerings:
166
+            for s in service_offerings['serviceoffering']:
167
+                if service_offering in [s['name'], s['id']]:
168
+                    return s['id']
169
+        self.fail_json(msg="Service offering '%s' not found" % service_offering)
170
+
171
+    def create_or_update(self):
172
+        vpc_offering = self.get_vpc_offering()
173
+
174
+        if not vpc_offering:
175
+            vpc_offering = self.create_vpc_offering()
176
+
177
+        return self.update_vpc_offering(vpc_offering)
178
+
179
+    def create_vpc_offering(self):
180
+        vpc_offering = None
181
+        self.result['changed'] = True
182
+        args = {
183
+            'name': self.module.params.get('name'),
184
+            'state': self.module.params.get('state'),
185
+            'displaytext': self.module.params.get('display_text'),
186
+            'supportedservices': self.module.params.get('supported_services'),
187
+            'serviceproviderlist': self.module.params.get('service_providers'),
188
+            'serviceofferingid': self.get_service_offering_id(),
189
+        }
190
+
191
+        required_params = [
192
+            'display_text',
193
+            'supported_services',
194
+        ]
195
+        self.module.fail_on_missing_params(required_params=required_params)
196
+
197
+        if not self.module.check_mode:
198
+            res = self.query_api('createVPCOffering', **args)
199
+            poll_async = self.module.params.get('poll_async')
200
+            if poll_async:
201
+                vpc_offering = self.poll_job(res, 'vpcoffering')
202
+
203
+        return vpc_offering
204
+
205
+    def delete_vpc_offering(self):
206
+        vpc_offering = self.get_vpc_offering()
207
+
208
+        if vpc_offering:
209
+            self.result['changed'] = True
210
+
211
+            args = {
212
+                'id': vpc_offering['id'],
213
+            }
214
+
215
+            if not self.module.check_mode:
216
+                res = self.query_api('deleteVPCOffering', **args)
217
+                poll_async = self.module.params.get('poll_async')
218
+                if poll_async:
219
+                    vpc_offering = self.poll_job(res, 'vpcoffering')
220
+
221
+        return vpc_offering
222
+
223
+    def update_vpc_offering(self, vpc_offering):
224
+        if not vpc_offering:
225
+            return vpc_offering
226
+
227
+        args = {
228
+            'id': vpc_offering['id'],
229
+            'state': self.module.params.get('state'),
230
+            'name': self.module.params.get('name'),
231
+            'displaytext': self.module.params.get('display_text'),
232
+        }
233
+
234
+        if args['state'] in ['enabled', 'disabled']:
235
+            args['state'] = args['state'].title()
236
+        else:
237
+            del args['state']
238
+
239
+        if self.has_changed(args, vpc_offering):
240
+            self.result['changed'] = True
241
+
242
+            if not self.module.check_mode:
243
+                res = self.query_api('updateVPCOffering', **args)
244
+                poll_async = self.module.params.get('poll_async')
245
+                if poll_async:
246
+                    vpc_offering = self.poll_job(res, 'vpcoffering')
247
+
248
+        return vpc_offering
249
+
250
+
251
+def main():
252
+    argument_spec = cs_argument_spec()
253
+    argument_spec.update(dict(
254
+        name=dict(required=True),
255
+        display_text=dict(),
256
+        state=dict(choices=['enabled', 'present', 'disabled', 'absent'], default='present'),
257
+        service_capabilities=dict(type='list', aliases=['service_capability']),
258
+        service_offering=dict(),
259
+        supported_services=dict(type='list', aliases=['supported_service']),
260
+        service_providers=dict(type='list', aliases=['service_provider']),
261
+        poll_async=dict(type='bool', default=True),
262
+    ))
263
+
264
+    module = AnsibleModule(
265
+        argument_spec=argument_spec,
266
+        required_together=cs_required_together(),
267
+        supports_check_mode=True
268
+    )
269
+
270
+    acs_vpc_offering = AnsibleCloudStackVPCOffering(module)
271
+
272
+    state = module.params.get('state')
273
+    if state in ['absent']:
274
+        vpc_offering = acs_vpc_offering.delete_vpc_offering()
275
+    else:
276
+        vpc_offering = acs_vpc_offering.create_or_update()
277
+
278
+    result = acs_vpc_offering.get_result(vpc_offering)
279
+
280
+    module.exit_json(**result)
281
+
282
+
283
+if __name__ == '__main__':
284
+    main()
0 285
new file mode 100644
... ...
@@ -0,0 +1,2 @@
0
+cloud/cs
1
+posix/ci/cloud/group1/cs
0 2
new file mode 100644
... ...
@@ -0,0 +1,3 @@
0
+---
1
+dependencies:
2
+  - cs_common
0 3
new file mode 100644
... ...
@@ -0,0 +1,392 @@
0
+---
1
+- name: setup
2
+  cs_vpc_offering:
3
+    name: "{{ cs_resource_prefix }}_vpc"
4
+    state: absent
5
+  register: vpcoffer
6
+- name: verify setup
7
+  assert:
8
+    that:
9
+    - vpcoffer is successful
10
+
11
+- name: test fail if missing name
12
+  cs_vpc_offering:
13
+  register: vpcoffer
14
+  ignore_errors: true
15
+- name: verify results of fail if missing name
16
+  assert:
17
+    that:
18
+    - vpcoffer is failed
19
+    - 'vpcoffer.msg == "missing required arguments: name"'
20
+
21
+- name: test fail if missing params
22
+  cs_vpc_offering:
23
+    name: "{{ cs_resource_prefix }}_vpc"
24
+  register: vpcoffer
25
+  ignore_errors: true
26
+- name: verify results of fail if missing params
27
+  assert:
28
+    that:
29
+    - vpcoffer is failed
30
+    - 'vpcoffer.msg == "missing required arguments: display_text, supported_services"'
31
+
32
+- name: test create vpc offer in check mode
33
+  cs_vpc_offering:
34
+    name: "{{ cs_resource_prefix }}_vpc"
35
+    display_text: "vpc offering description"
36
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
37
+    service_providers:
38
+      - { service: 'dns', provider: 'virtualrouter' }
39
+      - { service: 'dhcp', provider: 'virtualrouter' }
40
+  register: vpcoffer
41
+  check_mode: yes
42
+- name: verify results of vpc offer in check mode
43
+  assert:
44
+    that:
45
+    - vpcoffer is successful
46
+    - vpcoffer is changed
47
+
48
+- name: test create vpc offer
49
+  cs_vpc_offering:
50
+    name: "{{ cs_resource_prefix }}_vpc"
51
+    display_text: "vpc offering description"
52
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
53
+    service_providers:
54
+      - { service: 'dns', provider: 'virtualrouter' }
55
+      - { service: 'dhcp', provider: 'virtualrouter' }
56
+  register: vpcoffer
57
+- name: verify results of vpc offer
58
+  assert:
59
+    that:
60
+    - vpcoffer is successful
61
+    - vpcoffer is changed
62
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
63
+    - vpcoffer.state == "Disabled"
64
+    - vpcoffer.display_text == "vpc offering description"
65
+    - vpcoffer.distributed == false
66
+    - vpcoffer.region_level == false
67
+
68
+- name: test create vpc offer idempotence
69
+  cs_vpc_offering:
70
+    name: "{{ cs_resource_prefix }}_vpc"
71
+    display_text: "vpc offering description"
72
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
73
+    service_providers:
74
+      - { service: 'dns', provider: 'virtualrouter' }
75
+      - { service: 'dhcp', provider: 'virtualrouter' }
76
+  register: vpcoffer
77
+- name: verify results of create vpc offer idempotence
78
+  assert:
79
+    that:
80
+    - vpcoffer is successful
81
+    - vpcoffer is not changed
82
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
83
+    - vpcoffer.state == "Disabled"
84
+    - vpcoffer.display_text == "vpc offering description"
85
+    - vpcoffer.distributed == false
86
+    - vpcoffer.region_level == false
87
+
88
+- name: test enabling existing vpc offer in check_mode
89
+  cs_vpc_offering:
90
+    name: "{{ cs_resource_prefix }}_vpc"
91
+    state: enabled
92
+  register: vpcoffer
93
+  check_mode: yes
94
+- name: verify results of enabling existing vpc offer in check_mode
95
+  assert:
96
+    that:
97
+    - vpcoffer is successful
98
+    - vpcoffer is changed
99
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
100
+    - vpcoffer.state == "Disabled"
101
+    - vpcoffer.display_text == "vpc offering description"
102
+
103
+- name: test enabling existing vpc offer
104
+  cs_vpc_offering:
105
+    name: "{{ cs_resource_prefix }}_vpc"
106
+    state: enabled
107
+  register: vpcoffer
108
+- name: verify results of enabling existing vpc offer
109
+  assert:
110
+    that:
111
+    - vpcoffer is successful
112
+    - vpcoffer is changed
113
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
114
+    - vpcoffer.state == "Enabled"
115
+    - vpcoffer.display_text == "vpc offering description"
116
+
117
+- name: test enabling existing vpc offer idempotence
118
+  cs_vpc_offering:
119
+    name: "{{ cs_resource_prefix }}_vpc"
120
+    state: enabled
121
+  register: vpcoffer
122
+- name: verify results of enabling existing vpc idempotence
123
+  assert:
124
+    that:
125
+    - vpcoffer is successful
126
+    - vpcoffer is not changed
127
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
128
+    - vpcoffer.state == "Enabled"
129
+    - vpcoffer.display_text == "vpc offering description"
130
+
131
+- name: test disabling vpc offer in check_mode
132
+  cs_vpc_offering:
133
+    name: "{{ cs_resource_prefix }}_vpc"
134
+    display_text: "vpc offering description"
135
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
136
+    service_providers:
137
+      - { service: 'dns', provider: 'virtualrouter' }
138
+      - { service: 'dhcp', provider: 'virtualrouter' }
139
+    state: disabled
140
+  register: vpcoffer
141
+  check_mode: yes
142
+- name: verify results of disabling vpc offer in check_mode
143
+  assert:
144
+    that:
145
+    - vpcoffer is successful
146
+    - vpcoffer is changed
147
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
148
+    - vpcoffer.state == "Enabled"
149
+    - vpcoffer.display_text == "vpc offering description"
150
+
151
+- name: test disabling vpc offer
152
+  cs_vpc_offering:
153
+    name: "{{ cs_resource_prefix }}_vpc"
154
+    display_text: "vpc offering description"
155
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
156
+    service_providers:
157
+      - { service: 'dns', provider: 'virtualrouter' }
158
+      - { service: 'dhcp', provider: 'virtualrouter' }
159
+    state: disabled
160
+  register: vpcoffer
161
+- name: verify results of disabling vpc offer
162
+  assert:
163
+    that:
164
+    - vpcoffer is successful
165
+    - vpcoffer is changed
166
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
167
+    - vpcoffer.state == "Disabled"
168
+    - vpcoffer.display_text == "vpc offering description"
169
+
170
+- name: test disabling vpc offer idempotence
171
+  cs_vpc_offering:
172
+    name: "{{ cs_resource_prefix }}_vpc"
173
+    display_text: "vpc offering description"
174
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
175
+    service_providers:
176
+      - { service: 'dns', provider: 'virtualrouter' }
177
+      - { service: 'dhcp', provider: 'virtualrouter' }
178
+    state: disabled
179
+  register: vpcoffer
180
+- name: verify results of disabling vpc idempotence
181
+  assert:
182
+    that:
183
+    - vpcoffer is successful
184
+    - vpcoffer is not changed
185
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
186
+    - vpcoffer.state == "Disabled"
187
+    - vpcoffer.display_text == "vpc offering description"
188
+
189
+- name: test rename vpc offer in check_mode
190
+  cs_vpc_offering:
191
+    name: "{{ cs_resource_prefix }}_vpc"
192
+    display_text: "vpc offering description renamed"
193
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
194
+    service_providers:
195
+      - { service: 'dns', provider: 'virtualrouter' }
196
+      - { service: 'dhcp', provider: 'virtualrouter' }
197
+    state: disabled
198
+  register: vpcoffer
199
+  check_mode: yes
200
+- name: verify results of rename vpc offer in check_mode
201
+  assert:
202
+    that:
203
+    - vpcoffer is successful
204
+    - vpcoffer is changed
205
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
206
+    - vpcoffer.state == "Disabled"
207
+    - vpcoffer.display_text == "vpc offering description"
208
+
209
+- name: test rename vpc offer
210
+  cs_vpc_offering:
211
+    name: "{{ cs_resource_prefix }}_vpc"
212
+    display_text: "vpc offering description renamed"
213
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
214
+    service_providers:
215
+      - { service: 'dns', provider: 'virtualrouter' }
216
+      - { service: 'dhcp', provider: 'virtualrouter' }
217
+    state: disabled
218
+  register: vpcoffer
219
+- name: verify results of rename vpc offer
220
+  assert:
221
+    that:
222
+    - vpcoffer is successful
223
+    - vpcoffer is changed
224
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
225
+    - vpcoffer.state == "Disabled"
226
+    - vpcoffer.display_text == "vpc offering description renamed"
227
+
228
+- name: test rename vpc offer idempotence
229
+  cs_vpc_offering:
230
+    name: "{{ cs_resource_prefix }}_vpc"
231
+    display_text: "vpc offering description renamed"
232
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
233
+    service_providers:
234
+      - { service: 'dns', provider: 'virtualrouter' }
235
+      - { service: 'dhcp', provider: 'virtualrouter' }
236
+    state: disabled
237
+  register: vpcoffer
238
+- name: verify results of rename vpc offer idempotence
239
+  assert:
240
+    that:
241
+    - vpcoffer is successful
242
+    - vpcoffer is not changed
243
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
244
+    - vpcoffer.state == "Disabled"
245
+    - vpcoffer.display_text == "vpc offering description renamed"
246
+
247
+- name: test update offer with minimal params in check_mode
248
+  cs_vpc_offering:
249
+    name: "{{ cs_resource_prefix }}_vpc"
250
+    display_text: "vpc offering description update"
251
+  register: vpcoffer
252
+  check_mode: yes
253
+- name: verify results of update offer with minimal params in check_mode
254
+  assert:
255
+    that:
256
+    - vpcoffer is successful
257
+    - vpcoffer is changed
258
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
259
+    - vpcoffer.state == "Disabled"
260
+    - vpcoffer.display_text == "vpc offering description renamed"
261
+
262
+- name: test update offer with minimal params
263
+  cs_vpc_offering:
264
+    name: "{{ cs_resource_prefix }}_vpc"
265
+    display_text: "vpc offering description update"
266
+  register: vpcoffer
267
+- name: verify results of update offer with minimal params
268
+  assert:
269
+    that:
270
+    - vpcoffer is successful
271
+    - vpcoffer is changed
272
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
273
+    - vpcoffer.state == "Disabled"
274
+    - vpcoffer.display_text == "vpc offering description update"
275
+
276
+- name: test update offer with minimal params idempotency
277
+  cs_vpc_offering:
278
+    name: "{{ cs_resource_prefix }}_vpc"
279
+    display_text: "vpc offering description update"
280
+  register: vpcoffer
281
+- name: verify results of update offer with minimal params idempotency
282
+  assert:
283
+    that:
284
+    - vpcoffer is successful
285
+    - vpcoffer is not changed
286
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
287
+    - vpcoffer.state == "Disabled"
288
+    - vpcoffer.display_text == "vpc offering description update"
289
+
290
+- name: test remove vpc offer in check_mode
291
+  cs_vpc_offering:
292
+    name: "{{ cs_resource_prefix }}_vpc"
293
+    state: absent
294
+  register: vpcoffer
295
+  check_mode: yes
296
+- name: verify results of rename vpc offer in check_mode
297
+  assert:
298
+    that:
299
+    - vpcoffer is successful
300
+    - vpcoffer is changed
301
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
302
+    - vpcoffer.state == "Disabled"
303
+    - vpcoffer.display_text == "vpc offering description update"
304
+
305
+- name: test remove vpc offer
306
+  cs_vpc_offering:
307
+    name: "{{ cs_resource_prefix }}_vpc"
308
+    state: absent
309
+  register: vpcoffer
310
+- name: verify results of rename vpc offer
311
+  assert:
312
+    that:
313
+    - vpcoffer is successful
314
+    - vpcoffer is changed
315
+
316
+- name: test remove vpc offer idempotence
317
+  cs_vpc_offering:
318
+    name: "{{ cs_resource_prefix }}_vpc"
319
+    state: absent
320
+  register: vpcoffer
321
+- name: verify results of rename vpc offer idempotence
322
+  assert:
323
+    that:
324
+    - vpcoffer is successful
325
+    - vpcoffer is not changed
326
+
327
+- name: test create enabled vpc offer in check mode
328
+  cs_vpc_offering:
329
+    name: "{{ cs_resource_prefix }}_vpc"
330
+    display_text: "vpc offering description"
331
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
332
+    service_providers:
333
+      - { service: 'dns', provider: 'virtualrouter' }
334
+      - { service: 'dhcp', provider: 'virtualrouter' }
335
+    state: enabled
336
+  register: vpcoffer
337
+  check_mode: yes
338
+- name: verify results of create enabled vpc offer in check mode
339
+  assert:
340
+    that:
341
+    - vpcoffer is successful
342
+    - vpcoffer is changed
343
+
344
+- name: test create enabled vpc offer
345
+  cs_vpc_offering:
346
+    name: "{{ cs_resource_prefix }}_vpc"
347
+    display_text: "vpc offering description"
348
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
349
+    service_providers:
350
+      - { service: 'dns', provider: 'virtualrouter' }
351
+      - { service: 'dhcp', provider: 'virtualrouter' }
352
+    state: enabled
353
+  register: vpcoffer
354
+- name: verify results of create enabled vpc offer
355
+  assert:
356
+    that:
357
+    - vpcoffer is successful
358
+    - vpcoffer is changed
359
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
360
+    - vpcoffer.state == "Enabled"
361
+    - vpcoffer.display_text == "vpc offering description"
362
+
363
+- name: test create enabled vpc offer idempotence
364
+  cs_vpc_offering:
365
+    name: "{{ cs_resource_prefix }}_vpc"
366
+    display_text: "vpc offering description"
367
+    supported_services: [ Dns, PortForwarding, Dhcp, SourceNat, UserData, StaticNat, Vpn, Lb ]
368
+    service_providers:
369
+      - { service: 'dns', provider: 'virtualrouter' }
370
+      - { service: 'dhcp', provider: 'virtualrouter' }
371
+    state: enabled
372
+  register: vpcoffer
373
+- name: verify results of create enabled vpc offer idempotence
374
+  assert:
375
+    that:
376
+    - vpcoffer is successful
377
+    - vpcoffer is not changed
378
+    - vpcoffer.name == "{{ cs_resource_prefix }}_vpc"
379
+    - vpcoffer.state == "Enabled"
380
+    - vpcoffer.display_text == "vpc offering description"
381
+
382
+- name: remove vpc offer
383
+  cs_vpc_offering:
384
+    name: "{{ cs_resource_prefix }}_vpc"
385
+    state: absent
386
+  register: vpcoffer
387
+- name: verify results of remove vpc offer
388
+  assert:
389
+    that:
390
+    - vpcoffer is successful
391
+    - vpcoffer is changed