summaryrefslogtreecommitdiffstats
path: root/nova/db
diff options
context:
space:
mode:
authorDan Prince <dan.prince@rackspace.com>2011-03-18 02:14:36 -0400
committerDan Prince <dan.prince@rackspace.com>2011-03-18 02:14:36 -0400
commit1abcdbea89e69013c193d2eb0b4b7a0bc2e2fa58 (patch)
tree6656e0ba194ab5de87d1dfdc9435e46af883c23c /nova/db
parent79f2f90feec74b97d55af058c9bec4177bc47a54 (diff)
downloadnova-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.py18
-rw-r--r--nova/db/sqlalchemy/api.py60
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