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,176 @@
|
|
1
|
+
require 'stackmate/participants/cloudstack'
|
2
|
+
|
3
|
+
module StackMate
|
4
|
+
class CloudStackVpnCustomerGateway < 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['esppolicy'] = get_esppolicy
|
16
|
+
args['ikepolicy'] = get_ikepolicy
|
17
|
+
args['ipsecpsk'] = get_ipsecpsk
|
18
|
+
args['cidrlist'] = get_cidrlist
|
19
|
+
args['gateway'] = get_gateway
|
20
|
+
args['esplifetime'] = get_esplifetime if @props.has_key?('esplifetime')
|
21
|
+
args['dpd'] = get_dpd if @props.has_key?('dpd')
|
22
|
+
args['name'] = workitem['StackName'] +'-' +get_name if @props.has_key?('name')
|
23
|
+
args['domainid'] = get_domainid if @props.has_key?('domainid')
|
24
|
+
args['ikelifetime'] = get_ikelifetime if @props.has_key?('ikelifetime')
|
25
|
+
args['account'] = get_account if @props.has_key?('account')
|
26
|
+
|
27
|
+
logger.info("Creating resource #{@name} with following arguments")
|
28
|
+
p args
|
29
|
+
result_obj = make_async_request('createVpnCustomerGateway',args)
|
30
|
+
resource_obj = result_obj['VpnCustomerGateway'.downcase]
|
31
|
+
#doing it this way since it is easier to change later, rather than cloning whole object
|
32
|
+
resource_obj.each_key do |k|
|
33
|
+
val = resource_obj[k]
|
34
|
+
if('id'.eql?(k))
|
35
|
+
k = 'physical_id'
|
36
|
+
end
|
37
|
+
workitem[@name][k] = val
|
38
|
+
end
|
39
|
+
set_tags(@props['tags'],workitem[@name]['physical_id'],"VpnCustomerGateway") if @props.has_key?('tags')
|
40
|
+
workitem['ResolvedNames'][@name] = name_cs
|
41
|
+
workitem['IdMap'][workitem[@name]['physical_id']] = @name
|
42
|
+
|
43
|
+
rescue NoMethodError => nme
|
44
|
+
logger.error("Create request failed for resource . Cleaning up the stack")
|
45
|
+
raise nme
|
46
|
+
rescue Exception => e
|
47
|
+
logger.error(e.message)
|
48
|
+
raise e
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
def delete
|
54
|
+
logger.debug("Deleting resource #{@name}")
|
55
|
+
begin
|
56
|
+
physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
|
57
|
+
if(!physical_id.nil?)
|
58
|
+
args = {'id' => physical_id
|
59
|
+
}
|
60
|
+
result_obj = make_async_request('deleteVpnCustomerGateway',args)
|
61
|
+
if (!(result_obj['error'] == true))
|
62
|
+
logger.info("Successfully deleted resource #{@name}")
|
63
|
+
else
|
64
|
+
logger.info("CloudStack error while deleting resource #{@name}")
|
65
|
+
end
|
66
|
+
else
|
67
|
+
logger.info("Resource not created in CloudStack. Skipping delete...")
|
68
|
+
end
|
69
|
+
rescue Exception => e
|
70
|
+
logger.error("Unable to delete resorce #{@name}")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def on_workitem
|
75
|
+
@name = workitem.participant_name
|
76
|
+
@props = workitem['Resources'][@name]['Properties']
|
77
|
+
@props.downcase_key
|
78
|
+
@resolved_names = workitem['ResolvedNames']
|
79
|
+
if workitem['params']['operation'] == 'create'
|
80
|
+
create
|
81
|
+
else
|
82
|
+
delete
|
83
|
+
end
|
84
|
+
reply
|
85
|
+
end
|
86
|
+
|
87
|
+
def get_esppolicy
|
88
|
+
resolved_esppolicy = get_resolved(@props["esppolicy"],workitem)
|
89
|
+
if resolved_esppolicy.nil? || !validate_param(resolved_esppolicy,"string")
|
90
|
+
raise "Missing mandatory parameter esppolicy for resource #{@name}"
|
91
|
+
end
|
92
|
+
resolved_esppolicy
|
93
|
+
end
|
94
|
+
|
95
|
+
def get_ikepolicy
|
96
|
+
resolved_ikepolicy = get_resolved(@props["ikepolicy"],workitem)
|
97
|
+
if resolved_ikepolicy.nil? || !validate_param(resolved_ikepolicy,"string")
|
98
|
+
raise "Missing mandatory parameter ikepolicy for resource #{@name}"
|
99
|
+
end
|
100
|
+
resolved_ikepolicy
|
101
|
+
end
|
102
|
+
|
103
|
+
def get_ipsecpsk
|
104
|
+
resolved_ipsecpsk = get_resolved(@props["ipsecpsk"],workitem)
|
105
|
+
if resolved_ipsecpsk.nil? || !validate_param(resolved_ipsecpsk,"string")
|
106
|
+
raise "Missing mandatory parameter ipsecpsk for resource #{@name}"
|
107
|
+
end
|
108
|
+
resolved_ipsecpsk
|
109
|
+
end
|
110
|
+
|
111
|
+
def get_cidrlist
|
112
|
+
resolved_cidrlist = get_resolved(@props["cidrlist"],workitem)
|
113
|
+
if resolved_cidrlist.nil? || !validate_param(resolved_cidrlist,"string")
|
114
|
+
raise "Missing mandatory parameter cidrlist for resource #{@name}"
|
115
|
+
end
|
116
|
+
resolved_cidrlist
|
117
|
+
end
|
118
|
+
|
119
|
+
def get_gateway
|
120
|
+
resolved_gateway = get_resolved(@props["gateway"],workitem)
|
121
|
+
if resolved_gateway.nil? || !validate_param(resolved_gateway,"string")
|
122
|
+
raise "Missing mandatory parameter gateway for resource #{@name}"
|
123
|
+
end
|
124
|
+
resolved_gateway
|
125
|
+
end
|
126
|
+
|
127
|
+
def get_esplifetime
|
128
|
+
resolved_esplifetime = get_resolved(@props['esplifetime'],workitem)
|
129
|
+
if resolved_esplifetime.nil? || !validate_param(resolved_esplifetime,"long")
|
130
|
+
raise "Malformed optional parameter esplifetime for resource #{@name}"
|
131
|
+
end
|
132
|
+
resolved_esplifetime
|
133
|
+
end
|
134
|
+
|
135
|
+
def get_dpd
|
136
|
+
resolved_dpd = get_resolved(@props['dpd'],workitem)
|
137
|
+
if resolved_dpd.nil? || !validate_param(resolved_dpd,"boolean")
|
138
|
+
raise "Malformed optional parameter dpd for resource #{@name}"
|
139
|
+
end
|
140
|
+
resolved_dpd
|
141
|
+
end
|
142
|
+
|
143
|
+
def get_name
|
144
|
+
resolved_name = get_resolved(@props['name'],workitem)
|
145
|
+
if resolved_name.nil? || !validate_param(resolved_name,"string")
|
146
|
+
raise "Malformed optional parameter name for resource #{@name}"
|
147
|
+
end
|
148
|
+
resolved_name
|
149
|
+
end
|
150
|
+
|
151
|
+
def get_domainid
|
152
|
+
resolved_domainid = get_resolved(@props['domainid'],workitem)
|
153
|
+
if resolved_domainid.nil? || !validate_param(resolved_domainid,"uuid")
|
154
|
+
raise "Malformed optional parameter domainid for resource #{@name}"
|
155
|
+
end
|
156
|
+
resolved_domainid
|
157
|
+
end
|
158
|
+
|
159
|
+
def get_ikelifetime
|
160
|
+
resolved_ikelifetime = get_resolved(@props['ikelifetime'],workitem)
|
161
|
+
if resolved_ikelifetime.nil? || !validate_param(resolved_ikelifetime,"long")
|
162
|
+
raise "Malformed optional parameter ikelifetime for resource #{@name}"
|
163
|
+
end
|
164
|
+
resolved_ikelifetime
|
165
|
+
end
|
166
|
+
|
167
|
+
def get_account
|
168
|
+
resolved_account = get_resolved(@props['account'],workitem)
|
169
|
+
if resolved_account.nil? || !validate_param(resolved_account,"string")
|
170
|
+
raise "Malformed optional parameter account for resource #{@name}"
|
171
|
+
end
|
172
|
+
resolved_account
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'stackmate/participants/cloudstack'
|
2
|
+
|
3
|
+
module StackMate
|
4
|
+
class CloudStackVpnGateway < 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['vpcid'] = get_vpcid
|
16
|
+
|
17
|
+
logger.info("Creating resource #{@name} with following arguments")
|
18
|
+
p args
|
19
|
+
result_obj = make_async_request('createVpnGateway',args)
|
20
|
+
resource_obj = result_obj['VpnGateway'.downcase]
|
21
|
+
#doing it this way since it is easier to change later, rather than cloning whole object
|
22
|
+
resource_obj.each_key do |k|
|
23
|
+
val = resource_obj[k]
|
24
|
+
if('id'.eql?(k))
|
25
|
+
k = 'physical_id'
|
26
|
+
end
|
27
|
+
workitem[@name][k] = val
|
28
|
+
end
|
29
|
+
set_tags(@props['tags'],workitem[@name]['physical_id'],"VpnGateway") if @props.has_key?('tags')
|
30
|
+
workitem['ResolvedNames'][@name] = name_cs
|
31
|
+
workitem['IdMap'][workitem[@name]['physical_id']] = @name
|
32
|
+
|
33
|
+
rescue NoMethodError => nme
|
34
|
+
logger.error("Create request failed for resource . Cleaning up the stack")
|
35
|
+
raise nme
|
36
|
+
rescue Exception => e
|
37
|
+
logger.error(e.message)
|
38
|
+
raise e
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
def delete
|
44
|
+
logger.debug("Deleting resource #{@name}")
|
45
|
+
begin
|
46
|
+
physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
|
47
|
+
if(!physical_id.nil?)
|
48
|
+
args = {'id' => physical_id
|
49
|
+
}
|
50
|
+
result_obj = make_async_request('deleteVpnGateway',args)
|
51
|
+
if (!(result_obj['error'] == true))
|
52
|
+
logger.info("Successfully deleted resource #{@name}")
|
53
|
+
else
|
54
|
+
logger.info("CloudStack error while deleting resource #{@name}")
|
55
|
+
end
|
56
|
+
else
|
57
|
+
logger.info("Resource not created in CloudStack. Skipping delete...")
|
58
|
+
end
|
59
|
+
rescue Exception => e
|
60
|
+
logger.error("Unable to delete resorce #{@name}")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def on_workitem
|
65
|
+
@name = workitem.participant_name
|
66
|
+
@props = workitem['Resources'][@name]['Properties']
|
67
|
+
@props.downcase_key
|
68
|
+
@resolved_names = workitem['ResolvedNames']
|
69
|
+
if workitem['params']['operation'] == 'create'
|
70
|
+
create
|
71
|
+
else
|
72
|
+
delete
|
73
|
+
end
|
74
|
+
reply
|
75
|
+
end
|
76
|
+
|
77
|
+
def get_vpcid
|
78
|
+
resolved_vpcid = get_resolved(@props["vpcid"],workitem)
|
79
|
+
if resolved_vpcid.nil? || !validate_param(resolved_vpcid,"uuid")
|
80
|
+
raise "Missing mandatory parameter vpcid for resource #{@name}"
|
81
|
+
end
|
82
|
+
resolved_vpcid
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'stackmate/participants/cloudstack'
|
2
|
+
|
3
|
+
module StackMate
|
4
|
+
class CloudStackVpnUser < 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['password'] = get_password
|
16
|
+
args['username'] = get_username
|
17
|
+
args['projectid'] = get_projectid if @props.has_key?('projectid')
|
18
|
+
args['account'] = get_account if @props.has_key?('account')
|
19
|
+
args['domainid'] = get_domainid if @props.has_key?('domainid')
|
20
|
+
|
21
|
+
logger.info("Creating resource #{@name} with following arguments")
|
22
|
+
p args
|
23
|
+
result_obj = make_async_request('addVpnUser',args)
|
24
|
+
resource_obj = result_obj['VpnUser'.downcase]
|
25
|
+
#doing it this way since it is easier to change later, rather than cloning whole object
|
26
|
+
resource_obj.each_key do |k|
|
27
|
+
val = resource_obj[k]
|
28
|
+
if('id'.eql?(k))
|
29
|
+
k = 'physical_id'
|
30
|
+
end
|
31
|
+
workitem[@name][k] = val
|
32
|
+
end
|
33
|
+
set_tags(@props['tags'],workitem[@name]['physical_id'],"VpnUser") if @props.has_key?('tags')
|
34
|
+
workitem['ResolvedNames'][@name] = name_cs
|
35
|
+
workitem['IdMap'][workitem[@name]['physical_id']] = @name
|
36
|
+
|
37
|
+
rescue NoMethodError => nme
|
38
|
+
logger.error("Create request failed for resource . Cleaning up the stack")
|
39
|
+
raise nme
|
40
|
+
rescue Exception => e
|
41
|
+
logger.error(e.message)
|
42
|
+
raise e
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
def delete
|
48
|
+
logger.debug("Deleting resource #{@name}")
|
49
|
+
begin
|
50
|
+
physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
|
51
|
+
if(!physical_id.nil?)
|
52
|
+
args = {'username' => physical_id
|
53
|
+
}
|
54
|
+
result_obj = make_async_request('removeVpnUser',args)
|
55
|
+
if (!(result_obj['error'] == true))
|
56
|
+
logger.info("Successfully deleted resource #{@name}")
|
57
|
+
else
|
58
|
+
logger.info("CloudStack error while deleting resource #{@name}")
|
59
|
+
end
|
60
|
+
else
|
61
|
+
logger.info("Resource not created in CloudStack. Skipping delete...")
|
62
|
+
end
|
63
|
+
rescue Exception => e
|
64
|
+
logger.error("Unable to delete resorce #{@name}")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def on_workitem
|
69
|
+
@name = workitem.participant_name
|
70
|
+
@props = workitem['Resources'][@name]['Properties']
|
71
|
+
@props.downcase_key
|
72
|
+
@resolved_names = workitem['ResolvedNames']
|
73
|
+
if workitem['params']['operation'] == 'create'
|
74
|
+
create
|
75
|
+
else
|
76
|
+
delete
|
77
|
+
end
|
78
|
+
reply
|
79
|
+
end
|
80
|
+
|
81
|
+
def get_password
|
82
|
+
resolved_password = get_resolved(@props["password"],workitem)
|
83
|
+
if resolved_password.nil? || !validate_param(resolved_password,"string")
|
84
|
+
raise "Missing mandatory parameter password for resource #{@name}"
|
85
|
+
end
|
86
|
+
resolved_password
|
87
|
+
end
|
88
|
+
|
89
|
+
def get_username
|
90
|
+
resolved_username = get_resolved(@props["username"],workitem)
|
91
|
+
if resolved_username.nil? || !validate_param(resolved_username,"string")
|
92
|
+
raise "Missing mandatory parameter username for resource #{@name}"
|
93
|
+
end
|
94
|
+
resolved_username
|
95
|
+
end
|
96
|
+
|
97
|
+
def get_projectid
|
98
|
+
resolved_projectid = get_resolved(@props['projectid'],workitem)
|
99
|
+
if resolved_projectid.nil? || !validate_param(resolved_projectid,"uuid")
|
100
|
+
raise "Malformed optional parameter projectid for resource #{@name}"
|
101
|
+
end
|
102
|
+
resolved_projectid
|
103
|
+
end
|
104
|
+
|
105
|
+
def get_account
|
106
|
+
resolved_account = get_resolved(@props['account'],workitem)
|
107
|
+
if resolved_account.nil? || !validate_param(resolved_account,"string")
|
108
|
+
raise "Malformed optional parameter account for resource #{@name}"
|
109
|
+
end
|
110
|
+
resolved_account
|
111
|
+
end
|
112
|
+
|
113
|
+
def get_domainid
|
114
|
+
resolved_domainid = get_resolved(@props['domainid'],workitem)
|
115
|
+
if resolved_domainid.nil? || !validate_param(resolved_domainid,"uuid")
|
116
|
+
raise "Malformed optional parameter domainid for resource #{@name}"
|
117
|
+
end
|
118
|
+
resolved_domainid
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|