rouster 0.53 → 0.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,20 +17,19 @@ class TestGetPuppetStar < Test::Unit::TestCase
17
17
  Rouster.send(:public, *Rouster.protected_instance_methods)
18
18
  end
19
19
 
20
- def test_happy_get_errors
20
+ def test_happy_27_get_errors
21
21
 
22
22
  output = "[1;35merr: Could not retrieve catalog from remote server: Error 400 on SERVER: no result for [api_vip] in Hiera (YAML/CMS)\nfizzybang\n[1;35merr: Could not retrieve catalog from remote server: Error 400 on SERVER: no result for [foobar] in Hiera (YAML/CMS)"
23
23
  @app.output.push(output)
24
24
 
25
25
  assert_not_nil(@app.get_puppet_errors())
26
26
  assert_equal(2, @app.get_puppet_errors().size)
27
- assert_equal(@app.get_puppet_errors(), @app.get_puppet_errors(output)) # could be split out to a different test
27
+ assert_equal(@app.get_puppet_errors(), @app.get_puppet_errors(output)) # tests that passed args is same as derived
28
28
 
29
29
  assert_nil(@app.get_puppet_notices())
30
-
31
30
  end
32
31
 
33
- def test_happy_get_notices
32
+ def test_happy_27_get_notices
34
33
 
35
34
  output = "[0;36mnotice: Not using cache on failed catalog\nfizzbang\n[0;36mnotice: Not using cache on failed catalog"
36
35
  @app.output.push(output)
@@ -43,6 +42,30 @@ class TestGetPuppetStar < Test::Unit::TestCase
43
42
 
44
43
  end
45
44
 
45
+ def test_happy_30_get_errors
46
+
47
+ output = "\e[0;32mInfo: Retrieving plugin\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/root_home.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/drac_version.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/sfdc-custom_facts.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/concat_basedir.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/drac_fw_version.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/razor_version.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/facter_dot_d.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/oob_mac.rb\e[0m\n\e[1;31mError: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find class razor for ops-tools1-1-piab.ops.sfdc.net on node ops-tools1-1-piab.ops.sfdc.net\e[0m\n\e[1;31mWarning: Not using cache on failed catalog\e[0m\n\e[1;31mError: Could not retrieve catalog; skipping run\e[0m\n"
48
+ @app.output.push(output)
49
+
50
+ assert_not_nil(@app.get_puppet_errors())
51
+ assert_equal(2, @app.get_puppet_errors().size)
52
+ assert_equal(@app.get_puppet_errors(), @app.get_puppet_errors(output))
53
+
54
+ assert_nil(@app.get_puppet_notices())
55
+ end
56
+
57
+ def test_happy_30_get_notices
58
+
59
+ output = "\e[0;32mInfo: Retrieving plugin\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/root_home.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/drac_version.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/sfdc-custom_facts.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/concat_basedir.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/drac_fw_version.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/razor_version.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/facter_dot_d.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb\e[0m\n\e[0;32mInfo: Loading facts in /var/lib/puppet/lib/facter/oob_mac.rb\e[0m\n\e[0;32mInfo: Caching catalog for ops-tools1-1-piab.ops.sfdc.net\e[0m\n\e[0;32mInfo: Applying configuration version '1385418175'\e[0m\n\e[mNotice: /Stage[main]/Razor::Service/Razor::Api[tag]/Exec[razor-api-tag]/returns: executed successfully\e[0m\n\e[mNotice: /Stage[main]/Razor::Service/Razor::Api[policy]/Exec[razor-api-policy]/returns: executed successfully\e[0m\n\e[mNotice: /Stage[main]/Razor::Service/Razor::Api[model]/Exec[razor-api-model]/returns: executed successfully\e[0m\n\e[mNotice: Finished catalog run in 33.76 seconds\e[0m\n"
60
+ @app.output.push(output)
61
+
62
+ assert_not_nil(@app.get_puppet_notices())
63
+ assert_equal(4, @app.get_puppet_notices().size)
64
+ assert_equal(@app.get_puppet_notices(), @app.get_puppet_notices(output))
65
+
66
+ assert_nil(@app.get_puppet_errors())
67
+ end
68
+
46
69
  def test_no_errors
47
70
 
48
71
  output = 'there are no errors here'
@@ -9,6 +9,8 @@ class TestNew < Test::Unit::TestCase
9
9
 
10
10
  def setup
11
11
  @app = nil
12
+ # TODO make this work, don't want to have to instance_variable_get everything..
13
+ #Rouster.send(:public, *Rouster.instance_variables)
12
14
  end
13
15
 
14
16
  # TODO this is an awful pattern, do better
