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

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