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
| Phase | Runs on | What it does |
|---|---|---|
DiscoverHost | Either host | Inventories the host - local vs iSCSI disks, SQL instances and databases, drive letters, portals, targets, and sessions. Read-only; touches no storage. |
ConnectTargets | Either host | Connects the selected iSCSI targets so their disks become visible to later phases. Does not format or mount. |
SourcePrep | Source | Prepares the source LUNs (initialize, format NTFS 64K, assign drive letters) and then migrates databases onto them if a migrate block is present. |
SourcePrepOnly | Source | The prepare half of SourcePrep, with no migration. |
SourceMigrateOnly | Source | The migrate half of SourcePrep, against LUNs that are already prepared. |
CloneMount | Clone | Connects the cloned targets, brings the disks online without formatting, assigns drive letters, and attaches the database files. |
CloneUnmount | Clone | Detaches 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.
| Field | Type | Description |
|---|---|---|
portal | String | The 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. |
manualIQN | String | IQN 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. |
dataset | String | Restricts targets to those belonging to a named vME dataset. An alternative to manualIQN. |
targetSelection | String | Which of the discovered targets to connect, as a comma-separated list of indexes, or ALL. Optional when manualIQN or dataset is set. |
clearOldPortals | Boolean | Removes previously configured portals before connecting. Read by the prep phases only. Default false. |
job_timeout_seconds | Number | Overrides 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.
| Field | Type | Description |
|---|---|---|
chapUser | String | CHAP username for one-way CHAP. |
chapPassword | String | CHAP secret. Windows enforces 12-16 ASCII characters. |
mutualChapPassword | String | Secret for mutual CHAP. Omit for one-way CHAP. |
targets | Array | Per-target credentials, for when different targets use different secrets. |
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 thingsFor 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.
| Field | Type | Description |
|---|---|---|
dataDriveLetter | String | Drive letter for the data LUN, for example E. Labelled SQL_Data. |
logDriveLetter | String | Drive letter for the log LUN, for example F. Labelled SQL_Log. |
dataDiskNumber | Number | Windows disk number of the data LUN. |
logDiskNumber | Number | Windows disk number of the log LUN. |
confirmPrep | Boolean | Default true. Setting false aborts before any destructive step - useful as a dry run. |
forceDriveLetters | Boolean | Reassigns the requested letters even if they are in use elsewhere. Default false. |
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.
| Field | Type | Description |
|---|---|---|
dataDriveLetter | String | Drive letter holding \MSSQL\Data and \MSSQL\Backups. |
logDriveLetter | String | Drive letter holding \MSSQL\Logs. |
dbIds | String | Comma-separated database IDs to migrate, as reported by DiscoverHost. |
dbNameFilter | String | Selects databases by name pattern instead of by ID. |
dbPrefix | String | Prefix for the new database names. Defaults to ISCSI_. Letters, digits, and underscores only. |
sqlInstance | String | Pins the SQL instance to use. When omitted, the connector auto-detects: the default instance if present, otherwise the first named instance. |
backupPaths | Array | Existing .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. |
probeOnly | Boolean | Reports 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. |
sourcePaths | Object | { "dataPath": "...", "logPath": "..." } for raw .mdf/.ldf file copy. Either a directory or a bare drive letter, which is scanned recursively. |
confirmStart | Boolean | Default true. false aborts before the migration starts. |
confirmSelection | Boolean | Default true. false aborts after the database selection is resolved but before work begins. |
execute | Boolean | Default 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:
| Mode | Set | Behaviour |
|---|---|---|
| Backup and restore | dbIds or dbNameFilter | Takes a fresh backup of each selected database and restores it onto the LUNs under the new name. |
| Restore from existing backups | backupPaths | Restores from .bak files already on disk, with no BACKUP DATABASE step. |
| Raw file copy | sourcePaths | Offlines 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.
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.
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"]
}
}
]
}
| Field | Meaning |
|---|---|
restorable | Whether this database can be restored from what the paths hold. |
reason | Empty 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. |
full | The full set the restore would use. null when restorable is false. |
diff | The differential that chains to that full, or null when there isn't one. |
stripes | The 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.
| Field | Type | Description |
|---|---|---|
sqlInstance | String | The SQL instance to attach the databases to. |
dataDriveLetter | String | Drive letter to assign to the cloned data volume. |
logDriveLetter | String | Drive letter to assign to the cloned log volume. |
dbSelection | String | Which discovered databases to attach - a comma-separated list, or ALL. |
dbPrefix | String | Prefix applied to the attached database names. Send an empty string to attach the names exactly as they are on the clone. |
autoPair | Boolean | Default true. Pairs each .mdf with its .ldf automatically. Set false to supply pairs explicitly. |
databases | Array | Explicit file pairs, used when autoPair is false. |
skipPartitionAssign | Boolean | Skips drive-letter assignment, for when the volumes already have letters. Default false. |
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.
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.
| Field | Type | Description |
|---|---|---|
dbSelection | String | Which databases to detach - a comma-separated list, ALL, MATCH to scope by manualIQN, or SKIP / NONE to detach nothing. |
disconnectTargets | String | Which iSCSI sessions to disconnect - a comma-separated list, ALL, MATCH, or SKIP / NONE. |
dbPrefix | String | Only 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. |
sqlInstance | String | The instance to detach from. Optional - when omitted the connector auto-detects, and for workflow jobs vME supplies the instance recorded by the migration. |
fullCleanup | Boolean | Default 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. |
fullCleanup: falseTwo separate settings can take other iSCSI workloads offline on a shared server:
disconnectTargets: "ALL"disconnects every session on the host. PreferMATCHwithmanualIQN, or an explicit list.fullCleanupdefaults totrue, and does the same thing regardless of whatdisconnectTargetsis set to. Omitting it opts in.
The console sends fullCleanup: false on every teardown. A hand-written request that leaves it out does not.
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:
| Phase | Default timeout |
|---|---|
SourcePrep | 86400 seconds (24 hours) |
SourceMigrateOnly | 86400 seconds (24 hours) |
| All other phases | 3600 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.
timed_out before its timeoutSeparately 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 field | Environment variable | Script |
|---|---|---|
portal | ISCSI_PORTAL | USECASE1, USECASE3 |
manualIQN | ISCSI_MANUAL_IQN | USECASE1, USECASE3, UNMOUNT |
dataset | ISCSI_EXPECTED_DATASET | USECASE1, USECASE3 |
targetSelection | ISCSI_TARGET_SELECTION | USECASE1, USECASE3 |
clearOldPortals | ISCSI_CLEAR_OLD_PORTALS | USECASE1 |
dataDiskNumber | ISCSI_DATA_DISK | USECASE1 |
logDiskNumber | ISCSI_LOG_DISK | USECASE1 |
dataDriveLetter | ISCSI_DATA_LETTER | USECASE1 |
logDriveLetter | ISCSI_LOG_LETTER | USECASE1 |
confirmPrep | ISCSI_CONFIRM_PREP | USECASE1 |
forceDriveLetters | ISCSI_FORCE_DRIVE_LETTERS | USECASE1 |
chapUser | ISCSI_CHAP_USER | USECASE1, USECASE3 |
chapPassword | ISCSI_CHAP_SECRET | USECASE1, USECASE3 |
mutualChapPassword | ISCSI_MUTUAL_CHAP_SECRET | USECASE1, USECASE3 |
targets | ISCSI_CHAP_TARGETS | USECASE1, USECASE3 |
migrate.dataDriveLetter | ISCSI_MIGRATE_DATA_DRIVE | USECASE2 |
migrate.logDriveLetter | ISCSI_MIGRATE_LOG_DRIVE | USECASE2 |
migrate.dbIds | ISCSI_MIGRATE_DB_IDS | USECASE2 |
migrate.dbNameFilter | ISCSI_MIGRATE_DB_NAME_FILTER | USECASE2 |
migrate.dbPrefix | ISCSI_MIGRATE_DB_PREFIX | USECASE2 |
migrate.sqlInstance | ISCSI_SQL_INSTANCE | USECASE2 |
migrate.backupPaths | ISCSI_MIGRATE_BACKUP_PATHS | USECASE2 |
migrate.probeOnly | ISCSI_MIGRATE_PROBE_ONLY | USECASE2 |
migrate.sourcePaths.dataPath | ISCSI_MIGRATE_SOURCE_DATA_PATH | USECASE2 |
migrate.sourcePaths.logPath | ISCSI_MIGRATE_SOURCE_LOG_PATH | USECASE2 |
migrate.confirmStart | ISCSI_MIGRATE_CONFIRM | USECASE2 |
migrate.confirmSelection | ISCSI_MIGRATE_DB_CONFIRM | USECASE2 |
migrate.execute | ISCSI_MIGRATE_EXECUTE | USECASE2 |
attach.sqlInstance | ISCSI_SQL_INSTANCE | USECASE3 |
attach.dataDriveLetter | ISCSI_ATTACH_DATA_DRIVE | USECASE3 |
attach.logDriveLetter | ISCSI_ATTACH_LOG_DRIVE | USECASE3 |
attach.dbSelection | ISCSI_ATTACH_DB_SELECTION | USECASE3 |
attach.dbPrefix | ISCSI_ATTACH_DB_PREFIX | USECASE3 |
attach.autoPair | ISCSI_ATTACH_AUTO_PAIR | USECASE3 |
attach.databases | ISCSI_ATTACH_DATABASES | USECASE3 |
attach.skipPartitionAssign | ISCSI_SKIP_PARTITION_ASSIGN | USECASE3 |
unmount.sqlInstance | ISCSI_SQL_INSTANCE | UNMOUNT |
unmount.dbSelection | ISCSI_DETACH_DB_SELECTION | UNMOUNT |
unmount.dbPrefix | ISCSI_DETACH_DB_PREFIX | UNMOUNT |
unmount.disconnectTargets | ISCSI_DISCONNECT_TARGET_SELECTION | UNMOUNT |
unmount.fullCleanup | ISCSI_FULL_CLEANUP_CONFIRM | UNMOUNT |
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.