# ============LICENSE_START=======================================================
# Copyright (c) 2020 Pantheon.tech.
# Modifications Copyright (C) 2021 Bell Canada.
# Modifications Copyright (C) 2022-2025 Nordix Foundation.
# ================================================================================
# Licensed 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.
# ============LICENSE_END=========================================================

services:

  ### docker-compose --profile dmi-service up -d -> run CPS services incl. dmi-plugin ###
  ### docker-compose --profile dmi-stub --profile monitoring up -d -> run CPS with stubbed dmi-plugin (for registration performance testing)
  ### docker-compose --profile dmi-stub --profile tracing up -d -> run CPS with stubbed dmi-plugin (for open telemetry tracing testing make ONAP_TRACING_ENABLED "true" later "http://localhost:16686" can be accessed from browser)
  ### docker-compose --profile dmi-stub --profile policy-executor-stub up -d -> run CPS with stubbed dmi-plugin and policy executor stub (for policy executor service testing make POLICY_SERVICE_ENABLED "true")
  ### to disable notifications make notification.enabled to false & comment out kafka/zookeeper services ###
  ### DEBUG: Look for '### DEBUG' comments to enable CPS-NCMP debugging
  ### docker-compose --profile dmi-stub --project-name endurance --env-file config/endurance.env up -d -> run CPS with stubbed dmi-plugin for endurance testing
  ### docker-compose --profile dmi-stub --project-name endurance down --volumes

  dbpostgresql:
    container_name: ${DB_CONTAINER_NAME:-dbpostgresql}
    image: postgres:14.1-alpine
    ports:
      - ${DB_PORT:-5432}:5432
    environment:
      POSTGRES_DB: cpsdb
      POSTGRES_USER: ${DB_USERNAME:-cps}
      POSTGRES_PASSWORD: ${DB_PASSWORD:-cps}
    volumes:
      - ./config/postgres-init.sql:/docker-entrypoint-initdb.d/postgres-init.sql
    deploy:
      resources:
        reservations:
          cpus: '1'
          memory: 1G
        limits:
          cpus: '6'
          memory: 3G

  cps-and-ncmp:
    image: ${DOCKER_REPO:-nexus3.onap.org:10003}/onap/cps-and-ncmp:${CPS_VERSION:-latest}
    ports:
      - ${CPS_PORT_RANGE:-8698-8699}:8080
      ### DEBUG: Uncomment next line to enable java debugging (ensure 'ports' aligns with 'deploy')
      ### - ${CPS_CORE_DEBUG_PORT:-5005}:5005-
    environment:
      CPS_USERNAME: ${CPS_CORE_USERNAME:-cpsuser}
      CPS_PASSWORD: ${CPS_CORE_PASSWORD:-cpsr0cks!}
      DB_HOST: ${DB_HOST:-dbpostgresql}
      DB_USERNAME: ${DB_USERNAME:-cps}
      DB_PASSWORD: ${DB_PASSWORD:-cps}
      DMI_USERNAME: ${DMI_USERNAME:-cpsuser}
      DMI_PASSWORD: ${DMI_PASSWORD:-cpsr0cks!}
      KAFKA_BOOTSTRAP_SERVER: kafka:29092
      notification.enabled: 'true'
      ONAP_TRACING_ENABLED: 'false'
      ONAP_OTEL_SAMPLER_JAEGER_REMOTE_ENDPOINT: http://jaeger-service:14250
      ONAP_OTEL_EXPORTER_ENDPOINT: http://jaeger-service:4317
      POLICY_SERVICE_ENABLED: 'false'
      POLICY_SERVICE_DEFAULT_DECISION: 'deny from env'
      CPS_MONITORING_MICROMETER_JVM_EXTRAS: 'true'
      JAVA_TOOL_OPTIONS: "-XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0"
      ### DEBUG: Uncomment next line to enable java debugging
      ### JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
    restart: unless-stopped
    depends_on:
      - dbpostgresql
    deploy:
      ### DEBUG: For easier debugging use just 1 instance (also update docker-compose/config/nginx/nginx.conf !)
      replicas: 2
      resources:
        limits:
          cpus: '3'
          memory: 3G

  nginx:
    container_name: ${NGINX_CONTAINER_NAME:-nginx-loadbalancer}
    image: nginx:latest
    ports:
      - ${CPS_CORE_PORT:-8883}:80
    depends_on:
      - cps-and-ncmp
    volumes:
      - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./config/nginx/proxy_params:/etc/nginx/proxy_params

  ### if kafka is not required comment out zookeeper and kafka ###
  zookeeper:
    image: confluentinc/cp-zookeeper:7.8.0
    container_name: ${ZOOKEEPER_CONTAINER_NAME:-zookeeper}
    ports:
      - ${ZOOKEEPER_PORT:-2181}:2181
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181

  kafka:
    image: confluentinc/cp-kafka:7.8.0
    container_name: ${KAFKA_CONTAINER_NAME:-kafka}
    ports:
      - ${KAFKA_PORT:-9092}:9092
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,CONNECTIONS_FROM_HOST:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,CONNECTIONS_FROM_HOST://localhost:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

  ncmp-dmi-plugin:
    container_name: ${NCMP_DMI_PLUGIN_CONTAINER_NAME:-ncmp-dmi-plugin}
    image: ${DOCKER_REPO:-nexus3.onap.org:10003}/onap/ncmp-dmi-plugin:${DMI_VERSION:-1.6.0-SNAPSHOT-latest}
    ports:
      - ${DMI_PORT:-8783}:8080
    environment:
      CPS_USERNAME: ${CPS_CORE_USERNAME:-cpsuser}
      CPS_PASSWORD: ${CPS_CORE_PASSWORD:-cpsr0cks!}
      CPS_CORE_HOST: ${CPS_CORE_HOST:-cps-and-ncmp}
      CPS_CORE_PORT: ${CPS_CORE_PORT:-8080}
      CPS_CORE_USERNAME: ${CPS_CORE_USERNAME:-cpsuser}
      CPS_CORE_PASSWORD: ${CPS_CORE_PASSWORD:-cpsr0cks!}
      SDNC_HOST: ${SDNC_HOST:-sdnc}
      SDNC_PORT: ${SDNC_PORT:-8181}
      SDNC_USERNAME: ${SDNC_USERNAME:-admin}
      SDNC_PASSWORD: ${SDNC_PASSWORD:-Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U}
      DMI_SERVICE_URL: ${DMI_SERVICE_URL:-http://ncmp-dmi-plugin:8783}
      DMI_SERVICE_NAME: ${DMI_SERVICE_NAME:-dminame1}
      DMI_USERNAME: ${DMI_USERNAME:-cpsuser}
      DMI_PASSWORD: ${DMI_PASSWORD:-cpsr0cks!}
      KAFKA_BOOTSTRAP_SERVER: kafka:29092
    restart: unless-stopped
    profiles:
      - dmi-service

  ncmp-dmi-plugin-demo-and-csit-stub:
    container_name: ${NCMP_DMI_PLUGIN_DEMO_AND_CSIT_STUB_CONTAINER_NAME:-ncmp-dmi-plugin-demo-and-csit-stub}
    image: ${DOCKER_REPO:-nexus3.onap.org:10003}/onap/dmi-stub:${DMI_DEMO_STUB_VERSION:-latest}
    ports:
      - ${DMI_DEMO_STUB_PORT:-8784}:8092
    environment:
      KAFKA_BOOTSTRAP_SERVER: kafka:29092
      NCMP_CONSUMER_GROUP_ID: ncmp-group
      NCMP_ASYNC_M2M_TOPIC: ncmp-async-m2m
      MODULE_INITIAL_PROCESSING_DELAY_MS: 180000
      MODULE_REFERENCES_DELAY_MS: 100
      MODULE_RESOURCES_DELAY_MS: 1000
      READ_DATA_FOR_CM_HANDLE_DELAY_MS: 300
      WRITE_DATA_FOR_CM_HANDLE_DELAY_MS: 670
    restart: unless-stopped
    profiles:
      - dmi-stub
      - dmi-service

  policy-executor-stub:
    container_name: ${POLICY_EXECUTOR_STUB_CONTAINER_NAME:-policy-executor-stub}
    image: ${DOCKER_REPO:-nexus3.onap.org:10003}/onap/policy-executor-stub:latest
    ports:
      - ${POLICY_EXECUTOR_STUB_PORT:-8785}:8093
    restart: unless-stopped
    profiles:
      - policy-executor-stub

  prometheus:
    container_name: ${PROMETHEUS_CONTAINER_NAME:-prometheus}
    image: prom/prometheus:latest
    ports:
      - ${PROMETHEUS_PORT:-9090}:9090
    restart: always
    volumes:
      - ./config/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    environment:
      - PROMETHEUS_RETENTION_TIME=${PROMETHEUS_RETENTION_TIME:-30d}
    healthcheck:
      test: [ "CMD-SHELL", "wget --spider --quiet --tries=1 --timeout=10 http://localhost:9090/-/healthy || exit 1" ]
      interval: 30s
      timeout: 10s
      retries: 3
    profiles:
      - monitoring

  grafana:
    image: grafana/grafana:latest
    container_name: ${GRAFANA_CONTAINER_NAME:-grafana}
    depends_on:
      prometheus:
        condition: service_started
    ports:
      - ${GRAFANA_PORT:-3000}:3000
    volumes:
      - ./config/grafana/provisioning/:/etc/grafana/provisioning/
      - ./config/grafana/jvm-micrometer-dashboard.json:/var/lib/grafana/dashboards/jvm-micrometer-dashboard.json
      - ./config/grafana/inventory-dashboard.json:/var/lib/grafana/dashboards/inventory-dashboard.json
      - ./config/grafana/data-dashboard.json:/var/lib/grafana/dashboards/data-dashboard.json
      - ./config/grafana/postgresql-statistics-dashboard.json:/var/lib/grafana/dashboards/postgresql-statistics-dashboard.json
      - ./config/grafana/cps-database-pool.json:/var/lib/grafana/dashboards/cps-database-pool.json
      - grafana:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_SERVER_DOMAIN=localhost
    profiles:
      - monitoring

  kafka-ui:
    container_name: ${KAFKA_UI_CONTAINER_NAME:-kafka-ui}
    image: provectuslabs/kafka-ui:latest
    ports:
      - ${KAFKA_UI_PORT:-8089}:8080
    environment:
      DYNAMIC_CONFIG_ENABLED: 'true'
      KAFKA_CLUSTERS_0_NAME: 'cps-kafka-local'
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:29092
    profiles:
      - monitoring

  jaeger-service:
    container_name: ${JAEGER_SERVICE_CONTAINER_NAME:-jaeger-service}
    image: jaegertracing/all-in-one:latest
    ports:
      - ${JAEGER_SERVICE_PORT:-16686}:16686
    restart: unless-stopped
    profiles:
      - tracing

  postgres-exporter:
    image: quay.io/prometheuscommunity/postgres-exporter
    environment:
      - DATA_SOURCE_NAME=postgresql://${DB_USERNAME:-cps}:${DB_PASSWORD:-cps}@${DB_CONTAINER_NAME:-dbpostgresql}:5432/postgres?sslmode=disable
    ports:
      - ${POSTGRES_EXPORTER_PORT_RANGE:-9187-9188}:9187
    depends_on:
      - dbpostgresql
    profiles:
      - monitoring

volumes:
  grafana:
    driver: local
  prometheus_data:
    driver: local