# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config.gni")

# Build files that use the persist_logs template should check the value of
# persist_logs and only include their persist_logs targets if this arg's
# value is true. This is to allow global coordination of whether logs are
# persisted and, for example, control at the global level whether logs are
# consuming disk space.
declare_args() {
  persist_logs = is_debug
}

# Adds a config to persist logs to disk
#
# The persist_logs template is used to generate a config for sysmgr that runs an
# instance of log_listener. This instance will be configured to listen for (and
# ignore) specific tags, and to write logs it finds into a target file.
#
# The file the logs are written to is located at /data/logs.${target_name}
#
# Once this section is added, the name provided will need to be pointed at by
# something in the gn packages descriptions (e.g. //garnet/packages)
#
# Parameters
#
#   log_tags (optional):
#     [list of strings] Logs with these tags will be written to the log file.
#
#   ignore_log_tags (optional):
#     [list of strings] Logs with these tags will NOT be written to the log
#     file, even if the log has tags included in the "log_tags" section.
#
#   max_disk_usage (optional):
#       [string] This persist_logs usage will be guaranteed to not use more than
#       this amount of bytes on disk space. The default is 64,000.
#
#   startup_sleep (optional):
#       [string] This persist_logs usage will sleep for the given number of
#       milliseconds before doing any work. Used to simulate early boot phase,
#       and will be removed at a future date.
#
# Example:
#
#   persist_logs("amber_logs") {
#     log_tags = [ "amber" ]
#     ignore_log_tags = [ "klog" ]
#     max_disk_usage = "10000"
#     startup_sleep = "5000"
#   }

template("persist_logs") {
  forward_variables_from(invoker,
                         [
                           "log_tags",
                           "ignore_log_tags",
                           "max_disk_usage",
                           "startup_sleep",
                         ])
  assert(persist_logs,
         "persist_logs is false, no log persistence targets should be defined")

  if (!defined(log_tags)) {
    log_tags = []
  }
  if (!defined(ignore_log_tags)) {
    ignore_log_tags = []
  }

  name = target_name
  logs_action_name = "logs/${target_name}"
  output_file = "$target_out_dir/${target_name}_log_listener.config"

  action(logs_action_name) {
    script = "//build/gn/gen_persistent_log_config.py"
    outputs = [
      output_file,
    ]
    args = [ name ] + rebase_path(outputs, root_build_dir)
    if (log_tags != []) {
      args += [ "--tags" ]
      foreach(tag, invoker.log_tags) {
        args += [ tag ]
      }
    }
    if (ignore_log_tags != []) {
      args += [ "--ignore-tags" ]
      foreach(ignore_tag, ignore_log_tags) {
        args += [ ignore_tag ]
      }
    }
    if (defined(max_disk_usage)) {
      args += [
        "--file-capacity",
        max_disk_usage,
      ]
    }
    if (defined(startup_sleep)) {
      args += [
        "--startup-sleep",
        startup_sleep,
      ]
    }
  }

  config_data(target_name) {
    for_pkg = "sysmgr"
    sources = [
      rebase_path(output_file),
    ]
    outputs = [
      "${target_name}_log_listener.config",
    ]
    deps = [
      ":$logs_action_name",
    ]
  }
}
