Class: TasteTester::Host
- Inherits:
-
Object
- Object
- TasteTester::Host
- Includes:
- Logging
- Defined in:
- lib/taste_tester/host.rb
Overview
Manage state of the remote node
Instance Attribute Summary collapse
-
#name ⇒ Object
readonly
Returns the value of attribute name.
Instance Method Summary collapse
- #in_test? ⇒ Boolean
-
#initialize(name, server) ⇒ Host
constructor
A new instance of Host.
- #keeptesting ⇒ Object
- #runchef ⇒ Object
- #test ⇒ Object
- #untest ⇒ Object
- #who_is_testing ⇒ Object
Methods included from Logging
#formatter, formatterproc=, logger, #logger, use_log_formatter=, verbosity=
Constructor Details
#initialize(name, server) ⇒ Host
Returns a new instance of Host.
32 33 34 35 36 37 38 39 |
# File 'lib/taste_tester/host.rb', line 32 def initialize(name, server) @name = name @user = ENV['USER'] @server = server if TasteTester::Config.use_ssh_tunnels @tunnel = TasteTester::Tunnel.new(@name, @server) end end |
Instance Attribute Details
#name ⇒ Object (readonly)
Returns the value of attribute name.
30 31 32 |
# File 'lib/taste_tester/host.rb', line 30 def name @name end |
Instance Method Details
#in_test? ⇒ Boolean
161 162 163 164 165 166 167 168 169 |
# File 'lib/taste_tester/host.rb', line 161 def in_test? ssh = TasteTester::SSH.new(@name) ssh << "test -f #{TasteTester::Config.}" if ssh.run.first == 0 && who_is_testing && who_is_testing != ENV['USER'] true else false end end |
#keeptesting ⇒ Object
171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'lib/taste_tester/host.rb', line 171 def keeptesting logger.warn("Renewing taste-tester on #{@name} until" + " #{TasteTester::Config.testing_end_time}") if TasteTester::Config.use_ssh_tunnels TasteTester::Tunnel.kill(@name) @tunnel = TasteTester::Tunnel.new(@name, @server) @tunnel.run else ssh = TasteTester::SSH.new(@name) ssh << "touch -t #{TasteTester::Config.testing_end_time}" + " #{TasteTester::Config.}" ssh.run! end end |
#runchef ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/taste_tester/host.rb', line 41 def runchef logger.warn("Running '#{TasteTester::Config.chef_client_command}' " + "on #{@name}") cmd = "#{TasteTester::Config.ssh_command} " + "#{TasteTester::Config.user}@#{@name} " if TasteTester::Config.user != 'root' cc = Base64.encode64(cmds).gsub(/\n/, '') cmd += "\"echo '#{cc}' | base64 --decode | sudo bash -x\"" else cmd += "\"#{cmds}\"" end status = IO.popen( cmd ) do |io| # rubocop:disable AssignmentInCondition while line = io.gets puts line.chomp! end # rubocop:enable AssignmentInCondition io.close $CHILD_STATUS.to_i end logger.warn("Finished #{TasteTester::Config.chef_client_command}" + " on #{@name} with status #{status}") if status == 0 msg = "#{TasteTester::Config.chef_client_command} was successful" + ' - please log to the host and confirm all the intended' + ' changes were made' logger.error msg.upcase end end |
#test ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/taste_tester/host.rb', line 73 def test logger.warn("Taste-testing on #{@name}") if TasteTester::Config.use_ssh_tunnels # Nuke any existing tunnels that may be there TasteTester::Tunnel.kill(@name) # Then setup the tunnel @tunnel.run end @serialized_config = Base64.encode64(config).gsub(/\n/, '') # Then setup the testing ssh = TasteTester::SSH.new(@name) ssh << 'logger -t taste-tester Moving server into taste-tester' + " for #{@user}" ssh << "touch -t #{TasteTester::Config.testing_end_time}" + " #{TasteTester::Config.}" ssh << "echo -n '#{@serialized_config}' | base64 --decode" + " > #{TasteTester::Config.chef_config_path}/client-taste-tester.rb" ssh << "rm -vf #{TasteTester::Config.chef_config_path}/client.rb" ssh << "( ln -vs #{TasteTester::Config.chef_config_path}" + "/client-taste-tester.rb #{TasteTester::Config.chef_config_path}/" + 'client.rb; true )' ssh.run! # Then run any other stuff they wanted cmds = TasteTester::Hooks.test_remote_cmds( TasteTester::Config.dryrun, @name ) if cmds && cmds.any? ssh = TasteTester::SSH.new(@name) cmds.each { |c| ssh << c } ssh.run! end end |
#untest ⇒ Object
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/taste_tester/host.rb', line 113 def untest logger.warn("Removing #{@name} from taste-tester") ssh = TasteTester::SSH.new(@name) if TasteTester::Config.use_ssh_tunnels TasteTester::Tunnel.kill(@name) end [ "rm -vf #{TasteTester::Config.chef_config_path}/client.rb", "rm -vf #{TasteTester::Config.chef_config_path}/client-taste-tester.rb", "ln -vs #{TasteTester::Config.chef_config_path}/client-prod.rb " + "#{TasteTester::Config.chef_config_path}/client.rb", "rm -vf #{TasteTester::Config.chef_config_path}/client.pem", "ln -vs #{TasteTester::Config.chef_config_path}/client-prod.pem " + "#{TasteTester::Config.chef_config_path}/client.pem", "rm -vf #{TasteTester::Config.}", 'logger -t taste-tester Returning server to production', ].each do |cmd| ssh << cmd end ssh.run! end |
#who_is_testing ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/taste_tester/host.rb', line 135 def who_is_testing ssh = TasteTester::SSH.new(@name) ssh << 'grep "^# TasteTester by"' + " #{TasteTester::Config.chef_config_path}/client.rb" output = ssh.run if output.first == 0 user = output.last.match(/# TasteTester by (.*)$/) if user return user[1] end end # Legacy FB stuff, remove after migration. Safe for everyone else. ssh = TasteTester::SSH.new(@name) ssh << "file #{TasteTester::Config.chef_config_path}/client.rb" output = ssh.run if output.first == 0 user = output.last.match(/client-(.*)-(taste-tester|test).rb/) if user return user[1] end end return nil end |