---
apiVersion: v1
kind: Namespace
metadata:
  name: ${APP_NAMESPACE}
  labels:
    mesh: ${MESH_NAME}
    gateway: ingress-gw
    appmesh.k8s.aws/sidecarInjectorWebhook: enabled
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: Mesh
metadata:
  name: ${MESH_NAME}
spec:
  namespaceSelector:
    matchLabels:
      mesh: ${MESH_NAME}
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualGateway
metadata:
  name: ingress-gw
  namespace: ${APP_NAMESPACE}
spec:
  namespaceSelector:
    matchLabels:
      gateway: ingress-gw
  podSelector:
    matchLabels:
      app: ingress-gw
  listeners:
    - portMapping:
        port: 8088
        protocol: http
      connectionPool:
        http:
          maxConnections: 5
          maxPendingRequests: 5
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: GatewayRoute
metadata:
  name: gateway-route-paths
  namespace: ${APP_NAMESPACE}
spec:
  httpRoute:
    match:
      prefix: "/paths"
    action:
      target:
        virtualService:
          virtualServiceRef:
            name: color-paths
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualNode
metadata:
  name: red
  namespace: ${APP_NAMESPACE}
spec:
  podSelector:
    matchLabels:
      app: color
      version: red
  listeners:
    - portMapping:
        port: 8080
        protocol: http
      healthCheck:
        protocol: http
        path: '/ping'
        healthyThreshold: 2
        unhealthyThreshold: 2
        timeoutMillis: 2000
        intervalMillis: 5000
  serviceDiscovery:
    dns:
      hostname: color-red.${APP_NAMESPACE}.svc.cluster.local
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualNode
metadata:
  name: green
  namespace: ${APP_NAMESPACE}
spec:
  podSelector:
    matchLabels:
      app: color
      version: green
  listeners:
    - portMapping:
        port: 8080
        protocol: http
      healthCheck:
        protocol: http
        path: '/ping'
        healthyThreshold: 2
        unhealthyThreshold: 2
        timeoutMillis: 2000
        intervalMillis: 5000
      connectionPool:
        http:
          maxConnections: 10
          maxPendingRequests: 10
  serviceDiscovery:
    dns:
      hostname: color-green.${APP_NAMESPACE}.svc.cluster.local
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualService
metadata:
  name: color-paths
  namespace: ${APP_NAMESPACE}
spec:
  awsName: color-paths.${APP_NAMESPACE}.svc.cluster.local
  provider:
    virtualRouter:
      virtualRouterRef:
        name: color-paths
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualRouter
metadata:
  namespace: ${APP_NAMESPACE}
  name: color-paths
spec:
  listeners:
    - portMapping:
        port: 8080
        protocol: http
  routes:
    - name: color-route-green
      priority: 20
      httpRoute:
        match:
          prefix: /green
        action:
          weightedTargets:
            - virtualNodeRef:
                name: green
              weight: 1
    - name: color-route-red
      priority: 30
      httpRoute:
        match:
          prefix: /red
        action:
          weightedTargets:
            - virtualNodeRef:
                name: red
              weight: 1
---
apiVersion: v1
kind: Service
metadata:
  name: color-green
  namespace: ${APP_NAMESPACE}
spec:
  ports:
    - port: 8080
      name: http
  selector:
    app: color
    version: green
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: green
  namespace: ${APP_NAMESPACE}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: color
      version: green
  template:
    metadata:
      labels:
        app: color
        version: green
    spec:
      containers:
        - name: app
          imagePullPolicy: Always
          image: ${COLOR_APP_IMAGE}
          ports:
            - containerPort: 8080
          env:
            - name: "COLOR"
              value: "green"
---
apiVersion: v1
kind: Service
metadata:
  name: color-red
  namespace: ${APP_NAMESPACE}
spec:
  ports:
    - port: 8080
      name: http
  selector:
    app: color
    version: red
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: red
  namespace: ${APP_NAMESPACE}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: color
      version: red
  template:
    metadata:
      labels:
        app: color
        version: red
    spec:
      containers:
        - name: app
          imagePullPolicy: Always
          image: ${COLOR_APP_IMAGE}
          ports:
            - containerPort: 8080
          env:
            - name: "COLOR"
              value: "red"
---
apiVersion: v1
kind: Service
metadata:
  name: color-paths
  namespace: ${APP_NAMESPACE}
spec:
  ports:
    - port: 8080
      name: http
---
apiVersion: v1
kind: Service
metadata:
  name: ingress-gw
  namespace: ${APP_NAMESPACE}
spec:
  ports:
    - port: 80
      targetPort: 8088
      name: http
  selector:
    app: ingress-gw
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ingress-gw
  namespace: ${APP_NAMESPACE}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ingress-gw
  template:
    metadata:
      labels:
        app: ingress-gw
    spec:
      containers:
        - name: envoy
          image: controller-override
          ports:
            - containerPort: 8088
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fortio
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fortio
  template:
    metadata:
      labels:
        app: fortio
    spec:
      containers:
      - args:
        image: fortio/fortio
        name: fortio
        stdin: true
        tty: true