Files
puppet-nova/spec/classes/nova_migration_libvirt_spec.rb
Takashi Kajinami 0fe7de9b77 Prohibit modular libvirt in non RedHat distributions
Currently modular libvirt daemons are supported only by CentOS and
RHEL. This makes sure the deployment fails in case the architecture is
requested in distros which do not support it.

Change-Id: I8eefc65e206bdb0532b6c5d08eee0d35d764a2b9
2023-05-23 11:39:14 +09:00

473 lines
19 KiB
Ruby

#
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
#
# Author: Emilien Macchi <emilien.macchi@enovance.com>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# Unit tests for nova::migration::libvirt class
#
require 'spec_helper'
describe 'nova::migration::libvirt' do
# function here is needed for Puppet 5.5.7+
let :pre_condition do
'function generate($a, $b) { return "0000-111-111" }
include nova
include nova::compute
include nova::compute::libvirt'
end
shared_examples_for 'nova migration with libvirt' do
context 'with default params' do
it { is_expected.to contain_libvirtd_config('auth_tls').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_libvirtd_config('auth_tcp').with_value('none').with_quote(true) }
it { is_expected.to contain_libvirtd_config('ca_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_libvirtd_config('crl_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_nova_config('libvirt/live_migration_tunnelled').with_value('<SERVICE DEFAULT>') }
it { is_expected.to contain_nova_config('libvirt/live_migration_with_native_tls').with_value('<SERVICE DEFAULT>') }
it { is_expected.to contain_nova_config('libvirt/live_migration_downtime').with_value('<SERVICE DEFAULT>') }
it { is_expected.to contain_nova_config('libvirt/live_migration_downtime_steps').with_value('<SERVICE DEFAULT>') }
it { is_expected.to contain_nova_config('libvirt/live_migration_downtime_delay').with_value('<SERVICE DEFAULT>') }
it { is_expected.to contain_nova_config('libvirt/live_migration_completion_timeout').with_value('<SERVICE DEFAULT>') }
it { is_expected.to contain_nova_config('libvirt/live_migration_timeout_action').with_value('<SERVICE DEFAULT>') }
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+tcp://%s/system') }
it { is_expected.to contain_nova_config('libvirt/live_migration_inbound_addr').with_value('<SERVICE DEFAULT>')}
it { is_expected.to contain_nova_config('libvirt/live_migration_permit_post_copy').with_value('<SERVICE DEFAULT>')}
it { is_expected.to contain_nova_config('libvirt/live_migration_permit_auto_converge').with_value('<SERVICE DEFAULT>')}
end
context 'with override_uuid enabled' do
let :params do
{
:override_uuid => true,
}
end
it { is_expected.to contain_file('/etc/libvirt/libvirt_uuid').with({
:content => '0000-111-111',
}).that_requires('Package[libvirt]') }
it { is_expected.to contain_augeas('libvirt-conf-uuid').with({
:context => '/files/etc/libvirt/libvirtd.conf',
:changes => [ "set host_uuid 0000-111-111" ],
}).that_requires('Package[libvirt]').that_notifies('Service[libvirt]') }
end
context 'with override_uuid enabled and host_uuid set' do
let :params do
{
:override_uuid => true,
:host_uuid => 'a8debd9d-e359-4bb2-8c77-edee431f94f2',
}
end
it { is_expected.to contain_file('/etc/libvirt/libvirt_uuid').with({
:content => 'a8debd9d-e359-4bb2-8c77-edee431f94f2',
}).that_requires('Package[libvirt]') }
it { is_expected.to contain_augeas('libvirt-conf-uuid').with({
:context => '/files/etc/libvirt/libvirtd.conf',
:changes => [ "set host_uuid a8debd9d-e359-4bb2-8c77-edee431f94f2" ],
}).that_requires('Package[libvirt]').that_notifies('Service[libvirt]') }
end
context 'with tls enabled' do
let :params do
{
:transport => 'tls',
}
end
it { is_expected.to contain_libvirtd_config('auth_tls').with_value('none').with_quote(true) }
it { is_expected.to contain_libvirtd_config('auth_tcp').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_libvirtd_config('ca_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_libvirtd_config('crl_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+tls://%s/system')}
end
context 'with tls enabled and inbound addr set' do
let :params do
{
:transport => 'tls',
:live_migration_inbound_addr => 'host1.example.com',
}
end
it { is_expected.to contain_libvirtd_config('auth_tls').with_value('none').with_quote(true) }
it { is_expected.to contain_libvirtd_config('auth_tcp').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_libvirtd_config('ca_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_libvirtd_config('crl_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+tls://%s/system')}
it { is_expected.to contain_nova_config('libvirt/live_migration_inbound_addr').with_value('host1.example.com')}
end
context 'with live_migration_with_native_tls flags set' do
let :params do
{
:live_migration_with_native_tls => true,
}
end
it { is_expected.to contain_nova_config('libvirt/live_migration_with_native_tls').with(:value => true) }
end
context 'with migration flags set' do
let :params do
{
:live_migration_tunnelled => true,
:live_migration_downtime => 800,
:live_migration_downtime_steps => 15,
:live_migration_downtime_delay => 5,
:live_migration_completion_timeout => '1500',
:live_migration_timeout_action => 'force_complete',
}
end
it { is_expected.to contain_nova_config('libvirt/live_migration_tunnelled').with(:value => true) }
it { is_expected.to contain_nova_config('libvirt/live_migration_downtime').with_value(800) }
it { is_expected.to contain_nova_config('libvirt/live_migration_downtime_steps').with_value(15) }
it { is_expected.to contain_nova_config('libvirt/live_migration_downtime_delay').with_value(5) }
it { is_expected.to contain_nova_config('libvirt/live_migration_completion_timeout').with_value('1500') }
it { is_expected.to contain_nova_config('libvirt/live_migration_timeout_action').with_value('force_complete') }
end
context 'with live migration auto converge on' do
let :params do
{
:live_migration_permit_post_copy => false,
:live_migration_permit_auto_converge => true,
}
end
it { is_expected.to contain_nova_config('libvirt/live_migration_permit_post_copy').with(:value => false) }
it { is_expected.to contain_nova_config('libvirt/live_migration_permit_auto_converge').with(:value => true) }
end
context 'with auth set to sasl' do
let :params do
{
:auth => 'sasl',
}
end
it { is_expected.to contain_libvirtd_config('auth_tls').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_libvirtd_config('auth_tcp').with_value('sasl').with_quote(true) }
it { is_expected.to contain_libvirtd_config('ca_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_libvirtd_config('crl_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
end
context 'with auth set to sasl and tls enabled' do
let :params do
{
:auth => 'sasl',
:transport => 'tls'
}
end
it { is_expected.to contain_libvirtd_config('auth_tls').with_value('sasl').with_quote(true) }
it { is_expected.to contain_libvirtd_config('auth_tcp').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_libvirtd_config('ca_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_libvirtd_config('crl_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
end
context 'with certificates set and tls enabled' do
let :params do
{
:transport => 'tls',
:ca_file => '/ca',
:crl_file => '/crl',
}
end
it { is_expected.to contain_libvirtd_config('auth_tls').with_value('none').with_quote(true) }
it { is_expected.to contain_libvirtd_config('auth_tcp').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_libvirtd_config('ca_file').with_value('/ca').with_quote(true) }
it { is_expected.to contain_libvirtd_config('crl_file').with_value('/crl').with_quote(true) }
end
context 'with auth set to an invalid setting' do
let :params do
{
:auth => 'inexistent_auth',
}
end
it { expect { is_expected.to contain_class('nova::compute::libvirt') }.to \
raise_error(Puppet::Error) }
end
context 'when not configuring libvirt' do
let :params do
{
:configure_libvirt => false
}
end
it { is_expected.to_not contain_libvirtd_config('auth_tls') }
it { is_expected.to_not contain_libvirtd_config('auth_tcp') }
it { is_expected.to_not contain_libvirtd_config('ca_file') }
it { is_expected.to_not contain_libvirtd_config('crl_file') }
end
context 'when not configuring nova and tls enabled' do
let :params do
{
:configure_nova => false,
:transport => 'tls',
}
end
it { is_expected.not_to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+tls://%s/system') }
end
context 'with ssh transport' do
let :params do
{
:transport => 'ssh',
}
end
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+ssh://%s/system')}
end
context 'with ssh transport with user' do
let :params do
{
:transport => 'ssh',
:client_user => 'foobar'
}
end
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+ssh://foobar@%s/system')}
end
context 'with ssh transport with port' do
let :params do
{
:transport => 'ssh',
:client_port => 1234
}
end
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+ssh://%s:1234/system')}
end
context 'with ssh transport with extraparams' do
let :params do
{
:transport => 'ssh',
:client_extraparams => {'foo' => '%', 'bar' => 'baz'}
}
end
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+ssh://%s/system?foo=%%25&bar=baz')}
end
context 'with tls transport' do
let :params do
{ :transport => 'tls' }
end
it { is_expected.to contain_service('libvirtd-tls').with(
:name => 'libvirtd-tls.socket',
:ensure => 'running',
:enable => true,
)}
it { is_expected.to contain_file('/etc/systemd/system/libvirtd-tls.socket').with(
:ensure => 'absent',
)}
end
context 'with tcp transport' do
let :params do
{
:transport => 'tcp',
:listen_address => '127.0.0.1'
}
end
it { is_expected.to contain_service('libvirtd-tcp').with(
:name => 'libvirtd-tcp.socket',
:ensure => 'running',
:enable => true,
)}
it { is_expected.to contain_file_line('libvirtd-tcp.socket ListenStream').with(
:path => '/etc/systemd/system/libvirtd-tcp.socket',
:line => 'ListenStream=127.0.0.1:16509',
:match => '^ListenStream=.*',
)}
end
end
shared_examples_for 'nova migration with modular libvirt' do
context 'with modular_libvirt set to true' do
let(:params) { { :modular_libvirt => true} }
it { is_expected.to contain_virtproxyd_config('auth_tls').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('auth_tcp').with_value('none').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('ca_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('crl_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_nova_config('libvirt/live_migration_tunnelled').with_value('<SERVICE DEFAULT>') }
it { is_expected.to contain_nova_config('libvirt/live_migration_with_native_tls').with_value('<SERVICE DEFAULT>') }
it { is_expected.to contain_nova_config('libvirt/live_migration_completion_timeout').with_value('<SERVICE DEFAULT>') }
it { is_expected.to contain_nova_config('libvirt/live_migration_timeout_action').with_value('<SERVICE DEFAULT>') }
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+tcp://%s/system') }
it { is_expected.to contain_nova_config('libvirt/live_migration_inbound_addr').with_value('<SERVICE DEFAULT>')}
it { is_expected.to contain_nova_config('libvirt/live_migration_permit_post_copy').with_value('<SERVICE DEFAULT>')}
it { is_expected.to contain_nova_config('libvirt/live_migration_permit_auto_converge').with_value('<SERVICE DEFAULT>')}
end
context 'with tls enabled' do
let :params do
{
:transport => 'tls',
:modular_libvirt => true,
}
end
it { is_expected.to contain_virtproxyd_config('auth_tls').with_value('none').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('auth_tcp').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('ca_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('crl_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+tls://%s/system')}
end
context 'with auth set to sasl' do
let :params do
{
:auth => 'sasl',
:modular_libvirt => true,
}
end
it { is_expected.to contain_virtproxyd_config('auth_tls').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('auth_tcp').with_value('sasl').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('ca_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('crl_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
end
context 'with auth set to sasl and tls enabled' do
let :params do
{
:auth => 'sasl',
:transport => 'tls',
:modular_libvirt => true,
}
end
it { is_expected.to contain_virtproxyd_config('auth_tls').with_value('sasl').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('auth_tcp').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('ca_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('crl_file').with_value('<SERVICE DEFAULT>').with_quote(true) }
end
context 'with certificates set and tls enabled' do
let :params do
{
:transport => 'tls',
:ca_file => '/ca',
:crl_file => '/crl',
:modular_libvirt => true,
}
end
it { is_expected.to contain_virtproxyd_config('auth_tls').with_value('none').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('auth_tcp').with_value('<SERVICE DEFAULT>').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('ca_file').with_value('/ca').with_quote(true) }
it { is_expected.to contain_virtproxyd_config('crl_file').with_value('/crl').with_quote(true) }
end
context 'with ssh transport' do
let :params do
{
:transport => 'ssh',
:modular_libvirt => true,
}
end
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+ssh://%s/system')}
end
context 'with ssh transport with user' do
let :params do
{
:transport => 'ssh',
:client_user => 'foobar',
:modular_libvirt => true,
}
end
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+ssh://foobar@%s/system')}
end
context 'with ssh transport with port' do
let :params do
{
:transport => 'ssh',
:client_port => 1234,
:modular_libvirt => true,
}
end
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+ssh://%s:1234/system')}
end
context 'with ssh transport with extraparams' do
let :params do
{
:transport => 'ssh',
:client_extraparams => {'foo' => '%', 'bar' => 'baz'},
:modular_libvirt => true,
}
end
it { is_expected.to contain_nova_config('libvirt/live_migration_uri').with_value('qemu+ssh://%s/system?foo=%%25&bar=baz')}
end
context 'with tls transport' do
let :params do
{
:transport => 'tls',
:modular_libvirt => true,
:listen_address => '::1'
}
end
it { is_expected.to contain_service('virtproxyd-tls').with(
:name => 'virtproxyd-tls.socket',
:ensure => 'running',
:enable => true,
)}
it { is_expected.to contain_file_line('virtproxyd-tls.socket ListenStream').with(
:path => '/etc/systemd/system/virtproxyd-tls.socket',
:line => 'ListenStream=[::1]:16514',
:match => '^ListenStream=.*',
)}
end
context 'with tcp transport' do
let :params do
{
:transport => 'tcp',
:modular_libvirt => true,
}
end
it { is_expected.to contain_service('virtproxyd-tcp').with(
:name => 'virtproxyd-tcp.socket',
:ensure => 'running',
:enable => true,
)}
it { is_expected.to contain_file('/etc/systemd/system/virtproxyd-tcp.socket').with(
:ensure => 'absent',
)}
end
end
on_supported_os({
:supported_os => OSDefaults.get_supported_os
}).each do |os,facts|
context "on #{os}" do
let (:facts) do
facts.merge!(OSDefaults.get_facts())
end
it_behaves_like 'nova migration with libvirt'
if facts['osfamily'] == 'RedHat'
it_behaves_like 'nova migration with modulr libvirt'
end
end
end
end