Beispiel #1
0
    def test_get_finalized_params_system_values(self):
        KeyValuePair.add_or_update(
            KeyValuePairDB(name='actionstr', value='foo'))
        KeyValuePair.add_or_update(
            KeyValuePairDB(name='actionnumber', value='1.0'))
        params = {'runnerint': 555}
        actionexec_db = self._get_action_exec_db_model(params)

        runner_params, action_params = param_utils.get_finalized_params(
            ParamsUtilsTest.runnertype_db.runner_parameters,
            ParamsUtilsTest.action_system_default_db.parameters,
            actionexec_db.parameters)

        # Asserts for runner params.
        # Assert that default values for runner params are resolved.
        self.assertEqual(runner_params.get('runnerstr'), 'defaultfoo')
        # Assert that a runner param from action exec is picked up.
        self.assertEqual(runner_params.get('runnerint'), 555)
        # Assert that an immutable param cannot be overriden by action param or execution param.
        self.assertEqual(runner_params.get('runnerimmutable'),
                         'runnerimmutable')

        # Asserts for action params.
        self.assertEqual(action_params.get('actionstr'), 'foo')
        self.assertEqual(action_params.get('actionnumber'), 1.0)
Beispiel #2
0
    def delete(self, name):
        """
            Delete the key value pair.

            Handles requests:
                DELETE /keys/1
        """
        kvp_db = self.__get_by_name(name=name)

        if not kvp_db:
            abort(http_client.NOT_FOUND)
            return

        LOG.debug('DELETE /keys/ lookup with name=%s found object: %s', name, kvp_db)

        try:
            KeyValuePair.delete(kvp_db)
        except Exception as e:
            LOG.exception('Database delete encountered exception during '
                          'delete of name="%s". ', name)
            abort(http_client.INTERNAL_SERVER_ERROR, str(e))
            return

        extra = {'kvp_db': kvp_db}
        LOG.audit('KeyValuePair deleted. KeyValuePair.id=%s' % (kvp_db.id), extra=extra)
Beispiel #3
0
    def delete(self, name):
        """
            Delete the key value pair.

            Handles requests:
                DELETE /keys/1
        """
        LOG.info('DELETE /keys/ with id=%s', id)
        kvp_db = self.__get_by_name(name=name)

        if not kvp_db:
            LOG.exception('Database lookup for name="%s" '
                          'resulted in exception.', name)
            abort(http_client.NOT_FOUND)
            return

        LOG.debug('DELETE /keys/ lookup with name=%s found '
                  'object: %s', name, kvp_db)
        try:
            KeyValuePair.delete(kvp_db)
        except Exception as e:
            LOG.exception('Database delete encountered exception during '
                          'delete of name="%s". ', name)
            abort(http_client.INTERNAL_SERVER_ERROR, str(e))
            return

        LOG.audit('KeyValuePair deleted. KeyValuePair=%s', kvp_db)
    def test_non_hierarchical_lookup(self):
        k1 = KeyValuePair.add_or_update(KeyValuePairDB(name='k1', value='v1'))
        k2 = KeyValuePair.add_or_update(KeyValuePairDB(name='k2', value='v2'))
        k3 = KeyValuePair.add_or_update(KeyValuePairDB(name='k3', value='v3'))

        lookup = KeyValueLookup()
        self.assertEquals(str(lookup.k1), k1.value)
        self.assertEquals(str(lookup.k2), k2.value)
        self.assertEquals(str(lookup.k3), k3.value)
