Rspec не удалось найти требуемый пакет от puppet, могу ли я пропустить require в define type?

#rspec #puppet

#rspec #puppet

Вопрос:

Я пытаюсь написать rspec для тестирования кода puppet. В моем puppet я вызвал define type, который не является частью этого класса. (ранее определено) Код puppet работает в тесте find in branch, но rspec не смог передать «reuire». Puppet:

 $gluster_path = '/usr/libexec/zabbix-gluster'
  $gluster_discovery_script = "${gluster_path}/gstatus_discovery.py"
  $user_param_lines = [
    "UserParameter=gluster_volume_info[*],${gluster_discovery_script} $1 $2n",
    "UserParameter=gluster_storage_info[*],${gluster_discovery_script} $1n",
    "UserParameter=gluster_volume_name.discovery,${gluster_discovery_script}n",
  ]
...
zabbix::agent::userparam { 'glusterfs':
    content => join($user_param_lines, ''),
  }
 

Rspec:

 ...
 it {
    is_expected.to contain_zabbix__agent__userparam('cnvr-zabbix-gluster')
  }
 

определить тип:

 define zabbix::agent::userparam($content = undef, $source = undef) {
...
  file { "/etc/zabbix/zabbix_agentd.d/userparameter_${title}.conf":
...
    require => [
        Package['zabbix-agent'],
        File['zabbix_agentd_dir'],
      ],
    content => $content,
    source  => $_source,
    notify  => Service['zabbix-agent'],
  }
 

Zabbix-агент был установлен из других модулей. Но ошибка продолжает запрашивать:

Puppet::Ошибка: не удалось найти ресурс ‘Package [zabbix-agent]’ в параметре ‘require’ (файл: /home/edwu/puppet /modules/zabbix/manifests/agent/userparam.pp, строка: 17) на узле

Есть ли способ пропустить проверку этого требования в rspec?

Ответ №1:

Есть ли способ пропустить проверку этого требования в rspec?

Ошибка, о которой сообщается в тесте RSpec, является ошибкой компиляции каталога. Это никоим образом не относится к RSpec. Действительно, это указывает на подлинную слабость zabbix::agent::userparam и, как следствие, вероятный недостаток в вашем тестируемом классе. Это как раз одна из причин написания тестов RSpec!

Проблема в том, что zabbix::agent::userparam он не стоит независимо. Он требует Package['zabbix-agent'] объявления, но он не объявляет его сам и не объявляет класс, который это делает. Ваш тестируемый класс наследует эту слабость, хотя чем дальше вы удаляетесь от центра проблемы, тем больше вам приходится склоняться к тому, чтобы называть это ошибкой, а не просто слабостью. Ваш класс тоже может объявить необходимый другой класс, и, вероятно, это должно быть сделано.

Вы не можете заставить конструктор каталогов разрешить требование к несуществующему ресурсу пройти незамеченным, и вы не должны этого делать, потому что это относится к тем вещам, которые вы хотите, чтобы ваши тесты показывали вам. Но если вы хотите, чтобы эта слабость в вашем классе сохранялась, вы можете использовать предварительное условие RSpec, чтобы заставить RSpec объявить соответствующий класс для вас, чтобы требование действительно было выполнено.

Комментарии:

1. Спасибо @John за подробные объяснения. Я добавил let(:pre_condition) поверх спецификации, чтобы охватить любые возможные классы, которые могут потребоваться, с помощью «include zabbix::agent», «include other::classes», …. Как вы сказали, это слабость zabbix ::agent::userparam . Ценю ваши объяснения.