# 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.
#images:
#  onos:
#    repositry: voltha/voltha-onos
#    tag: 2.1.0
#  adapter_open_olt:
#    repositry: voltha/voltha-openolt-adapter
#    tag: 2.1.1
#  adapter_open_onu:
#    repositry: voltha/voltha-openonu-adapter
#    tag: 2.1.0
#  adapter_simulated_olt:
#    repositry: voltha/voltha-adapter-simulated-olt
#    tag: 2.1.1
#  adapter_simulated_olt:
#    repositry: voltha/voltha-adapter-simulated-onu
#    tag: 2.1.1
#  bbsim:
#    repositry: voltha/voltha-bbsim
#    tag: 2.1.0
#  afrouter:
#    repositry: voltha/voltha-afrouter
#    tag: 2.1.1
#  afrouterd:
#    repositry: voltha/voltha-afrouterd
#    tag: 2.1.1
#  cli:
#    repositry: voltha/voltha-cli
#    tag: 2.1.1
#  ofagent:
#    repositry: voltha/voltha-ofagent
#    tag: 2.1.1
#  ro_core:
#    repositry: voltha/voltha-ro-core
#    tag: 2.1.1
#  rw_core:
#    repositry: voltha/voltha-rw-core
#    tag: 2.1.1

deployments:
  etcdOperator: true
  backupOperator: false
  restoreOperator: false

voltha-etcd-cluster:
  clusterSize: 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