Beispiel #5
0
    def test_non_hierarchical_lookup(self):
        k1 = KeyValuePair.add_or_update(KeyValuePairDB(name='k1', value='v1'))
        k2 = KeyValuePair.add_or_update(KeyValuePairDB(name='k2', value='v2'))
        k3 = KeyValuePair.add_or_update(KeyValuePairDB(name='k3', value='v3'))

        lookup = KeyValueLookup()
        self.assertEquals(str(lookup.k1), k1.value)
        self.assertEquals(str(lookup.k2), k2.value)
        self.assertEquals(str(lookup.k3), k3.value)
    def test_hierarchical_lookup_dict(self):
        k1 = KeyValuePair.add_or_update(KeyValuePairDB(name='a.b', value='v1'))
        k2 = KeyValuePair.add_or_update(KeyValuePairDB(name='a.b.c', value='v2'))
        k3 = KeyValuePair.add_or_update(KeyValuePairDB(name='b.c', value='v3'))

        lookup = KeyValueLookup()
        self.assertEquals(str(lookup['a']['b']), k1.value)
        self.assertEquals(str(lookup['a']['b']['c']), k2.value)
        self.assertEquals(str(lookup['b']['c']), k3.value)
        self.assertEquals(str(lookup['a']), '')
Beispiel #7
0
    def test_hierarchical_lookup_dict(self):
        k1 = KeyValuePair.add_or_update(KeyValuePairDB(name='a.b', value='v1'))
        k2 = KeyValuePair.add_or_update(
            KeyValuePairDB(name='a.b.c', value='v2'))
        k3 = KeyValuePair.add_or_update(KeyValuePairDB(name='b.c', value='v3'))

        lookup = KeyValueLookup()
        self.assertEquals(str(lookup['a']['b']), k1.value)
        self.assertEquals(str(lookup['a']['b']['c']), k2.value)
        self.assertEquals(str(lookup['b']['c']), k3.value)
        self.assertEquals(str(lookup['a']), '')
Beispiel #8
0
    def put(self, id, kvp):
        LOG.info('PUT /keys/ with key id=%s and data=%s', id, kvp)
        kvp_db = self.__get_by_id(id)
        LOG.debug('PUT /keys/ lookup with id=%s found object: %s', id, kvp_db)

        try:
            if kvp.id and kvp.id != id:
                LOG.warning(
                    'Discarding mismatched id=%s found in payload '
                    'and using uri_id=%s.', kvp.id, id)
            old_kvp_db = kvp_db
            kvp_db = KeyValuePairAPI.to_model(kvp)
            kvp_db.id = id
            kvp_db = KeyValuePair.add_or_update(kvp_db)
        except (ValidationError, ValueError) as e:
            LOG.exception('Validation failed for key value data=%s', kvp)
            abort(http_client.BAD_REQUEST, str(e))
            return

        LOG.audit(
            'KeyValuePair updated. KeyValuePair=%s and original KeyValuePair=%s',
            kvp_db, old_kvp_db)
        kvp_api = KeyValuePairAPI.from_model(kvp_db)
        LOG.debug('PUT /keys/ client_result=%s', kvp_api)

        return kvp_api
Beispiel #9
0
    def post(self, kvp):
        """
            Create a new key value pair.

            Handles requests:
                POST /keys/
        """
        LOG.info('POST /keys/ with key value data=%s', kvp)

        try:
            kvp_db = KeyValuePairAPI.to_model(kvp)
            LOG.debug(
                '/keys/ POST verified KeyValuePairAPI and '
                'formulated KeyValuePairDB=%s', kvp_db)
        except (ValidationError, ValueError) as e:
            LOG.exception('Validation failed for key value data=%s.', kvp)
            abort(http_client.BAD_REQUEST, str(e))
            return

        kvp_db = KeyValuePair.add_or_update(kvp_db)
        LOG.audit('KeyValuePair created. KeyValuePair=%s', kvp_db)

        kvp_api = KeyValuePairAPI.from_model(kvp_db)
        LOG.debug('POST /keys/ client_result=%s', kvp_api)

        return kvp_api
Beispiel #10
0
    def put(self, name, kvp):
        """
        Create a new entry or update an existing one.
        """
        # TODO: There is a race, add custom add_or_update which updates by non
        # id field
        existing_kvp = self.__get_by_name(name=name)

        kvp.name = name

        try:
            kvp_db = KeyValuePairAPI.to_model(kvp)

            if existing_kvp:
                kvp_db.id = existing_kvp.id

            kvp_db = KeyValuePair.add_or_update(kvp_db)
        except (ValidationError, ValueError) as e:
            LOG.exception('Validation failed for key value data=%s', kvp)
            abort(http_client.BAD_REQUEST, str(e))
            return

        extra = {'kvp_db': kvp_db}
        LOG.audit('KeyValuePair updated. KeyValuePair.id=%s' % (kvp_db.id), extra=extra)
        kvp_api = KeyValuePairAPI.from_model(kvp_db)

        return kvp_api