@@ -24,6 +26,27 @@ class TestNew < Test::Unit::TestCase
24
26
  assert_equal(true, @app.uses_sudo?())
25
27
  end
26
28
 
29
+ def test_2_good_instantiation
30
+
31
+ assert_nothing_raised do
32
+ @app = Rouster.new(
33
+ :cache_timeout => 10,
34
+ :name => 'ppm',
35
+ :retries => 3,
36
+ :verbosity => [3,2],
37
+ :unittest => true,
38
+ )
39
+ end
40
+
41
+ assert_equal(10, @app.cache_timeout)
42
+ assert_equal('ppm', @app.name)
43
+ assert_equal(3, @app.retries)
44
+
45
+ assert_equal(3, @app.instance_variable_get(:@verbosity_console))
46
+ assert_equal(2, @app.instance_variable_get(:@verbosity_logfile))
47
+
48
+ end
49
+
27
50
  def teardown
28
51
  # noop
29
52
  end
@@ -29,6 +29,7 @@ class TestParseLsString < Test::Unit::TestCase
29
29
  :owner => 'root',
30
30
  :group => 'root',
31
31
  :size => '199',
32
+ :symlink? => false,
32
33
  :executable? => [false, false, false],
33
34
  :readable? => [true, true, true],
34
35
  :writeable? => [false, false, false]
@@ -50,6 +51,7 @@ class TestParseLsString < Test::Unit::TestCase
50
51
  :owner => 'root',
51
52
  :group => 'root',
52
53
  :size => '199',
54
+ :symlink? => false,
53
55
  :executable? => [false, false, false],
54
56
  :readable? => [true, false, false],
55
57
  :writeable? => [false, false, false]
@@ -71,6 +73,7 @@ class TestParseLsString < Test::Unit::TestCase
71
73
  :owner => 'root',
72
74
  :group => 'root',
73
75
  :size => '199',
76
+ :symlink? => false,
74
77
  :executable? => [false, false, false],
75
78
  :readable? => [false, true, false],
76
79
  :writeable? => [false, false, false]
@@ -92,6 +95,7 @@ class TestParseLsString < Test::Unit::TestCase
92
95
  :owner => 'root',
93
96
  :group => 'root',
94
97
  :size => '199',
98
+ :symlink? => false,
95
99
  :executable? => [false, false, false],
96
100
  :readable? => [false, false, true],
97
101
  :writeable? => [false, false, false]
@@ -113,6 +117,7 @@ class TestParseLsString < Test::Unit::TestCase
113
117
  :owner => 'root',
114
118
  :group => 'root',
115
119
  :size => '199',
120
+ :symlink? => false,
116
121
  :executable? => [true, true, true],
117
122
  :readable? => [false, false, false],
118
123
  :writeable? => [false, false, false]
@@ -134,6 +139,7 @@ class TestParseLsString < Test::Unit::TestCase
134
139
  :owner => 'root',
135
140
  :group => 'root',
136
141
  :size => '199',
142
+ :symlink? => false,
137
143
  :executable? => [true, false, false],
138
144
  :readable? => [false, false, false],
139
145
  :writeable? => [false, false, false]
@@ -155,6 +161,7 @@ class TestParseLsString < Test::Unit::TestCase
155
161
  :owner => 'root',
156
162
  :group => 'root',
157
163
  :size => '199',
164
+ :symlink? => false,
158
165
  :executable? => [false, true, false],
159
166
  :readable? => [false, false, false],
160
167
  :writeable? => [false, false, false]
@@ -176,6 +183,7 @@ class TestParseLsString < Test::Unit::TestCase
176
183
  :owner => 'root',
177
184
  :group => 'root',
178
185
  :size => '199',
186
+ :symlink? => false,
179
187
  :executable? => [false, false, true],
180
188
  :readable? => [false, false, false],
181
189
  :writeable? => [false, false, false]
@@ -197,6 +205,7 @@ class TestParseLsString < Test::Unit::TestCase
197
205
  :owner => 'root',
198
206
  :group => 'root',
199
207
  :size => '199',
208
+ :symlink? => false,
200
209
  :executable? => [false, false, false],
201
210
  :readable? => [false, false, false],
202
211
  :writeable? => [true, true, true]
@@ -218,6 +227,7 @@ class TestParseLsString < Test::Unit::TestCase
218
227
  :owner => 'root',
219
228
  :group => 'root',
220
229
  :size => '199',
230
+ :symlink? => false,
221
231
  :executable? => [false, false, false],
222
232
  :readable? => [false, false, false],
223
233
  :writeable? => [true, false, false]
@@ -239,6 +249,7 @@ class TestParseLsString < Test::Unit::TestCase
239
249
  :owner => 'root',
