Added support for if-else constructs in procedures

This commit is contained in:
Fabio Manganiello 2018-04-29 22:25:31 +02:00
parent ef75339fef
commit 2f6565ec87
1 changed files with 90 additions and 0 deletions

View File

@ -30,6 +30,7 @@ class Procedure(object):
def build(cls, name, async, requests, backend=None, id=None, **kwargs):
reqs = []
loop_count = 0
if_count = 0
for request_config in requests:
# Check if this request is a for loop
@ -56,6 +57,25 @@ class Procedure(object):
reqs.append(loop)
continue
# Check if this request is an if-else
if len(request_config.keys()) >= 1:
key = list(request_config.keys())[0]
m = re.match('\s*(if)\s+\$\{(.*)\}\s*', key)
if m:
if_count += 1
if_name = '{}__if_{}'.format(name, if_count)
condition = m.group(2)
else_branch = request_config['else'] if 'else' in request_config else []
if_proc = IfProcedure(name=if_name,
requests=request_config[key],
condition=condition,
else_branch=else_branch,
backend=backend, id=id)
reqs.append(if_proc)
continue
request_config['origin'] = Config.get('device_id')
request_config['id'] = id
if 'target' not in request_config:
@ -136,5 +156,75 @@ class LoopProcedure(Procedure):
return response
class IfProcedure(Procedure):
"""
Models an if-else construct.
Example:
procedure.sync.process_results:
-
action: http.get
args:
url: https://some-service/some/json/endpoint
# Example response: { "sensors": [ {"temperature": 18 } ] }
-
if ${sensors['temperature'] < 20}:
-
action: shell.exec
args:
cmd: '/path/turn_on_heating.sh'
else:
-
action: shell.exec
args:
cmd: '/path/turn_off_heating.sh'
"""
context = {}
def __init__(self, name, condition, requests, else_branch=[], backend=None, id=None, **kwargs):
kwargs['async'] = False
self.condition = condition
self.else_branch = []
reqs = []
for req in requests:
req['origin'] = Config.get('device_id')
req['id'] = id
if 'target' not in req:
req['target'] = req['origin']
reqs.append(Request.build(req))
for req in else_branch:
req['origin'] = Config.get('device_id')
req['id'] = id
if 'target' not in req:
req['target'] = req['origin']
self.else_branch.append(Request.build(req))
super(). __init__(name=name, requests=reqs, backend=None, **kwargs)
def execute(self, **context):
condition_true = eval(self.condition)
response = Response()
if condition_true:
response = super().execute(**context)
elif self.else_branch:
try:
reqs = self.requests
self.requests = self.else_branch
response = super().execute(**context)
finally:
self.requests = reqs
return response
# vim:sw=4:ts=4:et: