#########
#  ============LICENSE_START====================================================
#  org.onap.aaf
#  ===========================================================================
#  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====================================================
#
# Variables for building Docker entities
ORG=onap
PROJECT=aaf
DOCKER_REPOSITORY=nexus3.onap.org:10003
VERSION=2.1.8-SNAPSHOT
CONF_ROOT_DIR=/opt/app/osaaf
# For local builds, set PREFIX=   
PREFIX="$DOCKER_REPOSITORY/"

# Local Env info
HOSTNAME=aaf.osaaf.org
HOST_IP=

# AAF Machine info
AAF_ENV=DEV
AAF_REGISTER_AS=$HOSTNAME
AAF_LOCATE_AS=$AAF_REGISTER_AS
LATITUDE=
LONGITUDE=

# Initial AAF Certificate (not Generated)
CADI_X509_ISSUERS="CN=intermediateCA_1, OU=OSAAF, O=ONAP, C=US:CN=intermediateCA_7, OU=OSAAF, O=ONAP, C=US"
AAF_INITIAL_X509_P12=
AAF_INITIAL_X509_PASSWORD=
CADI_X509_ISSUERS=

# CA info (leave blank unless functioning as CA)
CM_CA_LOCAL=
AAF_SIGNER_P12=
AAF_SIGNER_PASSWORD=
AAF_SIGNER_ALIAS=

# OPTIONALLY ADD THESE CASSANDRA PROPERTIES
# CASS_HOST=
# CASSANDRA_CLUSTER=
# CASSANDRA_USER=
# CASSANDRA_PASSWORD=
# CASSANDRA_PORT=

