cfoundry 0.6.1.rc3 → 0.6.1.rc4

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.
@@ -22,6 +22,7 @@ require "cfoundry/v2/space"
22
22
  require "cfoundry/v2/domain"
23
23
  require "cfoundry/v2/route"
24
24
  require "cfoundry/v2/stack"
25
+ require "cfoundry/v2/quota_definition"
25
26
 
26
27
  require "cfoundry/v1/base"
27
28
  require "cfoundry/v1/client"
@@ -175,6 +175,21 @@ module CFoundry::V2
175
175
  true
176
176
  end
177
177
 
178
+ def stream_update_log(log_url)
179
+ offset = 0
180
+
181
+ while true
182
+ begin
183
+ @client.stream_url(log_url + "&tail&tail_offset=#{offset}") do |out|
184
+ offset += out.size
185
+ yield out
186
+ end
187
+ rescue Timeout::Error
188
+ end
189
+ end
190
+ rescue CFoundry::APIError
191
+ end
192
+
178
193
  # Determine application health.
179
194
  #
180
195
  # If all instances are running, returns "RUNNING". If only some are
@@ -110,8 +110,8 @@ module CFoundry::V2
110
110
  true
111
111
  end
112
112
 
113
- def delete!
114
- @client.base.send(:"delete_#{object_name}", @guid)
113
+ def delete!(options = {})
114
+ @client.base.send(:"delete_#{object_name}", @guid, options)
115
115
 
116
116
  @guid = nil
117
117
 
@@ -58,27 +58,40 @@ module CFoundry::V2
58
58
 
59
59
  define_base_client_methods do
60
60
  define_method(singular) do |guid, *args|
61
- get("v2", plural, guid, :accept => :json,
62
- :params => ModelMagic.params_from(args))
61
+ get("v2", plural, guid,
62
+ :accept => :json,
63
+ :params => ModelMagic.params_from(args)
64
+ )
65
+ end
66
+
67
+ define_method(plural) do |*args|
68
+ all_pages(
69
+ get("v2", plural,
70
+ :accept => :json,
71
+ :params => ModelMagic.params_from(args)
72
+ )
73
+ )
63
74
  end
64
75
 
65
76
  define_method(:"create_#{singular}") do |payload|
66
- post("v2", plural, :content => :json, :accept => :json, :payload => payload)
77
+ post("v2", plural,
78
+ :content => :json,
79
+ :accept => :json,
80
+ :payload => payload
81
+ )
67
82
  end
68
83
 
69
- define_method(:"delete_#{singular}") do |guid|
70
- delete("v2", plural, guid)
84
+ define_method(:"delete_#{singular}") do |guid, params|
85
+ delete("v2", plural, guid, :params => params)
71
86
  true
72
87
  end
73
88
 
74
89
  define_method(:"update_#{singular}") do |guid, payload|
75
- put("v2", plural, guid, :content => :json, :accept => :json, :payload => payload)
76
- end
77
-
78
- define_method(plural) do |*args|
79
- all_pages(
80
- get("v2", plural, :accept => :json,
81
- :params => ModelMagic.params_from(args)))
90
+ put("v2", plural, guid,
91
+ :content => :json,
92
+ :accept => :json,
93
+ :payload => payload
94
+ )
82
95
  end
83
96
  end
84
97
 
@@ -10,6 +10,9 @@ module CFoundry::V2
10
10
  to_many :billing_managers, :as => :user
11
11
  to_many :auditors, :as => :user
12
12
 
13
+ to_one :quota_definition
14
+ attribute :billing_enabled, :boolean
15
+
13
16
  queryable_by :name, :space_guid, :user_guid, :manager_guid,
14
17
  :billing_manager_guid, :auditor_guid
15
18
  end
@@ -0,0 +1,12 @@
1
+ require "cfoundry/v2/model"
2
+
3
+ module CFoundry::V2
4
+ class QuotaDefinition < Model
5
+ attribute :name, :string
6
+ attribute :non_basic_services_allowed, :boolean
7
+ attribute :total_services, :integer
8
+ attribute :memory_limit, :integer
9
+
10
+ queryable_by :name
11
+ end
12
+ end
@@ -1,4 +1,4 @@
1
1
  module CFoundry # :nodoc:
2
2
  # CFoundry library version number.
3
- VERSION = "0.6.1.rc3".freeze
3
+ VERSION = "0.6.1.rc4".freeze
4
4
  end
@@ -141,4 +141,82 @@ describe CFoundry::V2::App do
141
141
  end
