# -*- mode: python -*-

Import("env")

env.SConscript(
    dirs=[
        'catalog',
        'client',
        'commands',
    ],
)

#
# Schema and backward compatibility code for "config" collections.
#

env.Library('base', ['mongo_version_range.cpp',
                     'type_locks.cpp',
                     'type_lockpings.cpp',
                     'type_config_version.cpp',
                     'type_mongos.cpp',
                     'type_tags.cpp'],
            LIBDEPS=['$BUILD_DIR/mongo/base/base',
                     '$BUILD_DIR/mongo/bson/bson'])

env.CppUnitTest('chunk_version_test', 'chunk_version_test.cpp',
                LIBDEPS=['base',
                         '$BUILD_DIR/mongo/db/common'])

env.CppUnitTest('mongo_version_range_test', 'mongo_version_range_test.cpp', 
                LIBDEPS=['base',
                         '$BUILD_DIR/mongo/bson/bson',
                         '$BUILD_DIR/mongo/db/common'])

env.CppUnitTest('type_config_version_test', 'type_config_version_test.cpp',
                LIBDEPS=['base',
                         '$BUILD_DIR/mongo/db/common'])

env.CppUnitTest('type_locks_test', 'type_locks_test.cpp',
                LIBDEPS=['base',
                         '$BUILD_DIR/mongo/db/common'])

env.CppUnitTest('type_lockpings_test', 'type_lockpings_test.cpp',
                LIBDEPS=['base',
                         '$BUILD_DIR/mongo/db/common'])

env.CppUnitTest('type_mongos_test', 'type_mongos_test.cpp',
                LIBDEPS=['base',
                         '$BUILD_DIR/mongo/db/common'])

env.CppUnitTest('type_tags_test', 'type_tags_test.cpp',
                LIBDEPS=['base',
                         '$BUILD_DIR/mongo/db/common'])

#
# Support for maintaining persistent sharding state and data.
#

env.Library(
    target='metadata',
    source=[
        'collection_metadata.cpp',
        'metadata_loader.cpp',
    ],
    LIBDEPS=[
        'base',
        'catalog/catalog_types',
        '$BUILD_DIR/mongo/bson/bson',
        '$BUILD_DIR/mongo/base/base',
        '$BUILD_DIR/mongo/client/clientdriver',
        '$BUILD_DIR/mongo/db/range_arithmetic',
    ]
)

env.CppUnitTest(
    target='metadata_test',
    source=[
        'chunk_diff_test.cpp',
        'metadata_loader_test.cpp',
        'collection_metadata_test.cpp',
    ],
    LIBDEPS=[
        'catalog/legacy/catalog_manager_legacy',
        'metadata',
        '$BUILD_DIR/mongo/db/coredb',
        '$BUILD_DIR/mongo/s/coreshard',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/dbtests/mocklib',
        '$BUILD_DIR/mongo/s/mongoscore',
        '$BUILD_DIR/mongo/db/common',
    ])

#
# Write Operations
#

# Types for write operations
# TODO: Push upward into shared types library between mongos/mongod
env.Library(
    target='batch_write_types',
    source=[
        'write_ops/batched_command_request.cpp',
        'write_ops/batched_command_response.cpp',
        'write_ops/batched_delete_request.cpp',
        'write_ops/batched_delete_document.cpp',
        'write_ops/batched_insert_request.cpp',
        'write_ops/batched_request_metadata.cpp',
        'write_ops/batched_update_request.cpp',
        'write_ops/batched_update_document.cpp',
        'write_ops/batched_upsert_detail.cpp',
        'write_ops/wc_error_detail.cpp',
        'write_ops/write_error_detail.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base/base',
        '$BUILD_DIR/mongo/bson/bson',
    ],
)

env.CppUnitTest(
    target='batch_write_types_test',
    source=[
        'write_ops/batched_command_response_test.cpp',
        'write_ops/batched_delete_request_test.cpp',
        'write_ops/batched_insert_request_test.cpp',
        'write_ops/batched_request_metadata_test.cpp',
        'write_ops/batched_update_request_test.cpp',
    ],
    LIBDEPS=[
        'batch_write_types',
        '$BUILD_DIR/mongo/db/common',
    ]
)

#
# State and execution of operations across multiple hosts
#
# This functionality is self-contained and independent of any network or system-level
# code.
#
env.Library(
    target='cluster_ops',
    source=[
        'write_ops/write_op.cpp',
        'write_ops/batch_write_op.cpp',
        'write_ops/batch_write_exec.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/bson/bson',
        '$BUILD_DIR/mongo/client/clientdriver',
        'batch_write_types',
        '$BUILD_DIR/mongo/util/concurrency/synchronization'
    ],
)

