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.
@@ -1,90 +0,0 @@
1
- require "multi_json"
2
- require "tmpdir"
3
-
4
- require "cfoundry/baseclient"
5
- require "cfoundry/uaaclient"
6
-
7
- require "cfoundry/errors"
8
-
9
- module CFoundry::V1
10
- class Base < CFoundry::BaseClient
11
- include BaseClientMethods
12
-
13
- def system_services
14
- get("services", "v1", "offerings", :content => :json, :accept => :json)
15
- end
16
-
17
- def system_runtimes
18
- get("info", "runtimes", :accept => :json)
19
- end
20
-
21
- # Users
22
- def create_user(payload)
23
- # no JSON response
24
- post("users", :content => :json, :payload => payload)
25
- end
26
-
27
- def create_token(payload, email)
28
- post("users", email, "tokens", :content => :json, :accept => :json, :payload => payload)
29
- end
30
-
31
- # Applications
32
- def instances(name)
33
- get("apps", name, "instances", :accept => :json)[:instances]
34
- end
35
-
36
- def crashes(name)
37
- get("apps", name, "crashes", :accept => :json)[:crashes]
38
- end
39
-
40
- def files(name, instance, *path)
41
- get("apps", name, "instances", instance, "files", *path)
42
- end
43
- alias :file :files
44
-
45
- def stats(name)
46
- get("apps", name, "stats", :accept => :json)
47
- end
48
-
49
- def resource_match(fingerprints)
50
- post("resources", :content => :json, :accept => :json, :payload => fingerprints)
51
- end
52
-
53
- def upload_app(name, zipfile = nil, resources = [])
54
- use_or_create_empty_zipfile(zipfile) do |zipfile|
55
- payload = {
56
- :_method => "put",
57
- :resources => MultiJson.dump(resources),
58
- :application =>
59
- UploadIO.new(
60
- if zipfile.is_a? File
61
- zipfile
62
- elsif zipfile.is_a? String
63
- File.new(zipfile, "rb")
64
- end,
65
- "application/zip")
66
- }
67
-
68
- post("apps", name, "application", :payload => payload)
69
- end
70
- rescue EOFError
71
- retry
72
- end
73
-
74
- private
75
-
76
- def use_or_create_empty_zipfile(zipfile)
77
- Dir.mktmpdir do |working_dir|
78
- zip_path = "#{working_dir}/empty_zip.zip"
79
-
80
- zipfile ||= Dir.mktmpdir do |zip_dir|
81
- File.new("#{zip_dir}/.__empty_file", "wb").close
82
- CFoundry::Zip.pack(zip_dir, zip_path)
83
- zip_path
84
- end
85
-
86
- yield zipfile
87
- end
88
- end
89
- end
90
- end
@@ -1,193 +0,0 @@
1
- require File.expand_path("../../concerns/login_helpers", __FILE__)
2
-
3
- module CFoundry::V1
4
- # The primary API entrypoint. Wraps a BaseClient to provide nicer return
5
- # values. Initialize with the target and, optionally, an auth token. These
6
- # are the only two internal states.
7
- class Client
8
- include ClientMethods, CFoundry::LoginHelpers
9
-
10
- attr_reader :base
11
-
12
- # Create a new Client for interfacing with the given target.
13
- #
14
- # A token may also be provided to skip the login step.
15
- def initialize(target = "http://api.cloudfoundry.com", token = nil)
16
- @base = Base.new(target, token)
17
- end
18
-
19
- def version
20
- 1
21
- end
22
-
23
- # The current target URL of the client.
24
- def target
25
- @base.target
26
- end
27
-
28
- # Current authentication token.
29
- def token
30
- @base.token
31
- end
32
-
33
- # Set the authentication token.
34
- def token=(token)
35
- @base.token = token
36
- end
37
-
38
- # Current proxy user. Usually nil.
39
- def proxy
40
- @base.proxy
41
- end
42
-
43
- # Set the proxy user for the client. Must be authorized as an
44
- # administrator for this to have any effect.
45
- def proxy=(email)
46
- @base.proxy = email
47
- end
48
-
49
- # Is the client tracing API requests?
50
- def trace
51
- @base.trace
52
- end
53
-
54
- # Set the tracing flag; if true, API requests and responses will be
55
- # printed out.
56
- def trace=(bool)
57
- @base.trace = bool
58
- end
59
-
60
- # The current log. See +log=+.
61
- def log
62
- @base.log
63
- end
64
-
65
- # Set the logging mode. Mode can be one of:
66
- #
67
- # [+String+] Name of a file to log the last 10 requests to.
68
- # [+Array+] Array to append with log data (a Hash).
69
- # [+IO+] An IO object to write to.
70
- # [+false+] No logging.
71
- def log=(mode)
72
- @base.log = mode
73
- end
74
-
75
- # The currently authenticated user.
76
- def current_user
77
- if user = info[:user]
78
- user(user)
79
- end
80
- end
81
-
82
- def current_space
83
- nil
84
- end
85
-
86
- def current_organization
87
- nil
88
- end
89
-
90
-
91
- # Retrieve target metadata.
92
- def info
93
- @base.info
94
- end
95
-
96
- # Retrieve available services.
97
- def services(options = {})
98
- services = []
99
-
100
- @base.system_services.each do |type, vendors|
101
- vendors.each do |vendor, providers|
102
- providers.each do |provider, properties|
103
- properties.each do |_, meta|
104
- meta[:supported_versions].each do |ver|
105
- state = meta[:version_aliases].find { |k, v| v == ver }
106
-
107
- services <<
108
- Service.new(vendor.to_s, ver.to_s, meta[:description],
109
- type.to_s, provider.to_s, state && state.first,
110
- generate_plans(meta))
111
- end
112
- end
113
- end
114
- end
115
- end
116
-
117
- services
118
- end
119
-
120
- def generate_plans(meta)
121
- names = meta[:plans]
122
- descriptions = meta[:plan_descriptions]
123
- default_name = meta[:default_plan]
124
- names.map { |name|
125
- description = descriptions[name.to_sym] if descriptions
126
- is_default = name == default_name || names.length == 1
127
- ServicePlan.new(name, description, is_default)
128
- }
129
- end
130
-
131
- # Retrieve available runtimes.
132
- def runtimes(options = {})
133
- runtimes = []
134
-
135
- @base.system_runtimes.each do |name, meta|
136
- runtimes <<
137
- Runtime.new(name.to_s, meta[:version], meta[:debug_modes])
138
- end
139
-
140
- runtimes
141
- end
142
-
143
- def runtime(name)
144
- Runtime.new(name)
145
- end
146
-
147
- def runtime_by_name(name)
148
- runtimes.find { |r| r.name == name }
149
- end
150
-
151
- # Retrieve available frameworks.
152
- def frameworks(options = {})
153
- fs = info[:frameworks]
154
- return unless fs
155
-
156
- frameworks = []
157
- fs.each do |name, meta|
158
- runtimes = meta[:runtimes].collect do |r|
159
- Runtime.new(r[:name], r[:description])
160
- end
161
-
162
- frameworks <<
163
- Framework.new(name.to_s, nil, runtimes, meta[:detection])
164
- end
165
-
166
- frameworks
167
- end
168
-
169
- def framework(name)
170
- Framework.new(name)
171
- end
172
-
173
- def framework_by_name(name)
174
- frameworks.find { |f| f.name == name }
175
- end
176
-
177
- # Create a user on the target and return a User object representing them.
178
- def register(email, password)
179
- @base.create_user(:email => email, :password => password)
180
- user(email)
181
- end
182
-
183
- # Clear client token. No requests are made for this.
184
- def logout
185
- @base.token = nil
186
- end
187
-
188
- # Is an authentication token set on the client?
189
- def logged_in?
190
- !!@base.token
191
- end
192
- end
193
- end
@@ -1,21 +0,0 @@
1
- module CFoundry::V1
2
- class Framework
3
- attr_accessor :name, :description, :runtimes, :detection
4
-
5
- def initialize(name, description = nil, runtimes = [], detection = nil)
6
- @name = name
7
- @description = description
8
- @runtimes = runtimes
9
- @detection = detection
10
- end
11
-
12
- def eql?(other)
13
- other.is_a?(self.class) && other.name == @name
14
- end
15
- alias :== :eql?
16
-
17
- def apps
18
- [] # not supported by v1
19
- end
20
- end
21
- end
@@ -1,178 +0,0 @@
1
- require "multi_json"
2
-
3
- require "cfoundry/v1/model_magic"
4
-
5
-
6
- module CFoundry::V1
7
- class Model
8
- @@objects = {}
9
-
10
- extend ModelMagic
11
-
12
- class << self
13
- attr_writer :object_name, :base_object_name
14
-
15
- def object_name
16
- @object_name ||=
17
- name.split("::").last.gsub(
18
- /([a-z])([A-Z])/,
19
- '\1_\2').downcase.to_sym
20
- end
21
-
22
- def base_object_name
23
- @base_object_name ||= object_name
24
- end
25
-
26
- def plural_object_name
27
- "#{object_name}s"
28
- end
29
-
30
- def plural_base_object_name
31
- "#{base_object_name}s"
32
- end
33
-
34
- def objects
35
- @@objects
36
- end
37
-
38
- def inherited(klass)
39
- @@objects[klass.object_name] = klass
40
- super
41
- end
42
- end
43
-
44
- attr_accessor :guid, :changes
45
-
46
- def initialize(guid, client, manifest = nil)
47
- @guid = guid
48
- @client = client
49
- @manifest = manifest
50
- @changes = {}
51
- end
52
-
53
- def manifest
54
- @manifest ||= @client.base.send(base_object_name, @guid)
55
- end
56
-
57
- def changed?
58
- !@changes.empty?
59
- end
60
-
61
- def inspect
62
- "\#<#{self.class.name} '#@guid'>"
63
- end
64
-
65
- def object_name
66
- @object_name ||= self.class.object_name
67
- end
68
-
69
- def base_object_name
70
- @base_object_name ||= self.class.base_object_name
71
- end
72
-
73
- def guid_name
74
- self.class.guid_name
75
- end
76
-
77
- def invalidate!
78
- @manifest = nil
79
- @changes = {}
80
- end
81
-
82
- def create!
83
- @manifest = @client.base.send(:"create_#{base_object_name}", write_manifest)
84
-
85
- @guid = read_manifest[guid_name]
86
-
87
- true
88
- end
89
-
90
- def update!
91
- @client.base.send(:"update_#{base_object_name}", @guid, write_manifest)
92
-
93
- true
94
- end
95
-
96
- def delete!
97
- @client.base.send(:"delete_#{base_object_name}", @guid)
98
-
99
- @guid = nil
100
-
101
- true
102
- end
103
-
104
- def exists?
105
- invalidate!
106
- manifest
107
- true
108
- rescue CFoundry::NotFound
109
- false
110
- end
111
-
112
- def read_manifest
113
- read = {}
114
-
115
- self.class.read_locations.each do |name, where|
116
- found, val = find_path(manifest, where)
117
- read[name] = val if found
118
- end
119
-
120
- self.class.write_locations.each do |name, where|
121
- next if self.class.read_only_attributes.include? name
122
-
123
- found, val = find_path(manifest, where)
124
- read[name] = val if found
125
- end
126
-
127
- read[guid_name] = @guid
128
-
129
- read
130
- end
131
-
132
- def find_path(hash, path)
133
- return [false, nil] unless hash
134
-
135
- first, *rest = path
136
- return [false, nil] unless hash.key?(first)
137
-
138
- here = hash[first]
139
-
140
- if rest.empty?
141
- [true, here]
142
- else
143
- find_path(here, rest)
144
- end
145
- end
146
-
147
- def write_manifest(body = read_manifest, onto = {})
148
- onto[guid_name] = @guid if guid_name
149
-
150
- self.class.write_locations.each do |name, where|
151
- next if self.class.read_only_attributes.include? name
152
- put(body[name], onto, where) if body.key?(name)
153
- end
154
-
155
- onto
156
- end
157
-
158
- def put(what, where, path)
159
- if path.size == 1
160
- where[path.last] = what
161
- elsif name = path.first
162
- where[name] ||= {}
163
- put(what, where[name], path[1..-1])
164
- end
165
-
166
- nil
167
- end
168
-
169
- def eql?(other)
170
- other.is_a?(self.class) && @guid == other.guid
171
- end
172
- alias :== :eql?
173
-
174
- def hash
175
- @guid.hash
176
- end
177
- end
178
- end