#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# common logging configuration see common scala
include "logging"
include "akka-http-version"

whisk {
  blacklist {
    poll-interval: 5 minutes
  }

  docker.client {
    # Docker < 1.13.1 has a known problem: if more than 10 containers are created (docker run)
    # concurrently, there is a good chance that some of them will fail.
    # See https://github.com/moby/moby/issues/29369
    # Use a semaphore to make sure that at most 10 `docker run` commands are active
    # the same time.
    # 0 means that there are infinite parallel runs.
    parallel-runs: 10

    # Timeouts for docker commands. Set to "Inf" to disable timeout.
    timeouts {
      run: 1 minute
      rm: 1 minute
      pull: 10 minutes
      ps: 1 minute
      inspect: 1 minute
      pause: 10 seconds
      unpause: 10 seconds
      version: 10 seconds
    }
  }

  docker.container-factory {
    # Use runc (docker-runc) for pause/resume functionality in DockerContainerFactory
    use-runc: true
  }

  docker.standalone.container-factory {
    #If enabled then pull would also be attempted for standard OpenWhisk images under`openwhisk` prefix
    pull-standard-images: false
  }

  container-pool {
    user-memory: 1024 m
    concurrent-peek-factor: 0.5 #factor used to limit message peeking: 0 < factor <= 1.0 - larger number improves concurrent processing, but increases risk of message loss during invoker crash
    akka-client:  false # if true, use PoolingContainerClient for HTTP from invoker to action container (otherwise use ApacheBlockingContainerClient)
  }

  kubernetes {
    # Timeouts for k8s commands. Set to "Inf" to disable timeout.
    timeouts {
      run: 1 minute
      logs: 1 minute
    }
    invoker-agent {
      enabled: false
      port: 3233
    }
    user-pod-node-affinity {
      enabled: true
      key: "openwhisk-role"
      value: "invoker"
    }
    # Enables forwarding to remote port via a local random port. This mode is mostly useful
    # for development via Standalone mode
    port-forwarding-enabled = false

    # Pod template used as base for Action Pods created. It can be either
    #  1. Reference to file `file:/path/to/template.yml`
    #  2. OR yaml formatted multi line string. See multi line config support https://github.com/lightbend/config/blob/master/HOCON.md#multi-line-strings
    #
    #pod-template =

    # Set this optional string to be the namespace that the invoker should target for adding pods. This allows the invoker to run in a namesapce it doesn't have API access to but add pods to another namespace. See also https://github.com/apache/openwhisk/issues/4711
    # When not set the underlying client may pickup the namesapce from the kubeconfig or via system property setting.
    # See https://github.com/fabric8io/kubernetes-client#configuring-the-client for more information.
    # action-namespace = "ns-actions"

  }

  # Timeouts for runc commands. Set to "Inf" to disable timeout.
  runc.timeouts {
    pause: 10 seconds
    resume: 10 seconds
  }

  # args for 'docker run' to use
  container-factory {
    container-args {
      network: bridge
      # See https://docs.docker.com/config/containers/container-networking/#dns-services for documentation of dns-*
      dns-servers: []
      dns-search: []
      dns-options: []
      extra-env-vars: [] # sequence of `key` and/or `key=value` bindings to add to all user action container environments
      extra-args: {}   # to pass additional args to 'docker run'; format is `{key1: [v1, v2], key2: [v1, v2]}`
    }
    runtimes-registry {
      url: ""
    }
    user-images-registry {
      url: ""
    }
  }

  container-proxy {
    timeouts {
      # The "unusedTimeout" in the ContainerProxy,
      #aka 'How long should a container sit idle until we kill it?'
      idle-container = 10 minutes
      pause-grace = 50 milliseconds
    }
  }

  # tracing configuration
  tracing {
    component = "Invoker"
  }

  invoker {
    protocol: http
  }
}
