<?xml version="1.0"?>
<!--
============LICENSE_START=======================================================
org.onap.dcae
================================================================================
Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
================================================================================
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.
============LICENSE_END=========================================================
-->
<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.onap</groupId>
    <artifactId>dcaegen2</artifactId>
    <version>1.1.0</version>
  </parent>

  <!--- CHANGE THE FOLLOWING 3 OBJECTS for your own repo -->
  <groupId>org.onap.dcaegen2.deployments</groupId>
  <artifactId>deployments</artifactId>
  <name>dcaegen2-deployments</name>

  <version>1.2.0-SNAPSHOT</version>
  <url>http://maven.apache.org</url>
  <packaging>pom</packaging>

  <modules>
     <module>redis-cluster-container</module>
     <module>cm-container</module>
     <module>k8s-bootstrap-container</module>
     <module>tca-cdap-container</module>
     <module>healthcheck-container</module>
     <module>tls-init-container</module>
     <module>consul-loader-container</module>
     <module>multisite-init-container</module>
  </modules>
<!--  <profiles>
    <profile>
      <id>pnda</id>
      <activation><activeByDefault>false</activeByDefault></activation>
      <modules>
        <module>pnda-mirror-container</module>
        <module>pnda-bootstrap-container</module>
      </modules>
    </profile>
  </profiles>
-->

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <sonar.skip>true</sonar.skip>
    <sonar.sources>.</sonar.sources>
    <!-- customize the SONARQUBE URL -->
    <!-- sonar.host.url>http://localhost:9000</sonar.host.url -->
    <!-- below are language dependent -->
    <!-- for Python -->
    <sonar.language>py</sonar.language>
    <sonar.pluginName>Python</sonar.pluginName>
    <sonar.inclusions>**/*.py</sonar.inclusions>
    <!-- for JavaScaript -->
    <!--
    <sonar.language>js</sonar.language>
    <sonar.pluginName>JS</sonar.pluginName>
    <sonar.inclusions>**/*.js</sonar.inclusions>
    -->
  </properties>
  <build>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <pluginManagement>
      <plugins>
        <!-- the following plugins are invoked from oparent, we do not need them -->
        <plugin>
          <groupId>org.sonatype.plugins</groupId>
          <artifactId>nexus-staging-maven-plugin</artifactId>
          <version>1.6.7</version>
          <configuration>
            <skipNexusStagingDeployMojo>true</skipNexusStagingDeployMojo>
            <skip>true</skip>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <!-- This version supports the "deployAtEnd" parameter -->
          <version>2.8</version>
          <configuration>
            <skip>true</skip>
          </configuration>
        </plugin>
        <!-- first disable the default Java plugins at various stages -->
        <!-- maven-resources-plugin is called during "*resource" phases by default behavior.  it prepares
         the resources dir.  we do not need it -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-resources-plugin</artifactId>
          <version>2.6</version>
          <configuration>
            <skip>true</skip>
          </configuration>
        </plugin>
        <!-- maven-compiler-plugin is called during "compile" phases by default behavior.  we do not need it -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.1</version>
          <configuration>
            <skip>true</skip>
          </configuration>
        </plugin>
        <!-- maven-jar-plugin is called during "compile" phase by default behavior.  we do not need it -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>2.4</version>
          <executions>
            <execution>
              <id>default-jar</id>
              <phase/>
            </execution>
          </executions>
        </plugin>
        <!-- maven-install-plugin is called during "install" phase by default behavior.  it tries to copy stuff under
         target dir to ~/.m2.  we do not need it -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.4</version>
          <configuration>
            <skip>true</skip>
          </configuration>
        </plugin>
        <!-- maven-surefire-plugin is called during "test" phase by default behavior.  it triggers junit test.
         we do not need it -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.12.4</version>
          <configuration>
            <skipTests>true</skipTests>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>exec-maven-plugin</artifactId>
          <version>1.2.1</version>
          <configuration>
            <executable>${session.executionRootDirectory}/mvn-phase-script.sh</executable>
            <environmentVariables>
              <!-- make mvn properties as env for our script -->
              <MVN_PROJECT_GROUPID>${project.groupId}</MVN_PROJECT_GROUPID>
              <MVN_PROJECT_ARTIFACTID>${project.artifactId}</MVN_PROJECT_ARTIFACTID>
              <MVN_PROJECT_VERSION>${project.version}</MVN_PROJECT_VERSION>
              <MVN_NEXUSPROXY>${onap.nexus.url}</MVN_NEXUSPROXY>
              <MVN_RAWREPO_BASEURL_UPLOAD>${onap.nexus.rawrepo.baseurl.upload}</MVN_RAWREPO_BASEURL_UPLOAD>
              <MVN_RAWREPO_BASEURL_DOWNLOAD>${onap.nexus.rawrepo.baseurl.download}</MVN_RAWREPO_BASEURL_DOWNLOAD>
              <MVN_RAWREPO_SERVERID>${onap.nexus.rawrepo.serverid}</MVN_RAWREPO_SERVERID>
              <MVN_DOCKERREGISTRY_SNAPSHOT>${onap.nexus.dockerregistry.snapshot}</MVN_DOCKERREGISTRY_SNAPSHOT>
              <MVN_DOCKERREGISTRY_RELEASE>${onap.nexus.dockerregistry.release}</MVN_DOCKERREGISTRY_RELEASE>
              <MVN_DOCKERREGISTRY_SNAPSHOT_SERVERID>${onap.nexus.dockerregistry.snapshot.serverid}</MVN_DOCKERREGISTRY_SNAPSHOT_SERVERID>
              <MVN_DOCKERREGISTRY_RELEASE_SERVERID>${onap.nexus.dockerregistry.release.serverid}</MVN_DOCKERREGISTRY_RELEASE_SERVERID>
              <MVN_PYPISERVER_BASEURL>${onap.nexus.pypiserver.baseurl}</MVN_PYPISERVER_BASEURL>
              <MVN_PYPISERVER_SERVERID>${onap.nexus.pypiserver.serverid}</MVN_PYPISERVER_SERVERID>
            </environmentVariables>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>
