right-scale-api 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,7 +1,9 @@
1
1
  RightScale API Gem
2
2
  =======================
3
3
 
4
- A client library for the RightScale API.
4
+ A client library for the RightScale API. Still under development, but it has enough written to be useful.
5
+
6
+ There aren't any tests yet and it doesn't fully cover all the object types RightScale's API supports.
5
7
 
6
8
  RightScale's [API Docs]("http://support.rightscale.com/15-References/RightScale_API_Reference_Guide")
7
9
 
@@ -36,4 +38,19 @@ Usage Examples
36
38
  #we do this as an update, because rightscale's api doesn't let you set this on create (as of May 2010)
37
39
  server.update :associate_eip_at_launch => true,
38
40
  :ec2_elastic_ip => ip
39
- server.start
41
+ server.start
42
+
43
+ #### Create a Deployment
44
+
45
+ account.create_deployment :nickname => 'foo',
46
+ :description => 'foo bar baz'
47
+ #### Show all Servers
48
+ account.servers
49
+ #### Show an individual server
50
+ account.servers.find {|server| server.id ==}
51
+
52
+ ## Contributions Welcome
53
+
54
+ Fork away.
55
+
56
+ Needs tests, filling out the object types, etc.
data/Rakefile CHANGED
@@ -12,7 +12,7 @@ begin
12
12
  gem.email = "ndh@baroquebobcat.com"
13
13
  gem.homepage = "http://github.com/baroquebobcat/right-scale-api"
14
14
  gem.authors = ["Nick Howard"]
15
- gem.add_dependency "httparty"
15
+ gem.add_dependency "httparty", "~> 0.6.0"
16
16
  gem.add_dependency "activesupport"
17
17
  gem.add_development_dependency "rspec", ">= 1.2.9"
18
18
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
@@ -1,10 +1,15 @@
1
1
  require 'yaml'
2
2
  require 'httparty'
3
3
  require 'active_support/core_ext'
4
+ require 'active_support/multibyte'
4
5
 
5
6
  module RightScaleAPI
6
7
  API_VERSION = '1.0'
7
8
  BASE_URI = "https://my.rightscale.com/"
9
+
10
+ def self.login *args
11
+ Client.login *args
12
+ end
8
13
  end
9
14
 
10
15
  require File.dirname(__FILE__) + '/right-scale-api/client'
@@ -22,19 +22,49 @@ module RightScaleAPI
22
22
  :ec2_elastic_ips,
23
23
  :ec2_security_groups,
24
24
  :server_templates,
25
- :servers
25
+ :servers,
26
+ :s3_buckets
26
27
 
28
+ # Creates a Deployment
29
+ # @param [Hash] opts deployment attributes
30
+ # @option opts [String] :nickname The nickname of the deployment
31
+ # @option opts [String] :description The description of the deployment
32
+ # @option opts [String :default_ec2_availability_zone the default availability zone for the deployment e.g. us-east-1a
33
+ # @option opts [String] :default_vpc_subnet_href
34
+ def create_deployment opts
35
+ Deployment.create opts.merge :account => self
36
+ end
37
+
38
+ # Creates an EC2 EBS Elastic IP
39
+ # @param [Hash] opts ip attributes
40
+ # @option opts [String] :nickname The nickname of the ip
41
+ # @option opts [Fixnum] :cloud_id the cloud identifier default 1 (1 = us-east; 2 = eu; 3 = us-west, 4 = ap)
27
42
  def create_ec2_elastic_ip opts
28
43
  Ec2ElasticIp.create opts.merge :account => self
29
44
  end
30
45
 
46
+ # Creates an EC2 EBS Volume
47
+ # @param [Hash] opts volume attributes
48
+ # @option opts [String] :nickname The nickname of the volume
49
+ # @option opts [String] :description
50
+ # @option opts [Fixnum] :aws_size The size of the volume in gigabytes*
51
+ # @option opts [String] :ec2_availability_zone name of the availability zone e.g. us-east-1a*
31
52
  def create_ec2_ebs_volume opts
32
53
  Ec2EbsVolume.create opts.merge :account => self
33
54
  end
34
55
 
56
+ # Creates an EC2 Instance
57
+ # @param [Hash] opts server attributes
58
+ # @option [RightScaleAPI::ServerTemplate] opts :server_template the server template to use*
59
+ # @option [[RightScaleAPI::Deployment] opts :deployment
35
60
  def create_server opts
36
61
  Server.create opts.merge :account => self
37
62
  end
