rouster 0.67 → 0.68

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 82f9824019bc7951750f51019efd7d5d7e174d33
4
- data.tar.gz: babacb0d00e65d6ea702886286940e6bdf61f9d0
3
+ metadata.gz: f2922e8289682a6859c9e8425df652eb5af74b93
4
+ data.tar.gz: 2862b48d598fd179b986458f214232f65ca483cf
5
5
  SHA512:
6
- metadata.gz: 8fbed7fb6d5e19c71ad2488c0a50b9aa387ab5474363f4dc1c318c9cae9dba9b1c632bb2f6202a8e3d909cc7b92d54d489ad19ef9417f06a92c7b8eaa2bed2e0
7
- data.tar.gz: d5ad29bdf90c6ef7c9896720ce2a16eff88833dc9e1c71e708b131a7c8edc6824546998ba086ae31de76966106458992ce23198a7b709a3d8be8f3de3617b516
6
+ metadata.gz: 34ce58498c46e4eccc008177db64cefdfc5e1f4ae66df0e7a34cd1abbac60b2bd12929f6b60e31b418153deb7c9a946c6c955f0d210c6fc3d9851a9dbc319485
7
+ data.tar.gz: 40599a85f744aea565ce406870890b8ad92620cc7aba21f02e4eb721aa3368d80208c176790e003a650e4e00f7afdb268cf0b167fa22732900bed1ba8e10b85c
data/Rakefile CHANGED
@@ -39,26 +39,31 @@ 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
42
43
  end
43
44
 
44
45
  Rake::TestTask.new do |t|
45
46
  t.name = 'unit'
46
47
  t.libs << 'lib'
47
48
  t.test_files = FileList['test/unit/**/test_*.rb']
49
+ t.verbose = true
48
50
  end
49
51
 
50
52
  Rake::TestTask.new(:functional => :vdestroy) do |t|
51
53
  t.libs << 'lib'
52
54
  t.test_files = FileList['test/functional/**/test_*.rb']
55
+ t.verbose = true
53
56
  end
54
57
 
55
58
  Rake::TestTask.new(:deltas => :vdestroy) do |t|
56
59
  t.libs << 'lib'
57
60
  t.test_files = FileList['test/functional/deltas/test_*.rb']
61
+ t.verbose = true
58
62
  end
59
63
 
60
64
  Rake::TestTask.new do |t|
61
65
  t.name = 'puppet'
62
66
  t.libs << 'lib'
63
67
  t.test_files = FileList['test/puppet/test*.rb']
68
+ t.verbose = true
64
69
  end
@@ -10,21 +10,16 @@ boxes = {
10
10
  :box_url => 'http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box',
11
11
  },
12
12
 
13
- :ubuntu12 => {
14
- :box_name => 'ubuntu12',
15
- :box_url => 'http://puppet-vagrant-boxes.puppetlabs.com/ubuntu-server-12042-x64-vbox4210.box',
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
-
28
23
  }
29
24
 
30
25
  Vagrant::Config.run do |config|
@@ -33,7 +28,7 @@ Vagrant::Config.run do |config|
33
28
 
34
29
  worker.vm.box = hash[:box_name]
35
30
  worker.vm.box_url = hash[:box_url]
36
- worker.vm.host_name = hash[:box_hostname] || hash[:box_name]
31
+ worker.vm.host_name = hash[:box_name]
37
32
  worker.vm.network :hostonly, sprintf('10.0.1.%s', rand(253).to_i + 2)
38
33
  worker.ssh.forward_agent = true
39
34
 
@@ -4,30 +4,110 @@ require 'rouster'
4
4
  require 'rouster/puppet'
5
5
  require 'rouster/tests'
6
6
 
7
- centos6 = Rouster.new(:name => 'app', :verbosity => 4, :sudo => true)
8
- centos7 = Rouster.new(:name => 'centos7', :verbosity => 4, :sudo => true)
7
+ app = Rouster.new(:name => 'app', :verbosity => 4, :sudo => true)
8
+ ppm = Rouster.new(:name => 'ppm', :verbosity => 1, :sudo => true)
9
9
 
10
- workers = [centos6, centos7]
10
+ # passthrough boxes do not need to specify a name
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]
11
16
 
12
17
  workers.each do |w|
13
18
  p '%s config: ' % w.name
14
19
  p w
15
20
 
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)
19
-
20
21
  p 'status: %s' % w.status()
22
+ p 'upping the box'
23
+ w.up()
21
24
 
22
- p 'services:'
23
- p w.get_services()
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?())
24
27
 
25
- p 'rebooting...'
26
- w.restart(120)
28
+ p 'suspending the box'
29
+ w.suspend()
27
30
 
28
- p 'status: %s' % w.status()
29
- p 'uptime: %s' % w.run('uptime')
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'))
56
+
57
+ ## expected failure
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()
100
+
101
+ p sprintf('%s status: %s', w.name, w.status())
102
+ p sprintf('%s available via ssh: %s', w.name, w.is_available_via_ssh?())
103
+
104
+ # bring it back again
105
+ p 'upping the box again'
106
+ w.up()
107
+
108
+ p sprintf('%s status: %s', w.name, w.status())
109
+ p sprintf('%s available via ssh: %s', w.name, w.is_available_via_ssh?())
30
110
 
