Container Operations
A container is a mechanism for storing data objects. An account may have many containers, but container names must be unique. This API enables a client to create a container, set access controls and metadata, retrieve a container’s contents, and delete a container. Since this API makes requests related to information in a particular user’s account, all requests in this API must be authenticated unless a container’s access control is deliberately made publicly accessible (i.e., allows anonymous requests).
Note
The Amazon S3 API uses the term ‘bucket’ to describe a data container. When you hear someone refer to a ‘bucket’ within the Swift API, the term ‘bucket’ may be construed as the equivalent of the term ‘container.’
One facet of object storage is that it does not support hierarchical paths
or directories. Instead, it supports one level consisting of one or more
containers, where each container may have objects. The RADOS Gateway’s
Swift-compatible API supports the notion of ‘pseudo-hierarchical containers,’
which is a means of using object naming to emulate a container (or directory)
hierarchy without actually implementing one in the storage system. You may
name objects with pseudo-hierarchical names
(e.g., photos/buildings/empire-state.jpg), but container names cannot
contain a forward slash (/) character.
Create a Container
To create a new container, make a PUT request with the API version, account,
and the name of the new container. The container name must be unique, must not
contain a forward-slash (/) character, and should be less than 256 bytes. You
may include access control headers and metadata headers in the request. The
operation is idempotent; that is, if you make a request to create a container
that already exists, it will return with a HTTP 202 return code, but will not
create another container.
Syntax
PUT /{api version}/{account}/{container} HTTP/1.1
Host: {fqdn}
X-Auth-Token: {auth-token}
X-Container-Read: {comma-separated-uids}
X-Container-Write: {comma-separated-uids}
X-Container-Meta-{key}: {value}
Headers
X-Container-Read
- Description
 The user IDs with read permissions for the container.
- Type
 Comma-separated string values of user IDs.
- Required
 No
X-Container-Write
- Description
 The user IDs with write permissions for the container.
- Type
 Comma-separated string values of user IDs.
- Required
 No
X-Container-Meta-{key}
- Description
 A user-defined meta data key that takes an arbitrary string value.
- Type
 String
- Required
 No
HTTP Response
If a container with the same name already exists, and the user is the container owner then the operation will succeed. Otherwise the operation will fail.
409
- Description
 The container already exists under a different user’s ownership.
- Status Code
 BucketAlreadyExists
List a Container’s Objects
To list the objects within a container, make a GET request with the with the
API version, account, and the name of the container.  You can specify query
parameters to filter the full list, or leave out the parameters to return a list
of the first 10,000 object names stored in the container.
Syntax
GET /{api version}/{container} HTTP/1.1
     Host: {fqdn}
     X-Auth-Token: {auth-token}
Parameters
format
- Description
 Defines the format of the result.
- Type
 String
- Valid Values
 json|xml- Required
 No
prefix
- Description
 Limits the result set to objects beginning with the specified prefix.
- Type
 String
- Required
 No
marker
- Description
 Returns a list of results greater than the marker value.
- Type
 String
- Required
 No
limit
- Description
 Limits the number of results to the specified value.
- Type
 Integer
- Valid Range
 0 - 10,000
- Required
 No
delimiter
- Description
 The delimiter between the prefix and the rest of the object name.
- Type
 String
- Required
 No
path
- Description
 The pseudo-hierarchical path of the objects.
- Type
 String
- Required
 No
allow_unordered
- Description
 Allows the results to be returned unordered to reduce computation overhead. Cannot be used with
delimiter.- Type
 Boolean
- Required
 No
- Non-Standard Extension
 Yes
Response Entities
container
- Description
 The container.
- Type
 Container
object
- Description
 An object within the container.
- Type
 Container
name
- Description
 The name of an object within the container.
- Type
 String
hash
- Description
 A hash code of the object’s contents.
- Type
 String
last_modified
- Description
 The last time the object’s contents were modified.
- Type
 Date
content_type
- Description
 The type of content within the object.
- Type
 String
Update a Container’s ACLs
When a user creates a container, the user has read and write access to the
container by default. To allow other users to read a container’s contents or
write to a container, you must specifically enable the user.
You may also specify * in the X-Container-Read or X-Container-Write
settings, which effectively enables all users to either read from or write
to the container. Setting * makes the container public. That is it
enables anonymous users to either read from or write to the container.
Note
If you are planning to expose public read ACL functionality
for the Swift API, it is strongly recommended to include the
Swift account name in the endpoint definition, so as to most
closely emulate the behavior of native OpenStack Swift. To
do so, set the ceph.conf configuration option rgw
swift account in url = true, and update your Keystone
endpoint to the URL suffix /v1/AUTH_%(tenant_id)s
(instead of just /v1).
Syntax
POST /{api version}/{account}/{container} HTTP/1.1
Host: {fqdn}
     X-Auth-Token: {auth-token}
     X-Container-Read: *
     X-Container-Write: {uid1}, {uid2}, {uid3}
Request Headers
X-Container-Read
- Description
 The user IDs with read permissions for the container.
- Type
 Comma-separated string values of user IDs.
- Required
 No
X-Container-Write
- Description
 The user IDs with write permissions for the container.
- Type
 Comma-separated string values of user IDs.
- Required
 No
Add/Update Container Metadata
To add metadata to a container, make a POST request with the API version,
account, and container name. You must have write permissions on the
container to add or update metadata.
Syntax
POST /{api version}/{account}/{container} HTTP/1.1
Host: {fqdn}
     X-Auth-Token: {auth-token}
     X-Container-Meta-Color: red
     X-Container-Meta-Taste: salty
Request Headers
X-Container-Meta-{key}
- Description
 A user-defined meta data key that takes an arbitrary string value.
- Type
 String
- Required
 No
Enable Object Versioning for a Container
To enable object versioning a container, make a POST request with
the API version, account, and container name. You must have write
permissions on the container to add or update metadata.
Note
Object versioning support is not enabled in radosgw by
default; you must set rgw swift versioning enabled =
true in ceph.conf to enable this feature.
Syntax
POST /{api version}/{account}/{container} HTTP/1.1
Host: {fqdn}
     X-Auth-Token: {auth-token}
     X-Versions-Location: {archive-container}
Request Headers
X-Versions-Location
- Description
 The name of a container (the “archive container”) that will be used to store versions of the objects in the container that the
POSTrequest is made on (the “current container”). The archive container need not exist at the time it is being referenced, but onceX-Versions-Locationis set on the current container, and object versioning is thus enabled, the archive container must exist before any further objects are updated or deleted in the current container.Note
X-Versions-Locationis the only versioning-related header that radosgw interprets.X-History-Location, supported by native OpenStack Swift, is currently not supported by radosgw.- Type
 String
- Required
 No (if this header is passed with an empty value, object versioning on the current container is disabled, but the archive container continues to exist.)
Delete a Container
To delete a container, make a DELETE request with the API version, account,
and the name of the container. The container must be empty. If you’d like to check
if the container is empty, execute a HEAD request against the container. Once
you have successfully removed the container, you will be able to reuse the container name.
Syntax
DELETE /{api version}/{account}/{container} HTTP/1.1
Host: {fqdn}
X-Auth-Token: {auth-token}
HTTP Response
204
- Description
 The container was removed.
- Status Code
 NoContent