# Copyright 2016 the original author or authors.
#
# 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

# Update to have latest images
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
	ca-certificates=20170717~16.04.2 \
        python=2.7.12-1~16.04 \
        openssl=1.0.2g-1ubuntu4.15 \
        iproute2=4.3.0-1ubuntu3.16.04.5 \
        libpcap-dev=1.7.4-2 \
        wget=1.17.1-1ubuntu1.5 \
        build-essential=12.1ubuntu2 \
        git=1:2.7.4-0ubuntu1.6 \
        binutils=2.26.1-1ubuntu1~16.04.8 \
        python-dev=2.7.12-1~16.04 \
        libffi-dev=3.2.1-4 \
        libssl-dev=1.0.2g-1ubuntu4.15 \
        && apt-get clean && rm -rf /var/lib/apt/lists/*

# Install current version of pip rather than outdated pip from apt
RUN wget -O /tmp/get-pip.py https://bootstrap.pypa.io/get-pip.py
RUN python /tmp/get-pip.py

# Install adapter requirements.
COPY requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt

ARG LOCAL_PYVOLTHA
ARG LOCAL_PROTOS
COPY local_imports/ /local_imports/
RUN if [ -n "$LOCAL_PYVOLTHA" ] ; then \
    PYVOLTHA_PATH=$(ls /local_imports/pyvoltha/dist/) ; \
    printf "/local_imports/pyvoltha/dist/%s\npyvoltha" "$PYVOLTHA_PATH" > pyvoltha-install.txt ; \
    pip install -r pyvoltha-install.txt ; \
fi

RUN if [ -n "$LOCAL_PROTOS" ] ; then \
    PROTOS_PATH=$(ls /local_imports/voltha-protos/dist/) ; \
    printf "/local_imports/voltha-protos/dist/%s\nvoltha-protos" "$PROTOS_PATH" > protos-install.txt ; \
    pip install -r protos-install.txt ; \
 fi

# Bundle app source
RUN mkdir /voltha && touch /voltha/__init__.py
ENV PYTHONPATH=/voltha
COPY ponsim_onu /voltha/python/adapters/ponsim_onu
COPY VERSION /voltha/python/adapters/ponsim_onu
RUN touch /voltha/python/__init__.py
RUN touch /voltha/python/adapters/__init__.py

# Exposing process and default entry point
CMD ["python", "/voltha/python/adapters/ponsim_onu/main.py"]

# Label image
ARG org_label_schema_version=unknown
ARG org_label_schema_vcs_url=unknown
ARG org_label_schema_vcs_ref=unknown
ARG org_label_schema_build_date=unknown
ARG org_opencord_vcs_commit_date=unknown

LABEL org.label-schema.schema-version=1.0 \
      org.label-schema.name=voltha-adapter-ponsim-onu \
      org.label-schema.version=$org_label_schema_version \
      org.label-schema.vcs-url=$org_label_schema_vcs_url \
      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
      org.label-schema.build-date=$org_label_schema_build_date \
      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
