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,131 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackIpForwardingRule < 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['ipaddressid'] = get_ipaddressid
16
+ args['protocol'] = get_protocol
17
+ args['startport'] = get_startport
18
+ args['cidrlist'] = get_cidrlist if @props.has_key?('cidrlist')
19
+ args['endport'] = get_endport if @props.has_key?('endport')
20
+ args['openfirewall'] = get_openfirewall if @props.has_key?('openfirewall')
21
+
22
+ logger.info("Creating resource #{@name} with following arguments")
23
+ p args
24
+ result_obj = make_async_request('createIpForwardingRule',args)
25
+ resource_obj = result_obj['IpForwardingRule'.downcase]
26
+ #doing it this way since it is easier to change later, rather than cloning whole object
27
+ resource_obj.each_key do |k|
28
+ val = resource_obj[k]
29
+ if('id'.eql?(k))
30
+ k = 'physical_id'
31
+ end
32
+ workitem[@name][k] = val
33
+ end
34
+ set_tags(@props['tags'],workitem[@name]['physical_id'],"IpForwardingRule") if @props.has_key?('tags')
35
+ workitem['ResolvedNames'][@name] = name_cs
36
+ workitem['IdMap'][workitem[@name]['physical_id']] = @name
37
+
38
+ rescue NoMethodError => nme
39
+ logger.error("Create request failed for resource . Cleaning up the stack")
40
+ raise nme
41
+ rescue Exception => e
42
+ logger.error(e.message)
43
+ raise e
44
+ end
45
+
46
+ end
47
+
48
+ def delete
49
+ logger.debug("Deleting resource #{@name}")
50
+ begin
51
+ physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
52
+ if(!physical_id.nil?)
53
+ args = {'id' => physical_id
54
+ }
55
+ result_obj = make_async_request('deleteIpForwardingRule',args)
56
+ if (!(result_obj['error'] == true))
57
+ logger.info("Successfully deleted resource #{@name}")
58
+ else
59
+ logger.info("CloudStack error while deleting resource #{@name}")
60
+ end
61
+ else
62
+ logger.info("Resource not created in CloudStack. Skipping delete...")
63
+ end
64
+ rescue Exception => e
65
+ logger.error("Unable to delete resorce #{@name}")
66
+ end
67
+ end
68
+
69
+ def on_workitem
70
+ @name = workitem.participant_name
71
+ @props = workitem['Resources'][@name]['Properties']
72
+ @props.downcase_key
73
+ @resolved_names = workitem['ResolvedNames']
74
+ if workitem['params']['operation'] == 'create'
75
+ create
76
+ else
77
+ delete
78
+ end
79
+ reply
80
+ end
81
+
82
+ def get_ipaddressid
83
+ resolved_ipaddressid = get_resolved(@props["ipaddressid"],workitem)
84
+ if resolved_ipaddressid.nil? || !validate_param(resolved_ipaddressid,"uuid")
85
+ raise "Missing mandatory parameter ipaddressid for resource #{@name}"
86
+ end
87
+ resolved_ipaddressid
88
+ end
89
+
90
+ def get_protocol
91
+ resolved_protocol = get_resolved(@props["protocol"],workitem)
92
+ if resolved_protocol.nil? || !validate_param(resolved_protocol,"string")
93
+ raise "Missing mandatory parameter protocol for resource #{@name}"
94
+ end
95
+ resolved_protocol
96
+ end
97
+
98
+ def get_startport
99
+ resolved_startport = get_resolved(@props["startport"],workitem)
100
+ if resolved_startport.nil? || !validate_param(resolved_startport,"integer")
101
+ raise "Missing mandatory parameter startport for resource #{@name}"
102
+ end
103
+ resolved_startport
104
+ end
105
+
106
+ def get_cidrlist
107
+ resolved_cidrlist = get_resolved(@props['cidrlist'],workitem)
108
+ if resolved_cidrlist.nil? || !validate_param(resolved_cidrlist,"list")
109
+ raise "Malformed optional parameter cidrlist for resource #{@name}"
110
+ end
111
+ resolved_cidrlist
112
+ end
113
+
114
+ def get_endport
115
+ resolved_endport = get_resolved(@props['endport'],workitem)
116
+ if resolved_endport.nil? || !validate_param(resolved_endport,"integer")
117
+ raise "Malformed optional parameter endport for resource #{@name}"
118
+ end
119
+ resolved_endport
120
+ end
121
+
122
+ def get_openfirewall
123
+ resolved_openfirewall = get_resolved(@props['openfirewall'],workitem)
124
+ if resolved_openfirewall.nil? || !validate_param(resolved_openfirewall,"boolean")
125
+ raise "Malformed optional parameter openfirewall for resource #{@name}"
126
+ end
127
+ resolved_openfirewall
128
+ end
129
+ end
130
+ end
131
+
@@ -0,0 +1,95 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackIpToNic < 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['nicid'] = get_nicid
16
+ args['ipaddress'] = get_ipaddress if @props.has_key?('ipaddress')
17
+
18
+ logger.info("Creating resource #{@name} with following arguments")
19
+ p args
20
+ result_obj = make_async_request('addIpToNic',args)
21
+ resource_obj = result_obj['IpToNic'.downcase]
22
+ #doing it this way since it is easier to change later, rather than cloning whole object
23
+ resource_obj.each_key do |k|
24
+ val = resource_obj[k]
25
+ if('id'.eql?(k))
26
+ k = 'physical_id'
27
+ end
28
+ workitem[@name][k] = val
29
+ end
30
+ set_tags(@props['tags'],workitem[@name]['physical_id'],"IpToNic") if @props.has_key?('tags')
31
+ workitem['ResolvedNames'][@name] = name_cs
32
+ workitem['IdMap'][workitem[@name]['physical_id']] = @name
33
+
34
+ rescue NoMethodError => nme
35
+ logger.error("Create request failed for resource . Cleaning up the stack")
36
+ raise nme
37
+ rescue Exception => e
38
+ logger.error(e.message)
39
+ raise e
40
+ end
41
+
42
+ end
43
+
44
+ def delete
45
+ logger.debug("Deleting resource #{@name}")
46
+ begin
47
+ physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
48
+ if(!physical_id.nil?)
49
+ args = {'id' => physical_id
50
+ }
51
+ result_obj = make_async_request('removeIpToNic',args)
52
+ if (!(result_obj['error'] == true))
53
+ logger.info("Successfully deleted resource #{@name}")
54
+ else
55
+ logger.info("CloudStack error while deleting resource #{@name}")
56
+ end
57
+ else
58
+ logger.info("Resource not created in CloudStack. Skipping delete...")
59
+ end
60
+ rescue Exception => e
61
+ logger.error("Unable to delete resorce #{@name}")
62
+ end
63
+ end
64
+
65
+ def on_workitem
66
+ @name = workitem.participant_name
67
+ @props = workitem['Resources'][@name]['Properties']
68
+ @props.downcase_key
69
+ @resolved_names = workitem['ResolvedNames']
70
+ if workitem['params']['operation'] == 'create'
71
+ create
72
+ else
73
+ delete
74
+ end
75
+ reply
76
+ end
77
+
78
+ def get_nicid
79
+ resolved_nicid = get_resolved(@props["nicid"],workitem)
80
+ if resolved_nicid.nil? || !validate_param(resolved_nicid,"uuid")
81
+ raise "Missing mandatory parameter nicid for resource #{@name}"
82
+ end
83
+ resolved_nicid
84
+ end
85
+
86
+ def get_ipaddress
87
+ resolved_ipaddress = get_resolved(@props['ipaddress'],workitem)
88
+ if resolved_ipaddress.nil? || !validate_param(resolved_ipaddress,"string")
89
+ raise "Malformed optional parameter ipaddress for resource #{@name}"
90
+ end
91
+ resolved_ipaddress
92
+ end
93
+ end
94
+ end
95
+
@@ -0,0 +1,95 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackIso < 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
+ args['virtualmachineid'] = get_virtualmachineid
17
+
18
+ logger.info("Creating resource #{@name} with following arguments")
19
+ p args
20
+ result_obj = make_async_request('attachIso',args)
21
+ resource_obj = result_obj['Iso'.downcase]
22
+ #doing it this way since it is easier to change later, rather than cloning whole object
23
+ resource_obj.each_key do |k|
24
+ val = resource_obj[k]
25
+ if('id'.eql?(k))
26
+ k = 'physical_id'
27
+ end
28
+ workitem[@name][k] = val
29
+ end
30
+ set_tags(@props['tags'],workitem[@name]['physical_id'],"Iso") if @props.has_key?('tags')
31
+ workitem['ResolvedNames'][@name] = name_cs
32
+ workitem['IdMap'][workitem[@name]['physical_id']] = @name
33
+
34
+ rescue NoMethodError => nme
35
+ logger.error("Create request failed for resource . Cleaning up the stack")
36
+ raise nme
37
+ rescue Exception => e
38
+ logger.error(e.message)
39
+ raise e
40
+ end
41
+
42
+ end
43
+
44
+ def delete
45
+ logger.debug("Deleting resource #{@name}")
46
+ begin
47
+ physical_id = workitem[@name]['physical_id'] if !workitem[@name].nil?
48
+ if(!physical_id.nil?)
49
+ args = {'virtualmachineid' => physical_id
50
+ }
51
+ result_obj = make_async_request('detachIso',args)
52
+ if (!(result_obj['error'] == true))
53
+ logger.info("Successfully deleted resource #{@name}")
54
+ else
55
+ logger.info("CloudStack error while deleting resource #{@name}")
56
+ end
57
+ else
58
+ logger.info("Resource not created in CloudStack. Skipping delete...")
59
+ end
60
+ rescue Exception => e
61
+ logger.error("Unable to delete resorce #{@name}")
62
+ end
63
+ end
64
+
65
+ def on_workitem
66
+ @name = workitem.participant_name
67
+ @props = workitem['Resources'][@name]['Properties']
68
+ @props.downcase_key
69
+ @resolved_names = workitem['ResolvedNames']
70
+ if workitem['params']['operation'] == 'create'
71
+ create
72
+ else
73
+ delete
74
+ end
75
+ reply
76
+ end
77
+
78
+ def get_id
79
+ resolved_id = get_resolved(@props["id"],workitem)
80
+ if resolved_id.nil? || !validate_param(resolved_id,"uuid")
81
+ raise "Missing mandatory parameter id for resource #{@name}"
82
+ end
83
+ resolved_id
84
+ end
85
+
86
+ def get_virtualmachineid
87
+ resolved_virtualmachineid = get_resolved(@props["virtualmachineid"],workitem)
88
+ if resolved_virtualmachineid.nil? || !validate_param(resolved_virtualmachineid,"uuid")
89
+ raise "Missing mandatory parameter virtualmachineid for resource #{@name}"
90
+ end
91
+ resolved_virtualmachineid
92
+ end
93
+ end
94
+ end
95
+
@@ -0,0 +1,140 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackLBHealthCheckPolicy < 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['lbruleid'] = get_lbruleid
16
+ args['responsetimeout'] = get_responsetimeout if @props.has_key?('responsetimeout')
17
+ args['unhealthythreshold'] = get_unhealthythreshold if @props.has_key?('unhealthythreshold')
18
+ args['pingpath'] = get_pingpath if @props.has_key?('pingpath')
19
+ args['description'] = get_description if @props.has_key?('description')
20
+ args['intervaltime'] = get_intervaltime if @props.has_key?('intervaltime')
21
+ args['healthythreshold'] = get_healthythreshold if @props.has_key?('healthythreshold')
22
+
23
+ logger.info("Creating resource #{@name} with following arguments")
24
+ p args
25
+ result_obj = make_async_request('createLBHealthCheckPolicy',args)
26
+ resource_obj = result_obj['LBHealthCheckPolicy'.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'],"LBHealthCheckPolicy") 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('deleteLBHealthCheckPolicy',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_lbruleid
84
+ resolved_lbruleid = get_resolved(@props["lbruleid"],workitem)
85
+ if resolved_lbruleid.nil? || !validate_param(resolved_lbruleid,"uuid")
86
+ raise "Missing mandatory parameter lbruleid for resource #{@name}"
87
+ end
88
+ resolved_lbruleid
89
+ end
90
+
91
+ def get_responsetimeout
92
+ resolved_responsetimeout = get_resolved(@props['responsetimeout'],workitem)
93
+ if resolved_responsetimeout.nil? || !validate_param(resolved_responsetimeout,"integer")
94
+ raise "Malformed optional parameter responsetimeout for resource #{@name}"
95
+ end
96
+ resolved_responsetimeout
97
+ end
98
+
99
+ def get_unhealthythreshold
100
+ resolved_unhealthythreshold = get_resolved(@props['unhealthythreshold'],workitem)
101
+ if resolved_unhealthythreshold.nil? || !validate_param(resolved_unhealthythreshold,"integer")
102
+ raise "Malformed optional parameter unhealthythreshold for resource #{@name}"
103
+ end
104
+ resolved_unhealthythreshold
105
+ end
106
+
107
+ def get_pingpath
108
+ resolved_pingpath = get_resolved(@props['pingpath'],workitem)
109
+ if resolved_pingpath.nil? || !validate_param(resolved_pingpath,"string")
110
+ raise "Malformed optional parameter pingpath for resource #{@name}"
111
+ end
112
+ resolved_pingpath
113
+ end
114
+
115
+ def get_description
116
+ resolved_description = get_resolved(@props['description'],workitem)
117
+ if resolved_description.nil? || !validate_param(resolved_description,"string")
118
+ raise "Malformed optional parameter description for resource #{@name}"
119
+ end
120
+ resolved_description
121
+ end
122
+
123
+ def get_intervaltime
124
+ resolved_intervaltime = get_resolved(@props['intervaltime'],workitem)
125
+ if resolved_intervaltime.nil? || !validate_param(resolved_intervaltime,"integer")
126
+ raise "Malformed optional parameter intervaltime for resource #{@name}"
127
+ end
128
+ resolved_intervaltime
129
+ end
130
+
131
+ def get_healthythreshold
132
+ resolved_healthythreshold = get_resolved(@props['healthythreshold'],workitem)
133
+ if resolved_healthythreshold.nil? || !validate_param(resolved_healthythreshold,"integer")
134
+ raise "Malformed optional parameter healthythreshold for resource #{@name}"
135
+ end
136
+ resolved_healthythreshold
137
+ end
138
+ end
139
+ end
140
+
@@ -0,0 +1,122 @@
1
+ require 'stackmate/participants/cloudstack'
2
+
3
+ module StackMate
4
+ class CloudStackLBStickinessPolicy < 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['methodname'] = get_methodname
16
+ args['lbruleid'] = get_lbruleid
17
+ args['name'] = workitem['StackName'] +'-' +get_name
18
+ args['param'] = get_param if @props.has_key?('param')
19
+ args['description'] = get_description if @props.has_key?('description')
20
+
21
+ logger.info("Creating resource #{@name} with following arguments")
22
+ p args
23
+ result_obj = make_async_request('createLBStickinessPolicy',args)
24
+ resource_obj = result_obj['LBStickinessPolicy'.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'],"LBStickinessPolicy") 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('deleteLBStickinessPolicy',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_methodname
82
+ resolved_methodname = get_resolved(@props["methodname"],workitem)
83
+ if resolved_methodname.nil? || !validate_param(resolved_methodname,"string")
84
+ raise "Missing mandatory parameter methodname for resource #{@name}"
85
+ end
86
+ resolved_methodname
87
+ end
88
+
89
+ def get_lbruleid
90
+ resolved_lbruleid = get_resolved(@props["lbruleid"],workitem)
91
+ if resolved_lbruleid.nil? || !validate_param(resolved_lbruleid,"uuid")
92
+ raise "Missing mandatory parameter lbruleid for resource #{@name}"
93
+ end
94
+ resolved_lbruleid
95
+ end
96
+
97
+ def get_name
98
+ resolved_name = get_resolved(@props["name"],workitem)
99
+ if resolved_name.nil? || !validate_param(resolved_name,"string")
100
+ raise "Missing mandatory parameter name for resource #{@name}"
101
+ end
102
+ resolved_name
103
+ end
104
+
105
+ def get_param
106
+ resolved_param = get_resolved(@props['param'],workitem)
107
+ if resolved_param.nil? || !validate_param(resolved_param,"map")
108
+ raise "Malformed optional parameter param for resource #{@name}"
109
+ end
110
+ resolved_param
111
+ end
112
+
113
+ def get_description
114
+ resolved_description = get_resolved(@props['description'],workitem)
115
+ if resolved_description.nil? || !validate_param(resolved_description,"string")
116
+ raise "Malformed optional parameter description for resource #{@name}"
117
+ end
118
+ resolved_description
119
+ end
120
+ end
121
+ end
122
+