diff --git a/README.md b/README.md index 431908e..6429eff 100644 --- a/README.md +++ b/README.md @@ -47,11 +47,14 @@ stage ("stage-name") { downloadDS dsn:"EXAMPLE.DATASET(MEMBER)", vol:"VOL001" allocateDS dsn:"EXAMPLE.DATASET", alcUnit:"TRK", dsOrg:"PS", primary:1, secondary:1, recFm:"FB", failOnExist:"False" writeFileToDS dsn:"EXAMPLE.DATASET", file:"workspaceFile" + writeFileToDS dsn:"EXAMPLE.DATASET(MEMBER)", file:"workspaceFile" writeFileToDS dsn:"EXAMPLE.DATASET", file:"D:\\files\\localFile" + writeFileToDS dsn:"EXAMPLE.DATASET(MEMBER)", file:"D:\\files\\localFile" writeToDS dsn:"EXAMPLE.DATASET", text:"Write this string to dataset" - writeFileToMember dsn:"EXAMPLE.DATASET", member:"MEMBER", file:"workspaceFile" - writeFileToMember dsn:"EXAMPLE.DATASET", member:"MEMBER", file:"D:\\files\\localFile" - writeToMember dsn:"EXAMPLE.DATASET", member:"MEMBER", text:"Write this string to member" + writeToDS dsn:"EXAMPLE.DATASET(MEMBER)", text:"Write this string to dataset member" + + writeDirToDS dir: "app/src/main/cbl/", dsn: "EXAMPLE.DATASET" + writeDirToDS dir: "D:\\resources\\cbl", dsn: "EXAMPLE.DATASET", isLocalPath: true writeToFile destFile: "u/USER/myfile", text: "Write this string to file" writeFileToFile destFile: "u/USER/myfile", sourceFile: "myfile.txt" @@ -195,6 +198,25 @@ def active_units = performMvsCommand "D A,L" [Perform MVS command] - The command has been successfully executed ``` +### `writeDirToDS` - Write a Directory to a Dataset + +```groovy +zosmf ("z/os-connection-name") { + writeDirToDS dir: "app/src/main/cbl", dsn: "EXAMPLE.DATASET" + writeDirToDS dir: "D:\\resources\\cbl", dsn: "EXAMPLE.DATASET", isLocalPath: true +} +``` + +Mandatory parameters: +* `dir: "app/src/main/cbl/"` - Path to the directory containing the files to be written. +* `dsn: "EXAMPLE.DATASET"` - Name of the dataset (DSN) where the directory contents will be written. + +Optional Parameters: +* `isLocalPath: true` - Indicates whether the directory path is local (`true`) or relative to the Jenkins pipeline workspace (`false`) + +Important Notes: +* If a member already exists in the dataset, its content will be overwritten. +* The `dir` parameter does not support file masks. ## Use case example diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/PerformMvsCommandStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/console/PerformMvsCommandStep.kt similarity index 96% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/PerformMvsCommandStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/console/PerformMvsCommandStep.kt index 3c8fe8a..3e965ee 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/PerformMvsCommandStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/console/PerformMvsCommandStep.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.console import hudson.Extension import hudson.Launcher @@ -23,7 +23,7 @@ import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.QueryParameter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep +import org.zowe.zdevops.classic.core.AbstractBuildStep import org.zowe.zdevops.logic.performMvsCommand import org.zowe.zdevops.utils.validateFieldIsNotEmpty diff --git a/src/main/kotlin/org/zowe/zdevops/classic/AbstractBuildStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/core/AbstractBuildStep.kt similarity index 99% rename from src/main/kotlin/org/zowe/zdevops/classic/AbstractBuildStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/core/AbstractBuildStep.kt index 6aecdba..08df3c6 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/AbstractBuildStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/core/AbstractBuildStep.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.classic +package org.zowe.zdevops.classic.core import hudson.Launcher import hudson.model.AbstractBuild diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/AllocateDatasetStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/AllocateDatasetStep.kt similarity index 99% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/AllocateDatasetStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/files/dsn/AllocateDatasetStep.kt index 52639e9..c86bb93 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/AllocateDatasetStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/AllocateDatasetStep.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2023 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.Extension import hudson.Launcher @@ -25,7 +25,7 @@ import org.zowe.kotlinsdk.DsnameType import org.zowe.kotlinsdk.RecordFormat import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep +import org.zowe.zdevops.classic.core.AbstractBuildStep import org.zowe.zdevops.logic.allocateDataset import org.zowe.zdevops.utils.validateDatasetName import java.io.IOException diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetStep.kt similarity index 95% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetStep.kt index 239ad72..7b72624 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetStep.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.Extension import hudson.Launcher @@ -23,7 +23,7 @@ import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.QueryParameter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep +import org.zowe.zdevops.classic.core.AbstractBuildStep import org.zowe.zdevops.logic.deleteDatasetOrMember import org.zowe.zdevops.utils.validateDsnOrDsnMemberName diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetsByMaskStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetsByMaskStep.kt similarity index 93% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetsByMaskStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetsByMaskStep.kt index ec82d84..84f5e1a 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetsByMaskStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetsByMaskStep.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.Extension import hudson.Launcher @@ -17,7 +17,7 @@ import hudson.model.BuildListener import org.kohsuke.stapler.DataBoundConstructor import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep +import org.zowe.zdevops.classic.core.AbstractBuildStep import org.zowe.zdevops.logic.deleteDatasetsByMask class DeleteDatasetsByMaskStep diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/DownloadDatasetStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/DownloadDatasetStep.kt similarity index 96% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/DownloadDatasetStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/files/dsn/DownloadDatasetStep.kt index b997637..98e9579 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/DownloadDatasetStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/DownloadDatasetStep.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.Extension import hudson.Launcher @@ -24,7 +24,7 @@ import org.kohsuke.stapler.DataBoundSetter import org.kohsuke.stapler.QueryParameter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep +import org.zowe.zdevops.classic.core.AbstractBuildStep import org.zowe.zdevops.logic.downloadDSOrDSMemberByType import org.zowe.zdevops.utils.validateDsnOrDsnMemberName @@ -42,7 +42,7 @@ class DownloadDatasetStep constructor( connectionName: String, val dsn: String -) :AbstractBuildStep(connectionName) { +) : AbstractBuildStep(connectionName) { private var vol: String? = null private var returnEtag: Boolean? = true diff --git a/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteDirToDatasetStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteDirToDatasetStep.kt new file mode 100644 index 0000000..c5be038 --- /dev/null +++ b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteDirToDatasetStep.kt @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2025 IBA Group. + * + * This program and the accompanying materials are made available 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 + * + * Contributors: + * IBA Group + * Zowe Community + */ +package org.zowe.zdevops.classic.files.dsn + +import hudson.AbortException +import hudson.Extension +import hudson.Launcher +import hudson.model.AbstractBuild +import hudson.model.BuildListener +import hudson.util.FormValidation +import org.kohsuke.stapler.DataBoundConstructor +import org.kohsuke.stapler.DataBoundSetter +import org.kohsuke.stapler.QueryParameter +import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection +import org.zowe.zdevops.classic.core.AbstractBuildStep +import org.zowe.zdevops.logic.writeDirectoryToPdsJenkins +import org.zowe.zdevops.utils.validateDatasetName +import org.zowe.zdevops.utils.validateFieldIsNotEmpty + + +/** + * A freestyle job Jenkins class for writing the contents of a directory to a PDS/E dataset. + * @see org.zowe.zdevops.declarative.files.dsn.WriteDirToDatasetDeclarative + */ +class WriteDirToDatasetStep +@DataBoundConstructor +constructor( + connectionName: String, + val dir: String, + val dsn: String, + var isLocalPath: Boolean, +) : AbstractBuildStep(connectionName) { + + fun getIsLocalPath(): Boolean { + return this.isLocalPath + } + + @DataBoundSetter + fun setIsLocalPath(isLocalPath: Boolean) { + this.isLocalPath = isLocalPath + } + + override fun perform( + build: AbstractBuild<*, *>, + launcher: Launcher, + listener: BuildListener, + zosConnection: ZOSConnection + ) { + val workspace = build.executor?.currentWorkspace ?: throw AbortException("'build.executor' was null") + writeDirectoryToPdsJenkins(dsn, dir, isLocalPath, workspace, listener, zosConnection) + } + + @Extension + class DescriptorImpl : Companion.DefaultBuildDescriptor("[z/OS] - Write Dir to PDS/E") { + + /** + * Checks if the path to the directory is not empty + * + * @param dir The path to the directory + * @return FormValidation.ok() if the path name is not empty, or an error message otherwise + */ + fun doCheckDir(@QueryParameter dir: String): FormValidation? { + return validateFieldIsNotEmpty(dir) + } + + /** + * Checks if the dataset name is valid + * + * @param dsn The dataset name + * @return FormValidation.ok() if the dataset name is valid, or an error message otherwise + */ + fun doCheckDsn(@QueryParameter dsn: String): FormValidation? { + return validateDatasetName(dsn) + } + + } +} \ No newline at end of file diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteFileToDatasetStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToDatasetStep.kt similarity index 93% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/WriteFileToDatasetStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToDatasetStep.kt index ca45d31..4c26aa5 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteFileToDatasetStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToDatasetStep.kt @@ -1,14 +1,18 @@ /* + * Copyright (c) 2023-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2023 + * Contributors: + * IBA Group + * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.AbortException import hudson.Extension @@ -23,9 +27,9 @@ import org.kohsuke.stapler.QueryParameter import org.kohsuke.stapler.bind.JavaScriptMethod import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep -import org.zowe.zdevops.logic.writeToDataset -import org.zowe.zdevops.utils.validateDatasetName +import org.zowe.zdevops.classic.core.AbstractBuildStep +import org.zowe.zdevops.logic.writeTextToDatasetJenkins +import org.zowe.zdevops.utils.validateDsnOrDsnMemberName import org.zowe.zdevops.utils.validateFieldIsNotEmpty import java.io.File @@ -93,7 +97,7 @@ constructor( listener.logger.println(Messages.zdevops_declarative_writing_DS_from_file(dsn, file?.name, zosConnection.host, zosConnection.zosmfPort)) val fileContent = file?.readText() if (fileContent != null) { - writeToDataset(listener, zosConnection, dsn, fileContent) + writeTextToDatasetJenkins(listener, zosConnection, dsn, fileContent) } } @@ -155,7 +159,7 @@ constructor( * @return FormValidation.ok() if the dataset name is valid, or an error message otherwise */ fun doCheckDsn(@QueryParameter dsn: String): FormValidation? { - return validateDatasetName(dsn) + return validateDsnOrDsnMemberName(dsn) } /** diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteFileToMemberStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToMemberStep.kt similarity index 93% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/WriteFileToMemberStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToMemberStep.kt index c9c35a8..a08a4e4 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteFileToMemberStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToMemberStep.kt @@ -1,14 +1,18 @@ /* + * Copyright (c) 2023-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2023 + * Contributors: + * IBA Group + * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.AbortException import hudson.Extension @@ -23,8 +27,8 @@ import org.kohsuke.stapler.QueryParameter import org.kohsuke.stapler.bind.JavaScriptMethod import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep -import org.zowe.zdevops.logic.writeToMember +import org.zowe.zdevops.classic.core.AbstractBuildStep +import org.zowe.zdevops.logic.writeTextToDatasetJenkins import org.zowe.zdevops.utils.validateDatasetName import org.zowe.zdevops.utils.validateFieldIsNotEmpty import org.zowe.zdevops.utils.validateMemberName @@ -94,9 +98,10 @@ constructor( else -> throw AbortException(Messages.zdevops_classic_write_options_invalid()) } listener.logger.println(Messages.zdevops_declarative_writing_DS_from_file(dsn, file?.name, zosConnection.host, zosConnection.zosmfPort)) + listener.logger.println("[WARNING] - The method is deprecated. Please, consider switching to `Write File to Dataset` step.") val fileContent = file?.readText() if (fileContent != null) { - writeToMember(listener, zosConnection, dsn, member, fileContent) + writeTextToDatasetJenkins(listener, zosConnection, "$dsn($member)", fileContent) } } diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteToDatasetStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToDatasetStep.kt similarity index 85% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/WriteToDatasetStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToDatasetStep.kt index e1ce921..eeb1752 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteToDatasetStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToDatasetStep.kt @@ -1,14 +1,18 @@ /* + * Copyright (c) 2023-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2023 + * Contributors: + * IBA Group + * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.Extension import hudson.Launcher @@ -19,9 +23,9 @@ import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.QueryParameter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep -import org.zowe.zdevops.logic.writeToDataset -import org.zowe.zdevops.utils.validateDatasetName +import org.zowe.zdevops.classic.core.AbstractBuildStep +import org.zowe.zdevops.logic.writeTextToDatasetJenkins +import org.zowe.zdevops.utils.validateDsnOrDsnMemberName import org.zowe.zdevops.utils.validateFieldIsNotEmpty /** @@ -57,7 +61,7 @@ constructor( zosConnection: ZOSConnection ) { listener.logger.println(Messages.zdevops_declarative_writing_DS_from_input(dsn, zosConnection.host, zosConnection.zosmfPort)) - writeToDataset(listener, zosConnection, dsn, text) + writeTextToDatasetJenkins(listener, zosConnection, dsn, text) } /** @@ -72,7 +76,7 @@ constructor( * @return FormValidation.ok() if the dataset name is valid, or an error message otherwise */ fun doCheckDsn(@QueryParameter dsn: String): FormValidation? { - return validateDatasetName(dsn) + return validateDsnOrDsnMemberName(dsn) } /** diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteToMemberStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToMemberStep.kt similarity index 87% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/WriteToMemberStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToMemberStep.kt index 3a63a90..aa1d76c 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteToMemberStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToMemberStep.kt @@ -1,14 +1,18 @@ /* + * Copyright (c) 2023-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2023 + * Contributors: + * IBA Group + * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.Extension import hudson.Launcher @@ -19,8 +23,8 @@ import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.QueryParameter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep -import org.zowe.zdevops.logic.writeToMember +import org.zowe.zdevops.classic.core.AbstractBuildStep +import org.zowe.zdevops.logic.writeTextToDatasetJenkins import org.zowe.zdevops.utils.validateDatasetName import org.zowe.zdevops.utils.validateFieldIsNotEmpty import org.zowe.zdevops.utils.validateMemberName @@ -60,7 +64,8 @@ constructor( zosConnection: ZOSConnection ) { listener.logger.println(Messages.zdevops_declarative_writing_DS_from_input(dsn, zosConnection.host, zosConnection.zosmfPort)) - writeToMember(listener, zosConnection, dsn, member, text) + listener.logger.println("[WARNING] - The method is deprecated. Please, consider switching to `Write to Dataset` step.") + writeTextToDatasetJenkins(listener, zosConnection, "$dsn($member)", text) } /** diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteFileToFileStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/files/uss/WriteFileToFileStep.kt similarity index 98% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/WriteFileToFileStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/files/uss/WriteFileToFileStep.kt index 1f7b427..939e90a 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteFileToFileStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/files/uss/WriteFileToFileStep.kt @@ -1,4 +1,4 @@ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.uss import hudson.AbortException import hudson.Extension @@ -13,7 +13,7 @@ import org.kohsuke.stapler.QueryParameter import org.kohsuke.stapler.bind.JavaScriptMethod import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep +import org.zowe.zdevops.classic.core.AbstractBuildStep import org.zowe.zdevops.logic.writeToFile import org.zowe.zdevops.utils.validateFieldIsNotEmpty import java.io.File diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteToFileStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/files/uss/WriteToFileStep.kt similarity index 96% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/WriteToFileStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/files/uss/WriteToFileStep.kt index a423d70..1cfa181 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/WriteToFileStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/files/uss/WriteToFileStep.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2023 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.uss import hudson.Extension import hudson.Launcher @@ -19,7 +19,7 @@ import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.QueryParameter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep +import org.zowe.zdevops.classic.core.AbstractBuildStep import org.zowe.zdevops.logic.writeToFile import org.zowe.zdevops.utils.validateFieldIsNotEmpty diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/SubmitJobStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/jobs/SubmitJobStep.kt similarity index 96% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/SubmitJobStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/jobs/SubmitJobStep.kt index a016451..0e05688 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/SubmitJobStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/jobs/SubmitJobStep.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.jobs import hudson.AbortException import hudson.Extension @@ -24,7 +24,7 @@ import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.QueryParameter import org.kohsuke.stapler.bind.JavaScriptMethod import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep +import org.zowe.zdevops.classic.core.AbstractBuildStep import org.zowe.zdevops.logic.submitJob import org.zowe.zdevops.logic.submitJobSync import org.zowe.zdevops.utils.validateFieldIsNotEmpty diff --git a/src/main/kotlin/org/zowe/zdevops/classic/steps/PerformTsoCommandStep.kt b/src/main/kotlin/org/zowe/zdevops/classic/tso/PerformTsoCommandStep.kt similarity index 97% rename from src/main/kotlin/org/zowe/zdevops/classic/steps/PerformTsoCommandStep.kt rename to src/main/kotlin/org/zowe/zdevops/classic/tso/PerformTsoCommandStep.kt index 57639a2..7a657b8 100644 --- a/src/main/kotlin/org/zowe/zdevops/classic/steps/PerformTsoCommandStep.kt +++ b/src/main/kotlin/org/zowe/zdevops/classic/tso/PerformTsoCommandStep.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2023 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.tso import hudson.Extension import hudson.Launcher @@ -19,7 +19,7 @@ import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.QueryParameter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.classic.AbstractBuildStep +import org.zowe.zdevops.classic.core.AbstractBuildStep import org.zowe.zdevops.logic.performTsoCommand import org.zowe.zdevops.utils.validateFieldIsNotEmpty diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/PerformMvsCommandDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/console/PerformMvsCommandDeclarative.kt similarity index 92% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/PerformMvsCommandDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/console/PerformMvsCommandDeclarative.kt index c21142e..a10ecb8 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/PerformMvsCommandDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/console/PerformMvsCommandDeclarative.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.console import hudson.AbortException import hudson.EnvVars @@ -21,7 +21,7 @@ import hudson.FilePath import hudson.model.TaskListener import org.kohsuke.stapler.DataBoundConstructor import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.zdevops.declarative.AbstractZosmfActionWithResult +import org.zowe.zdevops.declarative.core.AbstractZosmfActionWithResult import org.zowe.zdevops.logic.performMvsCommand /** diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/AbstractZosmfAction.kt b/src/main/kotlin/org/zowe/zdevops/declarative/core/AbstractZosmfAction.kt similarity index 97% rename from src/main/kotlin/org/zowe/zdevops/declarative/AbstractZosmfAction.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/core/AbstractZosmfAction.kt index e985c1e..9efb67c 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/AbstractZosmfAction.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/core/AbstractZosmfAction.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.declarative +package org.zowe.zdevops.declarative.core import hudson.AbortException import hudson.EnvVars diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/AbstractZosmfActionWithResult.kt b/src/main/kotlin/org/zowe/zdevops/declarative/core/AbstractZosmfActionWithResult.kt similarity index 98% rename from src/main/kotlin/org/zowe/zdevops/declarative/AbstractZosmfActionWithResult.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/core/AbstractZosmfActionWithResult.kt index 88c920d..67cc4d5 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/AbstractZosmfActionWithResult.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/core/AbstractZosmfActionWithResult.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.declarative +package org.zowe.zdevops.declarative.core import hudson.EnvVars import hudson.FilePath diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/ZosmfExecution.kt b/src/main/kotlin/org/zowe/zdevops/declarative/core/ZosmfExecution.kt similarity index 97% rename from src/main/kotlin/org/zowe/zdevops/declarative/ZosmfExecution.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/core/ZosmfExecution.kt index b8ea61d..364dca1 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/ZosmfExecution.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/core/ZosmfExecution.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.declarative +package org.zowe.zdevops.declarative.core import hudson.FilePath import org.jenkinsci.plugins.workflow.steps.BodyExecutionCallback diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/ZosmfStepDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/core/ZosmfStepDeclarative.kt similarity index 97% rename from src/main/kotlin/org/zowe/zdevops/declarative/ZosmfStepDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/core/ZosmfStepDeclarative.kt index 3a99a10..dfa3d05 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/ZosmfStepDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/core/ZosmfStepDeclarative.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.declarative +package org.zowe.zdevops.declarative.core import hudson.EnvVars import hudson.Extension diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/AllocateDatasetDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/AllocateDatasetDeclarative.kt similarity index 97% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/AllocateDatasetDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/AllocateDatasetDeclarative.kt index 09c63ed..da6052d 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/AllocateDatasetDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/AllocateDatasetDeclarative.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn import hudson.EnvVars import hudson.Extension @@ -22,7 +22,7 @@ import org.kohsuke.stapler.DataBoundSetter import org.zowe.kotlinsdk.* import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.Messages -import org.zowe.zdevops.declarative.AbstractZosmfAction +import org.zowe.zdevops.declarative.core.AbstractZosmfAction import org.zowe.zdevops.logic.allocateDataset /** diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/DeleteDatasetDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/DeleteDatasetDeclarative.kt similarity index 95% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/DeleteDatasetDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/DeleteDatasetDeclarative.kt index 2f15342..49bcf9f 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/DeleteDatasetDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/DeleteDatasetDeclarative.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn import hudson.* import hudson.model.Run @@ -21,7 +21,8 @@ import org.jenkinsci.Symbol import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.DataBoundSetter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.zdevops.declarative.AbstractZosmfAction +import org.zowe.zdevops.declarative.core.AbstractZosmfAction +import org.zowe.zdevops.declarative.jobs.zMessages import org.zowe.zdevops.logic.deleteDatasetOrMember /** diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/DeleteDatasetsByMaskDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/DeleteDatasetsByMaskDeclarative.kt similarity index 94% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/DeleteDatasetsByMaskDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/DeleteDatasetsByMaskDeclarative.kt index e91566e..23da8fb 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/DeleteDatasetsByMaskDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/DeleteDatasetsByMaskDeclarative.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn import hudson.* import hudson.model.Run @@ -17,7 +17,8 @@ import org.jenkinsci.Symbol import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.DataBoundSetter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.zdevops.declarative.AbstractZosmfAction +import org.zowe.zdevops.declarative.core.AbstractZosmfAction +import org.zowe.zdevops.declarative.jobs.zMessages import org.zowe.zdevops.logic.deleteDatasetsByMask /** diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/DownloadFileDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/DownloadFileDeclarative.kt similarity index 92% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/DownloadFileDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/DownloadFileDeclarative.kt index f5231b6..2710ec7 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/DownloadFileDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/DownloadFileDeclarative.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn import hudson.EnvVars import hudson.Extension @@ -24,7 +24,8 @@ import org.jenkinsci.Symbol import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.DataBoundSetter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.zdevops.declarative.AbstractZosmfAction +import org.zowe.zdevops.declarative.core.AbstractZosmfAction +import org.zowe.zdevops.declarative.jobs.zMessages import org.zowe.zdevops.logic.downloadDSOrDSMemberByType class DownloadFileDeclarative @DataBoundConstructor constructor(val dsn: String) : diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteDirToDatasetDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteDirToDatasetDeclarative.kt new file mode 100644 index 0000000..ecf82d5 --- /dev/null +++ b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteDirToDatasetDeclarative.kt @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025 IBA Group. + * + * This program and the accompanying materials are made available 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 + * + * Contributors: + * IBA Group + * Zowe Community + */ + +package org.zowe.zdevops.declarative.files.dsn + +import hudson.EnvVars +import hudson.Extension +import hudson.FilePath +import hudson.Launcher +import hudson.model.Run +import hudson.model.TaskListener +import org.jenkinsci.Symbol +import org.kohsuke.stapler.DataBoundConstructor +import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection +import org.zowe.zdevops.declarative.core.AbstractZosmfAction +import org.zowe.zdevops.declarative.jobs.zMessages +import org.zowe.zdevops.logic.writeDirectoryToPdsJenkins + +/** + * A declarative class for writing the contents of a directory to a PDS/E dataset. + * + * This class is designed to be used within a Jenkins pipeline as a step that writes files from a directory + * to a specified z/OS dataset. It supports both local and build workspace-relative directory paths. + * + * @param dsn the dataset name (DSN) where the contents of the directory will be written. + * @param dir the path to the directory containing the files to be written. + * @param isLocalPath a flag indicating if the directory path is local (true) or relative to the build workspace (false). + */ +class WriteDirToDatasetDeclarative +@DataBoundConstructor constructor( + private val dsn: String, + private val dir: String, + private val isLocalPath: Boolean = false, +) : AbstractZosmfAction() { + + fun getDsn(): String { + return dsn + } + + fun getDir(): String { + return dir + } + + fun getIsLocalPath(): Boolean { + return isLocalPath + } + + override val exceptionMessage: String = zMessages.zdevops_declarative_writing_DS_fail(dsn) + + + override fun perform( + run: Run<*, *>, + workspace: FilePath, + env: EnvVars, + launcher: Launcher, + listener: TaskListener, + zosConnection: ZOSConnection + ) { + writeDirectoryToPdsJenkins(dsn, dir, isLocalPath, workspace, listener, zosConnection) + } + + @Symbol("writeDirToDS") + @Extension + class DescriptorImpl : Companion.DefaultBuildDescriptor("Write directory to PDS Dataset Declarative") +} diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteFIleToMemberDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteFIleToMemberDeclarative.kt similarity index 63% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteFIleToMemberDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteFIleToMemberDeclarative.kt index 36c3b87..d85549b 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteFIleToMemberDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteFIleToMemberDeclarative.kt @@ -1,24 +1,31 @@ /* + * Copyright (c) 2022-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2022 + * Contributors: + * IBA Group + * Zowe Community */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn -import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.kotlinsdk.zowe.client.sdk.zosfiles.ZosDsn -import org.zowe.zdevops.declarative.AbstractZosmfAction -import hudson.* +import hudson.EnvVars +import hudson.Extension import hudson.FilePath +import hudson.Launcher import hudson.model.Run import hudson.model.TaskListener import org.jenkinsci.Symbol import org.kohsuke.stapler.DataBoundConstructor +import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection +import org.zowe.zdevops.declarative.core.AbstractZosmfAction +import org.zowe.zdevops.declarative.jobs.zMessages +import org.zowe.zdevops.logic.writeTextToDatasetJenkins import java.io.File import java.nio.file.Paths @@ -46,18 +53,8 @@ class WriteFIleToMemberDeclarative @DataBoundConstructor constructor(private val File("$workspacePath$file") } - val targetDS = ZosDsn(zosConnection).getDatasetInfo(dsn) - val targetDSLRECL = targetDS.recordLength ?: throw AbortException(zMessages.zdevops_declarative_writing_DS_no_info(dsn)) - val ineligibleStrings = textFile - .readLines() - .map { it.length } - .fold(0) { result, currStrLength -> if (currStrLength > targetDSLRECL) result + 1 else result } - if (ineligibleStrings > 0) { - throw AbortException(zMessages.zdevops_declarative_writing_DS_ineligible_strings(ineligibleStrings, dsn)) - } - val textString = textFile.readText().replace("\r","") - ZosDsn(zosConnection).writeDsn(dsn, member, textString.toByteArray()) - listener.logger.println(zMessages.zdevops_declarative_writing_DS_success(dsn)) + listener.logger.println("[WARNING] - The method `writeFileToMember` is deprecated. Please, consider switching to `writeFileToDataset`.") + writeTextToDatasetJenkins(listener, zosConnection, "$dsn($member)", textFile.readText()) } diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToDatasetDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteFileToDatasetDeclarative.kt similarity index 61% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToDatasetDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteFileToDatasetDeclarative.kt index ef4ffe5..63c11d9 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToDatasetDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteFileToDatasetDeclarative.kt @@ -1,24 +1,31 @@ /* + * Copyright (c) 2022-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2022 + * Contributors: + * IBA Group + * Zowe Community */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn -import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.kotlinsdk.zowe.client.sdk.zosfiles.ZosDsn -import org.zowe.zdevops.declarative.AbstractZosmfAction -import hudson.* +import hudson.EnvVars +import hudson.Extension import hudson.FilePath +import hudson.Launcher import hudson.model.Run import hudson.model.TaskListener import org.jenkinsci.Symbol import org.kohsuke.stapler.DataBoundConstructor +import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection +import org.zowe.zdevops.declarative.core.AbstractZosmfAction +import org.zowe.zdevops.declarative.jobs.zMessages +import org.zowe.zdevops.logic.writeTextToDatasetJenkins import java.io.File import java.nio.file.Paths @@ -45,23 +52,7 @@ class WriteFileToDatasetDeclarative @DataBoundConstructor constructor(private va File("$workspacePath$file") } - val targetDS = ZosDsn(zosConnection).getDatasetInfo(dsn) - if (targetDS.recordLength == null) { - throw AbortException(zMessages.zdevops_declarative_writing_DS_no_info(dsn)) - } - var ineligibleStrings = 0 - textFile.readLines().forEach { - if (it.length > targetDS.recordLength!!) { - ineligibleStrings++ - } - } - if (ineligibleStrings > 0) { - throw AbortException(zMessages.zdevops_declarative_writing_DS_ineligible_strings(ineligibleStrings,dsn)) - } else { - val textString = textFile.readText().replace("\r","") - ZosDsn(zosConnection).writeDsn(dsn, textString.toByteArray()) - listener.logger.println(zMessages.zdevops_declarative_writing_DS_success(dsn)) - } + writeTextToDatasetJenkins(listener, zosConnection, dsn, textFile.readText()) } diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteToDatasetDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteToDatasetDeclarative.kt similarity index 70% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteToDatasetDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteToDatasetDeclarative.kt index 4b31e42..3c7a717 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteToDatasetDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteToDatasetDeclarative.kt @@ -1,23 +1,31 @@ /* + * Copyright (c) 2022-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2022 + * Contributors: + * IBA Group + * Zowe Community */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn -import hudson.* +import hudson.EnvVars +import hudson.Extension +import hudson.FilePath +import hudson.Launcher import hudson.model.Run import hudson.model.TaskListener import org.jenkinsci.Symbol import org.kohsuke.stapler.DataBoundConstructor import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.zdevops.declarative.AbstractZosmfAction -import org.zowe.zdevops.logic.writeToDataset +import org.zowe.zdevops.declarative.core.AbstractZosmfAction +import org.zowe.zdevops.declarative.jobs.zMessages +import org.zowe.zdevops.logic.writeTextToDatasetJenkins class WriteToDatasetDeclarative @DataBoundConstructor constructor(private val dsn: String, private val text: String) : @@ -33,7 +41,7 @@ class WriteToDatasetDeclarative @DataBoundConstructor constructor(private val ds listener: TaskListener, zosConnection: ZOSConnection ) { - writeToDataset(listener, zosConnection, dsn, text) + writeTextToDatasetJenkins(listener, zosConnection, dsn, text) } diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteToMemberDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteToMemberDeclarative.kt similarity index 66% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteToMemberDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteToMemberDeclarative.kt index fc2e833..0be0936 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteToMemberDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteToMemberDeclarative.kt @@ -1,23 +1,31 @@ /* + * Copyright (c) 2022-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2022 + * Contributors: + * IBA Group + * Zowe Community */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn -import hudson.* +import hudson.EnvVars +import hudson.Extension +import hudson.FilePath +import hudson.Launcher import hudson.model.Run import hudson.model.TaskListener import org.jenkinsci.Symbol import org.kohsuke.stapler.DataBoundConstructor import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.zdevops.declarative.AbstractZosmfAction -import org.zowe.zdevops.logic.writeToMember +import org.zowe.zdevops.declarative.core.AbstractZosmfAction +import org.zowe.zdevops.declarative.jobs.zMessages +import org.zowe.zdevops.logic.writeTextToDatasetJenkins class WriteToMemberDeclarative @DataBoundConstructor constructor(private val dsn: String, private val member: String, @@ -34,7 +42,8 @@ class WriteToMemberDeclarative @DataBoundConstructor constructor(private val dsn listener: TaskListener, zosConnection: ZOSConnection ) { - writeToMember(listener, zosConnection, dsn, member, text) + listener.logger.println("[WARNING] - The method `writeToMember` is deprecated. Please, consider switching to `writeToDS`.") + writeTextToDatasetJenkins(listener, zosConnection, "$dsn($member)", text) } diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToFileDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/files/uss/WriteFileToFileDeclarative.kt similarity index 92% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToFileDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/files/uss/WriteFileToFileDeclarative.kt index 8e57f4e..14c8f04 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToFileDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/files/uss/WriteFileToFileDeclarative.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.uss import hudson.* import hudson.model.Run @@ -17,7 +17,8 @@ import org.jenkinsci.Symbol import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.DataBoundSetter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.zdevops.declarative.AbstractZosmfAction +import org.zowe.zdevops.declarative.core.AbstractZosmfAction +import org.zowe.zdevops.declarative.jobs.zMessages import org.zowe.zdevops.logic.writeToFile import java.io.File import java.nio.file.Paths diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteToFileDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/files/uss/WriteToFileDeclarative.kt similarity index 91% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteToFileDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/files/uss/WriteToFileDeclarative.kt index e9b32f8..a732688 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/WriteToFileDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/files/uss/WriteToFileDeclarative.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.uss import hudson.* import hudson.model.Run @@ -17,7 +17,8 @@ import org.jenkinsci.Symbol import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.DataBoundSetter import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.zdevops.declarative.AbstractZosmfAction +import org.zowe.zdevops.declarative.core.AbstractZosmfAction +import org.zowe.zdevops.declarative.jobs.zMessages import org.zowe.zdevops.logic.writeToFile diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobStepDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobStepDeclarative.kt index 0dcad5e..a38ed7d 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobStepDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobStepDeclarative.kt @@ -16,7 +16,7 @@ import hudson.model.TaskListener import org.jenkinsci.Symbol import org.kohsuke.stapler.DataBoundConstructor import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.zdevops.declarative.AbstractZosmfAction +import org.zowe.zdevops.declarative.core.AbstractZosmfAction import org.zowe.zdevops.logic.submitJob typealias zMessages = org.zowe.zdevops.Messages diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobSyncStepDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobSyncStepDeclarative.kt index 762b0ca..ce9d71c 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobSyncStepDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobSyncStepDeclarative.kt @@ -20,7 +20,7 @@ import hudson.FilePath import hudson.model.TaskListener import org.kohsuke.stapler.DataBoundConstructor import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.zdevops.declarative.AbstractZosmfActionWithResult +import org.zowe.zdevops.declarative.core.AbstractZosmfActionWithResult import org.zowe.zdevops.logic.submitJobSync /** diff --git a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/PerformTsoCommandDeclarative.kt b/src/main/kotlin/org/zowe/zdevops/declarative/tso/PerformTsoCommandDeclarative.kt similarity index 93% rename from src/main/kotlin/org/zowe/zdevops/declarative/jobs/PerformTsoCommandDeclarative.kt rename to src/main/kotlin/org/zowe/zdevops/declarative/tso/PerformTsoCommandDeclarative.kt index d7bd637..c309642 100644 --- a/src/main/kotlin/org/zowe/zdevops/declarative/jobs/PerformTsoCommandDeclarative.kt +++ b/src/main/kotlin/org/zowe/zdevops/declarative/tso/PerformTsoCommandDeclarative.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.tso import hudson.AbortException import hudson.EnvVars @@ -21,7 +21,7 @@ import hudson.FilePath import hudson.model.TaskListener import org.kohsuke.stapler.DataBoundConstructor import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection -import org.zowe.zdevops.declarative.AbstractZosmfActionWithResult +import org.zowe.zdevops.declarative.core.AbstractZosmfActionWithResult import org.zowe.zdevops.logic.performTsoCommand /** diff --git a/src/main/kotlin/org/zowe/zdevops/logic/WriteOperation.kt b/src/main/kotlin/org/zowe/zdevops/logic/WriteOperation.kt index 128494a..59e5902 100644 --- a/src/main/kotlin/org/zowe/zdevops/logic/WriteOperation.kt +++ b/src/main/kotlin/org/zowe/zdevops/logic/WriteOperation.kt @@ -1,107 +1,72 @@ /* + * Copyright (c) 2023-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2023 + * Contributors: + * IBA Group + * Zowe Community */ package org.zowe.zdevops.logic import hudson.AbortException +import hudson.FilePath import hudson.model.TaskListener import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.kotlinsdk.zowe.client.sdk.zosfiles.ZosDsn import org.zowe.kotlinsdk.zowe.client.sdk.zosuss.ZosUssFile import org.zowe.zdevops.Messages +import org.zowe.zdevops.declarative.jobs.zMessages import org.zowe.zdevops.utils.runMFTryCatchWrappedQuery - +import java.io.File /** - * Validates the text to be written to a dataset + * Parse dataset name and member name out of full dataset name * - * @param listener The listener for logging messages - * @param zosConnection The ZOSConnection for interacting with z/OS - * @param dsn The name of the dataset - * @param text The text content to be written - * @throws AbortException if the text is empty or contains ineligible strings. + * @param fullName The name of a dataset in the form `DATASET.NAME` or `DATASET.NAME(MEMBER)` + * @return (dataset, member) pair, where member name can be null */ -private fun validateTextForDataset( - listener: TaskListener, - zosConnection: ZOSConnection, - dsn: String, - text: String, - ) { - if(text == "") { - listener.logger.println(Messages.zdevops_declarative_writing_skip()) - return - } - - val stringList = text.split('\n') - val targetDS = ZosDsn(zosConnection).getDatasetInfo(dsn) - if (targetDS.recordLength == null) { - throw AbortException(Messages.zdevops_declarative_writing_DS_no_info(dsn)) - } - var ineligibleStrings = 0 - stringList.forEach { - if (it.length > targetDS.recordLength!!) { - ineligibleStrings++ - } - } - if (ineligibleStrings > 0) { - throw AbortException(Messages.zdevops_declarative_writing_DS_ineligible_strings(ineligibleStrings,dsn)) - } +fun parseDatasetName(fullName: String): Pair { + val dataset = fullName.substringBefore("(") + val member = if (fullName.contains("(")) { + fullName.substringAfter("(").substringBefore(")").takeIf { it.isNotEmpty() } + } else { + null + } + return dataset to member } /** - * Writes the text content to a dataset + * Jenkins method that writes a text to a dataset * * @param listener The listener for logging messages * @param zosConnection The ZOSConnection for interacting with z/OS - * @param dsn The name of the dataset + * @param dsn The name of a dataset in the form `DATASET.NAME` or `DATASET.NAME(MEMBER)` * @param text The text content to be written * @throws AbortException if the text is not valid for the dataset or an error occurs during the write operation */ -fun writeToDataset(listener: TaskListener, - zosConnection: ZOSConnection, - dsn: String, - text: String, +fun writeTextToDatasetJenkins(listener: TaskListener, + zosConnection: ZOSConnection, + dsn: String, + text: String, ) { - validateTextForDataset(listener, zosConnection, dsn, text) - val textByteArray = text.replace("\r","").toByteArray() - runMFTryCatchWrappedQuery(listener) { - ZosDsn(zosConnection).writeDsn(dsn, textByteArray) - } - listener.logger.println(Messages.zdevops_declarative_writing_DS_success(dsn)) + val (dataset, member) = parseDatasetName(dsn) + validateExceedingLines(zosConnection, dataset, text.split('\n')) + if (member.isNullOrBlank()) { + writeToPS(text, dataset, zosConnection) + } else { + writeToPDS(text, dataset, member, zosConnection) + } + listener.logger.println(Messages.zdevops_declarative_writing_DS_success(dsn)) } -/** - * Writes the text content to a member - * - * @param listener The listener for logging messages - * @param zosConnection The ZOSConnection for interacting with z/OS - * @param dsn The name of the dataset - * @param member The name of the member - * @param text The text content to be written - * @throws AbortException if the text is not valid for the dataset or an error occurs during the write operation - */ -fun writeToMember(listener: TaskListener, - zosConnection: ZOSConnection, - dsn: String, - member: String, - text: String,) { - validateTextForDataset(listener, zosConnection, dsn, text) - val textByteArray = text.replace("\r","").toByteArray() - runMFTryCatchWrappedQuery(listener) { - ZosDsn(zosConnection).writeDsn(dsn, member, textByteArray) - } - listener.logger.println(Messages.zdevops_declarative_writing_DS_success(dsn)) -} - //TODO: docs fun writeToFile(listener: TaskListener, zosConnection: ZOSConnection, @@ -121,3 +86,208 @@ fun writeToFile(listener: TaskListener, listener.logger.println(Messages.zdevops_declarative_writing_skip()) } } + +/** + * Finds the line numbers in a file where the line length exceeds a specified record length (LRECL). + * +// * @param file the file to be read and analyzed. + * @param text the text to validate for lines exceeding the target dataset's record length + * @param lrecl the maximum allowed record length for each line. + * @return a list of line numbers where the line length exceeds the specified LRECL. + */ +fun findLinesExceedingRecordLength(text: List, lrecl: Int): List { + return text.mapIndexedNotNull { index, line -> + if(line.length > lrecl) index + 1 else null + } +} + +/** + * Jenkins Step that writes the contents of a specified directory to a PDS/E dataset on z/OS. + * + * @param dsn the dataset name (DSN) where the contents of the directory will be written. + * @param dir the path to the directory containing the files to be written. + * @param isLocalPath a flag indicating if the provided directory path is local (true) or relative to the workspace (false). + * @param workspace the root workspace path used to resolve relative paths if `isLocalPath` is false. + * @param listener the task listener used for logging and user feedback during execution. + * @param zosConnection the connection information for interacting with the z/OS system. + * @throws AbortException if the dataset information cannot be retrieved. + * @throws IllegalArgumentException if the provided directory path does not exist or is invalid. + */ +fun writeDirectoryToPdsJenkins( + dsn: String, + dir: String, + isLocalPath: Boolean, + workspace: FilePath, + listener: TaskListener, + zosConnection: ZOSConnection, +) { + listener.logger.println(zMessages.zdevops_declarative_writing_DS_from_dir(dsn, dir, zosConnection.host, zosConnection.zosmfPort)) + + val localOrWsDirPath = resolveDirectoryPath(dir, isLocalPath, listener, workspace) + validatePathExists(localOrWsDirPath) + validatePathLeadsToDirectory(localOrWsDirPath) + val directoryEntries = localOrWsDirPath.listFiles().orEmpty() + if (directoryEntries.isEmpty()) { + listener.logger.println("Warning: The directory '$localOrWsDirPath' is empty.") + return + } + + listener.logger.println("Found ${directoryEntries.size} entries in the directory:") + directoryEntries.forEachIndexed { index, entry -> processEntry(index, entry, dsn, listener, zosConnection) } + + listener.logger.println(zMessages.zdevops_declarative_writing_DS_success(dsn)) +} + + +/** + * Resolves the directory path based on whether it is a local path or a Jenkins workspace-relative path. + * + * @param dir the directory path to resolve. + * @param isLocalPath a flag indicating if the provided path is local (true) or relative to the workspace (false). + * @param listener the task listener used for logging information about the resolution process. + * @param workspace the root workspace path used to construct the resolved path if `isLocalPath` is false. + * @return the resolved directory as a `File` object. + */ +private fun resolveDirectoryPath(dir: String, isLocalPath: Boolean, listener: TaskListener, workspace: FilePath): File { + return if (isLocalPath) { + listener.logger.println("Using local path.") + File(dir) + } else { + val workspacePath = "${workspace.parent}${File.separator}$dir" + listener.logger.println("Using workspace path: '$workspacePath'.") + File(workspacePath) + } +} + +/** + * Validates that the specified file path exists. + * + * @param path the file or directory to check for existence. + * @throws AbortException if the specified path does not exist. + */ +fun validatePathExists(path: File) { + if (!path.exists()) { + throw AbortException("The path '$path' does not exist.") + } +} + +/** + * Validates that the specified file path is a directory. + * + * @param dir the file to check. + * @throws AbortException if the specified path is not a directory. + */ +fun validatePathLeadsToDirectory(dir: File) { + if (!dir.isDirectory) { + throw AbortException("The path '$dir' is not a directory.") + } +} + +/** + * Processes a single file or directory entry from a directory listing during iteration. + * + * @param index the current index of the entry in the directory listing. + * @param entry the file or directory being processed. + * @param dsn the dataset name (DSN) where the file will be written. + * @param listener the task listener used for logging progress and feedback. + * @param zosConnection the connection information for interacting with z/OS system. + * + * Logs details about the entry and writes the file to the dataset if the entry is a regular file. + * Skips processing if the entry is a directory. + */ +private fun processEntry( + index: Int, + entry: File, + dsn: String, + listener: TaskListener, + zosConnection: ZOSConnection +) { + if (entry.isDirectory) { + listener.logger.println("[$index] - Skipping directory entry: '${entry.name}'.") + return + } + listener.logger.println("[$index] - Processing entry: '${entry.name}'") + writeFileToPDS(entry, dsn, zosConnection) +} + +/** + * Writes the contents of a file to a member of the specified dataset on z/OS. + * + * @param file the file whose contents will be written to the dataset. + * @param dsn the dataset name (DSN) where the file content will be written. + * @param zosConnection the connection information for interacting with the z/OS system. + * + * @throws AbortException if the file contains lines exceeding the dataset's record length. + * + * The file content is written to a member in the specified dataset, + * using the file's name (without extension) as the member name. + */ +fun writeFileToPDS( + file: File, + dsn: String, + zosConnection: ZOSConnection, +) { + validateExceedingLines(zosConnection, dsn, file.readLines()) + writeToPDS(file.readText(), dsn, file.nameWithoutExtension, zosConnection) +} + +/** + * This function validates that text conform to the specified record length (LRECL). + * If any line exceeds this length, an error is logged, and the operation is aborted. + * + * @param dsn the dataset name (DSN) where the file content will be written. + * @param text the text to validate for lines exceeding the target dataset's record length + * @param zosConnection the connection information for interacting with the z/OS system. + * @throws AbortException if the file contains lines exceeding the dataset's record length. + */ +fun validateExceedingLines( + zosConnection: ZOSConnection, + dsn: String, + text: List +) { + val targetDS = ZosDsn(zosConnection).getDatasetInfo(dsn) + val lrecl = targetDS.recordLength ?: throw AbortException(zMessages.zdevops_declarative_writing_DS_no_info(dsn)) + + val exceedingLines = findLinesExceedingRecordLength(text, lrecl) + if (exceedingLines.isNotEmpty()) { + throw AbortException( + "Error: Text contains lines exceeding record length '$lrecl' of dataset '$dsn'. " + + "Exceeding line numbers: $exceedingLines" + ) + } +} + +/** + * Writes the provided text to a specific member of a Partitioned Data Set (PDS) on z/OS. + * + * @param text the content to write to the dataset member. + * @param dsn the dataset name (DSN) where the member resides. + * @param member the name of the member within the dataset to write to. + * @param zosConnection the connection information for interacting with the z/OS system. + */ +fun writeToPDS(text: String, dsn: String, member: String, zosConnection: ZOSConnection) { + ZosDsn(zosConnection).writeDsn(dsn, member, prepareTextForWritingToDS(text)) +} + +/** + * Writes the provided text to a Sequential Data Set (PS) on z/OS. + * + * @param text the content to write to the dataset. + * @param dsn the dataset name (DSN). + * @param zosConnection the connection information for interacting with the z/OS system. + */ +fun writeToPS(text: String, dsn: String, zosConnection: ZOSConnection) { + ZosDsn(zosConnection).writeDsn(dsn, prepareTextForWritingToDS(text)) +} + +/** + * Prepares the provided text for writing to a dataset by removing carriage return characters and converting it to a byte array. + * + * @param text the text to be prepared for writing to the dataset. + * @return a byte array representing the prepared text. + * + * Carriage return characters create additional empty records after each line. That's why they should be removed + */ +fun prepareTextForWritingToDS(text: String): ByteArray { + return text.replace("\r","").toByteArray() +} \ No newline at end of file diff --git a/src/main/resources/org/zowe/zdevops/Messages.properties b/src/main/resources/org/zowe/zdevops/Messages.properties index 4350a54..65f9709 100644 --- a/src/main/resources/org/zowe/zdevops/Messages.properties +++ b/src/main/resources/org/zowe/zdevops/Messages.properties @@ -65,6 +65,7 @@ zdevops_declarative_DSN_allocating=Allocating dataset {0} with connection: {1}:{ zdevops_declarative_DSN_allocated_success=Dataset {0} has been allocated successfully. zdevops_declarative_DSN_allocated_fail=Cannot allocate dataset {0}. zdevops_declarative_writing_DS_from_file=Writing to dataset {0} from file {1} with connection: {2}:{3} +zdevops_declarative_writing_DS_from_dir=Writing to dataset {0} from directory {1} with connection: {2}:{3} zdevops_declarative_writing_DS_success=Data has been written to dataset {0} successfully. zdevops_declarative_writing_DS_from_input=Writing to dataset {0} from input string with connection: {1}:{2} zdevops_declarative_writing_skip=No data was provided. Add non-empty datasource to your pipeline call/step. diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/PerformMvsCommandStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/console/PerformMvsCommandStep/config.jelly similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/PerformMvsCommandStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/console/PerformMvsCommandStep/config.jelly diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/PerformMvsCommandStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/console/PerformMvsCommandStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/PerformMvsCommandStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/console/PerformMvsCommandStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/AllocateDatasetStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/files/dsn/AllocateDatasetStep/config.jelly similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/AllocateDatasetStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/AllocateDatasetStep/config.jelly diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/AllocateDatasetStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/files/dsn/AllocateDatasetStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/AllocateDatasetStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/AllocateDatasetStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/DeleteDatasetStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/files/dsn/DeleteDatasetStep/config.jelly similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/DeleteDatasetStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/DeleteDatasetStep/config.jelly diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/DeleteDatasetStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/files/dsn/DeleteDatasetStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/DeleteDatasetStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/DeleteDatasetStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/DeleteDatasetsByMaskStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/files/dsn/DeleteDatasetsByMaskStep/config.jelly similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/DeleteDatasetsByMaskStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/DeleteDatasetsByMaskStep/config.jelly diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/DeleteDatasetsByMaskStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/files/dsn/DeleteDatasetsByMaskStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/DeleteDatasetsByMaskStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/DeleteDatasetsByMaskStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/DownloadDatasetStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/files/dsn/DownloadDatasetStep/config.jelly similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/DownloadDatasetStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/DownloadDatasetStep/config.jelly diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/DownloadDatasetStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/files/dsn/DownloadDatasetStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/DownloadDatasetStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/DownloadDatasetStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteDirToDatasetStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteDirToDatasetStep/config.jelly new file mode 100644 index 0000000..9157c42 --- /dev/null +++ b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteDirToDatasetStep/config.jelly @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteDirToDatasetStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteDirToDatasetStep/config.properties new file mode 100644 index 0000000..de08748 --- /dev/null +++ b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteDirToDatasetStep/config.properties @@ -0,0 +1,6 @@ +zdevops.classic.connection.title=z/OS connection +zdevops.classic.datasetName.title=Dataset name +zdevops.classic.isLocalPath.title=Use local path +zdevops.classic.isLocalPath.description=Flag indicating if the provided path is local (true) or relative to the Jenkins build workspace (false) + +zdevops.classic.dir.title=Path to the directory \ No newline at end of file diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToDatasetStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteFileToDatasetStep/config.jelly similarity index 96% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToDatasetStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteFileToDatasetStep/config.jelly index c549491..2031cfa 100644 --- a/src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToDatasetStep/config.jelly +++ b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteFileToDatasetStep/config.jelly @@ -9,7 +9,7 @@ - + diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToDatasetStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteFileToDatasetStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToDatasetStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteFileToDatasetStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToMemberStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteFileToMemberStep/config.jelly similarity index 96% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToMemberStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteFileToMemberStep/config.jelly index ca04f62..0fe2acc 100644 --- a/src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToMemberStep/config.jelly +++ b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteFileToMemberStep/config.jelly @@ -6,6 +6,8 @@ +

The method is deprecated. Please, consider switching to `Write File to Dataset` step.

+ diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToMemberStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteFileToMemberStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToMemberStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteFileToMemberStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteToDatasetStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteToDatasetStep/config.jelly similarity index 82% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteToDatasetStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteToDatasetStep/config.jelly index 790c607..776e474 100644 --- a/src/main/resources/org/zowe/zdevops/classic/steps/WriteToDatasetStep/config.jelly +++ b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteToDatasetStep/config.jelly @@ -6,7 +6,7 @@ - + diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteToDatasetStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteToDatasetStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteToDatasetStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteToDatasetStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteToMemberStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteToMemberStep/config.jelly similarity index 85% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteToMemberStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteToMemberStep/config.jelly index 28010fd..d25015b 100644 --- a/src/main/resources/org/zowe/zdevops/classic/steps/WriteToMemberStep/config.jelly +++ b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteToMemberStep/config.jelly @@ -3,6 +3,9 @@ + +

The method is deprecated. Please, consider switching to `Write to Dataset` step.

+ diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteToMemberStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteToMemberStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteToMemberStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/files/dsn/WriteToMemberStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToFileStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/files/uss/WriteFileToFileStep/config.jelly similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToFileStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/files/uss/WriteFileToFileStep/config.jelly diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToFileStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/files/uss/WriteFileToFileStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteFileToFileStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/files/uss/WriteFileToFileStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteToFileStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/files/uss/WriteToFileStep/config.jelly similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteToFileStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/files/uss/WriteToFileStep/config.jelly diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/WriteToFileStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/files/uss/WriteToFileStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/WriteToFileStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/files/uss/WriteToFileStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/SubmitJobStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/jobs/SubmitJobStep/config.jelly similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/SubmitJobStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/jobs/SubmitJobStep/config.jelly diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/SubmitJobStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/jobs/SubmitJobStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/SubmitJobStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/jobs/SubmitJobStep/config.properties diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/PerformTsoCommandStep/config.jelly b/src/main/resources/org/zowe/zdevops/classic/tso/PerformTsoCommandStep/config.jelly similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/PerformTsoCommandStep/config.jelly rename to src/main/resources/org/zowe/zdevops/classic/tso/PerformTsoCommandStep/config.jelly diff --git a/src/main/resources/org/zowe/zdevops/classic/steps/PerformTsoCommandStep/config.properties b/src/main/resources/org/zowe/zdevops/classic/tso/PerformTsoCommandStep/config.properties similarity index 100% rename from src/main/resources/org/zowe/zdevops/classic/steps/PerformTsoCommandStep/config.properties rename to src/main/resources/org/zowe/zdevops/classic/tso/PerformTsoCommandStep/config.properties diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/PerformTsoCommandStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/console/PerformTsoCommandStepSpec.kt similarity index 98% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/PerformTsoCommandStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/console/PerformTsoCommandStepSpec.kt index ff95f15..3badee3 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/PerformTsoCommandStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/console/PerformTsoCommandStepSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2023 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.console import hudson.model.Item import io.kotest.assertions.assertSoftly @@ -25,6 +25,8 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.classic.* +import org.zowe.zdevops.classic.tso.PerformTsoCommandStep import java.io.File import java.io.PrintStream diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/dummyClasses.kt b/src/test/kotlin/org/zowe/zdevops/classic/dummyClasses.kt similarity index 98% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/dummyClasses.kt rename to src/test/kotlin/org/zowe/zdevops/classic/dummyClasses.kt index 99c1b50..8cec3f7 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/dummyClasses.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/dummyClasses.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic import hudson.FilePath import hudson.Launcher diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/AllocateDatasetStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/AllocateDatasetStepSpec.kt similarity index 99% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/AllocateDatasetStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/files/dsn/AllocateDatasetStepSpec.kt index 1b2324f..3f3c7c1 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/AllocateDatasetStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/AllocateDatasetStepSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2023 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.model.Item import hudson.util.FormValidation @@ -31,6 +31,7 @@ import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.Messages import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.classic.* import java.io.File import java.io.PrintStream import java.nio.file.Paths diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetStepSpec.kt similarity index 94% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetStepSpec.kt index fa8b3f4..6c5013c 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetStepSpec.kt @@ -1,4 +1,4 @@ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.FilePath import hudson.model.Executor @@ -19,8 +19,12 @@ import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.Messages import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory -import org.zowe.zdevops.declarative.jobs.TestBuildListener -import org.zowe.zdevops.declarative.jobs.TestLauncher +import org.zowe.zdevops.classic.TestBuild +import org.zowe.zdevops.classic.TestItemGroup +import org.zowe.zdevops.classic.TestProject +import org.zowe.zdevops.classic.TestVirtualChannel +import org.zowe.zdevops.declarative.TestBuildListener +import org.zowe.zdevops.declarative.TestLauncher import java.io.File import java.io.PrintStream @@ -46,7 +50,7 @@ class DeleteDatasetStepSpec : ShouldSpec({ } } val project = TestProject(itemGroup, "test") - val build = object:TestBuild(project) { + val build = object: TestBuild(project) { override fun getExecutor(): Executor { val mockInstance = mockk() val mockDir = tempdir() diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetsByMaskStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetsByMaskStepSpec.kt similarity index 93% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetsByMaskStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetsByMaskStepSpec.kt index 87f0ea8..0e2d62d 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/DeleteDatasetsByMaskStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/DeleteDatasetsByMaskStepSpec.kt @@ -1,4 +1,4 @@ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.AbortException import hudson.FilePath @@ -19,8 +19,12 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory -import org.zowe.zdevops.declarative.jobs.TestBuildListener -import org.zowe.zdevops.declarative.jobs.TestLauncher +import org.zowe.zdevops.classic.TestBuild +import org.zowe.zdevops.classic.TestItemGroup +import org.zowe.zdevops.classic.TestProject +import org.zowe.zdevops.classic.TestVirtualChannel +import org.zowe.zdevops.declarative.TestBuildListener +import org.zowe.zdevops.declarative.TestLauncher import java.io.File import java.io.PrintStream import java.nio.file.Paths @@ -48,7 +52,7 @@ class DeleteDatasetsByMaskStepSpec : ShouldSpec({ } } val project = TestProject(itemGroup, "test") - val build = object:TestBuild(project) { + val build = object: TestBuild(project) { override fun getExecutor(): Executor { val mockInstance = mockk() val mockDir = Paths.get(rootDir, "src", "test", "resources", "mock", "test_file.txt").toString() diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/DownloadDatasetStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/DownloadDatasetStepSpec.kt similarity index 96% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/DownloadDatasetStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/files/dsn/DownloadDatasetStepSpec.kt index ec2f2a4..4f421cf 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/DownloadDatasetStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/DownloadDatasetStepSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2023 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.AbortException import hudson.EnvVars @@ -33,10 +33,12 @@ import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.Messages import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory -import org.zowe.zdevops.declarative.jobs.TestBuildListener -import org.zowe.zdevops.declarative.jobs.TestItemGroup -import org.zowe.zdevops.declarative.jobs.TestLauncher -import org.zowe.zdevops.declarative.jobs.TestVirtualChannel +import org.zowe.zdevops.classic.TestBuild +import org.zowe.zdevops.classic.TestProject +import org.zowe.zdevops.declarative.TestBuildListener +import org.zowe.zdevops.declarative.TestItemGroup +import org.zowe.zdevops.declarative.TestLauncher +import org.zowe.zdevops.declarative.TestVirtualChannel import java.io.File import java.io.PrintStream @@ -63,7 +65,7 @@ class DownloadDatasetStepSpec : ShouldSpec({ } } val project = TestProject(itemGroup, "test") - val build = object:TestBuild(project) { + val build = object: TestBuild(project) { override fun getExecutor(): Executor { val mockInstance = mockk() val mockDir = tempdir() diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteFileToDatasetStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToDatasetStepSpec.kt similarity index 97% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/WriteFileToDatasetStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToDatasetStepSpec.kt index 65517ac..f462830 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteFileToDatasetStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToDatasetStepSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2023 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.FilePath import hudson.model.Executor @@ -27,6 +27,7 @@ import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.Messages import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.classic.* import java.io.File import java.io.PrintStream import java.nio.file.Paths @@ -55,7 +56,7 @@ class WriteFileToDatasetStepSpec : ShouldSpec({ } } val project = TestProject(itemGroup, "test") - val build = object:TestBuild(project) { + val build = object: TestBuild(project) { override fun getExecutor(): Executor { val mockInstance = mockk() val mockDir = Paths.get(rootDir, "src", "test", "resources", "mock").toString() diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteFileToMemberStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToMemberStepSpec.kt similarity index 94% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/WriteFileToMemberStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToMemberStepSpec.kt index 160c276..71c7853 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteFileToMemberStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteFileToMemberStepSpec.kt @@ -1,14 +1,18 @@ /* + * Copyright (c) 2023-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2023 + * Contributors: + * IBA Group + * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.model.Item import hudson.util.FormValidation @@ -27,6 +31,7 @@ import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.Messages import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.classic.* import java.io.File import java.io.PrintStream import java.nio.file.Paths @@ -73,6 +78,8 @@ class WriteFileToMemberStepSpec : ShouldSpec({ isWritingToDataset = true } else if (firstArg().contains("Data has been written to dataset")) { isWritten = true + } else if (firstArg().contains("[WARNING] - The method is deprecated")) { + // ignore deprecation warning in tests } else { fail("Unexpected logger message: ${firstArg()}") } diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteToDatasetStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToDatasetStepSpec.kt similarity index 91% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/WriteToDatasetStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToDatasetStepSpec.kt index 09f4e3b..8eb97d7 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteToDatasetStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToDatasetStepSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2023 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.model.Item import io.kotest.assertions.assertSoftly @@ -25,10 +25,12 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory -import org.zowe.zdevops.declarative.jobs.TestBuildListener -import org.zowe.zdevops.declarative.jobs.TestItemGroup -import org.zowe.zdevops.declarative.jobs.TestLauncher -import org.zowe.zdevops.declarative.jobs.TestVirtualChannel +import org.zowe.zdevops.classic.TestBuild +import org.zowe.zdevops.classic.TestProject +import org.zowe.zdevops.declarative.TestBuildListener +import org.zowe.zdevops.declarative.TestItemGroup +import org.zowe.zdevops.declarative.TestLauncher +import org.zowe.zdevops.declarative.TestVirtualChannel import java.io.File import java.io.PrintStream diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteToMemberStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToMemberStepSpec.kt similarity index 93% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/WriteToMemberStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToMemberStepSpec.kt index fdac307..1608067 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteToMemberStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/files/dsn/WriteToMemberStepSpec.kt @@ -1,14 +1,18 @@ /* + * Copyright (c) 2023-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2023 + * Contributors: + * IBA Group + * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.dsn import hudson.model.Item import hudson.util.FormValidation @@ -27,6 +31,7 @@ import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.Messages import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.classic.* import java.io.File import java.io.PrintStream @@ -71,6 +76,8 @@ class WriteToMemberStepSpec : ShouldSpec({ isWritingToDataset = true } else if (firstArg().contains("Data has been written to dataset")) { isWritten = true + } else if (firstArg().contains("[WARNING] - The method is deprecated")) { + // ignore deprecation warning in tests } else { fail("Unexpected logger message: ${firstArg()}") } diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteFileToFileStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/files/uss/WriteFileToFileStepSpec.kt similarity index 97% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/WriteFileToFileStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/files/uss/WriteFileToFileStepSpec.kt index 18e3843..9969b6f 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteFileToFileStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/files/uss/WriteFileToFileStepSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2023 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.uss import hudson.FilePath import hudson.model.Executor @@ -29,6 +29,7 @@ import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.Messages import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.classic.* import java.io.File import java.io.PrintStream import java.nio.file.Paths @@ -56,7 +57,7 @@ class WriteFileToFileStepSpec : ShouldSpec({ } } val project = TestProject(itemGroup, "test") - val build = object:TestBuild(project) { + val build = object: TestBuild(project) { override fun getExecutor(): Executor { val mockInstance = mockk() val mockDir = Paths.get(rootDir, "src", "test", "resources", "mock").toString() diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteToFileStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/files/uss/WriteToFileStepSpec.kt similarity index 91% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/WriteToFileStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/files/uss/WriteToFileStepSpec.kt index 8c27957..d0aff0e 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/WriteToFileStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/files/uss/WriteToFileStepSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2023 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.files.uss import hudson.model.Item import io.kotest.assertions.assertSoftly @@ -25,10 +25,12 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory -import org.zowe.zdevops.declarative.jobs.TestBuildListener -import org.zowe.zdevops.declarative.jobs.TestItemGroup -import org.zowe.zdevops.declarative.jobs.TestLauncher -import org.zowe.zdevops.declarative.jobs.TestVirtualChannel +import org.zowe.zdevops.classic.TestBuild +import org.zowe.zdevops.classic.TestProject +import org.zowe.zdevops.declarative.TestBuildListener +import org.zowe.zdevops.declarative.TestItemGroup +import org.zowe.zdevops.declarative.TestLauncher +import org.zowe.zdevops.declarative.TestVirtualChannel import java.io.File import java.io.PrintStream diff --git a/src/test/kotlin/org/zowe/zdevops/classic/steps/SubmitJobStepSpec.kt b/src/test/kotlin/org/zowe/zdevops/classic/jobs/SubmitJobStepSpec.kt similarity index 98% rename from src/test/kotlin/org/zowe/zdevops/classic/steps/SubmitJobStepSpec.kt rename to src/test/kotlin/org/zowe/zdevops/classic/jobs/SubmitJobStepSpec.kt index 63b5a17..f8cf4cb 100644 --- a/src/test/kotlin/org/zowe/zdevops/classic/steps/SubmitJobStepSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/classic/jobs/SubmitJobStepSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.classic.jobs import hudson.EnvVars import hudson.FilePath @@ -29,6 +29,7 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.classic.* import java.io.File import java.io.PrintStream @@ -53,7 +54,7 @@ class SubmitJobStepSpec : ShouldSpec({ } val project = TestProject(itemGroup, "test") val virtualChannel = TestVirtualChannel() - val build = object:TestBuild(project) { + val build = object: TestBuild(project) { override fun getExecutor(): Executor { val mockInstance = mockk() val mockDir = tempdir() diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/PerformMvsCommandDeclarativeSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/console/PerformMvsCommandDeclarativeSpec.kt similarity index 96% rename from src/test/kotlin/org/zowe/zdevops/declarative/jobs/PerformMvsCommandDeclarativeSpec.kt rename to src/test/kotlin/org/zowe/zdevops/declarative/console/PerformMvsCommandDeclarativeSpec.kt index 450f97b..7cf1cee 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/PerformMvsCommandDeclarativeSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/console/PerformMvsCommandDeclarativeSpec.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.declarative.console import hudson.EnvVars import hudson.FilePath @@ -30,7 +30,7 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory -import org.zowe.zdevops.declarative.jobs.PerformMvsCommandDeclarative +import org.zowe.zdevops.classic.TestBuildListener import java.io.File import java.io.PrintStream import java.nio.file.Paths diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/AbstractZosmfActionWithResultSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/core/AbstractZosmfActionWithResultSpec.kt similarity index 98% rename from src/test/kotlin/org/zowe/zdevops/declarative/AbstractZosmfActionWithResultSpec.kt rename to src/test/kotlin/org/zowe/zdevops/declarative/core/AbstractZosmfActionWithResultSpec.kt index ef51a2a..7c563c6 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/AbstractZosmfActionWithResultSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/core/AbstractZosmfActionWithResultSpec.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.declarative +package org.zowe.zdevops.declarative.core import hudson.EnvVars import hudson.FilePath diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/ZosmfStepDeclarativeSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/core/ZosmfStepDeclarativeSpec.kt similarity index 97% rename from src/test/kotlin/org/zowe/zdevops/declarative/ZosmfStepDeclarativeSpec.kt rename to src/test/kotlin/org/zowe/zdevops/declarative/core/ZosmfStepDeclarativeSpec.kt index 26a0b5b..456fac7 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/ZosmfStepDeclarativeSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/core/ZosmfStepDeclarativeSpec.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.declarative +package org.zowe.zdevops.declarative.core import hudson.model.TaskListener import io.kotest.core.spec.style.ShouldSpec diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/dummyClasses.kt b/src/test/kotlin/org/zowe/zdevops/declarative/dummyClasses.kt similarity index 98% rename from src/test/kotlin/org/zowe/zdevops/declarative/jobs/dummyClasses.kt rename to src/test/kotlin/org/zowe/zdevops/declarative/dummyClasses.kt index 5ef3b8a..da9b2a5 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/dummyClasses.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/dummyClasses.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative import hudson.FilePath import hudson.Launcher diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/AllocateDatasetDeclarativeSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/AllocateDatasetDeclarativeSpec.kt similarity index 97% rename from src/test/kotlin/org/zowe/zdevops/declarative/jobs/AllocateDatasetDeclarativeSpec.kt rename to src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/AllocateDatasetDeclarativeSpec.kt index 3e260d4..d0cea85 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/AllocateDatasetDeclarativeSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/AllocateDatasetDeclarativeSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn import hudson.EnvVars import hudson.FilePath @@ -29,6 +29,7 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.declarative.* import java.io.File import java.io.PrintStream import java.nio.file.Paths diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/DeleteDatasetDeclarativeSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/DeleteDatasetDeclarativeSpec.kt similarity index 98% rename from src/test/kotlin/org/zowe/zdevops/declarative/jobs/DeleteDatasetDeclarativeSpec.kt rename to src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/DeleteDatasetDeclarativeSpec.kt index a544b80..12013a6 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/DeleteDatasetDeclarativeSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/DeleteDatasetDeclarativeSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn import hudson.EnvVars import hudson.FilePath @@ -28,6 +28,7 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.declarative.* import java.io.File import java.io.PrintStream diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/DownloadFileDeclarativeSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/DownloadFileDeclarativeSpec.kt similarity index 97% rename from src/test/kotlin/org/zowe/zdevops/declarative/jobs/DownloadFileDeclarativeSpec.kt rename to src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/DownloadFileDeclarativeSpec.kt index 0d97e72..2cd4dd2 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/DownloadFileDeclarativeSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/DownloadFileDeclarativeSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2022 */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn import hudson.EnvVars import hudson.FilePath @@ -27,6 +27,7 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.declarative.* import java.io.File import java.io.PrintStream import java.nio.file.Paths diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteDirToDatasetDeclarativeSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteDirToDatasetDeclarativeSpec.kt new file mode 100644 index 0000000..6aef574 --- /dev/null +++ b/src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteDirToDatasetDeclarativeSpec.kt @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2025 IBA Group. + * + * This program and the accompanying materials are made available 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 + * + * Contributors: + * IBA Group + * Zowe Community + */ +package org.zowe.zdevops.declarative.files.dsn + +import hudson.AbortException +import hudson.EnvVars +import hudson.FilePath +import hudson.model.Item +import io.kotest.assertions.assertSoftly +import io.kotest.assertions.throwables.shouldNotThrow +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.ShouldSpec +import io.kotest.engine.spec.tempdir +import io.kotest.matchers.shouldBe +import io.mockk.every +import io.mockk.mockk +import io.mockk.spyk +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection +import org.zowe.zdevops.MOCK_SERVER_HOST +import org.zowe.zdevops.MockResponseDispatcher +import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.declarative.* +import org.zowe.zdevops.logic.validatePathExists +import org.zowe.zdevops.logic.validatePathLeadsToDirectory +import org.zowe.zdevops.logic.writeFileToPDS +import java.io.File +import java.io.PrintStream +import java.nio.file.Paths + + +class WriteDirToDatasetDeclarativeSpec : ShouldSpec({ + lateinit var mockServer: MockWebServer + lateinit var responseDispatcher: MockResponseDispatcher + val mockServerFactory = MockServerFactory() + + beforeSpec { + mockServer = mockServerFactory.startMockServer(MOCK_SERVER_HOST) + responseDispatcher = mockServerFactory.responseDispatcher + } + afterSpec { + mockServerFactory.stopMockServer() + } + context("declarative/files/dsn module: WriteDirToDatasetDeclarativeSpec") { + val virtualChannel = TestVirtualChannel() + val zosConnection = ZOSConnection(mockServer.hostName, mockServer.port.toString(), "test", "test", "https") + val rootDir = Paths.get("").toAbsolutePath().toString() + val trashDir = tempdir() + val itemGroup = object : TestItemGroup() { + override fun getRootDirFor(child: Item?): File { + return trashDir + } + } + val job = TestJob(itemGroup, "test") + val run = TestRun(job) + val mockDir = Paths.get(rootDir, "src", "test", "resources", "mock", "here").toString() + val workspace = FilePath(File(mockDir)) + val env = EnvVars() + + afterEach { + responseDispatcher.removeAllEndpoints() + } + + should("should throw exception if directory path does not exist") { + val nonExistentPath = File("non-existent") + + shouldThrow { + validatePathExists(nonExistentPath) + } + } + + should("should not throw exception as directory path exists") { + val actualPath = File(".") + + shouldNotThrow { + validatePathExists(actualPath) + } + } + + should("should throw exception if path is not a directory") { + val file = File.createTempFile("temp", null) + + shouldThrow { + validatePathLeadsToDirectory(file) + } + file.delete() + } + + should("should throw exception if file contains lines exceeding LRECL") { + responseDispatcher.injectEndpoint( + "${this.testCase.name.testName}_listDataSets", + { it?.requestLine?.contains("zosmf/restfiles/ds") ?: false }, + { MockResponse().setBody(responseDispatcher.readMockJson("listDataSets") ?: "") } + ) + val theDataset = "TEST.IJMP.DATASET3" + + val tempFile = File.createTempFile("temp", null).apply { + writeText("This is a very long line exceeding the LRECL limit. Even bigger than record length of the " + + "$theDataset dataset") + } + + try { + val exception = shouldThrow { + writeFileToPDS(tempFile, theDataset, zosConnection) + } + exception.message shouldBe "Error: Text contains lines exceeding record length '80' of dataset '$theDataset'. Exceeding line numbers: [1]" + } finally { + tempFile.delete() + } + } + + should("perform WriteDirToDatasetDeclarativeSpec operation to write directory to a dataset") { + var isWritingToDataset = false + var isWritten = false + val file1Name = "file1.txt" + val file2Name = "file2.txt" + var isFile1Processed = false + var isFile2Processed = false + val taskListener = object : TestBuildListener() { + override fun getLogger(): PrintStream { + val logger = mockk() + every { + logger.println(any()) + } answers { + if (firstArg().contains("Writing to dataset")) { + isWritingToDataset = true + } else if (firstArg().contains("Data has been written to dataset")) { + isWritten = true + } else if (firstArg().contains("Processing entry: '$file1Name'")) { + isFile1Processed = true + } else if (firstArg().contains("Processing entry: '$file2Name'")) { + isFile2Processed = true + } + } + return logger + } + } + val launcher = TestLauncher(taskListener, virtualChannel) + + responseDispatcher.injectEndpoint( + "${this.testCase.name.testName}_listDataSets", + { it?.requestLine?.contains("zosmf/restfiles/ds") ?: false }, + { MockResponse().setBody(responseDispatcher.readMockJson("listDataSets") ?: "") } + ) + + val tempDir = tempdir() + File(tempDir, file1Name).apply { writeText("content1") } + File(tempDir, file2Name).apply { writeText("content2") } + + val writeDirToDSDecl = spyk( + WriteDirToDatasetDeclarative("TEST.IJMP.DATASET1", tempDir.path, true) + ) + writeDirToDSDecl.perform( + run, + workspace, + env, + launcher, + taskListener, + zosConnection + ) + + assertSoftly { isWritingToDataset shouldBe true } + assertSoftly { isFile1Processed shouldBe true } + assertSoftly { isFile2Processed shouldBe true } + assertSoftly { isWritten shouldBe true } + } + } +}) \ No newline at end of file diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToMemberDeclarativeSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteFileToMemberDeclarativeSpec.kt similarity index 91% rename from src/test/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToMemberDeclarativeSpec.kt rename to src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteFileToMemberDeclarativeSpec.kt index da34807..51d8c89 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToMemberDeclarativeSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/files/dsn/WriteFileToMemberDeclarativeSpec.kt @@ -1,14 +1,18 @@ /* + * Copyright (c) 2022-2025 IBA Group. + * * This program and the accompanying materials are made available 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 IBA Group 2022 + * Contributors: + * IBA Group + * Zowe Community */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.dsn import hudson.EnvVars import hudson.FilePath @@ -27,6 +31,7 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.declarative.* import java.io.File import java.io.PrintStream import java.nio.file.Paths @@ -75,6 +80,8 @@ class WriteFileToMemberDeclarativeSpec : ShouldSpec({ isWritingToDataset = true } else if (firstArg().contains("Data has been written to dataset")) { isWritten = true + } else if (firstArg().contains("is deprecated. Please, consider switching")) { + // ignore deprecation warning in tests } else { fail("Unexpected logger message: ${firstArg()}") } diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToFileDeclarativeSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/files/uss/WriteFileToFileDeclarativeSpec.kt similarity index 92% rename from src/test/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToFileDeclarativeSpec.kt rename to src/test/kotlin/org/zowe/zdevops/declarative/files/uss/WriteFileToFileDeclarativeSpec.kt index 9009c6b..2b5a5d0 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/WriteFileToFileDeclarativeSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/files/uss/WriteFileToFileDeclarativeSpec.kt @@ -8,7 +8,7 @@ * Copyright IBA Group 2023 */ -package org.zowe.zdevops.declarative.jobs +package org.zowe.zdevops.declarative.files.uss import hudson.EnvVars import hudson.FilePath @@ -27,8 +27,12 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory -import org.zowe.zdevops.classic.steps.TestBuildListener -import org.zowe.zdevops.classic.steps.TestLauncher +import org.zowe.zdevops.classic.TestBuildListener +import org.zowe.zdevops.classic.TestLauncher +import org.zowe.zdevops.declarative.TestItemGroup +import org.zowe.zdevops.declarative.TestJob +import org.zowe.zdevops.declarative.TestRun +import org.zowe.zdevops.declarative.TestVirtualChannel import java.io.File import java.io.PrintStream import java.nio.file.Paths diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobStepDeclarativeSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobStepDeclarativeSpec.kt index a3e7d3a..730e2dd 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobStepDeclarativeSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobStepDeclarativeSpec.kt @@ -27,6 +27,7 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.declarative.* import java.io.File import java.io.PrintStream diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobSyncStepDeclarativeSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobSyncStepDeclarativeSpec.kt index a110efe..89381bf 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobSyncStepDeclarativeSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/jobs/SubmitJobSyncStepDeclarativeSpec.kt @@ -30,6 +30,7 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory +import org.zowe.zdevops.declarative.TestBuildListener import java.io.File import java.io.PrintStream import java.nio.file.Paths diff --git a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/PerformTsoCommandDeclarativeSpec.kt b/src/test/kotlin/org/zowe/zdevops/declarative/tso/PerformTsoCommandDeclarativeSpec.kt similarity index 97% rename from src/test/kotlin/org/zowe/zdevops/declarative/jobs/PerformTsoCommandDeclarativeSpec.kt rename to src/test/kotlin/org/zowe/zdevops/declarative/tso/PerformTsoCommandDeclarativeSpec.kt index df0bbf1..566d114 100644 --- a/src/test/kotlin/org/zowe/zdevops/declarative/jobs/PerformTsoCommandDeclarativeSpec.kt +++ b/src/test/kotlin/org/zowe/zdevops/declarative/tso/PerformTsoCommandDeclarativeSpec.kt @@ -12,7 +12,7 @@ * Zowe Community */ -package org.zowe.zdevops.classic.steps +package org.zowe.zdevops.declarative.tso import hudson.EnvVars import hudson.FilePath @@ -30,7 +30,7 @@ import org.zowe.kotlinsdk.zowe.client.sdk.core.ZOSConnection import org.zowe.zdevops.MOCK_SERVER_HOST import org.zowe.zdevops.MockResponseDispatcher import org.zowe.zdevops.MockServerFactory -import org.zowe.zdevops.declarative.jobs.PerformTsoCommandDeclarative +import org.zowe.zdevops.classic.TestBuildListener import java.io.File import java.io.PrintStream import java.nio.file.Paths