###
# ============LICENSE_START=======================================================
# ECOMP-PDP-REST
# ================================================================================
# 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=========================================================
###

# Default XACML Properties File for PDP RESTful servlet
#
# Standard API Factories
#
xacml.dataTypeFactory=com.att.research.xacml.std.StdDataTypeFactory
xacml.pdpEngineFactory=com.att.research.xacmlatt.pdp.ATTPDPEngineFactory
xacml.pepEngineFactory=com.att.research.xacml.std.pep.StdEngineFactory
# NOT USED SEE BELOW xacml.pipFinderFactory=org.openecomp.policy.xacml.std.pip.StdPIPFinderFactory
xacml.traceEngineFactory=com.att.research.xacml.std.trace.LoggingTraceEngineFactory
#
# AT&T PDP Implementation Factories
#
xacml.att.evaluationContextFactory=com.att.research.xacmlatt.pdp.std.StdEvaluationContextFactory
xacml.att.combiningAlgorithmFactory=com.att.research.xacmlatt.pdp.std.StdCombiningAlgorithmFactory
xacml.att.functionDefinitionFactory=org.openecomp.policy.xacml.custom.EcompFunctionDefinitionFactory
# NOT USED SEE BELOW xacml.att.policyFinderFactory=org.openecomp.policy.pdp.std.StdPolicyFinderFactory
# creteUpdate Policy Implementation Class details. 
createUpdatePolicy.impl.className=org.openecomp.policy.pdp.rest.api.services.CreateUpdatePolicyServiceImpl
# AAF Implementation class details
aafClient.impl.className=org.openecomp.policy.utils.AAFPolicyClientImpl
#
# AT&T RESTful PDP Implementation Factories
#
xacml.pipFinderFactory=org.openecomp.policy.pdp.rest.impl.XACMLPdpPIPFinderFactory
xacml.att.policyFinderFactory=org.openecomp.policy.pdp.rest.XACMLPdpPolicyFinderFactory
#
# When set to true, this flag tells the StdPolicyFinderFactory to combined all the root policy files into
# into one PolicySet and use the given Policy Algorithm.
#
xacml.att.policyFinderFactory.combineRootPolicies=urn:com:att:xacml:3.0:policy-combining-algorithm:combined-permit-overrides
#
# PDP RESTful API properties
# 
# Set this to the address where the XACML-PAP-REST servlet is running
xacml.rest.pap.url=http://localhost:8070/pap/

#if multiple paps exist, the xacml.rest.pap.url can be removed and they can be defined like this:
#xacml.rest.pap.urls=http://localhost:9090/pap/,http://localhost:9091/pap/

#
# Give the running PDP an ID for the PAP. The url that its running as is a good choice.
# The PAP identifies PDP's using the URL of the PDP.
#
xacml.rest.pdp.id=http://localhost:8082/pdp/

# Give the port number used for the PDP

xacml.jmx.port=0


# Notification Properties
# Notifcation type: websocket, ueb or dmaap... if left blank websocket is the default
NOTIFICATION_TYPE=websocket
NOTIFICATION_SERVERS=
NOTIFICATION_TOPIC=
NOTIFICATION_DELAY=
UEB_API_KEY=
UEB_API_SECRET=
DMAAP_AAF_LOGIN=
DMAAP_AAF_PASSWORD=

#
# Set the directory where the PDP holds its Policy Cache and PIP Configuration
#
xacml.rest.pdp.config=config

xacml.rest.pdp.webapps=/home/users/PolicyEngine/webapps/ConfigPAP/
#
# Initialize register with PAP servlet
#
xacml.rest.pdp.register=true
#
# Sleep period in seconds between register attempts
#
xacml.rest.pdp.register.sleep=15
#
# number of attempts to register. -1 means keep trying forever.
#
xacml.rest.pdp.register.retries=-1
#
# max number of bytes in a POST of a XML/JSON request
# old value #32767
xacml.rest.pdp.maxcontent=99999999 
#
# Set UserID here
xacml.rest.pdp.userid=testpdp
# Set Password here
xacml.rest.pdp.password=alpha456

# id PAP
xacml.rest.pap.userid=testpap
#if multiple paps have different logins, they can be defined like this:
#http\://localhost\:9090/pap/.xacml.rest.pap.userid=testpap

# pass PAP
xacml.rest.pap.password=alpha123
#http\://localhost\:9090/pap/.xacml.rest.pap.password=alpha123

# Delay for Notifications Don't change this. Value in milliSec.  
xacml.rest.notification.delay=30
# Buffer Size. 
REQUEST_BUFFER_SIZE=15

#properties for MySql xacml database:  PLEASE DO NOT REMOVE... NEEDED FOR APIs
javax.persistence.jdbc.driver=com.mysql.jdbc.Driver
javax.persistence.jdbc.url=jdbc:mysql://localhost:3306/ecomp_sdk
javax.persistence.jdbc.user=policy_user
javax.persistence.jdbc.password=policy_user


#***Properties for IntegrityMonitor integration defined in XACMLRestProperties.java***

#The name of the PDP.  Must be unique across the system
xacml.rest.pdp.resource.name=site_1.pdp_1

#***Properties for IntegrityMonitor integration defined in IntegrityMonitorProperties.java***

#Interval between forward progress counter updates in seconds
fp_monitor_interval=30

#Number of forward progress counter failures before failover
failed_counter_threshold=3

#Interval in seconds between test transactions if there is no other traffic
test_trans_interval=10

#Interval in seconds between updates of the forward progress counter in the DB
write_fpc_interval=5

#Name of the site
site_name=site_1

#Node type
node_type=pdp_xacml

#Dependency groups are groups of resources upon which a node operational state is dependent upon). 
#Each group is a comma-separated list of resource names and groups are separated by a semicolon.
#A group may contain one or more members. Resource names must match the resource names defined
#in the respective servers' properties files
dependency_groups=site_1.pdplp_1;site_1.astragw_1;site_1.brmsgw_1

# this can be DEVL, TEST, PROD 
ENVIRONMENT=DEVL
xacml.rest.pep.idfile = client.properties

#AAF Policy Name space
#Not Mandatory for Open Ecomp
policy.aaf.namespace = 
policy.aaf.resource = 