616 lines
23 KiB
Python
616 lines
23 KiB
Python
# Copyright (c) 2016 Cisco Systems Inc.
|
|
# All Rights Reserved.
|
|
#
|
|
# 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.
|
|
|
|
import abc
|
|
import six
|
|
|
|
from neutron_lib.plugins.ml2 import api as driver_api
|
|
|
|
BULK_EXTENDED = 'ml2plus:_bulk_extended'
|
|
|
|
|
|
@six.add_metaclass(abc.ABCMeta)
|
|
class SubnetPoolContext(object):
|
|
"""Context passed to MechanismDrivers for changes to subnet pool
|
|
resources.
|
|
|
|
A SubnetPoolContext instance wraps a subnet pool 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 pool in its current configuration.
|
|
|
|
Return the subnet pool with all its properties 'current' at
|
|
the time the context was established.
|
|
"""
|
|
pass
|
|
|
|
@abc.abstractproperty
|
|
def original(self):
|
|
"""Return the subnet pool in its original configuration.
|
|
|
|
Return the subnet pool, with all its properties set to their
|
|
original values prior to a call to update_address_scope. Method is
|
|
only valid within calls to update_address_scope_precommit and
|
|
update_address_scope_postcommit.
|
|
"""
|
|
pass
|
|
|
|
|
|
@six.add_metaclass(abc.ABCMeta)
|
|
class AddressScopeContext(object):
|
|
"""Context passed to MechanismDrivers for changes to address scope
|
|
resources.
|
|
|
|
An AddressScopeContext instance wraps an address scope
|
|
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 address scope in its current configuration.
|
|
|
|
Return the address scope with all its properties 'current' at
|
|
the time the context was established.
|
|
"""
|
|
pass
|
|
|
|
@abc.abstractproperty
|
|
def original(self):
|
|
"""Return the address scope in its original configuration.
|
|
|
|
Return the address scope, with all its properties set to their
|
|
original values prior to a call to update_address_scope. Method is
|
|
only valid within calls to update_address_scope_precommit and
|
|
update_address_scope_postcommit.
|
|
"""
|
|
pass
|
|
|
|
|
|
@six.add_metaclass(abc.ABCMeta)
|
|
class SecurityGroupContext(object):
|
|
"""Context passed to MechanismDrivers for changes to security group
|
|
resources.
|
|
|
|
A SecurityGroupContext instance wraps a security group
|
|
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 security group in its current configuration.
|
|
|
|
Return the security group with all its properties 'current' at
|
|
the time the context was established.
|
|
"""
|
|
pass
|
|
|
|
@abc.abstractproperty
|
|
def original(self):
|
|
"""Return the security group in its original configuration.
|
|
|
|
Return the security group, with all its properties set to their
|
|
original values prior to a call to update_security_group. Method is
|
|
only valid within calls to update_security_group_precommit and
|
|
update_security_group_postcommit.
|
|
"""
|
|
pass
|
|
|
|
|
|
@six.add_metaclass(abc.ABCMeta)
|
|
class SecurityGroupRuleContext(object):
|
|
"""Context passed to MechanismDrivers for changes to security group
|
|
rule resources.
|
|
|
|
A SecurityGroupRuleContext instance wraps a security group rule
|
|
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 security group rule in its current configuration.
|
|
|
|
Return the security group rule with all its properties 'current' at
|
|
the time the context was established.
|
|
"""
|
|
pass
|
|
|
|
@abc.abstractproperty
|
|
def original(self):
|
|
"""Return the security group rule in its original configuration.
|
|
|
|
Return the security group rule, with all its properties set to their
|
|
original values prior to a call to update_security_group. Method is
|
|
only valid within calls to update_security_group_rule_precommit and
|
|
update_security_group_rule_postcommit.
|
|
"""
|
|
pass
|
|
|
|
|
|
@six.add_metaclass(abc.ABCMeta)
|
|
class MechanismDriver(driver_api.MechanismDriver):
|
|
|
|
def start_rpc_listeners(self):
|
|
"""Start driver-specify RPC listeners.
|
|
|
|
If any driver-specific RPC listeners are needed, create an RPC
|
|
connection, create the consumers, call consume_in_threads() on
|
|
the connection, and return the resulting list of servers.
|
|
"""
|
|
return []
|
|
|
|
# REVISIT(rkukura): Is this needed for all operations, or just for
|
|
# create operations? If its needed for all operations, should the
|
|
# method be specific to the resource and operation, and include
|
|
# the request data (i.e. update_network_pretransaction(self,
|
|
# data))?
|
|
def ensure_tenant(self, plugin_context, tenant_id):
|
|
"""Ensure tenant known before creating resource.
|
|
|
|
:param plugin_context: Plugin request context.
|
|
:param tenant_id: Tenant owning resource about to be created.
|
|
|
|
Called before the start of a transaction creating any new core
|
|
resource, allowing any needed tenant-specific processing to be
|
|
performed.
|
|
"""
|
|
pass
|
|
|
|
def create_subnetpool_precommit(self, context):
|
|
"""Allocate resources for a new subnet pool.
|
|
|
|
:param context: SubnetPoolContext instance describing the new
|
|
subnet pool.
|
|
|
|
Create a new subnet pool, allocating resources as necessary in
|
|
the database. Called inside transaction context on
|
|
session. Call cannot block. Raising an exception will result
|
|
in a rollback of the current transaction.
|
|
"""
|
|
pass
|
|
|
|
def create_subnetpool_postcommit(self, context):
|
|
"""Create a subnet pool.
|
|
|
|
:param context: SubnetPoolContext instance describing the new
|
|
subnet pool.
|
|
|
|
Called after the transaction commits. Call can block, though
|
|
will block the entire process so care should be taken to not
|
|
drastically affect performance. Raising an exception will
|
|
cause the deletion of the resource.
|
|
"""
|
|
pass
|
|
|
|
def update_subnetpool_precommit(self, context):
|
|
"""Update resources of a subnet pool.
|
|
|
|
:param context: SubnetPoolContext instance describing the new
|
|
state of the subnet pool, as well as the original state prior
|
|
to the update_subnetpool call.
|
|
|
|
Update values of a subnet pool, updating the associated
|
|
resources in the database. Called inside transaction context
|
|
on session. Raising an exception will result in rollback of
|
|
the transaction.
|
|
|
|
update_subnetpool_precommit is called for all changes to the
|
|
subnet pool state. It is up to the mechanism driver to ignore
|
|
state or state changes that it does not know or care about.
|
|
"""
|
|
pass
|
|
|
|
def update_subnetpool_postcommit(self, context):
|
|
"""Update a subnet pool.
|
|
|
|
:param context: SubnetPoolContext instance describing the new
|
|
state of the subnet pool, as well as the original state prior
|
|
to the update_subnetpool call.
|
|
|
|
Called after the transaction commits. Call can block, though
|
|
will block the entire process so care should be taken to not
|
|
drastically affect performance. Raising an exception will
|
|
cause the deletion of the resource.
|
|
|
|
update_subnetpool_postcommit is called for all changes to the
|
|
subnet pool state. It is up to the mechanism driver to ignore
|
|
state or state changes that it does not know or care about.
|
|
"""
|
|
pass
|
|
|
|
def delete_subnetpool_precommit(self, context):
|
|
"""Delete resources for a subnet pool.
|
|
|
|
:param context: SubnetPoolContext instance describing the
|
|
current state of the subnet pool, prior to the call to delete
|
|
it.
|
|
|
|
Delete subnet pool resources previously allocated by this
|
|
mechanism driver for a subnet pool. Called inside transaction
|
|
context on session. Runtime errors are not expected, but
|
|
raising an exception will result in rollback of the
|
|
transaction.
|
|
"""
|
|
pass
|
|
|
|
def delete_subnetpool_postcommit(self, context):
|
|
"""Delete a subnet pool.
|
|
|
|
:param context: SubnetPoolContext instance describing the
|
|
current state of the subnet pool, prior to the call to delete
|
|
it.
|
|
|
|
Called after the transaction commits. Call can block, though
|
|
will block the entire process so care should be taken to not
|
|
drastically affect performance. Runtime errors are not
|
|
expected, and will not prevent the resource from being
|
|
deleted.
|
|
"""
|
|
pass
|
|
|
|
def create_address_scope_precommit(self, context):
|
|
"""Allocate resources for a new address scope.
|
|
|
|
:param context: AddressScopeContext instance describing the
|
|
new address scope.
|
|
|
|
Create a new address scope, allocating resources as necessary
|
|
in the database. Called inside transaction context on
|
|
session. Call cannot block. Raising an exception will result
|
|
in a rollback of the current transaction.
|
|
"""
|
|
pass
|
|
|
|
def create_address_scope_postcommit(self, context):
|
|
"""Create an address scope.
|
|
|
|
:param context: AddressScopeContext instance describing the
|
|
new address scope.
|
|
|
|
Called after the transaction commits. Call can block, though
|
|
will block the entire process so care should be taken to not
|
|
drastically affect performance. Raising an exception will
|
|
cause the deletion of the resource.
|
|
"""
|
|
pass
|
|
|
|
def update_address_scope_precommit(self, context):
|
|
"""Update resources of an address scope.
|
|
|
|
:param context: AddressScopeContext instance describing the
|
|
new state of the address scope, as well as the original state
|
|
prior to the update_address_scope call.
|
|
|
|
Update values of an address scope, updating the associated
|
|
resources in the database. Called inside transaction context
|
|
on session. Raising an exception will result in rollback of
|
|
the transaction.
|
|
|
|
update_address_scope_precommit is called for all changes to
|
|
the address scope state. It is up to the mechanism driver to
|
|
ignore state or state changes that it does not know or care
|
|
about.
|
|
"""
|
|
pass
|
|
|
|
def update_address_scope_postcommit(self, context):
|
|
"""Update an address scope.
|
|
|
|
:param context: AddressScopeContext instance describing the
|
|
new state of the address scope, as well as the original state
|
|
prior to the update_address_scope call.
|
|
|
|
Called after the transaction commits. Call can block, though
|
|
will block the entire process so care should be taken to not
|
|
drastically affect performance. Raising an exception will
|
|
cause the deletion of the resource.
|
|
|
|
update_address_scope_postcommit is called for all changes to
|
|
the address scope state. It is up to the mechanism driver to
|
|
ignore state or state changes that it does not know or care
|
|
about.
|
|
"""
|
|
pass
|
|
|
|
def delete_address_scope_precommit(self, context):
|
|
"""Delete resources for an address scope.
|
|
|
|
:param context: AddressScopeContext instance describing the
|
|
current state of the address scope, prior to the call to
|
|
delete it.
|
|
|
|
Delete address scope resources previously allocated by this
|
|
mechanism driver for an address scope. Called inside
|
|
transaction context on session. Runtime errors are not
|
|
expected, but raising an exception will result in rollback of
|
|
the transaction.
|
|
"""
|
|
pass
|
|
|
|
def delete_address_scope_postcommit(self, context):
|
|
"""Delete an address scope.
|
|
|
|
:param context: AddressScopeContext instance describing the
|
|
current state of the address scope, prior to the call to
|
|
delete it.
|
|
|
|
Called after the transaction commits. Call can block, though
|
|
will block the entire process so care should be taken to not
|
|
drastically affect performance. Runtime errors are not
|
|
expected, and will not prevent the resource from being
|
|
deleted.
|
|
"""
|
|
pass
|
|
|
|
def create_security_group_precommit(self, context):
|
|
"""Allocate resources for a new security group.
|
|
|
|
:param context: SecurityGroupContext instance describing the
|
|
new security group.
|
|
|
|
Create a new security group, allocating resources as necessary
|
|
in the database. Called inside transaction context on
|
|
session. Call cannot block. Raising an exception will result
|
|
in a rollback of the current transaction.
|
|
"""
|
|
pass
|
|
|
|
def create_security_group_postcommit(self, context):
|
|
"""Create a security group.
|
|
|
|
:param context: SecurityGroupContext instance describing the
|
|
new security group.
|
|
|
|
Called after the transaction commits. Call can block, though
|
|
will block the entire process so care should be taken to not
|
|
drastically affect performance. Raising an exception will
|
|
cause the deletion of the resource.
|
|
|
|
This API is not being implemented at this moment.
|
|
"""
|
|
pass
|
|
|
|
def update_security_group_precommit(self, context):
|
|
"""Update resources of a security group.
|
|
|
|
:param context: SecurityGroupContext instance describing the
|
|
new state of the security group, as well as the original state
|
|
prior to the update_security_group call.
|
|
|
|
Update values of an security group, updating the associated
|
|
resources in the database. Called inside transaction context
|
|
on session. Raising an exception will result in rollback of
|
|
the transaction.
|
|
|
|
update_security_group_precommit is called for all changes to
|
|
the security group state. It is up to the mechanism driver to
|
|
ignore state or state changes that it does not know or care
|
|
about.
|
|
"""
|
|
pass
|
|
|
|
def update_security_group_postcommit(self, context):
|
|
"""Update a security group.
|
|
|
|
:param context: SecurityGroupContext instance describing the
|
|
new state of the security group, as well as the original state
|
|
prior to the update_security_group call.
|
|
|
|
Called after the transaction commits. Call can block, though
|
|
will block the entire process so care should be taken to not
|
|
drastically affect performance. Raising an exception will
|
|
cause the deletion of the resource.
|
|
|
|
update_security_group_postcommit is called for all changes to
|
|
the security group state. It is up to the mechanism driver to
|
|
ignore state or state changes that it does not know or care
|
|
about.
|
|
|
|
This API is not being implemented at this moment.
|
|
"""
|
|
pass
|
|
|
|
def delete_security_group_precommit(self, context):
|
|
"""Delete resources for a security group.
|
|
|
|
:param context: SecurityGroupContext instance describing the
|
|
current state of the security group, prior to the call to
|
|
delete it.
|
|
|
|
Delete security group resources previously allocated by this
|
|
mechanism driver for an security group. Called inside
|
|
transaction context on session. Runtime errors are not
|
|
expected, but raising an exception will result in rollback of
|
|
the transaction.
|
|
"""
|
|
pass
|
|
|
|
def delete_security_group_postcommit(self, context):
|
|
"""Delete a security group.
|
|
|
|
:param context: SecurityGroupContext instance describing the
|
|
current state of the security group, prior to the call to
|
|
delete it.
|
|
|
|
Called after the transaction commits. Call can block, though
|
|
will block the entire process so care should be taken to not
|
|
drastically affect performance. Runtime errors are not
|
|
expected, and will not prevent the resource from being
|
|
deleted.
|
|
|
|
This API is not being implemented at this moment.
|
|
"""
|
|
pass
|
|
|
|
def create_security_group_rule_precommit(self, context):
|
|
"""Allocate resources for a new security group.
|
|
|
|
:param context: SecurityGroupRuleContext instance describing the
|
|
new security group rule.
|
|
|
|
Create a new security group rule, allocating resources as necessary
|
|
in the database. Called inside transaction context on
|
|
session. Call cannot block. Raising an exception will result
|
|
in a rollback of the current transaction.
|
|
"""
|
|
pass
|
|
|
|
def create_security_group_rule_postcommit(self, context):
|
|
"""Create a security group rule.
|
|
|
|
:param context: SecurityGroupRuleContext instance describing the
|
|
new security group rule.
|
|
|
|
Called after the transaction commits. Call can block, though
|
|
will block the entire process so care should be taken to not
|
|
drastically affect performance. Raising an exception will
|
|
cause the deletion of the resource.
|
|
|
|
This API is not being implemented at this moment.
|
|
"""
|
|
pass
|
|
|
|
# Security group rule updates are not supported by the Neutron API.
|
|
|
|
def delete_security_group_rule_precommit(self, context):
|
|
"""Delete resources for a security group rule.
|
|
|
|
:param context: SecurityGroupRuleContext instance describing the
|
|
current state of the security group rule, prior to the call to
|
|
delete it.
|
|
|
|
Delete security group rule resources previously allocated by this
|
|
mechanism driver for an security group rule. Called inside
|
|
transaction context on session. Runtime errors are not
|
|
expected, but raising an exception will result in rollback of
|
|
the transaction.
|
|
"""
|
|
pass
|
|
|
|
def delete_security_group_rule_postcommit(self, context):
|
|
"""Delete a security group rule.
|
|
|
|
:param context: SecurityGroupRuleContext instance describing the
|
|
current state of the security group rule, prior to the call to
|
|
delete it.
|
|
|
|
Called after the transaction commits. Call can block, though
|
|
will block the entire process so care should be taken to not
|
|
drastically affect performance. Runtime errors are not
|
|
expected, and will not prevent the resource from being
|
|
deleted.
|
|
|
|
This API is not being implemented at this moment.
|
|
"""
|
|
pass
|
|
|
|
|
|
@six.add_metaclass(abc.ABCMeta)
|
|
class ExtensionDriver(driver_api.ExtensionDriver):
|
|
|
|
def process_create_subnetpool(self, plugin_context, data, result):
|
|
"""Process extended attributes for create subnet pool.
|
|
|
|
:param plugin_context: plugin request context
|
|
:param data: dictionary of incoming subnet pool data
|
|
:param result: subnet pool dictionary to extend
|
|
|
|
Called inside transaction context on plugin_context.session to
|
|
validate and persist any extended subnet pool attributes
|
|
defined by this driver. Extended attribute values must also be
|
|
added to result.
|
|
"""
|
|
pass
|
|
|
|
def process_update_subnetpool(self, plugin_context, data, result):
|
|
"""Process extended attributes for update subnet pool.
|
|
|
|
:param plugin_context: plugin request context
|
|
:param data: dictionary of incoming subnet pool data
|
|
:param result: subnet pool dictionary to extend
|
|
|
|
Called inside transaction context on plugin_context.session to
|
|
validate and update any extended subnet pool attributes
|
|
defined by this driver. Extended attribute values, whether
|
|
updated or not, must also be added to result.
|
|
"""
|
|
pass
|
|
|
|
def extend_subnetpool_dict(self, session, base_model, result):
|
|
"""Add extended attributes to subnet pool dictionary.
|
|
|
|
:param session: database session
|
|
:param base_model: subnet pool model data
|
|
:param result: subnet pool dictionary to extend
|
|
|
|
Called inside transaction context on session to add any
|
|
extended attributes defined by this driver to a subnet pool
|
|
dictionary to be used for mechanism driver calls and/or
|
|
returned as the result of a subnet pool operation.
|
|
"""
|
|
pass
|
|
|
|
def process_create_address_scope(self, plugin_context, data, result):
|
|
"""Process extended attributes for create address scope.
|
|
|
|
:param plugin_context: plugin request context
|
|
:param data: dictionary of incoming address scope data
|
|
:param result: address scope dictionary to extend
|
|
|
|
Called inside transaction context on plugin_context.session to
|
|
validate and persist any extended address scope attributes
|
|
defined by this driver. Extended attribute values must also be
|
|
added to result.
|
|
"""
|
|
pass
|
|
|
|
def process_update_address_scope(self, plugin_context, data, result):
|
|
"""Process extended attributes for update address scope.
|
|
|
|
:param plugin_context: plugin request context
|
|
:param data: dictionary of incoming address scope data
|
|
:param result: address scope dictionary to extend
|
|
|
|
Called inside transaction context on plugin_context.session to
|
|
validate and update any extended address scope attributes
|
|
defined by this driver. Extended attribute values, whether
|
|
updated or not, must also be added to result.
|
|
"""
|
|
pass
|
|
|
|
def extend_address_scope_dict(self, session, base_model, result):
|
|
"""Add extended attributes to address scope dictionary.
|
|
|
|
:param session: database session
|
|
:param base_model: address scope model data
|
|
:param result: address scope dictionary to extend
|
|
|
|
Called inside transaction context on session to add any
|
|
extended attributes defined by this driver to an address scope
|
|
dictionary to be used for mechanism driver calls and/or
|
|
returned as the result of an address scope operation.
|
|
"""
|
|
pass
|