poolparty 1.6.6 → 1.6.7
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.
- 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
|
-
}
|