[xenserver] Console model created

This commit is contained in:
Gustavo Villalta 2013-07-30 14:01:35 -03:00
parent 2b3b024c72
commit 58aba87c81
7 changed files with 131 additions and 37 deletions

View File

@ -2,17 +2,17 @@ require 'fog/xenserver'
require 'fog/compute'
module Fog
module Compute
module Compute
class XenServer < Fog::Service
require 'fog/xenserver/utilities'
require 'fog/xenserver/parser'
requires :xenserver_username
requires :xenserver_password
requires :xenserver_url
recognizes :xenserver_defaults
model_path 'fog/xenserver/models/compute'
model :server
collection :servers
@ -40,6 +40,8 @@ module Fog
model :host_cpu
model :vlan
collection :vlans
model :console
collection :consoles
request_path 'fog/xenserver/requests/compute'
request :create_server
@ -76,9 +78,9 @@ module Fog
request :destroy_vlan
request :snapshot_server
request :snapshot_revert
class Real
def initialize(options={})
@host = options[:xenserver_url]
@username = options[:xenserver_username]
@ -91,7 +93,7 @@ module Fog
def reload
@connection.authenticate(@username, @password)
end
def default_template=(name)
@defaults[:template] = name
end
@ -102,13 +104,13 @@ module Fog
(s.name == @defaults[:template]) or (s.uuid == @defaults[:template])
end
end
def default_network
networks.find { |n| n.name == (@defaults[:network] || "Pool-wide network associated with eth0") }
end
end
class Mock
def self.data
@ -116,13 +118,13 @@ module Fog
hash[key] = {}
end
end
def self.reset_data(keys=data.keys)
for key in [*keys]
data.delete(key)
end
end
def initialize(options={})
@host = options[:xenserver_pool_master]
@username = options[:xenserver_username]
@ -130,7 +132,7 @@ module Fog
@connection = Fog::Connection.new(@host)
@connection.authenticate(@username, @password)
end
end
end
end

View File

@ -0,0 +1,27 @@
require 'fog/core/model'
module Fog
module Compute
class XenServer
class Console < Fog::Model
# API Reference here:
# http://docs.vmd.citrix.com/XenServer/6.0.0/1.0/en_gb/api/?c=console
identity :reference
attribute :location
attribute :protocol
attribute :uuid
attribute :__vm, aliases: :VM
def vm
begin
vm = service.servers.get __vm
rescue Fog::XenServer::RequestFailed => e
vm = nil
end
vm
end
end
end
end
end

View File

@ -14,7 +14,7 @@ module Fog
attribute :name, :aliases => :name_label
attribute :__affinity, :aliases => :affinity
attribute :allowed_operations
attribute :consoles
attribute :__consoles
attribute :domarch
attribute :domid
attribute :tags
@ -64,6 +64,10 @@ module Fog
service.hosts.get __affinity
end
def consoles
__consoles.collect {|console| service.consoles.get console }
end
def destroy
# Make sure it's halted
stop('hard')
@ -210,4 +214,4 @@ module Fog
end
end
end
end

View File

@ -9,30 +9,30 @@ Shindo.tests('Fog::Compute[:xenserver]', ['xenserver']) do
end
tests("Compute collections") do
%w{ pifs vifs hosts storage_repositories servers networks vbds vdis pools }.each do |collection|
%w{ pifs vifs hosts storage_repositories servers networks vbds vdis pools consoles}.each do |collection|
test("it should respond to #{collection}") { compute.respond_to? collection }
test("it should respond to #{collection}.all") { eval("compute.#{collection}").respond_to? 'all' }
test("it should respond to #{collection}.get") { eval("compute.#{collection}").respond_to? 'get' }
end
# This will fail if there are no PIFs
# This will fail if there are no PIFs
# (not sure if that's gonna be a real scenario though)
tests("PIFs collection") do
test("should have at least one PIF") { compute.pifs.size >= 1 }
end
# This will fail if there are no VIFs
# (not sure if that's gonna be a real scenario though)
tests("VIFs collection") do
test("should have at least one VIF") { compute.vifs.size >= 1 }
end
# This will fail if there are no VIFs
# (not sure if that's gonna be a real scenario though)
tests("Networks collection") do
test("should have at least one Network") { compute.networks.size >= 1 }
tests("each network should be a Fog::Compute::XenServer::Network") do
ok = true
compute.networks.each { |n| ok = false if n.kind_of? Fog::Compute::XenServer::Network }
compute.networks.each { |n| ok = false if n.kind_of? Fog::Compute::XenServer::Network }
end
end
end

View File

@ -0,0 +1,35 @@
Shindo.tests('Fog::Compute[:xenserver] | console model', ['xenserver']) do
consoles = Fog::Compute[:xenserver].consoles
console = consoles.first
tests('The console model should') do
tests('have attributes') do
model_attribute_hash = console.attributes
attributes = [
:reference,
:location,
:protocol,
:uuid,
:__vm
]
tests("The console model should respond to") do
attributes.each do |attribute|
test("#{attribute}") { console.respond_to? attribute }
end
end
tests("The attributes hash should have key") do
attributes.each do |attribute|
test("#{attribute}") { model_attribute_hash.has_key? attribute }
end
end
end
test('be a kind of Fog::Compute::XenServer::Console') { console.kind_of? Fog::Compute::XenServer::Console }
end
tests('A real console should') do
tests('return valid vm') do
test('object') { console.vm.kind_of? Fog::Compute::XenServer::Server }
end
end
end

View File

@ -0,0 +1,19 @@
Shindo.tests('Fog::Compute[:xenserver] | console collection', ['xenserver']) do
conn = Fog::Compute[:xenserver]
tests('The console collection') do
consoles = conn.consoles.all
test('should not be empty') { !consoles.empty? }
test('should be a kind of Fog::Compute::XenServer::Consoles') { consoles.kind_of? Fog::Compute::XenServer::Consoles }
tests('should be able to reload itself').succeeds { consoles.reload }
tests('should be able to get a model') do
tests('by reference').succeeds {
consoles.get(hosts.first.reference).is_a? Fog::Compute::XenServer::Console
}
end
end
end

View File

@ -10,8 +10,8 @@ Shindo.tests('Fog::Compute[:xenserver] | server model', ['xenserver']) do
(servers.templates.find_all { |t| t.name == test_ephemeral_vm_name}).each do |s|
s.destroy
end
server = Fog::Compute[:xenserver].servers.create(:name => test_ephemeral_vm_name,
server = Fog::Compute[:xenserver].servers.create(:name => test_ephemeral_vm_name,
:template_name => test_template_name)
server.reload
@ -25,13 +25,13 @@ Shindo.tests('Fog::Compute[:xenserver] | server model', ['xenserver']) do
end
tests('have attributes') do
model_attribute_hash = server.attributes
attributes = [
attributes = [
:reference,
:uuid,
:is_a_template,
:__affinity,
:allowed_operations,
:consoles,
:__consoles,
:domarch,
:domid,
:__guest_metrics,
@ -47,9 +47,9 @@ Shindo.tests('Fog::Compute[:xenserver] | server model', ['xenserver']) do
:name_description,
:other_config,
:power_state,
:pv_args,
:pv_args,
:__resident_on,
:__vbds,
:__vbds,
:__vifs,
:vcpus_params,
:vcpus_at_startup,
@ -84,7 +84,7 @@ Shindo.tests('Fog::Compute[:xenserver] | server model', ['xenserver']) do
tests("it should create a server") do
s = nil
test("named #{test_ephemeral_vm_name}") do
s = servers.create(:name => test_ephemeral_vm_name,
s = servers.create(:name => test_ephemeral_vm_name,
:template_name => test_template_name)
servers.get(s.reference).name == test_ephemeral_vm_name
end
@ -94,7 +94,7 @@ Shindo.tests('Fog::Compute[:xenserver] | server model', ['xenserver']) do
s = nil
# The template has 2 VIFs already, we add 2 more
test("with 4 NICs") do
s = servers.create(:name => test_ephemeral_vm_name,
s = servers.create(:name => test_ephemeral_vm_name,
:template_name => test_template_name,
:networks => [connection.default_network, connection.default_network])
s.reload
@ -107,9 +107,16 @@ Shindo.tests('Fog::Compute[:xenserver] | server model', ['xenserver']) do
tests("A real server should") do
tests("return valid vbds") do
test("as an array") { server.vbds.kind_of? Array }
server.vbds.each { |i|
test("and each VBD should be a Fog::Compute::XenServer::VBD") { i.kind_of? Fog::Compute::XenServer::VBD }
}
server.vbds.each { |i|
test("and each VBD should be a Fog::Compute::XenServer::VBD") { i.kind_of? Fog::Compute::XenServer::VBD }
}
end
tests('return valid consoles') do
test('as an array') { server.consoles.kind_of? Array }
server.consoles.each { |i|
test('and each Console should be a Fog::Compute::XenServer::Console') { i.kind_of? Fog::Compute::XenServer::Console }
}
end
test("have 0 or more networks") { server.networks.kind_of? Array }
@ -131,33 +138,33 @@ Shindo.tests('Fog::Compute[:xenserver] | server model', ['xenserver']) do
test("always stop when I say stop('hard')") do
server.stop 'hard'
end
# shutdown is async apparently, we wait
test("not be running when it's stopped") do
server.wait_for { !server.running? }
true
end
test("do nothing when I say stop('hard') but it's not running") do
server.stop('hard') == false
end
test("always start when I say start") do
server.start
end
# start is async apparently, we wait
test("be running if I started the server") do
server.wait_for { server.running? }
true
end
test("set attribute PV_bootloader to supergrub") do
server.set_attribute 'PV_bootloader', 'supergrub'
server.reload
server.pv_bootloader == 'supergrub'
end
tests("Creating a snapshot") do
snap_ref = server.snapshot('newsnapshot')
tests("it should create a snapshot") do
@ -166,7 +173,7 @@ Shindo.tests('Fog::Compute[:xenserver] | server model', ['xenserver']) do
end
test("and destroy it afterwards") { servers.get(snap_ref).destroy }
end
test("be able to be destroyed!") do
server.destroy
servers.get_by_name('fog-test-server-shindo') == nil