#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#

# apigateway
#
# VERSION               1.13.6.1
#
# From https://hub.docker.com/_/alpine/
#

FROM alpine:3.9

ENV CJOSE_VERSION=0.5.1

RUN apk update && \
    apk add \
    gcc tar zlib wget make musl-dev g++ curl \
    libtool readline luajit luajit-dev unzip \
    openssl openssl-dev git jansson jansson-dev

WORKDIR /tmp
RUN wget https://luarocks.org/releases/luarocks-3.1.3.tar.gz && \
    tar zxpf luarocks-3.1.3.tar.gz && \
    cd luarocks-3.1.3 && \
    ./configure && \
    make build && \
    make install

RUN echo " ... installing cjose ... " \
    && mkdir -p /tmp/api-gateway \
    && curl -L -k https://github.com/cisco/cjose/archive/${CJOSE_VERSION}.tar.gz -o /tmp/api-gateway/cjose-${CJOSE_VERSION}.tar.gz \
    && tar -xf /tmp/api-gateway/cjose-${CJOSE_VERSION}.tar.gz -C /tmp/api-gateway/ \
    && cd /tmp/api-gateway/cjose-${CJOSE_VERSION} \
    && sh configure \
    && make && make install \
    && rm -rf /tmp/api-gateway

COPY . /etc/api-gateway

WORKDIR /etc/api-gateway/tests
RUN ./install-deps.sh

CMD sh run-tests.sh