stackmate 0.0.4 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. data/CHANGELOG.txt +7 -0
  2. data/README.md +25 -8
  3. data/bin/stackmate.rb +57 -53
  4. data/lib/stackmate/aws_attribs.rb +31 -31
  5. data/lib/stackmate/classmap.rb +33 -25
  6. data/lib/stackmate/client.rb +80 -0
  7. data/lib/stackmate/intrinsic_functions.rb +94 -38
  8. data/lib/stackmate/logging.rb +19 -19
  9. data/lib/stackmate/participants/cloudstack.rb +250 -165
  10. data/lib/stackmate/participants/cloudstack_affinitygroup.rb +122 -0
  11. data/lib/stackmate/participants/cloudstack_autoscalepolicy.rb +113 -0
  12. data/lib/stackmate/participants/cloudstack_autoscalevmgroup.rb +86 -0
  13. data/lib/stackmate/participants/cloudstack_autoscalevmprofile.rb +140 -0
  14. data/lib/stackmate/participants/cloudstack_condition.rb +122 -0
  15. data/lib/stackmate/participants/cloudstack_egressfirewallrule.rb +149 -0
  16. data/lib/stackmate/participants/cloudstack_firewallrule.rb +149 -0
  17. data/lib/stackmate/participants/cloudstack_globalloadbalancerrule.rb +158 -0
  18. data/lib/stackmate/participants/cloudstack_instancegroup.rb +113 -0
  19. data/lib/stackmate/participants/cloudstack_ipaddress.rb +149 -0
  20. data/lib/stackmate/participants/cloudstack_ipforwardingrule.rb +131 -0
  21. data/lib/stackmate/participants/cloudstack_iptonic.rb +95 -0
  22. data/lib/stackmate/participants/cloudstack_iso.rb +95 -0
  23. data/lib/stackmate/participants/cloudstack_lbhealthcheckpolicy.rb +140 -0
  24. data/lib/stackmate/participants/cloudstack_lbstickinesspolicy.rb +122 -0
  25. data/lib/stackmate/participants/cloudstack_loadbalancer.rb +158 -0
  26. data/lib/stackmate/participants/cloudstack_loadbalancerrule.rb +185 -0
  27. data/lib/stackmate/participants/cloudstack_network.rb +293 -0
  28. data/lib/stackmate/participants/cloudstack_networkacl.rb +176 -0
  29. data/lib/stackmate/participants/cloudstack_networkacllist.rb +104 -0
  30. data/lib/stackmate/participants/cloudstack_nictovirtualmachine.rb +104 -0
  31. data/lib/stackmate/participants/cloudstack_portforwardingrule.rb +176 -0
  32. data/lib/stackmate/participants/cloudstack_project.rb +113 -0
  33. data/lib/stackmate/participants/cloudstack_remoteaccessvpn.rb +122 -0
  34. data/lib/stackmate/participants/cloudstack_securitygroup.rb +122 -0
  35. data/lib/stackmate/participants/cloudstack_securitygroupegress.rb +185 -0
  36. data/lib/stackmate/participants/cloudstack_securitygroupingress.rb +185 -0
  37. data/lib/stackmate/participants/cloudstack_snapshot.rb +113 -0
  38. data/lib/stackmate/participants/cloudstack_snapshotpolicy.rb +122 -0
  39. data/lib/stackmate/participants/cloudstack_sshkeypair.rb +113 -0
  40. data/lib/stackmate/participants/cloudstack_staticnat.rb +113 -0
  41. data/lib/stackmate/participants/cloudstack_staticroute.rb +95 -0
  42. data/lib/stackmate/participants/cloudstack_tags.rb +113 -0
  43. data/lib/stackmate/participants/cloudstack_template.rb +212 -0
  44. data/lib/stackmate/participants/cloudstack_togloballoadbalancerrule.rb +104 -0
  45. data/lib/stackmate/participants/cloudstack_toloadbalancerrule.rb +95 -0
  46. data/lib/stackmate/participants/cloudstack_virtualmachine.rb +348 -0
  47. data/lib/stackmate/participants/cloudstack_virtualmachineops.rb +95 -0
  48. data/lib/stackmate/participants/cloudstack_vmsnapshot.rb +113 -0
  49. data/lib/stackmate/participants/cloudstack_volume.rb +176 -0
  50. data/lib/stackmate/participants/cloudstack_volumeops.rb +111 -0
  51. data/lib/stackmate/participants/cloudstack_vpc.rb +158 -0
  52. data/lib/stackmate/participants/cloudstack_vpnconnection.rb +95 -0
  53. data/lib/stackmate/participants/cloudstack_vpncustomergateway.rb +176 -0
  54. data/lib/stackmate/participants/cloudstack_vpngateway.rb +86 -0
  55. data/lib/stackmate/participants/cloudstack_vpnuser.rb +122 -0
  56. data/lib/stackmate/participants/common.rb +219 -70
  57. data/lib/stackmate/participants/stacknest.rb +6 -0
  58. data/lib/stackmate/resolver.rb +122 -0
  59. data/lib/stackmate/stack.rb +116 -60
  60. data/lib/stackmate/stack_executor.rb +99 -37
  61. data/lib/stackmate/stackpi.rb +46 -0
  62. data/lib/stackmate/version.rb +1 -1
  63. data/lib/stackmate/waitcondition_server.rb +15 -15
  64. data/lib/stackmate.rb +1 -1
  65. data/stackmate.gemspec +2 -4
  66. metadata +70 -19
@@ -0,0 +1,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
+