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
@@ -1,112 +1,32 @@
|
|
1
|
-
|
2
|
-
# Class for representing a user's service on a given target (via Client).
|
3
|
-
#
|
4
|
-
# Does not guarantee that the service exists; used for both service creation
|
5
|
-
# and retrieval, as the attributes are all lazily retrieved. Setting
|
6
|
-
# attributes does not perform any requests; use #update! to commit your
|
7
|
-
# changes.
|
8
|
-
class ServiceInstance
|
9
|
-
# Service name.
|
10
|
-
attr_accessor :name
|
11
|
-
|
12
|
-
# Service type (e.g. key-value).
|
13
|
-
attr_accessor :type
|
14
|
-
|
15
|
-
# Service vendor (redis, mysql, etc.).
|
16
|
-
attr_accessor :vendor
|
17
|
-
|
18
|
-
# Service version.
|
19
|
-
attr_accessor :version
|
20
|
-
|
21
|
-
# Service properties.
|
22
|
-
attr_accessor :properties
|
23
|
-
|
24
|
-
# Service tier. Usually "free" for now.
|
25
|
-
attr_accessor :tier
|
26
|
-
|
27
|
-
# Service metadata.
|
28
|
-
attr_accessor :meta
|
1
|
+
require "cfoundry/v1/model"
|
29
2
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
def initialize(name, client, manifest = nil)
|
34
|
-
@name = name
|
35
|
-
@client = client
|
36
|
-
@manifest = manifest
|
37
|
-
end
|
38
|
-
|
39
|
-
# Show string representing the service.
|
40
|
-
def inspect
|
41
|
-
"#<ServiceInstance '#@name'>"
|
42
|
-
end
|
43
|
-
|
44
|
-
# Basic equality test by name.
|
45
|
-
def eql?(other)
|
46
|
-
other.is_a?(self.class) && other.name == @name
|
47
|
-
end
|
48
|
-
alias :== :eql?
|
3
|
+
module CFoundry::V1
|
4
|
+
class ServiceInstance < Model
|
5
|
+
self.base_object_name = :service
|
49
6
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
7
|
+
attribute :name, :string, :guid => true
|
8
|
+
attribute :created, :integer, :at => [:meta, :created]
|
9
|
+
attribute :updated, :integer, :at => [:meta, :updated]
|
10
|
+
attribute :tags, [:string], :at => [:meta, :tags]
|
11
|
+
attribute :type, :string
|
12
|
+
attribute :vendor, :string
|
13
|
+
attribute :version, :string
|
14
|
+
attribute :tier, :string
|
15
|
+
attribute :properties, :hash
|
54
16
|
|
55
|
-
|
56
|
-
#
|
57
|
-
# Call this after setting the various attributes.
|
58
|
-
def create!
|
59
|
-
@client.base.create_service(@manifest.merge(:name => @name))
|
60
|
-
end
|
17
|
+
define_client_methods
|
61
18
|
|
62
|
-
|
63
|
-
|
64
|
-
@client.base.service(@name)
|
65
|
-
true
|
66
|
-
rescue CFoundry::ServiceNotFound
|
67
|
-
false
|
68
|
-
end
|
19
|
+
alias_method :created_unix, :created
|
20
|
+
alias_method :updated_unix, :updated
|
69
21
|
|
70
22
|
# Timestamp of when the service was created.
|
71
23
|
def created
|
72
|
-
Time.at(
|
24
|
+
Time.at(created_unix)
|
73
25
|
end
|
74
26
|
|
75
27
|
# Timestamp of when the service was last updated.
|
76
28
|
def updated
|
77
|
-
Time.at(
|
78
|
-
end
|
79
|
-
|
80
|
-
def invalidate!
|
81
|
-
@manifest = nil
|
82
|
-
end
|
83
|
-
|
84
|
-
def eql?(other)
|
85
|
-
other.is_a?(self.class) && @name == other.name
|
86
|
-
end
|
87
|
-
alias :== :eql?
|
88
|
-
|
89
|
-
{ :type => :type,
|
90
|
-
:vendor => :vendor,
|
91
|
-
:version => :version,
|
92
|
-
:properties => :properties,
|
93
|
-
:tier => :tier,
|
94
|
-
:meta => :meta
|
95
|
-
}.each do |meth, attr|
|
96
|
-
define_method(meth) do
|
97
|
-
manifest[attr]
|
98
|
-
end
|
99
|
-
|
100
|
-
define_method(:"#{meth}=") do |v|
|
101
|
-
@manifest ||= {}
|
102
|
-
@manifest[attr] = v
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
private
|
107
|
-
|
108
|
-
def manifest
|
109
|
-
@manifest ||= @client.base.service(@name)
|
29
|
+
Time.at(updated_unix)
|
110
30
|
end
|
111
31
|
end
|
112
32
|
end
|
data/lib/cfoundry/v1/user.rb
CHANGED
@@ -1,79 +1,14 @@
|
|
1
|
-
|
2
|
-
# Class for representing a user on a given target (via Client).
|
3
|
-
#
|
4
|
-
# Does not guarantee that the user exists; used for both user creation and
|
5
|
-
# retrieval, as the attributes are all lazily retrieved. Setting attributes
|
6
|
-
# does not perform any requests; use #update! to commit your changes.
|
7
|
-
class User
|
8
|
-
# User email.
|
9
|
-
attr_reader :email
|
10
|
-
|
11
|
-
|
12
|
-
# Create a User object.
|
13
|
-
#
|
14
|
-
# You'll usually call Client#user instead
|
15
|
-
def initialize(email, client, manifest = nil)
|
16
|
-
@email = email
|
17
|
-
@client = client
|
18
|
-
@manifest = manifest
|
19
|
-
end
|
1
|
+
require "cfoundry/v1/model"
|
20
2
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
# Basic equality test by email.
|
27
|
-
def eql?(other)
|
28
|
-
other.is_a?(self.class) && other.email == @email
|
29
|
-
end
|
30
|
-
alias :== :eql?
|
31
|
-
|
32
|
-
# Delete the user from the target.
|
33
|
-
def delete!
|
34
|
-
@client.base.delete_user(@email)
|
35
|
-
end
|
36
|
-
|
37
|
-
# Create the user on the target.
|
38
|
-
#
|
39
|
-
# Call this after setting the various attributes.
|
40
|
-
def create!
|
41
|
-
@client.base.create_user(@manifest.merge(:email => @email))
|
42
|
-
end
|
43
|
-
|
44
|
-
# Update user attributes.
|
45
|
-
def update!(what = {})
|
46
|
-
@client.base.update_user(@email, manifest.merge(what))
|
47
|
-
@manifest = nil
|
48
|
-
end
|
49
|
-
|
50
|
-
# Check if the user exists on the target.
|
51
|
-
def exists?
|
52
|
-
@client.base.user(@email)
|
53
|
-
true
|
54
|
-
rescue CFoundry::Denied
|
55
|
-
false
|
56
|
-
end
|
57
|
-
|
58
|
-
def invalidate!
|
59
|
-
@manifest = nil
|
60
|
-
end
|
61
|
-
|
62
|
-
# Check if the user is an administrator.
|
63
|
-
def admin?
|
64
|
-
manifest[:admin]
|
65
|
-
end
|
3
|
+
module CFoundry::V1
|
4
|
+
class User < Model
|
5
|
+
attribute :email, :string, :guid => true
|
6
|
+
attribute :password, :string, :write_only => true
|
7
|
+
attribute :admin, :boolean
|
66
8
|
|
67
|
-
|
68
|
-
#
|
69
|
-
# Call #update! after using this.
|
70
|
-
def password=(str)
|
71
|
-
manifest[:password] = str
|
72
|
-
end
|
9
|
+
define_client_methods
|
73
10
|
|
74
|
-
|
75
|
-
@guid ||= @client.base.token_data[:user_id]
|
76
|
-
end
|
11
|
+
alias_method :admin?, :admin
|
77
12
|
|
78
13
|
def change_password!(new, old)
|
79
14
|
if @client.base.uaa
|
@@ -83,11 +18,5 @@ module CFoundry::V1
|
|
83
18
|
update!
|
84
19
|
end
|
85
20
|
end
|
86
|
-
|
87
|
-
private
|
88
|
-
|
89
|
-
def manifest
|
90
|
-
@manifest ||= @client.base.user(@email)
|
91
|
-
end
|
92
21
|
end
|
93
22
|
end
|
data/lib/cfoundry/v2/app.rb
CHANGED
@@ -287,44 +287,6 @@ module CFoundry::V2
|
|
287
287
|
}
|
288
288
|
end
|
289
289
|
|
290
|
-
# Upload application's code to target. Do this after #create! and before
|
291
|
-
# #start!
|
292
|
-
#
|
293
|
-
# [path]
|
294
|
-
# A path pointing to either a directory, or a .jar, .war, or .zip
|
295
|
-
# file.
|
296
|
-
#
|
297
|
-
# If a .vmcignore file is detected under the given path, it will be used
|
298
|
-
# to exclude paths from the payload, similar to a .gitignore.
|
299
|
-
#
|
300
|
-
# [check_resources]
|
301
|
-
# If set to `false`, the entire payload will be uploaded
|
302
|
-
# without checking the resource cache.
|
303
|
-
#
|
304
|
-
# Only do this if you know what you're doing.
|
305
|
-
def upload(path, check_resources = true)
|
306
|
-
unless File.exist? path
|
307
|
-
raise CFoundry::Error, "Invalid application path '#{path}'"
|
308
|
-
end
|
309
|
-
|
310
|
-
zipfile = "#{Dir.tmpdir}/#{@guid}.zip"
|
311
|
-
tmpdir = "#{Dir.tmpdir}/.vmc_#{@guid}_files"
|
312
|
-
|
313
|
-
FileUtils.rm_f(zipfile)
|
314
|
-
FileUtils.rm_rf(tmpdir)
|
315
|
-
|
316
|
-
prepare_package(path, tmpdir)
|
317
|
-
|
318
|
-
resources = determine_resources(tmpdir) if check_resources
|
319
|
-
|
320
|
-
packed = CFoundry::Zip.pack(tmpdir, zipfile)
|
321
|
-
|
322
|
-
@client.base.upload_app(@guid, packed && zipfile, resources || [])
|
323
|
-
ensure
|
324
|
-
FileUtils.rm_f(zipfile) if zipfile
|
325
|
-
FileUtils.rm_rf(tmpdir) if tmpdir
|
326
|
-
end
|
327
|
-
|
328
290
|
def files(*path)
|
329
291
|
Instance.new(self, "0", @client).files(*path)
|
330
292
|
end
|
@@ -401,25 +363,5 @@ module CFoundry::V2
|
|
401
363
|
@client.base.stream_file(@app.guid, @id, *path, &blk)
|
402
364
|
end
|
403
365
|
end
|
404
|
-
|
405
|
-
private
|
406
|
-
|
407
|
-
# Minimum size for an application payload to bother checking resources.
|
408
|
-
RESOURCE_CHECK_LIMIT = 64 * 1024
|
409
|
-
|
410
|
-
def determine_resources(path)
|
411
|
-
fingerprints, total_size = make_fingerprints(path)
|
412
|
-
|
413
|
-
return if total_size <= RESOURCE_CHECK_LIMIT
|
414
|
-
|
415
|
-
resources = @client.base.resource_match(fingerprints)
|
416
|
-
|
417
|
-
resources.each do |resource|
|
418
|
-
FileUtils.rm_f resource[:fn]
|
419
|
-
resource[:fn].sub!("#{path}/", "")
|
420
|
-
end
|
421
|
-
|
422
|
-
resources
|
423
|
-
end
|
424
366
|
end
|
425
367
|
end
|
data/lib/cfoundry/v2/model.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "cfoundry/validator"
|
2
|
+
|
1
3
|
module CFoundry::V2
|
2
4
|
# object name -> module containing query methods
|
3
5
|
#
|
@@ -150,7 +152,7 @@ module CFoundry::V2
|
|
150
152
|
|
151
153
|
define_method(:"#{name}=") do |val|
|
152
154
|
unless has_default && val == default
|
153
|
-
|
155
|
+
CFoundry::Validator.validate_type(val, type)
|
154
156
|
end
|
155
157
|
|
156
158
|
@cache[name] = val
|
@@ -209,7 +211,7 @@ module CFoundry::V2
|
|
209
211
|
klass = CFoundry::V2.const_get(kls)
|
210
212
|
|
211
213
|
unless has_default && val == default
|
212
|
-
|
214
|
+
CFoundry::Validator.validate_type(val, klass)
|
213
215
|
end
|
214
216
|
|
215
217
|
@manifest ||= {}
|
@@ -284,7 +286,7 @@ module CFoundry::V2
|
|
284
286
|
end
|
285
287
|
|
286
288
|
define_method(:"add_#{singular}") do |x|
|
287
|
-
|
289
|
+
CFoundry::Validator.validate_type(x, CFoundry::V2.const_get(kls))
|
288
290
|
|
289
291
|
if cache = @cache[plural]
|
290
292
|
cache << x unless cache.include?(x)
|
@@ -297,7 +299,7 @@ module CFoundry::V2
|
|
297
299
|
end
|
298
300
|
|
299
301
|
define_method(:"remove_#{singular}") do |x|
|
300
|
-
|
302
|
+
CFoundry::Validator.validate_type(x, CFoundry::V2.const_get(kls))
|
301
303
|
|
302
304
|
if cache = @cache[plural]
|
303
305
|
cache.delete(x)
|
@@ -312,7 +314,7 @@ module CFoundry::V2
|
|
312
314
|
define_method(:"#{plural}=") do |xs|
|
313
315
|
klass = CFoundry::V2.const_get(kls)
|
314
316
|
|
315
|
-
|
317
|
+
CFoundry::Validator.validate_type(xs, [klass])
|
316
318
|
|
317
319
|
@manifest ||= {}
|
318
320
|
@manifest[:entity] ||= {}
|
@@ -411,56 +413,22 @@ module CFoundry::V2
|
|
411
413
|
end
|
412
414
|
end
|
413
415
|
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
val.is_a?(TrueClass) || val.is_a?(FalseClass)
|
427
|
-
when Array
|
428
|
-
val.all? do |x|
|
429
|
-
value_matches?(x, type.first)
|
430
|
-
end
|
431
|
-
when Hash
|
432
|
-
val.is_a?(Hash) &&
|
433
|
-
type.all? { |name, subtype|
|
434
|
-
val.key?(name) && value_matches?(val[name], subtype)
|
435
|
-
}
|
436
|
-
else
|
437
|
-
val.is_a?(Object.const_get(type.to_s.capitalize))
|
438
|
-
end
|
439
|
-
end
|
440
|
-
|
441
|
-
def validate_type(val, type)
|
442
|
-
unless value_matches?(val, type)
|
443
|
-
raise CFoundry::Mismatch.new(type, val)
|
416
|
+
def self.params_from(args)
|
417
|
+
options, _ = args
|
418
|
+
options ||= {}
|
419
|
+
options[:depth] ||= 1
|
420
|
+
|
421
|
+
params = {}
|
422
|
+
options.each do |k, v|
|
423
|
+
case k
|
424
|
+
when :depth
|
425
|
+
params[:"inline-relations-depth"] = v
|
426
|
+
when :query
|
427
|
+
params[:q] = v.join(":")
|
444
428
|
end
|
445
429
|
end
|
446
430
|
|
447
|
-
|
448
|
-
options, _ = args
|
449
|
-
options ||= {}
|
450
|
-
options[:depth] ||= 1
|
451
|
-
|
452
|
-
params = {}
|
453
|
-
options.each do |k, v|
|
454
|
-
case k
|
455
|
-
when :depth
|
456
|
-
params[:"inline-relations-depth"] = v
|
457
|
-
when :query
|
458
|
-
params[:q] = v.join(":")
|
459
|
-
end
|
460
|
-
end
|
461
|
-
|
462
|
-
params
|
463
|
-
end
|
431
|
+
params
|
464
432
|
end
|
465
433
|
end
|
466
434
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module CFoundry
|
2
|
+
module Validator
|
3
|
+
class << self
|
4
|
+
def value_matches?(val, type)
|
5
|
+
case type
|
6
|
+
when Class
|
7
|
+
val.is_a?(type)
|
8
|
+
when Regexp
|
9
|
+
val.is_a?(String) && val =~ type
|
10
|
+
when :url
|
11
|
+
value_matches?(val, URI::regexp(%w(http https)))
|
12
|
+
when :https_url
|
13
|
+
value_matches?(val, URI::regexp("https"))
|
14
|
+
when :boolean
|
15
|
+
val.is_a?(TrueClass) || val.is_a?(FalseClass)
|
16
|
+
when Array
|
17
|
+
val.all? do |x|
|
18
|
+
value_matches?(x, type.first)
|
19
|
+
end
|
20
|
+
when Hash
|
21
|
+
val.is_a?(Hash) &&
|
22
|
+
type.all? { |name, subtype|
|
23
|
+
val.key?(name) && value_matches?(val[name], subtype)
|
24
|
+
}
|
25
|
+
else
|
26
|
+
val.is_a?(Object.const_get(type.to_s.capitalize))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def validate_type(val, type)
|
31
|
+
unless value_matches?(val, type)
|
32
|
+
raise CFoundry::Mismatch.new(type, val)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|