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.
- 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,149 @@
|
|
1
|
+
require 'stackmate/participants/cloudstack'
|
2
|
+
|
3
|
+
module StackMate
|
4
|
+
class CloudStackFirewallRule < 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['protocol'] = get_protocol
|
16
|
+
args['ipaddressid'] = get_ipaddressid
|
17
|
+
args['startport'] = get_startport if @props.has_key?('startport')
|
18
|
+
args['cidrlist'] = get_cidrlist if @props.has_key?('cidrlist')
|
19
|
+
args['icmpcode'] = get_icmpcode if @props.has_key?('icmpcode')
|
20
|
+
args['type'] = get_type if @props.has_key?('type')
|
21
|
+
args['icmptype'] = get_icmptype if @props.has_key?('icmptype')
|
22
|
+
args['endport'] = get_endport if @props.has_key?('endport')
|
23
|
+
|
24
|
+
logger.info("Creating resource #{@name} with following arguments")
|
25
|
+
p args
|
26
|
+
result_obj = make_async_request('createFirewallRule',args)
|
27
|
+
resource_obj = result_obj['FirewallRule'.downcase]
|
28
|
+
#doing it this way since it is easier to change later, rather than cloning whole object
|
29
|
+
resource_obj.each_key do |k|
|
30
|
+
val = resource_obj[k]
|
31
|
+
if('id'.eql?(k))
|
32
|
+
k = 'physical_id'
|
33
|
+
end
|
34
|
+
workitem[@name][k] = val
|
35
|
+
end
|
36
|
+
set_tags(@props['tags'],workitem[@name]['physical_id'],"FirewallRule") if @props.has_key?('tags')
|
37
|
+
workitem['ResolvedNames'][@name] = name_cs
|
38
|
+
workitem['IdMap'][workitem[@name]['physical_id']] = @name
|
39
|
+
|
40
|
+
rescue NoMethodError => nme
|
41
|
+
logger.error("Create request failed for resource . Cleaning up the stack")
|
42
|
+
raise nme
|
43
|
+
rescue Exception => e
|
44
|
+
logger.error(e.message)
|
45
|
+
raise e
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
def delete
|
51
|
+
logger.debug("Deleting resource #{@name}")
|
52
|
+
begin
|
53
|
+
physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
|
54
|
+
if(!physical_id.nil?)
|
55
|
+
args = {'id' => physical_id
|
56
|
+
}
|
57
|
+
result_obj = make_async_request('deleteFirewallRule',args)
|
58
|
+
if (!(result_obj['error'] == true))
|
59
|
+
logger.info("Successfully deleted resource #{@name}")
|
60
|
+
else
|
61
|
+
logger.info("CloudStack error while deleting resource #{@name}")
|
62
|
+
end
|
63
|
+
else
|
64
|
+
logger.info("Resource not created in CloudStack. Skipping delete...")
|
65
|
+
end
|
66
|
+
rescue Exception => e
|
67
|
+
logger.error("Unable to delete resorce #{@name}")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def on_workitem
|
72
|
+
@name = workitem.participant_name
|
73
|
+
@props = workitem['Resources'][@name]['Properties']
|
74
|
+
@props.downcase_key
|
75
|
+
@resolved_names = workitem['ResolvedNames']
|
76
|
+
if workitem['params']['operation'] == 'create'
|
77
|
+
create
|
78
|
+
else
|
79
|
+
delete
|
80
|
+
end
|
81
|
+
reply
|
82
|
+
end
|
83
|
+
|
84
|
+
def get_protocol
|
85
|
+
resolved_protocol = get_resolved(@props["protocol"],workitem)
|
86
|
+
if resolved_protocol.nil? || !validate_param(resolved_protocol,"string")
|
87
|
+
raise "Missing mandatory parameter protocol for resource #{@name}"
|
88
|
+
end
|
89
|
+
resolved_protocol
|
90
|
+
end
|
91
|
+
|
92
|
+
def get_ipaddressid
|
93
|
+
resolved_ipaddressid = get_resolved(@props["ipaddressid"],workitem)
|
94
|
+
if resolved_ipaddressid.nil? || !validate_param(resolved_ipaddressid,"uuid")
|
95
|
+
raise "Missing mandatory parameter ipaddressid for resource #{@name}"
|
96
|
+
end
|
97
|
+
resolved_ipaddressid
|
98
|
+
end
|
99
|
+
|
100
|
+
def get_startport
|
101
|
+
resolved_startport = get_resolved(@props['startport'],workitem)
|
102
|
+
if resolved_startport.nil? || !validate_param(resolved_startport,"integer")
|
103
|
+
raise "Malformed optional parameter startport for resource #{@name}"
|
104
|
+
end
|
105
|
+
resolved_startport
|
106
|
+
end
|
107
|
+
|
108
|
+
def get_cidrlist
|
109
|
+
resolved_cidrlist = get_resolved(@props['cidrlist'],workitem)
|
110
|
+
if resolved_cidrlist.nil? || !validate_param(resolved_cidrlist,"list")
|
111
|
+
raise "Malformed optional parameter cidrlist for resource #{@name}"
|
112
|
+
end
|
113
|
+
resolved_cidrlist
|
114
|
+
end
|
115
|
+
|
116
|
+
def get_icmpcode
|
117
|
+
resolved_icmpcode = get_resolved(@props['icmpcode'],workitem)
|
118
|
+
if resolved_icmpcode.nil? || !validate_param(resolved_icmpcode,"integer")
|
119
|
+
raise "Malformed optional parameter icmpcode for resource #{@name}"
|
120
|
+
end
|
121
|
+
resolved_icmpcode
|
122
|
+
end
|
123
|
+
|
124
|
+
def get_type
|
125
|
+
resolved_type = get_resolved(@props['type'],workitem)
|
126
|
+
if resolved_type.nil? || !validate_param(resolved_type,"string")
|
127
|
+
raise "Malformed optional parameter type for resource #{@name}"
|
128
|
+
end
|
129
|
+
resolved_type
|
130
|
+
end
|
131
|
+
|
132
|
+
def get_icmptype
|
133
|
+
resolved_icmptype = get_resolved(@props['icmptype'],workitem)
|
134
|
+
if resolved_icmptype.nil? || !validate_param(resolved_icmptype,"integer")
|
135
|
+
raise "Malformed optional parameter icmptype for resource #{@name}"
|
136
|
+
end
|
137
|
+
resolved_icmptype
|
138
|
+
end
|
139
|
+
|
140
|
+
def get_endport
|
141
|
+
resolved_endport = get_resolved(@props['endport'],workitem)
|
142
|
+
if resolved_endport.nil? || !validate_param(resolved_endport,"integer")
|
143
|
+
raise "Malformed optional parameter endport for resource #{@name}"
|
144
|
+
end
|
145
|
+
resolved_endport
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
@@ -0,0 +1,158 @@
|
|
1
|
+
require 'stackmate/participants/cloudstack'
|
2
|
+
|
3
|
+
module StackMate
|
4
|
+
class CloudStackGlobalLoadBalancerRule < 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['regionid'] = get_regionid
|
16
|
+
args['gslbservicetype'] = get_gslbservicetype
|
17
|
+
args['gslbdomainname'] = get_gslbdomainname
|
18
|
+
args['name'] = workitem['StackName'] +'-' +get_name
|
19
|
+
args['account'] = get_account if @props.has_key?('account')
|
20
|
+
args['domainid'] = get_domainid if @props.has_key?('domainid')
|
21
|
+
args['gslbstickysessionmethodname'] = get_gslbstickysessionmethodname if @props.has_key?('gslbstickysessionmethodname')
|
22
|
+
args['description'] = get_description if @props.has_key?('description')
|
23
|
+
args['gslblbmethod'] = get_gslblbmethod if @props.has_key?('gslblbmethod')
|
24
|
+
|
25
|
+
logger.info("Creating resource #{@name} with following arguments")
|
26
|
+
p args
|
27
|
+
result_obj = make_async_request('createGlobalLoadBalancerRule',args)
|
28
|
+
resource_obj = result_obj['GlobalLoadBalancerRule'.downcase]
|
29
|
+
#doing it this way since it is easier to change later, rather than cloning whole object
|
30
|
+
resource_obj.each_key do |k|
|
31
|
+
val = resource_obj[k]
|
32
|
+
if('id'.eql?(k))
|
33
|
+
k = 'physical_id'
|
34
|
+
end
|
35
|
+
workitem[@name][k] = val
|
36
|
+
end
|
37
|
+
set_tags(@props['tags'],workitem[@name]['physical_id'],"GlobalLoadBalancerRule") if @props.has_key?('tags')
|
38
|
+
workitem['ResolvedNames'][@name] = name_cs
|
39
|
+
workitem['IdMap'][workitem[@name]['physical_id']] = @name
|
40
|
+
|
41
|
+
rescue NoMethodError => nme
|
42
|
+
logger.error("Create request failed for resource . Cleaning up the stack")
|
43
|
+
raise nme
|
44
|
+
rescue Exception => e
|
45
|
+
logger.error(e.message)
|
46
|
+
raise e
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
def delete
|
52
|
+
logger.debug("Deleting resource #{@name}")
|
53
|
+
begin
|
54
|
+
physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
|
55
|
+
if(!physical_id.nil?)
|
56
|
+
args = {'id' => physical_id
|
57
|
+
}
|
58
|
+
result_obj = make_async_request('deleteGlobalLoadBalancerRule',args)
|
59
|
+
if (!(result_obj['error'] == true))
|
60
|
+
logger.info("Successfully deleted resource #{@name}")
|
61
|
+
else
|
62
|
+
logger.info("CloudStack error while deleting resource #{@name}")
|
63
|
+
end
|
64
|
+
else
|
65
|
+
logger.info("Resource not created in CloudStack. Skipping delete...")
|
66
|
+
end
|
67
|
+
rescue Exception => e
|
68
|
+
logger.error("Unable to delete resorce #{@name}")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def on_workitem
|
73
|
+
@name = workitem.participant_name
|
74
|
+
@props = workitem['Resources'][@name]['Properties']
|
75
|
+
@props.downcase_key
|
76
|
+
@resolved_names = workitem['ResolvedNames']
|
77
|
+
if workitem['params']['operation'] == 'create'
|
78
|
+
create
|
79
|
+
else
|
80
|
+
delete
|
81
|
+
end
|
82
|
+
reply
|
83
|
+
end
|
84
|
+
|
85
|
+
def get_regionid
|
86
|
+
resolved_regionid = get_resolved(@props["regionid"],workitem)
|
87
|
+
if resolved_regionid.nil? || !validate_param(resolved_regionid,"integer")
|
88
|
+
raise "Missing mandatory parameter regionid for resource #{@name}"
|
89
|
+
end
|
90
|
+
resolved_regionid
|
91
|
+
end
|
92
|
+
|
93
|
+
def get_gslbservicetype
|
94
|
+
resolved_gslbservicetype = get_resolved(@props["gslbservicetype"],workitem)
|
95
|
+
if resolved_gslbservicetype.nil? || !validate_param(resolved_gslbservicetype,"string")
|
96
|
+
raise "Missing mandatory parameter gslbservicetype for resource #{@name}"
|
97
|
+
end
|
98
|
+
resolved_gslbservicetype
|
99
|
+
end
|
100
|
+
|
101
|
+
def get_gslbdomainname
|
102
|
+
resolved_gslbdomainname = get_resolved(@props["gslbdomainname"],workitem)
|
103
|
+
if resolved_gslbdomainname.nil? || !validate_param(resolved_gslbdomainname,"string")
|
104
|
+
raise "Missing mandatory parameter gslbdomainname for resource #{@name}"
|
105
|
+
end
|
106
|
+
resolved_gslbdomainname
|
107
|
+
end
|
108
|
+
|
109
|
+
def get_name
|
110
|
+
resolved_name = get_resolved(@props["name"],workitem)
|
111
|
+
if resolved_name.nil? || !validate_param(resolved_name,"string")
|
112
|
+
raise "Missing mandatory parameter name for resource #{@name}"
|
113
|
+
end
|
114
|
+
resolved_name
|
115
|
+
end
|
116
|
+
|
117
|
+
def get_account
|
118
|
+
resolved_account = get_resolved(@props['account'],workitem)
|
119
|
+
if resolved_account.nil? || !validate_param(resolved_account,"string")
|
120
|
+
raise "Malformed optional parameter account for resource #{@name}"
|
121
|
+
end
|
122
|
+
resolved_account
|
123
|
+
end
|
124
|
+
|
125
|
+
def get_domainid
|
126
|
+
resolved_domainid = get_resolved(@props['domainid'],workitem)
|
127
|
+
if resolved_domainid.nil? || !validate_param(resolved_domainid,"uuid")
|
128
|
+
raise "Malformed optional parameter domainid for resource #{@name}"
|
129
|
+
end
|
130
|
+
resolved_domainid
|
131
|
+
end
|
132
|
+
|
133
|
+
def get_gslbstickysessionmethodname
|
134
|
+
resolved_gslbstickysessionmethodname = get_resolved(@props['gslbstickysessionmethodname'],workitem)
|
135
|
+
if resolved_gslbstickysessionmethodname.nil? || !validate_param(resolved_gslbstickysessionmethodname,"string")
|
136
|
+
raise "Malformed optional parameter gslbstickysessionmethodname for resource #{@name}"
|
137
|
+
end
|
138
|
+
resolved_gslbstickysessionmethodname
|
139
|
+
end
|
140
|
+
|
141
|
+
def get_description
|
142
|
+
resolved_description = get_resolved(@props['description'],workitem)
|
143
|
+
if resolved_description.nil? || !validate_param(resolved_description,"string")
|
144
|
+
raise "Malformed optional parameter description for resource #{@name}"
|
145
|
+
end
|
146
|
+
resolved_description
|
147
|
+
end
|
148
|
+
|
149
|
+
def get_gslblbmethod
|
150
|
+
resolved_gslblbmethod = get_resolved(@props['gslblbmethod'],workitem)
|
151
|
+
if resolved_gslblbmethod.nil? || !validate_param(resolved_gslblbmethod,"string")
|
152
|
+
raise "Malformed optional parameter gslblbmethod for resource #{@name}"
|
153
|
+
end
|
154
|
+
resolved_gslblbmethod
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'stackmate/participants/cloudstack'
|
2
|
+
|
3
|
+
module StackMate
|
4
|
+
class CloudStackInstanceGroup < 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['name'] = workitem['StackName'] +'-' +get_name
|
16
|
+
args['account'] = get_account if @props.has_key?('account')
|
17
|
+
args['projectid'] = get_projectid if @props.has_key?('projectid')
|
18
|
+
args['domainid'] = get_domainid if @props.has_key?('domainid')
|
19
|
+
|
20
|
+
logger.info("Creating resource #{@name} with following arguments")
|
21
|
+
p args
|
22
|
+
result_obj = make_sync_request('createInstanceGroup',args)
|
23
|
+
resource_obj = result_obj['InstanceGroup'.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'],"InstanceGroup") 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 = {'id' => physical_id
|
52
|
+
}
|
53
|
+
result_obj = make_sync_request('deleteInstanceGroup',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_name
|
81
|
+
resolved_name = get_resolved(@props["name"],workitem)
|
82
|
+
if resolved_name.nil? || !validate_param(resolved_name,"string")
|
83
|
+
raise "Missing mandatory parameter name for resource #{@name}"
|
84
|
+
end
|
85
|
+
resolved_name
|
86
|
+
end
|
87
|
+
|
88
|
+
def get_account
|
89
|
+
resolved_account = get_resolved(@props['account'],workitem)
|
90
|
+
if resolved_account.nil? || !validate_param(resolved_account,"string")
|
91
|
+
raise "Malformed optional parameter account for resource #{@name}"
|
92
|
+
end
|
93
|
+
resolved_account
|
94
|
+
end
|
95
|
+
|
96
|
+
def get_projectid
|
97
|
+
resolved_projectid = get_resolved(@props['projectid'],workitem)
|
98
|
+
if resolved_projectid.nil? || !validate_param(resolved_projectid,"uuid")
|
99
|
+
raise "Malformed optional parameter projectid for resource #{@name}"
|
100
|
+
end
|
101
|
+
resolved_projectid
|
102
|
+
end
|
103
|
+
|
104
|
+
def get_domainid
|
105
|
+
resolved_domainid = get_resolved(@props['domainid'],workitem)
|
106
|
+
if resolved_domainid.nil? || !validate_param(resolved_domainid,"uuid")
|
107
|
+
raise "Malformed optional parameter domainid for resource #{@name}"
|
108
|
+
end
|
109
|
+
resolved_domainid
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'stackmate/participants/cloudstack'
|
2
|
+
|
3
|
+
module StackMate
|
4
|
+
class CloudStackIpAddress < 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['networkid'] = get_networkid if @props.has_key?('networkid')
|
16
|
+
args['domainid'] = get_domainid if @props.has_key?('domainid')
|
17
|
+
args['account'] = get_account if @props.has_key?('account')
|
18
|
+
args['vpcid'] = get_vpcid if @props.has_key?('vpcid')
|
19
|
+
args['regionid'] = get_regionid if @props.has_key?('regionid')
|
20
|
+
args['zoneid'] = get_zoneid if @props.has_key?('zoneid')
|
21
|
+
args['projectid'] = get_projectid if @props.has_key?('projectid')
|
22
|
+
args['isportable'] = get_isportable if @props.has_key?('isportable')
|
23
|
+
|
24
|
+
logger.info("Creating resource #{@name} with following arguments")
|
25
|
+
p args
|
26
|
+
result_obj = make_async_request('associateIpAddress',args)
|
27
|
+
resource_obj = result_obj['IpAddress'.downcase]
|
28
|
+
#doing it this way since it is easier to change later, rather than cloning whole object
|
29
|
+
resource_obj.each_key do |k|
|
30
|
+
val = resource_obj[k]
|
31
|
+
if('id'.eql?(k))
|
32
|
+
k = 'physical_id'
|
33
|
+
end
|
34
|
+
workitem[@name][k] = val
|
35
|
+
end
|
36
|
+
set_tags(@props['tags'],workitem[@name]['physical_id'],"IpAddress") if @props.has_key?('tags')
|
37
|
+
workitem['ResolvedNames'][@name] = name_cs
|
38
|
+
workitem['IdMap'][workitem[@name]['physical_id']] = @name
|
39
|
+
|
40
|
+
rescue NoMethodError => nme
|
41
|
+
logger.error("Create request failed for resource . Cleaning up the stack")
|
42
|
+
raise nme
|
43
|
+
rescue Exception => e
|
44
|
+
logger.error(e.message)
|
45
|
+
raise e
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
def delete
|
51
|
+
logger.debug("Deleting resource #{@name}")
|
52
|
+
begin
|
53
|
+
physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
|
54
|
+
if(!physical_id.nil?)
|
55
|
+
args = {'id' => physical_id
|
56
|
+
}
|
57
|
+
result_obj = make_async_request('disassociateIpAddress',args)
|
58
|
+
if (!(result_obj['error'] == true))
|
59
|
+
logger.info("Successfully deleted resource #{@name}")
|
60
|
+
else
|
61
|
+
logger.info("CloudStack error while deleting resource #{@name}")
|
62
|
+
end
|
63
|
+
else
|
64
|
+
logger.info("Resource not created in CloudStack. Skipping delete...")
|
65
|
+
end
|
66
|
+
rescue Exception => e
|
67
|
+
logger.error("Unable to delete resorce #{@name}")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def on_workitem
|
72
|
+
@name = workitem.participant_name
|
73
|
+
@props = workitem['Resources'][@name]['Properties']
|
74
|
+
@props.downcase_key
|
75
|
+
@resolved_names = workitem['ResolvedNames']
|
76
|
+
if workitem['params']['operation'] == 'create'
|
77
|
+
create
|
78
|
+
else
|
79
|
+
delete
|
80
|
+
end
|
81
|
+
reply
|
82
|
+
end
|
83
|
+
|
84
|
+
def get_networkid
|
85
|
+
resolved_networkid = get_resolved(@props['networkid'],workitem)
|
86
|
+
if resolved_networkid.nil? || !validate_param(resolved_networkid,"uuid")
|
87
|
+
raise "Malformed optional parameter networkid for resource #{@name}"
|
88
|
+
end
|
89
|
+
resolved_networkid
|
90
|
+
end
|
91
|
+
|
92
|
+
def get_domainid
|
93
|
+
resolved_domainid = get_resolved(@props['domainid'],workitem)
|
94
|
+
if resolved_domainid.nil? || !validate_param(resolved_domainid,"uuid")
|
95
|
+
raise "Malformed optional parameter domainid for resource #{@name}"
|
96
|
+
end
|
97
|
+
resolved_domainid
|
98
|
+
end
|
99
|
+
|
100
|
+
def get_account
|
101
|
+
resolved_account = get_resolved(@props['account'],workitem)
|
102
|
+
if resolved_account.nil? || !validate_param(resolved_account,"string")
|
103
|
+
raise "Malformed optional parameter account for resource #{@name}"
|
104
|
+
end
|
105
|
+
resolved_account
|
106
|
+
end
|
107
|
+
|
108
|
+
def get_vpcid
|
109
|
+
resolved_vpcid = get_resolved(@props['vpcid'],workitem)
|
110
|
+
if resolved_vpcid.nil? || !validate_param(resolved_vpcid,"uuid")
|
111
|
+
raise "Malformed optional parameter vpcid for resource #{@name}"
|
112
|
+
end
|
113
|
+
resolved_vpcid
|
114
|
+
end
|
115
|
+
|
116
|
+
def get_regionid
|
117
|
+
resolved_regionid = get_resolved(@props['regionid'],workitem)
|
118
|
+
if resolved_regionid.nil? || !validate_param(resolved_regionid,"integer")
|
119
|
+
raise "Malformed optional parameter regionid for resource #{@name}"
|
120
|
+
end
|
121
|
+
resolved_regionid
|
122
|
+
end
|
123
|
+
|
124
|
+
def get_zoneid
|
125
|
+
resolved_zoneid = get_resolved(@props['zoneid'],workitem)
|
126
|
+
if resolved_zoneid.nil? || !validate_param(resolved_zoneid,"uuid")
|
127
|
+
raise "Malformed optional parameter zoneid for resource #{@name}"
|
128
|
+
end
|
129
|
+
resolved_zoneid
|
130
|
+
end
|
131
|
+
|
132
|
+
def get_projectid
|
133
|
+
resolved_projectid = get_resolved(@props['projectid'],workitem)
|
134
|
+
if resolved_projectid.nil? || !validate_param(resolved_projectid,"uuid")
|
135
|
+
raise "Malformed optional parameter projectid for resource #{@name}"
|
136
|
+
end
|
137
|
+
resolved_projectid
|
138
|
+
end
|
139
|
+
|
140
|
+
def get_isportable
|
141
|
+
resolved_isportable = get_resolved(@props['isportable'],workitem)
|
142
|
+
if resolved_isportable.nil? || !validate_param(resolved_isportable,"boolean")
|
143
|
+
raise "Malformed optional parameter isportable for resource #{@name}"
|
144
|
+
end
|
145
|
+
resolved_isportable
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|