stackmate 0.0.4 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. data/CHANGELOG.txt +7 -0
  2. data/README.md +25 -8
  3. data/bin/stackmate.rb +57 -53
  4. data/lib/stackmate/aws_attribs.rb +31 -31
  5. data/lib/stackmate/classmap.rb +33 -25
  6. data/lib/stackmate/client.rb +80 -0
  7. data/lib/stackmate/intrinsic_functions.rb +94 -38
  8. data/lib/stackmate/logging.rb +19 -19
  9. data/lib/stackmate/participants/cloudstack.rb +250 -165
  10. data/lib/stackmate/participants/cloudstack_affinitygroup.rb +122 -0
  11. data/lib/stackmate/participants/cloudstack_autoscalepolicy.rb +113 -0
  12. data/lib/stackmate/participants/cloudstack_autoscalevmgroup.rb +86 -0
  13. data/lib/stackmate/participants/cloudstack_autoscalevmprofile.rb +140 -0
  14. data/lib/stackmate/participants/cloudstack_condition.rb +122 -0
  15. data/lib/stackmate/participants/cloudstack_egressfirewallrule.rb +149 -0
  16. data/lib/stackmate/participants/cloudstack_firewallrule.rb +149 -0
  17. data/lib/stackmate/participants/cloudstack_globalloadbalancerrule.rb +158 -0
  18. data/lib/stackmate/participants/cloudstack_instancegroup.rb +113 -0
  19. data/lib/stackmate/participants/cloudstack_ipaddress.rb +149 -0
  20. data/lib/stackmate/participants/cloudstack_ipforwardingrule.rb +131 -0
  21. data/lib/stackmate/participants/cloudstack_iptonic.rb +95 -0
  22. data/lib/stackmate/participants/cloudstack_iso.rb +95 -0
  23. data/lib/stackmate/participants/cloudstack_lbhealthcheckpolicy.rb +140 -0
  24. data/lib/stackmate/participants/cloudstack_lbstickinesspolicy.rb +122 -0
  25. data/lib/stackmate/participants/cloudstack_loadbalancer.rb +158 -0
  26. data/lib/stackmate/participants/cloudstack_loadbalancerrule.rb +185 -0
  27. data/lib/stackmate/participants/cloudstack_network.rb +293 -0
  28. data/lib/stackmate/participants/cloudstack_networkacl.rb +176 -0
  29. data/lib/stackmate/participants/cloudstack_networkacllist.rb +104 -0
  30. data/lib/stackmate/participants/cloudstack_nictovirtualmachine.rb +104 -0
  31. data/lib/stackmate/participants/cloudstack_portforwardingrule.rb +176 -0
  32. data/lib/stackmate/participants/cloudstack_project.rb +113 -0
  33. data/lib/stackmate/participants/cloudstack_remoteaccessvpn.rb +122 -0
  34. data/lib/stackmate/participants/cloudstack_securitygroup.rb +122 -0
  35. data/lib/stackmate/participants/cloudstack_securitygroupegress.rb +185 -0
  36. data/lib/stackmate/participants/cloudstack_securitygroupingress.rb +185 -0
  37. data/lib/stackmate/participants/cloudstack_snapshot.rb +113 -0
  38. data/lib/stackmate/participants/cloudstack_snapshotpolicy.rb +122 -0
  39. data/lib/stackmate/participants/cloudstack_sshkeypair.rb +113 -0
  40. data/lib/stackmate/participants/cloudstack_staticnat.rb +113 -0
  41. data/lib/stackmate/participants/cloudstack_staticroute.rb +95 -0
  42. data/lib/stackmate/participants/cloudstack_tags.rb +113 -0
  43. data/lib/stackmate/participants/cloudstack_template.rb +212 -0
  44. data/lib/stackmate/participants/cloudstack_togloballoadbalancerrule.rb +104 -0
  45. data/lib/stackmate/participants/cloudstack_toloadbalancerrule.rb +95 -0
  46. data/lib/stackmate/participants/cloudstack_virtualmachine.rb +348 -0
  47. data/lib/stackmate/participants/cloudstack_virtualmachineops.rb +95 -0
  48. data/lib/stackmate/participants/cloudstack_vmsnapshot.rb +113 -0
  49. data/lib/stackmate/participants/cloudstack_volume.rb +176 -0
  50. data/lib/stackmate/participants/cloudstack_volumeops.rb +111 -0
  51. data/lib/stackmate/participants/cloudstack_vpc.rb +158 -0
  52. data/lib/stackmate/participants/cloudstack_vpnconnection.rb +95 -0
  53. data/lib/stackmate/participants/cloudstack_vpncustomergateway.rb +176 -0
  54. data/lib/stackmate/participants/cloudstack_vpngateway.rb +86 -0
  55. data/lib/stackmate/participants/cloudstack_vpnuser.rb +122 -0
  56. data/lib/stackmate/participants/common.rb +219 -70
  57. data/lib/stackmate/participants/stacknest.rb +6 -0
  58. data/lib/stackmate/resolver.rb +122 -0
  59. data/lib/stackmate/stack.rb +116 -60
  60. data/lib/stackmate/stack_executor.rb +99 -37
  61. data/lib/stackmate/stackpi.rb +46 -0
  62. data/lib/stackmate/version.rb +1 -1
  63. data/lib/stackmate/waitcondition_server.rb +15 -15
  64. data/lib/stackmate.rb +1 -1
  65. data/stackmate.gemspec +2 -4
  66. metadata +70 -19
