def trigger_statistics_collection(self): try: self.stub.CollectStatistics(openolt_pb2.Empty()) except Exception as e: self.log.error('Error while triggering statistics collection', error=e) else: self.log.info('statistics requested')
def reboot(self): self.log.debug('rebooting openolt device', device_id=self.device_id) try: self.stub.Reboot(openolt_pb2.Empty()) except Exception as e: self.log.error('something went wrong with the reboot', error=e) else: self.log.info('device rebooted')
def indications_thread(self): self.log.debug('starting-indications-thread') self.log.debug('connecting to olt', device_id=self.device_id) self.channel_ready_future.result() # blocking call self.log.info('connected to olt', device_id=self.device_id) self.go_state_connected() # TODO: thread timing issue. stub isnt ready yet from above go_state_connected (which doesnt block) # Don't continue until connected is done while (not self.connected): time.sleep(0.5) self.indications = self.stub.EnableIndication(openolt_pb2.Empty()) while True: try: # get the next indication from olt ind = next(self.indications) except Exception as e: self.log.warn('gRPC connection lost', error=e) reactor.callFromThread(self.go_state_down) reactor.callFromThread(self.go_state_init) break else: self.log.debug("rx indication", indication=ind) # indication handlers run in the main event loop if ind.HasField('olt_ind'): reactor.callFromThread(self.olt_indication, ind.olt_ind) elif ind.HasField('intf_ind'): reactor.callFromThread(self.intf_indication, ind.intf_ind) elif ind.HasField('intf_oper_ind'): reactor.callFromThread(self.intf_oper_indication, ind.intf_oper_ind) elif ind.HasField('onu_disc_ind'): reactor.callFromThread(self.onu_discovery_indication, ind.onu_disc_ind) elif ind.HasField('onu_ind'): reactor.callFromThread(self.onu_indication, ind.onu_ind) elif ind.HasField('omci_ind'): reactor.callFromThread(self.omci_indication, ind.omci_ind) elif ind.HasField('pkt_ind'): reactor.callFromThread(self.packet_indication, ind.pkt_ind) elif ind.HasField('port_stats'): reactor.callFromThread( self.stats_mgr.port_statistics_indication, ind.port_stats) elif ind.HasField('flow_stats'): reactor.callFromThread( self.stats_mgr.flow_statistics_indication, ind.flow_stats) elif ind.HasField('alarm_ind'): reactor.callFromThread(self.alarm_mgr.process_alarms, ind.alarm_ind) else: self.log.warn('unknown indication type')
def reenable(self): self.log.debug('reenabling-olt', device_id=self.device_id) try: self.stub.ReenableOlt(openolt_pb2.Empty()) except Exception as e: self.log.error('Failure to reenable openolt device', error=e) else: self.log.info('openolt device reenabled')
def disable(self): self.log.debug('sending-deactivate-olt-message', device_id=self.device_id) try: # Send grpc call self.stub.DisableOlt(openolt_pb2.Empty()) # The resulting indication will bring the OLT down # self.go_state_down() self.log.info('openolt device disabled') except Exception as e: self.log.error('Failure to disable openolt device', error=e)
def do_state_connected(self, event): self.log.debug("do_state_connected") self.stub = openolt_pb2_grpc.OpenoltStub(self.channel) delay = 1 while True: try: self.device_info = self.stub.GetDeviceInfo(openolt_pb2.Empty()) break except Exception as e: reraise = True if delay > 120: self.log.error("gRPC failure too many times") else: self.log.warn("gRPC failure, retry in %ds: %s" % (delay, repr(e))) time.sleep(delay) delay += delay reraise = False if reraise: raise self.log.info('Device connected', device_info=self.device_info) # TODO NEW CORE: logical device id is no longer available. use real device id for now self.logical_device_id = self.device_id dpid = self.device_info.device_id serial_number = self.device_info.device_serial_number if dpid is None: dpid = self.dpid if serial_number is None: serial_number = self.serial_number if dpid == None or dpid == '': uri = self.host_and_port.split(":")[0] try: socket.inet_pton(socket.AF_INET, uri) dpid = '00:00:' + self.ip_hex(uri) except socket.error: # this is not an IP dpid = self.stringToMacAddr(uri) if serial_number == None or serial_number == '': serial_number = self.host_and_port self.log.info('creating-openolt-device', dp_id=dpid, serial_number=serial_number) self.device.root = True self.device.serial_number = serial_number self.device.vendor = self.device_info.vendor self.device.model = self.device_info.model self.device.hardware_version = self.device_info.hardware_version self.device.firmware_version = self.device_info.firmware_version # TODO: check for uptime and reboot if too long (VOL-1192) self.device.connect_status = ConnectStatus.REACHABLE self.device.mac_address = dpid yield self.core_proxy.device_update(self.device) self.resource_mgr = self.resource_mgr_class(self.device_id, self.host_and_port, self.extra_args, self.device_info) self.platform = self.platform_class(self.log, self.resource_mgr) self.flow_mgr = self.flow_mgr_class(self.core_proxy, self.adapter_proxy, self.log, self.stub, self.device_id, self.logical_device_id, self.platform, self.resource_mgr) self.alarm_mgr = self.alarm_mgr_class(self.log, self.core_proxy, self.device_id, self.logical_device_id, self.platform, self.serial_number) self.stats_mgr = self.stats_mgr_class(self, self.log, self.platform) self.bw_mgr = self.bw_mgr_class(self.log, self.core_proxy) self.connected = True