rehome ml2 driver_api
The MechanismDriver is already in neutron-lib [1] and after inspecting other usages [2] it makes sense to move the rest of the driver_api module over. [1] https://review.openstack.org/#/c/428997/ [2] http://codesearch.openstack.org/?q=from%20neutron%5C.plugins%5C.ml2%20import%20driver_api Change-Id: Ifc829953ef4d5859c3475903965dc08aba42fd9c
This commit is contained in:
parent
e68ec1fbf2
commit
d3b88d844d
@ -411,3 +411,753 @@ class MechanismDriver(object):
|
|||||||
(backward compatibility).
|
(backward compatibility).
|
||||||
"""
|
"""
|
||||||
return candidate_hosts
|
return candidate_hosts
|
||||||
|
|
||||||
|
|
||||||
|
@six.add_metaclass(abc.ABCMeta)
|
||||||
|
class _TypeDriverBase(object):
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def get_type(self):
|
||||||
|
"""Get driver's network type.
|
||||||
|
|
||||||
|
:returns: network_type value handled by this driver
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def initialize(self):
|
||||||
|
"""Perform driver initialization.
|
||||||
|
|
||||||
|
Called after all drivers have been loaded and the database has
|
||||||
|
been initialized. No abstract methods defined below will be
|
||||||
|
called prior to this method being called.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def is_partial_segment(self, segment):
|
||||||
|
"""Return True if segment is a partially specified segment.
|
||||||
|
|
||||||
|
:param segment: segment dictionary
|
||||||
|
:returns: boolean
|
||||||
|
"""
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def validate_provider_segment(self, segment):
|
||||||
|
"""Validate attributes of a provider network segment.
|
||||||
|
|
||||||
|
:param segment: segment dictionary using keys defined above
|
||||||
|
:raises: neutron_lib.exceptions.InvalidInput if invalid
|
||||||
|
|
||||||
|
Called outside transaction context to validate the provider
|
||||||
|
attributes for a provider network segment. Raise InvalidInput
|
||||||
|
if:
|
||||||
|
|
||||||
|
- any required attribute is missing
|
||||||
|
- any prohibited or unrecognized attribute is present
|
||||||
|
- any attribute value is not valid
|
||||||
|
|
||||||
|
The network_type attribute is present in segment, but
|
||||||
|
need not be validated.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def get_mtu(self, physical):
|
||||||
|
"""Get driver's network MTU.
|
||||||
|
|
||||||
|
:returns: mtu maximum transmission unit
|
||||||
|
|
||||||
|
Returns the mtu for the network based on the config values and
|
||||||
|
the network type.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@six.add_metaclass(abc.ABCMeta)
|
||||||
|
class TypeDriver(_TypeDriverBase):
|
||||||
|
"""Define abstract interface for ML2 type drivers.
|
||||||
|
|
||||||
|
ML2 type drivers each support a specific network_type for provider
|
||||||
|
and/or tenant network segments. Type drivers must implement this
|
||||||
|
abstract interface, which defines the API by which the plugin uses
|
||||||
|
the driver to manage the persistent type-specific resource
|
||||||
|
allocation state associated with network segments of that type.
|
||||||
|
|
||||||
|
Network segments are represented by segment dictionaries using the
|
||||||
|
NETWORK_TYPE, PHYSICAL_NETWORK, and SEGMENTATION_ID keys defined
|
||||||
|
above, corresponding to the provider attributes. Future revisions
|
||||||
|
of the TypeDriver API may add additional segment dictionary
|
||||||
|
keys. Attributes not applicable for a particular network_type may
|
||||||
|
either be excluded or stored as None.
|
||||||
|
|
||||||
|
TypeDriver passes session as argument for:
|
||||||
|
- reserve_provider_segment
|
||||||
|
- allocate_tenant_segment
|
||||||
|
- release_segment
|
||||||
|
- get_allocation
|
||||||
|
"""
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def reserve_provider_segment(self, session, segment):
|
||||||
|
"""Reserve resource associated with a provider network segment.
|
||||||
|
|
||||||
|
:param session: database session
|
||||||
|
:param segment: segment dictionary
|
||||||
|
:returns: segment dictionary
|
||||||
|
|
||||||
|
Called inside transaction context on session to reserve the
|
||||||
|
type-specific resource for a provider network segment. The
|
||||||
|
segment dictionary passed in was returned by a previous
|
||||||
|
validate_provider_segment() call.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def allocate_tenant_segment(self, session):
|
||||||
|
"""Allocate resource for a new tenant network segment.
|
||||||
|
|
||||||
|
:param session: database session
|
||||||
|
:returns: segment dictionary using keys defined above
|
||||||
|
|
||||||
|
Called inside transaction context on session to allocate a new
|
||||||
|
tenant network, typically from a type-specific resource
|
||||||
|
pool. If successful, return a segment dictionary describing
|
||||||
|
the segment. If tenant network segment cannot be allocated
|
||||||
|
(i.e. tenant networks not supported or resource pool is
|
||||||
|
exhausted), return None.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def release_segment(self, session, segment):
|
||||||
|
"""Release network segment.
|
||||||
|
|
||||||
|
:param session: database session
|
||||||
|
:param segment: segment dictionary using keys defined above
|
||||||
|
|
||||||
|
Called inside transaction context on session to release a
|
||||||
|
tenant or provider network's type-specific resource. Runtime
|
||||||
|
errors are not expected, but raising an exception will result
|
||||||
|
in rollback of the transaction.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@six.add_metaclass(abc.ABCMeta)
|
||||||
|
class ML2TypeDriver(_TypeDriverBase):
|
||||||
|
"""Define abstract interface for ML2 type drivers.
|
||||||
|
|
||||||
|
ML2 type drivers each support a specific network_type for provider
|
||||||
|
and/or tenant network segments. Type drivers must implement this
|
||||||
|
abstract interface, which defines the API by which the plugin uses
|
||||||
|
the driver to manage the persistent type-specific resource
|
||||||
|
allocation state associated with network segments of that type.
|
||||||
|
|
||||||
|
Network segments are represented by segment dictionaries using the
|
||||||
|
NETWORK_TYPE, PHYSICAL_NETWORK, and SEGMENTATION_ID keys defined
|
||||||
|
above, corresponding to the provider attributes. Future revisions
|
||||||
|
of the TypeDriver API may add additional segment dictionary
|
||||||
|
keys. Attributes not applicable for a particular network_type may
|
||||||
|
either be excluded or stored as None.
|
||||||
|
|
||||||
|
ML2TypeDriver passes context as argument for:
|
||||||
|
- reserve_provider_segment
|
||||||
|
- allocate_tenant_segment
|
||||||
|
- release_segment
|
||||||
|
- get_allocation
|
||||||
|
"""
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def reserve_provider_segment(self, context, segment):
|
||||||
|
"""Reserve resource associated with a provider network segment.
|
||||||
|
|
||||||
|
:param context: instance of neutron context with DB session
|
||||||
|
:param segment: segment dictionary
|
||||||
|
:returns: segment dictionary
|
||||||
|
|
||||||
|
Called inside transaction context on session to reserve the
|
||||||
|
type-specific resource for a provider network segment. The
|
||||||
|
segment dictionary passed in was returned by a previous
|
||||||
|
validate_provider_segment() call.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def allocate_tenant_segment(self, context):
|
||||||
|
"""Allocate resource for a new tenant network segment.
|
||||||
|
|
||||||
|
:param context: instance of neutron context with DB session
|
||||||
|
:returns: segment dictionary using keys defined above
|
||||||
|
|
||||||
|
Called inside transaction context on session to allocate a new
|
||||||
|
tenant network, typically from a type-specific resource
|
||||||
|
pool. If successful, return a segment dictionary describing
|
||||||
|
the segment. If tenant network segment cannot be allocated
|
||||||
|
(i.e. tenant networks not supported or resource pool is
|
||||||
|
exhausted), return None.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def release_segment(self, context, segment):
|
||||||
|
"""Release network segment.
|
||||||
|
|
||||||
|
:param context: instance of neutron context with DB session
|
||||||
|
:param segment: segment dictionary using keys defined above
|
||||||
|
|
||||||
|
Called inside transaction context on session to release a
|
||||||
|
tenant or provider network's type-specific resource. Runtime
|
||||||
|
errors are not expected, but raising an exception will result
|
||||||
|
in rollback of the transaction.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@six.add_metaclass(abc.ABCMeta)
|
||||||
|
class NetworkContext(object):
|
||||||
|
"""Context passed to MechanismDrivers for changes to network resources.
|
||||||
|
|
||||||
|
A NetworkContext instance wraps a network resource. It provides
|
||||||
|
helper methods for accessing other relevant information. Results
|
||||||
|
from expensive operations are cached so that other
|
||||||
|
MechanismDrivers can freely access the same information.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def current(self):
|
||||||
|
"""Return the network in its current configuration.
|
||||||
|
|
||||||
|
Return the network, as defined by NeutronPluginBaseV2.
|
||||||
|
create_network and all extensions in the ml2 plugin, with
|
||||||
|
all its properties 'current' at the time the context was
|
||||||
|
established.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def original(self):
|
||||||
|
"""Return the network in its original configuration.
|
||||||
|
|
||||||
|
Return the network, with all its properties set to their
|
||||||
|
original values prior to a call to update_network. Method is
|
||||||
|
only valid within calls to update_network_precommit and
|
||||||
|
update_network_postcommit.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def network_segments(self):
|
||||||
|
"""Return the segments associated with this network resource."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@six.add_metaclass(abc.ABCMeta)
|
||||||
|
class SubnetContext(object):
|
||||||
|
"""Context passed to MechanismDrivers for changes to subnet resources.
|
||||||
|
|
||||||
|
A SubnetContext instance wraps a subnet resource. It provides
|
||||||
|
helper methods for accessing other relevant information. Results
|
||||||
|
from expensive operations are cached so that other
|
||||||
|
MechanismDrivers can freely access the same information.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def current(self):
|
||||||
|
"""Return the subnet in its current configuration.
|
||||||
|
|
||||||
|
Return the subnet, as defined by NeutronPluginBaseV2.
|
||||||
|
create_subnet and all extensions in the ml2 plugin, with
|
||||||
|
all its properties 'current' at the time the context was
|
||||||
|
established.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def original(self):
|
||||||
|
"""Return the subnet in its original configuration.
|
||||||
|
|
||||||
|
Return the subnet, with all its properties set to their
|
||||||
|
original values prior to a call to update_subnet. Method is
|
||||||
|
only valid within calls to update_subnet_precommit and
|
||||||
|
update_subnet_postcommit.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@six.add_metaclass(abc.ABCMeta)
|
||||||
|
class PortContext(object):
|
||||||
|
"""Context passed to MechanismDrivers for changes to port resources.
|
||||||
|
|
||||||
|
A PortContext instance wraps a port resource. It provides helper
|
||||||
|
methods for accessing other relevant information. Results from
|
||||||
|
expensive operations are cached so that other MechanismDrivers can
|
||||||
|
freely access the same information.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def current(self):
|
||||||
|
"""Return the port in its current configuration.
|
||||||
|
|
||||||
|
Return the port, as defined by NeutronPluginBaseV2.
|
||||||
|
create_port and all extensions in the ml2 plugin, with
|
||||||
|
all its properties 'current' at the time the context was
|
||||||
|
established.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def original(self):
|
||||||
|
"""Return the port in its original configuration.
|
||||||
|
|
||||||
|
Return the port, with all its properties set to their
|
||||||
|
original values prior to a call to update_port. Method is
|
||||||
|
only valid within calls to update_port_precommit and
|
||||||
|
update_port_postcommit.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def status(self):
|
||||||
|
"""Return the status of the current port."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def original_status(self):
|
||||||
|
"""Return the status of the original port.
|
||||||
|
|
||||||
|
The method is only valid within calls to update_port_precommit and
|
||||||
|
update_port_postcommit.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def network(self):
|
||||||
|
"""Return the NetworkContext associated with this port."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def binding_levels(self):
|
||||||
|
"""Return dictionaries describing the current binding levels.
|
||||||
|
|
||||||
|
This property returns a list of dictionaries describing each
|
||||||
|
binding level if the port is bound or partially bound, or None
|
||||||
|
if the port is unbound. Each returned dictionary contains the
|
||||||
|
name of the bound driver under the BOUND_DRIVER key, and the
|
||||||
|
bound segment dictionary under the BOUND_SEGMENT key.
|
||||||
|
|
||||||
|
The first entry (index 0) describes the top-level binding,
|
||||||
|
which always involves one of the port's network's static
|
||||||
|
segments. In the case of a hierarchical binding, subsequent
|
||||||
|
entries describe the lower-level bindings in descending order,
|
||||||
|
which may involve dynamic segments. Adjacent levels where
|
||||||
|
different drivers bind the same static or dynamic segment are
|
||||||
|
possible. The last entry (index -1) describes the bottom-level
|
||||||
|
binding that supplied the port's binding:vif_type and
|
||||||
|
binding:vif_details attribute values.
|
||||||
|
|
||||||
|
Within calls to MechanismDriver.bind_port, descriptions of the
|
||||||
|
levels above the level currently being bound are returned.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def original_binding_levels(self):
|
||||||
|
"""Return dictionaries describing the original binding levels.
|
||||||
|
|
||||||
|
This property returns a list of dictionaries describing each
|
||||||
|
original binding level if the port was previously bound, or
|
||||||
|
None if the port was unbound. The content is as described for
|
||||||
|
the binding_levels property.
|
||||||
|
|
||||||
|
This property is only valid within calls to
|
||||||
|
update_port_precommit and update_port_postcommit. It returns
|
||||||
|
None otherwise.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def top_bound_segment(self):
|
||||||
|
"""Return the current top-level bound segment dictionary.
|
||||||
|
|
||||||
|
This property returns the current top-level bound segment
|
||||||
|
dictionary, or None if the port is unbound. For a bound port,
|
||||||
|
top_bound_segment is equivalent to
|
||||||
|
binding_levels[0][BOUND_SEGMENT], and returns one of the
|
||||||
|
port's network's static segments.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def original_top_bound_segment(self):
|
||||||
|
"""Return the original top-level bound segment dictionary.
|
||||||
|
|
||||||
|
This property returns the original top-level bound segment
|
||||||
|
dictionary, or None if the port was previously unbound. For a
|
||||||
|
previously bound port, original_top_bound_segment is
|
||||||
|
equivalent to original_binding_levels[0][BOUND_SEGMENT], and
|
||||||
|
returns one of the port's network's static segments.
|
||||||
|
|
||||||
|
This property is only valid within calls to
|
||||||
|
update_port_precommit and update_port_postcommit. It returns
|
||||||
|
None otherwise.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def bottom_bound_segment(self):
|
||||||
|
"""Return the current bottom-level bound segment dictionary.
|
||||||
|
|
||||||
|
This property returns the current bottom-level bound segment
|
||||||
|
dictionary, or None if the port is unbound. For a bound port,
|
||||||
|
bottom_bound_segment is equivalent to
|
||||||
|
binding_levels[-1][BOUND_SEGMENT], and returns the segment
|
||||||
|
whose binding supplied the port's binding:vif_type and
|
||||||
|
binding:vif_details attribute values.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def original_bottom_bound_segment(self):
|
||||||
|
"""Return the original bottom-level bound segment dictionary.
|
||||||
|
|
||||||
|
This property returns the original bottom-level bound segment
|
||||||
|
dictionary, or None if the port was previously unbound. For a
|
||||||
|
previously bound port, original_bottom_bound_segment is
|
||||||
|
equivalent to original_binding_levels[-1][BOUND_SEGMENT], and
|
||||||
|
returns the segment whose binding supplied the port's previous
|
||||||
|
binding:vif_type and binding:vif_details attribute values.
|
||||||
|
|
||||||
|
This property is only valid within calls to
|
||||||
|
update_port_precommit and update_port_postcommit. It returns
|
||||||
|
None otherwise.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def host(self):
|
||||||
|
"""Return the host with which the port is associated.
|
||||||
|
|
||||||
|
In the context of a host-specific operation on a distributed
|
||||||
|
port, the host property indicates the host for which the port
|
||||||
|
operation is being performed. Otherwise, it is the same value
|
||||||
|
as current['binding:host_id'].
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def original_host(self):
|
||||||
|
"""Return the original host with which the port was associated.
|
||||||
|
|
||||||
|
In the context of a host-specific operation on a distributed
|
||||||
|
port, the original_host property indicates the host for which
|
||||||
|
the port operation is being performed. Otherwise, it is the
|
||||||
|
same value as original['binding:host_id'].
|
||||||
|
|
||||||
|
This property is only valid within calls to
|
||||||
|
update_port_precommit and update_port_postcommit. It returns
|
||||||
|
None otherwise.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def vif_type(self):
|
||||||
|
"""Return the vif_type indicating the binding state of the port.
|
||||||
|
|
||||||
|
In the context of a host-specific operation on a distributed
|
||||||
|
port, the vif_type property indicates the binding state for
|
||||||
|
the host for which the port operation is being
|
||||||
|
performed. Otherwise, it is the same value as
|
||||||
|
current['binding:vif_type'].
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def original_vif_type(self):
|
||||||
|
"""Return the original vif_type of the port.
|
||||||
|
|
||||||
|
In the context of a host-specific operation on a distributed
|
||||||
|
port, the original_vif_type property indicates original
|
||||||
|
binding state for the host for which the port operation is
|
||||||
|
being performed. Otherwise, it is the same value as
|
||||||
|
original['binding:vif_type'].
|
||||||
|
|
||||||
|
This property is only valid within calls to
|
||||||
|
update_port_precommit and update_port_postcommit. It returns
|
||||||
|
None otherwise.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def vif_details(self):
|
||||||
|
"""Return the vif_details describing the binding of the port.
|
||||||
|
|
||||||
|
In the context of a host-specific operation on a distributed
|
||||||
|
port, the vif_details property describes the binding for the
|
||||||
|
host for which the port operation is being
|
||||||
|
performed. Otherwise, it is the same value as
|
||||||
|
current['binding:vif_details'].
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def original_vif_details(self):
|
||||||
|
"""Return the original vif_details of the port.
|
||||||
|
|
||||||
|
In the context of a host-specific operation on a distributed
|
||||||
|
port, the original_vif_details property describes the original
|
||||||
|
binding for the host for which the port operation is being
|
||||||
|
performed. Otherwise, it is the same value as
|
||||||
|
original['binding:vif_details'].
|
||||||
|
|
||||||
|
This property is only valid within calls to
|
||||||
|
update_port_precommit and update_port_postcommit. It returns
|
||||||
|
None otherwise.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractproperty
|
||||||
|
def segments_to_bind(self):
|
||||||
|
"""Return the list of segments with which to bind the port.
|
||||||
|
|
||||||
|
This property returns the list of segment dictionaries with
|
||||||
|
which the mechanism driver may bind the port. When
|
||||||
|
establishing a top-level binding, these will be the port's
|
||||||
|
network's static segments. For each subsequent level, these
|
||||||
|
will be the segments passed to continue_binding by the
|
||||||
|
mechanism driver that bound the level above.
|
||||||
|
|
||||||
|
This property is only valid within calls to
|
||||||
|
MechanismDriver.bind_port. It returns None otherwise.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def host_agents(self, agent_type):
|
||||||
|
"""Get agents of the specified type on port's host.
|
||||||
|
|
||||||
|
:param agent_type: Agent type identifier
|
||||||
|
:returns: List of neutron.db.models.agent.Agent records
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def set_binding(self, segment_id, vif_type, vif_details,
|
||||||
|
status=None):
|
||||||
|
"""Set the bottom-level binding for the port.
|
||||||
|
|
||||||
|
:param segment_id: Network segment bound for the port.
|
||||||
|
:param vif_type: The VIF type for the bound port.
|
||||||
|
:param vif_details: Dictionary with details for VIF driver.
|
||||||
|
:param status: Port status to set if not None.
|
||||||
|
|
||||||
|
This method is called by MechanismDriver.bind_port to indicate
|
||||||
|
success and specify binding details to use for port. The
|
||||||
|
segment_id must identify an item in the current value of the
|
||||||
|
segments_to_bind property.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def continue_binding(self, segment_id, next_segments_to_bind):
|
||||||
|
"""Continue binding the port with different segments.
|
||||||
|
|
||||||
|
:param segment_id: Network segment partially bound for the port.
|
||||||
|
:param next_segments_to_bind: Segments to continue binding with.
|
||||||
|
|
||||||
|
This method is called by MechanismDriver.bind_port to indicate
|
||||||
|
it was able to partially bind the port, but that one or more
|
||||||
|
additional mechanism drivers are required to complete the
|
||||||
|
binding. The segment_id must identify an item in the current
|
||||||
|
value of the segments_to_bind property. The list of segments
|
||||||
|
IDs passed as next_segments_to_bind identify dynamic (or
|
||||||
|
static) segments of the port's network that will be used to
|
||||||
|
populate segments_to_bind for the next lower level of a
|
||||||
|
hierarchical binding.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def allocate_dynamic_segment(self, segment):
|
||||||
|
"""Allocate a dynamic segment.
|
||||||
|
|
||||||
|
:param segment: A partially or fully specified segment dictionary
|
||||||
|
|
||||||
|
Called by the MechanismDriver.bind_port, create_port or update_port
|
||||||
|
to dynamically allocate a segment for the port using the partial
|
||||||
|
segment specified. The segment dictionary can be a fully or partially
|
||||||
|
specified segment. At a minimum it needs the network_type populated to
|
||||||
|
call on the appropriate type driver.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def release_dynamic_segment(self, segment_id):
|
||||||
|
"""Release an allocated dynamic segment.
|
||||||
|
|
||||||
|
:param segment_id: UUID of the dynamic network segment.
|
||||||
|
|
||||||
|
Called by the MechanismDriver.delete_port or update_port to release
|
||||||
|
the dynamic segment allocated for this port.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@six.add_metaclass(abc.ABCMeta)
|
||||||
|
class ExtensionDriver(object):
|
||||||
|
"""Define stable abstract interface for ML2 extension drivers.
|
||||||
|
|
||||||
|
An extension driver extends the core resources implemented by the
|
||||||
|
ML2 plugin with additional attributes. Methods that process create
|
||||||
|
and update operations for these resources validate and persist
|
||||||
|
values for extended attributes supplied through the API. Other
|
||||||
|
methods extend the resource dictionaries returned from the API
|
||||||
|
operations with the values of the extended attributes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def initialize(self):
|
||||||
|
"""Perform driver initialization.
|
||||||
|
|
||||||
|
Called after all drivers have been loaded and the database has
|
||||||
|
been initialized. No abstract methods defined below will be
|
||||||
|
called prior to this method being called.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@property
|
||||||
|
def extension_alias(self):
|
||||||
|
"""Supported extension alias.
|
||||||
|
|
||||||
|
Return the alias identifying the core API extension supported
|
||||||
|
by this driver. Do not declare if API extension handling will
|
||||||
|
be left to a service plugin, and we just need to provide
|
||||||
|
core resource extension and updates.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def process_create_network(self, plugin_context, data, result):
|
||||||
|
"""Process extended attributes for create network.
|
||||||
|
|
||||||
|
:param plugin_context: plugin request context
|
||||||
|
:param data: dictionary of incoming network data
|
||||||
|
:param result: network dictionary to extend
|
||||||
|
|
||||||
|
Called inside transaction context on plugin_context.session to
|
||||||
|
validate and persist any extended network attributes defined by this
|
||||||
|
driver. Extended attribute values must also be added to
|
||||||
|
result.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def process_create_subnet(self, plugin_context, data, result):
|
||||||
|
"""Process extended attributes for create subnet.
|
||||||
|
|
||||||
|
:param plugin_context: plugin request context
|
||||||
|
:param data: dictionary of incoming subnet data
|
||||||
|
:param result: subnet dictionary to extend
|
||||||
|
|
||||||
|
Called inside transaction context on plugin_context.session to
|
||||||
|
validate and persist any extended subnet attributes defined by this
|
||||||
|
driver. Extended attribute values must also be added to
|
||||||
|
result.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def process_create_port(self, plugin_context, data, result):
|
||||||
|
"""Process extended attributes for create port.
|
||||||
|
|
||||||
|
:param plugin_context: plugin request context
|
||||||
|
:param data: dictionary of incoming port data
|
||||||
|
:param result: port dictionary to extend
|
||||||
|
|
||||||
|
Called inside transaction context on plugin_context.session to
|
||||||
|
validate and persist any extended port attributes defined by this
|
||||||
|
driver. Extended attribute values must also be added to
|
||||||
|
result.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def process_update_network(self, plugin_context, data, result):
|
||||||
|
"""Process extended attributes for update network.
|
||||||
|
|
||||||
|
:param plugin_context: plugin request context
|
||||||
|
:param data: dictionary of incoming network data
|
||||||
|
:param result: network dictionary to extend
|
||||||
|
|
||||||
|
Called inside transaction context on plugin_context.session to
|
||||||
|
validate and update any extended network attributes defined by this
|
||||||
|
driver. Extended attribute values, whether updated or not,
|
||||||
|
must also be added to result.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def process_update_subnet(self, plugin_context, data, result):
|
||||||
|
"""Process extended attributes for update subnet.
|
||||||
|
|
||||||
|
:param plugin_context: plugin request context
|
||||||
|
:param data: dictionary of incoming subnet data
|
||||||
|
:param result: subnet dictionary to extend
|
||||||
|
|
||||||
|
Called inside transaction context on plugin_context.session to
|
||||||
|
validate and update any extended subnet attributes defined by this
|
||||||
|
driver. Extended attribute values, whether updated or not,
|
||||||
|
must also be added to result.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def process_update_port(self, plugin_context, data, result):
|
||||||
|
"""Process extended attributes for update port.
|
||||||
|
|
||||||
|
:param plugin_context: plugin request context
|
||||||
|
:param data: dictionary of incoming port data
|
||||||
|
:param result: port dictionary to extend
|
||||||
|
|
||||||
|
Called inside transaction context on plugin_context.session to
|
||||||
|
validate and update any extended port attributes defined by this
|
||||||
|
driver. Extended attribute values, whether updated or not,
|
||||||
|
must also be added to result.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def extend_network_dict(self, session, base_model, result):
|
||||||
|
"""Add extended attributes to network dictionary.
|
||||||
|
|
||||||
|
:param session: database session
|
||||||
|
:param base_model: network model data
|
||||||
|
:param result: network dictionary to extend
|
||||||
|
|
||||||
|
Called inside transaction context on session to add any
|
||||||
|
extended attributes defined by this driver to a network
|
||||||
|
dictionary to be used for mechanism driver calls and/or
|
||||||
|
returned as the result of a network operation.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def extend_subnet_dict(self, session, base_model, result):
|
||||||
|
"""Add extended attributes to subnet dictionary.
|
||||||
|
|
||||||
|
:param session: database session
|
||||||
|
:param base_model: subnet model data
|
||||||
|
:param result: subnet dictionary to extend
|
||||||
|
|
||||||
|
Called inside transaction context on session to add any
|
||||||
|
extended attributes defined by this driver to a subnet
|
||||||
|
dictionary to be used for mechanism driver calls and/or
|
||||||
|
returned as the result of a subnet operation.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def extend_port_dict(self, session, base_model, result):
|
||||||
|
"""Add extended attributes to port dictionary.
|
||||||
|
|
||||||
|
:param session: database session
|
||||||
|
:param base_model: port model data
|
||||||
|
:param result: port dictionary to extend
|
||||||
|
|
||||||
|
Called inside transaction context on session to add any
|
||||||
|
extended attributes defined by this driver to a port
|
||||||
|
dictionary to be used for mechanism driver calls
|
||||||
|
and/or returned as the result of a port operation.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- The public APIs from ``neutron.plugins.ml2.driver_api`` are now in
|
||||||
|
``neutron_lib.plugins.ml2.api``.
|
Loading…
Reference in New Issue
Block a user