cfoundry 0.6.1.rc4 → 0.7.0.rc1
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.
- data/lib/cfoundry/client.rb +1 -20
- data/lib/cfoundry/rest_client.rb +8 -5
- data/lib/cfoundry/v2/model.rb +11 -3
- data/lib/cfoundry/v2/model_magic.rb +0 -21
- data/lib/cfoundry/version.rb +1 -1
- data/spec/cfoundry/client_spec.rb +1 -7
- data/spec/cfoundry/rest_client_spec.rb +22 -4
- data/spec/cfoundry/v2/model_magic_spec.rb +7 -8
- data/spec/cfoundry/v2/model_spec.rb +89 -5
- data/spec/spec_helper.rb +0 -1
- metadata +3 -22
- data/lib/cfoundry/v1/app.rb +0 -363
- data/lib/cfoundry/v1/base.rb +0 -90
- data/lib/cfoundry/v1/client.rb +0 -193
- data/lib/cfoundry/v1/framework.rb +0 -21
- data/lib/cfoundry/v1/model.rb +0 -178
- data/lib/cfoundry/v1/model_magic.rb +0 -129
- data/lib/cfoundry/v1/runtime.rb +0 -24
- data/lib/cfoundry/v1/service.rb +0 -39
- data/lib/cfoundry/v1/service_instance.rb +0 -32
- data/lib/cfoundry/v1/service_plan.rb +0 -19
- data/lib/cfoundry/v1/user.rb +0 -22
- data/spec/cfoundry/v1/base_spec.rb +0 -96
- data/spec/cfoundry/v1/client_spec.rb +0 -17
- data/spec/cfoundry/v1/model_magic_spec.rb +0 -43
- data/spec/support/v1_fake_helper.rb +0 -144
data/lib/cfoundry/client.rb
CHANGED
@@ -2,14 +2,6 @@ require "cfoundry/baseclient"
|
|
2
2
|
require "cfoundry/rest_client"
|
3
3
|
require "cfoundry/auth_token"
|
4
4
|
|
5
|
-
require "cfoundry/v1/app"
|
6
|
-
require "cfoundry/v1/framework"
|
7
|
-
require "cfoundry/v1/runtime"
|
8
|
-
require "cfoundry/v1/service"
|
9
|
-
require "cfoundry/v1/service_plan"
|
10
|
-
require "cfoundry/v1/service_instance"
|
11
|
-
require "cfoundry/v1/user"
|
12
|
-
|
13
5
|
require "cfoundry/v2/app"
|
14
6
|
require "cfoundry/v2/service"
|
15
7
|
require "cfoundry/v2/service_binding"
|
@@ -24,24 +16,13 @@ require "cfoundry/v2/route"
|
|
24
16
|
require "cfoundry/v2/stack"
|
25
17
|
require "cfoundry/v2/quota_definition"
|
26
18
|
|
27
|
-
require "cfoundry/v1/base"
|
28
|
-
require "cfoundry/v1/client"
|
29
19
|
require "cfoundry/v2/base"
|
30
20
|
require "cfoundry/v2/client"
|
31
21
|
|
32
22
|
module CFoundry
|
33
23
|
class Client < BaseClient
|
34
24
|
def self.new(*args)
|
35
|
-
|
36
|
-
|
37
|
-
base = super(target)
|
38
|
-
|
39
|
-
case base.info[:version]
|
40
|
-
when 2
|
41
|
-
CFoundry::V2::Client.new(*args)
|
42
|
-
else
|
43
|
-
CFoundry::V1::Client.new(*args)
|
44
|
-
end
|
25
|
+
CFoundry::V2::Client.new(*args)
|
45
26
|
end
|
46
27
|
end
|
47
28
|
end
|
data/lib/cfoundry/rest_client.rb
CHANGED
@@ -76,11 +76,14 @@ module CFoundry
|
|
76
76
|
original_options = options.dup
|
77
77
|
payload = options[:payload]
|
78
78
|
|
79
|
-
if
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
79
|
+
if options[:params]
|
80
|
+
encoded_params = encode_params(options[:params])
|
81
|
+
if encoded_params.respond_to?(:empty?) ? !encoded_params.empty? : encoded_params
|
82
|
+
if uri.query
|
83
|
+
uri.query += "&" + encoded_params
|
84
|
+
else
|
85
|
+
uri.query = encoded_params
|
86
|
+
end
|
84
87
|
end
|
85
88
|
end
|
86
89
|
|
data/lib/cfoundry/v2/model.rb
CHANGED
@@ -93,7 +93,11 @@ module CFoundry::V2
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
-
@manifest = @client.base.
|
96
|
+
@manifest = @client.base.post("v2", plural_object_name,
|
97
|
+
:content => :json,
|
98
|
+
:accept => :json,
|
99
|
+
:payload => payload
|
100
|
+
)
|
97
101
|
|
98
102
|
@guid = @manifest[:metadata][:guid]
|
99
103
|
|
@@ -103,7 +107,11 @@ module CFoundry::V2
|
|
103
107
|
end
|
104
108
|
|
105
109
|
def update!
|
106
|
-
@
|
110
|
+
@client.base.put("v2", plural_object_name, guid,
|
111
|
+
:content => :json,
|
112
|
+
:accept => :json,
|
113
|
+
:payload => @diff
|
114
|
+
)
|
107
115
|
|
108
116
|
@diff.clear
|
109
117
|
|
@@ -111,7 +119,7 @@ module CFoundry::V2
|
|
111
119
|
end
|
112
120
|
|
113
121
|
def delete!(options = {})
|
114
|
-
@client.base.
|
122
|
+
@client.base.delete("v2", plural_object_name, guid, :params => options)
|
115
123
|
|
116
124
|
@guid = nil
|
117
125
|
|
@@ -72,27 +72,6 @@ module CFoundry::V2
|
|
72
72
|
)
|
73
73
|
)
|
74
74
|
end
|
75
|
-
|
76
|
-
define_method(:"create_#{singular}") do |payload|
|
77
|
-
post("v2", plural,
|
78
|
-
:content => :json,
|
79
|
-
:accept => :json,
|
80
|
-
:payload => payload
|
81
|
-
)
|
82
|
-
end
|
83
|
-
|
84
|
-
define_method(:"delete_#{singular}") do |guid, params|
|
85
|
-
delete("v2", plural, guid, :params => params)
|
86
|
-
true
|
87
|
-
end
|
88
|
-
|
89
|
-
define_method(:"update_#{singular}") do |guid, payload|
|
90
|
-
put("v2", plural, guid,
|
91
|
-
:content => :json,
|
92
|
-
:accept => :json,
|
93
|
-
:payload => payload
|
94
|
-
)
|
95
|
-
end
|
96
75
|
end
|
97
76
|
|
98
77
|
define_client_methods do
|
data/lib/cfoundry/version.rb
CHANGED
@@ -3,13 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe CFoundry::Client do
|
4
4
|
subject { CFoundry::Client.new('http://example.com') }
|
5
5
|
|
6
|
-
it "returns a
|
7
|
-
stub_request(:get, "http://example.com/info").to_return(:status => 200, :body => '{"version":1}')
|
8
|
-
subject.should be_a(CFoundry::V1::Client)
|
9
|
-
end
|
10
|
-
|
11
|
-
it "returns a v2 client when used on a v2 target" do
|
12
|
-
stub_request(:get, "http://example.com/info").to_return(:status => 200, :body => '{"version":2}')
|
6
|
+
it "returns a v2 client" do
|
13
7
|
subject.should be_a(CFoundry::V2::Client)
|
14
8
|
end
|
15
9
|
end
|
@@ -76,6 +76,28 @@ describe CFoundry::RestClient do
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
+
context "when params are passed" do
|
80
|
+
context "when params is an empty hash" do
|
81
|
+
let(:options) { { :params => {} } }
|
82
|
+
|
83
|
+
it "does not add a query string delimiter (the question mark)" do
|
84
|
+
request_stub = stub_request(:get, "https://api.cloudfoundry.com/some-path")
|
85
|
+
subject
|
86
|
+
expect(request_stub).to have_been_requested
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "when params has values" do
|
91
|
+
let(:options) { { :params => { "key" => "value" } } }
|
92
|
+
|
93
|
+
it "appends a query string and delimiter" do
|
94
|
+
request_stub = stub_request(:get, "https://api.cloudfoundry.com/some-path?key=value")
|
95
|
+
subject
|
96
|
+
expect(request_stub).to have_been_requested
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
79
101
|
context 'and the token is set' do
|
80
102
|
let(:token_header) { "bearer something" }
|
81
103
|
let(:token) { CFoundry::AuthToken.new(token_header) }
|
@@ -138,10 +160,6 @@ describe CFoundry::RestClient do
|
|
138
160
|
end
|
139
161
|
end
|
140
162
|
|
141
|
-
describe 'payload' do
|
142
|
-
|
143
|
-
end
|
144
|
-
|
145
163
|
describe 'errors' do
|
146
164
|
context "when the target refuses the connection" do
|
147
165
|
let(:target) { "http://localhost:2358974958" }
|
@@ -93,20 +93,19 @@ describe CFoundry::V2::ModelMagic do
|
|
93
93
|
|
94
94
|
subject { myobject }
|
95
95
|
|
96
|
-
it "
|
97
|
-
mock(client.base).
|
96
|
+
it "uses the 'at' value in the update payload" do
|
97
|
+
mock(client.base).put("v2", :my_fake_models, subject.guid, hash_including(:payload => {:not_foo => 123}))
|
98
98
|
subject.foo = 123
|
99
99
|
subject.update!
|
100
100
|
end
|
101
101
|
|
102
|
-
it "
|
102
|
+
it "uses the 'at' value in the create payload" do
|
103
103
|
subject.foo = 123
|
104
104
|
|
105
|
-
mock(client.base).
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
end
|
105
|
+
mock(client.base).post(
|
106
|
+
"v2", :my_fake_models,
|
107
|
+
hash_including(:payload => {:not_foo => 123})
|
108
|
+
) { {:metadata => {}} }
|
110
109
|
|
111
110
|
subject.create!
|
112
111
|
end
|
@@ -3,15 +3,77 @@ require "spec_helper"
|
|
3
3
|
describe CFoundry::V2::Model do
|
4
4
|
let(:client) { fake_client }
|
5
5
|
let(:guid) { random_string("my-object-guid") }
|
6
|
+
let(:manifest) { {:metadata => {:foo => "bar"}} }
|
7
|
+
let(:klass) {
|
8
|
+
fake_model do
|
9
|
+
attribute :foo, :string, :read => :x, :write => [:y, :z]
|
10
|
+
end
|
11
|
+
}
|
12
|
+
|
13
|
+
subject { klass.new(guid, client, manifest) }
|
14
|
+
|
15
|
+
describe "#create!" do
|
16
|
+
before do
|
17
|
+
stub(client.base).post {
|
18
|
+
{:metadata => {:guid => "123"}}
|
19
|
+
}
|
20
|
+
subject.foo = "bar"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "posts to the model's create url with appropriate arguments" do
|
24
|
+
mock(client.base).post("v2", :my_fake_models,
|
25
|
+
:content => :json,
|
26
|
+
:accept => :json,
|
27
|
+
:payload => {:foo => "bar"}
|
28
|
+
) { {:metadata => {}} }
|
29
|
+
subject.create!
|
30
|
+
end
|
31
|
+
|
32
|
+
it "clears diff" do
|
33
|
+
subject.diff.should be_present
|
34
|
+
subject.create!
|
35
|
+
subject.diff.should_not be_present
|
36
|
+
end
|
37
|
+
|
38
|
+
it "sets manifest from the response" do
|
39
|
+
subject.create!
|
40
|
+
subject.manifest.should == {:metadata => {:guid => "123"}}
|
41
|
+
end
|
42
|
+
|
43
|
+
it "sets guid from the response metadata" do
|
44
|
+
subject.create!
|
45
|
+
subject.guid.should == "123"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#update!" do
|
50
|
+
before do
|
51
|
+
stub(client.base).put
|
52
|
+
subject.foo = "bar"
|
53
|
+
end
|
6
54
|
|
7
|
-
|
55
|
+
it "updates using the client with the v2 api, its plural model name, object guid, and diff object" do
|
56
|
+
mock(client.base).put("v2", :my_fake_models, guid,
|
57
|
+
:content => :json,
|
58
|
+
:accept => :json,
|
59
|
+
:payload => {:foo => "bar"}
|
60
|
+
)
|
61
|
+
subject.update!
|
62
|
+
end
|
63
|
+
|
64
|
+
it "clears diff" do
|
65
|
+
subject.diff.should be_present
|
66
|
+
subject.update!
|
67
|
+
subject.diff.should_not be_present
|
68
|
+
end
|
69
|
+
end
|
8
70
|
|
9
71
|
describe "#delete!" do
|
10
|
-
before { stub(client.base).
|
72
|
+
before { stub(client.base).delete }
|
11
73
|
|
12
74
|
context "without options" do
|
13
|
-
it "
|
14
|
-
mock(client.base).
|
75
|
+
it "deletes using the client with the v2 api, its plural model name, object guid, and empty params hash" do
|
76
|
+
mock(client.base).delete("v2", :my_fake_models, guid, :params => {})
|
15
77
|
subject.delete!
|
16
78
|
end
|
17
79
|
end
|
@@ -19,7 +81,7 @@ describe CFoundry::V2::Model do
|
|
19
81
|
context "with options" do
|
20
82
|
it "sends delete with the object guid and options" do
|
21
83
|
options = {:excellent => "billandted"}
|
22
|
-
mock(client.base).
|
84
|
+
mock(client.base).delete("v2", :my_fake_models, guid, :params => options)
|
23
85
|
|
24
86
|
subject.delete!(options)
|
25
87
|
end
|
@@ -30,5 +92,27 @@ describe CFoundry::V2::Model do
|
|
30
92
|
subject.delete!
|
31
93
|
subject.guid.should_not be_present
|
32
94
|
end
|
95
|
+
|
96
|
+
it "clears its manifest metadata" do
|
97
|
+
subject.manifest.should have_key(:metadata)
|
98
|
+
subject.delete!
|
99
|
+
subject.manifest.should_not have_key(:metadata)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "clears the diff" do
|
103
|
+
subject.foo = "bar"
|
104
|
+
subject.diff.should be_present
|
105
|
+
subject.delete!
|
106
|
+
subject.diff.should_not be_present
|
107
|
+
end
|
108
|
+
|
109
|
+
it "delete me" do
|
110
|
+
begin
|
111
|
+
subject.delete!
|
112
|
+
rescue => ex
|
113
|
+
ex.message.should_not =~ /\?/
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
33
117
|
end
|
34
118
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfoundry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0.rc1
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-04-
|
13
|
+
date: 2013-04-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: multipart-post
|
@@ -207,17 +207,6 @@ files:
|
|
207
207
|
- lib/cfoundry/trace_helpers.rb
|
208
208
|
- lib/cfoundry/uaaclient.rb
|
209
209
|
- lib/cfoundry/upload_helpers.rb
|
210
|
-
- lib/cfoundry/v1/app.rb
|
211
|
-
- lib/cfoundry/v1/base.rb
|
212
|
-
- lib/cfoundry/v1/client.rb
|
213
|
-
- lib/cfoundry/v1/framework.rb
|
214
|
-
- lib/cfoundry/v1/model.rb
|
215
|
-
- lib/cfoundry/v1/model_magic.rb
|
216
|
-
- lib/cfoundry/v1/runtime.rb
|
217
|
-
- lib/cfoundry/v1/service.rb
|
218
|
-
- lib/cfoundry/v1/service_instance.rb
|
219
|
-
- lib/cfoundry/v1/service_plan.rb
|
220
|
-
- lib/cfoundry/v1/user.rb
|
221
210
|
- lib/cfoundry/v2/app.rb
|
222
211
|
- lib/cfoundry/v2/base.rb
|
223
212
|
- lib/cfoundry/v2/client.rb
|
@@ -263,9 +252,6 @@ files:
|
|
263
252
|
- spec/cfoundry/trace_helpers_spec.rb
|
264
253
|
- spec/cfoundry/uaaclient_spec.rb
|
265
254
|
- spec/cfoundry/upload_helpers_spec.rb
|
266
|
-
- spec/cfoundry/v1/base_spec.rb
|
267
|
-
- spec/cfoundry/v1/client_spec.rb
|
268
|
-
- spec/cfoundry/v1/model_magic_spec.rb
|
269
255
|
- spec/cfoundry/v2/app_spec.rb
|
270
256
|
- spec/cfoundry/v2/base_spec.rb
|
271
257
|
- spec/cfoundry/v2/client_spec.rb
|
@@ -337,7 +323,6 @@ files:
|
|
337
323
|
- spec/support/shared_examples/cc_api_stub_request_examples.rb
|
338
324
|
- spec/support/shared_examples/client_login_examples.rb
|
339
325
|
- spec/support/shared_examples/model_summary_examples.rb
|
340
|
-
- spec/support/v1_fake_helper.rb
|
341
326
|
homepage: http://github.com/cloudfoundry/vmc-lib
|
342
327
|
licenses: []
|
343
328
|
post_install_message:
|
@@ -352,7 +337,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
352
337
|
version: '0'
|
353
338
|
segments:
|
354
339
|
- 0
|
355
|
-
hash:
|
340
|
+
hash: 3268215508581398236
|
356
341
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
357
342
|
none: false
|
358
343
|
requirements:
|
@@ -387,9 +372,6 @@ test_files:
|
|
387
372
|
- spec/cfoundry/trace_helpers_spec.rb
|
388
373
|
- spec/cfoundry/uaaclient_spec.rb
|
389
374
|
- spec/cfoundry/upload_helpers_spec.rb
|
390
|
-
- spec/cfoundry/v1/base_spec.rb
|
391
|
-
- spec/cfoundry/v1/client_spec.rb
|
392
|
-
- spec/cfoundry/v1/model_magic_spec.rb
|
393
375
|
- spec/cfoundry/v2/app_spec.rb
|
394
376
|
- spec/cfoundry/v2/base_spec.rb
|
395
377
|
- spec/cfoundry/v2/client_spec.rb
|
@@ -461,4 +443,3 @@ test_files:
|
|
461
443
|
- spec/support/shared_examples/cc_api_stub_request_examples.rb
|
462
444
|
- spec/support/shared_examples/client_login_examples.rb
|
463
445
|
- spec/support/shared_examples/model_summary_examples.rb
|
464
|
-
- spec/support/v1_fake_helper.rb
|
data/lib/cfoundry/v1/app.rb
DELETED
@@ -1,363 +0,0 @@
|
|
1
|
-
require "cfoundry/upload_helpers"
|
2
|
-
require "cfoundry/chatty_hash"
|
3
|
-
|
4
|
-
require "cfoundry/v1/model"
|
5
|
-
|
6
|
-
module CFoundry::V1
|
7
|
-
class App < Model
|
8
|
-
include CFoundry::UploadHelpers
|
9
|
-
|
10
|
-
attribute :name, :string, :guid => true
|
11
|
-
attribute :instances, :integer
|
12
|
-
attribute :state, :string
|
13
|
-
attribute :created, :integer, :at => [:meta, :created], :read_only => true
|
14
|
-
attribute :version, :integer, :at => [:meta, :version], :read_only => true
|
15
|
-
attribute :framework, :string, :at => [:staging, :model]
|
16
|
-
attribute :runtime, :string, :at => [:staging, :stack]
|
17
|
-
attribute :command, :string, :at => [:staging, :command]
|
18
|
-
attribute :memory, :integer, :at => [:resources, :memory]
|
19
|
-
attribute :disk, :integer, :at => [:resources, :disk]
|
20
|
-
attribute :fds, :integer, :at => [:resources, :fds]
|
21
|
-
attribute :env, [:string], :default => []
|
22
|
-
attribute :uris, [:string], :default => []
|
23
|
-
attribute :services, [:string], :default => []
|
24
|
-
|
25
|
-
attribute :console, :boolean, :default => false,
|
26
|
-
:read => [:meta, :console], :write => :console
|
27
|
-
|
28
|
-
attribute :debug, :string, :default => nil, :read => [:meta, :debug],
|
29
|
-
:write => :debug
|
30
|
-
|
31
|
-
attribute :running_instances, :integer, :read => :runningInstances,
|
32
|
-
:read_only => true
|
33
|
-
|
34
|
-
|
35
|
-
define_client_methods
|
36
|
-
|
37
|
-
|
38
|
-
alias_method :total_instances, :instances
|
39
|
-
alias_method :total_instances=, :instances=
|
40
|
-
|
41
|
-
alias_method :debug_mode, :debug
|
42
|
-
alias_method :debug_mode=, :debug=
|
43
|
-
|
44
|
-
alias_method :framework_name, :framework
|
45
|
-
alias_method :framework_name=, :framework=
|
46
|
-
|
47
|
-
alias_method :runtime_name, :runtime
|
48
|
-
alias_method :runtime_name=, :runtime=
|
49
|
-
|
50
|
-
alias_method :service_names, :services
|
51
|
-
alias_method :service_names=, :services=
|
52
|
-
|
53
|
-
alias_method :status, :state
|
54
|
-
alias_method :status=, :state=
|
55
|
-
|
56
|
-
alias_method :urls, :uris
|
57
|
-
alias_method :urls=, :uris=
|
58
|
-
|
59
|
-
alias_method :env_array, :env
|
60
|
-
alias_method :env_array=, :env=
|
61
|
-
|
62
|
-
def framework
|
63
|
-
@client.framework(framework_name)
|
64
|
-
end
|
65
|
-
|
66
|
-
def framework=(obj)
|
67
|
-
set_named(:framework, obj)
|
68
|
-
end
|
69
|
-
|
70
|
-
def runtime
|
71
|
-
@client.runtime(runtime_name)
|
72
|
-
end
|
73
|
-
|
74
|
-
def runtime=(obj)
|
75
|
-
set_named(:runtime, obj)
|
76
|
-
end
|
77
|
-
|
78
|
-
def services
|
79
|
-
service_names.collect { |name| @client.service_instance(name) }
|
80
|
-
end
|
81
|
-
|
82
|
-
def services=(objs)
|
83
|
-
set_many_named(:service, objs)
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
|
-
# Retrieve all of the instances of the app, as Instance objects.
|
88
|
-
def instances
|
89
|
-
@client.base.instances(@guid).collect do |m|
|
90
|
-
Instance.new(self, m[:index].to_s, @client, m)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
# Retrieve crashed instances
|
95
|
-
def crashes
|
96
|
-
@client.base.crashes(@guid).collect do |i|
|
97
|
-
Instance.new(self, i[:instance].to_s, @client, i)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
# Retrieve application statistics, e.g. CPU load and memory usage.
|
102
|
-
def stats
|
103
|
-
stats = {}
|
104
|
-
|
105
|
-
@client.base.stats(@guid).each do |idx, info|
|
106
|
-
stats[idx.to_s] = info
|
107
|
-
end
|
108
|
-
|
109
|
-
stats
|
110
|
-
end
|
111
|
-
|
112
|
-
# Stop the application.
|
113
|
-
def stop!
|
114
|
-
self.state = "STOPPED"
|
115
|
-
update!
|
116
|
-
end
|
117
|
-
|
118
|
-
# Start the application.
|
119
|
-
def start!(async = false)
|
120
|
-
self.state = "STARTED"
|
121
|
-
update!
|
122
|
-
end
|
123
|
-
|
124
|
-
# Restart the application.
|
125
|
-
def restart!(async = false)
|
126
|
-
stop!
|
127
|
-
start!
|
128
|
-
end
|
129
|
-
|
130
|
-
def update!(async = false)
|
131
|
-
super()
|
132
|
-
end
|
133
|
-
|
134
|
-
# Determine application health.
|
135
|
-
#
|
136
|
-
# If all instances are running, returns "RUNNING". If only some are
|
137
|
-
# started, returns the precentage of them that are healthy.
|
138
|
-
#
|
139
|
-
# Otherwise, returns application's status.
|
140
|
-
def health
|
141
|
-
s = state
|
142
|
-
if s == "STARTED"
|
143
|
-
healthy_count = running_instances
|
144
|
-
expected = total_instances
|
145
|
-
|
146
|
-
if healthy_count && expected > 0
|
147
|
-
ratio = healthy_count / expected.to_f
|
148
|
-
if ratio == 1.0
|
149
|
-
"RUNNING"
|
150
|
-
else
|
151
|
-
"#{(ratio * 100).to_i}%"
|
152
|
-
end
|
153
|
-
else
|
154
|
-
"N/A"
|
155
|
-
end
|
156
|
-
else
|
157
|
-
s
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
# Check that all application instances are running.
|
162
|
-
def healthy?
|
163
|
-
# invalidate cache so the check is fresh
|
164
|
-
invalidate!
|
165
|
-
health == "RUNNING"
|
166
|
-
end
|
167
|
-
alias_method :running?, :healthy?
|
168
|
-
|
169
|
-
# Is the application stopped?
|
170
|
-
def stopped?
|
171
|
-
state == "STOPPED"
|
172
|
-
end
|
173
|
-
|
174
|
-
# Is the application started?
|
175
|
-
#
|
176
|
-
# Note that this does not imply that all instances are running. See
|
177
|
-
# #healthy?
|
178
|
-
def started?
|
179
|
-
state == "STARTED"
|
180
|
-
end
|
181
|
-
|
182
|
-
|
183
|
-
# Shortcut for uris[0]
|
184
|
-
def uri
|
185
|
-
uris[0]
|
186
|
-
end
|
187
|
-
|
188
|
-
# Shortcut for uris = [x]
|
189
|
-
def uri=(x)
|
190
|
-
self.uris = [x]
|
191
|
-
end
|
192
|
-
|
193
|
-
alias_method :url, :uri
|
194
|
-
alias_method :url=, :uri=
|
195
|
-
|
196
|
-
def env
|
197
|
-
e = env_array || []
|
198
|
-
|
199
|
-
env = {}
|
200
|
-
e.each do |pair|
|
201
|
-
name, val = pair.split("=", 2)
|
202
|
-
env[name] = val
|
203
|
-
end
|
204
|
-
|
205
|
-
CFoundry::ChattyHash.new(method(:env=), env)
|
206
|
-
end
|
207
|
-
|
208
|
-
def env=(hash)
|
209
|
-
unless hash.is_a?(Array)
|
210
|
-
hash = hash.collect { |k, v| "#{k}=#{v}" }
|
211
|
-
end
|
212
|
-
|
213
|
-
self.env_array = hash
|
214
|
-
end
|
215
|
-
|
216
|
-
def services
|
217
|
-
service_names.collect do |name|
|
218
|
-
@client.service_instance(name)
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
def services=(instances)
|
223
|
-
self.service_names = instances.collect(&:name)
|
224
|
-
end
|
225
|
-
|
226
|
-
|
227
|
-
# Bind services to application.
|
228
|
-
def bind(*instances)
|
229
|
-
self.services += instances
|
230
|
-
update!
|
231
|
-
end
|
232
|
-
|
233
|
-
# Unbind services from application.
|
234
|
-
def unbind(*instances)
|
235
|
-
self.services -= instances
|
236
|
-
update!
|
237
|
-
end
|
238
|
-
|
239
|
-
def binds?(instance)
|
240
|
-
services.include? instance
|
241
|
-
end
|
242
|
-
|
243
|
-
# Retrieve file listing under path for the first instance of the application.
|
244
|
-
#
|
245
|
-
# [path]
|
246
|
-
# A sequence of strings representing path segments.
|
247
|
-
#
|
248
|
-
# For example, <code>files("foo", "bar")</code> for +foo/bar+.
|
249
|
-
def files(*path)
|
250
|
-
Instance.new(self, "0", @client).files(*path)
|
251
|
-
end
|
252
|
-
|
253
|
-
# Retrieve file contents for the first instance of the application.
|
254
|
-
#
|
255
|
-
# [path]
|
256
|
-
# A sequence of strings representing path segments.
|
257
|
-
#
|
258
|
-
# For example, <code>files("foo", "bar")</code> for +foo/bar+.
|
259
|
-
def file(*path)
|
260
|
-
Instance.new(self, "0", @client).file(*path)
|
261
|
-
end
|
262
|
-
|
263
|
-
private
|
264
|
-
|
265
|
-
def set_named(attr, val)
|
266
|
-
res = send(:"#{attr}_name=", val.name)
|
267
|
-
|
268
|
-
if @changes.key?(attr)
|
269
|
-
old, new = @changes[attr]
|
270
|
-
@changes[attr] = [@client.send(attr, old), val]
|
271
|
-
end
|
272
|
-
|
273
|
-
res
|
274
|
-
end
|
275
|
-
|
276
|
-
def set_many_named(attr, vals)
|
277
|
-
res = send(:"#{attr}_names=", val.collect(&:name))
|
278
|
-
|
279
|
-
if @changes.key?(attr)
|
280
|
-
old, new = @changes[attr]
|
281
|
-
@changes[attr] = [old.collect { |o| @client.send(attr, o) }, vals]
|
282
|
-
end
|
283
|
-
|
284
|
-
vals
|
285
|
-
end
|
286
|
-
|
287
|
-
# Class represnting a running instance of an application.
|
288
|
-
class Instance
|
289
|
-
# The application this instance belongs to.
|
290
|
-
attr_reader :app
|
291
|
-
|
292
|
-
# Application instance number.
|
293
|
-
attr_reader :id
|
294
|
-
|
295
|
-
# Create an Instance object.
|
296
|
-
#
|
297
|
-
# You'll usually call App#instances instead
|
298
|
-
def initialize(app, id, client, manifest = {})
|
299
|
-
@app = app
|
300
|
-
@id = id
|
301
|
-
@client = client
|
302
|
-
@manifest = manifest
|
303
|
-
end
|
304
|
-
|
305
|
-
# Show string representing the application instance.
|
306
|
-
def inspect
|
307
|
-
"#<App::Instance '#{@app.name}' \##@id>"
|
308
|
-
end
|
309
|
-
|
310
|
-
# Instance state.
|
311
|
-
def state
|
312
|
-
@manifest[:state]
|
313
|
-
end
|
314
|
-
alias_method :status, :state
|
315
|
-
|
316
|
-
# Instance start time.
|
317
|
-
def since
|
318
|
-
Time.at(@manifest[:since])
|
319
|
-
end
|
320
|
-
|
321
|
-
# Instance debugger data. If instance is in debug mode, returns a hash
|
322
|
-
# containing :ip and :port keys.
|
323
|
-
def debugger
|
324
|
-
return unless @manifest[:debug_ip] and @manifest[:debug_port]
|
325
|
-
|
326
|
-
{ :ip => @manifest[:debug_ip],
|
327
|
-
:port => @manifest[:debug_port]
|
328
|
-
}
|
329
|
-
end
|
330
|
-
|
331
|
-
# Instance console data. If instance has a console, returns a hash
|
332
|
-
# containing :ip and :port keys.
|
333
|
-
def console
|
334
|
-
return unless @manifest[:console_ip] and @manifest[:console_port]
|
335
|
-
|
336
|
-
{ :ip => @manifest[:console_ip],
|
337
|
-
:port => @manifest[:console_port]
|
338
|
-
}
|
339
|
-
end
|
340
|
-
|
341
|
-
# True if instance is starting or running, false if it's down or
|
342
|
-
# flapping.
|
343
|
-
def healthy?
|
344
|
-
case state
|
345
|
-
when "STARTING", "RUNNING"
|
346
|
-
true
|
347
|
-
when "DOWN", "FLAPPING"
|
348
|
-
false
|
349
|
-
end
|
350
|
-
end
|
351
|
-
|
352
|
-
def files(*path)
|
353
|
-
@client.base.files(@app.name, @id, *path).split("\n").collect do |entry|
|
354
|
-
path + [entry.split(/\s+/, 2)[0]]
|
355
|
-
end
|
356
|
-
end
|
357
|
-
|
358
|
-
def file(*path)
|
359
|
-
@client.base.files(@app.name, @id, *path)
|
360
|
-
end
|
361
|
-
end
|
362
|
-
end
|
363
|
-
end
|