###
# ============LICENSE_START=======================================================
# ONAP POLICY
# ================================================================================
# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
# ================================================================================
# 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.
# ============LICENSE_END=========================================================
###


# SYSTEM software configuration

POLICY_HOME=/opt/app/policy
POLICY_LOGS=/var/log/onap/policy/pdpd
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
KEYSTORE_PASSWD=Pol1cy_0nap
TRUSTSTORE_PASSWD=Pol1cy_0nap

# Telemetry credentials

ENGINE_MANAGEMENT_PORT=9696
ENGINE_MANAGEMENT_HOST=0.0.0.0
ENGINE_MANAGEMENT_USER=@1b3rt
ENGINE_MANAGEMENT_PASSWORD=31nst31n

# nexus repository

snapshotRepositoryID=policy-nexus-snapshots
snapshotRepositoryUrl=http://nexus:8081/nexus/content/repositories/snapshots/
releaseRepositoryID=policy-nexus-releases
releaseRepositoryUrl=http://nexus:8081/nexus/content/repositories/releases/
repositoryUsername=admin
repositoryPassword=admin123

# Relational (SQL) DB access

SQL_HOST=mariadb
SQL_USER=policy_user
SQL_PASSWORD=policy_user

# AAF

AAF_NAMESPACE=org.onap.policy
AAF_HOST=aaf.api.simpledemo.onap.org

# PDP-D DMaaP configuration channel

PDPD_CONFIGURATION_TOPIC=PDPD-CONFIGURATION
PDPD_CONFIGURATION_SERVERS=vm1.mr.simpledemo.onap.org
PDPD_CONFIGURATION_API_KEY=
PDPD_CONFIGURATION_API_SECRET=
PDPD_CONFIGURATION_CONSUMER_GROUP=
PDPD_CONFIGURATION_CONSUMER_INSTANCE=
PDPD_CONFIGURATION_PARTITION_KEY=

# PAP

PAP_HOST=pap
PAP_USERNAME=testpap
PAP_PASSWORD=alpha123

# PDP-X

PDP_HOST=pdp
PDP_USERNAME=testpdp
PDP_PASSWORD=alpha123
PDP_CLIENT_USERNAME=python
PDP_CLIENT_PASSWORD=test
PDP_ENVIRONMENT=TEST

# DCAE DMaaP

DCAE_TOPIC=unauthenticated.DCAE_CL_OUTPUT
DCAE_SERVERS=vm1.mr.simpledemo.onap.org
DCAE_CONSUMER_GROUP=dcae.policy.shared

# Open DMaaP

DMAAP_SERVERS=vm1.mr.simpledemo.onap.org

# AAI

AAI_URL=https://aai.api.simpledemo.onap.org:8443
AAI_USERNAME=policy@policy.onap.org
AAI_PASSWORD=demo123456!

# MSO

SO_URL=http://vm1.mso.simpledemo.onap.org:8080/ecomp/mso/infra
SO_USERNAME=InfraPortalClient
SO_PASSWORD=password1$

# VFC

VFC_URL=
VFC_USERNAME=
VFC_PASSWORD=
