rspec-puppet-augeas 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,3 +1,10 @@
1
1
  source :rubygems
2
2
 
3
+ gem 'puppetlabs_spec_helper'
3
4
  gem 'rspec-puppet'
5
+ gem 'ruby-augeas'
6
+
7
+ group :test do
8
+ gem 'puppet'
9
+ gem 'rake'
10
+ end
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # RSpec tests for Augeas resources inside Puppet manifests
2
2
 
3
- ## Summary
4
-
5
3
  rspec-puppet-augeas is an extension of rodjek's popular rspec-puppet tool. It
6
4
  adds to your RSpec tests for a single class or define (or anything resulting in
7
5
  a catalog) and allows you to run and test individual Augeas resources within it.
@@ -109,6 +107,19 @@ the resource. Some require certain options, which can be supplied in the
109
107
  `:target` and `:lens`), returns the value of the node
110
108
  * `aug_match(path)` runs `Augeas#match(path)` against the target file (expects
111
109
  `:target` and `:lens`), returns an array of matches
110
+ * `augparse(result)` runs the augparse utility against the target file (expects
111
+ `:target` and `:lens`) and verifies the file matches the `{ "key" = "value"
112
+ }` augparse tree notation. Call without an argument to get the current tree
113
+ back.
114
+ * `augparse()` raises error containing `{ "key" = "value" }` tree for the
115
+ whole file
116
+ * `augparse('{ "key" = "value" }')` verifies the target matches supplied tree
117
+ * `augparse_filter(filter, result)` takes the target file and all nodes matching
118
+ the given filter, then runs the resulting file through augparse as above.
119
+ * `augparse_filter('*[label()!="#comment"]')` raises error containing tree for
120
+ the filtered file (all non-comment entries)
121
+ * `augparse_filter('*[label()!="#comment"]', '{ "key" = "value" }')` verifies
122
+ the filtered file (all non-comment entries) matches supplied tree
112
123
 
113
124
  ### RSpec configuration
114
125
 
@@ -14,9 +14,10 @@ module RSpec::Puppet::Augeas
14
14
  # :lens => lens used for opening target
15
15
  def run_augeas(*args, &block)
16
16
  options = args.last.is_a?(::Hash) ? args.pop : {}
17
+ args << { :type => :augeas }
17
18
 
18
19
  title = "Augeas[#{args.shift}]"
19
- describe(title, *args, :type => :augeas) do
20
+ describe(title, *args) do
20
21
  # inside here (the type augeas block), subject will be initialised
21
22
  # to the augeas resource object
22
23
 
@@ -30,8 +30,9 @@ module RSpec::Puppet::Augeas
30
30
  file = "/#{file}" unless file.start_with? '/'
31
31
  lens = opts[:lens] || self.lens or raise ArgumentError, ":lens must be supplied"
32
32
  lens = "#{lens}.lns" unless lens.include? '.'
33
+ root = opts[:root] || self.output_root
33
34
 
34
- aug = Augeas.open(self.output_root, nil, Augeas::NO_MODL_AUTOLOAD)
35
+ aug = Augeas.open(root, nil, Augeas::NO_MODL_AUTOLOAD)
35
36
  begin
