diff --git a/.github/lychee.toml b/.github/lychee.toml new file mode 100644 index 0000000000..d256ce025a --- /dev/null +++ b/.github/lychee.toml @@ -0,0 +1,12 @@ +# This lychee configuration tries to find dead links in zwe, pswi, and smpe files which may be displayed to the user. +# This does not focus on dead links for internal-facing documentation, e.g. README.md. + +# We're including language sources as well as document files since the language sources embed URLs +# which can be displayed to the user, e.g. 'zwe' shell script commands displaying help information. + +exclude_path = ['smpe/bld/service/_README_sample_sysmod_builds.docx'] +# This exclude list covers known urls which should be ignored, including ones which contained +# templated values in typescript. The templates are covered by a wildcard. +exclude = [ 'https://www.eclipse.org/legal/epl-v20.html', 'https://zowe.org/schemas/*', 'https://www.zowe.org/schemas/*', 'https://discovery', 'https://github.com/zowe/launcher/blob/*', 'https://myregistry/url$', 'https://your-zos-host-name/zosmf/*{1,60}', '^http://service.software.ibm.com/holdata/390holddata.html', ] + +hidden = true diff --git a/.github/scripts/cicd_test/make_matrix.sh b/.github/scripts/cicd_test/make_matrix.sh index cee6b60426..4aea7a10ae 100644 --- a/.github/scripts/cicd_test/make_matrix.sh +++ b/.github/scripts/cicd_test/make_matrix.sh @@ -32,15 +32,14 @@ case $install_test_choice in test_file="$KEYRING_TESTFILE" ;; -"z/OS node v18") - test_file="$ZOS_NODE_V18_TESTFILE" - test_force_system="zzow08" - ;; - "z/OS node v20") test_file="$ZOS_NODE_V20_TESTFILE" ;; +"z/OS node v22") + test_file="$ZOS_NODE_V22_TESTFILE" + ;; + "Non-strict Verify External Certificate") test_file="$NON_STRICT_VERIFY_EXTERNAL_CERTIFICATE_TESTFILE" ;; @@ -87,18 +86,18 @@ if [[ ! -z "$test_force_system" ]]; then else if [[ -z "$dont_parse_test_server" ]]; then if [[ "$test_server" == "Any zzow servers" ]]; then - test_server="zzow0"$(echo $(($RANDOM % 3 + 6))) + test_server="zzow"$(printf %02d $(($RANDOM % 3 + 9))) fi TEST_FILE_SERVER="$test_file($test_server)" else any_occurrence=$(echo $test_file | grep -o "(any)" | wc -l) interim_test_file_server=$test_file for i in $(seq $any_occurrence); do - # Generates zzow06, zzow07, zzow08 - interim_test_file_server=$(echo $interim_test_file_server | sed "s#(any)#(zzow0$(echo $(($RANDOM % 3 + 6))))#") + # Generates zzow09, zzow10, zzow11 + interim_test_file_server=$(echo $interim_test_file_server | sed "s#(any)#(zzow$(printf %02d $(($RANDOM % 3 + 9))))#") done - TEST_FILE_SERVER=$(echo $interim_test_file_server | sed "s#(all)#(zzow06,zzow07,zzow08)#g") + TEST_FILE_SERVER=$(echo $interim_test_file_server | sed "s#(all)#(zzow09,zzow10,zzow11)#g") fi fi diff --git a/.github/scripts/cicd_test/prep7_more_test_prep/03_process_test_server.sh b/.github/scripts/cicd_test/prep7_more_test_prep/03_process_test_server.sh index 7e7b80ad07..508d7d093e 100644 --- a/.github/scripts/cicd_test/prep7_more_test_prep/03_process_test_server.sh +++ b/.github/scripts/cicd_test/prep7_more_test_prep/03_process_test_server.sh @@ -14,16 +14,16 @@ TEST_SERVER=$(echo "$MATRIX_SERVER" | cut -d "-" -f2) case $TEST_SERVER in -"zzow06") - TEST_SERVER_NICKNAME=marist-6 +"zzow09") + TEST_SERVER_NICKNAME=marist-9 ;; -"zzow07") - TEST_SERVER_NICKNAME=marist-7 +"zzow10") + TEST_SERVER_NICKNAME=marist-10 ;; -"zzow08") - TEST_SERVER_NICKNAME=marist-8 +"zzow11") + TEST_SERVER_NICKNAME=marist-11 ;; *) diff --git a/.github/scripts/cicd_test/prep7_more_test_prep/05_process_ext_list.sh b/.github/scripts/cicd_test/prep7_more_test_prep/05_process_ext_list.sh index 22027e3c93..806af8fee0 100644 --- a/.github/scripts/cicd_test/prep7_more_test_prep/05_process_ext_list.sh +++ b/.github/scripts/cicd_test/prep7_more_test_prep/05_process_ext_list.sh @@ -35,11 +35,12 @@ if [[ "$MATRIX_TEST" == *"install-ext"* ]]; then if [[ "$each_ext" == *"("* ]] && [[ "$each_ext" == *")"* ]] ; then # user provides custom artifactory pattern ext_name=$(echo "$each_ext" | cut -d "(" -f1) - ext_pattern=$(echo "$each_ext" | cut -d "(" -f2 | cut -d ")" -f1) + ext_version=$(echo "$each_ext" | cut -d "(" -f2 | cut -d ")" -f1) + ext_pattern=$(echo "$DEFAULT_ZOWE_EXT_ARTIFACTORY_PATTERN" | sed "s#{ext-name}#$ext_name#g" | sed "s#{ext-version}#$ext_version#g" ) else # use default ext_name="$each_ext" - ext_pattern=$(echo "$DEFAULT_ZOWE_EXT_ARTIFACTORY_PATTERN" | sed "s#{ext-name}#$ext_name#g") + ext_pattern=$(echo "$DEFAULT_ZOWE_EXT_ARTIFACTORY_PATTERN" | sed "s#{ext-name}#$ext_name#g" | sed "s#{ext-version}#*#g" ) fi echo "[Check 4 INFO] extension name is $ext_name" @@ -58,4 +59,4 @@ if [[ "$MATRIX_TEST" == *"install-ext"* ]]; then EXTENSION_LIST=$(echo $EXTENSION_LIST | sed 's/;$//g') assert_env_var EXTENSION_LIST printf "${GREEN}[Check 4/$TOTAL_CHECK] Zowe extension list processing complete!${NC}\n" -fi \ No newline at end of file +fi diff --git a/.github/scripts/cicd_test/prep7_more_test_prep/06_process_outputs.sh b/.github/scripts/cicd_test/prep7_more_test_prep/06_process_outputs.sh index bce1d40594..a3865351c8 100644 --- a/.github/scripts/cicd_test/prep7_more_test_prep/06_process_outputs.sh +++ b/.github/scripts/cicd_test/prep7_more_test_prep/06_process_outputs.sh @@ -13,7 +13,7 @@ # Set outputs echo ZOWE_ARTIFACTORY_FINAL=$ZOWE_ARTIFACTORY_FINAL >>$GITHUB_OUTPUT echo ZOWE_ARTIFACTORY_FINAL_FILENAME=$ZOWE_ARTIFACTORY_FINAL_FILENAME >>$GITHUB_OUTPUT -echo NODE_HOME_PATTERN=/ZOWE/node/node-$ZOS_NODE_VERSION-os390-s390x >>$GITHUB_OUTPUT +echo NODE_HOME_PATTERN=/ZOWE/node/node-$ZOS_NODE_VERSION >>$GITHUB_OUTPUT echo TEST_SERVER=$TEST_SERVER >>$GITHUB_OUTPUT echo TEST_SERVER_NICKNAME=$TEST_SERVER_NICKNAME >>$GITHUB_OUTPUT echo EXTENSION_LIST=$EXTENSION_LIST >>$GITHUB_OUTPUT @@ -28,4 +28,4 @@ printf "Zowe CLI artifactory path: ${CYAN}$ZOWE_CLI_ARTIFACTORY_FINAL${NC}\n" printf "Zowe extension list: ${CYAN}$EXTENSION_LIST${NC}\n" printf "Test server: ${CYAN}$TEST_SERVER${NC}\n" printf "Test server nickname: ${CYAN}$TEST_SERVER_NICKNAME${NC}\n" -printf "Node home pattern on z/OS: ${CYAN}/ZOWE/node/node-$ZOS_NODE_VERSION-os390-s390x${NC}\n" +printf "Node home pattern on z/OS: ${CYAN}/ZOWE/node/node-$ZOS_NODE_VERSION${NC}\n" diff --git a/.github/workflows/build-packaging.yml b/.github/workflows/build-packaging.yml index 267ac7ea05..a5bd922b52 100644 --- a/.github/workflows/build-packaging.yml +++ b/.github/workflows/build-packaging.yml @@ -99,8 +99,9 @@ jobs: echo "run_build=${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.ORIGIN_ISSUE_TRIGGER == 'false') || !contains(fromJson(steps.get-labels.outputs.result), 'Build: None') }}" >> $GITHUB_OUTPUT - id: check-test name: 'export conditional used to determine if we should run a test suite' + # run_test explanation: if we set "run_build" from the prior step and this is a PR, run unless "Test: None" label is present. If not initiated from a PR, only build. run: | - echo "run_test=${{ (steps.check-build.outputs.run_build == 'true' && !contains(fromJson(steps.get-labels.outputs.result), 'Test: None')) }}" >> $GITHUB_OUTPUT + echo "run_test=${{ (steps.check-build.outputs.run_build == 'true' && github.event_name != 'workflow_dispatch' && !contains(fromJson(steps.get-labels.outputs.result), 'Test: None')) }}" >> $GITHUB_OUTPUT display-dispatch-event-id: if: github.event.inputs.RANDOM_DISPATCH_EVENT_ID != '' @@ -344,13 +345,13 @@ jobs: with: lock-repository: ${{ github.repository }} github-token: ${{ secrets.GITHUB_TOKEN }} - lock-resource-name: zowe-psi-build-zzow07-lock + lock-resource-name: zowe-psi-build-zzow10-lock lock-avg-retry-interval: 60 - name: '[PSWI 0] PSWI pre-build check for existing smpe' if: env.INPUTS_BUILD_PSWI == 'true' && github.event.inputs.PSWI_SMPE_ARTIFACTORY_PATH != '' && github.event.inputs.PSWI_SMPE_AZWE_ARTIFACTORY_PATH != '' run: | - jfrog rt dl ${{github.event.inputs.PSWI_SMPE_AZWE_ARTIFACTORY_PATH}}/AZWE002*.zip --flat=true .pax/AZWE002.zip + jfrog rt dl ${{github.event.inputs.PSWI_SMPE_AZWE_ARTIFACTORY_PATH}}/AZWE003*.zip --flat=true .pax/AZWE003.zip jfrog rt dl ${{github.event.inputs.PSWI_SMPE_ARTIFACTORY_PATH}}/zowe-smpe-*.zip --flat=true .pax/zowe-smpe.zip - name: '[SMPE Pax 4] Build PSWI' @@ -373,7 +374,7 @@ jobs: with: name: pswi-folder path: | - pswi/** + pswi/logs/** - name: '[K8S] Build Kubernetes' timeout-minutes: 10 diff --git a/.github/workflows/cicd-test-readme.md b/.github/workflows/cicd-test-readme.md index 082639da7b..66d1a58c12 100644 --- a/.github/workflows/cicd-test-readme.md +++ b/.github/workflows/cicd-test-readme.md @@ -4,9 +4,9 @@ This guide will describe how you should input into Github Actions workflow input Currently we support three testing z/OS servers: -- zzow06 (ACF2) -- zzow07 (Top Secret/TSS) -- zzow08 (RACF) +- zzow09 (ACF2) +- zzow10 (Top Secret/TSS) +- zzow11 (RACF) Testing pipeline is running tests in parallel. The workflow will try to acquire the resource lock if available. If the resource lock is occupied, the workflow will wait until the lock is succesfully acquired. @@ -17,7 +17,7 @@ Workflow trigger is at [cicd-test](https://github.com/zowe/zowe-install-packagin ### Choose Test Server - This input is a choice, and it's mandatory. -- You can choose from one of `zzow06`, `zzow07`, `zzow08`, `zzow06,zzow07,zzow08` (if you want to run the test on all zzow servers), or `Any zzow servers` (pick any zzow servers, potentially help reduce wait time) +- You can choose from one of `zzow09`, `zzow10`, `zzow11`, `zzow09,zzow10,zzow11` (if you want to run the test on all zzow servers), or `Any zzow servers` (pick any zzow servers, potentially help reduce wait time) - Default is `Any zzow servers` ### Choose Install Test @@ -29,7 +29,7 @@ Workflow trigger is at [cicd-test](https://github.com/zowe/zowe-install-packagin - SMPE PTF - Extensions - Keyring - - z/OS node v18 + - z/OS node v20 - Non-strict Verify External Certificate - Install PTF twice - VSAM Caching storage method @@ -91,7 +91,7 @@ Background: CICD testing relies on a `zowe.pax` or `zowe-smpe.zip` (for SMPE ins - This input is pre-filled with `sample-node-api;sample-trial-app` to test [sample-node-api](https://github.com/zowe/sample-node-api) and [sample-trial-app](https://github.com/zowe/sample-trial-app) projects. In normal circumstances, you probably don't need to modify the pre-filled value here. - By default, the extension artifact search pattern is using format `libs-snapshot-local/org/zowe/{ext-name}/*/{ext-name}-*.pax` where `{ext-name}` will be processed and substituted from this input (as an example above, `sample-node-api`). Then the latest uploaded artifact will be used. -- Optionally, you can customized your extension artifact path. Customized jfrog artifactory path should exist, be valid, and enclosed in brackets and put after the extension name, eg. `sample-node-api(my/new/path/sample-node-api-cus.pax)`. A pattern contains `*` is also supported, which the latest artifact will be picked up. If multiple extensions are included, make sure to separate them by semi-colon. In addition to the artifactory path/pattern, you can also put a full http URL to any other remote location that points to an extension pax here. +- Optionally, you can customized your extension artifact version. Customized jfrog artifactory version should exist, be valid, and enclosed in brackets and put after the extension name, eg. `sample-node-api(3.0.0-SNAPSHOT)`. This example will create a search pattern like the following, where the latest artifact in the folder is picked up: `libs-snapshot-local/org/zowe/sample-node-api/3.0.0-SNAPSHOT/sample-node-api-*.pax`. A pattern containing `*` is also supported, which will result in the latest artifact in the latest folder matching the pattern. For example: `sample-node-api(1.0.0-*)` will create this search pattern: `libs-snapshot-local/org/zowe/sample-node-api/1.0.0-*/sample-node-api-*.pax`, which could match folders `1.0.0-SNAPSHOT`, `1.0.0-MAIN`, `1.0.0-user-pr-build`, etc. - The following regular expression will be used to check against your input ``` @@ -109,7 +109,7 @@ Background: CICD testing relies on a `zowe.pax` or `zowe-smpe.zip` (for SMPE ins When running CICD integration tests during RC stage, the following string will be parsed into the Github Actions matrix. As a result, a total of 21 independent jobs will be spawned. ``` -basic/install.ts(zzow06,zzow07,zzow08);basic/install-ptf.ts(zzow06,zzow07,zzow08);basic/install-ext.ts(zzow07);extended/keyring.ts(zzow06,zzow07,zzow08);extended/node-versions/node-v18.ts(zzow06,zzow07,zzow08);extended/node-versions/node-v20.ts(zzow06,zzow07,zzow08);extended/certificates/nonstrict-verify-external-certificate.ts(zzow06) +basic/install.ts(zzow09,zzow10,zzow11);basic/install-ptf.ts(zzow09,zzow10,zzow11);basic/install-ext.ts(zzow10);extended/keyring.ts(zzow09,zzow10,zzow11);extended/node-versions/node-v20.ts(zzow09,zzow10,zzow11);extended/node-versions/node-v20.ts(zzow09,zzow10,zzow11);extended/certificates/nonstrict-verify-external-certificate.ts(zzow09) ``` Total elapsed time when running in parallel is approximately 3.5 hours on paper idealy if all parallel jobs are executing at the same time. In reality, from numerous tests performed, total elapsed time is around 4 hours. @@ -121,7 +121,6 @@ Selected test running elapsed time: | ---- | ------------ | | Convenience Pax | 53m | | SMPE PTF | 68m | -| z/OS node v18 | 45m | | z/OS node v20 | 45m | | Keyring | 53m | | Non-strict Verify External Certificate | 51m | diff --git a/.github/workflows/cicd-test.yml b/.github/workflows/cicd-test.yml index 2df637d7ec..e2adc55541 100644 --- a/.github/workflows/cicd-test.yml +++ b/.github/workflows/cicd-test.yml @@ -16,10 +16,10 @@ on: default: 'Any zzow servers' options: - Any zzow servers - - zzow06 - - zzow07 - - zzow08 - - zzow06,zzow07,zzow08 + - zzow09 + - zzow10 + - zzow11 + - zzow09,zzow10,zzow11 install-test: description: 'Choose Install Test' type: choice @@ -31,8 +31,8 @@ on: - SMPE PTF - Extensions - Keyring - - z/OS node v18 - z/OS node v20 + - z/OS node v22 - Non-strict Verify External Certificate - Install PTF Twice - VSAM Caching Storage Method @@ -52,7 +52,7 @@ on: required: false # FIXME: too slow to test 2, temporarily only test 1 # default: 'sample-node-api;sample-trial-app' - default: 'sample-node-api' + default: 'sample-node-api(3.0.0-SNAPSHOT)' RANDOM_DISPATCH_EVENT_ID: description: 'random dispatch event id' required: false @@ -65,12 +65,12 @@ env: SANITY_TEST_PATH: tests/sanity DEFAULT_ZOWE_PAX_ARTIFACTORY_PATTERN: libs-snapshot-local/org/zowe/*zowe*{branch-name}*.pax DEFAULT_ZOWE_SMPE_ARTIFACTORY_PATTERN: libs-snapshot-local/org/zowe/*zowe-smpe*{branch-name}*.zip - DEFAULT_ZOWE_CLI_ARTIFACTORY_PATTERN: PLACE_HOLDER/org/zowe/cli/zowe-cli-package/*zowe-cli-package-2*.zip - DEFAULT_ZOWE_EXT_ARTIFACTORY_PATTERN: libs-snapshot-local/org/zowe/{ext-name}/*/{ext-name}-*.pax + DEFAULT_ZOWE_CLI_ARTIFACTORY_PATTERN: PLACE_HOLDER/org/zowe/cli/zowe-cli-package/*zowe-cli-package-3*.zip + DEFAULT_ZOWE_EXT_ARTIFACTORY_PATTERN: libs-snapshot-local/org/zowe/{ext-name}/{ext-version}/{ext-name}-*.pax # below block can be overwritten, adjusted by DevOps only - # ZOS_NODE_VERSION more to choose from: v16.20.1, v18.16.0 - ZOS_NODE_VERSION: v16.20.1 + # ZOS_NODE_VERSION more to choose from: v18.16.0, v20.11.0 + ZOS_NODE_VERSION: v18.16.0 CLIENT_NODE_VERSION: v12.18.3 INSTALL_TEST_DEBUG_INFORMATION: zowe-install-test:* SANITY_TEST_DEBUG_INFORMATION: zowe-sanity-test:* @@ -81,16 +81,16 @@ env: SMPE_PTF_TESTFILE: basic/install-ptf.ts EXTENSIONS_TESTFILE: basic/install-ext.ts KEYRING_TESTFILE: extended/keyring.ts - ZOS_NODE_V18_TESTFILE: extended/node-versions/node-v18.ts ZOS_NODE_V20_TESTFILE: extended/node-versions/node-v20.ts + ZOS_NODE_V22_TESTFILE: extended/node-versions/node-v22.ts NON_STRICT_VERIFY_EXTERNAL_CERTIFICATE_TESTFILE: extended/certificates/nonstrict-verify-external-certificate.ts INSTALL_PTF_TWICE_TESTFILE: extended/install-ptf-two-times.ts VSAM_CACHING_STORAGE_METHOD_TESTFILE: extended/caching-storages/vsam-storage.ts INFINISPAN_CACHING_STORAGE_METHOD_TESTFILE: extended/caching-storages/infinispan-storage.ts CONFIG_MANAGER_TESTFILE: extended/config-manager/enable-config-manager.ts GENERAL_API_DOCUMENTATION_TESTFILE: basic/install-api-gen.ts - ZOWE_NIGHTLY_TESTS_FULL: basic/install.ts(all);basic/install-fmid.ts(all) - ZOWE_RELEASE_TESTS_FULL: basic/install.ts(all);basic/install-fmid.ts(all);basic/install-ext.ts(any);extended/keyring.ts(all);extended/node-versions/node-v18.ts(zzow08):extended/certificates/nonstrict-verify-external-certificate.ts(any);extended/caching-storages/infinispan-storage.ts(any);extended/config-manager/enable-config-manager.ts(any) + ZOWE_NIGHTLY_TESTS_FULL: basic/install.ts(all);basic/install-ptf.ts(all) + ZOWE_RELEASE_TESTS_FULL: basic/install.ts(all);basic/install-ptf.ts(all);basic/install-ext.ts(any);extended/keyring.ts(all);extended/node-versions/node-v20.ts(any);extended/node-versions/node-v22.ts(any);extended/certificates/nonstrict-verify-external-certificate.ts(any);extended/caching-storages/infinispan-storage.ts(any);extended/config-manager/enable-config-manager.ts(any) jobs: display-dispatch-event-id: @@ -298,9 +298,6 @@ jobs: case 'Keyring': eta = 53 break; - case 'z/OS node v18': - eta = 45 - break; case 'z/OS node v20': eta = 45 break; @@ -385,7 +382,7 @@ jobs: - name: '[After Test 2] Upload test report' if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: InstallTestReports-${{ env.TEST_NAME }}-${{ steps.more-test-prep.outputs.TEST_SERVER_NICKNAME }}-${{ github.run_id }}-${{ env.CURRENT_TIME }} path: ${{ env.INSTALL_TEST_PATH }}/reports/ diff --git a/.github/workflows/diff-schema.yml b/.github/workflows/diff-schema.yml index ae8c8c4db7..3e47227461 100644 --- a/.github/workflows/diff-schema.yml +++ b/.github/workflows/diff-schema.yml @@ -34,7 +34,7 @@ jobs: - name: '[Build] Make diff' run: git diff ${{ env.FROM }} ${{ env.TO }} -- schemas > schemas.diff - name: '[Upload]' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: schemas.diff path: schemas.diff diff --git a/.github/workflows/diff-yaml b/.github/workflows/diff-yaml index 52212e980a..032656ef78 100644 --- a/.github/workflows/diff-yaml +++ b/.github/workflows/diff-yaml @@ -34,7 +34,7 @@ jobs: - name: '[Build] Make diff' run: git diff ${{ env.FROM }} ${{ env.TO }} -- example-zowe.yaml > example-yaml.diff - name: '[Upload]' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: example-yaml.diff path: example-yaml.diff diff --git a/.github/workflows/link-check-weekly.yml b/.github/workflows/link-check-weekly.yml deleted file mode 100644 index 21a91b5417..0000000000 --- a/.github/workflows/link-check-weekly.yml +++ /dev/null @@ -1,25 +0,0 @@ -permissions: read-all - -name: Check Markdown Links - Weekly - -on: - push: - branches: - - 'v3.x/master' - - 'v3.x/staging' - - 'v2.x/master' - - 'v2.x/staging' - - 'v1.x/master' - - 'v1.x/staging' - schedule: - # Every day @ 4 AM - - cron: "0 4 * * *" - -jobs: - markdown-link-check: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - - - uses: gaurav-nelson/github-action-markdown-link-check@d53a906aa6b22b8979d33bc86170567e619495ec # v1.0.15 diff --git a/.github/workflows/link-check.yml b/.github/workflows/link-check.yml new file mode 100644 index 0000000000..d11b069c7a --- /dev/null +++ b/.github/workflows/link-check.yml @@ -0,0 +1,49 @@ +# This link checker focuses on covering end-user facing links, not developer documentation. +# This means we cover the smp/e, pswi, and zwe content. +# The lychee toml files are set to ignore links which popped up in comments or variables. +permissions: read-all + +name: Link Check CI + +on: + pull_request: + types: [opened, synchronize] + push: + branches: + - 'v3.x/staging' + - 'v2.x/staging' + workflow_dispatch: + +jobs: + lychee-link-check: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Link Checker + id: lychee + uses: lycheeverse/lychee-action@f81112d0d2814ded911bd23e3beaa9dda9093915 # v2.1.0 + with: + fail: true + format: json + output: lychee_output.json + args: --config ./.github/lychee.toml --no-progress --verbose --max-retries 10 'bin/**/*' 'smpe/**/*' 'workflows/**/*' + + - name: Output failed links in console + id: quick-output + if: always() + run: | + if [[ -f "lychee_output.json" ]]; then + jq .fail_map lychee_output.json + else + echo "lychee command failed and didn't produce output" + fi + + - name: Publish Output + id: publish + if: always() + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 + with: + name: lychee_results.json + path: lychee_output.json diff --git a/.github/workflows/pswi-zowe-config-test.yml b/.github/workflows/pswi-zowe-config-test.yml index 0d25066436..5fcf430e54 100644 --- a/.github/workflows/pswi-zowe-config-test.yml +++ b/.github/workflows/pswi-zowe-config-test.yml @@ -35,7 +35,7 @@ jobs: with: lock-repository: ${{ github.repository }} github-token: ${{ secrets.GITHUB_TOKEN }} - lock-resource-name: zowe-psi-build-zzow07-lock + lock-resource-name: zowe-psi-build-zzow10-lock lock-avg-retry-interval: 30 - name: 'Test ZWECONF workflow' @@ -58,3 +58,4 @@ jobs: pswi/**.txt pswi/zowe_.yaml pswi/ZWECONF1/** + pswi/logs/** diff --git a/.pax/pre-packaging.sh b/.pax/pre-packaging.sh index 15bad07711..531bef0ea3 100755 --- a/.pax/pre-packaging.sh +++ b/.pax/pre-packaging.sh @@ -190,8 +190,8 @@ BASE_DIR=$( pwd ) # /.pax -# use node v16 to build -export NODE_HOME=/ZOWE/node/node-v16.20.1-os390-s390x +# use node v18 to build +export NODE_HOME=/ZOWE/node/node-v18.16.0 export JAVA_HOME=/ZOWE/node/J17.0_64 export PATH=$JAVA_HOME/bin:$PATH ZOWE_ROOT_DIR="${BASE_DIR}/content" diff --git a/CHANGELOG.md b/CHANGELOG.md index b2c4502bd5..88cdd0a1ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,23 @@ All notable changes to the Zowe Installer will be documented in this file. +## `3.1.0` +- Bugfix: When logging `zwe` command, sometimes the log has wrong file tag and the log is unreadable. [#4071](https://github.com/zowe/zowe-install-packaging/pull/4071) +- Bugfix: When `--log-dir` parameter for `zwe` command is a file, there might be an error "InternalError: stack overflow". [#4064](https://github.com/zowe/zowe-install-packaging/pull/4064) +- Enhancement: command `zwe init` does not require NodeJS [#4088](https://github.com/zowe/zowe-install-packaging/pull/4088) +- Enhancement: command `zwe install` does not require NodeJS [#4069](https://github.com/zowe/zowe-install-packaging/pull/4069) +- Enhancement: new javascript funtion `getStatvfs()` to obtain information about the file sysytem [#3994](https://github.com/zowe/zowe-install-packaging/pull/3994) +- Enhancement: command `zwe diagnose` in javascript only [#4061](https://github.com/zowe/zowe-install-packaging/pull/4061) +- Enhancement: schema validation update for `zowe.job.name` and `zowe.job.prefix` [#4060](https://github.com/zowe/zowe-install-packaging/pull/4060) + ## `3.0.0` ### Breaking Changes -- `zowe.yaml` changed its default z/OSMF Service ID definition from `zosmf` to `ibmzosmf`, which may impact Zowe Clients. For more information on this change, please see the API Mediation Layer's 3.0.0 Breaking Changes. +- The Zowe YAML now requires the `zaas` component for the API Mediation Layer to work. See example-zowe.yaml for new component values. +- The Zowe YAML attribute `components.gateway.apiml.security.auth.zosmf.serviceId` for the “gateway” component has changed from “zosmf” to “ibmzosmf”. This may impact Zowe Clients. See example-zowe.yaml for new component values. For more information on this change, please see the API Mediation Layer's 3.0.0 Breaking Changes. +- The Zowe YAML parameter `components.gateway.apiml.security.auth.zosmf.jwtAutoconfiguration` for the “gateway” component has changed. The value “auto” is no longer allowed, and you must choose either the default of “jwt” or “ltpa” depending on if your z/OSMF is set up for JWT use as recommended See example-zowe.yaml for new component values. For more information on this change, please see the API Mediation Layer's 3.0.0 Breaking Changes. + ### New features and enhancements - Enhancement: Added explanation to possible error message when checking z/OSMF setting. [#3956](https://github.com/zowe/zowe-install-packaging/pull/3956) diff --git a/bin/commands/diagnose/index.sh b/bin/commands/diagnose/index.sh index e45a33a2bb..db76d7c37a 100644 --- a/bin/commands/diagnose/index.sh +++ b/bin/commands/diagnose/index.sh @@ -11,59 +11,4 @@ # Copyright Contributors to the Zowe Project. ####################################################################### -USE_CONFIGMGR=$(check_configmgr_enabled) -if [ "${USE_CONFIGMGR}" = "true" ]; then - _CEE_RUNOPTS="XPLINK(ON),HEAPPOOLS(OFF),HEAPPOOLS64(OFF)" ${ZWE_zowe_runtimeDirectory}/bin/utils/configmgr -script "${ZWE_zowe_runtimeDirectory}/bin/commands/diagnose/cli.js" -else - - error_code="${ZWE_CLI_PARAMETER_ERROR_CODE}" - - print_message "" - - if echo $error_code | grep -q -E "^[zZ][wW][eE][AaSsDdLl][A-Za-z]?[0-9]{3,4}[A-Za-z]$"; then - server_code=$(echo "${error_code}" | cut -c4) - if [[ "$server_code" == [Dd] ]]; then - print_message "This code corresponds to the errors related to the ZOWE Desktop and the App Server." - print_message "" - print_message "To find the description of this error code, refer to the:" - print_message "" - print_message " Zowe documentation for Application framework" - print_message " https://docs.zowe.org/stable/troubleshoot/app-framework/appserver-error-codes" - elif [[ "$server_code" == [Ss] ]]; then - print_message "This code corresponds to the errors related to the Zowe Subsystem Services (ZSS) and Zowe Installation Services (ZIS)." - print_message "" - print_message "To find the description of this error code, refer to the:" - print_message "" - print_message " Zowe documentation for ZSS" - print_message " https://docs.zowe.org/stable/troubleshoot/app-framework/zss-error-codes" - print_message " Zowe documentation for ZIS" - print_message " https://docs.zowe.org/stable/troubleshoot/app-framework/zis-error-codes" - elif [[ "$server_code" == [Aa] ]]; then - print_message "This code corresponds to the errors related to the Zowe API Mediation Layer (APIML)." - print_message "" - print_message "To find the description of this error code, refer to the:" - print_message "" - print_message " Zowe documentation for API Mediation Layer" - print_message " https://docs.zowe.org/stable/troubleshoot/troubleshoot-apiml-error-codes" - elif [[ "$server_code" == [Ll] ]]; then - print_message "This code corresponds to the errors related to the Zowe Launcher and ZWE." - print_message "" - print_message "To find the description of this error code, refer to the:" - print_message "" - print_message " Zowe documentation for Launcher" - print_message " https://docs.zowe.org/stable/troubleshoot/launcher/launcher-error-codes" - print_message " Launcher error codes" - print_message " https://github.com/zowe/launcher/blob/v2.x/master/src/msg.h" - print_message " Zowe documentation for ZWE" - print_message " https://docs.zowe.org/stable/appendix/zwe_server_command_reference/zwe/" - fi - print_message "" - print_message "You may also explore reports from other users experiencing the same error by searching" - print_message "https://github.com/search?q=org%3Azowe+${error_code}&type=discussions" - else - print_error_and_exit "ZWEL0102E: Invalid parameter --error-code='${error_code}'" "" 102 - fi - - print_message "" - -fi +_CEE_RUNOPTS="XPLINK(ON)" ${ZWE_zowe_runtimeDirectory}/bin/utils/configmgr -script "${ZWE_zowe_runtimeDirectory}/bin/commands/diagnose/cli.js" diff --git a/bin/commands/diagnose/index.ts b/bin/commands/diagnose/index.ts index 8fb6518277..4535f7e2fa 100644 --- a/bin/commands/diagnose/index.ts +++ b/bin/commands/diagnose/index.ts @@ -3,65 +3,64 @@ under the terms of the Eclipse Public License v2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-v20.html - + SPDX-License-Identifier: EPL-2.0 - + Copyright Contributors to the Zowe Project. */ + import * as std from 'cm_std'; import * as common from '../../libs/common'; -const THIS_CODE = "\nThis code corresponds to the errors related to the"; -const FIND_DESC = "To find the description of this error code, refer to the:\n "; -const URL = { - apiML: "https://docs.zowe.org/stable/troubleshoot/troubleshoot-apiml-error-codes", - appFW : "https://docs.zowe.org/stable/troubleshoot/app-framework/appserver-error-codes", - launcher: "https://docs.zowe.org/stable/troubleshoot/launcher/launcher-error-codes", - launcherGit: "https://github.com/zowe/launcher/blob/v2.x/master/src/msg.h", - zss: "https://docs.zowe.org/stable/troubleshoot/app-framework/zss-error-codes", - zis: "https://docs.zowe.org/stable/troubleshoot/app-framework/zis-error-codes", - zwe: "https://docs.zowe.org/stable/appendix/zwe_server_command_reference/zwe/" -} - -function thisCodeCorrespondsTo(component: string){ - common.printMessage(`${THIS_CODE} ${component}.\n`); - common.printMessage(`${FIND_DESC}`); +const COMPONENTS = { + a: { + title: 'Zowe API Mediation Layer (APIML)', + urls: [ + { text: 'API Mediation Layer', link: 'https://docs.zowe.org/stable/troubleshoot/troubleshoot-apiml-error-codes' } + ] + }, + d: { + title: 'Zowe Desktop and the App Server', + urls: [ + { text: 'Application framework', link: 'https://docs.zowe.org/stable/troubleshoot/app-framework/appserver-error-codes' } + ] + }, + l: { + title: 'Zowe Launcher and zwe', + urls: [ + { text: 'Launcher', link: 'https://docs.zowe.org/stable/troubleshoot/launcher/launcher-error-codes' }, + { text: 'Launcher error codes', link: `https://github.com/zowe/launcher/blob/v${common.getZoweVersion().substring(0,1)}.x/master/src/msg.h`, git: true }, + { text: 'zwe', link: 'https://docs.zowe.org/stable/appendix/zwe_server_command_reference/zwe/' }, + ] + }, + s: { + title: 'Zowe Subsystem Services (ZSS) and Zowe Installation Services (ZIS)', + urls: [ + { text: 'ZSS', link: 'https://docs.zowe.org/stable/troubleshoot/app-framework/zss-error-codes' }, + { text: 'ZIS', link: 'https://docs.zowe.org/stable/troubleshoot/app-framework/zis-error-codes' } + ] + } } -function printLinks(description: string, link: string){ - if (link.indexOf('github') > 0) - common.printMessage(` ${description}`) - else - common.printMessage(` Zowe documentation for ${description}`) - common.printMessage(` ${link}`); +function printComponent(component: any): void { + common.printMessage(`\nThis code corresponds to the errors related to the ${component.title}.\n`); + common.printMessage(`To find the description of this error code, refer to the:\n`); + for (let url in component.urls) { + let zoweDocFor = component.urls[url].git ? '' : 'Zowe documentation for '; + common.printMessage(` ${zoweDocFor}${component.urls[url].text}`); + common.printMessage(` ${component.urls[url].link}`); + } } -export function execute() { +export function execute(): void { const errorCode = std.getenv('ZWE_CLI_PARAMETER_ERROR_CODE'); if (/^[zZ][wW][eE][AaSsDdLl][A-Za-z]?[0-9]{3,4}[A-Za-z]$/.test(errorCode)) { - const serverCode = errorCode.charAt(3); - if (serverCode.toLowerCase() === 'd') { - thisCodeCorrespondsTo('ZOWE Desktop and the App Server'); - printLinks('Application framework', `${URL.appFW}`); - } - else if (serverCode.toLowerCase() === 's') { - thisCodeCorrespondsTo('Zowe Subsystem Services (ZSS) and Zowe Installation Services (ZIS)'); - printLinks('ZSS', `${URL.zss}`); - printLinks('ZIS', `${URL.zis}`); - } - else if (serverCode.toLowerCase() === 'a') { - thisCodeCorrespondsTo('Zowe API Mediation Layer (APIML)'); - printLinks('API Mediation Layer', `${URL.apiML}`); + const serverCode = errorCode.charAt(3).toLowerCase(); + if ('adls'.includes(serverCode)) { + printComponent(COMPONENTS[serverCode]); + common.printMessage(`\nYou may also explore reports from other users experiencing the same error by searching\nhttps://github.com/search?q=org%3Azowe+${errorCode}&type=discussions\n`); } - else if (serverCode.toLowerCase() === 'l') { - thisCodeCorrespondsTo('Zowe Launcher and ZWE'); - printLinks('Launcher', `${URL.launcher}`); - printLinks('Launcher error codes', `${URL.launcherGit}`); - printLinks('ZWE', `${URL.zwe}`); - } - common.printMessage(`\nYou may also explore reports from other users experiencing the same error by searching\nhttps://github.com/search?q=org%3Azowe+${errorCode}&type=discussions\n`); - } - else { + } else { common.printErrorAndExit(`ZWEL0102E: Invalid parameter --error-code='${errorCode}'`, undefined, 102); } } diff --git a/bin/commands/init/apfauth/index.sh b/bin/commands/init/apfauth/index.sh index d248cbb904..06398f846d 100644 --- a/bin/commands/init/apfauth/index.sh +++ b/bin/commands/init/apfauth/index.sh @@ -19,10 +19,10 @@ auth_libs="authLoadlib authPluginLib" ############################### # validation -require_zowe_yaml +require_zowe_yaml "skipnode" # read prefix and validate -prefix=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") +prefix=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") if [ -z "${prefix}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe dataset prefix (zowe.setup.dataset.prefix) is not defined in Zowe YAML configuration file." "" 157 fi @@ -32,7 +32,7 @@ fi job_has_failures= for key in ${auth_libs}; do # read def and validate - ds=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.${key}") + ds=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.${key}") if [ -z "${ds}" ]; then # authLoadlib can be empty if [ "${key}" = "authLoadlib" ]; then diff --git a/bin/commands/init/certificate/index.sh b/bin/commands/init/certificate/index.sh index a1d2f5c8dd..90106839fb 100644 --- a/bin/commands/init/certificate/index.sh +++ b/bin/commands/init/certificate/index.sh @@ -13,24 +13,24 @@ ############################### # validation -require_zowe_yaml +require_zowe_yaml "skipnode" ############################### # read prefix and validate -prefix=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") +prefix=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") if [ -z "${prefix}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe dataset prefix (zowe.setup.dataset.prefix) is not defined in Zowe YAML configuration file." "" 157 fi # read JCL library and validate -jcllib=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.jcllib") +jcllib=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.jcllib") if [ -z "${jcllib}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe custom JCL library (zowe.setup.dataset.jcllib) is not defined in Zowe YAML configuration file." "" 157 fi -security_product=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.product") -security_users_zowe=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.users.zowe") -security_groups_admin=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.groups.admin") +security_product=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.product") +security_users_zowe=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.users.zowe") +security_groups_admin=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.groups.admin") # read cert type and validate -cert_type=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.type") +cert_type=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.type") if [ -z "${cert_type}" ]; then print_error_and_exit "Error ZWEL0157E: Certificate type (zowe.setup.certificate.type) is not defined in Zowe YAML configuration file." "" 157 fi @@ -41,16 +41,16 @@ fi # read cert dname for item in caCommonName commonName orgUnit org locality state country; do var_name="dname_${item}" - var_val=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.dname.${item}") + var_val=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.dname.${item}") eval "${var_name}=\"${var_val}\"" done # read cert validity -cert_validity=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.validity") +cert_validity=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.validity") if [ "${cert_type}" = "PKCS12" ]; then # read keystore info for item in directory lock name password caAlias caPassword; do var_name="pkcs12_${item}" - var_val=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.pkcs12.${item}") + var_val=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.pkcs12.${item}") eval "${var_name}=\"${var_val}\"" done if [ -z "${pkcs12_directory}" ]; then @@ -59,7 +59,7 @@ if [ "${cert_type}" = "PKCS12" ]; then # read keystore import info for item in keystore password alias; do var_name="pkcs12_import_${item}" - var_val=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.pkcs12.import.${item}") + var_val=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.pkcs12.import.${item}") eval "${var_name}=\"${var_val}\"" done if [ -n "${pkcs12_import_keystore}" ]; then @@ -75,47 +75,51 @@ elif [[ "${cert_type}" == JCE*KS ]]; then # read keyring info for item in owner name label caLabel; do var_name="keyring_${item}" - var_val=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.${item}") + var_val=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.${item}") eval "${var_name}=\"${var_val}\"" done if [ -z "${keyring_name}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe keyring name (zowe.setup.certificate.keyring.name) is not defined in Zowe YAML configuration file." "" 157 fi - keyring_import_dsName=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.import.dsName") - keyring_import_password=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.import.password") + keyring_import_dsName=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.import.dsName") + keyring_import_password=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.import.password") if [ -n "${keyring_import_dsName}" ]; then keyring_option=3 if [ -z "${keyring_import_password}" ]; then print_error_and_exit "Error ZWEL0157E: The password for data set storing importing certificate (zowe.setup.certificate.keyring.import.password) is not defined in Zowe YAML configuration file." "" 157 fi fi - keyring_connect_user=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.connect.user") - keyring_connect_label=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.connect.label") + keyring_connect_user=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.connect.user") + keyring_connect_label=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.connect.label") if [ -n "${keyring_connect_label}" ]; then keyring_option=2 fi fi +# Trace or debug information will be part of the output, let's turn it off for the inline zwe commands +save_trace=$ZWE_PRIVATE_LOG_LEVEL_ZWELS +ZWE_PRIVATE_LOG_LEVEL_ZWELS= # read keystore domains -cert_import_CAs=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.importCertificateAuthorities" | tr '\n' ',') +cert_import_CAs=$(zwecli_inline_execute_command internal config get --config "${ZWE_CLI_PARAMETER_CONFIG}" --path ".zowe.setup.certificate.importCertificateAuthorities" | tr '\n' ',' | awk '{ print substr( $0, 1, length($0)-1 ) }') # read keystore domains -cert_domains=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.san" | tr '\n' ',') +cert_domains=$(zwecli_inline_execute_command internal config get --config "${ZWE_CLI_PARAMETER_CONFIG}" --path ".zowe.setup.certificate.san" | tr '\n' ',' | awk '{ print substr( $0, 1, length($0)-1 ) }') if [ -z "${cert_domains}" ]; then - cert_domains=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.externalDomains" | tr '\n' ',') + cert_domains=$(zwecli_inline_execute_command internal config get --config "${ZWE_CLI_PARAMETER_CONFIG}" --path ".zowe.externalDomains" | tr '\n' ',' | awk '{ print substr( $0, 1, length($0)-1 ) }') fi +ZWE_PRIVATE_LOG_LEVEL_ZWELS=$save_trace # read z/OSMF info for item in user ca; do var_name="zosmf_${item}" - var_val=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.zOSMF.${item}") + var_val=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.certificate.keyring.zOSMF.${item}") eval "${var_name}=\"${var_val}\"" done for item in host port; do var_name="zosmf_${item}" - var_val=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zOSMF.${item}") + var_val=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zOSMF.${item}") eval "${var_name}=\"${var_val}\"" done keyring_trust_zosmf= -verify_certificates=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.verifyCertificates" | upper_case) +verify_certificates=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.verifyCertificates" | upper_case) if [ "${verify_certificates}" = "STRICT" -o "${verify_certificates}" = "NONSTRICT" ]; then keyring_trust_zosmf="--trust-zosmf" else diff --git a/bin/commands/init/index.sh b/bin/commands/init/index.sh index a2815f2b49..ba87c5ee57 100755 --- a/bin/commands/init/index.sh +++ b/bin/commands/init/index.sh @@ -36,10 +36,10 @@ if [ -z "${yaml_java_home}" ]; then fi fi # zowe.runtimeDirectory -require_zowe_yaml +require_zowe_yaml "skipnode" update_zowe_runtime_dir= # do we have zowe.runtimeDirectory defined in zowe.yaml? -yaml_runtime_dir=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.runtimeDirectory") +yaml_runtime_dir=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.runtimeDirectory") if [ -n "${yaml_runtime_dir}" ]; then result=$(are_directories_same "${yaml_runtime_dir}" "${ZWE_zowe_runtimeDirectory}") code=$? diff --git a/bin/commands/init/mvs/index.sh b/bin/commands/init/mvs/index.sh index 7f1102c95d..ab724fa206 100644 --- a/bin/commands/init/mvs/index.sh +++ b/bin/commands/init/mvs/index.sh @@ -22,10 +22,10 @@ authPluginLib|Zowe authorized plugin library|dsntype(library) dsorg(po) recfm(u) ############################### # validation -require_zowe_yaml +require_zowe_yaml "skipnode" # read prefix and validate -prefix=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") +prefix=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") if [ -z "${prefix}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe dataset prefix (zowe.setup.dataset.prefix) is not defined in Zowe YAML configuration file." "" 157 fi @@ -39,7 +39,7 @@ while read -r line; do spec=$(echo "${line}" | awk -F"|" '{print $3}') # read def and validate - ds=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.${key}") + ds=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.${key}") if [ -z "${ds}" ]; then # authLoadlib can be empty if [ "${key}" = "authLoadlib" ]; then @@ -76,7 +76,7 @@ if [ "${ds_existence}" = "true" ] && [ "${ZWE_CLI_PARAMETER_ALLOW_OVERWRITE}" ! else ############################### # copy sample lib members - parmlib=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.parmlib") + parmlib=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.parmlib") for ds in ZWESIP00; do print_message "Copy ${prefix}.${ZWE_PRIVATE_DS_SZWESAMP}(${ds}) to ${parmlib}(${ds})" data_set_copy_to_data_set "${prefix}" "${prefix}.${ZWE_PRIVATE_DS_SZWESAMP}(${ds})" "${parmlib}(${ds})" "${ZWE_CLI_PARAMETER_ALLOW_OVERWRITE}" @@ -88,7 +88,7 @@ else ############################### # copy auth lib members # FIXME: data_set_copy_to_data_set cannot be used to copy program? - authLoadlib=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.authLoadlib") + authLoadlib=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.authLoadlib") if [ -n "${authLoadlib}" ]; then for ds in ZWESIS01 ZWESAUX ZWESISDL; do print_message "Copy components/zss/LOADLIB/${ds} to ${authLoadlib}(${ds})" diff --git a/bin/commands/init/security/index.sh b/bin/commands/init/security/index.sh index b0d2c48551..a07c135ef8 100644 --- a/bin/commands/init/security/index.sh +++ b/bin/commands/init/security/index.sh @@ -18,51 +18,51 @@ print_level1_message "Run Zowe security configurations" ############################### # validation -require_zowe_yaml +require_zowe_yaml "skipnode" # read prefix and validate -prefix=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") +prefix=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") if [ -z "${prefix}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe dataset prefix (zowe.setup.dataset.prefix) is not defined in Zowe YAML configuration file." "" 157 fi # read JCL library and validate -jcllib=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.jcllib") +jcllib=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.jcllib") if [ -z "${jcllib}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe custom JCL library (zowe.setup.dataset.jcllib) is not defined in Zowe YAML configuration file." "" 157 fi -security_product=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.product") +security_product=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.product") if [ -z "${security_product}" ]; then security_product=RACF fi -security_groups_admin=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.groups.admin") +security_groups_admin=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.groups.admin") if [ -z "${security_groups_admin}" ]; then security_groups_admin=${ZWE_PRIVATE_DEFAULT_ADMIN_GROUP} fi -security_groups_stc=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.groups.stc") +security_groups_stc=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.groups.stc") if [ -z "${security_groups_stc}" ]; then security_groups_stc=${ZWE_PRIVATE_DEFAULT_ADMIN_GROUP} fi -security_groups_sysProg=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.groups.sysProg") +security_groups_sysProg=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.groups.sysProg") if [ -z "${security_groups_sysProg}" ]; then security_groups_sysProg=${ZWE_PRIVATE_DEFAULT_ADMIN_GROUP} fi -security_users_zowe=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.users.zowe") +security_users_zowe=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.users.zowe") if [ -z "${security_users_zowe}" ]; then security_users_zowe=${ZWE_PRIVATE_DEFAULT_ZOWE_USER} fi -security_users_zis=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.users.zis") +security_users_zis=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.users.zis") if [ -z "${security_users_zis}" ]; then security_users_zis=${ZWE_PRIVATE_DEFAULT_ZIS_USER} fi -security_stcs_zowe=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.zowe") +security_stcs_zowe=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.zowe") if [ -z "${security_stcs_zowe}" ]; then security_stcs_zowe=${ZWE_PRIVATE_DEFAULT_ZOWE_STC} fi -security_stcs_zis=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.zis") +security_stcs_zis=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.zis") if [ -z "${security_stcs_zis}" ]; then security_stcs_zis=${ZWE_PRIVATE_DEFAULT_ZIS_STC} fi -security_stcs_aux=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.aux") +security_stcs_aux=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.aux") if [ -z "${security_stcs_aux}" ]; then security_stcs_aux=${ZWE_PRIVATE_DEFAULT_AUX_STC} fi diff --git a/bin/commands/init/stc/index.sh b/bin/commands/init/stc/index.sh index c26cf6e7e8..f3de7377e9 100644 --- a/bin/commands/init/stc/index.sh +++ b/bin/commands/init/stc/index.sh @@ -19,47 +19,47 @@ proclibs="ZWESLSTC ZWESISTC ZWESASTC" ############################### # validation -require_zowe_yaml +require_zowe_yaml "skipnode" # read prefix and validate -prefix=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") +prefix=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") if [ -z "${prefix}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe dataset prefix (zowe.setup.dataset.prefix) is not defined in Zowe YAML configuration file." "" 157 fi # read PROCLIB and validate -proclib=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.proclib") +proclib=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.proclib") if [ -z "${proclib}" ]; then print_error_and_exit "Error ZWEL0157E: PROCLIB (zowe.setup.dataset.proclib) is not defined in Zowe YAML configuration file." "" 157 fi # read JCL library and validate -jcllib=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.jcllib") +jcllib=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.jcllib") if [ -z "${jcllib}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe custom JCL library (zowe.setup.dataset.jcllib) is not defined in Zowe YAML configuration file." "" 157 fi # read PARMLIB and validate -parmlib=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.parmlib") +parmlib=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.parmlib") if [ -z "${parmlib}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe custom parameter library (zowe.setup.dataset.parmlib) is not defined in Zowe YAML configuration file." "" 157 fi # read LOADLIB and validate -authLoadlib=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.authLoadlib") +authLoadlib=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.authLoadlib") if [ -z "${authLoadlib}" ]; then # authLoadlib can be empty authLoadlib="${prefix}.${ZWE_PRIVATE_DS_SZWEAUTH}" fi -authPluginLib=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.authPluginLib") +authPluginLib=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.authPluginLib") if [ -z "${authPluginLib}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe custom load library (zowe.setup.dataset.authPluginLib) is not defined in Zowe YAML configuration file." "" 157 fi -security_stcs_zowe=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.zowe") +security_stcs_zowe=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.zowe") if [ -z "${security_stcs_zowe}" ]; then security_stcs_zowe=${ZWE_PRIVATE_DEFAULT_ZOWE_STC} fi -security_stcs_zis=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.zis") +security_stcs_zis=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.zis") if [ -z "${security_stcs_zis}" ]; then security_stcs_zis=${ZWE_PRIVATE_DEFAULT_ZIS_STC} fi -security_stcs_aux=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.aux") +security_stcs_aux=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.security.stcs.aux") if [ -z "${security_stcs_aux}" ]; then security_stcs_aux=${ZWE_PRIVATE_DEFAULT_AUX_STC} fi diff --git a/bin/commands/init/vsam/index.sh b/bin/commands/init/vsam/index.sh index f40e606b6a..e279ff07b7 100644 --- a/bin/commands/init/vsam/index.sh +++ b/bin/commands/init/vsam/index.sh @@ -18,43 +18,43 @@ print_level1_message "Create VSAM storage for Zowe Caching Service" ############################### # validation -require_zowe_yaml +require_zowe_yaml "skipnode" -caching_storage=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".components.caching-service.storage.mode" | upper_case) +caching_storage=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".components.caching-service.storage.mode" | upper_case) if [ "${caching_storage}" != "VSAM" ]; then print_error "Warning ZWEL0301W: Zowe Caching Service is not configured to use VSAM. Command skipped." return 0 fi # read prefix and validate -prefix=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") +prefix=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") if [ -z "${prefix}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe dataset prefix (zowe.setup.dataset.prefix) is not defined in Zowe YAML configuration file." "" 157 fi # read JCL library and validate -jcllib=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.jcllib") +jcllib=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.jcllib") if [ -z "${jcllib}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe custom JCL library (zowe.setup.dataset.jcllib) is not defined in Zowe YAML configuration file." "" 157 fi -vsam_mode=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.vsam.mode") +vsam_mode=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.vsam.mode") if [ -z "${vsam_mode}" ]; then vsam_mode=NONRLS fi vsam_volume= if [ "${vsam_mode}" = "NONRLS" ]; then - vsam_volume=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.vsam.volume") + vsam_volume=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.vsam.volume") if [ -z "${vsam_volume}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe Caching Service VSAM data set volume (zowe.setup.vsam.volume) is not defined in Zowe YAML configuration file." "" 157 fi fi vsam_storageClass= if [ "${vsam_mode}" = "RLS" ]; then - vsam_storageClass=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.vsam.storageClass") + vsam_storageClass=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.vsam.storageClass") if [ -z "${vsam_storageClass}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe Caching Service VSAM data set RLS storage class (zowe.setup.vsam.storageClass) is not defined in Zowe YAML configuration file." "" 157 fi fi -vsam_name=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".components.caching-service.storage.vsam.name") +vsam_name=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".components.caching-service.storage.vsam.name") if [ -z "${vsam_name}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe Caching Service VSAM data set name (components.caching-service.storage.vsam.name) is not defined in Zowe YAML configuration file." "" 157 fi diff --git a/bin/commands/install/index.sh b/bin/commands/install/index.sh index 0fc9e7fad6..05a0455e6d 100644 --- a/bin/commands/install/index.sh +++ b/bin/commands/install/index.sh @@ -26,10 +26,10 @@ ${ZWE_PRIVATE_DS_SZWEEXEC}|Zowe executable utilities library|dsntype(library) ds if [ -n "${ZWE_CLI_PARAMETER_DATASET_PREFIX}" ]; then prefix="${ZWE_CLI_PARAMETER_DATASET_PREFIX}" else - require_zowe_yaml + require_zowe_yaml "skipnode" # read prefix and validate - prefix=$(read_yaml "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") + prefix=$(read_yaml_configmgr "${ZWE_CLI_PARAMETER_CONFIG}" ".zowe.setup.dataset.prefix") if [ -z "${prefix}" ]; then print_error_and_exit "Error ZWEL0157E: Zowe dataset prefix (zowe.setup.dataset.prefix) is not defined in Zowe YAML configuration file." "" 157 fi diff --git a/bin/libs/certificate.sh b/bin/libs/certificate.sh index 1daf58fd49..4d9981d612 100644 --- a/bin/libs/certificate.sh +++ b/bin/libs/certificate.sh @@ -646,8 +646,14 @@ EOF return 1 fi if [ `uname` = "OS/390" ]; then - iconv -f ISO8859-1 -t IBM-1047 "${keystore_dir}/${alias_lc}.cer" > "${keystore_dir}/${alias_lc}.cer-ebcdic" - mv "${keystore_dir}/${alias_lc}.cer-ebcdic" "${keystore_dir}/${alias_lc}.cer" + # check if certificate is in EBCDIC before converting + if [[ "$(head -c 10 ${keystore_dir}/${alias_lc}.cer)" = "-----BEGIN" ]]; then + print_message ">>>> Certificate \"${keystore_dir}/${alias_lc}.cer is in EBCDIC." + else + print_message ">>>> Converting certificate \"${keystore_dir}/${alias_lc}.cer\" to EBCDIC." + iconv -f ISO8859-1 -t IBM-1047 "${keystore_dir}/${alias_lc}.cer" >"${keystore_dir}/${alias_lc}.cer-ebcdic" + mv "${keystore_dir}/${alias_lc}.cer-ebcdic" "${keystore_dir}/${alias_lc}.cer" + fi ensure_file_encoding "${keystore_dir}/${alias_lc}.cer" "CERTIFICATE" fi fi diff --git a/bin/libs/common.sh b/bin/libs/common.sh index 5db74cc256..52815dfe6a 100644 --- a/bin/libs/common.sh +++ b/bin/libs/common.sh @@ -46,9 +46,9 @@ check_configmgr_enabled() { } require_zowe_yaml() { - # node is required to read yaml file - require_node - + if [ -z "${1}" ]; then + require_node + fi if [ -z "${ZWE_CLI_PARAMETER_CONFIG}" ]; then print_error_and_exit "Error ZWEL0108E: Zowe YAML config file is required." "" 108 elif [ ! -f "${ZWE_CLI_PARAMETER_CONFIG}" ]; then diff --git a/bin/libs/common.ts b/bin/libs/common.ts index 76f94ae3c0..47bdd94dcc 100644 --- a/bin/libs/common.ts +++ b/bin/libs/common.ts @@ -128,36 +128,21 @@ export function date(...args: string[]): string|undefined { let logExists = false; -let logFile:std.File|null = null; function writeLog(message: string): boolean { + const filename = std.getenv('ZWE_PRIVATE_LOG_FILE'); + if (!filename) { + return false; + } + logExists = fs.fileExists(filename); if (!logExists) { - const filename = std.getenv('ZWE_PRIVATE_LOG_FILE'); - if (filename) { + fs.createFile(filename, 0o640, message); logExists = fs.fileExists(filename); - if (!logExists) { - fs.createFile(filename, 0o640, message); - logExists = fs.fileExists(filename); - } - if (logExists) { - let errObj = {errno:undefined}; - logFile = std.open(filename, 'w', errObj); - if (errObj.errno) { - printError(`Error opening file ${filename}, errno=${errObj.errno}`); - logFile=null; - logExists=false; - return false; - } - } - } - } - if (logFile===undefined || logFile===null) { - return false; } else { - //TODO this does utf8. should we flip it to 1047 on zos? - logFile.puts(message); - return true; + xplatform.appendFileUTF8(filename, xplatform.AUTO_DETECT, message); + return true; } + return logExists; } @@ -345,7 +330,7 @@ export function getZoweRuntimeManifest(): any|undefined { if (!runtimeManifest) { const manifestFileName = `${std.getenv('ZWE_zowe_runtimeDirectory')}/manifest.json`; const result = xplatform.loadFileUTF8(manifestFileName,xplatform.AUTO_DETECT); - if (result){ + if (!result) { printError('Could not read runtime manifest in '+manifestFileName); } else { runtimeManifest=JSON.parse(result); diff --git a/bin/libs/component.ts b/bin/libs/component.ts index 5f5bbe5160..4669741400 100644 --- a/bin/libs/component.ts +++ b/bin/libs/component.ts @@ -387,6 +387,32 @@ export function findAllLaunchComponents2(): string[] { }); } +function getBooleanEnv(variableName) { + const value = std.getenv(`${variableName}`); + if (value === "true") { + return true + } + if (value === "false") { + return false + } + return undefined +} + + +function isClientAttls() { + const clientGlobalAttls = getBooleanEnv('ZWE_zowe_network_client_tls_attls'); + const serverGlobalAttls = getBooleanEnv('ZWE_zowe_network_server_tls_attls'); + const clientLocalAttls = getBooleanEnv('ZWE_components_zaas_zowe_network_client_tls_attls'); + const serverLocalAttls = getBooleanEnv('ZWE_components_zaas_zowe_network_server_tls_attls'); + const clientAttls = clientGlobalAttls || clientLocalAttls; + if ((clientGlobalAttls !== false) && (clientLocalAttls !== false) && (!clientAttls)) { + // If client attls not explicitly false OR truthy, have client follow server attls variable. it simplifies common case in which users want both. + return serverGlobalAttls || serverLocalAttls; + } else { + return clientAttls; + } +} + export function processComponentApimlStaticDefinitions(componentDir: string): boolean { const STATIC_DEF_DIR=std.getenv('ZWE_STATIC_DEFINITIONS_DIR'); if (!STATIC_DEF_DIR) { @@ -418,6 +444,22 @@ export function processComponentApimlStaticDefinitions(componentDir: string): bo const contents = xplatform.loadFileUTF8(path,xplatform.AUTO_DETECT); if (contents) { + const zosmfScheme = std.getenv("ZOSMF_SCHEME"); + const attls = isClientAttls() + const schemeEnv = std.getenv("ZWE_zOSMF_scheme"); + + let scheme = "https"; + + if (zosmfScheme) { + scheme = zosmfScheme; + } else if (schemeEnv) { + scheme = schemeEnv; + } else if (attls) { + scheme = "http"; + } + + std.setenv('ZOSMF_SCHEME', scheme); + const resolvedContents = varlib.resolveShellTemplate(contents); const zweCliParameterHaInstance=std.getenv("ZWE_CLI_PARAMETER_HA_INSTANCE"); diff --git a/bin/libs/json.sh b/bin/libs/json.sh index 5b5342a4a3..322361c3dc 100644 --- a/bin/libs/json.sh +++ b/bin/libs/json.sh @@ -109,6 +109,40 @@ read_yaml() { return ${code} } +read_yaml_configmgr() { + file="${1}" + key=$(echo "${2}" | tr '.' '/') + ignore_null="${3:-true}" + + print_trace "- read_yaml_configmgr process ${file} and extract '${2} -> ${key}'" + + configmgr="${ZWE_zowe_runtimeDirectory}/bin/utils/configmgr" + schema="${ZWE_zowe_runtimeDirectory}/schemas/server-common.json:${ZWE_zowe_runtimeDirectory}/schemas/zowe-yaml-schema.json" + + result=$(_CEE_RUNOPTS="XPLINK(ON)" "${configmgr}" -s "$schema" -p "FILE(${file})" extract "${key}" 2>&1); + code=$? + + # When the item is not defined in config, configmgr returns + # code 0 and + # stdout = "error not found, reason=nnn" + if [[ "${result}" == "error not found, reason="* ]]; then + result="" + fi + + print_trace " * Exit code: ${code}" + print_trace " * Output:" + print_trace "$(padding_left "${result}" " ")" + + if [ ${code} -eq 0 ]; then + if [ "${ignore_null}" = "true" ]; then + if [ "${result}" = "null" -o "${result}" = "undefined" ]; then + result= + fi + fi + printf "${result}" + fi +} + read_json() { file="${1}" key="${2}" diff --git a/bin/libs/logging.sh b/bin/libs/logging.sh index 6e41778aca..787c4fe7a4 100755 --- a/bin/libs/logging.sh +++ b/bin/libs/logging.sh @@ -14,6 +14,9 @@ export ZWE_PRIVATE_LOG_FILE= prepare_log_file() { + if [ -f "${1}" ]; then + print_error_and_exit "Error ZWEL0102E: Invalid parameter --log-dir=${1} (not a directory)" "" 102 + fi # use absolute path to make sure we can always write to correct location even # if other scripts changed current working directory log_dir=$(convert_to_absolute_path "${1}" | remove_trailing_slash) diff --git a/bin/libs/node.sh b/bin/libs/node.sh index d457c76b2f..4782864d7d 100644 --- a/bin/libs/node.sh +++ b/bin/libs/node.sh @@ -22,7 +22,7 @@ export NODE_STDIN_CCSID=1047 # Workaround Fix for node 8.16.1 that requires compatibility mode for untagged files export __UNTAGGED_READ_MODE=V6 -NODE_MIN=16 +NODE_MIN=18 ensure_node_is_on_path() { if [[ ":${PATH}:" != *":${NODE_HOME}/bin:"* ]]; then diff --git a/bin/libs/node.ts b/bin/libs/node.ts index 3b20ccfd76..40880f5665 100644 --- a/bin/libs/node.ts +++ b/bin/libs/node.ts @@ -18,7 +18,7 @@ import * as shell from './shell'; import * as config from './config'; import { PathAPI as pathoid } from './pathoid'; -const NODE_MIN_VERSION=16; +const NODE_MIN_VERSION=18; // enforce encoding of stdio/stdout/stderr // sometimes /dev/tty* ($SSH_TTY) are not configured properly, for example tagged as binary or wrong encoding diff --git a/bin/libs/zos-fs.ts b/bin/libs/zos-fs.ts index e0023a449f..9e6e9bf46f 100644 --- a/bin/libs/zos-fs.ts +++ b/bin/libs/zos-fs.ts @@ -116,3 +116,32 @@ export function ensureFileEncoding(file: string, expectedSample: string, expecte common.printTrace(`- Failed to detect encoding of ${file}.`); } } + +export type fileSystemFlagsReturn = { + rc: number, + exported?: boolean, + rdonly?: boolean, + nosuid?: boolean, + nosecurity?: boolean, +}; + +export function getFileSystemFlags(path: string): fileSystemFlagsReturn { + const ST_OEEXPORTED = 0x40000000 + const ST_RDONLY = 0x00000001 + const ST_NOSUID = 0x00000002 + const ST_NOSECURITY = 0x00000004 + let flags : fileSystemFlagsReturn = { rc: 1 }; + if (path) { + const result = zos.getStatvfs(path); + if (result[1] == 0) { + flags = { + rc: 0, + exported: !!(result[0].flag & ST_OEEXPORTED), + rdonly: !!(result[0].flag & ST_RDONLY), + nosuid: !!(result[0].flag & ST_NOSUID), + nosecurity: !!(result[0].flag & ST_NOSECURITY) + } + } + } + return flags; +} diff --git a/build/zwe/types/@qjstypes/xplatform.d.ts b/build/zwe/types/@qjstypes/xplatform.d.ts index f139e1ac00..6d4572936e 100644 --- a/build/zwe/types/@qjstypes/xplatform.d.ts +++ b/build/zwe/types/@qjstypes/xplatform.d.ts @@ -27,6 +27,7 @@ export function stringFromBytes(data:ArrayBuffer, offset:number, length:number, */ export function loadFileUTF8(path:string, sourceCCSID:number):string; export function storeFileUTF8(path:string, targetCCSID:number, content:string):number; +export function appendFileUTF8(path: string, targetCCSID:number, content:string):number; export var AUTO_DETECT:number; export var NO_CONVERT:number; diff --git a/build/zwe/types/@qjstypes/zos.d.ts b/build/zwe/types/@qjstypes/zos.d.ts index a1fb69517a..a47ec8e407 100644 --- a/build/zwe/types/@qjstypes/zos.d.ts +++ b/build/zwe/types/@qjstypes/zos.d.ts @@ -26,10 +26,29 @@ export type ZStat = { ccsid: number; }; +export type Statvfs = { + bsize: number; + blocks: number; + bavail: number; + fsid: number; + flag: number; + frsize: number; + bfree: number; + files: number; + ffree: number; + favail: number; + namemax: number; + OEmaxfilesizehw: number; + OEmaxfilesizelw: number; + OEusedspace: number; + OEinvarsec: number; +} + export function getEsm(): string; export function getZosVersion(): number; export function changeTag(path:string, ccsid:number):number; export function changeExtAttr(path: string, extattr:number, onOff:boolean):number; export function zstat(path:string):[ZStat, number]; +export function getStatvfs(path: string): [Statvfs, number]; export var EXTATTR_SHARELIB:number; export var EXTATTR_PROGCTL:number; diff --git a/example-zowe.yaml b/example-zowe.yaml index 79d9c61186..78d0ffb1c2 100644 --- a/example-zowe.yaml +++ b/example-zowe.yaml @@ -457,17 +457,17 @@ java: #------------------------------------------------------------------------------- -# node.js configuration +# Node.js configuration # -# Some Zowe components requires node.js. Define the path where you have your -# node.js is installed. +# Some Zowe components requires Node.js. Define the path where you have your +# Node.js is installed. # # **NOTE**: this field can be updated automatically if you pass `--update-config` # to `zwe init` command. #------------------------------------------------------------------------------- node: # **COMMONLY_CUSTOMIZED** - # Path to your node.js home directory + # Path to your Node.js home directory home: "" @@ -623,7 +623,7 @@ components: # # for this HA instance, we did not customize "components", so it will use default value. # # HA instance ID, we will start 2 instances on LPAR2 -# # **NOTE**, we can only start one gateway in same LPAR. +# # **NOTE**, we can only start one Gateway in same LPAR. # lpar2a: # # hostname where this instance will be started # hostname: lpar2.my-company.com diff --git a/files/defaults.yaml b/files/defaults.yaml index 94cd675cdf..8e319ea090 100644 --- a/files/defaults.yaml +++ b/files/defaults.yaml @@ -88,7 +88,7 @@ zowe: configmgr: # STRICT=quit on any error, including missing schema # COMPONENT-COMPAT=if component missing schema, skip it with warning instead of quit - validation: "COMPONENT-COMPAT" + validation: "STRICT" # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> # runtime z/OS job name diff --git a/files/zlux/config/allowedPlugins.json b/files/zlux/config/allowedPlugins.json index 8a46519147..dcc69a094f 100644 --- a/files/zlux/config/allowedPlugins.json +++ b/files/zlux/config/allowedPlugins.json @@ -28,14 +28,6 @@ "identifier": "org.zowe.zlux.auth.trivial", "versions": ["*"] }, - { - "identifier": "org.zowe.zlux.auth.zosmf", - "versions": ["*"] - }, - { - "identifier": "org.zowe.zlux.auth.zss", - "versions": ["*"] - }, { "identifier": "org.zowe.zlux.auth.safsso", "versions": ["*"] @@ -60,10 +52,6 @@ "identifier": "org.zowe.zlux.ng2desktop.settings", "versions": ["*"] }, - { - "identifier": "org.zowe.zlux.proxy.zosmf", - "versions": ["*"] - }, { "identifier": "org.zowe.zlux.sample.angular", "versions": ["*"] @@ -76,10 +64,6 @@ "identifier": "org.zowe.zlux.sample.iframe", "versions": ["*"] }, - { - "identifier": "org.zowe.zosmf.workflows", - "versions": ["*"] - }, { "identifier": "org.openmainframe.zowe.workshop-starter", "versions": ["*"] diff --git a/files/zlux/config/zluxserver.json b/files/zlux/config/zluxserver.json deleted file mode 100644 index 9283155557..0000000000 --- a/files/zlux/config/zluxserver.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "node": { - "https": { - "ipAddresses": ["0.0.0.0"], - "port": 7556, - //pfx (string), keys, certificates, certificateAuthorities, and certificateRevocationLists are all valid here. - "keys": ["../defaults/serverConfig/zlux.keystore.key"], - "certificates": ["../defaults/serverConfig/zlux.keystore.cer"], - "certificateAuthorities": ["../defaults/serverConfig/apiml-localca.cer"] - }, - "mediationLayer": { - "server": { - "hostname": "localhost", - "port": 7554, - "isHttps": true - }, - //environmentally set to true when apiml available - "enabled": false - }, - "headers": { - "X-frame-Options": { - "override": true, - "value": "sameorigin" - } - } - }, - "agent": { - //host is for zlux to know, not zss - "host": "localhost", - "jwt": { - "fallback": true - }, - "https": { - "ipAddresses": ["127.0.0.1"], - //to be a replacement for zssPort - "port": 7557 - }, - "mediationLayer": { - "serviceName": "zss", - //environmentally set to true when apiml available - "enabled": false - } - }, - //Zowe cross memory server name - "privilegedServerName": "ZWESIS_STD", - -// All paths relative to ZLUX/node or ZLUX/bin -// In real installations, these values will be configured during the install. - "productDir":"../defaults", - "siteDir":"../deploy/site", - "instanceDir":"../deploy/instance", - "groupsDir":"../deploy/instance/groups", - "usersDir":"../deploy/instance/users", - "pluginsDir":"../defaults/plugins", - - "dataserviceAuthentication": { - //this specifies the default authentication type for dataservices that didn't specify which type to use. These dataservices therefore should not expect a particular type of authentication to be used. - "defaultAuthentication": "saf", - //enable this to use role-based access control (RBAC) for Zowe dataservice endpoints - "rbac": false, - - //each authentication type may have more than one implementing plugin, but the specification below just describes the priority of them. Every one that is found in the pluginsDir is loaded. - "implementationDefaults": { - //each type has an object which describes which implementation to use based on some criteria to find which is best for the task. For now, just "plugins" will - //be used to state that you want a particular plugin. - "saf": { - "plugins": ["org.zowe.zlux.auth.safsso"] - } - - } - } -} diff --git a/manifest.json.template b/manifest.json.template index 6a389fd83c..bb4c24389b 100644 --- a/manifest.json.template +++ b/manifest.json.template @@ -1,6 +1,6 @@ { "name": "Zowe", - "version": "3.0.0", + "version": "3.1.0", "description": "Zowe is an open source project created to host technologies that benefit the Z platform from all members of the Z community (Integrated Software Vendors, System Integrators and z/OS consumers). Zowe, like Mac or Windows, comes with a set of APIs and OS capabilities that applications build on and also includes some applications out of the box. Zowe offers modern interfaces to interact with z/OS and allows you to work with z/OS in a way that is similar to what you experience on cloud platforms today. You can use these interfaces as delivered or through plug-ins and extensions that are created by clients or third-party vendors.", "license": "EPL-2.0", "homepage": "https://zowe.org", @@ -12,9 +12,9 @@ }, "binaryDependencies": { "org.zowe.zlux.zlux-core": { - "version": "3.0.0-RC", + "version": "3.1.0-RC", "repository": "libs-snapshot-local", - "artifact": "zlux-core-3.0.0-20240925.185019.pax" + "artifact": "zlux-core-3.1.0-20250117.161154.pax" }, "org.zowe.zlux.sample-angular-app": { "version": "2.18.0-V2.X-RC", @@ -32,14 +32,14 @@ "artifact": "sample-react-app-2.18.0-20240814.141704.pax" }, "org.zowe.zlux.tn3270-ng2": { - "version": "3.0.0-V3.X-RC", + "version": "3.1.0-V3.X-RC", "repository": "libs-snapshot-local", - "artifact": "tn3270-ng2-3.0.0-20240919.130824.pax" + "artifact": "tn3270-ng2-3.1.0-20250108.141502.pax" }, "org.zowe.zlux.vt-ng2": { - "version": "3.0.0-V3.X-RC", + "version": "3.1.0-V3.X-RC", "repository": "libs-snapshot-local", - "artifact": "vt-ng2-3.0.0-20240919.130822.pax" + "artifact": "vt-ng2-3.1.0-20250108.141509.pax" }, "org.zowe.zlux.zlux-editor": { "version": "2.18.0-V2.X-RC", @@ -47,9 +47,9 @@ "artifact": "zlux-editor-2.18.0-20240814.141840.pax" }, "org.zowe.zss": { - "version": "3.0.0-RC", + "version": "3.1.0-RC", "repository": "libs-snapshot-local", - "artifact": "zss-3.0.0-rc-1202-20240919131259.pax" + "artifact": "zss-3.1.0-rc-1249-20250108143217.pax" }, "org.zowe.explorer-jes": { "version": "3.0.0" @@ -65,23 +65,23 @@ "artifact": "explorer-ip*.pax" }, "org.zowe.apiml.api-catalog-package": { - "version": "3.0.36", + "version": "3.1.5", "artifact": "api-catalog-*.zip" }, "org.zowe.apiml.discovery-package": { - "version": "3.0.36", + "version": "3.1.5", "artifact": "discovery-*.zip" }, "org.zowe.apiml.gateway-package": { - "version": "3.0.36", + "version": "3.1.5", "artifact": "gateway-*.zip" }, "org.zowe.apiml.caching-service-package": { - "version": "3.0.36", + "version": "3.1.5", "artifact": "caching-service-*.zip" }, "org.zowe.apiml.apiml-common-lib-package": { - "version": "3.0.36", + "version": "3.1.5", "artifact": "apiml-common-lib-*.zip" }, "org.zowe.apiml.sdk.common-java-lib-package": { @@ -89,30 +89,30 @@ "artifact": "common-java-lib-*.zip" }, "org.zowe.apiml.sdk.apiml-sample-extension-package": { - "version": "3.0.36", + "version": "3.1.5", "artifact": "apiml-sample-extension-*.zip" }, "org.zowe.apiml.zaas-package": { - "version": "3.0.36", + "version": "3.1.5", "artifact": "zaas-package-*.zip" }, "org.zowe.getesm": { - "version": "3.0.0-V3.X-RC", + "version": "3.1.0-V3.X-RC", "repository": "libs-snapshot-local", - "artifact": "getesm-3.0.0-2024091917.pax" + "artifact": "getesm-3.1.0-2025010749.pax" }, "org.zowe.configmgr": { - "version": "3.0.0-V3.X-RC", + "version": "3.1.0-V3.X-RC", "repository": "libs-snapshot-local", - "artifact": "configmgr-3.0.0-2024091929.pax" + "artifact": "configmgr-3.1.0-2025010752.pax" }, "org.zowe.configmgr-rexx": { - "version": "3.0.0-V3.X-RC", + "version": "3.1.0-V3.X-RC", "repository": "libs-snapshot-local", - "artifact": "configmgr-rexx-3.0.0-2024091935.pax" + "artifact": "configmgr-rexx-3.1.0-2025010754.pax" }, "org.zowe.launcher": { - "version": "3.0.0" + "version": "3.1.0" }, "org.zowe.keyring-utilities": { "version": "1.0.4", @@ -124,7 +124,7 @@ "version": "2.0.3" }, "org.zowe.licenses": { - "version": "3.0.0", + "version": "3.1.0", "artifact": "zowe_licenses_full.zip" } }, @@ -133,7 +133,7 @@ "componentGroup": "Zowe API Mediation Layer", "entries": [{ "repository": "api-layer", - "tag": "v3.0.36", + "tag": "v3.1.5", "destinations": ["Zowe PAX"] }] }, { @@ -147,12 +147,12 @@ "componentGroup": "Zowe Application Framework", "entries": [{ "repository": "zlux-app-manager", - "tag": "v3.0.0-RC1", + "tag": "v3.1.0-RC1", "destinations": ["Zowe PAX"] }, { "repository": "zlux-app-server", - "tag": "v3.0.0-RC1", + "tag": "v3.1.0-RC1", "destinations": ["Zowe PAX"] }, { @@ -167,17 +167,17 @@ }, { "repository": "zlux-platform", - "tag": "v3.0.0-RC1", + "tag": "v3.1.0-RC1", "destinations": ["Zowe PAX"] }, { "repository": "zlux-server-framework", - "tag": "v3.0.0-RC1", + "tag": "v3.1.0-RC2", "destinations": ["Zowe PAX"] }, { "repository": "zlux-shared", - "tag": "v3.0.0-RC1", + "tag": "v3.1.0-RC1", "destinations": ["Zowe PAX"] }, { @@ -187,17 +187,17 @@ }, { "repository": "zlux-build", - "tag": "v3.0.0-RC1", + "tag": "v3.1.0-RC1", "destinations": ["Zowe PAX"] }, { "repository": "zss", - "tag": "v3.0.0-RC1", + "tag": "v3.1.0-RC1", "destinations": ["Zowe PAX"] }, { "repository": "zowe-common-c", - "tag": "zss-v3.0.0-RC1", + "tag": "zss-v3.1.0-RC1", "destinations": ["Zowe PAX"] } ] @@ -205,21 +205,21 @@ "componentGroup": "Zowe CLI", "entries": [{ "repository": "zowe-cli", - "tag": "v8.0.0", + "tag": "v8.10.4", "destinations": ["Zowe CLI Package"] }] }, { "componentGroup": "IBM® CICS® Plug-in for Zowe CLI", "entries": [{ "repository": "cics-for-zowe-client", - "tag": "v6.0.0", + "tag": "v6.2.4", "destinations": ["Zowe CLI Package"] }] }, { "componentGroup": "IBM® Db2® Plug-in for Zowe CLI", "entries": [{ "repository": "zowe-cli-db2-plugin", - "tag": "v6.0.0", + "tag": "v6.1.0", "destinations": ["Zowe CLI Package"] }] }, { @@ -268,7 +268,7 @@ "componentGroup": "Zowe Desktop TN3270 Emulator Plug-in", "entries": [{ "repository": "tn3270-ng2", - "tag": "v3.0.0-RC1", + "tag": "v3.1.0-RC1", "destinations": ["Zowe PAX"] }] }, { @@ -299,7 +299,7 @@ "componentGroup": "Zowe Desktop VT Emulator Plugin-in", "entries": [{ "repository": "vt-ng2", - "tag": "v3.0.0-RC1", + "tag": "v3.1.0-RC1", "destinations": ["Zowe PAX"] }] }, @@ -323,7 +323,7 @@ "destinations": ["Zowe PAX"] }, { "repository": "launcher", - "tag": "v3.0.0", + "tag": "v3.1.0", "destinations": ["Zowe PAX"] }] }, @@ -347,9 +347,17 @@ "componentGroup": "Configmgr", "entries": [{ "repository": "zowe-common-c", - "tag": "configmgr-v3.0.0-RC1", + "tag": "configmgr-v3.1.0-RC1", "destinations": ["Zowe PAX"] }] + }, { + "componentGroup": "Zowe Client Python SDK", + "entries": [{ + "repository": "zowe-client-python-sdk", + "core": false, + "tag": "91366a0e5cd1f2680c0ccf87e8493d099d9e35f7", + "destinations": ["Zowe Client Python SDK"] + }] } ], "imageDependencies": { @@ -361,28 +369,28 @@ "api-catalog": { "registry": "zowe-docker-release.jfrog.io", "name": "ompzowe/api-catalog-services", - "tag" : "3.0.36-ubuntu" + "tag" : "3.1.5-ubuntu" }, "gateway": { - "registry": "zowe-docker-snapshot.jfrog.io", + "registry": "zowe-docker-release.jfrog.io", "name": "ompzowe/gateway-service", - "tag" : "3.0.36-ubuntu" + "tag" : "3.1.5-ubuntu" }, "caching": { "registry": "zowe-docker-release.jfrog.io", "name": "ompzowe/caching-service", - "tag" : "3.0.36-ubuntu" + "tag" : "3.1.5-ubuntu" }, "discovery": { "kind": "statefulset", "registry": "zowe-docker-release.jfrog.io", "name": "ompzowe/discovery-service", - "tag" : "3.0.36-ubuntu" + "tag" : "3.1.5-ubuntu" }, "zaas": { - "registry": "zowe-docker-snapshot.jfrog.io", + "registry": "zowe-docker-release.jfrog.io", "name": "ompzowe/zaas-service", - "tag" : "3.0.36-ubuntu" + "tag" : "3.1.5-ubuntu" }, "app-server": { "registry": "zowe-docker-release.jfrog.io", diff --git a/playbooks/README.md b/playbooks/README.md index 4223f0c004..dbb118cf0b 100644 --- a/playbooks/README.md +++ b/playbooks/README.md @@ -176,7 +176,7 @@ ansible-playbook -l install-kubernetes.yml -e kubeconfig= install-ext.yml -v --extra-vars "zowe_ext_url=https://zowe.jfrog.io/artifactory/libs-snapshot-local/org/zowe/sample-node-api/1.0.0-SNAPSHOT/sample-node-api-1.0.0-snapshot-6-20210126212259.pax" +$ ansible-playbook -l install-ext.yml -v --extra-vars "zowe_ext_url=https://zowe.jfrog.io/artifactory/libs-snapshot-local/org/zowe/sample-node-api/3.0.0-SNAPSHOT/sample-node-api-3.0.0-snapshot-66-20241002205335.pax" ``` You can also install an extension that exists in your local directory by using the `zowe_ext_local` variable. This will transfer the file from your local to the remote server and install the extension: diff --git a/playbooks/host_vars/marist-7.yml b/playbooks/host_vars/marist-10.yml similarity index 100% rename from playbooks/host_vars/marist-7.yml rename to playbooks/host_vars/marist-10.yml diff --git a/playbooks/host_vars/marist-8.yml b/playbooks/host_vars/marist-11.yml similarity index 100% rename from playbooks/host_vars/marist-8.yml rename to playbooks/host_vars/marist-11.yml diff --git a/playbooks/host_vars/marist-6.yml b/playbooks/host_vars/marist-9.yml similarity index 100% rename from playbooks/host_vars/marist-6.yml rename to playbooks/host_vars/marist-9.yml diff --git a/playbooks/hosts b/playbooks/hosts index f53a1884e8..85fcbfebf3 100644 --- a/playbooks/hosts +++ b/playbooks/hosts @@ -1,7 +1,7 @@ [marist] -marist-6 -marist-7 -marist-8 +marist-9 +marist-10 +marist-11 [tvt] tvt4188 diff --git a/playbooks/install-fmid.yml b/playbooks/install-fmid.yml index 715838ec28..0c2602776b 100644 --- a/playbooks/install-fmid.yml +++ b/playbooks/install-fmid.yml @@ -60,7 +60,7 @@ # ============================================================================ # if zowe_build_remote is set, we copy the FMID from zowe_fmids_dir_remote to our work folder - # the value of zowe_build_remote should be FMID like AZWE002 + # the value of zowe_build_remote should be FMID like AZWE003 - name: Copy Zowe FMID files from {{ zowe_fmids_dir_remote }}/{{ zowe_build_remote }} if it has value when: zowe_build_remote is defined import_role: diff --git a/playbooks/roles/common/templates/scp.with-key.sh.j2 b/playbooks/roles/common/templates/scp.with-key.sh.j2 index e4eb9b7891..c61ac836c1 100644 --- a/playbooks/roles/common/templates/scp.with-key.sh.j2 +++ b/playbooks/roles/common/templates/scp.with-key.sh.j2 @@ -4,4 +4,4 @@ FILE_LOCAL=$1 FILE_REMOTE=$2 echo "SCP $FILE_LOCAL ==> $FILE_REMOTE" -scp -oHostKeyAlgorithms=+ssh-rsa -P {{ hostvars[inventory_hostname].ansible_port | default('22') }} -i {{ hostvars[inventory_hostname].ansible_ssh_private_key_file }} $FILE_LOCAL {{ hostvars[inventory_hostname].ansible_user }}@{{ hostvars[inventory_hostname].ansible_ssh_host }}:$FILE_REMOTE +scp -O -oHostKeyAlgorithms=+ssh-rsa -P {{ hostvars[inventory_hostname].ansible_port | default('22') }} -i {{ hostvars[inventory_hostname].ansible_ssh_private_key_file }} $FILE_LOCAL {{ hostvars[inventory_hostname].ansible_user }}@{{ hostvars[inventory_hostname].ansible_ssh_host }}:$FILE_REMOTE diff --git a/playbooks/roles/common/templates/scp.with-pwd.sh.j2 b/playbooks/roles/common/templates/scp.with-pwd.sh.j2 index 7a3c48bf9a..d522b3bebe 100644 --- a/playbooks/roles/common/templates/scp.with-pwd.sh.j2 +++ b/playbooks/roles/common/templates/scp.with-pwd.sh.j2 @@ -4,4 +4,4 @@ FILE_LOCAL=$1 FILE_REMOTE=$2 echo "SCP $FILE_LOCAL ==> $FILE_REMOTE" -sshpass -p "{{ hostvars[inventory_hostname].ansible_password }}" scp -oHostKeyAlgorithms=+ssh-rsa -P {{ hostvars[inventory_hostname].ansible_port | default('22') }} $FILE_LOCAL {{ hostvars[inventory_hostname].ansible_user }}@{{ hostvars[inventory_hostname].ansible_ssh_host }}:$FILE_REMOTE +sshpass -p "{{ hostvars[inventory_hostname].ansible_password }}" scp -O -oHostKeyAlgorithms=+ssh-rsa -P {{ hostvars[inventory_hostname].ansible_port | default('22') }} $FILE_LOCAL {{ hostvars[inventory_hostname].ansible_user }}@{{ hostvars[inventory_hostname].ansible_ssh_host }}:$FILE_REMOTE diff --git a/playbooks/roles/custom_for_test/tasks/main.yml b/playbooks/roles/custom_for_test/tasks/main.yml index ea85b09568..193f46397f 100644 --- a/playbooks/roles/custom_for_test/tasks/main.yml +++ b/playbooks/roles/custom_for_test/tasks/main.yml @@ -162,6 +162,7 @@ "zowe.launchScript.logLevel": "trace" # # this must be commented out to avoid flooding spool # "components.gateway.debug": "true" + # "components.gateway.sslDebug": "all" # # trace java apps # "zowe.environments.LOGGING_LEVEL_ORG_APACHE_HTTP": "TRACE" # "zowe.environments.LOGGING_LEVEL_ORG_APACHE": "TRACE" diff --git a/playbooks/roles/ptf/templates/HOLDDATA.jcl.j2 b/playbooks/roles/ptf/templates/HOLDDATA.jcl.j2 index dcd56f1979..927a40c9d5 100644 --- a/playbooks/roles/ptf/templates/HOLDDATA.jcl.j2 +++ b/playbooks/roles/ptf/templates/HOLDDATA.jcl.j2 @@ -1,24 +1,5 @@ -//SZWELOAD JOB -// EXPORT SYMLIST=(TZON,TRGT) -// SET TRGT={{ zowe_smpe_hlq_tzone }} -// SET SMPE={{ zowe_smpe_hlq_csi }} -// SET TZON=TZONE -//UCLIN EXEC PGM=GIMSMP,REGION=0M,COND=(4,LT) -//SZWELOAD DD SPACE=(TRK,(30,15,15)), -// UNIT=SYSALLDA, -// DISP=(MOD,CATLG), -// DSNTYPE=LIBRARY, -// RECFM=U, -// LRECL=0, -// BLKSIZE=32760, -// DSN=&TRGT..SZWELOAD -//SMPCSI DD DISP=OLD,DSN={{ smpe_csi }} -//SMPCNTL DD *,SYMBOLS=JCLONLY - SET BDY(&TZON). - UCLIN. - ADD DDDEF (SZWELOAD) - DATASET(&TRGT..SZWELOAD) - UNIT(SYSALLDA) - WAITFORDSN - SHR . - ENDUCL. +//HOLDDATA JOB +//* This job can be customized if holddata actions are added to Zowe PTFs +//* For example, adding a new load module to an SMP/e-managed dataset. +//DUMMY EXEC PGM=IEFBR14 +//* diff --git a/pswi/.gitignore b/pswi/.gitignore new file mode 100644 index 0000000000..a5e2c10550 --- /dev/null +++ b/pswi/.gitignore @@ -0,0 +1,4 @@ +logs/ +EXP* +report.txt +unzipped/ diff --git a/pswi/01_smpe.sh b/pswi/01_smpe.sh index 42d9f89aff..38a40b11c3 100644 --- a/pswi/01_smpe.sh +++ b/pswi/01_smpe.sh @@ -18,7 +18,7 @@ echo "SMPE workflow name :" $SMPE_WF_NAME CREATE_SMPE_WF_URL="${BASE_URL}/zosmf/workflow/rest/1.0/workflows" SMPE_WF_LIST_URL="${BASE_URL}/zosmf/workflow/rest/1.0/workflows?owner=${ZOSMF_USER}&workflowName=${SMPE_WF_NAME}" -# JSONs +# JSONs ADD_WORKFLOW_JSON='{"workflowName":"'$SMPE_WF_NAME'", "workflowDefinitionFile":"'${DIR}'/SMPE20", @@ -43,7 +43,7 @@ echo "Uploading workflow SMPE into ${DIR} directory thru SSH" cd workflows -sshpass -p${ZOSMF_PASS} sftp -o HostKeyAlgorithms=+ssh-rsa -o BatchMode=no -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -b - -P ${ZZOW_SSH_PORT} ${ZOSMF_USER}@${HOST} << EOF +sshpass -p${ZOSMF_PASS} sftp -o HostKeyAlgorithms=+ssh-rsa -o BatchMode=no -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -b - -P ${ZZOW_SSH_PORT} ${ZOSMF_USER}@${HOST} <> report.txt - echo $RESP >> report.txt - exit -1 -elif [ "$STATUS_NAME" = "complete" ] -then - echo "Workflow finished successfully." - STATUS="FINISHED" -fi +until [ "$STATUS" = "FINISHED" ]; do + sleep 20 + + # Get the result of the workflow + RESP=$(curl -s ${WORKFLOW_URL} -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) + if [ $? -gt 0 ]; then exit -1; fi + STATUS_NAME=$(echo $RESP | grep -o '"statusName":".*"' | cut -f4 -d\") + + if [ "$STATUS_NAME" = "in-progress" ]; then + echo "Workflow with SMP/E ended with an error." >>$LOG_DIR/report.txt + echo $RESP >>$LOG_DIR/report.txt + exit -1 + elif [ "$STATUS_NAME" = "complete" ]; then + echo "Workflow finished successfully." + STATUS="FINISHED" + fi done - diff --git a/pswi/02_ptf.sh b/pswi/02_ptf.sh index e5174333d7..c6f189e43a 100644 --- a/pswi/02_ptf.sh +++ b/pswi/02_ptf.sh @@ -22,7 +22,7 @@ echo "PTF workflow name :" $PTF_WF_NAME CREATE_PTF_WF_URL="${BASE_URL}/zosmf/workflow/rest/1.0/workflows" PTF_WF_LIST_URL="${BASE_URL}/zosmf/workflow/rest/1.0/workflows?owner=${ZOSMF_USER}&workflowName=${PTF_WF_NAME}" -# JSONs +# JSONs ADD_WORKFLOW_JSON='{"workflowName":"'$PTF_WF_NAME'", "workflowDefinitionFile":"'${DIR}'/WFPTF", "system":"'$ZOSMF_SYSTEM'", @@ -38,7 +38,7 @@ ADD_WORKFLOW_JSON='{"workflowName":"'$PTF_WF_NAME'", cd workflows -sshpass -p${ZOSMF_PASS} sftp -o HostKeyAlgorithms=+ssh-rsa -o BatchMode=no -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -b - -P ${ZZOW_SSH_PORT} ${ZOSMF_USER}@${HOST} << EOF +sshpass -p${ZOSMF_PASS} sftp -o HostKeyAlgorithms=+ssh-rsa -o BatchMode=no -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -b - -P ${ZZOW_SSH_PORT} ${ZOSMF_USER}@${HOST} <> report.txt - echo $RESP >> report.txt - exit -1 -elif [ "$STATUS_NAME" = "complete" ] -then - echo "Workflow finished successfully." - STATUS="FINISHED" -fi +until [ "$STATUS" = "FINISHED" ]; do + sleep 20 + + # Get the result of the workflow + RESP=$(curl -s ${WORKFLOW_URL} -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) + if [ $? -gt 0 ]; then exit -1; fi + + STATUS_NAME=$(echo $RESP | grep -o '"statusName":".*"' | cut -f4 -d\") + + if [ "$STATUS_NAME" = "in-progress" ]; then + echo "Workflow with PTFs ended with an error." >>$LOG_DIR/report.txt + echo $RESP >>$LOG_DIR/report.txt + exit -1 + elif [ "$STATUS_NAME" = "complete" ]; then + echo "Workflow finished successfully." + STATUS="FINISHED" + fi done diff --git a/pswi/03_create.sh b/pswi/03_create.sh index 6feb2d56a7..cacd595748 100644 --- a/pswi/03_create.sh +++ b/pswi/03_create.sh @@ -16,7 +16,7 @@ echo "SWI name :" $SWI_NAME echo "Existing DSN :" $EXPORT_DSN echo "Temporary zFS :" $TMP_ZFS echo "Temporary directory:" $TMP_MOUNT -echo "Work zFS :" $WORK_ZFS # For z/OSMF v2.3 +echo "Work zFS :" $WORK_ZFS # For z/OSMF v2.3 echo "Work mount point :" $WORK_MOUNT # For z/OSMF v2.3 echo "ZOWE zFS :" $ZOWE_ZFS echo "ZOWE mount point :" $ZOWE_MOUNT @@ -25,10 +25,11 @@ echo "ACCOUNT :" $ACCOUNT echo "SYSAFF :" $SYSAFF echo "z/OSMF version :" $ZOSMF_V -# JSONs +# JSONs ADD_SWI_JSON='{"name":"'${SWI_NAME}'","system":"'${ZOSMF_SYSTEM}'","description":"ZOWE v'${VERSION}' Portable Software Instance", "globalzone":"'${GLOBAL_ZONE}'","targetzones":["'${TZONE}'"],"workflows":[{"name":"ZOWE Mount Workflow","description":"This workflow performs mount action of ZOWE zFS.", -"location": {"dsname":"'${WORKFLOW_DSN}'(ZWEWRF02)"}},{"name":"ZOWE Configuration of Zowe 3.0","description":"This workflow configures Zowe v3.0.", +"location": {"dsname":"'${WORKFLOW_DSN}'(ZWEWRF02)"}},{"name":"Stand-alone Zowe API ML Configuration","description":"This workflow configures only API ML for Zowe 3.0.", +"location": {"dsname":"'${WORKFLOW_DSN}'(ZWEAMLCF)"}},{"name":"Full Zowe server-side configuration for Zowe 3.0","description":"This workflow configures all Zowe server-side components for Zowe v3.0.", "location": {"dsname":"'${WORKFLOW_DSN}'(ZWECONF)"}},{"name":"ZOWE Creation of CSR request workflow","description":"This workflow creates a certificate sign request.", "location": {"dsname":"'${WORKFLOW_DSN}'(ZWECRECR)"}},{"name":"ZOWE Sign a CSR request","description":"This workflow signs the certificate sign request by a local CA.", "location": {"dsname":"'${WORKFLOW_DSN}'(ZWESIGNC)"}},{"name":"ZOWE Load Authentication Certificate into ESM","description":"This workflow loads a signed client authentication certificate to the ESM.", @@ -39,7 +40,7 @@ ADD_EXPORT_DSN_JSON='{"dsorg":"PO","alcunit":"TRK","primary":10,"secondary":5,"d EXPORT_JCL_JSON='{"packagedir":"'${EXPORT}'","jcldataset":"'${EXPORT_DSN}'","workvolume":"'${VOLUME}'"}' MOUNT_ZOWE_ZFS_JSON='{"action":"mount","mount-point":"'${ZOWE_MOUNT}'","fs-type":"zFS","mode":"rdwr"}' -# URLs +# URLs ADD_SWI_URL="${BASE_URL}/zosmf/swmgmt/swi" LOAD_PRODUCTS_URL="${BASE_URL}/zosmf/swmgmt/swi/${ZOSMF_SYSTEM}/${SWI_NAME}/products" WORKFLOW_DSN_URL="${BASE_URL}/zosmf/restfiles/ds/${WORKFLOW_DSN}" @@ -55,132 +56,133 @@ CHECK_EXPORT_DSN_URL="${BASE_URL}/zosmf/restfiles/ds?dslevel=${EXPORT_DSN}" # Check if temp zFS for PSWI is mounted echo "Checking/mounting ${TMP_ZFS}" sh scripts/tmp_mounts.sh "${TMP_ZFS}" "${TMP_MOUNT}" -if [ $? -gt 0 ];then exit -1;fi - -if [ "$ZOSMF_V" = "2.3" ] -then -# z/OSMF 2.3 +if [ $? -gt 0 ]; then exit -1; fi # Check if work zFS for PSWI is mounted echo "Checking/mounting ${WORK_ZFS}" sh scripts/tmp_mounts.sh "${WORK_ZFS}" "${WORK_MOUNT}" -if [ $? -gt 0 ];then exit -1;fi -fi - +if [ $? -gt 0 ]; then exit -1; fi + # Check if ZOWE zFS is mounted echo "Checking if file system ${ZOWE_ZFS} is mounted." -RESP=`curl -s $GET_ZOWE_ZFS_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -MOUNTZ=`echo $RESP | grep -o '"mountpoint":".*"' | cut -f4 -d\"` +RESP=$(curl -s $GET_ZOWE_ZFS_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) +MOUNTZ=$(echo $RESP | grep -o '"mountpoint":".*"' | cut -f4 -d\") -if [ -n "$MOUNTZ" ] -then +if [ -n "$MOUNTZ" ]; then # Check if ZOWE zFS is mounted to given ZOWE mountpoint - if [ "$MOUNTZ/" = "$ZOWE_MOUNT" ] - then + if [ "$MOUNTZ/" = "$ZOWE_MOUNT" ]; then echo "${ZOWE_MOUNT} with zFS ${ZOWE_ZFS} mounted will be used." else - echo "The file system ${ZOWE_ZFS} exists but is mounted to different mount point ${MOUNTZ}." >> report.txt - echo "It is required to have the file system ${ZOWE_ZFS} mounted to the exact mount point (${ZOWE_MOUNT}) to successfully export Zowe PSWI." >> report.txt + echo "The file system ${ZOWE_ZFS} exists but is mounted to different mount point ${MOUNTZ}." >>$LOG_DIR/report.txt + echo "It is required to have the file system ${ZOWE_ZFS} mounted to the exact mount point (${ZOWE_MOUNT}) to successfully export Zowe PSWI." >>$LOG_DIR/report.txt exit -1 fi else echo "${ZOWE_ZFS} is not mounted anywhere. Checking if ${ZOWE_MOUNT} has any zFS mounted." - RESP=`curl -s $GET_ZOWE_PATH_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` - MOUNTZFS=`echo $RESP | grep -o "name":".*" | cut -f4 -d\"` - if [ -n "$MOUNTZFS" ] - then + RESP=$(curl -s $GET_ZOWE_PATH_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) + MOUNTZFS=$(echo $RESP | grep -o "name":".*" | cut -f4 -d\") + if [ -n "$MOUNTZFS" ]; then # If ZFS is not mounted to the mountpoint then this ZOWE mountpoint has different zFS - echo "The mountpoint ${ZOWE_MOUNT} has different zFS ${MOUNTZFS}." >> report.txt + echo "The mountpoint ${ZOWE_MOUNT} has different zFS ${MOUNTZFS}." >>$LOG_DIR/report.txt exit -1 else - # Mount zFS to Zowe mountpoint - echo "Mounting zFS ${ZOWE_ZFS} to ${ZOWE_MOUNT} mount point." - RESP=`curl -s $ACTION_ZOWE_ZFS_URL -k -X "PUT" -d "$MOUNT_ZOWE_ZFS_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` - sh scripts/check_response.sh "${RESP}" $? - if [ $? -gt 0 ];then exit -1;fi + # Mount zFS to Zowe mountpoint + echo "Mounting zFS ${ZOWE_ZFS} to ${ZOWE_MOUNT} mount point." + RESP=$(curl -s $ACTION_ZOWE_ZFS_URL -k -X "PUT" -d "$MOUNT_ZOWE_ZFS_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) + sh scripts/check_response.sh "${RESP}" $? + if [ $? -gt 0 ]; then exit -1; fi fi fi # Add workflow to ZOWE data sets echo "Checking if WORKFLOW data set already exists." -RESP=`curl -s $CHECK_WORKFLOW_DSN_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -DS_COUNT=`echo $RESP | grep -o '"returnedRows":[0-9]*' | cut -f2 -d:` -if [ $DS_COUNT -ne 0 ] -then - echo "The ${WORKFLOW_DSN} already exist. Because there is a possibility that it contains something unwanted the script does not continue." >> report.txt - exit -1 +RESP=$(curl -s $CHECK_WORKFLOW_DSN_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) +DS_COUNT=$(echo $RESP | grep -o '"returnedRows":[0-9]*' | cut -f2 -d:) +if [ $DS_COUNT -ne 0 ]; then + echo "The ${WORKFLOW_DSN} already exist. Because there is a possibility that it contains something unwanted the script does not continue." >>$LOG_DIR/report.txt + exit -1 else echo "Creating a data set where the post-Deployment workflow will be stored." - RESP=`curl -s $WORKFLOW_DSN_URL -k -X "POST" -d "$ADD_WORKFLOW_DSN_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` - if [ -n "$RESP" ] - then - echo "The creation of the ${WORKFLOW_DSN} was not successful. Error message: ${RESP}" >> report.txt + RESP=$(curl -s $WORKFLOW_DSN_URL -k -X "POST" -d "$ADD_WORKFLOW_DSN_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) + if [ -n "$RESP" ]; then + echo "The creation of the ${WORKFLOW_DSN} was not successful. Error message: ${RESP}" >>$LOG_DIR/report.txt exit -1 - fi + fi fi echo "Copying workflows to ${WORKFLOW_DSN} data set." -echo ${JOBST1} > JCL -echo ${JOBST2} >> JCL -echo "//COPYWRFS EXEC PGM=BPXBATCH" >> JCL -echo "//STDOUT DD SYSOUT=*" >> JCL -echo "//STDERR DD SYSOUT=*" >> JCL -echo "//STDPARM DD *" >> JCL -echo "SH set -x;set -e;" >> JCL -echo "cd ${WORK_MOUNT};" >> JCL -echo "source=\"${ZOWE_MOUNT}files/workflows/ZWEWRF02.xml\";" >> JCL -echo "target=\"//'${WORKFLOW_DSN}(ZWEWRF02)'\";" >> JCL -echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWEWRF02;" >> JCL -echo "sed 's|UTF-8|IBM-1047|g' _ZWEWRF02 > ZWEWRF02;" >> JCL -echo "cp -T ZWEWRF02 \$target;" >> JCL -echo "source=\"${ZOWE_MOUNT}files/workflows/ZWECRECR.xml\";" >> JCL -echo "target=\"//'${WORKFLOW_DSN}(ZWECRECR)'\";" >> JCL -echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWECRECR;" >> JCL -echo "sed 's|UTF-8|IBM-1047|g' _ZWECRECR > ZWECRECR;" >> JCL -echo "cp -T ZWECRECR \$target;" >> JCL -echo "source=\"${ZOWE_MOUNT}files/workflows/ZWEKRING.xml\";" >> JCL -echo "target=\"//'${WORKFLOW_DSN}(ZWEKRING)'\";" >> JCL -echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWEKRING;" >> JCL -echo "sed 's|UTF-8|IBM-1047|g' _ZWEKRING > ZWEKRING;" >> JCL -echo "cp -T ZWEKRING \$target;" >> JCL -echo "source=\"${ZOWE_MOUNT}files/workflows/ZWELOADC.xml\";" >> JCL -echo "target=\"//'${WORKFLOW_DSN}(ZWELOADC)'\";" >> JCL -echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWELOADC;" >> JCL -echo "sed 's|UTF-8|IBM-1047|g' _ZWELOADC > ZWELOADC;" >> JCL -echo "cp -T ZWELOADC \$target;" >> JCL -echo "source=\"${ZOWE_MOUNT}files/workflows/ZWESIGNC.xml\";" >> JCL -echo "target=\"//'${WORKFLOW_DSN}(ZWESIGNC)'\";" >> JCL -echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWESIGNC;" >> JCL -echo "sed 's|UTF-8|IBM-1047|g' _ZWESIGNC > ZWESIGNC;" >> JCL -echo "cp -T ZWESIGNC \$target;" >> JCL -echo "source=\"${ZOWE_MOUNT}files/workflows/ZWECONF.xml\";" >> JCL -echo "target=\"//'${WORKFLOW_DSN}(ZWECONF)'\";" >> JCL -echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWECONF;" >> JCL -echo "sed 's|UTF-8|IBM-1047|g' _ZWECONF > ZWECONF;" >> JCL -echo "cp -T ZWECONF \$target;" >> JCL -echo "/*" >> JCL - -sh scripts/submit_jcl.sh "`cat JCL`" -if [ $? -gt 0 ];then exit -1;fi +echo ${JOBST1} >JCL +echo ${JOBST2} >>JCL +echo "//COPYWRFS EXEC PGM=BPXBATCH" >>JCL +echo "//STDOUT DD SYSOUT=*" >>JCL +echo "//STDERR DD SYSOUT=*" >>JCL +echo "//STDPARM DD *" >>JCL +echo "SH set -x;set -e;" >>JCL +echo "cd ${WORK_MOUNT};" >>JCL +echo "source=\"${ZOWE_MOUNT}files/workflows/ZWEWRF02.xml\";" >>JCL +echo "target=\"//'${WORKFLOW_DSN}(ZWEWRF02)'\";" >>JCL +echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWEWRF02;" >>JCL +echo "sed 's|UTF-8|IBM-1047|g' _ZWEWRF02 > ZWEWRF02;" >>JCL +echo "cp -T ZWEWRF02 \$target;" >>JCL +echo "source=\"${ZOWE_MOUNT}files/workflows/ZWECRECR.xml\";" >>JCL +echo "target=\"//'${WORKFLOW_DSN}(ZWECRECR)'\";" >>JCL +echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWECRECR;" >>JCL +echo "sed 's|UTF-8|IBM-1047|g' _ZWECRECR > ZWECRECR;" >>JCL +echo "cp -T ZWECRECR \$target;" >>JCL +echo "source=\"${ZOWE_MOUNT}files/workflows/ZWEKRING.xml\";" >>JCL +echo "target=\"//'${WORKFLOW_DSN}(ZWEKRING)'\";" >>JCL +echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWEKRING;" >>JCL +echo "sed 's|UTF-8|IBM-1047|g' _ZWEKRING > ZWEKRING;" >>JCL +echo "cp -T ZWEKRING \$target;" >>JCL +echo "source=\"${ZOWE_MOUNT}files/workflows/ZWELOADC.xml\";" >>JCL +echo "target=\"//'${WORKFLOW_DSN}(ZWELOADC)'\";" >>JCL +echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWELOADC;" >>JCL +echo "sed 's|UTF-8|IBM-1047|g' _ZWELOADC > ZWELOADC;" >>JCL +echo "cp -T ZWELOADC \$target;" >>JCL +echo "source=\"${ZOWE_MOUNT}files/workflows/ZWESIGNC.xml\";" >>JCL +echo "target=\"//'${WORKFLOW_DSN}(ZWESIGNC)'\";" >>JCL +echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWESIGNC;" >>JCL +echo "sed 's|UTF-8|IBM-1047|g' _ZWESIGNC > ZWESIGNC;" >>JCL +echo "cp -T ZWESIGNC \$target;" >>JCL +echo "source=\"${ZOWE_MOUNT}files/workflows/ZWEAMLCF.xml\";" >>JCL +echo "target=\"//'${WORKFLOW_DSN}(ZWEAMLCF)'\";" >>JCL +echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWEAMLCF;" >>JCL +echo "sed 's|UTF-8|IBM-1047|g' _ZWEAMLCF > ZWEAMLCF;" >>JCL +echo "cp -T ZWEAMLCF \$target;" >>JCL +echo "source=\"${ZOWE_MOUNT}files/workflows/ZWECONF.xml\";" >>JCL +echo "target=\"//'${WORKFLOW_DSN}(ZWECONF)'\";" >>JCL +echo "iconv -f ISO8859-1 -t IBM-1047 \$source > _ZWECONF;" >>JCL +echo "sed 's|UTF-8|IBM-1047|g' _ZWECONF > ZWECONF;" >>JCL +echo "cp -T ZWECONF \$target;" >>JCL +echo "/*" >>JCL +echo "//CHMODZWE EXEC PGM=BPXBATCH" >>JCL +echo "//STDOUT DD SYSOUT=*" >>JCL +echo "//STDERR DD SYSOUT=*" >>JCL +echo "//STDPARM DD *" >>JCL +echo "SH set -x;set -e;" >>JCL +echo "chmod -R 777 ${ZOWE_MOUNT};" >>JCL +echo "/*" >>JCL + +sh scripts/submit_jcl.sh "$(cat JCL)" +if [ $? -gt 0 ]; then exit -1; fi rm JCL # Add data set for export jobs echo "Checking if the data set for export jobs already exists." -RESP=`curl -s $CHECK_EXPORT_DSN_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -DSN_COUNT=`echo $RESP | grep -o '"returnedRows":[0-9]*' | cut -f2 -d:` -if [ $DSN_COUNT -ne 0 ] -then - echo "The ${EXPORT_DSN} already exist. Because there is a possibility that it contains something unwanted the script does not continue." >> report.txt +RESP=$(curl -s $CHECK_EXPORT_DSN_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) +DSN_COUNT=$(echo $RESP | grep -o '"returnedRows":[0-9]*' | cut -f2 -d:) +if [ $DSN_COUNT -ne 0 ]; then + echo "The ${EXPORT_DSN} already exist. Because there is a possibility that it contains something unwanted the script does not continue." >>$LOG_DIR/report.txt exit -1 else echo "Creating a data set where the export jobs will be stored." - RESP=`curl -s $EXPORT_DSN_URL -k -X "POST" -d "$ADD_EXPORT_DSN_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` - if [ -n "$RESP" ] - then echo "The creation of the ${EXPORT_DSN} was not successful. Error message: ${RESP}" - fi + RESP=$(curl -s $EXPORT_DSN_URL -k -X "POST" -d "$ADD_EXPORT_DSN_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) + if [ -n "$RESP" ]; then + echo "The creation of the ${EXPORT_DSN} was not successful. Error message: ${RESP}" + fi fi # Delete Software instance if it already exists @@ -192,24 +194,22 @@ curl -s $DELETE_SWI_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X # Add Software Instance echo 'Invoking REST API to add a Software Instance.' -RESP=`curl -s $ADD_SWI_URL -k -X "POST" -d "$ADD_SWI_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` +RESP=$(curl -s $ADD_SWI_URL -k -X "POST" -d "$ADD_SWI_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) sh scripts/check_response.sh "${RESP}" $? -if [ $? -gt 0 ];then exit -1;fi +if [ $? -gt 0 ]; then exit -1; fi # Load the products, features, and FMIDs for a software instance # The response is in format "statusurl":"https:\/\/:ZOSMF_URL:post\/restofurl" # On statusurl can be checked actual status of loading the products, features, and FMIDs echo 'Invoking REST API to load SMP/E managed products from the SMP/E CSI.' - -RESP=`curl -s $LOAD_PRODUCTS_URL -k -X "PUT" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` +RESP=$(curl -s $LOAD_PRODUCTS_URL -k -X "PUT" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) sh scripts/check_response.sh "${RESP}" $? -if [ $? -gt 0 ];then exit -1;fi +if [ $? -gt 0 ]; then exit -1; fi -LOAD_STATUS_URL=`echo $RESP | grep -o '"statusurl":".*"' | cut -f4 -d\" | tr -d '\' 2>/dev/null` -if [ -z "$LOAD_STATUS_URL" ] -then - echo "No response from the load product REST API call." >> report.txt +LOAD_STATUS_URL=$(echo $RESP | grep -o '"statusurl":".*"' | cut -f4 -d\" | tr -d '\' 2>/dev/null) +if [ -z "$LOAD_STATUS_URL" ]; then + echo "No response from the load product REST API call." >>$LOG_DIR/report.txt exit -1 fi @@ -217,29 +217,26 @@ fi echo 'Invoking REST API to check if load products has finished.' STATUS="" -until [ "$STATUS" = "complete" ] -do -RESP=`curl -s $LOAD_STATUS_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -sh scripts/check_response.sh "${RESP}" $? -if [ $? -gt 0 ];then exit -1;fi -STATUS=`echo $RESP | grep -o '"status":".*"' | cut -f4 -d\"` -sleep 3 +until [ "$STATUS" = "complete" ]; do + RESP=$(curl -s $LOAD_STATUS_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) + sh scripts/check_response.sh "${RESP}" $? + if [ $? -gt 0 ]; then exit -1; fi + STATUS=$(echo $RESP | grep -o '"status":".*"' | cut -f4 -d\") + sleep 3 done echo "Load Products finished successfully." - # Create JCL that will export Portable Software Instance # The response is in format "statusurl":"https:\/\/:ZOSMF_URL:post\/restofurl" echo 'Invoking REST API to export the software instance.' -RESP=`curl -s $EXPORT_JCL_URL -k -X "POST" -d "$EXPORT_JCL_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS ` +RESP=$(curl -s $EXPORT_JCL_URL -k -X "POST" -d "$EXPORT_JCL_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) sh scripts/check_response.sh "${RESP}" $? -if [ $? -gt 0 ];then exit -1;fi -EXPORT_STATUS_URL=`echo $RESP | grep -o '"statusurl":".*"' | cut -f4 -d\" | tr -d '\' 2>/dev/null` -if [ -z "$EXPORT_STATUS_URL" ] -then - echo "No response from the export REST API call." >> report.txt +if [ $? -gt 0 ]; then exit -1; fi +EXPORT_STATUS_URL=$(echo $RESP | grep -o '"statusurl":".*"' | cut -f4 -d\" | tr -d '\' 2>/dev/null) +if [ -z "$EXPORT_STATUS_URL" ]; then + echo "No response from the export REST API call." >>$LOG_DIR/report.txt exit -1 fi @@ -247,96 +244,99 @@ fi echo 'Invoking REST API to check if export has finished.' STATUS="" -until [ "$STATUS" = "complete" ] -do -# Status is not shown until the recentage is not 100 -RESP=`curl -s $EXPORT_STATUS_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -sh scripts/check_response.sh "${RESP}" $? -if [ $? -gt 0 ];then exit -1;fi -PERCENTAGE=`echo ${RESP} | grep -o '"percentcomplete":".*"' | cut -f4 -d\"` +until [ "$STATUS" = "complete" ]; do + # Status is not shown until the recentage is not 100 + RESP=$(curl -s $EXPORT_STATUS_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) + sh scripts/check_response.sh "${RESP}" $? + if [ $? -gt 0 ]; then exit -1; fi + PERCENTAGE=$(echo ${RESP} | grep -o '"percentcomplete":".*"' | cut -f4 -d\") -echo ${PERCENTAGE} "% of the Export JCL created." + echo ${PERCENTAGE} "% of the Export JCL created." -if [ "$PERCENTAGE" = "100" ] -then - STATUS=`echo $RESP | grep -o '"status":".*"' | cut -f4 -d\"` - DSN=`echo $RESP | grep -o '"jcl":.*\]' | cut -f4 -d\"` + if [ "$PERCENTAGE" = "100" ]; then + STATUS=$(echo $RESP | grep -o '"status":".*"' | cut -f4 -d\") + DSN=$(echo $RESP | grep -o '"jcl":.*\]' | cut -f4 -d\") - echo "The status is: "$STATUS - # Can be 100% but still running - if [ "$STATUS" != "complete" ] && [ "$STATUS" != "running" ] - then - echo "Status of generation of Export JCL failed." >> report.txt - exit -1 + echo "The status is: "$STATUS + # Can be 100% but still running + if [ "$STATUS" != "complete" ] && [ "$STATUS" != "running" ]; then + echo "Status of generation of Export JCL failed." >>$LOG_DIR/report.txt + exit -1 + fi fi -fi -sleep 3 + sleep 3 done -if [ -z "$DSN" ] -then - echo "The creation of export JCL failed" >> report.txt +if [ -z "$DSN" ]; then + echo "The creation of export JCL failed" >>$LOG_DIR/report.txt exit -1 fi echo "Downloading export JCL" -curl -s ${BASE_URL}/zosmf/restfiles/ds/${DSN} -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS > EXPORT - -if [ "$ZOSMF_V" = "2.3" ] -then +curl -s ${BASE_URL}/zosmf/restfiles/ds/${DSN} -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS >EXPORT + +echo "Showing EXPORT JCL how it looks before the change" +#if [ "$ZOSMF_V" = "2.3" ] +#then +#echo "Changing jobcard and adding SYSAFF" +#sed "s|//IZUD01EX JOB (ACCOUNT),'NAME'|$JOBST1\n$JOBST2|g" EXPORT > EXPJCL0 +# +#echo "Changing working directory from /tmp/ to ${WORK_MOUNT} directory where is zFS mounted" +#sed "s|//SMPWKDIR DD PATH='/tmp/.*'|//SMPWKDIR DD PATH='$WORK_MOUNT'|g" EXPJCL0 > EXPJCL1 +# +#echo "Switching WORKFLOW and CSI datasets because of internal GIMZIP setting" # It is not working when CSI is in the beginning (1st or 2nd) +#sed "s|\.CSI|\.1WORKFLOW|g" EXPJCL1 > EXPJCL2 +#sed "s|\.WORKFLOW|\.CSI|g" EXPJCL2 > EXPJCL3 +#sed "s|\.1WORKFLOW|\.WORKFLOW|g" EXPJCL3 > EXPJCL4 +#sed "s|DSNTYPE=LARGE|DSNTYPE=LARGE,VOL=SER=$VOLUME|g" EXPJCL4 > EXPJCL +# +#rm ./EXPJCL0 +#rm ./EXPJCL1 +#rm ./EXPJCL2 +#rm ./EXPJCL3 +#rm ./EXPJCL4 +# +#else echo "Changing jobcard and adding SYSAFF" -sed "s|//IZUD01EX JOB (ACCOUNT),'NAME'|$JOBST1\n$JOBST2|g" EXPORT > EXPJCL0 +sed "s|//IZUD01EX JOB (ACCOUNT),'NAME'|$JOBST1\n$JOBST2|g" EXPORT >EXPJCL0 +#sed "s|//.*gimzipInputFile.*,|EXPJCL1 +#sed "s|// FILEDATA=TEXT| archid=\"ZOS003.ZWE.PSWI.AZWE003.ZFS\"/>|g" EXPJCL1 >EXPJCL2 +#sed "s|// DD \*||g" EXPJCL2 >EXPJCL +# sed "s|ZOS003.ZWE.PSWI.|ZWE.PSWI.|g" EXPJCL3 >EXPJCL -echo "Changing working directory from /tmp/ to ${WORK_MOUNT} directory where is zFS mounted" -sed "s|//SMPWKDIR DD PATH='/tmp/.*'|//SMPWKDIR DD PATH='$WORK_MOUNT'|g" EXPJCL0 > EXPJCL1 +#fi -echo "Switching WORKFLOW and CSI datasets because of internal GIMZIP setting" # It is not working when CSI is in the beginning (1st or 2nd) -sed "s|\.CSI|\.1WORKFLOW|g" EXPJCL1 > EXPJCL2 -sed "s|\.WORKFLOW|\.CSI|g" EXPJCL2 > EXPJCL3 -sed "s|\.1WORKFLOW|\.WORKFLOW|g" EXPJCL3 > EXPJCL4 -sed "s|DSNTYPE=LARGE|DSNTYPE=LARGE,VOL=SER=$VOLUME|g" EXPJCL4 > EXPJCL +sh scripts/submit_jcl.sh "$(cat EXPJCL0)" +if [ $? -gt 0 ]; then exit -1; fi rm ./EXPJCL0 -rm ./EXPJCL1 -rm ./EXPJCL2 -rm ./EXPJCL3 -rm ./EXPJCL4 - -else -echo "Changing jobcard and adding SYSAFF" -sed "s|//IZUD01EX JOB (ACCOUNT),'NAME'|$JOBST1\n$JOBST2|g" EXPORT > EXPJCL -fi - -sh scripts/submit_jcl.sh "`cat EXPJCL`" -if [ $? -gt 0 ];then exit -1;fi - -rm ./EXPJCL rm ./EXPORT -# Pax the directory +# Pax the directory echo "PAXing the final PSWI." -echo ${JOBST1} > JCL -echo ${JOBST2} >> JCL -echo "//PAXDIREC EXEC PGM=BPXBATCH" >> JCL -echo "//STDOUT DD SYSOUT=*" >> JCL -echo "//STDERR DD SYSOUT=*" >> JCL -echo "//STDPARM DD *" >> JCL -echo "SH set -x;set -e;" >> JCL -echo "cd ${EXPORT};" >> JCL -echo "pax -wv -f ${TMP_MOUNT}/${SWI_NAME}.pax.Z ." >> JCL -echo "/*" >> JCL - -sh scripts/submit_jcl.sh "`cat JCL`" -if [ $? -gt 0 ];then exit -1;fi +echo ${JOBST1} >JCL +echo ${JOBST2} >>JCL +echo "//PAXDIREC EXEC PGM=BPXBATCH" >>JCL +echo "//STDOUT DD SYSOUT=*" >>JCL +echo "//STDERR DD SYSOUT=*" >>JCL +echo "//STDPARM DD *" >>JCL +echo "SH set -x;set -e;" >>JCL +echo "cd ${EXPORT};" >>JCL +echo "pax -wv -f ${TMP_MOUNT}/${SWI_NAME}.pax.Z ." >>JCL +echo "/*" >>JCL + +sh scripts/submit_jcl.sh "$(cat JCL)" +if [ $? -gt 0 ]; then exit -1; fi rm JCL cd ../.pax -sshpass -p${ZOSMF_PASS} sftp -o HostKeyAlgorithms=+ssh-rsa -o BatchMode=no -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -b - -P ${ZZOW_SSH_PORT} ${ZOSMF_USER}@${HOST} << EOF +set -x +pwd +sshpass -p${ZOSMF_PASS} sftp -o HostKeyAlgorithms=+ssh-rsa -o BatchMode=no -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -b - -P ${ZZOW_SSH_PORT} ${ZOSMF_USER}@${HOST} <> $LOG_FILE + + REASON=$(echo $RESP | grep -o '"reason":') + EMPTY=$(echo $RESP | grep -o '\[\]') + MSG=$(echo $RESP | grep -o '"messageText":') + if [ -n "$REASON" ] || [ -n "$MSG" ]; then + echo "Info: Logging to file ${LOG_FILE}." + echo "$RESP" >>$LOG_FILE fi - if [ -n "$EMPTY" ] - then - echo "Info: Logging to file ${LOG_FILE}." - echo "$RESP" >> $LOG_FILE + if [ -n "$EMPTY" ]; then + echo "Info: Logging to file ${LOG_FILE}." + echo "$RESP" >>$LOG_FILE fi - if [ $RESPCODE -ne 0 ] - then - echo "Info: Logging to file ${LOG_FILE}." - if [ "$RESP" != "" ] - then - echo "$RESP" >> $LOG_FILE + if [ $RESPCODE -ne 0 ]; then + echo "Info: Logging to file ${LOG_FILE}." + if [ "$RESP" != "" ]; then + echo "$RESP" >>$LOG_FILE else - echo "REST API call wasn't successful." >> $LOG_FILE - fi + echo "REST API call wasn't successful." >>$LOG_FILE + fi else echo "REST API call was successful." fi - - return - } + + return +} # Create a log file touch $LOG_FILE @@ -68,69 +63,66 @@ touch $LOG_FILE # Delete the Software instance echo 'Invoking REST API to delete the first Software Instance.' -RESP=`curl -s $DELETE_SWI_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` +RESP=$(curl -s $DELETE_SWI_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) check_response "${RESP}" $? # Delete data set with export jobs echo "Invoking REST API to delete ${EXPORT_DSN} data set with export jobs." -RESP=`curl -s $EXPORT_DSN_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` +RESP=$(curl -s $EXPORT_DSN_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) check_response "${RESP}" $? # Delete echo "Invoking REST API to delete ${WORKFLOW_DSN} data set." -RESP=`curl -s $WORKFLOW_DSN_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` +RESP=$(curl -s $WORKFLOW_DSN_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) check_response "${RESP}" $? # Unmount and delete echo "Unmounting and deleting zFS ${TMP_ZFS}." -echo ${JOBST1} > JCL -echo ${JOBST2} >> JCL -echo "//UNMNTZFS EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >> JCL -echo "//SYSTSPRT DD SYSOUT=*" >> JCL -echo "//SYSTSOUT DD SYSOUT=*" >> JCL -echo "//SYSTSIN DD * " >> JCL -echo "UNMOUNT FILESYSTEM('${TMP_ZFS}') + " >> JCL -echo "IMMEDIATE" >> JCL -echo "/*" >> JCL -echo "//DELTZFST EXEC PGM=IDCAMS" >> JCL -echo "//SYSPRINT DD SYSOUT=*" >> JCL -echo "//SYSIN DD *" >> JCL -echo " DELETE ${TMP_ZFS}" >> JCL -echo "/*" >> JCL - -sh scripts/submit_jcl.sh "`cat JCL`" +echo ${JOBST1} >JCL +echo ${JOBST2} >>JCL +echo "//UNMNTZFS EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >>JCL +echo "//SYSTSPRT DD SYSOUT=*" >>JCL +echo "//SYSTSOUT DD SYSOUT=*" >>JCL +echo "//SYSTSIN DD * " >>JCL +echo "UNMOUNT FILESYSTEM('${TMP_ZFS}') + " >>JCL +echo "IMMEDIATE" >>JCL +echo "/*" >>JCL +echo "//DELTZFST EXEC PGM=IDCAMS" >>JCL +echo "//SYSPRINT DD SYSOUT=*" >>JCL +echo "//SYSIN DD *" >>JCL +echo " DELETE ${TMP_ZFS}" >>JCL +echo "/*" >>JCL + +sh scripts/submit_jcl.sh "$(cat JCL)" # Not checking results so the script doesn't fail rm JCL -if [ "$ZOSMF_V" = "2.3" ] -then # Unmount and delete echo "Unmounting and deleting zFS ${WORK_ZFS}." -echo ${JOBST1} > JCL -echo ${JOBST2} >> JCL -echo "//UNMNTZFS EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >> JCL -echo "//SYSTSPRT DD SYSOUT=*" >> JCL -echo "//SYSTSOUT DD SYSOUT=*" >> JCL -echo "//SYSTSIN DD * " >> JCL -echo "UNMOUNT FILESYSTEM('${WORK_ZFS}') + " >> JCL -echo "IMMEDIATE" >> JCL -echo "/*" >> JCL -echo "//DELTZFST EXEC PGM=IDCAMS" >> JCL -echo "//SYSPRINT DD SYSOUT=*" >> JCL -echo "//SYSIN DD *" >> JCL -echo " DELETE ${WORK_ZFS}" >> JCL -echo "/*" >> JCL - -sh scripts/submit_jcl.sh "`cat JCL`" +echo ${JOBST1} >JCL +echo ${JOBST2} >>JCL +echo "//UNMNTZFS EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >>JCL +echo "//SYSTSPRT DD SYSOUT=*" >>JCL +echo "//SYSTSOUT DD SYSOUT=*" >>JCL +echo "//SYSTSIN DD * " >>JCL +echo "UNMOUNT FILESYSTEM('${WORK_ZFS}') + " >>JCL +echo "IMMEDIATE" >>JCL +echo "/*" >>JCL +echo "//DELTZFST EXEC PGM=IDCAMS" >>JCL +echo "//SYSPRINT DD SYSOUT=*" >>JCL +echo "//SYSIN DD *" >>JCL +echo " DELETE ${WORK_ZFS}" >>JCL +echo "/*" >>JCL + +sh scripts/submit_jcl.sh "$(cat JCL)" # Not checking results so the script doesn't fail rm JCL -fi echo "Invoking REST API to unmount Zowe zFS ${ZOWE_ZFS} from its mountpoint." -RESP=`curl -s $ACTION_ZOWE_ZFS_URL -k -X "PUT" -d "$UNMOUNT_ZFS_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` +RESP=$(curl -s $ACTION_ZOWE_ZFS_URL -k -X "PUT" -d "$UNMOUNT_ZFS_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) check_response "${RESP}" $? diff --git a/pswi/05_test.sh b/pswi/05_test.sh index 94afd818a2..46a67a57a4 100644 --- a/pswi/05_test.sh +++ b/pswi/05_test.sh @@ -68,7 +68,8 @@ sh scripts/tmp_mounts.sh "${WORK_ZFS}" "${WORK_MOUNT}" if [ $? -gt 0 ]; then exit -1; fi # Run the deployment test -echo " Running the deployment test for z/OSMF version 2.3" +echo " Running the deployment test for z/OSMF version ${ZOSMF_V}" pip install requests + python scripts/deploy_test_2_3.py diff --git a/pswi/06_test_cleanup.sh b/pswi/06_test_cleanup.sh index f426f11ed5..6f8ee19f06 100644 --- a/pswi/06_test_cleanup.sh +++ b/pswi/06_test_cleanup.sh @@ -2,7 +2,7 @@ #version=1.0 export BASE_URL="${ZOSMF_URL}:${ZOSMF_PORT}" -LOG_FILE=${LOGDIR}log_pswi_"`date +%y-%j-%H-%M-%S`" +LOG_FILE=$LOG_DIR/log_test_cleanup.txt echo "" echo "" @@ -15,171 +15,113 @@ echo "Portable Software Instance :" $PSWI echo "Software instance name :" $DEPLOY_NAME echo "Temporary zFS :" $TMP_ZFS echo "Work zFS :" $WORK_ZFS # For z/OSMF v2.3 -echo "Directory for logs :" $LOGDIR +echo "Directory for logs :" $LOG_DIR echo "ACCOUNT :" $ACCOUNT echo "SYSAFF :" $SYSAFF echo "z/OSMF version :" $ZOSMF_V - # URLs DELETE_PSWI_URL="${BASE_URL}/zosmf/swmgmt/pswi/${ZOSMF_SYSTEM}/${PSWI}" WORKFLOW_LIST_URL="${BASE_URL}/zosmf/workflow/rest/1.0/workflows?owner=${ZOSMF_USER}&workflowName=${WORKFLOW_NAME}.*" DELETE_DEPL_SWI_URL="${BASE_URL}/zosmf/swmgmt/swi/${ZOSMF_SYSTEM}/${DEPLOY_NAME}" - -check_response() { - RESP=$1 - RESPCODE=$2 - - REASON=`echo $RESP | grep -o '"reason":'` - EMPTY=`echo $RESP | grep -o '\[\]'` - MSG=`echo $RESP | grep -o '"messageText":'` - if [ -n "$REASON" ] || [ -n "$MSG" ] - then - echo "Info: Logging to file ${LOG_FILE}." - echo "$RESP" >> $LOG_FILE - fi - if [ -n "$EMPTY" ] - then - echo "Info: Logging to file ${LOG_FILE}." - echo "$RESP" >> $LOG_FILE - fi - if [ $RESPCODE -ne 0 ] - then - echo "Info: Logging to file ${LOG_FILE}." - if [ -n "$RESP" ] - then - echo "$RESP" >> $LOG_FILE - else - echo "REST API call wasn't successful." >> $LOG_FILE - fi - else - echo "REST API call was successful." - fi - - return - } - # Create a log file touch $LOG_FILE - + # Delete the Software instance echo "Invoking REST API to delete the Software Instance created by deployment." -RESP=`curl -s $DELETE_DEPL_SWI_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -check_response "${RESP}" $? - -if [ "$ZOSMF_V" = "2.4" ] -then - -# Delete the Portable Software Instance -echo "Invoking REST API to delete the portable software instance." - -RESP=`curl -s $DELETE_PSWI_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -check_response "${RESP}" $? -fi +RESP=$(curl -s $DELETE_DEPL_SWI_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) +sh scripts/check_response.sh "${RESP}" $? # Unmount and delete echo "Unmounting and deleting zFS ${TMP_ZFS}." -echo ${JOBST1} > JCL -echo ${JOBST2} >> JCL -echo "//UNMNTZFS EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >> JCL -echo "//SYSTSPRT DD SYSOUT=*" >> JCL -echo "//SYSTSOUT DD SYSOUT=*" >> JCL -echo "//SYSTSIN DD * " >> JCL -echo "UNMOUNT FILESYSTEM('${TMP_ZFS}') + " >> JCL -echo "IMMEDIATE" >> JCL -echo "/*" >> JCL -echo "//DELTZFST EXEC PGM=IDCAMS" >> JCL -echo "//SYSPRINT DD SYSOUT=*" >> JCL -echo "//SYSIN DD *" >> JCL -echo " DELETE ${TMP_ZFS}" >> JCL -echo "/*" >> JCL - -sh scripts/submit_jcl.sh "`cat JCL`" +echo ${JOBST1} >JCL +echo ${JOBST2} >>JCL +echo "//UNMNTZFS EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >>JCL +echo "//SYSTSPRT DD SYSOUT=*" >>JCL +echo "//SYSTSOUT DD SYSOUT=*" >>JCL +echo "//SYSTSIN DD * " >>JCL +echo "UNMOUNT FILESYSTEM('${TMP_ZFS}') + " >>JCL +echo "IMMEDIATE" >>JCL +echo "/*" >>JCL +echo "//DELTZFST EXEC PGM=IDCAMS" >>JCL +echo "//SYSPRINT DD SYSOUT=*" >>JCL +echo "//SYSIN DD *" >>JCL +echo " DELETE ${TMP_ZFS}" >>JCL +echo "/*" >>JCL + +sh scripts/submit_jcl.sh "$(cat JCL)" # Not checking results so the script doesn't fail rm JCL -if [ "$ZOSMF_V" = "2.3" ] -then -# Unmount and delete -echo "Unmounting and deleting zFS ${WORK_ZFS}." -echo ${JOBST1} > JCL -echo ${JOBST2} >> JCL -echo "//UNMNTZFS EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >> JCL -echo "//SYSTSPRT DD SYSOUT=*" >> JCL -echo "//SYSTSOUT DD SYSOUT=*" >> JCL -echo "//SYSTSIN DD * " >> JCL -echo "UNMOUNT FILESYSTEM('${WORK_ZFS}') + " >> JCL -echo "IMMEDIATE" >> JCL -echo "/*" >> JCL -echo "//DELTZFST EXEC PGM=IDCAMS" >> JCL -echo "//SYSPRINT DD SYSOUT=*" >> JCL -echo "//SYSIN DD *" >> JCL -echo " DELETE ${WORK_ZFS}" >> JCL -echo "/*" >> JCL - -sh scripts/submit_jcl.sh "`cat JCL`" -# Not checking results so the script doesn't fail -rm JCL -fi # Unmount and delete echo "Unmounting and deleting zFS ${TEST_HLQ}.ZFS." -echo ${JOBST1} > JCL -echo ${JOBST2} >> JCL -echo "//UNMNTZFS EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >> JCL -echo "//SYSTSPRT DD SYSOUT=*" >> JCL -echo "//SYSTSOUT DD SYSOUT=*" >> JCL -echo "//SYSTSIN DD * " >> JCL -echo "UNMOUNT FILESYSTEM('${TEST_HLQ}.ZFS') + " >> JCL -echo "IMMEDIATE" >> JCL -echo "/*" >> JCL -echo "//DELTZFST EXEC PGM=IDCAMS" >> JCL -echo "//SYSPRINT DD SYSOUT=*" >> JCL -echo "//SYSIN DD *" >> JCL -echo " DELETE ${TEST_HLQ}.ZFS" >> JCL -echo "/*" >> JCL - -sh scripts/submit_jcl.sh "`cat JCL`" +echo ${JOBST1} >JCL +echo ${JOBST2} >>JCL +echo "//UNMNTZFS EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >>JCL +echo "//SYSTSPRT DD SYSOUT=*" >>JCL +echo "//SYSTSOUT DD SYSOUT=*" >>JCL +echo "//SYSTSIN DD * " >>JCL +echo "UNMOUNT FILESYSTEM('${TEST_HLQ}.ZFS.#') + " >>JCL +echo "IMMEDIATE" >>JCL +echo "/*" >>JCL +echo "//UNMNTZF2 EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >>JCL +echo "//SYSTSPRT DD SYSOUT=*" >>JCL +echo "//SYSTSOUT DD SYSOUT=*" >>JCL +echo "//SYSTSIN DD * " >>JCL +echo "UNMOUNT FILESYSTEM('${TEST_HLQ}.ZFS') + " >>JCL +echo "IMMEDIATE" >>JCL +echo "/*" >>JCL +echo "//DELTZFST EXEC PGM=IDCAMS" >>JCL +echo "//SYSPRINT DD SYSOUT=*" >>JCL +echo "//SYSIN DD *" >>JCL +echo " DELETE ${TEST_HLQ}.ZFS" >>JCL +echo " DELETE ${TEST_HLQ}.ZFS.#" >>JCL +echo "/*" >>JCL + +sh scripts/submit_jcl.sh "$(cat JCL)" # Not checking results so the script doesn't fail rm JCL # Delete deployed datasets echo "Deleting deployed datasets." -echo ${JOBST1} > JCL -echo ${JOBST2} >> JCL -echo "//DELTZOWE EXEC PGM=IDCAMS" >> JCL -echo "//SYSPRINT DD SYSOUT=*" >> JCL -echo "//SYSIN DD *" >> JCL -echo " DELETE ${TEST_HLQ}.** MASK" >> JCL -echo " SET MAXCC=0" >> JCL -echo "/*" >> JCL +echo ${JOBST1} >JCL +echo ${JOBST2} >>JCL +echo "//DELTZOWE EXEC PGM=IDCAMS" >>JCL +echo "//SYSPRINT DD SYSOUT=*" >>JCL +echo "//SYSIN DD *" >>JCL +echo " DELETE ${TEST_HLQ}.** MASK" >>JCL +echo " SET MAXCC=0" >>JCL +echo "/*" >>JCL -sh scripts/submit_jcl.sh "`cat JCL`" +sh scripts/submit_jcl.sh "$(cat JCL)" rm JCL -if [ "$ZOSMF_V" = "2.4" ] -then -# Delete Post-deployment workflow in z/OSMF -echo "Invoking REST API to delete Post-deployment workflows." - -# Get workflowKey for Post-deployment workflow owned by user -RESP=`curl -s $WORKFLOW_LIST_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -check_response "${RESP}" $? -WFKEYS=`echo $RESP | sed 's/},/},\n/g' | grep -oP '"workflowKey":".*"' | cut -f4 -d\"` - -IFS=$'\n' -for KEY in $WFKEYS -do - -echo "Deleting a workflow." -RESP=`curl -s ${BASE_URL}/zosmf/workflow/rest/1.0/workflows/${KEY} -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -check_response "${RESP}" $? - -done -fi + +# Unmount and delete +echo "Unmounting and deleting zFS ${WORK_ZFS}." + +echo ${JOBST1} >JCL +echo ${JOBST2} >>JCL +echo "//UNMNTZFS EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >>JCL +echo "//SYSTSPRT DD SYSOUT=*" >>JCL +echo "//SYSTSOUT DD SYSOUT=*" >>JCL +echo "//SYSTSIN DD * " >>JCL +echo "UNMOUNT FILESYSTEM('${WORK_ZFS}') + " >>JCL +echo "IMMEDIATE" >>JCL +echo "/*" >>JCL +echo "//DELTZFST EXEC PGM=IDCAMS" >>JCL +echo "//SYSPRINT DD SYSOUT=*" >>JCL +echo "//SYSIN DD *" >>JCL +echo " DELETE ${WORK_ZFS}" >>JCL +echo "/*" >>JCL + +sh scripts/submit_jcl.sh "$(cat JCL)" +# Not checking results so the script doesn't fail +rm JCL diff --git a/pswi/07_smpe_cleanup.sh b/pswi/07_smpe_cleanup.sh index 53106174b3..97e7830b9f 100644 --- a/pswi/07_smpe_cleanup.sh +++ b/pswi/07_smpe_cleanup.sh @@ -2,7 +2,7 @@ #version=1.0 export BASE_URL="${ZOSMF_URL}:${ZOSMF_PORT}" -LOG_FILE=${LOGDIR}log_pswi_"`date +%y-%j-%H-%M-%S`" +LOG_FILE=$LOG_DIR/log_pswi_smpe_cleanup.txt echo "" echo "" @@ -17,60 +17,56 @@ echo "Directory for logs :" $LOGDIR # URLs ACTION_ZOWE_ZFS_URL="${BASE_URL}/zosmf/restfiles/mfs/${ZOWE_ZFS}" -# JSONs +# JSONs UNMOUNT_ZFS_JSON='{"action":"unmount"}' check_response() { RESP=$1 RESPCODE=$2 - - REASON=`echo $RESP | grep -o '"reason":'` - EMPTY=`echo $RESP | grep -o '\[\]'` - MSG=`echo $RESP | grep -o '"messageText":'` - if [ -n "$REASON" ] || [ -n "$MSG" ] - then - echo "Info: Logging to file ${LOG_FILE}." - echo "$RESP" >> $LOG_FILE + + REASON=$(echo $RESP | grep -o '"reason":') + EMPTY=$(echo $RESP | grep -o '\[\]') + MSG=$(echo $RESP | grep -o '"messageText":') + if [ -n "$REASON" ] || [ -n "$MSG" ]; then + echo "Info: Logging to file ${LOG_FILE}." + echo "$RESP" >>$LOG_FILE fi - if [ -n "$EMPTY" ] - then - echo "Info: Logging to file ${LOG_FILE}." - echo "$RESP" >> $LOG_FILE + if [ -n "$EMPTY" ]; then + echo "Info: Logging to file ${LOG_FILE}." + echo "$RESP" >>$LOG_FILE fi - if [ $RESPCODE -ne 0 ] - then - echo "Info: Logging to file ${LOG_FILE}." - if [ -n "$RESP" ] - then - echo "$RESP" >> $LOG_FILE + if [ $RESPCODE -ne 0 ]; then + echo "Info: Logging to file ${LOG_FILE}." + if [ -n "$RESP" ]; then + echo "$RESP" >>$LOG_FILE else - echo "REST API call wasn't successful." >> $LOG_FILE - fi + echo "REST API call wasn't successful." >>$LOG_FILE + fi else echo "REST API call was successful." fi - - return - } + + return +} # Create a log file touch $LOG_FILE echo "Invoking REST API to unmount SMPE zFS ${ZOWE_ZFS} from its mountpoint." -RESP=`curl -s $ACTION_ZOWE_ZFS_URL -k -X "PUT" -d "$UNMOUNT_ZFS_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` +RESP=$(curl -s $ACTION_ZOWE_ZFS_URL -k -X "PUT" -d "$UNMOUNT_ZFS_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) check_response "${RESP}" $? # Delete SMPE datasets -echo ${JOBST1} > JCL -echo ${JOBST2} >> JCL -echo "//DELTZOWE EXEC PGM=IDCAMS" >> JCL -echo "//SYSPRINT DD SYSOUT=*" >> JCL -echo "//SYSIN DD *" >> JCL -echo " DELETE ${CSIHLQ}.** MASK" >> JCL -echo " SET MAXCC=0" >> JCL -echo "/*" >> JCL +echo ${JOBST1} >JCL +echo ${JOBST2} >>JCL +echo "//DELTZOWE EXEC PGM=IDCAMS" >>JCL +echo "//SYSPRINT DD SYSOUT=*" >>JCL +echo "//SYSIN DD *" >>JCL +echo " DELETE ${CSIHLQ}.** MASK" >>JCL +echo " SET MAXCC=0" >>JCL +echo "/*" >>JCL -sh scripts/submit_jcl.sh "`cat JCL`" +sh scripts/submit_jcl.sh "$(cat JCL)" rm JCL diff --git a/pswi/08_presmpe_cleanup.sh b/pswi/08_presmpe_cleanup.sh index df0a83805c..df7521e12a 100644 --- a/pswi/08_presmpe_cleanup.sh +++ b/pswi/08_presmpe_cleanup.sh @@ -2,7 +2,7 @@ #version=1.0 export BASE_URL="${ZOSMF_URL}:${ZOSMF_PORT}" -LOG_FILE=${LOGDIR}log_pswi_"`date +%y-%j-%H-%M-%S`" +LOG_FILE=$LOG_DIR/log_pswi_presmpe_cleanup echo "" echo "" @@ -17,49 +17,45 @@ echo "Directory for logs :" $LOGDIR check_response() { RESP=$1 RESPCODE=$2 - - REASON=`echo $RESP | grep -o '"reason":'` - EMPTY=`echo $RESP | grep -o '\[\]'` - MSG=`echo $RESP | grep -o '"messageText":'` - if [ -n "$REASON" ] || [ -n "$MSG" ] - then - echo "Info: Logging to file ${LOG_FILE}." - echo "$RESP" >> $LOG_FILE + + REASON=$(echo $RESP | grep -o '"reason":') + EMPTY=$(echo $RESP | grep -o '\[\]') + MSG=$(echo $RESP | grep -o '"messageText":') + if [ -n "$REASON" ] || [ -n "$MSG" ]; then + echo "Info: Logging to file ${LOG_FILE}." + echo "$RESP" >>$LOG_FILE fi - if [ -n "$EMPTY" ] - then - echo "Info: Logging to file ${LOG_FILE}." - echo "$RESP" >> $LOG_FILE + if [ -n "$EMPTY" ]; then + echo "Info: Logging to file ${LOG_FILE}." + echo "$RESP" >>$LOG_FILE fi - if [ $RESPCODE -ne 0 ] - then - echo "Info: Logging to file ${LOG_FILE}." - if [ -n "$RESP" ] - then - echo "$RESP" >> $LOG_FILE + if [ $RESPCODE -ne 0 ]; then + echo "Info: Logging to file ${LOG_FILE}." + if [ -n "$RESP" ]; then + echo "$RESP" >>$LOG_FILE else - echo "REST API call wasn't successful." >> $LOG_FILE - fi + echo "REST API call wasn't successful." >>$LOG_FILE + fi else echo "REST API call was successful." fi - - return - } + + return +} # Create a log file touch $LOG_FILE # Delete pre-SMPE datasets -echo ${JOBST1} > JCL -echo ${JOBST2} >> JCL -echo "//DELTZOWE EXEC PGM=IDCAMS" >> JCL -echo "//SYSPRINT DD SYSOUT=*" >> JCL -echo "//SYSIN DD *" >> JCL -echo " DELETE ${SMPE}.** MASK" >> JCL -echo " SET MAXCC=0" >> JCL -echo "/*" >> JCL +echo ${JOBST1} >JCL +echo ${JOBST2} >>JCL +echo "//DELTZOWE EXEC PGM=IDCAMS" >>JCL +echo "//SYSPRINT DD SYSOUT=*" >>JCL +echo "//SYSIN DD *" >>JCL +echo " DELETE ${SMPE}.** MASK" >>JCL +echo " SET MAXCC=0" >>JCL +echo "/*" >>JCL -sh scripts/submit_jcl.sh "`cat JCL`" +sh scripts/submit_jcl.sh "$(cat JCL)" rm JCL diff --git a/pswi/PSWI-marist.sh b/pswi/PSWI-marist.sh index 5a9e03bfa7..50c719367d 100755 --- a/pswi/PSWI-marist.sh +++ b/pswi/PSWI-marist.sh @@ -1,5 +1,4 @@ -set -x -export ZOSMF_URL="https://zzow07.zowe.marist.cloud" +export ZOSMF_URL="https://zzow10.zowe.marist.cloud" export ZOSMF_PORT=10443 export ZOSMF_SYSTEM="S0W1" export DIR="/u/zowead2" @@ -10,7 +9,9 @@ export VOLUME="ZOS003" export TEST_HLQ="ZOWEAD2.PSWIT" export SYSAFF="(S0W1)" export ACCOUNT=1 - +CURR_TIME=$(date +%s) +export LOG_DIR="logs/$CURR_TIME" +mkdir -p $LOG_DIR # Variables for workflows # SMPE export TZONE="TZONE" @@ -31,7 +32,7 @@ export TEST_MOUNT="${DIR}/test_mount" export EXPORT="${TMP_MOUNT}/export/" export WORK_MOUNT="${DIR}/work" export WORK_ZFS="ZOWEAD2.WORK.ZFS" -export ZOSMF_V="2.3" +export ZOSMF_V="3.1" export SMPE_WF_NAME="ZOWE_SMPE_WF" export PTF_WF_NAME="ZOWE_PTF_WF" export HOST=${ZOSMF_URL#https:\/\/} @@ -42,7 +43,7 @@ if [ -f ../.pax/zowe-smpe.zip ]; then mkdir -p "unzipped" unzip ../.pax/zowe-smpe.zip -d unzipped else - echo "zowe-smpe file not found" >> report.txt + echo "zowe-smpe file not found" >>"$LOG_DIR/report.txt" exit -1 fi @@ -74,7 +75,7 @@ else if [ -f ../.pax/${FMID}.zip ]; then unzip ../.pax/${FMID}.zip -d unzipped else - echo "File with FMID not found" >> report.txt + echo "File with FMID not found" >>"$LOG_DIR/report.txt" exit -1 fi fi @@ -134,13 +135,12 @@ if [ $presmpe -eq 0 ]; then # Test PSWI sh 05_test.sh test=$? - + if [ $test -eq 0 ]; then #test the workflows sh 051_test_workflows.sh wf_test=$? fi - # Cleanup after the test sh 06_test_cleanup.sh fi @@ -165,19 +165,19 @@ echo "" echo "" if [ $smpe -ne 0 ] || [ $ptf -ne 0 ] || [ $create -ne 0 ] || [ $test -ne 0 ] || [ $presmpe -ne 0 ] || [ $wf_test -ne 0 ]; then - echo "Build unsuccessful!" >> report.txt + echo "Build unsuccessful!" >>"$LOG_DIR/report.txt" if [ $presmpe -ne 0 ]; then - echo "Pre-SMP/E wasn't successful." >> report.txt + echo "Pre-SMP/E wasn't successful." >>"$LOG_DIR/report.txt" elif [ $smpe -ne 0 ]; then - echo "SMP/E wasn't successful." >> report.txt + echo "SMP/E wasn't successful." >>"$LOG_DIR/report.txt" elif [ $ptf -ne 0 ]; then - echo "Applying PTFs wasn't successful." >> report.txt + echo "Applying PTFs wasn't successful." >>"$LOG_DIR/report.txt" elif [ $create -ne 0 ]; then - echo "Creation of PSWI wasn't successful." >> report.txt + echo "Creation of PSWI wasn't successful." >>"$LOG_DIR/report.txt" elif [ $test -ne 0 ]; then - echo "Testing of PSWI wasn't successful." >> report.txt + echo "Testing of PSWI wasn't successful." >>"$LOG_DIR/report.txt" elif [ $wf_test -ne 0 ]; then - echo "Workflow testing wasn't successful." >> report.txt + echo "Workflow testing wasn't successful." >>"$LOG_DIR/report.txt" fi exit -1 else diff --git a/pswi/ZWECONF_test.sh b/pswi/ZWECONF_test.sh index 346c997e45..2fb2696dc3 100755 --- a/pswi/ZWECONF_test.sh +++ b/pswi/ZWECONF_test.sh @@ -1,24 +1,27 @@ -export ZOSMF_URL="https://zzow07.zowe.marist.cloud" +export ZOSMF_URL="https://zzow10.zowe.marist.cloud" export ZOSMF_PORT=10443 export ZOSMF_SYSTEM="S0W1" export JOBNAME="ZWECONF1" export HOST=${ZOSMF_URL#https:\/\/} export BASE_URL="${ZOSMF_URL}:${ZOSMF_PORT}" +CURR_TIME=$(date +%s) +export LOG_DIR="logs/$CURR_TIME" +mkdir -p $LOG_DIR WORK_MOUNT="/tmp" echo "Changing runtime path in ZWECONF.properties." cp ../workflows/files/ZWECONF.properties ./ZWECONF.properties -sed "s|runtimeDirectory=|runtimeDirectory=${WORK_MOUNT}|g" ./ZWECONF.properties > _ZWECONF -sed "s|java_home=|java_home=#delete_me#|g" _ZWECONF > ZWECONF -sed "s|node_home=|node_home=#delete_me#|g" ZWECONF > _ZWECONF +sed "s|runtimeDirectory=|runtimeDirectory=${WORK_MOUNT}|g" ./ZWECONF.properties >_ZWECONF +sed "s|java_home=|java_home=#delete_me#|g" _ZWECONF >ZWECONF +sed "s|node_home=|node_home=#delete_me#|g" ZWECONF >_ZWECONF echo "Changing the configuration workflow to be fully automated." cp ../workflows/files/ZWECONF.xml ./ZWECONF.xml -sed "s|false|true|g" ./ZWECONF.xml > ZWECONFX +sed "s|false|true|g" ./ZWECONF.xml >ZWECONFX -sshpass -p${ZOSMF_PASS} sftp -o HostKeyAlgorithms=+ssh-rsa -o BatchMode=no -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -b - -P ${ZZOW_SSH_PORT} ${ZOSMF_USER}@${HOST} << EOF +sshpass -p${ZOSMF_PASS} sftp -o HostKeyAlgorithms=+ssh-rsa -o BatchMode=no -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -b - -P ${ZZOW_SSH_PORT} ${ZOSMF_USER}@${HOST} < JCL -echo "/*JOBPARM SYSAFF=(${ZOSMF_SYSTEM})" >> JCL -echo "//UNPAXDIR EXEC PGM=BPXBATCH" >> JCL -echo "//STDOUT DD SYSOUT=*" >> JCL -echo "//STDERR DD SYSOUT=*" >> JCL -echo "//STDPARM DD *" >> JCL -echo "SH set -x;set -e;" >> JCL -echo "cd ${WORK_MOUNT};" >> JCL -echo "iconv -f IBM-1047 -t ISO8859-1 zowe.yaml > zowe_.yaml;" >> JCL -echo "/*" >> JCL - -sh scripts/submit_jcl.sh "`cat JCL`" -if [ $? -gt 0 ];then exit -1;fi +echo "//${ZOSMF_SYSTEM} JOB (1),'PSWI',MSGCLASS=A,REGION=0M" >JCL +echo "/*JOBPARM SYSAFF=(${ZOSMF_SYSTEM})" >>JCL +echo "//UNPAXDIR EXEC PGM=BPXBATCH" >>JCL +echo "//STDOUT DD SYSOUT=*" >>JCL +echo "//STDERR DD SYSOUT=*" >>JCL +echo "//STDPARM DD *" >>JCL +echo "SH set -x;set -e;" >>JCL +echo "cd ${WORK_MOUNT};" >>JCL +echo "iconv -f IBM-1047 -t ISO8859-1 zowe.yaml > zowe_.yaml;" >>JCL +echo "/*" >>JCL + +sh scripts/submit_jcl.sh "$(cat JCL)" +if [ $? -gt 0 ]; then exit -1; fi rm JCL -sshpass -p${ZOSMF_PASS} sftp -o HostKeyAlgorithms=+ssh-rsa -o BatchMode=no -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -b - -P ${ZZOW_SSH_PORT} ${ZOSMF_USER}@${HOST} << EOF +sshpass -p${ZOSMF_PASS} sftp -o HostKeyAlgorithms=+ssh-rsa -o BatchMode=no -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -b - -P ${ZZOW_SSH_PORT} ${ZOSMF_USER}@${HOST} < diff.txt || true +diff example-zowe.yaml zowe_.yaml >diff.txt || true + +diff diff.txt scripts/base_diff.txt >final_diff.txt || true + +concat=$(cat final_diff.txt) -diff --ed diff.txt scripts/base_diff.txt > final_diff.txt +if [ -n "$concat" ] +then + echo "There are some discrepancies between the example-zowe.yaml and the zowe.yaml created by ZWECONF.xml workflow." + echo "Please add to or delete from the ZWECONF.xml workflow what needs or doesn't need to be there." + echo "E.g. if there is a new variable you need to add it first to the workflow variables, then add the variable to the" + echo "'main_variables' step and then also to the step where the zowe.yaml is created." + echo "If there was added/deleted just a comment in the example-zowe.yaml please add it also to the workflow so" + echo "this step is not failing." + echo "Here is the output from the diff command:" # They will surely know what is diff cmd, right + while read -r line; do + if [[ "$line" =~ ^\< ]]; then + echo $line >> final_final_diff.txt + fi + done # Security related configurations. This setup is optional. +> security: +> # security product name. Can be RACF, ACF2 or TSS +> product: RACF +> # security group name +> groups: +> # Zowe admin user group +> admin: ZWEADMIN +> # Zowe STC group +> stc: ZWEADMIN +> # Zowe SysProg group +> sysProg: ZWEADMIN +> # security user name +> users: +> # Zowe runtime user name of main service +> zowe: ZWESVUSR +> # Zowe runtime user name of ZIS +> zis: ZWESIUSR +> # STC names +> stcs: +> # STC name of Zowe main service +> zowe: ZWESLSTC +> # STC name of Zowe ZIS +> zis: ZWESISTC +> # STC name of Zowe ZIS Auxiliary Server +> aux: ZWESASTC +100,103c100,103 +< certificate: +< # Type of certificate storage. Valid values are: PKCS12, JCERACFKS. APIML additionally supports: JCEKS, JCECCAKS, JCECCARACFKS, or JCEHYBRIDRACFKS +< type: PKCS12 +< pkcs12: +--- +> # certificate: +> # Type of certificate storage. Valid values are: PKCS12, JCEKS, JCECCAKS, JCERACFKS, JCECCARACFKS, or JCEHYBRIDRACFKS +> # type: +> # pkcs12: +106c106 +< directory: /var/zowe/keystore +--- +> # directory: +281c281 +< runtimeDirectory: "" +--- +> runtimeDirectory: "/tmp" +456c456 +< home: "" +--- +> home: "#delete_me#" +471c471 +< home: "" +--- +> home: "#delete_me#" diff --git a/pswi/scripts/check_response.sh b/pswi/scripts/check_response.sh index b589cf88d2..2a2deb11cd 100644 --- a/pswi/scripts/check_response.sh +++ b/pswi/scripts/check_response.sh @@ -1,17 +1,15 @@ RESP=$1 RESPCODE=$2 - -REASON=`echo $RESP | grep -o '"reason":'` -MSG=`echo $RESP | grep -o '"messageText":'` -if [ -n "$REASON" ] || [ -n "$MSG" ] -then - echo $RESP >> report.txt + +REASON=$(echo $RESP | grep -o '"reason":') +MSG=$(echo $RESP | grep -o '"messageText":') +if [ -n "$REASON" ] || [ -n "$MSG" ]; then + echo $RESP >>$LOG_DIR/report.txt exit -1 -fi -if [ $RESPCODE -ne 0 ] -then - echo "REST API call failed." >> report.txt - echo $RESP >> report.txt +fi +if [ $RESPCODE -ne 0 ]; then + echo "REST API call failed." >>$LOG_DIR/report.txt + echo $RESP >>$LOG_DIR/report.txt exit -1 else echo "REST API call was successful." diff --git a/pswi/scripts/deploy_test_2_3.py b/pswi/scripts/deploy_test_2_3.py index 7163577ce5..db4f94e85e 100644 --- a/pswi/scripts/deploy_test_2_3.py +++ b/pswi/scripts/deploy_test_2_3.py @@ -4,48 +4,55 @@ import os import glob + class Deploy_test: - - def __init__(self, url, user, password, system, hlq, jobst1, jobst2, volume, tzone, dzone, new_mountpoint, pswi_path, work_mount, swi_name): - - izudurl = "{0}/zosmf/restfiles/fs{1}/IZUD00DF.json".format(url, pswi_path) - self.headers = {'X-CSRF-ZOSMF-HEADER': ''} - resp = requests.get(izudurl, headers=self.headers, auth=(user, password), verify=False) - - izud = json.loads(resp.text) - # Set variables - self.url = url - self.user = user - self.password = password - self.system = system - self.hlq = hlq.upper() - self.jobst1 = jobst1 + "\n" - self.jobst2 = jobst2 + "\n" - self.volume = volume.upper() - self.pswi_path = pswi_path - self.tzone = tzone.upper() - self.dzone = dzone.upper() - self.new_mountp = new_mountpoint - - self.definition = izud["izud.pswi.descriptor"] - self.datasets = self.definition["datasets"] - self.swi_name = swi_name - - for dataset in self.datasets: - if dataset["zonedddefs"] is not None: - for zonedddef in dataset["zonedddefs"]: - for dddef in zonedddef["dddefs"]: - if dddef["path"] is not None: - self.no_dddef = dddef["dddef"] - self.old_mountp = dataset["mountpoint"] - - for zone in self.definition["zones"]: - if zone["type"] == "TARGET": - self.target = zone["name"] - elif zone["type"] == "DLIB": - self.dlib = zone["name"] - - self.job1 = """//GIMUNZIP EXEC PGM=GIMUNZIP,PARM='HASH=NO' + + def __init__(self, url, user, password, system, hlq, jobst1, jobst2, volume, tzone, dzone, new_mountpoint, pswi_path, + work_mount, swi_name): + + izudurl = "{0}/zosmf/restfiles/fs{1}/IZUD00DF.json".format(url, pswi_path) + self.headers = {'X-CSRF-ZOSMF-HEADER': ''} + resp = requests.get(izudurl, headers=self.headers, auth=(user, password), verify=False) + + izud = json.loads(resp.text) + # Set variables + self.url = url + self.user = user + self.password = password + self.system = system + self.hlq = hlq.upper() + self.jobst1 = jobst1 + "\n" + self.jobst2 = jobst2 + "\n" + self.volume = volume.upper() + self.pswi_path = pswi_path + self.tzone = tzone.upper() + self.dzone = dzone.upper() + self.new_mountp = new_mountpoint + + self.definition = izud["izud.pswi.descriptor"] + self.datasets = self.definition["datasets"] + self.work_mount = work_mount + self.swi_name = swi_name + self.version = int(self.definition["version"]) + for dataset in self.datasets: + if dataset["zonedddefs"] is not None: + for zonedddef in dataset["zonedddefs"]: + for dddef in zonedddef["dddefs"]: + if dddef["path"] is not None: + self.no_dddef = dddef["dddef"] + self.old_mountp = dataset["mountpoint"] + self.tracks = int(dataset["tracks"]) + self.secondary = int(dataset["secondary"]) + self.new_zfs = self.new_name(dataset["dsname"]) + self.zfs_archid = dataset["archid"] + + for zone in self.definition["zones"]: + if zone["type"] == "TARGET": + self.target = zone["name"] + elif zone["type"] == "DLIB": + self.dlib = zone["name"] + + self.job1 = """//GIMUNZIP EXEC PGM=GIMUNZIP,PARM='HASH=NO' //SYSUT3 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1)) //SYSUT4 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1)) //SMPWKDIR DD PATH='{0}/' @@ -56,15 +63,15 @@ def __init__(self, url, user, password, system, hlq, jobst1, jobst2, volume, tzo //SYSIN DD * -""".format(work_mount,self.pswi_path,self.volume) - self.job1_end = """ +""".format(self.work_mount, self.pswi_path, self.volume) + self.job1_end = """ /* """ - self.job2 = """//RENAME1 EXEC PGM=IDCAMS,REGION=0M + self.job2 = """//RENAME1 EXEC PGM=IDCAMS,REGION=0M //SYSPRINT DD SYSOUT=* //SYSIN DD * """ - self.job3 = """//UPDZONES EXEC PGM=GIMSMP,REGION=0M, + self.job3 = """//UPDZONES EXEC PGM=GIMSMP,REGION=0M, // PARM='CSI={0}' //SMPLOG DD SYSOUT=* //SMPLOGA DD SYSOUT=* @@ -74,7 +81,7 @@ def __init__(self, url, user, password, system, hlq, jobst1, jobst2, volume, tzo //SMPPTS DD UNIT=SYSALLDA,SPACE=(TRK,(1,1,5)) //SMPCNTL DD * """.format(self.new_name(self.definition["globalzone"])) - self.job3_global = """ SET BOUNDARY(GLOBAL). + self.job3_global = """ SET BOUNDARY(GLOBAL). UCLIN. REP GLOBALZONE ZONEINDEX( @@ -82,42 +89,151 @@ def __init__(self, url, user, password, system, hlq, jobst1, jobst2, volume, tzo ({1},{2},DLIB) ). """.format(self.tzone, self.dzone, self.new_name(self.definition["globalzone"])) - - self.job3_target = """ SET BOUNDARY({0}). + + self.job3_target = """ SET BOUNDARY({0}). UCLIN. REP TZONE({0}) RELATED({1}). """.format(self.tzone, self.dzone) - - self.job3_path = """ ZONEEDIT DDDEF. + + self.job3_path = "" + if self.version >= 9: + self.job3_path = """ REP DDDEF({0}) PATH( + '{1}' + ). +""".format(self.no_dddef, self.new_mountp + "/") + else: + self.job3_path = """ ZONEEDIT DDDEF. CHANGE PATH( '{0}'*, '{1}'*). ENDZONEEDIT. """.format(self.old_mountp, self.new_mountp) - self.job3_endzone = " ENDUCL.\n" - self.job3_distribution = """ SET BOUNDARY({0}). + self.job3_endzone = " ENDUCL.\n" + self.job3_distribution = """ SET BOUNDARY({0}). UCLIN. REP DZONE({0}) RELATED({1}). """.format(self.dzone, self.tzone) + + self.zfs_job = """//ALLOCDS EXEC PGM=IDCAMS,COND=(0,LT) +//SYSPRINT DD SYSOUT=* +//SYSIN DD * + DEFINE CLUSTER( + + NAME({0}) + + CYLINDERS({1},{2}) + + VOLUME({3}) + + ZFS + + SHAREOPTIONS(2)) +/* +//MOUNT1 EXEC PGM=BPXBATCH,COND=(0,LT) +//STDOUT DD SYSOUT=* +//STDERR DD SYSOUT=* +//STDPARM DD * +SH ; +dsn='{0}'; +mpdir={4}/$dsn; +if [ -e "$mpdir" ]; then; + rm -r $mpdir; +fi; +if [ ! -e "$mpdir" ]; then; + echo "Work directory $mpdir will be created."; + umask 077 ; + mkdir -p -m 700 "$mpdir"; + rc=$?; + if [ $rc -ne 0 ]; then; + echo "** mkdir command failure: rc=$rc"; + exit $rc; + fi; +fi; +echo "Format the file system $dsn."; +zfsadm format -aggregate $dsn; +rc=$?; +if [ $rc -ne 0 ]; then; + echo "** zfsadm format command failure: rc=$rc"; + exit $rc; +fi; +echo "Mount $dsn on $mpdir."; +/usr/sbin/mount -t ZFS -s nosecurity -f $dsn $mpdir; +if [ $rc -ne 0 ]; then; + echo "** mount command failure: rc=$rc"; + exit $rc; +fi; +mkdir -p {4}/workdir; +/* +//UNZIP EXEC PGM=GIMUNZIP,PARM='HASH=NO',COND=(0,LT) +//SYSUT3 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1)) +//SYSUT4 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1)) +//SMPWKDIR DD PATH='{4}/workdir' +//SMPOUT DD SYSOUT=* +//SYSPRINT DD SYSOUT=* +//SMPDIR DD PATHDISP=KEEP, +// PATH='{5}' +//SYSIN DD * + + + +/* + """.format(self.new_zfs + ".#", int(self.tracks / 15), int(self.secondary / 15), self.volume, self.work_mount, + self.pswi_path, self.zfs_archid, self.work_mount + "/" + self.new_zfs + ".#") + + def create_zfs(self): + new_zfs = {"cylsPri": int(self.tracks / 15), "cylsSec": int(self.secondary / 15), "volumes": [self.volume]} + new_zfs_url = "{0}/zosmf/restfiles/mfs/zfs/{1}".format(self.url, self.new_zfs + ".%23") + new_zfs_resp = requests.post(new_zfs_url, headers=self.headers, auth=(user, password), data=json.dumps(new_zfs), + verify=False) + if new_zfs_resp.status_code != 201: + print("Status code: {0}".format(new_zfs_resp.status_code)) + raise requests.exceptions.RequestException(new_zfs_resp.text) + + def create_directory(self, dir_name): + dir_name = self.work_mount + "/" + self.new_zfs + ".%23" + dir_parms = {"type": "directory", "mode": "rwxr-xrwx"} + dir_url = "{0}/zosmf/restfiles/fs{1}".format(self.url, dir_name) + dir_resp = requests.post(dir_url, headers=self.headers, auth=(user, password), data=json.dumps(dir_parms), + verify=False) + + if dir_resp.status_code != 201: + print("Status code: {0}".format(dir_resp.status_code)) + raise requests.exceptions.RequestException(dir_resp.text) + + def mount(self, dir=None, zfs=None, action="mount"): + if dir is None and zfs is None: + dir = self.work_mount + "/" + self.new_zfs + ".#" + zfs = self.new_zfs + ".%23" + action = "unmount" + elif dir is None or zfs is None: + raise TypeError("Wrong arguments") + + mount_parms = {"action": action, "mount-point": dir, "fs-type": "zFS", "mode": "rdwr"} + mount_url = "{0}/zosmf/restfiles/mfs/{1}".format(self.url, zfs) + mount_resp = requests.put(mount_url, headers=self.headers, auth=(user, password), data=json.dumps(mount_parms), + verify=False) + + if mount_resp.status_code != 204: + print("Status code: {0}".format(mount_resp.status_code)) + raise requests.exceptions.RequestException(mount_resp.text) - def archdef(self, dataset): - if dataset["dsname"].endswith(".CSI"): - new_name = self.new_name(dataset["dsname"]) - else: - new_name = self.new_name(dataset["dsname"]) + ".#" - return """= 9: + return "" + else: + new_name = self.new_name(dataset["dsname"]) + ".#" + return """ """.format(dataset["archid"], new_name, self.volume) - - def new_name(self, dsname): - return self.hlq + dsname[dsname.rfind("."):] - - def listcat(self, dataset): - final_name = self.new_name(dataset) - new_name = final_name + ".#" - lstcat = """ LISTCAT - + + def new_name(self, dsname): + return self.hlq + dsname[dsname.rfind("."):] + + def listcat(self, dataset): + final_name = self.new_name(dataset) + new_name = final_name + ".#" + lstcat = """ LISTCAT - ENTRY({0}) IF LASTCC = 0 THEN DO ALTER - @@ -127,149 +243,160 @@ def listcat(self, dataset): IF LASTCC = 0 THEN SET MAXCC = 0 ELSE CANCEL """.format(new_name, final_name) - if dataset.endswith(".ZFS"): - self.zfs = final_name - zfs = """ + if dataset.endswith(".ZFS"): + self.zfs = final_name + zfs = """ ALTER - {0}.* - NEWNAME({1}.*)""".format(new_name, final_name) - return lstcat.replace("|zfs|",zfs) - else: - return lstcat.replace("|zfs|", "") - - def zone_template(self, dataset, zone): - dddef_templ = "" - if dataset["zonedddefs"] is not None: - for zoneddef in dataset["zonedddefs"]: - if zoneddef["zone"] == zone: - for dddef in zoneddef["dddefs"]: - if dddef["dddef"] == self.no_dddef: - continue - dddef_templ = dddef_templ + """ REP DDDEF({0}) + return lstcat.replace("|zfs|", zfs) + else: + return lstcat.replace("|zfs|", "") + + def zone_template(self, dataset, zone): + dddef_templ = "" + if dataset["zonedddefs"] is not None: + for zoneddef in dataset["zonedddefs"]: + if zoneddef["zone"] == zone: + for dddef in zoneddef["dddefs"]: + if dddef["dddef"] == self.no_dddef: + continue + dddef_templ = dddef_templ + """ REP DDDEF({0}) DATASET({1}) VOLUME() UNIT(). -""".format(dddef["dddef"],self.new_name(dataset["dsname"])) - return dddef_templ - - def first_job(self): - jcl = self.jobst1 + self.jobst2 + self.job1 - for dataset in self.datasets: - jcl = jcl + self.archdef(dataset) - return jcl + self.job1_end - - def second_job(self): - jcl = self.jobst1 + self.jobst2 + self.job2 - for dataset in self.datasets: - if dataset["dsname"].endswith(".CSI"): - continue - jcl = jcl + self.listcat(dataset["dsname"]) - return jcl + "//*" - - def third_job(self): - jcl = self.jobst1 + self.jobst2 + self.job3 + self.job3_global - for dataset in self.datasets: - jcl = jcl + self.zone_template(dataset, "GLOBAL") - jcl = jcl + self.job3_endzone + self.job3_target - for dataset in self.datasets: - jcl = jcl + self.zone_template(dataset, self.target) - jcl = jcl + self.job3_endzone + self.job3_path + self.job3_distribution - for dataset in self.datasets: - jcl = jcl + self.zone_template(dataset, self.dlib) - return jcl + self.job3_endzone + "/*" - - def create_swi(self): - mount_parms = {"action": "mount", "mount-point": self.new_mountp, "fs-type": "zFS", "mode": "rdwr"} - mount_url = "{0}/zosmf/restfiles/mfs/{1}".format(self.url, self.zfs) - mount_resp = requests.put(mount_url, headers=self.headers, auth=(user, password), data=json.dumps(mount_parms), - verify=False) - if mount_resp.status_code != 204: - print("Status code: {0}".format(mount_resp.status_code)) - raise requests.exceptions.RequestException(mount_resp.text) - - parms = { - "name": self.swi_name, - "system": self.system, - "description": "Zowe Deploy test", - "globalzone": self.new_name(self.definition["globalzone"]), - "targetzones": [self.target], - "workflows": [ - {"name": "ZOWE Mount Workflow", - "description": "This workflow performs mount action of ZOWE zFS.", - "location": {"dsname": self.hlq + ".WORKFLOW(ZWEWRF02)"}}, - {"name": "ZOWE Configuration of Zowe 3.0", - "description": "This workflow configures Zowe v3.0.", - "location": {"dsname": self.hlq + ".WORKFLOW(ZWECONF)"}}, - {"name":"ZOWE Creation of CSR request workflow", - "description":"This workflow creates a certificate sign request.", - "location": {"dsname": self.hlq + ".WORKFLOW(ZWECRECR)"}}, - {"name":"ZOWE Sign a CSR request", - "description":"This workflow signs the certificate sign request by a local CA.", - "location": {"dsname": self.hlq + ".WORKFLOW(ZWESIGNC)"}}, - {"name":"ZOWE Load Authentication Certificate into ESM", - "description":"This workflow loads a signed client authentication certificate to the ESM.", - "location": {"dsname": self.hlq + ".WORKFLOW(ZWELOADC)"}}, - {"name":"ZOWE Define key ring and certificates", - "description":"This workflow defines key ring and certificates for Zowe.", - "location": {"dsname": self.hlq + ".WORKFLOW(ZWEKRING)"}} - ] - } - swi_url = "{0}/zosmf/swmgmt/swi".format(self.url) - swi_resp = requests.post(swi_url, headers=self.headers, auth=(user, password), data=json.dumps(parms), verify=False) - if swi_resp.status_code != 200: - raise requests.exceptions.RequestException(swi_resp.text) - - prod_url = "{0}/zosmf/swmgmt/swi/{1}/{2}/products".format(self.url, self.system, self.swi_name) - prod_resp = requests.put(prod_url, headers=self.headers, auth=(user, password), verify=False) - if prod_resp.status_code != 202: - raise requests.exceptions.RequestException(prod_resp.text) - status = "" - while status != "complete": - starus_url = prod_resp.json()["statusurl"] - status_resp= requests.get(starus_url, headers=self.headers, auth=(user, password), verify=False) - if status_resp.status_code != 200: - raise requests.exceptions.RequestException(status_resp.text) - status = status_resp.json()["status"] - +""".format(dddef["dddef"], self.new_name(dataset["dsname"])) + return dddef_templ + + def first_job(self): + jcl = self.jobst1 + self.jobst2 + self.job1 + for dataset in self.datasets: + jcl = jcl + self.archdef(dataset) + return jcl + self.job1_end + + def zfsInstall_job(self): + return self.jobst1 + self.jobst2 + self.zfs_job + + def second_job(self): + jcl = self.jobst1 + self.jobst2 + self.job2 + for dataset in self.datasets: + if dataset["dsname"].endswith(".CSI"): + continue + jcl = jcl + self.listcat(dataset["dsname"]) + return jcl + "//*" + + def third_job(self): + jcl = self.jobst1 + self.jobst2 + self.job3 + self.job3_global + for dataset in self.datasets: + jcl = jcl + self.zone_template(dataset, "GLOBAL") + jcl = jcl + self.job3_endzone + self.job3_target + for dataset in self.datasets: + jcl = jcl + self.zone_template(dataset, self.target) + if self.version >= 9: + jcl = jcl + self.job3_path + self.job3_endzone + self.job3_distribution + else: + jcl = jcl + self.job3_endzone + self.job3_path + self.job3_distribution + for dataset in self.datasets: + jcl = jcl + self.zone_template(dataset, self.dlib) + return jcl + self.job3_endzone + "/*" + + def create_swi(self): + self.mount(self.new_mountp, self.zfs, "mount") + + parms = { + "name": self.swi_name, + "system": self.system, + "description": "Zowe Deploy test", + "globalzone": self.new_name(self.definition["globalzone"]), + "targetzones": [self.target], + "workflows": [ + {"name": "ZOWE Mount Workflow", + "description": "This workflow performs mount action of ZOWE zFS.", + "location": {"dsname": self.hlq + ".WORKFLOW(ZWEWRF02)"}}, + {"name": "Stand-alone Zowe API ML Configuration", + "description": "This workflow configures only API ML for Zowe 3.0.", + "location": {"dsname": self.hlq + ".WORKFLOW(ZWEAMLCF)"}}, + {"name": "Full Zowe server-side configuration for Zowe 3.0", + "description": "This workflow configures all Zowe server-side components for Zowe v3.0.", + "location": {"dsname": self.hlq + ".WORKFLOW(ZWECONF)"}}, + {"name": "ZOWE Creation of CSR request workflow", + "description": "This workflow creates a certificate sign request.", + "location": {"dsname": self.hlq + ".WORKFLOW(ZWECRECR)"}}, + {"name": "ZOWE Sign a CSR request", + "description": "This workflow signs the certificate sign request by a local CA.", + "location": {"dsname": self.hlq + ".WORKFLOW(ZWESIGNC)"}}, + {"name": "ZOWE Load Authentication Certificate into ESM", + "description": "This workflow loads a signed client authentication certificate to the ESM.", + "location": {"dsname": self.hlq + ".WORKFLOW(ZWELOADC)"}}, + {"name": "ZOWE Define key ring and certificates", + "description": "This workflow defines key ring and certificates for Zowe.", + "location": {"dsname": self.hlq + ".WORKFLOW(ZWEKRING)"}} + ] + } + swi_url = "{0}/zosmf/swmgmt/swi".format(self.url) + swi_resp = requests.post(swi_url, headers=self.headers, auth=(user, password), data=json.dumps(parms), verify=False) + if swi_resp.status_code != 200: + raise requests.exceptions.RequestException(swi_resp.text) + + prod_url = "{0}/zosmf/swmgmt/swi/{1}/{2}/products".format(self.url, self.system, self.swi_name) + prod_resp = requests.put(prod_url, headers=self.headers, auth=(user, password), verify=False) + if prod_resp.status_code != 202: + raise requests.exceptions.RequestException(prod_resp.text) + status = "" + while status != "complete": + starus_url = prod_resp.json()["statusurl"] + status_resp = requests.get(starus_url, headers=self.headers, auth=(user, password), verify=False) + if status_resp.status_code != 200: + raise requests.exceptions.RequestException(status_resp.text) + status = status_resp.json()["status"] + + if __name__ == "__main__": - url = os.environ['ZOSMF_URL'] + ":" + os.environ['ZOSMF_PORT'] # Url and port of the z/OSMF server - # # auth - user = os.environ['ZOSMF_USER'] # z/OSMF user - password = os.environ['ZOSMF_PASS'] # Password for z/OSMF - system = os.environ['ZOSMF_SYSTEM'] # z/OSMF nickname for the system where the PSWI will be deployed - hlq = os.environ['TEST_HLQ'] # HLQ for new datasets - mount = os.environ['TEST_MOUNT'] # New mount point for ZFS #newmount - jobst1 = os.environ['JOBST1'] # Job statement - jobst2 = os.environ['JOBST2'] # Sysaff - volume = os.environ['VOLUME'] # Volum where to store datasets - work_path = os.environ['WORK_MOUNT'] # SMP work directory - tzone = os.environ['TZONE'] # Target zone - dzone = os.environ['DZONE'] # Dlib - pswi_path = os.environ['EXPORT'] # Path to unzipped PSWI - swi_name = os.environ['DEPLOY_NAME'] # Name of the software instance to be created - - deploy = Deploy_test(url, user, password, system, hlq, jobst1, jobst2, volume, tzone, dzone, mount, pswi_path, work_path, swi_name) + url = os.environ['ZOSMF_URL'] + ":" + os.environ['ZOSMF_PORT'] # Url and port of the z/OSMF server + # # auth + user = os.environ['ZOSMF_USER'] # z/OSMF user + password = os.environ['ZOSMF_PASS'] # Password for z/OSMF + system = os.environ['ZOSMF_SYSTEM'] # z/OSMF nickname for the system where the PSWI will be deployed + hlq = os.environ['TEST_HLQ'] # HLQ for new datasets + mount = os.environ['TEST_MOUNT'] # New mount point for ZFS #newmount + jobst1 = os.environ['JOBST1'] # Job statement + jobst2 = os.environ['JOBST2'] # Sysaff + volume = os.environ['VOLUME'] # Volum where to store datasets + work_path = os.environ['WORK_MOUNT'] # SMP work directory + tzone = os.environ['TZONE'] # Target zone + dzone = os.environ['DZONE'] # Dlib + pswi_path = os.environ['EXPORT'] # Path to unzipped PSWI + swi_name = os.environ['DEPLOY_NAME'] # Name of the software instance to be created - first = deploy.first_job() - second = deploy.second_job() - third = deploy.third_job() - - try: - submit_jcl = glob.glob('./*/submit_jcl.sh')[0] - except IndexError: - raise FileNotFoundError("\"submit_jcl.sh\" for submitting JCLs wasn't found. Make sure that it is in a subfolder of {0}".format(os.getcwd())) - - ec1 = subprocess.call(["sh", submit_jcl , first]) - if ec1 != 0: - raise OSError("The first job failed.") - ec2 = subprocess.call(["sh", submit_jcl, second]) - if ec2 != 0: - raise OSError("The second job failed.") - ec3 = subprocess.call(["sh", submit_jcl, third]) - if ec3 != 0: - raise OSError("The third job failed.") - - deploy.create_swi() - print("Portable software instance deployed successfully!") + deploy = Deploy_test(url, user, password, system, hlq, jobst1, jobst2, volume, tzone, dzone, mount, pswi_path, + work_path, swi_name) + + unzip_job = deploy.first_job() + install_zfs = deploy.zfsInstall_job() + rename_datasets = deploy.second_job() + update_csi = deploy.third_job() + + try: + submit_jcl = glob.glob('./*/submit_jcl.sh')[0] + except IndexError: + raise FileNotFoundError( + "\"submit_jcl.sh\" for submitting JCLs wasn't found. Make sure that it is in a subfolder of {0}".format( + os.getcwd())) + + unzip_rc = subprocess.call(["sh", submit_jcl, unzip_job]) + if unzip_rc != 0: + raise OSError("The unzip datasets job failed.") + install_rc = subprocess.call(["sh", submit_jcl, install_zfs]) + if install_rc != 0: + raise OSError("The install zFS datasets job failed.") + deploy.mount() # unmount + rename_rc = subprocess.call(["sh", submit_jcl, rename_datasets]) + if rename_rc != 0: + raise OSError("The rename datasets job failed.") + update_rc = subprocess.call(["sh", submit_jcl, update_csi]) + if update_rc != 0: + raise OSError("The update CSI job failed.") + deploy.create_swi() + print("Portable software instance deployed successfully!") -#todo: function for removing just the HLQ which all the old datasets have same -> needed only for internal usage +# todo: function for removing just the HLQ which all the old datasets have same -> needed only for internal usage diff --git a/pswi/scripts/spool_files.sh b/pswi/scripts/spool_files.sh index ff8fd0df4f..29b8ef107c 100644 --- a/pswi/scripts/spool_files.sh +++ b/pswi/scripts/spool_files.sh @@ -1,22 +1,23 @@ # $1 = JOBNAME # $2 = JOBID - + IDENTIFIER="${1}/${2}" JOBNAME=${1} +JOB_OUTPUT_DIR=$LOG_DIR/jobs/output +JOB_OUTPUT_FILE=$JOB_OUTPUT_DIR/$JOBNAME_$2 -RESP=`curl -s ${BASE_URL}/zosmf/restjobs/jobs/${IDENTIFIER}/files -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` +RESP=$(curl -s ${BASE_URL}/zosmf/restjobs/jobs/${IDENTIFIER}/files -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) sh scripts/check_response.sh "$RESP" $? -if [ $? -gt 0 ];then exit $?;fi +if [ $? -gt 0 ]; then exit $?; fi echo $RESP | sed 's/},/},\n/g' | grep -o '"records-url":".*records"' | cut -f4 -d\" | tr -d '\' 2>/dev/null 1>urls - -mkdir -p $JOBNAME -while read -r line -do - curl -s $line?mode=text -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS >> $IDENTIFIER -done < urls - +mkdir -p $JOB_OUTPUT_DIR + +while read -r line; do + curl -s $line?mode=text -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS >>$JOB_OUTPUT_FILE +done /dev/null` -if [ -z "$JOB_STATUS_URL" ] -then - echo "No response from the REST API call." >> report.txt +JOB_STATUS_URL=$(echo $RESP | grep -o '"url":".*"' | cut -f4 -d\" | tr -d '\' 2>/dev/null) +if [ -z "$JOB_STATUS_URL" ]; then + echo "No response from the REST API call." >>$LOG_DIR/report.txt exit -1 fi -JOBID=`echo $RESP | grep -o '"jobid":".*"' | cut -f4 -d\"` -JOBNAME=`echo $RESP | grep -o '"jobname":".*"' | cut -f4 -d\"` +JOBID=$(echo $RESP | grep -o '"jobid":".*"' | cut -f4 -d\") +JOBNAME=$(echo $RESP | grep -o '"jobname":".*"' | cut -f4 -d\") echo "Job ${JOBNAME} ${JOBID} submitted." @@ -23,14 +25,12 @@ echo "Job ${JOBNAME} ${JOBID} submitted." echo "Invoking REST API to check if the job ${JOBNAME} ${JOBID} has finished." STATUS="" -until [ "$STATUS" = "OUTPUT" ] -do - RESP=`curl -s $JOB_STATUS_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` +until [ "$STATUS" = "OUTPUT" ]; do + RESP=$(curl -s $JOB_STATUS_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) sh scripts/check_response.sh "${RESP}" $? - STATUS=`echo $RESP | grep -o '"status":".*"' | cut -f4 -d\"` + STATUS=$(echo $RESP | grep -o '"status":".*"' | cut -f4 -d\") echo "The status of the job is ${STATUS}" - if [ -f EXPJCL ] # If file with export JCL exists that mean that export JCL was submitted and it needs to wait longer - then + if [ -f EXPJCL ]; then # If file with export JCL exists that mean that export JCL was submitted and it needs to wait longer sleep 30 else sleep 5 @@ -38,18 +38,19 @@ do done # Check return code -RC=`echo $RESP | grep -o '"retcode":".*"' | cut -f4 -d\"` +RC=$(echo $RESP | grep -o '"retcode":".*"' | cut -f4 -d\") echo "Return code of the job ${JOBNAME} ${JOBID} is ${RC}." - + # Download spool files echo "Downloading spool files." sh scripts/spool_files.sh $JOBNAME $JOBID - -if [ "$RC" = "CC 0000" ] -then + +echo "$JCL" >>$JCL_LOG_DIR/JCL_$JOBNAME_$JOBID + +if [ "$RC" = "CC 0000" ]; then echo "${JOBNAME} ${JOBID} was completed." else - echo "${JOBNAME} ${JOBID} failed." >> report.txt - cat $JOBNAME/$JOBID >> report.txt + echo "${JOBNAME} ${JOBID} failed." >>$LOG_DIR/report.txt + cat $LOG_DIR/jobs/output/$JOBNAME_$JOBID >>$LOG_DIR/report.txt exit -1 -fi +fi diff --git a/pswi/scripts/tmp_mounts.sh b/pswi/scripts/tmp_mounts.sh index eb44340d58..9f8d55e724 100644 --- a/pswi/scripts/tmp_mounts.sh +++ b/pswi/scripts/tmp_mounts.sh @@ -6,57 +6,50 @@ MOUNT=${2} MOUNTED=false echo "Checking if file system ${ZFS} is mounted." -RESP=`curl -s "${BASE_URL}/zosmf/restfiles/mfs?fsname=${ZFS}" -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -MOUNTP=`echo $RESP | grep -o '"mountpoint":".*"' | cut -f4 -d\"` +RESP=$(curl -s "${BASE_URL}/zosmf/restfiles/mfs?fsname=${ZFS}" -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) +MOUNTP=$(echo $RESP | grep -o '"mountpoint":".*"' | cut -f4 -d\") NEW_ZFS_JSON='{"cylsPri":2000,"cylsSec": 140,"volumes":[ "'${VOLUME}'" ]}' - - -if [ -n "$MOUNTP" ] -then + +if [ -n "$MOUNTP" ]; then # Check if temp zFS is mounted to given mount point - if [ "$MOUNTP" = "$MOUNT" ] - then + if [ "$MOUNTP" = "$MOUNT" ]; then echo "${MOUNT} with zFS ${ZFS} mounted will be used as is." MOUNTED=true else - echo "The file system ${ZFS} exists but is mounted to different mount point(${MOUNTP})." >> report.txt - echo "Use different name of zFS or ${MOUNTP} for mount point." >> report.txt + echo "The file system ${ZFS} exists but is mounted to different mount point(${MOUNTP})." >>$LOG_DIR/report.txt + echo "Use different name of zFS or ${MOUNTP} for mount point." >>$LOG_DIR/report.txt exit -1 fi else echo "Temporary zFS isn't mounted. Now checking if mount point has any other zFS mounted." - RESP=`curl -s "${BASE_URL}/zosmf/restfiles/mfs?path=${MOUNT}" -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` + RESP=$(curl -s "${BASE_URL}/zosmf/restfiles/mfs?path=${MOUNT}" -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) sh scripts/check_response.sh "${RESP}" $? - if [ $? -gt 0 ];then exit -1;fi - MOUNTZFS=`echo $RESP | grep -o "name":".*" | cut -f4 -d\"` - if [ -n "$MOUNTZFS" ] - then + if [ $? -gt 0 ]; then exit -1; fi + MOUNTZFS=$(echo $RESP | grep -o "name":".*" | cut -f4 -d\") + if [ -n "$MOUNTZFS" ]; then # If zFS is not mounted to the mount point then this mount point has different zFS - echo "The mount point ${MOUNT} has different zFS (${MOUNTZFS}) mounted." >> report.txt - echo "Use different mount point (not ${MOUNT})." >> report.txt - echo "Or use ${MOUNTZFS} for zFS." >> report.txt + echo "The mount point ${MOUNT} has different zFS (${MOUNTZFS}) mounted." >>$LOG_DIR/report.txt + echo "Use different mount point (not ${MOUNT})." >>$LOG_DIR/report.txt + echo "Or use ${MOUNTZFS} for zFS." >>$LOG_DIR/report.txt exit -1 fi fi - -if [ "$MOUNTED" = false ] -then +if [ "$MOUNTED" = false ]; then # Check if data set exists echo "Checking if temporary zFS ${ZFS} exists." - RESP=`curl -s "${BASE_URL}/zosmf/restfiles/ds?dslevel=${ZFS}" -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` + RESP=$(curl -s "${BASE_URL}/zosmf/restfiles/ds?dslevel=${ZFS}" -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) sh scripts/check_response.sh "${RESP}" $? - if [ $? -gt 0 ];then exit -1;fi - ZFS_COUNT=`echo $RESP | grep -o '"returnedRows":[0-9]*' | cut -f2 -d:` - if [ "$ZFS_COUNT" = "0" ] - then + if [ $? -gt 0 ]; then exit -1; fi + ZFS_COUNT=$(echo $RESP | grep -o '"returnedRows":[0-9]*' | cut -f2 -d:) + if [ "$ZFS_COUNT" = "0" ]; then # Create new zFS if not echo "${ZFS} does not exists." echo "Creating new zFS ${ZFS}." - RESP=`curl -s "${BASE_URL}/zosmf/restfiles/mfs/zfs/${ZFS}" -k -X "POST" -d "$NEW_ZFS_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` + RESP=$(curl -s "${BASE_URL}/zosmf/restfiles/mfs/zfs/${ZFS}" -k -X "POST" -d "$NEW_ZFS_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) sh scripts/check_response.sh "${RESP}" $? - if [ $? -gt 0 ];then exit -1;fi + if [ $? -gt 0 ]; then exit -1; fi else #TODO: also check the first dsname because it can be something that just has tmp_zfs as HLQ echo @@ -64,25 +57,25 @@ then # Mount zFS to MOUNT echo "Mounting zFS ${ZFS} to ${MOUNT} mount point with JCL because REST API doesn't allow AGGRGROW parm." -echo ${JOBST1} > JCL -echo ${JOBST2} >> JCL -echo "//MKDIR EXEC PGM=BPXBATCH" >> JCL -echo "//STDOUT DD SYSOUT=*" >> JCL -echo "//STDERR DD SYSOUT=*" >> JCL -echo "//STDPARM DD *" >> JCL -echo "SH mkdir -p ${MOUNT}" >> JCL -echo "/*" >> JCL -echo "//MNT1ZFS1 EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >> JCL -echo "//SYSTSPRT DD SYSOUT=*" >> JCL -echo "//SYSTSOUT DD SYSOUT=*" >> JCL -echo "//SYSTSIN DD * " >> JCL -echo "MOUNT FILESYSTEM('${ZFS}') + " >> JCL -echo "TYPE(ZFS) MODE(RDWR) + " >> JCL -echo "PARM('AGGRGROW') + " >> JCL -echo "MOUNTPOINT('${MOUNT}') " >> JCL -echo "/*" >> JCL + echo ${JOBST1} >JCL + echo ${JOBST2} >>JCL + echo "//MKDIR EXEC PGM=BPXBATCH" >>JCL + echo "//STDOUT DD SYSOUT=*" >>JCL + echo "//STDERR DD SYSOUT=*" >>JCL + echo "//STDPARM DD *" >>JCL + echo "SH mkdir -p ${MOUNT}" >>JCL + echo "/*" >>JCL + echo "//MNT1ZFS1 EXEC PGM=IKJEFT01,REGION=4096K,DYNAMNBR=50" >>JCL + echo "//SYSTSPRT DD SYSOUT=*" >>JCL + echo "//SYSTSOUT DD SYSOUT=*" >>JCL + echo "//SYSTSIN DD * " >>JCL + echo "MOUNT FILESYSTEM('${ZFS}') + " >>JCL + echo "TYPE(ZFS) MODE(RDWR) + " >>JCL + echo "PARM('AGGRGROW') + " >>JCL + echo "MOUNTPOINT('${MOUNT}') " >>JCL + echo "/*" >>JCL - sh scripts/submit_jcl.sh "`cat JCL`" - if [ $? -gt 0 ];then exit -1;fi + sh scripts/submit_jcl.sh "$(cat JCL)" + if [ $? -gt 0 ]; then exit -1; fi rm JCL fi diff --git a/pswi/scripts/wf_run_test.sh b/pswi/scripts/wf_run_test.sh index e31a8e3c19..ce60402338 100755 --- a/pswi/scripts/wf_run_test.sh +++ b/pswi/scripts/wf_run_test.sh @@ -21,17 +21,16 @@ WF_NAME="Testing_workflows" CREATE_WF_URL="${BASE_URL}/zosmf/workflow/rest/1.0/workflows" WF_LIST_URL="${BASE_URL}/zosmf/workflow/rest/1.0/workflows?owner=${ZOSMF_USER}&workflowName=${WF_NAME}" -# JSONs -if [ -n "$INPUT_FILE" ] -then -ADD_WORKFLOW_JSON='{"workflowName":"'$WF_NAME'", +# JSONs +if [ -n "$INPUT_FILE" ]; then + ADD_WORKFLOW_JSON='{"workflowName":"'$WF_NAME'", "workflowDefinitionFile":"'${WF_DEF_FILE}'", "variableInputFile":"'${INPUT_FILE}'", "system":"'$ZOSMF_SYSTEM'", "owner":"'$ZOSMF_USER'", "assignToOwner" :true}' else -ADD_WORKFLOW_JSON='{"workflowName":"'$WF_NAME'", + ADD_WORKFLOW_JSON='{"workflowName":"'$WF_NAME'", "workflowDefinitionFile":"'${WF_DEF_FILE}'", "system":"'$ZOSMF_SYSTEM'", "owner":"'$ZOSMF_USER'", @@ -42,75 +41,67 @@ set -x # Get workflowKey for the workflow owned by user echo "Get workflowKey for the workflow if it exists." -RESP=`curl -s $WF_LIST_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -WFKEY=`echo $RESP | grep -o '"workflowKey":".*"' | cut -f4 -d\"` +RESP=$(curl -s $WF_LIST_URL -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) +WFKEY=$(echo $RESP | grep -o '"workflowKey":".*"' | cut -f4 -d\") -if [ -n "$WFKEY" ] -then -WORKFLOW_URL="${CREATE_WF_URL}/${WFKEY}" +if [ -n "$WFKEY" ]; then + WORKFLOW_URL="${CREATE_WF_URL}/${WFKEY}" -echo "Deleting the workflow." -RESP=`curl -s $WORKFLOW_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -sh scripts/check_response.sh "${RESP}" $? + echo "Deleting the workflow." + RESP=$(curl -s $WORKFLOW_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) + sh scripts/check_response.sh "${RESP}" $? fi # Create workflow with REST API echo 'Invoking REST API to create the workflow.' -RESP=`curl -s $CREATE_WF_URL -k -X "POST" -d "$ADD_WORKFLOW_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` +RESP=$(curl -s $CREATE_WF_URL -k -X "POST" -d "$ADD_WORKFLOW_JSON" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) sh scripts/check_response.sh "${RESP}" $? -if [ $? -gt 0 ];then exit -1;fi -WFKEY=`echo $RESP | grep -o '"workflowKey":".*"' | cut -f4 -d\"` +if [ $? -gt 0 ]; then exit -1; fi +WFKEY=$(echo $RESP | grep -o '"workflowKey":".*"' | cut -f4 -d\") WORKFLOW_URL="${CREATE_WF_URL}/${WFKEY}" -if [ "$run" = "run" ] -then -# Run workflow -echo "Invoking REST API to start the workflow." - -RESP=`curl -s ${WORKFLOW_URL}/operations/start -k -X "PUT" -d "{}" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -sh scripts/check_response.sh "${RESP}" $? -if [ $? -gt 0 ];then exit -1;fi -STATUS="" -until [ "$STATUS" = "FINISHED" ] -do -sleep 20 - - -# Get the result of the workflow -RESP=`curl -s ${WORKFLOW_URL} -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` -if [ $? -gt 0 ];then exit -1;fi -STATUS_NAME=`echo $RESP | grep -o '"statusName":".*"' | cut -f4 -d\"` - -if [ "$STATUS_NAME" = "in-progress" ] -then - echo "Workflow ended with an error." >> report.txt - echo $RESP >> report.txt - echo "Checking if the workflow is ZWECONF" >> report.txt - if [ "$ZWECONF" = "ZWECONF" ] - then - STEP_NAME=`echo $RESP | grep -o '"currentStepName":".*"' | cut -f4 -d\"` - if [ "$STEP_NAME" = "init_zowe" ] - then - echo "The workflow is ZWECONF and should end in step 'init_zowe'" +if [ "$run" = "run" ]; then + # Run workflow + echo "Invoking REST API to start the workflow." + + RESP=$(curl -s ${WORKFLOW_URL}/operations/start -k -X "PUT" -d "{}" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) + sh scripts/check_response.sh "${RESP}" $? + if [ $? -gt 0 ]; then exit -1; fi + STATUS="" + until [ "$STATUS" = "FINISHED" ]; do + sleep 20 + + # Get the result of the workflow + RESP=$(curl -s ${WORKFLOW_URL} -k -X "GET" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) + if [ $? -gt 0 ]; then exit -1; fi + STATUS_NAME=$(echo $RESP | grep -o '"statusName":".*"' | cut -f4 -d\") + + if [ "$STATUS_NAME" = "in-progress" ]; then + echo "Workflow ended with an error." >>$LOG_DIR/report.txt + echo $RESP >>$LOG_DIR/report.txt + echo "Checking if the workflow is ZWECONF" >>$LOG_DIR/report.txt + if [ "$ZWECONF" = "ZWECONF" ]; then + STEP_NAME=$(echo $RESP | grep -o '"currentStepName":".*"' | cut -f4 -d\") + if [ "$STEP_NAME" = "install_zowe" ]; then + echo "The workflow is ZWECONF and should end in step 'install_zowe', first step of 'zowe_installation_steps'" + STATUS="FINISHED" + else + echo "The workflow is ZWECONF but ended in different step: '$STEP_NAME'" >>$LOG_DIR/report.txt + exit -1 + fi + else + echo "Workflow ended with an error and it is not ZWECONF." >>$LOG_DIR/report.txt + echo $RESP >>$LOG_DIR/report.txt + exit -1 + fi + elif [ "$STATUS_NAME" = "complete" ]; then + echo "Workflow finished successfully." STATUS="FINISHED" - else - echo "The workflow is ZWECONF but ended in different step: '$STEP_NAME'" >> report.txt - exit -1 fi - else - echo "Workflow ended with an error and it is not ZWECONF." >> report.txt - echo $RESP >> report.txt - exit -1 - fi -elif [ "$STATUS_NAME" = "complete" ] -then - echo "Workflow finished successfully." - STATUS="FINISHED" -fi -done + done fi echo "Deleting the workflow." -RESP=`curl -s $WORKFLOW_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS` +RESP=$(curl -s $WORKFLOW_URL -k -X "DELETE" -H "Content-Type: application/json" -H "X-CSRF-ZOSMF-HEADER: A" --user $ZOSMF_USER:$ZOSMF_PASS) sh scripts/check_response.sh "${RESP}" $? diff --git a/schemas/manifest-schema.json b/schemas/manifest-schema.json index ce3f234605..49cdc39ebb 100644 --- a/schemas/manifest-schema.json +++ b/schemas/manifest-schema.json @@ -120,6 +120,10 @@ "type": "string", "description": "This defines extra validations that the component requires other than global validations. It is for runtime purpose, and will be automatically executed each time Zowe is started." }, + "preConfigure": { + "type": "string", + "description": "This defines extra configuration steps before zwe startup code performs its own configuration steps. It is for runtime purpose, and will be automatically executed each time Zowe is started." + }, "configure": { "type": "string", "description": "This defines extra configuration steps before starting the component. It is for runtime purpose, and will be automatically executed each time Zowe is started." diff --git a/schemas/zowe-yaml-schema.json b/schemas/zowe-yaml-schema.json index deadae3492..73747e3591 100644 --- a/schemas/zowe-yaml-schema.json +++ b/schemas/zowe-yaml-schema.json @@ -465,11 +465,11 @@ "description": "Customize your Zowe z/OS JES job.", "properties": { "name": { - "type": "string", + "$ref": "/schemas/v2/server-common#zoweJobname", "description": "Job name of Zowe primary ZWESLSTC started task." }, "prefix": { - "type": "string", + "$ref": "/schemas/v2/server-common#zoweJobname", "description": "A short prefix to customize address spaces created by Zowe job." } } diff --git a/smpe/bld/service/ptf-bucket.txt b/smpe/bld/service/ptf-bucket.txt new file mode 100644 index 0000000000..c7884f8ddd --- /dev/null +++ b/smpe/bld/service/ptf-bucket.txt @@ -0,0 +1,9 @@ +#----------------------------------------------------------------------# +# NOTE FOR PULL REQUEST APPROVER: # +# This file may only be updated when IBM provides more PTF numbers, or # +# when a Release Candidate PTF is promoted. Reject ALL other updates. # +#----------------------------------------------------------------------# +# +# format: - [] +UO90082 UO90083 - IO29468 IO29469 IO29470 +UO90084 UO90085 - IO29471 IO29472 IO29473 diff --git a/tests/installation/src/__tests__/extended/keyring-modes/acf2-keyring.ts b/tests/installation/src/__tests__/extended/keyring-modes/acf2-keyring.ts index 8b740588ee..8a8efd8916 100644 --- a/tests/installation/src/__tests__/extended/keyring-modes/acf2-keyring.ts +++ b/tests/installation/src/__tests__/extended/keyring-modes/acf2-keyring.ts @@ -18,7 +18,7 @@ import { KEYSTORE_MODE_KEYRING, } from '../../../constants'; -const testServer = 'marist-6'; +const testServer = 'marist-9'; const testSuiteName = 'Test convenience build installation with keystore pointing to an ACF2 keyring'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/__tests__/extended/keyring-modes/racf-keyring.ts b/tests/installation/src/__tests__/extended/keyring-modes/racf-keyring.ts index f2399de380..7b91837222 100644 --- a/tests/installation/src/__tests__/extended/keyring-modes/racf-keyring.ts +++ b/tests/installation/src/__tests__/extended/keyring-modes/racf-keyring.ts @@ -18,7 +18,7 @@ import { KEYSTORE_MODE_KEYRING, } from '../../../constants'; -const testServer = 'marist-8'; +const testServer = 'marist-11'; const testSuiteName = 'Test convenience build installation with keystore pointing to a RACF keyring'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/__tests__/extended/keyring-modes/tss-keyring.ts b/tests/installation/src/__tests__/extended/keyring-modes/tss-keyring.ts index fbd1f1f69d..b47a617dca 100644 --- a/tests/installation/src/__tests__/extended/keyring-modes/tss-keyring.ts +++ b/tests/installation/src/__tests__/extended/keyring-modes/tss-keyring.ts @@ -18,7 +18,7 @@ import { KEYSTORE_MODE_KEYRING, } from '../../../constants'; -const testServer = 'marist-7'; +const testServer = 'marist-10'; const testSuiteName = 'Test convenience build installation with keystore pointing to a TSS keyring'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/__tests__/extended/node-versions/node-v18.ts b/tests/installation/src/__tests__/extended/node-versions/node-v22.ts similarity index 85% rename from tests/installation/src/__tests__/extended/node-versions/node-v18.ts rename to tests/installation/src/__tests__/extended/node-versions/node-v22.ts index 4758b24904..8375055f01 100644 --- a/tests/installation/src/__tests__/extended/node-versions/node-v18.ts +++ b/tests/installation/src/__tests__/extended/node-versions/node-v22.ts @@ -5,7 +5,7 @@ * * SPDX-License-Identifier: EPL-2.0 * - * Copyright IBM Corporation 2022 + * Copyright Zowe Contributors 2024 */ import { @@ -15,9 +15,8 @@ import { } from '../../../utils'; import { TEST_TIMEOUT_CONVENIENCE_BUILD } from '../../../constants'; -// Only runs on zzow08 at time of change (04.2023). See cicd-test.yml and make_matrix.sh. const testServer = process.env.TEST_SERVER; -const testSuiteName = 'Test convenience build installation with node.js v18'; +const testSuiteName = 'Test convenience build installation with node.js v22'; describe(testSuiteName, () => { beforeAll(() => { // validate variables @@ -33,7 +32,7 @@ describe(testSuiteName, () => { { 'zowe_build_local': process.env['ZOWE_BUILD_LOCAL'], 'zowe_custom_for_test': 'true', - 'zos_node_home': '/ZOWE/node/node-v18.16.0', + 'zos_node_home': '/ZOWE/node/node-v22.10.0', 'zowe_lock_keystore': 'false', } ); diff --git a/tests/installation/src/__tests__/extended/security-systems/convenience/acf2.ts b/tests/installation/src/__tests__/extended/security-systems/convenience/acf2.ts index 7989dd6204..14df79ca42 100644 --- a/tests/installation/src/__tests__/extended/security-systems/convenience/acf2.ts +++ b/tests/installation/src/__tests__/extended/security-systems/convenience/acf2.ts @@ -18,10 +18,10 @@ import {TEST_TIMEOUT_CONVENIENCE_BUILD} from '../../../../constants'; /** * Define this test should run in a specific worker * - * @worker marist-6 + * @worker marist-9 */ -// hard code to use marist-6 which we started with ACF2 -const testServer = 'marist-6'; +// hard code to use marist-9 which we started with ACF2 +const testServer = 'marist-9'; const testSuiteName = 'Test convenience build installation with ACF2'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/__tests__/extended/security-systems/convenience/racf.ts b/tests/installation/src/__tests__/extended/security-systems/convenience/racf.ts index 8f5a5a4c01..58f8ca56c7 100644 --- a/tests/installation/src/__tests__/extended/security-systems/convenience/racf.ts +++ b/tests/installation/src/__tests__/extended/security-systems/convenience/racf.ts @@ -18,9 +18,9 @@ import {TEST_TIMEOUT_CONVENIENCE_BUILD} from '../../../../constants'; /** * Define this test should run in a specific worker * - * @worker marist-8 + * @worker marist-11 */ -const testServer = 'marist-8'; +const testServer = 'marist-11'; const testSuiteName = 'Test convenience build installation with RACF'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/__tests__/extended/security-systems/convenience/ts.ts b/tests/installation/src/__tests__/extended/security-systems/convenience/ts.ts index 22f339ae6b..cd4e7a1fd8 100644 --- a/tests/installation/src/__tests__/extended/security-systems/convenience/ts.ts +++ b/tests/installation/src/__tests__/extended/security-systems/convenience/ts.ts @@ -18,10 +18,10 @@ import {TEST_TIMEOUT_CONVENIENCE_BUILD} from '../../../../constants'; /** * Define this test should run in a specific worker * - * @worker marist-7 + * @worker marist-10 */ -// hard code to use marist-7 which we started with Top Secret -const testServer = 'marist-7'; +// hard code to use marist-10 which we started with Top Secret +const testServer = 'marist-10'; const testSuiteName = 'Test convenience build installation with Top Secret'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/__tests__/extended/security-systems/fmid/acf2.ts b/tests/installation/src/__tests__/extended/security-systems/fmid/acf2.ts index 9a6e32810b..2c04aa470e 100644 --- a/tests/installation/src/__tests__/extended/security-systems/fmid/acf2.ts +++ b/tests/installation/src/__tests__/extended/security-systems/fmid/acf2.ts @@ -18,10 +18,10 @@ import {TEST_TIMEOUT_SMPE_FMID} from '../../../../constants'; /** * Define this test should run in a specific worker * - * @worker marist-6 + * @worker marist-9 */ -// hard code to use marist-6 which we started with ACF2 -const testServer = 'marist-6'; +// hard code to use marist-9 which we started with ACF2 +const testServer = 'marist-9'; const testSuiteName = 'Test SMPE FMID installation with ACF2'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/__tests__/extended/security-systems/fmid/racf.ts b/tests/installation/src/__tests__/extended/security-systems/fmid/racf.ts index a283327624..32205c4ac2 100644 --- a/tests/installation/src/__tests__/extended/security-systems/fmid/racf.ts +++ b/tests/installation/src/__tests__/extended/security-systems/fmid/racf.ts @@ -18,9 +18,9 @@ import {TEST_TIMEOUT_SMPE_FMID} from '../../../../constants'; /** * Define this test should run in a specific worker * - * @worker marist-8 + * @worker marist-11 */ -const testServer = 'marist-8'; +const testServer = 'marist-11'; const testSuiteName = 'Test SMPE FMID installation with RACF'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/__tests__/extended/security-systems/fmid/ts.ts b/tests/installation/src/__tests__/extended/security-systems/fmid/ts.ts index d274358705..d15f77074c 100644 --- a/tests/installation/src/__tests__/extended/security-systems/fmid/ts.ts +++ b/tests/installation/src/__tests__/extended/security-systems/fmid/ts.ts @@ -18,10 +18,10 @@ import {TEST_TIMEOUT_SMPE_FMID} from '../../../../constants'; /** * Define this test should run in a specific worker * - * @worker marist-7 + * @worker marist-10 */ -// hard code to use marist-7 which we started with Top Secret -const testServer = 'marist-7'; +// hard code to use marist-10 which we started with Top Secret +const testServer = 'marist-10'; const testSuiteName = 'Test SMPE FMID installation with Top Secret'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/__tests__/extended/security-systems/ptf/acf2.ts b/tests/installation/src/__tests__/extended/security-systems/ptf/acf2.ts index 3665c08d52..c5aceb2477 100644 --- a/tests/installation/src/__tests__/extended/security-systems/ptf/acf2.ts +++ b/tests/installation/src/__tests__/extended/security-systems/ptf/acf2.ts @@ -18,10 +18,10 @@ import {TEST_TIMEOUT_SMPE_PTF} from '../../../../constants'; /** * Define this test should run in a specific worker * - * @worker marist-6 + * @worker marist-9 */ -// hard code to use marist-6 which we started with ACF2 -const testServer = 'marist-6'; +// hard code to use marist-9 which we started with ACF2 +const testServer = 'marist-9'; const testSuiteName = 'Test SMPE PTF installation with ACF2'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/__tests__/extended/security-systems/ptf/racf.ts b/tests/installation/src/__tests__/extended/security-systems/ptf/racf.ts index a796eed96c..cf9e56bd29 100644 --- a/tests/installation/src/__tests__/extended/security-systems/ptf/racf.ts +++ b/tests/installation/src/__tests__/extended/security-systems/ptf/racf.ts @@ -18,9 +18,9 @@ import {TEST_TIMEOUT_SMPE_PTF} from '../../../../constants'; /** * Define this test should run in a specific worker * - * @worker marist-8 + * @worker marist-11 */ -const testServer = 'marist-8'; +const testServer = 'marist-11'; const testSuiteName = 'Test SMPE PTF installation with RACF'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/__tests__/extended/security-systems/ptf/ts.ts b/tests/installation/src/__tests__/extended/security-systems/ptf/ts.ts index 43d08633ca..65f44cf010 100644 --- a/tests/installation/src/__tests__/extended/security-systems/ptf/ts.ts +++ b/tests/installation/src/__tests__/extended/security-systems/ptf/ts.ts @@ -18,10 +18,10 @@ import {TEST_TIMEOUT_SMPE_PTF} from '../../../../constants'; /** * Define this test should run in a specific worker * - * @worker marist-7 + * @worker marist-10 */ -// hard code to use marist-7 which we started with Top Secret -const testServer = 'marist-7'; +// hard code to use marist-10 which we started with Top Secret +const testServer = 'marist-10'; const testSuiteName = 'Test SMPE PTF installation with Top Secret'; describe(testSuiteName, () => { beforeAll(() => { diff --git a/tests/installation/src/constants.ts b/tests/installation/src/constants.ts index c60aa86853..afe1dd8e07 100644 --- a/tests/installation/src/constants.ts +++ b/tests/installation/src/constants.ts @@ -13,7 +13,7 @@ import * as path from 'path'; // const debug = Debug('zowe-install-test:constants'); // the FMID we will use to test PTF -export const ZOWE_FMID = 'AZWE002'; +export const ZOWE_FMID = 'AZWE003'; // where ansible playbooks located export const ANSIBLE_ROOT_DIR: string = path.resolve(__dirname, '../../../playbooks'); diff --git a/tests/sanity/test/cli/test-01-version.js b/tests/sanity/test/cli/test-01-version.js index 9b52be55ed..861fde287b 100644 --- a/tests/sanity/test/cli/test-01-version.js +++ b/tests/sanity/test/cli/test-01-version.js @@ -28,6 +28,6 @@ describe('cli version', function() { expect(result).to.have.property('stderr'); expect(result.stderr).to.be.empty; - expect(result.stdout).to.match(/^7\./); + expect(result.stdout).to.match(/^CLI Version: 8\./); }); }); diff --git a/tests/sanity/test/e2e/test-07-iframe.js b/tests/sanity/test/e2e/test-07-iframe.js index 2962918ba4..13c7b668b1 100644 --- a/tests/sanity/test/e2e/test-07-iframe.js +++ b/tests/sanity/test/e2e/test-07-iframe.js @@ -47,7 +47,7 @@ describe.skip(`test ${APP_TO_TEST}`, function() { // load MVD login page await loginMVD( driver, - `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_ZLUX_HTTPS_PORT}/`, + `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_API_MEDIATION_GATEWAY_HTTP_PORT}/zlux/ui/v1/ZLUX/plugins/org.zowe.zlux.bootstrap/web/`, process.env.SSH_USER, process.env.SSH_PASSWD ); diff --git a/tests/sanity/test/e2e/test-08-subsys.js b/tests/sanity/test/e2e/test-08-subsys.js index d10735e604..f4cfcff868 100644 --- a/tests/sanity/test/e2e/test-08-subsys.js +++ b/tests/sanity/test/e2e/test-08-subsys.js @@ -40,7 +40,7 @@ describe.skip(`test ${APP_TO_TEST}`, function() { // load MVD login page await loginMVD( driver, - `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_ZLUX_HTTPS_PORT}/`, + `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_API_MEDIATION_GATEWAY_HTTP_PORT}/zlux/ui/v1/ZLUX/plugins/org.zowe.zlux.bootstrap/web/`, process.env.SSH_USER, process.env.SSH_PASSWD ); diff --git a/tests/sanity/test/e2e/test-10-api-catalog.js b/tests/sanity/test/e2e/test-10-api-catalog.js index ab42adab69..ba53108906 100644 --- a/tests/sanity/test/e2e/test-10-api-catalog.js +++ b/tests/sanity/test/e2e/test-10-api-catalog.js @@ -45,7 +45,7 @@ describe(`test ${APP_TO_TEST}`, function() { // load MVD login page await loginMVD( driver, - `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_ZLUX_HTTPS_PORT}/`, + `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_API_MEDIATION_GATEWAY_HTTP_PORT}/zlux/ui/v1/ZLUX/plugins/org.zowe.zlux.bootstrap/web/`, process.env.SSH_USER, process.env.SSH_PASSWD ); @@ -79,6 +79,8 @@ describe(`test ${APP_TO_TEST}`, function() { try { const searchBox = await waitUntilElement(driver, '.search-bar'); expect(searchBox).to.be.an('object'); + await saveScreenshotWithIframeAppContext(this, driver, testName, 'login-pre-success', APP_TO_TEST, MVD_IFRAME_APP_CONTENT); + } catch (e) { // try to save screenshot for debug purpose await saveScreenshotWithIframeAppContext(this, driver, testName, 'login-failed', APP_TO_TEST, MVD_IFRAME_APP_CONTENT); diff --git a/tests/sanity/test/e2e/test-11-workflows.js b/tests/sanity/test/e2e/test-11-workflows.js index 2bfde0962d..df0b21dc77 100644 --- a/tests/sanity/test/e2e/test-11-workflows.js +++ b/tests/sanity/test/e2e/test-11-workflows.js @@ -40,7 +40,7 @@ describe.skip(`test ${APP_TO_TEST}`, function() { // load MVD login page await loginMVD( driver, - `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_ZLUX_HTTPS_PORT}/`, + `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_API_MEDIATION_GATEWAY_HTTP_PORT}/zlux/ui/v1/ZLUX/plugins/org.zowe.zlux.bootstrap/web/`, process.env.SSH_USER, process.env.SSH_PASSWD ); diff --git a/tests/sanity/test/e2e/test-12-angular-sample.js b/tests/sanity/test/e2e/test-12-angular-sample.js index addeb9fc4c..57248ca41d 100644 --- a/tests/sanity/test/e2e/test-12-angular-sample.js +++ b/tests/sanity/test/e2e/test-12-angular-sample.js @@ -44,7 +44,7 @@ describe.skip(`test ${APP_TO_TEST}`, function() { // load MVD login page await loginMVD( driver, - `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_ZLUX_HTTPS_PORT}/`, + `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_API_MEDIATION_GATEWAY_HTTP_PORT}/zlux/ui/v1/ZLUX/plugins/org.zowe.zlux.bootstrap/web/`, process.env.SSH_USER, process.env.SSH_PASSWD ); diff --git a/tests/sanity/test/e2e/test-13-react-sample.js b/tests/sanity/test/e2e/test-13-react-sample.js index d2fee77eca..ac01c05d0f 100644 --- a/tests/sanity/test/e2e/test-13-react-sample.js +++ b/tests/sanity/test/e2e/test-13-react-sample.js @@ -44,7 +44,7 @@ describe.skip(`test ${APP_TO_TEST}`, function() { // load MVD login page await loginMVD( driver, - `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_ZLUX_HTTPS_PORT}/`, + `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_API_MEDIATION_GATEWAY_HTTP_PORT}/zlux/ui/v1/ZLUX/plugins/org.zowe.zlux.bootstrap/web/`, process.env.SSH_USER, process.env.SSH_PASSWD ); diff --git a/tests/sanity/test/e2e/test-14-ip-explorer.js b/tests/sanity/test/e2e/test-14-ip-explorer.js index 99f9eb3326..0b274fd66d 100644 --- a/tests/sanity/test/e2e/test-14-ip-explorer.js +++ b/tests/sanity/test/e2e/test-14-ip-explorer.js @@ -40,7 +40,7 @@ describe(`test ${APP_TO_TEST}`, function() { // load MVD login page await loginMVD( driver, - `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_ZLUX_HTTPS_PORT}/`, + `https://${process.env.ZOWE_EXTERNAL_HOST}:${process.env.ZOWE_API_MEDIATION_GATEWAY_HTTP_PORT}/zlux/ui/v1/ZLUX/plugins/org.zowe.zlux.bootstrap/web/`, process.env.SSH_USER, process.env.SSH_PASSWD ); diff --git a/workflows/files/ZWEAMLCF.xml b/workflows/files/ZWEAMLCF.xml new file mode 100644 index 0000000000..d47f87945f --- /dev/null +++ b/workflows/files/ZWEAMLCF.xml @@ -0,0 +1,1486 @@ + + + true + + + config_apiml_zowe_30 + Configuration of API ML for Zowe 3.0 + Use this simplified workflow to configure API ML for Zowe 3.0 + ###ZOWE_VERSION### + Zowe + + + + + + Prefix of datasets where remaining runtime datasets will be created + Prefix of datasets where remaining runtime libraries will be created within execution of Zowe install step (SZWEAUTH, SZWESAMP, SZWEEXEC, SZWELOAD) + zowe + + + + IBMUSER.ZWEV3 + + + + + Where Zowe STCs will be copied over + Where Zowe STCs will be copied over + zowe + + + + USER.PROCLIB + + + + + Zowe PARMLIB + Zowe parameter library + zowe + + + + IBMUSER.ZWEV3.CUST.PARMLIB + + + + + Zowe ZIS plugins PARMLIB + Holds PARMLIB members for ZIS plugins + zowe + + + + ZWESIP00 + + + + + JCL library where Zowe will store temporary JCLs during initialization + JCL library where Zowe will store temporary JCLs during initialization + zowe + + + + IBMUSER.ZWEV3.CUST.JCLLIB + + + + + Load library where Zowe stores libraries for Utilities for use by Zowe and extensions + Load library for Utilities for use by Zowe and extensions + zowe + + + + IBMUSER.ZWEV3.SZWELOAD + + + + + APF authorized LOADLIB for Zowe + APF authorized LOADLIB for Zowe core + zowe + + + + IBMUSER.ZWEV3.SZWEAUTH + + + + + APF authorized LOADLIB for Zowe ZIS Plugins + APF authorized LOADLIB for Zowe ZIS Plugins + zowe + + + + IBMUSER.ZWEV3.CUST.ZWESAPL + + + + + Zowe runtime (root) directory with libraries + Existing Zowe runtime.<br /> +If you created ZOWE via PSWI, <br /> +zowe runtime is your Target Mount Point from PSWI deployment. <br /> +It is used by ZWESLSTC or by zwe command + zowe + + ~?(\/[^\/]+)+ + Please specify proper full USS path ending without a trailing slash. + + + + + Where to store runtime logs + Where to store runtime logs + zowe + + + + /global/zowe/logs + + + + + Zowe runtime workspace directory + Zowe runtime workspace directory + zowe + + + + /global/zowe/workspace + + + + + Where extensions are installed + zowe_extensionDirectory + zowe + + + + /global/zowe/extensions + + + + + Zowe JES job name + Zowe JES job name + zowe + + + + ZWE1SV + + + + + Prefix of component address space + Prefix of component address space + zowe + + + + ZWE1 + + + + + The list of external domains + Defines a list of external domains that will be used by the Zowe instance. + zowe + + + + sample-domain.com + + + + + The port you use to access Zowe Gateway from your web browser + This is the port you use to access Zowe Gateway from your web browser. +In many use cases, this should be same as <b>components.gateway.port</b>. But in +some use cases, like containerization, this port could be different. + zowe + + + + 7554 + + + + + Set to "debug" or "trace" to display extra debug information + Set to "debug" or "trace" to display extra debug information + zowe + + + info + debug + trace + info + + + + + Set to "exit" or "warn" if any component has an error + Set to "exit" if you want startup to exit if any component has an error in the configuration stage, otherwise zwe will issue a warning but continue running. + zowe + + + warn + exit + warn + + + + + Enable on AT-TLS on inbound calls (server) + Enable aware mode of inbound AT-TLS rules of all Zowe components. + network + + + + false + + + + + Enable on AT-TLS on outbound calls (client) + Enable aware mode of outbound AT-TLS rules of all Zowe components. + network + + + + false + + + + + TLS minimum version + The default configuration of the minimal version of a security transport protocol for inbound calls. + TLS settings only apply when attls=false. + Else you must use AT-TLS configuration for TLS customization. + + network + + + TLSv1.1 + TLSv1.2 + TLSv1.3 + TLSv1.2 + + + + + TLS maximum version + The default configuration of the maximum version of a security transport protocol for inbound calls. + TLS settings only apply when attls=false. + Else you must use AT-TLS configuration for TLS customization. + + network + + + TLSv1.1 + TLSv1.2 + TLSv1.3 + TLSv1.3 + + + + + Certificate keystore type (PKCS12, JCERACFKS) + Certificate keystore type (PKCS12, JCERACFKS) + certificates + + + + PKCS12 + JCERACFKS + JCERACFKS + + + + + Zowe certificate keystore file. For keyring, the format is "safkeyring://OWNER/KEYRING". + Zowe certificate keystore file + certificates + + + + safkeyring://OWNER/KEYRING + + + + + Certificate keystore password. + Certificate keystore password. + certificates + + + password + + + + + Alias for the certificate keystore + Alias for the certificate keystore + certificates + + + + localhost + + + + + Zowe certificate truststore type + Zowe certificate truststore type + certificates + + + + PKCS12 + JCERACFKS + JCERACFKS + + + + + File location for certificate truststore. For keyring, the format is "safkeyring://OWNER/KEYRING" + File location for the certificate truststore + certificates + + + + safkeyring://OWNER/KEYRING + + + + + Password for the certificate truststore + Password for the certificate truststore + certificates + + + + password + + + + + Path to the JAVA home + Path to the JAVA home + java + + + + + + + + Path to the Node.js home + Path to the Node.js home + Node.js + + + + + + + + Hostname of the running z/OSMF instance + Hostname of the running z/OSMF instance + zOSMF + + + + dvipa.my-company.com + + + + + Port of the z/OSMF instance + Port of the z/OSMF instance + zOSMF + + + + 443 + + + + + APPLID of the z/OSMF instance + APPLID of the z/OSMF instance + zOSMF + + + + IZUDFLT + + + + + Port for API ML Gateway + Port for API ML Gateway + components + + + + 7554 + + + + + Port for API ML ZAAS + Port for API ML ZAAS + components + + + + 7558 + + + + + Port on which API Catalog should be running. + Port on which API Catalog should be running. + components + + + + 7552 + + + + + Port on which Discovery service should be running + Port on which Discovery service should be running + components + + + + 7553 + + + + + Port for Caching service + Port for Caching service + components + + + + 7555 + + + + + Port for jgroups + Port for jgroups. This is required if storage mode is infinispan. + components + + + + 7559 + + + + + Port for jgroups key exchange + Port for jgroups key exchange. This is required if storage mode is infinispan. + components + + + + 7560 + + + + + ID you use to separate multiple Zowe installs + ID when determining resource names used in RBAC authorization checks such as dataservices with RBAC expects this ID in SAF resources + zowe + + + + 1 + + + + + ID that can be used by servers to distinguish their cookies from unrelated Zowe installs + ID which allows multiple copies of Zowe to be used within the same client + zowe + + + + 1 + + + + + Security product name. Can be RACF, ACF2 or TSS + Security product name. Can be RACF, ACF2 or TSS + security + + + + + RACF + TSS + ACF2 + RACF + + + + + Zowe admin user group + Zowe admin user group + security + + + + ZWEADMIN + + + + + + Zowe STC group + Zowe STC group + security + + + + + ZWEADMIN + + + + + Zowe SysProg group + Zowe SysProg group + security + + + + + ZWEADMIN + + + + + Zowe runtime user name of main service + Zowe runtime user name of main service + security + + + + + ZWESVUSR + + + + + Zowe runtime user name of ZIS + Zowe runtime user name of ZIS + security + + + + + ZWESIUSR + + + + + STC name of main service + STC name of main service + security + + + + + ZWESLSTC + + + + + STC name of ZIS + STC name of ZIS + security + + + + + ZWESISTC + + + + + STC name of Auxiliary Service + STC name of Auxiliary Service + security + + + + + ZWESASTC + + + + + + Define variables + Use this step to define the variables for execution + + + Define the main variables + Use this step to define the main variables for Zowe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Run this step to fill base variables. + 1 + z/OS System Programmer + false + false + + + + Ports + Specify ports variables for components + + + + + + + + + Run this step to specify ports variables for components + 1 + z/OS System Programmer + false + false + + + + + Create configuration + Creates the configuration for the Zowe (API ML) + + + + + Generated yaml file is backward compatible with full Zowe,
+ this workflow is just simplified with focus on easier API ML configuration.
+ Ensure that the values are correct.
+ zowe.yaml file is created in the: ${instance-zowe_runtimeDirectory} directory

