# Path: ndscheduler/corescheduler/constants.py
# DEFAULT_JOBS_TABLENAME = 'scheduler_jobs'
# DEFAULT_EXECUTIONS_TABLENAME = 'scheduler_execution'
# DEFAULT_AUDIT_LOGS_TABLENAME = 'scheduler_jobauditlog'
# DEFAULT_THREAD_POOL_SIZE = 4
# DEFAULT_JOB_MAX_INSTANCES = 3
# DEFAULT_JOB_COALESCE = True
# DEFAULT_TIMEZONE = 'UTC'
# DEFAULT_JOB_MISFIRE_GRACE_SEC = 3600
# JOB_ARGS = 5
# EXECUTION_STATUS_SCHEDULED = 0
# EXECUTION_STATUS_RUNNING = 1
# EXECUTION_STATUS_STOPPING = 2
# EXECUTION_STATUS_STOPPED = 3
# EXECUTION_STATUS_FAILED = 4
# EXECUTION_STATUS_SUCCEEDED = 5
# EXECUTION_STATUS_TIMEOUT = 6
# EXECUTION_STATUS_SCHEDULED_ERROR = 7
# EXECUTION_STATUS_DICT = {
#     EXECUTION_STATUS_SCHEDULED: 'scheduled',
#     EXECUTION_STATUS_RUNNING: 'running',
#     EXECUTION_STATUS_STOPPING: 'stopping',
#     EXECUTION_STATUS_STOPPED: 'stopped',
#     EXECUTION_STATUS_FAILED: 'failed',
#     EXECUTION_STATUS_SUCCEEDED: 'succeeded',
#     EXECUTION_STATUS_TIMEOUT: 'timeout',
#     EXECUTION_STATUS_SCHEDULED_ERROR: 'scheduled error'
# }
# AUDIT_LOG_ADDED = 0
# AUDIT_LOG_MODIFIED = 1
# AUDIT_LOG_DELETED = 2
# AUDIT_LOG_PAUSED = 3
# AUDIT_LOG_RESUMED = 4
# AUDIT_LOG_CUSTOM_RUN = 5
# AUDIT_LOG_DICT = {
#     AUDIT_LOG_ADDED: 'added',
#     AUDIT_LOG_MODIFIED: 'modified',
#     AUDIT_LOG_DELETED: 'deleted',
#     AUDIT_LOG_PAUSED: 'paused',
#     AUDIT_LOG_RESUMED: 'resumed',
#     AUDIT_LOG_CUSTOM_RUN: 'custom_run'
# }
# 
# Path: ndscheduler/corescheduler/utils.py
# def import_from_path(path):
# def get_current_datetime():
# def get_job_name(job):
# def get_job_args(job):
# def get_job_kwargs(job):
# def get_cron_strings(job):
# def generate_uuid():
# def get_stacktrace():
# def get_hostname():
# def get_pid():
# def get_datastore_instance(datastore_class_path, db_config=None, db_tablenames=None):


