Block Storage API V3 (CURRENT)

 
Note

The URL for most API methods includes a {project_id} placeholder that represents the caller’s project ID. As of V3.67, the project_id is optional in the URL, and the following are equivalent:

  • GET /v3/{project_id}/volumes

  • GET /v3/volumes

In both instances, the actual project_id used by the API method is the one in the caller’s keystone context. For that reason, including a project_id in the URL is redundant.

The V3.67 microversion is only used as an indicator that the API accepts a URL without a project_id, and this applies to all requests regardless of the microversion in the request. For example, an API node serving V3.67 or greater will accept a URL without a project_id even if the request asks for V3.0. Likewise, it will accept a URL containing a project_id even if the request asks for V3.67.

API versions

GET
/

List All Api Versions

API version details

GET
/v3/

Show API v3 details

API extensions (extensions)

GET
/v3/{project_id}/extensions

List Known API extensions

Volume types (types)

To create an environment with multiple-storage back ends, you must specify a volume type. The API spawns Block Storage volume back ends as children to cinder-volume, and keys them from a unique queue. The API names the back ends cinder-volume.HOST.BACKEND. For example, cinder-volume.ubuntu.lvmdriver. When you create a volume, the scheduler chooses an appropriate back end for the volume type to handle the request.

For information about how to use volume types to create multiple- storage back ends, see Configure multiple-storage back ends.

PUT
/v3/{project_id}/types/{volume_type_id}

Update a volume type

POST
/v3/{project_id}/types/{volume_type_id}/extra_specs

Create or update extra specs for volume type

GET
/v3/{project_id}/types/{volume_type_id}/extra_specs

Show all extra specifications for volume type

GET
/v3/{project_id}/types/{volume_type_id}/extra_specs/{key}

Show extra specification for volume type

PUT
/v3/{project_id}/types/{volume_type_id}/extra_specs/{key}

Update extra specification for volume type

DELETE
/v3/{project_id}/types/{volume_type_id}/extra_specs/{key}

Delete extra specification for volume type

GET
/v3/{project_id}/types/{volume_type_id}

Show volume type detail

GET
/v3/{project_id}/types/default

Show default volume type

DELETE
/v3/{project_id}/types/{volume_type_id}

Delete a volume type

GET
/v3/{project_id}/types

List all volume types

POST
/v3/{project_id}/types

Create a volume type

GET
/v3/{project_id}/types/{volume_type_id}/encryption

Show an encryption type

GET
/v3/{project_id}/types/{volume_type_id}/encryption/{key}

Show encryption specs item

DELETE
/v3/{project_id}/types/{volume_type_id}/encryption/{encryption_id}

Delete an encryption type

POST
/v3/{project_id}/types/{volume_type_id}/encryption

Create an encryption type

PUT
/v3/{project_id}/types/{volume_type_id}/encryption/{encryption_id}

Update an encryption type

Volume type access (types, action) (types, os-volume-type-access)

Private volume type access to project.

By default, volumes types are public. To create a private volume type, set the is_public boolean field to false at volume type creation time. To control access to a private volume type, user needs to add a project to or remove a project from the volume type. Private volume types without projects are only accessible by users with the administrative role and context.

POST
/v3/{project_id}/types/{volume_type}/action

Add private volume type access to project

POST
/v3/{project_id}/types/{volume_type}/action

Remove private volume type access from project

GET
/v3/{project_id}/types/{volume_type}/os-volume-type-access

List private volume type access detail

Default Volume Types (default-types)

Manage a default volume type for individual projects.

By default, a volume-create request that does not specify a volume-type will assign the configured system default volume type to the volume. You can override this behavior on a per-project basis by setting a different default volume type for any project.

Available in microversion 3.62 or higher.

NOTE: The default policy for list API is system admin so you would require a system scoped token to access it. To get a system scoped token, you need to run the following command:

openstack –os-system-scope all –os-project-name=’’ token issue

PUT
/v3/default-types/{project-id}

Create or update a default volume type

GET
/v3/default-types/{project-id}

Show a default volume type

GET
/v3/default-types/

List default volume types

DELETE
/v3/default-types/{project-id}

Delete a default volume type

Volumes (volumes)

A volume is a detachable block storage device similar to a USB hard drive. You can attach a volume to an instance, and if the volume is of an appropriate volume type, a volume can be attached to multiple instances.

