Skip to main content

iSCSI Connector API Reference

This page lists every phase the iSCSI connector accepts and every config field each phase reads, so you can drive the whole clone cycle over REST instead of the vME console.

It assumes you already know the shape of an agent job. If you have not read it yet, start with Agent Jobs, which covers the request envelope, job states, polling, timeouts, and error handling for all connectors. Installing and enrolling the agent is covered in the connector guide.

Every job in this reference is created the same way:

POST /agent-job

{
"agent_id" : "agt-abc123",
"phase" : "<one of the phases below>",
"config" : { },
"secrets" : { },
"workflow_id" : "wf-abc123",
"wizard_step" : "source_prep",
"role" : "source"
}

The last three are optional and only matter when the job belongs to an onboarding workflow. workflow_id is what lets a phase's results - such as resolvedSqlInstance - persist for later jobs in the sequence. wizard_step records the job as that step's outcome, so omit it for a job that should not count as one, such as a backup-set probe. role is source or clone, and is also accepted as a filter on GET /agent-job.


Phases

PhaseRuns onWhat it does
DiscoverHostEither hostInventories the host - local vs iSCSI disks, SQL instances and databases, drive letters, portals, targets, and sessions. Read-only; touches no storage.
ConnectTargetsEither hostConnects the selected iSCSI targets so their disks become visible to later phases. Does not format or mount.
SourcePrepSourcePrepares the source LUNs (initialize, format NTFS 64K, assign drive letters) and then migrates databases onto them if a migrate block is present.
SourcePrepOnlySourceThe prepare half of SourcePrep, with no migration.
SourceMigrateOnlySourceThe migrate half of SourcePrep, against LUNs that are already prepared.
CloneMountCloneConnects the cloned targets, brings the disks online without formatting, assigns drive letters, and attaches the database files.
CloneUnmountCloneDetaches the workflow's databases, then disconnects its iSCSI sessions and offlines only the disks behind them.

Snapshot and clone creation are not agent phases. They are done in vME through the source and clone APIs, between SourceMigrateOnly and CloneMount.

Typical sequence

Source host                          vME                        Clone host
----------- --- ----------
DiscoverHost
ConnectTargets
SourcePrepOnly
SourceMigrateOnly
snapshot source
create clone
DiscoverHost
CloneMount
... use the databases ...
CloneUnmount

SourcePrep collapses the two source phases into one job. Use the split phases when you want to prepare LUNs well ahead of the migration, or retry a failed migration without re-preparing.


Shared config fields

These sit at the top level of config, alongside the migrate, attach, and unmount blocks rather than inside them.

FieldTypeDescription
portalStringThe vME appliance's iSCSI portal host or IP. Validated and probed on port 3260 before the initiator is touched, so a bad value fails fast.
manualIQNStringIQN filter - only matching targets are considered. Matched against whole IQN name components, so a single dataset-path fragment such as tank.sources.sales covers both of a workflow's LUNs (...sales.data and ...sales.log). A comma-separated list is accepted for targets that share no common component. Also used to derive disk roles: an IQN containing data or mdf is the data LUN, log or ldf is the log LUN.
datasetStringRestricts targets to those belonging to a named vME dataset. An alternative to manualIQN.
targetSelectionStringWhich of the discovered targets to connect, as a comma-separated list of indexes, or ALL. Optional when manualIQN or dataset is set.
clearOldPortalsBooleanRemoves previously configured portals before connecting. Read by the prep phases only. Default false.
job_timeout_secondsNumberOverrides the job timeout. See Timeouts.

CHAP

Supply these in secrets, not config, so they are stored encrypted and kept out of logs and job listings.

FieldTypeDescription
chapUserStringCHAP username for one-way CHAP.
chapPasswordStringCHAP secret. Windows enforces 12-16 ASCII characters.
mutualChapPasswordStringSecret for mutual CHAP. Omit for one-way CHAP.
targetsArrayPer-target credentials, for when different targets use different secrets.
CHAP secret length

The Windows iSCSI Initiator rejects secrets outside 12-16 ASCII characters at connection time. Prefer 16 characters of mixed-case alphanumeric - Windows may auto-decode a pure-hex string to fewer bytes and then reject it as too short.

A target's IQN is matched against each targets entry as whole IQN name components. A target with no matching entry falls back to the top-level chapUser / chapPassword, and connects without authentication when neither is set. mutualChapPassword is always global: Windows supports a single initiator reverse CHAP secret system-wide.

