# Copyright 2018- Cisco
#
# 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.

apiVersion: v1
kind: ConfigMap
metadata:
  name: ves-agent-config
  labels:
    app: {{ template "ves-agent.name" . }}
    chart: {{ template "ves-agent.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}

data:
    config.properties: |-
        onap_ves_address={{ .Values.onap.ves_address }}
        onap_ves_port={{ .Values.onap.ves_port }}

        kafka_address={{ .Values.kafka.address }}
        kafka_port={{ .Values.kafka.port }}
        kafka_alarms_topic={{ .Values.kafka.alarms_topic }}
        kafka_kpis_topic={{ .Values.kafka.kpis_topic }}

        co_id={{ .Values.co_id }}
        pod_id={{ .Values.pod_id }}
