NetApp ONTAP

NetApp ONTAP

Certified
Enterprise Edition

Manage NetApp ONTAP clusters from Kestra: volumes, snapshots, SnapMirror replication, and SVMs.

How to use the NetApp ONTAP plugin

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.

Authentication

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') }}"

Tasks

Volumes (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.

Snapshots (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.

SnapMirror replication (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: snapmirroredbroken_off; paused is also supported. Invalid transitions are rejected by ONTAP with an actionable message.

SVMs (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

Triggers

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 }}.