63
+
64
+ # Gets an EC2 ssh key.
65
+ # Currently you can't get a list of ssh keys through the API, so you need to get the id through the web interface.
66
+ # https://my.rightscale.com/clouds/1/ec2_ssh_keys
67
+ # @param id the id of the ssh key to get
38
68
  def get_ec2_ssh_key id
39
69
  Ec2SshKey.new get("/ec2_ssh_keys/#{id}").merge :id => id, :account => self
40
70
  end
@@ -3,7 +3,8 @@ module RightScaleAPI
3
3
 
4
4
  attr_accessor :id, :href
5
5
 
6
- #attributes that directly correspond to the api's
6
+ # attributes that directly correspond to the api's
7
+ # @param [Array<Symbol>] attrs a list of attributes an object type has
7
8
  def self.attributes attrs=nil
8
9
  if attrs
9
10
  @attributes ||= Base.attributes
@@ -24,10 +25,14 @@ module RightScaleAPI
24
25
 
25
26
  attributes [:tags, :created_at, :updated_at,:errors, :nickname]
26
27
 
28
+ # gets an object by id
29
+ # @param id [Fixnum]
27
30
  def self.get id
28
31
  new :id => id
29
32
  end
30
33
 
34
+ # creates a new object on RightScale
35
+ # @param opts [Hash] attributes of the created object
31
36
  def self.create opts
32
37
  object = new opts
33
38
 
@@ -43,10 +48,11 @@ module RightScaleAPI
43
48
  puts result.inspect
44
49
  raise "create failed"
45
50
  end
46
-
47
- new opts.merge(result.merge(:href => result.headers['location'].first))
51
+
52
+ new opts.merge(result.merge(:href => result.headers['location']))
48
53
  end
49
54
 
55
+ # The RightScale API name for the class
50
56
  def self.api_name
51
57
  name.demodulize.underscore
52
58
  end
@@ -61,10 +67,13 @@ module RightScaleAPI
61
67
  end
62
68
  end
63
69
 
70
+ # Updates the object with the passed attributes
71
+ # @param [Hash] attrs the updated attributes
64
72
  def update attrs
65
73
  put '', :body => {self.class.api_name => self.class.opts_to_query_opts(attrs)}
66
74
  end
67
75
 
76
+ # tells the API to delete the object
68
77
  def destroy
69
78
  delete ''
70
79
  end
@@ -94,10 +103,12 @@ module RightScaleAPI
94
103
  send_request :delete, *args
95
104
  end
96
105
 
106
+ # the objects uri on rightscale
97
107
  def uri
98
108
  RightScaleAPI::Client.base_uri + path
99
109
  end
100
110
 
111
+ # Reload the attributes of the object
101
112
  def reload!
102
113
  get('')[self.class.api_name].each do |attr, value|
103
114
  self.send :"#{attr}=",value
@@ -1,7 +1,9 @@
1
1
  module RightScaleAPI
2
- class Ec2EbsVolume < Account::SubResource
2
+ # EC2 EBS Volume
3
+ # See http://support.rightscale.com/15-References/RightScale_API_Reference_Guide/02-Management/05-EC2_EBS_Volumes
4
+ class Ec2EbsVolume < Account::SubResource
3
5
 
4
- attributes %w(
6
+ attributes %w(
5
7
  description
6
8
  ec2_availability_zone
7
9
  aws_attached_at
@@ -11,21 +13,25 @@ class Ec2EbsVolume < Account::SubResource
11
13
  aws_size
12
14
  aws_status
13
15
  created_at
14
- )
16
+ )
15
17
 
16
- def attach_to_server server, device, mount
17
- account.post '/component_ec2_ebs_volumes', :body => {
18
- :component_ec2_ebs_volume => {
19
- :ec2_ebs_volume_href => uri,
20
- :component_href => server.href,
21
- :device => device,
22
- :mount => mount
23
- }
24
- }
25
- end
18
+ # Attaches the volume to a server
19
+ # @param [RightScaleAPI::Server] server the server to attach the volume to
20
+ # @param [String] device the device to mount the volume as e.g. /dev/sdk
21
+ # @param [String] mount when to mount the device. Usually 'boot'
22
+ def attach_to_server server, device, mount
23
+ account.post '/component_ec2_ebs_volumes', :body => {
24
+ :component_ec2_ebs_volume => {
25
+ :ec2_ebs_volume_href => uri,
26
+ :component_href => server.href,
27
+ :device => device,
28
+ :mount => mount
29
+ }
30
+ }
31
+ end
26
32
 
27
- def collection_uri
28
- account.path + "/ec2_ebs_volumes"
29
- end
30
- end
33
+ def collection_uri
34
+ account.path + "/ec2_ebs_volumes"
35
+ end
36
+ end
31
37
  end
