All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hotels.bdp.circustrain.common.test.base.CircusTrainRunner Maven / Gradle / Ivy

There is a newer version: 16.4.1
Show newest version
/**
 * Copyright (C) 2016-2018 Expedia Inc.
 *
 * Licensed 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.
 */
package com.hotels.bdp.circustrain.common.test.base;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Strings.isNullOrEmpty;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.annotation.Nonnull;

import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableMap;

import com.hotels.bdp.circustrain.CircusTrain;
import com.hotels.bdp.circustrain.common.test.xml.HiveXml;

public class CircusTrainRunner {

  private final String databaseName;
  private final File sourceWarehouseUri;
  private final File replicaWarehouseUri;
  private final String replicaConnectionUri;
  private final String graphiteUri;
  private final HiveXml hiveXml;
  private final Map sourceConfigurationProperties;
  private final Map replicaConfigurationProperties;
  private final Map copierOptions;

  private final File housekeepingDbDirectory;
  private final File housekeepingDbLocation;

  public static class Builder {
    private final String databaseName;
    private final File sourceWarehouseUri;
    private final File replicaWarehouseUri;
    private final File housekeepingDbLocation;
    private String replicaConnectionUri;
    private String sourceThriftConnectionUri;
    private String sourceConnectionURL;
    private String sourceDriverClassName;
    private String graphiteUri;
    private final Map sourceConfigurationProperties = new HashMap<>();
    private final Map replicaConfigurationProperties = new HashMap<>();
    private final Map copierOptions = new HashMap<>();

    private Builder(
        String databaseName,
        File sourceWarehouseUri,
        File replicaWarehouseUri,
        File housekeepingDbLocation) {
      this.databaseName = databaseName;
      this.sourceWarehouseUri = sourceWarehouseUri;
      this.replicaWarehouseUri = replicaWarehouseUri;
      this.housekeepingDbLocation = housekeepingDbLocation;
    }

    public Builder sourceMetaStore(
        String sourceThriftConnectionUri,
        String sourceConnectionURL,
        String sourceDriverClassName) {
      this.sourceThriftConnectionUri = sourceThriftConnectionUri;
      this.sourceConnectionURL = sourceConnectionURL;
      this.sourceDriverClassName = sourceDriverClassName;
      return this;
    }

    public Builder replicaMetaStore(String replicaConnectionUri) {
      this.replicaConnectionUri = replicaConnectionUri;
      return this;
    }

    public Builder sourceConfigurationProperty(String key, String value) {
      sourceConfigurationProperties.put(key, value);
      return this;
    }

    public Builder replicaConfigurationProperty(String key, String value) {
      replicaConfigurationProperties.put(key, value);
      return this;
    }

    public Builder graphiteUri(String graphiteUri) {
      this.graphiteUri = graphiteUri;
      return this;
    }

    public Builder copierOption(String key, String value) {
      copierOptions.put(key, value);
      return this;
    }

    public CircusTrainRunner build() {
      checkArgument(!isNullOrEmpty(databaseName));
      checkArgument(sourceWarehouseUri != null);
      checkArgument(replicaWarehouseUri != null);
      checkArgument(housekeepingDbLocation != null);
      checkArgument(!isNullOrEmpty(replicaConnectionUri));

      HiveXml hiveXml = new HiveXml(sourceThriftConnectionUri, sourceConnectionURL, sourceDriverClassName);
      hiveXml.create();

      CircusTrainRunner ctRunner = new CircusTrainRunner(databaseName, hiveXml, sourceWarehouseUri, replicaWarehouseUri,
          replicaConnectionUri, sourceConfigurationProperties, replicaConfigurationProperties, copierOptions,
          graphiteUri, housekeepingDbLocation);

      return ctRunner;
    }
  }

  public static Builder builder(
      String databaseName,
      File sourceWarehouseUri,
      File replicaWarehouseUri,
      File housekeepingDbLocation) {
    return new Builder(databaseName, sourceWarehouseUri, replicaWarehouseUri, housekeepingDbLocation);
  }