The snapshot_id and source_volid parameters specify the ID of the snapshot or volume from which this volume originates. If the volume was not created from a snapshot or source volume, these values are null.

When you create, list, update, or delete volumes, the possible status values are:

Volume statuses

Status

Description

creating

The volume is being created.

available

The volume is ready to attach to an instance.

reserved

The volume is reserved for attaching or shelved.

attaching

The volume is attaching to an instance.

detaching

The volume is detaching from an instance.

in-use

The volume is attached to an instance.

maintenance

The volume is locked and being migrated.

deleting

The volume is being deleted.

awaiting-transfer

The volume is awaiting for transfer.

error

A volume creation error occurred.

error_deleting

A volume deletion error occurred.

backing-up

The volume is being backed up.

restoring-backup

A backup is being restored to the volume.

error_backing-up

A backup error occurred.

error_restoring

A backup restoration error occurred.

error_extending

An error occurred while attempting to extend a volume.

downloading

The volume is downloading an image.

uploading

The volume is being uploaded to an image.

retyping

The volume is changing type to another volume type.

extending

The volume is being extended.

GET
/v3/{project_id}/volumes/detail

List accessible volumes with details

POST
/v3/{project_id}/volumes

Create a volume

GET
/v3/{project_id}/volumes

List accessible volumes

GET
/v3/{project_id}/volumes/{volume_id}

Show a volume’s details

PUT
/v3/{project_id}/volumes/{volume_id}

Update a volume

DELETE
/v3/{project_id}/volumes/{volume_id}

Delete a volume

POST
/v3/{project_id}/volumes/{volume_id}/metadata

Create metadata for volume

GET
/v3/{project_id}/volumes/{volume_id}/metadata

Show a volume’s metadata

PUT
/v3/{project_id}/volumes/{volume_id}/metadata

Update a volume’s metadata

GET
/v3/{project_id}/volumes/{volume_id}/metadata/{key}

Show a volume’s metadata for a specific key

DELETE
/v3/{project_id}/volumes/{volume_id}/metadata/{key}

Delete a volume’s metadata

PUT
/v3/{project_id}/volumes/{volume_id}/metadata/{key}

Update a volume’s metadata for a specific key

GET
/v3/{project_id}/volumes/summary

Get volumes summary

Volume actions (volumes, action)

Extends the size of, resets statuses for, sets image metadata for, and removes image metadata from a volume. Attaches a volume to a server, detaches a volume from a server, and removes a volume from Block Storage management without actually removing the back-end storage object associated with it.

POST
/v3/{project_id}/volumes/{volume_id}/action

Extend a volume size

POST
/v3/{project_id}/volumes/{volume_id}/action

Reset a volume’s statuses

POST
/v3/{project_id}/volumes/{volume_id}/action

Revert volume to snapshot

POST
/v3/{project_id}/volumes/{volume_id}/action

Set image metadata for a volume

POST
/v3/{project_id}/volumes/{volume_id}/action

Remove image metadata from a volume

POST
/v3/{project_id}/volumes/{volume_id}/action

Show image metadata for a volume

POST
/v3/{project_id}/volumes/{volume_id}/action

Attach volume to a server

POST
/v3/{project_id}/volumes/{volume_id}/action

Detach volume from server

POST
/v3/{project_id}/volumes/{volume_id}/action

Unmanage a volume

POST
/v3/{project_id}/volumes/{volume_id}/action

Force detach a volume

POST
/v3/{project_id}/volumes/{volume_id}/action

Retype a volume

POST
/v3/{project_id}/volumes/{volume_id}/action

Migrate a volume

POST
/v3/{project_id}/volumes/{volume_id}/action

Complete migration of a volume

POST
/v3/{project_id}/volumes/{volume_id}/action

Force delete a volume

POST
/v3/{project_id}/volumes/{volume_id}/action

Update a volume’s bootable status

POST
/v3/{project_id}/volumes/{volume_id}/action

Upload volume to image

POST
/v3/{project_id}/volumes/{volume_id}/action

Reserve volume

POST
/v3/{project_id}/volumes/{volume_id}/action

Unmark volume as reserved.

POST
/v3/{project_id}/volumes/{volume_id}/action

Update volume status to detaching

POST
/v3/{project_id}/volumes/{volume_id}/action