142
142
  end
143
143
  end
144
+
145
+ describe "#stream_update_log" do
146
+ let(:client) { fake_client }
147
+ let(:base_url) { "http://example.com/log" }
148
+
149
+ subject { described_class.new(nil, client) }
150
+
151
+ def mock_log(url = anything)
152
+ mock(client).stream_url(url) do |_, blk|
153
+ blk.call(yield)
154
+ end.ordered
155
+ end
156
+
157
+ def stub_log(url = anything)
158
+ stub(client).stream_url(url) do |_, blk|
159
+ blk.call(yield)
160
+ end.ordered
161
+ end
162
+
163
+ it "yields chunks from the response to the block" do
164
+ mock_log { "a" }
165
+ mock_log { "b" }
166
+ mock_log { raise CFoundry::NotFound }
167
+
168
+ chunks = []
169
+ subject.stream_update_log(base_url) do |chunk|
170
+ chunks << chunk
171
+ end
172
+
173
+ expect(chunks).to eq(%w(a b))
174
+ end
175
+
176
+ it "retries when the connection times out" do
177
+ mock_log { raise Timeout::Error }
178
+ mock_log { "a" }
179
+ mock_log { raise Timeout::Error }
180
+ mock_log { "b" }
181
+ mock_log { raise Timeout::Error }
182
+ mock_log { raise CFoundry::NotFound }
183
+
184
+ chunks = []
185
+ subject.stream_update_log(base_url) do |chunk|
186
+ chunks << chunk
187
+ end
188
+
189
+ expect(chunks).to eq(%w(a b))
190
+ end
191
+
192
+ it "tracks the offset to stream from" do
193
+ url = "#{base_url}&tail&tail_offset="
194
+
195
+ mock_log("#{url}0") { "a" }
196
+ mock_log("#{url}1") { raise Timeout::Error }
197
+ mock_log("#{url}1") { "b" }
198
+ mock_log("#{url}2") { raise CFoundry::NotFound }
199
+
200
+ chunks = []
201
+ subject.stream_update_log(base_url) do |chunk|
202
+ chunks << chunk
203
+ end
204
+
205
+ expect(chunks).to eq(%w(a b))
206
+ end
207
+
208
+ it "stops when the endpoint disappears" do
209
+ mock_log { "a" }
210
+ mock_log { "b" }
211
+ mock_log { raise CFoundry::NotFound }
212
+ stub_log { "c" }
213
+
214
+ chunks = []
215
+ subject.stream_update_log(base_url) do |chunk|
216
+ chunks << chunk
217
+ end
218
+
219
+ expect(chunks).to eq(%w(a b))
220
+ end
221
+ end
144
222
  end
@@ -0,0 +1,34 @@
1
+ require "spec_helper"
2
+
3
+ describe CFoundry::V2::Model do
4
+ let(:client) { fake_client }
5
+ let(:guid) { random_string("my-object-guid") }
6
+
7
+ subject { described_class.new(guid, client) }
8
+
9
+ describe "#delete!" do
10
+ before { stub(client.base).delete_model }
11
+
12
+ context "without options" do
13
+ it "sends delete with the object guid and an empty hash" do
14
+ mock(client.base).delete_model(guid, {})
15
+ subject.delete!
16
+ end
17
+ end
18
+
19
+ context "with options" do
20
+ it "sends delete with the object guid and options" do
21
+ options = {:excellent => "billandted"}
22
+ mock(client.base).delete_model(guid, options)
23
+
24
+ subject.delete!(options)
25
+ end
26
+ end
27
+
28
+ it "clears its guid" do
29
+ subject.guid.should be_present
30
+ subject.delete!
31
+ subject.guid.should_not be_present
32
+ end
33
+ end
34
+ end
@@ -3,13 +3,28 @@ require "spec_helper"
3
3
  describe CFoundry::V2::Organization do
4
4
  let(:client) { fake_client }
5
5
 
6
- describe 'summarization' do
6
+ subject { CFoundry::V2::Organization.new("organization-1", client) }
7
+
8
+ describe "summarization" do
7
9
  let(:mymodel) { CFoundry::V2::Organization }
8
10
  let(:myobject) { fake(:organization) }
9
11
  let(:summary_attributes) { { :name => "fizzbuzz" } }
10
12
 
11
13
  subject { myobject }
12
14
 