@@ -1,4 +1,6 @@
1
1
  module RightScaleAPI
2
+ # EC2 SSH key
3
+ # http://support.rightscale.com/15-References/RightScale_API_Reference_Guide/02-Management/08-EC2_SSH_Keys
2
4
  class Ec2SshKey < Account::SubResource
3
5
  attributes %w(
4
6
  aws_key_name
@@ -0,0 +1,5 @@
1
+ module RightScaleAPI
2
+ class S3Bucket < Account::SubResource
3
+ attributes %w(location)
4
+ end
5
+ end
@@ -22,27 +22,39 @@ module RightScaleAPI
22
22
  type
23
23
  vpc_subnet_href
24
24
  )
25
-
25
+
26
+ # Starts the server
26
27
  def start
27
28
  post '/start'
28
29
  end
29
30
 
31
+ # Stops the server
30
32
  def stop
31
33
  post '/stop'
32
34
  end
33
35
 
36
+ # Reboots the server
34
37
  def reboot
35
38
  post '/reboot'
36
39
  end
37
40
 
41
+ # Server Settings
42
+ # for info: under Sub-resources on
43
+ # http://support.rightscale.com/15-References/RightScale_API_Reference_Guide/02-Management/02-Servers
38
44
  def settings
39
45
  get('/settings')['settings']
40
46
  end
41
47
 
42
- def running?
48
+ # Is the server operational
49
+ def operational?
43
50
  state == 'operational'
44
51
  end
52
+
53
+ alias :running? :operational?
45
54
 
55
+ # Attach a volume to the server
56
+ # @param [RightScaleAPI::Ec2EbsVolume] volume the volume to attach
57
+ # @param [String] device the device to attach it as e.g. /dev/sdk
46
58
  def attach_volume volume, device
47
59
  if running?
