From 9c8ebfec228c800bae13cb61948032230dad14ef Mon Sep 17 00:00:00 2001 From: Michele Carignani <michele.carignani@etsi.org> Date: Wed, 22 Nov 2017 17:09:09 +0100 Subject: [PATCH] Validation in a docker container of the API descriptions + documentation Change-Id: I9a01cc8c307d26058b1c2775abe828e1f0e5016b Signed-off-by: Michele Carignani <michele.carignani@etsi.org> --- .gitignore | 1 + .jenkins.sh | 17 +++++++ Readme.md | 21 +++++++++ docker/Dockerfile | 16 +++++++ docker/build-container.sh | 5 ++ docker/run-container.sh | 18 ++++++++ docker/validate-in-docker.sh | 90 ++++++++++++++++++++++++++++++++++++ 7 files changed, 168 insertions(+) create mode 100644 .gitignore create mode 100755 .jenkins.sh create mode 100644 docker/Dockerfile create mode 100755 docker/build-container.sh create mode 100755 docker/run-container.sh create mode 100755 docker/validate-in-docker.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..567609b1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/.jenkins.sh b/.jenkins.sh new file mode 100755 index 00000000..f641f31a --- /dev/null +++ b/.jenkins.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright ETSI 2017 +# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt + +cd "$(dirname "$0")" + +run_dir="$(pwd)/src" +store_dir="$(pwd)/build" + +mkdir -p "$store_dir" + +cd docker + +./build-container.sh +./run-container.sh "${run_dir}" "${store_dir}" + +exit $? diff --git a/Readme.md b/Readme.md index 8d3f27ea..918fe740 100644 --- a/Readme.md +++ b/Readme.md @@ -9,6 +9,27 @@ The APIs described in this repository are defined for the following reference po More information at [NFV Solutions wiki](https://nfvwiki.etsi.org/index.php?title=NFV_Solutions). +## Content structure + +All the main OpenAPI files should be put in the `src` directory and organized with the following schema: + + src/deliverable-number/api-name/api-name.yaml + +e.g. + + src/SOL003/LifeCycleManagement/lifeCycleManagement.yaml + + +## Building + +The build file `.jenkins.sh` will validate the files, evaluate JSON references and store the generated files in the build directory. In case the build is executed by Jenkins, the merged file will be store in a specific directory to be web-served. + +To build locally, once Docker is installed, simple run + + $sudo bash .jenkins.sh + +and the results will be stored in a `build/` directory in the project folder. + ## How to raise issues Change requests can be filed at [ETSI Forge Bugzilla](https://forge.etsi.org/bugzilla/enter_bug.cgi?product=NFV). diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 00000000..8d7280cf --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,16 @@ +# Copyright ETSI 2017 +# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt + +FROM alpine:3.6 + +RUN apk update +RUN apk add bash +RUN apk add nodejs +RUN apk add nodejs-npm +RUN npm install -g swagger-tools@0.10.3 +RUN npm install -g json-refs@3.0.2 + +ADD validate-in-docker.sh /validate-in-docker.sh +RUN chmod +x /validate-in-docker.sh + +CMD ["/validate-in-docker.sh", "/work", "/storage"] diff --git a/docker/build-container.sh b/docker/build-container.sh new file mode 100755 index 00000000..7c10a385 --- /dev/null +++ b/docker/build-container.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# Copyright ETSI 2017 +# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt + +docker build -t openapivalidator . \ No newline at end of file diff --git a/docker/run-container.sh b/docker/run-container.sh new file mode 100755 index 00000000..3742c37f --- /dev/null +++ b/docker/run-container.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# Copyright ETSI 2017 +# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt + +if [ -n "$JOB_BASE_NAME" ] ; then + s="/var/www/html/api/nfv/$JOB_BASE_NAME/$GIT_COMMIT" +else + s="${2:-`pwd`}" +fi + +f="${1:-`pwd`}" + +mkdir -v -p "$s" + +echo "Mounting dir $f as /work" +echo "Mounting dir $s as /storage" + +docker run -v "$f":/work -v "$s":/storage openapivalidator diff --git a/docker/validate-in-docker.sh b/docker/validate-in-docker.sh new file mode 100755 index 00000000..70d316cf --- /dev/null +++ b/docker/validate-in-docker.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# Copyright ETSI 2017 +# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt + +# Merges OpenAPIs interfaces in the working directory +# and validates them individually. +# Exit status is 0 if all validation passed, 1 otherwise + +# Usage: +# $0 <working-directory> <storage-dir> + +#set -x + +function store_api () { + f="$1" + cp -v "$1" "${storage_dir}/" +} + +function validate_api () { + file="$1" + api="$2" + deliverable="$3" + echo "--- Merging file." + merged_file="${deliverable}-${api}-API.yaml" + json-refs resolve "${file}" > "${merged_file}" + + echo "--- Validating ${merged_file}" + swagger-tools validate "${merged_file}" + vres=$? + echo "--- Validation done ($res)." + + # If validation succedes, store the generated file + [ $vres ] && store_api "${merged_file}" + + return $vres +} + + +## Main ## + +wd="${1?"Usage: $0 <working-directory> <storage-directory>"}" +storage_dir="${2?"Usage: $0 <working-directory> <storage-directory>"}" + +echo "Entering dir $wd" +cd "$wd" + +# Stores the overall validation result +# (single results in OR) +fres=0 + +for d in */ ; do + + if [ -z "$d" -o "$d" = "*/" ]; then + continue + fi + + deliverable="${d::-1}" + echo "#### Checking directory $deliverable ($d)" + + cd "$deliverable" + for dd in */ ; do + + if [ -z "$dd" -o "$dd" = "*/" ]; then + continue + fi + + api="${dd::-1}" + echo "########## Checking directory $api ($dd)" + cd "$dd" + for file in ./*; do + file_name="${file:2}" + #echo "-- $file" + #echo "-- Checking file $file_name" + + if [ "$file_name" == "$api.yaml" ]; then + validate_api "$file_name" "$api" "$deliverable" + res=$? + fres=$(($fres||$res)) + fi + done + echo + cd .. + done + cd .. +done + +# Exit code needed for jenkins to know the verdict of the build +echo "-- Final validator returns $fres." +exit $fres + -- GitLab