<?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>
    <artifactId>demo-parent</artifactId>
    <groupId>org.apache.servicecomb.demo</groupId>
    <version>2.7.5</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>docker-run-config</artifactId>
  <name>Java Chassis::Demo::Docker Run Config</name>

  <packaging>pom</packaging>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>io.fabric8</groupId>
          <artifactId>docker-maven-plugin</artifactId>
          <configuration>
            <images>
              <image>
                <name>servicecomb/service-center</name>
                <alias>service-center</alias>
                <run>
                  <wait>
                    <log>server is ready</log>
                    <tcp>
                      <ports>
                        <port>30100</port>
                      </ports>
                    </tcp>
                    <time>60000</time>
                  </wait>
                  <ports>
                    <port>30100:30100</port>
                  </ports>
                </run>
              </image>
              <image>
                <name>${demo.service.name}:${project.version}</name>
                <alias>${demo.service.name}</alias>
                <run>
                  <env>
                    <JAVA_OPTS>
                      -Dservicecomb.service.registry.address=http://sc.servicecomb.io:30100 -Dservicecomb.service.publishAddress=${docker.hostname}
                    </JAVA_OPTS>
                    <JAR_PATH>/maven/maven/${demo.service.name}-${project.version}.jar</JAR_PATH>
                  </env>
                  <links>
                    <link>service-center:sc.servicecomb.io</link>
                  </links>
                  <wait>
                    <log>Register microservice instance success</log>
                    <!--
                        the log waiting of the plugin has a bug and fails frequently
                        refer to https://github.com/fabric8io/docker-maven-plugin/issues/767
                        this http checking is used as a temporary solution
                    -->

                    <tcp>
                      <ports>
                        <port>8080</port>
                      </ports>
                    </tcp>
                    <time>120000</time>
                  </wait>
                  <ports>
                    <port>7070:7070</port>
                    <port>8080:8080</port>
                  </ports>
                  <dependsOn>
                    <container>service-center</container>
                  </dependsOn>
                </run>
              </image>
            </images>
          </configuration>
          <executions>
            <execution>
              <id>start</id>
              <phase>pre-integration-test</phase>
              <goals>
                <goal>start</goal>
              </goals>
            </execution>
            <execution>
              <id>stop</id>
              <phase>post-integration-test</phase>
              <goals>
                <goal>stop</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <profiles>
    <profile>
      <id>docker</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId>
            <artifactId>gmaven-plugin</artifactId>
            <executions>
              <execution>
                <id>add-default-properties</id>
                <phase>initialize</phase>
                <goals>
                  <goal>execute</goal>
                </goals>
                <configuration>
                  <source>
                    project.properties.setProperty('docker.hostname', 'localhost')
                    log.info("Docker hostname is " + project.properties['docker.hostname'])
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
              <systemPropertyVariables>
                <servicecomb.service.registry.address>http://${docker.hostname}:30100</servicecomb.service.registry.address>
              </systemPropertyVariables>
              <argLine>${jacoco.failsafe.argLine}</argLine>
            </configuration>
            <executions>
              <execution>
                <goals>
                  <goal>integration-test</goal>
                  <goal>verify</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>docker-machine</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId>
            <artifactId>gmaven-plugin</artifactId>
            <executions>
              <execution>
                <id>add-dynamic-properties</id>
                <phase>prepare-package</phase>
                <goals>
                  <goal>execute</goal>
                </goals>
                <configuration>
                  <source>
                    def process = "docker-machine ip default".execute()
                    process.waitFor()
                    project.properties.setProperty('docker.hostname', process.in.text.trim())

                    log.info("Docker hostname is " + project.properties['docker.hostname'])
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>
