###
# ============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
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
KEYSTORE_PASSWD=PolicyR0ck$

# 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

# PDP-D DMaaP configuration channel

PDPD_CONFIGURATION_TOPIC=PDPD-CONFIGURATION
PDPD_CONFIGURATION_SERVERS=vm1.mr.simpledemo.openecomp.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.TCA_EVENT_OUTPUT
DCAE_SERVERS=10.0.4.102

# Open DMaaP

DMAAP_SERVERS=vm1.mr.simpledemo.openecomp.org

# AAI

AAI_URL=https://aai.api.simpledemo.openecomp.org:8443
AAI_USERNAME=POLICY
AAI_PASSWORD=POLICY

# MSO

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

# VFC

VFC_URL=
VFC_USERNAME=
VFC_PASSWORD=