240
250
  :group => 'root',
241
251
  :size => '199',
252
+ :symlink? => false,
242
253
  :executable? => [false, false, false],
243
254
  :readable? => [false, false, false],
244
255
  :writeable? => [false, true, false]
@@ -260,6 +271,7 @@ class TestParseLsString < Test::Unit::TestCase
260
271
  :owner => 'root',
261
272
  :group => 'root',
262
273
  :size => '199',
274
+ :symlink? => false,
263
275
  :executable? => [false, false, false],
264
276
  :readable? => [false, false, false],
265
277
  :writeable? => [false, false, true]
@@ -281,6 +293,7 @@ class TestParseLsString < Test::Unit::TestCase
281
293
  :owner => 'vagrant',
282
294
  :group => 'vagrant',
283
295
  :size => '1909',
296
+ :symlink? => false,
284
297
  :executable? => [false, false, true],
285
298
  :readable? => [false, false, true],
286
299
  :writeable? => [false, false, true]
@@ -302,6 +315,7 @@ class TestParseLsString < Test::Unit::TestCase
302
315
  :owner => 'vagrant',
303
316
  :group => 'root',
304
317
  :size => '0',
318
+ :symlink? => false,
305
319
  :executable? => [false, false, false],
306
320
  :readable? => [true, true, true],
307
321
  :writeable? => [true, false, false]
@@ -327,6 +341,15 @@ class TestParseLsString < Test::Unit::TestCase
327
341
 
328
342
  end
329
343
 
344
+ def test_symlink_detection
345
+ link = "lrwxrwxrwx 1 vagrant vagrant 10 Mar 13 22:53 foo -> /etc/hosts\n"
346
+ file = "-rw-r--r-- 2 root root 166 Mar 13 22:50 /etc/hosts\n"
347
+
348
+ assert_equal(true, @app.exposed_parse_ls_string(link)[:symlink?])
349
+ assert_equal(false, @app.exposed_parse_ls_string(file)[:symlink?])
350
+
351
+ end
352
+
330
353
  def test_suid
331
354
  str = "drwxr-sr-x 2 root root 4096 Oct 7 17:09 /etc/nagios/objects\n"
332
355
 
@@ -340,6 +363,7 @@ class TestParseLsString < Test::Unit::TestCase
340
363
  :owner => 'root',
341
364
  :group => 'root',
342
365
  :size => '4096',
366
+ :symlink? => false,
343
367
  :executable? => [true, true, true], # right now, we return [true,false,true]
344
368
  :readable? => [true, true, true],
345
369
  :writeable? => [true, false, false],
@@ -0,0 +1,78 @@
1
+ require sprintf('%s/../../../path_helper', File.dirname(File.expand_path(__FILE__)))
2
+
3
+ require 'rouster'
4
+ require 'rouster/puppet'
5
+ require 'rouster/testing'
6
+ require 'test/unit'
7
+
8
+ class TestValidateCron < Test::Unit::TestCase
9
+
10
+ def setup
11
+ # expose private methods
12
+ Rouster.send(:public, *Rouster.private_instance_methods)
13
+ Rouster.send(:public, *Rouster.protected_instance_methods)
14
+
15
+ fake_facts = { 'is_virtual' => 'true', 'timezone' => 'PDT', 'uptime_days' => 42 }
16
+
17
+ fake_crons = {
18
+ 'root' => {
19
+ 'printf > /var/log/apache/error_log' => {
20
+ :minute => 10,
21
+ :hour => 2,
22
+ :dom => '*',
23
+ :mon => '*',
24
+ :dow => '*'
25
+ }
26
+ },
27
+ 'a_user' => {
28
+ '/home/a_user/test.pl' => {
29
+ :minute => '0',
30
+ :hour => ['0', '6', '12', '18'],
31
+ :dom => '*',
32
+ :mon => '*',
33
+ :dow => '*'
34
+ }
35
+ }, 'cronless_user' => {}
36
+ }
37
+
38
+ @app = Rouster.new(:name => 'app', :unittest => true)
39
+ @app.deltas[:crontab] = fake_crons
40
+ @app.facts = fake_facts
41
+ end
42
+
43
+ def test_positive_basic
44
+
45
+ assert(@app.validate_cron('root', 'printf > /var/log/apache/error_log', { :minute => 10, :hour => 2, :dom => '*', :mon => '*', :dow => '*'}))
46
+ assert(@app.validate_cron('a_user', '/home/a_user/test.pl', { :minute => '0', :hour => ['0', '6', '12', '18'], :dom => '*', :mon => '*', :dow => '*' }))
47
+ assert(@app.validate_cron('root', 'chmod 1777 /tmp', { :ensure => 'absent' }))
48
+ assert(@app.validate_cron('cronless_user', 'rm -f /tmp/foo', { :ensure => 'absent' }))
49
+
50
+ end
51
+
52
+ def test_positive_constrained
53
+
54
+ assert(@app.validate_cron('root', 'printf > /var/log/apache/error_log', { :minute => 10 , :constrain => 'is_virtual true'} ))
55
+
56
+ end
57
+
58
+ def test_negative_basic
59
+
60
+ assert_equal(false, @app.validate_cron('root', 'printf > /var/log/apache/error_log', { :minute => 1 }))
61
+ assert_equal(false, @app.validate_cron('root', 'rm -rf /', { :minute => '*', :hour => '*', :dom => '*', :mon => '*', :dow => '*'}))
62
+ assert_equal(false, @app.validate_cron('a_user', '/home/a_user/test.pl', { :ensure => 'absent' }))
63
+ assert_equal(false, @app.validate_cron('root', '/home/a_user/test.pl', { :minute => '0', :hour => ['0', '6', '12', '18'], :dom => '*', :mon => '*', :dow => '*' }))
64
+
65
+ end
66
+
67
+ def test_negative_constrained
68
+
69
+ assert(@app.validate_cron('root', 'printf > /var/log/apache/error_log', { :minute => 10, :constrain => 'is_virtual false' } ))
70
+ assert(@app.validate_cron('root', 'printf > /var/log/apache/error_log', { :gid => 55, :constrain => 'is_virtual false' } ))
71
+
72
+ end
73
+
74
+ def teardown
75
+ # noop
76
+ end
77
+
78
+ end
metadata CHANGED
@@ -1,111 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rouster
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.53'
4
+ version: '0.57'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Conor Horan-Kates
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-12 00:00:00.000000000 Z
11
+ date: 2014-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: log4r
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.1.9
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.1.9
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: net-scp
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: net-ssh
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: test-unit
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ~>
88
88
  - !ruby/object:Gem::Version
