# O-RAN-SC
#
# Copyright (C) 2019-2020 AT&T Intellectual Property and Nokia
#
# 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.

# Builder image with superset of CI tools for RIC components

FROM nexus3.o-ran-sc.org:10001/ubuntu:18.04

RUN apt-get update && apt-get install -y \
    autoconf \
    autoconf-archive \
    automake \
    autotools-dev \
    build-essential \
    g++  \
    gcc \
    git \
    libbz2-dev \
    libicu-dev \
    libsctp-dev \
    libtool \
    lksctp-tools \
    make \
    python-dev \
    pkg-config \
    software-properties-common \
    sudo \
    wget \
    zlib1g \
    zlib1g-dev \
    zlibc \
    zip

WORKDIR /tmp

# Install go versions in /opt
RUN mkdir -p /opt/go

ARG g12="1.12.17"
RUN wget -nv https://dl.google.com/go/go${g12}.linux-amd64.tar.gz \
    && tar -xf go${g12}.linux-amd64.tar.gz \
    && mv go /opt/go/1.12 \
    && rm -f go*.gz

ARG g13="1.13.8"
RUN wget -nv https://dl.google.com/go/go${g13}.linux-amd64.tar.gz \
    && tar -xf go${g13}.linux-amd64.tar.gz \
    && mv go /opt/go/1.13 \
    && rm -f go*.gz

ARG g14="1.14"
RUN wget -nv https://dl.google.com/go/go${g14}.linux-amd64.tar.gz \
    && tar -xf go${g14}.linux-amd64.tar.gz \
    && mv go /opt/go/1.14 \
    && rm -f go*.gz

ENV GOPATH=/root/go
# Default path has go version 1.12.x
# Use /opt/go/1.13/bin for version 1.13.x
# Use /opt/go/1.14/bin for version 1.14.x
ENV PATH=$PATH:/opt/go/1.12/bin:$GOPATH/bin

# This installs go-acc to GOPATH
RUN go version \
    && go get -v github.com/ory/go-acc \
    && go-acc --help

# install a recent version of cmake, ubuntu repo version is old
ARG cv="3.14.5"
RUN wget -nv https://github.com/Kitware/CMake/releases/download/v${cv}/cmake-${cv}-Linux-x86_64.sh \
    && chmod +x cmake-${cv}-Linux-x86_64.sh \
    && ./cmake-${cv}-Linux-x86_64.sh --prefix=/usr/local --skip-license \
    && rm -f cmake*.sh

# install a recent version of ninja-build, ubuntu repo version is old
RUN wget -nv https://github.com/ninja-build/ninja/releases/download/v1.9.0/ninja-linux.zip \
    && unzip ninja-linux.zip \
    && chmod +x ninja \
    && mv ninja /usr/local/bin \
    && rm -f ninja*.zip

# sonar-scanner is not available in ubuntu repo
ARG sv="4.2.0.1873"
RUN wget -nv https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${sv}-linux.zip \
    && unzip sonar-scanner-cli-${sv}-linux.zip \
    && mv sonar-scanner-${sv}-linux /usr/local/sonar-scanner \
    && rm -f sonar*.zip

# golangci-lint is not available in ubuntu repo
RUN wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $GOPATH/bin v1.23.6 \
    && rm -f install.sh

# NNG repo is not frequently tagged so it's pinned to a commit hash.
# This commit provides fix to the proxy-reconnect
# bug that we identified:  https://github.com/nanomsg/nng/issues/970
RUN git clone https://github.com/nanomsg/nng.git \
    && cd nng \
    && git checkout e618abf8f3db2a94269a79c8901a51148d48fcc2 \
    && mkdir build \
    && cd build \
    && cmake -DBUILD_SHARED_LIBS=1 -G Ninja .. \
    && ninja \
    && ninja install \
    && cd ../.. \
    && rm -rf nng

# install a recent version of boost, ubuntu repo version is old
ARG bv="1_69_0"
RUN wget -nv https://dl.bintray.com/boostorg/release/1.69.0/source/boost_${bv}.zip \
    && unzip -q boost_${bv}.zip \
    && cd boost_${bv} \
    && ./bootstrap.sh --prefix=/usr/ \
    && ./b2 \
    && ./b2 install \
    && cd ../ \
    && rm -rf boost*.zip boost_${bv}
