diff options
| author | SandyWalsh <sandy.walsh@rackspace.com> | 2012-07-04 22:47:06 -0300 |
|---|---|---|
| committer | SandyWalsh <sandy.walsh@rackspace.com> | 2012-07-04 23:35:03 -0300 |
| commit | 5bce6f5fbe804cd24d8bf1c2e36680876bc044cd (patch) | |
| tree | 159109d129f0d3aedee89f559acca8b359e49e80 /nova | |
| parent | 980c76266629ea66bc23fddb02f5be61c51d873c (diff) | |
| download | nova-5bce6f5fbe804cd24d8bf1c2e36680876bc044cd.tar.gz nova-5bce6f5fbe804cd24d8bf1c2e36680876bc044cd.tar.xz nova-5bce6f5fbe804cd24d8bf1c2e36680876bc044cd.zip | |
Ensure system metadata is sent on new image creation.
System metadata is useful for billing and notification purposes.
Sadly, this data was getting lost on new instances created from
snapshots of old instances.
This patch ensures the system metadata of the old instance is
stored in the snapshot for use with creating new instances.
Additionally, it strips the "image_" prefix from any system
metadata keys (as required).
Change-Id: I9fff55c0e9f106afcded1865c7a47bc96ba507a7
Diffstat (limited to 'nova')
| -rw-r--r-- | nova/tests/test_xenapi.py | 51 | ||||
| -rw-r--r-- | nova/virt/xenapi/vm_utils.py | 6 |
2 files changed, 57 insertions, 0 deletions
diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py index 5181e6385..76cb9b399 100644 --- a/nova/tests/test_xenapi.py +++ b/nova/tests/test_xenapi.py @@ -18,6 +18,7 @@ import ast import contextlib +import cPickle as pickle import functools import os import re @@ -29,6 +30,7 @@ from nova import context from nova import db from nova import exception from nova import flags +from nova.image import glance from nova.openstack.common import importutils from nova.openstack.common import log as logging from nova.openstack.common import timeutils @@ -1875,3 +1877,52 @@ class XenAPIAggregateTestCase(test.TestCase): if metadata: db.aggregate_metadata_add(self.context, result.id, metadata) return db.aggregate_get(self.context, result.id) + + +class VmUtilsTestCase(test.TestCase): + """Unit tests for xenapi utils.""" + + def test_upload_image(self): + """Ensure image properties include instance system metadata + as well as few local settings.""" + def fake_pick_glance_api_server(): + return ("host", 80) + + def fake_instance_system_metadata_get(context, uuid): + return dict(image_a=1, image_b=2, image_c='c', d='d') + + def fake_get_sr_path(session): + return "foo" + + class FakeInstance(object): + auto_disk_config = "auto disk config" + os_type = "os type" + + def __getitem__(instance_self, item): + return "whatever" + + class FakeSession(object): + def call_plugin(session_self, service, command, kwargs): + self.kwargs = kwargs + + def fake_dumps(thing): + return thing + + self.stubs.Set(glance, "pick_glance_api_server", + fake_pick_glance_api_server) + self.stubs.Set(db, "instance_system_metadata_get", + fake_instance_system_metadata_get) + self.stubs.Set(vm_utils, "get_sr_path", fake_get_sr_path) + self.stubs.Set(pickle, "dumps", fake_dumps) + + ctx = context.get_admin_context() + + instance = FakeInstance() + session = FakeSession() + vm_utils.upload_image(ctx, session, instance, "vmi uuids", "image id") + + actual = self.kwargs['params']['properties'] + expected = dict(a=1, b=2, c='c', d='d', + auto_disk_config='auto disk config', + os_type='os type') + self.assertEquals(expected, actual) diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index 61cf74f91..241b0da68 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -454,7 +454,13 @@ def upload_image(context, session, instance, vdi_uuids, image_id): glance_host, glance_port = glance.pick_glance_api_server() + sys_meta = db.instance_system_metadata_get(context, instance['uuid']) properties = {} + prefix = 'image_' + for key, value in sys_meta.iteritems(): + if key.startswith(prefix): + key = key[len(prefix):] + properties[key] = value properties['auto_disk_config'] = instance.auto_disk_config properties['os_type'] = instance.os_type or FLAGS.default_os_type |
