steamcannon-aws 2.3.26.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,233 @@
1
+ module Aws
2
+
3
+ class Mon < Aws::AwsBase
4
+ include Aws::AwsBaseInterface
5
+
6
+
7
+ #Amazon EC2 API version being used
8
+ API_VERSION = "2009-05-15"
9
+ DEFAULT_HOST = "monitoring.amazonaws.com"
10
+ DEFAULT_PATH = '/'
11
+ DEFAULT_PROTOCOL = 'https'
12
+ DEFAULT_PORT = 443
13
+
14
+ # Available measures for EC2 instances:
15
+ # NetworkIn NetworkOut DiskReadOps DiskWriteOps DiskReadBytes DiskWriteBytes CPUUtilization
16
+ measures=%w(NetworkIn NetworkOut DiskReadOps DiskWriteOps DiskReadBytes DiskWriteBytes CPUUtilization)
17
+
18
+ @@bench = Aws::AwsBenchmarkingBlock.new
19
+
20
+ def self.bench_xml
21
+ @@bench.xml
22
+ end
23
+
24
+ def self.bench_ec2
25
+ @@bench.service
26
+ end
27
+
28
+ # Current API version (sometimes we have to check it outside the GEM).
29
+ @@api = ENV['EC2_API_VERSION'] || API_VERSION
30
+
31
+ def self.api
32
+ @@api
33
+ end
34
+
35
+
36
+ def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
37
+ init({ :name => 'MON',
38
+ :default_host => ENV['MON_URL'] ? URI.parse(ENV['MON_URL']).host : DEFAULT_HOST,
39
+ :default_port => ENV['MON_URL'] ? URI.parse(ENV['MON_URL']).port : DEFAULT_PORT,
40
+ :default_service => ENV['MON_URL'] ? URI.parse(ENV['MON_URL']).path : DEFAULT_PATH,
41
+ :default_protocol => ENV['MON_URL'] ? URI.parse(ENV['MON_URL']).scheme : DEFAULT_PROTOCOL,
42
+ :api_version => API_VERSION },
43
+ aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'],
44
+ aws_secret_access_key|| ENV['AWS_SECRET_ACCESS_KEY'],
45
+ params)
46
+ end
47
+
48
+
49
+ def generate_request(action, params={})
50
+ service_hash = {"Action" => action,
51
+ "AWSAccessKeyId" => @aws_access_key_id,
52
+ "Version" => @@api }
53
+ service_hash.update(params)
54
+ service_params = signed_service_params(@aws_secret_access_key, service_hash, :get, @params[:server], @params[:service])
55
+
56
+ # use POST method if the length of the query string is too large
57
+ if service_params.size > 2000
58
+ if signature_version == '2'
59
+ # resign the request because HTTP verb is included into signature
60
+ service_params = signed_service_params(@aws_secret_access_key, service_hash, :post, @params[:server], @params[:service])
61
+ end
62
+ request = Net::HTTP::Post.new(service)
63
+ request.body = service_params
64
+ request['Content-Type'] = 'application/x-www-form-urlencoded'
65
+ else
66
+ request = Net::HTTP::Get.new("#{@params[:service]}?#{service_params}")
67
+ end
68
+
69
+ #puts "\n\n --------------- QUERY REQUEST TO AWS -------------- \n\n"
70
+ #puts "#{@params[:service]}?#{service_params}\n\n"
71
+
72
+ # prepare output hash
73
+ { :request => request,
74
+ :server => @params[:server],
75
+ :port => @params[:port],
76
+ :protocol => @params[:protocol] }
77
+ end
78
+
79
+
80
+ # Sends request to Amazon and parses the response
81
+ # Raises AwsError if any banana happened
82
+ def request_info(request, parser)
83
+ thread = @params[:multi_thread] ? Thread.current : Thread.main
84
+ thread[:elb_connection] ||= Rightscale::HttpConnection.new(:exception => Aws::AwsError, :logger => @logger)
85
+ request_info_impl(thread[:elb_connection], @@bench, request, parser)
86
+ end
87
+
88
+ #-----------------------------------------------------------------
89
+ # REQUESTS
90
+ #-----------------------------------------------------------------
91
+
92
+ def list_metrics(options={})
93
+
94
+ next_token = options[:next_token] || nil
95
+
96
+ params = { }
97
+ params['NextToken'] = next_token unless next_token.nil?
98
+
99
+ @logger.info("list Metrics ")
100
+
101
+ link = generate_request("ListMetrics", params)
102
+ resp = request_info(link, QMonListMetrics.new(:logger => @logger))
103
+
104
+ rescue Exception
105
+ on_exception
106
+ end
107
+
108
+
109
+ # measureName: CPUUtilization (Units: Percent), NetworkIn (Units: Bytes), NetworkOut (Units: Bytes), DiskWriteOps (Units: Count)
110
+ # DiskReadBytes (Units: Bytes), DiskReadOps (Units: Count), DiskWriteBytes (Units: Bytes)
111
+ # stats: array containing one or more of Minimum, Maximum, Sum, Average, Samples
112
+ # start_time : Timestamp to start
113
+ # end_time: Timestamp to end
114
+ # unit: Either Seconds, Percent, Bytes, Bits, Count, Bytes, Bits/Second, Count/Second, and None
115
+ #
116
+ # Optional parameters:
117
+ # period: Integer 60 or multiple of 60
118
+ # dimensions: Hash containing keys ImageId, AutoScalingGroupName, InstanceId, InstanceType
119
+ # customUnit: nil. not supported currently.
120
+ # namespace: AWS/EC2
121
+
122
+ def get_metric_statistics ( measure_name, stats, start_time, end_time, unit, options={})
123
+
124
+ period = options[:period] || 60
125
+ dimensions = options[:dimensions] || nil
126
+ custom_unit = options[:custom_unit] || nil
127
+ namespace = options[:namespace] || "AWS/EC2"
128
+
129
+ params = {}
130
+ params['MeasureName'] = measure_name
131
+ i=1
132
+ stats.each do |s|
133
+ params['Statistics.member.'+i.to_s] = s
134
+ i = i+1
135
+ end
136
+ params['Period'] = period
137
+ if (dimensions != nil)
138
+ i = 1
139
+ dimensions.each do |k, v|
140
+ params['Dimensions.member.'+i.to_s+".Name."+i.to_s] = k
141
+ params['Dimensions.member.'+i.to_s+".Value."+i.to_s] = v
142
+ i = i+1
143
+ end
144
+ end
145
+ params['StartTime'] = start_time
146
+ params['EndTime'] = end_time
147
+ params['Unit'] = unit
148
+ #params['CustomUnit'] = customUnit always nil
149
+ params['Namespace'] = namespace
150
+
151
+ link = generate_request("GetMetricStatistics", params)
152
+ resp = request_info(link, QMonGetMetricStatistics.new(:logger => @logger))
153
+
154
+ rescue Exception
155
+ on_exception
156
+ end
157
+
158
+
159
+ #-----------------------------------------------------------------
160
+ # PARSERS: Instances
161
+ #-----------------------------------------------------------------
162
+
163
+
164
+ class QMonGetMetricStatistics < Aws::AwsParser
165
+
166
+ def reset
167
+ @result = []
168
+ end
169
+
170
+ def tagstart(name, attributes)
171
+ @metric = {} if name == 'member'
172
+ end
173
+
174
+ def tagend(name)
175
+ case name
176
+ when 'Timestamp' then
177
+ @metric[:timestamp] = @text
178
+ when 'Samples' then
179
+ @metric[:samples] = @text
180
+ when 'Unit' then
181
+ @metric[:unit] = @text
182
+ when 'Average' then
183
+ @metric[:average] = @text
184
+ when 'Minimum' then
185
+ @metric[:minimum] = @text
186
+ when 'Maximum' then
187
+ @metric[:maximum] = @text
188
+ when 'Sum' then
189
+ @metric[:sum] = @text
190
+ when 'Value' then
191
+ @metric[:value] = @text
192
+ when 'member' then
193
+ @result << @metric
194
+ end
195
+ end
196
+ end
197
+
198
+ class QMonListMetrics < Aws::AwsParser
199
+
200
+ def reset
201
+ @result = []
202
+ @namespace = ""
203
+ @measure_name = ""
204
+ end
205
+
206
+ def tagstart(name, attributes)
207
+ @metric = {} if name == 'member'
208
+ end
209
+
210
+ def tagend(name)
211
+ case name
212
+ when 'MeasureName' then
213
+ @measure_name = @text
214
+ when 'Namespace' then
215
+ @namespace = @text
216
+ when 'Name' then
217
+ @metric[:name] = @text
218
+ when 'Value' then
219
+ @metric[:value] = @text
220
+ when 'member' then
221
+ @metric[:namespace] = @namespace
222
+ @metric[:measure_name] = @measure_name
223
+ @result << @metric
224
+ end
225
+ end
226
+ end
227
+
228
+
229
+ end
230
+
231
+
232
+ end
233
+
@@ -0,0 +1,359 @@
1
+ module Aws
2
+
3
+ require 'xmlsimple'
4
+
5
+ class Elb < AwsBase
6
+
7
+ include AwsBaseInterface
8
+
9
+
10
+ #Amazon ELB API version being used
11
+ API_VERSION = "2009-05-15"
12
+ DEFAULT_HOST = "elasticloadbalancing.amazonaws.com"
13
+ DEFAULT_PATH = '/'
14
+ DEFAULT_PROTOCOL = 'https'
15
+ DEFAULT_PORT = 443
16
+
17
+
18
+ @@bench = AwsBenchmarkingBlock.new
19
+
20
+ def self.bench_xml
21
+ @@bench.xml
22
+ end
23
+
24
+ def self.bench_ec2
25
+ @@bench.service
26
+ end
27
+
28
+ # Current API version (sometimes we have to check it outside the GEM).
29
+ @@api = ENV['ELB_API_VERSION'] || API_VERSION
30
+
31
+ def self.api
32
+ @@api
33
+ end
34
+
35
+
36
+ def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
37
+ init({ :name => 'ELB',
38
+ :default_host => ENV['ELB_URL'] ? URI.parse(ENV['ELB_URL']).host : DEFAULT_HOST,
39
+ :default_port => ENV['ELB_URL'] ? URI.parse(ENV['ELB_URL']).port : DEFAULT_PORT,
40
+ :default_service => ENV['ELB_URL'] ? URI.parse(ENV['ELB_URL']).path : DEFAULT_PATH,
41
+ :default_protocol => ENV['ELB_URL'] ? URI.parse(ENV['ELB_URL']).scheme : DEFAULT_PROTOCOL,
42
+ :api_version => API_VERSION },
43
+ aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'],
44
+ aws_secret_access_key|| ENV['AWS_SECRET_ACCESS_KEY'],
45
+ params)
46
+ end
47
+
48
+
49
+ # Sends request to Amazon and parses the response
50
+ # Raises AwsError if any banana happened
51
+ def request_info(request, parser)
52
+ request_info2(request, parser, @params, :elb_connection, @logger, @@bench)
53
+ end
54
+
55
+ # todo: convert to xml-simple version and get rid of parser below
56
+ def do_request(action, params, options={})
57
+ link = generate_request(action, params)
58
+ resp = request_info_xml_simple(:rds_connection, @params, link, @logger,
59
+ :group_tags=>{"LoadBalancersDescriptions"=>"LoadBalancersDescription",
60
+ "DBParameterGroups"=>"DBParameterGroup",
61
+ "DBSecurityGroups"=>"DBSecurityGroup",
62
+ "EC2SecurityGroups"=>"EC2SecurityGroup",
63
+ "IPRanges"=>"IPRange"},
64
+ :force_array=>["DBInstances",
65
+ "DBParameterGroups",
66
+ "DBSecurityGroups",
67
+ "EC2SecurityGroups",
68
+ "IPRanges"],
69
+ :pull_out_array=>options[:pull_out_array],
70
+ :pull_out_single=>options[:pull_out_single],
71
+ :wrapper=>options[:wrapper])
72
+ end
73
+
74
+
75
+ #-----------------------------------------------------------------
76
+ # REQUESTS
77
+ #-----------------------------------------------------------------
78
+
79
+ #
80
+ # name: name of load balancer
81
+ # availability_zones: array of zones
82
+ # listeners: array of hashes containing :load_balancer_port, :instance_port, :protocol
83
+ # eg: {:load_balancer_port=>80, :instance_port=>8080, :protocol=>"HTTP"}
84
+ def create_load_balancer(name, availability_zones, listeners)
85
+ params = hash_params('AvailabilityZones.member', availability_zones)
86
+ i = 1
87
+ listeners.each do |l|
88
+ params["Listeners.member.#{i}.Protocol"] = "#{l[:protocol]}"
89
+ params["Listeners.member.#{i}.LoadBalancerPort"] = "#{l[:load_balancer_port]}"
90
+ params["Listeners.member.#{i}.InstancePort"] = "#{l[:instance_port]}"
91
+ i += 1
92
+ end
93
+ params['LoadBalancerName'] = name
94
+
95
+ @logger.info("Creating LoadBalancer called #{params['LoadBalancerName']}")
96
+
97
+ link = generate_request("CreateLoadBalancer", params)
98
+ resp = request_info(link, QElbCreateParser.new(:logger => @logger))
99
+
100
+ rescue Exception
101
+ on_exception
102
+ end
103
+
104
+
105
+ # name: name of load balancer
106
+ # instance_ids: array of instance_id's to add to load balancer
107
+ def register_instances_with_load_balancer(name, instance_ids)
108
+ params = {}
109
+ params['LoadBalancerName'] = name
110
+
111
+ i = 1
112
+ instance_ids.each do |l|
113
+ params["Instances.member.#{i}.InstanceId"] = "#{l}"
114
+ i += 1
115
+ end
116
+
117
+ @logger.info("Registering Instances #{instance_ids.join(',')} with Load Balancer '#{name}'")
118
+
119
+ link = generate_request("RegisterInstancesWithLoadBalancer", params)
120
+ resp = request_info(link, QElbRegisterInstancesParser.new(:logger => @logger))
121
+
122
+ rescue Exception
123
+ on_exception
124
+ end
125
+
126
+ def deregister_instances_from_load_balancer(name, instance_ids)
127
+ params = {}
128
+ params['LoadBalancerName'] = name
129
+
130
+ i = 1
131
+ instance_ids.each do |l|
132
+ params["Instances.member.#{i}.InstanceId"] = "#{l}"
133
+ i += 1
134
+ end
135
+
136
+ @logger.info("Deregistering Instances #{instance_ids.join(',')} from Load Balancer '#{name}'")
137
+
138
+ link = generate_request("DeregisterInstancesFromLoadBalancer", params) # Same response as register I believe
139
+ resp = request_info(link, QElbRegisterInstancesParser.new(:logger => @logger))
140
+
141
+ rescue Exception
142
+ on_exception
143
+ end
144
+
145
+
146
+ def describe_load_balancers(lparams={})
147
+ @logger.info("Describing Load Balancers")
148
+
149
+ params = {}
150
+ params.update( hash_params('LoadBalancerNames.member', lparams[:names]) ) if lparams[:names]
151
+
152
+ link = generate_request("DescribeLoadBalancers", params)
153
+
154
+ resp = request_info(link, QElbDescribeLoadBalancersParser.new(:logger => @logger))
155
+
156
+ rescue Exception
157
+ on_exception
158
+ end
159
+
160
+
161
+ def describe_instance_health(name, instance_ids=[])
162
+ instance_ids = [instance_ids] if instance_ids.is_a?(String)
163
+ # @logger.info("Describing Instance Health")
164
+ params = {}
165
+ params['LoadBalancerName'] = name
166
+
167
+ i = 1
168
+ instance_ids.each do |l|
169
+ params["Instances.member.#{i}.InstanceId"] = "#{l}"
170
+ i += 1
171
+ end
172
+
173
+ @logger.info("Describing Instances Health #{instance_ids.join(',')} with Load Balancer '#{name}'")
174
+
175
+ link = generate_request("DescribeInstanceHealth", params)
176
+ resp = request_info(link, QElbDescribeInstancesHealthParser.new(:logger => @logger))
177
+
178
+
179
+ rescue Exception
180
+ on_exception
181
+ end
182
+
183
+
184
+ def delete_load_balancer(name)
185
+ @logger.info("Deleting Load Balancer - " + name.to_s)
186
+
187
+ params = {}
188
+ params['LoadBalancerName'] = name
189
+
190
+ link = generate_request("DeleteLoadBalancer", params)
191
+
192
+ resp = request_info(link, QElbDeleteParser.new(:logger => @logger))
193
+
194
+ rescue Exception
195
+ on_exception
196
+ end
197
+
198
+
199
+ #-----------------------------------------------------------------
200
+ # PARSERS: Instances
201
+ #-----------------------------------------------------------------
202
+
203
+
204
+ class QElbCreateParser < AwsParser
205
+
206
+ def reset
207
+ @result = {}
208
+ end
209
+
210
+
211
+ def tagend(name)
212
+ case name
213
+ when 'DNSName' then
214
+ @result[:dns_name] = @text
215
+ end
216
+ end
217
+ end
218
+
219
+ class QElbDescribeLoadBalancersParser < AwsParser
220
+
221
+ def reset
222
+ @result = []
223
+ end
224
+
225
+ def tagstart(name, attributes)
226
+ # puts 'tagstart ' + name + ' -- ' + @xmlpath
227
+ if (name == 'member' && @xmlpath == 'DescribeLoadBalancersResponse/DescribeLoadBalancersResult/LoadBalancerDescriptions/member/Listeners')
228
+ @listener = { }
229
+ end
230
+ if (name == 'member' && @xmlpath == 'DescribeLoadBalancersResponse/DescribeLoadBalancersResult/LoadBalancerDescriptions/member/AvailabilityZones')
231
+ @availability_zone = { }
232
+ end
233
+ if (name == 'member' && @xmlpath == 'DescribeLoadBalancersResponse/DescribeLoadBalancersResult/LoadBalancerDescriptions/member/Instances')
234
+ @instance = {}
235
+ end
236
+ if (name == 'member' && @xmlpath == 'DescribeLoadBalancersResponse/DescribeLoadBalancersResult/LoadBalancerDescriptions')
237
+ @member = { :listeners=>[], :availability_zones=>[], :health_check=>{}, :instances=>[] }
238
+ end
239
+
240
+ end
241
+
242
+
243
+ def tagend(name)
244
+ case name
245
+ when 'LoadBalancerName' then
246
+ @member[:load_balancer_name] = @text
247
+ @member[:name] = @text
248
+ when 'CreatedTime' then
249
+ @member[:created_time] = Time.parse(@text)
250
+ @member[:created] = @member[:created_time]
251
+ when 'DNSName' then
252
+ @member[:dns_name] = @text
253
+ # Instances
254
+ when 'InstanceId' then
255
+ @instance[:instance_id] = @text
256
+ # Listeners
257
+ when 'Protocol' then
258
+ @listener[:protocol] = @text
259
+ when 'LoadBalancerPort' then
260
+ @listener[:load_balancer_port] = @text.to_i
261
+ when 'InstancePort' then
262
+ @listener[:instance_port] = @text.to_i
263
+ # HEALTH CHECK STUFF
264
+ when 'Interval' then
265
+ @member[:health_check][:interval] = @text.to_i
266
+ when 'Target' then
267
+ @member[:health_check][:target] = @text
268
+ when 'HealthyThreshold' then
269
+ @member[:health_check][:healthy_threshold] = @text.to_i
270
+ when 'Timeout' then
271
+ @member[:health_check][:timeout] = @text.to_i
272
+ when 'UnhealthyThreshold' then
273
+ @member[:health_check][:unhealthy_threshold] = @text.to_i
274
+ # AvailabilityZones
275
+ when 'member' then
276
+ if @xmlpath == 'DescribeLoadBalancersResponse/DescribeLoadBalancersResult/LoadBalancerDescriptions/member/Listeners'
277
+ @member[:listeners] << @listener
278
+ elsif @xmlpath == 'DescribeLoadBalancersResponse/DescribeLoadBalancersResult/LoadBalancerDescriptions/member/AvailabilityZones'
279
+ @availability_zone = @text
280
+ @member[:availability_zones] << @availability_zone
281
+ elsif @xmlpath == 'DescribeLoadBalancersResponse/DescribeLoadBalancersResult/LoadBalancerDescriptions/member/Instances'
282
+ @member[:instances] << @instance
283
+ elsif @xmlpath == 'DescribeLoadBalancersResponse/DescribeLoadBalancersResult/LoadBalancerDescriptions'
284
+ @result << @member
285
+ end
286
+
287
+ end
288
+ end
289
+ end
290
+
291
+ class QElbRegisterInstancesParser < AwsParser
292
+
293
+ def reset
294
+ @result = []
295
+ end
296
+
297
+ def tagstart(name, attributes)
298
+ # puts 'tagstart ' + name + ' -- ' + @xmlpath
299
+ if (name == 'member' &&
300
+ (@xmlpath == 'RegisterInstancesWithLoadBalancerResponse/RegisterInstancesWithLoadBalancerResult/Instances' ||
301
+ @xmlpath == 'DeregisterInstancesFromLoadBalancerResponse/DeregisterInstancesFromLoadBalancerResult/Instances')
302
+ )
303
+ @member = { }
304
+ end
305
+
306
+ end
307
+
308
+ def tagend(name)
309
+ case name
310
+ when 'InstanceId' then
311
+ @member[:instance_id] = @text
312
+ when 'member' then
313
+ @result << @member
314
+ end
315
+ end
316
+ #
317
+ end
318
+
319
+ class QElbDescribeInstancesHealthParser < AwsParser
320
+
321
+ def reset
322
+ @result = []
323
+ end
324
+
325
+ def tagstart(name, attributes)
326
+ # puts 'tagstart ' + name + ' -- ' + @xmlpath
327
+ if (name == 'member' && @xmlpath == 'DescribeInstanceHealthResponse/DescribeInstanceHealthResult/InstanceStates')
328
+ @member = { }
329
+ end
330
+ end
331
+
332
+ def tagend(name)
333
+ case name
334
+ when 'Description' then
335
+ @member[:description] = @text
336
+ when 'State' then
337
+ @member[:state] = @text
338
+ when 'InstanceId' then
339
+ @member[:instance_id] = @text
340
+ when 'ReasonCode' then
341
+ @member[:reason_code] = @text
342
+ when 'member' then
343
+ @result << @member
344
+ end
345
+ end
346
+ #
347
+ end
348
+
349
+ class QElbDeleteParser < AwsParser
350
+ def reset
351
+ @result = true
352
+ end
353
+ end
354
+
355
+
356
+ end
357
+
358
+
359
+ end