diff --git a/.github/workflows/blackbox.yml b/.github/workflows/blackbox.yml index 1ae1eb6..cc38dcb 100644 --- a/.github/workflows/blackbox.yml +++ b/.github/workflows/blackbox.yml @@ -47,12 +47,6 @@ jobs: --file=Makefile.workflow \ github:build:blackbox:module \ ansible-aws - - name: Build Blackbox "aws" module - run: | - make \ - --file=Makefile.workflow \ - github:build:blackbox:module \ - aws # - name: Build Blackbox "chef" module # run: | # make \ @@ -130,12 +124,6 @@ jobs: --file=Makefile.workflow \ github:push:blackbox:module \ ansible-aws - - name: Push Blackbox "aws" module - run: | - make \ - --file=Makefile.workflow \ - github:push:blackbox:module \ - aws # - name: Push Blackbox "chef" module # run: | # make \ diff --git a/.gitignore b/.gitignore index 85e7c1d..c84990b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /.idea/ + +.vagrant/ diff --git a/docs/module/aws/check/build.step.md b/docs/module/aws/check/build.step.md deleted file mode 100644 index 1f4793f..0000000 --- a/docs/module/aws/check/build.step.md +++ /dev/null @@ -1,9 +0,0 @@ -# module/aws/check/build.step - -https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/build.step - -## Overview - -AWS module "check" action "build" step - - diff --git a/docs/module/aws/check/evaluate/assert.evaluate.md b/docs/module/aws/check/evaluate/assert.evaluate.md new file mode 100644 index 0000000..c7e2d3c --- /dev/null +++ b/docs/module/aws/check/evaluate/assert.evaluate.md @@ -0,0 +1,71 @@ +# module/aws/check/evaluate/assert.evaluate + +https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/evaluate/assert.evaluate + +## Overview + +Step "evaluate" asserter + +## Index + +* [blackbox.module.aws.check.evaluate.assert.false](#blackboxmoduleawscheckevaluateassertfalse) +* [blackbox.module.aws.check.evaluate.assert.normalize](#blackboxmoduleawscheckevaluateassertnormalize) +* [blackbox.module.aws.check.evaluate.assert.true](#blackboxmoduleawscheckevaluateasserttrue) + +## blackbox.module.aws.check.evaluate.assert.* + +### blackbox.module.aws.check.evaluate.assert.false + +#### Example + +```bash +# Asserts the false expression "(false -eq true)" with missing "10" score and a specific message that has an argument +blackbox.module.aws.check.evaluate.assert.false "(false -eq true)" 10 "Assert message with argument '%s'" "argument" +``` + +#### Arguments + +* **$1** (type=string): Assert expression +* **$2** (type=enum<1..100|->): Score value: absolute (if integer) or relative (if "-") +* **$3** (type=string): Assert message + +#### Output on stdout + +* Formatted assert + +### blackbox.module.aws.check.evaluate.assert.normalize + +#### Example + +```bash +# Normalize assert expression +blackbox.module.aws.check.evaluate.assert.normalize "(true -eq true)" +``` + +#### Arguments + +* **$1** (type=string): Assert expression + +#### Output on stdout + +* Normalized assert + +### blackbox.module.aws.check.evaluate.assert.true + +#### Example + +```bash +# Asserts the true expression "(true -eq true)" with "10" score and a specific message that has an argument +blackbox.module.aws.check.evaluate.assert.true "(true -eq true)" 10 "Assert message with argument '%s'" "argument" +``` + +#### Arguments + +* **$1** (type=string): Assert expression +* **$2** (type=enum<1..100|->): Score value: absolute (if integer) or relative (if "-") +* **$3** (type=string): Assert message + +#### Output on stdout + +* Formatted assert + diff --git a/docs/module/aws/check/evaluate/expect.evaluate.md b/docs/module/aws/check/evaluate/expect.evaluate.md new file mode 100644 index 0000000..c517a63 --- /dev/null +++ b/docs/module/aws/check/evaluate/expect.evaluate.md @@ -0,0 +1,9 @@ +# module/aws/check/evaluate/expect.evaluate + +https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/evaluate/expect.evaluate + +## Overview + +Step "evaluate" expectant + + diff --git a/docs/module/aws/check/evaluate/expect/artifact.expect.md b/docs/module/aws/check/evaluate/expect/artifact.expect.md new file mode 100644 index 0000000..002541a --- /dev/null +++ b/docs/module/aws/check/evaluate/expect/artifact.expect.md @@ -0,0 +1,38 @@ +# module/aws/check/evaluate/expect/artifact.expect + +https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/evaluate/expect/artifact.expect + +## Overview + +Artifact collection expectant + +## Index + +* [blackbox.module.aws.check.evaluate.expect.artifact.collection](#blackboxmoduleawscheckevaluateexpectartifactcollection) + +## blackbox.module.aws.check.evaluate.expect.artifact.* + +### blackbox.module.aws.check.evaluate.expect.artifact.collection + +#### Example + +```bash +# Collect a list of artifacts +cat <): Score value: absolute (if integer) or relative (if "-") +* **$3** (type=string): Assert failure message +* **$4** (type=...mixed): Assert message args + +#### Input on stdin + +* Assert expression + +#### Output on stdout + +* Formatted assert + diff --git a/docs/module/aws/check/evaluate/expect/shell.expect.md b/docs/module/aws/check/evaluate/expect/shell.expect.md new file mode 100644 index 0000000..293dda2 --- /dev/null +++ b/docs/module/aws/check/evaluate/expect/shell.expect.md @@ -0,0 +1,139 @@ +# module/aws/check/evaluate/expect/shell.expect + +https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/evaluate/expect/shell.expect + +## Overview + +Shell expressions expectant + +## Index + +* [blackbox.module.aws.check.evaluate.expect.shell.debug](#blackboxmoduleawscheckevaluateexpectshelldebug) +* [blackbox.module.aws.check.evaluate.expect.shell.failure](#blackboxmoduleawscheckevaluateexpectshellfailure) +* [blackbox.module.aws.check.evaluate.expect.shell.stderr](#blackboxmoduleawscheckevaluateexpectshellstderr) +* [blackbox.module.aws.check.evaluate.expect.shell.stdout](#blackboxmoduleawscheckevaluateexpectshellstdout) +* [blackbox.module.aws.check.evaluate.expect.shell.success](#blackboxmoduleawscheckevaluateexpectshellsuccess) + +## blackbox.module.aws.check.evaluate.expect.shell.* + +### blackbox.module.aws.check.evaluate.expect.shell.debug + +#### Example + +```bash +# Debug output +cat <): Score value: absolute (if integer) or relative (if "-") +* **$3** (type=string): Assert failure message +* **$4** (type=...mixed): Assert message args + +#### Input on stdin + +* Assert expression + +#### Output on stdout + +* Formatted assert + +### blackbox.module.aws.check.evaluate.expect.shell.stderr + +#### Example + +```bash +# Expression that should have a stderr +cat <): Score value: absolute (if integer) or relative (if "-") +* **$3** (type=string): Assert failure message +* **$4** (type=...mixed): Assert message args + +#### Input on stdin + +* Assert expression + +#### Output on stdout + +* Formatted assert + +### blackbox.module.aws.check.evaluate.expect.shell.stdout + +#### Example + +```bash +# Expression that should have a stdout +cat <): Score value: absolute (if integer) or relative (if "-") +* **$3** (type=string): Assert failure message +* **$4** (type=...mixed): Assert message args + +#### Input on stdin + +* Assert expression + +#### Output on stdout + +* Formatted assert + +### blackbox.module.aws.check.evaluate.expect.shell.success + +#### Example + +```bash +# Expression that should succeed +cat <): Score value: absolute (if integer) or relative (if "-") +* **$3** (type=string): Assert failure message +* **$4** (type=...mixed): Assert message args + +#### Input on stdin + +* Assert expression + +#### Output on stdout + +* Formatted assert + diff --git a/docs/module/aws/check/evaluate/score.evaluate.md b/docs/module/aws/check/evaluate/score.evaluate.md new file mode 100644 index 0000000..2a6a21c --- /dev/null +++ b/docs/module/aws/check/evaluate/score.evaluate.md @@ -0,0 +1,46 @@ +# module/aws/check/evaluate/score.evaluate + +https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/evaluate/score.evaluate + +## Overview + +Step "evaluate" score calculator + +## Index + +* [blackbox.module.aws.check.evaluate.score.calculate](#blackboxmoduleawscheckevaluatescorecalculate) +* [blackbox.module.aws.check.evaluate.score.__init](#blackboxmoduleawscheckevaluatescoreinit) + +## blackbox.module.aws.check.evaluate.score.* + +### blackbox.module.aws.check.evaluate.score.calculate + +#### Example + +```bash +# Calculates a score: 10 if success or 0 if failure +blackbox.module.aws.check.evaluate.score.calculate 10 +# Calculates a score: automatic average if success or 0 if failure +blackbox.module.aws.check.evaluate.score.calculate - +``` + +#### Arguments + +* **$1** (type=enum<1..100|->): Score value: absolute (if integer) or relative (if "-") + +#### Output on stdout + +* Calculated score + +### blackbox.module.aws.check.evaluate.score.__init + +_Function has no arguments._ + +#### Variables set + +* **BLACKBOX_CHECK_EVALUATE_SCORE_CALCULATE_CACHE** (readonly,type=string,default=auto): Path to the question evaluation cache (sets automatically, do not override) + +#### See also + +* [blackbox.module.aws.check.evaluate.score](#blackboxmoduleawscheckevaluatescore) + diff --git a/module/aws/check.action b/module/aws/check.action index e501185..2550b2b 100644 --- a/module/aws/check.action +++ b/module/aws/check.action @@ -5,5 +5,20 @@ # @section blackbox.module.aws.* blackbox.module.aws.check() { - : <<< blackbox.framework.module.abstract.check:action + # shellcheck disable=SC2034 + typeset question_id=$1 + typeset -a step_args=("${@:2}") + + { + blackbox.framework.trace "${FUNCNAME[0]}" "$*" <<<"" + } + + if [ ! -e "/blackbox/module/${BLACKBOX_MODULE_NAME}/check.action" ]; then + blackbox.framework.exception.raise "action '%s:check' not found" "$BLACKBOX_MODULE_NAME" + fi + + blackbox.framework.import "blackbox.module.${BLACKBOX_MODULE_NAME}.check.provision:step" "${step_args[@]}" + blackbox.framework.import "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate:step" "${step_args[@]}" + + : <<< blackbox.module.*.check } diff --git a/module/aws/check/build.step b/module/aws/check/build.step deleted file mode 100644 index 38f6e7a..0000000 --- a/module/aws/check/build.step +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -# @file module/aws/check/build.step -# @brief https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/build.step -# @description AWS module "check" action "build" step - -# @section blackbox.module.aws.check.* -blackbox.module.aws.check.build() { - : <<< blackbox.framework.module.abstract.check.build:step - - # shellcheck disable=SC2034 - declare build_cmd=( - "source %s" - "/dev/null" - ) -} diff --git a/module/aws/check/evaluate.step b/module/aws/check/evaluate.step index 5c313ee..9797c04 100644 --- a/module/aws/check/evaluate.step +++ b/module/aws/check/evaluate.step @@ -5,5 +5,44 @@ # @section blackbox.module.aws.check.* blackbox.module.aws.check.evaluate() { - : <<< blackbox.framework.module.abstract.check.evaluate:step + # shellcheck disable=SC2034 + typeset -a args=("$@") + + { + blackbox.framework.trace "${FUNCNAME[0]}" "$*" <<<"evaluate" + } + + blackbox.framework.import "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.assert" + blackbox.framework.import "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.expect" + blackbox.framework.import "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.score" + + local -a from_namespace=( + "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.expect.artifact.collection" + "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.expect.file.exists" + "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.expect.shell.debug" + "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.expect.shell.failure" + "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.expect.shell.stderr" + "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.expect.shell.stdout" + "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.expect.shell.success" + ) + + if ( blackbox.framework.flag.enabled STEP_EVALUATE ); then + for namespace in "${from_namespace[@]}"; do + # shellcheck disable=SC2155 + local definition=$(declare -f "$namespace") + + eval "$(printf "function %s %s" "${namespace/module.${BLACKBOX_MODULE_NAME}.check.evaluate./}" "${definition#*"()"}")" + done + else + ( + printf "\033[0;36m** BLACKBOX_FLAG__STEP_EVALUATE:\033[0m %s\n" "$BLACKBOX_FLAG__STEP_EVALUATE" + printf "\033[0;37m--\033[0m\n" + cat -n <(printf "BLACKBOX_FLAG__STEP_EVALUATE=%s\n" "$BLACKBOX_FLAG__STEP_EVALUATE") + printf "\033[0;37m--\033[0m\n" + ) | if ( tput setaf &>/dev/null ); then cat; else sed "s/\x1b\[[0-9;]*m//g"; fi + + for namespace in "${from_namespace[@]}"; do + eval "$(printf "function %s (){ :; }" "${namespace/module.${BLACKBOX_MODULE_NAME}.check.evaluate./}")" + done + fi } diff --git a/module/aws/check/evaluate/assert.evaluate b/module/aws/check/evaluate/assert.evaluate new file mode 100644 index 0000000..0e8f979 --- /dev/null +++ b/module/aws/check/evaluate/assert.evaluate @@ -0,0 +1,118 @@ +#!/usr/bin/env bash +# @file module/aws/check/evaluate/assert.evaluate +# @brief https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/evaluate/assert.evaluate +# @description Step "evaluate" asserter + +# @section blackbox.module.aws.check.evaluate.* +blackbox.module.aws.check.evaluate.assert() { + # @section blackbox.module.aws.check.evaluate.assert.* + + # Asserts "false" + # + # @arg $1 type=string Assert expression + # @arg $2 type=enum<1..100|-> Score value: absolute (if integer) or relative (if "-") + # @arg $3 type=string Assert message + # + # @stdout Formatted assert + # + # @example + # # Asserts the false expression "(false -eq true)" with missing "10" score and a specific message that has an argument + # blackbox.module.aws.check.evaluate.assert.false "(false -eq true)" 10 "Assert message with argument '%s'" "argument" + function blackbox.module.aws.check.evaluate.assert.false() { + typeset assert=$1 + typeset score=$2 + typeset message=$3 + + { + blackbox.framework.trace "${FUNCNAME[0]}" "$*" <<<"" + } + + # shellcheck disable=SC2155 + local normalized_assert=$(blackbox.module.aws.check.evaluate.assert.normalize "$assert") + + score=$(blackbox.module.aws.check.evaluate.score.calculate "$score" 0) + # shellcheck disable=SC2059 + message=$(printf "${message:-%s}" "${normalized_assert##* }") + + ( + # shellcheck disable=SC2155 + local output=$("$BASH" /dev/stdin "$BLACKBOX_MODULE_NAME" "$BLACKBOX_MODULE_ACTION_NAME" "$BLACKBOX_QUESTION_ID" 2>&1 <<<"source /blackbox/blackbox &>/dev/null; ${assert}") + + printf "\033[0;31m** ASSERT:\033[0m %s\n" "$message" + printf "\033[0;37m%s\033[0m\n" "$normalized_assert" + printf "\033[0;37m--\033[0m\n" + printf "\033[0;37m%s\033[0m\n" "$(cat -nv <<<"${output:-"-empty-"}")"; + printf "\033[0;37m--\033[0m\n" + printf "%s\n" "$score" + printf "\033[0;37m--\033[0m\n" + ) | if ( tput setaf &>/dev/null ); then cat; else sed "s/\x1b\[[0-9;]*m//g"; fi + +# if ( blackbox.framework.flag.enabled "DEBUG_MODE" ); then +# blackbox.framework.exception.raise "assert '%s' failed with message '%s'" "$normalized_assert" "$message" +# fi + + false + } + + # Normalizes assert expression for output + # + # @arg $1 type=string Assert expression + # + # @stdout Normalized assert + # + # @example + # # Normalize assert expression + # blackbox.module.aws.check.evaluate.assert.normalize "(true -eq true)" + function blackbox.module.aws.check.evaluate.assert.normalize() { + typeset assert=$1 + + { + blackbox.framework.trace "${FUNCNAME[0]}" "$*" <<<"" + } + + awk '{ printf "%s%s", EOL, $0; EOL=" "}' <(sed 's/#.*$//; /^$/d; s/^[[:space:]]\+//g' <<<"$assert") + } + + # Asserts "true" + # + # @arg $1 type=string Assert expression + # @arg $2 type=enum<1..100|-> Score value: absolute (if integer) or relative (if "-") + # @arg $3 type=string Assert message + # + # @stdout Formatted assert + # + # @example + # # Asserts the true expression "(true -eq true)" with "10" score and a specific message that has an argument + # blackbox.module.aws.check.evaluate.assert.true "(true -eq true)" 10 "Assert message with argument '%s'" "argument" + function blackbox.module.aws.check.evaluate.assert.true() { + typeset assert=$1 + typeset score=$2 + typeset message=$3 + + { + blackbox.framework.trace "${FUNCNAME[0]}" "$*" <<<"" + } + + # shellcheck disable=SC2155 + local normalized_assert=$(blackbox.module.aws.check.evaluate.assert.normalize "$assert") + + score=$(blackbox.module.aws.check.evaluate.score.calculate "$score") + # shellcheck disable=SC2059 + message=$(printf "${message:-%s}" "${normalized_assert##* }") + + ( + # shellcheck disable=SC2155 + local output=$("$BASH" /dev/stdin "$BLACKBOX_MODULE_NAME" "$BLACKBOX_MODULE_ACTION_NAME" "$BLACKBOX_QUESTION_ID" 2>&1 <<<"source /blackbox/blackbox &>/dev/null; ${assert}") + + printf "\033[0;32m** ASSERT:\033[0m %s\n" "$message" + printf "\033[0;37m%s\033[0m\n" "$normalized_assert" + printf "\033[0;37m--\033[0m\n" + printf "\033[0;37m%s\033[0m\n" "$(cat -nv <<<"${output:-"-empty-"}")"; + printf "\033[0;37m--\033[0m\n" + printf "%s\n" "$score" + printf "\033[0;37m--\033[0m\n" + ) | if ( tput setaf &>/dev/null ); then cat; else sed "s/\x1b\[[0-9;]*m//g"; fi + + true + } +} diff --git a/module/aws/check/evaluate/expect.evaluate b/module/aws/check/evaluate/expect.evaluate new file mode 100644 index 0000000..b760c0b --- /dev/null +++ b/module/aws/check/evaluate/expect.evaluate @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# @file module/aws/check/evaluate/expect.evaluate +# @brief https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/evaluate/expect.evaluate +# @description Step "evaluate" expectant + +# @section blackbox.module.aws.check.evaluate.* +blackbox.module.aws.check.evaluate.expect() { + { + blackbox.framework.trace "${FUNCNAME[0]}" "$*" <<<"" + } + + blackbox.framework.import "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.expect.artifact" + blackbox.framework.import "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.expect.file" + blackbox.framework.import "blackbox.module.${BLACKBOX_MODULE_NAME}.check.evaluate.expect.shell" +} diff --git a/module/aws/check/evaluate/expect/artifact.expect b/module/aws/check/evaluate/expect/artifact.expect new file mode 100644 index 0000000..82c5102 --- /dev/null +++ b/module/aws/check/evaluate/expect/artifact.expect @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# @file module/aws/check/evaluate/expect/artifact.expect +# @brief https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/evaluate/expect/artifact.expect +# @description Artifact collection expectant + +# @section blackbox.module.aws.check.evaluate.expect.* +blackbox.module.aws.check.evaluate.expect.artifact() { + # @section blackbox.module.aws.check.evaluate.expect.artifact.* + + # Expects a list of artifacts to collect + # + # @stdin Assert expression + # + # @noargs + # + # @stdout Formatted assert + # + # @example + # # Collect a list of artifacts + # cat <&1 <<<"source /blackbox/blackbox &>/dev/null; ${collection[$artifact]}"))) + + sed -i "s/\x1b\[[0-9;]*m//g" "$artifact_cache" + + ( + printf "\033[0;35m** ARTIFACT:\033[0m %s \033[0;37m> %s (%d bytes)\033[0m\n" "${collection[$artifact]//[^A-Za-z0-9]/_}.artifact" "$artifact_cache" "$(stat -c "%s" "$artifact_cache")" + printf "\033[0;37m%s\033[0m\n" "${collection[$artifact]}" + printf "\033[0;37m--\033[0m\n" + + if [ "$(wc -l <<<"$artifact_stream")" -gt "$BLACKBOX_BUILD_STREAM_DISPLAY_LINES" ]; then + printf "\033[0;38m%s\n" "$(head -n "$(awk '{ printf "%.0f", sqrt($1); }' <<<"$BLACKBOX_BUILD_STREAM_DISPLAY_LINES")" <<<"$artifact_stream")" + printf "\033[0;37m ...\033[0m\n" + printf "\033[0;38m%s\033[0m\n" "$(tail -n "$(awk '{ printf "%.0f", sqrt($1); }' <<<"$BLACKBOX_BUILD_STREAM_DISPLAY_LINES")" <<<"$artifact_stream")" + else + printf "\033[0;38m%s\033[0m\n" "$artifact_stream" + fi + + printf "\033[0;37m--\033[0m\n" + + if [ "$artifact" -lt "$((${#collection[@]} - 1))" ]; then + printf "\n" + fi + ) | if ( tput setaf &>/dev/null ); then cat; else sed "s/\x1b\[[0-9;]*m//g"; fi + done + } +} diff --git a/module/aws/check/evaluate/expect/file.expect b/module/aws/check/evaluate/expect/file.expect new file mode 100644 index 0000000..ae67997 --- /dev/null +++ b/module/aws/check/evaluate/expect/file.expect @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +# @file module/aws/check/evaluate/expect/file.expect +# @brief https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/evaluate/expect/file.expect +# @description File expressions expectant + +# @section blackbox.module.aws.check.evaluate.expect.* +blackbox.module.aws.check.evaluate.expect.file() { + # @section blackbox.module.aws.check.evaluate.expect.file.* + + # Expects an existing file + # + # @stdin Assert expression + # + # @arg $1 type=enum<1..100|-> Score value: absolute (if integer) or relative (if "-") + # @arg $3 type=string Assert success message + # @arg $3 type=string Assert failure message + # @arg $4 type=...mixed Assert message args + # + # @stdout Formatted assert + # + # @example + # # Expression that has the existing file + # cat </dev/null <<<"source /blackbox/blackbox &>/dev/null; ${assert}" ); then + # shellcheck disable=SC2059 + blackbox.module.aws.check.evaluate.assert.true "$assert" "$score" "$(printf "$message_true" "${message_args[@]:-%s}")" + else + # shellcheck disable=SC2059 + blackbox.module.aws.check.evaluate.assert.false "$assert" "$score" "$(printf "$message_false" "${message_args[@]:-%s}")" + fi + } +} diff --git a/module/aws/check/evaluate/expect/shell.expect b/module/aws/check/evaluate/expect/shell.expect new file mode 100644 index 0000000..6708a95 --- /dev/null +++ b/module/aws/check/evaluate/expect/shell.expect @@ -0,0 +1,203 @@ +#!/usr/bin/env bash +# @file module/aws/check/evaluate/expect/shell.expect +# @brief https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/evaluate/expect/shell.expect +# @description Shell expressions expectant + +# @section blackbox.module.aws.check.evaluate.expect.* +blackbox.module.aws.check.evaluate.expect.shell() { + # @section blackbox.module.aws.check.evaluate.expect.shell.* + + # Expects a debug output, no score calculation + # + # @stdin Assert expression + # + # @noargs + # + # @stdout Formatted assert + # + # @example + # # Debug output + # cat <&1 <<<"source /blackbox/blackbox &>/dev/null; ${assert}"))" + printf "\033[0;37m--\033[0m\n" + ) | if (tput setaf &>/dev/null); then cat; else sed "s/\x1b\[[0-9;]*m//g"; fi + + kill $$ + } + + # Expects a shell expression that fails + # + # @stdin Assert expression + # + # @arg $1 type=enum<1..100|-> Score value: absolute (if integer) or relative (if "-") + # @arg $3 type=string Assert success message + # @arg $3 type=string Assert failure message + # @arg $4 type=...mixed Assert message args + # + # @stdout Formatted assert + # + # @example + # # Expression that should fail + # cat </dev/null <<<"source /blackbox/blackbox &>/dev/null; ${assert}")); then + # shellcheck disable=SC2059 + blackbox.module.aws.check.evaluate.assert.true "$assert" "$score" "$(printf "$message_true" "${message_args[@]:-%s}")" + else + # shellcheck disable=SC2059 + blackbox.module.aws.check.evaluate.assert.false "$assert" "$score" "$(printf "$message_false" "${message_args[@]:-%s}")" + fi + } + + # Expects a shell expression that outputs to the stderr + # + # @stdin Assert expression + # + # @arg $1 type=enum<1..100|-> Score value: absolute (if integer) or relative (if "-") + # @arg $3 type=string Assert success message + # @arg $3 type=string Assert failure message + # @arg $4 type=...mixed Assert message args + # + # @stdout Formatted assert + # + # @example + # # Expression that should have a stderr + # cat <&1 1>/dev/null <<<"source /blackbox/blackbox &>/dev/null" <<<"$assert")); then + # shellcheck disable=SC2059 + blackbox.module.aws.check.evaluate.assert.true "$assert" "$score" "$(printf "$message_true" "${message_args[@]:-%s}")" + else + # shellcheck disable=SC2059 + blackbox.module.aws.check.evaluate.assert.false "$assert" "$score" "$(printf "$message_false" "${message_args[@]:-%s}")" + fi + } + + # Expects a shell expression that outputs to the stdout + # + # @stdin Assert expression + # + # @arg $1 type=enum<1..100|-> Score value: absolute (if integer) or relative (if "-") + # @arg $3 type=string Assert success message + # @arg $3 type=string Assert failure message + # @arg $4 type=...mixed Assert message args + # + # @stdout Formatted assert + # + # @example + # # Expression that should have a stdout + # cat </dev/null <<<"source /blackbox/blackbox &>/dev/null; ${assert}")); then + # shellcheck disable=SC2059 + blackbox.module.aws.check.evaluate.assert.true "$assert" "$score" "$(printf "$message_true" "${message_args[@]:-%s}")" + else + # shellcheck disable=SC2059 + blackbox.module.aws.check.evaluate.assert.false "$assert" "$score" "$(printf "$message_false" "${message_args[@]:-%s}")" + fi + } + + # Expects a shell expression that succeeds + # + # @stdin Assert expression + # + # @arg $1 type=enum<1..100|-> Score value: absolute (if integer) or relative (if "-") + # @arg $3 type=string Assert success message + # @arg $3 type=string Assert failure message + # @arg $4 type=...mixed Assert message args + # + # @stdout Formatted assert + # + # @example + # # Expression that should succeed + # cat </dev/null <<<"source /blackbox/blackbox &>/dev/null; ${assert}"); then + # shellcheck disable=SC2059 + blackbox.module.aws.check.evaluate.assert.true "$assert" "$score" "$(printf "$message_true" "${message_args[@]:-%s}")" + else + # shellcheck disable=SC2059 + blackbox.module.aws.check.evaluate.assert.false "$assert" "$score" "$(printf "$message_false" "${message_args[@]:-%s}")" + fi + } +} diff --git a/module/aws/check/evaluate/score.evaluate b/module/aws/check/evaluate/score.evaluate new file mode 100644 index 0000000..4d24bff --- /dev/null +++ b/module/aws/check/evaluate/score.evaluate @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +# @file module/aws/check/evaluate/score.evaluate +# @brief https://github.com/ProblemSetters/devops-blackbox/blob/2404/module/aws/check/evaluate/score.evaluate +# @description Step "evaluate" score calculator + +# @section blackbox.module.aws.check.evaluate.* +blackbox.module.aws.check.evaluate.score() { + export BLACKBOX_CHECK_EVALUATE_SCORE_CALCULATE_CACHE="/tmp/calculate.cache-${RANDOM}" + # @section blackbox.module.aws.check.evaluate.score.* + + # Calculates a score of question + # + # @arg $1 type=enum<1..100|-> Score value: absolute (if integer) or relative (if "-") + # + # @stdout Calculated score + # + # @example + # # Calculates a score: 10 if success or 0 if failure + # blackbox.module.aws.check.evaluate.score.calculate 10 + # # Calculates a score: automatic average if success or 0 if failure + # blackbox.module.aws.check.evaluate.score.calculate - + function blackbox.module.aws.check.evaluate.score.calculate() { + typeset assert_score=$1 + typeset forced_score=$2 + + { + blackbox.framework.trace "${FUNCNAME[0]}" "$*" <<<"" + } + + if [[ ! "$assert_score" =~ ^[0-9]+([.][0-9]+)?$ ]]; then + if [[ "$assert_score" == "-" ]]; then + assert_score=0 + else + # shellcheck disable=SC2155 + local expect_total=$(awk "/^cat </dev/null + # shellcheck disable=SC2317 + printf -- "Partial Credit: %d\n" "${forced_score:-"$assert_score"}" + } + + # Constructor + # + # @noargs + # + # @set BLACKBOX_CHECK_EVALUATE_SCORE_CALCULATE_CACHE readonly,type=string,default=auto Path to the question evaluation cache (sets automatically, do not override) + # + # @see blackbox.module.aws.check.evaluate.score + blackbox.module.aws.check.evaluate.score.__init() { + { + blackbox.framework.trace "${FUNCNAME[0]}" "$*" <<<"" + } + } && blackbox.module.aws.check.evaluate.score.__init "$@" +} diff --git a/module/aws/check/provision.step b/module/aws/check/provision.step index 1b1b3a1..5478a58 100644 --- a/module/aws/check/provision.step +++ b/module/aws/check/provision.step @@ -23,18 +23,14 @@ blackbox.module.aws.check.provision() { return fi - if ( grep -q '^init$' <(ps -p 1 -o comm=) ); then - docker run -di --hostname="$BLACKBOX_SPAWN" --network="host" --name="$BLACKBOX_SPAWN" --privileged --volume="/tmp:/tmp:rw" --volume="${BLACKBOX_USER_QUESTION_DIR}:${BLACKBOX_USER_QUESTION_DIR}:rw" --volume="${BLACKBOX_STORAGE_DIR}:${BLACKBOX_STORAGE_DIR}:ro" "134148934511.dkr.ecr.us-east-1.amazonaws.com/hr/blackbox_2404:${BLACKBOX_MODULE_NAME}" - else - docker run -di --hostname="$BLACKBOX_SPAWN" --network="host" --name="$BLACKBOX_SPAWN" --privileged --volume="/tmp:/tmp:rw" --volume="${BLACKBOX_DIR}:${BLACKBOX_DIR}:ro" --volume="${BLACKBOX_USER_QUESTION_DIR}:${BLACKBOX_USER_QUESTION_DIR}:rw" --volume="${BLACKBOX_STORAGE_DIR}:${BLACKBOX_STORAGE_DIR}:ro" "134148934511.dkr.ecr.us-east-1.amazonaws.com/hr/blackbox_2404:${BLACKBOX_MODULE_NAME}" - fi + blackbox.framework.inventory.install.directory "${BLACKBOX_STORAGE_DIR}" 0 0 if [ -n "$BLACKBOX_PROVISION_WITH_OPTS" ]; then ( printf "\n" printf "\033[0;36m** BLACKBOX_PROVISION_WITH_OPTS:\033[0m {...}\n" printf "\033[0;37m--\033[0m\n" - cat -n <(docker exec -i -w "$BLACKBOX_USER_QUESTION_DIR" "$BLACKBOX_SPAWN" "$BASH" /dev/stdin "$BLACKBOX_MODULE_NAME" "$BLACKBOX_MODULE_ACTION_NAME" "$BLACKBOX_QUESTION_ID" 2>&1 <<<"source /blackbox/blackbox &>/dev/null; ${BLACKBOX_PROVISION_WITH_OPTS}") + cat -n <("$BASH" /dev/stdin "$BLACKBOX_MODULE_NAME" "$BLACKBOX_MODULE_ACTION_NAME" "$BLACKBOX_QUESTION_ID" 2>&1 <<<"source /blackbox/blackbox &>/dev/null; ${BLACKBOX_PROVISION_WITH_OPTS}") printf "\033[0;37m--\033[0m\n" ) | if ( tput setaf &>/dev/null ); then cat; else sed "s/\x1b\[[0-9;]*m//g"; fi fi diff --git a/module/aws/check/provision/.dockerignore b/module/aws/check/provision/.dockerignore deleted file mode 100644 index 72e8ffc..0000000 --- a/module/aws/check/provision/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -* diff --git a/module/aws/check/provision/Dockerfile b/module/aws/check/provision/Dockerfile deleted file mode 100644 index d603237..0000000 --- a/module/aws/check/provision/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM 134148934511.dkr.ecr.us-east-1.amazonaws.com/hr/blackbox_2404:abstract - -SHELL ["/bin/bash", "-c"] - -RUN source \ - /blackbox/blackbox \ - \ - &>/dev/null; \ - blackbox.framework.inventory.provision \ - awscli \ - && \ - rm \ - -rf \ - /var/lib/apt/lists/* diff --git a/module/aws/check/provision/Makefile b/module/aws/check/provision/Makefile deleted file mode 100644 index 82d27a4..0000000 --- a/module/aws/check/provision/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env make -include ../../../../framework/module/abstract/check/provision/Makefile diff --git a/tests/module/aws/@sandbox/check.sh b/tests/module/aws/@sandbox/check.sh index a2a474c..5e9bd2e 100644 --- a/tests/module/aws/@sandbox/check.sh +++ b/tests/module/aws/@sandbox/check.sh @@ -5,7 +5,7 @@ BLACKBOX_PROVISION_WITH_OPTS() { blackbox.framework.inventory.provision jq } -. /blackbox/blackbox linux-stdl check "test" +. /blackbox/blackbox aws check "test" cat <