<?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">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.apache.bigtop.itest</groupId>
    <artifactId>smoke-tests</artifactId>
    <version>0.3.0-incubating</version>
    <relativePath>../smokes/pom.xml</relativePath>
  </parent>

  <groupId>org.apache.bigtop.itest</groupId>
  <artifactId>package-smoke-execution</artifactId>
  <version>0.3.0-incubating</version>
  <name>packagesmokes</name>

  <properties>
    <cdh.repo.host>archive.cloudera.com</cdh.repo.host>
    <cdh.repo.version>3</cdh.repo.version>

    <org.apache.maven-dependency-plugin.groupId>org.apache.bigtop.itest</org.apache.maven-dependency-plugin.groupId>
    <org.apache.maven-dependency-plugin.artifactId>package-smoke</org.apache.maven-dependency-plugin.artifactId>
    <org.apache.maven-dependency-plugin.version>${package-smoke.version}</org.apache.maven-dependency-plugin.version>
    <org.apache.maven-dependency-plugin.output>${project.build.directory}</org.apache.maven-dependency-plugin.output>

    <org.apache.maven-dependency-plugin.type>jar</org.apache.maven-dependency-plugin.type>
    <org.apache.maven-failsafe-plugin.testInclude>**/PackagesSuite*</org.apache.maven-failsafe-plugin.testInclude>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.bigtop.itest</groupId>
      <artifactId>package-smoke</artifactId>
      <version>${package-smoke.version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <configuration>
          <systemPropertyVariables>
             <cdh.repo.host>${cdh.repo.host}</cdh.repo.host>
             <cdh.repo.version>${cdh.repo.version}</cdh.repo.version>
          </systemPropertyVariables>
        </configuration>
      </plugin>

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