def _find_port_dict_extensions(self, port_res, port_db, port_ext=None, switchports=None, session=None): """Looks up extension data and updates port_res.""" if not port_ext: port_ext = db.get_port_ext(port_res["id"], session=session) if not port_ext: LOG.error("Port %s does not have extension data" % port_db["id"]) return port_ext = port_ext.as_dict() if not switchports: switchports = [] if port_ext["hardware_id"]: switchports = db.filter_switchports( hardware_id=port_ext["hardware_id"], session=session) switchports = [sp.as_dict() for sp in switchports] port_res["switch:ports"] = switchports port_res["switch:hardware_id"] = port_ext["hardware_id"] port_res["commit"] = port_ext["commit"] port_res["trunked"] = port_ext["trunked"]
def update_switchports(cls, switchports, session=None): if not session: session = db_api.get_session() with session.begin(subtransactions=True): hardware_id = cls._validate_hardware_id(switchports) originals = list(db.filter_switchports( hardware_id=hardware_id, session=session)) # If the given switchports match what exists in the db, # we don't have to do anything. equal = db.compare_switchports( originals, switchports, session=session) if equal: LOG.info(("No switchports update required " "for hardware_id %s" % (hardware_id))) return originals else: LOG.info(("Updating switchports for " "hardware_id %s" % (hardware_id))) # TODO(morgbara) this is a little ham-fisted cls.delete_switchports(hardware_id, session=session) return cls.create_switchports(switchports, session=session)
def update_switchports(cls, switchports, session=None): if not session: session = db_api.get_session() with session.begin(subtransactions=True): hardware_id = cls._validate_hardware_id(switchports) originals = list( db.filter_switchports(hardware_id=hardware_id, session=session)) # If the given switchports match what exists in the db, # we don't have to do anything. equal = db.compare_switchports(originals, switchports, session=session) if equal: LOG.info(("No switchports update required " "for hardware_id %s" % (hardware_id))) return originals else: LOG.info(("Updating switchports for " "hardware_id %s" % (hardware_id))) # TODO(morgbara) this is a little ham-fisted cls.delete_switchports(hardware_id, session=session) return cls.create_switchports(switchports, session=session)
def test_delete(self): switchports = self._make_switchports( self.fmt, [self.switch1, self.switch2], self.hardware_id, ['eth1/1', 'eth1/1'], ['eth0', 'eth1'] ) self._delete('switchports', self.hardware_id) switchports = ironic_db.filter_switchports( hardware_id=self.hardware_id) self.assertEqual(list(switchports), [])
def test_delete(self): switchports = self._make_switchports(self.fmt, [self.switch1, self.switch2], self.hardware_id, ['eth1/1', 'eth1/1'], ['eth0', 'eth1']) self._delete('switchports', self.hardware_id) switchports = ironic_db.filter_switchports( hardware_id=self.hardware_id) self.assertEqual(list(switchports), [])
def index(self, request): filters = {} if request.GET.get("hardware_id"): filters["hardware_id"] = request.GET.get("hardware_id") if request.GET.get("switch_id"): filters["switch_id"] = request.GET.get("switch_id") if filters: switchports = db.filter_switchports(**filters) else: switchports = db.get_all_switchports() return dict(switchports=[p.as_dict() for p in switchports])
def index(self, request): filters = {} if request.GET.get("hardware_id"): filters["hardware_id"] = request.GET.get("hardware_id") if request.GET.get("switch_id"): filters["switch_id"] = request.GET.get("switch_id") if filters: switchports = db.filter_switchports(**filters) else: switchports = db.get_all_switchports() return dict(switchports=[p.as_dict() for p in switchports])
def _find_port_dict_extensions(self, port_res, port_db, port_ext=None, switchports=None, session=None): """Looks up extension data and updates port_res.""" if not port_ext: port_ext = db.get_port_ext(port_res["id"], session=session) port_ext = port_ext.as_dict() if not switchports: switchports = [] if port_ext["hardware_id"]: switchports = db.filter_switchports( hardware_id=port_ext["hardware_id"], session=session) switchports = [sp.as_dict() for sp in switchports] port_res["switch:ports"] = switchports port_res["switch:hardware_id"] = port_ext["hardware_id"] port_res["commit"] = port_ext["commit"] port_res["trunked"] = port_ext["trunked"]
def delete_switchports(cls, hardware_id, switchports=None, session=None): if not session: session = db_api.get_session() # find portmaps and check if they are in-use before deleting. with session.begin(subtransactions=True): if not switchports: switchports = list(db.filter_switchports( hardware_id=hardware_id, session=session)) switchport_ids = [sp.id for sp in switchports] if switchport_ids: bindings = db.filter_switchport_bindings_by_switch_port_ids( switchport_ids, session=session) bindings = list(bindings) if bindings: raise exc.BadRequest( resource="switchport", reason=("Cannot delete, switchport(s) " "'%s' in use" % (','.join(switchport_ids))) ) return db.delete_switchports(switchport_ids, session=session)
def delete_switchports(cls, hardware_id, switchports=None, session=None): if not session: session = db_api.get_session() # find portmaps and check if they are in-use before deleting. with session.begin(subtransactions=True): if not switchports: switchports = list( db.filter_switchports(hardware_id=hardware_id, session=session)) switchport_ids = [sp.id for sp in switchports] if switchport_ids: bindings = db.filter_switchport_bindings_by_switch_port_ids( switchport_ids, session=session) bindings = list(bindings) if bindings: raise exc.BadRequest( resource="switchport", reason=("Cannot delete, switchport(s) " "'%s' in use" % (','.join(switchport_ids)))) return db.delete_switchports(switchport_ids, session=session)
def validate_switchports(cls, switchports, session=None): """TODO(morgabra) Split this up, think about it more. It's inefficient and large. """ if not session: session = db_api.get_session() if not switchports: raise exc.BadRequest( resource="switchports", reason="must specify at least 1 switchport") hardware_id = cls._validate_hardware_id(switchports) # Ensure no switchports exist for the given hardware_id existing = list(db.filter_switchports( hardware_id=hardware_id, session=session)) if existing: raise exc.BadRequest( resource="switchports", reason=("switchports already exist for " "hardware_id='%s'" % hardware_id)) # Ensure all given names are !None names = set([s.get("name") for s in switchports]) if None in names: raise exc.BadRequest( resource="switchports", reason="name cannot be empty") # Ensure all given names are unique if (len(names) != len(switchports)): raise exc.BadRequest( resource="switchports", reason="all switchport names must be unique") # Ensure all given switch_id/port maps are unique ports = set([(s.get("switch_id"), s.get("port")) for s in switchports]) if (len(ports) != len(switchports)): raise exc.BadRequest( resource="switchports", reason=("cannot add switchport with identical " "switch_id/port values")) for switch_id, port in ports: # Ensure switch_id is !None if not switch_id: raise exc.BadRequest( resource="switchports", reason="switch_id cannot be empty") # Ensure switch_id is !None if not port: raise exc.BadRequest( resource="switchports", reason="port cannot be empty") # Ensure referenced switch actually exists switch = db.get_switch(switch_id, session=session) if not switch: raise exc.NotFound( resource="switch %s" % (switch_id)) # Ensure switchport not taken by another hardware_id existing = list(db.filter_switchports( switch_id=switch_id, port=port, session=session)) if len(existing) >= 1: raise exc.BadRequest( resource="switchport", reason=("port already mapped to hardware_id " "'%s'" % (existing[0].hardware_id))) return switchports
def show(self, request, id): switchports = list(db.filter_switchports(hardware_id=id)) if not switchports: raise exc.NotFound( resource="switchports %s" % (id)) return dict(switchports=[s.as_dict() for s in switchports])
def validate_switchports(cls, switchports, session=None): """TODO(morgabra) Split this up, think about it more. It's inefficient and large. """ if not session: session = db_api.get_session() if not switchports: raise exc.BadRequest(resource="switchports", reason="must specify at least 1 switchport") hardware_id = cls._validate_hardware_id(switchports) # Ensure no switchports exist for the given hardware_id existing = list( db.filter_switchports(hardware_id=hardware_id, session=session)) if existing: raise exc.BadRequest(resource="switchports", reason=("switchports already exist for " "hardware_id='%s'" % hardware_id)) # Ensure all given names are !None names = set([s.get("name") for s in switchports]) if None in names: raise exc.BadRequest(resource="switchports", reason="name cannot be empty") # Ensure all given names are unique if (len(names) != len(switchports)): raise exc.BadRequest(resource="switchports", reason="all switchport names must be unique") # Ensure all given switch_id/port maps are unique ports = set([(s.get("switch_id"), s.get("port")) for s in switchports]) if (len(ports) != len(switchports)): raise exc.BadRequest( resource="switchports", reason=("cannot add switchport with identical " "switch_id/port values")) for switch_id, port in ports: # Ensure switch_id is !None if not switch_id: raise exc.BadRequest(resource="switchports", reason="switch_id cannot be empty") # Ensure switch_id is !None if not port: raise exc.BadRequest(resource="switchports", reason="port cannot be empty") # Ensure referenced switch actually exists switch = db.get_switch(switch_id, session=session) if not switch: raise exc.NotFound(resource="switch %s" % (switch_id)) # Ensure switchport not taken by another hardware_id existing = list( db.filter_switchports(switch_id=switch_id, port=port, session=session)) if len(existing) >= 1: raise exc.BadRequest( resource="switchport", reason=("port already mapped to hardware_id " "'%s'" % (existing[0].hardware_id))) return switchports
def show(self, request, id): switchports = list(db.filter_switchports(hardware_id=id)) if not switchports: raise exc.NotFound(resource="switchports %s" % (id)) return dict(switchports=[s.as_dict() for s in switchports])