def add_or_update_given_trace_db(trace_db, action_executions=None, rules=None, trigger_instances=None): """ Will update an existing Trace. :param trace_db: The TraceDB to update. :type trace_db: ``TraceDB`` :param action_executions: The action_execution to be added to the Trace. Should a list of object_ids or a dict containing object_ids and caused_by. :type action_executions: ``list`` :param rules: The rules to be added to the Trace. Should a list of object_ids or a dict containing object_ids and caused_by. :type rules: ``list`` :param trigger_instances: The trigger_instances to be added to the Trace. Should a list of object_ids or a dict containing object_ids and caused_by. :type trigger_instances: ``list`` :rtype: ``TraceDB`` """ if trace_db is None: raise ValueError("trace_db should be non-None.") if not action_executions: action_executions = [] action_executions = [ _to_trace_component_db(component=action_execution) for action_execution in action_executions ] if not rules: rules = [] rules = [_to_trace_component_db(component=rule) for rule in rules] if not trigger_instances: trigger_instances = [] trigger_instances = [ _to_trace_component_db(component=trigger_instance) for trigger_instance in trigger_instances ] # If an id exists then this is an update and we do not want to perform # an upsert so use push_components which will use the push operator. if trace_db.id: return Trace.push_components( trace_db, action_executions=action_executions, rules=rules, trigger_instances=trigger_instances, ) trace_db.action_executions = action_executions trace_db.rules = rules trace_db.trigger_instances = trigger_instances return Trace.add_or_update(trace_db)
def test_update_via_list_push_components(self): no_action_executions = 4 no_rules = 4 no_trigger_instances = 5 saved = TraceDBTest._create_save_trace( trace_tag='test_trace', action_executions=[ str(bson.ObjectId()) for _ in range(no_action_executions) ], rules=[str(bson.ObjectId()) for _ in range(no_rules)], trigger_instances=[ str(bson.ObjectId()) for _ in range(no_trigger_instances) ]) retrieved = Trace.push_components( saved, action_executions=[ TraceComponentDB(object_id=str(bson.ObjectId())) for _ in range(no_action_executions) ], rules=[ TraceComponentDB(object_id=str(bson.ObjectId())) for _ in range(no_rules) ], trigger_instances=[ TraceComponentDB(object_id=str(bson.ObjectId())) for _ in range(no_trigger_instances) ]) self.assertEqual(retrieved.id, saved.id, 'Incorrect trace retrieved.') self.assertEqual(len(retrieved.action_executions), no_action_executions * 2) self.assertEqual(len(retrieved.rules), no_rules * 2) self.assertEqual(len(retrieved.trigger_instances), no_trigger_instances * 2)
def add_or_update_given_trace_db(trace_db, action_executions=None, rules=None, trigger_instances=None): """ Will update an existing Trace. :param trace_db: The TraceDB to update. :type trace_db: ``TraceDB`` :param action_executions: The action_execution to be added to the Trace. Should a list of object_ids or a dict containing object_ids and caused_by. :type action_executions: ``list`` :param rules: The rules to be added to the Trace. Should a list of object_ids or a dict containing object_ids and caused_by. :type rules: ``list`` :param trigger_instances: The trigger_instances to be added to the Trace. Should a list of object_ids or a dict containing object_ids and caused_by. :type trigger_instances: ``list`` :rtype: ``TraceDB`` """ if trace_db is None: raise ValueError('trace_db should be non-None.') if not action_executions: action_executions = [] action_executions = [_to_trace_component_db(component=action_execution) for action_execution in action_executions] if not rules: rules = [] rules = [_to_trace_component_db(component=rule) for rule in rules] if not trigger_instances: trigger_instances = [] trigger_instances = [_to_trace_component_db(component=trigger_instance) for trigger_instance in trigger_instances] # If an id exists then this is an update and we do not want to perform # an upsert so use push_components which will use the push operator. if trace_db.id: return Trace.push_components(trace_db, action_executions=action_executions, rules=rules, trigger_instances=trigger_instances) trace_db.action_executions = action_executions trace_db.rules = rules trace_db.trigger_instances = trigger_instances return Trace.add_or_update(trace_db)
def test_update_via_list_push_components(self): no_action_executions = 4 no_rules = 4 no_trigger_instances = 5 saved = TraceDBTest._create_save_trace( trace_tag='test_trace', action_executions=[str(bson.ObjectId()) for _ in range(no_action_executions)], rules=[str(bson.ObjectId()) for _ in range(no_rules)], trigger_instances=[str(bson.ObjectId()) for _ in range(no_trigger_instances)]) retrieved = Trace.push_components( saved, action_executions=[TraceComponentDB(object_id=str(bson.ObjectId())) for _ in range(no_action_executions)], rules=[TraceComponentDB(object_id=str(bson.ObjectId())) for _ in range(no_rules)], trigger_instances=[TraceComponentDB(object_id=str(bson.ObjectId())) for _ in range(no_trigger_instances)]) self.assertEquals(retrieved.id, saved.id, 'Incorrect trace retrieved.') self.assertEquals(len(retrieved.action_executions), no_action_executions * 2) self.assertEquals(len(retrieved.rules), no_rules * 2) self.assertEquals(len(retrieved.trigger_instances), no_trigger_instances * 2)