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

{{- if .Values.ui.ingress.enabled -}}
{{- $fullName := include "datalab-ui.fullname" . -}}
{{ $servicePort := .Values.ui.service.http_port }}
{{ $host := .Values.ui.ingress.host }}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ $fullName }}
  labels:
{{ include "datalab-ui.labels" . | indent 4 }}
  annotations:
{{- with .Values.ui.ingress.annotations }}
{{ toYaml . | indent 4 }}
  {{- end }}
spec:
{{- if .Values.ui.ingress.tls }}
  tls:
  {{- range .Values.ui.ingress.tls }}
    - hosts:
      {{- range .hosts }}
        - {{ . | quote }}
      {{- end }}
      secretName: {{ .secretName }}
  {{- end }}
{{- end }}
  rules:
    - host: {{ $host }}
      http:
        paths:
        - backend:
            serviceName: {{ $fullName }}
            servicePort: {{ $servicePort }}
          path: /
{{- end }}