<?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.8.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>docker-run-config-edge</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>authentication:${project.version}</name>
                <alias>authentication</alias>
                <run>
                  <env>
                    <JAVA_OPTS>
                      -Dservicecomb.service.registry.address=http://sc.servicecomb.io:30100
                    </JAVA_OPTS>
                    <JAR_PATH>/maven/maven/authentication-${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>7070</port>
                      </ports>
                    </tcp>
                    <time>120000</time>
                  </wait>
                  <ports>
                    <port>7070:7070</port>
                  </ports>
                  <dependsOn>
                    <container>service-center</container>
                  </dependsOn>
                </run>
              </image>
              <image>
                <name>business-1-0-0:${project.version}</name>
                <alias>business-1-0-0</alias>
                <run>
                  <env>
                    <JAVA_OPTS>
                      -Dservicecomb.service.registry.address=http://sc.servicecomb.io:30100
                    </JAVA_OPTS>
                    <JAR_PATH>/maven/maven/business-1-0-0-${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>8080:8080</port>
                  </ports>
                  <dependsOn>
                    <container>service-center</container>
                  </dependsOn>
                </run>
              </image>
              <image>
                <name>business-1-1-0:${project.version}</name>
                <alias>business-1-1-0</alias>
                <run>
                  <env>
                    <JAVA_OPTS>
                      -Dservicecomb.service.registry.address=http://sc.servicecomb.io:30100
                    </JAVA_OPTS>
                    <JAR_PATH>/maven/maven/business-1-1-0-${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>8090</port>
                      </ports>
                    </tcp>
                    <time>120000</time>
                  </wait>
                  <ports>
                    <port>8090:8090</port>
                  </ports>
                  <dependsOn>
                    <container>service-center</container>
                  </dependsOn>
                </run>
              </image>
              <image>
                <name>business-2-0-0:${project.version}</name>
                <alias>business-2-0-0</alias>
                <run>
                  <env>
                    <JAVA_OPTS>
                      -Dservicecomb.service.registry.address=http://sc.servicecomb.io:30100
                    </JAVA_OPTS>
                    <JAR_PATH>/maven/maven/business-2-0-0-${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>8091</port>
                      </ports>
                    </tcp>
                    <time>120000</time>
                  </wait>
                  <ports>
                    <port>8091:8091</port>
                  </ports>
                  <dependsOn>
                    <container>service-center</container>
                  </dependsOn>
                </run>
              </image>
              <image>
                <name>edge-service:${project.version}</name>
                <alias>edge-service</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/edge-service-${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>18080</port>
                      </ports>
                    </tcp>
                    <time>120000</time>
                  </wait>
                  <ports>
                    <port>18080:18080</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>
            <version>2.19.1</version>
            <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>
