# 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 creates osm/NBI docker from local NBI source code

FROM ubuntu:18.04

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

RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections

RUN apt-get update && apt-get install -y git python3 \
    python3-pymongo python3-yaml python3-pip python3-keystoneclient \
    && python3 -m pip install pip --upgrade \
    && python3 -m pip install aiokafka dataclasses aiohttp cherrypy==18.1.2 keystoneauth1 requests jsonschema==3.2.0 \
    && mkdir -p /app/storage/kafka && mkdir -p /app/log 

# OSM_COMMON
RUN git -C /app clone https://osm.etsi.org/gerrit/osm/common.git \
    && python3 -m pip install -e /app/common
#    && cd common  && python3 setup.py develop && cd ..
#    && pip3 install -U -r requirements.txt \
#    && cd ..

# OSM_IM
RUN git -C /app clone --branch sol006 https://osm.etsi.org/gerrit/osm/IM \
    && python3 -m pip install /app/IM

EXPOSE 9999

LABEL Maintainer="alfonso.tiernosepulveda@telefonica.com" \
      Description="This implements a north bound interface for 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
# server
ENV OSMNBI_SOCKET_HOST                          0.0.0.0
ENV OSMNBI_SOCKET_PORT                          9999
ENV OSMNBI_SERVER_SSL_CERTIFICATE               /app/NBI/osm_nbi/http/cert.pem
ENV OSMNBI_SERVER_SSL_PRIVATE_KEY               /app/NBI/osm_nbi/http/privkey.pem
# storage
ENV OSMNBI_STORAGE_DRIVER                       local
ENV OSMNBI_STORAGE_PATH                         /app/storage
#ENV OSMNBI_STORAGE_DRIVER                       mongo
#ENV OSMNBI_STORAGE_URI                          mongodb://mongo:27017
#ENV OSMNBI_STORAGE_COLLECTION                   files
# database
ENV OSMNBI_DATABASE_DRIVER                      mongo
ENV OSMNBI_DATABASE_HOST                        mongo
ENV OSMNBI_DATABASE_PORT                        27017
# ENV OSMNBI_DATABASE_USER                      xxx
# ENV OSMNBI_DATABASE_PASSWORD                  xxx
# ENV OSMNBI_DATABASE_COMMONKEY                 xxx
# web
ENV OSMNBI_STATIC_DIR                           /app/NBI/osm_nbi/html_public
# logs
# ENV OSMNBI_LOG_FILE                             /app/log/nbi.log
ENV OSMNBI_LOG_LEVEL                            DEBUG
# ENV OSMNBI_SERVER_ENABLE_TEST                   False

# message
ENV OSMNBI_MESSAGE_DRIVER                       kafka
ENV OSMNBI_MESSAGE_HOST                         kafka
ENV OSMNBI_MESSAGE_PORT                         9092
# authentication
ENV OSMNBI_AUTHENTICATION_BACKEND               internal
#ENV OSMNBI_AUTHENTICATION_BACKEND               keystone
#ENV OSMNBI_AUTHENTICATION_AUTH_URL              http://keystone:5000/v3
#ENV OSMNBI_AUTHENTICATION_AUTH_PORT             5000

# DOMAIN_NAME can be a single value or a comma separated list of values. The first value is for internal domain
# meanwhile the rest ones are external identity services as e.g. LDAP
# for the case of USER_DOMAIN_NAME each item can be suffixed with ":ro" (read only). In this case NBI will reject any
# operationi of create/update/delete users in this domain. Do not suffix PROJECT_DOMAIN_NAME
#ENV OSMNBI_AUTHENTICATION_USER_DOMAIN_NAME      default
#ENV OSMNBI_AUTHENTICATION_PROJECT_DOMAIN_NAME   default
#ENV OSMNBI_AUTHENTICATION_SERVICE_USERNAME      nbi
#ENV OSMNBI_AUTHENTICATION_SERVICE_PASSWORD      nbi
#ENV OSMNBI_AUTHENTICATION_SERVICE_PROJECT       service
# RBAC
ENV OSMNBI_RBAC_RESOURCES_TO_OPERATIONS         /app/NBI/osm_nbi/resources_to_operations.yml
ENV OSMNBI_RBAC_ROLES_TO_OPERATIONS             /app/NBI/osm_nbi/roles_to_operations.yml
# prometheus
ENV OSMNBI_PROMETHEUS_HOST                      prometheus
ENV OSMNBI_PROMETHEUS_PORT                      9090

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

# Run app.py when the container launches
CMD python3 -m osm_nbi.nbi

