# 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:18.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.15.2-linux-amd64.tar.gz --output helm-v2.15.2.tar.gz \
    && tar -zxvf helm-v2.15.2.tar.gz \
    && mv linux-amd64/helm /usr/local/bin/helm \
    && 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 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 OSMNBI_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


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