A worked secrets example with per-target credentials:

{
"chapUser": "default-user",
"chapPassword": "default-password",
"mutualChapPassword": "global-mutual-secret",
"targets": [
{
"iqn": "iqn.2025-01.com.storage:lun-data",
"chapUser": "user-for-data",
"chapPassword": "secret-for-data"
},
{
"iqn": "iqn.2025-01.com.storage:lun-log",
"chapUser": "user-for-log",
"chapPassword": "secret-for-log"
}
]
}

The targets array is optional: without it, the top-level credentials apply to every connected target.


DiscoverHost

Requires no config. Send {} and read the inventory back off the completed job - supplying portal refreshes that portal first, so newly created targets appear.

{ "agent_id": "agt-abc123", "phase": "DiscoverHost", "config": {} }

Run this first on any host you are about to act on. Its output gives you the disk numbers, drive letters, target indexes, and database IDs that the later phases need.


ConnectTargets

Reads portal, clearOldPortals, and targets - the IQNs to connect, as an array or a comma-separated string.

Unlike the prep and clone phases, this one does not honour manualIQN or dataset. If targets is omitted it connects every target discovered on the portal, so name them explicitly unless that is what you want.

{
"agent_id": "agt-abc123",
"phase": "ConnectTargets",
"config": {
"portal": "10.0.0.10",
"targets": [
"iqn.2024-01.com.example:tank.sources.sales.data",
"iqn.2024-01.com.example:tank.sources.sales.log"
]
}
}
targets means two different things

For ConnectTargets it is the list of IQNs to connect. For the prep and clone phases it is the per-target CHAP credentials array described under CHAP. They are unrelated fields that happen to share a name.


SourcePrepOnly and SourcePrep

Prepares the source LUNs. SourcePrep additionally runs the migration when a migrate block is present.

Required: portal, dataDriveLetter, logDriveLetter.

Also required unless manualIQN or dataset is set: dataDiskNumber, logDiskNumber, targetSelection. With an IQN filter present the connector derives the disk roles from the IQN keywords instead, so the disk numbers can be omitted. Without a filter, run DiscoverHost or ConnectTargets first to obtain the disk numbers.

FieldTypeDescription
dataDriveLetterStringDrive letter for the data LUN, for example E. Labelled SQL_Data.
logDriveLetterStringDrive letter for the log LUN, for example F. Labelled SQL_Log.
dataDiskNumberNumberWindows disk number of the data LUN.
logDiskNumberNumberWindows disk number of the log LUN.
confirmPrepBooleanDefault true. Setting false aborts before any destructive step - useful as a dry run.
forceDriveLettersBooleanReassigns the requested letters even if they are in use elsewhere. Default false.
This phase formats disks

SourcePrep and SourcePrepOnly initialize and format the selected LUNs as NTFS with 64K allocation units. Only new, empty LUNs should be selected.

{
"agent_id": "agt-src01",
"phase": "SourcePrepOnly",
"config": {
"portal": "10.0.0.10",
"manualIQN": "tank.sources.sales",
"dataDriveLetter": "E",
"logDriveLetter": "F"
}
}

SourceMigrateOnly and the migrate block

Moves databases onto the prepared LUNs. SourceMigrateOnly requires a migrate block; SourcePrep accepts one optionally.

Required inside migrate: dataDriveLetter, logDriveLetter.

Also required: dbIds, unless one of dbNameFilter, backupPaths, or sourcePaths.dataPath is supplied - those select the databases a different way.

FieldTypeDescription
dataDriveLetterStringDrive letter holding \MSSQL\Data and \MSSQL\Backups.
logDriveLetterStringDrive letter holding \MSSQL\Logs.
dbIdsStringComma-separated database IDs to migrate, as reported by DiscoverHost.
dbNameFilterStringSelects databases by name pattern instead of by ID.
dbPrefixStringPrefix for the new database names. Defaults to ISCSI_. Letters, digits, and underscores only.
sqlInstanceStringPins the SQL instance to use. When omitted, the connector auto-detects: the default instance if present, otherwise the first named instance.
backupPathsArrayExisting .bak files or folders to restore from, instead of taking a fresh backup. Accepts directories, wildcards and individual files, mixed freely. Files are grouped into sets by the BackupSetGUID in their header.
probeOnlyBooleanReports the backup sets found in backupPaths and exits without restoring. Requires backupPaths, needs no drive letters, and can run before the LUNs are prepared. See Results.
sourcePathsObject{ "dataPath": "...", "logPath": "..." } for raw .mdf/.ldf file copy. Either a directory or a bare drive letter, which is scanned recursively.
confirmStartBooleanDefault true. false aborts before the migration starts.
confirmSelectionBooleanDefault true. false aborts after the database selection is resolved but before work begins.
executeBooleanDefault true. false generates the SQL and reports what it would do without running it.

