class Services::Logs

Public Class Methods

call(app_id:, environment_name:, component_id:, since:, size:) click to toggle source
# File lib/busbar_cli/services/logs.rb, line 3
def self.call(app_id:, environment_name:, component_id:, since:, size:)
  Services::Kube.setup
  require 'open3'

  @environment_name = environment_name
  @app_id = app_id
  @component_id = component_id

  # Retrieve Component Data
  if @component_id.nil? then
    # retrieve app components from server
    environment_data = JSON.parse(EnvironmentsRepository.get(environment_name, app_id))
    components_data = environment_data['data']['components']

    if components_data.length == 1 then
      @component_id = components_data[0]['type']
    else
      puts "More than one component found for #{@app_id} #{@environment_name}."
      puts "Available components:"
      components_data.each do |component|
        puts "  #{component['type']}"
      end
      puts "Please choose one from the list above and try again."
      return
    end
  end

  # Retrieve a Pod Name
  stdout, stderr, status = Open3.capture3(
    "#{KUBECTL} --context=#{Services::Kube.current_profile} --namespace #{environment_name} " \
    "get pod -l busbar.io/app=#{app_id},busbar.io/component=#{@component_id} | grep -v '^NAME' | head -n 1 | awk '{print $1}'"
  )

  if status.to_s.end_with?('0') and stdout.length > 0 then
    pod_name = stdout.to_s.chomp
  else
    puts "Application not found."
    return
  end

  # Retrieve pod data and set a container name
  stdout, stderr, status = Open3.capture3(
    "#{KUBECTL} --context=#{Services::Kube.current_profile} --namespace #{environment_name} " \
    "get pod #{pod_name} --output json"
  )

  if status.to_s.end_with?('0') then
    pod_data_json = JSON.parse(stdout)

    if pod_data_json['spec']['containers'].length == 1 then
      @container_name = pod_data_json['spec']['containers'][0]['name']
    else
      pod_data_json['spec']['containers'].each do |record|
        @container_name = record['name'] unless record['name'].end_with?('nginx')
      end
    end

    # Fetch components => pod => container log
    Kernel.exec(
      "#{KUBECTL} --context=#{Services::Kube.current_profile} --namespace #{environment_name} " \
      "logs --follow=true --since=#{since} --tail=#{size} #{pod_name} --container #{@container_name}"
    )
  else
    puts "Error while retrieving pod data:"
    puts "  #{stderr}"
  end
end