Tag Catalog Support For Metadata Definitions

This blueprint adds the basic tag catalog back after it was deferred from Juno
due to time constraints. The original, approved spec included supporting tag
libraries in the metadata definitions catalog. However, at the end of
Juno, the original spec was updated to remove tags since they weren't
implemented.

This spec is actually a reduction of the tag concepts in the original
approved Juno spec. In the original Juno spec, tags had a dynamic hierarchy
capability.  This spec does not include the tag hierarchy in order to
simplify this spec. That aspect of tags will be deferred to a later spec.

The implemented juno spec is here for reference:

https://github.com/openstack/glance-specs/blob/master/specs/juno/metadata-schema-catalog.rst

Change-Id: I2eab7dc2c23894897bb053926baeac917dbd2bfe
Co-Authored-By: Travis Tripp <travis.tripp@hp.com>
Co-Authored-By: Wayne Okuma <wayne.okuma@hp.com>
Co-Authored-By: Lakshmi N Sampath <lakshmi.sampath@hp.com>
Co-Authored-By: murali sundar <murali.sundar@intel.com>
This commit is contained in:
Travis Tripp 2014-10-13 18:13:33 -06:00
parent 35dc41cf23
commit 6354130bf5

View File

@ -0,0 +1,326 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
============================================
Tag Catalog Support For Metadata Definitions
============================================
https://blueprints.launchpad.net/glance/+spec/metadefs-tags
This blueprint adds the basic tag catalog back after it was deferred from Juno
due to time constraints. The original, approved spec included supporting tag
libraries in the metadata definitions catalog. However, at the end of
Juno, the original spec was updated to remove tags since they weren't
implemented.
This spec is actually a reduction of the tag concepts in the original
approved Juno spec. In the original Juno spec, tags had a dynamic hierarchy
capability. This spec does not include the tag hierarchy in order to
simplify this spec. That aspect of tags will be deferred to a later spec.
The implemented juno spec is here for reference:
https://github.com/openstack/glance-specs/blob/master/specs/juno/metadata-schema-catalog.rst
Problem description
===================
A challenge with using OpenStack is discovering, sharing, and correlating
tags across services and different types of resources. We believe this
affects both end users and administrators.
For example, a cloud operator or vendor may have a predefined set of "tags"
they want to be used as a starting point for images and instances. Currently,
OpenStack does not have a facility for the cloud operator to include that base
set of tags. This means that every deployment and every project may end up
with its own disparate set of tags. This leads to inconsistencies, but also is
extra hassle for end users who end up reinventing all the "tags" in every
project.
For example, is the tag "postgres" the same as "PostgreSQL"? If a
base library of tags is used, any user typing "pos" would be prompted with
the one that already exists in the tag library and would choose it.
Future searches based on tags would ensure consistent results.
**Terminology**
The term metadata can become very overloaded and confusing. This proposed
enhancement is about the additional metadata that is set as "tags" (name only)
across various artifacts and OpenStack services.
Different APIs may use tags and key / value pairs differently. Tags typically
are not used to drive runtime behavior. However, key / value pairs are
often used by the system to potentially drive runtime, such as scheduling,
quality of service, or driver behavior.
A few examples of metadata today:
+-------------------------+---------------------------+----------------------+
| Nova | Cinder | Glance |
+-------------------------+---------------------------+----------------------+
| Flavor | Volume & Snapshot | Image & Snapshot |
| + extra specs | + image metadata | + properties |
| Host Aggregate | + metadata | + tags |
| + metadata | VolumeType | |
| Instances | + extra specs | |
| + metadata | + qos specs | |
| + tags | | |
+-------------------------+---------------------------+----------------------+
Proposed change
===============
We are proposing enhancements to the Metadata Definitions Catalog. The
following subsections detail the enhancements to the catalog.
**Tags**
A catalog of possible tags that can be used to help ensure tag name consistency
across users, resource types, and services. So, when a user goes to apply a tag
on a resource, they will be able to either create new tags or choose from tags
that have been used elsewhere in the system on different types of resources.
For example, the same tag could be used for Images, Volumes, and Instances.
Tags are not case sensitive (BigData is equivalent to bigdata but is different
from Big-Data).
Alternatives
------------
A key use case is the collaboration on tags using a common catalog. This
is complementary to tags being added ad-hoc across all services. We think the
metadata API could also be backed by a search indexer across services to
include ad-hoc metadata as well as defined metadata. However, that is not the
focus of this blueprint.
Data model impact
-----------------
This will use a relational database and exist in the same database as the
existing Glance Metadata Definitions Catalog. It will be additive to the
existing schema.
The following DB schema is the initial suggested schema. We will improve and
take comments during code review. Constraints not shown for readability.
Suggested Basic Schema::
CREATE TABLE `metadef_tags` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`namespace_id` int(11) NOT NULL,
`name` varchar(80) NOT NULL,
`created_at` timestamp NOT NULL,
`updated_at` timestamp
)
This will not include Tag descriptions in this revision.
REST API impact
---------------
In the REST API everything is referred by namespace and name rather than
synthetic IDs. This helps to achieve portability (import / export using JSON).
APIs should allow coarse grain and fine grain access to information in order
to control data transfer bandwidth requirements.
Working with Namespaces
Basic interaction is:
#. Get list of namespaces with overview info based on the desired filters.
#. Get tags
**Common Response Codes**
* Create Success: `201 Created`
* Modify Success: `200 OK`
* Delete Success: `204 No Content`
* Failure: `400 Bad Request` with details.
* Forbidden: `403 Forbidden`
* Not found: `404 Not found` if specific entity not found
**API Version**
All URLS will be under the v2 Glance API. If it is not explicitly specified
assume /v2/<url>
Namespace may optionally contain the following in addition to basic fields.
* resource_types
* properties
* objects
* tags
This spec adds Tags.
**Tags**
List All Tags in a namespace:
GET /metadefs/namespace/{namespace}/tags
Filters by adding query parameters::
limit = Use to request a specific page size. Expect a response
to a limited request to return between zero and limit items.
marker = Specifies the name of the last-seen tag.
The typical pattern of limit and marker is to make an initial
limited request and then to use the last tag from the
response as the marker parameter in a subsequent limited
request.
Design note: We want a format that allows for additional information
such as description to be added without changing the base response. For this
reason, we used a dictionary for each tag rather than just a flat list of
tags.
Example Body::
{
"tags": [
{
"name": "Databases"
},
{
"name": "BigData"
},
{
"name": "MySQL",
},
{
"name": "PostgreSQL",
},
{
"name": "MongoDB",
}
]
}
Create / Replace all tags in a specific namespace:
POST /metadefs/namespaces/{namespace}/tags/
Add tag in a specific namespace:
POST /metadefs/namespaces/{namespace}/tags/{tag}
Delete tag in specific namespace:
DELETE /metadefs/namespaces/{namespace}/tags/{tag}
Delete all tags in specific namespace:
DELETE /metadefs/namespaces/{namespace}/tags
Security impact
---------------
None
Notifications impact
--------------------
None
Other end user impact
---------------------
We intend to expose this via Horizon and are working on related blueprints.
Update python-glanceclient as needed.
Performance Impact
------------------
None anticipated.
This is expected to be called from Horizon when an admin wants to annotate
tags onto things likes images and instances. This API would be hit for them to
get available tags or create new ones.
Other deployer impact
---------------------
DB Schema Creation for new API
Default / Sample tag libraries will be checked into Glance.
Deployers can customize these and provide additional definition files suitable
to their cloud deployment.
glance-manage will include loading tags.
Developer impact
----------------
None (New API)
Implementation
==============
Assignee(s)
-----------
Primary assignee:
wayne-okuma
Other contributors:
None
Reviewers
---------
Core reviewer(s):
zhiyan
Other reviewer(s):
lakshmi-sampath
travis-tripp
Work Items
----------
Changes would be made to:
#. The database API layer to add support for CRUD operations on tags
#. The REST API for CRUD operations on the namespaces (add tags)
#. The REST API for CRUD operations on the tags
#. The python-glanceClient to support operations
#. glance-manage to handle tags
Dependencies
============
Same dependencies as Glance.
Testing
=======
Unit tests will be added for all possible code with a goal of being able to
isolate functionality as much as possible.
Tempest tests will be added wherever possible.
Documentation Impact
====================
Docs needed for new API extension and usage
References
==========
.. Had to format links strangely in order to meet 80 character limit
`Youtube summit recap of Graffiti Juno POC demo that included tags.
<https://www.youtube.com/watch?v=Dhrthnq1bnw>`_
`Current glance metadata definition catalog documentation.
<http://docs.openstack.org/developer/glance/metadefs-concepts.html>`_
*Simple application category tags (no hierarchy)*
Images, volumes, software applications can be assigned to a category.
Similarly, a flavor or host aggregate could be "tagged" with supporting a
category of application, such as "BigData" or "Encryption". Using the
matching of categories, flavors or host aggregates that support that category
of application can be easily paired up.
Note: If a resource type doesnt provide a "Tag" mechanism (only key value
pairs), a blueprint should be added to support tags on that type of resource.
In lieu of that, a key of "tags" with a comma separated list of tags as the
value be set on the resource