---
apiVersion: v1
kind: Namespace
metadata:
  name: istio-project-1
  labels:
    istio-injection: enabled #zorgt voor auto sidecar injection
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: server-a
  namespace: istio-project-1
spec:
  replicas: 1
  selector:
    matchLabels:
      server: "http"
      app: "project-1" #app label bepaald groepering pods in kiali dashboard dus makkelijker te gebruiken
      expose: "true"
  template:
    metadata:
      labels:
        server: "http"
        app: "project-1"
        expose: "true"
    spec:
      containers:
        - name: front-end
          image: beppev/server-a:master
          imagePullPolicy: "Always"
          ports:
            - containerPort: 5000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: server-b
  namespace: istio-project-1
spec:
  replicas: 1
  selector:
    matchLabels:
      server: "http"
      app: "project-1"
      version: v1
      backend: "true"
  template:
    metadata:
      labels:
        server: "http"
        app: "project-1"
        version: v1
        backend: "true"
    spec:
      containers:
        - name: front-end
          image: beppev/server-b:master
          imagePullPolicy: "Always"
          ports:
            - containerPort: 6000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: server-b-test
  namespace: istio-project-1
spec:
  replicas: 1
  selector:
    matchLabels:
      server: "http"
      app: "project-1"
      version: v2
      backend: "true" 
  template:
    metadata:
      labels:
        server: "http"
        app: "project-1"
        version: v2
        backend: "true"
    spec:
      containers:
        - name: front-end
          image: beppev/server-b:experimental
          imagePullPolicy: "Always"
          ports:
            - containerPort: 6000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: server-d
  namespace: istio-project-1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "project-1"
      mirror: "true"
  template:
    metadata:
      labels:
        app: "project-1"
        mirror: "true"
    spec:
      containers:
        - name: front-end
          image: beppev/server-d:master
          ports:
            - containerPort: 6000
---
apiVersion: v1
kind: Service
metadata:
  name: mirror-service
  namespace: istio-project-1
  labels:
    app: "project-1"
spec:
  selector:
    mirror: "true"
  ports:
    - name: http
      protocol: TCP
      port: 6000
---
apiVersion: v1
kind: Service
metadata:
  name: server-check
  namespace: istio-project-1
  labels:
    app: "project-1"
spec:
  selector:
    backend: "true"
  ports:
    - name: http
      protocol: TCP
      port: 6000
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: server-check-destination
  namespace: istio-project-1
  labels:
    app: "project-1"
spec:
  host: server-check
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: expose-server-gateway
  namespace: istio-project-1
  labels:
    app: "project-1"
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"    
---
apiVersion: v1
kind: Service
metadata:
  name: expose-server-service
  namespace: istio-project-1
  labels:
    app: "project-1"
spec:
  ports:
    - name: http
      port: 5000
      protocol: TCP
  selector:
    expose: "true"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: expose-server-vservice
  namespace: istio-project-1
  labels:
    app: "project-1"
spec:
  hosts:
    - "*"
  gateways:
    - expose-server-gateway
  http:
    - match: 
      - uri:
          prefix: /server-a
      route:
        - destination:
            port: 
              number: 5000
            host: expose-server-service
    - match:
      - uri:
          prefix: /server-d
      route:
        - destination:
            port:
              number: 7000
            host: mirror-service
--- # TODO fix gateway zodat we ingress gateway kunnen gebruike ipv de fuken loadbalancer.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: server-check-gateway
  namespace: istio-project-1
  labels:
    app: "project-1"
spec:
  selector:
    expose: "true"
  servers:
    - port:
        number: 6000
        name: http
        protocol: HTTP
      hosts:
        - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: server-check-service
  namespace: istio-project-1
  labels:
    app: "project-1"
spec:
  hosts:
    - "*"
  gateways:
    - expose-server-gateway
  tcp:
  - match:
    - port: 6000
    route:
      - destination:
          host: server-check
          port:
            number: 6000
          subset: v1
        weight: 50
      - destination:
          host: server-check
          port:
            number: 6000
          subset: v2
        weight: 50
        mirror:
          host: mirror-service
          port:
            number: 6000
        mirror_percent: 100