Esempio n. 1
0
class ActionService(object):
    """
    Instance of this class is passed to the action instance and exposes "public"
    methods which can be called by the action.
    """

    def __init__(self, action_wrapper):
        logger = get_logger_for_python_runner_action(action_name=action_wrapper._class_name)

        self._action_wrapper = action_wrapper
        self._datastore_service = DatastoreService(logger=logger,
                                                   pack_name=self._action_wrapper._pack,
                                                   class_name=self._action_wrapper._class_name,
                                                   api_username='******')

    ##################################
    # Methods for datastore management
    ##################################

    def list_values(self, local=True, prefix=None):
        return self._datastore_service.list_values(local, prefix)

    def get_value(self, name, local=True, scope=SYSTEM_SCOPE, decrypt=False):
        return self._datastore_service.get_value(name, 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, value, ttl, local, scope=scope,
            encrypt=encrypt)

    def delete_value(self, name, local=True, scope=SYSTEM_SCOPE):
        return self._datastore_service.delete_value(name, local)
Esempio n. 2
0
    def test_datastore_token_timeout(self):
        datastore_service = DatastoreService(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)
            datastore_client.assert_called()
            self.assertEqual(value, kvp1.value)
            self.assertGreater(datastore_service._token_expire,
                               token_expire_time)
Esempio n. 3
0
    def test_datastore_token_timeout(self):
        datastore_service = DatastoreService(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)
            datastore_client.assert_called()
            self.assertEqual(value, kvp1.value)
            self.assertGreater(datastore_service._token_expire, token_expire_time)
Esempio n. 4
0
class ActionService(object):
    """
    Instance of this class is passed to the action instance and exposes "public"
    methods which can be called by the action.
    """

    def __init__(self, action_wrapper):
        logger = get_logger_for_python_runner_action(action_name=action_wrapper._class_name)

        self._action_wrapper = action_wrapper
        self._datastore_service = DatastoreService(logger=logger,
                                                   pack_name=self._action_wrapper._pack,
                                                   class_name=self._action_wrapper._class_name,
                                                   api_username='******')

    ##################################
    # Methods for datastore management
    ##################################

    def list_values(self, local=True, prefix=None):
        return self._datastore_service.list_values(local, prefix)

    def get_value(self, name, local=True):
        return self._datastore_service.get_value(name, local)

    def set_value(self, name, value, ttl=None, local=True):
        return self._datastore_service.set_value(name, value, ttl, local)

    def delete_value(self, name, local=True):
        return self._datastore_service.delete_value(name, local)
Esempio n. 5
0
    def __init__(self, action_wrapper):
        logger = get_logger_for_python_runner_action(action_name=action_wrapper._class_name)

        self._action_wrapper = action_wrapper
        self._datastore_service = DatastoreService(logger=logger,
                                                   pack_name=self._action_wrapper._pack,
                                                   class_name=self._action_wrapper._class_name,
                                                   api_username='******')
Esempio n. 6
0
    def setUp(self):
        super(DatastoreServiceTestCase, self).setUp()

        self._datastore_service = DatastoreService(logger=mock.Mock(),
                                                   pack_name='core',
                                                   class_name='TestSensor',
                                                   api_username='******')
        self._datastore_service._get_api_client = mock.Mock()
Esempio n. 7
0
    def __init__(self, sensor_wrapper):
        self._sensor_wrapper = sensor_wrapper
        self._logger = self._sensor_wrapper._logger
        self._dispatcher = TriggerDispatcher(self._logger)
        self._datastore_service = DatastoreService(logger=self._logger,
                                                   pack_name=self._sensor_wrapper._pack,
                                                   class_name=self._sensor_wrapper._class_name,
                                                   api_username='******')

        self._client = None