48
60
  post '/attach_volume', :query => {
@@ -56,8 +68,9 @@ module RightScaleAPI
56
68
  end
57
69
  end
58
70
 
59
- # Account#create_ec2_ebs_volume's opts +
60
- # :device -- device mount point, eg /dev/sdk
71
+ # creates a blank volume and attaches it to the server
72
+ # @param [Hash] opts Account#create_ec2_ebs_volume's opts +
73
+ # @option [String] :device device mount point, e.g. /dev/sdk
61
74
  def attach_blank_volume opts
62
75
  device = opts.delete :device
63
76
  opts = {:ec2_availability_zone => 'us-east-1a'}.merge opts #default to the server's avail zone
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{right-scale-api}
8
- s.version = "0.0.3"
8
+ s.version = "0.0.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nick Howard"]
12
- s.date = %q{2010-05-21}
12
+ s.date = %q{2010-09-14}
13
13
  s.description = %q{A client for the RightScale API that hides some of the complexity of the API
14
14
  (It doesn't require passing around hrefs as much). Based on HTTParty
15
15
  }
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
35
35
  "lib/right-scale-api/ec2_elastic_ip.rb",
36
36
  "lib/right-scale-api/ec2_security_group.rb",
37
37
  "lib/right-scale-api/ec2_ssh_key.rb",
38
+ "lib/right-scale-api/s3_bucket.rb",
38
39
  "lib/right-scale-api/server.rb",
39
40
  "lib/right-scale-api/server_template.rb",
40
41
  "lib/right-scale-api/status.rb",
@@ -46,7 +47,7 @@ Gem::Specification.new do |s|
46
47
  s.homepage = %q{http://github.com/baroquebobcat/right-scale-api}
47
48
  s.rdoc_options = ["--charset=UTF-8"]
48
49
  s.require_paths = ["lib"]
49
- s.rubygems_version = %q{1.3.6}
50
+ s.rubygems_version = %q{1.3.7}
50
51
  s.summary = %q{A RightScale API gem that doesn't suck.(mostly)}
51
52
  s.test_files = [
52
53
  "spec/right-scale-api_spec.rb",
@@ -57,17 +58,17 @@ Gem::Specification.new do |s|
57
58
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
58
59
  s.specification_version = 3
59
60
 
60
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
61
- s.add_runtime_dependency(%q<httparty>, [">= 0"])
61
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
62
+ s.add_runtime_dependency(%q<httparty>, ["~> 0.6.0"])
62
63
  s.add_runtime_dependency(%q<activesupport>, [">= 0"])
63
64
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
64
65
  else
65
- s.add_dependency(%q<httparty>, [">= 0"])
66
+ s.add_dependency(%q<httparty>, ["~> 0.6.0"])
66
67
  s.add_dependency(%q<activesupport>, [">= 0"])
67
68
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
68
69
  end
69
70
  else
70
- s.add_dependency(%q<httparty>, [">= 0"])
71
+ s.add_dependency(%q<httparty>, ["~> 0.6.0"])
71
72
  s.add_dependency(%q<activesupport>, [">= 0"])
72
73
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
73
74
  end
@@ -1,7 +1,31 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
- describe "RightScaleApi" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
3
+ describe RightScaleAPI do
4
+ it { should respond_to(:login) }
5
+
6
+ describe RightScaleAPI::Base do
7
+ subject { Class.new RightScaleAPI::Base }
8
+
9
+ it { should respond_to(:collection_uri) }
10
+
11
+ describe 'instance' do
12
+ subject { Class.new(RightScaleAPI::Base).new({}) }
13
+ it { subject.should respond_to(:href) }
14
+ end
15
+ end
16
+
17
+ describe RightScaleAPI::Account do
18
+ #
19
+ describe "#create_ec2_ebs_volume" do
20
+ #when receive a 422
21
+ #do stuff with error
22
+ #missing ec2_avaliability_zone
23
+ # Error:Unknown availability zone '' for the cloud AWS US-East
24
+ #missing aws_size
25
+ # Error:MissingParameter: The request must contain the parameter size/snapshot
26
+ end
27
+ describe "#create_server" do
28
+ #@parsed_response={"errors"=>{"error"=>["Server template can't be blank", "Deployment can't be blank"]}}
29
+ end
6
30
  end
7
31
  end
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,11 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
1
+ #$LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ #$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'rubygems'
3
4
  require 'right-scale-api'
5
+ require 'fakeweb'
4
6
  require 'spec'
5
7
  require 'spec/autorun'
6
8
 
7
9
  Spec::Runner.configure do |config|
8
-
10
+ FakeWeb.allow_net_connect = false
9
11
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: right-scale-api
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 23
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
- - 3
9
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
10
11
  platform: ruby
11
12
  authors:
12
13
  - Nick Howard
@@ -14,28 +15,34 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-05-21 00:00:00 -06:00
18
+ date: 2010-09-14 00:00:00 -06:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: httparty
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
- - - ">="
27
+ - - ~>
26
28
  - !ruby/object:Gem::Version
29
+ hash: 7
27
30
  segments:
28
31
  - 0
29
- version: "0"
32
+ - 6
33
+ - 0
34
+ version: 0.6.0
30
35
  type: :runtime
31
36
  version_requirements: *id001
32
37
  - !ruby/object:Gem::Dependency
33
38
  name: activesupport
34
39
  prerelease: false
35
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
36
42
  requirements:
37
43
  - - ">="
38
44
  - !ruby/object:Gem::Version
45
+ hash: 3
39
46
  segments:
40
47
  - 0
41
48
  version: "0"
@@ -45,9 +52,11 @@ dependencies:
45
52
  name: rspec
46
53
  prerelease: false
47
54
  requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
48
56
  requirements:
49
57
  - - ">="
50
58
  - !ruby/object:Gem::Version
59
+ hash: 13
51
60
  segments:
52
61
  - 1
53
62
  - 2
@@ -84,6 +93,7 @@ files:
84
93
  - lib/right-scale-api/ec2_elastic_ip.rb
85
94
  - lib/right-scale-api/ec2_security_group.rb
86
95
  - lib/right-scale-api/ec2_ssh_key.rb
96
+ - lib/right-scale-api/s3_bucket.rb
87
97
  - lib/right-scale-api/server.rb
88
98
  - lib/right-scale-api/server_template.rb
89
99
  - lib/right-scale-api/status.rb
@@ -101,23 +111,27 @@ rdoc_options:
101
111
  require_paths:
102
112
  - lib
103
113
  required_ruby_version: !ruby/object:Gem::Requirement
114
+ none: false
104
115
  requirements:
105
116
  - - ">="
106
117
  - !ruby/object:Gem::Version
118
+ hash: 3
107
119
  segments:
108
120
  - 0
109
121
  version: "0"
110
122
  required_rubygems_version: !ruby/object:Gem::Requirement
123
+ none: false
111
124
  requirements:
112
125
  - - ">="
113
126
  - !ruby/object:Gem::Version
127
+ hash: 3
114
128
  segments:
115
129
  - 0
116
130
  version: "0"
117
131
  requirements: []
118
132
 
119
133
  rubyforge_project:
120
- rubygems_version: 1.3.6
134
+ rubygems_version: 1.3.7
121
135
  signing_key:
122
136
  specification_version: 3
123
137
  summary: A RightScale API gem that doesn't suck.(mostly)