#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#

####################################################
####    This is used for falcon packaging only. ####
####################################################

*.domain=${falcon.app.type}

######### Implementation classes #########
## DONT MODIFY UNLESS SURE ABOUT CHANGE ##

*.workflow.engine.impl=org.apache.falcon.workflow.engine.OozieWorkflowEngine
*.oozie.process.workflow.builder=org.apache.falcon.workflow.OozieProcessWorkflowBuilder
*.oozie.feed.workflow.builder=org.apache.falcon.workflow.OozieFeedWorkflowBuilder
*.SchedulableEntityManager.impl=org.apache.falcon.resource.SchedulableEntityManager
*.ConfigSyncService.impl=org.apache.falcon.resource.ConfigSyncService
*.ProcessInstanceManager.impl=org.apache.falcon.resource.InstanceManager
*.catalog.service.impl=org.apache.falcon.catalog.HiveCatalogService

##### Falcon Services #####
*.application.services=org.apache.falcon.security.AuthenticationInitializationService,\
                        org.apache.falcon.workflow.WorkflowJobEndNotificationService, \
                        org.apache.falcon.service.ProcessSubscriberService,\
                        org.apache.falcon.entity.store.ConfigurationStore,\
                        org.apache.falcon.rerun.service.RetryService,\
                        org.apache.falcon.rerun.service.LateRunService,\
                        org.apache.falcon.metadata.MetadataMappingService,\
                        org.apache.falcon.service.LogCleanupService

##### Prism Services #####
prism.application.services=org.apache.falcon.entity.store.ConfigurationStore

##### Falcon Configuration Store Change listeners #####
*.configstore.listeners=org.apache.falcon.entity.v0.EntityGraph,\
                        org.apache.falcon.entity.ColoClusterRelation,\
                        org.apache.falcon.group.FeedGroupMap,\
                        org.apache.falcon.service.SharedLibraryHostingService

##### Prism Configuration Store Change listeners #####
prism.configstore.listeners=org.apache.falcon.entity.v0.EntityGraph,\
                        org.apache.falcon.entity.ColoClusterRelation,\
                        org.apache.falcon.group.FeedGroupMap

##### JMS MQ Broker Implementation class #####
*.broker.impl.class=org.apache.activemq.ActiveMQConnectionFactory

##### List of shared libraries for Falcon workflows #####
*.shared.libs=activemq-core,ant,geronimo-j2ee-management,hadoop-distcp,jms,json-simple,oozie-client,spring-jms

##### Workflow Job Execution Completion listeners #####
*.workflow.execution.listeners=

######### Implementation classes #########


######### System startup parameters #########

# Location to store user entity configurations
*.config.store.uri=file://${falcon.home}/data/${falcon.app.type}-store

# Location of libraries that is shipped to Hadoop
*.system.lib.location=${falcon.home}/server/webapp/${falcon.app.type}/WEB-INF/lib

*.retry.recorder.path=${falcon.log.dir}/retry

*.falcon.cleanup.service.frequency=days(1)


######### Properties for configuring JMS provider - activemq #########
# Default Active MQ url
*.broker.url=tcp://localhost:61616

# default time-to-live for a JMS message 3 days (time in minutes)
*.broker.ttlInMins=4320
*.entity.topic=FALCON.ENTITY.TOPIC
*.max.retry.failure.count=1

######### Properties for configuring iMon client and metric #########
*.internal.queue.size=1000

#*.current.colo=<<current.colo>>


######### Graph Database Properties #########
# Graph implementation
*.falcon.graph.blueprints.graph=com.thinkaurelius.titan.core.TitanFactory

# Graph Storage
*.falcon.graph.storage.directory=/${falcon.home}/data/graphdb
*.falcon.graph.storage.backend=berkeleyje
*.falcon.graph.serialize.path=/${falcon.home}/data
*.falcon.graph.preserve.history=false


######### Authentication Properties #########

# Authentication type must be specified: simple|kerberos
*.falcon.authentication.type=simple

##### Service Configuration

# Indicates the Kerberos principal to be used in Falcon Service.
*.falcon.service.authentication.kerberos.principal=

# Location of the keytab file with the credentials for the Service principal.
*.falcon.service.authentication.kerberos.keytab=

# name node principal to talk to config store
*.dfs.namenode.kerberos.principal=

##### SPNEGO Configuration

# Authentication type must be specified: simple|kerberos|<class>
# org.apache.falcon.security.RemoteUserInHeaderBasedAuthenticationHandler can be used for backwards compatibility
*.falcon.http.authentication.type=simple

# Indicates how long (in seconds) an authentication token is valid before it has to be renewed.
*.falcon.http.authentication.token.validity=36000

# The signature secret for signing the authentication tokens.
*.falcon.http.authentication.signature.secret=falcon

# The domain to use for the HTTP cookie that stores the authentication token.
*.falcon.http.authentication.cookie.domain=

# Indicates if anonymous requests are allowed when using 'simple' authentication.
*.falcon.http.authentication.simple.anonymous.allowed=true

# Indicates the Kerberos principal to be used for HTTP endpoint.
# The principal MUST start with 'HTTP/' as per Kerberos HTTP SPNEGO specification.
*.falcon.http.authentication.kerberos.principal=

# Location of the keytab file with the credentials for the HTTP principal.
*.falcon.http.authentication.kerberos.keytab=

# The kerberos names rules is to resolve kerberos principal names, refer to Hadoop's KerberosName for more details.
*.falcon.http.authentication.kerberos.name.rules=DEFAULT

# Comma separated list of black listed users
*.falcon.http.authentication.blacklisted.users=

######### Authentication Properties #########


######### Authorization Properties #########

# Authorization Enabled flag: false (default)|true
*.falcon.security.authorization.enabled=false

# The name of the group of super-users
*.falcon.security.authorization.superusergroup=falcon

# Admin Users, comma separated users
*.falcon.security.authorization.admin.users=falcon,ambari-qa

# Admin Group Membership, comma separated users
*.falcon.security.authorization.admin.groups=falcon,staff

# Authorization Provider Implementation Fully Qualified Class Name
*.falcon.security.authorization.provider=org.apache.falcon.security.DefaultAuthorizationProvider

######### Authorization Properties #########