Beispiel #11
0
    def put(self, id, kvp):
        LOG.info('PUT /keys/ with key id=%s and data=%s', id, kvp)
        kvp_db = self.__get_by_id(id)
        LOG.debug('PUT /keys/ lookup with id=%s found object: %s', id, kvp_db)

        try:
            if kvp.id and kvp.id != id:
                LOG.warning('Discarding mismatched id=%s found in payload '
                            'and using uri_id=%s.',
                            kvp.id, id)
            old_kvp_db = kvp_db
            kvp_db = KeyValuePairAPI.to_model(kvp)
            kvp_db.id = id
            kvp_db = KeyValuePair.add_or_update(kvp_db)
        except (ValidationError, ValueError) as e:
            LOG.exception('Validation failed for key value data=%s', kvp)
            abort(http_client.BAD_REQUEST, str(e))
            return

        LOG.audit('KeyValuePair updated. KeyValuePair=%s and original KeyValuePair=%s',
                  kvp_db, old_kvp_db)
        kvp_api = KeyValuePairAPI.from_model(kvp_db)
        LOG.debug('PUT /keys/ client_result=%s', kvp_api)

        return kvp_api
Beispiel #12
0
    def post(self, kvp):
        """
            Create a new key value pair.

            Handles requests:
                POST /keys/
        """
        LOG.info('POST /keys/ with key value data=%s', kvp)

        try:
            kvp_db = KeyValuePairAPI.to_model(kvp)
            LOG.debug('/keys/ POST verified KeyValuePairAPI and '
                      'formulated KeyValuePairDB=%s', kvp_db)
        except (ValidationError, ValueError) as e:
            LOG.exception('Validation failed for key value data=%s.', kvp)
            abort(http_client.BAD_REQUEST, str(e))
            return

        kvp_db = KeyValuePair.add_or_update(kvp_db)
        LOG.audit('KeyValuePair created. KeyValuePair=%s', kvp_db)

        kvp_api = KeyValuePairAPI.from_model(kvp_db)
        LOG.debug('POST /keys/ client_result=%s', kvp_api)

        return kvp_api
Beispiel #13
0
 def __get_by_name(name):
     try:
         return KeyValuePair.get_by_name(name)
     except ValueError as e:
         LOG.debug('Database lookup for name="%s" '
                   'resulted in exception : %s.', name, e)
         return None
Beispiel #14
0
    def put(self, name, kvp):
        """
        Create a new entry or update an existing one.
        """
        LOG.info('PUT /keys/ with key name=%s and data=%s', name, kvp)

        # TODO: There is a race, add custom add_or_update which updates by non
        # id field
        existing_kvp = self.__get_by_name(name=name)

        kvp.name = name

        try:
            kvp_db = KeyValuePairAPI.to_model(kvp)

            if existing_kvp:
                kvp_db.id = existing_kvp.id

            kvp_db = KeyValuePair.add_or_update(kvp_db)
        except (ValidationError, ValueError) as e:
            LOG.exception('Validation failed for key value data=%s', kvp)
            abort(http_client.BAD_REQUEST, str(e))
            return

        LOG.audit('KeyValuePair updated. KeyValuePair=%s', kvp_db)
        kvp_api = KeyValuePairAPI.from_model(kvp_db)
        LOG.debug('PUT /keys/ client_result=%s', kvp_api)

        return kvp_api
Beispiel #15
0
 def __get_by_name(name):
     try:
         return [KeyValuePair.get_by_name(name)]
     except ValueError as e:
         LOG.debug('Database lookup for name="%s" '
                   'resulted in exception : %s.', name, e)
         return []
Beispiel #16
0
 def __get_by_id(id):
     try:
         return KeyValuePair.get_by_id(id)
     except Exception:
         LOG.exception('Database lookup for id="%s" '
                       'resulted in exception.', id)
         abort(http_client.NOT_FOUND)
