---
apiVersion: v1
kind: Namespace
metadata:
  labels:
    appmesh.k8s.aws/sidecarInjectorWebhook: enabled
  name: ${APP_NAMESPACE}
---
apiVersion: appmesh.k8s.aws/v1beta1
kind: Mesh
metadata:
  name: ${MESH_NAME}
---
apiVersion: appmesh.k8s.aws/v1beta1
kind: VirtualNode
metadata:
  name: client
  namespace: ${APP_NAMESPACE}
spec:
  meshName: ${MESH_NAME}
  listeners:
    - portMapping:
        port: 8080
        protocol: http
  backends:
    - virtualService:
        virtualServiceName: color.${CLOUDMAP_NAMESPACE}
  serviceDiscovery:
    cloudMap:
      namespaceName: ${CLOUDMAP_NAMESPACE}
      serviceName: client
---
apiVersion: appmesh.k8s.aws/v1beta1
kind: VirtualNode
metadata:
  name: red
  namespace: ${APP_NAMESPACE}
spec:
  meshName: ${MESH_NAME}
  listeners:
    - portMapping:
        port: 8080
        protocol: http2
      healthCheck:
        port: 8080
        protocol: http2
        path: '/ping'
        healthyThreshold: 2
        unhealthyThreshold: 3
        timeoutMillis: 2000
        intervalMillis: 5000
  serviceDiscovery:
    cloudMap:
      namespaceName: ${CLOUDMAP_NAMESPACE}
      serviceName: color
---
apiVersion: appmesh.k8s.aws/v1beta1
kind: VirtualNode
metadata:
  name: blue
  namespace: ${APP_NAMESPACE}
spec:
  meshName: ${MESH_NAME}
  listeners:
    - portMapping:
        port: 8080
        protocol: http2
      healthCheck:
        port: 8080
        protocol: http2
        path: '/ping'
        healthyThreshold: 2
        unhealthyThreshold: 3
        timeoutMillis: 2000
        intervalMillis: 5000
  serviceDiscovery:
    cloudMap:
      namespaceName: ${CLOUDMAP_NAMESPACE}
      serviceName: color
---
apiVersion: appmesh.k8s.aws/v1beta1
kind: VirtualNode
metadata:
  name: green
  namespace: ${APP_NAMESPACE}
spec:
  meshName: ${MESH_NAME}
  listeners:
    - portMapping:
        port: 8080
        protocol: http2
      healthCheck:
        port: 8080
        protocol: http2
        path: '/ping'
        healthyThreshold: 2
        unhealthyThreshold: 3
        timeoutMillis: 2000
        intervalMillis: 5000
  serviceDiscovery:
    cloudMap:
      namespaceName: ${CLOUDMAP_NAMESPACE}
      serviceName: color
---
apiVersion: appmesh.k8s.aws/v1beta1
kind: VirtualService
metadata:
  name: color.${CLOUDMAP_NAMESPACE}
  namespace: ${APP_NAMESPACE}
spec:
  meshName: ${MESH_NAME}
  virtualRouter:
    name: virtual-router
    listeners:
      - portMapping:
          port: 8080
          protocol: http2
  routes:
    - name: color-route-red
      http2:
        match:
          prefix: /
        action:
          weightedTargets:
            - virtualNodeName: red-${APP_NAMESPACE}
              weight: 1
            - virtualNodeName: blue-${APP_NAMESPACE}
              weight: 1
            - virtualNodeName: green-${APP_NAMESPACE}
              weight: 1
---
apiVersion: v1
kind: Service
metadata:
  name: client
  namespace: ${APP_NAMESPACE}
  labels:
    app: client
spec:
  ports:
    - port: 8080
      name: http
  selector:
    app: client
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: client
  namespace: ${APP_NAMESPACE}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: client
  template:
    metadata:
      annotations:
        appmesh.k8s.aws/mesh: ${MESH_NAME}
      labels:
        app: client
    spec:
      containers:
        - name: app
          image: ${CLIENT_APP_IMAGE}
          ports:
            - containerPort: 8080
          env:
            - name: "COLOR_HOST"
              value: "color.${APP_NAMESPACE}.svc.cluster.local:8080"
            - name: "PORT"
              value: "8080"
---
apiVersion: v1
kind: Service
metadata:
  name: red
  namespace: ${APP_NAMESPACE}
  labels:
    app: color
    version: red
spec:
  ports:
    - port: 8080
      name: http
  selector:
    app: color
    version: red
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: red
  namespace: ${APP_NAMESPACE}
  labels:
    app: color
    version: red
spec:
  replicas: 1
  selector:
    matchLabels:
      app: color
      version: red
  template:
    metadata:
      annotations:
        appmesh.k8s.aws/mesh: ${MESH_NAME}
      labels:
        app: color
        version: red
    spec:
      containers:
        - name: app
          image: ${COLOR_APP_IMAGE}
          ports:
            - containerPort: 8080
          env:
            - name: "COLOR"
              value: "red"
            - name: "PORT"
              value: "8080"
---
apiVersion: v1
kind: Service
metadata:
  name: blue
  namespace: ${APP_NAMESPACE}
  labels:
    app: color
    version: blue
spec:
  ports:
    - port: 8080
      name: http
  selector:
    app: color
    version: blue
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: blue
  namespace: ${APP_NAMESPACE}
  labels:
    app: color
    version: blue
spec:
  replicas: 1
  selector:
    matchLabels:
      app: color
      version: blue
  template:
    metadata:
      annotations:
        appmesh.k8s.aws/mesh: ${MESH_NAME}
      labels:
        app: color
        version: blue
    spec:
      containers:
        - name: app
          image: ${COLOR_APP_IMAGE}
          ports:
            - containerPort: 8080
          env:
            - name: "COLOR"
              value: "blue"
            - name: "PORT"
              value: "8080"
---
apiVersion: v1
kind: Service
metadata:
  name: green
  namespace: ${APP_NAMESPACE}
  labels:
    app: color
    version: green
spec:
  ports:
    - port: 8080
      name: http2
  selector:
    app: color
    version: green
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: green
  namespace: ${APP_NAMESPACE}
  labels:
    app: color
    version: green
spec:
  replicas: 1
  selector:
    matchLabels:
      app: color
      version: green
  template:
    metadata:
      annotations:
        appmesh.k8s.aws/mesh: ${MESH_NAME}
      labels:
        app: color
        version: green
    spec:
      containers:
        - name: app
          image: ${COLOR_APP_IMAGE}
          ports:
            - containerPort: 8080
          env:
            - name: "COLOR"
              value: "green"
            - name: "PORT"
              value: "8080"
---
apiVersion: v1
kind: Service
metadata:
  name: color
  namespace: ${APP_NAMESPACE}
  labels:
    app: color
spec:
  ports:
    - port: 8080
      name: http
  selector:
    app: color