{{- if .Values.proxy.enabled }}
apiVersion: apps/v1
kind: Deployment
metadata:
  name: proxy
  annotations:
    configmap.reloader.stakater.com/reload: "nginx-conf"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: proxy
  template:
    metadata:
      name: proxy
      labels:
        app: proxy
    spec:
      terminationGracePeriodSeconds: 1
      containers:
      - name: proxy
        image: {{ .Values.proxy.image }}:{{ .Values.proxy.version }}
        imagePullPolicy: Always
        ports:
          - containerPort: 8081
        command: ["/bin/sh", "-c"]
        args:
          - |
            export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
            cat /tmp/nginx/nginx.conf|sed "s/\\\$(NAMESPACE)/$NAMESPACE/g" > /etc/nginx/nginx.conf
            nginx -g 'daemon off;'

        volumeMounts:
          - mountPath: /tmp/nginx/
            readOnly: true
            name: nginx-conf
      volumes:
      - name: nginx-conf
        configMap:
          name: nginx-conf

      imagePullSecrets:
      - name: regcred
      {{ include "app.affinity" . | nindent 6}}

---
apiVersion: v1
kind: Service
metadata:
  name: proxy
  {{- if $.Values.azure }}
  annotations:
      service.beta.kubernetes.io/azure-load-balancer-internal: "true"
  {{ end }}
