Class: VMC::Client
Defined Under Namespace
Classes: AuthError, BadResponse, BadTarget, HTTPException, NotFound, TargetError
Constant Summary
collapse
- VMC_HTTP_ERROR_CODES =
[ 400, 500 ]
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
-
#add_user(user_email, password) ⇒ Object
-
#app_crashes(name) ⇒ Object
-
#app_files(name, path, instance = 0) ⇒ Object
List the directory or download the actual file indicated by the path.
-
#app_info(name) ⇒ Object
-
#app_instances(name) ⇒ Object
-
#app_most_recent_deploy(name) ⇒ Object
-
#app_stats(name) ⇒ Object
-
#app_update_info(name) ⇒ Object
-
#apps ⇒ Object
-
#bind_service(service, appname) ⇒ Object
-
#change_password(new_password) ⇒ Object
sets the password for the current logged user.
-
#check_resources(resources) ⇒ Object
Send in a resources manifest array to the system to have it check what is needed to actually send.
-
#create_app(name, manifest = {}) ⇒ Object
-
#create_service(service, name) ⇒ Object
-
#delete_app(name) ⇒ Object
-
#delete_service(name) ⇒ Object
-
#delete_user(user_email) ⇒ Object
-
#info ⇒ Object
Retrieves information on the target cloud, and optionally the logged in user.
-
#initialize(target_url = VMC::DEFAULT_TARGET, auth_token = nil) ⇒ Client
constructor
Initialize new client to the target_uri with optional auth_token.
-
#logged_in? ⇒ Boolean
Checks that the auth_token is valid.
-
#login(user, password) ⇒ Object
login and return an auth_token Auth token can be retained and used in creating new clients, avoiding login.
-
#proxy_for(proxy) ⇒ Object
-
#raw_info ⇒ Object
-
#runtimes_info ⇒ Object
-
#services ⇒ Object
listing of services that are available in the system.
-
#services_info ⇒ Object
Global listing of services that are available on the target system.
-
#target_valid? ⇒ Boolean
Checks that the target is valid.
-
#unbind_service(service, appname) ⇒ Object
-
#update_app(name, manifest) ⇒ Object
-
#upload_app(name, zipfile, resource_manifest = nil) ⇒ Object
-
#users ⇒ Object
Constructor Details
#initialize(target_url = VMC::DEFAULT_TARGET, auth_token = nil) ⇒ Client
Initialize new client to the target_uri with optional auth_token
39
40
41
42
43
44
|
# File 'lib/vmc/client.rb', line 39
def initialize(target_url=VMC::DEFAULT_TARGET, auth_token=nil)
target_url = "http://#{target_url}" unless /^https?/ =~ target_url
target_url = target_url.gsub(/\/+$/, '')
@target = target_url
@auth_token = auth_token
end
|
Instance Attribute Details
#auth_token ⇒ Object
Returns the value of attribute auth_token.
24
25
26
|
# File 'lib/vmc/client.rb', line 24
def auth_token
@auth_token
end
|
Returns the value of attribute host.
24
25
26
|
# File 'lib/vmc/client.rb', line 24
def host
@host
end
|
Returns the value of attribute proxy.
24
25
26
|
# File 'lib/vmc/client.rb', line 24
def proxy
@proxy
end
|
Returns the value of attribute target.
24
25
26
|
# File 'lib/vmc/client.rb', line 24
def target
@target
end
|
Returns the value of attribute trace.
25
26
27
|
# File 'lib/vmc/client.rb', line 25
def trace
@trace
end
|
Returns the value of attribute user.
24
25
26
|
# File 'lib/vmc/client.rb', line 24
def user
@user
end
|
Class Method Details
.path(*path) ⇒ Object
329
330
331
332
333
|
# File 'lib/vmc/client.rb', line 329
def self.path(*path)
path.flatten.collect { |x|
URI.encode x, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")
}.join("/")
end
|
20
21
22
|
# File 'lib/vmc/client.rb', line 20
def self.version
VMC::VERSION
end
|
Instance Method Details
#add_user(user_email, password) ⇒ Object
318
319
320
|
# File 'lib/vmc/client.rb', line 318
def add_user(user_email, password)
json_post(VMC::USERS_PATH, { :email => user_email, :password => password })
end
|
#app_crashes(name) ⇒ Object
145
146
147
148
|
# File 'lib/vmc/client.rb', line 145
def app_crashes(name)
check_login_status
json_get(path(VMC::APPS_PATH, name, "crashes"))
end
|
#app_files(name, path, instance = 0) ⇒ Object
List the directory or download the actual file indicated by the path.
152
153
154
155
156
157
158
|
# File 'lib/vmc/client.rb', line 152
def app_files(name, path, instance=0)
check_login_status
path = path.gsub('//', '/')
url = path(VMC::APPS_PATH, name, "instances", instance, "files", path)
_, body, = http_get(url)
body
end
|
#app_info(name) ⇒ Object
116
117
118
119
|
# File 'lib/vmc/client.rb', line 116
def app_info(name)
check_login_status
json_get(path(VMC::APPS_PATH, name))
end
|
#app_instances(name) ⇒ Object
140
141
142
143
|
# File 'lib/vmc/client.rb', line 140
def app_instances(name)
check_login_status
json_get(path(VMC::APPS_PATH, name, "instances"))
end
|
#app_most_recent_deploy(name) ⇒ Object
160
161
162
163
164
165
166
167
168
|
# File 'lib/vmc/client.rb', line 160
def app_most_recent_deploy(name)
check_login_status
begin
json_get(path(VMC::APPS_PATH, name, 'most_recent_deploy'))
rescue BadResponse
return nil
end
end
|
#app_stats(name) ⇒ Object
126
127
128
129
130
131
132
133
134
135
136
137
138
|
# File 'lib/vmc/client.rb', line 126
def app_stats(name)
check_login_status
stats_raw = json_get(path(VMC::APPS_PATH, name, "stats"))
stats = []
stats_raw.each_pair do |k, entry|
next unless entry[:stats]
entry[:instance] = k.to_s.to_i
entry[:state] = entry[:state].to_sym if entry[:state]
stats << entry
end
stats.sort { |a,b| a[:instance] - b[:instance] }
end
|
#app_update_info(name) ⇒ Object
121
122
123
124
|
# File 'lib/vmc/client.rb', line 121
def app_update_info(name)
check_login_status
json_get(path(VMC::APPS_PATH, name, "update"))
end
|
74
75
76
77
|
# File 'lib/vmc/client.rb', line 74
def apps
check_login_status
json_get(VMC::APPS_PATH)
end
|
#bind_service(service, appname) ⇒ Object
216
217
218
219
220
221
222
|
# File 'lib/vmc/client.rb', line 216
def bind_service(service, appname)
check_login_status
app = app_info(appname)
services = app[:services] || []
app[:services] = services << service
update_app(appname, app)
end
|
#change_password(new_password) ⇒ Object
sets the password for the current logged user
292
293
294
295
296
297
298
299
|
# File 'lib/vmc/client.rb', line 292
def change_password(new_password)
check_login_status
user_info = json_get(path(VMC::USERS_PATH, @user))
if user_info
user_info[:password] = new_password
json_put(path(VMC::USERS_PATH, @user), user_info)
end
end
|
#check_resources(resources) ⇒ Object
Send in a resources manifest array to the system to have it check what is needed to actually send. Returns array indicating what is needed. This returned manifest should be sent in with the upload if resources were removed. E.g. [=> xxx, :size => xxx, :fn => filename]
242
243
244
245
246
|
# File 'lib/vmc/client.rb', line 242
def check_resources(resources)
check_login_status
status, body, = json_post(VMC::RESOURCES_PATH, resources)
json_parse(body)
end
|
#create_app(name, manifest = {}) ⇒ Object
79
80
81
82
83
84
85
|
# File 'lib/vmc/client.rb', line 79
def create_app(name, manifest={})
check_login_status
app = manifest.dup
app[:name] = name
app[:instances] ||= 1
json_post(VMC::APPS_PATH, app)
end
|
#create_service(service, name) ⇒ Object
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
# File 'lib/vmc/client.rb', line 180
def create_service(service, name)
check_login_status
services = services_info
services ||= []
service_hash = nil
service = service.to_s
services.each do |service_type, value|
value.each do |vendor, version|
version.each do |version_str, service_descr|
if service == service_descr[:vendor]
service_hash = {
:type => service_descr[:type], :tier => 'free',
:vendor => service, :version => version_str
}
break
end
end
end
end
raise TargetError, "Service [#{service}] is not a valid service choice" unless service_hash
service_hash[:name] = name
json_post(path(VMC::SERVICES_PATH), service_hash)
end
|
#delete_app(name) ⇒ Object
111
112
113
114
|
# File 'lib/vmc/client.rb', line 111
def delete_app(name)
check_login_status
http_delete(path(VMC::APPS_PATH, name))
end
|
#delete_service(name) ⇒ Object
208
209
210
211
212
213
214
|
# File 'lib/vmc/client.rb', line 208
def delete_service(name)
check_login_status
svcs = services || []
names = svcs.collect { |s| s[:name] }
raise TargetError, "Service [#{name}] not a valid service" unless names.include? name
http_delete(path(VMC::SERVICES_PATH, name))
end
|
#delete_user(user_email) ⇒ Object
322
323
324
325
|
# File 'lib/vmc/client.rb', line 322
def delete_user(user_email)
check_login_status
http_delete(path(VMC::USERS_PATH, user_email))
end
|
Retrieves information on the target cloud, and optionally the logged in user
51
52
53
54
|
# File 'lib/vmc/client.rb', line 51
def info
json_get(VMC::INFO_PATH)
end
|
#logged_in? ⇒ Boolean
Checks that the auth_token is valid
265
266
267
268
269
270
271
272
273
|
# File 'lib/vmc/client.rb', line 265
def logged_in?
descr = info
if descr
return false unless descr[:user]
return false unless descr[:usage]
@user = descr[:user]
true
end
end
|
#login(user, password) ⇒ Object
login and return an auth_token Auth token can be retained and used in creating new clients, avoiding login.
282
283
284
285
286
287
288
289
|
# File 'lib/vmc/client.rb', line 282
def login(user, password)
status, body, = json_post(path(VMC::USERS_PATH, user, "tokens"), {:password => password})
response_info = json_parse(body)
if response_info
@user = user
@auth_token = response_info[:token]
end
end
|
#proxy_for(proxy) ⇒ Object
309
310
311
|
# File 'lib/vmc/client.rb', line 309
def proxy_for(proxy)
@proxy = proxy
end
|
56
57
58
|
# File 'lib/vmc/client.rb', line 56
def raw_info
http_get(VMC::INFO_PATH)
end
|
listing of services that are available in the system
175
176
177
178
|
# File 'lib/vmc/client.rb', line 175
def services
check_login_status
json_get(VMC::SERVICES_PATH)
end
|
#services_info ⇒ Object
Global listing of services that are available on the target system
61
62
63
64
|
# File 'lib/vmc/client.rb', line 61
def services_info
check_login_status
json_get(path(VMC::GLOBAL_SERVICES_PATH))
end
|
#target_valid? ⇒ Boolean
Checks that the target is valid
253
254
255
256
257
258
259
260
261
262
|
# File 'lib/vmc/client.rb', line 253
def target_valid?
return false unless descr = info
return false unless descr[:name]
return false unless descr[:build]
return false unless descr[:version]
return false unless descr[:support]
true
rescue
false
end
|
#unbind_service(service, appname) ⇒ Object
224
225
226
227
228
229
230
231
|
# File 'lib/vmc/client.rb', line 224
def unbind_service(service, appname)
check_login_status
app = app_info(appname)
services = app[:services] || []
services.delete(service)
app[:services] = services
update_app(appname, app)
end
|
#update_app(name, manifest) ⇒ Object
87
88
89
90
|
# File 'lib/vmc/client.rb', line 87
def update_app(name, manifest)
check_login_status
json_put(path(VMC::APPS_PATH, name), manifest)
end
|
#upload_app(name, zipfile, resource_manifest = nil) ⇒ Object
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
# File 'lib/vmc/client.rb', line 92
def upload_app(name, zipfile, resource_manifest=nil)
resource_manifest ||= []
check_login_status
upload_data = {:_method => 'put'}
if zipfile
if zipfile.is_a? File
file = zipfile
else
file = File.new(zipfile, 'rb')
end
upload_data[:application] = file
end
upload_data[:resources] = resource_manifest.to_json if resource_manifest
http_post(path(VMC::APPS_PATH, name, "application"), upload_data)
rescue RestClient::ServerBrokeConnection
retry
end
|
313
314
315
316
|
# File 'lib/vmc/client.rb', line 313
def users
check_login_status
json_get(VMC::USERS_PATH)
end
|