Beispiel #17
0
 def __get_by_id(id):
     try:
         return KeyValuePair.get_by_id(id)
     except Exception:
         LOG.exception(
             'Database lookup for id="%s" '
             'resulted in exception.', id)
         abort(http_client.NOT_FOUND)
Beispiel #18
0
 def _get_kv(self, key):
     kvp = None
     try:
         kvp = KeyValuePair.get_by_name(key)
     except ValueError:
         # ValueErrors are expected in case of partial lookups
         pass
     # A good default value for un-matched value is empty string since that will be used
     # for rendering templates.
     return kvp.value if kvp else ''
Beispiel #19
0
 def test_chain_runner_vars(self, schedule):
     kvps = []
     try:
         kvps.append(KeyValuePair.add_or_update(KeyValuePairDB(name='a', value='two')))
         chain_runner = acr.get_runner()
         chain_runner.entry_point = CHAIN_VARS
         chain_runner.action = ACTION_2
         chain_runner.container_service = RunnerContainerService()
         chain_runner.pre_run()
         chain_runner.run({})
         self.assertNotEqual(chain_runner.chain_holder.actionchain, None)
         expected_value = {'inttype': 1,
                           'strtype': 'two',
                           'booltype': True}
         mock_args, _ = schedule.call_args
         self.assertEqual(mock_args[0].parameters, expected_value)
     finally:
         for kvp in kvps:
             KeyValuePair.delete(kvp)
Beispiel #20
0
 def _get_kv(self, key):
     kvp = None
     try:
         kvp = KeyValuePair.get_by_name(key)
     except ValueError:
         # ValueErrors are expected in case of partial lookups
         pass
     # A good default value for un-matched value is empty string since that will be used
     # for rendering templates.
     return kvp.value if kvp else ''
Beispiel #21
0
 def test_chain_runner_vars(self, schedule):
     kvps = []
     try:
         kvps.append(
             KeyValuePair.add_or_update(
                 KeyValuePairDB(name='a', value='two')))
         chain_runner = acr.get_runner()
         chain_runner.entry_point = CHAIN_VARS
         chain_runner.action = ACTION_2
         chain_runner.container_service = RunnerContainerService()
         chain_runner.pre_run()
         chain_runner.run({})
         self.assertNotEqual(chain_runner.chain_holder.actionchain, None)
         expected_value = {'inttype': 1, 'strtype': 'two', 'booltype': True}
         mock_args, _ = schedule.call_args
         self.assertEqual(mock_args[0].parameters, expected_value)
     finally:
         for kvp in kvps:
             KeyValuePair.delete(kvp)
Beispiel #22
0
    def delete(self, id):
        """
            Delete the key value pair.

            Handles requests:
                DELETE /keys/1
        """
        LOG.info('DELETE /keys/ with id=%s', id)
        kvp_db = self.__get_by_id(id)
        LOG.debug('DELETE /keys/ lookup with id=%s found '
                  'object: %s', id, kvp_db)
        try:
            KeyValuePair.delete(kvp_db)
        except Exception as e:
            LOG.exception('Database delete encountered exception during '
                          'delete of id="%s". ', id)
            abort(http_client.INTERNAL_SERVER_ERROR, str(e))
            return

        LOG.audit('KeyValuePair deleted. KeyValuePair=%s', kvp_db)
Beispiel #23
0
    def test_kvp_crud(self):
        saved = KeyValuePairModelTest._create_save_kvp()
        retrieved = KeyValuePair.get_by_name(saved.name)
        self.assertEqual(saved.id, retrieved.id,
                         'Same KeyValuePair was not returned.')

        # test update
        self.assertEqual(retrieved.value, '0123456789ABCDEF')
        retrieved.value = 'ABCDEF0123456789'
        saved = KeyValuePair.add_or_update(retrieved)
        retrieved = KeyValuePair.get_by_name(saved.name)
        self.assertEqual(retrieved.value, 'ABCDEF0123456789',
                         'Update of key value failed')

        # cleanup
        KeyValuePairModelTest._delete([retrieved])
        try:
            retrieved = KeyValuePair.get_by_name(saved.name)
        except ValueError:
            retrieved = None
        self.assertIsNone(retrieved, 'managed to retrieve after failure.')
