nova_compute_libvirt_spec.rb 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. require 'spec_helper'
  2. require 'puppet/util/package'
  3. describe 'nova::compute::libvirt' do
  4. let :pre_condition do
  5. "include nova\ninclude nova::compute"
  6. end
  7. shared_examples 'debian-nova-compute-libvirt' do
  8. let(:libvirt_options) do
  9. if facts[:operatingsystem] == 'Ubuntu' and Puppet::Util::Package.versioncmp(facts[:operatingsystemmajrelease], '16') >= 0
  10. 'libvirtd_opts="-l"'
  11. else
  12. 'libvirtd_opts="-d -l"'
  13. end
  14. end
  15. describe 'with default parameters' do
  16. it { is_expected.to contain_class('nova::params')}
  17. it {
  18. is_expected.to contain_package('nova-compute-kvm').with(
  19. :ensure => 'present',
  20. :tag => ['openstack', 'nova-package']
  21. )
  22. is_expected.to contain_package('nova-compute-kvm').that_requires('Anchor[nova::install::begin]')
  23. is_expected.to contain_package('nova-compute-kvm').that_notifies('Anchor[nova::install::end]')
  24. }
  25. it {
  26. is_expected.to contain_package('libvirt').with(
  27. :name => 'libvirtd',
  28. :ensure => 'present'
  29. )
  30. is_expected.to contain_package('libvirt').that_requires('Anchor[nova::install::begin]')
  31. is_expected.to contain_package('libvirt').that_comes_before('Anchor[nova::install::end]')
  32. }
  33. it {
  34. is_expected.to contain_service('libvirt').with(
  35. :name => 'libvirtd',
  36. :enable => true,
  37. :ensure => 'running',
  38. )
  39. }
  40. it { is_expected.to contain_nova_config('DEFAULT/compute_driver').with_value('libvirt.LibvirtDriver')}
  41. it { is_expected.to contain_nova_config('DEFAULT/preallocate_images').with_value('<SERVICE DEFAULT>')}
  42. it { is_expected.to contain_nova_config('libvirt/virt_type').with_value('kvm')}
  43. it { is_expected.to contain_nova_config('libvirt/cpu_mode').with_value('host-model')}
  44. it { is_expected.to contain_nova_config('libvirt/cpu_model').with_ensure('absent')}
  45. it { is_expected.to contain_nova_config('libvirt/disk_cachemodes').with_ensure('absent')}
  46. it { is_expected.to contain_nova_config('libvirt/inject_password').with_value(false)}
  47. it { is_expected.to contain_nova_config('libvirt/inject_key').with_value(false)}
  48. it { is_expected.to contain_nova_config('libvirt/inject_partition').with_value(-2)}
  49. it { is_expected.to contain_nova_config('vnc/vncserver_listen').with_value('127.0.0.1')}
  50. it { is_expected.to contain_nova_config('DEFAULT/remove_unused_base_images').with_ensure('absent')}
  51. it { is_expected.to contain_nova_config('DEFAULT/remove_unused_original_minimum_age_seconds').with_ensure('absent')}
  52. it { is_expected.to contain_nova_config('libvirt/remove_unused_resized_minimum_age_seconds').with_ensure('absent')}
  53. end
  54. describe 'with params' do
  55. let :params do
  56. { :ensure_package => 'latest',
  57. :libvirt_virt_type => 'qemu',
  58. :vncserver_listen => '0.0.0.0',
  59. :libvirt_cpu_mode => 'host-passthrough',
  60. :libvirt_cpu_model => 'kvm64',
  61. :libvirt_disk_cachemodes => ['file=directsync','block=none'],
  62. :libvirt_hw_disk_discard => 'unmap',
  63. :libvirt_hw_machine_type => 'x86_64=machinetype1,armv7l=machinetype2',
  64. :libvirt_enabled_perf_events => ['cmt', 'mbml', 'mbmt'],
  65. :remove_unused_base_images => true,
  66. :remove_unused_resized_minimum_age_seconds => 3600,
  67. :remove_unused_original_minimum_age_seconds => 3600,
  68. :libvirt_service_name => 'custom_service',
  69. :virtlock_service_name => 'virtlock',
  70. :virtlog_service_name => 'virtlog',
  71. :compute_driver => 'libvirt.FoobarDriver',
  72. :preallocate_images => 'space',
  73. }
  74. end
  75. it { is_expected.to contain_package('nova-compute-qemu').with(
  76. :name => 'nova-compute-qemu',
  77. :ensure => 'latest'
  78. ) }
  79. it { is_expected.to contain_nova_config('DEFAULT/compute_driver').with_value('libvirt.FoobarDriver')}
  80. it { is_expected.to contain_nova_config('DEFAULT/preallocate_images').with_value('space')}
  81. it { is_expected.to contain_nova_config('libvirt/virt_type').with_value('qemu')}
  82. it { is_expected.to contain_nova_config('libvirt/cpu_mode').with_value('host-passthrough')}
  83. it { is_expected.to contain_nova_config('libvirt/cpu_model').with_ensure('absent')}
  84. it { is_expected.to contain_nova_config('libvirt/disk_cachemodes').with_value('file=directsync,block=none')}
  85. it { is_expected.to contain_nova_config('libvirt/hw_disk_discard').with_value('unmap')}
  86. it { is_expected.to contain_nova_config('libvirt/hw_machine_type').with_value('x86_64=machinetype1,armv7l=machinetype2')}
  87. it { is_expected.to contain_nova_config('libvirt/enabled_perf_events').with_value('cmt,mbml,mbmt')}
  88. it { is_expected.to contain_nova_config('vnc/vncserver_listen').with_value('0.0.0.0')}
  89. it { is_expected.to contain_nova_config('DEFAULT/remove_unused_base_images').with_value(true)}
  90. it { is_expected.to contain_nova_config('DEFAULT/remove_unused_original_minimum_age_seconds').with_value(3600)}
  91. it { is_expected.to contain_nova_config('libvirt/remove_unused_resized_minimum_age_seconds').with_value(3600)}
  92. it {
  93. is_expected.to contain_service('libvirt').with(
  94. :name => 'custom_service',
  95. :enable => true,
  96. :ensure => 'running',
  97. :before => ['Service[nova-compute]']
  98. )
  99. is_expected.to contain_service('virtlockd').with(
  100. :name => 'virtlock',
  101. :enable => true,
  102. :ensure => 'running'
  103. )
  104. is_expected.to contain_service('virtlogd').with(
  105. :name => 'virtlog',
  106. :enable => true,
  107. :ensure => 'running'
  108. )
  109. }
  110. end
  111. describe 'with custom cpu_mode' do
  112. let :params do
  113. { :libvirt_cpu_mode => 'custom',
  114. :libvirt_cpu_model => 'kvm64' }
  115. end
  116. it { is_expected.to contain_nova_config('libvirt/cpu_mode').with_value('custom')}
  117. it { is_expected.to contain_nova_config('libvirt/cpu_model').with_value('kvm64')}
  118. end
  119. describe 'with qemu as virt_type' do
  120. let :params do
  121. { :libvirt_virt_type => 'qemu' }
  122. end
  123. it { is_expected.to contain_nova_config('libvirt/cpu_mode').with_value('none')}
  124. end
  125. describe 'with migration_support enabled' do
  126. context 'with vncserver_listen set to 0.0.0.0' do
  127. let :params do
  128. { :vncserver_listen => '0.0.0.0',
  129. :migration_support => true }
  130. end
  131. it { is_expected.to contain_class('nova::migration::libvirt')}
  132. it { is_expected.to contain_nova_config('vnc/vncserver_listen').with_value('0.0.0.0')}
  133. it { is_expected.to contain_file_line('/etc/default/libvirtd libvirtd opts').with(:line => libvirt_options) }
  134. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf listen_tls').with(:line => "listen_tls = 0") }
  135. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf listen_tcp').with(:line => "listen_tcp = 1") }
  136. it { is_expected.not_to contain_file_line('/etc/libvirt/libvirtd.conf auth_tls')}
  137. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf auth_tcp').with(:line => "auth_tcp = \"none\"") }
  138. end
  139. context 'with vncserver_listen set to ::0' do
  140. let :params do
  141. { :vncserver_listen => '::0',
  142. :migration_support => true }
  143. end
  144. it { is_expected.to contain_class('nova::migration::libvirt')}
  145. it { is_expected.to contain_nova_config('vnc/vncserver_listen').with_value('::0')}
  146. it { is_expected.to contain_file_line('/etc/default/libvirtd libvirtd opts').with(:line => libvirt_options) }
  147. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf listen_tls').with(:line => "listen_tls = 0") }
  148. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf listen_tcp').with(:line => "listen_tcp = 1") }
  149. it { is_expected.not_to contain_file_line('/etc/libvirt/libvirtd.conf auth_tls')}
  150. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf auth_tcp').with(:line => "auth_tcp = \"none\"") }
  151. end
  152. context 'with custom libvirt service name on Debian platforms' do
  153. let :params do
  154. { :libvirt_service_name => 'libvirtd',
  155. :vncserver_listen => '0.0.0.0',
  156. :migration_support => true }
  157. end
  158. it { is_expected.to contain_file_line('/etc/default/libvirtd libvirtd opts').with(:line => libvirt_options) }
  159. end
  160. end
  161. describe 'when manage_libvirt_services is set to false' do
  162. context 'without libvirt packages & services' do
  163. let :params do
  164. { :manage_libvirt_services => false }
  165. end
  166. it { is_expected.not_to contain_package('libvirt') }
  167. it { is_expected.not_to contain_service('libvirt') }
  168. it { is_expected.not_to contain_package('libvirt-nwfilter') }
  169. it { is_expected.not_to contain_service('messagebus') }
  170. it { is_expected.not_to contain_service('virtlockd') }
  171. it { is_expected.not_to contain_service('virtlogd') }
  172. end
  173. end
  174. end
  175. shared_examples 'redhat-nova-compute-libvirt' do
  176. before do
  177. facts.merge!({ :operatingsystem => 'RedHat', :osfamily => 'RedHat',
  178. :operatingsystemrelease => 6.5,
  179. :operatingsystemmajrelease => '6' })
  180. end
  181. describe 'with default parameters' do
  182. it { is_expected.to contain_class('nova::params')}
  183. it { is_expected.to contain_package('libvirt').with(
  184. :name => 'libvirt-daemon-kvm',
  185. :ensure => 'present',
  186. ) }
  187. it { is_expected.to contain_package('libvirt-nwfilter').with(
  188. :name => 'libvirt-daemon-config-nwfilter',
  189. :ensure => 'present',
  190. :before => ['Service[libvirt]', 'Anchor[nova::install::end]'],
  191. ) }
  192. it { is_expected.to contain_service('libvirt').with(
  193. :name => 'libvirtd',
  194. :enable => true,
  195. :ensure => 'running',
  196. :before => ['Service[nova-compute]'],
  197. )}
  198. it { is_expected.to contain_service('messagebus').with(
  199. :ensure => 'running',
  200. :enable => true,
  201. :before => ['Service[libvirt]'],
  202. :name => 'messagebus'
  203. ) }
  204. describe 'on rhel 7' do
  205. before do
  206. facts.merge!({
  207. :operatingsystemrelease => 7.0,
  208. :operatingsystemmajrelease => '7'
  209. })
  210. end
  211. it { is_expected.to contain_service('libvirt')}
  212. it { is_expected.to contain_service('messagebus').with(
  213. :name => 'dbus'
  214. )}
  215. end
  216. it { is_expected.to contain_nova_config('DEFAULT/compute_driver').with_value('libvirt.LibvirtDriver')}
  217. it { is_expected.to contain_nova_config('libvirt/virt_type').with_value('kvm')}
  218. it { is_expected.to contain_nova_config('libvirt/inject_password').with_value(false)}
  219. it { is_expected.to contain_nova_config('libvirt/inject_key').with_value(false)}
  220. it { is_expected.to contain_nova_config('libvirt/inject_partition').with_value(-2)}
  221. it { is_expected.to contain_nova_config('vnc/vncserver_listen').with_value('127.0.0.1')}
  222. it { is_expected.to contain_nova_config('DEFAULT/remove_unused_base_images').with_ensure('absent')}
  223. it { is_expected.to contain_nova_config('DEFAULT/remove_unused_original_minimum_age_seconds').with_ensure('absent')}
  224. it { is_expected.to contain_nova_config('libvirt/remove_unused_resized_minimum_age_seconds').with_ensure('absent')}
  225. end
  226. describe 'with params' do
  227. let :params do
  228. { :libvirt_virt_type => 'qemu',
  229. :vncserver_listen => '0.0.0.0',
  230. :remove_unused_base_images => true,
  231. :remove_unused_resized_minimum_age_seconds => 3600,
  232. :remove_unused_original_minimum_age_seconds => 3600
  233. }
  234. end
  235. it { is_expected.to contain_nova_config('libvirt/virt_type').with_value('qemu')}
  236. it { is_expected.to contain_nova_config('vnc/vncserver_listen').with_value('0.0.0.0')}
  237. it { is_expected.to contain_nova_config('DEFAULT/remove_unused_base_images').with_value(true)}
  238. it { is_expected.to contain_nova_config('DEFAULT/remove_unused_original_minimum_age_seconds').with_value(3600)}
  239. it { is_expected.to contain_nova_config('libvirt/remove_unused_resized_minimum_age_seconds').with_value(3600)}
  240. it { is_expected.to contain_package('libvirt').with(
  241. :name => 'libvirt-daemon-kvm',
  242. :ensure => 'present'
  243. ) }
  244. end
  245. describe 'with migration_support enabled' do
  246. context 'with vncserver_listen set to 0.0.0.0' do
  247. let :params do
  248. { :vncserver_listen => '0.0.0.0',
  249. :migration_support => true }
  250. end
  251. it { is_expected.to contain_class('nova::migration::libvirt')}
  252. it { is_expected.to contain_nova_config('vnc/vncserver_listen').with_value('0.0.0.0')}
  253. it { is_expected.to contain_file_line('/etc/sysconfig/libvirtd libvirtd args').with(:line => 'LIBVIRTD_ARGS="--listen"') }
  254. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf listen_tls').with(:line => "listen_tls = 0") }
  255. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf listen_tcp').with(:line => "listen_tcp = 1") }
  256. it { is_expected.not_to contain_file_line('/etc/libvirt/libvirtd.conf auth_tls')}
  257. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf auth_tcp').with(:line => "auth_tcp = \"none\"") }
  258. end
  259. context 'with vncserver_listen set to ::0' do
  260. let :params do
  261. { :vncserver_listen => '::0',
  262. :migration_support => true }
  263. end
  264. it { is_expected.to contain_class('nova::migration::libvirt')}
  265. it { is_expected.to contain_nova_config('vnc/vncserver_listen').with_value('::0')}
  266. it { is_expected.to contain_file_line('/etc/sysconfig/libvirtd libvirtd args').with(:line => 'LIBVIRTD_ARGS="--listen"') }
  267. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf listen_tls').with(:line => "listen_tls = 0") }
  268. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf listen_tcp').with(:line => "listen_tcp = 1") }
  269. it { is_expected.not_to contain_file_line('/etc/libvirt/libvirtd.conf auth_tls')}
  270. it { is_expected.to contain_file_line('/etc/libvirt/libvirtd.conf auth_tcp').with(:line => "auth_tcp = \"none\"") }
  271. end
  272. end
  273. describe 'when manage_libvirt_services is set to false' do
  274. context 'without libvirt packages & services' do
  275. let :params do
  276. { :manage_libvirt_services => false }
  277. end
  278. it { is_expected.not_to contain_package('libvirt') }
  279. it { is_expected.not_to contain_service('libvirt') }
  280. it { is_expected.not_to contain_package('libvirt-nwfilter') }
  281. it { is_expected.not_to contain_service('messagebus') }
  282. it { is_expected.not_to contain_service('virtlockd') }
  283. it { is_expected.not_to contain_service('virtlogd') }
  284. end
  285. end
  286. describe 'with default parameters on Fedora' do
  287. before do
  288. facts.merge!({ :operatingsystem => 'Fedora', :osfamily => 'RedHat' })
  289. end
  290. it { is_expected.to contain_class('nova::params')}
  291. it { is_expected.to contain_package('libvirt').with(
  292. :name => 'libvirt-daemon-kvm',
  293. :ensure => 'present'
  294. ) }
  295. it { is_expected.to contain_package('libvirt-nwfilter').with(
  296. :name => 'libvirt-daemon-config-nwfilter',
  297. :ensure => 'present',
  298. :before => ['Service[libvirt]', 'Anchor[nova::install::end]'],
  299. ) }
  300. it { is_expected.to contain_service('libvirt').with(
  301. :name => 'libvirtd',
  302. :enable => true,
  303. :ensure => 'running',
  304. :before => ['Service[nova-compute]']
  305. )}
  306. it { is_expected.to contain_nova_config('DEFAULT/compute_driver').with_value('libvirt.LibvirtDriver')}
  307. it { is_expected.to contain_nova_config('libvirt/virt_type').with_value('kvm')}
  308. it { is_expected.to contain_nova_config('vnc/vncserver_listen').with_value('127.0.0.1')}
  309. end
  310. end
  311. on_supported_os({
  312. :supported_os => OSDefaults.get_supported_os
  313. }).each do |os,facts|
  314. context "on #{os}" do
  315. case [:osfamily]
  316. when 'Debian'
  317. case [:operatingsystem]
  318. when 'Debian'
  319. let (:facts) do
  320. facts.merge!(OSDefaults.get_facts({
  321. :os_package_family => 'debian',
  322. :operatingsystemmajrelease => '8'}))
  323. end
  324. it_behaves_like 'debian-nova-compute-libvirt'
  325. when 'Ubuntu'
  326. let (:facts) do
  327. facts.merge!(OSDefaults.get_facts({
  328. :os_package_family => 'ubuntu',
  329. :operatingsystemmajrelease => '16.04'}))
  330. end
  331. it_behaves_like 'debian-nova-compute-libvirt'
  332. end
  333. when 'RedHat'
  334. let (:facts) do
  335. facts.merge!(OSDefaults.get_facts({ :os_package_type => 'rpm' }))
  336. end
  337. it_behaves_like 'redhat-nova-compute-libvirt'
  338. end
  339. end
  340. end
  341. end