stackmate 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,113 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackAutoScalePolicy < 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['action'] = get_action
16
+ args['duration'] = get_duration
17
+ args['conditionids'] = get_conditionids
18
+ args['quiettime'] = get_quiettime if @props.has_key?('quiettime')
19
+
20
+ logger.info("Creating resource #{@name} with following arguments")
21
+ p args
22
+ result_obj = make_async_request('createAutoScalePolicy',args)
23
+ resource_obj = result_obj['AutoScalePolicy'.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'],"AutoScalePolicy") 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_async_request('deleteAutoScalePolicy',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_action
81
+ resolved_action = get_resolved(@props["action"],workitem)
82
+ if resolved_action.nil? || !validate_param(resolved_action,"string")
83
+ raise "Missing mandatory parameter action for resource #{@name}"
84
+ end
85
+ resolved_action
86
+ end
87
+
88
+ def get_duration
89
+ resolved_duration = get_resolved(@props["duration"],workitem)
90
+ if resolved_duration.nil? || !validate_param(resolved_duration,"integer")
91
+ raise "Missing mandatory parameter duration for resource #{@name}"
92
+ end
93
+ resolved_duration
94
+ end
95
+
96
+ def get_conditionids
97
+ resolved_conditionids = get_resolved(@props["conditionids"],workitem)
98
+ if resolved_conditionids.nil? || !validate_param(resolved_conditionids,"list")
99
+ raise "Missing mandatory parameter conditionids for resource #{@name}"
100
+ end
101
+ resolved_conditionids
102
+ end
103
+
104
+ def get_quiettime
105
+ resolved_quiettime = get_resolved(@props['quiettime'],workitem)
106
+ if resolved_quiettime.nil? || !validate_param(resolved_quiettime,"integer")
107
+ raise "Malformed optional parameter quiettime for resource #{@name}"
108
+ end
109
+ resolved_quiettime
110
+ end
111
+ end
112
+ end
113
+
@@ -0,0 +1,86 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackAutoScaleVmGroup < CloudStackResource
5
+
6
+ include Logging
7
+ include Intrinsic
8
+ include Resolver
9
+ def create
10
+ logger.debug("Creating resource #{@name}")
11
+ workitem[@name] = {}
12
+ name_cs = workitem['StackName'] + '-' + @name
13
+ args={}
14
+ begin
15
+ args['id'] = get_id
16
+
17
+ logger.info("Creating resource #{@name} with following arguments")
18
+ p args
19
+ result_obj = make_async_request('enableAutoScaleVmGroup',args)
20
+ resource_obj = result_obj['AutoScaleVmGroup'.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'],"AutoScaleVmGroup") 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('disableAutoScaleVmGroup',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_id
78
+ resolved_id = get_resolved(@props["id"],workitem)
79
+ if resolved_id.nil? || !validate_param(resolved_id,"uuid")
80
+ raise "Missing mandatory parameter id for resource #{@name}"
81
+ end
82
+ resolved_id
83
+ end
84
+ end
85
+ end
86
+
@@ -0,0 +1,140 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackAutoScaleVmProfile < 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['zoneid'] = get_zoneid
16
+ args['serviceofferingid'] = get_serviceofferingid
17
+ args['templateid'] = get_templateid
18
+ args['otherdeployparams'] = get_otherdeployparams if @props.has_key?('otherdeployparams')
19
+ args['destroyvmgraceperiod'] = get_destroyvmgraceperiod if @props.has_key?('destroyvmgraceperiod')
20
+ args['autoscaleuserid'] = get_autoscaleuserid if @props.has_key?('autoscaleuserid')
21
+ args['counterparam'] = get_counterparam if @props.has_key?('counterparam')
22
+
23
+ logger.info("Creating resource #{@name} with following arguments")
24
+ p args
25
+ result_obj = make_async_request('createAutoScaleVmProfile',args)
26
+ resource_obj = result_obj['AutoScaleVmProfile'.downcase]
27
+ #doing it this way since it is easier to change later, rather than cloning whole object
28
+ resource_obj.each_key do |k|
29
+ val = resource_obj[k]
30
+ if('id'.eql?(k))
31
+ k = 'physical_id'
32
+ end
33
+ workitem[@name][k] = val
34
+ end
35
+ set_tags(@props['tags'],workitem[@name]['physical_id'],"AutoScaleVmProfile") if @props.has_key?('tags')
36
+ workitem['ResolvedNames'][@name] = name_cs
37
+ workitem['IdMap'][workitem[@name]['physical_id']] = @name
38
+
39
+ rescue NoMethodError => nme
40
+ logger.error("Create request failed for resource . Cleaning up the stack")
41
+ raise nme
42
+ rescue Exception => e
43
+ logger.error(e.message)
44
+ raise e
45
+ end
46
+
47
+ end
48
+
49
+ def delete
50
+ logger.debug("Deleting resource #{@name}")
51
+ begin
52
+ physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
53
+ if(!physical_id.nil?)
54
+ args = {'id' => physical_id
55
+ }
56
+ result_obj = make_async_request('deleteAutoScaleVmProfile',args)
57
+ if (!(result_obj['error'] == true))
58
+ logger.info("Successfully deleted resource #{@name}")
59
+ else
60
+ logger.info("CloudStack error while deleting resource #{@name}")
61
+ end
62
+ else
63
+ logger.info("Resource not created in CloudStack. Skipping delete...")
64
+ end
65
+ rescue Exception => e
66
+ logger.error("Unable to delete resorce #{@name}")
67
+ end
68
+ end
69
+
70
+ def on_workitem
71
+ @name = workitem.participant_name
72
+ @props = workitem['Resources'][@name]['Properties']
73
+ @props.downcase_key
74
+ @resolved_names = workitem['ResolvedNames']
75
+ if workitem['params']['operation'] == 'create'
76
+ create
77
+ else
78
+ delete
79
+ end
80
+ reply
81
+ end
82
+
83
+ def get_zoneid
84
+ resolved_zoneid = get_resolved(@props["zoneid"],workitem)
85
+ if resolved_zoneid.nil? || !validate_param(resolved_zoneid,"uuid")
86
+ raise "Missing mandatory parameter zoneid for resource #{@name}"
87
+ end
88
+ resolved_zoneid
89
+ end
90
+
91
+ def get_serviceofferingid
92
+ resolved_serviceofferingid = get_resolved(@props["serviceofferingid"],workitem)
93
+ if resolved_serviceofferingid.nil? || !validate_param(resolved_serviceofferingid,"uuid")
94
+ raise "Missing mandatory parameter serviceofferingid for resource #{@name}"
95
+ end
96
+ resolved_serviceofferingid
97
+ end
98
+
99
+ def get_templateid
100
+ resolved_templateid = get_resolved(@props["templateid"],workitem)
101
+ if resolved_templateid.nil? || !validate_param(resolved_templateid,"uuid")
102
+ raise "Missing mandatory parameter templateid for resource #{@name}"
103
+ end
104
+ resolved_templateid
105
+ end
106
+
107
+ def get_otherdeployparams
108
+ resolved_otherdeployparams = get_resolved(@props['otherdeployparams'],workitem)
109
+ if resolved_otherdeployparams.nil? || !validate_param(resolved_otherdeployparams,"string")
110
+ raise "Malformed optional parameter otherdeployparams for resource #{@name}"
111
+ end
112
+ resolved_otherdeployparams
113
+ end
114
+
115
+ def get_destroyvmgraceperiod
116
+ resolved_destroyvmgraceperiod = get_resolved(@props['destroyvmgraceperiod'],workitem)
117
+ if resolved_destroyvmgraceperiod.nil? || !validate_param(resolved_destroyvmgraceperiod,"integer")
118
+ raise "Malformed optional parameter destroyvmgraceperiod for resource #{@name}"
119
+ end
120
+ resolved_destroyvmgraceperiod
121
+ end
122
+
123
+ def get_autoscaleuserid
124
+ resolved_autoscaleuserid = get_resolved(@props['autoscaleuserid'],workitem)
125
+ if resolved_autoscaleuserid.nil? || !validate_param(resolved_autoscaleuserid,"uuid")
126
+ raise "Malformed optional parameter autoscaleuserid for resource #{@name}"
127
+ end
128
+ resolved_autoscaleuserid
129
+ end
130
+
131
+ def get_counterparam
132
+ resolved_counterparam = get_resolved(@props['counterparam'],workitem)
133
+ if resolved_counterparam.nil? || !validate_param(resolved_counterparam,"map")
134
+ raise "Malformed optional parameter counterparam for resource #{@name}"
135
+ end
136
+ resolved_counterparam
137
+ end
138
+ end
139
+ end
140
+
@@ -0,0 +1,122 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackCondition < 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['threshold'] = get_threshold
16
+ args['relationaloperator'] = get_relationaloperator
17
+ args['counterid'] = get_counterid
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('createCondition',args)
24
+ resource_obj = result_obj['Condition'.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'],"Condition") 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 = {'id' => physical_id
53
+ }
54
+ result_obj = make_async_request('deleteCondition',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_threshold
82
+ resolved_threshold = get_resolved(@props["threshold"],workitem)
83
+ if resolved_threshold.nil? || !validate_param(resolved_threshold,"long")
84
+ raise "Missing mandatory parameter threshold for resource #{@name}"
85
+ end
86
+ resolved_threshold
87
+ end
88
+
89
+ def get_relationaloperator
90
+ resolved_relationaloperator = get_resolved(@props["relationaloperator"],workitem)
91
+ if resolved_relationaloperator.nil? || !validate_param(resolved_relationaloperator,"string")
92
+ raise "Missing mandatory parameter relationaloperator for resource #{@name}"
93
+ end
94
+ resolved_relationaloperator
95
+ end
96
+
97
+ def get_counterid
98
+ resolved_counterid = get_resolved(@props["counterid"],workitem)
99
+ if resolved_counterid.nil? || !validate_param(resolved_counterid,"uuid")
100
+ raise "Missing mandatory parameter counterid for resource #{@name}"
101
+ end
102
+ resolved_counterid
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
+
@@ -0,0 +1,149 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackEgressFirewallRule < 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
16
+ args['protocol'] = get_protocol
17
+ args['icmpcode'] = get_icmpcode if @props.has_key?('icmpcode')
18
+ args['cidrlist'] = get_cidrlist if @props.has_key?('cidrlist')
19
+ args['type'] = get_type if @props.has_key?('type')
20
+ args['endport'] = get_endport if @props.has_key?('endport')
21
+ args['icmptype'] = get_icmptype if @props.has_key?('icmptype')
22
+ args['startport'] = get_startport if @props.has_key?('startport')
23
+
24
+ logger.info("Creating resource #{@name} with following arguments")
25
+ p args
26
+ result_obj = make_async_request('createEgressFirewallRule',args)
27
+ resource_obj = result_obj['EgressFirewallRule'.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'],"EgressFirewallRule") 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('deleteEgressFirewallRule',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 "Missing mandatory parameter networkid for resource #{@name}"
88
+ end
89
+ resolved_networkid
90
+ end
91
+
92
+ def get_protocol
93
+ resolved_protocol = get_resolved(@props["protocol"],workitem)
94
+ if resolved_protocol.nil? || !validate_param(resolved_protocol,"string")
95
+ raise "Missing mandatory parameter protocol for resource #{@name}"
96
+ end
97
+ resolved_protocol
98
+ end
99
+
100
+ def get_icmpcode
101
+ resolved_icmpcode = get_resolved(@props['icmpcode'],workitem)
102
+ if resolved_icmpcode.nil? || !validate_param(resolved_icmpcode,"integer")
103
+ raise "Malformed optional parameter icmpcode for resource #{@name}"
104
+ end
105
+ resolved_icmpcode
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_type
117
+ resolved_type = get_resolved(@props['type'],workitem)
118
+ if resolved_type.nil? || !validate_param(resolved_type,"string")
119
+ raise "Malformed optional parameter type for resource #{@name}"
120
+ end
121
+ resolved_type
122
+ end
123
+
124
+ def get_endport
125
+ resolved_endport = get_resolved(@props['endport'],workitem)
126
+ if resolved_endport.nil? || !validate_param(resolved_endport,"integer")
127
+ raise "Malformed optional parameter endport for resource #{@name}"
128
+ end
129
+ resolved_endport
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_startport
141
+ resolved_startport = get_resolved(@props['startport'],workitem)
142
+ if resolved_startport.nil? || !validate_param(resolved_startport,"integer")
143
+ raise "Malformed optional parameter startport for resource #{@name}"
144
+ end
145
+ resolved_startport
146
+ end
147
+ end
148
+ end
149
+