cfoundry 0.4.8 → 0.4.9
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/cfoundry/chatty_hash.rb +8 -0
- data/lib/cfoundry/client.rb +9 -2
- data/lib/cfoundry/upload_helpers.rb +73 -14
- data/lib/cfoundry/v1/app.rb +78 -292
- data/lib/cfoundry/v1/base.rb +3 -61
- data/lib/cfoundry/v1/client.rb +14 -74
- data/lib/cfoundry/v1/model.rb +153 -0
- data/lib/cfoundry/v1/model_magic.rb +114 -0
- data/lib/cfoundry/v1/service_instance.rb +18 -98
- data/lib/cfoundry/v1/user.rb +8 -79
- data/lib/cfoundry/v2/app.rb +0 -58
- data/lib/cfoundry/v2/model.rb +2 -1
- data/lib/cfoundry/v2/model_magic.rb +20 -52
- data/lib/cfoundry/validator.rb +37 -0
- data/lib/cfoundry/version.rb +1 -1
- metadata +35 -30
data/lib/cfoundry/v1/base.rb
CHANGED
@@ -7,6 +7,8 @@ require "cfoundry/errors"
|
|
7
7
|
|
8
8
|
module CFoundry::V1
|
9
9
|
class Base < CFoundry::BaseClient
|
10
|
+
include BaseClientMethods
|
11
|
+
|
10
12
|
attr_accessor :target, :token, :proxy, :trace, :backtrace, :log
|
11
13
|
|
12
14
|
def initialize(
|
@@ -46,45 +48,12 @@ module CFoundry::V1
|
|
46
48
|
end
|
47
49
|
|
48
50
|
# Users
|
49
|
-
def users
|
50
|
-
get("users", :accept => :json)
|
51
|
-
end
|
52
|
-
|
53
|
-
def create_user(payload)
|
54
|
-
post(payload, "users", :content => :json)
|
55
|
-
end
|
56
|
-
|
57
|
-
def user(email)
|
58
|
-
get("users", email, :accept => :json)
|
59
|
-
end
|
60
|
-
|
61
|
-
def delete_user(email)
|
62
|
-
delete("users", email, :accept => :json)
|
63
|
-
true
|
64
|
-
end
|
65
|
-
|
66
|
-
def update_user(email, payload)
|
67
|
-
put(payload, "users", email, :content => :json)
|
68
|
-
end
|
69
|
-
|
70
51
|
def create_token(payload, email)
|
71
52
|
post(payload, "users", email, "tokens",
|
72
53
|
:content => :json, :accept => :json)
|
73
54
|
end
|
74
55
|
|
75
56
|
# Applications
|
76
|
-
def apps
|
77
|
-
get("apps", :accept => :json)
|
78
|
-
end
|
79
|
-
|
80
|
-
def create_app(payload)
|
81
|
-
post(payload, "apps", :content => :json, :accept => :json)
|
82
|
-
end
|
83
|
-
|
84
|
-
def app(name)
|
85
|
-
get("apps", name, :accept => :json)
|
86
|
-
end
|
87
|
-
|
88
57
|
def instances(name)
|
89
58
|
get("apps", name, "instances", :accept => :json)[:instances]
|
90
59
|
end
|
@@ -98,20 +67,11 @@ module CFoundry::V1
|
|
98
67
|
end
|
99
68
|
alias :file :files
|
100
69
|
|
101
|
-
def update_app(name, payload)
|
102
|
-
put(payload, "apps", name, :content => :json)
|
103
|
-
end
|
104
|
-
|
105
|
-
def delete_app(name)
|
106
|
-
delete("apps", name)
|
107
|
-
true
|
108
|
-
end
|
109
|
-
|
110
70
|
def stats(name)
|
111
71
|
get("apps", name, "stats", :accept => :json)
|
112
72
|
end
|
113
73
|
|
114
|
-
def
|
74
|
+
def resource_match(fingerprints)
|
115
75
|
post(fingerprints, "resources", :content => :json, :accept => :json)
|
116
76
|
end
|
117
77
|
|
@@ -134,24 +94,6 @@ module CFoundry::V1
|
|
134
94
|
retry
|
135
95
|
end
|
136
96
|
|
137
|
-
# Services
|
138
|
-
def services
|
139
|
-
get("services", :accept => :json)
|
140
|
-
end
|
141
|
-
|
142
|
-
def create_service(manifest)
|
143
|
-
post(manifest, "services", :content => :json, :accept => :json)
|
144
|
-
end
|
145
|
-
|
146
|
-
def service(name)
|
147
|
-
get("services", name, :accept => :json)
|
148
|
-
end
|
149
|
-
|
150
|
-
def delete_service(name)
|
151
|
-
delete("services", name, :accept => :json)
|
152
|
-
true
|
153
|
-
end
|
154
|
-
|
155
97
|
private
|
156
98
|
|
157
99
|
def handle_response(response, accept)
|
data/lib/cfoundry/v1/client.rb
CHANGED
@@ -1,15 +1,10 @@
|
|
1
|
-
require "cfoundry/v1/base"
|
2
|
-
require "cfoundry/v1/app"
|
3
|
-
require "cfoundry/v1/service"
|
4
|
-
require "cfoundry/v1/service_instance"
|
5
|
-
require "cfoundry/v1/user"
|
6
|
-
|
7
|
-
|
8
1
|
module CFoundry::V1
|
9
2
|
# The primary API entrypoint. Wraps a BaseClient to provide nicer return
|
10
3
|
# values. Initialize with the target and, optionally, an auth token. These
|
11
4
|
# are the only two internal states.
|
12
5
|
class Client
|
6
|
+
include ClientMethods
|
7
|
+
|
13
8
|
attr_reader :base
|
14
9
|
|
15
10
|
# Create a new Client for interfacing with the given target.
|
@@ -93,7 +88,7 @@ module CFoundry::V1
|
|
93
88
|
end
|
94
89
|
|
95
90
|
# Retrieve available services.
|
96
|
-
def services(
|
91
|
+
def services(options = {})
|
97
92
|
services = []
|
98
93
|
|
99
94
|
@base.system_services.each do |type, vendors|
|
@@ -105,7 +100,7 @@ module CFoundry::V1
|
|
105
100
|
|
106
101
|
services <<
|
107
102
|
Service.new(vendor.to_s, ver.to_s, meta[:description],
|
108
|
-
type, provider.to_s, state && state.first)
|
103
|
+
type.to_s, provider.to_s, state && state.first)
|
109
104
|
end
|
110
105
|
end
|
111
106
|
end
|
@@ -116,7 +111,7 @@ module CFoundry::V1
|
|
116
111
|
end
|
117
112
|
|
118
113
|
# Retrieve available runtimes.
|
119
|
-
def runtimes(
|
114
|
+
def runtimes(options = {})
|
120
115
|
runtimes = []
|
121
116
|
|
122
117
|
@base.system_runtimes.each do |name, meta|
|
@@ -127,12 +122,16 @@ module CFoundry::V1
|
|
127
122
|
runtimes
|
128
123
|
end
|
129
124
|
|
125
|
+
def runtime(name)
|
126
|
+
Runtime.new(name)
|
127
|
+
end
|
128
|
+
|
130
129
|
def runtime_by_name(name)
|
131
130
|
runtimes.find { |r| r.name == name }
|
132
131
|
end
|
133
132
|
|
134
133
|
# Retrieve available frameworks.
|
135
|
-
def frameworks(
|
134
|
+
def frameworks(options = {})
|
136
135
|
fs = info[:frameworks]
|
137
136
|
return unless fs
|
138
137
|
|
@@ -149,28 +148,12 @@ module CFoundry::V1
|
|
149
148
|
frameworks
|
150
149
|
end
|
151
150
|
|
152
|
-
def
|
153
|
-
|
151
|
+
def framework(name)
|
152
|
+
Framework.new(name)
|
154
153
|
end
|
155
154
|
|
156
|
-
|
157
|
-
|
158
|
-
@base.users.collect do |json|
|
159
|
-
User.new(
|
160
|
-
json[:email],
|
161
|
-
self,
|
162
|
-
{ :email => json[:email],
|
163
|
-
:admin => json[:admin] })
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
# Construct a User object. The return value is lazy, and no requests are
|
168
|
-
# made from this alone.
|
169
|
-
#
|
170
|
-
# This should be used for both user creation (after calling User#create!)
|
171
|
-
# and retrieval.
|
172
|
-
def user(email)
|
173
|
-
User.new(email, self)
|
155
|
+
def framework_by_name(name)
|
156
|
+
frameworks.find { |f| f.name == name }
|
174
157
|
end
|
175
158
|
|
176
159
|
# Create a user on the target and return a User object representing them.
|
@@ -217,48 +200,5 @@ module CFoundry::V1
|
|
217
200
|
def logged_in?
|
218
201
|
!!@base.token
|
219
202
|
end
|
220
|
-
|
221
|
-
|
222
|
-
# Retreive all of the current user's applications.
|
223
|
-
def apps(depth = 1, query = {})
|
224
|
-
@base.apps.collect do |json|
|
225
|
-
App.new(json[:name], self, json)
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
# Construct an App object. The return value is lazy, and no requests are
|
230
|
-
# made from this method alone.
|
231
|
-
#
|
232
|
-
# This should be used for both app creation (after calling App#create!)
|
233
|
-
# and retrieval.
|
234
|
-
def app(name = nil)
|
235
|
-
App.new(name, self)
|
236
|
-
end
|
237
|
-
|
238
|
-
def app_by_name(name)
|
239
|
-
app = app(name)
|
240
|
-
app if app.exists?
|
241
|
-
end
|
242
|
-
|
243
|
-
# Retrieve all of the current user's services.
|
244
|
-
def service_instances(depth = 1, query = {})
|
245
|
-
@base.services.collect do |json|
|
246
|
-
ServiceInstance.new(json[:name], self, json)
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
# Construct a Service object. The return value is lazy, and no requests are
|
251
|
-
# made from this method alone.
|
252
|
-
#
|
253
|
-
# This should be used for both service creation (after calling
|
254
|
-
# Service#create!) and retrieval.
|
255
|
-
def service_instance(name = nil)
|
256
|
-
ServiceInstance.new(name, self)
|
257
|
-
end
|
258
|
-
|
259
|
-
def service_instance_by_name(name)
|
260
|
-
service = service_instance(name)
|
261
|
-
service if service.exists?
|
262
|
-
end
|
263
203
|
end
|
264
204
|
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
require "multi_json"
|
2
|
+
|
3
|
+
require "cfoundry/v1/model_magic"
|
4
|
+
|
5
|
+
|
6
|
+
module CFoundry::V1
|
7
|
+
class Model
|
8
|
+
extend ModelMagic
|
9
|
+
|
10
|
+
class << self
|
11
|
+
attr_writer :object_name, :base_object_name
|
12
|
+
|
13
|
+
def object_name
|
14
|
+
@object_name ||=
|
15
|
+
name.split("::").last.gsub(
|
16
|
+
/([a-z])([A-Z])/,
|
17
|
+
'\1_\2').downcase.to_sym
|
18
|
+
end
|
19
|
+
|
20
|
+
def base_object_name
|
21
|
+
@base_object_name ||= object_name
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_accessor :guid, :changes
|
26
|
+
|
27
|
+
def initialize(guid, client, manifest = nil)
|
28
|
+
@guid = guid
|
29
|
+
@client = client
|
30
|
+
@manifest = manifest
|
31
|
+
@changes = {}
|
32
|
+
end
|
33
|
+
|
34
|
+
def manifest
|
35
|
+
@manifest ||= @client.base.send(base_object_name, @guid)
|
36
|
+
end
|
37
|
+
|
38
|
+
def changed?
|
39
|
+
!@changes.empty?
|
40
|
+
end
|
41
|
+
|
42
|
+
def inspect
|
43
|
+
"\#<#{self.class.name} '#@guid'>"
|
44
|
+
end
|
45
|
+
|
46
|
+
def object_name
|
47
|
+
@object_name ||= self.class.object_name
|
48
|
+
end
|
49
|
+
|
50
|
+
def base_object_name
|
51
|
+
@base_object_name ||= self.class.base_object_name
|
52
|
+
end
|
53
|
+
|
54
|
+
def guid_name
|
55
|
+
self.class.guid_name
|
56
|
+
end
|
57
|
+
|
58
|
+
def invalidate!
|
59
|
+
@manifest = nil
|
60
|
+
@changes = {}
|
61
|
+
end
|
62
|
+
|
63
|
+
def create!
|
64
|
+
@manifest = @client.base.send(:"create_#{base_object_name}", write_manifest)
|
65
|
+
|
66
|
+
@guid = read_manifest[guid_name]
|
67
|
+
|
68
|
+
true
|
69
|
+
end
|
70
|
+
|
71
|
+
def update!
|
72
|
+
@client.base.send(:"update_#{base_object_name}", @guid, write_manifest)
|
73
|
+
|
74
|
+
invalidate!
|
75
|
+
|
76
|
+
true
|
77
|
+
end
|
78
|
+
|
79
|
+
def delete!
|
80
|
+
@client.base.send(:"delete_#{base_object_name}", @guid)
|
81
|
+
|
82
|
+
@guid = nil
|
83
|
+
|
84
|
+
true
|
85
|
+
end
|
86
|
+
|
87
|
+
def exists?
|
88
|
+
invalidate!
|
89
|
+
manifest
|
90
|
+
true
|
91
|
+
rescue CFoundry::NotFound
|
92
|
+
false
|
93
|
+
end
|
94
|
+
|
95
|
+
def read_manifest
|
96
|
+
read = {}
|
97
|
+
|
98
|
+
self.class.read_locations.each do |name, where|
|
99
|
+
found, val = find_path(manifest, where)
|
100
|
+
read[name] = val if found
|
101
|
+
end
|
102
|
+
|
103
|
+
read[guid_name] = @guid
|
104
|
+
|
105
|
+
read
|
106
|
+
end
|
107
|
+
|
108
|
+
def find_path(hash, path)
|
109
|
+
return [false, nil] unless hash
|
110
|
+
|
111
|
+
first, *rest = path
|
112
|
+
return [false, nil] unless hash.key?(first)
|
113
|
+
|
114
|
+
here = hash[first]
|
115
|
+
|
116
|
+
if rest.empty?
|
117
|
+
[true, here]
|
118
|
+
else
|
119
|
+
find_path(here, rest)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def write_manifest(body = read_manifest, onto = {})
|
124
|
+
onto[guid_name] = @guid
|
125
|
+
|
126
|
+
self.class.write_locations.each do |what, where|
|
127
|
+
put(body[what], onto, where) if body.key?(what)
|
128
|
+
end
|
129
|
+
|
130
|
+
onto
|
131
|
+
end
|
132
|
+
|
133
|
+
def put(what, where, path)
|
134
|
+
if path.size == 1
|
135
|
+
where[path.last] = what
|
136
|
+
elsif name = path.first
|
137
|
+
where[name] ||= {}
|
138
|
+
put(what, where[name], path[1..-1])
|
139
|
+
end
|
140
|
+
|
141
|
+
nil
|
142
|
+
end
|
143
|
+
|
144
|
+
def eql?(other)
|
145
|
+
other.is_a?(self.class) && @guid == other.guid
|
146
|
+
end
|
147
|
+
alias :== :eql?
|
148
|
+
|
149
|
+
def hash
|
150
|
+
@guid.hash
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require "cfoundry/validator"
|
2
|
+
|
3
|
+
module CFoundry::V1
|
4
|
+
module BaseClientMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClientMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
module ModelMagic
|
11
|
+
attr_accessor :guid_name
|
12
|
+
|
13
|
+
def read_locations
|
14
|
+
@read_locations ||= {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def write_locations
|
18
|
+
@write_locations ||= {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def define_client_methods(klass = self)
|
22
|
+
singular = klass.object_name
|
23
|
+
plural = :"#{singular}s"
|
24
|
+
|
25
|
+
base_singular = klass.base_object_name
|
26
|
+
base_plural = :"#{base_singular}s"
|
27
|
+
|
28
|
+
BaseClientMethods.module_eval do
|
29
|
+
define_method(base_singular) do |guid|
|
30
|
+
get(base_plural, guid, :accept => :json)
|
31
|
+
end
|
32
|
+
|
33
|
+
define_method(:"create_#{base_singular}") do |payload|
|
34
|
+
post(payload, base_plural, :content => :json, :accept => :json)
|
35
|
+
end
|
36
|
+
|
37
|
+
define_method(:"delete_#{base_singular}") do |guid|
|
38
|
+
delete(base_plural, guid)
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
42
|
+
define_method(:"update_#{base_singular}") do |guid, payload|
|
43
|
+
put(payload, base_plural, guid, :content => :json)
|
44
|
+
end
|
45
|
+
|
46
|
+
define_method(base_plural) do |*args|
|
47
|
+
get(base_plural, :accept => :json)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
ClientMethods.module_eval do
|
52
|
+
if klass.guid_name
|
53
|
+
define_method(:"#{singular}_by_#{klass.guid_name}") do |guid|
|
54
|
+
obj = send(singular, guid)
|
55
|
+
obj if obj.exists?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
define_method(singular) do |*args|
|
60
|
+
guid, _ = args
|
61
|
+
klass.new(guid, self)
|
62
|
+
end
|
63
|
+
|
64
|
+
define_method(plural) do |*args|
|
65
|
+
options, _ = args
|
66
|
+
options ||= {}
|
67
|
+
|
68
|
+
@base.send(base_plural).collect do |json|
|
69
|
+
klass.new(json[klass.guid_name], self, json)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def attribute(name, type, opts = {})
|
76
|
+
default = opts[:default]
|
77
|
+
is_guid = opts[:guid]
|
78
|
+
read_only = opts[:read_only]
|
79
|
+
write_only = opts[:write_only]
|
80
|
+
has_default = opts.key?(:default)
|
81
|
+
|
82
|
+
read_locations[name] = Array(opts[:read] || opts[:at] || name)
|
83
|
+
write_locations[name] = Array(opts[:write] || opts[:at] || name)
|
84
|
+
|
85
|
+
self.guid_name = name if is_guid
|
86
|
+
|
87
|
+
unless write_only
|
88
|
+
define_method(name) do
|
89
|
+
return @guid if @guid && is_guid
|
90
|
+
|
91
|
+
read = read_manifest
|
92
|
+
read.key?(name) ? read[name] : default
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
return if read_only
|
97
|
+
|
98
|
+
define_method(:"#{name}=") do |val|
|
99
|
+
unless has_default && val == default
|
100
|
+
CFoundry::Validator.validate_type(val, type)
|
101
|
+
end
|
102
|
+
|
103
|
+
@guid = val if is_guid
|
104
|
+
|
105
|
+
@manifest ||= {}
|
106
|
+
|
107
|
+
old = read_manifest[name]
|
108
|
+
@changes[name] = [old, val] if old != val
|
109
|
+
|
110
|
+
put(val, @manifest, self.class.write_locations[name])
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|