# 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 \
    && python3 -m pip install tacacs_plus \
    && 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              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"]

