ey_instance_api_client 0.1.2 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -36,8 +36,17 @@ module EY
36
36
  Backup.new(self, data["backup"])
37
37
  end
38
38
 
39
+ def get_services(app_name)
40
+ r = api_call(services_url(app_name), 200)
41
+ r.get(:params => params, :accept => "application/json")
42
+ end
43
+
39
44
  #SORTA-PRIVATE stuff:
40
45
 
46
+ def services_url(app_name)
47
+ URI.join(@base_url, "services/app/", app_name).to_s
48
+ end
49
+
41
50
  def snapshots_url
42
51
  URI.join(@base_url, "volumes/all/snapshots").to_s
43
52
  end
@@ -1,5 +1,5 @@
1
1
  module EY
2
2
  module InstanceAPIClient
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.6"
4
4
  end
5
5
  end
@@ -19,6 +19,12 @@ module EY
19
19
  end
20
20
  end
21
21
 
22
+ class Services < Client
23
+ def get(app_name)
24
+ @backend.get_services(app_name)
25
+ end
26
+ end
27
+
22
28
  class Snapshots < Client
23
29
  def list
24
30
  @backend.list_snapshots
metadata CHANGED
@@ -1,211 +1,75 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ey_instance_api_client
3
- version: !ruby/object:Gem::Version
4
- hash: 31
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.6
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 2
10
- version: 0.1.2
11
6
  platform: ruby
12
- authors:
13
- - Engine Yard
7
+ authors:
8
+ - Jacob Burkhart
9
+ - Tim Carey-Smith
10
+ - Martin Emde
14
11
  autorequire:
15
12
  bindir: bin
16
13
  cert_chain: []
17
-
18
- date: 2011-11-23 00:00:00 -08:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
14
+ date: 2012-01-03 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
22
17
  name: json
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirement: &2153151900 !ruby/object:Gem::Requirement
25
19
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
33
24
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rest-client
37
25
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
26
+ version_requirements: *2153151900
27
+ - !ruby/object:Gem::Dependency
28
+ name: rest-client
29
+ requirement: &2153151000 !ruby/object:Gem::Requirement
39
30
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
47
35
  type: :runtime
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: rake
51
- prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
61
- type: :development
62
- version_requirements: *id003
63
- - !ruby/object:Gem::Dependency
64
- name: rspec
65
- prerelease: false
66
- requirement: &id004 !ruby/object:Gem::Requirement
67
- none: false
68
- requirements:
69
- - - ">="
70
- - !ruby/object:Gem::Version
71
- hash: 3
72
- segments:
73
- - 0
74
- version: "0"
75
- type: :development
76
- version_requirements: *id004
77
- - !ruby/object:Gem::Dependency
78
- name: ruby-debug
79
- prerelease: false
80
- requirement: &id005 !ruby/object:Gem::Requirement
81
- none: false
82
- requirements:
83
- - - ">="
84
- - !ruby/object:Gem::Version
85
- hash: 3
86
- segments:
87
- - 0
88
- version: "0"
89
- type: :development
90
- version_requirements: *id005
91
- - !ruby/object:Gem::Dependency
92
- name: rcov
93
- prerelease: false
94
- requirement: &id006 !ruby/object:Gem::Requirement
95
- none: false
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- hash: 3
100
- segments:
101
- - 0
102
- version: "0"
103
- type: :development
104
- version_requirements: *id006
105
- - !ruby/object:Gem::Dependency
106
- name: realweb
107
- prerelease: false
108
- requirement: &id007 !ruby/object:Gem::Requirement
109
- none: false
110
- requirements:
111
- - - "="
112
- - !ruby/object:Gem::Version
113
- hash: 23
114
- segments:
115
- - 0
116
- - 1
117
- - 6
118
- version: 0.1.6
119
- type: :development
120
- version_requirements: *id007
121
- - !ruby/object:Gem::Dependency
122
- name: sinatra
123
- prerelease: false
124
- requirement: &id008 !ruby/object:Gem::Requirement
125
- none: false
126
- requirements:
127
- - - ">="
128
- - !ruby/object:Gem::Version
129
- hash: 3
130
- segments:
131
- - 0
132
- version: "0"
133
- type: :development
134
- version_requirements: *id008
135
- - !ruby/object:Gem::Dependency
136
- name: fog
137
36
  prerelease: false
