From ebba66926f4adeec18afc7e931fbef0bd92afb4f Mon Sep 17 00:00:00 2001 From: Petr Broz Date: Thu, 30 May 2019 12:41:12 +0200 Subject: [PATCH 1/8] Added missing powershell info to example README. --- examples/inventor-thumbnail/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/inventor-thumbnail/README.md b/examples/inventor-thumbnail/README.md index 291d516..9215ac8 100644 --- a/examples/inventor-thumbnail/README.md +++ b/examples/inventor-thumbnail/README.md @@ -36,5 +36,7 @@ export FORGE_BUCKET= ```powershell $env:FORGE_CLIENT_ID = "" $env:FORGE_CLIENT_SECRET = "" +$env:FORGE_BUCKET = "" .\setup-pipeline.ps1 +.\run-pipeline.ps1 ``` From 762fbd82a8797dcd33337483599965a763143a4d Mon Sep 17 00:00:00 2001 From: Petr Broz Date: Thu, 30 May 2019 12:44:45 +0200 Subject: [PATCH 2/8] Updated way of specifying DA inputs/outputs. Note: this is a breaking change. --- README.md | 10 ++- examples/inventor-thumbnail/run-pipeline.ps1 | 4 +- examples/inventor-thumbnail/run-pipeline.sh | 4 +- .../inventor-thumbnail/setup-pipeline.ps1 | 4 +- examples/inventor-thumbnail/setup-pipeline.sh | 4 +- src/forge-da.js | 83 +++++++++++++------ 6 files changed, 73 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 8772d8b..beae77f 100644 --- a/README.md +++ b/README.md @@ -97,12 +97,18 @@ forge-dm object-urn my-bucket-key my-object-key forge-da create-appbundle BundleName path/to/bundle/zipfile Autodesk.Inventor+23 "Bundle description here." # Updating existing activity -forge-da update-activity ActivityName BundleName BundleAlias Autodesk.Inventor+23 --input PartFile --output Thumbnail:thumbnail.bmp +forge-da update-activity ActivityName BundleName BundleAlias Autodesk.Inventor+23 --input PartFile --output Thumbnail --output-local-name thumbnail.bmp # Creating work item -forge-da create-workitem ActivityName ActivityAlias --input PartFile:https://some.url --output Thumbnail:https://another.url --short +forge-da create-workitem ActivityName ActivityAlias --input PartFile --input-url https://some.url --output Thumbnail --output-url https://another.url --short ``` +> When specifying inputs and outputs for an activity or work item, `--input-*` and `--output-*` arguments +> are always applied to the last input/output ID. For example, consider the following sequence of arguments: +> `--input InputA --input-local-name house.rvt --input InputB --input InputC --input-url https://foobar.com`. +> Such a sequence will define three inputs: _InputA_ with local name _house.rvt_, _InputB_ (with no additional +> properties), and _InputC_ with URL _https://foobar.com_. + #### Model Derivative ```bash diff --git a/examples/inventor-thumbnail/run-pipeline.ps1 b/examples/inventor-thumbnail/run-pipeline.ps1 index 84f1525..0ba5b51 100644 --- a/examples/inventor-thumbnail/run-pipeline.ps1 +++ b/examples/inventor-thumbnail/run-pipeline.ps1 @@ -29,9 +29,9 @@ Write-Host "Creating signed URLs" $input_file_signed_url = Invoke-Expression "$forge_dm_bin create-signed-url $env:FORGE_BUCKET $input_object_key --access read --short" $thumbnail_signed_url = Invoke-Expression "$forge_dm_bin create-signed-url $env:FORGE_BUCKET $thumbnail_object_key --access readwrite --short" -# Create activity and poll the results +# Create work item and poll the results Write-Host "Creating work item" -$workitem_id = Invoke-Expression "$forge_da_bin create-workitem $activity_name $activity_alias --input PartFile:$input_file_signed_url --output Thumbnail:$thumbnail_signed_url --short" +$workitem_id = Invoke-Expression "$forge_da_bin create-workitem $activity_name $activity_alias --input PartFile --input-url $input_file_signed_url --output Thumbnail --output-url $thumbnail_signed_url --short" Write-Host "Waiting for work item $workitem_id to complete" $workitem_status = "inprogress" while ($workitem_status -eq "inprogress") { diff --git a/examples/inventor-thumbnail/run-pipeline.sh b/examples/inventor-thumbnail/run-pipeline.sh index e29df01..3f6c0bf 100755 --- a/examples/inventor-thumbnail/run-pipeline.sh +++ b/examples/inventor-thumbnail/run-pipeline.sh @@ -31,9 +31,9 @@ echo "Creating signed URLs" INPUT_FILE_SIGNED_URL=$($FORGE_DM_SCRIPT create-signed-url $FORGE_BUCKET $INPUT_OBJECT_KEY --access read --short) THUMBNAIL_SIGNED_URL=$($FORGE_DM_SCRIPT create-signed-url $FORGE_BUCKET $THUMBNAIL_OBJECT_KEY --access readwrite --short) -# Create activity and poll the results +# Create work item and poll the results echo "Creating work item" -WORKITEM_ID=$($FORGE_DA_SCRIPT create-workitem $ACTIVITY_NAME $ACTIVITY_ALIAS --input PartFile:$INPUT_FILE_SIGNED_URL --output Thumbnail:$THUMBNAIL_SIGNED_URL --short) +WORKITEM_ID=$($FORGE_DA_SCRIPT create-workitem $ACTIVITY_NAME $ACTIVITY_ALIAS --input PartFile --input-url $INPUT_FILE_SIGNED_URL --output Thumbnail --output-url $THUMBNAIL_SIGNED_URL --short) echo "Waiting for work item $WORKITEM_ID to complete" WORKITEM_STATUS="inprogress" while [ $WORKITEM_STATUS == "inprogress" ] diff --git a/examples/inventor-thumbnail/setup-pipeline.ps1 b/examples/inventor-thumbnail/setup-pipeline.ps1 index 6df30b0..65e3d9a 100644 --- a/examples/inventor-thumbnail/setup-pipeline.ps1 +++ b/examples/inventor-thumbnail/setup-pipeline.ps1 @@ -39,10 +39,10 @@ Write-Host "Creating an activity $activity_name" $result = Invoke-Expression "$forge_da_bin list-activities --short" | Select-String -Pattern $activity_name | Measure-Object -Line if ($result.Lines -eq 0) { Write-Host "Creating new activity" - Invoke-Expression "$forge_da_bin create-activity $activity_name $appbundle_name $appbundle_alias $appbundle_engine --input PartFile --output Thumbnail:thumbnail.bmp" + Invoke-Expression "$forge_da_bin create-activity $activity_name $appbundle_name $appbundle_alias $appbundle_engine --input PartFile --output Thumbnail --output-local-name thumbnail.bmp" } else { Write-Host "Updating existing activity" - Invoke-Expression "$forge_da_bin update-activity $activity_name $appbundle_name $appbundle_alias $appbundle_engine --input PartFile --output Thumbnail:thumbnail.bmp" + Invoke-Expression "$forge_da_bin update-activity $activity_name $appbundle_name $appbundle_alias $appbundle_engine --input PartFile --output Thumbnail --output-local-name thumbnail.bmp" } # Create or update an activity alias diff --git a/examples/inventor-thumbnail/setup-pipeline.sh b/examples/inventor-thumbnail/setup-pipeline.sh index ef7ff69..05628a7 100755 --- a/examples/inventor-thumbnail/setup-pipeline.sh +++ b/examples/inventor-thumbnail/setup-pipeline.sh @@ -37,10 +37,10 @@ fi if [ $($FORGE_DA_SCRIPT list-activities --short | grep $ACTIVITY_NAME | wc -l) -eq "0" ] # TODO: use better matching then echo "Creating new activity" -$FORGE_DA_SCRIPT create-activity $ACTIVITY_NAME $APPBUNDLE_NAME $APPBUNDLE_ALIAS $APPBUNDLE_ENGINE --input PartFile --output Thumbnail:thumbnail.bmp +$FORGE_DA_SCRIPT create-activity $ACTIVITY_NAME $APPBUNDLE_NAME $APPBUNDLE_ALIAS $APPBUNDLE_ENGINE --input PartFile --output Thumbnail --output-local-name thumbnail.bmp else echo "Updating existing activity" -$FORGE_DA_SCRIPT update-activity $ACTIVITY_NAME $APPBUNDLE_NAME $APPBUNDLE_ALIAS $APPBUNDLE_ENGINE --input PartFile --output Thumbnail:thumbnail.bmp +$FORGE_DA_SCRIPT update-activity $ACTIVITY_NAME $APPBUNDLE_NAME $APPBUNDLE_ALIAS $APPBUNDLE_ENGINE --input PartFile --output Thumbnail --output-local-name thumbnail.bmp fi # Create or update an activity alias diff --git a/src/forge-da.js b/src/forge-da.js index 9c54941..107fb17 100755 --- a/src/forge-da.js +++ b/src/forge-da.js @@ -296,15 +296,23 @@ program } }); -function _collectActivityInputs(val, memo) { - memo.push({ name: val }); - return memo; +let _activityInputs = []; +let _activityOutputs = []; + +function _collectActivityInputs(val) { + _activityInputs.push({ name: val }); +} + +function _collectActivityInputLocalNames(val) { + _activityInputs[_activityInputs.length - 1].localName = val; +} + +function _collectActivityOutputs(val) { + _activityOutputs.push({ name: val }); } -function _collectActivityOutputs(val, memo) { - const tokens = val.split(':'); - memo.push({ name: tokens[0], localName: tokens[1] }); - return memo; +function _collectActivityOutputLocalNames(val) { + _activityOutputs[_activityOutputs.length - 1].localName = val; } program @@ -314,8 +322,10 @@ program .option('-s, --short', 'Output app bundle ID instead of the entire JSON.') .option('-d, --description ', 'Optional activity description.') .option('--script', 'Optional engine-specific script to pass to activity.') - .option('-i, --input ', 'Activity input (can be used multiple times).', _collectActivityInputs, []) - .option('-o, --output ', 'Activity output defined as : (can be used multiple times).', _collectActivityOutputs, []) + .option('-i, --input ', 'Activity input ID (can be used multiple times).', _collectActivityInputs) + .option('-iln, --input-local-name ', 'Optional local name for the last activity input (can be used multiple times).', _collectActivityInputLocalNames) + .option('-o, --output ', 'Activity output ID (can be used multiple times).', _collectActivityOutputs) + .option('-oln, --output-local-name ', 'Optional local name for the last activity output (can be used multiple times).', _collectActivityOutputLocalNames) .action(async function(name, bundle, bundlealias, engine, command) { try { if (!bundle) { @@ -331,8 +341,8 @@ program if (!description) { description = `${name} created via Forge CLI Utils.`; } - - let activity = await designAutomation.createActivity(name, description, bundle, bundlealias, engine, command.input, command.output, command.script); + + let activity = await designAutomation.createActivity(name, description, bundle, bundlealias, engine, _activityInputs, _activityOutputs, command.script); if (command.short) { log(activity.id); } else { @@ -350,8 +360,10 @@ program .option('-s, --short', 'Output app bundle ID instead of the entire JSON.') .option('-d, --description ', 'Optional activity description.') .option('--script', 'Optional engine-specific script to pass to activity.') - .option('-i, --input ', 'Activity input (can be used multiple times).', _collectActivityInputs, []) - .option('-o, --output ', 'Activity output defined as : (can be used multiple times).', _collectActivityOutputs, []) + .option('-i, --input ', 'Activity input ID (can be used multiple times).', _collectActivityInputs) + .option('-iln, --input-local-name ', 'Optional local name for the last activity input (can be used multiple times).', _collectActivityInputLocalNames) + .option('-o, --output ', 'Activity output ID (can be used multiple times).', _collectActivityOutputs) + .option('-oln, --output-local-name ', 'Optional local name for the last activity output (can be used multiple times).', _collectActivityOutputLocalNames) .action(async function(name, bundle, bundlealias, engine, command) { try { if (!bundle) { @@ -368,7 +380,7 @@ program description = `${name} created via Forge CLI Utils.`; } - let activity = await designAutomation.updateActivity(name, description, bundle, bundlealias, engine, command.input, command.output, command.script); + let activity = await designAutomation.updateActivity(name, description, bundle, bundlealias, engine, _activityInputs, _activityOutputs, command.script); if (command.short) { log(activity.id); } else { @@ -475,16 +487,31 @@ program } }); -function _collectWorkitemInputs(val, memo) { - const split = val.indexOf(':'); - memo.push({ name: val.substr(0, split), url: val.substr(split + 1) }); - return memo; +let _workitemInputs = []; +let _workitemOutputs = []; + +function _collectWorkitemInputs(val) { + _workitemInputs.push({ name: val }); +} + +function _collectWorkitemInputLocalNames(val) { + _workitemInputs[_workitemInputs.length - 1].localName = val; +} + +function _collectWorkitemInputURLs(val) { + _workitemInputs[_workitemInputs.length - 1].url = val; +} + +function _collectWorkitemOutputs(val) { + _workitemOutputs.push({ name: val }); } -function _collectWorkitemOutputs(val, memo) { - const split = val.indexOf(':'); - memo.push({ name: val.substr(0, split), url: val.substr(split + 1) }); - return memo; +function _collectWorkitemOutputLocalNames(val) { + _workitemOutputs[_workitemOutputs.length - 1].localName = val; +} + +function _collectWorkitemOutputURLs(val) { + _workitemOutputs[_workitemOutputs.length - 1].url = val; } program @@ -492,8 +519,12 @@ program .alias('cw') .description('Create new work item.') .option('-s, --short', 'Output work item ID instead of the entire JSON.') - .option('-i, --input ', 'Work item input defined as : (can be used multiple times).', _collectWorkitemInputs, []) - .option('-o, --output ', 'Work item output defined as : (can be used multiple times).', _collectWorkitemOutputs, []) + .option('-i, --input ', 'Work item input ID (can be used multiple times).', _collectWorkitemInputs) + .option('-iln, --input-local-name ', 'Optional local name of the last work item input (can be used multiple times).', _collectWorkitemInputLocalNames) + .option('-iu, --input-url ', 'URL of the last work item input (can be used multiple times).', _collectWorkitemInputURLs) + .option('-o, --output ', 'Work item output ID (can be used multiple times).', _collectWorkitemOutputs) + .option('-oln, --output-local-name ', 'Optional local name of the last work item output (can be used multiple times).', _collectWorkitemOutputLocalNames) + .option('-ou, --output-url ', 'URL of the last work item output (can be used multiple times).', _collectWorkitemOutputURLs) .action(async function(activity, activityalias, command) { try { if (!activity) { @@ -502,9 +533,9 @@ program if (!activityalias) { activityalias = await promptActivityAlias(activity); } - + const activityId = designAutomation.auth.client_id + '.' + activity + '+' + activityalias; - const workitem = await designAutomation.createWorkItem(activityId, command.input, command.output); + const workitem = await designAutomation.createWorkItem(activityId, _workitemInputs, _workitemOutputs); if (command.short) { log(workitem.id); } else { From f408456e77804f028003045ee87a57a03f0f9f76 Mon Sep 17 00:00:00 2001 From: Petr Broz Date: Thu, 30 May 2019 12:50:07 +0200 Subject: [PATCH 3/8] Replaced deprecated buffer instantiation. --- src/forge-dm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/forge-dm.js b/src/forge-dm.js index 790f864..52259aa 100755 --- a/src/forge-dm.js +++ b/src/forge-dm.js @@ -149,7 +149,7 @@ program const arrayBuffer = await data.downloadObject(bucket, object); // TODO: add support for streaming data directly to disk instead of getting entire file into memory first - fs.writeFileSync(filename, new Buffer(arrayBuffer), { encoding: 'binary' }); + fs.writeFileSync(filename, Buffer.from(arrayBuffer), { encoding: 'binary' }); } catch(err) { error(err); } From 6d6c7f6965e9131c671538a504f8d48bdf85abb0 Mon Sep 17 00:00:00 2001 From: Petr Broz Date: Thu, 30 May 2019 12:50:32 +0200 Subject: [PATCH 4/8] Example bash scripts exit on any error. --- examples/inventor-thumbnail/run-pipeline.sh | 2 ++ examples/inventor-thumbnail/setup-pipeline.sh | 2 ++ 2 files changed, 4 insertions(+) diff --git a/examples/inventor-thumbnail/run-pipeline.sh b/examples/inventor-thumbnail/run-pipeline.sh index 3f6c0bf..5c6121f 100755 --- a/examples/inventor-thumbnail/run-pipeline.sh +++ b/examples/inventor-thumbnail/run-pipeline.sh @@ -2,6 +2,8 @@ # FORGE_CLIENT_ID, FORGE_CLIENT_SECRET, and FORGE_BUCKET must be set before running this script. +set -e # Exit on any error + FORGE_DM_SCRIPT="node ../../src/forge-dm.js" FORGE_DA_SCRIPT="node ../../src/forge-da.js" diff --git a/examples/inventor-thumbnail/setup-pipeline.sh b/examples/inventor-thumbnail/setup-pipeline.sh index 05628a7..ca66728 100755 --- a/examples/inventor-thumbnail/setup-pipeline.sh +++ b/examples/inventor-thumbnail/setup-pipeline.sh @@ -2,6 +2,8 @@ # FORGE_CLIENT_ID, FORGE_CLIENT_SECRET, and FORGE_BUCKET must be set before running this script. +set -e # Exit on any error + FORGE_DA_SCRIPT="node ../../src/forge-da.js" APPBUNDLE_NAME=TestBundle From 7c96f18aa4efb1cda876bf6302564d64be6b92ce Mon Sep 17 00:00:00 2001 From: Petr Broz Date: Thu, 30 May 2019 13:05:25 +0200 Subject: [PATCH 5/8] Exit with non-zero code after error. --- src/common.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common.js b/src/common.js index 5ca85ad..0379781 100644 --- a/src/common.js +++ b/src/common.js @@ -30,6 +30,7 @@ function error(err) { } else { console.error(err); } + process.exit(1); } module.exports = { From e3bac76244b0126bb7f022bf9aae46a05edecf5e Mon Sep 17 00:00:00 2001 From: Petr Broz Date: Thu, 30 May 2019 13:19:40 +0200 Subject: [PATCH 6/8] PowerShell example scripts exiit on error. --- examples/inventor-thumbnail/run-pipeline.ps1 | 21 +++++++- .../inventor-thumbnail/setup-pipeline.ps1 | 48 ++++++++++++++++--- 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/examples/inventor-thumbnail/run-pipeline.ps1 b/examples/inventor-thumbnail/run-pipeline.ps1 index 0ba5b51..5ac3981 100644 --- a/examples/inventor-thumbnail/run-pipeline.ps1 +++ b/examples/inventor-thumbnail/run-pipeline.ps1 @@ -11,7 +11,11 @@ $input_object_key = "input.ipt" $thumbnail_object_key = "thumbnail.bmp" # If it does not exist, create a data bucket -$result = Invoke-Expression "$forge_dm_bin list-buckets --short" | Select-String -Pattern $env:FORGE_BUCKET | Measure-Object -Line +$result = Invoke-Expression "$forge_dm_bin list-buckets --short" +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not list buckets" -ErrorAction "Stop" +} +$result = $result | Select-String -Pattern $env:FORGE_BUCKET | Measure-Object -Line if ($result.Lines -eq 0) { Write-Host "Creating a bucket $env:FORGE_BUCKET" Invoke-Expression "$forge_dm_bin create-bucket $env:FORGE_BUCKET" @@ -23,24 +27,39 @@ Invoke-Expression "$forge_dm_bin upload-object $input_file_path application/octe New-Item -Name "output" -Path "." -ItemType "directory" New-Item -Name "thumbnail.bmp" -Path ".\output" -ItemType "file" Invoke-Expression "$forge_dm_bin upload-object .\output\thumbnail.bmp image/bmp $env:FORGE_BUCKET $thumbnail_object_key" +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not upload objects" -ErrorAction "Stop" +} # Generate signed URLs for all input and output files Write-Host "Creating signed URLs" $input_file_signed_url = Invoke-Expression "$forge_dm_bin create-signed-url $env:FORGE_BUCKET $input_object_key --access read --short" $thumbnail_signed_url = Invoke-Expression "$forge_dm_bin create-signed-url $env:FORGE_BUCKET $thumbnail_object_key --access readwrite --short" +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not generate signed URLs" -ErrorAction "Stop" +} # Create work item and poll the results Write-Host "Creating work item" $workitem_id = Invoke-Expression "$forge_da_bin create-workitem $activity_name $activity_alias --input PartFile --input-url $input_file_signed_url --output Thumbnail --output-url $thumbnail_signed_url --short" +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not create work item" -ErrorAction "Stop" +} Write-Host "Waiting for work item $workitem_id to complete" $workitem_status = "inprogress" while ($workitem_status -eq "inprogress") { Start-Sleep -s 5 $workitem_status = Invoke-Expression "$forge_da_bin get-workitem $workitem_id --short" + if ($LASTEXITCODE -ne 0) { + Write-Error "Could not obtain work item status" -ErrorAction "Stop" + } Write-Host $workitem_status } # Download the results Write-Host "Downloading results to output/thumbnail.bmp" Invoke-Expression "$forge_dm_bin download-object $env:FORGE_BUCKET $thumbnail_object_key output\thumbnail.bmp" +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not download results" -ErrorAction "Stop" +} Write-Host "Process complete. See the thumbnail in the output folder, or download it from $thumbnail_signed_url" diff --git a/examples/inventor-thumbnail/setup-pipeline.ps1 b/examples/inventor-thumbnail/setup-pipeline.ps1 index 65e3d9a..e09c893 100644 --- a/examples/inventor-thumbnail/setup-pipeline.ps1 +++ b/examples/inventor-thumbnail/setup-pipeline.ps1 @@ -12,7 +12,11 @@ $activity_alias = "dev" # Create or update an appbundle Write-Host "Creating an appbundle $appbundle_name" -$result = Invoke-Expression "$forge_da_bin list-appbundles --short" | Select-String -Pattern $appbundle_name | Measure-Object -Line +$result = Invoke-Expression "$forge_da_bin list-appbundles --short" +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not list app bundles" -ErrorAction "Stop" +} +$result = $result | Select-String -Pattern $appbundle_name | Measure-Object -Line if ($result.Lines -eq 0) { Write-Host "Creating new appbundle" Invoke-Expression "$forge_da_bin create-appbundle $appbundle_name $appbundle_file $appbundle_engine" @@ -20,12 +24,23 @@ if ($result.Lines -eq 0) { Write-Host "Updating existing appbundle" Invoke-Expression "$forge_da_bin update-appbundle $appbundle_name $appbundle_file $appbundle_engine" } +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not create or update app bundle" -ErrorAction "Stop" +} # Create or update an appbundle alias Write-Host "Creating an appbundle alias $appbundle_alias" -$appbundle_version = Invoke-Expression "$forge_da_bin list-appbundle-versions $appbundle_name --short" | Select-Object -Last 1 +$result = Invoke-Expression "$forge_da_bin list-appbundle-versions $appbundle_name --short" +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not list app bundle versions" -ErrorAction "Stop" +} +$appbundle_version = $result | Select-Object -Last 1 Write-Host "Last appbundle version: $appbundle_version" -$result = Invoke-Expression "$forge_da_bin list-appbundle-aliases $appbundle_name --short" | Select-String -Pattern $appbundle_alias | Measure-Object -Line +$result = Invoke-Expression "$forge_da_bin list-appbundle-aliases $appbundle_name --short" +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not list app bundle aliases" -ErrorAction "Stop" +} +$result = $result | Select-String -Pattern $appbundle_alias | Measure-Object -Line if ($result.Lines -eq 0) { Write-Host "Creating new appbundle alias" Invoke-Expression "$forge_da_bin create-appbundle-alias $appbundle_alias $appbundle_name $appbundle_version" @@ -33,10 +48,17 @@ if ($result.Lines -eq 0) { Write-Host "Updating existing appbundle alias" Invoke-Expression "$forge_da_bin update-appbundle-alias $appbundle_alias $appbundle_name $appbundle_version" } +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not create or update app bundle alias" -ErrorAction "Stop" +} # Create or update an activity Write-Host "Creating an activity $activity_name" -$result = Invoke-Expression "$forge_da_bin list-activities --short" | Select-String -Pattern $activity_name | Measure-Object -Line +$result = Invoke-Expression "$forge_da_bin list-activities --short" +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not list activities" -ErrorAction "Stop" +} +$result = $result | Select-String -Pattern $activity_name | Measure-Object -Line if ($result.Lines -eq 0) { Write-Host "Creating new activity" Invoke-Expression "$forge_da_bin create-activity $activity_name $appbundle_name $appbundle_alias $appbundle_engine --input PartFile --output Thumbnail --output-local-name thumbnail.bmp" @@ -44,12 +66,23 @@ if ($result.Lines -eq 0) { Write-Host "Updating existing activity" Invoke-Expression "$forge_da_bin update-activity $activity_name $appbundle_name $appbundle_alias $appbundle_engine --input PartFile --output Thumbnail --output-local-name thumbnail.bmp" } +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not create or update activity" -ErrorAction "Stop" +} # Create or update an activity alias Write-Host "Creating an activity alias $activity_alias" -$activity_version = Invoke-Expression "$forge_da_bin list-activity-versions $activity_name --short" | Select-Object -Last 1 +$result = Invoke-Expression "$forge_da_bin list-activity-versions $activity_name --short" +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not list activity versions" -ErrorAction "Stop" +} +$activity_version = $result | Select-Object -Last 1 Write-Host "Last activity version: $activity_version" -$result = Invoke-Expression "$forge_da_bin list-activity-aliases $activity_name --short" | Select-String -Pattern $activity_alias | Measure-Object -Line +$result = Invoke-Expression "$forge_da_bin list-activity-aliases $activity_name --short" +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not list activity aliases" -ErrorAction "Stop" +} +$result = $result | Select-String -Pattern $activity_alias | Measure-Object -Line if ($result.Lines -eq 0) { Write-Host "Creating new activity alias" Invoke-Expression "$forge_da_bin create-activity-alias $activity_alias $activity_name $activity_version" @@ -57,3 +90,6 @@ if ($result.Lines -eq 0) { Write-Host "Updating existing activity alias" Invoke-Expression "$forge_da_bin update-activity-alias $activity_alias $activity_name $activity_version" } +if ($LASTEXITCODE -ne 0) { + Write-Error "Could not create or update activity alias" -ErrorAction "Stop" +} From 2d6b00a492956f1c4b6019f052e71729a79edf8a Mon Sep 17 00:00:00 2001 From: Petr Broz Date: Thu, 30 May 2019 13:33:52 +0200 Subject: [PATCH 7/8] Simplified error handling in PS example scripts. --- examples/inventor-thumbnail/run-pipeline.ps1 | 55 +++++++-------- .../inventor-thumbnail/setup-pipeline.ps1 | 67 ++++++------------- 2 files changed, 48 insertions(+), 74 deletions(-) diff --git a/examples/inventor-thumbnail/run-pipeline.ps1 b/examples/inventor-thumbnail/run-pipeline.ps1 index 5ac3981..c0e91f2 100644 --- a/examples/inventor-thumbnail/run-pipeline.ps1 +++ b/examples/inventor-thumbnail/run-pipeline.ps1 @@ -1,7 +1,22 @@ # FORGE_CLIENT_ID, FORGE_CLIENT_SECRET, and FORGE_BUCKET must be set before running this script. -$forge_dm_bin = "node ..\..\src\forge-dm.js" -$forge_da_bin = "node ..\..\src\forge-da.js" +function Request-DM { + $command = $args[0] + $result = Invoke-Expression "node ..\..\src\forge-dm.js $command" + if ($LASTEXITCODE -ne 0) { + Write-Error "forge-dm command failed: $command" -ErrorAction "Stop" + } + return $result +} + +function Request-DA { + $command = $args[0] + $result = Invoke-Expression "node ..\..\src\forge-da.js $command" + if ($LASTEXITCODE -ne 0) { + Write-Error "forge-da command failed: $command" -ErrorAction "Stop" + } + return $result +} $activity_name = "MyTestActivity" $activity_alias = "dev" @@ -11,55 +26,37 @@ $input_object_key = "input.ipt" $thumbnail_object_key = "thumbnail.bmp" # If it does not exist, create a data bucket -$result = Invoke-Expression "$forge_dm_bin list-buckets --short" -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not list buckets" -ErrorAction "Stop" -} +$result = Request-DM "list-buckets --short" $result = $result | Select-String -Pattern $env:FORGE_BUCKET | Measure-Object -Line if ($result.Lines -eq 0) { Write-Host "Creating a bucket $env:FORGE_BUCKET" - Invoke-Expression "$forge_dm_bin create-bucket $env:FORGE_BUCKET" + Request-DM "create-bucket $env:FORGE_BUCKET" } # Upload Inventor file and create a placeholder for the output thumbnail Write-Host "Preparing input/output files" -Invoke-Expression "$forge_dm_bin upload-object $input_file_path application/octet-stream $env:FORGE_BUCKET $input_object_key" +Request-DM "upload-object $input_file_path application/octet-stream $env:FORGE_BUCKET $input_object_key" New-Item -Name "output" -Path "." -ItemType "directory" New-Item -Name "thumbnail.bmp" -Path ".\output" -ItemType "file" -Invoke-Expression "$forge_dm_bin upload-object .\output\thumbnail.bmp image/bmp $env:FORGE_BUCKET $thumbnail_object_key" -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not upload objects" -ErrorAction "Stop" -} +Request-DM "upload-object .\output\thumbnail.bmp image/bmp $env:FORGE_BUCKET $thumbnail_object_key" # Generate signed URLs for all input and output files Write-Host "Creating signed URLs" -$input_file_signed_url = Invoke-Expression "$forge_dm_bin create-signed-url $env:FORGE_BUCKET $input_object_key --access read --short" -$thumbnail_signed_url = Invoke-Expression "$forge_dm_bin create-signed-url $env:FORGE_BUCKET $thumbnail_object_key --access readwrite --short" -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not generate signed URLs" -ErrorAction "Stop" -} +$input_file_signed_url = Request-DM "create-signed-url $env:FORGE_BUCKET $input_object_key --access read --short" +$thumbnail_signed_url = Request-DM "create-signed-url $env:FORGE_BUCKET $thumbnail_object_key --access readwrite --short" # Create work item and poll the results Write-Host "Creating work item" -$workitem_id = Invoke-Expression "$forge_da_bin create-workitem $activity_name $activity_alias --input PartFile --input-url $input_file_signed_url --output Thumbnail --output-url $thumbnail_signed_url --short" -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not create work item" -ErrorAction "Stop" -} +$workitem_id = Request-DA "create-workitem $activity_name $activity_alias --input PartFile --input-url $input_file_signed_url --output Thumbnail --output-url $thumbnail_signed_url --short" Write-Host "Waiting for work item $workitem_id to complete" $workitem_status = "inprogress" while ($workitem_status -eq "inprogress") { Start-Sleep -s 5 - $workitem_status = Invoke-Expression "$forge_da_bin get-workitem $workitem_id --short" - if ($LASTEXITCODE -ne 0) { - Write-Error "Could not obtain work item status" -ErrorAction "Stop" - } + $workitem_status = Request-DA "get-workitem $workitem_id --short" Write-Host $workitem_status } # Download the results Write-Host "Downloading results to output/thumbnail.bmp" -Invoke-Expression "$forge_dm_bin download-object $env:FORGE_BUCKET $thumbnail_object_key output\thumbnail.bmp" -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not download results" -ErrorAction "Stop" -} +Request-DM "download-object $env:FORGE_BUCKET $thumbnail_object_key output\thumbnail.bmp" Write-Host "Process complete. See the thumbnail in the output folder, or download it from $thumbnail_signed_url" diff --git a/examples/inventor-thumbnail/setup-pipeline.ps1 b/examples/inventor-thumbnail/setup-pipeline.ps1 index e09c893..43b1621 100644 --- a/examples/inventor-thumbnail/setup-pipeline.ps1 +++ b/examples/inventor-thumbnail/setup-pipeline.ps1 @@ -1,6 +1,13 @@ # FORGE_CLIENT_ID, FORGE_CLIENT_SECRET, and FORGE_BUCKET must be set before running this script. -$forge_da_bin = "node ..\..\src\forge-da.js" +function Request-DA { + $command = $args[0] + $result = Invoke-Expression "node ..\..\src\forge-da.js $command" + if ($LASTEXITCODE -ne 0) { + Write-Error "forge-da command failed: $command" -ErrorAction "Stop" + } + return $result +} $appbundle_name = "MyTestBundle" $appbundle_alias = "dev" @@ -12,84 +19,54 @@ $activity_alias = "dev" # Create or update an appbundle Write-Host "Creating an appbundle $appbundle_name" -$result = Invoke-Expression "$forge_da_bin list-appbundles --short" -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not list app bundles" -ErrorAction "Stop" -} +$result = Request-DA "list-appbundles --short" $result = $result | Select-String -Pattern $appbundle_name | Measure-Object -Line if ($result.Lines -eq 0) { Write-Host "Creating new appbundle" - Invoke-Expression "$forge_da_bin create-appbundle $appbundle_name $appbundle_file $appbundle_engine" + Request-DA "create-appbundle $appbundle_name $appbundle_file $appbundle_engine" } else { Write-Host "Updating existing appbundle" - Invoke-Expression "$forge_da_bin update-appbundle $appbundle_name $appbundle_file $appbundle_engine" -} -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not create or update app bundle" -ErrorAction "Stop" + Request-DA "update-appbundle $appbundle_name $appbundle_file $appbundle_engine" } # Create or update an appbundle alias Write-Host "Creating an appbundle alias $appbundle_alias" -$result = Invoke-Expression "$forge_da_bin list-appbundle-versions $appbundle_name --short" -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not list app bundle versions" -ErrorAction "Stop" -} +$result = Request-DA "list-appbundle-versions $appbundle_name --short" $appbundle_version = $result | Select-Object -Last 1 Write-Host "Last appbundle version: $appbundle_version" -$result = Invoke-Expression "$forge_da_bin list-appbundle-aliases $appbundle_name --short" -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not list app bundle aliases" -ErrorAction "Stop" -} +$result = Request-DA "list-appbundle-aliases $appbundle_name --short" $result = $result | Select-String -Pattern $appbundle_alias | Measure-Object -Line if ($result.Lines -eq 0) { Write-Host "Creating new appbundle alias" - Invoke-Expression "$forge_da_bin create-appbundle-alias $appbundle_alias $appbundle_name $appbundle_version" + Request-DA "create-appbundle-alias $appbundle_alias $appbundle_name $appbundle_version" } else { Write-Host "Updating existing appbundle alias" - Invoke-Expression "$forge_da_bin update-appbundle-alias $appbundle_alias $appbundle_name $appbundle_version" -} -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not create or update app bundle alias" -ErrorAction "Stop" + Request-DA "update-appbundle-alias $appbundle_alias $appbundle_name $appbundle_version" } # Create or update an activity Write-Host "Creating an activity $activity_name" -$result = Invoke-Expression "$forge_da_bin list-activities --short" -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not list activities" -ErrorAction "Stop" -} +$result = Request-DA "list-activities --short" $result = $result | Select-String -Pattern $activity_name | Measure-Object -Line if ($result.Lines -eq 0) { Write-Host "Creating new activity" - Invoke-Expression "$forge_da_bin create-activity $activity_name $appbundle_name $appbundle_alias $appbundle_engine --input PartFile --output Thumbnail --output-local-name thumbnail.bmp" + Request-DA "create-activity $activity_name $appbundle_name $appbundle_alias $appbundle_engine --input PartFile --output Thumbnail --output-local-name thumbnail.bmp" } else { Write-Host "Updating existing activity" - Invoke-Expression "$forge_da_bin update-activity $activity_name $appbundle_name $appbundle_alias $appbundle_engine --input PartFile --output Thumbnail --output-local-name thumbnail.bmp" -} -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not create or update activity" -ErrorAction "Stop" + Request-DA "update-activity $activity_name $appbundle_name $appbundle_alias $appbundle_engine --input PartFile --output Thumbnail --output-local-name thumbnail.bmp" } # Create or update an activity alias Write-Host "Creating an activity alias $activity_alias" -$result = Invoke-Expression "$forge_da_bin list-activity-versions $activity_name --short" -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not list activity versions" -ErrorAction "Stop" -} +$result = Request-DA "list-activity-versions $activity_name --short" $activity_version = $result | Select-Object -Last 1 Write-Host "Last activity version: $activity_version" -$result = Invoke-Expression "$forge_da_bin list-activity-aliases $activity_name --short" -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not list activity aliases" -ErrorAction "Stop" -} +$result = Request-DA "list-activity-aliases $activity_name --short" $result = $result | Select-String -Pattern $activity_alias | Measure-Object -Line if ($result.Lines -eq 0) { Write-Host "Creating new activity alias" - Invoke-Expression "$forge_da_bin create-activity-alias $activity_alias $activity_name $activity_version" + Request-DA "create-activity-alias $activity_alias $activity_name $activity_version" } else { Write-Host "Updating existing activity alias" - Invoke-Expression "$forge_da_bin update-activity-alias $activity_alias $activity_name $activity_version" -} -if ($LASTEXITCODE -ne 0) { - Write-Error "Could not create or update activity alias" -ErrorAction "Stop" + Request-DA "update-activity-alias $activity_alias $activity_name $activity_version" } From 24031d84d469d891e710c66f50a21a1f36184b7d Mon Sep 17 00:00:00 2001 From: Petr Broz Date: Thu, 30 May 2019 13:36:08 +0200 Subject: [PATCH 8/8] Bumped version to 0.8.0. --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e4a80f9..0598bdf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "forge-cli-utils", - "version": "0.7.3", + "version": "0.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8fbbff8..1263922 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "forge-cli-utils", - "version": "0.7.3", + "version": "0.8.0", "description": "Command line tools for Autodesk Forge services.", "author": "Petr Broz ", "license": "MIT",