Use db_related_field to store events for resource
This commit is contained in:
parent
2d0bd054d6
commit
9867b1e91b
@ -38,14 +38,16 @@ def create_event(event_dict):
|
||||
|
||||
|
||||
def add_event(ev):
|
||||
rst = all_events(ev.parent_node)
|
||||
rst = all_events(ev.parent)
|
||||
for rev in rst:
|
||||
if ev == rev:
|
||||
break
|
||||
else:
|
||||
rst.append(ev)
|
||||
resource_db = orm.DBResource.load(ev.parent)
|
||||
event_db = orm.DBEvent(**ev.to_dict())
|
||||
event_db.save()
|
||||
resource_db.events.add(event_db)
|
||||
|
||||
|
||||
def add_dep(parent, dep, actions, state='success'):
|
||||
@ -59,20 +61,27 @@ def add_dep(parent, dep, actions, state='success'):
|
||||
def add_react(parent, dep, actions, state='success'):
|
||||
for act in actions:
|
||||
r = React(parent, act, state=state,
|
||||
depend_node=dep, depend_action=act)
|
||||
depend_node=dep, depend_action=act)
|
||||
add_event(r)
|
||||
log.debug('Added event: %s', r)
|
||||
|
||||
|
||||
def add_events(resource, lst):
|
||||
db_resource = orm.DBResource.load(resource)
|
||||
for ev in lst:
|
||||
event_db = orm.DBEvent(**ev.to_dict())
|
||||
event_db.save()
|
||||
db_resource.events.add(event_db)
|
||||
|
||||
|
||||
def set_events(resource, lst):
|
||||
orm.DBEvent.delete_list(resource)
|
||||
add_events(resource, lst)
|
||||
db_resource = orm.DBResource.load(resource)
|
||||
for ev in db_resource.events.as_set():
|
||||
ev.delete()
|
||||
for ev in lst:
|
||||
event_db = orm.DBEvent(**ev.to_dict())
|
||||
event_db.save()
|
||||
db_resource.events.add(event_db)
|
||||
|
||||
|
||||
def remove_event(ev):
|
||||
@ -81,7 +90,7 @@ def remove_event(ev):
|
||||
|
||||
|
||||
def all_events(resource):
|
||||
events = orm.DBEvent.load_list(resource)
|
||||
events = orm.DBResource.load(resource).events.as_set()
|
||||
|
||||
if not events:
|
||||
return []
|
||||
|
@ -132,7 +132,7 @@ class BaseGraphDB(object):
|
||||
DEFAULT_COLLECTION=COLLECTIONS.resource
|
||||
RELATION_TYPES = Enum(
|
||||
'RelationTypes',
|
||||
'input_to_input resource_input plan_edge graph_to_node'
|
||||
'input_to_input resource_input plan_edge graph_to_node resource_event'
|
||||
)
|
||||
DEFAULT_RELATION=RELATION_TYPES.resource_input
|
||||
|
||||
@ -172,6 +172,10 @@ class BaseGraphDB(object):
|
||||
def create(self, name, properties={}, collection=DEFAULT_COLLECTION):
|
||||
"""Create element (node) with given name, args, of type `collection`."""
|
||||
|
||||
@abc.abstractmethod
|
||||
def delete(self, name, collection=DEFAULT_COLLECTION):
|
||||
"""Delete element with given name. of type `collection`."""
|
||||
|
||||
@abc.abstractmethod
|
||||
def create_relation(self,
|
||||
source,
|
||||
|
@ -38,6 +38,9 @@ class RedisGraphDB(BaseGraphDB):
|
||||
elif relation_db['type_'] == BaseGraphDB.RELATION_TYPES.resource_input.name:
|
||||
source_collection = BaseGraphDB.COLLECTIONS.resource
|
||||
dest_collection = BaseGraphDB.COLLECTIONS.input
|
||||
elif relation_db['type_'] == BaseGraphDB.RELATION_TYPES.resource_event.name:
|
||||
source_collection = BaseGraphDB.COLLECTIONS.resource
|
||||
dest_collection = BaseGraphDB.COLLECTIONS.events
|
||||
|
||||
source = self.get(relation_db['source'], collection=source_collection)
|
||||
dest = self.get(relation_db['dest'], collection=dest_collection)
|
||||
|
@ -489,6 +489,29 @@ class DBResourceInput(DBObject):
|
||||
return self.parse_backtracked_value(self.backtrack_value_emitter())
|
||||
|
||||
|
||||
class DBEvent(DBObject):
|
||||
|
||||
__metaclass__ = DBObjectMeta
|
||||
|
||||
_collection = base.BaseGraphDB.COLLECTIONS.events
|
||||
|
||||
id = db_field(is_primary=True)
|
||||
parent = db_field(schema='str!')
|
||||
parent_action = db_field(schema='str!')
|
||||
etype = db_field('str!')
|
||||
state = db_field('str')
|
||||
child = db_field('str')
|
||||
child_action = db_field('str')
|
||||
|
||||
def delete(self):
|
||||
db.delete_relations(
|
||||
dest=self._db_node,
|
||||
type_=base.BaseGraphDB.RELATION_TYPES.resource_event
|
||||
)
|
||||
super(DBEvent, self).delete()
|
||||
|
||||
|
||||
|
||||
class DBResource(DBObject):
|
||||
__metaclass__ = DBObjectMeta
|
||||
|
||||
@ -507,6 +530,8 @@ class DBResource(DBObject):
|
||||
|
||||
inputs = db_related_field(base.BaseGraphDB.RELATION_TYPES.resource_input,
|
||||
DBResourceInput)
|
||||
events = db_related_field(base.BaseGraphDB.RELATION_TYPES.resource_event,
|
||||
DBEvent)
|
||||
|
||||
def add_input(self, name, schema, value):
|
||||
# NOTE: Inputs need to have uuid added because there can be many
|
||||
@ -522,39 +547,17 @@ class DBResource(DBObject):
|
||||
|
||||
self.inputs.add(input)
|
||||
|
||||
|
||||
class DBEvent(DBObject):
|
||||
|
||||
__metaclass__ = DBObjectMeta
|
||||
|
||||
_collection = base.BaseGraphDB.COLLECTIONS.events
|
||||
|
||||
id = db_field(is_primary=True)
|
||||
parent = db_field(schema='str!')
|
||||
parent_action = db_field(schema='str!')
|
||||
etype = db_field('str!')
|
||||
state = db_field('str')
|
||||
child = db_field('str')
|
||||
child_action = db_field('str')
|
||||
|
||||
@classmethod
|
||||
def load_list(cls, parent):
|
||||
rs = db.all(collection=cls._collection.name + ':' + parent)
|
||||
return [cls(**r.properties) for r in rs]
|
||||
|
||||
@classmethod
|
||||
def delete_list(cls, parent):
|
||||
db.delete('*', collection=cls._collection.name + ':' + parent)
|
||||
|
||||
@property
|
||||
def _db_key(self):
|
||||
if not self._primary_field.value:
|
||||
setattr(self, self._primary_field.name,
|
||||
'{}:{}:{}:{}:{}'.format(
|
||||
self.parent, self.parent_action,
|
||||
self.state, self.child, self.child_action))
|
||||
self._update_fields_values()
|
||||
return DBObject._db_key.fget(self)
|
||||
def add_event(self, action, state, etype, child, child_action):
|
||||
event = DBEvent(
|
||||
parent=self.name,
|
||||
parent_action=action,
|
||||
state=state,
|
||||
etype=etype,
|
||||
child=child,
|
||||
child_action=child_action
|
||||
)
|
||||
event.save()
|
||||
self.events.add(event)
|
||||
|
||||
|
||||
# TODO: remove this
|
||||
|
@ -17,6 +17,7 @@ import networkx as nx
|
||||
from pytest import fixture
|
||||
|
||||
from solar.events import api as evapi
|
||||
from solar.interfaces import orm
|
||||
|
||||
from .base import BaseResourceTest
|
||||
|
||||
@ -31,11 +32,16 @@ def events_example():
|
||||
|
||||
|
||||
def test_add_events(events_example):
|
||||
r = orm.DBResource(id='e1', name='e1', base_path='x')
|
||||
r.save()
|
||||
|
||||
evapi.add_events('e1', events_example)
|
||||
assert set(evapi.all_events('e1')) == set(events_example)
|
||||
|
||||
|
||||
def test_set_events(events_example):
|
||||
r = orm.DBResource(id='e1', name='e1', base_path='x')
|
||||
r.save()
|
||||
partial = events_example[:2]
|
||||
evapi.add_events('e1', events_example[:2])
|
||||
evapi.set_events('e1', events_example[2:])
|
||||
@ -43,6 +49,8 @@ def test_set_events(events_example):
|
||||
|
||||
|
||||
def test_remove_events(events_example):
|
||||
r = orm.DBResource(id='e1', name='e1', base_path='x')
|
||||
r.save()
|
||||
to_be_removed = events_example[2]
|
||||
evapi.add_events('e1', events_example)
|
||||
evapi.remove_event(to_be_removed)
|
||||
@ -50,6 +58,8 @@ def test_remove_events(events_example):
|
||||
|
||||
|
||||
def test_single_event(events_example):
|
||||
r = orm.DBResource(id='e1', name='e1', base_path='x')
|
||||
r.save()
|
||||
evapi.add_events('e1', events_example[:2])
|
||||
evapi.add_event(events_example[2])
|
||||
assert set(evapi.all_events('e1')) == set(events_example)
|
||||
|
@ -425,6 +425,11 @@ input:
|
||||
|
||||
class TestEventORM(BaseResourceTest):
|
||||
|
||||
def test_return_emtpy_set(self):
|
||||
r = orm.DBResource(id='test1', name='test1', base_path='x')
|
||||
r.save()
|
||||
self.assertEqual(r.events.as_set(), set())
|
||||
|
||||
def test_save_and_load_by_parent(self):
|
||||
ev = orm.DBEvent(
|
||||
parent='n1',
|
||||
@ -435,9 +440,8 @@ class TestEventORM(BaseResourceTest):
|
||||
etype='dependency')
|
||||
ev.save()
|
||||
|
||||
rst = orm.DBEvent.load_list('n1')
|
||||
self.assertEqual(len(rst), 1)
|
||||
self.assertEqual(rst[0], ev)
|
||||
rst = orm.DBEvent.load(ev.id)
|
||||
self.assertEqual(rst, ev)
|
||||
|
||||
def test_save_several(self):
|
||||
ev = orm.DBEvent(
|
||||
@ -456,4 +460,24 @@ class TestEventORM(BaseResourceTest):
|
||||
child='n3',
|
||||
etype='dependency')
|
||||
ev1.save()
|
||||
self.assertEqual(len(orm.DBEvent.load_list('n1')), 2)
|
||||
self.assertEqual(len(orm.DBEvent.load_all()), 2)
|
||||
|
||||
def test_removal_of_event(self):
|
||||
r = orm.DBResource(id='n1', name='n1', base_path='x')
|
||||
r.save()
|
||||
|
||||
ev = orm.DBEvent(
|
||||
parent='n1',
|
||||
parent_action='run',
|
||||
state='success',
|
||||
child_action='run',
|
||||
child='n2',
|
||||
etype='dependency')
|
||||
ev.save()
|
||||
r.events.add(ev)
|
||||
|
||||
self.assertEqual(r.events.as_set(), {ev})
|
||||
ev.delete()
|
||||
|
||||
r = orm.DBResource.load('n1')
|
||||
self.assertEqual(r.events.as_set(), set())
|
||||
|
Loading…
x
Reference in New Issue
Block a user