Migration modes

The mode is chosen by which selection fields are present:

ModeSetBehaviour
Backup and restoredbIds or dbNameFilterTakes a fresh backup of each selected database and restores it onto the LUNs under the new name.
Restore from existing backupsbackupPathsRestores from .bak files already on disk, with no BACKUP DATABASE step.
Raw file copysourcePathsOfflines the database and copies its .mdf/.ldf files onto the LUNs. Setting this ignores backupPaths.

Worked bodies for each mode are in Bodies for each migration mode.

Which backup set gets restored

Files in backupPaths are grouped into sets by the BackupSetGUID in their header, so a full and a differential for the same database are recognised as separate sets rather than one striped set. The newest full is restored and the newest differential that chains to it is applied on top. Stripes belonging to one set may be spread across several of the supplied paths, and an incomplete set stops the run with the files it found named.

To see what a path holds before restoring, run the job with migrate.probeOnly and read backupSets from the result, then pass the files you want back as migrate.backupPaths.

Results

On success the phase reports resolvedSqlInstance - the instance it actually used. When the job belongs to a workflow, vME persists this onto the workflow so the teardown job can target the same instance. Read it from GET /agent-job.

A pinned instance can fall back

sqlInstance is probed before it is used. If the pinned instance cannot be reached, the connector falls back to auto-detection rather than failing, so a typo can result in the databases landing on a different instance. Check resolvedSqlInstance on the completed job to confirm where the work went.

A probeOnly run reports backupSets instead of restoring anything. This is response data - read it from the completed job's result with GET /agent-job, not something you send.

Each database found carries its name, whether it can be restored, and the sets the restore would use:

"backupSets": {
"databases": [
{
"name": "Sales",
"restorable": true,
"reason": "",
"full": {
"guid": "A1B2C3D4-...",
"finishDate": "2026-04-01 22:14:07",
"stripes": ["D:\\Backups\\sales_full_stripe1.bak", "D:\\Backups\\sales_full_stripe2.bak"]
},
"diff": {
"guid": "E5F6A7B8-...",
"finishDate": "2026-04-02 22:11:53",
"stripes": ["D:\\Backups\\sales_diff.bak"]
}
}
]
}
FieldMeaning
restorableWhether this database can be restored from what the paths hold.
reasonEmpty when restorable is true. On a failure it names the problem - an incomplete set with the missing stripes listed, or a differential with no matching full.
fullThe full set the restore would use. null when restorable is false.
diffThe differential that chains to that full, or null when there isn't one.
stripesThe file paths belonging to that set. Pass these back as backupPaths to restore this database, including every stripe.

Unlike resolvedSqlInstance, backupSets is not persisted onto the workflow - read it from the job that produced it.

Migrating on already-prepared LUNs, selecting by database ID:

{
"agent_id": "agt-src01",
"phase": "SourceMigrateOnly",
"config": {
"job_timeout_seconds": 86400,
"migrate": {
"dataDriveLetter": "E",
"logDriveLetter": "F",
"dbIds": "7,8",
"dbPrefix": "ISCSI_"
}
}
}

Omit sqlInstance to let the connector auto-detect, or set it to pin the instance. Bodies for the other two modes are in Bodies for each migration mode.


CloneMount and the attach block

Required at the top level: portal, attach. Plus targetSelection, unless manualIQN or dataset is set - with a filter present the connector defaults to all matching targets.

Required inside attach: sqlInstance, dataDriveLetter, logDriveLetter, dbSelection.

FieldTypeDescription
sqlInstanceStringThe SQL instance to attach the databases to.
dataDriveLetterStringDrive letter to assign to the cloned data volume.
logDriveLetterStringDrive letter to assign to the cloned log volume.
dbSelectionStringWhich discovered databases to attach - a comma-separated list, or ALL.
dbPrefixStringPrefix applied to the attached database names. Send an empty string to attach the names exactly as they are on the clone.
autoPairBooleanDefault true. Pairs each .mdf with its .ldf automatically. Set false to supply pairs explicitly.
databasesArrayExplicit file pairs, used when autoPair is false.
skipPartitionAssignBooleanSkips drive-letter assignment, for when the volumes already have letters. Default false.
Prefixing on attach