138
- requirement: &id009 !ruby/object:Gem::Requirement
139
- none: false
140
- requirements:
141
- - - ">="
142
- - !ruby/object:Gem::Version
143
- hash: 3
144
- segments:
145
- - 0
146
- version: "0"
147
- type: :development
148
- version_requirements: *id009
149
- description: Used by backups and snapshots
150
- email:
151
- - gems@engineyard.com
37
+ version_requirements: *2153151000
38
+ description: Used by snapshots and services (was going to be used by backups)
39
+ email:
40
+ - cloud-engineering@engineyard.com
152
41
  executables: []
153
-
154
42
  extensions: []
155
-
156
43
  extra_rdoc_files: []
157
-
158
- files:
44
+ files:
159
45
  - lib/ey_instance_api_client/backup.rb
160
46
  - lib/ey_instance_api_client/config.rb
161
47
  - lib/ey_instance_api_client/connection.rb
162
48
  - lib/ey_instance_api_client/snapshot.rb
163
49
  - lib/ey_instance_api_client/version.rb
164
50
  - lib/ey_instance_api_client.rb
165
- - spec/backup_client_spec.rb
166
- - spec/config_spec.rb
167
- - spec/fixtures/backup_base_config.ru
168
- - spec/fixtures/snapshot_base_config.ru
169
- - spec/snapshot_client_spec.rb
170
- - spec/spec_helper.rb
171
- has_rdoc: true
172
- homepage: http://github.com/engineyard/ey_instance_api_client
51
+ homepage:
173
52
  licenses: []
174
-
175
53
  post_install_message:
176
54
  rdoc_options: []
177
-
178
- require_paths:
55
+ require_paths:
179
56
  - lib
180
- required_ruby_version: !ruby/object:Gem::Requirement
57
+ required_ruby_version: !ruby/object:Gem::Requirement
181
58
  none: false
182
- requirements:
183
- - - ">="
184
- - !ruby/object:Gem::Version
185
- hash: 3
186
- segments:
187
- - 0
188
- version: "0"
189
- required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
64
  none: false
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- hash: 3
195
- segments:
196
- - 0
197
- version: "0"
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
198
69
  requirements: []
199
-
200
70
  rubyforge_project:
201
- rubygems_version: 1.5.2
71
+ rubygems_version: 1.8.12
202
72
  signing_key:
203
73
  specification_version: 3
204
74
  summary: Client libraries used to consume instance api exposed by AWSM.
