Class: VMC::Client
Defined Under Namespace
Classes: AuthError, BadResponse, BadTarget, HTTPException, NotFound, TargetError
Constant Summary collapse
- VMC_HTTP_ERROR_CODES =
Error codes
[ 400, 403, 404, 500 ]
Instance Attribute Summary collapse
-
#auth_token ⇒ Object
readonly
Returns the value of attribute auth_token.
-
#host ⇒ Object
readonly
Returns the value of attribute host.
-
#proxy ⇒ Object
Returns the value of attribute proxy.
-
#target ⇒ Object
readonly
Returns the value of attribute target.
-
#trace ⇒ Object
Returns the value of attribute trace.
-
#user ⇒ Object
readonly
Returns the value of attribute user.
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
-
#apps ⇒ Object
Apps.
- #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
-
#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
Constructor Details
#initialize(target_url = VMC::DEFAULT_TARGET, auth_token = nil) ⇒ Client
Initialize new client to the target_uri with optional auth_token
38 39 40 41 42 |
# File 'lib/vmc/client.rb', line 38 def initialize(target_url=VMC::DEFAULT_TARGET, auth_token=nil) target_url = "http://#{target_url}" unless /^https?/ =~ target_url @target = target_url @auth_token = auth_token end |
Instance Attribute Details
#auth_token ⇒ Object (readonly)
Returns the value of attribute auth_token.
23 24 25 |
# File 'lib/vmc/client.rb', line 23 def auth_token @auth_token end |
#host ⇒ Object (readonly)
Returns the value of attribute host.
23 24 25 |
# File 'lib/vmc/client.rb', line 23 def host @host end |
#proxy ⇒ Object
Returns the value of attribute proxy.
23 24 25 |
# File 'lib/vmc/client.rb', line 23 def proxy @proxy end |
#target ⇒ Object (readonly)
Returns the value of attribute target.
23 24 25 |
# File 'lib/vmc/client.rb', line 23 def target @target end |
#trace ⇒ Object
Returns the value of attribute trace.
24 25 26 |
# File 'lib/vmc/client.rb', line 24 def trace @trace end |
#user ⇒ Object (readonly)
Returns the value of attribute user.
23 24 25 |
# File 'lib/vmc/client.rb', line 23 def user @user end |
Class Method Details
Instance Method Details
#add_user(user_email, password) ⇒ Object
287 288 289 |
# File 'lib/vmc/client.rb', line 287 def add_user(user_email, password) json_post(VMC::USERS_PATH, { :email => user_email, :password => password }) end |
#app_crashes(name) ⇒ Object
129 130 131 132 |
# File 'lib/vmc/client.rb', line 129 def app_crashes(name) check_login_status json_get("#{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.
136 137 138 139 140 141 142 |
# File 'lib/vmc/client.rb', line 136 def app_files(name, path, instance=0) check_login_status url = "#{VMC::APPS_PATH}/#{name}/instances/#{instance}/files/#{path}" url.gsub!('//', '/') _, body, headers = http_get(url) body end |
#app_info(name) ⇒ Object
105 106 107 108 |
# File 'lib/vmc/client.rb', line 105 def app_info(name) check_login_status json_get("#{VMC::APPS_PATH}/#{name}") end |
#app_instances(name) ⇒ Object
124 125 126 127 |
# File 'lib/vmc/client.rb', line 124 def app_instances(name) check_login_status json_get("#{VMC::APPS_PATH}/#{name}/instances") end |
#app_stats(name) ⇒ Object
110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/vmc/client.rb', line 110 def app_stats(name) check_login_status stats_raw = json_get("#{VMC::APPS_PATH}/#{name}/stats") stats = [] stats_raw.each_pair do |k, entry| # Skip entries with no stats 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 |
#apps ⇒ Object
Apps
68 69 70 71 |
# File 'lib/vmc/client.rb', line 68 def apps check_login_status json_get(VMC::APPS_PATH) end |
#bind_service(service, appname) ⇒ Object
190 191 192 193 194 195 196 |
# File 'lib/vmc/client.rb', line 190 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
266 267 268 269 270 271 272 273 |
# File 'lib/vmc/client.rb', line 266 def change_password(new_password) check_login_status user_info = json_get("#{VMC::USERS_PATH}/#{@user}") if user_info user_info[:password] = new_password json_put("#{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]
216 217 218 219 220 |
# File 'lib/vmc/client.rb', line 216 def check_resources(resources) check_login_status status, body, headers = json_post(VMC::RESOURCES_PATH, resources) json_parse(body) end |
#create_app(name, manifest = {}) ⇒ Object
73 74 75 76 77 78 79 |
# File 'lib/vmc/client.rb', line 73 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
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/vmc/client.rb', line 154 def create_service(service, name) check_login_status services = services_info services ||= [] service_hash = nil service = service.to_s # FIXME! 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(VMC::SERVICES_PATH, service_hash) end |
#delete_app(name) ⇒ Object
100 101 102 103 |
# File 'lib/vmc/client.rb', line 100 def delete_app(name) check_login_status http_delete("#{VMC::APPS_PATH}/#{name}") end |
#delete_service(name) ⇒ Object
182 183 184 185 186 187 188 |
# File 'lib/vmc/client.rb', line 182 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("#{VMC::SERVICES_PATH}/#{name}") end |
#delete_user(user_email) ⇒ Object
291 292 293 |
# File 'lib/vmc/client.rb', line 291 def delete_user(user_email) http_delete("#{VMC::USERS_PATH}/#{user_email}") end |
#info ⇒ Object
Retrieves information on the target cloud, and optionally the logged in user
49 50 51 52 |
# File 'lib/vmc/client.rb', line 49 def info # TODO: Should merge for new version IMO, general, services, user_account json_get(VMC::INFO_PATH) end |
#logged_in? ⇒ Boolean
Checks that the auth_token is valid
239 240 241 242 243 244 245 246 247 |
# File 'lib/vmc/client.rb', line 239 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.
256 257 258 259 260 261 262 263 |
# File 'lib/vmc/client.rb', line 256 def login(user, password) status, body, headers = json_post("#{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
283 284 285 |
# File 'lib/vmc/client.rb', line 283 def proxy_for(proxy) @proxy = proxy end |
#raw_info ⇒ Object
54 55 56 |
# File 'lib/vmc/client.rb', line 54 def raw_info http_get(VMC::INFO_PATH) end |
#services ⇒ Object
listing of services that are available in the system
149 150 151 152 |
# File 'lib/vmc/client.rb', line 149 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
59 60 61 62 |
# File 'lib/vmc/client.rb', line 59 def services_info check_login_status json_get(VMC::GLOBAL_SERVICES_PATH) end |
#target_valid? ⇒ Boolean
Checks that the target is valid
227 228 229 230 231 232 233 234 235 236 |
# File 'lib/vmc/client.rb', line 227 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
198 199 200 201 202 203 204 205 |
# File 'lib/vmc/client.rb', line 198 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
81 82 83 84 |
# File 'lib/vmc/client.rb', line 81 def update_app(name, manifest) check_login_status json_put("#{VMC::APPS_PATH}/#{name}", manifest) end |
#upload_app(name, zipfile, resource_manifest = nil) ⇒ Object
86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/vmc/client.rb', line 86 def upload_app(name, zipfile, resource_manifest=nil) #FIXME, manifest should be allowed to be null, here for compatability with old cc's resource_manifest ||= [] check_login_status if zipfile.is_a? File file = zipfile else file = File.new(zipfile, 'rb') end upload_data = {:application => file, :_method => 'put'} upload_data[:resources] = resource_manifest.to_json if resource_manifest http_post("#{VMC::APPS_PATH}/#{name}/application", upload_data) end |