# *****************************************************************************
#
# 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.
#
# ******************************************************************************

Keycloak can be accessed:

* Within your cluster, at the following DNS name at port {{ .Values.keycloak.service.httpPort }}:

  {{ include "keycloak.fullname" . }}-http.{{ .Release.Namespace }}.svc.cluster.local

{{- if .Values.keycloak.ingress.enabled }}

* From outside the cluster:

{{- range .Values.keycloak.ingress.hosts }}
  - http{{ if $.Values.keycloak.ingress.tls }}s{{ end }}://{{ . }}
{{- end }}

{{- else }}

* From outside the cluster, run these commands in the same shell:

{{- if contains "NodePort" .Values.keycloak.service.type }}

  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "keycloak.fullname" . }})
  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT

{{- else if contains "LoadBalancer" .Values.keycloak.service.type }}

  NOTE:
  It may take a few minutes for the LoadBalancer IP to be available.
  You can watch the status of by running 'kubectl get svc -w {{ include "keycloak.fullname" . }}'

  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "keycloak.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  echo http://$SERVICE_IP:{{ .Values.keycloak.service.httpPort }}

{{- else if contains "ClusterIP" .Values.keycloak.service.type }}

  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l app.kubernetes.io/instance={{ .Release.Name }} -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:8080 to use Keycloak"
  kubectl port-forward --namespace {{ .Release.Namespace }} $POD_NAME 8080

{{- end }}

{{- end }}

Login with the following credentials:
Username: {{ .Values.keycloak.username }}

To retrieve the initial user password run:
kubectl get secret --namespace {{ .Release.Namespace }} {{ include "keycloak.fullname" . }}-http -o jsonpath="{.data.password}" | base64 --decode; echo