+ NOTE: If you run this workflow outside of PSWI (SMP/E or convenience build), you might encounter a folder write permission issue.
+ To solve the issue, run the following command in USS:
+ chmod 775 ${instance-zowe_runtimeDirectory}
+ and change the folder UID to the ID of the user who executes this workflow.
+ Issue the following command:
+ chown ${_workflow-workflowOwner} ${instance-zowe_runtimeDirectory}
+ Re-run the step. +]]>
+ 1 + z/OS System Programmer + false + false + +
+ + Zowe installation + Zowe installation + + Run the Zowe install + Configure Zowe. + + + + zwe install -c ${instance-zowe_runtimeDirectory}/zowe.yml
+ Will create remaining runtime data sets under zowe.setup.dataset.prefix definition,
+ i.e. under specified prefix ${instance-zowe_setup_dataset_prefix}:
+ SZWEAUTH contains few Zowe load modules (++PROGRAM).
+ SZWESAMP contains several sample configurations.
+ SZWEEXEC contains few utilities used by Zowe.
+ SZWELOAD contains config manager for REXX.
+ ]]>
+ 1 + z/OS System Programmer + false + false + +
+ + Run scripts for Zowe initialization + Executes scripts for Zowe initialization + + + + + + zwe init mvs -c ${instance-zowe_runtimeDirectory}/zowe.yml --allow-overwrite
+ zwe init stc -c ${instance-zowe_runtimeDirectory}/zowe.yml --allow-overwrite
+
+ NOTE: + Each zwe init sub-command defines a configuration. +
    +
  • mvs: Copy the data sets provided with Zowe to custom data sets.
  • +
  • stc: Configure the system to launch the Zowe started task.
  • +
