rouster 0.64 → 0.67
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -3
- data/Rakefile +2 -8
- data/Vagrantfile +10 -5
- data/examples/bootstrap.rb +14 -94
- data/lib/rouster.rb +63 -25
- data/lib/rouster/deltas.rb +27 -1
- data/plugins/openstack.rb +13 -3
- data/test/functional/deltas/test_get_os.rb +16 -16
- data/test/unit/testing/resources/rhel-systemd +46 -0
- data/test/unit/testing/test_get_services.rb +28 -2
- data/test/unit/testing/test_meets_constraint.rb +6 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82f9824019bc7951750f51019efd7d5d7e174d33
|
4
|
+
data.tar.gz: babacb0d00e65d6ea702886286940e6bdf61f9d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fbed7fb6d5e19c71ad2488c0a50b9aa387ab5474363f4dc1c318c9cae9dba9b1c632bb2f6202a8e3d909cc7b92d54d489ad19ef9417f06a92c7b8eaa2bed2e0
|
7
|
+
data.tar.gz: d5ad29bdf90c6ef7c9896720ce2a16eff88833dc9e1c71e708b131a7c8edc6824546998ba086ae31de76966106458992ce23198a7b709a3d8be8f3de3617b516
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -24,8 +24,8 @@ end
|
|
24
24
|
|
25
25
|
task :examples do
|
26
26
|
Dir['examples/**/*.rb'].each do |example|
|
27
|
-
|
28
|
-
|
27
|
+
sh "ruby #{example}"
|
28
|
+
end
|
29
29
|
end
|
30
30
|
|
31
31
|
task :vdestroy do
|
@@ -39,32 +39,26 @@ end
|
|
39
39
|
Rake::TestTask.new(:test => :vdestroy) do |t|
|
40
40
|
t.libs << 'lib'
|
41
41
|
t.test_files = FileList['test/**/test_*.rb']
|
42
|
-
t.verbose = true
|
43
42
|
end
|
44
43
|
|
45
44
|
Rake::TestTask.new do |t|
|
46
45
|
t.name = 'unit'
|
47
46
|
t.libs << 'lib'
|
48
47
|
t.test_files = FileList['test/unit/**/test_*.rb']
|
49
|
-
t.verbose = true
|
50
48
|
end
|
51
49
|
|
52
50
|
Rake::TestTask.new(:functional => :vdestroy) do |t|
|
53
51
|
t.libs << 'lib'
|
54
52
|
t.test_files = FileList['test/functional/**/test_*.rb']
|
55
|
-
t.verbose = true
|
56
53
|
end
|
57
54
|
|
58
55
|
Rake::TestTask.new(:deltas => :vdestroy) do |t|
|
59
56
|
t.libs << 'lib'
|
60
57
|
t.test_files = FileList['test/functional/deltas/test_*.rb']
|
61
|
-
t.verbose = true
|
62
58
|
end
|
63
59
|
|
64
60
|
Rake::TestTask.new do |t|
|
65
61
|
t.name = 'puppet'
|
66
62
|
t.libs << 'lib'
|
67
63
|
t.test_files = FileList['test/puppet/test*.rb']
|
68
|
-
t.verbose = true
|
69
64
|
end
|
70
|
-
|
data/Vagrantfile
CHANGED
@@ -10,16 +10,21 @@ boxes = {
|
|
10
10
|
:box_url => 'http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box',
|
11
11
|
},
|
12
12
|
|
13
|
-
:ubuntu12
|
14
|
-
|
15
|
-
|
13
|
+
:ubuntu12 => {
|
14
|
+
:box_name => 'ubuntu12',
|
15
|
+
:box_url => 'http://puppet-vagrant-boxes.puppetlabs.com/ubuntu-server-12042-x64-vbox4210.box',
|
16
16
|
},
|
17
17
|
|
18
|
-
:ubuntu13
|
18
|
+
:ubuntu13 => {
|
19
19
|
:box_name => 'ubuntu13',
|
20
20
|
:box_url => 'http://puppet-vagrant-boxes.puppetlabs.com/ubuntu-1310-x64-virtualbox-puppet.box',
|
21
21
|
},
|
22
22
|
|
23
|
+
:centos7 => {
|
24
|
+
:box_name => 'centos7b',
|
25
|
+
:box_url => 'https://atlas.hashicorp.com/centos/boxes/7/versions/1610.01/providers/virtualbox.box',
|
26
|
+
},
|
27
|
+
|
23
28
|
}
|
24
29
|
|
25
30
|
Vagrant::Config.run do |config|
|
@@ -28,7 +33,7 @@ Vagrant::Config.run do |config|
|
|
28
33
|
|
29
34
|
worker.vm.box = hash[:box_name]
|
30
35
|
worker.vm.box_url = hash[:box_url]
|
31
|
-
worker.vm.host_name = hash[:box_name]
|
36
|
+
worker.vm.host_name = hash[:box_hostname] || hash[:box_name]
|
32
37
|
worker.vm.network :hostonly, sprintf('10.0.1.%s', rand(253).to_i + 2)
|
33
38
|
worker.ssh.forward_agent = true
|
34
39
|
|
data/examples/bootstrap.rb
CHANGED
@@ -4,110 +4,30 @@ require 'rouster'
|
|
4
4
|
require 'rouster/puppet'
|
5
5
|
require 'rouster/tests'
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
centos6 = Rouster.new(:name => 'app', :verbosity => 4, :sudo => true)
|
8
|
+
centos7 = Rouster.new(:name => 'centos7', :verbosity => 4, :sudo => true)
|
9
9
|
|
10
|
-
|
11
|
-
# commented out currently because passthrough is not MVP
|
12
|
-
#lpt = Rouster.new(:passthrough => 'local', :verbosity => 4)
|
13
|
-
#rpt = Rouster.new(:passthrough => 'remote', :verbosity => 4, :sshkey => '~/.ssh/id_dsa')
|
14
|
-
|
15
|
-
workers = [app]
|
10
|
+
workers = [centos6, centos7]
|
16
11
|
|
17
12
|
workers.each do |w|
|
18
13
|
p '%s config: ' % w.name
|
19
14
|
p w
|
20
15
|
|
21
|
-
p '
|
22
|
-
p '
|
23
|
-
w.
|
24
|
-
|
25
|
-
p sprintf('%s status: %s', w.name, w.status())
|
26
|
-
p sprintf('%s available via ssh: %s', w.name, w.is_available_via_ssh?())
|
27
|
-
|
28
|
-
p 'suspending the box'
|
29
|
-
w.suspend()
|
30
|
-
|
31
|
-
p sprintf('%s status: %s', w.name, w.status())
|
32
|
-
p sprintf('%s available via ssh: %s', w.name, w.is_available_via_ssh?())
|
33
|
-
|
34
|
-
p 'bringing the box back'
|
35
|
-
w.up()
|
36
|
-
|
37
|
-
p sprintf('%s status: %s', w.name, w.status())
|
38
|
-
p sprintf('%s available via ssh: %s', w.name, w.is_available_via_ssh?())
|
39
|
-
|
40
|
-
## expected success
|
41
|
-
p sprintf('is_dir?(/tmp): %s', w.is_dir?('/tmp'))
|
42
|
-
p sprintf('is_exectuable?(/sbin/service: %s', w.is_executable?('/sbin/service'))
|
43
|
-
p sprintf('is_file?(/etc/hosts): %s', w.is_file?('/etc/hosts'))
|
44
|
-
p sprintf('is_group?(root): %s', w.is_group?('root'))
|
45
|
-
p sprintf('is_in_file?(/etc/hosts, puppet): %s', w.is_in_file?('/etc/hosts', 'puppet'))
|
46
|
-
p sprintf('is_in_path?(ping): %s', w.is_in_path?('ping'))
|
47
|
-
p sprintf('is_package?(libpcap): %s', w.is_package?('libpcap'))
|
48
|
-
p sprintf('is_port_open?(9999): %s', w.is_port_open?(9999))
|
49
|
-
p sprintf('is_port_active?(22): %s', w.is_port_active?(22))
|
50
|
-
p sprintf('is_process_running?(sshd): %s', w.is_process_running?('sshd'))
|
51
|
-
p sprintf('is_readable?(/etc/hosts): %s', w.is_readable?('/etc/hosts'))
|
52
|
-
p sprintf('is_service?(iptables): %s', w.is_service?('iptables'))
|
53
|
-
p sprintf('is_service_running?(iptables): %s', w.is_service_running?('iptables'))
|
54
|
-
p sprintf('is_user?(root): %s', w.is_user?('root'))
|
55
|
-
p sprintf('is_writeable?(/etc/hosts): %s', w.is_writeable?('/etc/hosts'))
|
16
|
+
p 'uptime: %s' % w.run('uptime')
|
17
|
+
p 'os type: %s' % w.os_type
|
18
|
+
p 'os version: %s' % w.os_version(w.os_type)
|
56
19
|
|
57
|
-
|
58
|
-
p sprintf('is_dir?(/dne): %s', w.is_dir?('/dne'))
|
59
|
-
p sprintf('is_executable?(fizzybang): %s', w.is_executable?('fizzybang'))
|
60
|
-
p sprintf('is_file?(/dne/fizzy): %s', w.is_file?('/dne/fizzy'))
|
61
|
-
p sprintf('is_group?(three-amigos): %s', w.is_group?('three-amigos'))
|
62
|
-
p sprintf('is_in_file?(/etc/hosts, this content is not there): %s', w.is_in_file?('/etc/hosts', 'this content is not there'))
|
63
|
-
p sprintf('is_in_file?(/dne/fizzy, this file is not there): %s', w.is_in_file?('/dne/fizzy', 'this file is not there'))
|
64
|
-
p sprintf('is_in_path?(fizzy): %s', w.is_in_path?('fizzy'))
|
65
|
-
p sprintf('is_package?(fizzybang): %s', w.is_package?('fizzybang'))
|
66
|
-
p sprintf('is_port_open?(123, udp): %s', w.is_port_open?(123, 'udp'))
|
67
|
-
p sprintf('is_port_open?(22): %s', w.is_port_open?(22))
|
68
|
-
p sprintf('is_process_running?(fizzy): %s', w.is_process_running?('fizzy'))
|
69
|
-
p sprintf('is_readable?(/dne/fizzy): %s', w.is_readable?('/dne/fizzy'))
|
70
|
-
p sprintf('is_service?(syslogd): %s', w.is_service?('syslogd'))
|
71
|
-
p sprintf('is_service_running?(smartd): %s', w.is_service_running?('smartd'))
|
72
|
-
p sprintf('is_user?(toor): %s', w.is_user?('toor'))
|
73
|
-
#p sprintf('is_writable?(/etc/hosts): %s', w.is_writeable?('/etc/hosts')) # running as sudo, so everything is writeable -- can we test this with a file in a path that DNE?
|
74
|
-
|
75
|
-
# put a file on the box and then bring it back
|
76
|
-
w.put(__FILE__, '/tmp/foobar')
|
77
|
-
w.get('/tmp/foobar', 'foobar_from_piab_host.tmp')
|
78
|
-
|
79
|
-
# output should be the same
|
80
|
-
p sprintf('%s uname -a via run: %s', w.name, w.run('uname -a'))
|
81
|
-
p sprintf('%s uname -a via output: %s', w.name, w.get_output())
|
82
|
-
|
83
|
-
begin
|
84
|
-
p sprintf('%s fizzy: %s', w.name, w.run('fizzy'))
|
85
|
-
rescue => e
|
86
|
-
p e
|
87
|
-
end
|
88
|
-
|
89
|
-
begin
|
90
|
-
p sprintf('%s ls /dne/ %s', w.name, w.run('ls /dne/'))
|
91
|
-
rescue => e
|
92
|
-
p e
|
93
|
-
end
|
94
|
-
|
95
|
-
p sprintf('%s ls /dne/ expected exit code 2: %s', w.name, w.run('ls /dne/', 2))
|
96
|
-
|
97
|
-
# tear the box down
|
98
|
-
p 'destroying the box'
|
99
|
-
w.destroy()
|
20
|
+
p 'status: %s' % w.status()
|
100
21
|
|
101
|
-
p
|
102
|
-
p
|
22
|
+
p 'services:'
|
23
|
+
p w.get_services()
|
103
24
|
|
104
|
-
|
105
|
-
|
106
|
-
w.up()
|
25
|
+
p 'rebooting...'
|
26
|
+
w.restart(120)
|
107
27
|
|
108
|
-
p
|
109
|
-
p
|
28
|
+
p 'status: %s' % w.status()
|
29
|
+
p 'uptime: %s' % w.run('uptime')
|
110
30
|
|
111
31
|
end
|
112
32
|
|
113
|
-
exit
|
33
|
+
exit
|
data/lib/rouster.rb
CHANGED
@@ -12,7 +12,7 @@ require 'rouster/vagrant'
|
|
12
12
|
class Rouster
|
13
13
|
|
14
14
|
# sporadically updated version number
|
15
|
-
VERSION = 0.
|
15
|
+
VERSION = 0.67
|
16
16
|
|
17
17
|
# custom exceptions -- what else do we want them to include/do?
|
18
18
|
class ArgumentError < StandardError; end # thrown by methods that take parameters from users
|
@@ -76,7 +76,9 @@ class Rouster
|
|
76
76
|
@verbosity_logfile = 2 # this is kind of arbitrary, but won't actually be created unless opts[:logfile] is also passed
|
77
77
|
end
|
78
78
|
|
79
|
-
@ostype
|
79
|
+
@ostype = nil
|
80
|
+
@osversion = nil
|
81
|
+
|
80
82
|
@output = Array.new
|
81
83
|
@cache = Hash.new
|
82
84
|
@deltas = Hash.new
|
@@ -410,14 +412,8 @@ class Rouster
|
|
410
412
|
elsif line.match(/Port (\d*?)$/)
|
411
413
|
h[:ssh_port] = $1
|
412
414
|
elsif line.match(/IdentityFile (.*?)$/)
|
413
|
-
|
414
|
-
|
415
|
-
h[:identity_file] = key
|
416
|
-
else
|
417
|
-
@logger.info(sprintf('using specified key[%s] instead of discovered key[%s]', @sshkey, key))
|
418
|
-
h[:identity_file] = @sshkey
|
419
|
-
end
|
420
|
-
|
415
|
+
h[:identity_file] = $1
|
416
|
+
@logger.info(sprintf('vagrant specified key[%s] differs from provided[%s], will use both', @sshkey, h[:identity_file]))
|
421
417
|
end
|
422
418
|
end
|
423
419
|
|
@@ -477,7 +473,7 @@ class Rouster
|
|
477
473
|
@ssh_info[:hostname],
|
478
474
|
@ssh_info[:user],
|
479
475
|
:port => @ssh_info[:ssh_port],
|
480
|
-
:keys => [@sshkey],
|
476
|
+
:keys => [ @sshkey, @ssh_info[:identity_file] ].uniq, # try to use what the user specified first, but fall back to what vagrant says
|
481
477
|
:paranoid => false
|
482
478
|
)
|
483
479
|
else
|
@@ -511,16 +507,9 @@ class Rouster
|
|
511
507
|
return @ostype
|
512
508
|
end
|
513
509
|
|
514
|
-
files = {
|
515
|
-
:ubuntu => '/etc/os-release', # debian too
|
516
|
-
:solaris => '/etc/release',
|
517
|
-
:rhel => ['/etc/os-release', '/etc/redhat-release'], # and centos
|
518
|
-
:osx => '/System/Library/CoreServices/SystemVersion.plist',
|
519
|
-
}
|
520
|
-
|
521
510
|
res = :invalid
|
522
511
|
|
523
|
-
|
512
|
+
Rouster.os_files.each_pair do |os, f|
|
524
513
|
[ f ].flatten.each do |candidate|
|
525
514
|
if self.is_file?(candidate)
|
526
515
|
next if candidate.eql?('/etc/os-release') and ! self.is_in_file?(candidate, os.to_s, 'i') # CentOS detection
|
@@ -531,12 +520,48 @@ class Rouster
|
|
531
520
|
break unless res.eql?(:invalid)
|
532
521
|
end
|
533
522
|
|
534
|
-
@logger.error(sprintf('unable to determine OS, looking for[%s]',
|
523
|
+
@logger.error(sprintf('unable to determine OS, looking for[%s]', Rouster.os_files)) if res.eql?(:invalid)
|
535
524
|
|
536
525
|
@ostype = res
|
537
526
|
res
|
538
527
|
end
|
539
528
|
|
529
|
+
##
|
530
|
+
# os_version
|
531
|
+
#
|
532
|
+
#
|
533
|
+
def os_version(os_type)
|
534
|
+
return @osversion if @osversion
|
535
|
+
|
536
|
+
res = :invalid
|
537
|
+
|
538
|
+
[ Rouster.os_files[os_type] ].flatten.each do |candidate|
|
539
|
+
if self.is_file?(candidate)
|
540
|
+
next if candidate.eql?('/etc/os-release') and ! self.is_in_file?(candidate, os_type.to_s, 'i') # CentOS detection
|
541
|
+
contents = self.run(sprintf('cat %s', candidate))
|
542
|
+
if os_type.eql?(:ubuntu)
|
543
|
+
version = $1 if contents.match(/.*VERSION\="(\d+\.\d+).*"/) # VERSION="13.10, Saucy Salamander"
|
544
|
+
res = version unless version.nil?
|
545
|
+
elsif os_type.eql?(:rhel)
|
546
|
+
version = $1 if contents.match(/.*VERSION\="(\d+)"/) # VERSION="7 (Core)"
|
547
|
+
version = $1 if version.nil? and contents.match(/.*(\d+.\d+)/) # CentOS release 6.4 (Final)
|
548
|
+
res = version unless version.nil?
|
549
|
+
elsif os_type.eql?(:osx)
|
550
|
+
version = $1 if contents.match(/<key>ProductVersion<\/key>.*<string>(.*)<\/string>/m) # <key>ProductVersion</key>\n <string>10.12.1</string>
|
551
|
+
res = version unless version.nil?
|
552
|
+
end
|
553
|
+
|
554
|
+
end
|
555
|
+
break unless res.eql?(:invalid)
|
556
|
+
end
|
557
|
+
|
558
|
+
@logger.error(sprintf('unable to determine OS version, looking for[%s]', Rouster.os_files[os_type])) if res.eql?(:invalid)
|
559
|
+
|
560
|
+
@osversion = res
|
561
|
+
|
562
|
+
res
|
563
|
+
end
|
564
|
+
|
540
565
|
##
|
541
566
|
# get
|
542
567
|
#
|
@@ -620,7 +645,7 @@ class Rouster
|
|
620
645
|
#
|
621
646
|
# parameters
|
622
647
|
# * [wait] - number of seconds to wait until is_available_via_ssh?() returns true before assuming failure
|
623
|
-
def restart(wait=nil)
|
648
|
+
def restart(wait=nil, expected_exitcodes = [0])
|
624
649
|
@logger.debug('restart()')
|
625
650
|
|
626
651
|
if self.is_passthrough? and self.passthrough[:type].eql?(:local)
|
@@ -630,11 +655,15 @@ class Rouster
|
|
630
655
|
|
631
656
|
case os_type
|
632
657
|
when :osx
|
633
|
-
self.run('shutdown -r now')
|
634
|
-
when :rhel, :ubuntu
|
635
|
-
|
658
|
+
self.run('shutdown -r now', expected_exitcodes)
|
659
|
+
when :rhel, :ubuntu
|
660
|
+
if os_type.eql?(:rhel) and os_version(os_type).match(/7/)
|
661
|
+
self.run('shutdown --halt --reboot now', expected_exitcodes << 256)
|
662
|
+
else
|
663
|
+
self.run('shutdown -rf now')
|
664
|
+
end
|
636
665
|
when :solaris
|
637
|
-
self.run('shutdown -y -i5 -g0')
|
666
|
+
self.run('shutdown -y -i5 -g0', expected_exitcodes)
|
638
667
|
else
|
639
668
|
raise InternalError.new(sprintf('unsupported OS[%s]', @ostype))
|
640
669
|
end
|
@@ -783,6 +812,15 @@ class Rouster
|
|
783
812
|
nil
|
784
813
|
end
|
785
814
|
|
815
|
+
def self.os_files
|
816
|
+
{
|
817
|
+
:ubuntu => '/etc/os-release', # debian too
|
818
|
+
:solaris => '/etc/release',
|
819
|
+
:rhel => ['/etc/os-release', '/etc/redhat-release'], # and centos
|
820
|
+
:osx => '/System/Library/CoreServices/SystemVersion.plist',
|
821
|
+
}
|
822
|
+
end
|
823
|
+
|
786
824
|
end
|
787
825
|
|
788
826
|
class Object
|
data/lib/rouster/deltas.rb
CHANGED
@@ -473,7 +473,8 @@ class Rouster
|
|
473
473
|
:upstart => 'initctl list',
|
474
474
|
},
|
475
475
|
:rhel => {
|
476
|
-
:
|
476
|
+
:systemd => 'systemctl list-units --type=service --no-pager',
|
477
|
+
:systemv => 'service --status-all',
|
477
478
|
:upstart => 'initctl list',
|
478
479
|
},
|
479
480
|
|
@@ -493,6 +494,11 @@ class Rouster
|
|
493
494
|
raise InternalError.new(sprintf('unable to get service information from VM operating system[%s]', os)) if provider.eql?(:invalid)
|
494
495
|
raise ArgumentError.new(sprintf('unable to find command provider[%s] for [%s]', provider, os)) if commands[os][provider].nil?
|
495
496
|
|
497
|
+
unless seed or self.is_in_path?(commands[os][provider].split(' ').first)
|
498
|
+
@logger.info(sprintf('skipping provider[%s], not in $PATH[%s]', provider, commands[os][provider]))
|
499
|
+
next
|
500
|
+
end
|
501
|
+
|
496
502
|
@logger.info(sprintf('get_services using provider [%s] on [%s]', provider, os))
|
497
503
|
|
498
504
|
# TODO while this is true, what if self.user is 'root'.. -- the problem is we don't have self.user, and we store this data differently depending on self.passthrough?
|
@@ -665,6 +671,26 @@ class Rouster
|
|
665
671
|
|
666
672
|
res[service] = mode unless res.has_key?(service)
|
667
673
|
|
674
|
+
elsif provider.eql?(:systemd)
|
675
|
+
# UNIT LOAD ACTIVE SUB DESCRIPTION
|
676
|
+
# nfs-utils.service loaded inactive dead NFS server and client services
|
677
|
+
# crond.service loaded active running Command Scheduler
|
678
|
+
|
679
|
+
if line.match(/^\W*(.*?)\.service\s+(?:.*?)\s+(.*?)\s+(.*?)\s+(?:.*?)$/) # 5 space separated characters
|
680
|
+
service = $1
|
681
|
+
active = $2
|
682
|
+
sub = $3
|
683
|
+
|
684
|
+
if humanize
|
685
|
+
mode = sub.match('running') ? 'running' : 'stopped'
|
686
|
+
mode = 'unsure' unless mode.eql?('stopped') or mode.eql?('running')
|
687
|
+
end
|
688
|
+
|
689
|
+
res[service] = mode
|
690
|
+
else
|
691
|
+
# not logging here, there is a bunch of garbage output at the end of the output that we can't seem to suppress
|
692
|
+
next
|
693
|
+
end
|
668
694
|
|
669
695
|
end
|
670
696
|
|
data/plugins/openstack.rb
CHANGED
@@ -37,15 +37,25 @@ class Rouster
|
|
37
37
|
self.connect_ssh_tunnel
|
38
38
|
else
|
39
39
|
server = @nova.servers.create(:name => @name, :flavor_ref => @passthrough[:flavor_ref],
|
40
|
-
:image_ref => @passthrough[:image_ref], :key_name => @passthrough[:keypair])
|
40
|
+
:image_ref => @passthrough[:image_ref], :key_name => @passthrough[:keypair], :user_data => @passthrough[:user_data])
|
41
41
|
server.wait_for { ready? }
|
42
42
|
@instance_data = server
|
43
|
-
self.
|
43
|
+
if defined?(self.addresses['NextGen'][0]['addr'])
|
44
|
+
self.passthrough[:host] = self.addresses['NextGen'][0]['addr']
|
45
|
+
else
|
46
|
+
server.addresses.each_key do |address_key|
|
47
|
+
if defined?(server.addresses[address_key])
|
48
|
+
self.passthrough[:host] = server.addresses[address_key][0]['addr']
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
44
52
|
self.passthrough[:instance] = self.ostack_get_instance_id
|
53
|
+
@logger.debug(sprintf('Connecting to running instance [%s] while calling ostack_up()', self.passthrough[:instance]))
|
54
|
+
self.connect_ssh_tunnel
|
45
55
|
end
|
46
56
|
self.passthrough[:instance]
|
47
57
|
end
|
48
|
-
|
58
|
+
|
49
59
|
def ostack_get_ip()
|
50
60
|
self.passthrough[:host]
|
51
61
|
end
|
@@ -7,14 +7,6 @@ require 'test/unit'
|
|
7
7
|
|
8
8
|
class TestValidateFileFunctional < Test::Unit::TestCase
|
9
9
|
|
10
|
-
# TODO this should probably be further abstracted into the implementation, but this is fine for now
|
11
|
-
FLAG_FILES = {
|
12
|
-
:ubuntu => '/etc/os-release', # debian too
|
13
|
-
:solaris => '/etc/release',
|
14
|
-
:rhel => '/etc/redhat-release', # centos too
|
15
|
-
:osx => '/System/Library/CoreServices/SystemVersion.plist',
|
16
|
-
}
|
17
|
-
|
18
10
|
def setup
|
19
11
|
# expose private methods
|
20
12
|
Rouster.send(:public, *Rouster.private_instance_methods)
|
@@ -25,10 +17,12 @@ class TestValidateFileFunctional < Test::Unit::TestCase
|
|
25
17
|
|
26
18
|
def teardown
|
27
19
|
# put the flag file back in place
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
@app.
|
20
|
+
Rouster.os_files.each_pair do |_os, ff|
|
21
|
+
[ ff ].flatten.each do |f|
|
22
|
+
bkup = sprintf('%s.bkup', f)
|
23
|
+
if @app.is_file?(bkup)
|
24
|
+
@app.run(sprintf('mv %s %s', bkup, f))
|
25
|
+
end
|
32
26
|
end
|
33
27
|
end
|
34
28
|
end
|
@@ -39,6 +33,10 @@ class TestValidateFileFunctional < Test::Unit::TestCase
|
|
39
33
|
assert_not_nil(type, sprintf('unable to determine vm[%s] OS', @app))
|
40
34
|
assert_not_equal(:invalid, type)
|
41
35
|
|
36
|
+
version = @app.os_version(type)
|
37
|
+
assert_not_nil(version, sprintf('unable to determine vm[%s] OS version', @app))
|
38
|
+
assert_not_equal(:invalid, version)
|
39
|
+
|
42
40
|
assert_nothing_raised do
|
43
41
|
@app.get_services
|
44
42
|
end
|
@@ -47,9 +45,11 @@ class TestValidateFileFunctional < Test::Unit::TestCase
|
|
47
45
|
|
48
46
|
def test_unhappy_path
|
49
47
|
# move the flag file out of the way
|
50
|
-
|
51
|
-
|
52
|
-
@app.
|
48
|
+
Rouster.os_files.each_pair do |_os, ff|
|
49
|
+
[ ff ].flatten.each do |f|
|
50
|
+
if @app.is_file?(ff)
|
51
|
+
@app.run(sprintf('mv %s %s.bkup', f, f))
|
52
|
+
end
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -58,7 +58,7 @@ class TestValidateFileFunctional < Test::Unit::TestCase
|
|
58
58
|
assert_equal(:invalid, type, sprintf('got wrong value for unmarked OS[%s]', type))
|
59
59
|
|
60
60
|
e = assert_raise do
|
61
|
-
|
61
|
+
@app.get_services
|
62
62
|
end
|
63
63
|
|
64
64
|
assert_equal(Rouster::InternalError, e.class, sprintf('wrong exception raised[%s] [%s]', e.class, e.message))
|
@@ -0,0 +1,46 @@
|
|
1
|
+
UNIT LOAD ACTIVE SUB DESCRIPTION
|
2
|
+
crond.service loaded active running Command Scheduler
|
3
|
+
dbus.service loaded active running D-Bus System Message Bus
|
4
|
+
getty@tty1.service loaded active running Getty on tty1
|
5
|
+
gssproxy.service loaded active running GSSAPI Proxy Daemon
|
6
|
+
● kdump.service loaded failed failed Crash recovery kernel arming
|
7
|
+
kmod-static-nodes.service loaded active exited Create list of required static device nodes for the current kernel
|
8
|
+
lldpad.service loaded active running Link Layer Discovery Protocol Agent Daemon.
|
9
|
+
mdmonitor.service loaded active running Software RAID monitoring and management
|
10
|
+
network.service loaded active running LSB: Bring up/down networking
|
11
|
+
nfs-config.service loaded active exited Preprocess NFS configuration
|
12
|
+
ntpd.service loaded active running Network Time Service
|
13
|
+
postfix.service loaded active running Postfix Mail Transport Agent
|
14
|
+
rhel-dmesg.service loaded active exited Dump dmesg to /var/log/dmesg
|
15
|
+
rhel-import-state.service loaded active exited Import network configuration from initramfs
|
16
|
+
rhel-readonly.service loaded active exited Configure read-only root support
|
17
|
+
rsyslog.service loaded active running System Logging Service
|
18
|
+
sshd.service loaded active running OpenSSH server daemon
|
19
|
+
systemd-fsck-root.service loaded active exited File System Check on Root Device
|
20
|
+
systemd-fsck@dev-disk-by\x2dlabel-boot.service loaded active exited File System Check on /dev/disk/by-label/boot
|
21
|
+
systemd-journal-flush.service loaded active exited Flush Journal to Persistent Storage
|
22
|
+
systemd-journald.service loaded active running Journal Service
|
23
|
+
systemd-logind.service loaded active running Login Service
|
24
|
+
systemd-random-seed.service loaded active exited Load/Save Random Seed
|
25
|
+
systemd-remount-fs.service loaded active exited Remount Root and Kernel File Systems
|
26
|
+
systemd-sysctl.service loaded active exited Apply Kernel Variables
|
27
|
+
systemd-tmpfiles-setup-dev.service loaded active exited Create Static Device Nodes in /dev
|
28
|
+
systemd-tmpfiles-setup.service loaded active exited Create Volatile Files and Directories
|
29
|
+
systemd-udev-trigger.service loaded active exited udev Coldplug all Devices
|
30
|
+
systemd-udevd.service loaded active running udev Kernel Device Manager
|
31
|
+
systemd-update-utmp.service loaded active exited Update UTMP about System Boot/Shutdown
|
32
|
+
systemd-user-sessions.service loaded active exited Permit User Sessions
|
33
|
+
systemd-vconsole-setup.service loaded active exited Setup Virtual Console
|
34
|
+
tuned.service loaded active running Dynamic System Tuning Daemon
|
35
|
+
vboxadd-service.service loaded active running LSB: VirtualBox Additions service
|
36
|
+
vboxadd-x11.service loaded active exited LSB: VirtualBox Linux Additions kernel modules
|
37
|
+
vboxadd.service loaded active exited LSB: VirtualBox Linux Additions kernel modules
|
38
|
+
|
39
|
+
LOAD = Reflects whether the unit definition was properly loaded.
|
40
|
+
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
|
41
|
+
SUB = The low-level unit activation state, values depend on unit type.
|
42
|
+
|
43
|
+
36 loaded units listed. Pass --all to see loaded but inactive units, too.
|
44
|
+
To show all installed unit files use 'systemctl list-unit-files'.
|
45
|
+
|
46
|
+
|
@@ -42,6 +42,31 @@ class TestUnitGetPackages < Test::Unit::TestCase
|
|
42
42
|
|
43
43
|
end
|
44
44
|
|
45
|
+
def test_rhel_systemd
|
46
|
+
@app.instance_variable_set(:@ostype, :rhel)
|
47
|
+
@app.instance_variable_set(:@osversion, '7')
|
48
|
+
services = {}
|
49
|
+
|
50
|
+
raw = File.read(sprintf('%s/../../../test/unit/testing/resources/rhel-systemd', File.dirname(File.expand_path(__FILE__))))
|
51
|
+
|
52
|
+
assert_nothing_raised do
|
53
|
+
services = @app.get_services(false, true, :systemd, raw)
|
54
|
+
end
|
55
|
+
|
56
|
+
expected = {
|
57
|
+
'kdump' => 'stopped', # ● kdump.service loaded failed failed Crash recovery kernel arming
|
58
|
+
'rhel-dmesg' => 'stopped', # rhel-dmesg.service loaded active exited Dump dmesg to /var/log/dmesg
|
59
|
+
'sshd' => 'running', # sshd.service loaded active running OpenSSH server daemon
|
60
|
+
'systemd-journal-flush'=> 'stopped', # this is a test for output without leading spaces
|
61
|
+
}
|
62
|
+
|
63
|
+
expected.each_pair do |service,state|
|
64
|
+
assert(services.has_key?(service), "service[#{service}]")
|
65
|
+
assert_equal(services[service], state, "service[#{service}] state[#{state}]")
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
45
70
|
def test_rhel_upstart
|
46
71
|
@app.instance_variable_set(:@ostype, :rhel)
|
47
72
|
services = {}
|
@@ -134,8 +159,8 @@ class TestUnitGetPackages < Test::Unit::TestCase
|
|
134
159
|
end
|
135
160
|
|
136
161
|
expected = {
|
137
|
-
'com.bigfix.BESAgent' => 'running', # 100
|
138
|
-
'com.trendmicro.mpm.icore.agent' => 'stopped', # -
|
162
|
+
'com.bigfix.BESAgent' => 'running', # 100 - com.bigfix.BESAgent
|
163
|
+
'com.trendmicro.mpm.icore.agent' => 'stopped', # - 0 com.trendmicro.mpm.icore.agent
|
139
164
|
}
|
140
165
|
|
141
166
|
expected.each_pair do |service,state|
|
@@ -150,3 +175,4 @@ class TestUnitGetPackages < Test::Unit::TestCase
|
|
150
175
|
end
|
151
176
|
|
152
177
|
end
|
178
|
+
|
@@ -18,6 +18,11 @@ class TestMeetsConstraint < Test::Unit::TestCase
|
|
18
18
|
@app.facts = fake_facts
|
19
19
|
end
|
20
20
|
|
21
|
+
def test_multiple_positive
|
22
|
+
assert(@app.meets_constraint?([['is_virtual', 'true'], ['timezone', 'PDT',]]))
|
23
|
+
end
|
24
|
+
|
25
|
+
|
21
26
|
def test_positive
|
22
27
|
|
23
28
|
assert(@app.meets_constraint?('is_virtual', 'true'))
|
@@ -52,4 +57,4 @@ class TestMeetsConstraint < Test::Unit::TestCase
|
|
52
57
|
# noop
|
53
58
|
end
|
54
59
|
|
55
|
-
end
|
60
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rouster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.67'
|
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: 2016-11-
|
11
|
+
date: 2016-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -183,6 +183,7 @@ files:
|
|
183
183
|
- test/unit/test_parse_ls_string.rb
|
184
184
|
- test/unit/test_traverse_up.rb
|
185
185
|
- test/unit/testing/resources/osx-launchd
|
186
|
+
- test/unit/testing/resources/rhel-systemd
|
186
187
|
- test/unit/testing/resources/rhel-systemv
|
187
188
|
- test/unit/testing/resources/rhel-upstart
|
188
189
|
- test/unit/testing/test_get_services.rb
|
@@ -219,3 +220,4 @@ signing_key:
|
|
219
220
|
specification_version: 4
|
220
221
|
summary: Rouster is an abstraction layer for Vagrant
|
221
222
|
test_files: []
|
223
|
+
has_rdoc:
|