Esempio n. 8
0
    def _get_action_instance(self):
        actions_cls = action_loader.register_plugin(Action, self._file_path)
        action_cls = actions_cls[0] if actions_cls and len(
            actions_cls) > 0 else None

        if not action_cls:
            raise Exception(
                'File "%s" has no action or the file doesn\'t exist.' %
                (self._file_path))

        config_parser = ContentPackConfigParser(pack_name=self._pack)
        config = config_parser.get_action_config(
            action_file_path=self._file_path)

        if config:
            LOG.info('Using config "%s" for action "%s"' %
                     (config.file_path, self._file_path))

            action_instance = action_cls(config=config.config)
        else:
            LOG.info('No config found for action "%s"' % (self._file_path))
            action_instance = action_cls(config={})

        # Setup action_instance proeprties
        action_instance.logger = self._set_up_logger(action_cls.__name__)
        action_instance.datastore = DatastoreService(
            logger=action_instance.logger,
            pack_name=self._pack,
            class_name=action_cls.__name__,
            api_username="******")

        return action_instance
Esempio n. 9
0
    def __init__(self, action_wrapper):
        logger = get_logger_for_python_runner_action(action_name=action_wrapper._class_name)

        self._action_wrapper = action_wrapper
        self._datastore_service = DatastoreService(logger=logger,
                                                   pack_name=self._action_wrapper._pack,
                                                   class_name=self._action_wrapper._class_name,
                                                   api_username='******')
Esempio n. 10
0
    def setUp(self):
        super(DatastoreServiceTestCase, self).setUp()

        self._datastore_service = DatastoreService(logger=mock.Mock(),
                                                   pack_name='core',
                                                   class_name='TestSensor',
                                                   api_username='******')
        self._datastore_service._get_api_client = mock.Mock()
Esempio n. 11
0
    def __init__(self, sensor_wrapper):
        self._sensor_wrapper = sensor_wrapper
        self._logger = self._sensor_wrapper._logger
        self._dispatcher = TriggerDispatcher(self._logger)
        self._datastore_service = DatastoreService(logger=self._logger,
                                                   pack_name=self._sensor_wrapper._pack,
                                                   class_name=self._sensor_wrapper._class_name,
                                                   api_username='******')

        self._client = None
Esempio n. 12
0
    def datastore_service(self):
        # Late import to avoid very expensive in-direct import (~1 second) when this function is
        # not called / used
        from st2common.services.datastore import DatastoreService

        if not self._datastore_service:
            action_name = self._action_wrapper._class_name
            logger = get_logger_for_python_runner_action(
                action_name=action_name)
            self._datastore_service = DatastoreService(
                logger=logger,
                pack_name=self._action_wrapper._pack,
                class_name=self._action_wrapper._class_name,
                api_username='******')
        return self._datastore_service
