rouster 0.53 → 0.57

Sign up to get free protection for your applications and to get access to all the features.
@@ -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