#!/bin/bash
# Script to create latest swagger spec.
source "$(dirname "${BASH_SOURCE}")/lib/init.sh"
function cleanup() {
out=$?
cleanup_openshift
if [ $out -ne 0 ]; then
echo "[FAIL] !!!!! Generate Failed !!!!"
echo
tail -100 "${LOG_DIR}/openshift.log"
echo
echo -------------------------------------
echo
fi
exit $out
}
trap "exit" INT TERM
trap "cleanup" EXIT
export ALL_IP_ADDRESSES=127.0.0.1
export SERVER_HOSTNAME_LIST=127.0.0.1
export API_BIND_HOST=127.0.0.1
export API_PORT=38443
export ETCD_PORT=34001
export ETCD_PEER_PORT=37001
os::util::environment::setup_all_server_vars "generate-swagger-spec/"
os::start::configure_server
SWAGGER_SPEC_REL_DIR="${1:-}"
SWAGGER_SPEC_OUT_DIR="${OS_ROOT}/${SWAGGER_SPEC_REL_DIR}/api/swagger-spec"
mkdir -p "${SWAGGER_SPEC_OUT_DIR}"
# Start openshift
os::start::master
os::log::info "Updating ${SWAGGER_SPEC_OUT_DIR}:"
endpoint_types=("oapi" "api")
for type in "${endpoint_types[@]}"; do
endpoints=("v1")
for endpoint in "${endpoints[@]}"; do
generated_file="${SWAGGER_SPEC_OUT_DIR}/${type}-${endpoint}.json"
os::log::info "Updating ${generated_file} from /swaggerapi/${type}/${endpoint}..."
oc get --raw "/swaggerapi/${type}/${endpoint}" --config="${MASTER_CONFIG_DIR}/admin.kubeconfig" > "${generated_file}"
os::util::sed 's|https://127.0.0.1:38443|https://127.0.0.1:8443|g' "${generated_file}"
printf '\n' >> "${generated_file}"
done
done
# Swagger 2.0 / OpenAPI docs
generated_file="${SWAGGER_SPEC_OUT_DIR}/openshift-openapi-spec.json"
oc get --raw "/swagger.json" --config="${MASTER_CONFIG_DIR}/admin.kubeconfig" > "${generated_file}"
os::util::sed 's|https://127.0.0.1:38443|https://127.0.0.1:8443|g' "${generated_file}"
os::util::sed -r 's|"version": "[^\"]+"|"version": "latest"|g' "${generated_file}"
printf '\n' >> "${generated_file}"
# Copy all protobuf generated specs into the api/protobuf-spec directory
proto_spec_out_dir="${OS_ROOT}/${SWAGGER_SPEC_REL_DIR}/api/protobuf-spec"
mkdir -p "${proto_spec_out_dir}"
for proto_file in $( find "${OS_ROOT}/pkg" "${OS_ROOT}/vendor/k8s.io/kubernetes/pkg" -name generated.proto ); do
# package declaration lines will always begin with
# `package ` and end with `;` so to extract the
# package name without lookarounds we can simply
# strip characters
package_declaration="$( grep -E '^package .+;$' "${proto_file}" )"
package="$( echo "${package_declaration}" | cut -c 9- | cut -f 1-1 -d ';' )"
# we want our OpenAPI documents to use underscores
# as separators for package specifiers, not periods
# as in the proto files
openapi_file="${package//./_}.proto"
cp "${proto_file}" "${proto_spec_out_dir}/${openapi_file}"
done
os::log::info "SUCCESS"