From: rohitagarwalla Date: Thu, 11 Aug 2011 23:30:58 +0000 (-0700) Subject: - Added new tables VlanID to generate ids and maintain usage of vlans X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=533db0a6274e598eca1e371fd13d2ecbb28762d6;p=openstack-build%2Fneutron-build.git - Added new tables VlanID to generate ids and maintain usage of vlans - Added wrapper functions to get next unused vlan, populate vlans, release vlans, getall vlans, isused van and delete van - Added ported instead of networked for portprofile binding table - Changed wrapper methods and test cases for portprofile binding to use portid --- diff --git a/quantum/plugins/cisco/db/l2network_db.py b/quantum/plugins/cisco/db/l2network_db.py index bc3d7574c..a25179184 100644 --- a/quantum/plugins/cisco/db/l2network_db.py +++ b/quantum/plugins/cisco/db/l2network_db.py @@ -62,22 +62,86 @@ def initialize(configfile=None): DB_PASS, DB_HOST, DB_NAME)} db.configure_db(options) -def prepopulate_vlan_bindings(): +def create_vlanids(): """Prepopulates the vlan_bindings table""" session = db.get_session() try: - binding = session.query(l2network_models.VlanBinding).\ - all() + vlanid = session.query(l2network_models.VlanID).\ + one() raise Exception("Vlan table not empty id for prepopulation") except exc.NoResultFound: - start = conf.VLAN_START - end = conf.VLAN_END - while start < end: - binding = l2network_models.VlanBinding(vlanid, "", 0) - session.add(binding) + start = int(conf.VLAN_START) + end = int(conf.VLAN_END) + while start <= end: + vlanid = l2network_models.VlanID(start) + session.add(vlanid) + start += 1 + session.flush() + return + +def get_all_vlanids(): + session = db.get_session() + try: + vlanids = session.query(l2network_models.VlanID).\ + all() + return vlanids + except exc.NoResultFound: + return [] + +def is_vlanid_used(vlan_id): + session = db.get_session() + try: + vlanid = session.query(l2network_models.VlanID).\ + filter_by(vlan_id=vlan_id).\ + one() + return vlanid["vlan_used"] + except exc.NoResultFound: + raise Exception("No vlan found with vlan-id = %s" % vlan_id) + +def release_vlanid(vlan_id): + session = db.get_session() + try: + vlanid = session.query(l2network_models.VlanID).\ + filter_by(vlan_id=vlan_id).\ + one() + vlanid["vlan_used"] = False + session.merge(vlanid) session.flush() + return vlanid["vlan_used"] + except exc.NoResultFound: + raise Exception("Vlan id %s not present in table" % vlan_id) + return +def delete_vlanid(vlan_id): + session = db.get_session() + try: + vlanid = session.query(l2network_models.VlanID).\ + filter_by(vlan_id=vlan_id).\ + one() + session.delete(vlanid) + session.flush() + return vlanid + except exc.NoResultFound: + pass + +def reserve_vlanid(): + session = db.get_session() + try: + vlanids = session.query(l2network_models.VlanID).\ + filter_by(vlan_used=False).\ + all() + rvlan = vlanids[0] + rvlanid = session.query(l2network_models.VlanID).\ + filter_by(vlan_id=rvlan["vlan_id"]).\ + one() + rvlanid["vlan_used"] = True + session.merge(rvlanid) + session.flush() + return vlanids[0]["vlan_id"] + except exc.NoResultFound: + raise Exception("All vlan id's are used") + def get_all_vlan_bindings(): """Lists all the vlan to network associations""" session = db.get_session() @@ -243,7 +307,7 @@ def get_pp_binding(ppid): raise Exception("No portprofile binding found with id = %s" % ppid) -def add_pp_binding(tenantid, networkid, ppid, default): +def add_pp_binding(tenantid, portid, ppid, default): """Adds a port profile binding""" session = db.get_session() try: @@ -253,19 +317,20 @@ def add_pp_binding(tenantid, networkid, ppid, default): raise Exception("Port profile binding with id \"%s\" already \ exists" % ppid) except exc.NoResultFound: - binding = l2network_models.PortProfileBinding(tenantid, networkid, \ + binding = l2network_models.PortProfileBinding(tenantid, portid, \ ppid, default) session.add(binding) session.flush() return binding -def remove_pp_binding(ppid): +def remove_pp_binding(portid, ppid): """Removes a port profile binding""" session = db.get_session() try: binding = session.query(l2network_models.PortProfileBinding).\ filter_by(portprofile_id=ppid).\ + filter_by(port_id=portid).\ one() session.delete(binding) session.flush() @@ -274,7 +339,7 @@ def remove_pp_binding(ppid): pass -def update_pp_binding(ppid, newtenantid=None, newnetworkid=None, \ +def update_pp_binding(ppid, newtenantid=None, newportid=None, \ newdefault=None): """Updates port profile binding""" session = db.get_session() @@ -284,8 +349,8 @@ def update_pp_binding(ppid, newtenantid=None, newnetworkid=None, \ one() if newtenantid: binding["tenant_id"] = newtenantid - if newnetworkid: - binding["network_id"] = newnetworkid + if newportid: + binding["port_id"] = newportid if newdefault: binding["default"] = newdefault session.merge(binding) diff --git a/quantum/plugins/cisco/db/l2network_models.py b/quantum/plugins/cisco/db/l2network_models.py index fe76c7d15..a53c4205a 100644 --- a/quantum/plugins/cisco/db/l2network_models.py +++ b/quantum/plugins/cisco/db/l2network_models.py @@ -60,6 +60,21 @@ class L2NetworkBase(object): local.update(joined) return local.iteritems() +class VlanID(BASE, L2NetworkBase): + """Represents a vlan_id usage""" + __tablename__ = 'vlan_ids' + + vlan_id = Column(Integer, primary_key=True) + vlan_used = Column(Boolean) + + def __init__(self, vlan_id): + self.vlan_id = vlan_id + self.vlan_used = False + + def __repr__(self): + return "" % \ + (self.vlan_id, self.vlan_used) + class VlanBinding(BASE, L2NetworkBase): """Represents a binding of vlan_id to network_id""" @@ -108,20 +123,20 @@ class PortProfileBinding(BASE, L2NetworkBase): id = Column(Integer, primary_key=True, autoincrement=True) tenant_id = Column(String(255)) - network_id = Column(String(255), ForeignKey("networks.uuid"), \ + port_id = Column(String(255), ForeignKey("ports.uuid"), \ nullable=False) portprofile_id = Column(String(255), ForeignKey("portprofiles.uuid"), \ nullable=False) default = Column(Boolean) - network = relation(models.Network, uselist=False) + ports = relation(models.Port) portprofile = relation(PortProfile, uselist=False) - def __init__(self, tenant_id, network_id, portprofile_id, default): + def __init__(self, tenant_id, port_id, portprofile_id, default): self.tenant_id = tenant_id - self.network_id = network_id + self.port_id = port_id self.portprofile_id = portprofile_id self.default = default def __repr__(self): return "" % \ - (self.tenant_id, self.network_id, self.portprofile_id, self.default) + (self.tenant_id, self.port_id, self.portprofile_id, self.default)