# 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 \
    pip install /local_imports/pyvoltha/dist/*.tar.gz==* ; \
fi

RUN if [ -n "$LOCAL_PROTOS" ] ; then \
    pip install /local_imports/voltha-protos/dist/*.tar.gz==* ; \
fi

# Bundle app source
RUN mkdir /ofagent  && \
        touch   /ofagent/__init__.py

ENV PYTHONPATH=/ofagent
COPY ofagent /ofagent/ofagent
COPY pki /ofagent/pki

# 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-ofagent \
      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
