rouster 0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/LICENSE +9 -0
- data/README.md +175 -0
- data/Rakefile +65 -0
- data/Vagrantfile +23 -0
- data/examples/bootstrap.rb +113 -0
- data/examples/demo.rb +71 -0
- data/examples/error.rb +30 -0
- data/lib/rouster.rb +737 -0
- data/lib/rouster/deltas.rb +481 -0
- data/lib/rouster/puppet.rb +398 -0
- data/lib/rouster/testing.rb +743 -0
- data/lib/rouster/tests.rb +596 -0
- data/path_helper.rb +21 -0
- data/rouster.gemspec +30 -0
- data/test/basic.rb +10 -0
- data/test/functional/deltas/test_get_crontab.rb +99 -0
- data/test/functional/deltas/test_get_groups.rb +48 -0
- data/test/functional/deltas/test_get_packages.rb +71 -0
- data/test/functional/deltas/test_get_ports.rb +119 -0
- data/test/functional/deltas/test_get_services.rb +43 -0
- data/test/functional/deltas/test_get_users.rb +45 -0
- data/test/functional/puppet/test_facter.rb +59 -0
- data/test/functional/test_caching.rb +124 -0
- data/test/functional/test_destroy.rb +51 -0
- data/test/functional/test_dirs.rb +88 -0
- data/test/functional/test_files.rb +64 -0
- data/test/functional/test_get.rb +76 -0
- data/test/functional/test_inspect.rb +31 -0
- data/test/functional/test_is_dir.rb +118 -0
- data/test/functional/test_is_file.rb +119 -0
- data/test/functional/test_new.rb +92 -0
- data/test/functional/test_put.rb +81 -0
- data/test/functional/test_rebuild.rb +49 -0
- data/test/functional/test_restart.rb +44 -0
- data/test/functional/test_run.rb +77 -0
- data/test/functional/test_status.rb +38 -0
- data/test/functional/test_suspend.rb +31 -0
- data/test/functional/test_up.rb +27 -0
- data/test/functional/test_validate_file.rb +30 -0
- data/test/puppet/manifests/default.pp +9 -0
- data/test/puppet/manifests/hiera.yaml +12 -0
- data/test/puppet/manifests/hieradata/common.json +3 -0
- data/test/puppet/manifests/hieradata/vagrant.json +3 -0
- data/test/puppet/manifests/manifest.pp +78 -0
- data/test/puppet/modules/role/manifests/ui.pp +5 -0
- data/test/puppet/test_apply.rb +149 -0
- data/test/puppet/test_roles.rb +186 -0
- data/test/tunnel_vs_scp.rb +41 -0
- data/test/unit/puppet/test_get_puppet_star.rb +68 -0
- data/test/unit/test_generate_unique_mac.rb +43 -0
- data/test/unit/test_new.rb +31 -0
- data/test/unit/test_parse_ls_string.rb +334 -0
- data/test/unit/test_traverse_up.rb +43 -0
- data/test/unit/testing/test_meets_constraint.rb +55 -0
- data/test/unit/testing/test_validate_file.rb +112 -0
- data/test/unit/testing/test_validate_group.rb +72 -0
- data/test/unit/testing/test_validate_package.rb +69 -0
- data/test/unit/testing/test_validate_port.rb +98 -0
- data/test/unit/testing/test_validate_service.rb +73 -0
- data/test/unit/testing/test_validate_user.rb +92 -0
- metadata +203 -0
data/path_helper.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# heavily influenced by https://github.com/puppetlabs/hiera/blob/master/spec/spec_helper.rb
|
2
|
+
|
3
|
+
# this gets us Rouster, still need to figure out how to find vagrant
|
4
|
+
$LOAD_PATH << File.join([File.dirname(__FILE__), 'lib'])
|
5
|
+
|
6
|
+
require 'rubygems'
|
7
|
+
|
8
|
+
# debugging help
|
9
|
+
begin
|
10
|
+
require 'debugger'
|
11
|
+
rescue LoadError
|
12
|
+
end
|
13
|
+
|
14
|
+
class Object
|
15
|
+
def my_methods
|
16
|
+
# Cookbook implementation
|
17
|
+
# my_super = self.class.superclass
|
18
|
+
# my_super ? methods - my_super.methods : methods
|
19
|
+
(methods - Object.methods).sort
|
20
|
+
end
|
21
|
+
end
|
data/rouster.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
## heavily modified/copy-paste-replaced from vagrant.gemspec
|
2
|
+
|
3
|
+
require './path_helper'
|
4
|
+
require 'rouster'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'rouster'
|
8
|
+
s.version = Rouster::VERSION
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.author = 'Conor Horan-Kates'
|
11
|
+
s.email = 'conor.code@gmail.com'
|
12
|
+
s.homepage = 'http://github.com/chorankates/rouster'
|
13
|
+
s.summary = 'Rouster is an abstraction layer for Vagrant'
|
14
|
+
s.description = 'Rouster allows you to programmatically control and interact with your existing Vagrant virtual machines'
|
15
|
+
s.license = 'BSD 3-Clause'
|
16
|
+
|
17
|
+
s.required_rubygems_version = '>= 1.3.6'
|
18
|
+
s.rubyforge_project = 'Rouster'
|
19
|
+
|
20
|
+
s.add_dependency 'json'
|
21
|
+
s.add_dependency 'log4r', '~> 1.1.9'
|
22
|
+
s.add_dependency 'net-scp'
|
23
|
+
s.add_dependency 'net-ssh'
|
24
|
+
s.add_dependency 'rake'
|
25
|
+
|
26
|
+
s.add_development_dependency 'test-unit', '~> 2.0'
|
27
|
+
s.add_development_dependency 'reek'
|
28
|
+
|
29
|
+
s.files = `git ls-files`.split("\n")
|
30
|
+
end
|
data/test/basic.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require sprintf('%s/../%s', File.dirname(File.expand_path(__FILE__)), 'path_helper')
|
2
|
+
|
3
|
+
require 'rouster'
|
4
|
+
require 'rouster/puppet'
|
5
|
+
require 'rouster/testing'
|
6
|
+
require 'rouster/tests'
|
7
|
+
|
8
|
+
p = Rouster.new(:name => 'app', :verbosity => 0)
|
9
|
+
|
10
|
+
p 'DBGZ' if nil?
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require sprintf('%s/../../../path_helper', File.dirname(File.expand_path(__FILE__)))
|
2
|
+
|
3
|
+
require 'rouster'
|
4
|
+
require 'rouster/deltas'
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
class TestDeltasGetCrontab < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
assert_nothing_raised do
|
11
|
+
@app = Rouster.new(:name => 'app')
|
12
|
+
end
|
13
|
+
|
14
|
+
@app.up()
|
15
|
+
|
16
|
+
## setup some cronjobs so we have something to look at - and yes, this is hacktastic
|
17
|
+
['root', 'puppet'].each do | user|
|
18
|
+
tmp = sprintf('/tmp/rouster.tmp.crontab.%s.%s.%s', user, Time.now.to_i, $$)
|
19
|
+
@app.run("echo '0 0 * * * echo #{user}' > #{tmp}")
|
20
|
+
#@app.run("crontab -u #{user} -f #{tmp}") # rhel
|
21
|
+
@app.run("crontab -u #{user} #{tmp}") # centos
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_happy_path
|
27
|
+
|
28
|
+
res = nil
|
29
|
+
|
30
|
+
assert_nothing_raised do
|
31
|
+
res = @app.get_crontab()
|
32
|
+
end
|
33
|
+
|
34
|
+
assert_equal(Hash, res.class)
|
35
|
+
assert_equal(res, @app.deltas[:crontab]['root'])
|
36
|
+
assert_not_nil(@app.deltas[:crontab]['root'])
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_happy_path_specified_user
|
41
|
+
|
42
|
+
res = nil
|
43
|
+
|
44
|
+
assert_nothing_raised do
|
45
|
+
res = @app.get_crontab('puppet')
|
46
|
+
end
|
47
|
+
|
48
|
+
assert_equal(Hash, res.class)
|
49
|
+
assert_equal(res, @app.deltas[:crontab]['puppet'])
|
50
|
+
assert_not_nil(@app.deltas[:crontab]['puppet'])
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_happy_path_specified_star
|
55
|
+
|
56
|
+
res = nil
|
57
|
+
|
58
|
+
assert_nothing_raised do
|
59
|
+
res = @app.get_crontab('*')
|
60
|
+
end
|
61
|
+
|
62
|
+
assert_equal(Hash, res.class)
|
63
|
+
assert_equal(res, @app.deltas[:crontab])
|
64
|
+
assert_not_nil(@app.deltas[:crontab]['root'])
|
65
|
+
assert_not_nil(@app.deltas[:crontab]['puppet'])
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_unhappy_path_non_existent_user
|
70
|
+
|
71
|
+
res = nil
|
72
|
+
|
73
|
+
assert_nothing_raised do
|
74
|
+
res = @app.get_crontab('fizzybang')
|
75
|
+
end
|
76
|
+
|
77
|
+
assert_equal(Hash, res.class)
|
78
|
+
assert_equal(0, res.keys.size)
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_happy_path_no_cache
|
83
|
+
|
84
|
+
res = nil
|
85
|
+
|
86
|
+
assert_nothing_raised do
|
87
|
+
res = @app.get_crontab('root', false)
|
88
|
+
end
|
89
|
+
|
90
|
+
assert_equal(Hash, res.class)
|
91
|
+
assert_nil(@app.deltas[:crontab])
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
def teardown
|
96
|
+
@app = nil
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require sprintf('%s/../../../path_helper', File.dirname(File.expand_path(__FILE__)))
|
2
|
+
|
3
|
+
require 'rouster'
|
4
|
+
require 'rouster/deltas'
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
class TestDeltasGetGroups < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
assert_nothing_raised do
|
11
|
+
@app = Rouster.new(:name => 'app')
|
12
|
+
end
|
13
|
+
|
14
|
+
@app.up()
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_happy_path
|
18
|
+
res = nil
|
19
|
+
|
20
|
+
assert_nothing_raised do
|
21
|
+
res = @app.get_groups()
|
22
|
+
end
|
23
|
+
|
24
|
+
assert_equal(Hash, res.class)
|
25
|
+
assert_not_nil(@app.deltas[:groups])
|
26
|
+
|
27
|
+
res.each_key do |k|
|
28
|
+
assert_not_nil(res[k][:users])
|
29
|
+
assert_equal(res[k][:users].class, Array)
|
30
|
+
assert_not_nil(res[k][:gid])
|
31
|
+
end
|
32
|
+
|
33
|
+
## only working on *nix right now, check some specific accounts
|
34
|
+
expected = %w[root vagrant]
|
35
|
+
|
36
|
+
expected.each do |e|
|
37
|
+
assert_not_nil(res[e])
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
# TODO add some non-caching tests
|
43
|
+
|
44
|
+
def teardown
|
45
|
+
@app = nil
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require sprintf('%s/../../../path_helper', File.dirname(File.expand_path(__FILE__)))
|
2
|
+
|
3
|
+
require 'rouster'
|
4
|
+
require 'rouster/deltas'
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
# TODO need to figure out how to add package strings on our own for better testing (i.e. sfdc-razorpolicy-rhel-6.2-batch-1.0-17.noarch)
|
8
|
+
|
9
|
+
class TestDeltasGetPackages < Test::Unit::TestCase
|
10
|
+
|
11
|
+
def setup
|
12
|
+
assert_nothing_raised do
|
13
|
+
@app = Rouster.new(:name => 'app')
|
14
|
+
end
|
15
|
+
|
16
|
+
@app.up()
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_happy_path
|
20
|
+
res = nil
|
21
|
+
|
22
|
+
assert_equal(false, @app.deltas.has_key?(:packages))
|
23
|
+
|
24
|
+
assert_nothing_raised do
|
25
|
+
res = @app.get_packages()
|
26
|
+
end
|
27
|
+
|
28
|
+
assert_equal(Hash, res.class)
|
29
|
+
assert_not_nil(@app.deltas[:packages])
|
30
|
+
|
31
|
+
res.each_key do |k|
|
32
|
+
assert_not_nil(res[k])
|
33
|
+
assert_match(/^\d+/, res[k]) # start with a number
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_caching_negative
|
39
|
+
res = nil
|
40
|
+
|
41
|
+
assert_equal(false, @app.deltas.has_key?(:packages))
|
42
|
+
|
43
|
+
assert_nothing_raised do
|
44
|
+
res = @app.get_packages(false)
|
45
|
+
end
|
46
|
+
|
47
|
+
assert_equal(Hash, res.class)
|
48
|
+
assert_equal(false, @app.deltas.has_key?(:packages))
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_without_deep_inspection
|
52
|
+
res = nil
|
53
|
+
|
54
|
+
assert_nothing_raised do
|
55
|
+
res = @app.get_packages(true, false)
|
56
|
+
end
|
57
|
+
|
58
|
+
res.each_key do |k|
|
59
|
+
assert_not_nil(res[k])
|
60
|
+
|
61
|
+
#assert_match(/\d*\..*/, res[k]) # testing the regular expression used in deltas.rb itself
|
62
|
+
assert_match(/\?/, res[k])
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
def teardown
|
68
|
+
@app = nil
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require sprintf('%s/../../../path_helper', File.dirname(File.expand_path(__FILE__)))
|
2
|
+
|
3
|
+
require 'rouster'
|
4
|
+
require 'rouster/deltas'
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
class TestDeltasGetPorts < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
assert_nothing_raised do
|
11
|
+
@app = Rouster.new(:name => 'app')
|
12
|
+
end
|
13
|
+
|
14
|
+
@app.up()
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_happy_path
|
18
|
+
res = nil
|
19
|
+
|
20
|
+
assert_nil(@app.deltas[:ports])
|
21
|
+
|
22
|
+
assert_nothing_raised do
|
23
|
+
res = @app.get_ports()
|
24
|
+
end
|
25
|
+
|
26
|
+
assert_equal(Hash, res.class)
|
27
|
+
|
28
|
+
res.each_key do |proto|
|
29
|
+
assert_not_nil(res[proto])
|
30
|
+
|
31
|
+
res[proto].each_key do |port|
|
32
|
+
assert_not_nil(res[proto][port])
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
assert_nil(@app.deltas[:ports])
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_happy_path_caching
|
42
|
+
|
43
|
+
assert_nil(@app.deltas[:ports])
|
44
|
+
|
45
|
+
assert_nothing_raised do
|
46
|
+
@app.get_ports(true)
|
47
|
+
end
|
48
|
+
|
49
|
+
assert_equal(Hash, @app.deltas[:ports].class)
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
# TODO this probably isn't the right placefor this test..
|
54
|
+
def test_functional_tests
|
55
|
+
|
56
|
+
# TODO this is still wrong, since the data structure may change further
|
57
|
+
stock = {
|
58
|
+
"udp"=>
|
59
|
+
{"123"=>
|
60
|
+
{:address=>
|
61
|
+
{"fe80::a00:27ff:fe30:a00b"=>"you_might_not_get_it",
|
62
|
+
"::1"=>"you_might_not_get_it",
|
63
|
+
"0.0.0.0"=>"you_might_not_get_it",
|
64
|
+
"fe80::a00:27ff:fe42:f532"=>"you_might_not_get_it",
|
65
|
+
"127.0.0.1"=>"you_might_not_get_it",
|
66
|
+
"::"=>"you_might_not_get_it",
|
67
|
+
"10.0.2.15"=>"you_might_not_get_it",
|
68
|
+
"10.0.1.104"=>"you_might_not_get_it",
|
69
|
+
"192.168.1.161"=>"you_might_not_get_it"
|
70
|
+
}
|
71
|
+
},
|
72
|
+
"68"=>
|
73
|
+
{:address=>
|
74
|
+
{"0.0.0.0"=>"you_might_not_get_it"}
|
75
|
+
},
|
76
|
+
"111"=>
|
77
|
+
{:address=>
|
78
|
+
{"0.0.0.0"=>"you_might_not_get_it", "::"=>"you_might_not_get_it"}
|
79
|
+
},
|
80
|
+
"840"=>
|
81
|
+
{:address=>
|
82
|
+
{"0.0.0.0"=>"you_might_not_get_it", "::"=>"you_might_not_get_it"}
|
83
|
+
},
|
84
|
+
"161"=>
|
85
|
+
{:address=>
|
86
|
+
{"0.0.0.0"=>"you_might_not_get_it"}
|
87
|
+
}
|
88
|
+
},
|
89
|
+
"tcp"=>
|
90
|
+
{"111"=>{:address=>{"0.0.0.0"=>"LISTEN", "::"=>"LISTEN"}},
|
91
|
+
"199"=>{:address=>{"127.0.0.1"=>"LISTEN"}},
|
92
|
+
"25"=>{:address=>{"127.0.0.1"=>"LISTEN"}},
|
93
|
+
"22"=>{:address=>{"0.0.0.0"=>"LISTEN", "::"=>"LISTEN"}}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
@app.deltas[:ports] = stock
|
98
|
+
|
99
|
+
assert_equal(true, @app.is_port_open?(1234, 'tcp', true))
|
100
|
+
assert_equal(true, @app.is_port_active?(22, 'tcp', true))
|
101
|
+
|
102
|
+
assert_equal(true, @app.is_port_open?(303, 'udp', true))
|
103
|
+
assert_equal(true, @app.is_port_active?(123, 'udp', true))
|
104
|
+
|
105
|
+
# expected to return false
|
106
|
+
assert_equal(false, @app.is_port_open?(22, 'tcp', true))
|
107
|
+
assert_equal(false, @app.is_port_active?(1234, 'tcp', true))
|
108
|
+
|
109
|
+
# caching/argument default validation -- can't currently do this, don't know what ports will be open on others systems
|
110
|
+
#assert_equal(true, @app.is_port_active?(22))
|
111
|
+
#assert_equal(true, @app.is_port_open?(1234))
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
def teardown
|
116
|
+
@app = nil
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require sprintf('%s/../../../path_helper', File.dirname(File.expand_path(__FILE__)))
|
2
|
+
|
3
|
+
require 'rouster'
|
4
|
+
require 'rouster/deltas'
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
class TestDeltasGetServices < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
assert_nothing_raised do
|
11
|
+
@app = Rouster.new(:name => 'app')
|
12
|
+
end
|
13
|
+
|
14
|
+
@app.up()
|
15
|
+
|
16
|
+
# eventually this should be standardized (and symbolized?)
|
17
|
+
@allowed_states = %w(exists operational running stopped)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_happy_path
|
21
|
+
res = nil
|
22
|
+
|
23
|
+
assert_nothing_raised do
|
24
|
+
res = @app.get_services()
|
25
|
+
end
|
26
|
+
|
27
|
+
assert_equal(Hash, res.class)
|
28
|
+
assert_not_nil(@app.deltas[:services])
|
29
|
+
|
30
|
+
res.each_key do |k|
|
31
|
+
assert_not_nil(res[k])
|
32
|
+
#assert(@allowed_states.member?(res[k]))
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
# TODO add some caching tests
|
38
|
+
|
39
|
+
def teardown
|
40
|
+
@app = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|