require 'vagrant-skytap/api/resource' require 'vagrant-skytap/api/interface' require 'vagrant-skytap/api/credentials' require_relative 'runstate_operations' module VagrantPlugins module Skytap module API class Vm < Resource include RunstateOperations attr_reader :provider_config attr_reader :environment reads :id, :interfaces, :credentials, :name class << self def fetch(env, url) raise Errors::BadVmUrl, url: url unless url =~ /\/vms\/\d+/ resp = env[:api_client].get(url) new(JSON.load(resp.body), env[:environment], env) end def current_vm(env) if (environment = env[:environment]) && (machine = env[:machine]) && machine.id environment.get_vm_by_id(machine.id) end end end def initialize(attrs, environment, env) super @environment = environment @provider_config = env[:machine].provider_config end def refresh(attrs) @interfaces = nil @credentials = nil super end def interfaces @interfaces ||= (get_api_attribute('interfaces') || []).collect do |iface_attrs| Interface.new(iface_attrs, self, env) end end def credentials @credentials ||= (get_api_attribute('credentials') || []).collect do |cred_attrs| Credentials.new(cred_attrs, self, env) end end def hardware get_api_attribute('hardware') end def from_template? !!get_api_attribute('template_url') end def template_id get_api_attribute('template_url') =~ /templates\/(\d+)/ $1 end def region return @region if @region resp = env[:api_client].get(get_api_attribute('template_url')) template_attrs = JSON.load(resp.body) @region = template_attrs['region'] end def delete begin retry_while_resource_busy do api_client.delete(url) break end rescue Errors::OperationFailed => ex raise Errors::OperationFailed, err: 'Failed to delete VM' end end def machine env[:machine] end def current_machine? id && machine && id == machine.id end def communicate_ready? current_machine? && machine.communicate.ready? end end end end end