def copy_service_in_workflow(self, workflow_id, **kwargs): service_sets = list(set(kwargs["services"].split(","))) service_instances = db.objectify("service", service_sets) workflow = db.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 {"alert": 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() db.session.commit() return { "services": [service.serialized for service in services], "update_time": workflow.last_modified, }
def update(self, **kwargs): relation = vs.relationships[self.__tablename__] for property, value in kwargs.items(): if not hasattr(self, property): continue property_type = vs.model_properties[self.__tablename__].get( property, None) if property in relation: if relation[property]["list"]: value = db.objectify(relation[property]["model"], value) elif value: value = db.fetch(relation[property]["model"], id=value) if property_type == "bool": value = value not in (False, "false") setattr(self, property, value) if not kwargs.get("update_pools") or not self.pool_model: return for pool in db.fetch_all("pool"): if pool.manually_defined: continue match = pool.match_instance(self) if match and self not in getattr(pool, f"{self.class_type}s"): getattr(pool, f"{self.class_type}s").append(self) if self in getattr(pool, f"{self.class_type}s") and not match: getattr(pool, f"{self.class_type}s").remove(self)
def add_instances_in_bulk(self, **kwargs): target = db.fetch(kwargs["relation_type"], id=kwargs["relation_id"]) if target.type == "pool" and not target.manually_defined: return { "alert": "Adding objects to a dynamic pool is not allowed." } model, property = kwargs["model"], kwargs["property"] instances = set(db.objectify(model, kwargs["instances"])) if kwargs["names"]: for name in [ instance.strip() for instance in kwargs["names"].split(",") ]: instance = db.fetch(model, allow_none=True, name=name) if not instance: return { "alert": f"{model.capitalize()} '{name}' does not exist." } instances.add(instance) instances = instances - set(getattr(target, property)) for instance in instances: getattr(target, property).append(instance) target.last_modified = self.get_time() self.update_rbac(*instances) return {"number": len(instances), "target": target.base_properties}
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 = db.objectify(relation[property]["model"], value) elif value: value = db.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 = db.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 = db.fetch(obj_type, allow_none=True, name=name) if not obj: return { "alert": f"{obj_type.capitalize()} '{name}' does not exist." } if obj not in objects: objects.append(obj) else: objects = db.objectify(obj_type, kwargs[f"{obj_type}s"]) setattr(pool, f"{obj_type}_number", len(objects)) setattr(pool, f"{obj_type}s", objects) pool.last_modified = self.get_time() return pool.serialized
def save_visualization_parameters(self, **kwargs): default_pools = db.objectify("pool", kwargs["default_pools"]) for pool in db.fetch_all("pool"): pool.visualization_default = pool in default_pools