Module: Bosh::Deployer::Helpers

Included in:
Cli::Command::Micro, Configuration, InstanceManager, InstanceManager
Defined in:
lib/bosh/deployer/helpers.rb

Constant Summary collapse

DEPLOYMENTS_FILE =
'bosh-deployments.yml'

Instance Method Summary collapse

Instance Method Details

#close_ssh_sessionsObject

rubocop:enable MethodLength



102
103
104
# File 'lib/bosh/deployer/helpers.rb', line 102

def close_ssh_sessions
  @sessions.each_value { |s| s.close }
end

#cloud_plugin(config) ⇒ Object



11
12
13
14
15
16
# File 'lib/bosh/deployer/helpers.rb', line 11

def cloud_plugin(config)
  err 'No cloud properties defined' if config['cloud'].nil?
  err 'No cloud plugin defined' if config['cloud']['plugin'].nil?

  config['cloud']['plugin']
end

#dig_hash(hash, *path) ⇒ Object



18
19
20
21
22
# File 'lib/bosh/deployer/helpers.rb', line 18

def dig_hash(hash, *path)
  path.inject(hash) do |location, key|
    location.respond_to?(:keys) ? location[key] : nil
  end
end

#is_tgz?(path) ⇒ Boolean

Returns:

  • (Boolean)


7
8
9
# File 'lib/bosh/deployer/helpers.rb', line 7

def is_tgz?(path)
  File.extname(path) == '.tgz'
end

#process_exists?(pid) ⇒ Boolean

Returns:

  • (Boolean)


24
25
26
27
28
# File 'lib/bosh/deployer/helpers.rb', line 24

def process_exists?(pid)
  Process.kill(0, pid)
rescue Errno::ESRCH
  false
end

#remote_tunnel(port) ⇒ Object

rubocop:disable MethodLength



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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
# File 'lib/bosh/deployer/helpers.rb', line 52

def remote_tunnel(port)
  @sessions ||= {}
  return if @sessions[port]

  ip = Config.bosh_ip

  # sshd is up, sleep while host keys are generated
  loop until socket_readable?(ip, @ssh_port) { sleep(@ssh_wait) }

  if @sessions[port].nil?
    logger.info("Starting SSH session for port forwarding to #{@ssh_user}@#{ip}...")
    loop do
      begin
        @sessions[port] = Net::SSH.start(ip, @ssh_user, keys: [@ssh_key], paranoid: false)
        logger.debug("ssh #{@ssh_user}@#{ip}: ESTABLISHED")
        break
      rescue => e
        logger.debug("ssh start #{@ssh_user}@#{ip} failed: #{e.inspect}")
        sleep 1
      end
    end
  end

  lo = '127.0.0.1'
  @sessions[port].forward.remote(port, lo, port)

  logger.info("SSH forwarding for port #{port} started: OK")

  Thread.new do
    while @sessions[port]
      begin
        @sessions[port].loop { true }
      rescue IOError => e
        logger.debug(
          "SSH session #{@sessions[port].inspect} " +
          "forwarding for port #{port} terminated: #{e.inspect}"
        )
        @sessions.delete(port)
      end
    end
  end

  at_exit do
    status = $!.is_a?(::SystemExit) ? $!.status : nil
    close_ssh_sessions
    exit status if status
  end
end

#socket_readable?(ip, port) ⇒ Boolean

Returns:

  • (Boolean)


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/bosh/deployer/helpers.rb', line 30

def socket_readable?(ip, port)
  socket = TCPSocket.new(ip, port)
  if IO.select([socket], nil, nil, 5)
    logger.debug("tcp socket #{ip}:#{port} is readable")
    yield
    true
  else
    false
  end
rescue SocketError => e
  logger.debug("tcp socket #{ip}:#{port} SocketError: #{e.inspect}")
  sleep 1
  false
rescue SystemCallError => e
  logger.debug("tcp socket #{ip}:#{port} SystemCallError: #{e.inspect}")
  sleep 1
  false
ensure
  socket.close if socket
end

#strip_relative_path(path) ⇒ Object



106
107
108
# File 'lib/bosh/deployer/helpers.rb', line 106

def strip_relative_path(path)
  path[/#{Regexp.escape File.join(Dir.pwd, '')}(.*)/, 1] || path
end