36
37
  aug.transform(
37
38
  :lens => lens,
@@ -57,15 +58,14 @@ module RSpec::Puppet::Augeas
57
58
  end
58
59
 
59
60
  # Creates a simple test file, reads in a fixture (that's been modified by
60
- # the provider) and runs augparse against the expected tree.
61
- def augparse(opts = {})
61
+ # the resource) and runs augparse against the expected tree.
62
+ def augparse(result = "?", opts = {})
62
63
  file = opts[:target] || self.target or raise ArgumentError, ":target must be supplied"
63
- file = File.join(self.output_path, file) unless file.start_with? '/'
64
+ file = File.join(self.output_root, file) unless file.start_with? '/'
64
65
  lens = opts[:lens] || self.lens or raise ArgumentError, ":lens must be supplied"
65
66
  lens = "#{lens}.lns" unless lens.include? '.'
66
- result = opts[:result] || "?"
67
67
 
68
- Dir.mktmpdir { |dir|
68
+ Dir.mktmpdir("rpa-augparse") do |dir|
69
69
  # Augeas always starts with a blank line when creating new files, so
70
70
  # reprocess file and remove it to make writing tests easier
71
71
  File.open("#{dir}/input", "w") do |finput|
@@ -77,18 +77,18 @@ module RSpec::Puppet::Augeas
77
77
  end
78
78
 
79
79
  # Test module, Augeas reads back in the input file
80
- testaug = "#{dir}/test_augeasproviders.aug"
81
- File.open(testaug, "w") { |tf|
80
+ testaug = "#{dir}/test_rspec_puppet_augeas.aug"
81
+ File.open(testaug, "w") do |tf|
82
82
  tf.write(<<eos)
83
- module Test_Augeasproviders =
83
+ module Test_Rspec_Puppet_Augeas =
84
84
  test #{lens} get Sys.read_file "#{dir}/input" =
85
85
  #{result}
86
86
  eos
87
- }
87
+ end
88
88
 
89
89
  output = %x(augparse #{testaug} 2>&1)
90
90
  raise RSpec::Puppet::Augeas::Error, "augparse failed:\n#{output}" unless $? == 0 && output.empty?
91
- }
91
+ end
92
92
  end
93
93
 
94
94
  # Takes a full fixture file, loads it in Augeas, uses the relative path
@@ -98,23 +98,21 @@ eos
98
98
  #
99
99
  # Because the filtered fragment is saved in a new file, seq labels will reset
100
100
  # too, so it'll be "1" rather than what it was in the original fixture.
101
- def augparse_filter(opts = {})
101
+ def augparse_filter(filter = "*[label()!='#comment']", result = "?", opts = {})
102
102
  file = opts[:target] || self.target or raise ArgumentError, ":target must be supplied"
103
- file = File.join(self.output_path, file) unless file.start_with? '/'
103
+ file = File.join(self.output_root, file) unless file.start_with? '/'
104
104
  lens = opts[:lens] || self.lens or raise ArgumentError, ":lens must be supplied"
105
105
  lens = "#{lens}.lns" unless lens.include? '.'
106
- filter = opts[:filter] or raise ArgumentError, ":filter must be supplied"
107
- result = opts[:result] || "?"
108
106
 
109
107
  # duplicate the original since we use aug.mv
110
- tmpin = Tempfile.new("original")
108
+ tmpin = Tempfile.new("rpa-original")
111
109
  tmpin.write(File.read(file))
112
110
  tmpin.close
113
111
 
114
- tmpout = Tempfile.new("filtered")
112
+ tmpout = Tempfile.new("rpa-filtered")
115
113
  tmpout.close
116
114
 
117
- aug_open(tmpin.path, lens) do |aug|
115
+ aug_open(opts.merge(:root => '/', :target => tmpin.path)) do |aug|
118
116
  # Load a transform of the target, so Augeas can write into it
119
117
  aug.transform(
120
118
  :lens => lens,
@@ -139,10 +137,10 @@ eos
139
137
  aug.save!
140
138
  end
141
139
 
142
- augparse(tmpout.path, lens, result)
140
+ augparse(result, opts.merge(:root => '/', :target => tmpout.path))
143
141
  ensure
144
- tmpin.unlink
145
- tmpout.unlink
142
+ tmpin.unlink if tmpin
143
+ tmpout.unlink if tmpout
146
144
  end
147
145
  end
148
146
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'rspec-puppet-augeas'
3
- s.version = '0.1.0'
3
+ s.version = '0.2.0'
4
4
  s.homepage = 'https://github.com/domcleal/rspec-puppet-augeas/'
5
5
  s.summary = 'RSpec tests for Augeas resources in Puppet manifests'
6
6
  s.description = 'RSpec tests for Augeas resources in Puppet manifests'
@@ -55,4 +55,27 @@ describe 'sshd' do
55
55
  should_not execute.idempotently
56
56
  end
57
57
  end
58
+
59
+ describe 'augparse' do
60
+ describe_augeas 'root login', :lens => 'Sshd', :target => 'etc/ssh/sshd_config', :fixture => 'etc/ssh/sshd_config_2' do
61
+ it 'should run augparse against the whole file' do
62
+ should execute.with_change
63
+ augparse('
64
+ { "#comment" = "Fixture 2" }
65
+ { "PermitRootLogin" = "yes" }
66
+ ')
67
+ end
68
+ end
69
+ end
70
+
71
+ describe 'augparse_filter' do
72
+ describe_augeas 'root login', :lens => 'Sshd', :target => 'etc/ssh/sshd_config', :fixture => 'etc/ssh/sshd_config_2' do
73
+ it 'should filter non-comments' do
74
+ should execute.with_change
75
+ augparse_filter('*[label() != "#comment"]', '
76
+ { "PermitRootLogin" = "yes" }
77
+ ')
78
+ end
79
+ end
80
+ end
58
81
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-puppet-augeas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-28 00:00:00.000000000 Z
12
+ date: 2013-01-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec-puppet