Esempio n. 13
0
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 = DatastoreService(
            logger=self._logger,
            pack_name=self._sensor_wrapper._pack,
            class_name=self._sensor_wrapper._class_name,
            api_username='******')

        self._client = None

    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

    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.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``
        """
        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, prefix)

    def get_value(self, name, local=True):
        return self._datastore_service.get_value(name, local)

    def set_value(self, name, value, ttl=None, local=True):
        return self._datastore_service.set_value(name, value, ttl, local)

    def delete_value(self, name, local=True):
        return self._datastore_service.delete_value(name, local)
Esempio n. 14
0
class DatastoreServiceTestCase(unittest2.TestCase):
    def setUp(self):
        super(DatastoreServiceTestCase, self).setUp()

        self._datastore_service = DatastoreService(
            logger=mock.Mock(),
            pack_name='core',
            class_name='TestSensor',
            api_username='******')
        self._datastore_service._get_api_client = mock.Mock()

    def test_datastore_operations_list_values(self):
        # Verify prefix filtering
        mock_api_client = mock.Mock()
        mock_api_client.keys.get_all.return_value = []
        self._set_mock_api_client(mock_api_client)

        self._datastore_service.list_values(local=True, prefix=None)
        mock_api_client.keys.get_all.assert_called_with(
            prefix='core.TestSensor:')
        self._datastore_service.list_values(local=True, prefix='ponies')
        mock_api_client.keys.get_all.assert_called_with(
            prefix='core.TestSensor:ponies')

        self._datastore_service.list_values(local=False, prefix=None)
        mock_api_client.keys.get_all.assert_called_with(prefix=None)
        self._datastore_service.list_values(local=False, prefix='ponies')
        mock_api_client.keys.get_all.assert_called_with(prefix='ponies')

        # No values in the datastore
        mock_api_client = mock.Mock()
        mock_api_client.keys.get_all.return_value = []
        self._set_mock_api_client(mock_api_client)

        values = self._datastore_service.list_values(local=True)
        self.assertEqual(values, [])
        values = self._datastore_service.list_values(local=False)
        self.assertEqual(values, [])

        # Values in the datastore
        kvp1 = KeyValuePair()
        kvp1.name = 'test1'
        kvp1.value = 'bar'
        kvp2 = KeyValuePair()
        kvp2.name = 'test2'
        kvp2.value = 'bar'
        mock_return_value = [kvp1, kvp2]
        mock_api_client.keys.get_all.return_value = mock_return_value
        self._set_mock_api_client(mock_api_client)

        values = self._datastore_service.list_values(local=True)
        self.assertEqual(len(values), 2)
        self.assertEqual(values, mock_return_value)

    def test_datastore_operations_get_value(self):
        mock_api_client = mock.Mock()
        kvp1 = KeyValuePair()
        kvp1.name = 'test1'
        kvp1.value = 'bar'
        mock_api_client.keys.get_by_id.return_value = kvp1
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.get_value(name='test1', local=False)
        self.assertEqual(value, kvp1.value)

    def test_datastore_operations_set_value(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.update.return_value = True
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.set_value(name='test1',
                                                  value='foo',
                                                  local=False)
        self.assertTrue(value)
        kvp = mock_api_client.keys.update.call_args[1]['instance']
        self.assertEquals(kvp.value, 'foo')
        self.assertEquals(kvp.scope, SYSTEM_SCOPE)

    def test_datastore_operations_delete_value(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.delete.return_value = True
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.delete_value(name='test', local=False)
        self.assertTrue(value)

    def test_datastore_operations_set_encrypted_value(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.update.return_value = True
        self._set_mock_api_client(mock_api_client)
        value = self._datastore_service.set_value(name='test1',
                                                  value='foo',
                                                  local=False,
                                                  encrypt=True)
        self.assertTrue(value)
        kvp = mock_api_client.keys.update.call_args[1]['instance']
        self.assertEquals(kvp.value, 'foo')
        self.assertTrue(kvp.secret)
        self.assertEquals(kvp.scope, SYSTEM_SCOPE)

    def test_datastore_unsupported_scope(self):
        self.assertRaises(ValueError,
                          self._datastore_service.get_value,
                          name='test1',
                          scope='NOT_SYSTEM')
        self.assertRaises(ValueError,
                          self._datastore_service.set_value,
                          name='test1',
                          value='foo',
                          scope='NOT_SYSTEM')
        self.assertRaises(ValueError,
                          self._datastore_service.delete_value,
                          name='test1',
                          scope='NOT_SYSTEM')

    def test_datastore_get_exception(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.get_by_id.side_effect = ValueError(
            "Exception test")
        self._set_mock_api_client(mock_api_client)
        value = self._datastore_service.get_value(name='test1')
        self.assertEquals(value, None)

    def test_datastore_delete_exception(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.delete.side_effect = ValueError("Exception test")
        self._set_mock_api_client(mock_api_client)
        delete_success = self._datastore_service.delete_value(name='test1')
        self.assertEquals(delete_success, False)

    def test_datastore_token_timeout(self):
        datastore_service = DatastoreService(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)
            datastore_client.assert_called()
            self.assertEqual(value, kvp1.value)
            self.assertGreater(datastore_service._token_expire,
                               token_expire_time)

    def _set_mock_api_client(self, mock_api_client):
        mock_method = mock.Mock()
        mock_method.return_value = mock_api_client
        self._datastore_service._get_api_client = mock_method
Esempio n. 15
0
class DatastoreServiceTestCase(unittest2.TestCase):
    def setUp(self):
        super(DatastoreServiceTestCase, self).setUp()

        self._datastore_service = DatastoreService(logger=mock.Mock(),
                                                   pack_name='core',
                                                   class_name='TestSensor',
                                                   api_username='******')
        self._datastore_service._get_api_client = mock.Mock()

    def test_datastore_operations_list_values(self):
        # Verify prefix filtering
        mock_api_client = mock.Mock()
        mock_api_client.keys.get_all.return_value = []
        self._set_mock_api_client(mock_api_client)

        self._datastore_service.list_values(local=True, prefix=None)
        mock_api_client.keys.get_all.assert_called_with(prefix='core.TestSensor:')
        self._datastore_service.list_values(local=True, prefix='ponies')
        mock_api_client.keys.get_all.assert_called_with(prefix='core.TestSensor:ponies')

        self._datastore_service.list_values(local=False, prefix=None)
        mock_api_client.keys.get_all.assert_called_with(prefix=None)
        self._datastore_service.list_values(local=False, prefix='ponies')
        mock_api_client.keys.get_all.assert_called_with(prefix='ponies')

        # No values in the datastore
        mock_api_client = mock.Mock()
        mock_api_client.keys.get_all.return_value = []
        self._set_mock_api_client(mock_api_client)

        values = self._datastore_service.list_values(local=True)
        self.assertEqual(values, [])
        values = self._datastore_service.list_values(local=False)
        self.assertEqual(values, [])

        # Values in the datastore
        kvp1 = KeyValuePair()
        kvp1.name = 'test1'
        kvp1.value = 'bar'
        kvp2 = KeyValuePair()
        kvp2.name = 'test2'
        kvp2.value = 'bar'
        mock_return_value = [kvp1, kvp2]
        mock_api_client.keys.get_all.return_value = mock_return_value
        self._set_mock_api_client(mock_api_client)

        values = self._datastore_service.list_values(local=True)
        self.assertEqual(len(values), 2)
        self.assertEqual(values, mock_return_value)

    def test_datastore_operations_get_value(self):
        mock_api_client = mock.Mock()
        kvp1 = KeyValuePair()
        kvp1.name = 'test1'
        kvp1.value = 'bar'
        mock_api_client.keys.get_by_id.return_value = kvp1
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.get_value(name='test1', local=False)
        self.assertEqual(value, kvp1.value)

    def test_datastore_operations_set_value(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.update.return_value = True
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.set_value(name='test1', value='foo', local=False)
        self.assertTrue(value)

    def test_datastore_operations_delete_value(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.delete.return_value = True
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.delete_value(name='test', local=False)
        self.assertTrue(value)

    def _set_mock_api_client(self, mock_api_client):
        mock_method = mock.Mock()
        mock_method.return_value = mock_api_client
        self._datastore_service._get_api_client = mock_method
Esempio n. 16
0
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 = DatastoreService(logger=self._logger,
                                                   pack_name=self._sensor_wrapper._pack,
                                                   class_name=self._sensor_wrapper._class_name,
                                                   api_username='******')

        self._client = None

    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

    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.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``
        """
        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, prefix)

    def get_value(self, name, local=True):
        return self._datastore_service.get_value(name, local)

    def set_value(self, name, value, ttl=None, local=True):
        return self._datastore_service.set_value(name, value, ttl, local)

    def delete_value(self, name, local=True):
        return self._datastore_service.delete_value(name, local)
