#
# 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
ENV STEP_VERSION=0.11.0

RUN apk update && \
    apk add \
    gcc tar zlib zlib-dev wget make musl-dev g++ curl \
    libtool readline luajit luajit-dev unzip coreutils \
    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

RUN echo " ... installing step cli ... " \
    && mkdir -p /tmp/step \
    && curl -L https://github.com/smallstep/cli/releases/download/v${STEP_VERSION}/step_${STEP_VERSION}_linux_amd64.tar.gz -o /tmp/step/step_${STEP_VERSION}.tar.gz \
    && tar -xf /tmp/step/step_${STEP_VERSION}.tar.gz -C /tmp/step \
    && cd /tmp/step/step_${STEP_VERSION} \
    && mv ./bin/step /usr/bin/step

RUN echo " ... generating JWK/JWT ... " \
    && step crypto jwk create /tmp/pub.jwk.json /tmp/prv.jwk.json -f --insecure --no-password --kty RSA --kid test-jwk \
    && cat /tmp/pub.jwk.json | step crypto jwk keyset add /tmp/jwk.json \
    && export JWT_EXPIRY=$(date -d "+10 days" +%s) \
    && echo '{"email":"testuser@openwhisk.apache.org"}' | step crypto jwt sign --iss https://openwhisk.apache.org/apigateway --sub "test user" --exp $JWT_EXPIRY --aud tests --key /tmp/prv.jwk.json > /tmp/token.jwt

RUN mkdir -p /etc/api-gateway/tests
WORKDIR /etc/api-gateway/tests

# Install Lua dependencies
RUN luarocks install busted \
    && luarocks install luacov \
    && mkdir -p lua_modules \
    && luarocks install --tree=lua_modules lua-cjson \
    && luarocks install --tree=lua_modules luasocket \
    && luarocks install --tree=lua_modules sha1 \
    && luarocks install --tree=lua_modules md5 \
    && luarocks install --tree=lua_modules net-url \
    && luarocks install --tree=lua_modules luafilesystem \
    && luarocks install --tree=lua_modules lua-resty-http 0.10 \
    && luarocks install --tree=lua_modules https://github.com/mhamann/lua-resty-cjose/raw/master/lua-resty-cjose-0.5-0.rockspec

COPY . /etc/api-gateway

CMD sh run-tests.sh