13
- it_behaves_like 'a summarizeable model'
15
+ it_behaves_like "a summarizeable model"
16
+ end
17
+
18
+ it "has quota_definition" do
19
+ quota = fake(:quota_definition)
20
+ subject.quota_definition = quota
21
+ expect(subject.quota_definition).to eq(quota)
22
+ end
23
+
24
+ it "has billing_enabled" do
25
+ [true, false].each do |v|
26
+ subject.billing_enabled = v
27
+ expect(subject.billing_enabled).to eq(v)
28
+ end
14
29
  end
15
30
  end
@@ -0,0 +1,52 @@
1
+ require "spec_helper"
2
+
3
+ describe CFoundry::V2::QuotaDefinition do
4
+ let(:client) { fake_client }
5
+
6
+ subject { CFoundry::V2::QuotaDefinition.new("quota-definition-1", client) }
7
+
8
+ it "has guid" do
9
+ expect(subject.guid).to eq("quota-definition-1")
10
+ end
11
+
12
+ it "has name" do
13
+ subject.name = "name"
14
+ expect(subject.name).to eq("name")
15
+ end
16
+
17
+ it "has non_basic_services_allowed" do
18
+ [true, false].each do |v|
19
+ subject.non_basic_services_allowed = v
20
+ expect(subject.non_basic_services_allowed).to eq(v)
21
+ end
22
+ end
23
+
24
+ it "has total_services" do
25
+ [0, 1].each do |v|
26
+ subject.total_services = v
27
+ expect(subject.total_services).to eq(v)
28
+ end
29
+ end
30
+
31
+ it "has total_services" do
32
+ [0, 1].each do |v|
33
+ subject.total_services = v
34
+ expect(subject.total_services).to eq(v)
35
+ end
36
+ end
37
+
38
+ describe "querying" do
39
+ let(:foo) { fake(:quota_definition, :name => "foo") }
40
+ let(:bar) { fake(:quota_definition, :name => "bar") }
41
+ let(:baz) { fake(:quota_definition, :name => "baz") }
42
+
43
+ let(:quota_definitions) { [foo, bar, baz] }
44
+
45
+ let(:client) { fake_client :quota_definitions => quota_definitions }
46
+
47
+ it "is queryable by name" do
48
+ quota = quota_definitions.last
49
+ expect(client.quota_definition_by_name("bar")).to eq(bar)
50
+ end
51
+ end
52
+ end
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.6.1.rc3
4
+ version: 0.6.1.rc4
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-03-29 00:00:00.000000000 Z
13
+ date: 2013-04-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: multipart-post
@@ -225,6 +225,7 @@ files:
225
225
  - lib/cfoundry/v2/model.rb
226
226
  - lib/cfoundry/v2/model_magic.rb
227
227
  - lib/cfoundry/v2/organization.rb
228
+ - lib/cfoundry/v2/quota_definition.rb
228
229
  - lib/cfoundry/v2/route.rb
229
230
  - lib/cfoundry/v2/service.rb
230
231
  - lib/cfoundry/v2/service_auth_token.rb
@@ -270,7 +271,9 @@ files:
270
271
  - spec/cfoundry/v2/client_spec.rb
271
272
  - spec/cfoundry/v2/domain_spec.rb
272
273
  - spec/cfoundry/v2/model_magic_spec.rb
274
+ - spec/cfoundry/v2/model_spec.rb
273
275
  - spec/cfoundry/v2/organization_spec.rb
276
+ - spec/cfoundry/v2/quota_definition_spec.rb
274
277
  - spec/cfoundry/v2/space_spec.rb
275
278
  - spec/fakes/app_fake.rb
276
279
  - spec/fakes/domain_fake.rb
@@ -349,7 +352,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
349
352
  version: '0'
350
353
  segments:
351
354
  - 0
352
- hash: 808997924378056031
355
+ hash: 163727160375400133
353
356
  required_rubygems_version: !ruby/object:Gem::Requirement
354
357
  none: false
355
358
  requirements:
@@ -392,7 +395,9 @@ test_files:
392
395
  - spec/cfoundry/v2/client_spec.rb
393
396
  - spec/cfoundry/v2/domain_spec.rb
394
397
  - spec/cfoundry/v2/model_magic_spec.rb
398
+ - spec/cfoundry/v2/model_spec.rb
395
399
  - spec/cfoundry/v2/organization_spec.rb
400
+ - spec/cfoundry/v2/quota_definition_spec.rb
396
401
  - spec/cfoundry/v2/space_spec.rb
397
402
  - spec/fakes/app_fake.rb
398
403
  - spec/fakes/domain_fake.rb