puppet-midonet/spec/unit/puppet/provider/midonet_host_registry/midonet_api_caller_spec.rb

235 lines
7.4 KiB
Ruby

require 'spec_helper'
describe Puppet::Type.type(:midonet_host_registry).provider(:midonet_api_caller) do
let(:provider) { described_class.new(resource) }
let(:resource) { Puppet::Type.type(:midonet_host_registry).new(
{
:title => 'test',
:ensure => :present,
:midonet_api_url => 'http://controller:8080',
:username => 'username',
:password => 'password',
:tunnelzone_name => 'tzone1',
:underlay_ip_address => '172.10.0.10'
}
)}
describe 'host registry happy path' do
# - Single tunnelzone zones
# - Host registered
# - Allow to be created, and deleted
# - Tunnel zone should be deleted after the host deletion
let(:tzones) {
[
{
"name" => "tzone1",
"id" => "bd69f96a-005b-4d58-9f6c-b8dd9fbb6339",
"type" => "gre"
}
]
}
let(:host) { '04f7361c-4cb8-4cda-a50f-1744fd8b7851' }
before :each do
allow(provider).to receive(:call_get_tunnelzone).and_return(tzones)
allow(provider).to receive(:call_get_host).and_return(host)
allow(provider).to receive(:call_create_tunnelzone_host)
allow(provider).to receive(:call_get_tunnelzone_host).and_return(host)
allow(provider).to receive(:call_delete_tunnelzone_host)
allow(provider).to receive(:call_get_tunnelzone_hosts).and_return([])
allow(provider).to receive(:call_delete_tunnelzone)
allow(provider).to receive(:call_get_token).and_return('thisisafaketoken')
end
it 'registers the host successfully' do
# Expectations over 'create' call
expect(provider).to receive(:call_create_tunnelzone_host).with(tzones[0]['id'], {'hostId' => '04f7361c-4cb8-4cda-a50f-1744fd8b7851', 'ipAddress' => '172.10.0.10'})
expect(provider).to receive(:call_get_tunnelzone)
expect(provider).not_to receive(:call_create_tunnelzone)
expect(provider).to receive(:call_get_host)
provider.create
end
it 'unregisters the host successfully' do
# Expectations over the 'destroy' call
expect(provider).to receive(:call_get_tunnelzone)
expect(provider).to receive(:call_get_host)
expect(provider).to receive(:call_get_tunnelzone_hosts).with(tzones[0]['id'])
expect(provider).to receive(:call_delete_tunnelzone)
provider.destroy
end
end
describe 'when no tunnelzones' do
let(:host) { '04f7361c-4cb8-4cda-a50f-1744fd8b7851' }
let(:tzones) {
[
{
"name" => "tzone1",
"id" => "bd69f96a-005b-4d58-9f6c-b8dd9fbb6339",
"type" => "gre"
}
]
}
it 'creates the tunnelzone and the host' do
allow(provider).to receive(:call_get_tunnelzone).and_return([])
allow(provider).to receive(:call_create_tunnelzone).and_return(tzones)
allow(provider).to receive(:call_get_host).and_return(host)
allow(provider).to receive(:call_create_tunnelzone_host)
allow(provider).to receive(:call_get_token).and_return('thisisafaketoken')
expect(provider).to receive(:call_create_tunnelzone).once
expect(provider.exists?).to eq false
provider.create
end
end
describe 'unregister not the last host in tunnelzone' do
let(:tzones) {
[
{
"name" => "tzone1",
"id" => "bd69f96a-005b-4d58-9f6c-b8dd9fbb6339",
"type" => "gre"
}
]
}
let(:host_to_unregister) { "04f7361c-4cb8-4cda-a50f-1744fd8b7851"}
let(:host_left_in_tunnelzone) {
[
{
"id" => "04f7361c-4cb8-4cda-a50f-1744fd8b7852",
"name" => "compute2.midonet"
}
]
}
it 'should not call the tunnelzone deletion' do
# Preparing the rest responses
allow(provider).to receive(:call_get_tunnelzone).and_return(tzones)
allow(provider).to receive(:call_get_host).and_return(host_to_unregister)
allow(provider).to receive(:call_delete_tunnelzone_host)
allow(provider).to receive(:call_get_tunnelzone_host).and_return(host_to_unregister)
allow(provider).to receive(:call_get_tunnelzone_hosts).and_return(host_left_in_tunnelzone)
allow(provider).to receive(:call_get_token).and_return('thisisafaketoken')
# Set the behaviour expectations
expect(provider).to receive(:call_delete_tunnelzone_host).with(tzones[0]['id'], host_to_unregister)
expect(provider).not_to receive(:call_delete_tunnelzone)
provider.destroy
end
end
describe 'try to register a host without midonet-agent' do
let(:tzones) {
[
{
"name" => "tzone1",
"id" => "bd69f96a-005b-4d58-9f6c-b8dd9fbb6339",
"type" => "gre"
}
]
}
it 'should raise an exception' do
# Preparing the rest responses
allow(provider).to receive(:call_get_tunnelzone).and_return(tzones)
allow(provider).to receive(:call_get_host).and_return([])
allow(provider).to receive(:call_get_token).and_return('thisisafaketoken')
expect {
provider.create
}.to raise_error(RuntimeError)
end
end
describe 'try to register a host with wrong tunnelzone type' do
let(:tzones) {
[
{
"name" => "tzone1",
"id" => "bd69f96a-005b-4d58-9f6c-b8dd9fbb6339",
"type" => "vxlan" # Resource is 'gre' and current one is 'vxlan'
}
]
}
it 'should raise an exception' do
allow(provider).to receive(:call_get_tunnelzone).and_return(tzones)
allow(provider).to receive(:call_get_token).and_return('thisisafaketoken')
expect {
provider.create
}.to raise_error(RuntimeError)
end
end
describe 'try to unregister a host that belongs to a tunnelzone that does not exist' do
it 'should not fail' do
allow(provider).to receive(:call_get_tunnelzone).and_return([])
allow(provider).to receive(:call_get_token).and_return('thisisafaketoken')
expect(provider).not_to receive(:call_delete_tunnelzone_host)
provider.destroy
end
end
describe 'try to unregister a host that does not exist' do
let(:tzones) {
[
{
"name" => "tzone1",
"id" => "bd69f96a-005b-4d58-9f6c-b8dd9fbb6339",
"type" => "gre"
}
]
}
it 'should not fail' do
allow(provider).to receive(:call_get_tunnelzone).and_return(tzones)
allow(provider).to receive(:call_get_host).and_return([])
allow(provider).to receive(:call_get_token).and_return('thisisafaketoken')
expect(provider).not_to receive(:call_delete_tunnelzone_host)
provider.destroy
end
end
describe 'try to unregister a host that does not belong to a tunnelzone' do
let(:tzones) {
[
{
"name" => "tzone1",
"id" => "bd69f96a-005b-4d58-9f6c-b8dd9fbb6339",
"type" => "gre"
}
]
}
let(:hosts) {"04f7361c-4cb8-4cda-a50f-1744fd8b7851" }
it 'should not fail' do
allow(provider).to receive(:call_get_tunnelzone).and_return(tzones)
allow(provider).to receive(:call_get_host).and_return(hosts)
allow(provider).to receive(:call_get_tunnelzone_host).and_return([])
allow(provider).to receive(:call_get_token).and_return('thisisafaketoken')
expect(provider).to receive(:call_get_tunnelzone).once
expect(provider).to receive(:call_get_host).once
expect(provider).to receive(:call_get_tunnelzone_host).once.with(tzones[0]['id'], hosts)
provider.destroy
end
end
end