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
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)
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
def database_deletion(self, **kwargs): db.delete_all(*kwargs["deletion_types"])
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