{{- /*
# Copyright 2020-present Open Networking Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
*/ -}}

{{ tuple "phylo" . | include "phylo.service_account" }}

{{ $context := . }}
{{ range .Values.config.phylo.sources }}
{{- $name := printf "%s-%s" "phylo" .key -}}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ $name }}
  labels:
{{ tuple $name $context | include "phylo.metadata_labels" | indent 4 }}
spec:
  selector:
    matchLabels:
{{ tuple $name $context | include "phylo.metadata_labels" | indent 6 }}
  template:
    metadata:
      labels:
{{ tuple $name $context | include "phylo.metadata_labels" | indent 8 }}
    spec:
    {{- if $context.Values.nodeSelectors.enabled }}
      nodeSelector:
        {{ $context.Values.nodeSelectors.phylo.label }}: {{ $context.Values.nodeSelectors.phylo.value }}
    {{- end }}
      serviceAccountName: phylo
      initContainers:
      - name: phylo-dep-check
        image: {{ $context.Values.images.tags.depCheck | quote }}
        imagePullPolicy: {{ $context.Values.images.pullPolicy }}
        securityContext:
          allowPrivilegeEscalation: false
          readOnlyRootFilesystem: false
          runAsUser: 0
        env:
          - name: POD_NAME
            valueFrom:
              fieldRef:
                apiVersion: v1
                fieldPath: metadata.name
          - name: NAMESPACE
            valueFrom:
              fieldRef:
                apiVersion: v1
                fieldPath: metadata.namespace
          - name: PATH
            value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/
          - name: COMMAND
            value: "echo done"
          - name: DEPENDENCY_POD_JSON
            value: '[{"labels": {"app": "wowza"}, "requireSameNode": false}]'
          # add dependency job for make_certs.sh
        command:
          - kubernetes-entrypoint
        volumeMounts:
          []
      containers:
      - name: rabbitmq
        image: {{ $context.Values.images.tags.phyloRabbitmq }}
        imagePullPolicy: {{ $context.Values.images.pullPolicy }}
      {{- if $context.Values.resources.enabled }}
        resources:
{{ toYaml $context.Values.resources.phyloRabbitmq | indent 10 }}
      {{- end }}
      - name: video-analytics-server
        image: {{ $context.Values.images.tags.videoAnalyticsServer | quote }}
        imagePullPolicy: {{ $context.Values.images.pullPolicy }}
        env:
        - name: GLOG_logtostderr
          value: "1"
        command: ["/bin/bash","-xc","sleep 60 && /bin/run-video-analytics-server.sh"]
        resources:
      {{- if $context.Values.resources.enabled }}
{{ toYaml $context.Values.resources.videoAnalyticsServer | indent 10 }}
      {{- end }}
        volumeMounts:
        - name: script
          mountPath: /bin/run-video-analytics-server.sh
          readOnly: true
          subPath: run-video-analytics-server.sh
      - name: camera-ingestion
        image: {{ $context.Values.images.tags.cameraIngestion | quote }}
        imagePullPolicy: {{ $context.Values.images.pullPolicy }}
        env:
        - name: GLOG_logtostderr
          value: "1"
        - name: SOURCE_URI
          value: {{ .uri }}
        command: ["/bin/bash","-xc","sleep 90 && /google/run.sh"]
      {{- if $context.Values.resources.enabled }}
        resources:
{{ toYaml $context.Values.resources.cameraIngestion | indent 10 }}
      {{- end }}
      - name: phylo-rabbitmq-pubsub
        image: {{ $context.Values.images.tags.phyloRabbitmqPubsub }}
        imagePullPolicy: {{ $context.Values.images.pullPolicy }}
      {{- if $context.Values.resources.enabled }}
        resources:
{{ toYaml $context.Values.resources.phyloRabbitmqPubsub | indent 10 }}
      {{- end }}
        env:
        - name: SOURCE_URI
          value: {{ .uri }}
        - name: RMQ_HOST_NAME
          value: "0.0.0.0"
        command: ["/bin/bash","-xc","sleep 120 && /google/run.sh"]
      - name: phylo-rtsp-server
        image: {{ $context.Values.images.tags.rtspServer }}
        imagePullPolicy: {{ $context.Values.images.pullPolicy }}
      {{- if $context.Values.resources.enabled }}
        resources:
{{ toYaml $context.Values.resources.rtspServer | indent 10 }}
      {{- end }}
        command: ["/bin/bash","-xc","sleep 150 && \
            /google/rmq_rtsp_server_main \
            --rmq_broker_address=localhost:5672 \
            --rmq_exchange_name=phylo.bbox_decoded_video_frame \
            --resize_width=640 \
            --resize_height=480 \
            --rtsp_port=8554 \
            --rtsp_url_suffix=/live"]
      volumes:
      - name: script
        configMap:
          defaultMode: 0700
          name: phylo
{{ end }}