Beispiel #24
0
    def test_kvp_crud(self):
        saved = KeyValuePairModelTest._create_save_kvp()
        retrieved = KeyValuePair.get_by_name(saved.name)
        self.assertEqual(saved.id, retrieved.id,
                         'Same KeyValuePair was not returned.')

        # test update
        self.assertEqual(retrieved.value, '0123456789ABCDEF')
        retrieved.value = 'ABCDEF0123456789'
        saved = KeyValuePair.add_or_update(retrieved)
        retrieved = KeyValuePair.get_by_name(saved.name)
        self.assertEqual(retrieved.value, 'ABCDEF0123456789',
                         'Update of key value failed')

        # cleanup
        KeyValuePairModelTest._delete([retrieved])
        try:
            retrieved = KeyValuePair.get_by_name(saved.name)
        except ValueError:
            retrieved = None
        self.assertIsNone(retrieved, 'managed to retrieve after failure.')
Beispiel #25
0
    def delete(self, id):
        """
            Delete the key value pair.

            Handles requests:
                DELETE /keys/1
        """
        LOG.info('DELETE /keys/ with id=%s', id)
        kvp_db = self.__get_by_id(id)
        LOG.debug('DELETE /keys/ lookup with id=%s found '
                  'object: %s', id, kvp_db)
        try:
            KeyValuePair.delete(kvp_db)
        except Exception as e:
            LOG.exception(
                'Database delete encountered exception during '
                'delete of id="%s". ', id)
            abort(http_client.INTERNAL_SERVER_ERROR, str(e))
            return

        LOG.audit('KeyValuePair deleted. KeyValuePair=%s', kvp_db)
 def test_system_transform(self):
     k5 = KeyValuePair.add_or_update(KeyValuePairDB(name='k5', value='v5'))
     k6 = KeyValuePair.add_or_update(KeyValuePairDB(name='k6', value='v6'))
     k7 = KeyValuePair.add_or_update(KeyValuePairDB(name='k7', value='v7'))
     try:
         transformer = datatransform.get_transformer(PAYLOAD_WITH_KVP)
         mapping = {'ip5': '{{trigger.k5}}-static',
                    'ip6': '{{system.k6}}-static',
                    'ip7': '{{system.k7}}-static'}
         result = transformer(mapping)
         expected = {'ip5': 'v5-static',
                     'ip6': 'v6-static',
                     'ip7': 'v7-static'}
         self.assertEqual(result, expected)
     finally:
         KeyValuePair.delete(k5)
         KeyValuePair.delete(k6)
         KeyValuePair.delete(k7)
Beispiel #27
0
 def test_system_transform(self):
     k5 = KeyValuePair.add_or_update(KeyValuePairDB(name='k5', value='v5'))
     k6 = KeyValuePair.add_or_update(KeyValuePairDB(name='k6', value='v6'))
     k7 = KeyValuePair.add_or_update(KeyValuePairDB(name='k7', value='v7'))
     try:
         transformer = datatransform.get_transformer(PAYLOAD_WITH_KVP)
         mapping = {'ip5': '{{trigger.k5}}-static',
                    'ip6': '{{system.k6}}-static',
                    'ip7': '{{system.k7}}-static'}
         result = transformer(mapping)
         expected = {'ip5': 'v5-static',
                     'ip6': 'v6-static',
                     'ip7': 'v7-static'}
         self.assertEqual(result, expected)
     finally:
         KeyValuePair.delete(k5)
         KeyValuePair.delete(k6)
         KeyValuePair.delete(k7)
Beispiel #28
0
    def get_all(self, **kw):
        """
            List all keys.

            Handles requests:
                GET /keys/
        """
        LOG.info('GET all /keys/ with filters=%s', kw)

        kvp_dbs = KeyValuePair.get_all(**kw)
        kvps = [KeyValuePairAPI.from_model(kvp_db) for kvp_db in kvp_dbs]
        LOG.debug('GET all /keys/ client_result=%s', kvps)

        return kvps
