From 722e789309cfe3ef743c486f3f99c235f664153d Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 12 Dec 2014 10:42:05 +0000 Subject: [PATCH] objects: allow creation of objects without dict item compat The dict compat support in NovaObject is useful for incrementally converting existing code over to use objects. Any brand new objects though have no reason to support dictionary access, so there should be a way to disable this compat mode. This moves all the dict compat support methods out of NovaObject, to a new class NovaObjectDictCompat. All existing objects are updated to add this new class as a mix-in parent. In future any completely new objects (ie ones which aren't being used to converted existing code from dict instances) should avoid inheriting from NovaObjectDictCompat. Existing objects should also have this parent class removed once all callers are audited and/or updated to ensure they do not require dict compat. Change-Id: I03f93f0c40df6f5f7df9cefe28dff900c22294c9 --- nova/objects/agent.py | 8 +++++-- nova/objects/aggregate.py | 8 +++++-- nova/objects/bandwidth_usage.py | 8 +++++-- nova/objects/base.py | 25 ++++++++++++++++----- nova/objects/block_device.py | 8 +++++-- nova/objects/compute_node.py | 8 +++++-- nova/objects/dns_domain.py | 8 +++++-- nova/objects/ec2.py | 16 +++++++++---- nova/objects/external_event.py | 4 +++- nova/objects/fixed_ip.py | 8 +++++-- nova/objects/flavor.py | 8 +++++-- nova/objects/floating_ip.py | 8 +++++-- nova/objects/hv_spec.py | 4 +++- nova/objects/instance.py | 8 +++++-- nova/objects/instance_action.py | 16 +++++++++---- nova/objects/instance_fault.py | 8 +++++-- nova/objects/instance_group.py | 8 +++++-- nova/objects/instance_info_cache.py | 4 +++- nova/objects/instance_numa_topology.py | 8 +++++-- nova/objects/instance_pci_requests.py | 8 +++++-- nova/objects/keypair.py | 8 +++++-- nova/objects/migration.py | 8 +++++-- nova/objects/network.py | 8 +++++-- nova/objects/network_request.py | 8 +++++-- nova/objects/numa.py | 12 +++++++--- nova/objects/pci_device.py | 8 +++++-- nova/objects/quotas.py | 4 +++- nova/objects/security_group.py | 8 +++++-- nova/objects/security_group_rule.py | 8 +++++-- nova/objects/service.py | 8 +++++-- nova/objects/tag.py | 8 +++++-- nova/objects/virt_cpu_topology.py | 4 +++- nova/objects/virtual_interface.py | 8 +++++-- nova/tests/unit/conductor/test_conductor.py | 3 ++- nova/tests/unit/objects/test_objects.py | 7 +++--- 35 files changed, 217 insertions(+), 74 deletions(-) diff --git a/nova/objects/agent.py b/nova/objects/agent.py index 36544b373bce..d3926ea8eeb0 100644 --- a/nova/objects/agent.py +++ b/nova/objects/agent.py @@ -19,7 +19,9 @@ from nova.objects import base from nova.objects import fields -class Agent(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class Agent(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): VERSION = '1.0' fields = { @@ -68,7 +70,9 @@ class Agent(base.NovaPersistentObject, base.NovaObject): self.obj_reset_changes() -class AgentList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class AgentList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): VERSION = '1.0' fields = { diff --git a/nova/objects/aggregate.py b/nova/objects/aggregate.py index 0d58cb85ee45..d938df28a24b 100644 --- a/nova/objects/aggregate.py +++ b/nova/objects/aggregate.py @@ -20,7 +20,9 @@ from nova.objects import base from nova.objects import fields -class Aggregate(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class Aggregate(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: String attributes updated to support unicode VERSION = '1.1' @@ -147,7 +149,9 @@ class Aggregate(base.NovaPersistentObject, base.NovaObject): return self.metadata.get('availability_zone', None) -class AggregateList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class AggregateList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added key argument to get_by_host() # Aggregate <= version 1.1 diff --git a/nova/objects/bandwidth_usage.py b/nova/objects/bandwidth_usage.py index ade0e2485f6c..ef9958ae68ae 100644 --- a/nova/objects/bandwidth_usage.py +++ b/nova/objects/bandwidth_usage.py @@ -15,7 +15,9 @@ from nova.objects import base from nova.objects import fields -class BandwidthUsage(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class BandwidthUsage(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Add use_slave to get_by_instance_uuid_and_mac # Version 1.2: Add update_cells to create @@ -63,7 +65,9 @@ class BandwidthUsage(base.NovaPersistentObject, base.NovaObject): self._from_db_object(context, self, db_bw_usage) -class BandwidthUsageList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class BandwidthUsageList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Add use_slave to get_by_uuids # Version 1.2: BandwidthUsage <= version 1.2 diff --git a/nova/objects/base.py b/nova/objects/base.py index 499ec234ccb2..54242b697c44 100644 --- a/nova/objects/base.py +++ b/nova/objects/base.py @@ -272,7 +272,7 @@ class NovaObject(object): self._changed_fields = set() self._context = context for key in kwargs.keys(): - self[key] = kwargs[key] + setattr(self, key, kwargs[key]) def __repr__(self): return '%s(%s)' % ( @@ -518,8 +518,8 @@ class NovaObject(object): changes = set(self._changed_fields) for field in self.fields: if (self.obj_attr_is_set(field) and - isinstance(self[field], NovaObject) and - self[field].obj_what_changed()): + isinstance(getattr(self, field), NovaObject) and + getattr(self, field).obj_what_changed()): changes.add(field) return changes @@ -527,7 +527,7 @@ class NovaObject(object): """Returns a dict of changed fields and their new values.""" changes = {} for key in self.obj_what_changed(): - changes[key] = self[key] + changes[key] = getattr(self, key) return changes def obj_reset_changes(self, fields=None): @@ -557,6 +557,19 @@ class NovaObject(object): def obj_fields(self): return self.fields.keys() + self.obj_extra_fields + +class NovaObjectDictCompat(object): + """Mix-in to provide dictionary key access compat + + If an object needs to support attribute access using + dictionary items instead of object attributes, inherit + from this class. This should only be used as a temporary + measure until all callers are converted to use modern + attribute access. + + NOTE(berrange) This class will eventually be deleted. + """ + # dictish syntactic sugar def iteritems(self): """For backwards-compatibility with dict-based objects. @@ -605,7 +618,7 @@ class NovaObject(object): if value != NotSpecifiedSentinel and not self.obj_attr_is_set(key): return value else: - return self[key] + return getattr(self, key) def update(self, updates): """For backwards-compatibility with dict-base objects. @@ -613,7 +626,7 @@ class NovaObject(object): NOTE(danms): May be removed in the future. """ for key, value in updates.items(): - self[key] = value + setattr(self, key, value) class NovaPersistentObject(object): diff --git a/nova/objects/block_device.py b/nova/objects/block_device.py index b6aa3cba287d..eee358db307c 100644 --- a/nova/objects/block_device.py +++ b/nova/objects/block_device.py @@ -36,7 +36,9 @@ def _expected_cols(expected_attrs): if attr in _BLOCK_DEVICE_OPTIONAL_JOINED_FIELD] -class BlockDeviceMapping(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class BlockDeviceMapping(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Add instance_uuid to get_by_volume_id method # Version 1.2: Instance version 1.14 @@ -194,7 +196,9 @@ class BlockDeviceMapping(base.NovaPersistentObject, base.NovaObject): self.obj_reset_changes(fields=['instance']) -class BlockDeviceMappingList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class BlockDeviceMappingList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: BlockDeviceMapping <= version 1.1 # Version 1.2: Added use_slave to get_by_instance_uuid diff --git a/nova/objects/compute_node.py b/nova/objects/compute_node.py index 55399801b55a..06d98bdde8d6 100644 --- a/nova/objects/compute_node.py +++ b/nova/objects/compute_node.py @@ -22,7 +22,9 @@ from nova.objects import fields from nova import utils -class ComputeNode(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class ComputeNode(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added get_by_service_id() # Version 1.2: String attributes updated to support unicode @@ -219,7 +221,9 @@ class ComputeNode(base.NovaPersistentObject, base.NovaObject): return self._cached_service -class ComputeNodeList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class ComputeNodeList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # ComputeNode <= version 1.2 # Version 1.1 ComputeNode version 1.3 diff --git a/nova/objects/dns_domain.py b/nova/objects/dns_domain.py index c0d515feb457..9b099aadebbe 100644 --- a/nova/objects/dns_domain.py +++ b/nova/objects/dns_domain.py @@ -18,7 +18,9 @@ from nova.objects import base from nova.objects import fields -class DNSDomain(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class DNSDomain(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' @@ -56,7 +58,9 @@ class DNSDomain(base.NovaPersistentObject, base.NovaObject): db.dnsdomain_unregister(context, domain) -class DNSDomainList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class DNSDomainList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' fields = { diff --git a/nova/objects/ec2.py b/nova/objects/ec2.py index 7556bd57c9e0..12ed05d7ed18 100644 --- a/nova/objects/ec2.py +++ b/nova/objects/ec2.py @@ -18,7 +18,9 @@ from nova.objects import base from nova.objects import fields -class EC2InstanceMapping(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class EC2InstanceMapping(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' @@ -56,7 +58,9 @@ class EC2InstanceMapping(base.NovaPersistentObject, base.NovaObject): return cls._from_db_object(context, cls(), db_imap) -class EC2VolumeMapping(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class EC2VolumeMapping(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' @@ -94,7 +98,9 @@ class EC2VolumeMapping(base.NovaPersistentObject, base.NovaObject): return cls._from_db_object(context, cls(context), db_vmap) -class EC2SnapshotMapping(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class EC2SnapshotMapping(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' @@ -132,7 +138,9 @@ class EC2SnapshotMapping(base.NovaPersistentObject, base.NovaObject): return cls._from_db_object(context, cls(context), db_smap) -class S3ImageMapping(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class S3ImageMapping(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' diff --git a/nova/objects/external_event.py b/nova/objects/external_event.py index 2ac9bda78add..8b4c00151342 100644 --- a/nova/objects/external_event.py +++ b/nova/objects/external_event.py @@ -28,7 +28,9 @@ EVENT_NAMES = [ EVENT_STATUSES = ['failed', 'completed', 'in-progress'] -class InstanceExternalEvent(obj_base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceExternalEvent(obj_base.NovaObject, + obj_base.NovaObjectDictCompat): # Version 1.0: Initial version # Supports network-changed and vif-plugged VERSION = '1.0' diff --git a/nova/objects/fixed_ip.py b/nova/objects/fixed_ip.py index e142c4e3fdf7..0b51d1258d45 100644 --- a/nova/objects/fixed_ip.py +++ b/nova/objects/fixed_ip.py @@ -26,7 +26,9 @@ FIXED_IP_OPTIONAL_ATTRS = ['instance', 'network', 'virtual_interface', 'floating_ips'] -class FixedIP(obj_base.NovaPersistentObject, obj_base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class FixedIP(obj_base.NovaPersistentObject, obj_base.NovaObject, + obj_base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added virtual_interface field # Version 1.2: Instance version 1.14 @@ -197,7 +199,9 @@ class FixedIP(obj_base.NovaPersistentObject, obj_base.NovaObject): self.obj_reset_changes(['instance_uuid', 'instance']) -class FixedIPList(obj_base.ObjectListBase, obj_base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class FixedIPList(obj_base.ObjectListBase, obj_base.NovaObject, + obj_base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added get_by_network() # Version 1.2: FixedIP <= version 1.2 diff --git a/nova/objects/flavor.py b/nova/objects/flavor.py index c1aa2f038276..7b21f5ddaf45 100644 --- a/nova/objects/flavor.py +++ b/nova/objects/flavor.py @@ -22,7 +22,9 @@ from nova.objects import fields OPTIONAL_FIELDS = ['extra_specs', 'projects'] -class Flavor(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class Flavor(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added save_projects(), save_extra_specs(), removed # remoteable from save() @@ -248,7 +250,9 @@ class Flavor(base.NovaPersistentObject, base.NovaObject): db.flavor_destroy(context, self.name) -class FlavorList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class FlavorList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): VERSION = '1.1' fields = { diff --git a/nova/objects/floating_ip.py b/nova/objects/floating_ip.py index 6ec826dc1d00..a4a07a6cd31e 100644 --- a/nova/objects/floating_ip.py +++ b/nova/objects/floating_ip.py @@ -21,7 +21,9 @@ from nova.objects import fields FLOATING_IP_OPTIONAL_ATTRS = ['fixed_ip'] -class FloatingIP(obj_base.NovaPersistentObject, obj_base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class FloatingIP(obj_base.NovaPersistentObject, obj_base.NovaObject, + obj_base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added _get_addresses_by_instance_uuid() # Version 1.2: FixedIP <= version 1.2 @@ -160,7 +162,9 @@ class FloatingIP(obj_base.NovaPersistentObject, obj_base.NovaObject): self._from_db_object(context, self, db_floatingip) -class FloatingIPList(obj_base.ObjectListBase, obj_base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class FloatingIPList(obj_base.ObjectListBase, obj_base.NovaObject, + obj_base.NovaObjectDictCompat): # Version 1.3: FloatingIP 1.2 # Version 1.4: FloatingIP 1.3 # Version 1.5: FloatingIP 1.4 diff --git a/nova/objects/hv_spec.py b/nova/objects/hv_spec.py index f3412fd0cca8..39a9ff156980 100644 --- a/nova/objects/hv_spec.py +++ b/nova/objects/hv_spec.py @@ -17,7 +17,9 @@ from nova.objects import base from nova.objects import fields -class HVSpec(base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class HVSpec(base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' diff --git a/nova/objects/instance.py b/nova/objects/instance.py index 66e878f9113c..abcb52ea7095 100644 --- a/nova/objects/instance.py +++ b/nova/objects/instance.py @@ -67,7 +67,9 @@ def _expected_cols(expected_attrs): return simple_cols + complex_cols -class Instance(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class Instance(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added info_cache # Version 1.2: Added security_groups @@ -699,7 +701,9 @@ def _make_instance_list(context, inst_list, db_inst_list, expected_attrs): return inst_list -class InstanceList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added use_slave to get_by_host # Instance <= version 1.9 diff --git a/nova/objects/instance_action.py b/nova/objects/instance_action.py index 1ca2f015cb80..b83c0ae22957 100644 --- a/nova/objects/instance_action.py +++ b/nova/objects/instance_action.py @@ -20,7 +20,9 @@ from nova.objects import base from nova.objects import fields -class InstanceAction(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceAction(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: String attributes updated to support unicode VERSION = '1.1' @@ -91,7 +93,9 @@ class InstanceAction(base.NovaPersistentObject, base.NovaObject): self._from_db_object(context, self, db_action) -class InstanceActionList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceActionList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # InstanceAction <= version 1.1 VERSION = '1.0' @@ -109,7 +113,9 @@ class InstanceActionList(base.ObjectListBase, base.NovaObject): return base.obj_make_list(context, cls(), InstanceAction, db_actions) -class InstanceActionEvent(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceActionEvent(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: event_finish_with_failure decorated with serialize_args VERSION = '1.1' @@ -199,7 +205,9 @@ class InstanceActionEvent(base.NovaPersistentObject, base.NovaObject): self.finish_with_failure(context, exc_val=None, exc_tb=None) -class InstanceActionEventList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceActionEventList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): fields = { 'objects': fields.ListOfObjectsField('InstanceActionEvent'), } diff --git a/nova/objects/instance_fault.py b/nova/objects/instance_fault.py index 7c2b7a1fd864..ad186818749a 100644 --- a/nova/objects/instance_fault.py +++ b/nova/objects/instance_fault.py @@ -28,7 +28,9 @@ from nova.openstack.common import log as logging LOG = logging.getLogger(__name__) -class InstanceFault(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceFault(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: String attributes updated to support unicode # Version 1.2: Added create() @@ -87,7 +89,9 @@ class InstanceFault(base.NovaPersistentObject, base.NovaObject): LOG.exception(_LE("Failed to notify cells of instance fault")) -class InstanceFaultList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceFaultList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # InstanceFault <= version 1.1 # Version 1.1: InstanceFault version 1.2 diff --git a/nova/objects/instance_group.py b/nova/objects/instance_group.py index 469571c3731a..15b29dc12ff4 100644 --- a/nova/objects/instance_group.py +++ b/nova/objects/instance_group.py @@ -22,7 +22,9 @@ from nova.openstack.common import uuidutils from nova import utils -class InstanceGroup(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceGroup(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: String attributes updated to support unicode # Version 1.2: Use list/dict helpers for policies, metadetails, members @@ -194,7 +196,9 @@ class InstanceGroup(base.NovaPersistentObject, base.NovaObject): return len(instances) -class InstanceGroupList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceGroupList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # InstanceGroup <= version 1.3 # Version 1.1: InstanceGroup <= version 1.4 diff --git a/nova/objects/instance_info_cache.py b/nova/objects/instance_info_cache.py index 9d7011937f12..330959cdc499 100644 --- a/nova/objects/instance_info_cache.py +++ b/nova/objects/instance_info_cache.py @@ -24,7 +24,9 @@ from nova.openstack.common import log as logging LOG = logging.getLogger(__name__) -class InstanceInfoCache(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceInfoCache(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Converted network_info to store the model. # Version 1.2: Added new() and update_cells kwarg to save(). diff --git a/nova/objects/instance_numa_topology.py b/nova/objects/instance_numa_topology.py index 3034dcaaf02a..8b89475682d4 100644 --- a/nova/objects/instance_numa_topology.py +++ b/nova/objects/instance_numa_topology.py @@ -21,7 +21,9 @@ from nova.objects import fields as obj_fields from nova.virt import hardware -class InstanceNUMACell(base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceNUMACell(base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Add pagesize field # Version 1.2: Add cpu_pinning_raw and topology fields @@ -97,7 +99,9 @@ class InstanceNUMACell(base.NovaObject): self.pin(vcpu, pcpu) -class InstanceNUMATopology(base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstanceNUMATopology(base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Takes into account pagesize VERSION = '1.1' diff --git a/nova/objects/instance_pci_requests.py b/nova/objects/instance_pci_requests.py index 9875bb57a17f..5928baf02898 100644 --- a/nova/objects/instance_pci_requests.py +++ b/nova/objects/instance_pci_requests.py @@ -18,7 +18,9 @@ from nova.objects import fields from nova import utils -class InstancePCIRequest(base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstancePCIRequest(base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Add request_id VERSION = '1.1' @@ -49,7 +51,9 @@ class InstancePCIRequest(base.NovaObject): del primitive['request_id'] -class InstancePCIRequests(base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class InstancePCIRequests(base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: InstancePCIRequest 1.1 VERSION = '1.1' diff --git a/nova/objects/keypair.py b/nova/objects/keypair.py index 2117b8132beb..8544fd884b26 100644 --- a/nova/objects/keypair.py +++ b/nova/objects/keypair.py @@ -19,7 +19,9 @@ from nova.objects import base from nova.objects import fields -class KeyPair(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class KeyPair(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: String attributes updated to support unicode VERSION = '1.1' @@ -63,7 +65,9 @@ class KeyPair(base.NovaPersistentObject, base.NovaObject): db.key_pair_destroy(context, self.user_id, self.name) -class KeyPairList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class KeyPairList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # KeyPair <= version 1.1 VERSION = '1.0' diff --git a/nova/objects/migration.py b/nova/objects/migration.py index 3679198e4ac7..e3b3322f1986 100644 --- a/nova/objects/migration.py +++ b/nova/objects/migration.py @@ -19,7 +19,9 @@ from nova.objects import base from nova.objects import fields -class Migration(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class Migration(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: String attributes updated to support unicode VERSION = '1.1' @@ -78,7 +80,9 @@ class Migration(base.NovaPersistentObject, base.NovaObject): return objects.Instance.get_by_uuid(self._context, self.instance_uuid) -class MigrationList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class MigrationList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Migration <= 1.1 # Version 1.1: Added use_slave to get_unconfirmed_by_dest_compute diff --git a/nova/objects/network.py b/nova/objects/network.py index 30d7cd9966f2..da3298755a53 100644 --- a/nova/objects/network.py +++ b/nova/objects/network.py @@ -40,7 +40,9 @@ CONF = cfg.CONF CONF.register_opts(network_opts) -class Network(obj_base.NovaPersistentObject, obj_base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class Network(obj_base.NovaPersistentObject, obj_base.NovaObject, + obj_base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added in_use_on_host() # Version 1.2: Added mtu, dhcp_server, enable_dhcp, share_address @@ -203,7 +205,9 @@ class Network(obj_base.NovaPersistentObject, obj_base.NovaObject): self._from_db_object(context, self, db_network) -class NetworkList(obj_base.ObjectListBase, obj_base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class NetworkList(obj_base.ObjectListBase, obj_base.NovaObject, + obj_base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added get_by_project() # Version 1.2: Network <= version 1.2 diff --git a/nova/objects/network_request.py b/nova/objects/network_request.py index 4141f39bf6fa..46ef925229ed 100644 --- a/nova/objects/network_request.py +++ b/nova/objects/network_request.py @@ -17,7 +17,9 @@ from nova.objects import fields from nova import utils -class NetworkRequest(obj_base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class NetworkRequest(obj_base.NovaObject, + obj_base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added pci_request_id VERSION = '1.1' @@ -55,7 +57,9 @@ class NetworkRequest(obj_base.NovaObject): return cls(network_id=network_id, address=address) -class NetworkRequestList(obj_base.ObjectListBase, obj_base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class NetworkRequestList(obj_base.ObjectListBase, obj_base.NovaObject, + obj_base.NovaObjectDictCompat): fields = { 'objects': fields.ListOfObjectsField('NetworkRequest'), } diff --git a/nova/objects/numa.py b/nova/objects/numa.py index 5623b6b9b718..c507027f56e3 100644 --- a/nova/objects/numa.py +++ b/nova/objects/numa.py @@ -19,7 +19,9 @@ from nova.objects import fields from nova.virt import hardware -class NUMACell(base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class NUMACell(base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added pinned_cpus and siblings fields # Version 1.2: Added mempages field @@ -73,7 +75,9 @@ class NUMACell(base.NovaObject): cpu_usage=cpu_usage, memory_usage=memory_usage) -class NUMAPagesTopology(base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class NUMAPagesTopology(base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' @@ -94,7 +98,9 @@ class NUMAPagesTopology(base.NovaObject): return self.free * self.size_kb -class NUMATopology(base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class NUMATopology(base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Update NUMACell to 1.1 # Version 1.1: Update NUMACell to 1.2 diff --git a/nova/objects/pci_device.py b/nova/objects/pci_device.py index b6406db49f4d..d4b5bf9285f5 100644 --- a/nova/objects/pci_device.py +++ b/nova/objects/pci_device.py @@ -26,7 +26,9 @@ from nova import utils LOG = logging.getLogger(__name__) -class PciDevice(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class PciDevice(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): """Object to represent a PCI device on a compute node. @@ -173,7 +175,9 @@ class PciDevice(base.NovaPersistentObject, base.NovaObject): self._from_db_object(context, self, db_pci) -class PciDeviceList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class PciDeviceList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # PciDevice <= 1.1 # Version 1.1: PciDevice 1.2 diff --git a/nova/objects/quotas.py b/nova/objects/quotas.py index 6c44583cdbc4..ff0aaf22e494 100644 --- a/nova/objects/quotas.py +++ b/nova/objects/quotas.py @@ -46,7 +46,9 @@ def ids_from_server_group(context, server_group): return ids_from_instance(context, server_group) -class Quotas(base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class Quotas(base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: initial version # Version 1.1: Added create_limit() and update_limit() # Version 1.2: Added limit_check() and count() diff --git a/nova/objects/security_group.py b/nova/objects/security_group.py index 4ffa1c9c7b26..0ec544fb57aa 100644 --- a/nova/objects/security_group.py +++ b/nova/objects/security_group.py @@ -18,7 +18,9 @@ from nova.objects import base from nova.objects import fields -class SecurityGroup(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class SecurityGroup(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: String attributes updated to support unicode VERSION = '1.1' @@ -70,7 +72,9 @@ class SecurityGroup(base.NovaPersistentObject, base.NovaObject): db.security_group_get(context, self.id)) -class SecurityGroupList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class SecurityGroupList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # SecurityGroup <= version 1.1 VERSION = '1.0' diff --git a/nova/objects/security_group_rule.py b/nova/objects/security_group_rule.py index c1d0023231f0..97d18723db56 100644 --- a/nova/objects/security_group_rule.py +++ b/nova/objects/security_group_rule.py @@ -21,7 +21,9 @@ from nova.objects import fields OPTIONAL_ATTRS = ['parent_group', 'grantee_group'] -class SecurityGroupRule(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class SecurityGroupRule(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added create() and set id as read_only VERSION = '1.1' @@ -82,7 +84,9 @@ class SecurityGroupRule(base.NovaPersistentObject, base.NovaObject): return cls._from_db_object(context, cls(), db_rule) -class SecurityGroupRuleList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class SecurityGroupRuleList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): fields = { 'objects': fields.ListOfObjectsField('SecurityGroupRule'), } diff --git a/nova/objects/service.py b/nova/objects/service.py index 053c21837e7c..2329a2819f73 100644 --- a/nova/objects/service.py +++ b/nova/objects/service.py @@ -24,7 +24,9 @@ from nova.openstack.common import log as logging LOG = logging.getLogger(__name__) -class Service(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class Service(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: Added compute_node nested object # Version 1.2: String attributes updated to support unicode @@ -135,7 +137,9 @@ class Service(base.NovaPersistentObject, base.NovaObject): db.service_destroy(context, self.id) -class ServiceList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class ServiceList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version # Service <= version 1.2 # Version 1.1 Service version 1.3 diff --git a/nova/objects/tag.py b/nova/objects/tag.py index 4a5704f572db..d7477662ba3c 100644 --- a/nova/objects/tag.py +++ b/nova/objects/tag.py @@ -16,7 +16,9 @@ from nova.objects import base from nova.objects import fields -class Tag(base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class Tag(base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' @@ -43,7 +45,9 @@ class Tag(base.NovaObject): db.instance_tag_delete(context, resource_id, name) -class TagList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class TagList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' diff --git a/nova/objects/virt_cpu_topology.py b/nova/objects/virt_cpu_topology.py index 99483d1837b8..66a09cd2c185 100644 --- a/nova/objects/virt_cpu_topology.py +++ b/nova/objects/virt_cpu_topology.py @@ -14,7 +14,9 @@ from nova.objects import base from nova.objects import fields -class VirtCPUTopology(base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class VirtCPUTopology(base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' diff --git a/nova/objects/virtual_interface.py b/nova/objects/virtual_interface.py index 51cd24c352e6..211494b1fbc1 100644 --- a/nova/objects/virtual_interface.py +++ b/nova/objects/virtual_interface.py @@ -19,7 +19,9 @@ from nova.objects import base from nova.objects import fields -class VirtualInterface(base.NovaPersistentObject, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class VirtualInterface(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' @@ -78,7 +80,9 @@ class VirtualInterface(base.NovaPersistentObject, base.NovaObject): db.virtual_interface_delete_by_instance(context, instance_uuid) -class VirtualInterfaceList(base.ObjectListBase, base.NovaObject): +# TODO(berrange): Remove NovaObjectDictCompat +class VirtualInterfaceList(base.ObjectListBase, base.NovaObject, + base.NovaObjectDictCompat): # Version 1.0: Initial version VERSION = '1.0' fields = { diff --git a/nova/tests/unit/conductor/test_conductor.py b/nova/tests/unit/conductor/test_conductor.py index 52f9e61e15f0..1e2d28b8a0e0 100644 --- a/nova/tests/unit/conductor/test_conductor.py +++ b/nova/tests/unit/conductor/test_conductor.py @@ -570,7 +570,8 @@ class ConductorTestCase(_BaseTestCase, test.TestCase): self._test_object_action, True, True) def test_object_action_copies_object(self): - class TestObject(obj_base.NovaObject): + class TestObject(obj_base.NovaObject, + obj_base.NovaObjectDictCompat): fields = {'dict': fields.DictOfStringsField()} def touch_dict(self, context): diff --git a/nova/tests/unit/objects/test_objects.py b/nova/tests/unit/objects/test_objects.py index 92b4249eb18b..01d4c2b11d96 100644 --- a/nova/tests/unit/objects/test_objects.py +++ b/nova/tests/unit/objects/test_objects.py @@ -47,7 +47,8 @@ class MyOwnedObject(base.NovaPersistentObject, base.NovaObject): fields = {'baz': fields.Field(fields.Integer())} -class MyObj(base.NovaPersistentObject, base.NovaObject): +class MyObj(base.NovaPersistentObject, base.NovaObject, + base.NovaObjectDictCompat): VERSION = '1.6' fields = {'foo': fields.Field(fields.Integer(), default=1), 'bar': fields.Field(fields.String()), @@ -207,7 +208,7 @@ class TestMetaclass(test.TestCase): class TestObjToPrimitive(test.TestCase): def test_obj_to_primitive_list(self): - class MyObjElement(base.NovaObject): + class MyObjElement(base.NovaObject, base.NovaObjectDictCompat): fields = {'foo': fields.IntegerField()} def __init__(self, foo): @@ -238,7 +239,7 @@ class TestObjToPrimitive(test.TestCase): base.obj_to_primitive(mylist)) def test_obj_to_primitive_with_ip_addr(self): - class TestObject(base.NovaObject): + class TestObject(base.NovaObject, base.NovaObjectDictCompat): fields = {'addr': fields.IPAddressField(), 'cidr': fields.IPNetworkField()}