Tags support in EC2 API for volumes and volume snapshots

https://blueprints.launchpad.net/nova/+spec/ec2-volume-and-snapshot-tags

Expose volume and volume snapshot metadata as EC2 tags in the EC2 API.

Problem description

OpenStack’s EC2 API has little support for ‘tags’ (resource metadata). Only instance metadata are exposed in the EC2 API, so a user can create, delete and list only instance metadata. OpenStack Cinder API has support for metadata as well, for both volumes and volume snapshots, and we just need to expose it into the EC2 API. This blueprint aims to do just that.

Use Cases

As metadata feature is already provided in OpenStack APIs, the end users will now be able to use tags for volumes and volume snapshots. This will increase the parity between OpenStack and EC2 APIs.

Project Priority

None

Proposed change

  • EC2 API’s ‘CreateTags’ method only used to work when one is creating tags for an instance resource. After this patch, one will be also able to create tags for volume and volume snapshot resources.

  • A user will be able to call the ‘DeleteTags’ API to delete any tag associated with a volume or a volume snapshot.

  • While calling the ‘DescribeTags’ API, tags of volumes and volume snapshots will be listed along with instance tags (provided tags for these resources are present, obviously).

  • Support for specifying volume and volume snapshot IDs, and ‘volume’ and ‘snapshot’ as resources as parameters while calling ‘DescribeTags’ is added.

  • As this is the first time the supported resources for tags are becoming plural in number, the code is made more generic so as to allow addition of further resources easier.

  • Implementation detail: In the DescribeInstances API, user can specify both resource ID and resource type as filters. If the query says filter by resource IDs (vol-00000001 and ami-00000001) and also filter by resource type (instances and volumes), the current implementation takes the intersection of the resources (volumes in this case) and then checks if those resources are implemented.

Alternatives

Alternative is: EC2 tags be different from volume tags by using scoped keys. So a user creating a tag stack=beta in EC2 API will, in the Cinder API, see it as EC2:stack=beta. This way, a user using the Cinder APIs will be able to clearly see which metadata entries are created using EC2 API and which are created by the OpenStack API.

I think it makes sense to keep the EC2 API layer as transparent as possible. This means not going with the alternative proposed above. This also falls in line with what we have presently for instance metadata.

Regarding the implementation detail specified above, an alternative is: Do not allow resource IDs and resource type to be specified in the same query.

There is no doc of AWS which says such an API call is not allowed (atleast I can’t find it). This implementation is easier, but IMO the way in which it is implemented right now gives a better user experience. Probably logging would help if we are dropping out a resource ID or resource type from the query.

Data model impact

None

REST API impact

Only EC2 API will be affected. Affected API calls are: CreateTags, DeleteTags DescribeTags.

Security impact

None

Notifications impact

None

Other end user impact

None

Performance Impact

Insignificant. Note that in the case of DescribeTags, as we keep on adding resources, an API call will be made to all of them (e.g. Glance, Cinder, etc) when a DescribeTags call is made without specifying a resource type.

Other deployer impact

None

Developer impact

None

Implementation

Assignee(s)

Primary assignee:

rushiagr (Rushi Agrawal)

Work Items

  • Reorganize EC2 ‘tags’ code to allow addition of new resources

  • Add support for EC2 tags for volumes

  • Add support for EC2 tags for volume snapshots

Dependencies

None

Testing

Comprehensive unit tests to test the functionality will be written.

Documentation Impact

EC2 API document should be updated to reflect the changes done to the EC2 API under this blueprint.

References

EC2 API reference: * CreateTags http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-CreateTags.html * DeleteTags http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteTags.html * DescribeTags http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeTags.html