def copy_service_in_workflow(self, workflow_id, **kwargs): service_sets = list(set(kwargs["services"].split(","))) service_instances = objectify("service", service_sets) workflow = fetch("workflow", id=workflow_id) services, errors = [], [] if kwargs["mode"] == "shallow": for service in service_instances: if not service.shared: errors.append(f"'{service.name}' is not a shared service.") elif service in workflow.services: errors.append( f"This workflow already contains '{service.name}'.") if errors: return {"error": errors} for service in service_instances: if kwargs["mode"] == "deep": service = service.duplicate(workflow) else: workflow.services.append(service) services.append(service) workflow.last_modified = self.get_time() Session.commit() return { "services": [service.serialized for service in services], "update_time": workflow.last_modified, }
def update(self, **kwargs: Any) -> None: relation = relationships[self.__tablename__] modified = False for property, value in kwargs.items(): if not hasattr(self, property): continue property_type = property_types.get(property, None) if property in relation: if relation[property]["list"]: value = objectify(relation[property]["model"], value) else: value = fetch(relation[property]["model"], id=value) if property_type == "bool": value = value not in (False, "false") old_value = getattr(self, property) if old_value != value: if ( isinstance(value, list) and old_value and set(value) == set(old_value) ): continue modified = True setattr(self, property, value) if modified: self.last_modified = controller.get_time()
def add_jobs_to_workflow(self, workflow_id: int, job_ids: str) -> Dict[str, Any]: workflow = fetch("Workflow", id=workflow_id) jobs = objectify("Job", [int(job_id) for job_id in job_ids.split("-")]) for job in jobs: job.workflows.append(workflow) now = self.get_time() workflow.last_modified = now return {"jobs": [job.serialized for job in jobs], "update_time": now}
def add_services_to_workflow(self, workflow_id, service_ids): workflow = fetch("workflow", id=workflow_id) services = objectify( "service", [int(service_id) for service_id in service_ids.split("-")]) for service in services: service.workflows.append(workflow) now = self.get_time() workflow.last_modified = now return { "services": [service.serialized for service in services], "update_time": now, }
def update(self, **kwargs): relation = relationships[self.__tablename__] for property, value in kwargs.items(): if not hasattr(self, property): continue property_type = property_types.get(property, None) if property in relation: if relation[property]["list"]: value = objectify(relation[property]["model"], value) else: value = fetch(relation[property]["model"], id=value) if property_type == "bool": value = value not in (False, "false") setattr(self, property, value)
def save_pool_objects(self, pool_id, **kwargs): pool = fetch("pool", id=pool_id) for obj_type in ("device", "link"): string_value = kwargs[f"string_{obj_type}s"] setattr( pool, f"{obj_type}s", ([ fetch(obj_type, name=name) for name in string_value.strip().split(",") ] if string_value else objectify(obj_type, kwargs[f"{obj_type}s"])), ) return pool.serialized
def save_pool_objects(self, pool_id, **kwargs): pool = fetch("pool", id=pool_id) for obj_type in ("device", "link"): string_objects = kwargs[f"string_{obj_type}s"] if string_objects: objects = [] for name in [obj.strip() for obj in string_objects.split(",")]: obj = fetch(obj_type, allow_none=True, name=name) if not obj: return { "error": f"{obj_type.capitalize()} '{name}' does not exist." } objects.append(obj) else: objects = objectify(obj_type, kwargs[f"{obj_type}s"]) setattr(pool, f"{obj_type}_number", len(objects)) setattr(pool, f"{obj_type}s", objects) return pool.serialized
def save_device_jobs(self, device_id: int, **kwargs: List[int]) -> None: fetch("Device", id=device_id).jobs = objectify("Job", kwargs["jobs"])