31
111
  end
32
112
 
33
- exit
113
+ exit
@@ -12,7 +12,7 @@ require 'rouster/vagrant'
12
12
  class Rouster
13
13
 
14
14
  # sporadically updated version number
15
- VERSION = 0.67
15
+ VERSION = 0.68
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
@@ -41,6 +41,7 @@ class Rouster
41
41
  # * [sudo] - boolean of whether or not to prefix commands run in VM with 'sudo', default is true
42
42
  # * [vagrantfile] - the full or relative path to the Vagrantfile to use, if not specified, will look for one in 5 directories above current location
43
43
  # * [vagrant_concurrency] - boolean controlling whether Rouster will attempt to run `vagrant *` if another vagrant process is already running, default is false
44
+ # * [vagrant_reboot] - particularly sticky systems restart better if Vagrant does it for us, default is false
44
45
  # * [verbosity] - an integer representing console level logging, or an array of integers representing console,file level logging - DEBUG (0) < INFO (1) < WARN (2) < ERROR (3) < FATAL (4)
45
46
  def initialize(opts = nil)
46
47
  @cache_timeout = opts[:cache_timeout].nil? ? false : opts[:cache_timeout]
@@ -53,6 +54,7 @@ class Rouster
53
54
  @unittest = opts[:unittest].nil? ? false : opts[:unittest]
54
55
  @vagrantfile = opts[:vagrantfile].nil? ? traverse_up(Dir.pwd, 'Vagrantfile', 5) : opts[:vagrantfile]
55
56
  @vagrant_concurrency = opts[:vagrant_concurrency].nil? ? false : opts[:vagrant_concurrency]
57
+ @vagrant_reboot = opts[:vagrant_reboot].nil? ? false : opts[:vagrant_reboot]
56
58
 
57
59
  # TODO kind of want to invert this, 0 = trace, 1 = debug, 2 = info, 3 = warning, 4 = error
58
60
  # could do `fixed_ordering = [4, 3, 2, 1, 0]` and use user input as index instead, so an input of 4 (which should be more verbose), yields 0
@@ -653,19 +655,25 @@ class Rouster
653
655
  return nil
654
656
  end
655
657
 
656
- case os_type
657
- when :osx
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)
658
+ if @vagrant_reboot
659
+ # leading vagrant handle this through 'reload --no-provision'
660
+ self.reload
661
+ else
662
+ # trying to do it ourselves
663
+ case os_type
664
+ when :osx
665
+ self.run('shutdown -r now', expected_exitcodes)
666
+ when :rhel, :ubuntu
667
+ if os_type.eql?(:rhel) and os_version(os_type).match(/7/)
668
+ self.run('shutdown --halt --reboot now', expected_exitcodes << 256)
669
+ else
670
+ self.run('shutdown -rf now')
671
+ end
672
+ when :solaris
673
+ self.run('shutdown -y -i5 -g0', expected_exitcodes)
662
674
  else
663
- self.run('shutdown -rf now')
664
- end
665
- when :solaris
666
- self.run('shutdown -y -i5 -g0', expected_exitcodes)
667
- else
668
- raise InternalError.new(sprintf('unsupported OS[%s]', @ostype))
675
+ raise InternalError.new(sprintf('unsupported OS[%s]', @ostype))
676
+ end
669
677
  end
670
678
 
671
679
  @ssh, @ssh_info = nil # severing the SSH tunnel, getting ready in case this box is brought back up on a different port
@@ -159,6 +159,22 @@ class Rouster
159
159
  return status
160
160
  end
161
161
 
162
+ ##
163
+ # reload
164
+ #
165
+ # runs `vagrant reload <name> [--no-provision]` from the Vagrantfile path
166
+ # +no_provision+ Boolean whether or not to stop reprovisioning
167
+ def reload(no_provision = true)
168
+
169
+ if self.is_passthrough?
170
+ @logger.warn(sprintf('calling [vagrant reload] on a passthrough host is a noop', face))
171
+ return nil
172
+ end
173
+
174
+ @logger.info('reload()')
175
+ self.vagrant(sprintf('reload %s %s', @name, no_provision ? '--no-provision' : ''))
176
+ end
177
+
162
178
  ##
163
179
  # suspend
164
180
  #
@@ -18,11 +18,6 @@ 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
-
26
21
  def test_positive
27
22
 
28
23
  assert(@app.meets_constraint?('is_virtual', 'true'))
@@ -57,4 +52,4 @@ class TestMeetsConstraint < Test::Unit::TestCase
57
52
  # noop
58
53
  end
59
54
 
60
- end
55
+ 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.67'
4
+ version: '0.68'
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-21 00:00:00.000000000 Z
11
+ date: 2016-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -220,4 +220,3 @@ signing_key:
220
220
  specification_version: 4
221
221
  summary: Rouster is an abstraction layer for Vagrant
222
222
  test_files: []
223
- has_rdoc: