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}
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}
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}
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}