# 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-jsonschema \
    python3-pymongo python3-yaml python3-pip python3-keystoneclient \
    && python3 -m pip install pip --upgrade \
    && python3 -m pip install aiokafka aiohttp cherrypy==18.1.2 keystoneauth1 requests \
    && 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  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              keystone
#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

