def request_tenant(self, owner, desc, tenant_name, bssid_type, tenant_id=None): """Request new Tenant.""" if tenant_id in self.tenants: raise ValueError("Tenant %s exists", tenant_id) if self.load_pending_tenant(tenant_id): raise ValueError("Tenant %s exists", tenant_id) try: session = Session() if tenant_id: request = TblPendingTenant(tenant_id=tenant_id, owner=owner, tenant_name=tenant_name, desc=desc, bssid_type=bssid_type) else: request = TblPendingTenant(owner=owner, tenant_name=tenant_name, desc=desc, bssid_type=bssid_type) session.add(request) session.commit() except IntegrityError: session.rollback() raise ValueError("Tenant name %s exists", tenant_name) return request.tenant_id
def add_tenant(self, owner, desc, tenant_name, tenant_id=None): """Create new Tenant.""" if tenant_id in self.tenants: raise ValueError("Tenant %s exists", tenant_id) try: session = Session() if tenant_id: request = TblTenant(tenant_id=tenant_id, tenant_name=tenant_name, owner=owner, desc=desc) else: request = TblTenant(owner=owner, tenant_name=tenant_name, desc=desc) session.add(request) session.commit() except IntegrityError: session.rollback() raise ValueError("Tenant name %s exists", tenant_name) self.tenants[request.tenant_id] = \ Tenant(request.tenant_id, request.tenant_name, self.accounts[owner].username, desc) return request.tenant_id
def add_tenant(self, owner, desc, tenant_name, bssid_type, tenant_id=None, plmn_id=None): """Create new Tenant.""" if tenant_id in self.tenants: raise ValueError("Tenant %s exists", tenant_id) try: session = Session() if tenant_id: request = TblTenant(tenant_id=tenant_id, tenant_name=tenant_name, owner=owner, desc=desc, bssid_type=bssid_type, plmn_id=plmn_id) else: request = TblTenant(owner=owner, tenant_name=tenant_name, desc=desc, bssid_type=bssid_type, plmn_id=plmn_id) session.add(request) session.commit() except IntegrityError: session.rollback() raise ValueError("Tenant name %s exists", tenant_name) self.tenants[request.tenant_id] = \ Tenant(request.tenant_id, request.tenant_name, self.accounts[owner].username, desc, request.bssid_type, request.plmn_id) return request.tenant_id
def request_tenant(self, owner, desc, tenant_name, bssid_type, tenant_id=None, plmn_id=None): """Request new Tenant.""" if tenant_id in self.tenants: raise ValueError("Tenant %s exists", tenant_id) if self.load_pending_tenant(tenant_id): raise ValueError("Tenant %s exists", tenant_id) try: session = Session() if tenant_id: request = TblPendingTenant(tenant_id=tenant_id, owner=owner, tenant_name=tenant_name, desc=desc, bssid_type=bssid_type, plmn_id=plmn_id) else: request = TblPendingTenant(owner=owner, tenant_name=tenant_name, desc=desc, bssid_type=bssid_type, plmn_id=plmn_id) session.add(request) session.commit() except IntegrityError: session.rollback() raise ValueError("Tenant name %s exists", tenant_name) return request.tenant_id
def add_imsi2mac(self, imsi, addr): """Add IMSI to MAC mapped value to table.""" imsi2mac = Session().query(TblIMSI2MAC) \ .filter(TblIMSI2MAC.imsi == imsi) \ .first() if imsi2mac: raise ValueError(imsi) try: session = Session() session.add(TblIMSI2MAC(imsi=imsi, addr=addr)) session.commit() except IntegrityError: session.rollback() raise ValueError("MAC address must be unique %s", addr) self.imsi2mac[imsi] = addr
def add_traffic_rule(self, match, dscp, label, priority=0): """Add a new traffic rule to the Tenant. Args: match, a Match object dscp, a slice DSCP code label, a humand readable description of the rule Returns: None Raises: Nones """ trule = TrafficRule(tenant=self, match=match, dscp=dscp, priority=priority, label=label) # Send command to IBN from empower.ibnp.ibnpserver import IBNPServer ibnp_server = get_module(IBNPServer.__module__) if ibnp_server: ibnp_server.add_traffic_rule(trule) rule = TblTrafficRule(tenant_id=self.tenant_id, match=match, dscp=dscp, priority=priority, label=label) try: session = Session() session.add(rule) session.commit() except IntegrityError: session.rollback() raise ValueError("Duplicate (%s, %s)" % (self.tenant_id, match))
def del_slice(self, dscp): """Del slice from. Args: dscp, a DSCP object Returns: None Raises: ValueError, if the dscp is not valid """ # fetch slice slc = self.slices[dscp] tenant_id = self.tenant_id # delete it from the db try: session = Session() rem = Session().query(TblSlice) \ .filter(TblSlice.tenant_id == self.tenant_id) \ .filter(TblSlice.dscp == dscp) \ .first() session.delete(rem) for wtp_addr in slc.wifi['wtps']: rem = \ Session().query(TblSliceBelongs) \ .filter(TblSliceBelongs.tenant_id == tenant_id) \ .filter(TblSliceBelongs.dscp == slc.dscp) \ .filter(TblSliceBelongs.addr == wtp_addr) \ .first() if rem: session.delete(rem) for vbs_addr in slc.lte['vbses']: rem = \ Session().query(TblSliceBelongs) \ .filter(TblSliceBelongs.tenant_id == tenant_id) \ .filter(TblSliceBelongs.dscp == slc.dscp) \ .filter(TblSliceBelongs.addr == vbs_addr) \ .first() if rem: session.delete(rem) session.commit() except IntegrityError: session.rollback() raise ValueError() # delete it from the WTPs for wtp_addr in self.wtps: wtp = self.wtps[wtp_addr] if not wtp.is_online(): continue for block in wtp.supports: wtp.connection.send_del_slice(block, self.tenant_name, dscp) # delete it from the VBSes for vbs_addr in self.vbses: vbs = self.vbses[vbs_addr] if not vbs.is_online(): continue for cell in vbs.cells.values(): vbs.connection.send_del_ran_mac_slice_request(cell, self.plmn_id, dscp) # remove slice del self.slices[dscp]
def set_slice(self, dscp, request): """Update a slice in the Tenant. Args: dscp, a DSCP object request, the slice descriptor in json format Returns: None Raises: ValueError, if the dscp is not valid """ # create new instance slc = Slice(dscp, self, request) tenant_id = self.tenant_id # update db try: session = Session() tbl_slice = Session().query(TblSlice) \ .filter(TblSlice.tenant_id == tenant_id) \ .filter(TblSlice.dscp == slc.dscp) \ .first() tbl_slice.wifi = json.dumps(slc.wifi['static-properties']) tbl_slice.lte = json.dumps(slc.lte['static-properties']) for wtp_addr in slc.wifi['wtps']: properties = \ json.dumps(slc.wifi['wtps'][wtp_addr]['static-properties']) tbl_belongs = \ Session().query(TblSliceBelongs) \ .filter(TblSliceBelongs.tenant_id == tenant_id) \ .filter(TblSliceBelongs.dscp == slc.dscp) \ .filter(TblSliceBelongs.addr == wtp_addr) \ .first() if not tbl_belongs: belongs = TblSliceBelongs(tenant_id=self.tenant_id, dscp=slc.dscp, addr=wtp_addr, properties=properties) session.add(belongs) else: tbl_belongs.properties = properties for vbs_addr in slc.lte['vbses']: properties = \ json.dumps(slc.lte['vbses'][vbs_addr]['static-properties']) tbl_belongs = \ Session().query(TblSliceBelongs) \ .filter(TblSliceBelongs.tenant_id == tenant_id) \ .filter(TblSliceBelongs.dscp == slc.dscp) \ .filter(TblSliceBelongs.addr == vbs_addr) \ .first() if not tbl_belongs: belongs = TblSliceBelongs(tenant_id=self.tenant_id, dscp=slc.dscp, addr=vbs_addr, properties=properties) session.add(belongs) else: tbl_belongs.properties = properties session.commit() except IntegrityError: session.rollback() raise ValueError() # store slice self.slices[dscp] = slc # create slice on WTPs for wtp_addr in self.wtps: wtp = self.wtps[wtp_addr] if not wtp.is_online(): continue for block in wtp.supports: wtp.connection.send_set_slice(block, slc) # create slice on VBSes for vbs_addr in self.vbses: vbs = self.vbses[vbs_addr] if not vbs.is_online(): continue current_rntis = [] # The UEs in the slice must be confirmed for ue in list(self.ues.values()): if vbs == ue.vbs and dscp == ue.slice: current_rntis.append(ue.rnti) for cell in vbs.cells.values(): vbs.connection.\ send_add_set_ran_mac_slice_request(cell, slc, EP_OPERATION_SET, current_rntis)
def add_slice(self, dscp, request): """Add a new slice to the Tenant. Args: dscp, a DSCP object request, the slice descriptor in json format Returns: None Raises: ValueError, if the dscp is not valid """ # create new instance slc = Slice(dscp, self, request) # descriptors has been parsed, now it is safe to write to the db try: session = Session() tbl_slc = TblSlice(tenant_id=self.tenant_id, dscp=slc.dscp, wifi=json.dumps(slc.wifi['static-properties']), lte=json.dumps(slc.lte['static-properties'])) session.add(tbl_slc) for wtp_addr in slc.wifi['wtps']: properties = \ json.dumps(slc.wifi['wtps'][wtp_addr]['static-properties']) belongs = TblSliceBelongs(tenant_id=self.tenant_id, dscp=tbl_slc.dscp, addr=wtp_addr, properties=properties) session.add(belongs) for vbs_addr in slc.lte['vbses']: properties = \ json.dumps(slc.lte['vbses'][vbs_addr]['static-properties']) belongs = TblSliceBelongs(tenant_id=self.tenant_id, dscp=tbl_slc.dscp, addr=vbs_addr, properties=properties) session.add(belongs) session.commit() except IntegrityError: session.rollback() raise ValueError() # store slice self.slices[dscp] = slc # create slice on WTPs for wtp_addr in self.wtps: wtp = self.wtps[wtp_addr] if not wtp.is_online(): continue for block in wtp.supports: wtp.connection.send_set_slice(block, slc) # create slice on VBSes for vbs_addr in self.vbses: vbs = self.vbses[vbs_addr] if not vbs.is_online(): continue for cell in vbs.cells.values(): vbs.connection.\ send_add_set_ran_mac_slice_request(cell, slc, EP_OPERATION_ADD)