Esempio n. 17
0
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 = DatastoreService(
            logger=self._logger,
            pack_name=self._sensor_wrapper._pack,
            class_name=self._sensor_wrapper._class_name,
            api_username='******')

        self._client = None

    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

    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.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._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, prefix)

    def get_value(self, name, local=True):
        return self._datastore_service.get_value(name, local)

    def set_value(self, name, value, ttl=None, local=True):
        return self._datastore_service.set_value(name, value, ttl, local)

    def delete_value(self, name, local=True):
        return self._datastore_service.delete_value(name, local)
Esempio n. 18
0
class DatastoreServiceTestCase(unittest2.TestCase):
    def setUp(self):
        super(DatastoreServiceTestCase, self).setUp()

        self._datastore_service = DatastoreService(logger=mock.Mock(),
                                                   pack_name='core',
                                                   class_name='TestSensor',
                                                   api_username='******')
        self._datastore_service._get_api_client = mock.Mock()

    def test_datastore_operations_list_values(self):
        # Verify prefix filtering
        mock_api_client = mock.Mock()
        mock_api_client.keys.get_all.return_value = []
        self._set_mock_api_client(mock_api_client)

        self._datastore_service.list_values(local=True, prefix=None)
        mock_api_client.keys.get_all.assert_called_with(prefix='core.TestSensor:')
        self._datastore_service.list_values(local=True, prefix='ponies')
        mock_api_client.keys.get_all.assert_called_with(prefix='core.TestSensor:ponies')

        self._datastore_service.list_values(local=False, prefix=None)
        mock_api_client.keys.get_all.assert_called_with(prefix=None)
        self._datastore_service.list_values(local=False, prefix='ponies')
        mock_api_client.keys.get_all.assert_called_with(prefix='ponies')

        # No values in the datastore
        mock_api_client = mock.Mock()
        mock_api_client.keys.get_all.return_value = []
        self._set_mock_api_client(mock_api_client)

        values = self._datastore_service.list_values(local=True)
        self.assertEqual(values, [])
        values = self._datastore_service.list_values(local=False)
        self.assertEqual(values, [])

        # Values in the datastore
        kvp1 = KeyValuePair()
        kvp1.name = 'test1'
        kvp1.value = 'bar'
        kvp2 = KeyValuePair()
        kvp2.name = 'test2'
        kvp2.value = 'bar'
        mock_return_value = [kvp1, kvp2]
        mock_api_client.keys.get_all.return_value = mock_return_value
        self._set_mock_api_client(mock_api_client)

        values = self._datastore_service.list_values(local=True)
        self.assertEqual(len(values), 2)
        self.assertEqual(values, mock_return_value)

    def test_datastore_operations_get_value(self):
        mock_api_client = mock.Mock()
        kvp1 = KeyValuePair()
        kvp1.name = 'test1'
        kvp1.value = 'bar'
        mock_api_client.keys.get_by_id.return_value = kvp1
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.get_value(name='test1', local=False)
        self.assertEqual(value, kvp1.value)

    def test_datastore_operations_set_value(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.update.return_value = True
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.set_value(name='test1', value='foo', local=False)
        self.assertTrue(value)
        kvp = mock_api_client.keys.update.call_args[1]['instance']
        self.assertEquals(kvp.value, 'foo')
        self.assertEquals(kvp.scope, SYSTEM_SCOPE)

    def test_datastore_operations_delete_value(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.delete.return_value = True
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.delete_value(name='test', local=False)
        self.assertTrue(value)

    def test_datastore_operations_set_encrypted_value(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.update.return_value = True
        self._set_mock_api_client(mock_api_client)
        value = self._datastore_service.set_value(name='test1', value='foo', local=False,
            encrypt=True)
        self.assertTrue(value)
        kvp = mock_api_client.keys.update.call_args[1]['instance']
        self.assertEquals(kvp.value, 'foo')
        self.assertTrue(kvp.secret)
        self.assertEquals(kvp.scope, SYSTEM_SCOPE)

    def test_datastore_unsupported_scope(self):
        self.assertRaises(ValueError, self._datastore_service.get_value, name='test1',
            scope='NOT_SYSTEM')
        self.assertRaises(ValueError, self._datastore_service.set_value, name='test1',
            value='foo', scope='NOT_SYSTEM')
        self.assertRaises(ValueError, self._datastore_service.delete_value, name='test1',
            scope='NOT_SYSTEM')

    def test_datastore_get_exception(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.get_by_id.side_effect = ValueError("Exception test")
        self._set_mock_api_client(mock_api_client)
        value = self._datastore_service.get_value(name='test1')
        self.assertEquals(value, None)

    def test_datastore_delete_exception(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.delete.side_effect = ValueError("Exception test")
        self._set_mock_api_client(mock_api_client)
        delete_success = self._datastore_service.delete_value(name='test1')
        self.assertEquals(delete_success, False)

    def test_datastore_token_timeout(self):
        datastore_service = DatastoreService(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)
            datastore_client.assert_called()
            self.assertEqual(value, kvp1.value)
            self.assertGreater(datastore_service._token_expire, token_expire_time)

    def _set_mock_api_client(self, mock_api_client):
        mock_method = mock.Mock()
        mock_method.return_value = mock_api_client
        self._datastore_service._get_api_client = mock_method
Esempio n. 19
0
class DatastoreServiceTestCase(unittest2.TestCase):
    def setUp(self):
        super(DatastoreServiceTestCase, self).setUp()

        self._datastore_service = DatastoreService(
            logger=mock.Mock(),
            pack_name='core',
            class_name='TestSensor',
            api_username='******')
        self._datastore_service._get_api_client = mock.Mock()

    def test_datastore_operations_list_values(self):
        # Verify prefix filtering
        mock_api_client = mock.Mock()
        mock_api_client.keys.get_all.return_value = []
        self._set_mock_api_client(mock_api_client)

        self._datastore_service.list_values(local=True, prefix=None)
        mock_api_client.keys.get_all.assert_called_with(
            prefix='core.TestSensor:')
        self._datastore_service.list_values(local=True, prefix='ponies')
        mock_api_client.keys.get_all.assert_called_with(
            prefix='core.TestSensor:ponies')

        self._datastore_service.list_values(local=False, prefix=None)
        mock_api_client.keys.get_all.assert_called_with(prefix=None)
        self._datastore_service.list_values(local=False, prefix='ponies')
        mock_api_client.keys.get_all.assert_called_with(prefix='ponies')

        # No values in the datastore
        mock_api_client = mock.Mock()
        mock_api_client.keys.get_all.return_value = []
        self._set_mock_api_client(mock_api_client)

        values = self._datastore_service.list_values(local=True)
        self.assertEqual(values, [])
        values = self._datastore_service.list_values(local=False)
        self.assertEqual(values, [])

        # Values in the datastore
        kvp1 = KeyValuePair()
        kvp1.name = 'test1'
        kvp1.value = 'bar'
        kvp2 = KeyValuePair()
        kvp2.name = 'test2'
        kvp2.value = 'bar'
        mock_return_value = [kvp1, kvp2]
        mock_api_client.keys.get_all.return_value = mock_return_value
        self._set_mock_api_client(mock_api_client)

        values = self._datastore_service.list_values(local=True)
        self.assertEqual(len(values), 2)
        self.assertEqual(values, mock_return_value)

    def test_datastore_operations_get_value(self):
        mock_api_client = mock.Mock()
        kvp1 = KeyValuePair()
        kvp1.name = 'test1'
        kvp1.value = 'bar'
        mock_api_client.keys.get_by_id.return_value = kvp1
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.get_value(name='test1', local=False)
        self.assertEqual(value, kvp1.value)

    def test_datastore_operations_set_value(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.update.return_value = True
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.set_value(name='test1',
                                                  value='foo',
                                                  local=False)
        self.assertTrue(value)

    def test_datastore_operations_delete_value(self):
        mock_api_client = mock.Mock()
        mock_api_client.keys.delete.return_value = True
        self._set_mock_api_client(mock_api_client)

        value = self._datastore_service.delete_value(name='test', local=False)
        self.assertTrue(value)

    def _set_mock_api_client(self, mock_api_client):
        mock_method = mock.Mock()
        mock_method.return_value = mock_api_client
        self._datastore_service._get_api_client = mock_method