205
- test_files:
206
- - spec/backup_client_spec.rb
207
- - spec/config_spec.rb
208
- - spec/fixtures/backup_base_config.ru
209
- - spec/fixtures/snapshot_base_config.ru
210
- - spec/snapshot_client_spec.rb
211
- - spec/spec_helper.rb
75
+ test_files: []
@@ -1,88 +0,0 @@
1
- require File.expand_path('../spec_helper', __FILE__)
2
-
3
- describe "Backups" do
4
- before do
5
- start_server("backup_base_config")
6
- end
7
-
8
- after do
9
- stop_server
10
- end
11
-
12
- describe "with an invalid creds" do
13
- it "returns 403 when the token is invalid" do
14
- client = EY::InstanceAPIClient::Backups.new(EY::InstanceAPIClient::Config.new(base_url, "my-instance", "invalid-creds"))
15
- lambda { client.list("doesntmatter") }.
16
- should raise_error(EY::InstanceAPIClient::Connection::InvalidCredentials)
17
- end
18
- end
19
-
20
- describe "starting a backup for non-existant database" do
21
- it "return 404" do
22
- client = EY::InstanceAPIClient::Backups.new(EY::InstanceAPIClient::Config.new(base_url, "my-instance", "token-for-my-instance"))
23
- lambda { client.list("nonexistant") }.
24
- should raise_error(EY::InstanceAPIClient::Connection::NotFound)
25
- end
26
- end
27
-
28
- context "with an database that exists" do
29
- before do
30
- @database_id = "database-1"
31
- @client = EY::InstanceAPIClient::Backups.new(EY::InstanceAPIClient::Config.new(base_url, "my-instance", "token-for-my-instance"))
32
- end
33
-
34
- describe "listing backups" do
35
- it "Makes a request and Gets an empty list" do
36
- list = @client.list(@database_id)
37
- list.should == []
38
- end
39
-
40
- end
41
-
42
- describe "starting a backup" do
43
- before do
44
- @backup = @client.start(@database_id, ".gz", 1)
45
- end
46
-
47
- it "returns the upload and finished url" do
48
- @backup.should have(1).upload_urls
49
- @backup.upload_urls.first.should =~ %r{^http://s3/PUT}
50
- @backup.finish_url.should =~ %r{#{base_url}}
51
- @backup.status.should == "pending"
52
- end
53
-
54
- it "should show started_at in the listing" do
55
- list = @client.list(@database_id)
56
- list.size.should == 1
57
- backup = list.first
58
- backup.status.should == "pending"
59
- backup.started_at.should_not be_nil
60
- backup.download_urls.should be_nil
61
- backup.upload_urls.should be_nil
62
- backup.finished_at.should be_nil
63
- end
64
-
65
- describe "finishing that backup" do
66
- before do
67
- @backup.finish!
68
- end
69
-
70
- it "should show finished_at in the listing" do
71
- list = @client.list(@database_id)
72
- list.size.should == 1
73
- backup = list.first
74
- backup.should have(1).download_urls
75
- backup.download_urls.first.should =~ %r{^http://s3/GET}
76
- backup.upload_urls.should be_nil
77
- backup.started_at.should_not be_nil
78
- backup.finished_at.should_not be_nil
79
- end
80
-
81
- it "should return 409 if you attempt to finish it again" do
82
- lambda { @backup.finish! }.
83
- should raise_error(EY::InstanceAPIClient::Connection::AlreadyFinished)
84
- end
85
- end
86
- end
87
- end
88
- end
data/spec/config_spec.rb DELETED
@@ -1,39 +0,0 @@
1
- require File.expand_path('../spec_helper', __FILE__)
2
-
3
- describe "Config" do
4
-
5
- describe "default_config" do
6
- before(:each) do
7
- YAML.stub!(:load_file).and_return do |path, *args|
8
- if path =~ %r"/etc/engineyard/instance_api\.yml"
9
- {
10
- "base_url" => "http://localhost/",
11
- "instance_id" => "my-instance",
12
- "token" => "token"
13
- }
14
- end
15
- end
16
- EY::InstanceAPIClient::Connection.stub!(:new) do |*args|
17
- @connection_called_with = args
18
- end
19
- end
20
-
21
- it "Backups should load config from /etc/engineyard/instance_api.yml" do
22
- EY::InstanceAPIClient::Backups.new
23
- @connection_called_with.should == ["http://localhost/", "my-instance", "token"]
24
- end
25
-
26
- it "Snapshots should load config from /etc/engineyard/instance_api.yml" do
27
- EY::InstanceAPIClient::Snapshots.new
28
- @connection_called_with.should == ["http://localhost/", "my-instance", "token"]
29
- end
30
- end
31
-
32
- it "ensures base_url ends in a slash" do
33
- client = EY::InstanceAPIClient::Snapshots.new(EY::InstanceAPIClient::Config.new("http://localhost/end-point-without-a-slash", "some-instance", "some-creds"))
34
- client.base_url.should == "http://localhost/end-point-without-a-slash/"
35
- client = EY::InstanceAPIClient::Backups.new(EY::InstanceAPIClient::Config.new("http://localhost/end-point-without-a-slash", "some-instance", "some-creds"))
36
- client.base_url.should == "http://localhost/end-point-without-a-slash/"
37
- end
38
-
39
- end
@@ -1,82 +0,0 @@
1
-
2
- $:.unshift File.expand_path(File.dirname(__FILE__) + '/../../../server/lib')
3
- require 'ey_instance_api_server'
4
- require 'ey_instance_api_server/backups/example_callback'
5
-
6
- class MyCallback < EY::InstanceAPIServer::Backups::ExampleCallback
7
- def initialize(base_url, s3_base_url, automatic_databases, real_s3)
8
- super(base_url)
9
- @s3_base_url = s3_base_url
10
- @automatic_databases = automatic_databases
11
- @real_s3 = real_s3
12
- end
13
-
14
- def download_url_for(backup_id, part)
15
- if @real_s3
16
- URI.join(@s3_base_url, "files/#{backup_id}.part#{part}").to_s
17
- else
18
- super
19
- end
20
- end
21
-
22
- def upload_url_for(backup_id, part)
23
- if @real_s3
24
- download_url_for(backup_id, part)
25
- else
26
- super
27
- end
28
- end
29
-
30
- def backups_for(instance_id, database_id)
31
- if @automatic_databases
32
- add_database(instance_id, database_id)
33
- end
34
- super
35
- end
36
- end
37
-
38
- base_url = ENV["BASE_URL"] || abort("Provide a base url")
39
- automatic_databases = ENV["AUTO_DATABASES"] == "true"
40
- real_s3 = ENV["REAL_S3"] == "true"
41
-
42
- callback = MyCallback.new(URI.join(base_url, "api/").to_s, URI.join(base_url, "s3/").to_s, automatic_databases, real_s3)
43
- callback.add_instance("my-instance")
44
- callback.add_database("my-instance", "database-1")
45
- EY::InstanceAPIServer.callback_module = callback
46
-
47
- class S3Fake < Sinatra::Base
48
- enable :raise_errors
49
- disable :dump_errors
50
- disable :show_exceptions
51
-
52
- def files
53
- @@files ||= {}
54
- end
55
-
56
- get "/files/:id" do |id|
57
- puts "downloading file from #{id.inspect}"
58
- files[id] || not_found
59
- end
60
-
61
- put "/files/:id" do |id|
62
- unless request.content_type == "application/octet-stream"
63
- raise "Incorrect content type: #{request.content_type}"
64
- end
65
- puts "uploading file to #{id.inspect}"
66
- files[id] = request.body.read
67
- end
68
- end
69
-
70
- map "/s3" do
71
- run S3Fake
72
- end
73
-
74
- map "/api" do
75
- run EY::InstanceAPIServer.app
76
- end
77
-
78
- map "/" do
79
- run lambda {
80
- Rack::Response.new("hello").finish
81
- }
82
- end
@@ -1,45 +0,0 @@
1
-
2
- $:.unshift File.expand_path(File.dirname(__FILE__) + '/../../../server/lib')
3
- require 'ey_instance_api_server'
4
- require 'ey_instance_api_server/snapshots/example_callback'
5
-
6
- class MyCallback < EY::InstanceAPIServer::Snapshots::ExampleCallback
7
- def initialize(base_url)
8
- super(base_url)
9
- end
10
-
11
- def perform_all
12
- @instances.each do |instance_id, instance|
13
- instance[:volumes].each do |volume_id, volume|
14
- volume[:snapshots].each do |snapshot_id, snapshot|
15
- perform_snapshots_for(instance_id, volume_id, snapshot_id, nil)
16
- end
17
- end
18
- end
19
- end
20
-
21
- end
22
-
23
- base_url = ENV["BASE_URL"] || abort("Provide a base url")
24
-
25
- callback = MyCallback.new(URI.join(base_url, "api/"))
26
- callback.add_instance("my-instance")
27
- callback.add_volume("my-instance", "volume-1", "db")
28
- EY::InstanceAPIServer.callback_module = callback
29
-
30
- map "/api/peform_all" do
31
- run lambda {
32
- callback.perform_all
33
- Rack::Response.new("{}").finish
34
- }
35
- end
36
-
37
- map "/api" do
38
- run EY::InstanceAPIServer.app
39
- end
40
-
41
- map "/" do
42
- run lambda {
43
- Rack::Response.new("hello").finish
44
- }
45
- end
@@ -1,69 +0,0 @@
1
- require File.expand_path('../spec_helper', __FILE__)
2
-
3
- describe "Snapshots" do
4
- before do
5
- start_server("snapshot_base_config")
6
- end
7
-
8
- after do
9
- stop_server
10
- end
11
-
12
- describe "with an invalid creds" do
13
- it "returns 403 when the token is invalid" do
14
- client = EY::InstanceAPIClient::Snapshots.new(EY::InstanceAPIClient::Config.new(base_url, "my-instance", "invalid-creds"))
15
- lambda { client.list }.
16
- should raise_error(EY::InstanceAPIClient::Connection::InvalidCredentials)
17
- end
18
- end
19
-
20
- context "with an instance that exists" do
21
- before do
22
- @instance_id = 'my-instance'
23
- @volume_id = 'volume-1'
24
- @client = EY::InstanceAPIClient::Snapshots.new(EY::InstanceAPIClient::Config.new(base_url, "my-instance", "token-for-my-instance"))
25
- end
26
-
27
- describe "listing snapshots" do
28
- it "Makes a request and Gets an empty list" do
29
- list = @client.list
30
- list.should == []
31
- end
32
- end
33
-
34
- describe "requesting a snapshot" do
35
- before do
36
- @client.request
37
- end
38
-
39
- it "should show a requested snapshot in the list" do
40
- list = @client.list
41
- list.size.should == 1
42
- snapshot = list.first
43
- snapshot.state.should == "requested"
44
- snapshot.progress.should be_nil
45
- snapshot.volume.should == 'db' #should be one of 'util', 'data', 'db'
46
- snapshot.id.should_not be_nil
47
- snapshot.created_at.should be_within(4).of(Time.now)
48
- end
49
-
50
- describe "when the snapshot is performed" do
51
- before do
52
- @client.backend.api_call(URI.join(base_url, "peform_all").to_s, 200).post({})
53
- end
54
-
55
- it "should show in the listing" do
56
- list = @client.list
57
- list.size.should == 1
58
- snapshot = list.first
59
- snapshot.state.should == "in progress"
60
- snapshot.progress.should == "0%"
61
- snapshot.volume.should == 'db' #should be one of 'util', 'data', 'db'
62
- snapshot.id.should_not be_nil
63
- snapshot.created_at.should be_within(4).of(Time.now)
64
- end
65
-
66
- end
67
- end
68
- end
69
- end
data/spec/spec_helper.rb DELETED
@@ -1,32 +0,0 @@
1
- Bundler.require(:test)
2
-
3
- require 'ey_instance_api_client'
4
-
5
- module Helpers
6
- def start_server(config)
7
- config_ru = File.dirname(__FILE__) + "/fixtures/#{config}.ru"
8
- @server = RealWeb.start_server(config_ru, Proc.new do |server|
9
- ENV["BASE_URL"] = server_url_for(server.port)
10
- end)
11
- end
12
-
13
- def stop_server
14
- @server.stop
15
- end
16
-
17
- def server_url
18
- server_url_for(@server.port)
19
- end
20
-
21
- def server_url_for(port)
22
- "http://127.0.0.1:#{port}/"
23
- end
24
-
25
- def base_url
26
- URI.join(server_url, "api/").to_s
27
- end
28
- end
29
-
30
- RSpec.configure do |c|
31
- c.include Helpers
32
- end