#  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.

services:

  gremlin-server-test-python:
    container_name: gremlin-server-test-python
    image: tinkerpop:gremlin-server-test-${GREMLIN_SERVER}
    hostname: gremlin-server-test
    build:
      context: ../
      dockerfile: docker/gremlin-test-server/Dockerfile
      args:
        - GREMLIN_SERVER=${GREMLIN_SERVER}
    ports:
      - "45940:45940"
      - "45941:45941"
      - "45942:45942"
      - "4588:4588"
    volumes:
      - ${HOME}/.groovy:/root/.groovy
      - ${HOME}/.m2:/root/.m2
      - ${ABS_PROJECT_HOME}/gremlin-test/target:/opt/gremlin-test
    healthcheck:
      test: [ "CMD-SHELL", "apk add curl && curl -f http://localhost:45940?gremlin=100-1" ]
      interval: 30s
      timeout: 10s
      retries: 30
      start_period: 30s
    depends_on:
      - gremlin-socket-server

  gremlin-python-integration-tests:
    container_name: gremlin-python-integration-tests
    image: python:3.9
    volumes:
      - ${BUILD_DIR:-./src/main/python}:/python_app
      - ../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features:/python_app/gremlin-test/features
      - ../docker/gremlin-test-server:/python_app/gremlin-test-server
      - ../gremlin-tools/gremlin-socket-server/conf:/python_app/gremlin-socket-server/conf/

    environment:
      - DEBIAN_FRONTEND=noninteractive
      - KRB5_CONFIG=./gremlin-test-server/krb5.conf
      - KRB5CCNAME=./test-tkt.cc
      - GREMLIN_SERVER_URL=ws://gremlin-server-test-python:{}/gremlin
      - GREMLIN_SERVER_BASIC_AUTH_URL=wss://gremlin-server-test-python:{}/gremlin
      - GREMLIN_SERVER_URL_HTTP=http://gremlin-server-test-python:{}/
      - GREMLIN_SERVER_BASIC_AUTH_URL_HTTP=https://gremlin-server-test-python:{}/
      - KRB_HOSTNAME=${KRB_HOSTNAME:-gremlin-server-test}
      - GREMLIN_SOCKET_SERVER_URL=ws://gremlin-socket-server-python:{}/gremlin
      - GREMLIN_SOCKET_SERVER_CONFIG_PATH=/python_app/gremlin-socket-server/conf/test-ws-gremlin.yaml
    working_dir: /python_app
    command: >
      bash -c "apt-get update && apt-get -y install libkrb5-dev krb5-user
      && echo 'password' | kinit stephen
      && klist
      && pip install .[test,kerberos]
      && pytest
      && radish -f dots -e -t -b ./radish ./gremlin-test --user-data='serializer=application/vnd.gremlin-v3.0+json'
      && radish -f dots -e -t -b ./radish ./gremlin-test --user-data='serializer=application/vnd.graphbinary-v1.0';
      EXIT_CODE=$$?; chown -R `stat -c "%u:%g" .` .; exit $$EXIT_CODE"
    depends_on:
      gremlin-server-test-python:
        condition: service_healthy

  gremlin-python-package:
    container_name: gremlin-python-package
    image: python:3.9
    volumes:
      - ${PACKAGE_DIR:-./src/main/python}:/python_package
    working_dir: /python_package
    command: >
      bash -c "pip install build && python -m build;
      EXIT_CODE=$$?; chown -R `stat -c "%u:%g" .` .; exit $$EXIT_CODE"

  gremlin-socket-server:
    container_name: gremlin-socket-server-python
    image: tinkerpop/gremlin-socket-server:${GREMLIN_SERVER}
    ports:
      - "45943:45943"
