Convert to rspec-puppet-facts and fix monasca::alarmdefs

Converts all testing to use rspec-puppet-facts and
removes virtualenv package since that is installed
by the ::python module otherwise it causes a resource
redeclaration.

Change-Id: I651ae89e8f355a6f68b8e3aeb4eef24b36713c2f
This commit is contained in:
Tobias Urdin 2018-11-24 15:24:33 +01:00
parent ea9f24a81c
commit e7fe398fda
7 changed files with 221 additions and 177 deletions

View File

@ -31,6 +31,8 @@
# [*virtual_env*]
# location of python virtual environment to install to
#
## DEPRECATED PARAMS
#
# [*install_python_deps*]
# flag for whether or not to install python dependencies
#
@ -47,12 +49,20 @@ class monasca::alarmdefs(
$auth_url = undef,
$project_name = undef,
$virtual_env = '/var/www/monasca-alarmdefs',
$install_python_deps = true,
$python_dep_ensure = 'present',
## DEPRECATED PARAMS
$install_python_deps = undef,
$python_dep_ensure = undef,
)
{
include ::monasca::params
if $install_python_deps {
warning('monasca::alarmdefs::install_python_deps is deprecated and has no effect')
}
if $python_dep_ensure {
warning('monasca::alarmdefs::python_dep_ensure is deprecated and has no effect')
}
$alarm_definition_config = '/tmp/alarm_definition_config.json'
$notification_config = '/tmp/notification_config.json'
$notification_assignments = '/tmp/notification_assignments.json'
@ -64,20 +74,6 @@ class monasca::alarmdefs(
$sql_password = $::monasca::params::sql_password
$sql_port = $::monasca::params::sql_port
if $install_python_deps {
# Name virtualenv instead of python-virtualenv for compat with puppet-python
package { 'virtualenv':
ensure => $python_dep_ensure,
name => 'python-virtualenv',
before => Python::Virtualenv[$virtual_env],
}
package { 'python-dev':
ensure => $python_dep_ensure,
before => Python::Virtualenv[$virtual_env],
}
}
python::virtualenv { $virtual_env :
owner => 'root',
group => 'root',

View File

@ -0,0 +1,5 @@
---
deprecations:
- |
The parameters install_python_deps and python_dep_ensure in monasca::alarmdefs
is deprecated, has no effect and will be removed in a future release.

View File

@ -1,9 +1,24 @@
require 'spec_helper'
describe 'monasca::alarmdefs' do
describe 'on debian platforms' do
let :facts do
{ :osfamily => 'Debian' }
let :pre_condition do
"include ::monasca
include ::monasca::api"
end
shared_examples 'monasca::alarmdefs' do
it { should contain_python__virtualenv('/var/www/monasca-alarmdefs') }
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 'monasca::alarmdefs'
end
end
end

View File

@ -1,16 +1,9 @@
require 'spec_helper'
describe 'monasca::checks::libvirt' do
describe 'on debian platforms' do
let :facts do
@default_facts.merge({
:osfamily => 'Debian',
:os => { 'family' => 'Debian' },
})
end
shared_examples 'monasca::checks::libvirt' do
let :libvirt_file do
"/etc/monasca/agent/conf.d/libvirt.yaml"
'/etc/monasca/agent/conf.d/libvirt.yaml'
end
let :pre_condition do
@ -23,34 +16,48 @@ describe 'monasca::checks::libvirt' do
}"
end
let(:params) { {
:admin_password => 'password',
:admin_tenant_name => 'tenant_name',
:admin_user => 'user',
:identity_uri => 'uri',
:host_aggregate_re => 'M4',
} }
let :params do
{
:admin_password => 'password',
:admin_tenant_name => 'tenant_name',
:admin_user => 'user',
:identity_uri => 'uri',
:host_aggregate_re => 'M4',
}
end
it 'builds the libvirt config file properly' do
is_expected.to contain_file(libvirt_file).with_content(/^\s*admin_password: password$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*admin_tenant_name: tenant_name$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*admin_user: user$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*identity_uri: uri$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*cache_dir: \/dev\/shm$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*nova_refresh: 14400$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*network_use_bits: true$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*metadata: \[\]$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*customer_metadata: \[\]$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*vm_probation: 300$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*ping_check: false$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*alive_only: false$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*disk_collection_period: 0$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*vm_cpu_check_enable: true$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*vm_disks_check_enable: true$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*vm_network_check_enable: true$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*vm_ping_check_enable: false$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*vm_extended_disks_check_enable: false$/)
is_expected.to contain_file(libvirt_file).with_content(/^\s*host_aggregate_re: M4$/)
should contain_file(libvirt_file).with_content(/^\s*admin_password: password$/)
should contain_file(libvirt_file).with_content(/^\s*admin_tenant_name: tenant_name$/)
should contain_file(libvirt_file).with_content(/^\s*admin_user: user$/)
should contain_file(libvirt_file).with_content(/^\s*identity_uri: uri$/)
should contain_file(libvirt_file).with_content(/^\s*cache_dir: \/dev\/shm$/)
should contain_file(libvirt_file).with_content(/^\s*nova_refresh: 14400$/)
should contain_file(libvirt_file).with_content(/^\s*network_use_bits: true$/)
should contain_file(libvirt_file).with_content(/^\s*metadata: \[\]$/)
should contain_file(libvirt_file).with_content(/^\s*customer_metadata: \[\]$/)
should contain_file(libvirt_file).with_content(/^\s*vm_probation: 300$/)
should contain_file(libvirt_file).with_content(/^\s*ping_check: false$/)
should contain_file(libvirt_file).with_content(/^\s*alive_only: false$/)
should contain_file(libvirt_file).with_content(/^\s*disk_collection_period: 0$/)
should contain_file(libvirt_file).with_content(/^\s*vm_cpu_check_enable: true$/)
should contain_file(libvirt_file).with_content(/^\s*vm_disks_check_enable: true$/)
should contain_file(libvirt_file).with_content(/^\s*vm_network_check_enable: true$/)
should contain_file(libvirt_file).with_content(/^\s*vm_ping_check_enable: false$/)
should contain_file(libvirt_file).with_content(/^\s*vm_extended_disks_check_enable: false$/)
should contain_file(libvirt_file).with_content(/^\s*host_aggregate_re: M4$/)
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 'monasca::checks::libvirt'
end
end
end

View File

@ -1,16 +1,9 @@
require 'spec_helper'
describe 'monasca::checks::ovs' do
describe 'on debian platforms' do
let :facts do
@default_facts.merge({
:osfamily => 'Debian',
:os => { 'family' => 'Debian' },
})
end
shared_examples 'monasca::checks::ovs' do
let :ovs_file do
"/etc/monasca/agent/conf.d/ovs.yaml"
'/etc/monasca/agent/conf.d/ovs.yaml'
end
let :pre_condition do
@ -23,29 +16,43 @@ describe 'monasca::checks::ovs' do
}"
end
let(:params) { {
:admin_password => 'password',
:admin_tenant_name => 'tenant_name',
:admin_user => 'user',
:identity_uri => 'uri',
:metadata => ['tenant_name'],
} }
let :params do
{
:admin_password => 'password',
:admin_tenant_name => 'tenant_name',
:admin_user => 'user',
:identity_uri => 'uri',
:metadata => ['tenant_name'],
}
end
it 'builds the ovs config file properly' do
is_expected.to contain_file(ovs_file).with_content(/^\s*admin_password: password$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*admin_tenant_name: tenant_name$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*admin_user: user$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*cache_dir: \/dev\/shm$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*identity_uri: uri$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*network_use_bits: true$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*metadata: \["tenant_name"\]$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*neutron_refresh: 14400$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*ovs_cmd: 'sudo \/usr\/bin\/ovs-vsctl'$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*included_interface_re: qg\.\*$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*use_absolute_metrics: true$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*use_rate_metrics: true$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*use_health_metrics: true$/)
is_expected.to contain_file(ovs_file).with_content(/^\s*publish_router_capacity: true$/)
should contain_file(ovs_file).with_content(/^\s*admin_password: password$/)
should contain_file(ovs_file).with_content(/^\s*admin_tenant_name: tenant_name$/)
should contain_file(ovs_file).with_content(/^\s*admin_user: user$/)
should contain_file(ovs_file).with_content(/^\s*cache_dir: \/dev\/shm$/)
should contain_file(ovs_file).with_content(/^\s*identity_uri: uri$/)
should contain_file(ovs_file).with_content(/^\s*network_use_bits: true$/)
should contain_file(ovs_file).with_content(/^\s*metadata: \["tenant_name"\]$/)
should contain_file(ovs_file).with_content(/^\s*neutron_refresh: 14400$/)
should contain_file(ovs_file).with_content(/^\s*ovs_cmd: 'sudo \/usr\/bin\/ovs-vsctl'$/)
should contain_file(ovs_file).with_content(/^\s*included_interface_re: qg\.\*$/)
should contain_file(ovs_file).with_content(/^\s*use_absolute_metrics: true$/)
should contain_file(ovs_file).with_content(/^\s*use_rate_metrics: true$/)
should contain_file(ovs_file).with_content(/^\s*use_health_metrics: true$/)
should contain_file(ovs_file).with_content(/^\s*publish_router_capacity: true$/)
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 'monasca::checks::ovs'
end
end
end

View File

@ -1,16 +1,9 @@
require 'spec_helper'
describe 'monasca::checks::rabbitmq' do
describe 'on debian platforms' do
let :facts do
@default_facts.merge({
:osfamily => 'Debian',
:os => { 'family' => 'Debian' },
})
end
shared_examples 'monasca::checks::rabbitmq' do
let :rabbitmq_fragment do
"test_instance_rabbitmq_instance"
'test_instance_rabbitmq_instance'
end
let :pre_condition do
@ -23,40 +16,54 @@ describe 'monasca::checks::rabbitmq' do
}"
end
let(:params) { {
:instances => {
'test_instance' => {
'rabbitmq_api_url' => 'url',
'rabbitmq_user' => 'user',
'rabbitmq_pass' => 'password',
'queues' => ['test_queue'],
'nodes' => ['test_node'],
'exchanges' => ['test_exchange'],
'queues_regexes' => ['test_queue_regex'],
'nodes_regexes' => ['test_node_regex'],
'exchanges_regexes' => ['test_exchange_regex'],
'max_detailed_queues' => 1000,
'max_detailed_exchanges' => 100,
'max_detailed_nodes' => 10,
'whitelist' => {},
let :params do
{
:instances => {
'test_instance' => {
'rabbitmq_api_url' => 'url',
'rabbitmq_user' => 'user',
'rabbitmq_pass' => 'password',
'queues' => ['test_queue'],
'nodes' => ['test_node'],
'exchanges' => ['test_exchange'],
'queues_regexes' => ['test_queue_regex'],
'nodes_regexes' => ['test_node_regex'],
'exchanges_regexes' => ['test_exchange_regex'],
'max_detailed_queues' => 1000,
'max_detailed_exchanges' => 100,
'max_detailed_nodes' => 10,
'whitelist' => {},
}
}
},
} }
}
end
it 'builds the rabbitmq config file properly' do
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*rabbitmq_api_url: url$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*rabbitmq_user: user$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*rabbitmq_pass: password$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*queues: \["test_queue"\]$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*nodes: \["test_node"\]$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*exchanges: \["test_exchange"\]$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*queues_regexes: \["test_queue_regex"\]$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*nodes_regexes: \["test_node_regex"\]$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*exchanges_regexes: \["test_exchange_regex"\]$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*max_detailed_queues: 1000$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*max_detailed_exchanges: 100$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*max_detailed_nodes: 10$/)
is_expected.to contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*whitelist: {}$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*rabbitmq_api_url: url$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*rabbitmq_user: user$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*rabbitmq_pass: password$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*queues: \["test_queue"\]$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*nodes: \["test_node"\]$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*exchanges: \["test_exchange"\]$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*queues_regexes: \["test_queue_regex"\]$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*nodes_regexes: \["test_node_regex"\]$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*exchanges_regexes: \["test_exchange_regex"\]$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*max_detailed_queues: 1000$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*max_detailed_exchanges: 100$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*max_detailed_nodes: 10$/)
should contain_concat_fragment(rabbitmq_fragment).with_content(/^\s*whitelist: {}$/)
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 'monasca::checks::rabbitmq'
end
end
end

