# Copyright 2019 Ciena Corporation
#
# Licensed 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.

# IMAGE SELECTION
# ---------------
# By default no defaults are set and the image tags specified in the helm
# charts will be used. If you would like to use the images generated from the
# HEAD of the "master" git branches, then uncomment this below block and
# set "<VALUE>" to "master". Similarly, if you want to use the images 
# generated from the HEAD of the "voltha-2.1" git branches, then uncomment
# this block and replace "<VALUE>" with "voltha-2.1".
#defaults:
#  image_tag: <VALUE>

images:
  onos:
    repository: voltha/voltha-onos
    # IMAGE_SELECTION
    # ---------------
    # The helm chart used to deploy ONOS is the public ONOS helm chart so,
    # there is a need to specify the exact image repository and image tag.
    # If you would like to use the "master", "voltha-2.1", or other image 
    # just replace the "tag" value below.
    tag: 2.1.0

# IMAGE_SELECTION
# ---------------
# Below are a list of all the images utilized by kind-voltha. This list is
# provided as a conveinence if you would like to override on a per image
# basis. If you are using the defaults, master, or voltha-2.1 branch there
# is no need to utilize this list.
#  adapter_open_olt:
#    repository: voltha/voltha-openolt-adapter
#    tag: 2.1.1
#  adapter_open_onu:
#    repository: voltha/voltha-openonu-adapter
#    tag: 2.1.0
#  adapter_simulated_olt:
#    repository: voltha/voltha-adapter-simulated-olt
#    tag: 2.1.1
#  adapter_simulated_onu:
#    repository: voltha/voltha-adapter-simulated-onu
#    tag: 2.1.1
#  bbsim:
#    repository: voltha/voltha-bbsim
#    tag: 2.1.0
#  afrouter:
#    repository: voltha/voltha-afrouter
#    tag: 2.1.1
#  afrouterd:
#    repository: voltha/voltha-afrouterd
#    tag: 2.1.1
#  cli:
#    repository: voltha/voltha-cli
#    tag: 2.1.1
#  ofagent:
#    repository: voltha/voltha-ofagent
#    tag: 2.1.1
#  ro_core:
#    repository: voltha/voltha-ro-core
#    tag: 2.1.1
#  rw_core:
#    repository: voltha/voltha-rw-core
#    tag: 2.1.1

deployments:
  etcdOperator: true
  backupOperator: false
  restoreOperator: false

voltha-etcd-cluster:
  clusterSize: 1
  autoCompactionRetention: 1

onos_env:
- name: POD_IP
  valueFrom:
  fieldRef:
    fieldPath: status.podIP
- name: NAMESPACE
  valueFrom:
  fieldRef:
    fieldPath: metadata.namespace
- name: ONOS_APPS
  value: "drivers,openflow-base,hostprovider"

# Customization for BBSIM
kafka_broker: 'voltha-kafka.voltha.svc.cluster.local:9092'
pon_ports: 1
onus_per_pon_port: 1

# SHOCK THE MONKEY OR LET LOSE THE DOGS OF WAR
# The VOLTHA charts have support for adding extra labels to deployments and
# pods. These extra labels can be used to integrate with other utilities
# such as kube-monkey to add a bit of chaos to the cluster. Below are some
# settings that can be uncommented to opt-in VOLTHA deployments/pods to
# kube-monkey. For example, if you want ALL deployments and pods to opt-in
# then uncomment the `extra_deployment_labels` and `extra_pod_label` blocks.
# If you want to be more selected then comment the blocks that pertain to the
# targets you care about.

#extra_deployment_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#extra_pod_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#rw_core_deployment_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#rw_core_pod_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#ro_core_deployment_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#ro_core_pod_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#openolt_deployment_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#openolt_pod_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#openonu_deployment_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#openonu_pod_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#simolt_deployment_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#simolt_pod_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#simonu_deployment_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
#
#simonu_pod_labels:
#  kube-monkey/enabled: enabled
#  kube-monkey/identifier: monkey-victim
#  kube-monkey/mtbf: 1
#  kube-monkey/kill-mode: fixed
#  kube-monkey/kill-value: 1
