lib/swirl/ec2.rb in swirl-1.6.2 vs lib/swirl/ec2.rb in swirl-1.7.0
- old
+ new
@@ -1,123 +1,15 @@
-require 'cgi'
-require 'base64'
-require 'net/https'
+require 'swirl/aws'
-require 'crack/xml'
-require 'hmac-sha2'
+$stderr.puts "WARNING: Requiring 'swirl' or 'swirl/ec2' will be deprecated. Require 'swirl/aws' instead."
-require 'swirl/helpers'
-
module Swirl
- ## Errors
- class InvalidRequest < StandardError ; end
-
-
+ # Compat
class EC2
- include Helpers::Compactor
- include Helpers::Expander
-
-
- def initialize(options)
- @aws_access_key_id =
- options[:aws_access_key_id] ||
- (raise ArgumentError, "no aws_access_key_id provided")
- @aws_secret_access_key =
- options[:aws_secret_access_key] ||
- (raise ArgumentError, "no aws_secret_access_key provided")
-
- @hmac = HMAC::SHA256.new(@aws_secret_access_key)
- @version = options[:version] || "2009-11-30"
- @url = URI(options[:url] || "https://ec2.amazonaws.com")
+ def self.new(options)
+ $stderr.puts "WARNING: Swirl::EC2 will be deprecated. Use Swirl::AWS.new(:ec2) instead"
+ return AWS.new(:ec2, options)
end
-
- def escape(value)
- CGI.escape(value).gsub(/\+/, "%20")
- end
-
- def compile_sorted_form_data(query)
- valid = query.reject {|_, v| v.nil? }
- valid.sort.map {|k,v| [k, escape(v)] * "=" } * "&"
- end
-
- def compile_signature(method, body)
- string_to_sign = [method, @url.host, "/", body] * "\n"
- hmac = @hmac.update(string_to_sign)
- encoded_sig = Base64.encode64(hmac.digest).chomp
- escape(encoded_sig)
- end
-
- ##
- # Execute an EC2 command, expand the input,
- # and compact the output
- #
- # Examples:
- # ec2.call("DescribeInstances")
- # ec2.call("TerminateInstances", "InstanceId" => ["i-1234", "i-993j"]
- #
- def call(action, query={}, &blk)
- call!(action, expand(query)) do |code, data|
- case code
- when 200
- response = compact(data)
- when 400...500
- messages = Array(data["Response"]["Errors"]).map {|_, e| e["Message"] }
- raise InvalidRequest, messages.join(",")
- else
- msg = "unexpected response #{code} -> #{data.inspect}"
- raise InvalidRequest, msg
- end
-
- if blk
- blk.call(response)
- else
- response
- end
- end
- end
-
- def call!(action, query={}, &blk)
- # Hard coding this here until otherwise needed
- method = "POST"
-
- query["Action"] = action
- query["AWSAccessKeyId"] = @aws_access_key_id
- query["SignatureMethod"] = "HmacSHA256"
- query["SignatureVersion"] = "2"
- query["Timestamp"] = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
- query["Version"] = @version
-
- body = compile_sorted_form_data(query)
- body += "&" + ["Signature", compile_signature(method, body)].join("=")
-
- post(body) do |code, xml|
- if ENV["SWIRL_LOG"]
- puts response.body
- end
-
- data = Crack::XML.parse(xml)
- blk.call(code, data)
- end
- end
-
- def post(body, &blk)
- headers = { "Content-Type" => "application/x-www-form-urlencoded" }
-
- http = Net::HTTP.new(@url.host, @url.port)
- http.use_ssl = true
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
-
- request = Net::HTTP::Post.new(@url.request_uri, headers)
- request.body = body
-
- response = http.request(request)
- blk.call(response.code.to_i, response.body)
- end
-
- def inspect
- "<#{self.class.name} version: #{@version} url: #{@url} aws_access_key_id: #{@aws_access_key_id}>"
- end
-
end
end