NetApp ONTAP SnapMirror Replication
Tasks for managing NetApp ONTAP SnapMirror replication relationships.
Manage NetApp ONTAP clusters from Kestra: volumes, snapshots, SnapMirror replication, and SVMs.
Interact with NetApp ONTAP clusters via the ONTAP REST API (https://{host}/api/). The plugin covers volume management, snapshot operations, SnapMirror replication, and SVM queries.
All tasks authenticate with HTTP Basic (username + password). Cluster-scoped admin credentials are required for most operations.
Required connection properties on every task:
| Property | Description |
|---|---|
host |
Cluster management IP or hostname (for example: ontap.example.com) |
username |
ONTAP username (for example: admin) |
password |
ONTAP password — store as a secret and reference via {{ secret('ONTAP_PASSWORD') }} |
Optional:
| Property | Description |
|---|---|
port |
REST API port, defaults to 443 |
options |
HttpConfiguration block — set ssl: { insecureTrustAllCertificates: true } to accept self-signed cluster certs (insecure, lab use only) |
waitTimeout |
How long to wait for async ONTAP jobs to complete. Defaults to PT5M. |
Use plugin defaults to avoid repeating connection properties across tasks:
pluginDefaults:
- type: io.kestra.plugin.ee.netapp.ontap
values:
host: "{{ secret('ONTAP_HOST') }}"
username: admin
password: "{{ secret('ONTAP_PASSWORD') }}"
io.kestra.plugin.ee.netapp.ontap.volumes)Tasks operate on ONTAP FlexVol volumes. All mutating operations (create, resize, delete) handle async job responses (HTTP 202) automatically.
| Task | API endpoint | Key properties |
|---|---|---|
List |
GET /api/storage/volumes |
maxRecords, svmName (filter) |
Get |
GET /api/storage/volumes/{uuid} |
volumeUuid |
Create |
POST /api/storage/volumes |
name, svmName, sizeBytes, aggregateName |
Resize |
PATCH /api/storage/volumes/{uuid} |
volumeUuid, sizeBytes |
Delete |
DELETE /api/storage/volumes/{uuid} |
volumeUuid (volume must be offline) |
List supports a fetchType property (default STORE): STORE writes results to Kestra internal storage and returns a URI (recommended for large clusters), FETCH returns all rows inline, FETCH_ONE returns a single row, and NONE returns only the count.
Resize below used capacity is rejected by ONTAP with a descriptive error message.
io.kestra.plugin.ee.netapp.ontap.snapshots)All snapshot tasks are scoped to a specific volume identified by volumeUuid.
| Task | API endpoint | Key properties |
|---|---|---|
Create |
POST /api/storage/volumes/{uuid}/snapshots |
volumeUuid, name, comment |
List |
GET /api/storage/volumes/{uuid}/snapshots |
volumeUuid, maxRecords |
Delete |
DELETE /api/storage/volumes/{uuid}/snapshots/{snapshotUuid} |
volumeUuid, snapshotUuid |
Restore |
PATCH /api/storage/volumes/{uuid} (restore_to) |
volumeUuid, snapshotUuid |
Delete fails if the snapshot is still locked by a clone or SnapMirror relationship.
io.kestra.plugin.ee.netapp.ontap.replication)| Task | API endpoint | Key properties |
|---|---|---|
CreateRelationship |
POST /api/snapmirror/relationships |
sourceSvmName, sourceVolumeName, destinationSvmName, destinationVolumeName, policyName |
GetStatus |
GET /api/snapmirror/relationships/{uuid} |
relationshipUuid |
Update |
POST /api/snapmirror/relationships/{uuid}/transfers |
relationshipUuid |
Resync |
PATCH /api/snapmirror/relationships/{uuid} → snapmirrored |
relationshipUuid |
Break |
PATCH /api/snapmirror/relationships/{uuid} → broken_off |
relationshipUuid |
Abort |
PATCH /api/snapmirror/relationships/{uuid}/transfers/{transferUuid} (body: {"state": "aborted"}) |
relationshipUuid, transferUuid |
Valid SnapMirror state transitions: snapmirrored ↔ broken_off; paused is also supported. Invalid transitions are rejected by ONTAP with an actionable message.
io.kestra.plugin.ee.netapp.ontap.svm)| Task | API endpoint | Key properties |
|---|---|---|
List |
GET /api/svm/svms |
maxRecords |
Get |
GET /api/svm/svms/{uuid} |
svmUuid |
OnSnapshotCreated (io.kestra.plugin.ee.netapp.ontap.snapshots)Polls GET /api/storage/volumes/{volumeUuid}/snapshots at interval and fires one execution per newly detected snapshot.
Key properties: host, username, password, volumeUuid, interval.
On the very first poll, all pre-existing snapshots are recorded without triggering executions. If the volume is deleted between polls, the trigger logs a warning and waits for the next cycle.
Trigger outputs available as {{ trigger.snapshotUuid }}, {{ trigger.snapshotName }}, {{ trigger.createTime }}, {{ trigger.volumeUuid }}, {{ trigger.newSnapshotCount }}.