{{/*
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.
*/}}

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: spgwu
  serviceName: spgwu-headless
  labels:
{{ tuple "spgwu" . | include "omec-user-plane.metadata_labels" | indent 4 }}
spec:
  replicas: 1
  selector:
    matchLabels:
{{ tuple "spgwu" . | include "omec-user-plane.metadata_labels" | indent 6 }}
  template:
    metadata:
      labels:
{{ tuple "spgwu" . | include "omec-user-plane.metadata_labels" | indent 8 }}
      annotations:
        k8s.v1.cni.cncf.io/networks: '[
          {
            "name": "s1u-net",
            "interface": {{ .Values.config.spgwu.s1u.device | quote }},
            "ips": {{ .Values.config.spgwu.s1u.ip | quote }}
          },
          {
            "name": "sgi-net",
            "interface": {{ .Values.config.spgwu.sgi.device | quote }},
            "ips": {{ .Values.config.spgwu.sgi.ip | quote }}
          }
        ]'
    spec:
      shareProcessNamespace: true
    {{- if .Values.nodeSelectors.enabled }}
      nodeSelector:
        {{ .Values.nodeSelectors.spgwu.label }}: {{ .Values.nodeSelectors.spgwu.value }}
    {{- end }}
    {{- if .Values.config.coreDump.enabled }}
{{ tuple "spgwu" . | include "omec-user-plane.coredump_init" | indent 8 }}
    {{- end }}
      containers:
      - name: routectl
        image: {{ .Values.images.tags.bess | quote }}
        imagePullPolicy: {{ .Values.images.pullPolicy | quote }}
        env:
          - name: PYTHONUNBUFFERED
            value: "1"
        command: ["/opt/bess/bessctl/conf/route_control.py"]
        args:
          - -i
          - {{ .Values.config.spgwu.s1u.device }}
          - {{ .Values.config.spgwu.sgi.device }}
      {{- if .Values.resources.enabled }}
        resources:
{{ toYaml .Values.resources.routectl | indent 10 }}
      {{- end }}
      - name: bessd
        image: {{ .Values.images.tags.bess | quote }}
        imagePullPolicy: {{ .Values.images.pullPolicy | quote }}
        securityContext:
          privileged: true
          capabilities:
            add:
            - IPC_LOCK
            - NET_ADMIN
        stdin: true
        tty: true
        command: ["/bin/bash", "-xc", "bessd -f -grpc-url=0.0.0.0:10514;"]
        lifecycle:
          postStart:
            exec:
              command: ["/etc/bess/conf/bessd-poststart.sh"]
        livenessProbe:
          tcpSocket:
            port: 10514
          initialDelaySeconds: 15
          periodSeconds: 20
        resources:
          requests:
          {{- if .Values.resources.enabled }}
{{ toYaml .Values.resources.bess.requests | indent 12 }}
          {{- end }}
          {{- if .Values.networks.sriov.enabled }}
            intel.com/sriov_vfio_s1u_net: 1
            intel.com/sriov_vfio_sgi_net: 1
          {{- end }}
          limits:
          {{- if .Values.resources.enabled }}
{{ toYaml .Values.resources.bess.limits | indent 12 }}
          {{- end }}
          {{- if .Values.networks.sriov.enabled }}
            intel.com/sriov_vfio_s1u_net: 1
            intel.com/sriov_vfio_sgi_net: 1
          {{- end }}
        env:
          - name: CONF_FILE
            value: /etc/bess/conf/spgwu.json
        volumeMounts:
          - name: hugepages
            mountPath: /dev/hugepages
          - name: configs
            mountPath: /etc/bess/conf
        {{- if .Values.config.coreDump.enabled }}
          - name: coredump
            mountPath: /tmp/coredump
        {{- end }}
      - name: web
        image: {{ .Values.images.tags.bess | quote }}
        imagePullPolicy: {{ .Values.images.pullPolicy | quote }}
        command: ["/bin/bash", "-xc", "bessctl http 0.0.0.0 8000"]
      {{- if .Values.resources.enabled }}
        resources:
{{ toYaml .Values.resources.web | indent 10 }}
      {{- end }}
      - name: cpiface
        image: {{ .Values.images.tags.cpiface | quote }}
        imagePullPolicy: {{ .Values.images.pullPolicy | quote }}
        env:
          - name: ZMQD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
          - name: GLOG_v
            value: "1"
        command: ["zmq-cpiface"]
        args:
          - --hostname
          - {{ .Values.config.spgwu.name | quote }}
          - --zmqd_nb_ip
          - {{ .Values.config.spgwu.zmq.spgwc.addr | quote }}
          - --zmqd_nb_port
          - {{ .Values.config.spgwu.zmq.spgwc.port | quote }}
          - --zmqd_recv_port
          - {{ .Values.config.spgwu.zmq.recvPort | quote }}
          - --zmqd_ip
          - $(ZMQD_IP)
          - --s1u_sgw_ip
          - {{ (split "/" .Values.config.spgwu.s1u.ip)._0 | quote }}
      {{- if .Values.resources.enabled }}
        resources:
{{ toYaml .Values.resources.cpiface | indent 10 }}
      {{- end }}
      volumes:
      - name: configs
        configMap:
          name: spgwu
          defaultMode: 493
      - name: hugepages
        emptyDir:
          medium: HugePages
    {{- if .Values.config.coreDump.enabled }}
      - name: host-rootfs
        hostPath:
          path: /
      - name: coredump
        hostPath:
          path: {{ .Values.config.coreDump.path }}
    {{- end }}
