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

#############
# Lake core #
#############

# Lake plugin dir, absolute path or relative path
PLUGIN_DIR=bin/plugins
REMOTE_PLUGIN_DIR=python/plugins

# Lake Database Connection String
DB_URL=mysql://merico:merico@mysql:3306/lake?charset=utf8mb4&parseTime=True&loc=UTC
E2E_DB_URL=mysql://merico:merico@mysql:3306/lake_test?charset=utf8mb4&parseTime=True&loc=UTC
# Silent Error Warn Info
DB_LOGGING_LEVEL=Error
# Skip to update progress of subtasks, default is false (#8142)
SKIP_SUBTASK_PROGRESS=false

# Lake REST API
PORT=8080
MODE=release

# PUSH_API_ALLOWED_TABLES=table1,table2
NOTIFICATION_ENDPOINT=
NOTIFICATION_SECRET=

API_TIMEOUT=120s
API_RETRY=3
API_REQUESTS_PER_HOUR=10000
PIPELINE_MAX_PARALLEL=1
# resume undone pipelines on start
RESUME_PIPELINES=true
# Debug Info Warn Error
LOGGING_LEVEL=
LOGGING_DIR=./logs
ENABLE_STACKTRACE=true
FORCE_MIGRATION=false

# Lake TAP API
TAP_PROPERTIES_DIR=

DISABLED_REMOTE_PLUGINS=

##########################
# Sensitive information encryption key
##########################
ENCRYPTION_SECRET=

##########################
# Security settings
##########################
# Set if skip verify and connect with out trusted certificate when use https
IN_SECURE_SKIP_VERIFY=false
# Forbid accessing sensity networks, CIDR form separated by comma: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
ENDPOINT_CIDR_BLACKLIST=
# Do not follow redirection when requesting data source APIs
FORBID_REDIRECTION=false

##########################
# Plugin settings
##########################
GITLAB_SERVER_COLLECT_ALL_USERS=true

##########################
# In plugin gitextractor, use go-git to collector repo's data
##########################
USE_GO_GIT_IN_GIT_EXTRACTOR=false
# NOTE that COMMIT_FILES is part of the COMMIT_STAT
SKIP_COMMIT_STAT=false
SKIP_COMMIT_FILES=true

# Set if response error when requesting /connections/{connection_id}/test should be wrapped or not
##########################
WRAP_RESPONSE_ERROR=

# Enable subtasks by default: plugin_name:subtask_name:enabled
ENABLE_SUBTASKS_BY_DEFAULT="jira:collectIssueChangelogs:true,jira:extractIssueChangelogs:true,jira:convertIssueChangelogs:true,tapd:collectBugChangelogs:true,tapd:extractBugChangelogs:true,tapd:convertBugChangelogs:true,zentao:collectBugRepoCommits:true,zentao:extractBugRepoCommits:true,zentao:convertBugRepoCommits:true,zentao:collectStoryRepoCommits:true,zentao:extractStoryRepoCommits:true,zentao:convertStoryRepoCommits:true,zentao:collectTaskRepoCommits:true,zentao:extractTaskRepoCommits:true,zentao:convertTaskRepoCommits:true"