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