#########
#  ============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
# Note: Override can happen on dbuild.sh Commandline, -r <registry>
DOCKER_PULL_REGISTRY=nexus3.onap.org:10001
DOCKER_REPOSITORY=nexus3.onap.org:10003
VERSION=2.1.11
CONF_ROOT_DIR=/opt/app/osaaf
# For local builds, set PREFIX=   
PREFIX="$DOCKER_REPOSITORY/"
NAMESPACE=onap
DUSER=aaf

# HOSTNAME=aaf.osaaf.org

# AAF Machine info
AAF_ENV=DEV
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=

# 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
# Note:  Setting "CASSANDRA_DOCKER" will setup the appropriate CASSANDRA_CLUSTER, etc in Docker Properties.
CASSANDRA_DOCKER=aaf-cass
# CASSANDRA_CLUSTER=
# CASSANDRA_USER=
# CASSANDRA_PASSWORD=
# CASSANDRA_PORT=

