/*
 * 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.
 */

rootProject.name = 'Apache Ignite 3'
include(':ignite-page-memory')
include(':ignite-storage-api')
include(':ignite-network-annotation-processor')
include(':ignite-client')
include(':ignite-jdbc')
include(':ignite-rocksdb-common')
include(':ignite-file-io')
include(':ignite-vault')
include(':ignite-rest')
include(':ignite-examples')
include(':ignite-network')
include(':ignite-configuration-api')
include(':ignite-raft-api')
include(':ignite-raft')
include(':ignite-schema')
include(':ignite-storage-page-memory')
include(':ignite-transactions')
include(':ignite-client-common')
include(':ignite-network-api')
include(':ignite-cluster-management')
include(':ignite-cli')
include(':ignite-table')
include(':ignite-api')
include(':ignite-client-handler')
include(':ignite-sql-engine')
include(':ignite-marshaller-common')
include(':ignite-jacoco-report')
include(':ignite-configuration')
include(':ignite-configuration-presentation')
include(':ignite-core')
include(':ignite-affinity')
include(':ignite-bytecode')
include(':ignite-runner')
include(':ignite-index')
include(':ignite-baseline')
include(':ignite-metastorage-api')
include(':ignite-metastorage')
include(':ignite-rest-api')
include(':ignite-storage-rocksdb')
include(':ignite-configuration-annotation-processor')
include(':ignite-compute')
include(':ignite-metrics')
include(':ignite-binary-tuple')
include(':platforms')
include(':packaging-cli')
include(':packaging-db')
include(':packaging')
include(':ignite-replicator')
include(':ignite-distribution-zones')
include(':ignite-placement-driver')
include(':ignite-placement-driver-api')
include(':ignite-code-deployment')
include(':ignite-security')
include(':ignite-catalog')
include(":ignite-arch-test")

project(":ignite-examples").projectDir = file('examples')
project(":ignite-page-memory").projectDir = file('modules/page-memory')
project(":ignite-storage-api").projectDir = file('modules/storage-api')
project(":ignite-network-annotation-processor").projectDir = file('modules/network-annotation-processor')
project(":ignite-client").projectDir = file('modules/client')
project(":ignite-jdbc").projectDir = file('modules/jdbc')
project(":ignite-rocksdb-common").projectDir = file('modules/rocksdb-common')
project(":ignite-file-io").projectDir = file('modules/file-io')
project(":ignite-vault").projectDir = file('modules/vault')
project(":ignite-rest").projectDir = file('modules/rest')
project(":ignite-network").projectDir = file('modules/network')
project(":ignite-raft-api").projectDir = file('modules/raft-api')
project(":ignite-configuration-api").projectDir = file('modules/configuration-api')
project(":ignite-raft").projectDir = file('modules/raft')
project(":ignite-schema").projectDir = file('modules/schema')
project(":ignite-storage-page-memory").projectDir = file('modules/storage-page-memory')
project(":ignite-transactions").projectDir = file('modules/transactions')
project(":ignite-client-common").projectDir = file('modules/client-common')
project(":ignite-network-api").projectDir = file('modules/network-api')
project(":ignite-cluster-management").projectDir = file('modules/cluster-management')
project(":ignite-cli").projectDir = file('modules/cli')
project(":ignite-table").projectDir = file('modules/table')
project(":ignite-api").projectDir = file('modules/api')
project(":ignite-client-handler").projectDir = file('modules/client-handler')
project(":ignite-sql-engine").projectDir = file('modules/sql-engine')
project(":ignite-marshaller-common").projectDir = file('modules/marshaller-common')
project(":ignite-jacoco-report").projectDir = file('modules/jacoco-report')
project(":ignite-configuration").projectDir = file('modules/configuration')
project(":ignite-configuration-presentation").projectDir = file('modules/configuration-presentation')
project(":ignite-core").projectDir = file('modules/core')
project(":ignite-affinity").projectDir = file('modules/affinity')
project(":ignite-bytecode").projectDir = file('modules/bytecode')
project(":ignite-runner").projectDir = file('modules/runner')
project(":ignite-index").projectDir = file('modules/index')
project(":ignite-baseline").projectDir = file('modules/baseline')
project(":ignite-metastorage-api").projectDir = file('modules/metastorage-api')
project(":ignite-metastorage").projectDir = file('modules/metastorage')
project(":ignite-rest-api").projectDir = file('modules/rest-api')
project(":ignite-storage-rocksdb").projectDir = file('modules/storage-rocksdb')
project(":ignite-configuration-annotation-processor").projectDir = file('modules/configuration-annotation-processor')
project(":ignite-compute").projectDir = file('modules/compute')
project(":ignite-metrics").projectDir = file('modules/metrics')
project(":ignite-binary-tuple").projectDir = file('modules/binary-tuple')
project(":platforms").projectDir = file('modules/platforms')
project(":ignite-replicator").projectDir = file('modules/replicator')
project(":packaging-cli").projectDir = file('packaging/cli')
project(":packaging-db").projectDir = file('packaging/db')
project(":packaging").projectDir = file('packaging')
project(":ignite-distribution-zones").projectDir = file('modules/distribution-zones')
project(":ignite-placement-driver").projectDir = file('modules/placement-driver')
project(":ignite-placement-driver-api").projectDir = file('modules/placement-driver-api')
project(":ignite-code-deployment").projectDir = file('modules/code-deployment')
project(":ignite-security").projectDir = file('modules/security')
project(":ignite-catalog").projectDir = file('modules/catalog')
project(":ignite-arch-test").projectDir = file('modules/arch-test')

ext.isCiServer = System.getenv().containsKey("IGNITE_CI")

buildCache {
    local {
        enabled = !isCiServer
        push = !isCiServer
    }
    remote(HttpBuildCache) {
        enabled = isCiServer
        push = isCiServer
        url = System.getenv()["GRADLE_BUILD_CACHE_URI"] + "/cache/"
        allowInsecureProtocol = true
        credentials {
            username = System.getenv()["GRADLE_BUILD_CACHE_USERNAME"]
            password = System.getenv()["GRADLE_BUILD_CACHE_PASSWORD"]
        }
    }
}
