FROM ubuntu:16.04
# FROM arm64=aarch64/ubuntu:16.04 arm=armhf/ubuntu:16.04

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        build-essential \
        ca-certificates \
        cpio \
        curl \
        dosfstools \
        gccgo \
        genisoimage \
        gettext \
        git \
        isolinux \
        less \
        libblkid-dev \
        libmount-dev \
        libselinux1-dev \
        locales \
        module-init-tools \
        openssh-client \
        pkg-config \
        qemu \
        qemu-kvm \
        rsync \
        sudo \
        syslinux-common \
        vim \
        wget \
        xorriso

########## Dapper Configuration #####################

ENV DAPPER_ENV VERSION DEV_BUILD RUNTEST
ENV DAPPER_DOCKER_SOCKET true
ENV DAPPER_SOURCE /go/src/github.com/rancher/os
ENV DAPPER_OUTPUT ./bin ./dist ./build/initrd ./build/kernel
ENV DAPPER_RUN_ARGS --privileged
ENV TRASH_CACHE ${DAPPER_SOURCE}/.trash-cache
ENV SHELL /bin/bash
WORKDIR ${DAPPER_SOURCE}

########## General Configuration #####################
ARG DAPPER_HOST_ARCH=amd64
ARG HOST_ARCH=${DAPPER_HOST_ARCH}
ARG ARCH=${HOST_ARCH}

ARG OS_REPO=rancher
ARG HOSTNAME_DEFAULT=rancher
ARG DISTRIB_ID=RancherOS

ARG DOCKER_VERSION=1.11.2
ARG DOCKER_PATCH_VERSION=v${DOCKER_VERSION}-ros1
ARG DOCKER_BUILD_VERSION=1.10.3
ARG DOCKER_BUILD_PATCH_VERSION=v${DOCKER_BUILD_VERSION}-ros1
ARG SELINUX_POLICY_URL=https://github.com/rancher/refpolicy/releases/download/v0.0.3/policy.29

ARG KERNEL_VERSION_amd64=4.9.12-rancher
ARG KERNEL_URL_amd64=https://github.com/rancher/os-kernel/releases/download/v${KERNEL_VERSION_amd64}/linux-${KERNEL_VERSION_amd64}-x86.tar.gz
ARG KERNEL_URL_arm64=https://github.com/imikushin/os-kernel/releases/download/Estuary-4.4.0-arm64.8/linux-4.4.0-rancher-arm64.tar.gz

ARG DOCKER_URL_amd64=https://get.docker.com/builds/Linux/x86_64/docker-${DOCKER_VERSION}.tgz
ARG DOCKER_URL_arm=https://github.com/rancher/docker/releases/download/${DOCKER_PATCH_VERSION}/docker-${DOCKER_VERSION}_arm.tgz
ARG DOCKER_URL_arm64=https://github.com/rancher/docker/releases/download/${DOCKER_PATCH_VERSION}/docker-${DOCKER_VERSION}_arm64.tgz

ARG BUILD_DOCKER_URL_amd64=https://get.docker.com/builds/Linux/x86_64/docker-${DOCKER_BUILD_VERSION}
ARG BUILD_DOCKER_URL_arm=https://github.com/rancher/docker/releases/download/${DOCKER_BUILD_PATCH_VERSION}/docker-${DOCKER_BUILD_VERSION}_arm
ARG BUILD_DOCKER_URL_arm64=https://github.com/rancher/docker/releases/download/${DOCKER_BUILD_PATCH_VERSION}/docker-${DOCKER_BUILD_VERSION}_arm64

ARG OS_RELEASES_YML=https://releases.rancher.com/os

ARG OS_SERVICES_REPO=https://raw.githubusercontent.com/${OS_REPO}/os-services
ARG IMAGE_NAME=${OS_REPO}/os
ARG DFS_IMAGE=${OS_REPO}/docker:v${DOCKER_VERSION}-2

ARG OS_BASE_URL_amd64=https://github.com/rancher/os-base/releases/download/v2016.08.1-2/os-base_amd64.tar.xz
ARG OS_BASE_URL_arm64=https://github.com/rancher/os-base/releases/download/v2016.08.1-2/os-base_arm64.tar.xz
ARG OS_BASE_URL_arm=https://github.com/rancher/os-base/releases/download/v2016.08.1-3/os-base_arm.tar.xz
######################################################