Roll back volume status to in-use

POST
/v3/{project_id}/volumes/{volume_id}/action

Terminate volume attachment

POST
/v3/{project_id}/volumes/{volume_id}/action

Initialize volume attachment

POST
/v3/{project_id}/volumes/{volume_id}/action

Updates volume read-only access-mode flag

POST
/v3/{project_id}/volumes/{volume_id}/action

Reimage a volume

Volume manage extension (manageable_volumes)

Creates or lists volumes by using existing storage instead of allocating new storage.

POST
/v3/{project_id}/manageable_volumes

Manage an existing volume

GET
/v3/{project_id}/manageable_volumes

List summary of volumes available to manage

GET
/v3/{project_id}/manageable_volumes/detail

List detail of volumes available to manage

Volume snapshots (snapshots)

A snapshot is a point-in-time copy of the data that a volume contains.

When you create, list, or delete snapshots, these status values are possible:

Snapshot statuses

Status

Description

creating

The snapshot is being created.

available

The snapshot is ready to use.

backing-up

The snapshot is being backed up.

deleting

The snapshot is being deleted.

error

A snapshot creation error occurred.

deleted

The snapshot has been deleted.

unmanaging

The snapshot is being unmanaged.

restoring

The snapshot is being restored to a volume.

error_deleting

A snapshot deletion error occurred.

GET
/v3/{project_id}/snapshots/detail

List snapshots and details

POST
/v3/{project_id}/snapshots

Create a snapshot

GET
/v3/{project_id}/snapshots

List accessible snapshots

GET
/v3/{project_id}/snapshots/{snapshot_id}/metadata

Show a snapshot’s metadata

POST
/v3/{project_id}/snapshots/{snapshot_id}/metadata

Create a snapshot’s metadata

PUT
/v3/{project_id}/snapshots/{snapshot_id}/metadata

Update a snapshot’s metadata

GET
/v3/{project_id}/snapshots/{snapshot_id}

Show a snapshot’s details

PUT
/v3/{project_id}/snapshots/{snapshot_id}

Update a snapshot

DELETE
/v3/{project_id}/snapshots/{snapshot_id}

Delete a snapshot

GET
/v3/{project_id}/snapshot/{snapshot_id}/metadata/{key}

Show a snapshot’s metadata for a specific key

DELETE
/v3/{project_id}/snapshots/{snapshot_id}/metadata/{key}

Delete a snapshot’s metadata

PUT
/v3/{project_id}/snapshots/{snapshot_id}/metadata/{key}

Update a snapshot’s metadata for a specific key

Snapshot actions (snapshots, action)

Administrator only, depending on policy settings. Resets, updates status for a snapshot.

POST
/v3/{project_id}/snapshots/{snapshot_id}/action

Reset a snapshot’s status

POST
/v3/{project_id}/snapshots/{snapshot_id}/action

Update status of a snapshot

POST
/v3/{project_id}/snapshots/{snapshot_id}/action

Force delete a snapshot

Snapshot manage extension (manageable_snapshots)

Creates or lists snapshots by using existing storage instead of allocating new storage.

POST
/v3/{project_id}/manageable_snapshots

Manage an existing snapshot

GET
/v3/{project_id}/manageable_snapshots

List summary of snapshots available to manage

GET
/v3/{project_id}/manageable_snapshots/detail

List detail of snapshots available to manage

Volume transfer

Transfers a volume from one user to another user.

POST
/v3/{project_id}/os-volume-transfer/{transfer_id}/accept

Accept a volume transfer

POST
/v3/{project_id}/os-volume-transfer

Create a volume transfer

GET
/v3/{project_id}/os-volume-transfer

List volume transfers for a project

GET
/v3/{project_id}/os-volume-transfer/{transfer_id}

Show volume transfer detail

DELETE
/v3/{project_id}/os-volume-transfer/{transfer_id}

Delete a volume transfer

GET
/v3/{project_id}/os-volume-transfer/detail

List volume transfers and details

Volume transfers (volume-transfers) (3.55 or later)

Transfers a volume from one user to another user. This is the new transfer APIs with microversion 3.55.

POST
/v3/{project_id}/volume-transfers/{transfer_id}/accept

Accept a volume transfer

POST
/v3/{project_id}/volume-transfers

Create a volume transfer