@@ -0,0 +1,348 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackVirtualMachine < CloudStackResource
5
+
6
+ include Logging
7
+ include Intrinsic
8
+ include Resolver
9
+ def create
10
+ logger.debug("Creating resource #{@name}")
11
+ workitem[@name] = {}
12
+ name_cs = workitem['StackName'] + '-' + @name
13
+ args={}
14
+ begin
15
+
16
+ args['templateid'] = get_templateid
17
+ args['serviceofferingid'] = get_serviceofferingid
18
+ args['zoneid'] = get_zoneid
19
+ args['securitygroupnames'] = get_securitygroupnames if @props.has_key?('securitygroupnames')
20
+ args['affinitygroupids'] = get_affinitygroupids if @props.has_key?('affinitygroupids')
21
+ args['startvm'] = get_startvm if @props.has_key?('startvm')
22
+ args['displayvm'] = get_displayvm if @props.has_key?('displayvm')
23
+ args['diskofferingid'] = get_diskofferingid if @props.has_key?('diskofferingid')
24
+ args['hypervisor'] = get_hypervisor if @props.has_key?('hypervisor')
25
+ args['keyboard'] = get_keyboard if @props.has_key?('keyboard')
26
+ args['name'] = workitem['StackName'] +'-' + get_name if @props.has_key?('name')
27
+ #args['iptonetworklist'] = get_iptonetworklist if @props.has_key?('iptonetworklist')
28
+ if @props.has_key?('iptonetworklist')
29
+ ipnetworklist = get_iptonetworklist
30
+ #split
31
+ list_params = ipnetworklist.split("&")
32
+ list_params.each do |p|
33
+ fields = p.split("=")
34
+ args[fields[0]] = fields[1]
35
+ end
36
+ end
37
+ args['networkids'] = get_networkids if @props.has_key?('networkids')
38
+ args['account'] = get_account if @props.has_key?('account')
39
+ args['userdata'] = get_userdata if @props.has_key?('userdata')
40
+ args['keypair'] = get_keypair if @props.has_key?('keypair')
41
+ args['projectid'] = get_projectid if @props.has_key?('projectid')
42
+ args['ipaddress'] = get_ipaddress if @props.has_key?('ipaddress')
43
+ args['displayname'] = get_displayname if @props.has_key?('displayname')
44
+ args['ip6address'] = get_ip6address if @props.has_key?('ip6address')
45
+ args['affinitygroupnames'] = get_affinitygroupnames if @props.has_key?('affinitygroupnames')
46
+ args['domainid'] = get_domainid if @props.has_key?('domainid')
47
+ args['size'] = get_size if @props.has_key?('size')
48
+ args['hostid'] = get_hostid if @props.has_key?('hostid')
49
+ args['securitygroupids'] = get_securitygroupids if @props.has_key?('securitygroupids')
50
+ args['group'] = get_group if @props.has_key?('group')
51
+
52
+ logger.info("Creating resource #{@name} with following arguments")
53
+ p args
54
+ result_obj = make_async_request('deployVirtualMachine',args)
55
+ resource_obj = result_obj['VirtualMachine'.downcase]
56
+ #doing it this way since it is easier to change later, rather than cloning whole object
57
+ resource_obj.each_key do |k|
58
+ val = resource_obj[k]
59
+ if('id'.eql?(k))
60
+ k = 'physical_id'
61
+ end
62
+ workitem[@name][k] = val
63
+ end
64
+ workitem[@name][:PrivateIp] = resource_obj['nic'][0]['ipaddress']
65
+ set_tags(@props['tags'],workitem[@name]['physical_id'],"UserVm") if @props.has_key?('tags')
66
+ workitem['ResolvedNames'][@name] = name_cs
67
+ workitem['IdMap'][workitem[@name]['physical_id']] = @name
68
+
69
+ rescue NoMethodError => nme
70
+ logger.error("Create request failed for resource #{@name}. Cleaning up the stack")
71
+ raise nme
72
+ rescue Exception => e
73
+ logger.error(e.message)
74
+ raise e
75
+ end
76
+
77
+ end
78
+
79
+ def delete
80
+ logger.debug("Deleting resource #{@name}")
81
+ begin
82
+ physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
83
+ if(!physical_id.nil?)
84
+ args = {'id' => physical_id
85
+ }
86
+ result_obj = make_async_request('destroyVirtualMachine',args)
87
+ if (!(result_obj['error'] == true))
88
+ logger.info("Successfully deleted resource #{@name}")
89
+ else
90
+ logger.info("CloudStack error while deleting resource #{@name}")
91
+ end
92
+ else
93
+ logger.info("Resource not created in CloudStack. Skipping delete...")
94
+ end
95
+ rescue Exception => e
96
+ logger.error("Unable to delete resorce #{@name}")
97
+ end
98
+ end
99
+
100
+ def on_workitem
101
+ @name = workitem.participant_name
102
+ @props = workitem['Resources'][@name]['Properties']
103
+ @props.downcase_key
104
+ @resolved_names = workitem['ResolvedNames']
105
+ if workitem['params']['operation'] == 'create'
106
+ create
107
+ else
108
+ delete
109
+ end
110
+ reply
111
+ end
112
+
113
+
114
+ def get_templateid
115
+ resolved_templateid = get_resolved(@props["templateid"],workitem)
116
+ if resolved_templateid.nil? || !validate_param(resolved_templateid,"uuid")
117
+ raise "Missing mandatory parameter templateid for resource #{@name}"
118
+ end
119
+ resolved_templateid
120
+ end
121
+
122
+
123
+ def get_serviceofferingid
124
+ resolved_serviceofferingid = get_resolved(@props["serviceofferingid"],workitem)
125
+ if resolved_serviceofferingid.nil? || !validate_param(resolved_serviceofferingid,"uuid")
126
+ raise "Missing mandatory parameter serviceofferingid for resource #{@name}"
127
+ end
128
+ resolved_serviceofferingid
129
+ end
130
+
131
+
132
+ def get_zoneid
133
+ resolved_zoneid = get_resolved(@props["zoneid"],workitem)
134
+ if resolved_zoneid.nil? || !validate_param(resolved_zoneid,"uuid")
135
+ raise "Missing mandatory parameter zoneid for resource #{@name}"
136
+ end
137
+ resolved_zoneid
138
+ end
139
+
140
+
141
+ def get_securitygroupnames
142
+ resolved_securitygroupnames = get_resolved(@props['securitygroupnames'],workitem)
143
+ if resolved_securitygroupnames.nil? || !validate_param(resolved_securitygroupnames,"list")
144
+ raise "Malformed optional parameter securitygroupnames for resource #{@name}"
145
+ end
146
+ resolved_securitygroupnames
147
+ end
148
+
149
+
150
+ def get_affinitygroupids
151
+ resolved_affinitygroupids = get_resolved(@props['affinitygroupids'],workitem)
152
+ if resolved_affinitygroupids.nil? || !validate_param(resolved_affinitygroupids,"list")
153
+ raise "Malformed optional parameter affinitygroupids for resource #{@name}"
154
+ end
155
+ resolved_affinitygroupids
156
+ end
157
+
158
+
159
+ def get_startvm
160
+ resolved_startvm = get_resolved(@props['startvm'],workitem)
161
+ if resolved_startvm.nil? || !validate_param(resolved_startvm,"boolean")
162
+ raise "Malformed optional parameter startvm for resource #{@name}"
163
+ end
164
+ resolved_startvm
165
+ end
166
+
167
+
168
+ def get_displayvm
169
+ resolved_displayvm = get_resolved(@props['displayvm'],workitem)
170
+ if resolved_displayvm.nil? || !validate_param(resolved_displayvm,"boolean")
171
+ raise "Malformed optional parameter displayvm for resource #{@name}"
172
+ end
173
+ resolved_displayvm
174
+ end
175
+
176
+
177
+ def get_diskofferingid
178
+ resolved_diskofferingid = get_resolved(@props['diskofferingid'],workitem)
179
+ if resolved_diskofferingid.nil? || !validate_param(resolved_diskofferingid,"uuid")
180
+ raise "Malformed optional parameter diskofferingid for resource #{@name}"
181
+ end
182
+ resolved_diskofferingid
183
+ end
184
+
185
+
186
+ def get_hypervisor
187
+ resolved_hypervisor = get_resolved(@props['hypervisor'],workitem)
188
+ if resolved_hypervisor.nil? || !validate_param(resolved_hypervisor,"string")
189
+ raise "Malformed optional parameter hypervisor for resource #{@name}"
190
+ end
191
+ resolved_hypervisor
192
+ end
193
+
194
+
195
+ def get_keyboard
196
+ resolved_keyboard = get_resolved(@props['keyboard'],workitem)
197
+ if resolved_keyboard.nil? || !validate_param(resolved_keyboard,"string")
198
+ raise "Malformed optional parameter keyboard for resource #{@name}"
199
+ end
200
+ resolved_keyboard
201
+ end
202
+
203
+
204
+ def get_name
205
+ resolved_name = get_resolved(@props['name'],workitem)
206
+ if resolved_name.nil? || !validate_param(resolved_name,"string")
207
+ raise "Malformed optional parameter name for resource #{@name}"
208
+ end
209
+ resolved_name
210
+ end
211
+
212
+
213
+ def get_iptonetworklist
214
+ resolved_iptonetworklist = get_resolved(@props['iptonetworklist'],workitem)
215
+ if resolved_iptonetworklist.nil? || !validate_param(resolved_iptonetworklist,"map")
216
+ raise "Malformed optional parameter iptonetworklist for resource #{@name}"
217
+ end
218
+ resolved_iptonetworklist
219
+ end
220
+
221
+
222
+ def get_networkids
223
+ resolved_networkids = get_resolved(@props['networkids'],workitem)
224
+ if resolved_networkids.nil? || !validate_param(resolved_networkids,"list")
225
+ raise "Malformed optional parameter networkids for resource #{@name}"
226
+ end
227
+ resolved_networkids
228
+ end
229
+
230
+
231
+ def get_account
232
+ resolved_account = get_resolved(@props['account'],workitem)
233
+ if resolved_account.nil? || !validate_param(resolved_account,"string")
234
+ raise "Malformed optional parameter account for resource #{@name}"
235
+ end
236
+ resolved_account
237
+ end
238
+
239
+
240
+ def get_userdata
241
+ resolved_userdata = get_resolved(@props['userdata'],workitem)
242
+ if resolved_userdata.nil? || !validate_param(resolved_userdata,"string")
243
+ raise "Malformed optional parameter userdata for resource #{@name}"
244
+ end
245
+ resolved_userdata
246
+ end
247
+
248
+
249
+ def get_keypair
250
+ resolved_keypair = get_resolved(@props['keypair'],workitem)
251
+ if resolved_keypair.nil? || !validate_param(resolved_keypair,"string")
252
+ raise "Malformed optional parameter keypair for resource #{@name}"
253
+ end
254
+ resolved_keypair
255
+ end
256
+
257
+
258
+ def get_projectid
259
+ resolved_projectid = get_resolved(@props['projectid'],workitem)
260
+ if resolved_projectid.nil? || !validate_param(resolved_projectid,"uuid")
261
+ raise "Malformed optional parameter projectid for resource #{@name}"
262
+ end
263
+ resolved_projectid
264
+ end
265
+
266
+
267
+ def get_ipaddress
268
+ resolved_ipaddress = get_resolved(@props['ipaddress'],workitem)
269
+ if resolved_ipaddress.nil? || !validate_param(resolved_ipaddress,"string")
270
+ raise "Malformed optional parameter ipaddress for resource #{@name}"
271
+ end
272
+ resolved_ipaddress
273
+ end
274
+
275
+
276
+ def get_displayname
277
+ resolved_displayname = get_resolved(@props['displayname'],workitem)
278
+ if resolved_displayname.nil? || !validate_param(resolved_displayname,"string")
279
+ raise "Malformed optional parameter displayname for resource #{@name}"
280
+ end
281
+ resolved_displayname
282
+ end
283
+
284
+
285
+ def get_ip6address
286
+ resolved_ip6address = get_resolved(@props['ip6address'],workitem)
287
+ if resolved_ip6address.nil? || !validate_param(resolved_ip6address,"string")
288
+ raise "Malformed optional parameter ip6address for resource #{@name}"
289
+ end
290
+ resolved_ip6address
291
+ end
292
+
293
+
294
+ def get_affinitygroupnames
295
+ resolved_affinitygroupnames = get_resolved(@props['affinitygroupnames'],workitem)
296
+ if resolved_affinitygroupnames.nil? || !validate_param(resolved_affinitygroupnames,"list")
297
+ raise "Malformed optional parameter affinitygroupnames for resource #{@name}"
298
+ end
299
+ resolved_affinitygroupnames
300
+ end
301
+
302
+
303
+ def get_domainid
304
+ resolved_domainid = get_resolved(@props['domainid'],workitem)
305
+ if resolved_domainid.nil? || !validate_param(resolved_domainid,"uuid")
306
+ raise "Malformed optional parameter domainid for resource #{@name}"
307
+ end
308
+ resolved_domainid
309
+ end
310
+
311
+
312
+ def get_size
313
+ resolved_size = get_resolved(@props['size'],workitem)
314
+ if resolved_size.nil? || !validate_param(resolved_size,"long")
315
+ raise "Malformed optional parameter size for resource #{@name}"
316
+ end
317
+ resolved_size
318
+ end
319
+
320
+
321
+ def get_hostid
322
+ resolved_hostid = get_resolved(@props['hostid'],workitem)
323
+ if resolved_hostid.nil? || !validate_param(resolved_hostid,"uuid")
324
+ raise "Malformed optional parameter hostid for resource #{@name}"
325
+ end
326
+ resolved_hostid
327
+ end
328
+
329
+
330
+ def get_securitygroupids
331
+ resolved_securitygroupids = get_resolved(@props['securitygroupids'],workitem)
332
+ if resolved_securitygroupids.nil? || !validate_param(resolved_securitygroupids,"list")
333
+ raise "Malformed optional parameter securitygroupids for resource #{@name}"
334
+ end
335
+ resolved_securitygroupids
336
+ end
337
+
338
+
339
+ def get_group
340
+ resolved_group = get_resolved(@props['group'],workitem)
341
+ if resolved_group.nil? || !validate_param(resolved_group,"string")
342
+ raise "Malformed optional parameter group for resource #{@name}"
343
+ end
344
+ resolved_group
345
+ end
346
+
347
+ end
348
+ end
@@ -0,0 +1,95 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackVirtualMachineOps < CloudStackResource
5
+
6
+ include Logging
7
+ include Intrinsic
8
+ include Resolver
9
+ def create
10
+ logger.debug("Creating resource #{@name}")
11
+ workitem[@name] = {}
12
+ name_cs = workitem['StackName'] + '-' + @name
13
+ args={}
14
+ begin
15
+ args['id'] = get_id
16
+ args['hostid'] = get_hostid if @props.has_key?('hostid')
17
+
18
+ logger.info("Creating resource #{@name} with following arguments")
19
+ p args
20
+ result_obj = make_async_request('startVirtualMachine',args)
21
+ resource_obj = result_obj['VirtualMachine'.downcase]
22
+ #doing it this way since it is easier to change later, rather than cloning whole object
23
+ resource_obj.each_key do |k|
24
+ val = resource_obj[k]
25
+ if('id'.eql?(k))
26
+ k = 'physical_id'
27
+ end
28
+ workitem[@name][k] = val
29
+ end
30
+ set_tags(@props['tags'],workitem[@name]['physical_id'],"UserVM") if @props.has_key?('tags')
31
+ workitem['ResolvedNames'][@name] = name_cs
32
+ workitem['IdMap'][workitem[@name]['physical_id']] = @name
33
+
34
+ rescue NoMethodError => nme
35
+ logger.error("Create request failed for resource . Cleaning up the stack")
36
+ raise nme
37
+ rescue Exception => e
38
+ logger.error(e.message)
39
+ raise e
40
+ end
41
+
42
+ end
43
+
44
+ def delete
45
+ logger.debug("Deleting resource #{@name}")
46
+ begin
47
+ physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
48
+ if(!physical_id.nil?)
49
+ args = {'id' => physical_id
50
+ }
51
+ result_obj = make_async_request('stopVirtualMachine',args)
52
+ if (!(result_obj['error'] == true))
53
+ logger.info("Successfully deleted resource #{@name}")
54
+ else
55
+ logger.info("CloudStack error while deleting resource #{@name}")
56
+ end
57
+ else
58
+ logger.info("Resource not created in CloudStack. Skipping delete...")
59
+ end
60
+ rescue Exception => e
61
+ logger.error("Unable to delete resorce #{@name}")
62
+ end
63
+ end
64
+
65
+ def on_workitem
66
+ @name = workitem.participant_name
67
+ @props = workitem['Resources'][@name]['Properties']
68
+ @props.downcase_key
69
+ @resolved_names = workitem['ResolvedNames']
70
+ if workitem['params']['operation'] == 'create'
71
+ create
72
+ else
73
+ delete
74
+ end
75
+ reply
76
+ end
77
+
78
+ def get_id
79
+ resolved_id = get_resolved(@props["id"],workitem)
80
+ if resolved_id.nil? || !validate_param(resolved_id,"uuid")
81
+ raise "Missing mandatory parameter id for resource #{@name}"
82
+ end
83
+ resolved_id
84
+ end
85
+
86
+ def get_hostid
87
+ resolved_hostid = get_resolved(@props['hostid'],workitem)
88
+ if resolved_hostid.nil? || !validate_param(resolved_hostid,"uuid")
89
+ raise "Malformed optional parameter hostid for resource #{@name}"
90
+ end
91
+ resolved_hostid
92
+ end
93
+ end
94
+ end
95
+
@@ -0,0 +1,113 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackVMSnapshot < CloudStackResource
5
+
6
+ include Logging
7
+ include Intrinsic
8
+ include Resolver
9
+ def create
10
+ logger.debug("Creating resource #{@name}")
11
+ workitem[@name] = {}
12
+ name_cs = workitem['StackName'] + '-' + @name
13
+ args={}
14
+ begin
15
+ args['virtualmachineid'] = get_virtualmachineid
16
+ args['description'] = get_description if @props.has_key?('description')
17
+ args['snapshotmemory'] = get_snapshotmemory if @props.has_key?('snapshotmemory')
18
+ args['name'] = workitem['StackName'] +'-' +get_name if @props.has_key?('name')
19
+
20
+ logger.info("Creating resource #{@name} with following arguments")
21
+ p args
22
+ result_obj = make_async_request('createVMSnapshot',args)
23
+ resource_obj = result_obj['VMSnapshot'.downcase]
24
+ #doing it this way since it is easier to change later, rather than cloning whole object
25
+ resource_obj.each_key do |k|
26
+ val = resource_obj[k]
27
+ if('id'.eql?(k))
28
+ k = 'physical_id'
29
+ end
30
+ workitem[@name][k] = val
31
+ end
32
+ set_tags(@props['tags'],workitem[@name]['physical_id'],"VMSnapshot") if @props.has_key?('tags')
33
+ workitem['ResolvedNames'][@name] = name_cs
34
+ workitem['IdMap'][workitem[@name]['physical_id']] = @name
35
+
36
+ rescue NoMethodError => nme
37
+ logger.error("Create request failed for resource . Cleaning up the stack")
38
+ raise nme
39
+ rescue Exception => e
40
+ logger.error(e.message)
41
+ raise e
42
+ end
43
+
44
+ end
45
+
46
+ def delete
47
+ logger.debug("Deleting resource #{@name}")
48
+ begin
49
+ physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
50
+ if(!physical_id.nil?)
51
+ args = {'vmsnapshotid' => physical_id
52
+ }
53
+ result_obj = make_async_request('deleteVMSnapshot',args)
54
+ if (!(result_obj['error'] == true))
55
+ logger.info("Successfully deleted resource #{@name}")
56
+ else
57
+ logger.info("CloudStack error while deleting resource #{@name}")
58
+ end
59
+ else
60
+ logger.info("Resource not created in CloudStack. Skipping delete...")
61
+ end
62
+ rescue Exception => e
63
+ logger.error("Unable to delete resorce #{@name}")
64
+ end
65
+ end
66
+
67
+ def on_workitem
68
+ @name = workitem.participant_name
69
+ @props = workitem['Resources'][@name]['Properties']
70
+ @props.downcase_key
71
+ @resolved_names = workitem['ResolvedNames']
72
+ if workitem['params']['operation'] == 'create'
73
+ create
74
+ else
75
+ delete
76
+ end
77
+ reply
78
+ end
79
+
80
+ def get_virtualmachineid
81
+ resolved_virtualmachineid = get_resolved(@props["virtualmachineid"],workitem)
82
+ if resolved_virtualmachineid.nil? || !validate_param(resolved_virtualmachineid,"uuid")
83
+ raise "Missing mandatory parameter virtualmachineid for resource #{@name}"
84
+ end
85
+ resolved_virtualmachineid
86
+ end
87
+
88
+ def get_description
89
+ resolved_description = get_resolved(@props['description'],workitem)
90
+ if resolved_description.nil? || !validate_param(resolved_description,"string")
91
+ raise "Malformed optional parameter description for resource #{@name}"
92
+ end
93
+ resolved_description
94
+ end
95
+
96
+ def get_snapshotmemory
97
+ resolved_snapshotmemory = get_resolved(@props['snapshotmemory'],workitem)
98
+ if resolved_snapshotmemory.nil? || !validate_param(resolved_snapshotmemory,"boolean")
99
+ raise "Malformed optional parameter snapshotmemory for resource #{@name}"
100
+ end
101
+ resolved_snapshotmemory
102
+ end
103
+
104
+ def get_name
105
+ resolved_name = get_resolved(@props['name'],workitem)
106
+ if resolved_name.nil? || !validate_param(resolved_name,"string")
107
+ raise "Malformed optional parameter name for resource #{@name}"
108
+ end
109
+ resolved_name
110
+ end
111
+ end
112
+ end
113
+