#
# 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
#
# This is a dockerfile used to construct the spark environment used for the
# integration test suite.

FROM jupyter/all-spark-notebook

# User escalation
USER root

# Spark dependencies
ENV APACHE_SPARK_VERSION 3.3.2
ENV APACHE_SPARK_CUSTOM_NAME=hadoop3

RUN apt-get -y update && \
    apt-get install -y --no-install-recommends openjdk-8-jdk ca-certificates-java  && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    update-ca-certificates -f && \
    JAVA_8=`update-alternatives --list java | grep java-8-openjdk` && \
    update-alternatives --set java $JAVA_8

# Installing Spark3
RUN cd /tmp && \
    wget -q https://archive.apache.org/dist/spark/spark-${APACHE_SPARK_VERSION}/spark-${APACHE_SPARK_VERSION}-bin-${APACHE_SPARK_CUSTOM_NAME}.tgz && \
    tar xzf spark-${APACHE_SPARK_VERSION}-bin-${APACHE_SPARK_CUSTOM_NAME}.tgz -C /usr/local && \
    rm spark-${APACHE_SPARK_VERSION}-bin-${APACHE_SPARK_CUSTOM_NAME}.tgz

# Overwrite symlink
RUN cd /usr/local && \
    rm spark && \
    ln -s spark-${APACHE_SPARK_VERSION}-bin-${APACHE_SPARK_CUSTOM_NAME} spark

# Remove other scala kernels
RUN cd /opt/conda/share/jupyter/kernels/ && \
    rm -rf spylon-kernel

ADD dist/toree /usr/local/share/jupyter/kernels/toree
ADD etc/kernel.json /usr/local/share/jupyter/kernels/toree/kernel.json

# Fix permissions on /etc/jupyter as root
USER root
RUN fix-permissions /usr/local/share/jupyter/

# Switch back to jovyan to avoid accidental container runs as root
USER $NB_UID
