# VirtualService — 2단 라우팅으로 edition.cnn.com 외부 호출을 egress gateway에 강제 경유.
#   1단) mesh(sidecar) → egress gateway(subset cnn). 메시 mTLS 래핑/SNI는 DR이 담당.
#   2단) egress gateway(server egress-cnn, 15443 listener) → 외부 edition.cnn.com:443
#
# ⚠️ leg별 라우트 타입이 다른 이유(핵심):
#   1단은 sidecar가 종단 안 함(앱 SNI로 라우팅 결정) → tls/sniHosts.
#   2단은 게이트웨이가 ISTIO_MUTUAL로 메시 mTLS를 *종단*함. 종단된 listener에 tls/sniHosts
#     라우트를 걸면 network filter가 안 생겨 listener가 통째로 omit된다("0 chains").
#     종단 후 내부(앱 TLS) 바이트를 그대로 흘리려면 tcp 라우트(tcp_proxy)로 받아야 한다.
#     → 게이트웨이는 외부 메시 mTLS만 풀고 SPIFFE 검증, 내부 앱 TLS는 cnn:443까지 end-to-end.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: egress-cnn
  namespace: mesh-test
spec:
  hosts:
    - edition.cnn.com
  gateways:
    - mesh              # sidecar에서 발생하는 트래픽 (1단)
    - egress-cnn        # egress gateway에서 발생하는 트래픽 (2단)
  tls:
    # 1단: sidecar → egress gateway (subset cnn, DR이 ISTIO_MUTUAL+sni 적용)
    #   match port 443 = 앱이 cnn:443로 연결. destination port 15443 = egress gw 수신.
    - match:
        - gateways: [mesh]
          port: 443
          sniHosts: [edition.cnn.com]
      route:
        - destination:
            host: istio-egressgateway.istio-system.svc.cluster.local
            subset: cnn
            port:
              number: 15443
  tcp:
    # 2단: egress gateway가 메시 mTLS 종단 후 → 내부 앱 TLS를 tcp_proxy로 cnn:443에 전달.
    #   종단 listener라 SNI는 이미 소비됨 → 포트 매칭만(이 listener에 호스트 1개라 충분).
    - match:
        - gateways: [egress-cnn]
          port: 15443
      route:
        - destination:
            host: edition.cnn.com
            port:
              number: 443
          weight: 100
