diff options
Diffstat (limited to 'external-schema-repo-generator/generator')
-rw-r--r-- | external-schema-repo-generator/generator/Makefile | 12 | ||||
-rwxr-xr-x | external-schema-repo-generator/generator/clean.sh | 42 | ||||
-rw-r--r-- | external-schema-repo-generator/generator/environment.config | 17 | ||||
-rwxr-xr-x | external-schema-repo-generator/generator/generate.sh | 282 | ||||
-rwxr-xr-x | external-schema-repo-generator/generator/install.sh | 114 | ||||
-rw-r--r-- | external-schema-repo-generator/generator/utils.sh | 43 |
6 files changed, 510 insertions, 0 deletions
diff --git a/external-schema-repo-generator/generator/Makefile b/external-schema-repo-generator/generator/Makefile new file mode 100644 index 0000000..93f3226 --- /dev/null +++ b/external-schema-repo-generator/generator/Makefile @@ -0,0 +1,12 @@ +include environment.config + +all: generate install + +generate: clean + ./generate.sh $(REPOSITORY_URL_HTTPS) $(REPOSITORY_BRANCH) $(SCHEMAS_LOCATION) $(VENDOR_NAME) $(EXTERNAL_REPO_CONFIGMAP_FILENAME_PREFIX) $(EXTERNAL_REPO_CONFIGMAP_NAME_PREFIX) $(SNIPPET_FILENAME) $(EXTERNAL_REPO_CONFIGMAP_DIRECTORY) $(GENERATION_DIRECTORY) + +install: + ./install.sh $(EXTERNAL_REPO_CONFIGMAP_FILENAME_PREFIX) $(EXTERNAL_REPO_CONFIGMAP_NAME_PREFIX) $(EXTERNAL_REPO_CONFIGMAP_DIRECTORY) $(GENERATION_DIRECTORY) + +clean: + ./clean.sh $(GENERATION_DIRECTORY) diff --git a/external-schema-repo-generator/generator/clean.sh b/external-schema-repo-generator/generator/clean.sh new file mode 100755 index 0000000..8a91d18 --- /dev/null +++ b/external-schema-repo-generator/generator/clean.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +# ============LICENSE_START======================================================= +# OOM +# ================================================================================ +# Copyright (C) 2021 Nokia. All rights reserved. +# ================================================================================ +# Licensed 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. +# ============LICENSE_END========================================================= + +. ./utils.sh + +# Arguments renaming +arguments_number=$# +generation_directory=$1 + +remove_generated_directory() { + check_arguments $arguments_number $EXPECTED_1_ARG + echo "Removing generated directory: $1" + rm -rf $1 +} + +main() { + check_arguments $arguments_number $EXPECTED_1_ARG + directory_to_remove="./$generation_directory/" + if [ -d "$directory_to_remove" ] + then + remove_generated_directory $directory_to_remove + else + echo "Nothing to clean. No directory: $directory_to_remove" + fi +} + +main diff --git a/external-schema-repo-generator/generator/environment.config b/external-schema-repo-generator/generator/environment.config new file mode 100644 index 0000000..95e94ba --- /dev/null +++ b/external-schema-repo-generator/generator/environment.config @@ -0,0 +1,17 @@ +# Configuration file for externalSchemaRepoGenerator Makefile +# Remember about escaping special characters, e.g. in REPOSITORY_URL + +# ConfigMap configuration +GENERATION_DIRECTORY=generated +EXTERNAL_REPO_CONFIGMAP_FILENAME_PREFIX=external-repo-configmap-spec +EXTERNAL_REPO_CONFIGMAP_DIRECTORY=specs +EXTERNAL_REPO_CONFIGMAP_NAME_PREFIX=external-repo-configmap +SNIPPET_FILENAME=ves-snippet.md + +# Source repository configuration +REPOSITORY_URL_HTTPS=https\://forge.3gpp.org/rep/sa5/MnS.git +REPOSITORY_BRANCH="SA88-Rel16 SA89-Rel17" +SCHEMAS_LOCATION=OpenAPI + +# Vendor description +VENDOR_NAME=3gpp diff --git a/external-schema-repo-generator/generator/generate.sh b/external-schema-repo-generator/generator/generate.sh new file mode 100755 index 0000000..29ddf85 --- /dev/null +++ b/external-schema-repo-generator/generator/generate.sh @@ -0,0 +1,282 @@ +#!/bin/sh + +# ============LICENSE_START======================================================= +# OOM +# ================================================================================ +# Copyright (C) 2020-2021 Nokia. All rights reserved. +# ================================================================================ +# Licensed 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. +# ============LICENSE_END========================================================= + +. ./utils.sh + +# Arguments renaming +arguments_number=$# +repo_url=$1 +branches=$2 +schemas_location=$3 +vendor=$4 +configmap_filename=$5 +configmap_name=$6 +snippet_filename=$7 +specs_directory=$8 +generation_directory=$9 + +# Constants +SCHEMA_MAP_FILENAME="schema-map.json" +SCHEMA_MAP_NAME="schema-map" +SUCCESS_CODE=0 +TREE=tree +INDENTATION_LEVEL_1=1 +INDENTATION_LEVEL_2=2 +INDENTATION_LEVEL_3=3 +INDENTATION_LEVEL_4=4 +INDENTATION_LEVEL_5=5 + +# Variables +tmp_location=$(mktemp -d) +valid_branches="" + +# Create and move to directory for storing generated files +move_to_generation_directory() { + mkdir "$generation_directory" + cd ./"$generation_directory" +} + +# Indents each line of string by adding indent_size*indent_string spaces on the beginning +# Optional argument is indent_string level, default: 1 +# correct usage example: +# echo "Sample Text" | indent_string 2 +indent_string() { + indent_size=2 + indent_string=1 + if [ -n "$1" ]; then indent_string=$1; fi + pr -to $(expr "$indent_string" \* "$indent_size") +} + +# Clones all branches selected in $BRANCH from $repo_url +clone_repo() { + for actual_branch in $branches; do + clone_branch "$actual_branch" + done +} + +# Clones single branch $1 from $repo_url. +# $1 - branch name +clone_branch() { + check_arguments $# $EXPECTED_1_ARG + if [ -d $tmp_location/"$1" ]; then + echo "Skipping cloning repository." + echo "Branch $1 has already been cloned in the directory ./$tmp_location/$1" + echo "To redownload branch remove ./$tmp_location/$1." + else + echo "Cloning repository from branch $1" + git clone --quiet --single-branch --branch "$1" "$repo_url" "$tmp_location/$1" 2>/dev/null + result=$? + if [ $result -ne $SUCCESS_CODE ] ; then + echo "Problem with cloning branch $1." + echo "Branch $1 will not be added to spec." + else + valid_branches="${valid_branches} $1" + fi + fi +} + +# Creates file with name $configmap_filename +# Inserts ConfigMap metadata and sets name as $configmap_name +# $1 - branch name +add_config_map_metadata() { + branch_configmap_filename="${configmap_filename}-$1.yaml" + branch_configmap_name=$( echo "$configmap_name-$1" | tr '[:upper:]' '[:lower:]' ) + echo "Creating ConfigMap spec file: $branch_configmap_filename" + cat << EOF > "$branch_configmap_filename" +apiVersion: v1 +kind: ConfigMap +metadata: + name: $branch_configmap_name + labels: + name: $branch_configmap_name + namespace: onap +data: +EOF +} + +# For each selected branch: +# clones the branch from repository, +# adds schemas from branch to ConfigMap spec +# $1 - branch name +add_schemas() { + echo "Adding schemas from branch $1 to spec" + add_schemas_from_branch "$1" +} + +# Adds schemas from single branch to spec +# $1 - branch name +add_schemas_from_branch() { + branch_configmap_filename="${configmap_filename}-$1.yaml" + check_arguments $# $EXPECTED_1_ARG + schemas=$(ls -g $tmp_location/$1/$schemas_location/*.yaml | awk '{print $NF}') + for schema in $schemas; do + echo "$1-$(basename $schema): |-" | indent_string $INDENTATION_LEVEL_1 + cat "$schema" | indent_string $INDENTATION_LEVEL_2 + done +} >> "$branch_configmap_filename" + +move_to_spec_directory() { + mkdir "$specs_directory" + cd ./"$specs_directory" +} + +# Generates mapping file for collected schemas directly in spec +# $1 - schema map name +generate_mapping_file() { + schema_map_filename="${configmap_filename}-$1.yaml" + echo "Generating mapping file in spec" + echo "$SCHEMA_MAP_FILENAME"": |-" | indent_string $INDENTATION_LEVEL_1 >> "$schema_map_filename" + echo "[" | indent_string $INDENTATION_LEVEL_2 >> "$schema_map_filename" + + for actual_branch in $valid_branches; do + echo "Adding mappings from branch: $actual_branch" + add_mappings_from_branch $actual_branch $schema_map_filename + done + + truncate -s-2 "$schema_map_filename" + echo "" >> "$schema_map_filename" + echo "]" | indent_string $INDENTATION_LEVEL_2 >> "$schema_map_filename" +} + +# Adds mappings from single branch directly to spec +# $1 - branch name +# $2 - schema map file name +add_mappings_from_branch() { + check_arguments $# $EXPECTED_2_ARGS + schema_map_filename="$2" + schemas=$(ls -g $tmp_location/$1/$schemas_location/*.yaml | awk '{print $NF}' ) + + for schema in $schemas; do + repo_endpoint=$(echo "$repo_url" | cut -d/ -f4- | rev | cut -d. -f2- | rev) + schema_repo_path=$(echo "$schema" | cut -d/ -f4-) + public_url_schemas_location=${repo_url%.*} + public_url=$public_url_schemas_location/$TREE/$schema_repo_path + local_url=$vendor/$repo_endpoint/$TREE/$schema_repo_path + + echo "{" | indent_string $INDENTATION_LEVEL_3 >> "$schema_map_filename" + echo "\"publicURL\": \"$public_url\"," | indent_string $INDENTATION_LEVEL_4 >> "$schema_map_filename" + echo "\"localURL\": \"$local_url\"" | indent_string $INDENTATION_LEVEL_4 >> "$schema_map_filename" + echo "}," | indent_string $INDENTATION_LEVEL_3 >> "$schema_map_filename" + done +} + +# Create snippet file to describe how to connect mount ConfigMaps in VES +create_snippet() { + echo "Generating snippets in file: $snippet_filename" + generate_entries + base_mounts_path="/opt/app/VESCollector/etc/externalRepo" + base_mounts_name="external-repo-$vendor-schemas" + mounts_paths=" + - mountPath: $base_mounts_path/schema-map + name: $base_mounts_name" + + config_maps=" + - configMap: + defaultMode: 420 + name: $configmap_name-$SCHEMA_MAP_NAME + name: $base_mounts_name" + + for actual_branch in $valid_branches; do + + actual_branch_name=$( echo "$actual_branch" | tr '[:upper:]' '[:lower:]' ) + + repo_endpoint=$(echo "$repo_url" | cut -d/ -f4- | rev | cut -d. -f2- | rev) + local_url=$vendor/$repo_endpoint/$TREE/$actual_branch/$schemas_location + mounts_paths="$mounts_paths + - mountPath: $base_mounts_path/$local_url + name: $base_mounts_name-$actual_branch_name" + + config_maps="$config_maps + - configMap: + defaultMode: 420 + name: $configmap_name-$actual_branch_name + name: $base_mounts_name-$actual_branch_name" + done + + + cat << EOF > "$snippet_filename" +Snippets for mounting ConfigMap in DCAE VESCollector Deployment +========================================================================= + +## Description +These snippets will override existing in VESCollector schemas and mapping file. + +No extra configuration in VESCollector is needed with these snippets. + +## Snippets +#### spec.template.spec.containers[0].volumeMounts +\`\`\`$mounts_paths +\`\`\` + +#### spec.template.spec.volumes +\`\`\`$config_maps +\`\`\` +EOF +} + +generate_entries() { + for actual_branch in $valid_branches; do + schemas=$(ls -g $tmp_location/$actual_branch/$schemas_location/*.yaml | awk '{print $NF}') + for schema in $schemas; do + repo_endpoint=$(echo "$repo_url" | cut -d/ -f4- | rev | cut -d. -f2- | rev) + schema_repo_path=$(echo "$schema" | cut -d/ -f4-) + + key="$actual_branch-$(basename "$schema")" + path=$vendor/$repo_endpoint/$TREE/$schema_repo_path + schemas_entries="$schemas_entries- key: $key\n path: $path\n" + done + done + schemas_entries=$(echo "$schemas_entries" | indent_string $INDENTATION_LEVEL_5) +} + +# Generate specs for branch +# $1 - branch name +generate_specs_for_branch() { + check_arguments $# $EXPECTED_1_ARG + add_config_map_metadata $1 + add_schemas $1 +} + +# Generate specs for schema map +generate_specs_for_schema_map() { + add_config_map_metadata "$SCHEMA_MAP_NAME" + generate_mapping_file "$SCHEMA_MAP_NAME" +} + +# Generate specs for all releases and for schema map +generate_specs() { + move_to_spec_directory + for actual_branch in $valid_branches; do + generate_specs_for_branch $actual_branch + done + generate_specs_for_schema_map + cd .. +} + + +# todo add check of global env whether script should be ran +main() { + check_arguments $arguments_number $EXPECTED_9_ARGS + move_to_generation_directory + clone_repo + generate_specs + create_snippet + move_to_starting_directory +} + +main diff --git a/external-schema-repo-generator/generator/install.sh b/external-schema-repo-generator/generator/install.sh new file mode 100755 index 0000000..e6c8bbc --- /dev/null +++ b/external-schema-repo-generator/generator/install.sh @@ -0,0 +1,114 @@ +#!/bin/sh + +# ============LICENSE_START======================================================= +# OOM +# ================================================================================ +# Copyright (C) 2020-2021 Nokia. All rights reserved. +# ================================================================================ +# Licensed 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. +# ============LICENSE_END========================================================= + +. ./utils.sh + +# Arguments renaming +arguments_number=$# +spec_configmap_filename=$1 +k8s_configmap_name=$2 +specs_directory=$3 +generation_directory=$4 + +# Constants +MAX_CONFIG_MAP_UPDATE_SIZE=262144 # If ConfigMaps is bigger then this value (in Bytes) it can not be updated +MAX_SPEC_SIZE=1048576 # 1MB + +# Alias +alias kubectl_onap="kubectl -n onap" + +# Checks whether ConfigMap exists +# When file does not exist exits with return code 1 +# $1 - name of spec_configmap_filename +check_if_spec_exists() { + check_arguments $# $EXPECTED_1_ARG + spec_filename="$1" + if [ ! -f "$spec_filename" ]; then + echo "Spec file $spec_filename does not exist." + # todo add location of spec with filename + exit 1 + fi +} + +# If spec file is to big to be apply it needs to be created +# If ConfigMap with same name exists, iot needs do be destroyed +# $1 - name of spec file +create_config_map() { + echo "ConfigMap spec file is too long for 'kubectl apply'. Actual spec length: $spec_size, max spec length: $MAX_CONFIG_MAP_UPDATE_SIZE" + echo "Creating new ConfigMap $k8s_configmap_name" + kubectl_onap replace --force -f "$spec_filename" +} + +# Install ConfigMap from spec +# $1 - name of spec file +# $2 - size of spec file +install_config_map() { + check_arguments $# $EXPECTED_2_ARGS + spec_filename="$1" + spec_size="$2" + if [ "$spec_size" -le $MAX_CONFIG_MAP_UPDATE_SIZE ]; then + echo "Applying ConfigMap $k8s_configmap_name" + kubectl_onap apply -f "$spec_filename" + else + create_config_map + fi +} + +# Uploads ConfigMap spec to Kubernetes +# $1 - name of spec_configmap_filename +upload_config_map() { + check_arguments $# $EXPECTED_1_ARG + spec_filename="$1" + spec_size=$(stat --printf="%s" "$spec_filename") + if [ "$spec_size" -le "$MAX_SPEC_SIZE" ]; then + install_config_map $spec_filename $spec_size + else + echo "WARNING!!!!" + echo " Config file is to big to be installed" + echo " Config file size is: $spec_size Bytes" + echo " Max size is: $MAX_SPEC_SIZE Bytes" + fi +} + +# install all specs located in generated specs directory +# $1 - branch name +install_all_spec_in_directory() { + FILES="./*" + for f in $FILES + do + echo "installing $f" + check_if_spec_exists $f + upload_config_map $f + done +} + +# Moving to directory containing specs +move_to_specs_directory() { + target_directory="$generation_directory/$specs_directory" + echo "Moving to directory containing specs: $target_directory" + cd ./"$target_directory" +} + +main() { + check_arguments $arguments_number $EXPECTED_4_ARGS + move_to_specs_directory + install_all_spec_in_directory + move_to_starting_directory +} + +main diff --git a/external-schema-repo-generator/generator/utils.sh b/external-schema-repo-generator/generator/utils.sh new file mode 100644 index 0000000..de32515 --- /dev/null +++ b/external-schema-repo-generator/generator/utils.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +# ============LICENSE_START======================================================= +# OOM +# ================================================================================ +# Copyright (C) 2021 Nokia. All rights reserved. +# ================================================================================ +# Licensed 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. +# ============LICENSE_END========================================================= + +# Variables +starting_directory="$PWD" + +# Constants +EXPECTED_1_ARG=1 +EXPECTED_2_ARGS=2 +EXPECTED_4_ARGS=4 +EXPECTED_9_ARGS=9 + + +# Checks whether number of arguments is valid +# $1 is actual number of arguments +# $2 is expected number of arguments +check_arguments() { + if [ "$1" -ne "$2" ]; then + echo "Incorrect number of arguments" + exit 1 + fi +} + +# Go back to directory from which script was called +move_to_starting_directory() { + echo "Moving back to: $starting_directory" + cd $starting_directory +} |