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:
parent
98e047c60f
commit
c7a39e95c4
6 changed files with 238 additions and 1 deletions
|
@ -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"
|
||||
|
|
|
@ -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?
|
||||
|
|
55
lib/fog/terremark/models/server.rb
Normal file
55
lib/fog/terremark/models/server.rb
Normal 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
|
53
lib/fog/terremark/models/servers.rb
Normal file
53
lib/fog/terremark/models/servers.rb
Normal 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
|
39
lib/fog/terremark/models/task.rb
Normal file
39
lib/fog/terremark/models/task.rb
Normal 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
|
56
lib/fog/terremark/models/tasks.rb
Normal file
56
lib/fog/terremark/models/tasks.rb
Normal 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
|
Loading…
Add table
Reference in a new issue