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
This commit is contained in:
Daniel P. Berrange 2014-12-12 10:42:05 +00:00
parent 1eaa53de5e
commit 722e789309
35 changed files with 217 additions and 74 deletions

View File

@ -19,7 +19,9 @@ from nova.objects import base
from nova.objects import fields 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' VERSION = '1.0'
fields = { fields = {
@ -68,7 +70,9 @@ class Agent(base.NovaPersistentObject, base.NovaObject):
self.obj_reset_changes() 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' VERSION = '1.0'
fields = { fields = {

View File

@ -20,7 +20,9 @@ from nova.objects import base
from nova.objects import fields 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.0: Initial version
# Version 1.1: String attributes updated to support unicode # Version 1.1: String attributes updated to support unicode
VERSION = '1.1' VERSION = '1.1'
@ -147,7 +149,9 @@ class Aggregate(base.NovaPersistentObject, base.NovaObject):
return self.metadata.get('availability_zone', None) 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.0: Initial version
# Version 1.1: Added key argument to get_by_host() # Version 1.1: Added key argument to get_by_host()
# Aggregate <= version 1.1 # Aggregate <= version 1.1

View File

@ -15,7 +15,9 @@ from nova.objects import base
from nova.objects import fields 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.0: Initial version
# Version 1.1: Add use_slave to get_by_instance_uuid_and_mac # Version 1.1: Add use_slave to get_by_instance_uuid_and_mac
# Version 1.2: Add update_cells to create # 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) 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.0: Initial version
# Version 1.1: Add use_slave to get_by_uuids # Version 1.1: Add use_slave to get_by_uuids
# Version 1.2: BandwidthUsage <= version 1.2 # Version 1.2: BandwidthUsage <= version 1.2

View File

@ -272,7 +272,7 @@ class NovaObject(object):
self._changed_fields = set() self._changed_fields = set()
self._context = context self._context = context
for key in kwargs.keys(): for key in kwargs.keys():
self[key] = kwargs[key] setattr(self, key, kwargs[key])
def __repr__(self): def __repr__(self):
return '%s(%s)' % ( return '%s(%s)' % (
@ -518,8 +518,8 @@ class NovaObject(object):
changes = set(self._changed_fields) changes = set(self._changed_fields)
for field in self.fields: for field in self.fields:
if (self.obj_attr_is_set(field) and if (self.obj_attr_is_set(field) and
isinstance(self[field], NovaObject) and isinstance(getattr(self, field), NovaObject) and
self[field].obj_what_changed()): getattr(self, field).obj_what_changed()):
changes.add(field) changes.add(field)
return changes return changes
@ -527,7 +527,7 @@ class NovaObject(object):
"""Returns a dict of changed fields and their new values.""" """Returns a dict of changed fields and their new values."""
changes = {} changes = {}
for key in self.obj_what_changed(): for key in self.obj_what_changed():
changes[key] = self[key] changes[key] = getattr(self, key)
return changes return changes
def obj_reset_changes(self, fields=None): def obj_reset_changes(self, fields=None):
@ -557,6 +557,19 @@ class NovaObject(object):
def obj_fields(self): def obj_fields(self):
return self.fields.keys() + self.obj_extra_fields 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 # dictish syntactic sugar
def iteritems(self): def iteritems(self):
"""For backwards-compatibility with dict-based objects. """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): if value != NotSpecifiedSentinel and not self.obj_attr_is_set(key):
return value return value
else: else:
return self[key] return getattr(self, key)
def update(self, updates): def update(self, updates):
"""For backwards-compatibility with dict-base objects. """For backwards-compatibility with dict-base objects.
@ -613,7 +626,7 @@ class NovaObject(object):
NOTE(danms): May be removed in the future. NOTE(danms): May be removed in the future.
""" """
for key, value in updates.items(): for key, value in updates.items():
self[key] = value setattr(self, key, value)
class NovaPersistentObject(object): class NovaPersistentObject(object):

View File

@ -36,7 +36,9 @@ def _expected_cols(expected_attrs):
if attr in _BLOCK_DEVICE_OPTIONAL_JOINED_FIELD] 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.0: Initial version
# Version 1.1: Add instance_uuid to get_by_volume_id method # Version 1.1: Add instance_uuid to get_by_volume_id method
# Version 1.2: Instance version 1.14 # Version 1.2: Instance version 1.14
@ -194,7 +196,9 @@ class BlockDeviceMapping(base.NovaPersistentObject, base.NovaObject):
self.obj_reset_changes(fields=['instance']) 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.0: Initial version
# Version 1.1: BlockDeviceMapping <= version 1.1 # Version 1.1: BlockDeviceMapping <= version 1.1
# Version 1.2: Added use_slave to get_by_instance_uuid # Version 1.2: Added use_slave to get_by_instance_uuid

View File

@ -22,7 +22,9 @@ from nova.objects import fields
from nova import utils 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.0: Initial version
# Version 1.1: Added get_by_service_id() # Version 1.1: Added get_by_service_id()
# Version 1.2: String attributes updated to support unicode # Version 1.2: String attributes updated to support unicode
@ -219,7 +221,9 @@ class ComputeNode(base.NovaPersistentObject, base.NovaObject):
return self._cached_service 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 # Version 1.0: Initial version
# ComputeNode <= version 1.2 # ComputeNode <= version 1.2
# Version 1.1 ComputeNode version 1.3 # Version 1.1 ComputeNode version 1.3

View File

@ -18,7 +18,9 @@ from nova.objects import base
from nova.objects import fields 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: Initial version
VERSION = '1.0' VERSION = '1.0'
@ -56,7 +58,9 @@ class DNSDomain(base.NovaPersistentObject, base.NovaObject):
db.dnsdomain_unregister(context, domain) 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: Initial version
VERSION = '1.0' VERSION = '1.0'
fields = { fields = {

View File

@ -18,7 +18,9 @@ from nova.objects import base
from nova.objects import fields 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: Initial version
VERSION = '1.0' VERSION = '1.0'
@ -56,7 +58,9 @@ class EC2InstanceMapping(base.NovaPersistentObject, base.NovaObject):
return cls._from_db_object(context, cls(), db_imap) 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: Initial version
VERSION = '1.0' VERSION = '1.0'
@ -94,7 +98,9 @@ class EC2VolumeMapping(base.NovaPersistentObject, base.NovaObject):
return cls._from_db_object(context, cls(context), db_vmap) 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: Initial version
VERSION = '1.0' VERSION = '1.0'
@ -132,7 +138,9 @@ class EC2SnapshotMapping(base.NovaPersistentObject, base.NovaObject):
return cls._from_db_object(context, cls(context), db_smap) 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: Initial version
VERSION = '1.0' VERSION = '1.0'

View File

@ -28,7 +28,9 @@ EVENT_NAMES = [
EVENT_STATUSES = ['failed', 'completed', 'in-progress'] 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 # Version 1.0: Initial version
# Supports network-changed and vif-plugged # Supports network-changed and vif-plugged
VERSION = '1.0' VERSION = '1.0'

View File

@ -26,7 +26,9 @@ FIXED_IP_OPTIONAL_ATTRS = ['instance', 'network', 'virtual_interface',
'floating_ips'] '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.0: Initial version
# Version 1.1: Added virtual_interface field # Version 1.1: Added virtual_interface field
# Version 1.2: Instance version 1.14 # 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']) 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.0: Initial version
# Version 1.1: Added get_by_network() # Version 1.1: Added get_by_network()
# Version 1.2: FixedIP <= version 1.2 # Version 1.2: FixedIP <= version 1.2

View File

@ -22,7 +22,9 @@ from nova.objects import fields
OPTIONAL_FIELDS = ['extra_specs', 'projects'] 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.0: Initial version
# Version 1.1: Added save_projects(), save_extra_specs(), removed # Version 1.1: Added save_projects(), save_extra_specs(), removed
# remoteable from save() # remoteable from save()
@ -248,7 +250,9 @@ class Flavor(base.NovaPersistentObject, base.NovaObject):
db.flavor_destroy(context, self.name) 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' VERSION = '1.1'
fields = { fields = {

View File

@ -21,7 +21,9 @@ from nova.objects import fields
FLOATING_IP_OPTIONAL_ATTRS = ['fixed_ip'] 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.0: Initial version
# Version 1.1: Added _get_addresses_by_instance_uuid() # Version 1.1: Added _get_addresses_by_instance_uuid()
# Version 1.2: FixedIP <= version 1.2 # 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) 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.3: FloatingIP 1.2
# Version 1.4: FloatingIP 1.3 # Version 1.4: FloatingIP 1.3
# Version 1.5: FloatingIP 1.4 # Version 1.5: FloatingIP 1.4

View File

@ -17,7 +17,9 @@ from nova.objects import base
from nova.objects import fields 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: Initial version
VERSION = '1.0' VERSION = '1.0'

View File

@ -67,7 +67,9 @@ def _expected_cols(expected_attrs):
return simple_cols + complex_cols 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.0: Initial version
# Version 1.1: Added info_cache # Version 1.1: Added info_cache
# Version 1.2: Added security_groups # 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 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.0: Initial version
# Version 1.1: Added use_slave to get_by_host # Version 1.1: Added use_slave to get_by_host
# Instance <= version 1.9 # Instance <= version 1.9

View File

@ -20,7 +20,9 @@ from nova.objects import base
from nova.objects import fields 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.0: Initial version
# Version 1.1: String attributes updated to support unicode # Version 1.1: String attributes updated to support unicode
VERSION = '1.1' VERSION = '1.1'
@ -91,7 +93,9 @@ class InstanceAction(base.NovaPersistentObject, base.NovaObject):
self._from_db_object(context, self, db_action) 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 # Version 1.0: Initial version
# InstanceAction <= version 1.1 # InstanceAction <= version 1.1
VERSION = '1.0' VERSION = '1.0'
@ -109,7 +113,9 @@ class InstanceActionList(base.ObjectListBase, base.NovaObject):
return base.obj_make_list(context, cls(), InstanceAction, db_actions) 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.0: Initial version
# Version 1.1: event_finish_with_failure decorated with serialize_args # Version 1.1: event_finish_with_failure decorated with serialize_args
VERSION = '1.1' VERSION = '1.1'
@ -199,7 +205,9 @@ class InstanceActionEvent(base.NovaPersistentObject, base.NovaObject):
self.finish_with_failure(context, exc_val=None, exc_tb=None) 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 = { fields = {
'objects': fields.ListOfObjectsField('InstanceActionEvent'), 'objects': fields.ListOfObjectsField('InstanceActionEvent'),
} }

View File

@ -28,7 +28,9 @@ from nova.openstack.common import log as logging
LOG = logging.getLogger(__name__) 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.0: Initial version
# Version 1.1: String attributes updated to support unicode # Version 1.1: String attributes updated to support unicode
# Version 1.2: Added create() # 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")) 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 # Version 1.0: Initial version
# InstanceFault <= version 1.1 # InstanceFault <= version 1.1
# Version 1.1: InstanceFault version 1.2 # Version 1.1: InstanceFault version 1.2

View File

@ -22,7 +22,9 @@ from nova.openstack.common import uuidutils
from nova import utils 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.0: Initial version
# Version 1.1: String attributes updated to support unicode # Version 1.1: String attributes updated to support unicode
# Version 1.2: Use list/dict helpers for policies, metadetails, members # Version 1.2: Use list/dict helpers for policies, metadetails, members
@ -194,7 +196,9 @@ class InstanceGroup(base.NovaPersistentObject, base.NovaObject):
return len(instances) 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 # Version 1.0: Initial version
# InstanceGroup <= version 1.3 # InstanceGroup <= version 1.3
# Version 1.1: InstanceGroup <= version 1.4 # Version 1.1: InstanceGroup <= version 1.4

View File

@ -24,7 +24,9 @@ from nova.openstack.common import log as logging
LOG = logging.getLogger(__name__) 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.0: Initial version
# Version 1.1: Converted network_info to store the model. # Version 1.1: Converted network_info to store the model.
# Version 1.2: Added new() and update_cells kwarg to save(). # Version 1.2: Added new() and update_cells kwarg to save().

View File

@ -21,7 +21,9 @@ from nova.objects import fields as obj_fields
from nova.virt import hardware 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.0: Initial version
# Version 1.1: Add pagesize field # Version 1.1: Add pagesize field
# Version 1.2: Add cpu_pinning_raw and topology fields # Version 1.2: Add cpu_pinning_raw and topology fields
@ -97,7 +99,9 @@ class InstanceNUMACell(base.NovaObject):
self.pin(vcpu, pcpu) 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.0: Initial version
# Version 1.1: Takes into account pagesize # Version 1.1: Takes into account pagesize
VERSION = '1.1' VERSION = '1.1'

View File

@ -18,7 +18,9 @@ from nova.objects import fields
from nova import utils 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.0: Initial version
# Version 1.1: Add request_id # Version 1.1: Add request_id
VERSION = '1.1' VERSION = '1.1'
@ -49,7 +51,9 @@ class InstancePCIRequest(base.NovaObject):
del primitive['request_id'] 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.0: Initial version
# Version 1.1: InstancePCIRequest 1.1 # Version 1.1: InstancePCIRequest 1.1
VERSION = '1.1' VERSION = '1.1'

View File

@ -19,7 +19,9 @@ from nova.objects import base
from nova.objects import fields 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.0: Initial version
# Version 1.1: String attributes updated to support unicode # Version 1.1: String attributes updated to support unicode
VERSION = '1.1' VERSION = '1.1'
@ -63,7 +65,9 @@ class KeyPair(base.NovaPersistentObject, base.NovaObject):
db.key_pair_destroy(context, self.user_id, self.name) 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 # Version 1.0: Initial version
# KeyPair <= version 1.1 # KeyPair <= version 1.1
VERSION = '1.0' VERSION = '1.0'

View File

@ -19,7 +19,9 @@ from nova.objects import base
from nova.objects import fields 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.0: Initial version
# Version 1.1: String attributes updated to support unicode # Version 1.1: String attributes updated to support unicode
VERSION = '1.1' VERSION = '1.1'
@ -78,7 +80,9 @@ class Migration(base.NovaPersistentObject, base.NovaObject):
return objects.Instance.get_by_uuid(self._context, self.instance_uuid) 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 # Version 1.0: Initial version
# Migration <= 1.1 # Migration <= 1.1
# Version 1.1: Added use_slave to get_unconfirmed_by_dest_compute # Version 1.1: Added use_slave to get_unconfirmed_by_dest_compute

View File

@ -40,7 +40,9 @@ CONF = cfg.CONF
CONF.register_opts(network_opts) 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.0: Initial version
# Version 1.1: Added in_use_on_host() # Version 1.1: Added in_use_on_host()
# Version 1.2: Added mtu, dhcp_server, enable_dhcp, share_address # 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) 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.0: Initial version
# Version 1.1: Added get_by_project() # Version 1.1: Added get_by_project()
# Version 1.2: Network <= version 1.2 # Version 1.2: Network <= version 1.2

View File

@ -17,7 +17,9 @@ from nova.objects import fields
from nova import utils 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.0: Initial version
# Version 1.1: Added pci_request_id # Version 1.1: Added pci_request_id
VERSION = '1.1' VERSION = '1.1'
@ -55,7 +57,9 @@ class NetworkRequest(obj_base.NovaObject):
return cls(network_id=network_id, address=address) 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 = { fields = {
'objects': fields.ListOfObjectsField('NetworkRequest'), 'objects': fields.ListOfObjectsField('NetworkRequest'),
} }

View File

@ -19,7 +19,9 @@ from nova.objects import fields
from nova.virt import hardware 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.0: Initial version
# Version 1.1: Added pinned_cpus and siblings fields # Version 1.1: Added pinned_cpus and siblings fields
# Version 1.2: Added mempages field # Version 1.2: Added mempages field
@ -73,7 +75,9 @@ class NUMACell(base.NovaObject):
cpu_usage=cpu_usage, memory_usage=memory_usage) 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: Initial version
VERSION = '1.0' VERSION = '1.0'
@ -94,7 +98,9 @@ class NUMAPagesTopology(base.NovaObject):
return self.free * self.size_kb 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.0: Initial version
# Version 1.1: Update NUMACell to 1.1 # Version 1.1: Update NUMACell to 1.1
# Version 1.1: Update NUMACell to 1.2 # Version 1.1: Update NUMACell to 1.2

View File

@ -26,7 +26,9 @@ from nova import utils
LOG = logging.getLogger(__name__) 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. """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) 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 # Version 1.0: Initial version
# PciDevice <= 1.1 # PciDevice <= 1.1
# Version 1.1: PciDevice 1.2 # Version 1.1: PciDevice 1.2

View File

@ -46,7 +46,9 @@ def ids_from_server_group(context, server_group):
return ids_from_instance(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.0: initial version
# Version 1.1: Added create_limit() and update_limit() # Version 1.1: Added create_limit() and update_limit()
# Version 1.2: Added limit_check() and count() # Version 1.2: Added limit_check() and count()

View File

@ -18,7 +18,9 @@ from nova.objects import base
from nova.objects import fields 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.0: Initial version
# Version 1.1: String attributes updated to support unicode # Version 1.1: String attributes updated to support unicode
VERSION = '1.1' VERSION = '1.1'
@ -70,7 +72,9 @@ class SecurityGroup(base.NovaPersistentObject, base.NovaObject):
db.security_group_get(context, self.id)) 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 # Version 1.0: Initial version
# SecurityGroup <= version 1.1 # SecurityGroup <= version 1.1
VERSION = '1.0' VERSION = '1.0'

View File

@ -21,7 +21,9 @@ from nova.objects import fields
OPTIONAL_ATTRS = ['parent_group', 'grantee_group'] 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.0: Initial version
# Version 1.1: Added create() and set id as read_only # Version 1.1: Added create() and set id as read_only
VERSION = '1.1' VERSION = '1.1'
@ -82,7 +84,9 @@ class SecurityGroupRule(base.NovaPersistentObject, base.NovaObject):
return cls._from_db_object(context, cls(), db_rule) 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 = { fields = {
'objects': fields.ListOfObjectsField('SecurityGroupRule'), 'objects': fields.ListOfObjectsField('SecurityGroupRule'),
} }

View File

@ -24,7 +24,9 @@ from nova.openstack.common import log as logging
LOG = logging.getLogger(__name__) 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.0: Initial version
# Version 1.1: Added compute_node nested object # Version 1.1: Added compute_node nested object
# Version 1.2: String attributes updated to support unicode # 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) 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 # Version 1.0: Initial version
# Service <= version 1.2 # Service <= version 1.2
# Version 1.1 Service version 1.3 # Version 1.1 Service version 1.3

View File

@ -16,7 +16,9 @@ from nova.objects import base
from nova.objects import fields 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: Initial version
VERSION = '1.0' VERSION = '1.0'
@ -43,7 +45,9 @@ class Tag(base.NovaObject):
db.instance_tag_delete(context, resource_id, name) 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: Initial version
VERSION = '1.0' VERSION = '1.0'

View File

@ -14,7 +14,9 @@ from nova.objects import base
from nova.objects import fields 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: Initial version
VERSION = '1.0' VERSION = '1.0'

View File

@ -19,7 +19,9 @@ from nova.objects import base
from nova.objects import fields 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: Initial version
VERSION = '1.0' VERSION = '1.0'
@ -78,7 +80,9 @@ class VirtualInterface(base.NovaPersistentObject, base.NovaObject):
db.virtual_interface_delete_by_instance(context, instance_uuid) 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: Initial version
VERSION = '1.0' VERSION = '1.0'
fields = { fields = {

View File

@ -570,7 +570,8 @@ class ConductorTestCase(_BaseTestCase, test.TestCase):
self._test_object_action, True, True) self._test_object_action, True, True)
def test_object_action_copies_object(self): def test_object_action_copies_object(self):
class TestObject(obj_base.NovaObject): class TestObject(obj_base.NovaObject,
obj_base.NovaObjectDictCompat):
fields = {'dict': fields.DictOfStringsField()} fields = {'dict': fields.DictOfStringsField()}
def touch_dict(self, context): def touch_dict(self, context):

View File

@ -47,7 +47,8 @@ class MyOwnedObject(base.NovaPersistentObject, base.NovaObject):
fields = {'baz': fields.Field(fields.Integer())} fields = {'baz': fields.Field(fields.Integer())}
class MyObj(base.NovaPersistentObject, base.NovaObject): class MyObj(base.NovaPersistentObject, base.NovaObject,
base.NovaObjectDictCompat):
VERSION = '1.6' VERSION = '1.6'
fields = {'foo': fields.Field(fields.Integer(), default=1), fields = {'foo': fields.Field(fields.Integer(), default=1),
'bar': fields.Field(fields.String()), 'bar': fields.Field(fields.String()),
@ -207,7 +208,7 @@ class TestMetaclass(test.TestCase):
class TestObjToPrimitive(test.TestCase): class TestObjToPrimitive(test.TestCase):
def test_obj_to_primitive_list(self): def test_obj_to_primitive_list(self):
class MyObjElement(base.NovaObject): class MyObjElement(base.NovaObject, base.NovaObjectDictCompat):
fields = {'foo': fields.IntegerField()} fields = {'foo': fields.IntegerField()}
def __init__(self, foo): def __init__(self, foo):
@ -238,7 +239,7 @@ class TestObjToPrimitive(test.TestCase):
base.obj_to_primitive(mylist)) base.obj_to_primitive(mylist))
def test_obj_to_primitive_with_ip_addr(self): def test_obj_to_primitive_with_ip_addr(self):
class TestObject(base.NovaObject): class TestObject(base.NovaObject, base.NovaObjectDictCompat):
fields = {'addr': fields.IPAddressField(), fields = {'addr': fields.IPAddressField(),
'cidr': fields.IPNetworkField()} 'cidr': fields.IPNetworkField()}