class Kontena::Plugin::Cloud::Node::ShellCommand

Public Instance Methods

create_service(service_name, node_name) click to toggle source
# File lib/kontena/plugin/cloud/node/shell_command.rb, line 40
def create_service(service_name, node_name)
  data = {
    name: service_name,
    image: 'kontena/nsenter:latest',
    stateful: false,
    cmd: ['sleep', '60000'],
    pid: 'host',
    privileged: true,
    affinity: [
      "node==#{node_name}"
    ],
    env: [
      "TERM=xterm"
    ]
  }
  service = client.post("grids/#{current_grid}/services", data)
  deployment = client.post("services/#{service['id']}/deploy", {})
  until deployment['finished_at'] do
    sleep 1
    deployment = client.get("services/#{service['id']}/deploys/#{deployment['id']}", {})
  end

  service
end
execute() click to toggle source
# File lib/kontena/plugin/cloud/node/shell_command.rb, line 16
def execute
  service_name = "#{name}-shell-#{rand(1..10_000)}"

  service = nil
  spinner "Creating shell session to node #{pastel.cyan(name)}" do
    service = create_service(service_name, name)
  end

  exec_opts = ['-i']
  exec_opts << 't' if STDIN.tty?
  if cmd_list.empty?
    exec_command = ''
  else
    exec_command = "-c \"#{cmd_list.join(' ')}\""
  end

  Kontena.run!([
    'service', 'exec', exec_opts.join(''), '--shell', service_name,
    "nsenter --target 1 --mount --uts --net --pid -- su #{exec_command} - core"
  ])
ensure
  remove_service(service) if service
end
remove_service(service) click to toggle source
# File lib/kontena/plugin/cloud/node/shell_command.rb, line 65
def remove_service(service)
  client.delete("services/#{service['id']}", {})
end