예제 #1
0
 def import_topology(self, **kwargs):
     file = kwargs["file"]
     if kwargs["replace"]:
         db.delete_all("device")
     if self.allowed_file(secure_filename(file.filename), {"xls", "xlsx"}):
         result = self.topology_import(file)
     info("Inventory import: Done.")
     return result
예제 #2
0
def test_manual_object_creation(user_client):
    db.delete_all("device", "link")
    for number in range(10):
        for description in ("desc1", "desc2"):
            obj_dict = define_device(number, description)
            user_client.post("/update/device", data=obj_dict)
예제 #3
0
 def migration_import(self, folder="migrations", **kwargs):
     status, models = "Import successful.", kwargs["import_export_types"]
     if kwargs.get("empty_database_before_import", False):
         db.delete_all(*models)
     workflow_edges, workflow_services, superworkflows = [], {}, {}
     folder_path = self.path / "files" / folder / kwargs["name"]
     for model in models:
         path = folder_path / f"{model}.yaml"
         if not path.exists():
             continue
         with open(path, "r") as migration_file:
             instances = yaml.load(migration_file)
             if model == "workflow_edge":
                 workflow_edges = deepcopy(instances)
                 continue
             for instance in instances:
                 instance_type = (
                     instance.pop("type") if model == "service" else model
                 )
                 if (
                     instance_type in ("service", "workflow")
                     and "superworkflow" in instance
                 ):
                     superworkflows[instance["name"]] = instance.pop("superworkflow")
                 if instance_type == "workflow":
                     workflow_services[instance["name"]] = instance.pop("services")
                 try:
                     instance = self.objectify(instance_type, instance)
                     db.factory(
                         instance_type, **{"dont_update_pools": True, **instance}
                     )
                     db.session.commit()
                 except Exception:
                     info(f"{str(instance)} could not be imported:\n{format_exc()}")
                     status = "Partial import (see logs)."
     try:
         for name, services in workflow_services.items():
             workflow = db.fetch("workflow", name=name)
             workflow.services = [
                 db.fetch("service", name=service_name) for service_name in services
             ]
         db.session.commit()
         for name, superworkflow in superworkflows.items():
             service = db.fetch("service", name=name)
             service.superworkflow = db.fetch("workflow", name=superworkflow)
         db.session.commit()
         for edge in workflow_edges:
             for property in ("source", "destination", "workflow"):
                 edge[property] = db.fetch("service", name=edge[property]).id
             self.update(edge.pop("type"), **edge)
             db.session.commit()
         for service in db.fetch_all("service"):
             service.update()
         if not kwargs.get("skip_pool_update"):
             for pool in db.fetch_all("pool"):
                 pool.compute_pool()
         self.log("info", status)
     except Exception:
         info("\n".join(format_exc().splitlines()))
         status = "Partial import (see logs)."
     return status
예제 #4
0
 def database_deletion(self, **kwargs):
     db.delete_all(*kwargs["deletion_types"])
예제 #5
0
 def migration_import(self, folder="migrations", **kwargs):
     status, models = "Import successful.", kwargs["import_export_types"]
     empty_database = kwargs.get("empty_database_before_import", False)
     if empty_database:
         db.delete_all(*models)
     relations = defaultdict(lambda: defaultdict(dict))
     for model in models:
         path = self.path / "files" / folder / kwargs[
             "name"] / f"{model}.yaml"
         if not path.exists():
             continue
         with open(path, "r") as migration_file:
             instances = yaml.load(migration_file)
             for instance in instances:
                 instance_type, relation_dict = instance.pop("type",
                                                             model), {}
                 for related_model, relation in relationships[
                         instance_type].items():
                     relation_dict[related_model] = instance.pop(
                         related_model, [])
                 for property, value in instance.items():
                     if property in db.private_properties_list:
                         instance[property] = self.get_password(value)
                 try:
                     instance = db.factory(
                         instance_type,
                         migration_import=True,
                         no_fetch=empty_database,
                         update_pools=kwargs.get("update_pools", False),
                         import_mechanism=True,
                         **instance,
                     )
                     relations[instance_type][instance.name] = relation_dict
                 except Exception:
                     info(
                         f"{str(instance)} could not be imported:\n{format_exc()}"
                     )
                     status = "Partial import (see logs)."
         db.session.commit()
     for model, instances in relations.items():
         for instance_name, related_models in instances.items():
             for property, value in related_models.items():
                 if not value:
                     continue
                 relation = relationships[model][property]
                 if relation["list"]:
                     related_instances = (db.fetch(relation["model"],
                                                   name=name,
                                                   allow_none=True)
                                          for name in value)
                     value = list(filter(None, related_instances))
                 else:
                     value = db.fetch(relation["model"],
                                      name=value,
                                      allow_none=True)
                 try:
                     setattr(db.fetch(model, name=instance_name), property,
                             value)
                 except Exception:
                     info("\n".join(format_exc().splitlines()))
                     status = "Partial import (see logs)."
     db.session.commit()
     if not kwargs.get("skip_model_update"):
         for model in ("access", "service"):
             for instance in db.fetch_all(model):
                 instance.update()
     if not kwargs.get("skip_pool_update"):
         for pool in db.fetch_all("pool"):
             pool.compute_pool()
     self.log("info", status)
     return status