Exemple #1
0
 def standard_bfs(self, run, payload, device=None):
     number_of_runs = defaultdict(int)
     start = fetch("service", scoped_name="Start")
     end = fetch("service", scoped_name="End")
     services = [fetch("service", id=id) for id in run.start_services]
     visited, success = set(), False
     while services:
         if run.stop:
             return {"payload": payload, "success": False}
         service = services.pop()
         if number_of_runs[service.name] >= service.maximum_runs or any(
                 node not in visited
                 for node, _ in service.adjacent_services(
                     self, "source", "prerequisite")):
             continue
         number_of_runs[service.name] += 1
         visited.add(service)
         skip_service = False
         if service.skip_query:
             skip_service = run.eval(service.skip_query, **locals())
         if skip_service or service.skip or service in (start, end):
             results = {
                 "success": "skipped",
                 "summary": {
                     "success": {device.name
                                 for device in run.devices},
                     "failure": [],
                 },
             }
             run.run_state["progress"]["service"]["skipped"] += 1
         else:
             kwargs = {
                 "service": service.id,
                 "workflow": self.id,
                 "restart_run": run.restart_run,
                 "parent": run,
                 "parent_runtime": run.parent_runtime,
             }
             if device:
                 kwargs["devices"] = [device.id]
             service_run = factory("run", **kwargs)
             results = service_run.run(payload)
             if not device:
                 status = "success" if results["success"] else "failure"
                 run.run_state["progress"]["service"][status] += 1
         for successor, edge in service.adjacent_services(
                 self,
                 "destination",
                 "success" if results["success"] else "failure",
         ):
             services.append(successor)
             run.edge_state[edge.id] += 1
         if not results["success"] == "skipped":
             sleep(service.waiting_time)
     Session.refresh(run)
     return {"payload": payload, "success": end in visited}
Exemple #2
0
 def job(self, run, payload, device=None):
     number_of_runs = defaultdict(int)
     if "start_services" in run.properties:
         services = [
             fetch("service", id=service) for service in run.start_services
         ]
     else:
         services = list(run.start_services)
     visited, success = set(), False
     while services:
         if run.stop:
             return {"payload": payload, "success": False}
         service = services.pop()
         if number_of_runs[service.name] >= service.maximum_runs or any(
                 node not in visited
                 for node, _ in service.adjacent_services(
                     self, "source", "prerequisite")):
             continue
         number_of_runs[service.name] += 1
         visited.add(service)
         skip_service = False
         if service.skip_query:
             skip_service = run.eval(service.skip_query, **locals())
         if skip_service or service.skip:
             service_results = {"success": "skipped"}
             run.run_state["progress"]["service"]["skipped"] += 1
         else:
             kwargs = {
                 "service": service.id,
                 "workflow": self.id,
                 "parent_runtime": run.parent_runtime,
                 "restart_run": run.restart_run,
             }
             if device:
                 kwargs["devices"] = [device.id]
             service_run = factory("run", **kwargs)
             service_results = service_run.run(payload)
             status = "passed" if service_results["success"] else "failed"
             if not device:
                 run.run_state["progress"]["service"][status] += 1
         successors = []
         for successor, edge in service.adjacent_services(
                 self,
                 "destination",
                 "success" if service_results["success"] else "failure",
         ):
             successors.append(successor)
             run.run_state["edges"][edge.id] += 1
         for successor in successors:
             services.append(successor)
             if successor == self.services[1]:
                 success = True
         if not skip_service and not service.skip:
             sleep(service.waiting_time)
     Session.refresh(run)
     return {"payload": payload, "success": success}