Beispiel #29
0
    def get_all(self, **kw):
        """
            List all keys.

            Handles requests:
                GET /keys/
        """
        LOG.info('GET all /keys/ with filters=%s', kw)

        kvp_dbs = KeyValuePair.get_all(**kw)
        kvps = [KeyValuePairAPI.from_model(kvp_db) for kvp_db in kvp_dbs]
        LOG.debug('GET all /keys/ client_result=%s', kvps)

        return kvps
Beispiel #30
0
    def test_get_finalized_params_system_values(self):
        KeyValuePair.add_or_update(KeyValuePairDB(name='actionstr', value='foo'))
        KeyValuePair.add_or_update(KeyValuePairDB(name='actionnumber', value='1.0'))
        params = {
            'runnerint': 555
        }
        actionexec_db = self._get_action_exec_db_model(params)

        runner_params, action_params = param_utils.get_finalized_params(
            ParamsUtilsTest.runnertype_db.runner_parameters,
            ParamsUtilsTest.action_system_default_db.parameters,
            actionexec_db.parameters)

        # Asserts for runner params.
        # Assert that default values for runner params are resolved.
        self.assertEqual(runner_params.get('runnerstr'), 'defaultfoo')
        # Assert that a runner param from action exec is picked up.
        self.assertEqual(runner_params.get('runnerint'), 555)
        # Assert that an immutable param cannot be overriden by action param or execution param.
        self.assertEqual(runner_params.get('runnerimmutable'), 'runnerimmutable')

        # Asserts for action params.
        self.assertEqual(action_params.get('actionstr'), 'foo')
        self.assertEqual(action_params.get('actionnumber'), 1.0)
Beispiel #31
0
 def _construct_system_context(data, context):
     """Identify the system context in the data."""
     # The following regex will look for all occurrences of "{{system.*}}",
     # "{{ system.* }}", "{{ system.*}}", and "{{system.* }}" in the data.
     regex = '{{\s*' + SYSTEM_PREFIX + '.(.*?)\s*}}'
     keys = re.findall(regex, json.dumps(data))
     if not keys:
         return context
     kvps = {}
     for key in keys:
         kvp = KeyValuePair.get_by_name(key)
         kvps[key] = kvp.value
     if kvps:
         if SYSTEM_PREFIX not in context:
             context[SYSTEM_PREFIX] = {}
         context[SYSTEM_PREFIX].update(kvps)
     return context
Beispiel #32
0
    def get_all(self, **kw):
        """
            List all keys.

            Handles requests:
                GET /keys/
        """
        # Prefix filtering
        prefix_filter = kw.get('prefix', None)

        if prefix_filter:
            kw['name__startswith'] = prefix_filter
            del kw['prefix']

        kvp_dbs = KeyValuePair.get_all(**kw)
        kvps = [KeyValuePairAPI.from_model(kvp_db) for kvp_db in kvp_dbs]

        return kvps
Beispiel #33
0
    def get_all(self, **kw):
        """
            List all keys.

            Handles requests:
                GET /keys/
        """
        LOG.info('GET all /keys/ with filters=%s', kw)

        # Prefix filtering
        prefix_filter = kw.get('prefix', None)

        if prefix_filter:
            kw['name__startswith'] = prefix_filter
            del kw['prefix']

        kvp_dbs = KeyValuePair.get_all(**kw)
        kvps = [KeyValuePairAPI.from_model(kvp_db) for kvp_db in kvp_dbs]
        LOG.debug('GET all /keys/ client_result=%s', kvps)

        return kvps
Beispiel #34
0
 def _create_save_kvp():
     created = KeyValuePairDB()
     created.name = 'token'
     created.value = '0123456789ABCDEF'
     return KeyValuePair.add_or_update(created)
Beispiel #35
0
 def _create_save_kvp():
     created = KeyValuePairDB()
     created.name = 'token'
     created.value = '0123456789ABCDEF'
     return KeyValuePair.add_or_update(created)