# 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 = false
}

# 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" ]
  }
}
