#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#
kind: Pod
apiVersion: v1
metadata:
  namespace: {{zeppelin.k8s.namespace}}
  name: {{zeppelin.k8s.interpreter.pod.name}}
  labels:
    app: {{zeppelin.k8s.interpreter.pod.name}}
    interpreterGroupId: {{zeppelin.k8s.interpreter.group.id}}
    interpreterSettingName: {{zeppelin.k8s.interpreter.setting.name}}
    user: {{ zeppelin.k8s.interpreter.user }}
  {% if zeppelin.k8s.server.uid is defined %}
  ownerReferences:
  - apiVersion: v1
    controller: false
    blockOwnerDeletion: false
    kind: Pod
    name: {{zeppelin.k8s.server.pod.name}}
    uid: {{zeppelin.k8s.server.uid}}
  {% endif %}
spec:
  serviceAccountName: {{zeppelin.k8s.interpreter.serviceAccount}}
  {% if zeppelin.k8s.interpreter.group.name == "spark" %}
  automountServiceAccountToken: true
  {% else %}
  automountServiceAccountToken: false
  {% endif %}
  restartPolicy: Never
  terminationGracePeriodSeconds: 30
  containers:
  - name: {{zeppelin.k8s.interpreter.container.name}}
    image: {{zeppelin.k8s.interpreter.container.image}}
    {% if zeppelin.k8s.interpreter.container.imagePullPolicy is defined %}
    imagePullPolicy: {{zeppelin.k8s.interpreter.container.imagePullPolicy}}
    {% endif %}
    args:
      - "$(ZEPPELIN_HOME)/bin/interpreter.sh"
      - "-d"
      - "$(ZEPPELIN_HOME)/interpreter/{{zeppelin.k8s.interpreter.group.name}}"
      - "-r"
      - "{{zeppelin.k8s.interpreter.rpc.portRange}}"
      - "-c"
      - "{{zeppelin.k8s.server.rpc.service}}"
      - "-p"
      - "{{zeppelin.k8s.server.rpc.portRange}}"
      - "-i"
      - "{{zeppelin.k8s.interpreter.group.id}}"
      - "-l"
      - "{{zeppelin.k8s.interpreter.localRepo}}/{{zeppelin.k8s.interpreter.setting.name}}"
      - "-g"
      - "{{zeppelin.k8s.interpreter.setting.name}}"
    env:
  {% for key, value in zeppelin.k8s.envs.items() %}
    - name: {{key}}
      value: {{value}}
  {% endfor %}
  {% if zeppelin.k8s.interpreter.cores is defined and zeppelin.k8s.interpreter.memory is defined %}
    resources:
      requests:
        memory: "{{zeppelin.k8s.interpreter.memory}}"
        cpu: "{{zeppelin.k8s.interpreter.cores}}"
{# limits.memory is not set because of a potential OOM-Killer. https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits #}
      limits:
        cpu: "{{zeppelin.k8s.interpreter.cores}}"
        {% if zeppelin.k8s.interpreter.gpu.type is defined and zeppelin.k8s.interpreter.gpu.nums is defined %}
        {{zeppelin.k8s.interpreter.gpu.type}}: "{{zeppelin.k8s.interpreter.gpu.nums}}"
        {% endif %}
  {% else %}
  {% if zeppelin.k8s.interpreter.gpu.type is defined and zeppelin.k8s.interpreter.gpu.nums is defined %}
    resources:
      limits:  
        {{zeppelin.k8s.interpreter.gpu.type}}: "{{zeppelin.k8s.interpreter.gpu.nums}}"
  {% endif %}
  {% endif %}
  {% if zeppelin.k8s.interpreter.group.name == "spark" %}
    volumeMounts:
    - name: spark-home
      mountPath: /spark
  initContainers:
  - name: spark-home-init
    image: {{zeppelin.k8s.spark.container.image}}
    {% if zeppelin.k8s.spark.container.imagePullPolicy is defined %}
    imagePullPolicy: {{zeppelin.k8s.spark.container.imagePullPolicy}}
    {% endif %}
    command: ["sh", "-c", "cp -r /opt/spark/* /spark/"]
    volumeMounts:
    - name: spark-home
      mountPath: /spark
  {% if zeppelin.k8s.interpreter.imagePullSecrets is defined %}
  imagePullSecrets:
  {% for secret in zeppelin.k8s.interpreter.imagePullSecrets.split(',') %}
  - name: {{secret}}
  {% endfor %}
  {% endif %}
  volumes:
  - name: spark-home
    emptyDir: {}
  {% endif %}
---
kind: Service
apiVersion: v1
metadata:
  namespace: {{zeppelin.k8s.namespace}}
  name: {{zeppelin.k8s.interpreter.pod.name}}             # keep Service name the same to Pod name.
  {% if zeppelin.k8s.server.uid is defined %}
  ownerReferences:
  - apiVersion: v1
    controller: false
    blockOwnerDeletion: false
    kind: Pod
    name: {{zeppelin.k8s.server.pod.name}}
    uid: {{zeppelin.k8s.server.uid}}
  {% endif %}
spec:
  clusterIP: None
  ports:
    - name: intp
      port: 12321
    {% if zeppelin.k8s.interpreter.group.name == "spark" %}
    - name: spark-driver
      port: 22321
    - name: spark-blockmanager
      port: 22322
    - name: spark-ui
      port: 4040
    {% endif %}
  selector:
    app: {{zeppelin.k8s.interpreter.pod.name}}
{% if zeppelin.k8s.interpreter.group.name == "spark" %}
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: {{zeppelin.k8s.interpreter.pod.name}}
  namespace: {{zeppelin.k8s.namespace}}
  {% if zeppelin.k8s.server.uid is defined %}
  ownerReferences:
  - apiVersion: v1
    controller: false
    blockOwnerDeletion: false
    kind: Pod
    name: {{zeppelin.k8s.server.pod.name}}
    uid: {{zeppelin.k8s.server.uid}}
  {% endif %}
rules:
- apiGroups: [""]
  resources: ["pods", "services", "configmaps"]
  verbs: ["create", "get", "update", "list", "delete", "watch" ]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: {{zeppelin.k8s.interpreter.pod.name}}
  {% if zeppelin.k8s.server.uid is defined %}
  ownerReferences:
  - apiVersion: v1
    controller: false
    blockOwnerDeletion: false
    kind: Pod
    name: {{zeppelin.k8s.server.pod.name}}
    uid: {{zeppelin.k8s.server.uid}}
  {% endif %}
subjects:
- kind: ServiceAccount
  name: {{zeppelin.k8s.interpreter.serviceAccount}}
roleRef:
  kind: Role
  name: {{zeppelin.k8s.interpreter.pod.name}}
  apiGroup: rbac.authorization.k8s.io
{% if zeppelin.k8s.spark.useIngress is defined and zeppelin.k8s.spark.useIngress == "true" %}
---
# create ingress of spark UI
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spark-ui-{{zeppelin.k8s.interpreter.pod.name}}
  namespace: {{zeppelin.k8s.namespace}}
  {% if zeppelin.k8s.server.uid is defined %}
  ownerReferences:
  - apiVersion: v1
    controller: false
    blockOwnerDeletion: false
    kind: Pod
    name: {{zeppelin.k8s.server.pod.name}}
    uid: {{zeppelin.k8s.server.uid}}
  {% endif %}
spec:
  rules:
  - host: {{zeppelin.k8s.spark.ingress.host}}
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: {{zeppelin.k8s.interpreter.pod.name}}
            port:
              number: 4040
{% endif %} 
{% endif %}