feat: add startup config validation and document ConfigManager pipeline editor

Add ConfigurationValidationRunner with IConfigurationValidator interface for
validating required settings at startup. Includes SecureStore and LDAP validators.
Expand ConfigManager with pipeline editing UI, dialogs, and step editors.
Update documentation with config validation guidance.
This commit is contained in:
Joseph Doherty
2026-01-21 17:47:15 -05:00
parent ceb63bfefb
commit e5fe2f06e9
88 changed files with 4995 additions and 201 deletions
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [Branch]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/branch.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [DataUpdate]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/dataupdate.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [FunctionCode]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/functioncode.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [Item]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/item.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [JdeUser]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/jdeuser.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [Lot]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/lot.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [LotUsage_Curr]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/lotusage_curr.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [LotUsage_Hist]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/lotusage_hist.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [MisData]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/misdata.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=localhost,1434;Database=ScopingTool;User Id=scopingapp;Password=Sc0ping@pp_Dev#2024;TrustServerCertificate=true",
"query": "SELECT * FROM [MisData_Curr]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/misdata_curr.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=localhost,1434;Database=ScopingTool;User Id=scopingapp;Password=Sc0ping@pp_Dev#2024;TrustServerCertificate=true",
"query": "SELECT * FROM [MisData_Hist]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/misdata_hist.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [OrgHierarchy]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/orghierarchy.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [ProfitCenter]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/profitcenter.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [RouteMaster]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/routemaster.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [StatusCode]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/statuscode.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [WorkCenter]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/workcenter.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [WorkOrder_Curr]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/workorder_curr.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [WorkOrder_Hist]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/workorder_hist.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [WorkOrderComponent_Curr]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/workordercomponent_curr.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [WorkOrderComponent_Hist]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/workordercomponent_hist.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [WorkOrderRouting]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/workorderrouting.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [WorkOrderStep_Curr]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/workorderstep_curr.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [WorkOrderStep_Hist]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/workorderstep_hist.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [WorkOrderTime_Curr]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/workordertime_curr.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;",
"query": "SELECT * FROM [WorkOrderTime_Hist]",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/workordertime_hist.pb.zstd",
"compressionLevel": 10
}
@@ -0,0 +1,7 @@
{
"providerType": "SqlServer",
"connectionString": "Server=wndchl-db-vt01.zmr.zimmer.com;Database=wcadmin;User Id=jde_scoping_readonly;Password=Wndchl@jde453vt01;TrustServerCertificate=true;",
"query": "WITH hist AS (SELECT lch.phaseName, max(lch.createStampA2) AS Release_Date, ver.branchIditerationInfo FROM wcadmin.ObjectHistory obh JOIN wcadmin.LifeCycleHistory lch ON lch.idA2A2 = obh.idA3B5 JOIN wcadmin.WTDocument ver ON ver.idA2A2 = obh.idA3A5 WHERE lch.phaseName IN ('Released', 'Superseded') AND lch.[action] = 'Enter_Phase' AND lch.createStampA2 >= CURRENT_TIMESTAMP - 365 GROUP BY lch.phaseName, branchIditerationInfo), attr AS (SELECT sv.idA3A4 AS ATTR_VERSION_ID, sd.name AS INT_NAME, sv.value2 AS value FROM wcadmin.StringValue sv JOIN wcadmin.StringDefinition sd ON sv.idA3A6 = sd.idA2A2), char_attr AS (SELECT ATTR_VERSION_ID, [ext.zimmer.ISCCharacteristicNumber] AS CharacterNumber, [ext.zimmer.ISCCharacteristicDescription] AS TestDescription, [ext.zimmer.ISCSampleType] AS SamplingType, CASE WHEN [ext.zimmer.ISCSampleType] = 'Fixed' THEN [ext.zimmer.ISCSampleValueFree] ELSE [ext.zimmer.ISCSampleValueEnum] END AS SamplingValue, [ext.zimmer.ISCToolsAndGauges] AS ToolsGauges, [ext.zimmer.WorkInstructions] AS WorkInstructions FROM attr PIVOT (MAX(value) FOR INT_NAME IN ([ext.zimmer.ISCCharacteristicNumber], [ext.zimmer.ISCCharacteristicDescription], [ext.zimmer.ISCSampleType], [ext.zimmer.ISCSampleValueEnum], [ext.zimmer.ISCSampleValueFree], [ext.zimmer.ISCToolsAndGauges], [ext.zimmer.WorkInstructions])) x), opd_attr AS (SELECT ATTR_VERSION_ID AS OPD_VERSION_ID, [ext.zimmer.PartNumber] AS PartNumber, [ext.zimmer.OperationSequenceNumber] AS OperationNumber, [ext.zimmer.Site] AS Site FROM attr PIVOT (MAX(value) FOR INT_NAME IN ([ext.zimmer.PartNumber], [ext.zimmer.OperationSequenceNumber], [ext.zimmer.Site])) x), as_char AS (SELECT crl.branchIdA3A5, c_mas.WTDocumentNumber AS CHILD_NUMBER, c_ver.versionIdA2versionInfo AS CHILD_REV, c_ver.iterationIdA2iterationInfo AS CHILD_ITERATION, char_attr.* FROM wcadmin.ConfigurableRevisionLink crl JOIN wcadmin.WTTypeDefinition wd ON wd.idA2A2 = crl.idA2typeDefinitionReference JOIN wcadmin.WTDocument c_ver ON c_ver.branchIditerationInfo = crl.branchIdA3B5 JOIN wcadmin.WTDocumentMaster c_mas ON c_mas.idA2A2 = c_ver.idA3masterReference LEFT JOIN char_attr ON char_attr.ATTR_VERSION_ID = c_ver.idA2A2 WHERE wd.name = 'ext.zimmer.ISAssociatedChars' AND c_ver.latestiterationinfo = 1), ins_obj AS (SELECT ver.branchIditerationInfo AS MIS_IIS_BRANCH_ID, hist.Release_Date, ver.statestate AS state, mas.WTDocumentNumber AS MIS_IIS_Number, ver.versionIdA2versionInfo AS Version, ver.iterationIdA2iterationInfo AS OBJ_ITERATION, mas.idA2A2 AS MASTER_ID, ver.idA2A2 AS VERSION_ID, ver.modifyStampA2 AS OBJ_LAST_MODIFIED, as_char.* FROM wcadmin.WTDocument ver JOIN wcadmin.WTDocumentMaster mas ON mas.idA2A2 = ver.idA3masterReference JOIN hist ON hist.branchIditerationInfo = ver.branchIditerationInfo LEFT JOIN as_char ON as_char.branchIdA3A5 = ver.branchIditerationInfo WHERE ver.latestiterationInfo = 1 AND ver.statestate IN ('RELEASED', 'SUPERSEDED')), opdoc AS (SELECT opd_attr.*, ins_obj.* FROM ins_obj JOIN wcadmin.ConfigurableRevisionLink crl ON crl.branchIdA3A5 = ins_obj.MIS_IIS_BRANCH_ID JOIN wcadmin.WTTypeDefinition wd ON wd.idA2A2 = crl.idA2typeDefinitionReference JOIN wcadmin.WTDocument v ON v.branchIditerationInfo = crl.branchIdA3B5 JOIN wcadmin.WTDocumentMaster m ON m.idA2A2 = v.idA3masterReference JOIN opd_attr ON opd_attr.OPD_VERSION_ID = v.idA2A2 WHERE wd.name = 'ext.zimmer.ISAssociatedOps') SELECT PartNumber, OperationNumber, MIS_IIS_Number, Version, Site, CharacterNumber, TestDescription, SamplingType, SamplingValue, ToolsGauges, WorkInstructions, state, Release_Date FROM opdoc",
"outputPath": "/Volumes/DOCK_NVME/CACHED_DB_FILES/mistemp.pb.zstd",
"compressionLevel": 10
}
+118
View File
@@ -0,0 +1,118 @@
#!/bin/bash
# Export all tables (except Search*) from ScopingTool QA database
# Output: /Volumes/DOCK_NVME/CACHED_DB_FILES
# Runs 8 tables in parallel
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
OUTPUT_DIR="/Volumes/DOCK_NVME/CACHED_DB_FILES"
DEFINITIONS_DIR="$SCRIPT_DIR/definitions/export-batch"
CONNECTION_STRING="Server=JDESCP-SQL-VQ01.zmr.zimmer.com;Database=ScopingTool;User Id=ScopingTool;Password=Tool#qascope;TrustServerCertificate=true;"
PARALLEL_JOBS=8
# Tables to export (excluding Search* tables)
TABLES=(
"Branch"
"DataUpdate"
"FunctionCode"
"Item"
"JdeUser"
"Lot"
"LotUsage_Curr"
"LotUsage_Hist"
"MisData"
"OrgHierarchy"
"ProfitCenter"
"RouteMaster"
"StatusCode"
"WorkCenter"
"WorkOrder_Curr"
"WorkOrder_Hist"
"WorkOrderComponent_Curr"
"WorkOrderComponent_Hist"
"WorkOrderRouting"
"WorkOrderStep_Curr"
"WorkOrderStep_Hist"
"WorkOrderTime_Curr"
"WorkOrderTime_Hist"
)
echo "=================================================="
echo "DbExporter - Batch Export (Parallel)"
echo "=================================================="
echo "Database: ScopingTool (QA)"
echo "Output: $OUTPUT_DIR"
echo "Tables: ${#TABLES[@]}"
echo "Parallel: $PARALLEL_JOBS at a time"
echo "=================================================="
echo ""
# Create directories
mkdir -p "$DEFINITIONS_DIR"
mkdir -p "$OUTPUT_DIR"
# Build the project first
echo "Building DbExporter..."
cd "$SCRIPT_DIR"
dotnet build -c Release --nologo -v q
echo ""
EXPORTER="$SCRIPT_DIR/bin/Release/net10.0/DbExporter"
# Function to export a single table
export_table() {
local TABLE="$1"
local EXPORTER="$2"
local DEFINITIONS_DIR="$3"
local OUTPUT_DIR="$4"
local CONNECTION_STRING="$5"
TABLE_LOWER=$(echo "$TABLE" | tr '[:upper:]' '[:lower:]')
DEFINITION_FILE="$DEFINITIONS_DIR/${TABLE_LOWER}.json"
OUTPUT_FILE="$OUTPUT_DIR/${TABLE_LOWER}.pb.zstd"
# Create definition file
cat > "$DEFINITION_FILE" << EOF
{
"providerType": "SqlServer",
"connectionString": "$CONNECTION_STRING",
"query": "SELECT * FROM [$TABLE]",
"outputPath": "$OUTPUT_FILE",
"compressionLevel": 10
}
EOF
# Run export
echo "[$TABLE] Starting..."
if $EXPORTER "$DEFINITION_FILE" 2>&1 | sed "s/^/[$TABLE] /"; then
echo "[$TABLE] Done"
else
echo "[$TABLE] FAILED"
fi
}
export -f export_table
# Track progress
TOTAL=${#TABLES[@]}
echo "Starting parallel export of $TOTAL tables ($PARALLEL_JOBS at a time)..."
echo ""
# Run exports in parallel, 8 at a time
printf '%s\n' "${TABLES[@]}" | xargs -P $PARALLEL_JOBS -I {} bash -c 'export_table "$@"' _ {} "$EXPORTER" "$DEFINITIONS_DIR" "$OUTPUT_DIR" "$CONNECTION_STRING"
echo ""
echo "=================================================="
echo "Export Complete"
echo "=================================================="
# Show output files
echo ""
echo "Output files:"
ls -lhS "$OUTPUT_DIR"/*.pb.zstd 2>/dev/null | awk '{printf " %-50s %8s\n", $9, $5}'
echo ""
echo "Total size:"
du -sh "$OUTPUT_DIR"