  private CircusTrainRunner(
      String databaseName,
      HiveXml hiveXml,
      File sourceWarehouseUri,
      File replicaWarehouseUri,
      String replicaConnectionUri,
      Map sourceConfigurationProperties,
      Map replicaConfigurationProperties,
      Map copierOptions,
      String graphiteUri,
      File housekeepingDbLocation) {
    this.databaseName = databaseName;
    this.sourceWarehouseUri = sourceWarehouseUri;
    this.replicaWarehouseUri = replicaWarehouseUri;
    this.replicaConnectionUri = replicaConnectionUri;
    this.sourceConfigurationProperties = ImmutableMap.copyOf(sourceConfigurationProperties);
    this.replicaConfigurationProperties = ImmutableMap.copyOf(replicaConfigurationProperties);
    this.copierOptions = ImmutableMap.copyOf(copierOptions);
    this.graphiteUri = graphiteUri;
    this.hiveXml = hiveXml;
    this.housekeepingDbLocation = housekeepingDbLocation;
    housekeepingDbDirectory = housekeepingDbLocation.getParentFile();
  }

  public File sourceWarehouseLocation() {
    return sourceWarehouseUri;
  }

  public File replicaWarehouseLocation() {
    return replicaWarehouseUri;
  }

  public File housekeepingDbDirectory() {
    return housekeepingDbDirectory;
  }

  public File housekeepingDbLocation() {
    return housekeepingDbLocation;
  }

  private Map populateProperties(String configFilePath, String... modules) {
    File configFile = new File(configFilePath);
    ImmutableMap.Builder builder = ImmutableMap
        . builder()
        // Configuration file
        .put("config", configFile.getAbsolutePath())
        .put("config-location", configFile.getParent())
        // Logging
        .put("logging.config", "classpath:test-log4j.xml")
        // Spring
        .put("spring.jpa.show-sql", "true")
        // Replica Catalog
        .put("replica-catalog.name", "replica-" + databaseName)
        .put("replica-catalog.hive-metastore-uris", replicaConnectionUri)
        .putAll(prefixProperties("replica-catalog.configuration-properties", replicaConfigurationProperties))
        // Copier properties
        .putAll(prefixProperties("copier-options", copierOptions))
        // Source catalog
        .put("source-catalog.name", "source-" + databaseName)
        .put("source-catalog.disable-snapshots", "true")
        .put("source-catalog.site-xml", hiveXml.getFileName())
        .putAll(prefixProperties("source-catalog.configuration-properties", sourceConfigurationProperties))
        // Housekeeping
        .put("spring.datasource.schema", "classpath:/schema.sql,schema-tables.sql")
        .put("spring.datasource.max-active", "2")
        .put("housekeeping.h2.database", housekeepingDbLocation.getAbsolutePath())
        // Table Replications helper variable
        .put("circus-train-runner.database-name", databaseName)
        .put("circus-train-runner.source-warehouse-uri", sourceWarehouseUri.toURI().toString())
        .put("circus-train-runner.replica-warehouse-uri", replicaWarehouseUri.toURI().toString())
        .put("circus-train-runner.housekeeping-db-directory", housekeepingDbDirectory.toURI().toString());
    // Graphite
    if (graphiteUri != null) {
      builder.put("graphite.host", graphiteUri);
    }
    // Modules
    if (modules != null && modules.length > 0) {
      builder.put("modules", Joiner.on(",").join(modules));
    }
    return builder.build();
  }

  private Map prefixProperties(String prefix, Map properties) {
    ImmutableMap.Builder builder = ImmutableMap. builder();
    for (Entry property : properties.entrySet()) {
      String newKey = new StringBuilder(prefix).append(".").append(property.getKey()).toString();
      builder.put(newKey, property.getValue());
    }
    return builder.build();
  }

  private static String[] getArgsArray(Map props) {
    String[] args = FluentIterable.from(props.entrySet()).transform(new Function, String>() {
      @Override
      public String apply(@Nonnull Entry input) {
        return "--" + input.getKey() + "=" + input.getValue();
      }
    }).toArray(String.class);
    return args;
  }

  public void run(String configFilePath, String... modules) throws Exception {
    Map props = populateProperties(configFilePath, modules);
    CircusTrain.main(getArgsArray(props));
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy