Exemple #1
0
 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,
     }
Exemple #2
0
 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)
Exemple #3
0
 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}
Exemple #4
0
 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)
Exemple #5
0
 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
Exemple #6
0
 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