GET
/v3/{project_id}/volume-transfers

List volume transfers for a project

GET
/v3/{project_id}/volume-transfers/{transfer_id}

Show volume transfer detail

DELETE
/v3/{project_id}/volume-transfers/{transfer_id}

Delete a volume transfer

GET
/v3/{project_id}/volume-transfers/detail

List volume transfers and details

Attachments (attachments)

Lists all, lists all with details, shows details for, creates, and deletes attachment.

 
Note

Everything except for Complete attachment is new as of the 3.27 microversion. Complete attachment is new as of the 3.44 microversion.

When you create, list, update, or delete attachment, the possible status values are:

VolumeAttachment statuses

Status

Description

attached

A volume is attached for the attachment.

attaching

A volume is attaching for the attachment.

detached

A volume is detached for the attachment.

reserved

A volume is reserved for the attachment.

error_attaching

A volume is error attaching for the attachment.

error_detaching

A volume is error detaching for the attachment.

deleted

The attachment is deleted.

DELETE
/v3/{project_id}/attachments/{attachment_id}

Delete attachment

GET
/v3/{project_id}/attachments/{attachment_id}

Show attachment details

GET
/v3/{project_id}/attachments/detail

List attachments with details

GET
/v3/{project_id}/attachments

List attachments

POST
/v3/{project_id}/attachments

Create attachment

PUT
/v3/{project_id}/attachments/{attachment_id}

Update an attachment

POST
/v3/{project_id}/attachments/{attachment_id}/action

Complete attachment

Back-end storage pools

Administrator only. Lists all back-end storage pools that are known to the scheduler service.

GET
/v3/{project_id}/scheduler-stats/get_pools

List all back-end storage pools

Backups (backups)

A backup is a full copy of a volume stored in an external service. The service can be configured. The only supported service is Object Storage. A backup can subsequently be restored from the external service to either the same volume that the backup was originally taken from or to a new volume.

When you create, list, or delete backups, these status values are possible:

Backup statuses

Status

Description

creating

The backup is being created.

available

The backup is ready to restore to a volume.

deleting

The backup is being deleted.

error

A backup error occurred.

restoring

The backup is being restored to a volume.

error_deleting

An error occurred while deleting the backup.

If an error occurs, you can find more information about the error in the fail_reason field for the backup.

GET
/v3/{project_id}/backups/detail

List backups with detail

GET
/v3/{project_id}/backups/{backup_id}

Show backup detail

DELETE
/v3/{project_id}/backups/{backup_id}

Delete a backup

POST
/v3/{project_id}/backups/{backup_id}/restore

Restore a backup

POST
/v3/{project_id}/backups

Create a backup

PUT
/v3/{project_id}/backups/{backup_id}

Update a backup

GET
/v3/{project_id}/backups

List backups for project

GET
/v3/{project_id}/backups/{backup_id}/export_record

Export a backup

POST
/v3/{project_id}/backups/import_record

Import a backup

Backup actions (backups, action)

Force-deletes a backup and reset status for a backup.

POST
/v3/{project_id}/backups/{backup_id}/action

Force-delete a backup

POST
/v3/{project_id}/backups/{backup_id}/action

Reset a backup’s status

Capabilities for storage back ends (capabilities)

Shows capabilities for a storage back end.

GET
/v3/{project_id}/capabilities/{hostname}

Show all back-end capabilities

Consistency groups (DEPRECATED)

Consistency groups enable you to create snapshots at the exact same point in time from multiple volumes. For example, a database might place its tables, logs, and configuration on separate volumes. To restore this database from a previous point in time, it makes sense to restore the logs, tables, and configuration together from the exact same point in time.

Use the policy configuration file to grant permissions for these actions to limit roles.

GET
/v3/{project_id}/consistencygroups

List project’s consistency groups

POST
/v3/{project_id}/consistencygroups

Create a consistency group

GET
/v3/{project_id}/consistencygroups/{consistencygroup_id}

Show a consistency group’s details

POST
/v3/{project_id}/consistencygroups/create_from_src

Create a consistency group from source

POST
/v3/{project_id}/consistencygroups/{consistencygroup_id}/delete

Delete a consistency group

GET
/v3/{project_id}/consistencygroups/detail

List consistency groups and details

PUT
/v3/{project_id}/consistencygroups/{consistencygroup_id}/update

