cinder/cinder/objects/request_spec.py
TommyLike 306fa19079 Support availability-zone type
Now availability zone is highly integrated into
volume type's extra spec, it will be recognized
when creating and retyping, also we can filter
volume type by extra spec now.

Change-Id: I4e6aa7af707bd063e7edf2b0bf28e3071ad5c67a
Partial-Implements: bp support-az-in-volumetype
2018-05-17 12:09:12 +00:00

151 lines
6.3 KiB
Python

# Copyright 2016 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from oslo_utils import versionutils
from oslo_versionedobjects import fields
from cinder import objects
from cinder.objects import base
@base.CinderObjectRegistry.register
class RequestSpec(base.CinderObject, base.CinderObjectDictCompat,
base.CinderComparableObject):
# Version 1.0: Initial version
# Version 1.1: Added group_id and group_backend
# Version 1.2 Added ``resource_backend``
# Version 1.3: Added backup_id
# Version 1.4: Add 'operation'
# Version 1.5: Added 'availability_zones'
VERSION = '1.5'
fields = {
'consistencygroup_id': fields.UUIDField(nullable=True),
'group_id': fields.UUIDField(nullable=True),
'cgsnapshot_id': fields.UUIDField(nullable=True),
'image_id': fields.UUIDField(nullable=True),
'snapshot_id': fields.UUIDField(nullable=True),
'source_replicaid': fields.UUIDField(nullable=True),
'source_volid': fields.UUIDField(nullable=True),
'volume_id': fields.UUIDField(nullable=True),
'volume': fields.ObjectField('Volume', nullable=True),
'volume_type': fields.ObjectField('VolumeType', nullable=True),
'volume_properties': fields.ObjectField('VolumeProperties',
nullable=True),
'CG_backend': fields.StringField(nullable=True),
'group_backend': fields.StringField(nullable=True),
'resource_backend': fields.StringField(nullable=True),
'backup_id': fields.UUIDField(nullable=True),
'operation': fields.StringField(nullable=True),
'availability_zones': fields.ListOfStringsField(nullable=True),
}
obj_extra_fields = ['resource_properties']
@property
def resource_properties(self):
# TODO(dulek): This is to maintain compatibility with filters from
# oslo-incubator. As we've moved them into our codebase we should adapt
# them to use volume_properties and remove this shim.
return self.volume_properties
@classmethod
def from_primitives(cls, spec):
"""Returns RequestSpec object creating it from legacy dictionary.
FIXME(dulek): This should go away in early O as we stop supporting
backward compatibility with M.
"""
spec = spec.copy()
spec_obj = cls()
vol_props = spec.pop('volume_properties', {})
if vol_props is not None:
vol_props = VolumeProperties(**vol_props)
spec_obj.volume_properties = vol_props
if 'volume' in spec:
vol = spec.pop('volume', {})
vol.pop('name', None)
if vol is not None:
vol = objects.Volume(**vol)
spec_obj.volume = vol
if 'volume_type' in spec:
vol_type = spec.pop('volume_type', {})
if vol_type is not None:
vol_type = objects.VolumeType(**vol_type)
spec_obj.volume_type = vol_type
spec.pop('resource_properties', None)
for k, v in spec.items():
setattr(spec_obj, k, v)
return spec_obj
def obj_make_compatible(self, primitive, target_version):
"""Make an object representation compatible with target version."""
super(RequestSpec, self).obj_make_compatible(primitive, target_version)
target_version = versionutils.convert_version_to_tuple(target_version)
added_fields = (((1, 1), ('group_id', 'group_backend')),
((1, 2), ('resource_backend')),
((1, 3), ('backup_id')),
((1, 4), ('operation')),
((1, 5), ('availability_zones')))
for version, remove_fields in added_fields:
if target_version < version:
for obj_field in remove_fields:
primitive.pop(obj_field, None)
@base.CinderObjectRegistry.register
class VolumeProperties(base.CinderObject, base.CinderObjectDictCompat):
# Version 1.0: Initial version
# Version 1.1: Added group_id and group_type_id
VERSION = '1.1'
# TODO(dulek): We should add this to initially move volume_properites to
# ovo, but this should be removed as soon as possible. Most of the data
# here is already in request_spec and volume there. Outstanding ones would
# be reservation, and qos_specs. First one may be moved to request_spec and
# second added as relationship in volume_type field and whole
# volume_properties (and resource_properties) in request_spec won't be
# needed.
fields = {
'attach_status': fields.StringField(nullable=True),
'availability_zone': fields.StringField(nullable=True),
'cgsnapshot_id': fields.UUIDField(nullable=True),
'consistencygroup_id': fields.UUIDField(nullable=True),
'group_id': fields.UUIDField(nullable=True),
'display_description': fields.StringField(nullable=True),
'display_name': fields.StringField(nullable=True),
'encryption_key_id': fields.UUIDField(nullable=True),
'metadata': fields.DictOfStringsField(nullable=True),
'multiattach': fields.BooleanField(nullable=True),
'project_id': fields.StringField(nullable=True),
'qos_specs': fields.DictOfStringsField(nullable=True),
'replication_status': fields.StringField(nullable=True),
'reservations': fields.ListOfStringsField(nullable=True),
'size': fields.IntegerField(nullable=True),
'snapshot_id': fields.UUIDField(nullable=True),
'source_replicaid': fields.UUIDField(nullable=True),
'source_volid': fields.UUIDField(nullable=True),
'status': fields.StringField(nullable=True),
'user_id': fields.StringField(nullable=True),
'volume_type_id': fields.UUIDField(nullable=True),
'group_type_id': fields.UUIDField(nullable=True),
}