def __init__(self, config, agent_config): super().__init__(config=agent_config) self.__follower = Follower(config['follower'], self.client, self) self.__assets = set() # self.__int_cb = IntegratorCB() # self.__integrator = Integrator(config['integrator'], self.client, self.__int_cb) self.__integrator = IntegratorCB(config['integrator'], self.client)
def __init__(self, config, agent_config_str): super().__init__(config=Config(string=agent_config_str)) if not (isinstance(config, dict) and 'follower' in config): raise ValueError('Configuration invalid / missing "follower" section') # Whilst the follower core requires particular configuration, top-level sections could be defined to provide # parameters specific to this follower. self.__follower = Follower(config['follower'], self.client, self) self.__assets = set()
class SynthesiserWeather(NamedEventMixin, FollowerCallbacks, ThingRunner): def __init__(self, config, agent_config_str): self.__follower = Follower(config['follower'], self.client, self) self.__assets = set() self.__integrator = IntegratorHelper(config['integrator'], self.client) def on_startup(self): log.debug('Startup') self.__follower.start() self.__integrator.start() def main(self): log.debug('Running') def on_shutdown(self, exc_info): log.debug('Shutdown') self.__follower.stop() self.__integrator.stop() # for FollowerCallbacks def on_asset_created(self, asset_id): self.__assets.remove(asset_id) # For NamedEventMixin (specific event) def do_bombuiltset(self, event): log.info('[%s] #%d BoM-as-built (from %s) @ %s (sys: %s)\n%s', event.asset, event.offset, event.source, event.time, event.systime, pformat(event.data)) def do_fielddatasuccessset(self, event): self.__handle_fielddatasuccessset(event) print("*" * 80) print(event.name().lower()) print(event.version) print(event.data) self.__follower.ack_event(event) def on_FieldDataSuccessSet(self, event): if event.version >= 1: # Note: Events > 1 will have Location in the event.data try: nw = NearestWeather(self.client) print("weather data", nw.find_nearest_weather()) except: log.error("Exception.", exc_info=True) self.__follower.ack_event(event) # Note: self.__integrator.publish_event(WeatherSetInfo( print("*" * 80)
class SynthesiserWeather(NamedEventMixin, FollowerCallbacks, ThingRunner): def __init__(self, config, agent_config): super().__init__(config=agent_config) self.__follower = Follower(config['follower'], self.client, self) self.__assets = set() # self.__int_cb = IntegratorCB() # self.__integrator = Integrator(config['integrator'], self.client, self.__int_cb) self.__integrator = IntegratorCB(config['integrator'], self.client) def on_startup(self): log.debug('Startup') self.__follower.start() self.__integrator.start() def main(self): # Wait for an asset to exist from time import sleep while True: try: self.__assets.pop() except KeyError as ex: print(ex) pass else: break try: # __near_wea = NearestWeather(self.client) # __weather_data = __near_wea.find_nearest_weather() # pretty_print("would send WeatherInfoSet event", __weather_data) # # Time = datetime.now() # asset = self.__assets.pop() # # # # self.__integrator.publish_event(asset, time=Time, data=__event_object) # print("hi " * 10) # self.__integrator.publish_event(WeatherInfoSet(asset, time=Time, data=__weather_data)) # # self.__integrator.publish_event(event) # print("bye " * 10) while not self.wait_for_shutdown(100): log.debug('Running') except KeyboardInterrupt: print("not passed") # def __publish_success(self, asset): # event = WeatherInfoSet(asset) # # while True: # # Try to publish the event until it succeed # try: # self.__integrator.publish_event(event) # except EventPublishFailure as ex: # log.error('Event Publish Failure: %s', ex) # except AssetUnknown: # break # else: # log.debug('Published success event: %s Asset: %s', event, asset) # # Save in cache # # self.__remember_fname(self.__get_fname_from_blobname(blobname)) # break def on_shutdown(self, exc_info): log.debug('Shutdown') self.__integrator.stop() self.__follower.stop() # for FollowerCallbacks def on_asset_created(self, asset_id): log.info('Follower Callbacks Asset created: %s', asset_id) self.__assets.add(asset_id) # for FollowerCallbacks def on_asset_deleted(self, asset_id): log.info('Follower Callbacks Asset deleted: %s', asset_id) self.__assets.remove(asset_id) # For NamedEventMixin (specific event) # def do_bombuiltset(self, event): # log.info('[%s] #%d BoM-as-built (from %s) @ %s (sys: %s)\n%s', event.asset, event.offset, event.source, # event.time, event.systime, pformat(event.data)) # # # Indicate that event has been processed. If asset has been deleted in the mean time, this will be a no-op. # self.__follower.ack_event(event) # def do_fielddatasuccessset(self, event): log.info('[%s] #%d FieldData-Success-Set (from %s) @ %s (sys: %s)\n%s', event.asset, event.offset, event.source, event.time, event.systime, pformat(event.data)) # Indicate that event has been processed. If asset has been deleted in the mean time, this will be a no-op. self.__follower.ack_event(event) print("_#-" * 30) print(event.name().lower()) print(event.version) print(event.data) __location = event.data["Location"] name_map = {"Latitude": "lat", "Longitude": "long"} __location = dict((name_map[name], val) for name, val in __location.items()) try: __near_wea = NearestWeather(self.client) __weather_data = __near_wea.find_nearest_weather(__location) pretty_print("would send WeatherInfoSet event", __weather_data) asset = self.__assets.pop() Time = datetime.utcnow() print(" $ " * 10) self.__integrator.publish_event(WeatherInfoSet(asset, time=Time, data=__weather_data)) print(" % " * 10) except ValueError: log.error("Exception.", exc_info=True) except KeyboardInterrupt: pass
class SynthesiserWeather(NamedEventMixin, FollowerCallbacks, ThingRunner): def __init__(self, config, agent_config_str): super().__init__(config=Config(string=agent_config_str)) if not (isinstance(config, dict) and 'follower' in config): raise ValueError('Configuration invalid / missing "follower" section') # Whilst the follower core requires particular configuration, top-level sections could be defined to provide # parameters specific to this follower. self.__follower = Follower(config['follower'], self.client, self) self.__assets = set() def on_startup(self): log.debug('Startup') self.__follower.start() def main(self): log.debug('Running') while not self.wait_for_shutdown(2): if ENABLE_T2_PROMPT: for asset in list(self.__assets): input('Press ENTER for T2 example request for %s' % asset) self.example_t2_call(asset) def example_t2_call(self, asset): """Send an example request & computes sha1 sum of returned raw data""" log.debug('Sending t2 request for %s', asset) mime = None check = sha1() try: for mime, chunk in self.__follower.t2_request( asset, 'RRPSSynthesiserWeatherReq', data='small.pdf'.encode('utf8'), timeout=10 ): # Note: can access mime type as soon as first chunk arrives check.update(chunk) except AssetUnknown: log.warning('T2 - Asset %s no longer known, ignoring', asset) except T2ResponseException as ex: # ex.reason is T2ReqFailureReason - see code documentation for what they mean if ex.reason == T2ReqFailureReason.REQ_UNHANDLED: log.error('T2 request not handled by provider') # equivalent to HTTP 404 elif ex.reason == T2ReqFailureReason.RESOURCE_UNKNOWN: log.error('Data not available for given request and asset') else: log.error('T2 failed - reason: %s', ex.reason) except T2Unavailable: log.critical('T2 functionality not enabled in follower') except T2Timeout: log.error('T2 request timed out') except: # TODO - agent related exceptions log.exception('Other T2 failure') else: log.debug('Response mime: %s sha1: %s', mime, check.hexdigest()) def on_shutdown(self, exc_info): log.debug('Shutdown') self.__follower.stop() # for FollowerCallbacks def on_asset_created(self, asset_id): log.info('Asset created: %s', asset_id) self.__assets.add(asset_id) # for FollowerCallbacks def on_asset_deleted(self, asset_id): log.info('Asset deleted: %s', asset_id) self.__assets.remove(asset_id) # For NamedEventMixin (specific event) def do_bombuiltset(self, event): log.info( '[%s] #%d BoM-as-built (from %s) @ %s (sys: %s)\n%s', event.asset, event.offset, event.source, event.time, event.systime, pformat(event.data) ) self.__follower.ack_event(event) def do_fielddatasuccessset(self, event): # self.__handle_fielddatasuccessset(event) self.__follower.ack_event(event) def on_FieldDataSuccessSet(self, event): self.__follower.ack_event(event) # for NamedEventMixin (all events for which there isn't a do_ method) def on_event(self, event): # Note: Failure will be logged in caller getattr(self, 'do_%s' % event.name().lower(), self.on_event_unmatched)(event) def do_talendtimdocumentset(self, event): self.__follower.ack_event(event) def on_event_unmatched(self, event): log.info( '[%s] #%d %s (from %s) @ %s (sys: %s)\n%s', event.asset, event.offset, event.name(), event.source, event.time, event.systime, pformat(event.data) ) # Indicate that event has been processed. If asset has been deleted in the mean time, this will be a no-op. self.__follower.ack_event(event) def on_event_internal(self, event): log.info('Internal: %s', event)
def __init__(self, config, agent_config_str): self.__follower = Follower(config['follower'], self.client, self) self.__assets = set() self.__integrator = IntegratorHelper(config['integrator'], self.client)