diff --git a/manifests/compute/libvirt.pp b/manifests/compute/libvirt.pp index 12d4c4aaa..34d17cce6 100644 --- a/manifests/compute/libvirt.pp +++ b/manifests/compute/libvirt.pp @@ -23,6 +23,12 @@ # Defaults to 'host-model' if libvirt_virt_type is set to either # kvm or qemu, otherwise defaults to 'none'. # +# [*libvirt_cpu_model*] +# (optional) The named libvirt CPU model (see names listed in +# /usr/share/libvirt/cpu_map.xml). Only has effect if +# cpu_mode="custom" and virt_type="kvm|qemu". +# Defaults to undef +# # [*libvirt_disk_cachemodes*] # (optional) A list of cachemodes for different disk types, e.g. # ["file=directsync", "block=none"] @@ -87,6 +93,7 @@ class nova::compute::libvirt ( $vncserver_listen = '127.0.0.1', $migration_support = false, $libvirt_cpu_mode = false, + $libvirt_cpu_model = undef, $libvirt_disk_cachemodes = [], $libvirt_inject_password = false, $libvirt_inject_key = false, @@ -185,6 +192,22 @@ class nova::compute::libvirt ( 'libvirt/inject_partition': value => $libvirt_inject_partition; } + # cpu_model param is only valid if cpu_mode=custom + # otherwise it should be commented out + if $libvirt_cpu_mode_real == 'custom' { + validate_string($libvirt_cpu_model) + nova_config { + 'libvirt/cpu_model': value => $libvirt_cpu_model; + } + } else { + nova_config { + 'libvirt/cpu_model': ensure => absent; + } + if $libvirt_cpu_model { + warning('$libvirt_cpu_model requires that $libvirt_cpu_mode => "custom" and will be ignored') + } + } + if size($libvirt_disk_cachemodes) > 0 { nova_config { 'libvirt/disk_cachemodes': value => join($libvirt_disk_cachemodes, ','); diff --git a/spec/classes/nova_compute_libvirt_spec.rb b/spec/classes/nova_compute_libvirt_spec.rb index 30ccf8968..0f404bf4f 100644 --- a/spec/classes/nova_compute_libvirt_spec.rb +++ b/spec/classes/nova_compute_libvirt_spec.rb @@ -37,6 +37,7 @@ describe 'nova::compute::libvirt' do it { is_expected.to contain_nova_config('DEFAULT/compute_driver').with_value('libvirt.LibvirtDriver')} it { is_expected.to contain_nova_config('libvirt/virt_type').with_value('kvm')} it { is_expected.to contain_nova_config('libvirt/cpu_mode').with_value('host-model')} + it { is_expected.to contain_nova_config('libvirt/cpu_model').with_ensure('absent')} it { is_expected.to contain_nova_config('libvirt/disk_cachemodes').with_ensure('absent')} it { is_expected.to contain_nova_config('libvirt/inject_password').with_value(false)} it { is_expected.to contain_nova_config('libvirt/inject_key').with_value(false)} @@ -53,6 +54,7 @@ describe 'nova::compute::libvirt' do { :libvirt_virt_type => 'qemu', :vncserver_listen => '0.0.0.0', :libvirt_cpu_mode => 'host-passthrough', + :libvirt_cpu_model => 'kvm64', :libvirt_disk_cachemodes => ['file=directsync','block=none'], :remove_unused_base_images => true, :remove_unused_kernels => true, @@ -66,6 +68,7 @@ describe 'nova::compute::libvirt' do it { is_expected.to contain_nova_config('DEFAULT/compute_driver').with_value('libvirt.FoobarDriver')} it { is_expected.to contain_nova_config('libvirt/virt_type').with_value('qemu')} it { is_expected.to contain_nova_config('libvirt/cpu_mode').with_value('host-passthrough')} + it { is_expected.to contain_nova_config('libvirt/cpu_model').with_ensure('absent')} it { is_expected.to contain_nova_config('libvirt/disk_cachemodes').with_value('file=directsync,block=none')} it { is_expected.to contain_nova_config('DEFAULT/vncserver_listen').with_value('0.0.0.0')} it { is_expected.to contain_nova_config('DEFAULT/remove_unused_base_images').with_value(true)} @@ -81,6 +84,16 @@ describe 'nova::compute::libvirt' do )} end + describe 'with custom cpu_mode' do + let :params do + { :libvirt_cpu_mode => 'custom', + :libvirt_cpu_model => 'kvm64' } + end + + it { is_expected.to contain_nova_config('libvirt/cpu_mode').with_value('custom')} + it { is_expected.to contain_nova_config('libvirt/cpu_model').with_value('kvm64')} + end + describe 'with migration_support enabled' do context 'with vncserver_listen set to 0.0.0.0' do