diff options
| author | Justin Santa Barbara <justin@fathomdb.com> | 2011-02-23 18:11:35 +0000 |
|---|---|---|
| committer | Tarmac <> | 2011-02-23 18:11:35 +0000 |
| commit | 70bc1d4280065f6eba368187af126cebcb6b69bb (patch) | |
| tree | 3d73657fc3fa7b80bb82c51e21ff80818ceb2c77 /nova/api | |
| parent | 35991d1e5b1902d5a09776302d8c25761ae248d7 (diff) | |
| parent | ef0dfb6809f31cfe8ca8056892fc9dcc2f00a0d7 (diff) | |
| download | nova-70bc1d4280065f6eba368187af126cebcb6b69bb.tar.gz nova-70bc1d4280065f6eba368187af126cebcb6b69bb.tar.xz nova-70bc1d4280065f6eba368187af126cebcb6b69bb.zip | |
Initial support for per-instance metadata, though the OpenStack API. Key/value pairs can be specified at instance creation time and are returned in the details view. Support limits based on quota system.
Diffstat (limited to 'nova/api')
| -rw-r--r-- | nova/api/openstack/servers.py | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 0bac4c64d..a8e597d73 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -77,9 +77,14 @@ def _translate_detail_keys(inst): except KeyError: LOG.debug(_("Failed to read public ip(s)")) - inst_dict['metadata'] = {} inst_dict['hostId'] = '' + # Return the metadata as a dictionary + metadata = {} + for item in inst['metadata']: + metadata[item['key']] = item['value'] + inst_dict['metadata'] = metadata + return dict(server=inst_dict) @@ -161,18 +166,29 @@ class Controller(wsgi.Controller): if not env: return faults.Fault(exc.HTTPUnprocessableEntity()) - key_pairs = auth_manager.AuthManager.get_key_pairs( - req.environ['nova.context']) + context = req.environ['nova.context'] + key_pairs = auth_manager.AuthManager.get_key_pairs(context) if not key_pairs: raise exception.NotFound(_("No keypairs defined")) key_pair = key_pairs[0] image_id = common.get_image_id_from_image_hash(self._image_service, - req.environ['nova.context'], env['server']['imageId']) + context, env['server']['imageId']) kernel_id, ramdisk_id = self._get_kernel_ramdisk_from_image( req, image_id) + + # Metadata is a list, not a Dictionary, because we allow duplicate keys + # (even though JSON can't encode this) + # In future, we may not allow duplicate keys. + # However, the CloudServers API is not definitive on this front, + # and we want to be compatible. + metadata = [] + if env['server']['metadata']: + for k, v in env['server']['metadata'].items(): + metadata.append({'key': k, 'value': v}) + instances = self.compute_api.create( - req.environ['nova.context'], + context, instance_types.get_by_flavor_id(env['server']['flavorId']), image_id, kernel_id=kernel_id, @@ -181,6 +197,7 @@ class Controller(wsgi.Controller): display_description=env['server']['name'], key_name=key_pair['name'], key_data=key_pair['public_key'], + metadata=metadata, onset_files=env.get('onset_files', [])) return _translate_keys(instances[0]) |
