diff options
| author | Dan Prince <dan.prince@rackspace.com> | 2011-03-18 02:14:36 -0400 |
|---|---|---|
| committer | Dan Prince <dan.prince@rackspace.com> | 2011-03-18 02:14:36 -0400 |
| commit | 1abcdbea89e69013c193d2eb0b4b7a0bc2e2fa58 (patch) | |
| tree | 6656e0ba194ab5de87d1dfdc9435e46af883c23c /nova/db | |
| parent | 79f2f90feec74b97d55af058c9bec4177bc47a54 (diff) | |
| download | nova-1abcdbea89e69013c193d2eb0b4b7a0bc2e2fa58.tar.gz nova-1abcdbea89e69013c193d2eb0b4b7a0bc2e2fa58.tar.xz nova-1abcdbea89e69013c193d2eb0b4b7a0bc2e2fa58.zip | |
Implement metadata resource for Openstack API v1.1. Includes:
-GET /servers/id/meta
-POST /servers/id/meta
-GET /servers/id/meta/key
-PUT /servers/id/meta/key
-DELETE /servers/id/meta/key
Diffstat (limited to 'nova/db')
| -rw-r--r-- | nova/db/api.py | 18 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 60 |
2 files changed, 78 insertions, 0 deletions
diff --git a/nova/db/api.py b/nova/db/api.py index 3cb0e5811..5721fe8d6 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -1171,3 +1171,21 @@ def zone_get(context, zone_id): def zone_get_all(context): """Get all child Zones.""" return IMPL.zone_get_all(context) + + +#################### + + +def get_instance_metadata(context, instance_id): + """Get all metadata for an instance""" + return IMPL.get_instance_metadata(context, instance_id) + + +def delete_instance_metadata(context, instance_id, key): + """Delete the given metadata item""" + IMPL.delete_instance_metadata(context, instance_id, key) + + +def update_or_create_instance_metadata(context, instance_id, metadata): + """Creates or updates instance metadata""" + IMPL.update_or_create_instance_metadata(context, instance_id, metadata) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 9d9b86c1d..8f656de0e 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2457,3 +2457,63 @@ def zone_get(context, zone_id): def zone_get_all(context): session = get_session() return session.query(models.Zone).all() + + +#################### + +@require_context +def get_instance_metadata(context, instance_id): + session = get_session() + + meta_results = session.query(models.InstanceMetadata).\ + filter_by(instance_id=instance_id).\ + filter_by(deleted=False).\ + all() + + meta_dict = {} + for i in meta_results: + meta_dict[i['key']] = i['value'] + return meta_dict + + +@require_context +def delete_instance_metadata(context, instance_id, key): + session = get_session() + session.query(models.InstanceMetadata).\ + filter_by(instance_id=instance_id).\ + filter_by(key=key).\ + update({'deleted': 1, + 'deleted_at': datetime.datetime.utcnow(), + 'updated_at': literal_column('updated_at')}) + + +@require_context +def get_instance_metadata_item(context, instance_id, key): + session = get_session() + + meta_result = session.query(models.InstanceMetadata).\ + filter_by(instance_id=instance_id).\ + filter_by(key=key).\ + filter_by(deleted=False).\ + first() + + if not meta_result: + raise exception.NotFound(_('Invalid metadata key for instance %s') % + instance_id) + return meta_result + + +@require_context +def update_or_create_instance_metadata(context, instance_id, metadata): + session = get_session() + meta_ref = None + for key, value in metadata.iteritems(): + try: + meta_ref = get_instance_metadata_item(context, instance_id, key, + session) + except: + meta_ref = models.InstanceMetadata() + meta_ref.update({"key": key, "value": value, + "instance_id": instance_id}) + meta_ref.save(session=session) + return metadata |
