aliyun 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.aliyun.yml.example +2 -0
- data/.gitignore +1 -0
- data/README.md +4 -2
- data/Rakefile +6 -0
- data/aliyun.gemspec +1 -0
- data/examples/describe_regions.rb +2 -2
- data/lib/aliyun.rb +2 -1
- data/lib/aliyun/base.rb +17 -14
- data/lib/aliyun/common.rb +124 -0
- data/lib/aliyun/services.rb +52 -0
- data/lib/aliyun/version.rb +1 -1
- data/spec/aliyun_spec.rb +65 -0
- data/spec/spec_helper.rb +7 -0
- metadata +24 -4
- data/lib/aliyun/ecs.rb +0 -123
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 805a759b4575f23be67e18372e06c5c66d487ace
         | 
| 4 | 
            +
              data.tar.gz: 9c14c17f044ad1f047c8bc2fa202ab3298ab5b58
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 06eae905ebdf489de03547cef5d7636f99ab94c546822328f18c42ce43c3dfb767fde74ec43583a01185bac0abdb2b3851c6df7c704b1fc4e7ba845aa4b68124
         | 
| 7 | 
            +
              data.tar.gz: 2bd6e052e61ccc33911e03a5603c62f687de84d6e9b98230d40c7ff9022d72c4fad3c8567f98c935ae1d7ebdad51d4bc9949c85e1e7cf376db989e5dfc05f7d3
         | 
    
        data/.aliyun.yml.example
    ADDED
    
    
    
        data/.gitignore
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -2,6 +2,8 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            Ruby wrapper of Aliyun API for system adminstrator.
         | 
