Storage volumes endpoint overview
Overview
FlexVol volumes are logical containers used by ONTAP to serve data to clients. They contain file systems in a NAS environment and LUNs in a SAN environment.
A FlexGroup volume is a scale-out NAS container that provides high performance along with automatic load distribution and scalability. A FlexGroup volume contains several constituents that automatically and transparently share the traffic.
FlexClone volumes are writable, point-in-time copies of a FlexVol volume. At this time, FlexClones of FlexGroups are not supported.
Volumes with SnapLock type Compliance or Enterprise, are referred to as SnapLock volumes. Volumes with SnapLock type cannot be of FlexGroup style. Once a SnapLock aggregate is created, by default, volumes created inside the aggregate inherit the "snaplock" property from the aggregate.
ONTAP storage APIs allow you to create, modify, and monitor volumes and aggregates.
Storage efficiency
Storage efficiency is used to remove duplicate blocks in the data and to compress the data. Efficiency has deduplication, compression, cross volume deduplication, and compaction options. On all-flash systems, all efficiencies will be enabled by default on volume creation. Options such as "background/inline/both" will be treated as both, which means both background and inline will be enabled for any efficiency option. The option "none" will disable both background and inline efficiency.
To enable any efficiency option on all-flash or FAS systems, background deduplication is always enabled.
Quotas
Quotas provide a way to restrict or track the files and space usage by a user, group, or qtree. Quotas are enabled for a specific FlexVol or a FlexGroup volume.
The following APIs can be used to enable or disable and obtain quota state for a FlexVol or a FlexGroup volume:
– PATCH /api/storage/volumes/{volume-uuid} -d '{"quota.enabled":"true"}'
– PATCH /api/storage/volumes/{volume-uuid} -d '{"quota.enabled":"false"}'
– GET /api/storage/volumes/{volume-uuid}/?fields=quota.state
QoS
QoS policy and settings enforce Service Level Objectives (SLO) on a volume. SLO can be set by specifying qos.max_throughput_iops and/or qos.max_throughput_mbps or qos.min_throughput_iops. Specifying min_throughput_iops is only supported on volumes hosted on an a node which is flash optimized. A pre-created QoS policy can also be used by specifying qos.name or qos.uuid property.
Performance monitoring
Performance of a volume can be monitored by the metric.*
and statistics.*
fields. These show the performance of the volume in terms of IOPS, latency and throughput. The metric.*
fields denote an average whereas statistics.*
fields denote a real-time monotonically increasing value aggregated across all nodes.
Volume APIs
The following APIs are used to perform operations related with FlexVols and FlexGroup volumes:
– POST /api/storage/volumes
– GET /api/storage/volumes
– GET /api/storage/volumes/{uuid}
– PATCH /api/storage/volumes/{uuid}
– DELETE /api/storage/volumes/{uuid}
Examples
Creating a volume
The POST request is used to create a new volume and to specify its properties.
# The API: /api/storage/volumes # The call: curl -X POST "https://<mgmt-ip>/api/storage/volumes" -H "accept: application/hal+json" -d '{"name" : "vol1", "aggregates.name" : ["aggr1"], "svm.name" : "vs1"}' # The response: { "job": { "uuid": "b89bc5dd-94a3-11e8-a7a3-0050568edf84", "_links": { "self": { "href": "/api/cluster/jobs/b89bc5dd-94a3-11e8-a7a3-0050568edf84" } } } }
Creating a FlexGroup volume and specifying its properties using POST
# The API: /api/storage/volumes # The call: curl -X POST "https://<mgmt-ip>/api/storage/volumes" -H "accept: application/hal+json" -d '{"name": "vol1", "aggregates.name": ["aggr1"], "svm.name" : "vs1","snaplock.retention.default": "P20Y"}' # The response: { "job": { "uuid": "e45b123b-c228-11e8-aa20-0050568e36bb", "_links": { "self": { "href": "/api/cluster/jobs/e45b123b-c228-11e8-aa20-0050568e36bb" } } } }
# The API: /api/storage/volumes # The call: curl -X POST "https://<mgmt-ip>/api/storage/volumes" -H "accept: application/hal+json" -d '{"name" : "vol1", "state" : "online", "type" : "RW", "aggregates" : [{"name" : "aggr1"}, {"name" : "aggr2"}, {"name":"aggr3"}], "constituents_per_aggregate" : "1", "svm" : {"name" : "vs1"}, "size" : "240MB", "encryption" : {"enabled" : "False"}, "efficiency" : {"compression" : "both"}, "autosize" : {"maximum" : "500MB", "minimum" : "240MB"}}' # The response: { "job": { "uuid": "3cfa38bd-3a78-11e9-ae39-0050568ed7dd", "_links": { "self": { "href": "/api/cluster/jobs/3cfa38bd-3a78-11e9-ae39-0050568ed7dd" } } } }
Creating a FlexClone and specifying its properties using POST
# The API: /api/storage/volumes # The call: curl -X POST "https://<mgmt-ip>/api/storage/volumes" -H "accept: application/hal+json" -d '{"name":"vol1_clone",{"clone":"parent_volume": {"name": "vol1"}},"svm":{"name": "vs0"}, {"clone": "is_flexclone":"true"}}' # The response: HTTP/1.1 202 Accepted Date: Tue, 26 Feb 2019 09:06:22 GMT Server: libzapid-httpd X-Content-Type-Options: nosniff Cache-Control: no-cache,no-store,must-revalidate Location: /api/storage/volumes/?name=vol1_clone Content-Length: 189 Content-Type: application/hal+json { "job": { "uuid": "c9ee0040-39a5-11e9-9b24-00a098439a83", "_links": { "self": { "href": "/api/cluster/jobs/c9ee0040-39a5-11e9-9b24-00a098439a83" } } } }
Volumes reported in the GET REST API
The following types of volumes are reported:
– RW, DP and LS volume
– FlexGroup volume
– FlexCache volume
– FlexClone volume
The following types of volumes are not reported:
– DEL volume
– TEMP volume
– Node Root volume
– System Vserver volume
– FlexGroup constituent
– FlexCache constituent
Examples
Retrieving the attributes of a volume
# The API: /api/storage/volumes # The call: curl -X GET "https://<mgmt-ip>/api/storage/volumes" -H "accept: application/hal+json" # The response: { "records": [ { "uuid": "2d1167cc-c3f2-495a-a23f-8f50b071b9b8", "name": "vsdata_root", "_links": { "self": { "href": "/api/storage/volumes/2d1167cc-c3f2-495a-a23f-8f50b071b9b8" } } }, { "uuid": "3969be7e-78b4-4b4c-82a4-fa86331f03df", "name": "vsfg_root", "_links": { "self": { "href": "/api/storage/volumes/3969be7e-78b4-4b4c-82a4-fa86331f03df" } } }, { "uuid": "59c03ac5-e708-4ce8-a676-278dc249fda2", "name": "svm_root", "_links": { "self": { "href": "/api/storage/volumes/59c03ac5-e708-4ce8-a676-278dc249fda2" } } }, { "uuid": "6802635b-8036-11e8-aae5-0050569503ac", "name": "fgvol", "_links": { "self": { "href": "/api/storage/volumes/6802635b-8036-11e8-aae5-0050569503ac" } } }, { "uuid": "d0c3359c-5448-4a9b-a077-e3295a7e9057", "name": "datavol", "_links": { "self": { "href": "/api/storage/volumes/d0c3359c-5448-4a9b-a077-e3295a7e9057" } } } ], "num_records": 5, "_links": { "self": { "href": "/api/storage/volumes" } } }
Retrieving the attributes a volume
The GET request is used to retrieve the attributes of a volume.
# The API: /api/storage/volumes/{uuid} # The call: curl -X GET "https://<mgmt-ip>/api/storage/volumes/d0c3359c-5448-4a9b-a077-e3295a7e9057" -H "accept: application/hal+json" # The response: { "uuid": "d0c3359c-5448-4a9b-a077-e3295a7e9057", "comment": "This is a data volume", "create_time": "2018-07-05T14:56:44+05:30", "language": "en_us", "name": "datavol", "size": 20971520, "state": "online", "style": "flexvol", "tiering_policy": "auto", "type": "rw", "aggregates": [ { "name": "data", "uuid": "aa742322-36bc-4d98-bbc4-0a827534c035", "_links": { "self": { "href": "/api/cluster/aggregates/data" } } } ], "encryption": { "enabled": false, "state": "none", "key_id": "", "type" : "none" }, "error_state": { "has_bad_blocks": false, "is_inconsistent": false }, "files": { "maximum": 566, "used": 96 }, "nas": { "gid": 2468, "security_style": "unix", "uid": 1357, "unix_permissions": 4755 "export_policy": { "name": "default", "id": 8589934593 } }, "metric": { "timestamp": "2019-04-09T05:50:15Z", "duration": "PT15S", "status": "ok", "latency": { "other": 0, "total": 0, "read": 0, "write": 0 }, "iops": { "read": 0, "write": 0, "other": 0, "total": 0 }, "throughput": { "read": 0, "write": 0, "other": 0, "total": 0 } }, "statistics": { "timestamp": "2019-04-09T05:50:42Z", "status": "ok", "latency_raw": { "other": 38298, "total": 38298, "read": 0, "write": 0 }, "iops_raw": { "read": 0, "write": 0, "other": 3, "total": 3 }, "throughput_raw": { "read": 0, "write": 0, "other": 0, "total": 0 } }, "qos": { "policy": { "min_throughput_iops": 0, "max_throughput_iops": 1000, "max_throughput_mbps": 0, "uuid": "228454af-5a8b-11e9-bd5b-005056ac6f1f", "name": "pg1" } }, "snaplock": { "append_mode_enabled": false, "autocommit_period": "none", "compliance_clock_time": "2018-08-20T13:17:43+05:30", "expiry_time": "2018-10-30T05:30:00+05:30", "is_audit_log": false, "litigation_count": 0, "privileged_delete": "permanently_disabled", "type": "compliance", "retention": { "default": "30 years", "minimum": "0 years", "maximum": "30 years" } }, "snapshot_policy": { "name": "default" }, "svm": { "name": "vsdata", "uuid": "d61b69f5-7458-11e8-ad3f-0050569503ac" }, "_links": { "self": { "href": "/api/storage/volumes/d0c3359c-5448-4a9b-a077-e3295a7e9057" } } }
Retrieving the quota state of a FlexVol or a FlexGroup volume
# The API: /api/storage/volumes/{uuid} # The call: curl -X GET "https://<mgmt-ip>/api/storage/volumes/cb20da45-4f6b-11e9-9a71-005056a7f717/?fields=quota.state" -H "accept: application/hal+json" # The response: { "uuid": "cb20da45-4f6b-11e9-9a71-005056a7f717", "name": "fv", "quota": { "state": "on" }, "_links": { "self": { "href": "/api/storage/volumes/cb20da45-4f6b-11e9-9a71-005056a7f717/" } } }
Updating the attributes of a volume
Examples
Updating the attributes of a volume
The PATCH request is used to update the attributes of a volume.
# The API: /api/storage/volumes/{uuid} # The call: curl -X PATCH "https://<mgmt-ip>/api/storage/volumes/d0c3359c-5448-4a9b-a077-e3295a7e9057" -d '{ "size": 26214400, "nas.security_style": "mixed", "comment": "This is a data volume" }' -H "accept: application/hal+json" # The response: HTTP/1.1 202 Accepted Date: Tue, 31 Jul 2018 09:36:43 GMT Server: libzapid-httpd Cache-Control: no-cache,no-store,must-revalidate Content-Length: 189 Content-Type: application/hal+json { "job": { "uuid": "3c5be5a6-94a5-11e8-8ca3-00505695c11b", "_links": { "self": { "href": "/api/cluster/jobs/3c5be5a6-94a5-11e8-8ca3-00505695c11b" } } } }
Updating the attributes of a FlexClone using PATCH
# The API: /api/storage/volumes/{uuid} # The call: curl -X PATCH "https://<mgmt-ip>/api/storage/volumes/d0c3359c-5448-4a9b-a077-e3295a7e9057" -d '{"clone":{"split_initiated":"true"}}' -H "accept: application/hal+json" # The response: HTTP/1.1 202 Accepted Date: Mon, 25 Feb 2019 10:10:19 GMT Server: libzapid-httpd X-Content-Type-Options: nosniff Cache-Control: no-cache,no-store,must-revalidate Content-Length: 189 Content-Type: application/hal+json { "job": { "uuid": "8e01747f-38e5-11e9-8a3a-00a09843994b", "_links": { "self": { "href": "/api/cluster/jobs/8e01747f-38e5-11e9-8a3a-00a09843994b" } } } }
Enabling quotas for a FlexVol or a FlexGroup volume using PATCH
# The API: /api/storage/volumes/{uuid} # The call: curl -X PATCH "https://<mgmt-ip>/api/storage/volumes/d0c3359c-5448-4a9b-a077-e3295a7e9057" -d '{"quota.enabled":"true"}' -H "accept: application/hal+json" # The response: HTTP/1.1 202 Accepted Date: Mon, 25 Feb 2019 10:10:19 GMT Server: libzapid-httpd X-Content-Type-Options: nosniff Cache-Control: no-cache,no-store,must-revalidate Content-Length: 189 Content-Type: application/hal+json { "job": { "uuid": "d2fe7299-57d0-11e9-a2dc-005056a7f717", "_links": { "self": { "href": "/api/cluster/jobs/d2fe7299-57d0-11e9-a2dc-005056a7f717" } } } }
Disabling quotas for a FlexVol or a FlexGroup volume using PATCH
# The API: /api/storage/volumes/{uuid} # The call: curl -X PATCH "https://<mgmt-ip>/api/storage/volumes/d0c3359c-5448-4a9b-a077-e3295a7e9057" -d '{"quota.enabled":"false"}' -H "accept: application/hal+json" # The response: HTTP/1.1 202 Accepted Date: Mon, 25 Feb 2019 10:10:19 GMT Server: libzapid-httpd X-Content-Type-Options: nosniff Cache-Control: no-cache,no-store,must-revalidate Content-Length: 189 Content-Type: application/hal+json { "job": { "uuid": "0c8f6bea-57d1-11e9-a2dc-005056a7f717", "_links": { "self": { "href": "/api/cluster/jobs/0c8f6bea-57d1-11e9-a2dc-005056a7f717" } } } }
Deleting a volume
Example
Deleting a volume
The DELETE request is used to delete a volume.
# The API: /api/storage/volumes # The call: curl -X DELETE "https://<mgmt-ip>/api/storage/volumes/{volume.id} " -H "accept: application/hal+json" # The response: HTTP/1.1 202 Accepted cache-control: no-cache,no-store,must-revalidate connection: Keep-Alive content-length: 189 content-type: application/json date: Wed, 01 Aug 2018 09:40:36 GMT keep-alive: timeout=5, max=100 server: libzapid-httpd { "job": { "uuid": "f1aa3eb8-956e-11e8-86bf-0050568e2249", "_links": { "self": { "href": "/api/cluster/jobs/f1aa3eb8-956e-11e8-86bf-0050568e2249" } } } }