Update a consistency group

Consistency group snapshots (DEPRECATED)

Lists all, lists all with details, shows details for, creates, and deletes consistency group snapshots.

DELETE
/v3/{project_id}/cgsnapshots/{cgsnapshot_id}

Delete a consistency group snapshot

GET
/v3/{project_id}/cgsnapshots/{cgsnapshot_id}

Show consistency group snapshot detail

GET
/v3/{project_id}/cgsnapshots/detail

List all consistency group snapshots with details

GET
/v3/{project_id}/cgsnapshots

List all consistency group snapshots

POST
/v3/{project_id}/cgsnapshots

Create a consistency group snapshot

Services (os-services)

Administrator only. Lists all Cinder services, enables or disables a Cinder service, freeze or thaw the specified cinder-volume host, failover a replicating cinder-volume host.

GET
/v3/{project_id}/os-services

List All Cinder Services

PUT
/v3/{project_id}/os-services/disable

Disable a Cinder Service

PUT
/v3/{project_id}/os-services/disable-log-reason

Log Disabled Cinder Service Information

PUT
/v3/{project_id}/os-services/enable

Enable a Cinder Service

PUT
/v3/{project_id}/os-services/get-log

Get Current Log Levels for Cinder Services

PUT
/v3/{project_id}/os-services/set-log

Set Log Levels of Cinder Services Dynamically

PUT
/v3/{project_id}/os-services/freeze

Freeze a Cinder Backend Host

PUT
/v3/{project_id}/os-services/thaw

Thaw a Cinder Backend Host

PUT
/v3/{project_id}/os-services/failover_host

Failover a Cinder Backend Host

Generic volume groups (groups)

Generic volume groups enable you to create a group of volumes and manage them together.

How is generic volume groups different from consistency groups? Currently consistency groups in cinder only support consistent group snapshot. It cannot be extended easily to serve other purposes. A project may want to put volumes used in the same application together in a group so that it is easier to manage them together, and this group of volumes may or may not support consistent group snapshot. Generic volume group is introduced to solve this problem. By decoupling the tight relationship between the group construct and the consistency concept, generic volume groups can be extended to support other features in the future.

GET
/v3/{project_id}/groups

List groups

POST
/v3/{project_id}/groups

Create group

GET
/v3/{project_id}/groups/{group_id}

Show group details

POST
/v3/{project_id}/groups/action

Create group from source

POST
/v3/{project_id}/groups/{group_id}/action

Delete group

GET
/v3/{project_id}/groups/detail

List groups with details

PUT
/v3/{project_id}/groups/{group_id}

Update group

POST
/v3/{project_id}/groups/{group_id}/action

Reset group status

Group replication (groups, action)

Lists targets, enables, disables, and fails over group replication.

Available since API microversion 3.38.

POST
/v3/{project_id}/groups/{group_id}/action

List replication targets

POST
/v3/{project_id}/groups/{group_id}/action

Enable group replication

POST
/v3/{project_id}/groups/{group_id}/action

Disable group replication

POST
/v3/{project_id}/groups/{group_id}/action

Failover replication

Group snapshots (group_snapshots)

Lists all, lists all with details, shows details for, creates, and deletes group snapshots.

DELETE
/v3/{project_id}/group_snapshots/{group_snapshot_id}

Delete group snapshot

GET
/v3/{project_id}/group_snapshots/{group_snapshot_id}

Show group snapshot details

GET
/v3/{project_id}/group_snapshots/detail

List group snapshots with details

GET
/v3/{project_id}/group_snapshots

List group snapshots

POST
/v3/{project_id}/group_snapshots

Create group snapshot

POST
/v3/{project_id}/group_snapshots/{group_snapshot_id}/action

Reset group snapshot status

Group types (group_types)

To create a generic volume group, you must specify a group type.

PUT
/v3/{project_id}/group_types/{group_type_id}

Update group type

GET
/v3/{project_id}/group_types/{group_type_id}

Show group type details

GET
/v3/{project_id}/group_types/default

Show default group type details

DELETE
/v3/{project_id}/group_types/{group_type_id}

Delete group type

GET
/v3/{project_id}/group_types

List group types

POST
/v3/{project_id}/group_types

Create group type

Group type specs (group_types, group_specs)

