1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00

[terremark] rough first pass at adding some models

This commit is contained in:
geemus (Wesley Beary) 2010-04-18 16:27:22 -07:00
parent 98e047c60f
commit c7a39e95c4
6 changed files with 238 additions and 1 deletions

View file

@ -1,9 +1,26 @@
module Fog
module Terremark
module Parser
def parse(data)
case data['type']
when 'application/vnd.vmware.vcloud.vApp+xml'
servers.new(data.merge!(:connection => self))
else
data
end
end
end
def self.new(options={})
unless @required
require 'fog/terremark/models/server'
require 'fog/terremark/models/servers'
require 'fog/terremark/models/task'
require 'fog/terremark/models/tasks'
require 'fog/terremark/parsers/get_catalog'
require 'fog/terremark/parsers/get_catalog_item'
require 'fog/terremark/parsers/get_internet_services'
@ -60,6 +77,7 @@ module Fog
end
class Mock
include Fog::Terremark::Parser
def self.data
@data ||= Hash.new do |hash, key|
@ -81,10 +99,12 @@ module Fog
end
class Real
include Fog::Terremark::Parser
def initialize(options={})
@terremark_password = options[:terremark_password]
@terremark_username = options[:terremark_username]
@terremark_service = options[:terremark_service] || :vcloud
case options[:terremark_service]
when :ecloud
@host = options[:host] || "services.enterprisecloud.terremark.com"

View file

@ -6,16 +6,30 @@ module Terremark
true
end
def terremark_service
@terremark_service ||= begin
Fog.credentials[:terremark_service] || :vcloud
end
end
def [](service)
@@connections ||= Hash.new do |hash, key|
credentials = Fog.credentials.reject do |k,v|
![:terremark_username, :terremark_password].include?(k)
end
hash[key] = Fog::Terremark.new(credentials.merge(:terremark_service => key))
hash[key] = Fog::Terremark.new(credentials.merge(:terremark_service => terremark_service))
end
@@connections[service]
end
def servers
self[terremark_service].servers
end
def tasks
self[terremark_service].tasks
end
else
def initialized?

View file

@ -0,0 +1,55 @@
require 'fog/model'
module Fog
module Terremark
class Server < Fog::Model
identity :id
attribute :name
attribute :status
def destroy
requires :id
data = connection.power_off(@id).body
task = connection.tasks.new(data)
task.wait_for { ready? }
connection.delete_vapp(@id)
true
end
# { '0' => 'Being created', '2' => 'Powered Off', '4' => 'Powered On'}
def ready?
@status == '2'
end
def reboot
requires :id
connection.reset(@id)
true
end
def save
requires :name
data = connection.instantiate_vapp(@name)
merge_attributes(data.body)
task = connection.deploy_vapp(@id)
task.wait_for { ready? }
task = connection.power_on(@id)
task.wait_for { ready? }
true
end
private
def href=(new_href)
@id = new_href.split('/').last.to_i
end
def type=(new_type); end
end
end
end

View file

@ -0,0 +1,53 @@
require 'fog/collection'
require 'fog/terremark/models/server'
module Fog
module Terremark
class Mock
def servers
Fog::Terremark::Servers.new(:connection => self)
end
end
class Real
def servers
Fog::Terremark::Servers.new(:connection => self)
end
end
class Servers < Fog::Collection
model Fog::Terremark::Server
def all
data = connection.get_vdc(vdc_id).body['ResourceEntities'].select do |entity|
entity['type'] == 'application/vnd.vmware.vcloud.vApp+xml'
end
load(data)
end
def get(server_id)
if server_id && server = connection.get_vapp(server_id).body
new(server)
elsif !server_id
nil
end
rescue Excon::Errors::Forbidden
nil
end
def vdc_id
@vdc_id ||= connection.default_vdc_id
end
private
def vdc_id=(new_vdc_id)
@vdc_id = new_vdc_id
end
end
end
end

View file

@ -0,0 +1,39 @@
require 'fog/model'
module Fog
module Terremark
class Task < Fog::Model
identity :id
attribute :end_time, 'endTime'
attribute :owner, 'Owner'
attribute :result, 'Result'
attribute :start_time, 'startTime'
attribute :status
def initialize(attributes = {})
new_owner = attributes.delete('Owner')
new_result = attributes.delete('Result')
super
@owner = connection.parse(new_owner)
@result = connection.parse(new_result)
end
def ready?
@status == 'success'
end
private
def href=(new_href)
@id = new_href.split('/').last.to_i
end
def type=(new_type); end
end
end
end

View file

@ -0,0 +1,56 @@
require 'fog/collection'
require 'fog/terremark/models/server'
module Fog
module Terremark
class Mock
def tasks
Fog::Terremark::Tasks.new(:connection => self)
end
end
class Real
def tasks
Fog::Terremark::Tasks.new(:connection => self)
end
end
class Tasks < Fog::Collection
model Fog::Terremark::Task
def all
data = connection.get_tasks_list(task_list_id).body['Tasks']
load(data)
end
def get(task_id)
if task_id && task = connection.get_task(task_id).body
new(task)
elsif !task_id
nil
end
rescue Excon::Errors::Forbidden
nil
end
def task_list_id
@task_list_id ||=
if connection.default_organization_id && organization = connection.get_organization(connection.default_organization_id).body
organization['Links'].detect {|link| link['type'] == 'application/vnd.vmware.vcloud.tasksList+xml'}['href'].split('/').last.to_i
else
nil
end
end
private
def task_list_id=(new_task_list_id)
@task_list_id = new_task_list_id
end
end
end
end