stackmate 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.txt +7 -0
- data/README.md +25 -8
- data/bin/stackmate.rb +57 -53
- data/lib/stackmate/aws_attribs.rb +31 -31
- data/lib/stackmate/classmap.rb +33 -25
- data/lib/stackmate/client.rb +80 -0
- data/lib/stackmate/intrinsic_functions.rb +94 -38
- data/lib/stackmate/logging.rb +19 -19
- data/lib/stackmate/participants/cloudstack.rb +250 -165
- data/lib/stackmate/participants/cloudstack_affinitygroup.rb +122 -0
- data/lib/stackmate/participants/cloudstack_autoscalepolicy.rb +113 -0
- data/lib/stackmate/participants/cloudstack_autoscalevmgroup.rb +86 -0
- data/lib/stackmate/participants/cloudstack_autoscalevmprofile.rb +140 -0
- data/lib/stackmate/participants/cloudstack_condition.rb +122 -0
- data/lib/stackmate/participants/cloudstack_egressfirewallrule.rb +149 -0
- data/lib/stackmate/participants/cloudstack_firewallrule.rb +149 -0
- data/lib/stackmate/participants/cloudstack_globalloadbalancerrule.rb +158 -0
- data/lib/stackmate/participants/cloudstack_instancegroup.rb +113 -0
- data/lib/stackmate/participants/cloudstack_ipaddress.rb +149 -0
- data/lib/stackmate/participants/cloudstack_ipforwardingrule.rb +131 -0
- data/lib/stackmate/participants/cloudstack_iptonic.rb +95 -0
- data/lib/stackmate/participants/cloudstack_iso.rb +95 -0
- data/lib/stackmate/participants/cloudstack_lbhealthcheckpolicy.rb +140 -0
- data/lib/stackmate/participants/cloudstack_lbstickinesspolicy.rb +122 -0
- data/lib/stackmate/participants/cloudstack_loadbalancer.rb +158 -0
- data/lib/stackmate/participants/cloudstack_loadbalancerrule.rb +185 -0
- data/lib/stackmate/participants/cloudstack_network.rb +293 -0
- data/lib/stackmate/participants/cloudstack_networkacl.rb +176 -0
- data/lib/stackmate/participants/cloudstack_networkacllist.rb +104 -0
- data/lib/stackmate/participants/cloudstack_nictovirtualmachine.rb +104 -0
- data/lib/stackmate/participants/cloudstack_portforwardingrule.rb +176 -0
- data/lib/stackmate/participants/cloudstack_project.rb +113 -0
- data/lib/stackmate/participants/cloudstack_remoteaccessvpn.rb +122 -0
- data/lib/stackmate/participants/cloudstack_securitygroup.rb +122 -0
- data/lib/stackmate/participants/cloudstack_securitygroupegress.rb +185 -0
- data/lib/stackmate/participants/cloudstack_securitygroupingress.rb +185 -0
- data/lib/stackmate/participants/cloudstack_snapshot.rb +113 -0
- data/lib/stackmate/participants/cloudstack_snapshotpolicy.rb +122 -0
- data/lib/stackmate/participants/cloudstack_sshkeypair.rb +113 -0
- data/lib/stackmate/participants/cloudstack_staticnat.rb +113 -0
- data/lib/stackmate/participants/cloudstack_staticroute.rb +95 -0
- data/lib/stackmate/participants/cloudstack_tags.rb +113 -0
- data/lib/stackmate/participants/cloudstack_template.rb +212 -0
- data/lib/stackmate/participants/cloudstack_togloballoadbalancerrule.rb +104 -0
- data/lib/stackmate/participants/cloudstack_toloadbalancerrule.rb +95 -0
- data/lib/stackmate/participants/cloudstack_virtualmachine.rb +348 -0
- data/lib/stackmate/participants/cloudstack_virtualmachineops.rb +95 -0
- data/lib/stackmate/participants/cloudstack_vmsnapshot.rb +113 -0
- data/lib/stackmate/participants/cloudstack_volume.rb +176 -0
- data/lib/stackmate/participants/cloudstack_volumeops.rb +111 -0
- data/lib/stackmate/participants/cloudstack_vpc.rb +158 -0
- data/lib/stackmate/participants/cloudstack_vpnconnection.rb +95 -0
- data/lib/stackmate/participants/cloudstack_vpncustomergateway.rb +176 -0
- data/lib/stackmate/participants/cloudstack_vpngateway.rb +86 -0
- data/lib/stackmate/participants/cloudstack_vpnuser.rb +122 -0
- data/lib/stackmate/participants/common.rb +219 -70
- data/lib/stackmate/participants/stacknest.rb +6 -0
- data/lib/stackmate/resolver.rb +122 -0
- data/lib/stackmate/stack.rb +116 -60
- data/lib/stackmate/stack_executor.rb +99 -37
- data/lib/stackmate/stackpi.rb +46 -0
- data/lib/stackmate/version.rb +1 -1
- data/lib/stackmate/waitcondition_server.rb +15 -15
- data/lib/stackmate.rb +1 -1
- data/stackmate.gemspec +2 -4
- metadata +70 -19
@@ -0,0 +1,212 @@
|
|
1
|
+
require 'stackmate/participants/cloudstack'
|
2
|
+
|
3
|
+
module StackMate
|
4
|
+
class CloudStackTemplate < 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['displaytext'] = get_displaytext
|
16
|
+
args['ostypeid'] = get_ostypeid
|
17
|
+
args['name'] = workitem['StackName'] +'-' +get_name
|
18
|
+
args['snapshotid'] = get_snapshotid if @props.has_key?('snapshotid')
|
19
|
+
args['details'] = get_details if @props.has_key?('details')
|
20
|
+
args['virtualmachineid'] = get_virtualmachineid if @props.has_key?('virtualmachineid')
|
21
|
+
args['requireshvm'] = get_requireshvm if @props.has_key?('requireshvm')
|
22
|
+
args['ispublic'] = get_ispublic if @props.has_key?('ispublic')
|
23
|
+
args['volumeid'] = get_volumeid if @props.has_key?('volumeid')
|
24
|
+
args['bits'] = get_bits if @props.has_key?('bits')
|
25
|
+
args['url'] = get_url if @props.has_key?('url')
|
26
|
+
args['templatetag'] = get_templatetag if @props.has_key?('templatetag')
|
27
|
+
args['isdynamicallyscalable'] = get_isdynamicallyscalable if @props.has_key?('isdynamicallyscalable')
|
28
|
+
args['passwordenabled'] = get_passwordenabled if @props.has_key?('passwordenabled')
|
29
|
+
args['isfeatured'] = get_isfeatured if @props.has_key?('isfeatured')
|
30
|
+
|
31
|
+
logger.info("Creating resource #{@name} with following arguments")
|
32
|
+
p args
|
33
|
+
result_obj = make_async_request('createTemplate',args)
|
34
|
+
resource_obj = result_obj['Template'.downcase]
|
35
|
+
#doing it this way since it is easier to change later, rather than cloning whole object
|
36
|
+
resource_obj.each_key do |k|
|
37
|
+
val = resource_obj[k]
|
38
|
+
if('id'.eql?(k))
|
39
|
+
k = 'physical_id'
|
40
|
+
end
|
41
|
+
workitem[@name][k] = val
|
42
|
+
end
|
43
|
+
set_tags(@props['tags'],workitem[@name]['physical_id'],"Template") if @props.has_key?('tags')
|
44
|
+
workitem['ResolvedNames'][@name] = name_cs
|
45
|
+
workitem['IdMap'][workitem[@name]['physical_id']] = @name
|
46
|
+
|
47
|
+
rescue NoMethodError => nme
|
48
|
+
logger.error("Create request failed for resource . Cleaning up the stack")
|
49
|
+
raise nme
|
50
|
+
rescue Exception => e
|
51
|
+
logger.error(e.message)
|
52
|
+
raise e
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
def delete
|
58
|
+
logger.debug("Deleting resource #{@name}")
|
59
|
+
begin
|
60
|
+
physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
|
61
|
+
if(!physical_id.nil?)
|
62
|
+
args = {'id' => physical_id
|
63
|
+
}
|
64
|
+
result_obj = make_async_request('deleteTemplate',args)
|
65
|
+
if (!(result_obj['error'] == true))
|
66
|
+
logger.info("Successfully deleted resource #{@name}")
|
67
|
+
else
|
68
|
+
logger.info("CloudStack error while deleting resource #{@name}")
|
69
|
+
end
|
70
|
+
else
|
71
|
+
logger.info("Resource not created in CloudStack. Skipping delete...")
|
72
|
+
end
|
73
|
+
rescue Exception => e
|
74
|
+
logger.error("Unable to delete resorce #{@name}")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def on_workitem
|
79
|
+
@name = workitem.participant_name
|
80
|
+
@props = workitem['Resources'][@name]['Properties']
|
81
|
+
@props.downcase_key
|
82
|
+
@resolved_names = workitem['ResolvedNames']
|
83
|
+
if workitem['params']['operation'] == 'create'
|
84
|
+
create
|
85
|
+
else
|
86
|
+
delete
|
87
|
+
end
|
88
|
+
reply
|
89
|
+
end
|
90
|
+
|
91
|
+
def get_displaytext
|
92
|
+
resolved_displaytext = get_resolved(@props["displaytext"],workitem)
|
93
|
+
if resolved_displaytext.nil? || !validate_param(resolved_displaytext,"string")
|
94
|
+
raise "Missing mandatory parameter displaytext for resource #{@name}"
|
95
|
+
end
|
96
|
+
resolved_displaytext
|
97
|
+
end
|
98
|
+
|
99
|
+
def get_ostypeid
|
100
|
+
resolved_ostypeid = get_resolved(@props["ostypeid"],workitem)
|
101
|
+
if resolved_ostypeid.nil? || !validate_param(resolved_ostypeid,"uuid")
|
102
|
+
raise "Missing mandatory parameter ostypeid for resource #{@name}"
|
103
|
+
end
|
104
|
+
resolved_ostypeid
|
105
|
+
end
|
106
|
+
|
107
|
+
def get_name
|
108
|
+
resolved_name = get_resolved(@props["name"],workitem)
|
109
|
+
if resolved_name.nil? || !validate_param(resolved_name,"string")
|
110
|
+
raise "Missing mandatory parameter name for resource #{@name}"
|
111
|
+
end
|
112
|
+
resolved_name
|
113
|
+
end
|
114
|
+
|
115
|
+
def get_snapshotid
|
116
|
+
resolved_snapshotid = get_resolved(@props['snapshotid'],workitem)
|
117
|
+
if resolved_snapshotid.nil? || !validate_param(resolved_snapshotid,"uuid")
|
118
|
+
raise "Malformed optional parameter snapshotid for resource #{@name}"
|
119
|
+
end
|
120
|
+
resolved_snapshotid
|
121
|
+
end
|
122
|
+
|
123
|
+
def get_details
|
124
|
+
resolved_details = get_resolved(@props['details'],workitem)
|
125
|
+
if resolved_details.nil? || !validate_param(resolved_details,"map")
|
126
|
+
raise "Malformed optional parameter details for resource #{@name}"
|
127
|
+
end
|
128
|
+
resolved_details
|
129
|
+
end
|
130
|
+
|
131
|
+
def get_virtualmachineid
|
132
|
+
resolved_virtualmachineid = get_resolved(@props['virtualmachineid'],workitem)
|
133
|
+
if resolved_virtualmachineid.nil? || !validate_param(resolved_virtualmachineid,"uuid")
|
134
|
+
raise "Malformed optional parameter virtualmachineid for resource #{@name}"
|
135
|
+
end
|
136
|
+
resolved_virtualmachineid
|
137
|
+
end
|
138
|
+
|
139
|
+
def get_requireshvm
|
140
|
+
resolved_requireshvm = get_resolved(@props['requireshvm'],workitem)
|
141
|
+
if resolved_requireshvm.nil? || !validate_param(resolved_requireshvm,"boolean")
|
142
|
+
raise "Malformed optional parameter requireshvm for resource #{@name}"
|
143
|
+
end
|
144
|
+
resolved_requireshvm
|
145
|
+
end
|
146
|
+
|
147
|
+
def get_ispublic
|
148
|
+
resolved_ispublic = get_resolved(@props['ispublic'],workitem)
|
149
|
+
if resolved_ispublic.nil? || !validate_param(resolved_ispublic,"boolean")
|
150
|
+
raise "Malformed optional parameter ispublic for resource #{@name}"
|
151
|
+
end
|
152
|
+
resolved_ispublic
|
153
|
+
end
|
154
|
+
|
155
|
+
def get_volumeid
|
156
|
+
resolved_volumeid = get_resolved(@props['volumeid'],workitem)
|
157
|
+
if resolved_volumeid.nil? || !validate_param(resolved_volumeid,"uuid")
|
158
|
+
raise "Malformed optional parameter volumeid for resource #{@name}"
|
159
|
+
end
|
160
|
+
resolved_volumeid
|
161
|
+
end
|
162
|
+
|
163
|
+
def get_bits
|
164
|
+
resolved_bits = get_resolved(@props['bits'],workitem)
|
165
|
+
if resolved_bits.nil? || !validate_param(resolved_bits,"integer")
|
166
|
+
raise "Malformed optional parameter bits for resource #{@name}"
|
167
|
+
end
|
168
|
+
resolved_bits
|
169
|
+
end
|
170
|
+
|
171
|
+
def get_url
|
172
|
+
resolved_url = get_resolved(@props['url'],workitem)
|
173
|
+
if resolved_url.nil? || !validate_param(resolved_url,"string")
|
174
|
+
raise "Malformed optional parameter url for resource #{@name}"
|
175
|
+
end
|
176
|
+
resolved_url
|
177
|
+
end
|
178
|
+
|
179
|
+
def get_templatetag
|
180
|
+
resolved_templatetag = get_resolved(@props['templatetag'],workitem)
|
181
|
+
if resolved_templatetag.nil? || !validate_param(resolved_templatetag,"string")
|
182
|
+
raise "Malformed optional parameter templatetag for resource #{@name}"
|
183
|
+
end
|
184
|
+
resolved_templatetag
|
185
|
+
end
|
186
|
+
|
187
|
+
def get_isdynamicallyscalable
|
188
|
+
resolved_isdynamicallyscalable = get_resolved(@props['isdynamicallyscalable'],workitem)
|
189
|
+
if resolved_isdynamicallyscalable.nil? || !validate_param(resolved_isdynamicallyscalable,"boolean")
|
190
|
+
raise "Malformed optional parameter isdynamicallyscalable for resource #{@name}"
|
191
|
+
end
|
192
|
+
resolved_isdynamicallyscalable
|
193
|
+
end
|
194
|
+
|
195
|
+
def get_passwordenabled
|
196
|
+
resolved_passwordenabled = get_resolved(@props['passwordenabled'],workitem)
|
197
|
+
if resolved_passwordenabled.nil? || !validate_param(resolved_passwordenabled,"boolean")
|
198
|
+
raise "Malformed optional parameter passwordenabled for resource #{@name}"
|
199
|
+
end
|
200
|
+
resolved_passwordenabled
|
201
|
+
end
|
202
|
+
|
203
|
+
def get_isfeatured
|
204
|
+
resolved_isfeatured = get_resolved(@props['isfeatured'],workitem)
|
205
|
+
if resolved_isfeatured.nil? || !validate_param(resolved_isfeatured,"boolean")
|
206
|
+
raise "Malformed optional parameter isfeatured for resource #{@name}"
|
207
|
+
end
|
208
|
+
resolved_isfeatured
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'stackmate/participants/cloudstack'
|
2
|
+
|
3
|
+
module StackMate
|
4
|
+
class CloudStackToGlobalLoadBalancerRule < 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['loadbalancerrulelist'] = get_loadbalancerrulelist
|
17
|
+
args['gslblbruleweightsmap'] = get_gslblbruleweightsmap if @props.has_key?('gslblbruleweightsmap')
|
18
|
+
|
19
|
+
logger.info("Creating resource #{@name} with following arguments")
|
20
|
+
p args
|
21
|
+
result_obj = make_async_request('assignToGlobalLoadBalancerRule',args)
|
22
|
+
resource_obj = result_obj['ToGlobalLoadBalancerRule'.downcase]
|
23
|
+
#doing it this way since it is easier to change later, rather than cloning whole object
|
24
|
+
resource_obj.each_key do |k|
|
25
|
+
val = resource_obj[k]
|
26
|
+
if('id'.eql?(k))
|
27
|
+
k = 'physical_id'
|
28
|
+
end
|
29
|
+
workitem[@name][k] = val
|
30
|
+
end
|
31
|
+
set_tags(@props['tags'],workitem[@name]['physical_id'],"ToGlobalLoadBalancerRule") if @props.has_key?('tags')
|
32
|
+
workitem['ResolvedNames'][@name] = name_cs
|
33
|
+
workitem['IdMap'][workitem[@name]['physical_id']] = @name
|
34
|
+
|
35
|
+
rescue NoMethodError => nme
|
36
|
+
logger.error("Create request failed for resource . Cleaning up the stack")
|
37
|
+
raise nme
|
38
|
+
rescue Exception => e
|
39
|
+
logger.error(e.message)
|
40
|
+
raise e
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def delete
|
46
|
+
logger.debug("Deleting resource #{@name}")
|
47
|
+
begin
|
48
|
+
physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
|
49
|
+
if(!physical_id.nil?)
|
50
|
+
args = {'loadbalancerrulelist' => physical_id
|
51
|
+
}
|
52
|
+
result_obj = make_async_request('removeToGlobalLoadBalancerRule',args)
|
53
|
+
if (!(result_obj['error'] == true))
|
54
|
+
logger.info("Successfully deleted resource #{@name}")
|
55
|
+
else
|
56
|
+
logger.info("CloudStack error while deleting resource #{@name}")
|
57
|
+
end
|
58
|
+
else
|
59
|
+
logger.info("Resource not created in CloudStack. Skipping delete...")
|
60
|
+
end
|
61
|
+
rescue Exception => e
|
62
|
+
logger.error("Unable to delete resorce #{@name}")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def on_workitem
|
67
|
+
@name = workitem.participant_name
|
68
|
+
@props = workitem['Resources'][@name]['Properties']
|
69
|
+
@props.downcase_key
|
70
|
+
@resolved_names = workitem['ResolvedNames']
|
71
|
+
if workitem['params']['operation'] == 'create'
|
72
|
+
create
|
73
|
+
else
|
74
|
+
delete
|
75
|
+
end
|
76
|
+
reply
|
77
|
+
end
|
78
|
+
|
79
|
+
def get_id
|
80
|
+
resolved_id = get_resolved(@props["id"],workitem)
|
81
|
+
if resolved_id.nil? || !validate_param(resolved_id,"uuid")
|
82
|
+
raise "Missing mandatory parameter id for resource #{@name}"
|
83
|
+
end
|
84
|
+
resolved_id
|
85
|
+
end
|
86
|
+
|
87
|
+
def get_loadbalancerrulelist
|
88
|
+
resolved_loadbalancerrulelist = get_resolved(@props["loadbalancerrulelist"],workitem)
|
89
|
+
if resolved_loadbalancerrulelist.nil? || !validate_param(resolved_loadbalancerrulelist,"list")
|
90
|
+
raise "Missing mandatory parameter loadbalancerrulelist for resource #{@name}"
|
91
|
+
end
|
92
|
+
resolved_loadbalancerrulelist
|
93
|
+
end
|
94
|
+
|
95
|
+
def get_gslblbruleweightsmap
|
96
|
+
resolved_gslblbruleweightsmap = get_resolved(@props['gslblbruleweightsmap'],workitem)
|
97
|
+
if resolved_gslblbruleweightsmap.nil? || !validate_param(resolved_gslblbruleweightsmap,"map")
|
98
|
+
raise "Malformed optional parameter gslblbruleweightsmap for resource #{@name}"
|
99
|
+
end
|
100
|
+
resolved_gslblbruleweightsmap
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'stackmate/participants/cloudstack'
|
2
|
+
|
3
|
+
module StackMate
|
4
|
+
class CloudStackToLoadBalancerRule < 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['virtualmachineids'] = get_virtualmachineids
|
17
|
+
|
18
|
+
logger.info("Creating resource #{@name} with following arguments")
|
19
|
+
p args
|
20
|
+
result_obj = make_async_request('assignToLoadBalancerRule',args)
|
21
|
+
resource_obj = result_obj['ToLoadBalancerRule'.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'],"ToLoadBalancerRule") 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 = {'virtualmachineids' => physical_id
|
50
|
+
}
|
51
|
+
result_obj = make_async_request('removeToLoadBalancerRule',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_virtualmachineids
|
87
|
+
resolved_virtualmachineids = get_resolved(@props["virtualmachineids"],workitem)
|
88
|
+
if resolved_virtualmachineids.nil? || !validate_param(resolved_virtualmachineids,"list")
|
89
|
+
raise "Missing mandatory parameter virtualmachineids for resource #{@name}"
|
90
|
+
end
|
91
|
+
resolved_virtualmachineids
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|