Esempio n. 1
0
    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)
Esempio n. 2
0
    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()
Esempio n. 3
0
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)
Esempio n. 4
0
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
Esempio n. 5
0
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)
Esempio n. 6
0
 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)