diff --git a/akanda/quantum/README.rst b/akanda/neutron/README.rst similarity index 72% rename from akanda/quantum/README.rst rename to akanda/neutron/README.rst index 7527fe5..f54a4c0 100644 --- a/akanda/quantum/README.rst +++ b/akanda/neutron/README.rst @@ -1,5 +1,5 @@ ==================================================================== - Akanda User-facing API implemented as a Quantum Resource Extension + Akanda User-facing API implemented as a Neutron Resource Extension ==================================================================== Provides @@ -8,20 +8,20 @@ Provides Portforward ----------- -portfoward.py implemented under quantum/extensions allows the ability +portfoward.py implemented under neutron/extensions allows the ability to create portforwarding rules. Filterrule ---------- -filterrule.py implemented under quantum/extensions allows the ability +filterrule.py implemented under neutron/extensions allows the ability to create firewall rules that eventually gets implemented as OpenBSD PF rules within the Akanda appliance. AddressBook ----------- -addressbook.py implemented under quantum/extensions allows the ability +addressbook.py implemented under neutron/extensions allows the ability to administratively manage IP Address groups that can be used in filter rules. @@ -31,7 +31,7 @@ Info This is the home for the REST API that users will be calling directly with their preferred REST tool (curl, Python wrapper, etc.). -This code could eventually become part of OpenStack Quantum or act as a source +This code could eventually become part of OpenStack Neutron or act as a source or inspiration that will. As such, this API should be constructed entirely with standard OpenStack tools. @@ -40,7 +40,7 @@ Authz ----- The resource extensions are implemented with the ability to leverage AuthZ. -In order to use AuthZ, update Quantum's policy file for the extension to work +In order to use AuthZ, update Neutron's policy file for the extension to work with the following:: "create_portforward": [], @@ -49,7 +49,7 @@ with the following:: "delete_portforward": [["rule:admin_or_owner"]] -To use quotas, add to the QUOTAS section of quantum.conf:: +To use quotas, add to the QUOTAS section of neutron.conf:: quota_portforward = 10 @@ -70,31 +70,31 @@ Preliminary Steps enable_service q-svc enable_service q-agt enable_service q-dhcp - enable_service quantum + enable_service neutron enable_service q-l3 LIBVIRT_FIREWALL_DRIVER=nova.virt.firewall.NoopFirewallDriver Q_PLUGIN=openvswitch - NOVA_USE_QUANTUM_API=v2 + NOVA_USE_NEUTRON_API=v2 2. Run ./stack.sh until the stack account and /opt/stack directory gets created. 3. Run ./unstack.sh -Quantum Extensions install +Neutron Extensions install -------------------------- -<workdir> = https://github.com/dreamhost/akanda/tree/master/userapi_extensions/akanda/quantum +<workdir> = https://github.com/dreamhost/akanda/tree/master/userapi_extensions/akanda/neutron -1. Clone quantum to /opt/stack using ``git clone https://github.com/openstack/quantum.git`` +1. Clone neutron to /opt/stack using ``git clone https://github.com/openstack/neutron.git`` 2. Change to the ``userapi_extensions`` dir within the Akanda project 3. Run ``python setup.py develop`` 4. Return to devstack directory and replace the following lines:: - - Q_PLUGIN_CLASS="quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2" - + Q_PLUGIN_CLASS="akanda.quantum.plugins.ovs_quantum_plugin.OVSQuantumPluginV2" + - Q_PLUGIN_CLASS="neutron.plugins.openvswitch.ovs_neutron_plugin.OVSNeutronPluginV2" + + Q_PLUGIN_CLASS="akanda.neutron.plugins.ovs_neutron_plugin.OVSNeutronPluginV2" 5. Add the following line to load the extension right above Q_AUTH_STRATEGY:: - + iniset $Q_CONF_FILE DEFAULT api_extensions_path "extensions:/opt/stack/akanda/userapi_extensions/akanda/quantum/extensions" + + iniset $Q_CONF_FILE DEFAULT api_extensions_path "extensions:/opt/stack/akanda/userapi_extensions/akanda/neutron/extensions" 6. Run ./stack.sh again to generate the required DB migrations and start the required services. @@ -102,20 +102,20 @@ Quantum Extensions install similar to the following to indicate a successful load of an extension, however it is not complete without quotas:: - 2012-09-11 09:17:04 INFO [quantum.api.extensions] Initializing extension manager. - 2012-09-11 09:17:04 INFO [quantum.api.extensions] Loading extension file: _authzbase.py - 2012-09-11 09:17:04 INFO [quantum.api.extensions] Loading extension file: addressbook.py - 2012-09-11 09:17:04 DEBUG [quantum.api.extensions] Ext name: addressbook - 2012-09-11 09:17:04 DEBUG [quantum.api.extensions] Ext alias: dhaddressbook - 2012-09-11 09:17:04 DEBUG [quantum.api.extensions] Ext description: An addressbook extension - 2012-09-11 09:17:04 DEBUG [quantum.api.extensions] Ext namespace: http://docs.dreamcompute.com/api/ext/v1.0 + 2012-09-11 09:17:04 INFO [neutron.api.extensions] Initializing extension manager. + 2012-09-11 09:17:04 INFO [neutron.api.extensions] Loading extension file: _authzbase.py + 2012-09-11 09:17:04 INFO [neutron.api.extensions] Loading extension file: addressbook.py + 2012-09-11 09:17:04 DEBUG [neutron.api.extensions] Ext name: addressbook + 2012-09-11 09:17:04 DEBUG [neutron.api.extensions] Ext alias: dhaddressbook + 2012-09-11 09:17:04 DEBUG [neutron.api.extensions] Ext description: An addressbook extension + 2012-09-11 09:17:04 DEBUG [neutron.api.extensions] Ext namespace: http://docs.dreamcompute.com/api/ext/v1.0 8. Switch to q-svc screen and press Ctrl-C 9. To enable Quote Support Stop q-svc as add the following to [QUOTA] section of - ``/etc/quantum/quantum.conf``:: + ``/etc/neutron/neutron.conf``:: quota_portforward = 10 quota_filterrule = 100 @@ -123,7 +123,7 @@ Quantum Extensions install quota_addressbookgroup = 50 quota_addressbookentry = 250 -10. Add the follow to /etc/quantum/policy.json to enable policies:: +10. Add the follow to /etc/neutron/policy.json to enable policies:: "create_filerrule": [], "get_filterrule": [["rule:admin_or_owner"]], @@ -148,11 +148,11 @@ Quantum Extensions install Appendix -------- -To manually start and stop Quantum Services under DevStack: +To manually start and stop Neutron Services under DevStack: 1. Run 'screen -x'. To show a list of screens, use Ctrl+A+" (double quote char) 2. Select q-svc. In most cases - Ctrl+A+1 should work. -3. Run the following to start Quantum or Ctrl+C to stop:: +3. Run the following to start Neutron or Ctrl+C to stop:: $ need-command-here @@ -160,8 +160,7 @@ To manually start and stop Quantum Services under DevStack: Gotchas ======= -1. There is no Quantum Model validation for source and destination +1. There is no Neutron Model validation for source and destination protocols in FilterRule. I.e., you can create forward rules between UDP and TCP or anything else. Currently validation happens only in Horizon. If you use the API directly, you are on your own! - diff --git a/akanda/quantum/__init__.py b/akanda/neutron/__init__.py similarity index 100% rename from akanda/quantum/__init__.py rename to akanda/neutron/__init__.py diff --git a/akanda/quantum/db/__init__.py b/akanda/neutron/db/__init__.py similarity index 100% rename from akanda/quantum/db/__init__.py rename to akanda/neutron/db/__init__.py diff --git a/akanda/quantum/db/models_v2.py b/akanda/neutron/db/models_v2.py similarity index 97% rename from akanda/quantum/db/models_v2.py rename to akanda/neutron/db/models_v2.py index 5bde22c..2139987 100644 --- a/akanda/quantum/db/models_v2.py +++ b/akanda/neutron/db/models_v2.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# DreamHost Quantum Extensions +# DreamHost Neutron Extensions # Copyright 2012 New Dream Network, LLC (DreamHost) # @author: Murali Raju, New Dream Network, LLC (DreamHost) # @author: Mark Mcclain, New Dream Network, LLC (DreamHost) @@ -26,9 +26,9 @@ from sqlalchemy import orm from sqlalchemy.orm import validates -from quantum.db import model_base -from quantum.db import models_v2 -from quantum.openstack.common import timeutils +from neutron.db import model_base +from neutron.db import models_v2 +from neutron.openstack.common import timeutils def validate_port_number(port): diff --git a/akanda/quantum/extensions/__init__.py b/akanda/neutron/extensions/__init__.py similarity index 100% rename from akanda/quantum/extensions/__init__.py rename to akanda/neutron/extensions/__init__.py diff --git a/akanda/quantum/extensions/_authzbase.py b/akanda/neutron/extensions/_authzbase.py similarity index 92% rename from akanda/quantum/extensions/_authzbase.py rename to akanda/neutron/extensions/_authzbase.py index fe3f4be..731580d 100644 --- a/akanda/quantum/extensions/_authzbase.py +++ b/akanda/neutron/extensions/_authzbase.py @@ -13,32 +13,32 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# DreamHost Quantum Extensions +# DreamHost Neutron Extensions # @author: Murali Raju, New Dream Network, LLC (DreamHost) # @author: Mark Mcclain, New Dream Network, LLC (DreamHost) import abc -from quantum import quota -from quantum.api.v2 import base -from quantum.api.v2 import resource as api_resource -from quantum.common import exceptions as q_exc -from quantum.common.config import cfg +from neutron import quota +from neutron.api.v2 import base +from neutron.api.v2 import resource as api_resource +from neutron.common import exceptions as q_exc +from neutron.common.config import cfg class ResourcePlugin(object): """ - This is a class does some of what the Quantum plugin does, managing - resources in a way very similar to what Quantum does. It differ from - Quantum is that this provides a base plugin infrastructure, and doesn't + This is a class does some of what the Neutron plugin does, managing + resources in a way very similar to what Neutron does. It differ from + Neutron is that this provides a base plugin infrastructure, and doesn't manage any resources. - Quantum doesn't split infrastructure and implementation. + Neutron doesn't split infrastructure and implementation. """ JOINS = () def __init__(self, delegate): - # synthesize the hooks because Quantum's base class uses the + # synthesize the hooks because Neutron's base class uses the # resource name as part of the method name setattr(self, 'get_%s' % delegate.collection_name, self._get_collection) diff --git a/akanda/quantum/extensions/addressentry.py b/akanda/neutron/extensions/addressentry.py similarity index 94% rename from akanda/quantum/extensions/addressentry.py rename to akanda/neutron/extensions/addressentry.py index 50dfb51..007d973 100644 --- a/akanda/quantum/extensions/addressentry.py +++ b/akanda/neutron/extensions/addressentry.py @@ -13,20 +13,20 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# DreamHost Quantum Extensions +# DreamHost Neutron Extensions # @author: Murali Raju, New Dream Network, LLC (DreamHost) # @author: Mark Mcclain, New Dream Network, LLC (DreamHost) import logging -from quantum.api import extensions -from quantum.api.v2 import attributes -from quantum.common import exceptions as q_exc +from neutron.api import extensions +from neutron.api.v2 import attributes +from neutron.common import exceptions as q_exc from sqlalchemy.orm import exc -from akanda.quantum.db import models_v2 -from akanda.quantum.extensions import _authzbase +from akanda.neutron.db import models_v2 +from akanda.neutron.extensions import _authzbase LOG = logging.getLogger(__name__) diff --git a/akanda/quantum/extensions/addressgroup.py b/akanda/neutron/extensions/addressgroup.py similarity index 94% rename from akanda/quantum/extensions/addressgroup.py rename to akanda/neutron/extensions/addressgroup.py index 86a36d0..a733a73 100644 --- a/akanda/quantum/extensions/addressgroup.py +++ b/akanda/neutron/extensions/addressgroup.py @@ -13,17 +13,17 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# DreamHost Quantum Extensions +# DreamHost Neutron Extensions # @author: Murali Raju, New Dream Network, LLC (DreamHost) # @author: Mark Mcclain, New Dream Network, LLC (DreamHost) -from quantum.api import extensions -from quantum.api.v2 import attributes -from quantum.common import exceptions +from neutron.api import extensions +from neutron.api.v2 import attributes +from neutron.common import exceptions -from akanda.quantum.db import models_v2 -from akanda.quantum.extensions import _authzbase +from akanda.neutron.db import models_v2 +from akanda.neutron.extensions import _authzbase class AddressGroupResource(_authzbase.ResourceDelegate): diff --git a/akanda/quantum/extensions/filterrule.py b/akanda/neutron/extensions/filterrule.py similarity index 95% rename from akanda/quantum/extensions/filterrule.py rename to akanda/neutron/extensions/filterrule.py index b3baf5f..a5cb2d4 100644 --- a/akanda/quantum/extensions/filterrule.py +++ b/akanda/neutron/extensions/filterrule.py @@ -13,18 +13,18 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# DreamHost Quantum Extensions +# DreamHost Neutron Extensions # @author: Murali Raju, New Dream Network, LLC (DreamHost) # @author: Mark Mcclain, New Dream Network, LLC (DreamHost) -from quantum.api import extensions -from quantum.api.v2 import attributes -from quantum.common import exceptions as q_exc +from neutron.api import extensions +from neutron.api.v2 import attributes +from neutron.common import exceptions as q_exc from sqlalchemy.orm import exc -from akanda.quantum.db import models_v2 -from akanda.quantum.extensions import _authzbase +from akanda.neutron.db import models_v2 +from akanda.neutron.extensions import _authzbase class FilterruleResource(_authzbase.ResourceDelegate): diff --git a/akanda/quantum/extensions/portalias.py b/akanda/neutron/extensions/portalias.py similarity index 95% rename from akanda/quantum/extensions/portalias.py rename to akanda/neutron/extensions/portalias.py index 91877d7..0b0ab4f 100644 --- a/akanda/quantum/extensions/portalias.py +++ b/akanda/neutron/extensions/portalias.py @@ -13,16 +13,16 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# DreamHost Quantum Extensions +# DreamHost Neutron Extensions # @author: Murali Raju, New Dream Network, LLC (DreamHost) -from quantum.api import extensions -from quantum.api.v2 import attributes -from quantum.common import exceptions +from neutron.api import extensions +from neutron.api.v2 import attributes +from neutron.common import exceptions -from akanda.quantum.db import models_v2 -from akanda.quantum.extensions import _authzbase +from akanda.neutron.db import models_v2 +from akanda.neutron.extensions import _authzbase class PortaliasResource(_authzbase.ResourceDelegate): diff --git a/akanda/quantum/extensions/portforward.py b/akanda/neutron/extensions/portforward.py similarity index 95% rename from akanda/quantum/extensions/portforward.py rename to akanda/neutron/extensions/portforward.py index 00b6049..50606da 100644 --- a/akanda/quantum/extensions/portforward.py +++ b/akanda/neutron/extensions/portforward.py @@ -13,19 +13,19 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# DreamHost Quantum Extensions +# DreamHost Neutron Extensions # @author: Murali Raju, New Dream Network, LLC (DreamHost) # @author: Mark Mcclain, New Dream Network, LLC (DreamHost) from sqlalchemy.orm import exc -from quantum.api import extensions -from quantum.api.v2 import attributes -from quantum.common import exceptions as q_exc -from quantum.db import models_v2 as qmodels +from neutron.api import extensions +from neutron.api.v2 import attributes +from neutron.common import exceptions as q_exc +from neutron.db import models_v2 as qmodels -from akanda.quantum.db import models_v2 -from akanda.quantum.extensions import _authzbase +from akanda.neutron.db import models_v2 +from akanda.neutron.extensions import _authzbase class PortforwardResource(_authzbase.ResourceDelegate): diff --git a/akanda/quantum/plugins/__init__.py b/akanda/neutron/plugins/__init__.py similarity index 100% rename from akanda/quantum/plugins/__init__.py rename to akanda/neutron/plugins/__init__.py diff --git a/akanda/quantum/plugins/decorators.py b/akanda/neutron/plugins/decorators.py similarity index 95% rename from akanda/quantum/plugins/decorators.py rename to akanda/neutron/plugins/decorators.py index f632356..e774f3d 100644 --- a/akanda/quantum/plugins/decorators.py +++ b/akanda/neutron/plugins/decorators.py @@ -3,16 +3,16 @@ import netaddr import logging import random -from quantum.api.v2 import attributes -from quantum.common.config import cfg -from quantum.common import exceptions as q_exc -from quantum.db import db_base_plugin_v2 -from quantum.db import models_v2 as qmodels -from quantum.db import l3_db -from quantum import manager +from neutron.api.v2 import attributes +from neutron.common.config import cfg +from neutron.common import exceptions as q_exc +from neutron.db import db_base_plugin_v2 +from neutron.db import models_v2 as qmodels +from neutron.db import l3_db +from neutron import manager from sqlalchemy.orm import exc -from akanda.quantum.db import models_v2 as akmodels +from akanda.neutron.db import models_v2 as akmodels IPV6_ASSIGNMENT_ATTEMPTS = 1000 LOG = logging.getLogger(__name__) @@ -103,7 +103,7 @@ def auto_add_other_resources(f): def monkey_patch_ipv6_generator(): - cls = db_base_plugin_v2.QuantumDbPluginV2 + cls = db_base_plugin_v2.NeutronDbPluginV2 cls._generate_mac = _wrap_generate_mac(cls._generate_mac) cls._generate_ip = _wrap_generate_ip(cls, cls._generate_ip) @@ -159,7 +159,7 @@ def _add_subnet_to_router(context, subnet): if not subnet.get('gateway_ip'): return - plugin = manager.QuantumManager.get_plugin() + plugin = manager.NeutronManager.get_plugin() router_q = context.session.query(l3_db.Router) router_q = router_q.filter_by(tenant_id=context.tenant_id) @@ -242,7 +242,7 @@ def _update_internal_gateway_port_ip(context, router_id, subnet): # we call into the plugin vs updating the db directly because of l3 hooks # baked into the plugins. - plugin = manager.QuantumManager.get_plugin() + plugin = manager.NeutronManager.get_plugin() port_dict = {'fixed_ips': fixed_ips} plugin.update_port( context.elevated(), @@ -254,7 +254,7 @@ def _update_internal_gateway_port_ip(context, router_id, subnet): def _add_ipv6_subnet(context, network): - plugin = manager.QuantumManager.get_plugin() + plugin = manager.NeutronManager.get_plugin() try: subnet_generator = _ipv6_subnet_generator( @@ -322,7 +322,7 @@ def _ipv6_subnet_generator(network_range, prefixlen): def _wrap_generate_mac(f): - """ Adds mac_address to context object instead of patch Quantum. + """ Adds mac_address to context object instead of patch Neutron. Annotating the object requires a less invasive change until upstream can be fixed in Havana. This version works in concert with @@ -345,7 +345,7 @@ def _wrap_generate_ip(cls, f): the network. NOTE: This method is intended to patch a private method on the - Quantum base plugin. The method prefers to generate an IP from large IPv6 + Neutron base plugin. The method prefers to generate an IP from large IPv6 subnets. If a suitable subnet cannot be found, the method will fallback to the original implementation. """ diff --git a/akanda/quantum/plugins/nvp_quantum_plugin.py b/akanda/neutron/plugins/nvp_neutron_plugin.py similarity index 91% rename from akanda/quantum/plugins/nvp_quantum_plugin.py rename to akanda/neutron/plugins/nvp_neutron_plugin.py index 71b3dbf..3997b58 100644 --- a/akanda/quantum/plugins/nvp_quantum_plugin.py +++ b/akanda/neutron/plugins/nvp_neutron_plugin.py @@ -18,20 +18,20 @@ import functools -from quantum.common import topics -from quantum.db import l3_db -from quantum.db import l3_rpc_base as l3_rpc -from quantum.extensions import portsecurity as psec -from quantum.extensions import securitygroup as ext_sg -from quantum.openstack.common import log as logging -from quantum.openstack.common import rpc -from quantum.plugins.nicira.nicira_nvp_plugin.QuantumPlugin import nicira_db -from quantum.plugins.nicira.nicira_nvp_plugin import QuantumPlugin as nvp -from quantum.plugins.nicira.nicira_nvp_plugin.QuantumPlugin import nvplib +from neutron.common import topics +from neutron.db import l3_db +from neutron.db import l3_rpc_base as l3_rpc +from neutron.extensions import portsecurity as psec +from neutron.extensions import securitygroup as ext_sg +from neutron.openstack.common import log as logging +from neutron.openstack.common import rpc +from neutron.plugins.nicira.nicira_nvp_plugin.NeutronPlugin import nicira_db +from neutron.plugins.nicira.nicira_nvp_plugin import NeutronPlugin as nvp +from neutron.plugins.nicira.nicira_nvp_plugin.NeutronPlugin import nvplib -from akanda.quantum.plugins import decorators as akanda +from akanda.neutron.plugins import decorators as akanda -LOG = logging.getLogger("QuantumPlugin") +LOG = logging.getLogger("NeutronPlugin") akanda.monkey_patch_ipv6_generator() @@ -73,7 +73,7 @@ class AkandaNvpRpcCallbacks(l3_rpc.L3RpcCallbackMixin, nvp.NVPRpcCallbacks): class NvpPluginV2(nvp.NvpPluginV2): """ - NvpPluginV2 is a Quantum plugin that provides L2 Virtual Network + NvpPluginV2 is a Neutron plugin that provides L2 Virtual Network functionality using NVP. """ supported_extension_aliases = ( @@ -174,7 +174,7 @@ class NvpPluginV2(nvp.NvpPluginV2): port_data['fixed_ips'], port_data[psec.PORTSECURITY], port_data[ext_sg.SECURITYGROUPS]) - nicira_db.add_quantum_nvp_port_mapping( + nicira_db.add_neutron_nvp_port_mapping( context.session, port_data['id'], lport['uuid']) d_owner = port_data['device_owner'] @@ -189,7 +189,7 @@ class NvpPluginV2(nvp.NvpPluginV2): 'port_id': port_data['id'], 'nvp_port_id': lport['uuid']}) except Exception: - # failed to create port in NVP delete port from quantum_db + # failed to create port in NVP delete port from neutron_db LOG.exception(_("An exception occured while plugging " "the interface")) raise diff --git a/akanda/quantum/plugins/ovs_quantum_plugin.py b/akanda/neutron/plugins/ovs_neutron_plugin.py similarity index 75% rename from akanda/quantum/plugins/ovs_quantum_plugin.py rename to akanda/neutron/plugins/ovs_neutron_plugin.py index c318f8b..7dcf5fb 100644 --- a/akanda/quantum/plugins/ovs_quantum_plugin.py +++ b/akanda/neutron/plugins/ovs_neutron_plugin.py @@ -16,15 +16,15 @@ # under the License. # -from quantum.plugins.openvswitch import ovs_quantum_plugin +from neutron.plugins.openvswitch import ovs_neutron_plugin -from akanda.quantum.plugins import decorators as akanda +from akanda.neutron.plugins import decorators as akanda akanda.monkey_patch_ipv6_generator() -class OVSQuantumPluginV2(ovs_quantum_plugin.OVSQuantumPluginV2): +class OVSNeutronPluginV2(ovs_neutron_plugin.OVSNeutronPluginV2): _supported_extension_aliases = ( - ovs_quantum_plugin.OVSQuantumPluginV2._supported_extension_aliases + + ovs_neutron_plugin.OVSNeutronPluginV2._supported_extension_aliases + ["dhportforward", "dhaddressgroup", "dhaddressentry", "dhfilterrule", "dhportalias"]) @@ -36,13 +36,13 @@ class OVSQuantumPluginV2(ovs_quantum_plugin.OVSQuantumPluginV2): @akanda.auto_add_other_resources @akanda.auto_add_ipv6_subnet def create_network(self, context, network): - return super(OVSQuantumPluginV2, self).create_network(context, network) + return super(OVSNeutronPluginV2, self).create_network(context, network) @akanda.auto_add_subnet_to_router def create_subnet(self, context, subnet): - return super(OVSQuantumPluginV2, self).create_subnet(context, subnet) + return super(OVSNeutronPluginV2, self).create_subnet(context, subnet) @akanda.sync_subnet_gateway_port def update_subnet(self, context, id, subnet): - return super(OVSQuantumPluginV2, self).update_subnet( + return super(OVSNeutronPluginV2, self).update_subnet( context, id, subnet)