diff --git a/networking_brocade/vdx/ml2driver/mechanism_brocade.py b/networking_brocade/vdx/ml2driver/mechanism_brocade.py index 6a93d60..19daa5f 100644 --- a/networking_brocade/vdx/ml2driver/mechanism_brocade.py +++ b/networking_brocade/vdx/ml2driver/mechanism_brocade.py @@ -1,4 +1,4 @@ -# Copyright 2014 Brocade Communications System, Inc. +# Copyright 2016 Brocade Communications System, Inc. # All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -19,13 +19,14 @@ from neutron.i18n import _LE from neutron.i18n import _LI from neutron.plugins.ml2 import driver_api -from neutron.plugins.ml2.drivers.brocade.db import models as brocade_db from oslo_config import cfg from oslo_log import log as logging from oslo_utils import importutils +from networking_brocade.vdx.ml2driver.nos.db import models as brocade_db + LOG = logging.getLogger(__name__) -MECHANISM_VERSION = 0.9 +MECHANISM_VERSION = 1.0 NOS_DRIVER = 'networking_brocade.vdx.ml2driver.nos.nosdriver.NOSdriver' ML2_BROCADE = [cfg.StrOpt('address', default='', @@ -96,6 +97,7 @@ class BrocadeMechanism(driver_api.MechanismDriver): LOG.debug("Virtual Fabric: not enabled") self.set_features_enabled(osversion, virtual_fabric_enabled) + self._driver.close_session() def set_features_enabled(self, nos_version, virtual_fabric_enabled): self._virtual_fabric_enabled = virtual_fabric_enabled diff --git a/networking_brocade/vdx/ml2driver/nos/db/__init__.py b/networking_brocade/vdx/ml2driver/nos/db/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/networking_brocade/vdx/ml2driver/nos/db/models.py b/networking_brocade/vdx/ml2driver/nos/db/models.py new file mode 100644 index 0000000..3e46c55 --- /dev/null +++ b/networking_brocade/vdx/ml2driver/nos/db/models.py @@ -0,0 +1,135 @@ +# Copyright 2016 Brocade Communications System, 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. + + +"""Brocade specific database schema/model.""" +import sqlalchemy as sa + +from neutron.db import model_base +from neutron.db import models_v2 + + +class ML2_BrocadeNetwork(model_base.BASEV2, models_v2.HasId, + models_v2.HasTenant): + """Schema for brocade network.""" + + vlan = sa.Column(sa.String(10)) + segment_id = sa.Column(sa.String(36)) + network_type = sa.Column(sa.String(10)) + + +class ML2_BrocadePort(model_base.BASEV2, models_v2.HasId, + models_v2.HasTenant): + """Schema for brocade port.""" + + network_id = sa.Column(sa.String(36), + sa.ForeignKey("ml2_brocadenetworks.id"), + nullable=False) + admin_state_up = sa.Column(sa.Boolean, nullable=False) + physical_interface = sa.Column(sa.String(36)) + vlan_id = sa.Column(sa.String(36)) + + +def create_network(context, net_id, vlan, segment_id, network_type, tenant_id): + """Create a brocade specific network/port-profiles.""" + + # only network_type of vlan is supported + session = context.session + with session.begin(subtransactions=True): + net = get_network(context, net_id, None) + if not net: + net = ML2_BrocadeNetwork(id=net_id, vlan=vlan, + segment_id=segment_id, + network_type='vlan', + tenant_id=tenant_id) + session.add(net) + return net + + +def delete_network(context, net_id): + """Delete a brocade specific network/port-profiles.""" + + session = context.session + with session.begin(subtransactions=True): + net = get_network(context, net_id, None) + if net: + session.delete(net) + + +def get_network(context, net_id, fields=None): + """Get brocade specific network, with vlan extension.""" + + session = context.session + return session.query(ML2_BrocadeNetwork).filter_by(id=net_id).first() + + +def get_networks(context, filters=None, fields=None): + """Get all brocade specific networks.""" + + session = context.session + return session.query(ML2_BrocadeNetwork).all() + + +def create_port(context, port_id, network_id, physical_interface, + vlan_id, tenant_id, admin_state_up): + """Create a brocade specific port, has policy like vlan.""" + + session = context.session + with session.begin(subtransactions=True): + port = get_port(context, port_id) + if not port: + port = ML2_BrocadePort(id=port_id, + network_id=network_id, + physical_interface=physical_interface, + vlan_id=vlan_id, + admin_state_up=admin_state_up, + tenant_id=tenant_id) + session.add(port) + + return port + + +def get_port(context, port_id): + """get a brocade specific port.""" + + session = context.session + return session.query(ML2_BrocadePort).filter_by(id=port_id).first() + + +def get_ports(context, network_id=None): + """get a brocade specific port.""" + + session = context.session + return session.query(ML2_BrocadePort).filter_by( + network_id=network_id).all() + + +def delete_port(context, port_id): + """delete brocade specific port.""" + + session = context.session + with session.begin(subtransactions=True): + port = get_port(context, port_id) + if port: + session.delete(port) + + +def update_port_state(context, port_id, admin_state_up): + """Update port attributes.""" + + session = context.session + with session.begin(subtransactions=True): + session.query(ML2_BrocadePort).filter_by( + id=port_id).update({'admin_state_up': admin_state_up})