View File

@ -1,76 +1,83 @@
require 'spec_helper'
describe 'monasca::notification' do
describe 'on debian platforms' do
let :facts do
@default_facts.merge({
:osfamily => 'Debian',
:os => { 'family' => 'Debian' },
})
end
shared_examples 'monasca::notification' do
let :cfg_file do
"/etc/monasca/notification.yaml"
'/etc/monasca/notification.yaml'
end
let :start_script do
"/etc/init/monasca-notification.conf"
'/etc/init/monasca-notification.conf'
end
let :pre_condition do
"include monasca"
'include monasca'
end
let(:params) { {
:install_python_deps => false,
} }
let :params do
{
:install_python_deps => false,
}
end
it 'starts the notification service' do
is_expected.to contain_service('monasca-notification')
should contain_service('monasca-notification')
end
it 'builds the notification config file properly' do
is_expected.to contain_file(cfg_file).with_content(/^\s*kafka:$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*url: localhost:9092$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*group: monasca-notification$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*alarm_topic: alarm-state-transitions$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*notification_topic: alarm-notifications$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*notification_retry_topic: retry-notifications$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*max_offset_lag: 600$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*periodic:$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*60: 60-seconds-notifications$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*mysql:$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*host: $/)
is_expected.to contain_file(cfg_file).with_content(/^\s*port: 3306$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*user: $/)
is_expected.to contain_file(cfg_file).with_content(/^\s*passwd: $/)
is_expected.to contain_file(cfg_file).with_content(/^\s*db: mon$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*notification_types:$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*plugins:$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*- monasca_notification.plugins.hipchat_notifier:HipChatNotifier$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*- monasca_notification.plugins.slack_notifier:SlackNotifier$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*email:$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*server: localhost$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*port: 25$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*notifications_size: 256$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*sent_notifications_size: 50$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*notification_path: \/notification\/alarms$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*notification_retry_path: \/notification\/retry$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*60: \/notification\/60_seconds$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*periodic_path:$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*logging:$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*version: 1$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*disable_existing_loggers: False$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*formatters:$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*filename: \/var\/log\/monasca\/notification.log$/)
is_expected.to contain_file(cfg_file).with_content(/^\s*ca_certs: \/etc\/ssl\/certs\/ca-certificates.crt$/)
should contain_file(cfg_file).with_content(/^\s*kafka:$/)
should contain_file(cfg_file).with_content(/^\s*url: localhost:9092$/)
should contain_file(cfg_file).with_content(/^\s*group: monasca-notification$/)
should contain_file(cfg_file).with_content(/^\s*alarm_topic: alarm-state-transitions$/)
should contain_file(cfg_file).with_content(/^\s*notification_topic: alarm-notifications$/)
should contain_file(cfg_file).with_content(/^\s*notification_retry_topic: retry-notifications$/)
should contain_file(cfg_file).with_content(/^\s*max_offset_lag: 600$/)
should contain_file(cfg_file).with_content(/^\s*periodic:$/)
should contain_file(cfg_file).with_content(/^\s*60: 60-seconds-notifications$/)
should contain_file(cfg_file).with_content(/^\s*mysql:$/)
should contain_file(cfg_file).with_content(/^\s*host: $/)
should contain_file(cfg_file).with_content(/^\s*port: 3306$/)
should contain_file(cfg_file).with_content(/^\s*user: $/)
should contain_file(cfg_file).with_content(/^\s*passwd: $/)
should contain_file(cfg_file).with_content(/^\s*db: mon$/)
should contain_file(cfg_file).with_content(/^\s*notification_types:$/)
should contain_file(cfg_file).with_content(/^\s*plugins:$/)
should contain_file(cfg_file).with_content(/^\s*- monasca_notification.plugins.hipchat_notifier:HipChatNotifier$/)
should contain_file(cfg_file).with_content(/^\s*- monasca_notification.plugins.slack_notifier:SlackNotifier$/)
should contain_file(cfg_file).with_content(/^\s*email:$/)
should contain_file(cfg_file).with_content(/^\s*server: localhost$/)
should contain_file(cfg_file).with_content(/^\s*port: 25$/)
should contain_file(cfg_file).with_content(/^\s*notifications_size: 256$/)
should contain_file(cfg_file).with_content(/^\s*sent_notifications_size: 50$/)
should contain_file(cfg_file).with_content(/^\s*notification_path: \/notification\/alarms$/)
should contain_file(cfg_file).with_content(/^\s*notification_retry_path: \/notification\/retry$/)
should contain_file(cfg_file).with_content(/^\s*60: \/notification\/60_seconds$/)
should contain_file(cfg_file).with_content(/^\s*periodic_path:$/)
should contain_file(cfg_file).with_content(/^\s*logging:$/)
should contain_file(cfg_file).with_content(/^\s*version: 1$/)
should contain_file(cfg_file).with_content(/^\s*disable_existing_loggers: False$/)
should contain_file(cfg_file).with_content(/^\s*formatters:$/)
should contain_file(cfg_file).with_content(/^\s*filename: \/var\/log\/monasca\/notification.log$/)
should contain_file(cfg_file).with_content(/^\s*ca_certs: \/etc\/ssl\/certs\/ca-certificates.crt$/)
end
it 'builds the startup script properly' do
is_expected.to contain_file(start_script).with_content(/^\s*kill timeout 240$/)
is_expected.to contain_file(start_script).with_content(/^\s*setgid monasca$/)
is_expected.to contain_file(start_script).with_content(/^\s*setuid monasca-notification$/)
is_expected.to contain_file(start_script).with_content(/^\s*exec \/var\/www\/monasca-notification\/bin\/monasca-notification > \/dev\/null$/)
should contain_file(start_script).with_content(/^\s*kill timeout 240$/)
should contain_file(start_script).with_content(/^\s*setgid monasca$/)
should contain_file(start_script).with_content(/^\s*setuid monasca-notification$/)
should contain_file(start_script).with_content(/^\s*exec \/var\/www\/monasca-notification\/bin\/monasca-notification > \/dev\/null$/)
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 'monasca::notification'
end
end
end