The prefix is applied only when the name in the database's primary data file does not already start with it, so it is never doubled. A restored database already carries the migration's prefix and is left alone; a raw-copied file keeps its original name and gets the prefix. Sending the same prefix the ingest used is therefore the normal setting.

Send an empty string or NONE to attach names exactly as they appear on the clone. Whichever you choose, make sure the teardown job's unmount.dbPrefix matches what the databases ended up being called.

Names come from the file header

The attached name is read from each database's primary data file, not from the file name on disk. A renamed .mdf still attaches under the name it was created with.

{
"agent_id": "agt-clone01",
"phase": "CloneMount",
"config": {
"portal": "10.0.1.10",
"manualIQN": "tank.clones.sales",
"attach": {
"sqlInstance": "localhost",
"dataDriveLetter": "G",
"logDriveLetter": "H",
"dbSelection": "ALL",
"dbPrefix": "ISCSI_"
}
}
}

CloneUnmount and the unmount block

Required at the top level: unmount.

Required inside unmount: dbSelection, disconnectTargets.

Also required: manualIQN at the top level, if either of those two is set to MATCH - MATCH scopes the work by IQN, and without one the job would silently do nothing.

FieldTypeDescription
dbSelectionStringWhich databases to detach - a comma-separated list, ALL, MATCH to scope by manualIQN, or SKIP / NONE to detach nothing.
disconnectTargetsStringWhich iSCSI sessions to disconnect - a comma-separated list, ALL, MATCH, or SKIP / NONE.
dbPrefixStringOnly detach databases with this prefix. Defaults to ISCSI_. Must match the names the databases were actually attached under, or nothing is detached. Letters, digits, and underscores only - it is used as a literal prefix, so SKIP and NONE are treated as prefixes here, not as sentinels.
sqlInstanceStringThe instance to detach from. Optional - when omitted the connector auto-detects, and for workflow jobs vME supplies the instance recorded by the migration.
fullCleanupBooleanDefault true. After the scoped teardown, performs a full iSCSI reset: disconnects every session on the host, not just this workflow's, and clears the initiator configuration and cache. Send false for a scoped teardown - the console always does.
Scope your teardown - and send fullCleanup: false

Two separate settings can take other iSCSI workloads offline on a shared server:

  • disconnectTargets: "ALL" disconnects every session on the host. Prefer MATCH with manualIQN, or an explicit list.
  • fullCleanup defaults to true, and does the same thing regardless of what disconnectTargets is set to. Omitting it opts in.

The console sends fullCleanup: false on every teardown. A hand-written request that leaves it out does not.

Detach and disconnect are independent

Setting dbSelection to SKIP while disconnecting the targets leaves the databases registered in SQL Server with their files gone, so they show as RECOVERY_PENDING. The same happens if dbPrefix does not match the attached names, because nothing gets detached. Confirm the databases detached before disconnecting the LUNs.

{
"agent_id": "agt-clone01",
"phase": "CloneUnmount",
"config": {
"manualIQN": "tank.clones.sales",
"unmount": {
"dbSelection": "MATCH",
"disconnectTargets": "MATCH",
"dbPrefix": "ISCSI_",
"fullCleanup": false
}
}
}

Timeouts

The connector's defaults, on top of the general timeout rules:

PhaseDefault timeout
SourcePrep86400 seconds (24 hours)
SourceMigrateOnly86400 seconds (24 hours)
All other phases3600 seconds (1 hour)

The migration phases default high because a backup and restore of a large database routinely runs for hours. If you are restoring a very large database, or restoring across a slow link, raise job_timeout_seconds above the default rather than relying on it.

A long job can show timed_out before its timeout

Separately from job_timeout_seconds, vME marks a job timed_out when the agent stops reporting for longer than the staleness window - a service restart or a network blip is enough, even though the work on the host continues.

That state is not terminal: a returning agent can still move the job to completed or failed. A client polling for a terminal state must keep polling through it, and raising job_timeout_seconds does not prevent it.


Config field to environment variable

