Project

General

Profile

Download (2.27 KB) Statistics
| Branch: | Tag: | Revision:
module Foreman::Model
class Rackspace < ComputeResource

validates :user, :password, :region, :presence => true
validate :ensure_valid_region

def provided_attributes
super.merge({ :ip => :public_ip_address })
end

def self.model_name
ComputeResource.model_name
end

def capabilities
[:image]
end

def find_vm_by_uuid uuid
client.servers.get(uuid)
rescue Fog::Compute::Rackspace::Error
raise(ActiveRecord::RecordNotFound)
end

def create_vm args = { }
super(args)
rescue Exception => e
logger.debug "Unhandled Rackspace error: #{e.class}:#{e.message}\n " + e.backtrace.join("\n ")
errors.add(:base, e.message.to_s)
false
end

def security_groups
["default"]
end

def regions
['IAD', 'ORD', 'DFW', 'LON', 'SYD', 'HKG']
end

def zones
["rackspace"]
end

def flavors
client.flavors
end

def available_images
client.images
end

def test_connection options = {}
super and flavors
rescue Excon::Errors::Unauthorized => e
errors[:base] << e.response.body
rescue Fog::Compute::Rackspace::Error => e
errors[:base] << e.message
end

def region= value
self.uuid = value
end

def region
uuid
end

def destroy_vm(uuid)
vm = find_vm_by_uuid(uuid)
vm.destroy if vm
true
end

# not supporting update at the moment
def update_required?(old_attrs, new_attrs)
false
end

def provider_friendly_name
"Rackspace"
end

def ensure_valid_region
unless regions.include?(region.upcase)
errors.add(:region, 'is not valid')
end
end

def associated_host(vm)
Host.authorized(:view_hosts, Host).where(:ip => [vm.public_ip_address, vm.private_ip_address]).first
end

private

def client
@client = Fog::Compute.new(
:provider => "Rackspace",
:version => 'v2',
:rackspace_api_key => password,
:rackspace_username => user,
:rackspace_auth_url => url,
:rackspace_region => region.downcase.to_sym
)
return @client
end

def vm_instance_defaults
#256 server
super.merge(
:flavor_id => 1
)
end

end
end
(6-6/7)