spec:
  {{- if $.Values.azure }}
  type: LoadBalancer
  {{- else }}
  type: NodePort
  {{- end }}
  selector:
    app: proxy
  ports:
    - name: http
      protocol: TCP
      port: 8081
      targetPort: 8081
      nodePort: {{.Values.proxy.port}}
{{ end }}

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-conf
data:
  nginx.conf: |
    events {
      worker_connections 1024;
    }
    http {
      client_max_body_size 200M;
      server_names_hash_bucket_size 256;
      resolver kube-dns.kube-system.svc.cluster.local valid=30s;
      {{- if .Values.ai.enabled -}}
        {{ .Values.ai.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.assistant.enabled -}}
        {{ .Values.assistant.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.streamlit.enabled -}}
        {{ .Values.streamlit.proxy_upstreams | nindent 6 }}
      {{- end -}} 
      {{- if .Values.jupyter.enabled -}}
        {{ .Values.jupyter.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.voila.enabled -}}
        {{ .Values.voila.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.packman.enabled -}}
        {{ .Values.packman.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.miracl.enabled -}}
        {{ .Values.miracl.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.scrapper.enabled -}}
        {{ .Values.scrapper.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.webjobs.enabled -}}
        {{ .Values.webjobs.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.auth_proxy.enabled -}}
        {{ .Values.auth_proxy.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.pimsync.enabled -}}
        {{ .Values.pimsync.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.loki_stack.enabled -}}
        {{ .Values.loki_stack.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.grafana.enabled -}}
        {{ .Values.grafana.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.prometheus.enabled -}}
        {{ .Values.prometheus.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.pypi_server.enabled -}}
        {{ .Values.pypi_server.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.server_api.enabled -}}
        {{ .Values.server_api.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.pages_server.enabled -}}
        {{ .Values.pages_server.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.mdc_converter.enabled -}}
        {{ .Values.mdc_converter.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.attr_modeling.enabled -}}
        {{ .Values.attr_modeling.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.downloads.enabled -}}
        {{ .Values.downloads.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.jaeger.enabled -}}
        {{ .Values.jaeger.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.pimml.enabled -}}
      upstream pimml_auth {
        server server:8080;
      }
      {{- end -}}
      {{- if .Values.camunda2.enabled -}}
        {{ .Values.camunda2.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.orm_restarter.enabled -}}
        {{ .Values.orm_restarter.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.pim20_data_loader.enabled -}}
        {{ .Values.pim20_data_loader.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.api_router.enabled -}}
        {{ .Values.api_router.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.api_router_schema_updater.enabled -}}
        {{ .Values.api_router_schema_updater.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.assets_inlet.enabled -}}
        {{ .Values.assets_inlet.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.chat_mgmt.enabled -}}
        {{ .Values.chat_mgmt.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- if .Values.jupyterhub.enabled -}}
        {{ .Values.jupyterhub.proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- with index .Values "matrix-synapse" -}}
      {{- if .enabled -}}
        {{ .proxy_upstreams | nindent 6 }}
      {{- end -}}
      {{- end -}}
      server {
        listen 8081;
        server_name {{.Values.domain}};
        {{.Values.proxy.proxy_locations | nindent 8 }}

        {{- if .Values.ai.enabled -}}
          {{ .Values.ai.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.assistant.enabled -}}
          {{ .Values.assistant.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.streamlit.enabled -}}
          {{ .Values.streamlit.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.jupyter.enabled -}}
          {{ .Values.jupyter.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.voila.enabled -}}
          {{ .Values.voila.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.solara.enabled -}}
          {{ .Values.solara.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.packman.enabled -}}
          {{ .Values.packman.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.miracl.enabled -}}
          {{ .Values.miracl.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.scrapper.enabled -}}
          {{ .Values.scrapper.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.webjobs.enabled -}}
          {{ .Values.webjobs.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.auth_proxy.enabled -}}
          {{ .Values.auth_proxy.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.pimsync.enabled -}}
          {{ .Values.pimsync.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.loki_stack.enabled -}}
          {{ .Values.loki_stack.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.grafana.enabled -}}
          {{ .Values.grafana.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.prometheus.enabled -}}
          {{ .Values.prometheus.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.pypi_server.enabled -}}
          {{ .Values.pypi_server.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.server_api.enabled -}}
          {{ .Values.server_api.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.pages_server.enabled -}}
          {{ .Values.pages_server.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.mdc_converter.enabled -}}
          {{ .Values.mdc_converter.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.attr_modeling.enabled -}}
          {{ .Values.attr_modeling.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.downloads.enabled -}}
          {{ .Values.downloads.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.jaeger.enabled -}}
          {{ .Values.jaeger.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.pimml.enabled -}}
          location /pimml {
            auth_request /pimml_auth;
            rewrite ^/pimml/(.*)$ {{.Values.pimml.url }}/pimml/$1 redirect;
            add_header "Access-Control-Allow-Origin" "*";
            add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS";
            add_header "Access-Control-Allow-Headers" "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type";
            add_header Referrer-Policy strict-origin-when-cross-origin;
          }
          location /pimml_auth {
            internal;
            proxy_method POST;
            proxy_set_header content-type "application/json";
            proxy_set_body '{"query": "{}"}';
            proxy_pass http://pimml_auth/graphql;
          }
        {{- end -}}
        {{- if .Values.camunda2.enabled -}}
          {{ .Values.camunda2.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.orm_restarter.enabled -}}
          {{ .Values.orm_restarter.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.pim20_data_loader.enabled -}}
          {{ .Values.pim20_data_loader.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.api_router.enabled -}}
          {{ .Values.api_router.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.api_router_schema_updater.enabled -}}
          {{ .Values.api_router_schema_updater.proxy_locations | nindent 8 }}
        {{- end -}} 
        {{- if .Values.assets_inlet.enabled -}}
          {{.Values.assets_inlet.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.chat_mgmt.enabled -}}
          {{.Values.chat_mgmt.proxy_locations | nindent 8 }}
        {{- end -}}
        {{- if .Values.jupyterhub.enabled -}}
          {{ .Values.jupyterhub.proxy_locations | nindent 8 }}
        {{- end }}
        {{- with index .Values "matrix-synapse" -}}
        {{- if .enabled -}}
          {{ .proxy_locations | nindent 8 }}
        {{- end }}
        {{- end }}
        {{- if .Values.coder.enabled -}}
          {{ .Values.coder.proxy_locations | nindent 8 }}
        {{- end }}
        {{- if .Values.orm.enabled -}}
          {{ .Values.orm.proxy_locations | nindent 8 }}
        {{- end }}
        {{- if .Values.dynamic_proxy.enabled -}}
          {{ .Values.dynamic_proxy.proxy_locations | nindent 8 }}
        {{- end }}
      }
      {{- if .Values.coder.enabled }}
      server {
        listen 8081;
        server_name {{.Values.coder_prefix}}{{.Values.domain}};
          {{ .Values.coder.coder_proxy_locations | nindent 8 }} #
      }
      {{- end }}
      {{- if .Values.clearml.enabled }}
      server {
        listen 8081;
        server_name {{.Values.clearml_prefix}}{{.Values.domain}};
          {{ .Values.clearml.clearml_proxy_locations | nindent 8 }} #
      }
      {{- end }}
    }
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: proxy
spec:
  ingressClassName: nginx
  rules:
    - host: {{ .Values.domain }}
      http:
        paths:
          - pathType: Prefix
            backend:
              service:
                name: proxy
                port:
                  number: 8081
            path: /
