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)
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)
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)
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']), '')
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']), '')
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
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
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
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
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
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
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
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 []
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)
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)
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 ''
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)
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)
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_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.')
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)
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
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)
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
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
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
def _create_save_kvp(): created = KeyValuePairDB() created.name = 'token' created.value = '0123456789ABCDEF' return KeyValuePair.add_or_update(created)