Exemple #3
0
 def standard_bfs(self, run, payload, device=None):
     number_of_runs = defaultdict(int)
     start = fetch("service", scoped_name="Start")
     end = fetch("service", scoped_name="End")
     services = [fetch("service", id=id) for id in run.start_services]
     restart_run = run.restart_run
     visited = set()
     while services:
         if run.stop:
             return {"payload": payload, "success": False}
         service = services.pop()
         if number_of_runs[service.name] >= service.maximum_runs or any(
                 node not in visited
                 for node, _ in service.adjacent_services(
                     self, "source", "prerequisite")):
             continue
         number_of_runs[service.name] += 1
         visited.add(service)
         if service in (start, end):
             results = {"result": "skipped", "success": True}
         else:
             kwargs = {
                 "service": service.id,
                 "workflow": self.id,
                 "restart_run": restart_run,
                 "parent": run,
                 "parent_runtime": run.parent_runtime,
             }
             if run.parent_device_id:
                 kwargs["parent_device"] = run.parent_device_id
             if device:
                 kwargs["devices"] = [device.id]
             service_run = factory("run", **kwargs)
             results = service_run.run(payload)
         if not device:
             status = "success" if results["success"] else "failure"
             run.run_state["progress"]["service"][status] += 1
         for successor, edge in service.adjacent_services(
                 self,
                 "destination",
                 "success" if results["success"] else "failure",
         ):
             services.append(successor)
             if device:
                 run.edge_state[edge.id] += 1
             else:
                 run.edge_state[edge.id] = "DONE"
     Session.refresh(run)
     run.restart_run = restart_run
     return {"payload": payload, "success": end in visited}
Exemple #4
0
 def tracking_bfs(self, run, payload):
     number_of_runs = defaultdict(int)
     start = fetch("service", scoped_name="Start")
     end = fetch("service", scoped_name="End")
     services = [fetch("service", id=id) for id in run.start_services]
     visited, success, targets = set(), False, defaultdict(set)
     restart_run = run.restart_run
     for service in services:
         targets[service.name] |= {device.name for device in run.devices}
     while services:
         if run.stop:
             return {"payload": payload, "success": False}
         service = services.pop()
         if number_of_runs[service.name] >= service.maximum_runs or any(
                 node not in visited
                 for node, _ in service.adjacent_services(
                     self, "source", "prerequisite")):
             continue
         number_of_runs[service.name] += 1
         visited.add(service)
         if service in (start, end):
             results = {
                 "summary": {
                     "success": {device.name
                                 for device in run.devices},
                     "failure": [],
                 },
                 "success": True,
             }
         else:
             kwargs = {
                 "devices": [
                     fetch("device", name=name).id
                     for name in targets[service.name]
                 ],
                 "service":
                 service.id,
                 "workflow":
                 self.id,
                 "restart_run":
                 restart_run,
                 "parent":
                 run,
                 "parent_runtime":
                 run.parent_runtime,
             }
             if run.parent_device_id:
                 kwargs["parent_device"] = run.parent_device_id
             service_run = factory("run", **kwargs)
             results = service_run.run(payload)
         if service.run_method in ("once",
                                   "per_service_with_service_targets"):
             edge_type = "success" if results["success"] else "failure"
             for successor, edge in service.adjacent_services(
                     self, "destination", edge_type):
                 targets[successor.name] |= targets[service.name]
                 services.append(successor)
                 run.edge_state[edge.id] += len(targets[service.name])
         else:
             summary = results.get("summary", {})
             for edge_type in ("success", "failure"):
                 for successor, edge in service.adjacent_services(
                         self,
                         "destination",
                         edge_type,
                 ):
                     if not summary[edge_type]:
                         continue
                     targets[successor.name] |= set(summary[edge_type])
                     services.append(successor)
                     run.edge_state[edge.id] += len(summary[edge_type])
     success_devices = targets[end.name]
     failure_devices = targets[start.name] - success_devices
     success = not failure_devices
     summary = {
         "success": list(success_devices),
         "failure": list(failure_devices),
     }
     run.run_state["progress"]["device"]["success"] = len(success_devices)
     run.run_state["progress"]["device"]["failure"] = len(failure_devices)
     run.run_state["summary"] = summary
     Session.refresh(run)
     run.restart_run = restart_run
     return {"payload": payload, "success": success}