POST
/v3/{project_id}/group_types/{group_type_id}/group_specs

Create or update group specs for a group type

GET
/v3/{project_id}/group_types/{group_type_id}/group_specs

List group specs for a group type

GET
/v3/{project_id}/group_types/{group_type_id}/group_specs/{spec_id}

Show one specific group spec for a group type

PUT
/v3/{project_id}/group_types/{group_type_id}/group_specs/{spec_id}

Update one specific group spec for a group type

DELETE
/v3/{project_id}/group_types/{group_type_id}/group_specs/{spec_id}

Delete one specific group spec for a group type

Hosts extension (os-hosts)

Administrators only, depending on policy settings.

Lists, shows hosts.

GET
/v3/{admin_project_id}/os-hosts

List all hosts for a project

GET
/v3/{admin_project_id}/os-hosts/{host_name}

Show Host Details for a project

Limits (limits)

Shows absolute limits for a project.

An absolute limit value of -1 indicates that the absolute limit for the item is infinite.

GET
/v3/{project_id}/limits

Show absolute limits for project

Messages (messages)

Lists all, shows, and deletes messages. These are error messages generated by failed operations as a way to find out what happened when an asynchronous operation failed.

DELETE
/v3/{project_id}/messages/{message_id}

Delete message

GET
/v3/{project_id}/messages/{message_id}

Show message details

GET
/v3/{project_id}/messages

List messages

Resource Filters (resource_filters)

Lists all resource filters, available since microversion 3.33.

GET
/v3/{project_id}/resource_filters

List resource filters

Quality of service (QoS) specifications (qos-specs)

Administrators only, depending on policy settings.

Creates, lists, shows details for, associates, disassociates, sets keys, unsets keys, and deletes quality of service (QoS) specifications.

GET
/v3/{project_id}/qos-specs/{qos_id}/disassociate_all

Disassociate a QoS specification from all associations

PUT
/v3/{project_id}/qos-specs/{qos_id}/delete_keys

Unset keys in a QoS specification

GET
/v3/{project_id}/qos-specs/{qos_id}/associations

Get all associations for a QoS specification

GET
/v3/{project_id}/qos-specs/{qos_id}/associate

Associate QoS specification with a volume type

GET
/v3/{project_id}/qos-specs/{qos_id}/disassociate

Disassociate QoS specification from a volume type

GET
/v3/{project_id}/qos-specs/{qos_id}

Show a QoS specification details

PUT
/v3/{project_id}/qos-specs/{qos_id}

Set keys in a QoS specification

DELETE
/v3/{project_id}/qos-specs/{qos_id}

Delete a QoS specification

POST
/v3/{project_id}/qos-specs

Create a QoS specification

GET
/v3/{project_id}/qos-specs

List QoS Specifications

Quota class set extension (os-quota-class-sets)

Administrators only, depending on policy settings.

Shows and updates quota classes for a project.

GET
/v3/{admin_project_id}/os-quota-class-sets/{quota_class_name}

Show quota classes for a project

PUT
/v3/{admin_project_id}/os-quota-class-sets/{quota_class_name}

Update quota classes for a project

Quota sets extension (os-quota-sets)

Administrators only, depending on policy settings.

Shows, updates, and deletes quotas for a project.

GET
/v3/{admin_project_id}/os-quota-sets/{project_id}

Show quotas for a project

GET
/v3/{admin_project_id}/os-quota-sets/{project_id}?{usage}=True

Show quota usage for a project

PUT
/v3/{admin_project_id}/os-quota-sets/{project_id}

Update quotas for a project

DELETE
/v3/{admin_project_id}/os-quota-sets/{project_id}

Delete quotas for a project

GET
/v3/{admin_project_id}/os-quota-sets/{project_id}/defaults

Get default quotas for a project

Workers (workers)

POST
v3/{project_id}/workers/cleanup

Cleanup services

Valid boolean values

Following is the list of valid values for boolean parameters.

[True, ‘True’, ‘TRUE’, ‘true’, ‘1’, ‘ON’, ‘On’, ‘on’, ‘YES’, ‘Yes’, ‘yes’, ‘y’, ‘t’, False, ‘False’, ‘FALSE’, ‘false’, ‘0’, ‘OFF’, ‘Off’, ‘off’, ‘NO’, ‘No’, ‘no’, ‘n’, ‘f’]