swirl 1.7.4 → 1.7.5

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.
Files changed (5) hide show
  1. data/README.md +15 -7
  2. data/bin/swirl +13 -42
  3. data/lib/swirl/aws.rb +15 -5
  4. data/test/aws_test.rb +15 -0
  5. metadata +5 -3
data/README.md CHANGED
@@ -1,14 +1,13 @@
1
1
  Swirl
2
2
  =====
3
3
 
4
- Swirl is an EC2 version agnostic client for EC2 writtin in Ruby. It gets
4
+ Swirl is an EC2 version agnostic client for EC2 written in Ruby. It gets
5
5
  out of your way.
6
6
 
7
7
  The secret is it's simple input extraction and output compacting. Your
8
8
  input parameters and `expand`ed and EC2's (terrible) xml output is
9
9
  `compact`ed.
10
10
 
11
-
12
11
  Some simple examples:
13
12
 
14
13
  # Input
@@ -37,7 +36,7 @@ and
37
36
  }
38
37
  }
39
38
 
40
- and it's varations are now `compact`ed to:
39
+ and it's variations are now `compact`ed to:
41
40
 
42
41
  {
43
42
  "reservationSet" => {
@@ -46,18 +45,17 @@ and it's varations are now `compact`ed to:
46
45
  }
47
46
 
48
47
 
49
- Some things worth noteing is that compact ignores Symbols. This
48
+ Some things worth noting is that compact ignores Symbols. This
50
49
  allows you to pass the params into `call` and use them later
51
- without affecting the API call (i.e. chain of responsiblity); a
50
+ without affecting the API call (i.e. chain of responsibility); a
52
51
  nifty trick we use in (Rack)[http://github.com/rack/rack]
53
52
 
54
53
  Use
55
54
  ---
56
55
 
57
- require 'rubygems' # if you're using rubygems
58
56
  require 'swirl/aws'
59
57
 
60
- ec2 = Swirl::EC2.new
58
+ ec2 = Swirl::AWS.new(:ec2)
61
59
 
62
60
  # Describe all instances
63
61
  ec2.call "DescribeInstances"
@@ -65,9 +63,19 @@ Use
65
63
  # Describe specific instances
66
64
  ec2.call "DescribeInstances", "InstanceId" => ["i-38hdk2f", "i-93nndch"]
67
65
 
66
+ # Talk to a different region
67
+ ec2_asia = Swirl::AWS.new(:ec2, :region => 'ap-southeast-1')
68
68
 
69
69
  Shell
70
70
  ---
71
+ $ swirl -h
72
+ Usage: swirl [options]
73
+ -a ACCOUT Account name (default is default)
74
+ -c FILE Swirl file (default is ~/.swirl)
75
+ -s service The AWS service to use (default is ec2)
76
+ -r region The AWS region to use (default is up to AWS)
77
+ -h, --help
78
+
71
79
 
72
80
  $ swirl
73
81
  >> c
data/bin/swirl CHANGED
@@ -1,28 +1,24 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'irb'
3
3
  require 'yaml'
4
- require 'swirl'
4
+ require 'swirl/aws'
5
5
  require 'optparse'
6
6
 
7
- interactive = false
8
7
  account = "default"
9
8
  etc = "#{ENV["HOME"]}/.swirl"
9
+ service = :ec2
10
+ region = nil
10
11
 
11
12
  ARGV.options do |o|
12
13
  o.on("-a ACCOUT", "Account name (default is default)") {|s| account = s }
13
14
  o.on("-c FILE", "Swirl file (default is ~/.swirl)") {|s| etc = s }
14
- o.on("-i", "Interactive console") { interactive = true }
15
+ o.on("-s service", "The AWS service to use (default is ec2)") {|s| service = s }
16
+ o.on("-r region", "The AWS region to use (default is up to AWS)") {|s| region = s }
15
17
  o.on("-h", "--help") { puts o; exit }
16
18
  o.parse!
17
19
  end
18
20
 
19
- config = \
20
- if ENV["AWS_ACCESS_KEY_ID"] && ENV["AWS_SECRET_ACCESS_KEY"]
21
- {
22
- :aws_access_key_id => ENV["AWS_ACCESS_KEY_ID"],
23
- :aws_secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"]
24
- }
25
- else
21
+ config = (
26
22
  account = account.to_sym
27
23
  data = YAML.load_file(etc)
28
24
  if data.key?(account)
@@ -30,38 +26,13 @@ else
30
26
  else
31
27
  abort("I don't see the account you're looking for")
32
28
  end
33
- end
29
+ )
34
30
 
35
- c = Swirl::EC2.new config
31
+ c = Swirl::AWS.new service.to_sym, config.merge(:region => region)
36
32
 
37
- # We can now start the interactive session
38
- # if requested
39
- if interactive
40
- # Create sugar for working in the console.
41
- # >> c.call "DescribeInstances", ...
42
- Kernel.send(:define_method, :c) { c }
33
+ # Create sugar for working in the console.
34
+ # >> c.call "DescribeInstances", ...
35
+ Kernel.send(:define_method, :c) { c }
43
36
 
44
- # Start the interactive session
45
- IRB.start
46
- else
47
- begin
48
- case cmd = ARGV[0] || "list"
49
- when "list"
50
- resvs = c.call("DescribeInstances")["reservationSet"]
51
- insts = resvs.map {|r| r["instancesSet"] }.flatten
52
- insts.each do |ins|
53
- data = [
54
- ins["instanceState"]["name"],
55
- ins["instanceId"],
56
- ins["availabilityZone"],
57
- ins["dnsName"],
58
- ins["privateDnsName"],
59
- ins["launchTime"]
60
- ]
61
- puts data * "\t"
62
- end
63
- end
64
- rescue => e
65
- $stderr.puts "! " + e.to_s
66
- end
67
- end
37
+ # Start the interactive session
38
+ IRB.start
@@ -29,8 +29,10 @@ module Swirl
29
29
  @services[name] = { :url => url, :version => version }
30
30
  end
31
31
 
32
- # Default Services
32
+ # Default Services (Region not included)
33
33
  service :ec2, "https://ec2.amazonaws.com", "2010-11-15"
34
+ service :elb, "https://elasticloadbalancing.amazonaws.com", "2010-07-01"
35
+ service :iam, "https://iam.amazonaws.com", "2010-05-08"
34
36
 
35
37
 
36
38
  def initialize(*args)
@@ -40,11 +42,14 @@ module Swirl
40
42
  service = self.class.services[name] || {}
41
43
  opts = service.merge(opts)
42
44
 
43
- @url = opts[:url] ||
45
+ @url = URI(opts[:url]) ||
44
46
  raise(ArgumentError, "No url given")
45
47
 
46
- # Convert this here for future reference
47
- @url = URI(@url)
48
+ if region = opts[:region]
49
+ parts = URI.split(@url.to_s)
50
+ parts[2] = parts[2].split('.').insert(1, region).join('.')
51
+ @url = URI::HTTPS.new(*parts)
52
+ end
48
53
 
49
54
  @version = opts[:version] ||
50
55
  raise(ArgumentError, "No version given")
@@ -62,6 +67,7 @@ module Swirl
62
67
  @hmac = HMAC::SHA256.new(@aws_secret_access_key)
63
68
  end
64
69
 
70
+
65
71
  def escape(value)
66
72
  CGI.escape(value).gsub(/\+/, "%20")
67
73
  end
@@ -92,7 +98,11 @@ module Swirl
92
98
  when 200
93
99
  response = compact(data)
94
100
  when 400...500
95
- messages = Array(data["Response"]["Errors"]).map {|_, e| e["Message"] }
101
+ messages = if data["Response"]
102
+ Array(data["Response"]["Errors"]).map {|_, e| e["Message"] }
103
+ elsif data["ErrorResponse"]
104
+ Array(data["ErrorResponse"]["Error"]["Code"])
105
+ end
96
106
  raise InvalidRequest, messages.join(",")
97
107
  else
98
108
  msg = "unexpected response #{code} -> #{data.inspect}"
@@ -0,0 +1,15 @@
1
+ require 'contest'
2
+ require 'swirl/aws'
3
+
4
+ class AwsTest < Test::Unit::TestCase
5
+
6
+ test "raises InvalidRequest on ErrorResponse" do
7
+ e = Swirl::AWS.new(:elb, :aws_access_key_id => 'AKIA', :aws_secret_access_key => 'secret')
8
+ def e.call!(*args, &blk)
9
+ doc = {"ErrorResponse"=>{"Error"=>{"Code"=>"CertificateNotFound", "Type"=>"Sender"}}}
10
+ blk.call [400, doc]
11
+ end
12
+ assert_raise(Swirl::InvalidRequest) { e.call "CreateLoadBalancer", {} }
13
+ end
14
+
15
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swirl
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 1
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 7
9
- - 4
10
- version: 1.7.4
9
+ - 5
10
+ version: 1.7.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Blake Mizerany
@@ -82,6 +82,7 @@ files:
82
82
  - lib/swirl/ec2.rb
83
83
  - lib/swirl/helpers.rb
84
84
  - lib/swirl.rb
85
+ - test/aws_test.rb
85
86
  - test/compactor_test.rb
86
87
  - test/expander_test.rb
87
88
  - test/slop_test.rb
@@ -126,6 +127,7 @@ signing_key:
126
127
  specification_version: 2
127
128
  summary: A version agnostic EC2 ruby driver
128
129
  test_files:
130
+ - test/aws_test.rb
129
131
  - test/compactor_test.rb
130
132
  - test/expander_test.rb
131
133
  - test/slop_test.rb