# Set up environment and export all ARGS as ENV
ENV ARCH=${ARCH} \
    HOST_ARCH=${HOST_ARCH}

ENV BUILD_DOCKER_URL=BUILD_DOCKER_URL_${ARCH} \
    BUILD_DOCKER_URL_amd64=${BUILD_DOCKER_URL_amd64} \
    BUILD_DOCKER_URL_arm=${BUILD_DOCKER_URL_arm} \
    BUILD_DOCKER_URL_arm64=${BUILD_DOCKER_URL_arm64} \
    DAPPER_HOST_ARCH=${DAPPER_HOST_ARCH} \
    DFS_IMAGE=${DFS_IMAGE} \
    DISTRIB_ID=${DISTRIB_ID} \
    DOCKER_PATCH_VERSION=${DOCKER_PATCH_VERSION} \
    DOCKER_URL=DOCKER_URL_${ARCH} \
    DOCKER_URL_amd64=${DOCKER_URL_amd64} \
    DOCKER_URL_arm=${DOCKER_URL_arm} \
    DOCKER_URL_arm64=${DOCKER_URL_arm64} \
    DOCKER_VERSION=${DOCKER_VERSION} \
    DOWNLOADS=/usr/src/downloads \
    GOPATH=/go \
    GO_VERSION=1.7.1 \
    GOARCH=$ARCH \
    HOSTNAME_DEFAULT=${HOSTNAME_DEFAULT} \
    IMAGE_NAME=${IMAGE_NAME} \
    KERNEL_VERSION=${KERNEL_VERSION_amd64} \
    KERNEL_URL=KERNEL_URL_${ARCH} \
    KERNEL_URL_amd64=${KERNEL_URL_amd64} \
    KERNEL_URL_arm64=${KERNEL_URL_arm64} \
    OS_BASE_SHA1=OS_BASE_SHA1_${ARCH} \
    OS_BASE_URL=OS_BASE_URL_${ARCH} \
    OS_BASE_URL_amd64=${OS_BASE_URL_amd64} \
    OS_BASE_URL_arm=${OS_BASE_URL_arm} \
    OS_BASE_URL_arm64=${OS_BASE_URL_arm64} \
    OS_RELEASES_YML=${OS_RELEASES_YML} \
    OS_REPO=${OS_REPO} \
    OS_SERVICES_REPO=${OS_SERVICES_REPO} \
    REPO_VERSION=master \
    SELINUX_POLICY_URL=${SELINUX_POLICY_URL}
ENV PATH=${GOPATH}/bin:/usr/local/go/bin:$PATH

RUN mkdir -p ${DOWNLOADS}

# Download kernel
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN echo "... Downloading  ${!KERNEL_URL}"; \
    if [ -n "${!KERNEL_URL}" ]; then \
        curl -fL ${!KERNEL_URL} > ${DOWNLOADS}/kernel.tar.gz \
    ;fi

# Download SELinux Policy
RUN curl -pfL ${SELINUX_POLICY_URL} > ${DOWNLOADS}/$(basename ${SELINUX_POLICY_URL})

# Install Go
COPY assets/go-dnsclient.patch ${DAPPER_SOURCE}
RUN ln -sf go-6 /usr/bin/go && \
    curl -sfL https://storage.googleapis.com/golang/go${GO_VERSION}.src.tar.gz | tar -xzf - -C /usr/local && \
    patch /usr/local/go/src/net/dnsclient_unix.go ${DAPPER_SOURCE}/go-dnsclient.patch && \
    cd /usr/local/go/src && \
    GOROOT_BOOTSTRAP=/usr GOARCH=${HOST_ARCH} GOHOSTARCH=${HOST_ARCH} ./make.bash && \
    rm /usr/bin/go

# Install Host Docker
RUN curl -fL ${!BUILD_DOCKER_URL} > /usr/bin/docker && \
    chmod +x /usr/bin/docker

# Install Trash
RUN go get github.com/rancher/trash

# Install golint
RUN go get github.com/golang/lint/golint

RUN go get gopkg.in/check.v1

# Install dapper
RUN curl -sL https://releases.rancher.com/dapper/latest/dapper-`uname -s`-`uname -m | sed 's/arm.*/arm/'` > /usr/bin/dapper && \
    chmod +x /usr/bin/dapper

RUN cd ${DOWNLOADS} && \
    curl -pfL ${!OS_BASE_URL} | tar xvJf -

ENTRYPOINT ["./scripts/entry"]
CMD ["ci"]