89
89
  version: '2.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ~>
95
95
  - !ruby/object:Gem::Version
96
96
  version: '2.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: reek
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - '>='
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - '>='
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  description: Rouster allows you to programmatically control and interact with your
@@ -115,7 +115,7 @@ executables: []
115
115
  extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
- - ".gitignore"
118
+ - .gitignore
119
119
  - LICENSE
120
120
  - README.md
121
121
  - Rakefile
@@ -123,11 +123,13 @@ files:
123
123
  - examples/bootstrap.rb
124
124
  - examples/demo.rb
125
125
  - examples/error.rb
126
+ - examples/passthrough.rb
126
127
  - lib/rouster.rb
127
128
  - lib/rouster/deltas.rb
128
129
  - lib/rouster/puppet.rb
129
130
  - lib/rouster/testing.rb
130
131
  - lib/rouster/tests.rb
132
+ - lib/rouster/vagrant.rb
131
133
  - path_helper.rb
132
134
  - rouster.gemspec
133
135
  - test/basic.rb
@@ -147,6 +149,7 @@ files:
147
149
  - test/functional/test_is_dir.rb
148
150
  - test/functional/test_is_file.rb
149
151
  - test/functional/test_new.rb
152
+ - test/functional/test_passthroughs.rb
150
153
  - test/functional/test_put.rb
151
154
  - test/functional/test_rebuild.rb
152
155
  - test/functional/test_restart.rb
@@ -170,6 +173,7 @@ files:
170
173
  - test/unit/test_parse_ls_string.rb
171
174
  - test/unit/test_traverse_up.rb
172
175
  - test/unit/testing/test_meets_constraint.rb
176
+ - test/unit/testing/test_validate_cron.rb
173
177
  - test/unit/testing/test_validate_file.rb
174
178
  - test/unit/testing/test_validate_group.rb
175
179
  - test/unit/testing/test_validate_package.rb
@@ -186,17 +190,17 @@ require_paths:
186
190
  - lib
187
191
  required_ruby_version: !ruby/object:Gem::Requirement
188
192
  requirements:
189
- - - ">="
193
+ - - '>='
190
194
  - !ruby/object:Gem::Version
191
195
  version: '0'
192
196
  required_rubygems_version: !ruby/object:Gem::Requirement
193
197
  requirements:
194
- - - ">="
198
+ - - '>='
195
199
  - !ruby/object:Gem::Version
196
200
  version: 1.3.6
197
201
  requirements: []
198
202
  rubyforge_project: Rouster
199
- rubygems_version: 2.0.4
203
+ rubygems_version: 2.2.2
200
204
  signing_key:
201
205
  specification_version: 4
202
206
  summary: Rouster is an abstraction layer for Vagrant