+ ]]>
+ 1 + z/OS System Programmer + false + false + +
+
+
diff --git a/workflows/files/ZWECONF.properties b/workflows/files/ZWECONF.properties index be0fd50ae0..4d84d00b78 100644 --- a/workflows/files/ZWECONF.properties +++ b/workflows/files/ZWECONF.properties @@ -4,7 +4,7 @@ # Category: zowe # Description: # Where Zowe MVS data sets will be installed -zowe_setup_dataset_prefix=IBMUSER.ZWEV2 +zowe_setup_dataset_prefix=IBMUSER.ZWEV3 # zowe_setup_dataset_proclib # Label: Zowe setup MVS procedure library @@ -20,7 +20,7 @@ zowe_setup_dataset_proclib=USER.PROCLIB # Category: zowe # Description: # Zowe parameter library -zowe_setup_dataset_parmlib=IBMUSER.ZWEV2.CUST.PARMLIB +zowe_setup_dataset_parmlib=IBMUSER.ZWEV3.CUST.PARMLIB # zowe_setup_dataset_libzis # Label: Zowe setup PARMLIB members for ZIS plugins @@ -36,7 +36,7 @@ zowe_setup_dataset_libzis=ZWESIP00 # Category: zowe # Description: # JCL library where Zowe will store temporary JCLs during initialization -zowe_setup_dataset_jcllib=IBMUSER.ZWEV2.CUST.JCLLIB +zowe_setup_dataset_jcllib=IBMUSER.ZWEV3.CUST.JCLLIB # zowe_setup_dataset_loadlibPlugin # Label: Zowe setup Utilities and extensions library @@ -44,7 +44,7 @@ zowe_setup_dataset_jcllib=IBMUSER.ZWEV2.CUST.JCLLIB # Category: zowe # Description: # Load library for Utilities for use by Zowe and extensions -zowe_setup_dataset_loadlibPlugin=IBMUSER.ZWEV2.SZWELOAD +zowe_setup_dataset_loadlibPlugin=IBMUSER.ZWEV3.SZWELOAD # zowe_setup_dataset_authLoadlib # Label: Zowe setup MVS auth load library @@ -52,7 +52,7 @@ zowe_setup_dataset_loadlibPlugin=IBMUSER.ZWEV2.SZWELOAD # Category: zowe # Description: # APF authorized LOADLIB for Zowe core -zowe_setup_dataset_authLoadlib=IBMUSER.ZWEV2.SZWEAUTH +zowe_setup_dataset_authLoadlib=IBMUSER.ZWEV3.SZWEAUTH # zowe_setup_dataset_authPluginLib # Label: Zowe setup MVS auth plugin library @@ -60,7 +60,7 @@ zowe_setup_dataset_authLoadlib=IBMUSER.ZWEV2.SZWEAUTH # Category: zowe # Description: # APF authorized LOADLIB for Zowe ZIS Plugins -zowe_setup_dataset_authPluginLib=IBMUSER.ZWEV2.CUST.ZWESAPL +zowe_setup_dataset_authPluginLib=IBMUSER.ZWEV3.CUST.ZWESAPL # zowe_setup_vsam_mode # Label: Zowe setup VSAM mode @@ -140,10 +140,10 @@ zowe_job_prefix=ZWE1 # zowe_externalDomains # Label: Zowe external domains -# Abstract: The domain name of your Dynamic VIP Address (DVIPA) +# Abstract: The list of external domains # Category: zowe # Description: -# The domain name of your Dynamic VIP Address (DVIPA) +# Defines a list of external domains that will be used by the Zowe instance. zowe_externalDomains=sample-domain.com # zowe_externalPort @@ -258,7 +258,7 @@ zowe_certificate_truststore_type=PKCS12 # zowe_certificate_truststore_file # Label: Zowe certificate truststore file -# Abstract: File location for cert truststore. For keyring, the format is "safkeyring://OWNER/KEYRING" +# Abstract: File location for certificate truststore. For keyring, the format is "safkeyring://OWNER/KEYRING" # Category: certificates # Description: # File location for the certificate truststore @@ -750,12 +750,3 @@ zowe_setup_security_stcs_zis=ZWESISTC # STC name of Auxiliary Service zowe_setup_security_stcs_aux=ZWESASTC -# zowe_setup_installStep_enabled -# Label: Install the MVS data sets -# Abstract: Check to enable this run step with the zwe install command. For convenience build only. -# Category: installMVSDatasets -# Description: -# Check this option to enable the optional workflow step with zwe install command. After Zowe convenience build is extracted, -# you can enable this flag to run the zwe install command to install MVS data sets within this workflow run. -# This option is for convenience build only. SMP/E installs the MVS data sets during installation. -zowe_setup_installStep_enabled=false diff --git a/workflows/files/ZWECONF.xml b/workflows/files/ZWECONF.xml index d6fb790207..012dcd2dba 100644 --- a/workflows/files/ZWECONF.xml +++ b/workflows/files/ZWECONF.xml @@ -12,14 +12,14 @@ - - Where Zowe MVS data sets will be installed - Where Zowe MVS data sets will be installed + + Prefix of datasets where remaining runtime datasets will be created + Prefix of datasets where remaining runtime libraries will be created within execution of Zowe install step (SZWEAUTH, SZWESAMP, SZWEEXEC, SZWELOAD) zowe - IBMUSER.ZWEV2 + IBMUSER.ZWEV3 @@ -41,7 +41,7 @@ - IBMUSER.ZWEV2.CUST.PARMLIB + IBMUSER.ZWEV3.CUST.PARMLIB @@ -63,7 +63,7 @@ - IBMUSER.ZWEV2.CUST.JCLLIB + IBMUSER.ZWEV3.CUST.JCLLIB @@ -74,7 +74,7 @@ - IBMUSER.ZWEV2.SZWELOAD + IBMUSER.ZWEV3.SZWELOAD @@ -85,7 +85,7 @@ - IBMUSER.ZWEV2.SZWEAUTH + IBMUSER.ZWEV3.SZWEAUTH @@ -96,7 +96,7 @@ - IBMUSER.ZWEV2.CUST.ZWESAPL + IBMUSER.ZWEV3.CUST.ZWESAPL @@ -202,8 +202,8 @@ It is used by ZWESLSTC or by zwe command - The domain name of your Dynamic VIP Address (DVIPA) - The domain name of your Dynamic VIP Address (DVIPA) + The list of external domains + Defines a list of external domains that will be used by the Zowe instance. zowe @@ -371,7 +371,7 @@ some use cases, like containerization, this port could be different. - File location for cert truststore. For keyring, the format is "safkeyring://OWNER/KEYRING" + File location for certificate truststore. For keyring, the format is "safkeyring://OWNER/KEYRING" File location for the certificate truststore certificates @@ -459,10 +459,10 @@ How we want to verify SSL certificates of services. Valid values are: - - Path to the NodeJS home - Path to the NodeJS home - node + + Path to the Node.js home + Path to the Node.js home + Node.js @@ -502,9 +502,9 @@ How we want to verify SSL certificates of services. Valid values are: - - Check this option to enable the gateway - Check this option to enable the gateway + + Check this option to enable Gateway + Check this option to enable Gateway components @@ -514,8 +514,8 @@ How we want to verify SSL certificates of services. Valid values are: - Port for the API ML gateway - Port for the API ML gateway + Port for the API ML Gateway + Port for the API ML Gateway components @@ -525,8 +525,8 @@ How we want to verify SSL certificates of services. Valid values are: - Switch on the debug mode for the gateway - Switch on the debug mode for the gateway + Switch on the debug mode for Gateway + Switch on the debug mode for Gateway components @@ -535,9 +535,9 @@ How we want to verify SSL certificates of services. Valid values are: - - Should the APIML ZAAS be enabled? - Should the APIML ZAAS be enabled? + + Check this option to enable API ML ZAAS + Check this option to enable API ML ZAAS components @@ -547,8 +547,8 @@ How we want to verify SSL certificates of services. Valid values are: - Port for the APIML ZAAS - Port for the APIML ZAAS + Port for API ML ZAAS + Port for API ML ZAAS components @@ -558,8 +558,8 @@ How we want to verify SSL certificates of services. Valid values are: - Switch on the debug mode for the ZAAS - Switch on the debug mode for the ZAAS + Switch on the debug mode for ZAAS + Switch on the debug mode for ZAAS components @@ -568,9 +568,9 @@ How we want to verify SSL certificates of services. Valid values are: - - Authorization provider for the gateway - Authorization provider for the gateway + + Authorization provider for the Gateway + Authorization provider for the Gateway components @@ -579,9 +579,9 @@ How we want to verify SSL certificates of services. Valid values are: - - JWT auto configuration for gateway security auth - JWT auto configuration for gateway security auth + + JWT auto configuration for Gateway security auth + JWT auto configuration for Gateway security auth components @@ -592,9 +592,9 @@ How we want to verify SSL certificates of services. Valid values are: - - Service ID for gateway security auth - Service ID for gateway security auth + + Service ID for Gateway security auth + Service ID for Gateway security auth components @@ -603,7 +603,7 @@ How we want to verify SSL certificates of services. Valid values are: - + Use this to enable the security authorization endpoint Use this to enable the security authorization endpoint components @@ -614,9 +614,9 @@ How we want to verify SSL certificates of services. Valid values are: - - Security authorization provider for the gateway - Security authorization provider for the gateway + + Security authorization provider for the Gateway + Security authorization provider for the Gateway components @@ -625,9 +625,9 @@ How we want to verify SSL certificates of services. Valid values are: - - Check to enable the gateway security x509 - Check to enable the gateway security x509 + + Check to enable the Gateway security x509 + Check to enable the Gateway security x509 components @@ -637,8 +637,8 @@ How we want to verify SSL certificates of services. Valid values are: - Check this option to enable the API Catalog - Check this option to enable the API Catalog + Check this option to enable API Catalog + Check this option to enable API Catalog components @@ -669,9 +669,9 @@ How we want to verify SSL certificates of services. Valid values are: - - Check this option to enable the Discovery service - Check this option to enable the Discovery service + + Check this option to enable Discovery service + Check this option to enable Discovery service components @@ -681,8 +681,8 @@ How we want to verify SSL certificates of services. Valid values are: - Port on which the Discovery service should be running - Port on which the Discovery service should be running + Port on which Discovery service should be running + Port on which Discovery service should be running components @@ -702,9 +702,9 @@ How we want to verify SSL certificates of services. Valid values are: - - Check this option to enable the Caching service - Check this option to enable the Caching service + + Check this option to enable Caching service + Check this option to enable Caching service components @@ -714,8 +714,8 @@ How we want to verify SSL certificates of services. Valid values are: - Port for the caching service - Port for the caching service + Port for Caching service + Port for Caching service components @@ -802,9 +802,9 @@ How we want to verify SSL certificates of services. Valid values are: - - Check this option to enable the app server - Check this option to enable the app server. + + Check this option to enable App server + Check this option to enable App server. components @@ -825,8 +825,8 @@ How we want to verify SSL certificates of services. Valid values are: - Port for the app server - Port for the app server + Port for App server + Port for App server components @@ -891,8 +891,8 @@ How we want to verify SSL certificates of services. Valid values are: - Check this option to enable the JES explorer - Check this option to enable the JES explorer. + Check this option to enable JES explorer + Check this option to enable JES explorer. components @@ -902,8 +902,8 @@ How we want to verify SSL certificates of services. Valid values are: - Check this option to enable the MVS explorer - Check this option to enable the MVS explorer. + Check this option to enable MVS explorer + Check this option to enable MVS explorer. components @@ -913,8 +913,8 @@ How we want to verify SSL certificates of services. Valid values are: - Check this option to enable the USS explorer - Check this option to enable the USS explorer. + Check this option to enable USS explorer + Check this option to enable USS explorer. components @@ -1067,20 +1067,7 @@ How we want to verify SSL certificates of services. Valid values are: ZWESASTC - - - - Check to enable this run step with the zwe install command. For convenience build only. - Check this option to enable the optional workflow step with zwe install command. After Zowe convenience build is extracted, - you can enable this flag to run the zwe install command to install MVS data sets within this workflow run. - This option is for convenience build only. SMP/E installs the MVS data sets during installation. - installMVSDatasets - - - - false - - + @@ -1152,8 +1139,7 @@ How we want to verify SSL certificates of services. Valid values are: - - + Run this step to fill base variables. 1 z/OS System Programmer @@ -1163,14 +1149,14 @@ How we want to verify SSL certificates of services. Valid values are: Gateway variables - Specify the variables for the gateway component + Specify the variables for the Gateway component 1 == 1 Always true - Skipped if the gateway was not selected + Skipped if the Gateway was not selected !${instance-components_gateway_enabled} skipped @@ -1184,7 +1170,7 @@ How we want to verify SSL certificates of services. Valid values are: - Run this step to specify the cloud gateway variables + Run this step to specify the Gateway variables 1 z/OS System Programmer false @@ -1208,7 +1194,7 @@ How we want to verify SSL certificates of services. Valid values are: - Run this step to fill gateway component variables. + Run this step to fill ZAAS component variables. 1 z/OS System Programmer false @@ -1809,7 +1795,7 @@ echo ' # ZWED_TN3270_PORT: 23' >> "${instance-zowe_runtimeDirectory}/zowe.yam echo '' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo ' # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo ' # You can define any Zowe message portions to be checked for and the message added to the' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" -echo ' # system log upon its logging, truncated to 126 characters.' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" +echo ' # system log upon its logging, truncated to 126 characters (wildcards are not supported).' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo ' sysMessages:' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo ' # # Zowe starting' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo ' - "ZWEL0021I"' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" @@ -1899,17 +1885,17 @@ echo ' home: "$!{instance-java_home}"' >> "${instance-zowe_runtimeDirectory}/zo echo '' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '#-------------------------------------------------------------------------------' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" -echo '# node.js configuration' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" +echo '# Node.js configuration' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '#' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" -echo '# Some Zowe components requires node.js. Define the path where you have your' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" -echo '# node.js is installed.' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" +echo '# Some Zowe components requires Node.js. Define the path where you have your' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" +echo '# Node.js is installed.' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '#' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '# **NOTE**: this field can be updated automatically if you pass `--update-config`' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '# to `zwe init` command.' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '#-------------------------------------------------------------------------------' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo 'node:' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo ' # **COMMONLY_CUSTOMIZED**' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" -echo ' # Path to your node.js home directory' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" +echo ' # Path to your Node.js home directory' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo ' home: "$!{instance-node_home}"' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" @@ -2170,7 +2156,7 @@ echo '# sysname: LPR1' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '# # for this HA instance, we did not customize "components", so it will use default value.' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '# # HA instance ID, we will start 2 instances on LPAR2' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" -echo '# # **NOTE**, we can only start one gateway in same LPAR.' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" +echo '# # **NOTE**, we can only start one Gateway in same LPAR.' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '# lpar2a:' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '# # hostname where this instance will be started' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" echo '# hostname: lpar2.my-company.com' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" @@ -2225,26 +2211,21 @@ echo '# enabled: false' >> "${instance-zowe_runtimeDirectory}/zowe.yaml" Zowe installation Zowe installation - - Run the Zowe install (only for convenience build) - Configure Zowe. + + Run the Zowe install + Configure Zowe. - - 1==1 - Always true - - - Skips this step if Install the MVS data sets was not selected - !${instance-zowe_setup_installStep_enabled} - skipped - - - zwe install -c ${instance-zowe_runtimeDirectory}/zowe.yml + This step runs the command: zwe install -c ${instance-zowe_runtimeDirectory}/zowe.yml
+ Will create remaining runtime data sets under zowe.setup.dataset.prefix definition,
+ i.e. under specified prefix ${instance-zowe_setup_dataset_prefix}:
+ SZWEAUTH contains few Zowe load modules (++PROGRAM).
+ SZWESAMP contains several sample configurations.
+ SZWEEXEC contains few utilities used by Zowe.
+ SZWELOAD contains config manager for REXX.
]]>
1 z/OS System Programmer @@ -2264,10 +2245,10 @@ zwe install -c '${instance-zowe_runtimeDirectory}/zowe.yaml' --allow-overwrite1024 -
+
- Run the Zowe init - Executes the Zowe initialization + Run scripts for Zowe initialization + Executes scripts for Zowe initialization @@ -2283,10 +2264,9 @@ zwe install -c '${instance-zowe_runtimeDirectory}/zowe.yaml' --allow-overwritezwe init sub-command defines a configuration.
  • mvs: Copy the data sets provided with Zowe to custom data sets.
  • -
  • security: Create the user IDs and security manager settings.
  • -
  • apfauth: APF authorize the LOADLIB containing the modules that need to perform z/OS priviledged security calls.
  • -
  • certificate: Configure Zowe to use TLS certificates.
  • +#if (${instance-components_caching_service_storage_mode} == "VSAM" && ${instance-components_caching_service_enabled})
  • vsam: Configure the VSAM files needed to run the Zowe caching service used for high availability (HA).
  • +#end
  • stc: Configure the system to launch the Zowe started task.
]]> @@ -2314,24 +2294,20 @@ zwe init vsam -c '${instance-zowe_runtimeDirectory}/zowe.yaml' --allow-overwrite
- Run the Zowe init security - Executes the Zowe initialization for security setup + Run scripts for Zowe security initialization + Executes Zowe initialization scripts for security setup - zwe init apfauth -c ${instance-zowe_runtimeDirectory}/zowe.yml
zwe init security -c ${instance-zowe_runtimeDirectory}/zowe.yml --allow-overwrite
+ zwe init apfauth -c ${instance-zowe_runtimeDirectory}/zowe.yml

