9686110d53
When a compute service is allocating ports with the network service, it needs to pass across information about the capabilities of the compute host. Currently each plugin provides information about its own capabilities. This introduces a ComputeInfo class which, initially, just contains a dict of PluginInfo classes. With this change, there is a versioning constraint between the compute and network hosts. The compute host must not pass the network host a ComputeInfo object with a version that the network host is unable to deserialize(). This implies that as a general rule the version of os-vif on the network host must be at least as new as the version on the compute hosts. During a live upgrade, the network hosts must be upgraded before the compute hosts. Change-Id: I7b51c97b5e03ffa51a56ceb3d4f97e188508379d
120 lines
3.7 KiB
Python
120 lines
3.7 KiB
Python
# 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_versionedobjects import base
|
|
from oslo_versionedobjects import fields
|
|
|
|
from os_vif import exception
|
|
from os_vif.objects import base as osv_base
|
|
|
|
|
|
@base.VersionedObjectRegistry.register
|
|
class HostVIFInfo(osv_base.VersionedObject, base.ComparableVersionedObject):
|
|
"""
|
|
Class describing a VIF class and its supported versions
|
|
"""
|
|
|
|
VERSION = "1.0"
|
|
|
|
fields = {
|
|
# object name of the subclass of os_vif.objects.vif.VIF
|
|
"vif_object_name": fields.StringField(),
|
|
|
|
# String representing the earliest version of @name
|
|
# that the plugin understands
|
|
"min_version": fields.StringField(),
|
|
|
|
# String representing the latest version of @name
|
|
# that the plugin understands
|
|
"max_version": fields.StringField(),
|
|
}
|
|
|
|
def get_common_version(self):
|
|
def _vers_tuple(ver):
|
|
return tuple([int(x) for x in ver.split(".")])
|
|
|
|
reg = base.VersionedObjectRegistry.obj_classes()
|
|
|
|
if self.name not in reg:
|
|
raise exception.NoMatchingVIFClass(vif_name=self.name)
|
|
|
|
gotvers = []
|
|
for regobj in reg[self.name]:
|
|
gotvers.append(regobj.VERSION)
|
|
got = _vers_tuple(regobj.VERSION)
|
|
minwant = _vers_tuple(self.min_version)
|
|
maxwant = _vers_tuple(self.max_version)
|
|
|
|
if got >= minwant and got <= maxwant:
|
|
return regobj.VERSION
|
|
|
|
raise exception.NoSupportedVIFVersion(vif_name=self.name,
|
|
got_versions=",".join(gotvers),
|
|
min_version=self.min_version,
|
|
max_version=self.max_version)
|
|
|
|
|
|
@base.VersionedObjectRegistry.register
|
|
class HostPluginInfo(osv_base.VersionedObject,
|
|
base.ComparableVersionedObject):
|
|
"""
|
|
Class describing a plugin and its supported VIF classes
|
|
"""
|
|
|
|
VERSION = "1.0"
|
|
|
|
fields = {
|
|
# name of the plugin
|
|
"plugin_name": fields.StringField(),
|
|
|
|
# list of HostVIFInfo instances supported by the plugin
|
|
"vif_info": fields.ListOfObjectsField("HostVIFInfo"),
|
|
}
|
|
|
|
def has_vif(self, name):
|
|
for vif in self.vif_info:
|
|
if vif.name == name:
|
|
return True
|
|
return False
|
|
|
|
def get_vif(self, name):
|
|
for vif in self.vif_info:
|
|
if vif.name == name:
|
|
return vif
|
|
|
|
raise exception.NoMatchingVIFClass(vif_name=name)
|
|
|
|
|
|
@base.VersionedObjectRegistry.register
|
|
class HostInfo(osv_base.VersionedObject, base.ComparableVersionedObject):
|
|
"""
|
|
Class describing a host host and its supported plugin classes
|
|
"""
|
|
|
|
fields = {
|
|
# list of HostPluginInfo instances supported by the host host
|
|
"plugin_info": fields.ListOfObjectsField("HostPluginInfo"),
|
|
}
|
|
|
|
def has_plugin(self, name):
|
|
for plugin in self.plugin_info:
|
|
if name == plugin.name:
|
|
return True
|
|
return False
|
|
|
|
def get_plugin(self, name):
|
|
for plugin in self.plugin_info:
|
|
if name == plugin.name:
|
|
return plugin
|
|
|
|
raise exception.NoMatchingPlugin(plugin_name=name)
|