Rspec: не удалось проанализировать среду rp_env

Я новичок в rspec-puppet, и я начинаю с написания теста:

Я написал этот код:

describe 'rcjenkins' do
  let(:facts) do
    {
      :osfamily => 'RedHat'
    }
  end
  let(:pre_condition) do
    "$facts = #{facts}"
  end

  let(:params) do
    {
      :host => "127.0.0.1",
      :github_token => "valor",

    }
  end
  it do
    is_expected.to contain_class('rcjenkins::nginx')
  end
end

который должен проверить:

class rcjenkins($host, $github_token) {
  include rcjenkins::package

  class { 'nginx': }

  nginx::resource::upstream { 'jenkins':
    members => [
      'localhost:8080'
    ]
  }

  nginx::resource::vhost { $host:
    proxy => 'http://jenkins'
  }

  nginx::resource::location { 'jenkins_root':
    ensure         => present,
    vhost          => $host,
    location       => '/status',
    location_alias => '/usr/share/nginx/html'
  }

Это было больше похоже на «проверку теста», но что-то продолжает давать сбои. я получаю:

  1) rcjenkins Treco should contain Class[rcjenkins::nginx]
     Failure/Error: is_expected.to contain_class('rcjenkins::nginx')

     Puppet::ParseErrorWithIssue:
       Could not parse for environment rp_env: Syntax error at ':' at line 1:11 on node localhost.localdomain
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/pops/parser/parser_support.rb:127:in `on_error'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/pops/parser/lexer2.rb:712:in `scan'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/pops/parser/parser_support.rb:240:in `_parse'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/pops/parser/parser_support.rb:134:in `parse_string'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/pops/parser/evaluating_parser.rb:28:in `parse_string'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/parser/e4_parser_adapter.rb:29:in `parse'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/node/environment.rb:507:in `perform_initial_import'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/node/environment.rb:247:in `known_resource_types'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/parser/compiler.rb:767:in `block in initvars'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/context.rb:65:in `override'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet.rb:293:in `override'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/parser/compiler.rb:765:in `initvars'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/parser/compiler.rb:422:in `initialize'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/parser/compiler.rb:33:in `new'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/parser/compiler.rb:33:in `compile'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/indirector/catalog/compiler.rb:266:in `block (2 levels) in compile'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/util/profiler/around_profiler.rb:58:in `profile'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/util/profiler.rb:51:in `profile'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/indirector/catalog/compiler.rb:264:in `block in compile'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/util.rb:223:in `block in benchmark'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/util.rb:222:in `benchmark'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/indirector/catalog/compiler.rb:262:in `compile'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/indirector/catalog/compiler.rb:53:in `find'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/puppet-4.9.2/lib/puppet/indirector/indirection.rb:194:in `find'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/adapters.rb:74:in `catalog'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/adapters.rb:148:in `catalog'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/support.rb:203:in `build_catalog_without_cache'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/support.rb:212:in `block in build_catalog'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/cache.rb:17:in `call'is_expected.to contain_class('rcjenkins::nginx')
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/cache.rb:17:in `get'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/support.rb:211:in `build_catalog'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/support.rb:30:in `block in load_catalogue'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/support.rb:178:in `with_vardir'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/support.rb:19:in `load_catalogue'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/example/class_example_group.rb:7:in `catalogue'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/support.rb:11:in `block in subject'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/matchers/create_generic.rb:82:in `call'
     # /home/luis.brandao/.rvm/gems/ruby-2.2.6/gems/rspec-puppet-2.5.0/lib/rspec-puppet/matchers/create_generic.rb:82:in `matches?'
     # ./spec/classes/rcjenkins_spec.rb:39:in `block (3 levels) in <top (required)>'

Строка 39: is_expected.to contains_class('rcjenkins::nginx'). Кто-нибудь знает, что происходит?

Редактировать: я также заметил, что НИЧЕГО, на что я меняю тест, дает мне ту же ошибку. Что мне не хватает? что такое rp_env?


person Techmago    schedule 16.02.2017    source источник
comment
Помимо проблемы, которую Доминик Клир поднял с вашим let(:pre_condition), вы также сосредоточились на неправильной части сообщения об ошибке. Сообщение об ошибке говорит Syntax error at ':' at line 1:11 on node localhost.localdomain. У вас есть синтаксическая ошибка где-то еще в коде, который вы не публиковали. Это решит вашу насущную проблему.   -  person Matt Schuchard    schedule 17.02.2017
comment
Что ж, rspec-puppet генерирует манифест, содержащий pre_condition, соединенный с объявлением класса с заданными параметрами. Ошибка связана с этим сгенерированным манифестом, а не с другим файлом, поскольку Puppet не указал путь к манифесту для ошибки. Вероятно, это синтаксис pre_condition.   -  person Dominic Cleal    schedule 19.02.2017
comment
@DominicCleal Таким образом, это приведет к сбою в той части манифеста, где он определяет хэш-ключ символа. Имеет смысл. Собираюсь посмотреть, как будет развиваться этот вопрос, но похоже, что вы справились с ним, поэтому скоро проголосуете, если он не обесценит вашу теорию.   -  person Matt Schuchard    schedule 20.02.2017


Ответы (2)


ОП также спросил о rp_env.

Окружение rp_env означает «Rspec-Puppet Environment» и является фальшивым значением для окружения, добавленным самим Rspec-puppet.

Он определяется здесь в коде.

Если вы хотите самостоятельно установить среду в своем коде Rspec-puppet, есть полезный пост здесь, где объясняется, как это сделать.

person Alex Harvey    schedule 27.06.2017

Удалите или исправьте ваше предварительное условие, оно не создает действительный манифест Puppet:

let(:pre_condition) do
  "$facts = #{facts}"
end

Если переменная Ruby facts равна { :osfamily => 'RedHat' }, тогда создается такой манифест Puppet:

$facts = {:osfamily=>'RedHat'}

Двоеточие перед хэш-ключом osfamily недопустимо в манифесте Puppet (это должна быть строка, например 'osfamily').

Я не думаю, что есть какая-то причина ставить здесь pre_condition, вашего let(:facts) должно быть достаточно.

person Dominic Cleal    schedule 17.02.2017
comment
Без этого предварительного условия я продолжаю получать ошибку оценки: оператор '[]' не применим к ссылке значения Undef: github.com/rodjek/rspec-puppet/issues/344 - person Techmago; 17.02.2017
comment
@Techmago Эта проблема - абсолютная ложь. Я постоянно использую let(:facts) {{ fact: 'fact_value' }} в RSpec Puppet, и он заполняет хэш $facts. У вас с ним другая проблема. - person Matt Schuchard; 17.02.2017
comment
Да, я не могу воспроизвести эту проблему, и она поддерживается в rspec-puppet уже более года. Если вы можете показать более подробную информацию о своей ошибке (источник синтаксической ошибки) при удалении pre_condition, отредактировав вопрос, мы сможем помочь в дальнейшем. - person Dominic Cleal; 20.02.2017
comment
Да, ты был прав. Я делаю яички для некоторых рецептов марионеток, которые кто-то сделал... и я начал изучать марионетку с нуля на прошлой неделе. Тесты по-прежнему не работают, но уже совсем по другой причине. stackoverflow.com/questions/42303648/ - person Techmago; 20.02.2017
comment
Что ж, похоже, это была верная теория. Хорошая находка. - person Matt Schuchard; 21.02.2017