For five of the seven phases the agent runs the same PowerShell scripts you would run by hand, passing config through as environment variables. This mapping is useful when you are reading a script, comparing a failing API job against a working manual run, or translating an existing config.json into API calls.

DiscoverHost and ConnectTargets are the exceptions: the agent implements them directly and never invokes the scripts. That is why ConnectTargets takes an explicit targets list rather than honouring manualIQN or dataset - the IQN filtering lives in the PowerShell, which those two phases do not run.

Config fieldEnvironment variableScript
portalISCSI_PORTALUSECASE1, USECASE3
manualIQNISCSI_MANUAL_IQNUSECASE1, USECASE3, UNMOUNT
datasetISCSI_EXPECTED_DATASETUSECASE1, USECASE3
targetSelectionISCSI_TARGET_SELECTIONUSECASE1, USECASE3
clearOldPortalsISCSI_CLEAR_OLD_PORTALSUSECASE1
dataDiskNumberISCSI_DATA_DISKUSECASE1
logDiskNumberISCSI_LOG_DISKUSECASE1
dataDriveLetterISCSI_DATA_LETTERUSECASE1
logDriveLetterISCSI_LOG_LETTERUSECASE1
confirmPrepISCSI_CONFIRM_PREPUSECASE1
forceDriveLettersISCSI_FORCE_DRIVE_LETTERSUSECASE1
chapUserISCSI_CHAP_USERUSECASE1, USECASE3
chapPasswordISCSI_CHAP_SECRETUSECASE1, USECASE3
mutualChapPasswordISCSI_MUTUAL_CHAP_SECRETUSECASE1, USECASE3
targetsISCSI_CHAP_TARGETSUSECASE1, USECASE3
migrate.dataDriveLetterISCSI_MIGRATE_DATA_DRIVEUSECASE2
migrate.logDriveLetterISCSI_MIGRATE_LOG_DRIVEUSECASE2
migrate.dbIdsISCSI_MIGRATE_DB_IDSUSECASE2
migrate.dbNameFilterISCSI_MIGRATE_DB_NAME_FILTERUSECASE2
migrate.dbPrefixISCSI_MIGRATE_DB_PREFIXUSECASE2
migrate.sqlInstanceISCSI_SQL_INSTANCEUSECASE2
migrate.backupPathsISCSI_MIGRATE_BACKUP_PATHSUSECASE2
migrate.probeOnlyISCSI_MIGRATE_PROBE_ONLYUSECASE2
migrate.sourcePaths.dataPathISCSI_MIGRATE_SOURCE_DATA_PATHUSECASE2
migrate.sourcePaths.logPathISCSI_MIGRATE_SOURCE_LOG_PATHUSECASE2
migrate.confirmStartISCSI_MIGRATE_CONFIRMUSECASE2
migrate.confirmSelectionISCSI_MIGRATE_DB_CONFIRMUSECASE2
migrate.executeISCSI_MIGRATE_EXECUTEUSECASE2
attach.sqlInstanceISCSI_SQL_INSTANCEUSECASE3
attach.dataDriveLetterISCSI_ATTACH_DATA_DRIVEUSECASE3
attach.logDriveLetterISCSI_ATTACH_LOG_DRIVEUSECASE3
attach.dbSelectionISCSI_ATTACH_DB_SELECTIONUSECASE3
attach.dbPrefixISCSI_ATTACH_DB_PREFIXUSECASE3
attach.autoPairISCSI_ATTACH_AUTO_PAIRUSECASE3
attach.databasesISCSI_ATTACH_DATABASESUSECASE3
attach.skipPartitionAssignISCSI_SKIP_PARTITION_ASSIGNUSECASE3
unmount.sqlInstanceISCSI_SQL_INSTANCEUNMOUNT
unmount.dbSelectionISCSI_DETACH_DB_SELECTIONUNMOUNT
unmount.dbPrefixISCSI_DETACH_DB_PREFIXUNMOUNT
unmount.disconnectTargetsISCSI_DISCONNECT_TARGET_SELECTIONUNMOUNT
unmount.fullCleanupISCSI_FULL_CLEANUP_CONFIRMUNMOUNT
Flat versus nested config

config.json in the toolkit nests fields under source and clone containers. The agent job config above uses the flat shape - portal and manualIQN at the top level, with migrate, attach, and unmount as blocks beside them. Do not wrap them in source or clone when creating a job.


Worked Examples

Every job is created the same way: POST /agent-job with the agent, the phase, and a config block, then poll until it settles.

