def test_datastore_token_timeout(self): datastore_service = SensorDatastoreService( logger=mock.Mock(), pack_name='core', class_name='TestSensor', api_username='******') mock_api_client = mock.Mock() kvp1 = KeyValuePair() kvp1.name = 'test1' kvp1.value = 'bar' mock_api_client.keys.get_by_id.return_value = kvp1 token_expire_time = get_datetime_utc_now() - timedelta(seconds=5) datastore_service._client = mock_api_client datastore_service._token_expire = token_expire_time self._set_mock_api_client(mock_api_client) with mock.patch('st2common.services.datastore.Client', return_value=mock_api_client) as datastore_client: value = datastore_service.get_value(name='test1', local=False) self.assertTrue(datastore_client.called) self.assertEqual(value, kvp1.value) self.assertGreater(datastore_service._token_expire, token_expire_time)
def test_datastore_token_timeout(self): datastore_service = SensorDatastoreService(logger=mock.Mock(), pack_name='core', class_name='TestSensor', api_username='******') mock_api_client = mock.Mock() kvp1 = KeyValuePair() kvp1.name = 'test1' kvp1.value = 'bar' mock_api_client.keys.get_by_id.return_value = kvp1 token_expire_time = get_datetime_utc_now() - timedelta(seconds=5) datastore_service._client = mock_api_client datastore_service._token_expire = token_expire_time self._set_mock_api_client(mock_api_client) with mock.patch( 'st2common.services.datastore.Client', return_value=mock_api_client ) as datastore_client: value = datastore_service.get_value(name='test1', local=False) self.assertTrue(datastore_client.called) self.assertEqual(value, kvp1.value) self.assertGreater(datastore_service._token_expire, token_expire_time)
def __init__(self, sensor_wrapper): self._sensor_wrapper = sensor_wrapper self._logger = self._sensor_wrapper._logger self._dispatcher = TriggerDispatcher(self._logger) self._datastore_service = SensorDatastoreService( logger=self._logger, pack_name=self._sensor_wrapper._pack, class_name=self._sensor_wrapper._class_name, api_username='******') self._client = None
def __init__(self, sensor_wrapper): self._sensor_wrapper = sensor_wrapper self._logger = self._sensor_wrapper._logger self._dispatcher = TriggerDispatcher(self._logger) self._datastore_service = SensorDatastoreService( logger=self._logger, pack_name=self._sensor_wrapper._pack, class_name=self._sensor_wrapper._class_name, api_username='******') self._client = None
class SensorService(object): """ Instance of this class is passed to the sensor instance and exposes "public" methods which can be called by the sensor. """ def __init__(self, sensor_wrapper): self._sensor_wrapper = sensor_wrapper self._logger = self._sensor_wrapper._logger self._trigger_dispatcher_service = TriggerDispatcherService( logger=sensor_wrapper._logger) self._datastore_service = SensorDatastoreService( logger=self._logger, pack_name=self._sensor_wrapper._pack, class_name=self._sensor_wrapper._class_name, api_username='******') self._client = None @property def datastore_service(self): return self._datastore_service def get_logger(self, name): """ Retrieve an instance of a logger to be used by the sensor class. """ logger_name = '%s.%s' % (self._sensor_wrapper._logger.name, name) logger = logging.getLogger(logger_name) logger.propagate = True return logger ################################## # General methods ################################## def get_user_info(self): return self._datastore_service.get_user_info() ################################## # Sensor related methods ################################## def dispatch(self, trigger, payload=None, trace_tag=None): # Provided by the parent BaseTriggerDispatcherService class return self._trigger_dispatcher_service.dispatch( trigger=trigger, payload=payload, trace_tag=trace_tag, throw_on_validation_error=False) def dispatch_with_context(self, trigger, payload=None, trace_context=None): """ Method which dispatches the trigger. :param trigger: Full name / reference of the trigger. :type trigger: ``str`` :param payload: Trigger payload. :type payload: ``dict`` :param trace_context: Trace context to associate with Trigger. :type trace_context: ``st2common.api.models.api.trace.TraceContext`` """ # Provided by the parent BaseTriggerDispatcherService class return self._trigger_dispatcher_service.dispatch_with_context( trigger=trigger, payload=payload, trace_context=trace_context, throw_on_validation_error=False) ################################## # Methods for datastore management ################################## def list_values(self, local=True, prefix=None): return self.datastore_service.list_values(local=local, prefix=prefix) def get_value(self, name, local=True, scope=SYSTEM_SCOPE, decrypt=False): return self.datastore_service.get_value(name=name, local=local, scope=scope, decrypt=decrypt) def set_value(self, name, value, ttl=None, local=True, scope=SYSTEM_SCOPE, encrypt=False): return self.datastore_service.set_value(name=name, value=value, ttl=ttl, local=local, scope=scope, encrypt=encrypt) def delete_value(self, name, local=True, scope=SYSTEM_SCOPE): return self.datastore_service.delete_value(name=name, local=local, scope=scope)
class SensorService(object): """ Instance of this class is passed to the sensor instance and exposes "public" methods which can be called by the sensor. """ def __init__(self, sensor_wrapper): self._sensor_wrapper = sensor_wrapper self._logger = self._sensor_wrapper._logger self._dispatcher = TriggerDispatcher(self._logger) self._datastore_service = SensorDatastoreService( logger=self._logger, pack_name=self._sensor_wrapper._pack, class_name=self._sensor_wrapper._class_name, api_username='******') self._client = None @property def datastore_service(self): return self._datastore_service def get_logger(self, name): """ Retrieve an instance of a logger to be used by the sensor class. """ logger_name = '%s.%s' % (self._sensor_wrapper._logger.name, name) logger = logging.getLogger(logger_name) logger.propagate = True return logger ################################## # General methods ################################## def get_user_info(self): return self._datastore_service.get_user_info() ################################## # Sensor related methods ################################## def dispatch(self, trigger, payload=None, trace_tag=None): """ Method which dispatches the trigger. :param trigger: Full name / reference of the trigger. :type trigger: ``str`` :param payload: Trigger payload. :type payload: ``dict`` :param trace_tag: Tracer to track the triggerinstance. :type trace_tags: ``str`` """ # empty strings trace_context = TraceContext(trace_tag=trace_tag) if trace_tag else None self._logger.debug('Added trace_context %s to trigger %s.', trace_context, trigger) self.dispatch_with_context(trigger, payload=payload, trace_context=trace_context) def dispatch_with_context(self, trigger, payload=None, trace_context=None): """ Method which dispatches the trigger. :param trigger: Full name / reference of the trigger. :type trigger: ``str`` :param payload: Trigger payload. :type payload: ``dict`` :param trace_context: Trace context to associate with Trigger. :type trace_context: ``st2common.api.models.api.trace.TraceContext`` """ # This means specified payload is complied with trigger_type schema, or not. is_valid = True try: validate_trigger_payload(trigger_type_ref=trigger, payload=payload) except (ValidationError, Exception) as e: is_valid = False self._logger.warn('Failed to validate payload (%s) for trigger "%s": %s' % (str(payload), trigger, str(e))) # If validation is disabled, still dispatch a trigger even if it failed validation # This condition prevents unexpected restriction. if not is_valid and cfg.CONF.system.validate_trigger_payload: self._logger.warn('Trigger payload validation failed and validation is enabled, not ' 'dispatching a trigger "%s" (%s)' % (trigger, str(payload))) return None self._logger.debug('Dispatching trigger %s with payload %s.', trigger, payload) self._dispatcher.dispatch(trigger, payload=payload, trace_context=trace_context) ################################## # Methods for datastore management ################################## def list_values(self, local=True, prefix=None): return self.datastore_service.list_values(local=local, prefix=prefix) def get_value(self, name, local=True, scope=SYSTEM_SCOPE, decrypt=False): return self.datastore_service.get_value(name=name, local=local, scope=scope, decrypt=decrypt) def set_value(self, name, value, ttl=None, local=True, scope=SYSTEM_SCOPE, encrypt=False): return self.datastore_service.set_value(name=name, value=value, ttl=ttl, local=local, scope=scope, encrypt=encrypt) def delete_value(self, name, local=True, scope=SYSTEM_SCOPE): return self.datastore_service.delete_value(name=name, local=local, scope=scope)
class SensorService(object): """ Instance of this class is passed to the sensor instance and exposes "public" methods which can be called by the sensor. """ def __init__(self, sensor_wrapper): self._sensor_wrapper = sensor_wrapper self._logger = self._sensor_wrapper._logger self._dispatcher = TriggerDispatcher(self._logger) self._datastore_service = SensorDatastoreService( logger=self._logger, pack_name=self._sensor_wrapper._pack, class_name=self._sensor_wrapper._class_name, api_username='******') self._client = None @property def datastore_service(self): return self._datastore_service def get_logger(self, name): """ Retrieve an instance of a logger to be used by the sensor class. """ logger_name = '%s.%s' % (self._sensor_wrapper._logger.name, name) logger = logging.getLogger(logger_name) logger.propagate = True return logger ################################## # General methods ################################## def get_user_info(self): return self._datastore_service.get_user_info() ################################## # Sensor related methods ################################## def dispatch(self, trigger, payload=None, trace_tag=None): """ Method which dispatches the trigger. :param trigger: Full name / reference of the trigger. :type trigger: ``str`` :param payload: Trigger payload. :type payload: ``dict`` :param trace_tag: Tracer to track the triggerinstance. :type trace_tags: ``str`` """ # empty strings trace_context = TraceContext(trace_tag=trace_tag) if trace_tag else None self._logger.debug('Added trace_context %s to trigger %s.', trace_context, trigger) self.dispatch_with_context(trigger, payload=payload, trace_context=trace_context) def dispatch_with_context(self, trigger, payload=None, trace_context=None): """ Method which dispatches the trigger. :param trigger: Full name / reference of the trigger. :type trigger: ``str`` :param payload: Trigger payload. :type payload: ``dict`` :param trace_context: Trace context to associate with Trigger. :type trace_context: ``st2common.api.models.api.trace.TraceContext`` """ # This means specified payload is complied with trigger_type schema, or not. is_valid = True try: validate_trigger_payload(trigger_type_ref=trigger, payload=payload) except (ValidationError, Exception) as e: is_valid = False self._logger.warn('Failed to validate payload (%s) for trigger "%s": %s' % (str(payload), trigger, str(e))) # If validation is disabled, still dispatch a trigger even if it failed validation # This condition prevents unexpected restriction. if not is_valid and cfg.CONF.system.validate_trigger_payload: self._logger.warn('Trigger payload validation failed and validation is enabled, not ' 'dispatching a trigger "%s" (%s)' % (trigger, str(payload))) return None self._logger.debug('Dispatching trigger %s with payload %s.', trigger, payload) self._dispatcher.dispatch(trigger, payload=payload, trace_context=trace_context) ################################## # Methods for datastore management ################################## def list_values(self, local=True, prefix=None): return self.datastore_service.list_values(local=local, prefix=prefix) def get_value(self, name, local=True, scope=SYSTEM_SCOPE, decrypt=False): return self.datastore_service.get_value(name=name, local=local, scope=scope, decrypt=decrypt) def set_value(self, name, value, ttl=None, local=True, scope=SYSTEM_SCOPE, encrypt=False): return self.datastore_service.set_value(name=name, value=value, ttl=ttl, local=local, scope=scope, encrypt=encrypt) def delete_value(self, name, local=True, scope=SYSTEM_SCOPE): return self.datastore_service.delete_value(name=name, local=local, scope=scope)
class SensorService(object): """ Instance of this class is passed to the sensor instance and exposes "public" methods which can be called by the sensor. """ def __init__(self, sensor_wrapper): self._sensor_wrapper = sensor_wrapper self._logger = self._sensor_wrapper._logger self._trigger_dispatcher_service = TriggerDispatcherService(logger=sensor_wrapper._logger) self._datastore_service = SensorDatastoreService( logger=self._logger, pack_name=self._sensor_wrapper._pack, class_name=self._sensor_wrapper._class_name, api_username='******') self._client = None @property def datastore_service(self): return self._datastore_service def get_logger(self, name): """ Retrieve an instance of a logger to be used by the sensor class. """ logger_name = '%s.%s' % (self._sensor_wrapper._logger.name, name) logger = logging.getLogger(logger_name) logger.propagate = True return logger ################################## # General methods ################################## def get_user_info(self): return self._datastore_service.get_user_info() ################################## # Sensor related methods ################################## def dispatch(self, trigger, payload=None, trace_tag=None): # Provided by the parent BaseTriggerDispatcherService class return self._trigger_dispatcher_service.dispatch(trigger=trigger, payload=payload, trace_tag=trace_tag, throw_on_validation_error=False) def dispatch_with_context(self, trigger, payload=None, trace_context=None): """ Method which dispatches the trigger. :param trigger: Full name / reference of the trigger. :type trigger: ``str`` :param payload: Trigger payload. :type payload: ``dict`` :param trace_context: Trace context to associate with Trigger. :type trace_context: ``st2common.api.models.api.trace.TraceContext`` """ # Provided by the parent BaseTriggerDispatcherService class return self._trigger_dispatcher_service.dispatch_with_context(trigger=trigger, payload=payload, trace_context=trace_context, throw_on_validation_error=False) ################################## # Methods for datastore management ################################## def list_values(self, local=True, prefix=None): return self.datastore_service.list_values(local=local, prefix=prefix) def get_value(self, name, local=True, scope=SYSTEM_SCOPE, decrypt=False): return self.datastore_service.get_value(name=name, local=local, scope=scope, decrypt=decrypt) def set_value(self, name, value, ttl=None, local=True, scope=SYSTEM_SCOPE, encrypt=False): return self.datastore_service.set_value(name=name, value=value, ttl=ttl, local=local, scope=scope, encrypt=encrypt) def delete_value(self, name, local=True, scope=SYSTEM_SCOPE): return self.datastore_service.delete_value(name=name, local=local, scope=scope)