|
| 1 | +#!/bin/bash |
| 2 | +# This script clones the SDK repo and updates it with the generated API modules |
| 3 | +# Pre-requisites: Java, goimports, Go |
| 4 | +set -eo pipefail |
| 5 | + |
| 6 | +ROOT_DIR=$(git rev-parse --show-toplevel) |
| 7 | +SDK_REPO_LOCAL_PATH="${ROOT_DIR}/sdk-repo-updated" |
| 8 | + |
| 9 | +OAS_REPO=https://github.com/stackitcloud/stackit-api-specifications |
| 10 | + |
| 11 | +SERVICES_FOLDER="${SDK_REPO_LOCAL_PATH}/services" |
| 12 | + |
| 13 | +GENERATOR_LOG_LEVEL="error" # Must be a Java log level (error, warn, info...) |
| 14 | + |
| 15 | +generate_python_sdk() { |
| 16 | + # Required parameters |
| 17 | + local GENERATOR_JAR_PATH=$1 |
| 18 | + local GIT_HOST=$2 |
| 19 | + local GIT_USER_ID=$3 |
| 20 | + |
| 21 | + # Optional parameters |
| 22 | + local GIT_REPO_ID=$4 |
| 23 | + local SDK_REPO_URL=$5 |
| 24 | + |
| 25 | + # Check required parameters |
| 26 | + if [[ -z ${GIT_HOST} ]]; then |
| 27 | + echo "GIT_HOST not specified." |
| 28 | + exit 1 |
| 29 | + fi |
| 30 | + |
| 31 | + if [[ -z ${GIT_USER_ID} ]]; then |
| 32 | + echo "GIT_USER_ID id not specified." |
| 33 | + exit 1 |
| 34 | + fi |
| 35 | + |
| 36 | + # Check optional parameters and set defaults if not provided |
| 37 | + if [[ -z ${GIT_REPO_ID} ]]; then |
| 38 | + echo "GIT_REPO_ID not specified, default will be used." |
| 39 | + GIT_REPO_ID="stackit-sdk-python" |
| 40 | + fi |
| 41 | + |
| 42 | + if [[ -z ${SDK_REPO_URL} ]]; then |
| 43 | + echo "SDK_REPO_URL not specified, default will be used." |
| 44 | + SDK_REPO_URL="https://github.com/stackitcloud/stackit-sdk-python.git" |
| 45 | + fi |
| 46 | + |
| 47 | + # Prepare folders |
| 48 | + if [[ ! -d $SERVICES_FOLDER ]]; then |
| 49 | + mkdir -p "$SERVICES_FOLDER" |
| 50 | + fi |
| 51 | + |
| 52 | + # Clone SDK repo |
| 53 | + if [ -d ${SDK_REPO_LOCAL_PATH} ]; then |
| 54 | + echo "Old SDK repo clone was found, it will be removed." |
| 55 | + rm -rf ${SDK_REPO_LOCAL_PATH} |
| 56 | + fi |
| 57 | + git clone --quiet ${SDK_REPO_URL} ${SDK_REPO_LOCAL_PATH} |
| 58 | + |
| 59 | + # Install SDK project tools |
| 60 | + cd ${ROOT_DIR} |
| 61 | + make project-tools |
| 62 | + |
| 63 | + # Backup of the current state of the SDK services dir (services/) |
| 64 | + sdk_services_backup_dir=$(mktemp -d) |
| 65 | + if [[ ! ${sdk_services_backup_dir} || -d {sdk_services_backup_dir} ]]; then |
| 66 | + echo "Unable to create temporary directory" |
| 67 | + exit 1 |
| 68 | + fi |
| 69 | + cleanup() { |
| 70 | + rm -rf ${sdk_services_backup_dir} |
| 71 | + } |
| 72 | + cp -a "${SERVICES_FOLDER}/." ${sdk_services_backup_dir} |
| 73 | + |
| 74 | + # Cleanup after we are done |
| 75 | + trap cleanup EXIT |
| 76 | + |
| 77 | + # Remove old contents of services dir (services/) |
| 78 | + rm -rf ${SERVICES_FOLDER} |
| 79 | + |
| 80 | + # Generate SDK for each service |
| 81 | + for service_json in ${ROOT_DIR}/oas/*.json; do |
| 82 | + service="${service_json##*/}" |
| 83 | + service="${service%.json}" |
| 84 | + |
| 85 | + # Remove invalid characters to ensure a valid Go pkg name |
| 86 | + service="${service//-/}" # remove dashes |
| 87 | + service="${service// /}" # remove empty spaces |
| 88 | + service="${service//_/}" # remove underscores |
| 89 | + service=$(echo "${service}" | tr '[:upper:]' '[:lower:]') # convert upper case letters to lower case |
| 90 | + service=$(echo "${service}" | tr -d -c '[:alnum:]') # remove non-alphanumeric characters |
| 91 | + |
| 92 | + echo "Generating \"${service}\" service..." |
| 93 | + cd ${ROOT_DIR} |
| 94 | + |
| 95 | + mkdir -p "${SERVICES_FOLDER}/${service}/" |
| 96 | + cp "${ROOT_DIR}/scripts/generate-sdk/.openapi-generator-ignore" "${SERVICES_FOLDER}/${service}/" |
| 97 | + |
| 98 | + # Run the generator |
| 99 | + java -Dlog.level=${GENERATOR_LOG_LEVEL} -jar ${jar_path} generate \ |
| 100 | + --generator-name python \ |
| 101 | + --input-spec "${service_json}" \ |
| 102 | + --output "${SERVICES_FOLDER}/${service}" \ |
| 103 | + --package-name "stackit.${service}" \ |
| 104 | + --template-dir "${ROOT_DIR}/templates/python/" \ |
| 105 | + --git-host ${GIT_HOST} \ |
| 106 | + --git-user-id ${GIT_USER_ID} \ |
| 107 | + --git-repo-id ${GIT_REPO_ID} \ |
| 108 | + --global-property apis,models,modelTests=false,modelDocs=false,apiDocs=false,apiTests=false,supportingFiles \ |
| 109 | + --additional-properties=pythonPackageName="stackit-${service},removeEnumValuePrefix=false" >/dev/null |
| 110 | + |
| 111 | + # Remove unnecessary files |
| 112 | + rm "${SERVICES_FOLDER}/${service}/.openapi-generator-ignore" |
| 113 | + rm -r "${SERVICES_FOLDER}/${service}/.openapi-generator/" |
| 114 | + rm "${SERVICES_FOLDER}/${service}/stackit/__init__.py" |
| 115 | + rm "${SERVICES_FOLDER}/${service}/.github/workflows/python.yml" |
| 116 | + |
| 117 | + |
| 118 | + # If the service has a wait package files, move them inside the service folder |
| 119 | + if [ -d ${sdk_services_backup_dir}/${service}/wait ]; then |
| 120 | + echo "Found ${service} \"wait\" package" |
| 121 | + cp -r ${sdk_services_backup_dir}/${service}/wait ${SERVICES_FOLDER}/${service}/wait |
| 122 | + fi |
| 123 | + |
| 124 | + # If the service has a CHANGELOG file, move it inside the service folder |
| 125 | + if [ -f ${sdk_services_backup_dir}/${service}/CHANGELOG.md ]; then |
| 126 | + echo "Found ${service} \"CHANGELOG\" file" |
| 127 | + cp -r ${sdk_services_backup_dir}/${service}/CHANGELOG.md ${SERVICES_FOLDER}/${service}/CHANGELOG.md |
| 128 | + fi |
| 129 | + |
| 130 | + # If the service has a LICENSE file, move it inside the service folder |
| 131 | + if [ -f ${sdk_services_backup_dir}/${service}/LICENSE.md ]; then |
| 132 | + echo "Found ${service} \"LICENSE\" file" |
| 133 | + cp -r ${sdk_services_backup_dir}/${service}/LICENSE.md ${SERVICES_FOLDER}/${service}/LICENSE.md |
| 134 | + fi |
| 135 | + |
| 136 | + # If the service has a NOTICE file, move it inside the service folder |
| 137 | + if [ -f ${sdk_services_backup_dir}/${service}/NOTICE.txt ]; then |
| 138 | + echo "Found ${service} \"NOTICE\" file" |
| 139 | + cp -r ${sdk_services_backup_dir}/${service}/NOTICE.txt ${SERVICES_FOLDER}/${service}/NOTICE.txt |
| 140 | + fi |
| 141 | + |
| 142 | + cd ${SERVICES_FOLDER}/${service} |
| 143 | + # Run formatter |
| 144 | + isort . |
| 145 | + autoimport --ignore-init-modules . |
| 146 | + black . |
| 147 | + |
| 148 | + done |
| 149 | +} |
0 commit comments