POST /agent-job
GET /agent-job?job_id=<job_id>&include_events=1

A job settles at completed, failed, or cancelled. timed_out means the agent stopped reporting; an agent that comes back can still move the job to its real outcome. CHAP credentials, when needed, are sent as a secrets object beside config on the same POST - see CHAP.

Discover the host

Inventories the SQL host: instances, databases with their state, size, recovery model, and free drive letters.

{
"agent_id": "<source_agent_id>",
"phase": "DiscoverHost",
"config": { "portal": "10.0.0.10" }
}

Prepare LUNs and ingest in one job

SourcePrep connects the workflow's LUNs, formats them, and runs the migration. Give a long ingest the time it needs with job_timeout_seconds.

{
"agent_id": "<source_agent_id>",
"phase": "SourcePrep",
"config": {
"portal": "10.0.0.10",
"manualIQN": "tank.sources.sales",
"dataDriveLetter": "E",
"logDriveLetter": "F",
"confirmPrep": true,
"migrate": {
"dataDriveLetter": "E",
"logDriveLetter": "F",
"dbIds": "ALL",
"confirmStart": true,
"dbPrefix": "ISCSI_"
},
"job_timeout_seconds": 86400
}
}

To run the steps separately, use SourcePrepOnly with the top-level fields only, then SourceMigrateOnly with just the migrate block.

Bodies for each migration mode

The migrate block above used backup and restore (dbIds, or dbNameFilter to select by name pattern). The other two modes swap the selection fields:

Restore from existing .bak files. Inventory the paths first with a probe - no drive letters needed, nothing is restored:

{
"agent_id": "<source_agent_id>",
"phase": "SourceMigrateOnly",
"config": {
"migrate": {
"probeOnly": true,
"backupPaths": ["D:\\Backups\\*.bak"]
}
}
}

The result's backupSets lists each database found, whether it can be restored, and the files its set needs. Pass the files you want back as backupPaths on the real ingest:

{
"agent_id": "<source_agent_id>",
"phase": "SourceMigrateOnly",
"config": {
"migrate": {
"dataDriveLetter": "E",
"logDriveLetter": "F",
"backupPaths": [
"D:\\Backups\\sales_full_stripe1.bak",
"D:\\Backups\\sales_full_stripe2.bak",
"D:\\Backups\\sales_diff.bak"
],
"confirmStart": true,
"dbPrefix": "ISCSI_",
"sqlInstance": "HOST\\STAGING"
},
"job_timeout_seconds": 86400
}
}

sqlInstance is optional: omit it and the agent detects the instance.

Raw file copy. Offlines the database and copies its files onto the LUNs:

{ "migrate": { "sourcePaths": { "dataPath": "D:\\Data\\sales.mdf", "logPath": "L:\\Logs\\sales_log.ldf" }, "dataDriveLetter": "E", "logDriveLetter": "F", "confirmStart": true } }

Mount a clone

Run against the target appliance's agent, pointing manualIQN at the clone dataset. The attach applies the same prefix the ingest used, so the clone comes up under the name the ingest created.

{
"agent_id": "<target_agent_id>",
"phase": "CloneMount",
"config": {
"portal": "10.0.0.20",
"manualIQN": "tank.clones.sales",
"attach": {
"sqlInstance": "localhost",
"dataDriveLetter": "G",
"logDriveLetter": "H",
"dbSelection": "ALL",
"autoPair": true,
"dbPrefix": "ISCSI_"
}
}
}

Tear down

CloneUnmount with MATCH scopes everything to the workflow's own LUNs: only its databases are detached and only its sessions disconnected. The same phase tears down a mounted clone (target agent, clone IQN) or the staging databases on the source host (source agent, source IQN):

{
"agent_id": "<target_agent_id>",
"phase": "CloneUnmount",
"config": {
"manualIQN": "tank.clones.sales",
"unmount": {
"dbSelection": "MATCH",
"disconnectTargets": "MATCH",
"fullCleanup": false,
"dbPrefix": "ISCSI_"
}
}
}

fullCleanup defaults to true when omitted and resets the iSCSI initiator host-wide. Always send it explicitly - false for anything scoped to one workflow.

Chained end to end

The Onboarding (API) folder in the vME Postman collection runs this whole sequence as ordered, chained requests, carrying job and workflow IDs between steps, including the vME-side snapshot, clone, and send calls between the agent jobs.