<?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.skywalking.plugin.nginx-lua</groupId>
        <artifactId>e2e-test</artifactId>
        <version>1.0.0</version>
    </parent>
    
    <artifactId>kong</artifactId>
    <packaging>jar</packaging>
    
    <build>
        <plugins>
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <configuration>
                    <autoCreateCustomNetworks>true</autoCreateCustomNetworks>
                    <images>
                        <image>
                            <name>postgres:9.6</name>
                            <alias>kong-database</alias>
                            <run>
                                <env>
                                    <POSTGRES_DB>kong</POSTGRES_DB>
                                    <POSTGRES_USER>kong</POSTGRES_USER>
                                    <POSTGRES_PASSWORD>kong</POSTGRES_PASSWORD>
                                </env>
                                <hostname>kong-database</hostname>
                                <ports>
                                    <port>+pg.host:pg.port:5432</port>
                                </ports>
                                <wait>
                                    <log>.*PostgreSQL init process complete; ready for start up.*</log>
                                </wait>
                                <net>custom</net>
                            </run>
                        </image>
                        <image>
                            <name>skywalking-collector:${project.version}</name>
                            <alias>skywalking-collector</alias>
                            <run>
                                <ports>
                                    <port>+collector.host:collector.port:12800</port>
                                </ports>
                                <wait>
                                    <http>
                                        <url>http://${docker.host.address}:${collector.port}/receiveData</url>
                                    </http>
                                    <time>30000</time>
                                </wait>
                                <net>custom</net>
                                <hostname>skywalking-collector</hostname>
                            </run>
                        </image>
                        <image>
                            <name>kong:2.3.3-centos</name>
                            <alias>kong-with-skywalking</alias>
                            <run>
                                <volumes>
                                    <bind>
                                        <volume>${project.basedir}/docker:/docker</volume>
                                        <volume>${project.basedir}/../../../..:/skywalking-nginx-lua</volume>
                                    </bind>
                                </volumes>
                                <ports>
                                    <port>kong.port:8000</port>
                                    <port>admin.port:8001</port>
                                </ports>
                                <env>
                                    <KONG_DATABASE>postgres</KONG_DATABASE>
                                    <KONG_PG_HOST>kong-database</KONG_PG_HOST>
                                    <KONG_PG_PASSWORD>kong</KONG_PG_PASSWORD>
                                    <KONG_CASSANDRA_CONTACT_POINTS>kong-database</KONG_CASSANDRA_CONTACT_POINTS>
                                    <KONG_NGINX_HTTP_LUA_SHARED_DICT>tracing_buffer 128m
                                    </KONG_NGINX_HTTP_LUA_SHARED_DICT>
                                    <KONG_ADMIN_LISTEN>0.0.0.0:8001, 0.0.0.0:8444 ssl</KONG_ADMIN_LISTEN>
                                </env>
                                <net>custom</net>
                                <dependsOn>
                                    <container>kong-database</container>
                                    <container>skywalking-collector</container>
                                </dependsOn>
                                <links>
                                    <link>kong-database</link>
                                </links>
                                <wait>
                                    <http>
                                        <url>
                                            http://${docker.host.address}:${admin.port}
                                        </url>
                                    </http>
                                    <time>1800000</time>
                                </wait>
                                <cmd>/docker/entrypoint.sh</cmd>
                            </run>
                        </image>
                    </images>
                </configuration>
            </plugin>
    
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>${maven-failsafe-plugin.version}</version>
                <configuration>
                    <systemPropertyVariables>
                        <kong.admin.baseURL>http://${docker.host.address}:${admin.port}</kong.admin.baseURL>
                        <service.entry>http://${docker.host.address}:${kong.port}/mock</service.entry>
                        <collector.baseURL>http://${collector.host}:${collector.port}</collector.baseURL>
                        <collector.in.baseURL>http://skywalking-collector:12800</collector.in.baseURL>
                    </systemPropertyVariables>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
