Fix several inconsistencies with data and receiver input in case of hash
Add example of usage to hosts_file/README.md
This commit is contained in:
parent
3b420ffe4f
commit
055f89b7f6
@ -9,8 +9,8 @@ Then you can continue with standard solar things:
|
||||
```
|
||||
solar changes stage -d
|
||||
solar changes process
|
||||
solar changes run-once last
|
||||
watch -n 1 solar changes report last
|
||||
solar or run-once last
|
||||
watch -n 1 solar or report last
|
||||
```
|
||||
|
||||
Wait until all actions have state `SUCCESS`,
|
||||
@ -21,3 +21,60 @@ after that check `/etc/hosts` files on both nodes, it will contain entries like:
|
||||
10.0.0.4 second1441705178.0
|
||||
```
|
||||
|
||||
If you want to try out revert functionality - you can do it in a next way:
|
||||
|
||||
After you created all the stuff, print history like this:
|
||||
|
||||
`solar ch history`
|
||||
|
||||
Output:
|
||||
|
||||
```
|
||||
log task=hosts_file1.run uid=282fe919-6059-4100-affc-56a2b3992d9d
|
||||
log task=hosts_file2.run uid=774f5a49-00f1-4bae-8a77-90d1b2d54164
|
||||
log task=node1.run uid=2559f22c-5aa9-4c05-91c6-b70884190a56
|
||||
log task=node2.run uid=18f06abe-3e8d-4356-b172-128e1dded0e6
|
||||
```
|
||||
|
||||
Now you can try to revert creation of hosts_file1
|
||||
|
||||
```
|
||||
solar ch revert 282fe919-6059-4100-affc-56a2b3992d9d
|
||||
solar ch stage
|
||||
log task=hosts_file1.remove uid=1fe456c1-a847-4902-88bf-b7f2c5687d40
|
||||
solar ch process
|
||||
solar or run-once last
|
||||
watch -n 1 solar or report last
|
||||
```
|
||||
|
||||
For now this file will be simply cleaned (more cophisticated task can be added later).
|
||||
And you can create revert of your revert, which will lead to created hosts_file1
|
||||
resource and /etc/hosts with appropriate content
|
||||
|
||||
```
|
||||
solar ch revert 282fe919-6059-4100-affc-56a2b3992d9d
|
||||
solar ch stage
|
||||
log task=hosts_file1.remove uid=1fe456c1-a847-4902-88bf-b7f2c5687d40
|
||||
solar ch process
|
||||
solar changes run-once last
|
||||
watch -n 1 solar changes report last
|
||||
```
|
||||
|
||||
After this you can revert your result of your previous revert, which will
|
||||
create this file with relevant content.
|
||||
|
||||
```
|
||||
solar ch history -n 1
|
||||
log task=hosts_file1.remove uid=1fe456c1-a847-4902-88bf-b7f2c5687d40
|
||||
solar ch revert 1fe456c1-a847-4902-88bf-b7f2c5687d40
|
||||
solar ch stage
|
||||
log task=hosts_file1.run uid=493326b2-989f-4b94-a22c-0bbd0fc5e755
|
||||
solar ch process
|
||||
solar changes run-once last
|
||||
watch -n 1 solar changes report last
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -2,4 +2,4 @@
|
||||
sudo: yes
|
||||
tasks:
|
||||
- name: Remove hosts file
|
||||
shell: rm /etc/hosts
|
||||
shell: echo '# flushed by ansible' > /etc/hosts
|
||||
|
@ -173,7 +173,7 @@ class Resource(object):
|
||||
self.db_obj.save()
|
||||
|
||||
def to_be_removed(self):
|
||||
return self.db_obj.state == RESOURCE_STATE.error.name
|
||||
return self.db_obj.state == RESOURCE_STATE.removed.name
|
||||
|
||||
@property
|
||||
def connections(self):
|
||||
@ -183,10 +183,16 @@ class Resource(object):
|
||||
[(emitter, emitter_input, receiver, receiver_input), ...]
|
||||
"""
|
||||
rst = []
|
||||
for emitter, receiver in self.db_obj.graph().edges():
|
||||
for emitter, receiver, meta in self.db_obj.graph().edges(data=True):
|
||||
if meta:
|
||||
receiver_input = '{}:{}|{}'.format(receiver.name,
|
||||
meta['destination_key'], meta['tag'])
|
||||
else:
|
||||
receiver_input = receiver.name
|
||||
|
||||
rst.append(
|
||||
[emitter.resource.name, emitter.name,
|
||||
receiver.resource.name, receiver.name])
|
||||
receiver.resource.name, receiver_input])
|
||||
return rst
|
||||
|
||||
def resource_inputs(self):
|
||||
|
@ -437,16 +437,18 @@ class DBResourceInput(DBObject):
|
||||
super(DBResourceInput, self).delete()
|
||||
|
||||
def edges(self):
|
||||
|
||||
out = db.get_relations(
|
||||
source=self._db_node,
|
||||
type_=base.BaseGraphDB.RELATION_TYPES.input_to_input)
|
||||
incoming = db.get_relations(
|
||||
dest=self._db_node,
|
||||
type_=base.BaseGraphDB.RELATION_TYPES.input_to_input)
|
||||
for r in out + incoming:
|
||||
source = DBResourceInput(**r.start_node.properties)
|
||||
dest = DBResourceInput(**r.end_node.properties)
|
||||
yield source, dest
|
||||
for relation in out + incoming:
|
||||
meta = relation.properties
|
||||
source = DBResourceInput(**relation.start_node.properties)
|
||||
dest = DBResourceInput(**relation.end_node.properties)
|
||||
yield source, dest, meta
|
||||
|
||||
def check_other_val(self, other_val=None):
|
||||
if not other_val:
|
||||
@ -594,7 +596,9 @@ class DBCommitedState(DBObject):
|
||||
id = db_field(schema='str!', is_primary=True)
|
||||
inputs = db_field(schema={}, default_value={})
|
||||
connections = db_field(schema=[], default_value=[])
|
||||
base_path = db_field('str')
|
||||
base_path = db_field(schema='str')
|
||||
tags = db_field(schema=[], default_value=[])
|
||||
state = db_field(schema='str', default_value='removed')
|
||||
|
||||
@classmethod
|
||||
def get_or_create(cls, name):
|
||||
|
@ -25,6 +25,7 @@ from solar.orchestration import graph
|
||||
from solar.events import api as evapi
|
||||
from solar.interfaces import orm
|
||||
from .consts import CHANGES
|
||||
from solar.core.resource.resource import RESOURCE_STATE
|
||||
|
||||
db = get_db()
|
||||
|
||||
@ -65,26 +66,23 @@ def create_sorted_diff(staged, commited):
|
||||
def stage_changes():
|
||||
log = data.SL()
|
||||
log.clean()
|
||||
resources_map = {r.name: r for r in resource.load_all()}
|
||||
commited_map = {r.id: r for r in orm.DBCommitedState.load_all()}
|
||||
|
||||
for resource_id in set(resources_map.keys()) | set(commited_map.keys()):
|
||||
|
||||
if resources_map[resource_id].to_be_removed():
|
||||
for resouce_obj in resource.load_all():
|
||||
commited = resouce_obj.load_commited()
|
||||
base_path = resouce_obj.base_path
|
||||
if resouce_obj.to_be_removed():
|
||||
resource_args = {}
|
||||
resource_connections = []
|
||||
base_path = commited_map[resource_id].base_path
|
||||
else:
|
||||
resource_args = resources_map[resource_id].args
|
||||
resource_connections = resources_map[resource_id].connections
|
||||
base_path = resources_map[resource_id].base_path
|
||||
resource_args = resouce_obj.args
|
||||
resource_connections = resouce_obj.connections
|
||||
|
||||
if resource_id not in commited_map:
|
||||
if commited.state == RESOURCE_STATE.removed.name:
|
||||
commited_args = {}
|
||||
commited_connections = []
|
||||
else:
|
||||
commited_args = commited_map[resource_id].inputs
|
||||
commited_connections = commited_map[resource_id].connections
|
||||
commited_args = commited.inputs
|
||||
commited_connections = commited.connections
|
||||
|
||||
inputs_diff = create_diff(resource_args, commited_args)
|
||||
connections_diff = create_sorted_diff(
|
||||
@ -94,7 +92,7 @@ def stage_changes():
|
||||
# but using inputs to reverse connections is not possible
|
||||
if inputs_diff:
|
||||
log_item = create_logitem(
|
||||
resource_id,
|
||||
resouce_obj.name,
|
||||
guess_action(commited_args, resource_args),
|
||||
inputs_diff,
|
||||
connections_diff,
|
||||
@ -150,7 +148,7 @@ def _revert_remove(logitem):
|
||||
commited = orm.DBCommitedState.load(logitem.res)
|
||||
args = dictdiffer.revert(logitem.diff, commited.inputs)
|
||||
connections = dictdiffer.revert(logitem.signals_diff, sorted(commited.connections))
|
||||
resource.Resource(logitem.res, logitem.base_path, args=args)
|
||||
resource.Resource(logitem.res, logitem.base_path, args=args, tags=commited.tags)
|
||||
for emitter, emitter_input, receiver, receiver_input in connections:
|
||||
emmiter_obj = resource.load(emitter)
|
||||
receiver_obj = resource.load(receiver)
|
||||
@ -179,7 +177,7 @@ def _revert_update(logitem):
|
||||
|
||||
def _revert_run(logitem):
|
||||
res_obj = resource.load(logitem.res)
|
||||
res_obj.delete()
|
||||
res_obj.remove()
|
||||
|
||||
|
||||
def revert(uid):
|
||||
|
@ -91,6 +91,9 @@ def details(diff):
|
||||
elif type_ == 'change':
|
||||
rst.append('-+ {}: {} >> {}'.format(
|
||||
unwrap_change_val(val), change[0], change[1]))
|
||||
elif type_ == 'remove':
|
||||
for key, val in change:
|
||||
rst.append('-- {}: {}'.format(key ,val))
|
||||
return rst
|
||||
|
||||
|
||||
|
@ -35,19 +35,20 @@ def move_to_commited(log_action, *args, **kwargs):
|
||||
if item:
|
||||
sl.pop(item.uid)
|
||||
resource_obj = resource.load(item.res)
|
||||
commited = orm.DBCommitedState.get_or_create(item.res)
|
||||
|
||||
if item.action == CHANGES.remove.name:
|
||||
resource_obj.delete()
|
||||
elif item.action == CHANGES.run.name:
|
||||
resource_obj.set_operational()
|
||||
elif item.action == CHANGES.update.name:
|
||||
commited.state = resource.RESOURCE_STATE.removed.name
|
||||
else:
|
||||
resource_obj.set_operational()
|
||||
commited.state = resource.RESOURCE_STATE.operational.name
|
||||
commited.inputs = patch(item.diff, commited.inputs)
|
||||
commited.tags = resource_obj.tags
|
||||
sorted_connections = sorted(commited.connections)
|
||||
commited.connections = patch(item.signals_diff, sorted_connections)
|
||||
commited.base_path = item.base_path
|
||||
|
||||
commited = orm.DBCommitedState.get_or_create(item.res)
|
||||
commited.inputs = patch(item.diff, commited.inputs)
|
||||
sorted_connections = sorted(commited.connections)
|
||||
commited.connections = patch(item.signals_diff, sorted_connections)
|
||||
commited.base_path = item.base_path
|
||||
commited.save()
|
||||
cl = data.CL()
|
||||
item.state = data.STATES.success
|
||||
|
@ -160,18 +160,21 @@ def test_revert_create():
|
||||
res.save()
|
||||
res.add_input('a', 'str', '9')
|
||||
|
||||
logitem =change.create_logitem(
|
||||
res.name, 'run', change.create_diff({'a': '9'}, {}), [],
|
||||
base_path=res.base_path)
|
||||
log = data.SL()
|
||||
log.append(logitem)
|
||||
assert logitem.diff == [('add', '', [('a', '9')])]
|
||||
staged_log = change.stage_changes()
|
||||
assert len(staged_log) == 1
|
||||
logitem = next(staged_log.collection())
|
||||
|
||||
operations.move_to_commited(logitem.log_action)
|
||||
assert logitem.diff == [['add', '', [['a', '9']]]]
|
||||
|
||||
commited = orm.DBCommitedState.load('test1')
|
||||
assert commited.inputs == {'a': '9'}
|
||||
|
||||
change.revert(logitem.uid)
|
||||
|
||||
staged_log = change.stage_changes()
|
||||
assert len(staged_log) == 1
|
||||
for item in staged_log:
|
||||
operations.move_to_commited(item.log_action)
|
||||
resources = orm.DBResource.load_all()
|
||||
assert resources == []
|
||||
|
Loading…
x
Reference in New Issue
Block a user