## Copyright 2017 Open Networking Laboratory
##
## 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 alpine:3.5
MAINTAINER Open Networking Laboratory <info@onlab.us>

# Base image information borrowed by official golang wheezy Dockerfile
RUN apk --update add ansible openssh-client sshpass curl py2-netaddr rsync
RUN mkdir -p /root/.ssh /service /etc/ansible
COPY ssh-config /root/.ssh/config
COPY ansible.cfg /etc/ansible/ansible.cfg
ADD entry-point /service/entry-point

LABEL org.label-schema.name="provisioner" \
      org.label-schema.description="Provides provisioning of compute and switch nodes for CORD" \
      org.label-schema.vcs-url="https://gerrit.opencord.org/maas" \
      org.label-schema.vendor="Open Networking Laboratory" \
      org.label-schema.schema-version="1.0"

WORKDIR /service
ENTRYPOINT ["/service/entry-point"]
