# 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.
########################################################################################
# This Dockerfile is intented for devops testing and deb package generation
#
# To run stage 2 locally:
#
#   docker build -t stage2 .
#   docker run -ti -v `pwd`:/work -w /work --entrypoint /bin/bash stage2
#   devops-stages/stage-test.sh
#   devops-stages/stage-build.sh
#

FROM ubuntu:22.04

ARG APT_PROXY
RUN if [ ! -z $APT_PROXY ] ; then \
    echo "Acquire::http::Proxy \"$APT_PROXY\";" > /etc/apt/apt.conf.d/proxy.conf ;\
    echo "Acquire::https::Proxy \"$APT_PROXY\";" >> /etc/apt/apt.conf.d/proxy.conf ;\
    fi

RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get -y install \
        debhelper \
        dh-python \
        git \
        python3 \
        python3-all \
        python3-dev \
        python3-setuptools \
        python3-pip \
        tox

ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8

RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get -y install \
        dh-make

RUN curl https://get.helm.sh/helm-v3.11.3-linux-amd64.tar.gz --output helm-v3.11.3.tar.gz \
    && tar -zxvf helm-v3.11.3.tar.gz \
    && mv linux-amd64/helm /usr/local/bin/helm \
    && rm -r linux-amd64/

RUN curl https://get.datree.io | /bin/bash

RUN helm plugin install https://github.com/datreeio/helm-datree

