<?xml version="1.0" encoding="UTF-8"?>
<!--
  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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <parent>
    <groupId>org.apache.bigtop.itest</groupId>
    <artifactId>integration-tests</artifactId>
    <version>0.5.0</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

  <modelVersion>4.0.0</modelVersion>
  <groupId>org.apache.bigtop.itest</groupId>
  <artifactId>sqoop-integration-execution</artifactId>
  <version>0.5.0</version>
  <name>sqoop-integration-execution</name>

  <properties>
    <!--Additional environment variables are required-->
    <SQOOP_HOME>${env.SQOOP_HOME}</SQOOP_HOME>
    <HBASE_HOME>${env.HBASE_HOME}</HBASE_HOME>
    <HIVE_HOME>${env.HIVE_HOME}</HIVE_HOME>
    <ZOOKEEPER_HOME>${env.ZOOKEEPER_HOME}</ZOOKEEPER_HOME>
    <!-- Integration tests are special -->
    <org.apache.maven-failsafe-plugin.testInclude>**/IntegrationTest*</org.apache.maven-failsafe-plugin.testInclude>
    <org.apache.maven-dependency-plugin.groupId>org.apache.bigtop.itest</org.apache.maven-dependency-plugin.groupId>
    <org.apache.maven-dependency-plugin.artifactId>sqoop-integration</org.apache.maven-dependency-plugin.artifactId>
    <org.apache.maven-dependency-plugin.version>${sqoop-integration.version}</org.apache.maven-dependency-plugin.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.bigtop.itest</groupId>
      <artifactId>sqoop-integration</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>enforce-property</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireProperty>
                  <property>SQOOP_HOME</property>
                  <message>SQOOP_HOME env. variable has to be set</message>
                </requireProperty>
                <requireProperty>
                  <property>HBASE_HOME</property>
                  <message>HBASE_HOME env. variable has to be set</message>
                </requireProperty>
                <requireProperty>
                  <property>HIVE_HOME</property>
                  <message>HIVE_HOME env. variable has to be set</message>
                </requireProperty>
                <requireProperty>
                  <property>ZOOKEEPER_HOME</property>
                  <message>ZOOKEEPER_HOME env. variable has to be set</message>
                </requireProperty>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.11</version>
        <configuration>
          <systemPropertyVariables>
            <MYSQL_ROOTPW></MYSQL_ROOTPW>
          </systemPropertyVariables>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
