mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
* Added create_vif tests
* Server.save now properly creates additional VIFs when required * Added create_vif_custome request to create VIFs with custom params
This commit is contained in:
parent
9ea96293e6
commit
ccc7aee3a0
5 changed files with 124 additions and 21 deletions
|
@ -126,8 +126,8 @@ module Fog
|
|||
|
||||
def save(params = {})
|
||||
requires :name
|
||||
networks = params[:networks] || []
|
||||
attributes = connection.get_record(connection.create_server( name, template_name, networks ), 'VM')
|
||||
nets = attributes[:networks] || []
|
||||
attributes = connection.get_record(connection.create_server( name, template_name, nets ), 'VM')
|
||||
merge_attributes attributes
|
||||
true
|
||||
end
|
||||
|
|
|
@ -26,19 +26,15 @@ module Fog
|
|||
raise "Invalid template"
|
||||
end
|
||||
|
||||
#FIXME: need to check that template exist actually
|
||||
raise "Template #{template_string} does not exist" if template.allowed_operations.nil?
|
||||
raise 'Clone Operation not Allowed' unless template.allowed_operations.include?('clone')
|
||||
|
||||
# Clone the VM template
|
||||
ref = @connection.request(
|
||||
{:parser => Fog::Parsers::XenServer::Base.new, :method => 'VM.clone'},
|
||||
template.reference, name_label
|
||||
)
|
||||
ref = clone_server name_label, template.reference
|
||||
# Add additional NICs
|
||||
networks.each do |n|
|
||||
create_vif ref, n.reference
|
||||
end
|
||||
#new_vm = servers.get get_vm_by_name( name_label )
|
||||
@connection.request({:parser => Fog::Parsers::XenServer::Base.new, :method => 'VM.provision'}, ref)
|
||||
start_vm( ref ) unless extra_args[:auto_start] == false
|
||||
|
||||
|
|
|
@ -4,23 +4,41 @@ module Fog
|
|||
|
||||
class Real
|
||||
|
||||
def create_vif( vm_ref, network_ref )
|
||||
vif_config = default_vif_config(vm_ref, network_ref)
|
||||
def create_vif( vm_ref, network_ref, device = -1)
|
||||
raise ArgumentError.new('Invalid vm_ref') if vm_ref.nil?
|
||||
raise ArgumentError.new('Invalid network_ref') if network_ref.nil?
|
||||
vif_config = default_vif_config(vm_ref, network_ref, device.to_s)
|
||||
@connection.request({:parser => Fog::Parsers::XenServer::Base.new, :method => 'VIF.create'}, vif_config )
|
||||
end
|
||||
|
||||
def default_vif_config( vm_ref, network_ref, device_number = '0' )
|
||||
{
|
||||
|
||||
def create_vif_custom( conf )
|
||||
raise ArgumentError.new('VIF config is not a Hash') if not conf.kind_of?(Hash)
|
||||
@connection.request({:parser => Fog::Parsers::XenServer::Base.new, :method => 'VIF.create'}, conf )
|
||||
end
|
||||
|
||||
def default_vif_config( vm_ref, network_ref, device_number = '-1' )
|
||||
conf = {
|
||||
'MAC_autogenerated' => 'True',
|
||||
'VM' => vm_ref,
|
||||
'network' => network_ref,
|
||||
'device' => device_number,
|
||||
'MAC' => '',
|
||||
'MTU' => '0',
|
||||
'other_config' => {},
|
||||
'qos_algorithm_type' => 'ratelimit',
|
||||
'qos_algorithm_params' => {}
|
||||
}
|
||||
if device_number.to_i >= 0
|
||||
conf['device'] = device_number
|
||||
else
|
||||
highest_dev = 0
|
||||
server = servers.get vm_ref
|
||||
server.vifs.each do |vif|
|
||||
dev = vif.device.to_i
|
||||
highest_dev = dev if dev > highest_dev
|
||||
end
|
||||
conf['device'] = (highest_dev + 1).to_s
|
||||
end
|
||||
conf
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -70,21 +70,22 @@ Shindo.tests('Fog::Compute[:xenserver] | server model', ['xenserver']) do
|
|||
tests("Creating a server") do
|
||||
tests("it should create a server") do
|
||||
s = nil
|
||||
test("named FOOBARSTUFF") do
|
||||
s = servers.create(:name => "FOOBARSTUFF",
|
||||
test("named #{test_ephemeral_vm_name}") do
|
||||
s = servers.create(:name => test_ephemeral_vm_name,
|
||||
:template_name => test_template_name)
|
||||
servers.get(s.reference).name == "FOOBARSTUFF"
|
||||
servers.get(s.reference).name == test_ephemeral_vm_name
|
||||
end
|
||||
test("and destroy it afterwards") { s.destroy }
|
||||
end
|
||||
tests("it should create a server") do
|
||||
s = nil
|
||||
test("with 3 NICs") do
|
||||
s = servers.create(:name => "FOOBARSTUFF",
|
||||
# The template has 2 VIFs already, we add 2 more
|
||||
test("with 4 NICs") do
|
||||
s = servers.create(:name => test_ephemeral_vm_name,
|
||||
:template_name => test_template_name,
|
||||
:networks => [connection.default_network, connection.default_network, connection.default_network])
|
||||
:networks => [connection.default_network, connection.default_network])
|
||||
s.reload
|
||||
s.networks.size == 3
|
||||
s.networks.size == 4
|
||||
end
|
||||
test("and destroy it afterwards") { s.destroy }
|
||||
end
|
||||
|
|
88
tests/xenserver/requests/compute/create_vif_tests.rb
Normal file
88
tests/xenserver/requests/compute/create_vif_tests.rb
Normal file
|
@ -0,0 +1,88 @@
|
|||
Shindo.tests('Fog::Compute[:xenserver] | create_vif request', ['xenserver']) do
|
||||
|
||||
compute = Fog::Compute[:xenserver]
|
||||
servers = compute.servers
|
||||
# pre-flight cleanup
|
||||
(servers.all :name_matches => test_ephemeral_vm_name).each do |s|
|
||||
s.destroy
|
||||
end
|
||||
|
||||
tests('create_vif should') do
|
||||
vm_ref = compute.create_server test_ephemeral_vm_name, test_template_name
|
||||
ref = compute.create_vif vm_ref, compute.networks.first.reference
|
||||
s = servers.get vm_ref
|
||||
test('return a valid reference') do
|
||||
if (ref != "OpaqueRef:NULL") and (ref.split("1") != "NULL")
|
||||
true
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
test('add the VIF to the server') do
|
||||
!(s.vifs.find { |vif| vif.reference == ref }).nil?
|
||||
end
|
||||
raises(ArgumentError, 'raise ArgumentError when vm_ref nil') do
|
||||
ref = compute.create_vif nil, compute.networks.first.reference
|
||||
end
|
||||
raises(ArgumentError, 'raise ArgumentError when network_ref nil') do
|
||||
ref = compute.create_vif vm_ref, nil
|
||||
end
|
||||
test('create a VIF with device number 9') do
|
||||
ref = compute.create_vif vm_ref, compute.networks.first.reference, 9
|
||||
s.reload
|
||||
(compute.vifs.get(ref).device == 9.to_s) and \
|
||||
!(s.vifs.find { |vif| vif.reference == ref }).nil?
|
||||
end
|
||||
end
|
||||
|
||||
tests('create_vif_custom should') do
|
||||
vm_ref = compute.create_server test_ephemeral_vm_name, test_template_name
|
||||
network_ref = compute.networks.first.reference
|
||||
conf = {
|
||||
'MAC_autogenerated' => 'True',
|
||||
'VM' => vm_ref,
|
||||
'network' => network_ref,
|
||||
'MAC' => '',
|
||||
'device' => '4',
|
||||
'MTU' => '0',
|
||||
'other_config' => {},
|
||||
'qos_algorithm_type' => 'ratelimit',
|
||||
'qos_algorithm_params' => {}
|
||||
}
|
||||
ref = compute.create_vif_custom conf
|
||||
s = servers.get vm_ref
|
||||
test('return a valid reference') do
|
||||
if (ref != "OpaqueRef:NULL") and (ref.split("1") != "NULL")
|
||||
true
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
test('add the VIF to the server') do
|
||||
!(s.vifs.find { |vif| vif.reference == ref }).nil?
|
||||
end
|
||||
raises(ArgumentError, 'raise ArgumentError when conf is not a Hash') do
|
||||
conf['device'] = '5'
|
||||
ref = compute.create_vif_custom 'foobar'
|
||||
end
|
||||
test('create a VIF with device number 9') do
|
||||
conf['device'] = '9'
|
||||
ref = compute.create_vif_custom conf
|
||||
s.reload
|
||||
(compute.vifs.get(ref).device == 9.to_s) and \
|
||||
!(s.vifs.find { |vif| vif.reference == ref }).nil?
|
||||
end
|
||||
test('create a VIF with MAC 11:22:33:44:55:66') do
|
||||
conf['MAC_autogenerated'] = 'False'
|
||||
conf['MAC'] = '11:22:33:44:55:66'
|
||||
conf['device'] = '6'
|
||||
ref = compute.create_vif_custom conf
|
||||
vif = compute.vifs.get ref
|
||||
vif.mac == '11:22:33:44:55:66'
|
||||
end
|
||||
end
|
||||
|
||||
tests('The expected options') do
|
||||
raises(ArgumentError, 'raises ArgumentError when vm_ref,net_ref missing') { compute.create_vif }
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue