<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~  Copyright © 2017-2018 AT&T Intellectual Property.
  ~
  ~  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.
  -->

<project
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
        xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
        <artifactId>parent</artifactId>
        <version>0.3.0-SNAPSHOT</version>
        <relativePath>../parent</relativePath>
    </parent>
    <artifactId>distribution</artifactId>
    <packaging>pom</packaging>
    <name>Controller Blueprints Distribution</name>
    <properties>
        <assembly.id>maven</assembly.id>
        <name.space>org.onap.ccsdk.apps</name.space>     <!-- <name.space>${namespace}</name.space> -->
        <serviceArtifactName>controllerblueprints</serviceArtifactName>
        <image.name>onap/ccsdk-controllerblueprints</image.name>
		<docker.buildArg.https_proxy>${https_proxy}</docker.buildArg.https_proxy>
		<docker.push.phase>deploy</docker.push.phase>
		<docker.verbose>true</docker.verbose>
	</properties>

    <dependencies>
        <dependency>
            <groupId>org.onap.ccsdk.apps.controllerblueprints</groupId>
            <artifactId>application</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <id>copy-dockerfile</id>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals><!-- here the phase you need -->
                        <phase>validate</phase>
                        <configuration>
                            <outputDirectory>${basedir}/target/docker-stage</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>src/main/docker</directory>
                                    <includes>
                                        <include>*</include>
                                    </includes>
                                    <filtering>true</filtering>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>ant-test</id>
                        <phase>package</phase>
                        <configuration>
                            <tasks>
                                <fixcrlf srcdir="${basedir}" eol="unix"
                                         includes="**/*.sh, **/*.source"/>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!--build the final artifact for docker deployment -->
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <!-- <skipAssembly>${skip.assembly}</skipAssembly>-->
                    <outputDirectory>${basedir}/target/docker-stage</outputDirectory>
                    <descriptors>
                        <descriptor>src/main/docker/distribution.xml</descriptor>
                    </descriptors>
                    <tarLongFileMode>posix</tarLongFileMode>
                </configuration>
                <executions>
                    <execution>
                        <id>${assembly.id}</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.groovy.maven</groupId>
                <artifactId>gmaven-plugin</artifactId>
                <version>1.0</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <configuration>
                            <source>
                                println project.properties['ccsdk.project.version'];
                                def versionArray;
                                if (project.properties['ccsdk.project.version'] != null ) {
                                    versionArray = project.properties['ccsdk.project.version'].split('\\.');
                                }

                                if (project.properties['ccsdk.project.version'].endsWith("-SNAPSHOT"))
                                {
                                    project.properties['project.docker.latesttag.version']=versionArray[0] + '.' + versionArray[1] + "-STAGING-latest";
                                } else {
                                    project.properties['project.docker.latesttag.version']=versionArray[0]+'.' + versionArray[1]+"-STAGING-latest";
                                }

                                println 'New Tag for docker:' + project.properties['project.docker.latesttag.version'];
                            </source>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

	<profiles>
		<profile>
			<id>docker</id>
			<build>
				<plugins>
					<plugin>
						<groupId>io.fabric8</groupId>
						<artifactId>docker-maven-plugin</artifactId>
						<version>0.26.1</version>
						<inherited>false</inherited>
						<configuration>
							<images>
								<image>
									<name>${image.name}</name>
									<build>
										<cleanup>try</cleanup>
										<dockerFileDir>${basedir}/target/docker-stage</dockerFileDir>
										<tags>
											<tag>${project.version}</tag>
											<tag>${project.version}-STAGING-${maven.build.timestamp}</tag>
											<tag>${project.docker.latesttag.version}</tag>
										</tags>
									</build>
								</image>
							</images>
							<verbose>true</verbose>
						</configuration>
						<executions>
							<execution>
								<id>push-images</id>
								<phase>${docker.build.phase}</phase>
								<goals>
									<goal>build</goal>
									<goal>push</goal>
								</goals>
							</execution>
						</executions>
					</plugin>
				</plugins>
			</build>
		</profile>

	</profiles>
</project>