env.CppUnitTest(
    target='cluster_ops_test',
    source=[
        'write_ops/write_op_test.cpp',
        'write_ops/batch_write_op_test.cpp',
        'write_ops/batch_write_exec_test.cpp',
    ],
    LIBDEPS=[
        'cluster_ops',
        '$BUILD_DIR/mongo/db/common',
        '$BUILD_DIR/mongo/db/range_arithmetic',
    ]
)

# Upconvert/Downconvert write functionality for mongos
env.Library(
    target='cluster_write_op_conversion',
    source=[
        'write_ops/batch_upconvert.cpp',
        'write_ops/batch_downconvert.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/bson/bson',
        '$BUILD_DIR/mongo/db/common', # for Message
        '$BUILD_DIR/mongo/db/lasterror',
        'cluster_ops',
    ],
)

env.CppUnitTest(
    target='cluster_write_op_conversion_test',
    source=[
        'write_ops/batch_upconvert_test.cpp',
        'write_ops/batch_downconvert_test.cpp',
    ],
    LIBDEPS=[
        'cluster_ops',
        'cluster_write_op_conversion',
        '$BUILD_DIR/mongo/db/common',
        '$BUILD_DIR/mongo/client/clientdriver',
    ]
)

#
# Implementations of components to perform cluster operations in mongos
#
# This is the glue code implementing the interfaces required by cluster ops
# in particular environments.
#
env.Library(
    target='cluster_ops_impl',
    source=[
        'chunk_manager_targeter.cpp',
        'cluster_explain.cpp',
        'cluster_write.cpp',
        'dbclient_shard_resolver.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/bson/bson',
        '$BUILD_DIR/mongo/s/client/sharding_client',
        'cluster_ops',
        'cluster_write_op_conversion',
    ],
)

env.CppUnitTest(
    target='chunk_manager_targeter_test',
    source=[
        'chunk_manager_targeter_test.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/coredb',
        '$BUILD_DIR/mongo/s/coreshard',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/s/mongoscore',
    ]
)

# This library contains sharding functionality used by both mongod and mongos. Certain tests,
# which exercise this functionality also link against it.
env.Library(
    target='coreshard',
    source=[
        # This is only here temporarily for auto-split logic in chunk.cpp.
        'balancer_policy.cpp',
        'chunk.cpp',
        'chunk_manager.cpp',
        'config.cpp',
        'grid.cpp',
        'shard_key_pattern.cpp',
        'version_manager.cpp',
    ],
    LIBDEPS=[
        'base',
        'client/sharding_client',
        'cluster_ops_impl'
    ]
)

# This library is only used by the mongos execuable and any tests which require mongos runtime
# objects, such as the request processing pipeline or the balancer.
env.Library(
    target='mongoscore',
    source=[
        'balance.cpp',
        'cluster_last_error_info.cpp',
        'cursors.cpp',
        'request.cpp',
        's_only.cpp',
        'strategy.cpp',
        'version_mongos.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/auth/authmongos',
        '$BUILD_DIR/mongo/client/parallel',
        '$BUILD_DIR/mongo/db/fts/ftsmongos',
        '$BUILD_DIR/mongo/db/stats/counters',
        '$BUILD_DIR/mongo/db/query/explain_common',
        '$BUILD_DIR/mongo/db/query/lite_parsed_query',
        '$BUILD_DIR/mongo/util/concurrency/task',
        'cluster_ops',
        'cluster_write_op_conversion',
    ]
)

env.CppUnitTest(
    target='mongoscore_test',
    source=[
        'balancer_policy_tests.cpp',
        'shard_key_pattern_test.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/coredb',
        "$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init",
        'coreshard',
        'mongoscore',
    ]
)

env.CppUnitTest(
    target='config_server_tests',
    source=[
        'config_server_tests.cpp',
    ],
    LIBDEPS=[
        "$BUILD_DIR/mongo/db/coredb",
        "$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init",
        "$BUILD_DIR/mongo/util/net/message_server_port",
        "$BUILD_DIR/mongo/dbtests/mocklib",
        "coreshard",
        "mongoscore",
    ],
)

env.Library(
    target='serveronly',
    source=[
        "d_merge.cpp",
        "d_migrate.cpp",
        "d_split.cpp",
        "d_state.cpp",
        "distlock_test.cpp",
    ],
    LIBDEPS=[
    ],
)
