<?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</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>
