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

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

RUN apt-get update && apt-get install -y curl xz-utils \
    && 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.0/+download/juju-2.7.0-k8s.tar.xz --output juju-2.7.0-k8s.tar.xz \
    && tar -xvf juju-2.7.0-k8s.tar.xz \
    && mv juju /usr/local/bin/juju

RUN apt-get update && apt-get install -y git tox python3 \
    python3-pip python3-aiohttp python3-jinja2 \
    && python3 -m pip install pip --upgrade  \
    && python3 -m pip install -U 'PyYAML==3.*' 'aiohttp==0.20.2' 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_PUBKEY:     pubkey
# ENV OSMLCM_VCA_CACERT:     cacert

# 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

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

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

# 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 --interval=120s --timeout=15s --retries=1 \
#     CMD python3 -m osm_lcm.lcm --health-check || exit 1
