Class: PDQTest::Puppet

Inherits:
Object
  • Object
show all
Defined in:
lib/pdqtest/puppet.rb

Constant Summary collapse

METADATA =
'metadata.json'
MODULE_DIR =
'/etc/puppetlabs/code/modules'
MAGIC_MARKER =
/#\s*@PDQTest/
BATS_TESTS =
'./spec/acceptance'
SETUP_SUFFIX =
'__setup.sh'
BEFORE_SUFFIX =
'__before.bats'
AFTER_SUFFIX =
'.bats'
EXAMPLES_DIR =
'./examples'
@@bats_executed =
[]
@@setup_executed =
[]

Class Method Summary collapse

Class Method Details

.bats_test(container, example, suffix) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/pdqtest/puppet.rb', line 72

def self.bats_test(container, example, suffix)
  testcase = BATS_TESTS + '/' + test_basename(example) + suffix
  if File.exists?(testcase)
    Escort::Logger.output.puts "*** bats test **** bats #{PDQTest::Instance::TEST_DIR}/#{testcase}"
    res = PDQTest::Docker.exec(container, "bats #{PDQTest::Instance::TEST_DIR}/#{testcase}")
    status = PDQTest::Docker.exec_status(res)
    Escort::Logger.output.puts res
    @@bats_executed << testcase
  else
    Escort::Logger.error.error "no #{suffix} tests for #{example} (should be at #{testcase})"
    status = true
  end

  status
end

.find_examplesObject



53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/pdqtest/puppet.rb', line 53

def self.find_examples()
  examples = []
  if Dir.exists?(EXAMPLES_DIR)
    Find.find(EXAMPLES_DIR) do |e|
      if ! File.directory?(e) and ! File.readlines(e).grep(MAGIC_MARKER).empty?
        examples << e
      end
    end
  end
  Escort::Logger.output.puts "examples to run" + examples.to_s
  examples
end

.get_bats_executedObject



27
28
29
# File 'lib/pdqtest/puppet.rb', line 27

def self.get_bats_executed
  @@bats_executed
end

.get_setup_executedObject



31
32
33
# File 'lib/pdqtest/puppet.rb', line 31

def self.get_setup_executed
  @@setup_executed
end

.install_depsObject



48
49
50
51
# File 'lib/pdqtest/puppet.rb', line 48

def self.install_deps
  # Install dependencies for module
  "cd #{PDQTest::Instance::TEST_DIR} && librarian-puppet install --path #{MODULE_DIR} --destructive"
end


44
45
46
# File 'lib/pdqtest/puppet.rb', line 44

def self.link_module
  "mkdir -p #{MODULE_DIR} && ln -s #{PDQTest::Instance::TEST_DIR} #{MODULE_DIR}/#{module_name}"
end

.module_metadataObject



35
36
37
38
# File 'lib/pdqtest/puppet.rb', line 35

def self.
  file = File.read(Dir.pwd + File::SEPARATOR + )
  JSON.parse(file)
end

.module_nameObject



40
41
42
# File 'lib/pdqtest/puppet.rb', line 40

def self.module_name
  ['name'].split('-')[1]
end

.puppet_apply(example) ⇒ Object



134
135
136
# File 'lib/pdqtest/puppet.rb', line 134

def self.puppet_apply(example)
  "cd #{PDQTest::Instance::TEST_DIR} && puppet apply #{example}"
end

.reset_bats_executedObject



19
20
21
# File 'lib/pdqtest/puppet.rb', line 19

def self.reset_bats_executed
  @@bats_executed = []
end

.reset_setup_executedObject



23
24
25
# File 'lib/pdqtest/puppet.rb', line 23

def self.reset_setup_executed
  @@setup_executed = []
end

.run(container) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/pdqtest/puppet.rb', line 104

def self.run(container)
  status = true
  Escort::Logger.output.puts "fetch deps"
  res = PDQTest::Docker.exec(container, install_deps)
  status &= PDQTest::Docker.exec_status(res)

  Escort::Logger.output.puts "linking"
  res = PDQTest::Docker.exec(container, link_module)
  status &= PDQTest::Docker.exec_status(res)
  Escort::Logger.output.puts "run tests"
  find_examples.each { |e|
    Escort::Logger.output.puts "testing #{e} #{status}"

    status &= setup_test(container, e)

    # see if we should run a bats test before running puppet
    status &= bats_test(container, e, BEFORE_SUFFIX)

    # run puppet apply
    res = PDQTest::Docker.exec(container, puppet_apply(e))
    status &= PDQTest::Docker.exec_status(res, true)
    Escort::Logger.output.puts res

    # see if we should run a bats test after running puppet
    status &= bats_test(container, e, AFTER_SUFFIX)
  }

  status
end

.setup_test(container, example) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/pdqtest/puppet.rb', line 88

def self.setup_test(container, example)
  setup = BATS_TESTS + '/' + test_basename(example) + SETUP_SUFFIX
  if File.exists?(setup)
    Escort::Logger.output.puts "Setting up test for #{example}"
    script = File.read(setup)
    res = PDQTest::Docker.exec(container, script)
    status = PDQTest::Docker.exec_status(res)
    @@setup_executed << setup
  else
    Escort::Logger.output.puts "no setup file for #{example} (should be in #{setup})"
    status = true
  end

  status
end

.test_basename(t) ⇒ Object



66
67
68
69
70
# File 'lib/pdqtest/puppet.rb', line 66

def self.test_basename(t)
  # remove examples/ and .pp
  # eg ./examples/apache/mod/mod_php.pp --> apache/mod/mod_php
  t.gsub(EXAMPLES_DIR + '/','').gsub('.pp','')
end