poolparty 1.6.6 → 1.6.7
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +2 -3
- data/lib/poolparty/chef_solo.rb +0 -1
- metadata +12 -69
- data/vendor/gems/amazon-ec2/ChangeLog +0 -304
- data/vendor/gems/amazon-ec2/LICENSE +0 -66
- data/vendor/gems/amazon-ec2/README.rdoc +0 -359
- data/vendor/gems/amazon-ec2/README_dev.rdoc +0 -10
- data/vendor/gems/amazon-ec2/Rakefile +0 -70
- data/vendor/gems/amazon-ec2/VERSION +0 -1
- data/vendor/gems/amazon-ec2/amazon-ec2.gemspec +0 -142
- data/vendor/gems/amazon-ec2/bin/ec2-gem-example.rb +0 -137
- data/vendor/gems/amazon-ec2/bin/ec2-gem-profile.rb +0 -10
- data/vendor/gems/amazon-ec2/bin/ec2sh +0 -62
- data/vendor/gems/amazon-ec2/bin/setup.rb +0 -29
- data/vendor/gems/amazon-ec2/deps.rip +0 -1
- data/vendor/gems/amazon-ec2/lib/AWS/Autoscaling/autoscaling.rb +0 -273
- data/vendor/gems/amazon-ec2/lib/AWS/Autoscaling.rb +0 -70
- data/vendor/gems/amazon-ec2/lib/AWS/Cloudwatch/monitoring.rb +0 -80
- data/vendor/gems/amazon-ec2/lib/AWS/Cloudwatch.rb +0 -32
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/availability_zones.rb +0 -29
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/console.rb +0 -25
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/devpay.rb +0 -18
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/elastic_ips.rb +0 -86
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/image_attributes.rb +0 -133
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/images.rb +0 -117
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/instances.rb +0 -249
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/keypairs.rb +0 -47
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/products.rb +0 -21
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/security_groups.rb +0 -164
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/snapshots.rb +0 -80
- data/vendor/gems/amazon-ec2/lib/AWS/EC2/volumes.rb +0 -100
- data/vendor/gems/amazon-ec2/lib/AWS/EC2.rb +0 -33
- data/vendor/gems/amazon-ec2/lib/AWS/ELB/load_balancers.rb +0 -178
- data/vendor/gems/amazon-ec2/lib/AWS/ELB.rb +0 -71
- data/vendor/gems/amazon-ec2/lib/AWS/RDS/rds.rb +0 -522
- data/vendor/gems/amazon-ec2/lib/AWS/RDS.rb +0 -73
- data/vendor/gems/amazon-ec2/lib/AWS/exceptions.rb +0 -200
- data/vendor/gems/amazon-ec2/lib/AWS/responses.rb +0 -21
- data/vendor/gems/amazon-ec2/lib/AWS.rb +0 -304
- data/vendor/gems/amazon-ec2/perftools/ec2prof +0 -0
- data/vendor/gems/amazon-ec2/perftools/ec2prof-results.dot +0 -132
- data/vendor/gems/amazon-ec2/perftools/ec2prof-results.txt +0 -100
- data/vendor/gems/amazon-ec2/perftools/ec2prof.symbols +0 -102
- data/vendor/gems/amazon-ec2/test/test_Autoscaling_groups.rb +0 -337
- data/vendor/gems/amazon-ec2/test/test_EC2.rb +0 -68
- data/vendor/gems/amazon-ec2/test/test_EC2_availability_zones.rb +0 -49
- data/vendor/gems/amazon-ec2/test/test_EC2_console.rb +0 -54
- data/vendor/gems/amazon-ec2/test/test_EC2_elastic_ips.rb +0 -144
- data/vendor/gems/amazon-ec2/test/test_EC2_image_attributes.rb +0 -238
- data/vendor/gems/amazon-ec2/test/test_EC2_images.rb +0 -229
- data/vendor/gems/amazon-ec2/test/test_EC2_instances.rb +0 -611
- data/vendor/gems/amazon-ec2/test/test_EC2_keypairs.rb +0 -123
- data/vendor/gems/amazon-ec2/test/test_EC2_products.rb +0 -48
- data/vendor/gems/amazon-ec2/test/test_EC2_responses.rb +0 -53
- data/vendor/gems/amazon-ec2/test/test_EC2_s3_xmlsimple.rb +0 -80
- data/vendor/gems/amazon-ec2/test/test_EC2_security_groups.rb +0 -205
- data/vendor/gems/amazon-ec2/test/test_EC2_snapshots.rb +0 -83
- data/vendor/gems/amazon-ec2/test/test_EC2_volumes.rb +0 -142
- data/vendor/gems/amazon-ec2/test/test_ELB_load_balancers.rb +0 -239
- data/vendor/gems/amazon-ec2/test/test_RDS.rb +0 -354
- data/vendor/gems/amazon-ec2/test/test_helper.rb +0 -23
- data/vendor/gems/amazon-ec2/wsdl/2007-08-29.ec2.wsdl +0 -1269
- data/vendor/gems/amazon-ec2/wsdl/2008-02-01.ec2.wsdl +0 -1614
- data/vendor/gems/amazon-ec2/wsdl/2008-05-05.ec2.wsdl +0 -2052
- data/vendor/gems/amazon-ec2/wsdl/2008-12-01.ec2.wsdl +0 -2354
- data/vendor/gems/amazon-ec2/wsdl/2009-10-31.ec2.wsdl +0 -4261
- data/vendor/gems/amazon-ec2/wsdl/2009-11-30.ec2.wsdl +0 -4668
@@ -1,200 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# AWS ERROR CODES
|
3
|
-
# AWS can throw error exceptions that contain a '.' in them.
|
4
|
-
# since we can't name an exception class with that '.' I compressed
|
5
|
-
# each class name into the non-dot version which allows us to retain
|
6
|
-
# the granularity of the exception.
|
7
|
-
#++
|
8
|
-
|
9
|
-
module AWS
|
10
|
-
|
11
|
-
# All AWS errors are superclassed by Error < RuntimeError
|
12
|
-
class Error < RuntimeError; end
|
13
|
-
|
14
|
-
# CLIENT : A client side argument error
|
15
|
-
class ArgumentError < Error; end
|
16
|
-
|
17
|
-
# Elastic Compute Cloud
|
18
|
-
############################
|
19
|
-
|
20
|
-
# EC2 : User has the maximum number of allowed IP addresses.
|
21
|
-
class AddressLimitExceeded < Error; end
|
22
|
-
|
23
|
-
# EC2 : The limit on the number of Amazon EBS volumes attached to one instance has been exceeded.
|
24
|
-
class AttachmentLimitExceeded < Error; end
|
25
|
-
|
26
|
-
# EC2 : User not authorized.
|
27
|
-
class AuthFailure < Error; end
|
28
|
-
|
29
|
-
# EC2 : Volume is in incorrect state
|
30
|
-
class IncorrectState < Error; end
|
31
|
-
|
32
|
-
# EC2 : User has max allowed concurrent running instances.
|
33
|
-
class InstanceLimitExceeded < Error; end
|
34
|
-
|
35
|
-
# EC2 : The value of an item added to, or removed from, an image attribute is invalid.
|
36
|
-
class InvalidAMIAttributeItemValue < Error; end
|
37
|
-
|
38
|
-
# EC2 : Specified AMI ID is not valid.
|
39
|
-
class InvalidAMIIDMalformed < Error; end
|
40
|
-
|
41
|
-
# EC2 : Specified AMI ID does not exist.
|
42
|
-
class InvalidAMIIDNotFound < Error; end
|
43
|
-
|
44
|
-
# EC2 : Specified AMI ID has been deregistered and is no longer available.
|
45
|
-
class InvalidAMIIDUnavailable < Error; end
|
46
|
-
|
47
|
-
# EC2 : The instance cannot detach from a volume to which it is not attached.
|
48
|
-
class InvalidAttachmentNotFound < Error; end
|
49
|
-
|
50
|
-
# EC2 : The device to which you are trying to attach (i.e. /dev/sdh) is already in use on the instance.
|
51
|
-
class InvalidDeviceInUse < Error; end
|
52
|
-
|
53
|
-
# EC2 : Specified instance ID is not valid.
|
54
|
-
class InvalidInstanceIDMalformed < Error; end
|
55
|
-
|
56
|
-
# EC2 : Specified instance ID does not exist.
|
57
|
-
class InvalidInstanceIDNotFound < Error; end
|
58
|
-
|
59
|
-
# EC2 : Specified keypair name does not exist.
|
60
|
-
class InvalidKeyPairNotFound < Error; end
|
61
|
-
|
62
|
-
# EC2 : Attempt to create a duplicate keypair.
|
63
|
-
class InvalidKeyPairDuplicate < Error; end
|
64
|
-
|
65
|
-
# EC2 : Specified group name does not exist.
|
66
|
-
class InvalidGroupNotFound < Error; end
|
67
|
-
|
68
|
-
# EC2 : Attempt to create a duplicate group.
|
69
|
-
class InvalidGroupDuplicate < Error; end
|
70
|
-
|
71
|
-
# EC2 : Specified group can not be deleted because it is in use.
|
72
|
-
class InvalidGroupInUse < Error; end
|
73
|
-
|
74
|
-
# EC2 : Specified group name is a reserved name.
|
75
|
-
class InvalidGroupReserved < Error; end
|
76
|
-
|
77
|
-
# EC2 : Specified AMI has an unparsable manifest.
|
78
|
-
class InvalidManifest < Error; end
|
79
|
-
|
80
|
-
# EC2 : RunInstances was called with minCount and maxCount set to 0 or minCount > maxCount.
|
81
|
-
class InvalidParameterCombination < Error; end
|
82
|
-
|
83
|
-
# EC2 : The value supplied for a parameter was invalid.
|
84
|
-
class InvalidParameterValue < Error; end
|
85
|
-
|
86
|
-
# EC2 : Attempt to authorize a permission that has already been authorized.
|
87
|
-
class InvalidPermissionDuplicate < Error; end
|
88
|
-
|
89
|
-
# EC2 : Specified permission is invalid.
|
90
|
-
class InvalidPermissionMalformed < Error; end
|
91
|
-
|
92
|
-
# EC2 : Specified reservation ID is invalid.
|
93
|
-
class InvalidReservationIDMalformed < Error; end
|
94
|
-
|
95
|
-
# EC2 : Specified reservation ID does not exist.
|
96
|
-
class InvalidReservationIDNotFound < Error; end
|
97
|
-
|
98
|
-
# EC2 : The snapshot ID that was passed as an argument was malformed.
|
99
|
-
class InvalidSnapshotIDMalformed < Error; end
|
100
|
-
|
101
|
-
# EC2 : The specified snapshot does not exist.
|
102
|
-
class InvalidSnapshotIDNotFound < Error; end
|
103
|
-
|
104
|
-
# EC2 : The user ID is neither in the form of an AWS account ID or one
|
105
|
-
# of the special values accepted by the owner or executableBy flags
|
106
|
-
# in the DescribeImages call.
|
107
|
-
class InvalidUserIDMalformed < Error; end
|
108
|
-
|
109
|
-
# EC2 : Reserved Instances ID not found.
|
110
|
-
class InvalidReservedInstancesId < Error; end
|
111
|
-
|
112
|
-
# EC2 : Reserved Instances Offering ID not found.
|
113
|
-
class InvalidReservedInstancesOfferingId < Error; end
|
114
|
-
|
115
|
-
# EC2 : The volume ID that was passed as an argument was malformed.
|
116
|
-
class InvalidVolumeIDMalformed < Error; end
|
117
|
-
|
118
|
-
# EC2 : The volume specified does not exist.
|
119
|
-
class InvalidVolumeIDNotFound < Error; end
|
120
|
-
|
121
|
-
# EC2 : The volume already exists in the system.
|
122
|
-
class InvalidVolumeIDDuplicate < Error; end
|
123
|
-
|
124
|
-
# EC2 : The specified volume ID and instance ID are in different Availability Zones.
|
125
|
-
class InvalidVolumeIDZoneMismatch < Error; end
|
126
|
-
|
127
|
-
# EC2 : The zone specified does not exist.
|
128
|
-
class InvalidZoneNotFound < Error; end
|
129
|
-
|
130
|
-
# EC2 : Insufficient Reserved Instances capacity.
|
131
|
-
class InsufficientReservedInstancesCapacity < Error; end
|
132
|
-
|
133
|
-
# EC2 : The instance specified does not support EBS.
|
134
|
-
class NonEBSInstance < Error; end
|
135
|
-
|
136
|
-
# EC2 : The limit on the number of Amazon EBS snapshots in the pending state has been exceeded.
|
137
|
-
class PendingSnapshotLimitExceeded < Error; end
|
138
|
-
|
139
|
-
# EC2 : Your current quota does not allow you to purchase the required number of reserved instances.
|
140
|
-
class ReservedInstancesLimitExceeded < Error; end
|
141
|
-
|
142
|
-
# EC2 : The limit on the number of Amazon EBS snapshots has been exceeded.
|
143
|
-
class SnapshotLimitExceeded < Error; end
|
144
|
-
|
145
|
-
# EC2 : An unknown parameter was passed as an argument
|
146
|
-
class UnknownParameter < Error; end
|
147
|
-
|
148
|
-
# EC2 : The limit on the number of Amazon EBS volumes has been exceeded.
|
149
|
-
class VolumeLimitExceeded < Error; end
|
150
|
-
|
151
|
-
# Server Error Codes
|
152
|
-
###
|
153
|
-
|
154
|
-
# Server : Internal Error.
|
155
|
-
class InternalError < Error; end
|
156
|
-
|
157
|
-
# Server : Not enough available addresses to satisfy your minimum request.
|
158
|
-
class InsufficientAddressCapacity < Error; end
|
159
|
-
|
160
|
-
# Server : There are not enough available instances to satisfy your minimum request.
|
161
|
-
class InsufficientInstanceCapacity < Error; end
|
162
|
-
|
163
|
-
# Server : There are not enough available reserved instances to satisfy your minimum request.
|
164
|
-
class InsufficientReservedInstanceCapacity < Error; end
|
165
|
-
|
166
|
-
# Server : The server is overloaded and cannot handle the request.
|
167
|
-
class Unavailable < Error; end
|
168
|
-
|
169
|
-
# Elastic Load Balancer
|
170
|
-
############################
|
171
|
-
|
172
|
-
# ELB : The Load balancer specified was not found.
|
173
|
-
class LoadBalancerNotFound < Error; end
|
174
|
-
|
175
|
-
# ELB :
|
176
|
-
class ValidationError < Error; end
|
177
|
-
|
178
|
-
# ELB :
|
179
|
-
class DuplicateLoadBalancerName < Error; end
|
180
|
-
|
181
|
-
# ELB :
|
182
|
-
class TooManyLoadBalancers < Error; end
|
183
|
-
|
184
|
-
# ELB :
|
185
|
-
class InvalidInstance < Error; end
|
186
|
-
|
187
|
-
# ELB :
|
188
|
-
class InvalidConfigurationRequest < Error; end
|
189
|
-
|
190
|
-
# API Errors
|
191
|
-
############################
|
192
|
-
|
193
|
-
# Server : Invalid AWS Account
|
194
|
-
class InvalidClientTokenId < Error; end
|
195
|
-
|
196
|
-
# Server : The provided signature does not match.
|
197
|
-
class SignatureDoesNotMatch < Error; end
|
198
|
-
|
199
|
-
end
|
200
|
-
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module AWS
|
2
|
-
|
3
|
-
class Response
|
4
|
-
|
5
|
-
# Parse the XML response from AWS
|
6
|
-
#
|
7
|
-
# @option options [String] :xml The XML response from AWS that we want to parse
|
8
|
-
# @option options [Hash] :parse_options Override the options for XmlSimple.
|
9
|
-
# @return [Hash] the input :xml converted to a custom Ruby Hash by XmlSimple.
|
10
|
-
def self.parse(options = {})
|
11
|
-
options = {
|
12
|
-
:xml => "",
|
13
|
-
:parse_options => { 'forcearray' => ['item', 'member'], 'suppressempty' => nil, 'keeproot' => false }
|
14
|
-
}.merge(options)
|
15
|
-
response = XmlSimple.xml_in(options[:xml], options[:parse_options])
|
16
|
-
end
|
17
|
-
|
18
|
-
end # class Response
|
19
|
-
|
20
|
-
end # module AWS
|
21
|
-
|
@@ -1,304 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# Amazon Web Services EC2 + ELB API Ruby library
|
3
|
-
#
|
4
|
-
# Ruby Gem Name:: amazon-ec2
|
5
|
-
# Author:: Glenn Rempe (mailto:glenn@rempe.us)
|
6
|
-
# Copyright:: Copyright (c) 2007-2009 Glenn Rempe
|
7
|
-
# License:: Distributes under the same terms as Ruby
|
8
|
-
# Home:: http://github.com/grempe/amazon-ec2/tree/master
|
9
|
-
#++
|
10
|
-
|
11
|
-
%w[ base64 cgi openssl digest/sha1 net/https rexml/document time ostruct ].each { |f| require f }
|
12
|
-
|
13
|
-
begin
|
14
|
-
require 'xmlsimple' unless defined? XmlSimple
|
15
|
-
rescue Exception => e
|
16
|
-
require 'xml-simple' unless defined? XmlSimple
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
# A custom implementation of Hash that allows us to access hash values using dot notation
|
21
|
-
#
|
22
|
-
# @example Access the hash keys in the standard way or using dot notation
|
23
|
-
# foo[:bar] => "baz"
|
24
|
-
# foo.bar => "baz"
|
25
|
-
class Hash
|
26
|
-
def method_missing(meth, *args, &block)
|
27
|
-
if args.size == 0
|
28
|
-
self[meth.to_s] || self[meth.to_sym]
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def has?(key)
|
33
|
-
self[key] && !self[key].to_s.empty?
|
34
|
-
end
|
35
|
-
|
36
|
-
def does_not_have?(key)
|
37
|
-
self[key].nil? || self[key].to_s.empty?
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
module AWS
|
43
|
-
|
44
|
-
# Builds the canonical string for signing requests. This strips out all '&', '?', and '='
|
45
|
-
# from the query string to be signed. The parameters in the path passed in must already
|
46
|
-
# be sorted in case-insensitive alphabetical order and must not be url encoded.
|
47
|
-
#
|
48
|
-
# @param [String] params the params that will be sorted and encoded as a canonical string.
|
49
|
-
# @param [String] host the hostname of the API endpoint.
|
50
|
-
# @param [String] method the HTTP method that will be used to submit the params.
|
51
|
-
# @param [String] base the URI path that this information will be submitted to.
|
52
|
-
# @return [String] the canonical request description string.
|
53
|
-
def AWS.canonical_string(params, host, method="POST", base="/")
|
54
|
-
# Sort, and encode parameters into a canonical string.
|
55
|
-
sorted_params = params.sort {|x,y| x[0] <=> y[0]}
|
56
|
-
encoded_params = sorted_params.collect do |p|
|
57
|
-
encoded = (CGI::escape(p[0].to_s) +
|
58
|
-
"=" + CGI::escape(p[1].to_s))
|
59
|
-
# Ensure spaces are encoded as '%20', not '+'
|
60
|
-
encoded.gsub('+', '%20')
|
61
|
-
end
|
62
|
-
sigquery = encoded_params.join("&")
|
63
|
-
|
64
|
-
# Generate the request description string
|
65
|
-
req_desc =
|
66
|
-
method + "\n" +
|
67
|
-
host + "\n" +
|
68
|
-
base + "\n" +
|
69
|
-
sigquery
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
# Encodes the given string with the secret_access_key by taking the
|
74
|
-
# hmac-sha1 sum, and then base64 encoding it. Optionally, it will also
|
75
|
-
# url encode the result of that to protect the string if it's going to
|
76
|
-
# be used as a query string parameter.
|
77
|
-
#
|
78
|
-
# @param [String] secret_access_key the user's secret access key for signing.
|
79
|
-
# @param [String] str the string to be hashed and encoded.
|
80
|
-
# @param [Boolean] urlencode whether or not to url encode the result., true or false
|
81
|
-
# @return [String] the signed and encoded string.
|
82
|
-
def AWS.encode(secret_access_key, str, urlencode=true)
|
83
|
-
digest = OpenSSL::Digest::Digest.new('sha1')
|
84
|
-
b64_hmac =
|
85
|
-
Base64.encode64(
|
86
|
-
OpenSSL::HMAC.digest(digest, secret_access_key, str)).gsub("\n","")
|
87
|
-
|
88
|
-
if urlencode
|
89
|
-
return CGI::escape(b64_hmac)
|
90
|
-
else
|
91
|
-
return b64_hmac
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
# This class provides all the methods for using the EC2 or ELB service
|
96
|
-
# including the handling of header signing and other security concerns.
|
97
|
-
# This class uses the Net::HTTP library to interface with the AWS Query API
|
98
|
-
# interface. You should not instantiate this directly, instead
|
99
|
-
# you should setup an instance of 'AWS::EC2::Base' or 'AWS::ELB::Base'.
|
100
|
-
class Base
|
101
|
-
|
102
|
-
attr_reader :use_ssl, :server, :proxy_server, :port
|
103
|
-
|
104
|
-
# @option options [String] :access_key_id ("") The user's AWS Access Key ID
|
105
|
-
# @option options [String] :secret_access_key ("") The user's AWS Secret Access Key
|
106
|
-
# @option options [Boolean] :use_ssl (true) Connect using SSL?
|
107
|
-
# @option options [String] :server ("ec2.amazonaws.com") The server API endpoint host
|
108
|
-
# @option options [String] :proxy_server (nil) An HTTP proxy server FQDN
|
109
|
-
# @return [Object] the object.
|
110
|
-
def initialize( options = {} )
|
111
|
-
|
112
|
-
options = { :access_key_id => "",
|
113
|
-
:secret_access_key => "",
|
114
|
-
:use_ssl => true,
|
115
|
-
:server => default_host,
|
116
|
-
:proxy_server => nil
|
117
|
-
}.merge(options)
|
118
|
-
|
119
|
-
@server = options[:server]
|
120
|
-
@proxy_server = options[:proxy_server]
|
121
|
-
@use_ssl = options[:use_ssl]
|
122
|
-
|
123
|
-
raise ArgumentError, "No :access_key_id provided" if options[:access_key_id].nil? || options[:access_key_id].empty?
|
124
|
-
raise ArgumentError, "No :secret_access_key provided" if options[:secret_access_key].nil? || options[:secret_access_key].empty?
|
125
|
-
raise ArgumentError, "No :use_ssl value provided" if options[:use_ssl].nil?
|
126
|
-
raise ArgumentError, "Invalid :use_ssl value provided, only 'true' or 'false' allowed" unless options[:use_ssl] == true || options[:use_ssl] == false
|
127
|
-
raise ArgumentError, "No :server provided" if options[:server].nil? || options[:server].empty?
|
128
|
-
|
129
|
-
if options[:port]
|
130
|
-
# user-specified port
|
131
|
-
@port = options[:port]
|
132
|
-
elsif @use_ssl
|
133
|
-
# https
|
134
|
-
@port = 443
|
135
|
-
else
|
136
|
-
# http
|
137
|
-
@port = 80
|
138
|
-
end
|
139
|
-
|
140
|
-
@access_key_id = options[:access_key_id]
|
141
|
-
@secret_access_key = options[:secret_access_key]
|
142
|
-
|
143
|
-
# Use proxy server if defined
|
144
|
-
# Based on patch by Mathias Dalheimer. 20070217
|
145
|
-
proxy = @proxy_server ? URI.parse(@proxy_server) : OpenStruct.new
|
146
|
-
@http = Net::HTTP::Proxy( proxy.host,
|
147
|
-
proxy.port,
|
148
|
-
proxy.user,
|
149
|
-
proxy.password).new(options[:server], @port)
|
150
|
-
|
151
|
-
@http.use_ssl = @use_ssl
|
152
|
-
|
153
|
-
# Don't verify the SSL certificates. Avoids SSL Cert warning in log on every GET.
|
154
|
-
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
155
|
-
|
156
|
-
end
|
157
|
-
|
158
|
-
|
159
|
-
protected
|
160
|
-
|
161
|
-
# pathlist is a utility method which takes a key string and and array as input.
|
162
|
-
# It converts the array into a Hash with the hash key being 'Key.n' where
|
163
|
-
# 'n' increments by 1 for each iteration. So if you pass in args
|
164
|
-
# ("ImageId", ["123", "456"]) you should get
|
165
|
-
# {"ImageId.1"=>"123", "ImageId.2"=>"456"} returned.
|
166
|
-
def pathlist(key, arr)
|
167
|
-
params = {}
|
168
|
-
|
169
|
-
# ruby 1.9 will barf if we pass in a string instead of the array expected.
|
170
|
-
# it will fail on each_with_index below since string is not enumerable.
|
171
|
-
if arr.is_a? String
|
172
|
-
new_arr = []
|
173
|
-
new_arr << arr
|
174
|
-
arr = new_arr
|
175
|
-
end
|
176
|
-
|
177
|
-
arr.each_with_index do |value, i|
|
178
|
-
params["#{key}.#{i+1}"] = value
|
179
|
-
end
|
180
|
-
params
|
181
|
-
end
|
182
|
-
|
183
|
-
# Same as _pathlist_ except it deals with arrays of hashes.
|
184
|
-
# So if you pass in args
|
185
|
-
# ("People", [{:name=>'jon', :age=>'22'}, {:name=>'chris'}], {:name => 'Name', :age => 'Age'}) you should get
|
186
|
-
# {"People.1.Name"=>"jon", "People.1.Age"=>'22', 'People.2.Name'=>'chris'}
|
187
|
-
def pathhashlist(key, arr_of_hashes, mappings)
|
188
|
-
raise ArgumentError, "expected a key that is a String" unless key.is_a? String
|
189
|
-
raise ArgumentError, "expected a arr_of_hashes that is an Array" unless arr_of_hashes.is_a? Array
|
190
|
-
arr_of_hashes.each{|h| raise ArgumentError, "expected each element of arr_of_hashes to be a Hash" unless h.is_a?(Hash)}
|
191
|
-
raise ArgumentError, "expected a mappings that is an Hash" unless mappings.is_a? Hash
|
192
|
-
params = {}
|
193
|
-
arr_of_hashes.each_with_index do |hash, i|
|
194
|
-
hash.each do |attribute, value|
|
195
|
-
params["#{key}.#{i+1}.#{mappings[attribute]}"] = value.to_s
|
196
|
-
end
|
197
|
-
end
|
198
|
-
params
|
199
|
-
end
|
200
|
-
|
201
|
-
# Make the connection to AWS EC2 passing in our request. This is generally called from
|
202
|
-
# within a 'Response' class object or one of its sub-classes so the response is interpreted
|
203
|
-
# in its proper context. See lib/EC2/responses.rb
|
204
|
-
def make_request(action, params, data='')
|
205
|
-
|
206
|
-
@http.start do
|
207
|
-
|
208
|
-
# remove any keys that have nil or empty values
|
209
|
-
params.reject! { |key, value| value.nil? or value.empty?}
|
210
|
-
|
211
|
-
params.merge!( {"Action" => action,
|
212
|
-
"SignatureVersion" => "2",
|
213
|
-
"SignatureMethod" => 'HmacSHA1',
|
214
|
-
"AWSAccessKeyId" => @access_key_id,
|
215
|
-
"Version" => api_version,
|
216
|
-
"Timestamp"=>Time.now.getutc.iso8601} )
|
217
|
-
|
218
|
-
sig = get_aws_auth_param(params, @secret_access_key, @server)
|
219
|
-
|
220
|
-
query = params.sort.collect do |param|
|
221
|
-
CGI::escape(param[0]) + "=" + CGI::escape(param[1])
|
222
|
-
end.join("&") + "&Signature=" + sig
|
223
|
-
|
224
|
-
req = Net::HTTP::Post.new("/")
|
225
|
-
req.content_type = 'application/x-www-form-urlencoded'
|
226
|
-
req['User-Agent'] = "github-amazon-ec2-ruby-gem"
|
227
|
-
|
228
|
-
response = @http.request(req, query)
|
229
|
-
|
230
|
-
# Make a call to see if we need to throw an error based on the response given by EC2
|
231
|
-
# All error classes are defined in EC2/exceptions.rb
|
232
|
-
aws_error?(response)
|
233
|
-
return response
|
234
|
-
|
235
|
-
end
|
236
|
-
|
237
|
-
end
|
238
|
-
|
239
|
-
# Set the Authorization header using AWS signed header authentication
|
240
|
-
def get_aws_auth_param(params, secret_access_key, server)
|
241
|
-
canonical_string = AWS.canonical_string(params, server)
|
242
|
-
encoded_canonical = AWS.encode(secret_access_key, canonical_string)
|
243
|
-
end
|
244
|
-
|
245
|
-
# allow us to have a one line call in each method which will do all of the work
|
246
|
-
# in making the actual request to AWS.
|
247
|
-
def response_generator( options = {} )
|
248
|
-
|
249
|
-
options = {
|
250
|
-
:action => "",
|
251
|
-
:params => {}
|
252
|
-
}.merge(options)
|
253
|
-
|
254
|
-
raise ArgumentError, ":action must be provided to response_generator" if options[:action].nil? || options[:action].empty?
|
255
|
-
|
256
|
-
http_response = make_request(options[:action], options[:params])
|
257
|
-
http_xml = http_response.body
|
258
|
-
return Response.parse(:xml => http_xml)
|
259
|
-
|
260
|
-
end
|
261
|
-
|
262
|
-
# Raises the appropriate error if the specified Net::HTTPResponse object
|
263
|
-
# contains an AWS error; returns +false+ otherwise.
|
264
|
-
def aws_error?(response)
|
265
|
-
|
266
|
-
# return false if we got a HTTP 200 code,
|
267
|
-
# otherwise there is some type of error (40x,50x) and
|
268
|
-
# we should try to raise an appropriate exception
|
269
|
-
# from one of our exception classes defined in
|
270
|
-
# exceptions.rb
|
271
|
-
return false if response.is_a?(Net::HTTPSuccess)
|
272
|
-
|
273
|
-
# parse the XML document so we can walk through it
|
274
|
-
doc = REXML::Document.new(response.body)
|
275
|
-
|
276
|
-
# Check that the Error element is in the place we would expect.
|
277
|
-
# and if not raise a generic error exception
|
278
|
-
unless doc.root.elements['Errors'].elements['Error'].name == 'Error'
|
279
|
-
raise Error, "Unexpected error format. response.body is: #{response.body}"
|
280
|
-
end
|
281
|
-
|
282
|
-
# An valid error response looks like this:
|
283
|
-
# <?xml version="1.0"?><Response><Errors><Error><Code>InvalidParameterCombination</Code><Message>Unknown parameter: foo</Message></Error></Errors><RequestID>291cef62-3e86-414b-900e-17246eccfae8</RequestID></Response>
|
284
|
-
# AWS throws some exception codes that look like Error.SubError. Since we can't name classes this way
|
285
|
-
# we need to strip out the '.' in the error 'Code' and we name the error exceptions with this
|
286
|
-
# non '.' name as well.
|
287
|
-
error_code = doc.root.elements['Errors'].elements['Error'].elements['Code'].text.gsub('.', '')
|
288
|
-
error_message = doc.root.elements['Errors'].elements['Error'].elements['Message'].text
|
289
|
-
|
290
|
-
# Raise one of our specific error classes if it exists.
|
291
|
-
# otherwise, throw a generic EC2 Error with a few details.
|
292
|
-
if AWS.const_defined?(error_code)
|
293
|
-
raise AWS.const_get(error_code), error_message
|
294
|
-
else
|
295
|
-
raise AWS::Error, error_message
|
296
|
-
end
|
297
|
-
|
298
|
-
end
|
299
|
-
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
Dir[File.join(File.dirname(__FILE__), 'AWS/**/*.rb')].sort.each { |lib| require lib }
|
304
|
-
|
Binary file
|
@@ -1,132 +0,0 @@
|
|
1
|
-
digraph "/usr/bin/ruby; 2043 samples" {
|
2
|
-
node [width=0.375,height=0.25];
|
3
|
-
Legend [shape=box,fontsize=24,shape=plaintext,label="/usr/bin/ruby\lTotal samples: 2043\lFocusing on: 2035\lDropped nodes with <= 10 abs(samples)\lDropped edges with <= 2 samples\l"];
|
4
|
-
N1 [label="garbage_collector\n1298 (63.5%)\r",shape=box,fontsize=47.9];
|
5
|
-
N2 [label="XmlSimple#xml_in\n0 (0.0%)\rof 507 (24.8%)\r",shape=box,fontsize=8.0];
|
6
|
-
N3 [label="XmlSimple.xml_in\n0 (0.0%)\rof 469 (23.0%)\r",shape=box,fontsize=8.0];
|
7
|
-
N4 [label="AWS\nResponse.parse\n0 (0.0%)\rof 442 (21.6%)\r",shape=box,fontsize=8.0];
|
8
|
-
N5 [label="AWS\nBase#response_generator\n0 (0.0%)\rof 431 (21.1%)\r",shape=box,fontsize=8.0];
|
9
|
-
N6 [label="AWS\nEC2\nBase#describe_images\n0 (0.0%)\rof 422 (20.7%)\r",shape=box,fontsize=8.0];
|
10
|
-
N7 [label="Class#new\n142 (7.0%)\rof 371 (18.2%)\r",shape=box,fontsize=21.2];
|
11
|
-
N8 [label="REXML\nDocument#build\n14 (0.7%)\rof 370 (18.1%)\r",shape=box,fontsize=12.1];
|
12
|
-
N9 [label="REXML\nDocument#initialize\n0 (0.0%)\rof 370 (18.1%)\r",shape=box,fontsize=8.0];
|
13
|
-
N10 [label="XmlSimple#parse\n0 (0.0%)\rof 370 (18.1%)\r",shape=box,fontsize=8.0];
|
14
|
-
N11 [label="REXML\nParsers\nTreeParser#parse\n65 (3.2%)\rof 355 (17.4%)\r",shape=box,fontsize=16.9];
|
15
|
-
N12 [label="REXML\nElement#each_element\n5 (0.2%)\rof 338 (16.5%)\r",shape=box,fontsize=10.5];
|
16
|
-
N13 [label="REXML\nElements#each\n11 (0.5%)\rof 338 (16.5%)\r",shape=box,fontsize=11.7];
|
17
|
-
N14 [label="REXML\nXPath.each\n4 (0.2%)\rof 338 (16.5%)\r",shape=box,fontsize=10.2];
|
18
|
-
N15 [label="XmlSimple#collapse\n45 (2.2%)\rof 338 (16.5%)\r",shape=box,fontsize=15.4];
|
19
|
-
N16 [label="REXML\nParsers\nBaseParser#pull\n14 (0.7%)\rof 107 (5.2%)\r",shape=box,fontsize=12.1];
|
20
|
-
N17 [label="XmlSimple#collapse_text_node\n20 (1.0%)\rof 97 (4.7%)\r",shape=box,fontsize=13.0];
|
21
|
-
N18 [label="REXML\nElement#add_element\n2 (0.1%)\rof 94 (4.6%)\r",shape=box,fontsize=9.6];
|
22
|
-
N19 [label="REXML\nElements#add\n2 (0.1%)\rof 92 (4.5%)\r",shape=box,fontsize=9.6];
|
23
|
-
N20 [label="REXML\nElement#initialize\n18 (0.9%)\rof 81 (4.0%)\r",shape=box,fontsize=12.7];
|
24
|
-
N21 [label="XmlSimple#node_to_text\n6 (0.3%)\rof 76 (3.7%)\r",shape=box,fontsize=10.7];
|
25
|
-
N22 [label="REXML\nText#value\n19 (0.9%)\rof 74 (3.6%)\r",shape=box,fontsize=12.8];
|
26
|
-
N23 [label="REXML\nElement#has_elements?\n0 (0.0%)\rof 55 (2.7%)\r",shape=box,fontsize=8.0];
|
27
|
-
N24 [label="REXML\nElement#has_text?\n3 (0.1%)\rof 55 (2.7%)\r",shape=box,fontsize=9.9];
|
28
|
-
N25 [label="REXML\nElements#empty?\n2 (0.1%)\rof 55 (2.7%)\r",shape=box,fontsize=9.6];
|
29
|
-
N26 [label="REXML\nChild#find\n50 (2.4%)\rof 54 (2.6%)\r",shape=box,fontsize=15.8];
|
30
|
-
N27 [label="REXML\nElement#text\n5 (0.2%)\rof 52 (2.5%)\r",shape=box,fontsize=10.5];
|
31
|
-
N28 [label="REXML\nElement#texts\n5 (0.2%)\rof 45 (2.2%)\r",shape=box,fontsize=10.5];
|
32
|
-
N29 [label="REXML\nSource#match\n44 (2.2%)\r",shape=box,fontsize=15.4];
|
33
|
-
N30 [label="REXML\nChild#find_all\n37 (1.8%)\rof 40 (2.0%)\r",shape=box,fontsize=14.7];
|
34
|
-
N31 [label="Array#map\n2 (0.1%)\rof 36 (1.8%)\r",shape=box,fontsize=9.6];
|
35
|
-
N32 [label="Array#each\n7 (0.3%)\rof 33 (1.6%)\r",shape=box,fontsize=10.9];
|
36
|
-
N33 [label="REXML\nElement#document\n11 (0.5%)\rof 29 (1.4%)\r",shape=box,fontsize=11.7];
|
37
|
-
N34 [label="XmlSimple#has_mixed_content?\n3 (0.1%)\rof 29 (1.4%)\r",shape=box,fontsize=9.9];
|
38
|
-
N35 [label="REXML\nXPathParser#parse\n0 (0.0%)\rof 23 (1.1%)\r",shape=box,fontsize=8.0];
|
39
|
-
N36 [label="REXML\nParent#initialize\n17 (0.8%)\rof 22 (1.1%)\r",shape=box,fontsize=12.6];
|
40
|
-
N37 [label="Set#initialize\n2 (0.1%)\rof 22 (1.1%)\r",shape=box,fontsize=9.6];
|
41
|
-
N38 [label="XmlSimple#merge\n13 (0.6%)\rof 21 (1.0%)\r",shape=box,fontsize=12.0];
|
42
|
-
N39 [label="AWS\nBase#make_request\n0 (0.0%)\rof 20 (1.0%)\r",shape=box,fontsize=8.0];
|
43
|
-
N40 [label="Net\nHTTP#request\n0 (0.0%)\rof 20 (1.0%)\r",shape=box,fontsize=8.0];
|
44
|
-
N41 [label="Net\nHTTP#start\n0 (0.0%)\rof 20 (1.0%)\r",shape=box,fontsize=8.0];
|
45
|
-
N42 [label="Net\nHTTPResponse#body\n0 (0.0%)\rof 20 (1.0%)\r",shape=box,fontsize=8.0];
|
46
|
-
N43 [label="Net\nHTTPResponse#read_body\n0 (0.0%)\rof 20 (1.0%)\r",shape=box,fontsize=8.0];
|
47
|
-
N44 [label="Net\nHTTPResponse#read_body_0\n0 (0.0%)\rof 20 (1.0%)\r",shape=box,fontsize=8.0];
|
48
|
-
N45 [label="Net\nHTTPResponse#read_chunked\n0 (0.0%)\rof 20 (1.0%)\r",shape=box,fontsize=8.0];
|
49
|
-
N46 [label="Net\nHTTPResponse#reading_body\n0 (0.0%)\rof 20 (1.0%)\r",shape=box,fontsize=8.0];
|
50
|
-
N47 [label="Net\nBufferedIO#read\n5 (0.2%)\rof 19 (0.9%)\r",shape=box,fontsize=10.5];
|
51
|
-
N48 [label="REXML\nText#initialize\n17 (0.8%)\rof 19 (0.9%)\r",shape=box,fontsize=12.6];
|
52
|
-
N49 [label="REXML\nElement#root\n18 (0.9%)\r",shape=box,fontsize=12.7];
|
53
|
-
N50 [label="REXML\nText.unnormalize\n16 (0.8%)\rof 18 (0.9%)\r",shape=box,fontsize=12.4];
|
54
|
-
N51 [label="REXML\nParent#each\n2 (0.1%)\rof 16 (0.8%)\r",shape=box,fontsize=9.6];
|
55
|
-
N52 [label="REXML\nParsers\nXPathParser#parse\n4 (0.2%)\rof 15 (0.7%)\r",shape=box,fontsize=10.2];
|
56
|
-
N53 [label="Net\nBufferedIO#rbuf_fill\n13 (0.6%)\rof 14 (0.7%)\r",shape=box,fontsize=12.0];
|
57
|
-
N54 [label="Object#timeout\n0 (0.0%)\rof 14 (0.7%)\r",shape=box,fontsize=8.0];
|
58
|
-
N55 [label="Timeout.timeout\n1 (0.0%)\rof 14 (0.7%)\r",shape=box,fontsize=9.1];
|
59
|
-
N56 [label="REXML\nParsers\nXPathParser#OrExpr\n2 (0.1%)\rof 11 (0.5%)\r",shape=box,fontsize=9.6];
|
60
|
-
N22 -> N50 [label=18, weight=7, style="setlinewidth(0.053071)"];
|
61
|
-
N13 -> N14 [label=911, weight=117, style="setlinewidth(2.000000)"];
|
62
|
-
N20 -> N7 [label=32, weight=11, style="setlinewidth(0.094349)"];
|
63
|
-
N21 -> N31 [label=36, weight=12, style="setlinewidth(0.106143)"];
|
64
|
-
N14 -> N13 [label=904, weight=117, style="setlinewidth(2.000000)"];
|
65
|
-
N7 -> N48 [label=19, weight=7, style="setlinewidth(0.056020)"];
|
66
|
-
N22 -> N33 [label=29, weight=10, style="setlinewidth(0.085504)"];
|
67
|
-
N44 -> N45 [label=20, weight=8, style="setlinewidth(0.058968)"];
|
68
|
-
N51 -> N32 [label=14, weight=6, style="setlinewidth(0.041278)"];
|
69
|
-
N16 -> N7 [label=43, weight=13, style="setlinewidth(0.126781)"];
|
70
|
-
N20 -> N36 [label=22, weight=8, style="setlinewidth(0.064865)"];
|
71
|
-
N7 -> N20 [label=81, weight=21, style="setlinewidth(0.238821)"];
|
72
|
-
N34 -> N28 [label=7, weight=3, style="setlinewidth(0.020639)"];
|
73
|
-
N15 -> N34 [label=29, weight=10, style="setlinewidth(0.085504)"];
|
74
|
-
N16 -> N29 [label=44, weight=14, style="setlinewidth(0.129730)"];
|
75
|
-
N27 -> N22 [label=44, weight=14, style="setlinewidth(0.129730)"];
|
76
|
-
N32 -> N26 [label=7, weight=3, style="setlinewidth(0.020639)"];
|
77
|
-
N25 -> N26 [label=54, weight=16, style="setlinewidth(0.159214)"];
|
78
|
-
N15 -> N17 [label=97, weight=24, style="setlinewidth(0.285995)"];
|
79
|
-
N26 -> N51 [label=10, weight=5, style="setlinewidth(0.029484)"];
|
80
|
-
N4 -> N3 [label=442, weight=71, style="setlinewidth(1.303194)"];
|
81
|
-
N54 -> N55 [label=14, weight=6, style="setlinewidth(0.041278)"];
|
82
|
-
N15 -> N23 [label=46, weight=14, style="setlinewidth(0.135627)"];
|
83
|
-
N45 -> N47 [label=19, weight=7, style="setlinewidth(0.056020)"];
|
84
|
-
N9 -> N8 [label=370, weight=62, style="setlinewidth(1.090909)"];
|
85
|
-
N7 -> N9 [label=370, weight=62, style="setlinewidth(1.090909)"];
|
86
|
-
N37 -> N7 [label=20, weight=8, style="setlinewidth(0.058968)"];
|
87
|
-
N55 -> N53 [label=13, weight=6, style="setlinewidth(0.038329)"];
|
88
|
-
N24 -> N27 [label=52, weight=15, style="setlinewidth(0.153317)"];
|
89
|
-
N11 -> N7 [label=77, weight=20, style="setlinewidth(0.227027)"];
|
90
|
-
N40 -> N46 [label=20, weight=8, style="setlinewidth(0.058968)"];
|
91
|
-
N21 -> N28 [label=38, weight=12, style="setlinewidth(0.112039)"];
|
92
|
-
N43 -> N44 [label=20, weight=8, style="setlinewidth(0.058968)"];
|
93
|
-
N5 -> N39 [label=20, weight=8, style="setlinewidth(0.058968)"];
|
94
|
-
N13 -> N15 [label=922, weight=118, style="setlinewidth(2.000000)"];
|
95
|
-
N10 -> N7 [label=370, weight=62, style="setlinewidth(1.090909)"];
|
96
|
-
N5 -> N4 [label=411, weight=67, style="setlinewidth(1.211794)"];
|
97
|
-
N15 -> N15 [label=892, weight=116, style="setlinewidth(2.000000)"];
|
98
|
-
N15 -> N12 [label=801, weight=107, style="setlinewidth(2.000000)"];
|
99
|
-
N17 -> N21 [label=76, weight=20, style="setlinewidth(0.224079)"];
|
100
|
-
N14 -> N35 [label=23, weight=8, style="setlinewidth(0.067813)"];
|
101
|
-
N30 -> N51 [label=6, weight=3, style="setlinewidth(0.017690)"];
|
102
|
-
N52 -> N56 [label=11, weight=5, style="setlinewidth(0.032432)"];
|
103
|
-
N39 -> N40 [label=20, weight=8, style="setlinewidth(0.058968)"];
|
104
|
-
N8 -> N11 [label=355, weight=60, style="setlinewidth(1.046683)"];
|
105
|
-
N2 -> N15 [label=137, weight=31, style="setlinewidth(0.403931)"];
|
106
|
-
N34 -> N23 [label=9, weight=4, style="setlinewidth(0.026536)"];
|
107
|
-
N39 -> N41 [label=20, weight=8, style="setlinewidth(0.058968)"];
|
108
|
-
N12 -> N13 [label=857, weight=113, style="setlinewidth(2.000000)"];
|
109
|
-
N11 -> N16 [label=107, weight=26, style="setlinewidth(0.315479)"];
|
110
|
-
N2 -> N10 [label=370, weight=62, style="setlinewidth(1.090909)"];
|
111
|
-
N19 -> N7 [label=91, weight=23, style="setlinewidth(0.268305)"];
|
112
|
-
N34 -> N24 [label=9, weight=4, style="setlinewidth(0.026536)"];
|
113
|
-
N15 -> N38 [label=21, weight=8, style="setlinewidth(0.061916)"];
|
114
|
-
N21 -> N22 [label=30, weight=10, style="setlinewidth(0.088452)"];
|
115
|
-
N53 -> N54 [label=14, weight=6, style="setlinewidth(0.041278)"];
|
116
|
-
N46 -> N42 [label=20, weight=8, style="setlinewidth(0.058968)"];
|
117
|
-
N31 -> N21 [label=34, weight=11, style="setlinewidth(0.100246)"];
|
118
|
-
N41 -> N39 [label=20, weight=8, style="setlinewidth(0.058968)"];
|
119
|
-
N23 -> N25 [label=55, weight=16, style="setlinewidth(0.162162)"];
|
120
|
-
N7 -> N37 [label=22, weight=8, style="setlinewidth(0.064865)"];
|
121
|
-
N3 -> N2 [label=469, weight=74, style="setlinewidth(1.382801)"];
|
122
|
-
N35 -> N52 [label=15, weight=6, style="setlinewidth(0.044226)"];
|
123
|
-
N47 -> N53 [label=14, weight=6, style="setlinewidth(0.041278)"];
|
124
|
-
N6 -> N5 [label=422, weight=68, style="setlinewidth(1.244226)"];
|
125
|
-
N32 -> N30 [label=3, weight=2, style="setlinewidth(0.008845)"];
|
126
|
-
N42 -> N43 [label=20, weight=8, style="setlinewidth(0.058968)"];
|
127
|
-
N33 -> N49 [label=18, weight=7, style="setlinewidth(0.053071)"];
|
128
|
-
N11 -> N18 [label=94, weight=24, style="setlinewidth(0.277150)"];
|
129
|
-
N28 -> N30 [label=40, weight=13, style="setlinewidth(0.117936)"];
|
130
|
-
N18 -> N19 [label=92, weight=23, style="setlinewidth(0.271253)"];
|
131
|
-
N15 -> N24 [label=46, weight=14, style="setlinewidth(0.135627)"];
|
132
|
-
}
|