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_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
319
320
321
322
323
|
# File 'lib/vmc/client.rb', line 319
def self.path(*path)
path.flatten.collect { |x|
URI.encode x.to_s, 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
308
309
310
|
# File 'lib/vmc/client.rb', line 308
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_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
206
207
208
209
210
211
212
|
# File 'lib/vmc/client.rb', line 206
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
282
283
284
285
286
287
288
289
|
# File 'lib/vmc/client.rb', line 282
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]
232
233
234
235
236
|
# File 'lib/vmc/client.rb', line 232
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
# File 'lib/vmc/client.rb', line 170
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
198
199
200
201
202
203
204
|
# File 'lib/vmc/client.rb', line 198
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
312
313
314
315
|
# File 'lib/vmc/client.rb', line 312
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
255
256
257
258
259
260
261
262
263
|
# File 'lib/vmc/client.rb', line 255
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.
272
273
274
275
276
277
278
279
|
# File 'lib/vmc/client.rb', line 272
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
299
300
301
|
# File 'lib/vmc/client.rb', line 299
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
165
166
167
168
|
# File 'lib/vmc/client.rb', line 165
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
243
244
245
246
247
248
249
250
251
252
|
# File 'lib/vmc/client.rb', line 243
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
214
215
216
217
218
219
220
221
|
# File 'lib/vmc/client.rb', line 214
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
|
303
304
305
306
|
# File 'lib/vmc/client.rb', line 303
def users
check_login_status
json_get(VMC::USERS_PATH)
end
|