| 4 4 |  | 
| 5 | 
            +
            [](http://badge.fury.io/rb/aliyun)
         | 
| 6 | 
            +
             | 
| 5 7 | 
             
            ## Installation
         | 
| 6 8 |  | 
| 7 9 | 
             
            Add this line to your application's Gemfile:
         | 
| @@ -26,10 +28,10 @@ Example: | |
| 26 28 | 
             
                options = {
         | 
| 27 29 | 
             
                  :access_key_id => "_YOUR_API_KEY_",
         | 
| 28 30 | 
             
                  :access_key_secret => "_YOUR_API_SECRET_",
         | 
| 29 | 
            -
                  : | 
| 31 | 
            +
                  :service => :ecs
         | 
| 30 32 | 
             
                }
         | 
| 31 33 |  | 
| 32 | 
            -
                service = Aliyun:: | 
| 34 | 
            +
                service = Aliyun::Service.new options
         | 
| 33 35 | 
             
                parameters = {}
         | 
| 34 36 |  | 
| 35 37 | 
             
                puts service.DescribeRegions parameters
         | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/aliyun.gemspec
    CHANGED
    
    
| @@ -5,9 +5,9 @@ $DEBUG=false | |
| 5 5 |  | 
| 6 6 | 
             
            options = {:access_key_id => "xxxxxx",
         | 
| 7 7 | 
             
                       :access_key_secret => "yyyyy",
         | 
| 8 | 
            -
                       : | 
| 8 | 
            +
                       :service => :ecs}
         | 
| 9 9 |  | 
| 10 | 
            -
            service = Aliyun:: | 
| 10 | 
            +
            service = Aliyun::Service.new options
         | 
| 11 11 |  | 
| 12 12 | 
             
            parameters = {}
         | 
| 13 13 |  | 
    
        data/lib/aliyun.rb
    CHANGED
    
    
    
        data/lib/aliyun/base.rb
    CHANGED
    
    | @@ -1,18 +1,21 @@ | |
| 1 1 | 
             
            module Aliyun
         | 
| 2 | 
            -
               | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
                 | 
| 12 | 
            -
                 | 
| 13 | 
            -
             | 
| 14 | 
            -
                 | 
| 15 | 
            -
             | 
| 2 | 
            +
              class APIConfig
         | 
| 3 | 
            +
                def self.info
         | 
| 4 | 
            +
                  raise "Service Name Missing!"
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
                def self.endpoint
         | 
| 7 | 
            +
                  raise "Service Endpoint Missing!"
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
                def self.default_parameters
         | 
| 10 | 
            +
                  raise "Service Default Parameters Missing!"
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
                def self.separator
         | 
| 13 | 
            +
                  "&"
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
                def self.http_method
         | 
| 16 | 
            +
                  "GET"
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 16 19 |  | 
| 17 20 | 
             
              class AliyunAPIException < RuntimeError
         | 
| 18 21 | 
             
              end
         | 
| @@ -0,0 +1,124 @@ | |
| 1 | 
            +
            require 'net/http'
         | 
| 2 | 
            +
            require 'time'
         | 
| 3 | 
            +
            require 'securerandom'
         | 
| 4 | 
            +
            require 'uri'
         | 
| 5 | 
            +
            require 'base64'
         | 
| 6 | 
            +
            require 'hmac-sha1'
         | 
| 7 | 
            +
            require 'json'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module Aliyun
         | 
| 10 | 
            +
              class Service
         | 
| 11 | 
            +
                attr_accessor :access_key_id, :access_key_secret
         | 
| 12 | 
            +
                attr_accessor :options
         | 
| 13 | 
            +
                attr_accessor :endpoint_url
         | 
| 14 | 
            +
                attr_accessor :service
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def initialize(options={})
         | 
| 17 | 
            +
                  options[:service] ||= :ecs
         | 
| 18 | 
            +
                  self.service = SERVICES[options[:service].to_sym]
         | 
| 19 | 
            +
                  self.access_key_id = options[:access_key_id]
         | 
| 20 | 
            +
                  self.access_key_secret = options[:access_key_secret]
         | 
| 21 | 
            +
                  self.endpoint_url = options[:endpoint_url] || self.service.endpoint
         | 
| 22 | 
            +
                  self.options = {:AccessKeyId => self.access_key_id}
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def method_missing(method, *args)
         | 
| 26 | 
            +
                  if $DEBUG
         | 
| 27 | 
            +
                    puts "Not Found Method: #{method}"
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  if args[0].nil?
         | 
| 31 | 
            +
                    raise AliyunAPIException.new "Method missing: #{method}!"
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  call_aliyun_with_parameter(method, args[0])
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                #Dispatch the request with parameter
         | 
| 38 | 
            +
                private
         | 
| 39 | 
            +
                def call_aliyun_with_parameter(method, params)
         | 
| 40 | 
            +
                  params = gen_request_parameters method, params
         | 
| 41 | 
            +
                  uri = URI(endpoint_url)
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  uri.query = URI.encode_www_form(params)
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  http = Net::HTTP.new(uri.host, uri.port)
         | 
| 46 | 
            +
                  http.use_ssl = (uri.scheme == "https")
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
         | 
| 49 | 
            +
                  if $DEBUG
         | 
| 50 | 
            +
                    puts "Request URI: #{uri.request_uri}"
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  request = Net::HTTP::Get.new(uri.request_uri)
         | 
| 54 | 
            +
                  response = http.request(request)
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  case response
         | 
| 57 | 
            +
                  when Net::HTTPSuccess
         | 
| 58 | 
            +
                    return JSON.parse(response.body)
         | 
| 59 | 
            +
                  else
         | 
| 60 | 
            +
                    raise AliyunAPIException.new "Response code: #{response.code}, message: #{response.body}"
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                #generate the parameters
         | 
| 65 | 
            +
                def gen_request_parameters method, params
         | 
| 66 | 
            +
                  #add common parameters
         | 
| 67 | 
            +
                  params.merge! self.service.default_parameters
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  params.merge! self.options
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  params[:Action] = method.to_s
         | 
| 72 | 
            +
                  params[:TimeStamp] = Time.now.utc.iso8601
         | 
| 73 | 
            +
                  params[:SignatureNonce] = SecureRandom.uuid
         | 
| 74 | 
            +
                  params[:Signature] = compute_signature params
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  params
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                #compute the signature of the parameters String
         | 
| 80 | 
            +
                def compute_signature params
         | 
| 81 | 
            +
                  if $DEBUG
         | 
| 82 | 
            +
                    puts "keys before sorted: #{params.keys}"
         | 
| 83 | 
            +
                  end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  sorted_keys = params.keys.sort
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                  if $DEBUG
         | 
| 88 | 
            +
                    puts "keys after sorted: #{sorted_keys}"
         | 
| 89 | 
            +
                  end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                  canonicalized_query_string = ""
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                  canonicalized_query_string = sorted_keys.map {|key|
         | 
| 94 | 
            +
                    "%s=%s" % [safe_encode(key.to_s), safe_encode(params[key])]
         | 
| 95 | 
            +
                  }.join(self.service.separator)
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                  length = canonicalized_query_string.length
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                  string_to_sign = self.service.http_method + self.service.separator + safe_encode('/') + self.service.separator + safe_encode(canonicalized_query_string)
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                  if $DEBUG
         | 
| 102 | 
            +
                    puts "string_to_sign is #{string_to_sign}"
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                  signature = calculate_signature access_key_secret+"&", string_to_sign
         | 
| 106 | 
            +
                end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                #calculate the signature
         | 
| 109 | 
            +
                def calculate_signature key, string_to_sign
         | 
| 110 | 
            +
                  hmac = HMAC::SHA1.new(key)
         | 
| 111 | 
            +
                  hmac.update(string_to_sign)
         | 
| 112 | 
            +
                  signature = Base64.encode64(hmac.digest).gsub("\n", '')
         | 
| 113 | 
            +
                  if $DEBUG
         | 
| 114 | 
            +
                    puts "Signature #{signature}"
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
                  signature
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                #encode the value to aliyun's requirement
         | 
| 120 | 
            +
                def safe_encode value
         | 
| 121 | 
            +
                  value = URI.encode_www_form_component(value).gsub(/\+/,'%20').gsub(/\*/,'%2A').gsub(/%7E/,'~')
         | 
| 122 | 
            +
                end
         | 
| 123 | 
            +
              end
         | 
| 124 | 
            +
            end
         | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            module Aliyun
         | 
| 2 | 
            +
              class ECSConfig < APIConfig
         | 
| 3 | 
            +
                def self.info
         | 
| 4 | 
            +
                  "Aliyu ECS Service"
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
                def self.endpoint
         | 
| 7 | 
            +
                  'https://ecs.aliyuncs.com/'
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
                def self.default_parameters
         | 
| 10 | 
            +
                  {
         | 
| 11 | 
            +
                    :Format=>"JSON",
         | 
| 12 | 
            +
                    :Version=>"2014-05-26",
         | 
| 13 | 
            +
                    :SignatureMethod=>"HMAC-SHA1",
         | 
| 14 | 
            +
                    :SignatureVersion=>"1.0"
         | 
| 15 | 
            +
                  }
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
                def self.separator
         | 
| 18 | 
            +
                  super
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
                def self.http_method
         | 
| 21 | 
            +
                  super
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              class SLBConfig < APIConfig
         | 
| 26 | 
            +
                def self.info
         | 
| 27 | 
            +
                  "Aliyu SLB Service"
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
                def self.endpoint
         | 
| 30 | 
            +
                  'https://slb.aliyuncs.com/'
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
                def self.default_parameters
         | 
| 33 | 
            +
                  {
         | 
| 34 | 
            +
                    :Format=>"JSON",
         | 
| 35 | 
            +
                    :Version=>"2014-05-15",
         | 
| 36 | 
            +
                    :SignatureMethod=>"HMAC-SHA1",
         | 
| 37 | 
            +
                    :SignatureVersion=>"1.0"
         | 
| 38 | 
            +
                  }
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
                def self.separator
         | 
| 41 | 
            +
                  super
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
                def self.http_method
         | 
| 44 | 
            +
                  super
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              SERVICES = {
         | 
| 49 | 
            +
                :ecs => ECSConfig,
         | 
| 50 | 
            +
                :slb => SLBConfig
         | 
| 51 | 
            +
              }
         | 
| 52 | 
            +
            end
         | 
    
        data/lib/aliyun/version.rb
    CHANGED
    
    
    
        data/spec/aliyun_spec.rb
    ADDED
    
    | @@ -0,0 +1,65 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Aliyun do
         | 
| 4 | 
            +
              it 'has a version number' do
         | 
| 5 | 
            +
                expect(Aliyun::VERSION).not_to be nil
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              it 'can load options' do
         | 
| 9 | 
            +
                option = load_options
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                expect(option).to have_key(:access_key_id)
         | 
| 12 | 
            +
                expect(option).to have_key(:access_key_secret)
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              it 'can create aliyun ecs service' do
         | 
| 16 | 
            +
                options = load_options
         | 
| 17 | 
            +
                options[:service] = :ecs
         | 
| 18 | 
            +
                service = Aliyun::Service.new options
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                expect(service).to be_instance_of(Aliyun::Service)
         | 
| 21 | 
            +
                expect(service.service).to be(Aliyun::ECSConfig)
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              it 'can create aliyun slb service' do
         | 
| 25 | 
            +
                options = load_options
         | 
| 26 | 
            +
                options[:service] = :slb
         | 
| 27 | 
            +
                service = Aliyun::Service.new options
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                expect(service).to be_instance_of(Aliyun::Service)
         | 
| 30 | 
            +
                expect(service.service).to be(Aliyun::SLBConfig)
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              it 'can query aliyun ecs regions' do
         | 
| 34 | 
            +
                options = load_options
         | 
| 35 | 
            +
                options[:service] = :ecs
         | 
| 36 | 
            +
                service = Aliyun::Service.new options
         | 
| 37 | 
            +
                parameters = {}
         | 
| 38 | 
            +
                regions = service.DescribeRegions parameters
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                expect(regions).to have_key("Regions")
         | 
| 41 | 
            +
                expect(regions["Regions"]).to have_key("Region")
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              it 'can query aliyun slb regions' do
         | 
| 45 | 
            +
                options = load_options
         | 
| 46 | 
            +
                options[:service] = :slb
         | 
| 47 | 
            +
                service = Aliyun::Service.new options
         | 
| 48 | 
            +
                parameters = {}
         | 
| 49 | 
            +
                regions = service.DescribeRegions parameters
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                expect(regions).to have_key("Regions")
         | 
| 52 | 
            +
                expect(regions["Regions"]).to have_key("Region")
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
              it "can describe aliyun slb regions" do
         | 
| 56 | 
            +
                options = load_options
         | 
| 57 | 
            +
                options[:service] = :slb
         | 
| 58 | 
            +
                service = Aliyun::Service.new options
         | 
| 59 | 
            +
                parameters = {}
         | 
| 60 | 
            +
                slbs = service.DescribeLoadBalancers :RegionId => "cn-beijing"
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                expect(slbs).to have_key("LoadBalancers")
         | 
| 63 | 
            +
                #expect(slbs["LoadBalancers"]).to have_key("LoadBalancer")
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    ADDED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: aliyun
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.3.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Liu Lantao
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2015-07-01 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -38,6 +38,20 @@ dependencies: | |
| 38 38 | 
             
                - - ">="
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 40 | 
             
                    version: '0'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: rspec
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - ">="
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '0'
         | 
| 48 | 
            +
              type: :development
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - ">="
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '0'
         | 
| 41 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 56 | 
             
              name: ruby-hmac
         | 
| 43 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -60,6 +74,7 @@ executables: [] | |
| 60 74 | 
             
            extensions: []
         | 
| 61 75 | 
             
            extra_rdoc_files: []
         | 
| 62 76 | 
             
            files:
         | 
| 77 | 
            +
            - ".aliyun.yml.example"
         | 
| 63 78 | 
             
            - ".gitignore"
         | 
| 64 79 | 
             
            - Gemfile
         | 
| 65 80 | 
             
            - LICENSE.txt
         | 
| @@ -69,8 +84,11 @@ files: | |
| 69 84 | 
             
            - examples/describe_regions.rb
         | 
| 70 85 | 
             
            - lib/aliyun.rb
         | 
| 71 86 | 
             
            - lib/aliyun/base.rb
         | 
| 72 | 
            -
            - lib/aliyun/ | 
| 87 | 
            +
            - lib/aliyun/common.rb
         | 
| 88 | 
            +
            - lib/aliyun/services.rb
         | 
| 73 89 | 
             
            - lib/aliyun/version.rb
         | 
| 90 | 
            +
            - spec/aliyun_spec.rb
         | 
| 91 | 
            +
            - spec/spec_helper.rb
         | 
| 74 92 | 
             
            homepage: https://github.com/Lax/aliyun
         | 
| 75 93 | 
             
            licenses:
         | 
| 76 94 | 
             
            - MIT
         | 
| @@ -95,4 +113,6 @@ rubygems_version: 2.2.2 | |
| 95 113 | 
             
            signing_key: 
         | 
| 96 114 | 
             
            specification_version: 4
         | 
| 97 115 | 
             
            summary: Ruby wrapper of Aliyun API for system administrator
         | 
| 98 | 
            -
            test_files: | 
| 116 | 
            +
            test_files:
         | 
| 117 | 
            +
            - spec/aliyun_spec.rb
         | 
| 118 | 
            +
            - spec/spec_helper.rb
         | 
    
        data/lib/aliyun/ecs.rb
    DELETED
    
    | @@ -1,123 +0,0 @@ | |
| 1 | 
            -
            require 'net/http'
         | 
| 2 | 
            -
            require 'time'
         | 
| 3 | 
            -
            require 'securerandom'
         | 
| 4 | 
            -
            require 'uri'
         | 
| 5 | 
            -
            require 'base64'
         | 
| 6 | 
            -
            require 'hmac-sha1'
         | 
| 7 | 
            -
            require 'json'
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            module Aliyun
         | 
| 10 | 
            -
              module ECS
         | 
| 11 | 
            -
                class Service
         | 
| 12 | 
            -
                  attr_accessor :access_key_id, :access_key_secret
         | 
| 13 | 
            -
                  attr_accessor :options
         | 
| 14 | 
            -
                  attr_accessor :endpoint_url
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                  def initialize(options={})
         | 
| 17 | 
            -
                    self.access_key_id = options[:access_key_id] || $ACCESS_KEY_ID || ""
         | 
| 18 | 
            -
                    self.access_key_secret = options[:access_key_secret] || $ACCESS_KEY_SECRET || ""
         | 
| 19 | 
            -
                    self.endpoint_url = options[:endpoint_url] || $ENDPOINT_URL || ALIYUN_API_ENDPOINT
         | 
| 20 | 
            -
                    self.options = {:AccessKeyId => self.access_key_id}
         | 
| 21 | 
            -
                  end
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                  def method_missing(method, *args)
         | 
| 24 | 
            -
                    if $DEBUG
         | 
| 25 | 
            -
                      puts "Not Found Method: #{method}"
         | 
| 26 | 
            -
                    end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                    if args[0].nil?
         | 
| 29 | 
            -
                      raise AliyunAPIException.new "Method missing: #{method}!"
         | 
| 30 | 
            -
                    end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                    call_aliyun_with_parameter(method, args[0])
         | 
| 33 | 
            -
                  end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                  #Dispatch the request with parameter
         | 
| 36 | 
            -
                  private
         | 
| 37 | 
            -
                  def call_aliyun_with_parameter(method, params)
         | 
| 38 | 
            -
                    params = gen_request_parameters method, params
         | 
| 39 | 
            -
                    uri = URI(endpoint_url)
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                    uri.query = URI.encode_www_form(params)
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                    http = Net::HTTP.new(uri.host, uri.port)
         | 
| 44 | 
            -
                    http.use_ssl = (uri.scheme == "https")
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
         | 
| 47 | 
            -
                    if $DEBUG
         | 
| 48 | 
            -
                      puts "Request URI: #{uri.request_uri}"
         | 
| 49 | 
            -
                    end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                    request = Net::HTTP::Get.new(uri.request_uri)
         | 
| 52 | 
            -
                    response = http.request(request)
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                    case response
         | 
| 55 | 
            -
                    when Net::HTTPSuccess
         | 
| 56 | 
            -
                      return JSON.parse(response.body)
         | 
| 57 | 
            -
                    else
         | 
| 58 | 
            -
                      raise AliyunAPIException.new "Response code: #{response.code}, message: #{response.body}"
         | 
| 59 | 
            -
                    end
         | 
| 60 | 
            -
                  end
         | 
| 61 | 
            -
             | 
| 62 | 
            -
                  #generate the parameters
         | 
| 63 | 
            -
                  def gen_request_parameters method, params
         | 
| 64 | 
            -
                    #add common parameters
         | 
| 65 | 
            -
                    params.merge! DEFAULT_PARAMETERS
         | 
| 66 | 
            -
             | 
| 67 | 
            -
                    params.merge! self.options
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                    params[:Action] = method.to_s
         | 
| 70 | 
            -
                    params[:TimeStamp] = Time.now.utc.iso8601
         | 
| 71 | 
            -
                    params[:SignatureNonce] = SecureRandom.uuid
         | 
| 72 | 
            -
                    params[:Signature] = compute_signature params
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                    params
         | 
| 75 | 
            -
                  end
         | 
| 76 | 
            -
             | 
| 77 | 
            -
                  #compute the signature of the parameters String
         | 
| 78 | 
            -
                  def compute_signature params
         | 
| 79 | 
            -
                    if $DEBUG
         | 
| 80 | 
            -
                      puts "keys before sorted: #{params.keys}"
         | 
| 81 | 
            -
                    end
         | 
| 82 | 
            -
             | 
| 83 | 
            -
                    sorted_keys = params.keys.sort
         | 
| 84 | 
            -
             | 
| 85 | 
            -
                    if $DEBUG
         | 
| 86 | 
            -
                      puts "keys after sorted: #{sorted_keys}"
         | 
| 87 | 
            -
                    end
         | 
| 88 | 
            -
             | 
| 89 | 
            -
                    canonicalized_query_string = ""
         | 
| 90 | 
            -
             | 
| 91 | 
            -
                    canonicalized_query_string = sorted_keys.map {|key|
         | 
| 92 | 
            -
                      "%s=%s" % [safe_encode(key.to_s), safe_encode(params[key])]
         | 
| 93 | 
            -
                    }.join(SEPARATOR)
         | 
| 94 | 
            -
             | 
| 95 | 
            -
                    length = canonicalized_query_string.length
         | 
| 96 | 
            -
             | 
| 97 | 
            -
                    string_to_sign = HTTP_METHOD + SEPARATOR + safe_encode('/') + SEPARATOR + safe_encode(canonicalized_query_string)
         | 
| 98 | 
            -
             | 
| 99 | 
            -
                    if $DEBUG
         | 
| 100 | 
            -
                      puts "string_to_sign is #{string_to_sign}"
         | 
| 101 | 
            -
                    end
         | 
| 102 | 
            -
             | 
| 103 | 
            -
                    signature = calculate_signature access_key_secret+"&", string_to_sign
         | 
| 104 | 
            -
                  end
         | 
| 105 | 
            -
             | 
| 106 | 
            -
                  #calculate the signature
         | 
| 107 | 
            -
                  def calculate_signature key, string_to_sign
         | 
| 108 | 
            -
                    hmac = HMAC::SHA1.new(key)
         | 
| 109 | 
            -
                    hmac.update(string_to_sign)
         | 
| 110 | 
            -
                    signature = Base64.encode64(hmac.digest).gsub("\n", '')
         | 
| 111 | 
            -
                    if $DEBUG
         | 
| 112 | 
            -
                      puts "Signature #{signature}"
         | 
| 113 | 
            -
                    end
         | 
| 114 | 
            -
                    signature
         | 
| 115 | 
            -
                  end
         | 
| 116 | 
            -
             | 
| 117 | 
            -
                  #encode the value to aliyun's requirement
         | 
| 118 | 
            -
                  def safe_encode value
         | 
| 119 | 
            -
                    value = URI.encode_www_form_component(value).gsub(/\+/,'%20').gsub(/\*/,'%2A').gsub(/%7E/,'~')
         | 
| 120 | 
            -
                  end
         | 
| 121 | 
            -
                end
         | 
| 122 | 
            -
              end
         | 
| 123 | 
            -
            end
         |