Support Port Binding Extension in NEC plugin
Fixes bug 1099894 nova/network/quantumv2/api fill the bridge name according to binding:vif_type attribute passed from Quantum. Otherwise the bridge is set to None and launching an instance will fail. blueprint vif-plugging-improvements Note that binding:capabilities is under discussion and it may be changed in the future. This commit just adds NEC plugin support same as OVS and Linux bridge plugin. Change-Id: Ifd43c3c53615246187621613f72490b62a09b2d6
This commit is contained in:
@@ -21,6 +21,7 @@ from quantum import context
|
|||||||
from quantum.db import dhcp_rpc_base
|
from quantum.db import dhcp_rpc_base
|
||||||
from quantum.db import l3_db
|
from quantum.db import l3_db
|
||||||
from quantum.db import l3_rpc_base
|
from quantum.db import l3_rpc_base
|
||||||
|
from quantum.extensions import portbindings
|
||||||
#NOTE(amotoki): quota_db cannot be removed, it is for db model
|
#NOTE(amotoki): quota_db cannot be removed, it is for db model
|
||||||
from quantum.db import quota_db
|
from quantum.db import quota_db
|
||||||
from quantum.openstack.common import log as logging
|
from quantum.openstack.common import log as logging
|
||||||
@@ -30,6 +31,7 @@ from quantum.plugins.nec.common import exceptions as nexc
|
|||||||
from quantum.plugins.nec.db import api as ndb
|
from quantum.plugins.nec.db import api as ndb
|
||||||
from quantum.plugins.nec.db import nec_plugin_base
|
from quantum.plugins.nec.db import nec_plugin_base
|
||||||
from quantum.plugins.nec import ofc_manager
|
from quantum.plugins.nec import ofc_manager
|
||||||
|
from quantum import policy
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -58,9 +60,15 @@ class NECPluginV2(nec_plugin_base.NECPluginV2Base, l3_db.L3_NAT_db_mixin):
|
|||||||
|
|
||||||
NOTE: This is for Quantum API V2. Codes for V1.0 and V1.1 are available
|
NOTE: This is for Quantum API V2. Codes for V1.0 and V1.1 are available
|
||||||
at https://github.com/nec-openstack/quantum-openflow-plugin .
|
at https://github.com/nec-openstack/quantum-openflow-plugin .
|
||||||
|
|
||||||
|
The port binding extension enables an external application relay
|
||||||
|
information to and from the plugin.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
supported_extension_aliases = ["router", "quotas"]
|
supported_extension_aliases = ["router", "quotas", "binding"]
|
||||||
|
|
||||||
|
binding_view = "extension:port_binding:view"
|
||||||
|
binding_set = "extension:port_binding:set"
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
ndb.initialize()
|
ndb.initialize()
|
||||||
@@ -73,6 +81,12 @@ class NECPluginV2(nec_plugin_base.NECPluginV2Base, l3_db.L3_NAT_db_mixin):
|
|||||||
|
|
||||||
self.setup_rpc()
|
self.setup_rpc()
|
||||||
|
|
||||||
|
def _check_view_auth(self, context, resource, action):
|
||||||
|
return policy.check(context, action, resource)
|
||||||
|
|
||||||
|
def _enforce_set_auth(self, context, resource, action):
|
||||||
|
policy.enforce(context, action, resource)
|
||||||
|
|
||||||
def setup_rpc(self):
|
def setup_rpc(self):
|
||||||
self.topic = topics.PLUGIN
|
self.topic = topics.PLUGIN
|
||||||
self.conn = rpc.create_connection(new=True)
|
self.conn = rpc.create_connection(new=True)
|
||||||
@@ -312,6 +326,14 @@ class NECPluginV2(nec_plugin_base.NECPluginV2Base, l3_db.L3_NAT_db_mixin):
|
|||||||
nets = self._filter_nets_l3(context, nets, filters)
|
nets = self._filter_nets_l3(context, nets, filters)
|
||||||
return [self._fields(net, fields) for net in nets]
|
return [self._fields(net, fields) for net in nets]
|
||||||
|
|
||||||
|
def _extend_port_dict_binding(self, context, port):
|
||||||
|
if self._check_view_auth(context, port, self.binding_view):
|
||||||
|
port[portbindings.VIF_TYPE] = portbindings.VIF_TYPE_OVS
|
||||||
|
port[portbindings.CAPABILITIES] = {
|
||||||
|
portbindings.CAP_PORT_FILTER:
|
||||||
|
'security-group' in self.supported_extension_aliases}
|
||||||
|
return port
|
||||||
|
|
||||||
def create_port(self, context, port):
|
def create_port(self, context, port):
|
||||||
"""Create a new port entry on DB, then try to activate it."""
|
"""Create a new port entry on DB, then try to activate it."""
|
||||||
LOG.debug(_("NECPluginV2.create_port() called, port=%s ."), port)
|
LOG.debug(_("NECPluginV2.create_port() called, port=%s ."), port)
|
||||||
@@ -320,8 +342,7 @@ class NECPluginV2(nec_plugin_base.NECPluginV2Base, l3_db.L3_NAT_db_mixin):
|
|||||||
OperationalStatus.BUILD)
|
OperationalStatus.BUILD)
|
||||||
|
|
||||||
self.activate_port_if_ready(context, new_port)
|
self.activate_port_if_ready(context, new_port)
|
||||||
|
return self._extend_port_dict_binding(context, new_port)
|
||||||
return new_port
|
|
||||||
|
|
||||||
def update_port(self, context, id, port):
|
def update_port(self, context, id, port):
|
||||||
"""Update port, and handle packetfilters associated with the port.
|
"""Update port, and handle packetfilters associated with the port.
|
||||||
@@ -342,7 +363,7 @@ class NECPluginV2(nec_plugin_base.NECPluginV2Base, l3_db.L3_NAT_db_mixin):
|
|||||||
else:
|
else:
|
||||||
self.deactivate_port(context, old_port)
|
self.deactivate_port(context, old_port)
|
||||||
|
|
||||||
return new_port
|
return self._extend_port_dict_binding(context, new_port)
|
||||||
|
|
||||||
def delete_port(self, context, id, l3_port_check=True):
|
def delete_port(self, context, id, l3_port_check=True):
|
||||||
"""Delete port and packet_filters associated with the port."""
|
"""Delete port and packet_filters associated with the port."""
|
||||||
@@ -366,6 +387,22 @@ class NECPluginV2(nec_plugin_base.NECPluginV2Base, l3_db.L3_NAT_db_mixin):
|
|||||||
self.disassociate_floatingips(context, id)
|
self.disassociate_floatingips(context, id)
|
||||||
super(NECPluginV2, self).delete_port(context, id)
|
super(NECPluginV2, self).delete_port(context, id)
|
||||||
|
|
||||||
|
def get_port(self, context, id, fields=None):
|
||||||
|
session = context.session
|
||||||
|
with session.begin(subtransactions=True):
|
||||||
|
port = super(NECPluginV2, self).get_port(context, id, fields)
|
||||||
|
self._extend_port_dict_binding(context, port)
|
||||||
|
return self._fields(port, fields)
|
||||||
|
|
||||||
|
def get_ports(self, context, filters=None, fields=None):
|
||||||
|
session = context.session
|
||||||
|
with session.begin(subtransactions=True):
|
||||||
|
ports = super(NECPluginV2, self).get_ports(context, filters,
|
||||||
|
fields)
|
||||||
|
for port in ports:
|
||||||
|
self._extend_port_dict_binding(context, port)
|
||||||
|
return [self._fields(port, fields) for port in ports]
|
||||||
|
|
||||||
# For PacketFilter Extension
|
# For PacketFilter Extension
|
||||||
|
|
||||||
def _activate_packet_filter_if_ready(self, context, packet_filter,
|
def _activate_packet_filter_if_ready(self, context, packet_filter,
|
||||||
|
|||||||
@@ -13,7 +13,9 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
from quantum.extensions import portbindings
|
||||||
from quantum.tests.unit import test_db_plugin as test_plugin
|
from quantum.tests.unit import test_db_plugin as test_plugin
|
||||||
|
from quantum.tests.unit import _test_extension_portbindings as test_bindings
|
||||||
|
|
||||||
|
|
||||||
class NecPluginV2TestCase(test_plugin.QuantumDbPluginV2TestCase):
|
class NecPluginV2TestCase(test_plugin.QuantumDbPluginV2TestCase):
|
||||||
@@ -33,8 +35,11 @@ class TestNecV2HTTPResponse(test_plugin.TestV2HTTPResponse,
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class TestNecPortsV2(test_plugin.TestPortsV2, NecPluginV2TestCase):
|
class TestNecPortsV2(test_plugin.TestPortsV2, NecPluginV2TestCase,
|
||||||
pass
|
test_bindings.PortBindingsTestCase):
|
||||||
|
|
||||||
|
VIF_TYPE = portbindings.VIF_TYPE_OVS
|
||||||
|
HAS_SECURITY_GROUP = False
|
||||||
|
|
||||||
|
|
||||||
class TestNecNetworksV2(test_plugin.TestNetworksV2, NecPluginV2TestCase):
|
class TestNecNetworksV2(test_plugin.TestNetworksV2, NecPluginV2TestCase):
|
||||||
|
|||||||
Reference in New Issue
Block a user