#########
#  ============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
#
# NOTE: THIS FILE SHOULD MATCH THE normal "d.props" file in "authz/auth/docker", but hold the 
# CURRENT version needed for CSIT from Nexus Repos, which isn't necessarily the same during 
# version deployments.
#

ORG=onap
PROJECT=aaf
DOCKER_PULL_REGISTRY=nexus3.onap.org:10001
DOCKER_REPOSITORY=nexus3.onap.org:10003
VERSION=2.1.16-SNAPSHOT
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=38
LONGITUDE=-72

# 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
# 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=

