# Copyright 2018 Telefonica S.A.
#
# 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.

FROM ubuntu:20.04

# Set the working directory to /app
WORKDIR /app/LCM

RUN apt-get update && apt-get install -y curl xz-utils gnupg2 \
    && apt-get update && apt-get install -y apt-transport-https \
    && curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - \
    && echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list.d/kubernetes.list \
    && apt-get update && apt-get install -y kubectl

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

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

RUN curl -L https://launchpad.net/juju/2.7/2.7.6/+download/juju-2.7.6-k8s.tar.xz --output juju-2.7.6-k8s.tar.xz \
    && tar -xvf juju-2.7.6-k8s.tar.xz \
    && mv juju /usr/local/bin/juju

RUN apt-get update && apt-get install -y git tox python3 \
    python3-pip python3-jinja2 \
    && python3 -m pip install pip --upgrade  \
    && python3 -m pip install -U 'PyYAML' 'aiohttp>=2.3.10' flake8

RUN git -C /app clone https://osm.etsi.org/gerrit/osm/N2VC.git \
    && python3 -m pip install -e /app/N2VC \
    && python3 -m pip install -U juju \
    && apt-get install -y libffi-dev libssl-dev openssh-client
    # cd N2VC; python3 setup.py develop
    # cd modules/libjuju; python3 setup.py develop

RUN git -C /app clone https://osm.etsi.org/gerrit/osm/common.git \
    && python3 -m pip install -e /app/common
    #  python3-pymongo python3-yaml pycrypto aiokafka

RUN python3 -m pip install \
    -r /app/common/requirements.txt \
    -r /app/N2VC/requirements.txt

RUN python3 -m pip install grpcio-tools grpclib

RUN mkdir -p /app/storage/kafka && mkdir -p /app/log


LABEL Maintainer="alfonso.tiernosepulveda@telefonica.com" \
      Description="This implements the Life Cicle Management module of OSM" \
      Version="1.0" \
      Author="Alfonso Tierno"

# Used for local storage
VOLUME /app/storage
# Used for logs
VOLUME /app/log

# The following ENV can be added with "docker run -e xxx' to configure LCM
ENV OSMLCM_RO_HOST         ro
ENV OSMLCM_RO_PORT         9090
ENV OSMLCM_RO_TENANT       osm

# VCA
ENV OSMLCM_VCA_HOST        vca
ENV OSMLCM_VCA_PORT        17070
ENV OSMLCM_VCA_USER        admin
ENV OSMLCM_VCA_SECRET      secret
ENV OSMLCM_VCA_CLOUD:      localhost
# ENV OSMLCM_VCA_ENABLEOSUPGRADE false
# ENV OSMLCM_VCA_APTMIRROR  http://archive.ubuntu.com/ubuntu/
# ENV OSMLCM_VCA_PUBKEY     pubkey
# ENV OSMLCM_VCA_CACERT     cacert

# VCA - k8s
ENV OSMLCM_VCA_HELMPATH    /usr/local/bin/helm
ENV OSMLCM_VCA_KUBECTLPATH /usr/bin/kubectl
ENV OSMLCM_VCA_JUJUPATH    /usr/local/bin/juju

# database
ENV OSMLCM_DATABASE_DRIVER mongo
ENV OSMLCM_DATABASE_URI mongodb://mongo:27017
# ENV OSMLCM_DATABASE_COMMONKEY  xxx
# ENV OSMLCM_DATABASE_USER  xxx
# ENV OSMLCM_DATABASE_PASSWORD  xxx

# storage
ENV OSMLCM_STORAGE_DRIVER                       local
ENV OSMLCM_STORAGE_PATH                         /app/storage
# ENV OSMLCM_STORAGE_DRIVER                       mongo
# ENV OSMLCM_STORAGE_URI                          mongodb://mongo:27017
# ENV OSMLCM_STORAGE_COLLECTION                   files

# message
ENV OSMLCM_MESSAGE_DRIVER  kafka
ENV OSMLCM_MESSAGE_HOST    kafka
ENV OSMLCM_MESSAGE_PORT    9092

# tsdb
# ENV OSMLCM_TSDB_DRIVER     prometheus
# ENV OSMLCM_TSDB_PATH       /etc/prometheus
# ENV OSMLCM_TSDB_URI        http://prometheus:9090/

# logs
# ENV OSMLCM_GLOBAL_LOGFILE  /app/log/lcm.log
ENV OSMLCM_GLOBAL_LOGLEVEL DEBUG

# timeouts
# ENV OSMLCM_TIMEOUT_NS_DEPLOY 7200
# ENV OSMLCM_TIMEOUT_NSI_DEPLOY 7200

# Copy the current directory contents into the container at /app/LCM
ADD . /app/LCM

RUN python3 -m pip install \
    -r requirements.txt

# Run app.py when the container launches
CMD python3 -m osm_lcm.lcm

# HEALTHCHECK --start-period=120s --interval=30s --timeout=30s --retries=1 \
#   CMD python3 -m osm_lcm.lcm_hc  || exit 1

