networks:
  fips-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24
  gateway-lan:
    driver: bridge
    enable_ipv6: true
    ipam:
      config:
        - subnet: 172.20.1.0/24
        - subnet: fd02::/64

x-fips-common: &fips-common
  image: fips-test:latest
  cap_add:
    - NET_ADMIN
  devices:
    - /dev/net/tun:/dev/net/tun
  sysctls:
    - net.ipv6.conf.all.disable_ipv6=0
  restart: "no"
  env_file:
    - ./generated-configs/npubs.env
  environment:
    - RUST_LOG=info

services:
  # ── Mesh topology ──────────────────────────────────────────────
  node-a:
    <<: *fips-common
    profiles: ["mesh"]
    container_name: fips-node-a
    hostname: node-a
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/mesh/node-a.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.10

  node-b:
    <<: *fips-common
    profiles: ["mesh"]
    container_name: fips-node-b
    hostname: node-b
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/mesh/node-b.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.11

  node-c:
    <<: *fips-common
    profiles: ["mesh"]
    container_name: fips-node-c
    hostname: node-c
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/mesh/node-c.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.12

  node-d:
    <<: *fips-common
    profiles: ["mesh"]
    container_name: fips-node-d
    hostname: node-d
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/mesh/node-d.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.13

  node-e:
    <<: *fips-common
    profiles: ["mesh"]
    container_name: fips-node-e
    hostname: node-e
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/mesh/node-e.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.14

  # ── Mesh-public topology (mesh + external public node) ────────
  pub-a:
    <<: *fips-common
    profiles: ["mesh-public"]
    container_name: fips-node-a
    hostname: node-a
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/mesh-public/node-a.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.10

  pub-b:
    <<: *fips-common
    profiles: ["mesh-public"]
    container_name: fips-node-b
    hostname: node-b
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/mesh-public/node-b.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.11

  pub-c:
    <<: *fips-common
    profiles: ["mesh-public"]
    container_name: fips-node-c
    hostname: node-c
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/mesh-public/node-c.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.12

  pub-d:
    <<: *fips-common
    profiles: ["mesh-public"]
    container_name: fips-node-d
    hostname: node-d
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/mesh-public/node-d.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.13

  pub-e:
    <<: *fips-common
    profiles: ["mesh-public"]
    container_name: fips-node-e
    hostname: node-e
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/mesh-public/node-e.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.14

  # ── Chain topology (A-B-C-D-E) ────────────────────────────────
  chain-a:
    <<: *fips-common
    profiles: ["chain"]
    container_name: fips-node-a
    hostname: node-a
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/chain/node-a.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.10

  chain-b:
    <<: *fips-common
    profiles: ["chain"]
    container_name: fips-node-b
    hostname: node-b
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/chain/node-b.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.11

  chain-c:
    <<: *fips-common
    profiles: ["chain"]
    container_name: fips-node-c
    hostname: node-c
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/chain/node-c.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.12

  chain-d:
    <<: *fips-common
    profiles: ["chain"]
    container_name: fips-node-d
    hostname: node-d
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/chain/node-d.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.13

  chain-e:
    <<: *fips-common
    profiles: ["chain"]
    container_name: fips-node-e
    hostname: node-e
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/chain/node-e.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.14

  # ── Rekey integration test (mesh + aggressive rekey timers) ──
  rekey-a:
    <<: *fips-common
    profiles: ["rekey"]
    container_name: fips-node-a
    hostname: node-a
    environment:
      - RUST_LOG=info,fips::node::handlers::rekey=debug
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/rekey/node-a.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.10

  rekey-b:
    <<: *fips-common
    profiles: ["rekey"]
    container_name: fips-node-b
    hostname: node-b
    environment:
      - RUST_LOG=info,fips::node::handlers::rekey=debug
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/rekey/node-b.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.11

  rekey-c:
    <<: *fips-common
    profiles: ["rekey"]
    container_name: fips-node-c
    hostname: node-c
    environment:
      - RUST_LOG=info,fips::node::handlers::rekey=debug
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/rekey/node-c.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.12

  rekey-d:
    <<: *fips-common
    profiles: ["rekey"]
    container_name: fips-node-d
    hostname: node-d
    environment:
      - RUST_LOG=info,fips::node::handlers::rekey=debug
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/rekey/node-d.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.13

  rekey-e:
    <<: *fips-common
    profiles: ["rekey"]
    container_name: fips-node-e
    hostname: node-e
    environment:
      - RUST_LOG=info,fips::node::handlers::rekey=debug
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/rekey/node-e.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.14

  # ── TCP chain topology (A-B-C) ───────────────────────────────
  tcp-a:
    <<: *fips-common
    profiles: ["tcp-chain"]
    container_name: fips-node-a
    hostname: node-a
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/tcp-chain/node-a.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.10

  tcp-b:
    <<: *fips-common
    profiles: ["tcp-chain"]
    container_name: fips-node-b
    hostname: node-b
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/tcp-chain/node-b.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.11

  tcp-c:
    <<: *fips-common
    profiles: ["tcp-chain"]
    container_name: fips-node-c
    hostname: node-c
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/tcp-chain/node-c.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.12

  # ── Gateway integration test (gateway + server + non-FIPS client) ─
  gw-gateway:
    <<: *fips-common
    profiles: ["gateway"]
    container_name: fips-gw-gateway
    hostname: gw-gateway
    # Privileged required: gateway must enable IPv6 on eth1 (second network,
    # attached after container start) and manage nftables NAT rules.
    privileged: true
    environment:
      - RUST_LOG=info
      - FIPS_TEST_MODE=gateway
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=0
      - net.ipv6.conf.default.disable_ipv6=0
      - net.ipv6.conf.all.forwarding=1
      - net.ipv6.conf.all.proxy_ndp=1
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/gateway/node-a.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.10
      gateway-lan:
        ipv4_address: 172.20.1.10
        ipv6_address: fd02::10

  gw-server:
    <<: *fips-common
    profiles: ["gateway"]
    container_name: fips-gw-server
    hostname: gw-server
    volumes:
      - ../docker/resolv.conf:/etc/resolv.conf:ro
      - ./generated-configs/gateway/node-b.yaml:/etc/fips/fips.yaml:ro
    networks:
      fips-net:
        ipv4_address: 172.20.0.11

  gw-client:
    image: fips-test-app:latest
    profiles: ["gateway"]
    container_name: fips-gw-client
    hostname: gw-client
    cap_add:
      - NET_ADMIN
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=0
    volumes:
      - ./configs/gateway-resolv.conf:/etc/resolv.conf:ro
    networks:
      gateway-lan:
        ipv4_address: 172.20.1.20
        ipv6_address: fd02::20
    restart: "no"
    env_file:
      - ./generated-configs/npubs.env
