cfoundry 0.3.46 → 0.3.47
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/baseclient.rb +105 -76
- data/lib/cfoundry/client.rb +1 -1
- data/lib/cfoundry/uaaclient.rb +24 -32
- data/lib/cfoundry/v1/base.rb +43 -47
- data/lib/cfoundry/v2/base.rb +41 -37
- data/lib/cfoundry/v2/client.rb +8 -5
- data/lib/cfoundry/v2/model.rb +4 -4
- data/lib/cfoundry/version.rb +1 -1
- metadata +8 -8
data/lib/cfoundry/baseclient.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require "
|
1
|
+
require "net/https"
|
2
|
+
require "net/http/post/multipart"
|
2
3
|
require "multi_json"
|
3
4
|
require "fileutils"
|
4
5
|
|
@@ -16,22 +17,9 @@ module CFoundry
|
|
16
17
|
@log = false
|
17
18
|
end
|
18
19
|
|
19
|
-
def request_path(method, path,
|
20
|
+
def request_path(method, path, options = {})
|
20
21
|
path = url(path) if path.is_a?(Array)
|
21
22
|
|
22
|
-
unless types.empty?
|
23
|
-
if params = types.delete(:params)
|
24
|
-
options[:params] = params
|
25
|
-
end
|
26
|
-
|
27
|
-
if types.size > 1
|
28
|
-
raise "request types must contain only one Content-Type => Accept"
|
29
|
-
end
|
30
|
-
|
31
|
-
options[:type] = types.keys.first
|
32
|
-
options[:accept] = types.values.first
|
33
|
-
end
|
34
|
-
|
35
23
|
request(method, path, options)
|
36
24
|
end
|
37
25
|
|
@@ -60,10 +48,20 @@ module CFoundry
|
|
60
48
|
end
|
61
49
|
|
62
50
|
def request(method, path, options = {})
|
51
|
+
request_uri(URI.parse(@target + path), method, options)
|
52
|
+
end
|
53
|
+
|
54
|
+
def request_uri(uri, method, options = {})
|
55
|
+
uri = URI.parse(@target + uri.to_s) unless uri.host
|
56
|
+
|
57
|
+
# keep original options in case there's a redirect to follow
|
58
|
+
original_options = options.dup
|
59
|
+
|
63
60
|
accept = options.delete(:accept)
|
64
|
-
|
61
|
+
content = options.delete(:content)
|
65
62
|
payload = options.delete(:payload)
|
66
63
|
params = options.delete(:params)
|
64
|
+
return_headers = options.delete(:return_headers)
|
67
65
|
|
68
66
|
headers = {}
|
69
67
|
headers["Authorization"] = @token if @token
|
@@ -73,12 +71,12 @@ module CFoundry
|
|
73
71
|
headers["Accept"] = accept_type
|
74
72
|
end
|
75
73
|
|
76
|
-
if content_type = mimetype(
|
74
|
+
if content_type = mimetype(content)
|
77
75
|
headers["Content-Type"] = content_type
|
78
76
|
end
|
79
77
|
|
80
78
|
unless payload.is_a?(String)
|
81
|
-
case
|
79
|
+
case content
|
82
80
|
when :json
|
83
81
|
payload = MultiJson.dump(payload)
|
84
82
|
when :form
|
@@ -86,35 +84,62 @@ module CFoundry
|
|
86
84
|
end
|
87
85
|
end
|
88
86
|
|
89
|
-
|
87
|
+
if payload.is_a?(String)
|
88
|
+
headers["Content-Length"] = payload.size
|
89
|
+
elsif !payload
|
90
|
+
headers["Content-Length"] = 0
|
91
|
+
end
|
90
92
|
|
91
93
|
headers.merge!(options[:headers]) if options[:headers]
|
92
94
|
|
93
95
|
if params
|
94
|
-
uri
|
95
|
-
|
96
|
+
if uri.query
|
97
|
+
uri.query += "&" + encode_params(params)
|
98
|
+
else
|
99
|
+
uri.query = encode_params(params)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
if payload && payload.is_a?(Hash)
|
104
|
+
multipart = method.const_get(:Multipart)
|
105
|
+
request = multipart.new(uri.request_uri, payload)
|
106
|
+
else
|
107
|
+
request = method.new(uri.request_uri)
|
108
|
+
request.body = payload if payload
|
96
109
|
end
|
97
110
|
|
98
|
-
|
99
|
-
|
100
|
-
req[:url] = @target + path
|
101
|
-
req[:headers] = headers
|
102
|
-
req[:payload] = payload
|
111
|
+
request["Authorization"] = @token if @token
|
112
|
+
request["Proxy-User"] = @proxy if @proxy
|
103
113
|
|
104
|
-
|
114
|
+
headers.each do |k, v|
|
115
|
+
request[k] = v
|
116
|
+
end
|
105
117
|
|
106
|
-
|
118
|
+
# TODO: test http proxies
|
119
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
120
|
+
|
121
|
+
if uri.is_a?(URI::HTTPS)
|
122
|
+
http.use_ssl = true
|
123
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
124
|
+
end
|
107
125
|
|
108
|
-
|
126
|
+
print_request(request) if @trace
|
127
|
+
|
128
|
+
before = Time.now
|
129
|
+
http.start do
|
130
|
+
response = http.request(request)
|
109
131
|
time = Time.now - before
|
110
132
|
|
111
|
-
|
133
|
+
print_response(response) if @trace
|
134
|
+
print_backtrace(caller) if @trace
|
135
|
+
|
112
136
|
log_request(time, request, response)
|
113
137
|
|
114
|
-
if
|
115
|
-
|
116
|
-
|
117
|
-
|
138
|
+
if return_headers
|
139
|
+
sane_headers(response)
|
140
|
+
elsif [Net::HTTP::Get, Net::HTTP::Head].include?(method) && \
|
141
|
+
response.is_a?(Net::HTTPRedirection)
|
142
|
+
request_uri(URI.parse(response["location"]), method, original_options)
|
118
143
|
else
|
119
144
|
handle_response(response, accept)
|
120
145
|
end
|
@@ -123,10 +148,10 @@ module CFoundry
|
|
123
148
|
raise TargetRefused, e.message
|
124
149
|
end
|
125
150
|
|
126
|
-
def mimetype(
|
127
|
-
case
|
151
|
+
def mimetype(content)
|
152
|
+
case content
|
128
153
|
when String
|
129
|
-
|
154
|
+
content
|
130
155
|
when :json
|
131
156
|
"application/json"
|
132
157
|
when :form
|
@@ -134,10 +159,8 @@ module CFoundry
|
|
134
159
|
when nil
|
135
160
|
nil
|
136
161
|
# return request headers (not really Accept)
|
137
|
-
when :headers
|
138
|
-
nil
|
139
162
|
else
|
140
|
-
raise "unknown mimetype #{
|
163
|
+
raise "unknown mimetype #{content.inspect}"
|
141
164
|
end
|
142
165
|
end
|
143
166
|
|
@@ -150,28 +173,26 @@ module CFoundry
|
|
150
173
|
end.join("&")
|
151
174
|
end
|
152
175
|
|
153
|
-
def
|
154
|
-
if path.last.is_a?(Hash)
|
155
|
-
types = path.pop
|
156
|
-
end
|
176
|
+
def request_with_options(method, path, options = {})
|
177
|
+
options.merge!(path.pop) if path.last.is_a?(Hash)
|
157
178
|
|
158
|
-
request_path(method, url(path),
|
179
|
+
request_path(method, url(path), options)
|
159
180
|
end
|
160
181
|
|
161
182
|
def get(*path)
|
162
|
-
|
183
|
+
request_with_options(Net::HTTP::Get, path)
|
163
184
|
end
|
164
185
|
|
165
186
|
def delete(*path)
|
166
|
-
|
187
|
+
request_with_options(Net::HTTP::Delete, path)
|
167
188
|
end
|
168
189
|
|
169
190
|
def post(payload, *path)
|
170
|
-
|
191
|
+
request_with_options(Net::HTTP::Post, path, :payload => payload)
|
171
192
|
end
|
172
193
|
|
173
194
|
def put(payload, *path)
|
174
|
-
|
195
|
+
request_with_options(Net::HTTP::Put, path, :payload => payload)
|
175
196
|
end
|
176
197
|
|
177
198
|
def url(segments)
|
@@ -188,12 +209,12 @@ module CFoundry
|
|
188
209
|
{ :time => time,
|
189
210
|
:request => {
|
190
211
|
:method => request.method,
|
191
|
-
:url => request.
|
192
|
-
:headers => request
|
212
|
+
:url => request.path,
|
213
|
+
:headers => sane_headers(request)
|
193
214
|
},
|
194
215
|
:response => {
|
195
216
|
:code => response.code,
|
196
|
-
:headers => response
|
217
|
+
:headers => sane_headers(response)
|
197
218
|
}
|
198
219
|
}
|
199
220
|
end
|
@@ -243,20 +264,22 @@ module CFoundry
|
|
243
264
|
end
|
244
265
|
end
|
245
266
|
|
246
|
-
def
|
267
|
+
def print_request(request)
|
247
268
|
$stderr.puts ">>>"
|
248
|
-
$stderr.puts "
|
249
|
-
$stderr.puts "REQUEST: #{request.method} #{request.url}"
|
250
|
-
$stderr.puts "RESPONSE_HEADERS:"
|
251
|
-
response.headers.each do |key, value|
|
252
|
-
$stderr.puts " #{key} : #{value}"
|
253
|
-
end
|
269
|
+
$stderr.puts "REQUEST: #{request.method} #{request.path}"
|
254
270
|
$stderr.puts "REQUEST_HEADERS:"
|
255
|
-
request.
|
256
|
-
$stderr.puts "
|
271
|
+
request.each_header do |key, value|
|
272
|
+
$stderr.puts " #{key} : #{value}"
|
257
273
|
end
|
258
|
-
$stderr.puts "REQUEST_BODY: #{request.
|
274
|
+
$stderr.puts "REQUEST_BODY: #{request.body}" if request.body
|
275
|
+
end
|
276
|
+
|
277
|
+
def print_response(response)
|
259
278
|
$stderr.puts "RESPONSE: [#{response.code}]"
|
279
|
+
$stderr.puts "RESPONSE_HEADERS:"
|
280
|
+
response.each_header do |key, value|
|
281
|
+
$stderr.puts " #{key} : #{value}"
|
282
|
+
end
|
260
283
|
begin
|
261
284
|
parsed_body = MultiJson.load(response.body)
|
262
285
|
$stderr.puts MultiJson.dump(parsed_body, :pretty => true)
|
@@ -264,7 +287,9 @@ module CFoundry
|
|
264
287
|
$stderr.puts "#{response.body}"
|
265
288
|
end
|
266
289
|
$stderr.puts "<<<"
|
290
|
+
end
|
267
291
|
|
292
|
+
def print_backtrace(locs)
|
268
293
|
return unless @backtrace
|
269
294
|
|
270
295
|
interesting_locs = locs.drop_while { |loc|
|
@@ -285,30 +310,34 @@ module CFoundry
|
|
285
310
|
end
|
286
311
|
|
287
312
|
def handle_response(response, accept)
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
if accept == :headers
|
293
|
-
return response.headers
|
294
|
-
end
|
295
|
-
|
296
|
-
if json
|
297
|
-
if response.code == 204
|
313
|
+
case response
|
314
|
+
when Net::HTTPSuccess, Net::HTTPRedirection
|
315
|
+
if accept == :json
|
316
|
+
if response.is_a?(Net::HTTPNoContent)
|
298
317
|
raise "Expected JSON response, got 204 No Content"
|
299
318
|
end
|
300
319
|
|
301
|
-
parse_json(response)
|
320
|
+
parse_json(response.body)
|
302
321
|
else
|
303
|
-
response
|
322
|
+
response.body
|
304
323
|
end
|
305
324
|
|
306
|
-
when
|
325
|
+
when Net::HTTPNotFound
|
307
326
|
raise CFoundry::NotFound
|
308
327
|
|
309
328
|
else
|
310
|
-
raise CFoundry::BadResponse.new(response.code, response)
|
329
|
+
raise CFoundry::BadResponse.new(response.code, response.body)
|
311
330
|
end
|
312
331
|
end
|
332
|
+
|
333
|
+
def sane_headers(obj)
|
334
|
+
hds = {}
|
335
|
+
|
336
|
+
obj.each_header do |k, v|
|
337
|
+
hds[k] = v
|
338
|
+
end
|
339
|
+
|
340
|
+
hds
|
341
|
+
end
|
313
342
|
end
|
314
343
|
end
|
data/lib/cfoundry/client.rb
CHANGED
data/lib/cfoundry/uaaclient.rb
CHANGED
@@ -13,7 +13,7 @@ module CFoundry
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def prompts
|
16
|
-
get("login",
|
16
|
+
get("login", :accept => :json)[:prompts]
|
17
17
|
end
|
18
18
|
|
19
19
|
def authorize(credentials)
|
@@ -27,12 +27,14 @@ module CFoundry
|
|
27
27
|
post(
|
28
28
|
{ :credentials => credentials },
|
29
29
|
"oauth", "authorize",
|
30
|
-
:
|
31
|
-
:
|
30
|
+
:return_headers => true,
|
31
|
+
:content => :form,
|
32
|
+
:accept => :json,
|
33
|
+
:params => query)["location"])
|
32
34
|
end
|
33
35
|
|
34
36
|
def users
|
35
|
-
get("Users",
|
37
|
+
get("Users", :accept => :json)
|
36
38
|
end
|
37
39
|
|
38
40
|
def change_password(guid, new, old)
|
@@ -42,54 +44,44 @@ module CFoundry
|
|
42
44
|
:oldPassword => old
|
43
45
|
},
|
44
46
|
"User", guid, "password",
|
45
|
-
:
|
47
|
+
:content => :json)
|
46
48
|
end
|
47
49
|
|
48
50
|
private
|
49
51
|
|
50
52
|
def handle_response(response, accept)
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
if accept == :headers
|
56
|
-
return response.headers
|
57
|
-
end
|
58
|
-
|
59
|
-
if json
|
60
|
-
if response.code == 204
|
53
|
+
case response
|
54
|
+
when Net::HTTPSuccess, Net::HTTPRedirection
|
55
|
+
if accept == :json
|
56
|
+
if response.is_a?(Net::HTTPNoContent)
|
61
57
|
raise "Expected JSON response, got 204 No Content"
|
62
58
|
end
|
63
59
|
|
64
|
-
parse_json(response)
|
60
|
+
parse_json(response.body)
|
65
61
|
else
|
66
|
-
response
|
62
|
+
response.body
|
67
63
|
end
|
68
64
|
|
69
|
-
when
|
70
|
-
info = parse_json(response)
|
71
|
-
raise Denied.new(
|
72
|
-
|
73
|
-
when 401
|
74
|
-
info = parse_json(response)
|
75
|
-
raise Denied.new(401, info[:error_description])
|
65
|
+
when Net::HTTPBadRequest, Net::HTTPUnauthorized, Net::HTTPForbidden
|
66
|
+
info = parse_json(response.body)
|
67
|
+
raise Denied.new(response.code, info[:error_description])
|
76
68
|
|
77
|
-
when
|
69
|
+
when Net::HTTPNotFound
|
78
70
|
raise NotFound
|
79
71
|
|
80
|
-
when
|
81
|
-
info = parse_json(response)
|
82
|
-
raise CFoundry::Denied.new(
|
72
|
+
when Net::HTTPConflict
|
73
|
+
info = parse_json(response.body)
|
74
|
+
raise CFoundry::Denied.new(response.code, info[:message])
|
83
75
|
|
84
|
-
when
|
76
|
+
when Net::HTTPServerError
|
85
77
|
begin
|
86
|
-
raise_error(parse_json(response))
|
78
|
+
raise_error(parse_json(response.body))
|
87
79
|
rescue MultiJson::DecodeError
|
88
|
-
raise BadResponse.new(response.code, response)
|
80
|
+
raise BadResponse.new(response.code, response.body)
|
89
81
|
end
|
90
82
|
|
91
83
|
else
|
92
|
-
raise BadResponse.new(response.code, response)
|
84
|
+
raise BadResponse.new(response.code, response.body)
|
93
85
|
end
|
94
86
|
end
|
95
87
|
|
data/lib/cfoundry/v1/base.rb
CHANGED
@@ -34,62 +34,63 @@ module CFoundry::V1
|
|
34
34
|
|
35
35
|
# Cloud metadata
|
36
36
|
def info
|
37
|
-
get("info",
|
37
|
+
get("info", :accept => :json)
|
38
38
|
end
|
39
39
|
|
40
40
|
def system_services
|
41
|
-
get("info", "services",
|
41
|
+
get("info", "services", :accept => :json)
|
42
42
|
end
|
43
43
|
|
44
44
|
def system_runtimes
|
45
|
-
get("info", "runtimes",
|
45
|
+
get("info", "runtimes", :accept => :json)
|
46
46
|
end
|
47
47
|
|
48
48
|
# Users
|
49
49
|
def users
|
50
|
-
get("users",
|
50
|
+
get("users", :accept => :json)
|
51
51
|
end
|
52
52
|
|
53
53
|
def create_user(payload)
|
54
|
-
post(payload, "users", :
|
54
|
+
post(payload, "users", :content => :json)
|
55
55
|
end
|
56
56
|
|
57
57
|
def user(email)
|
58
|
-
get("users", email,
|
58
|
+
get("users", email, :accept => :json)
|
59
59
|
end
|
60
60
|
|
61
61
|
def delete_user(email)
|
62
|
-
delete("users", email,
|
62
|
+
delete("users", email, :accept => :json)
|
63
63
|
true
|
64
64
|
end
|
65
65
|
|
66
66
|
def update_user(email, payload)
|
67
|
-
put(payload, "users", email, :
|
67
|
+
put(payload, "users", email, :content => :json)
|
68
68
|
end
|
69
69
|
|
70
70
|
def create_token(payload, email)
|
71
|
-
post(payload, "users", email, "tokens",
|
71
|
+
post(payload, "users", email, "tokens",
|
72
|
+
:content => :json, :accept => :json)
|
72
73
|
end
|
73
74
|
|
74
75
|
# Applications
|
75
76
|
def apps
|
76
|
-
get("apps",
|
77
|
+
get("apps", :accept => :json)
|
77
78
|
end
|
78
79
|
|
79
80
|
def create_app(payload)
|
80
|
-
post(payload, "apps", :json => :json)
|
81
|
+
post(payload, "apps", :content => :json, :accept => :json)
|
81
82
|
end
|
82
83
|
|
83
84
|
def app(name)
|
84
|
-
get("apps", name,
|
85
|
+
get("apps", name, :accept => :json)
|
85
86
|
end
|
86
87
|
|
87
88
|
def instances(name)
|
88
|
-
get("apps", name, "instances",
|
89
|
+
get("apps", name, "instances", :accept => :json)[:instances]
|
89
90
|
end
|
90
91
|
|
91
92
|
def crashes(name)
|
92
|
-
get("apps", name, "crashes",
|
93
|
+
get("apps", name, "crashes", :accept => :json)[:crashes]
|
93
94
|
end
|
94
95
|
|
95
96
|
def files(name, instance, *path)
|
@@ -98,7 +99,7 @@ module CFoundry::V1
|
|
98
99
|
alias :file :files
|
99
100
|
|
100
101
|
def update_app(name, payload)
|
101
|
-
put(payload, "apps", name, :
|
102
|
+
put(payload, "apps", name, :content => :json)
|
102
103
|
end
|
103
104
|
|
104
105
|
def delete_app(name)
|
@@ -107,86 +108,81 @@ module CFoundry::V1
|
|
107
108
|
end
|
108
109
|
|
109
110
|
def stats(name)
|
110
|
-
get("apps", name, "stats",
|
111
|
+
get("apps", name, "stats", :accept => :json)
|
111
112
|
end
|
112
113
|
|
113
114
|
def check_resources(fingerprints)
|
114
|
-
post(fingerprints, "resources", :json => :json)
|
115
|
+
post(fingerprints, "resources", :content => :json, :accept => :json)
|
115
116
|
end
|
116
117
|
|
117
118
|
def upload_app(name, zipfile, resources = [])
|
118
119
|
payload = {
|
119
120
|
:_method => "put",
|
120
121
|
:resources => MultiJson.dump(resources),
|
121
|
-
:multipart => true,
|
122
122
|
:application =>
|
123
|
-
|
124
|
-
zipfile
|
125
|
-
|
126
|
-
|
127
|
-
|
123
|
+
UploadIO.new(
|
124
|
+
if zipfile.is_a? File
|
125
|
+
zipfile
|
126
|
+
elsif zipfile.is_a? String
|
127
|
+
File.new(zipfile, "rb")
|
128
|
+
end,
|
129
|
+
"application/zip")
|
128
130
|
}
|
129
131
|
|
130
132
|
post(payload, "apps", name, "application")
|
131
|
-
rescue
|
133
|
+
rescue EOFError
|
132
134
|
retry
|
133
135
|
end
|
134
136
|
|
135
137
|
# Services
|
136
138
|
def services
|
137
|
-
get("services",
|
139
|
+
get("services", :accept => :json)
|
138
140
|
end
|
139
141
|
|
140
142
|
def create_service(manifest)
|
141
|
-
post(manifest, "services", :json => :json)
|
143
|
+
post(manifest, "services", :content => :json, :accept => :json)
|
142
144
|
end
|
143
145
|
|
144
146
|
def service(name)
|
145
|
-
get("services", name,
|
147
|
+
get("services", name, :accept => :json)
|
146
148
|
end
|
147
149
|
|
148
150
|
def delete_service(name)
|
149
|
-
delete("services", name,
|
151
|
+
delete("services", name, :accept => :json)
|
150
152
|
true
|
151
153
|
end
|
152
154
|
|
153
155
|
private
|
154
156
|
|
155
157
|
def handle_response(response, accept)
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
if accept == :headers
|
161
|
-
return response.headers
|
162
|
-
end
|
163
|
-
|
164
|
-
if json
|
165
|
-
if response.code == 204
|
158
|
+
case response
|
159
|
+
when Net::HTTPSuccess, Net::HTTPRedirection
|
160
|
+
if accept == :json
|
161
|
+
if response.is_a?(Net::HTTPNoContent)
|
166
162
|
raise "Expected JSON response, got 204 No Content"
|
167
163
|
end
|
168
164
|
|
169
|
-
parse_json(response)
|
165
|
+
parse_json(response.body)
|
170
166
|
else
|
171
|
-
response
|
167
|
+
response.body
|
172
168
|
end
|
173
169
|
|
174
|
-
when
|
175
|
-
info = parse_json(response)
|
170
|
+
when Net::HTTPBadRequest, Net::HTTPForbidden
|
171
|
+
info = parse_json(response.body)
|
176
172
|
raise CFoundry::Denied.new(403, info[:description])
|
177
173
|
|
178
|
-
when
|
174
|
+
when Net::HTTPNotFound
|
179
175
|
raise CFoundry::NotFound
|
180
176
|
|
181
|
-
when
|
177
|
+
when Net::HTTPServerError
|
182
178
|
begin
|
183
|
-
raise_error(parse_json(response))
|
179
|
+
raise_error(parse_json(response.body))
|
184
180
|
rescue MultiJson::DecodeError
|
185
|
-
raise CFoundry::BadResponse.new(response.code, response)
|
181
|
+
raise CFoundry::BadResponse.new(response.code, response.body)
|
186
182
|
end
|
187
183
|
|
188
184
|
else
|
189
|
-
raise CFoundry::BadResponse.new(response.code, response)
|
185
|
+
raise CFoundry::BadResponse.new(response.code, response.body)
|
190
186
|
end
|
191
187
|
end
|
192
188
|
|
data/lib/cfoundry/v2/base.rb
CHANGED
@@ -35,7 +35,7 @@ module CFoundry::V2
|
|
35
35
|
|
36
36
|
# Cloud metadata
|
37
37
|
def info
|
38
|
-
get("info",
|
38
|
+
get("info", :accept => :json)
|
39
39
|
end
|
40
40
|
|
41
41
|
|
@@ -51,11 +51,11 @@ module CFoundry::V2
|
|
51
51
|
|
52
52
|
params = { :"inline-relations-depth" => depth }
|
53
53
|
|
54
|
-
get("v2", plural, guid,
|
54
|
+
get("v2", plural, guid, :accept => :json, :params => params)
|
55
55
|
end
|
56
56
|
|
57
57
|
define_method(:"create_#{obj}") do |payload|
|
58
|
-
post(payload, "v2", plural, :json => :json)
|
58
|
+
post(payload, "v2", plural, :content => :json, :accept => :json)
|
59
59
|
end
|
60
60
|
|
61
61
|
define_method(:"delete_#{obj}") do |guid|
|
@@ -64,34 +64,38 @@ module CFoundry::V2
|
|
64
64
|
end
|
65
65
|
|
66
66
|
define_method(:"update_#{obj}") do |guid, payload|
|
67
|
-
put(payload, "v2", plural, guid, :json => :json)
|
67
|
+
put(payload, "v2", plural, guid, :content => :json, :accept => :json)
|
68
68
|
end
|
69
69
|
|
70
70
|
define_method(plural) do |*args|
|
71
|
+
params = params_from(args)
|
72
|
+
|
71
73
|
all_pages(
|
72
|
-
|
74
|
+
params,
|
75
|
+
get("v2", plural, :accept => :json, :params => params))
|
73
76
|
end
|
74
|
-
|
75
77
|
end
|
76
78
|
|
77
79
|
def resource_match(fingerprints)
|
78
|
-
put(fingerprints, "v2", "resource_match",
|
80
|
+
put(fingerprints, "v2", "resource_match",
|
81
|
+
:content => :json, :accept => :json)
|
79
82
|
end
|
80
83
|
|
81
84
|
def upload_app(guid, zipfile, resources = [])
|
82
85
|
payload = {
|
83
86
|
:resources => MultiJson.dump(resources),
|
84
|
-
:multipart => true,
|
85
87
|
:application =>
|
86
|
-
|
87
|
-
zipfile
|
88
|
-
|
89
|
-
|
90
|
-
|
88
|
+
UploadIO.new(
|
89
|
+
if zipfile.is_a? File
|
90
|
+
zipfile
|
91
|
+
elsif zipfile.is_a? String
|
92
|
+
File.new(zipfile, "rb")
|
93
|
+
end,
|
94
|
+
"application/zip")
|
91
95
|
}
|
92
96
|
|
93
97
|
put(payload, "v2", "apps", guid, "bits")
|
94
|
-
rescue
|
98
|
+
rescue EOFError
|
95
99
|
retry
|
96
100
|
end
|
97
101
|
|
@@ -101,15 +105,15 @@ module CFoundry::V2
|
|
101
105
|
alias :file :files
|
102
106
|
|
103
107
|
def instances(guid)
|
104
|
-
get("v2", "apps", guid, "instances",
|
108
|
+
get("v2", "apps", guid, "instances", :accept => :json)
|
105
109
|
end
|
106
110
|
|
107
111
|
def crashes(guid)
|
108
|
-
get("v2", "apps", guid, "crashes",
|
112
|
+
get("v2", "apps", guid, "crashes", :accept => :json)
|
109
113
|
end
|
110
114
|
|
111
115
|
def stats(guid)
|
112
|
-
get("v2", "apps", guid, "stats",
|
116
|
+
get("v2", "apps", guid, "stats", :accept => :json)
|
113
117
|
end
|
114
118
|
|
115
119
|
|
@@ -126,11 +130,13 @@ module CFoundry::V2
|
|
126
130
|
params
|
127
131
|
end
|
128
132
|
|
129
|
-
def all_pages(paginated)
|
133
|
+
def all_pages(params, paginated)
|
130
134
|
payload = paginated[:resources]
|
131
135
|
|
132
136
|
while next_page = paginated[:next_url]
|
133
|
-
paginated = request_path(
|
137
|
+
paginated = request_path(
|
138
|
+
Net::HTTP::Get, next_page, :accept => :json, :params => params)
|
139
|
+
|
134
140
|
payload += paginated[:resources]
|
135
141
|
end
|
136
142
|
|
@@ -140,45 +146,43 @@ module CFoundry::V2
|
|
140
146
|
private
|
141
147
|
|
142
148
|
def handle_response(response, accept)
|
143
|
-
|
144
|
-
|
145
|
-
case response.code
|
146
|
-
when 200, 201, 204, 301, 302, 307
|
149
|
+
case response
|
150
|
+
when Net::HTTPSuccess, Net::HTTPRedirection
|
147
151
|
if accept == :headers
|
148
|
-
return response
|
152
|
+
return sane_headers(response)
|
149
153
|
end
|
150
154
|
|
151
|
-
if json
|
152
|
-
if response.
|
155
|
+
if accept == :json
|
156
|
+
if response.is_a?(Net::HTTPNoContent)
|
153
157
|
raise "Expected JSON response, got 204 No Content"
|
154
158
|
end
|
155
159
|
|
156
|
-
parse_json(response)
|
160
|
+
parse_json(response.body)
|
157
161
|
else
|
158
|
-
response
|
162
|
+
response.body
|
159
163
|
end
|
160
164
|
|
161
|
-
when
|
162
|
-
info = parse_json(response)
|
165
|
+
when Net::HTTPBadRequest
|
166
|
+
info = parse_json(response.body)
|
163
167
|
raise CFoundry::APIError.new(info[:code], info[:description])
|
164
168
|
|
165
|
-
when
|
166
|
-
info = parse_json(response)
|
169
|
+
when Net::HTTPUnauthorized, Net::HTTPForbidden
|
170
|
+
info = parse_json(response.body)
|
167
171
|
raise CFoundry::Denied.new(info[:code], info[:description])
|
168
172
|
|
169
|
-
when
|
173
|
+
when Net::HTTPNotFound
|
170
174
|
raise CFoundry::NotFound
|
171
175
|
|
172
|
-
when
|
176
|
+
when Net::HTTPServerError
|
173
177
|
begin
|
174
|
-
info = parse_json(response)
|
178
|
+
info = parse_json(response.body)
|
175
179
|
raise CFoundry::APIError.new(info[:code], info[:description])
|
176
180
|
rescue MultiJson::DecodeError
|
177
|
-
raise CFoundry::BadResponse.new(response.code, response)
|
181
|
+
raise CFoundry::BadResponse.new(response.code, response.body)
|
178
182
|
end
|
179
183
|
|
180
184
|
else
|
181
|
-
raise CFoundry::BadResponse.new(response.code, response)
|
185
|
+
raise CFoundry::BadResponse.new(response.code, response.body)
|
182
186
|
end
|
183
187
|
end
|
184
188
|
|
data/lib/cfoundry/v2/client.rb
CHANGED
@@ -212,19 +212,22 @@ module CFoundry::V2
|
|
212
212
|
send(
|
213
213
|
:"make_#{singular}",
|
214
214
|
@base.request_path(
|
215
|
-
|
215
|
+
Net::HTTP::Get,
|
216
216
|
path,
|
217
|
-
|
217
|
+
:accept => :json,
|
218
218
|
:params => @base.params_from(args)))
|
219
219
|
end
|
220
220
|
|
221
221
|
define_method(:"#{plural}_from") do |path, *args|
|
222
|
+
params = @base.params_from(args)
|
223
|
+
|
222
224
|
objs = @base.all_pages(
|
225
|
+
params,
|
223
226
|
@base.request_path(
|
224
|
-
|
227
|
+
Net::HTTP::Get,
|
225
228
|
path,
|
226
|
-
|
227
|
-
:params =>
|
229
|
+
:accept => :json,
|
230
|
+
:params => params))
|
228
231
|
|
229
232
|
objs.collect do |json|
|
230
233
|
send(:"make_#{singular}", json)
|
data/lib/cfoundry/v2/model.rb
CHANGED
@@ -145,9 +145,9 @@ module CFoundry::V2
|
|
145
145
|
Model.validate_type(x, CFoundry::V2.const_get(kls))
|
146
146
|
|
147
147
|
@client.base.request_path(
|
148
|
-
|
148
|
+
Net::HTTP::Put,
|
149
149
|
["v2", "#{object_name}s", @guid, plural, x.guid],
|
150
|
-
|
150
|
+
:accept => :json)
|
151
151
|
}
|
152
152
|
|
153
153
|
define_method(:"remove_#{singular}") { |x|
|
@@ -155,9 +155,9 @@ module CFoundry::V2
|
|
155
155
|
Model.validate_type(x, CFoundry::V2.const_get(kls))
|
156
156
|
|
157
157
|
@client.base.request_path(
|
158
|
-
|
158
|
+
Net::HTTP::Delete,
|
159
159
|
["v2", "#{object_name}s", @guid, plural, x.guid],
|
160
|
-
|
160
|
+
:accept => :json)
|
161
161
|
}
|
162
162
|
|
163
163
|
define_method(:"#{plural}=") { |xs|
|
data/lib/cfoundry/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfoundry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 77
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 47
|
10
|
+
version: 0.3.47
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Alex Suraci
|
@@ -15,22 +15,22 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-10-
|
18
|
+
date: 2012-10-19 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: multipart-post
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
26
26
|
- - ~>
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
hash:
|
28
|
+
hash: 19
|
29
29
|
segments:
|
30
30
|
- 1
|
31
|
-
- 6
|
32
31
|
- 1
|
33
|
-
|
32
|
+
- 0
|
33
|
+
version: 1.1.0
|
34
34
|
type: :runtime
|
35
35
|
version_requirements: *id001
|
36
36
|
- !ruby/object:Gem::Dependency
|