NOTE: Each zwe init sub-command defines a configuration.
    -
  • mvs: Copy the data sets provided with Zowe to custom data sets.
  • security: Create the user IDs and security manager settings.
  • apfauth: APF authorize the LOADLIB containing the modules that need to perform z/OS priviledged security calls.
  • -
  • certificate: Configure Zowe to use TLS certificates.
  • -
  • vsam: Configure the VSAM files needed to run the Zowe caching service used for high availability (HA).
  • -
  • stc: Configure the system to launch the Zowe started task.
]]>
1 diff --git a/workflows/files/ZWECRECR.xml b/workflows/files/ZWECRECR.xml index c5d3c3b812..9999de8573 100644 --- a/workflows/files/ZWECRECR.xml +++ b/workflows/files/ZWECRECR.xml @@ -33,7 +33,7 @@ Please, specify your security management software - Please, specify the ESM system you use on your workstation + Please, specify the ESM system you use General @@ -276,7 +276,8 @@ TSS GENREQ(${instance-tss_acid}) + - This step will generate the CSR request into the ${instance-output_dataset} + This step uses ACF2 command GENREQ

]]>
1 Security Administrator true @@ -303,7 +304,7 @@ GENREQ ${instance-acf2_acid} + This step uses ACF2 command GENREQ

]]>
+]]> 1 Security Administrator true diff --git a/workflows/files/ZWELOADC.xml b/workflows/files/ZWELOADC.xml index c823b2b813..786e28fb37 100644 --- a/workflows/files/ZWELOADC.xml +++ b/workflows/files/ZWELOADC.xml @@ -192,7 +192,7 @@ Use this step to define the variables for RACF.

For more information about security system setup and it's variables, please open via right-click in new tab or window and refer to security documentation here - configure RACF security certificates + configure RACF security certificates or there RACDCERT ADD (Add certificate) command.

]]> 1 @@ -252,7 +252,7 @@ Use this step to define the variables for ACF2.

For more information about security system setup and it's variables, please open via right-click in new tab or window and refer to security documentation - configure ACF2 security certificates.

+ configure ACF2 security certificates.

]]>
1 Security Administrator @@ -367,7 +367,7 @@ This step will load signed client authentication certificate from the ${instance-output_dataset} into ESM

For more information about security system setup and it's variables, please open via right-click in new tab or window and refer to security documentation here - configure RACF security certificates
+ configure RACF security certificates
or there RACDCERT ADD (Add certificate) command.

]]>
1 @@ -452,7 +452,7 @@ DCDSN(${instance-output_dataset}) TRUST This step will load signed client authentication certificate from the ${instance-output_dataset} into ESM

For more information about security system setup and it's variables, please open via right-click in new tab or window and refer to security documentation - configure ACF2 security certificates.

+ configure ACF2 security certificates.

]]>
1 Security Administrator