from apscheduler.executors import pool
from ndscheduler.corescheduler import constants
from ndscheduler.corescheduler import utils
        :param str datastore_class_path: string path for datastore, e.g. 'datastore.SQLDatastore'
        :param dict db_config: dictionary containing values for db connection
        :param dict db_tablenames: dictionary containing the names for the jobs,
        executions, or audit logs table, e.g. {
            'executions_tablename': 'scheduler_executions',
            'jobs_tablename': 'scheduler_jobs',
            'auditlogs_tablename': 'scheduler_auditlogs'
        }
        If any of these keys is not provided, the default table name is selected from constants.py
        :param bool job_coalesce: True by default
        :param int job_misfire_grace_sec: Integer number of seconds
        :param int job_max_instances: Int number of instances
        :param int thread_pool_size: Int thread pool size
        :param str timezone: str timezone to schedule jobs in, e.g. 'UTC'
        """
        datastore = utils.get_datastore_instance(datastore_class_path, db_config, db_tablenames)
        job_stores = {
            'default': datastore
        }

        job_default = {
            'coalesce': job_coalesce,
            'misfire_grace_time': job_misfire_grace_sec,
            'max_instances': job_max_instances
        }

        executors = {
            'default': pool.ThreadPoolExecutor(thread_pool_size)
        }


# Path: ndscheduler/corescheduler/constants.py
# DEFAULT_JOBS_TABLENAME = 'scheduler_jobs'
# DEFAULT_EXECUTIONS_TABLENAME = 'scheduler_execution'
# DEFAULT_AUDIT_LOGS_TABLENAME = 'scheduler_jobauditlog'
# DEFAULT_THREAD_POOL_SIZE = 4
# DEFAULT_JOB_MAX_INSTANCES = 3
# DEFAULT_JOB_COALESCE = True
# DEFAULT_TIMEZONE = 'UTC'
# DEFAULT_JOB_MISFIRE_GRACE_SEC = 3600
# JOB_ARGS = 5
# EXECUTION_STATUS_SCHEDULED = 0
# EXECUTION_STATUS_RUNNING = 1
# EXECUTION_STATUS_STOPPING = 2
# EXECUTION_STATUS_STOPPED = 3
# EXECUTION_STATUS_FAILED = 4
# EXECUTION_STATUS_SUCCEEDED = 5
# EXECUTION_STATUS_TIMEOUT = 6
# EXECUTION_STATUS_SCHEDULED_ERROR = 7
# EXECUTION_STATUS_DICT = {
#     EXECUTION_STATUS_SCHEDULED: 'scheduled',
#     EXECUTION_STATUS_RUNNING: 'running',
#     EXECUTION_STATUS_STOPPING: 'stopping',
#     EXECUTION_STATUS_STOPPED: 'stopped',
#     EXECUTION_STATUS_FAILED: 'failed',
#     EXECUTION_STATUS_SUCCEEDED: 'succeeded',
#     EXECUTION_STATUS_TIMEOUT: 'timeout',
#     EXECUTION_STATUS_SCHEDULED_ERROR: 'scheduled error'
# }
# AUDIT_LOG_ADDED = 0
# AUDIT_LOG_MODIFIED = 1
# AUDIT_LOG_DELETED = 2
# AUDIT_LOG_PAUSED = 3
# AUDIT_LOG_RESUMED = 4
# AUDIT_LOG_CUSTOM_RUN = 5
# AUDIT_LOG_DICT = {
#     AUDIT_LOG_ADDED: 'added',
#     AUDIT_LOG_MODIFIED: 'modified',
#     AUDIT_LOG_DELETED: 'deleted',
#     AUDIT_LOG_PAUSED: 'paused',
#     AUDIT_LOG_RESUMED: 'resumed',
#     AUDIT_LOG_CUSTOM_RUN: 'custom_run'
# }
# 
# Path: ndscheduler/corescheduler/utils.py
# def import_from_path(path):
# def get_current_datetime():
# def get_job_name(job):
# def get_job_args(job):
# def get_job_kwargs(job):
# def get_cron_strings(job):
# def generate_uuid():
# def get_stacktrace():
# def get_hostname():
# def get_pid():
# def get_datastore_instance(datastore_class_path, db_config=None, db_tablenames=None):


# Path: ndscheduler/corescheduler/scheduler_manager.py
from apscheduler.executors import pool
from ndscheduler.corescheduler import constants
from ndscheduler.corescheduler import utils

        :param str datastore_class_path: string path for datastore, e.g. 'datastore.SQLDatastore'
        :param dict db_config: dictionary containing values for db connection
        :param dict db_tablenames: dictionary containing the names for the jobs,
        executions, or audit logs table, e.g. {
            'executions_tablename': 'scheduler_executions',
            'jobs_tablename': 'scheduler_jobs',
            'auditlogs_tablename': 'scheduler_auditlogs'
        }
        If any of these keys is not provided, the default table name is selected from constants.py
        :param bool job_coalesce: True by default
        :param int job_misfire_grace_sec: Integer number of seconds
        :param int job_max_instances: Int number of instances
        :param int thread_pool_size: Int thread pool size
        :param str timezone: str timezone to schedule jobs in, e.g. 'UTC'
        """
        datastore = utils.get_datastore_instance(datastore_class_path, db_config, db_tablenames)
        job_stores = {
            'default': datastore
        }

        job_default = {
            'coalesce': job_coalesce,
            'misfire_grace_time': job_misfire_grace_sec,
            'max_instances': job_max_instances
        }

        executors = {
            'default': pool.ThreadPoolExecutor(thread_pool_size)
        }


        scheduler_class = utils.import_from_path(scheduler_class_path)