def import_settings(db: Session, upload): import_file = upload.file.read() decoded_import = import_file.decode("utf-8") import_contents = json.loads(decoded_import) _templates = import_contents["templates"] _variables = import_contents["variables"] _template_list = [] _var_list = [] for template in _templates: template_model = models.Template( id=template["id"], title=template["title"], url=template["url"], updated_at=datetime.fromisoformat(template["updated_at"]), created_at=datetime.fromisoformat(template["created_at"]), ) for item in template["items"]: _item = models.TemplateItem(**item) template_model.items.append(_item) _template_list.append(template_model) for variable in _variables: variable_model = models.TemplateVariables(**variable) _var_list.append(variable_model) # Remove Existing db.query(models.TemplateVariables).delete() db.query(models.Template).delete() db.query(models.TemplateItem).delete() # Add New db.add_all(_template_list) db.add_all(_var_list) db.commit() response = {"success": "Import Successful"} return response
def add_template(db: Session, template: models.Template): try: _template_path = urlparse(template.url).path ext = os.path.splitext(_template_path)[1] # Opens the JSON and iterate over the content. _template = models.Template(title=template.title, url=template.url) with urllib.request.urlopen(template.url) as file: if ext.rstrip() in (".yml", ".yaml"): loaded_file = yaml.load(file, Loader=yaml.SafeLoader) elif ext.rstrip() in (".json", "json"): loaded_file = json.load(file) else: print("Invalid filetype") raise if type(loaded_file) == list: for entry in loaded_file: ports = conv_ports2dict(entry.get("ports", [])) sysctls = conv_sysctls2dict(entry.get("sysctls", [])) # Optional use classmethod from_dict try: template_content = models.TemplateItem( type=int(entry.get("type", 1)), title=entry["title"], platform=entry["platform"], description=entry.get("description", ""), name=entry.get("name", entry["title"].lower()), logo=entry.get("logo", ""), # default logo here! image=entry.get("image", ""), notes=entry.get("note", ""), categories=entry.get("categories", ""), restart_policy=entry.get("restart_policy"), ports=ports, network_mode=entry.get("network_mode", ""), network=entry.get("network", ""), volumes=entry.get("volumes", []), env=entry.get("env", []), devices=entry.get("devices", []), labels=entry.get("labels", []), sysctls=sysctls, cap_add=entry.get("cap_add", []), ) except Exception as exc: raise HTTPException( status_code=exc.response.status_code, detail=entry.get("name") + " " + exc.explanation, ) _template.items.append(template_content) elif type(loaded_file) == dict: entry = loaded_file ports = conv_ports2dict(entry.get("ports", [])) sysctls = conv_sysctls2dict(entry.get("sysctls", [])) # Optional use classmethod from_dict template_content = models.TemplateItem( type=int(entry.get("type", 1)), title=entry["title"], platform=entry["platform"], description=entry.get("description", ""), name=entry.get("name", entry["title"].lower()), logo=entry.get("logo", ""), # default logo here! image=entry.get("image", ""), notes=entry.get("note", ""), categories=entry.get("categories", ""), restart_policy=entry.get("restart_policy"), ports=ports, network_mode=entry.get("network_mode", ""), network=entry.get("network", ""), volumes=entry.get("volumes", []), env=entry.get("env", []), devices=entry.get("devices", []), labels=entry.get("labels", []), sysctls=sysctls, cap_add=entry.get("cap_add", []), ) _template.items.append(template_content) except (OSError, TypeError, ValueError) as err: # Optional handle KeyError here too. print("data request failed", err) raise HTTPException(status_code=err.status_code, detail=err.explanation) try: db.add(_template) db.commit() except IntegrityError as err: # TODO raises IntegrityError on duplicates (uniqueness) # status db.rollback() return get_template(db=db, url=template.url)
def refresh_template(db: Session, template_id: id): template = (db.query( models.Template).filter(models.Template.id == template_id).first()) _template_path = urlparse(template.url).path ext = os.path.splitext(_template_path)[1] items = [] try: with urllib.request.urlopen(template.url) as fp: if ext.rstrip() in (".yml", ".yaml"): loaded_file = yaml.load(fp, Loader=yaml.SafeLoader) elif ext.rstrip() in (".json"): loaded_file = json.load(fp) else: print("Invalid filetype") raise HTTPException(status_code=422, detail="Invalid filetype") if type(loaded_file) == list: for entry in loaded_file: if entry.get("ports"): ports = conv_ports2dict(entry.get("ports", [])) sysctls = conv_sysctls2dict(entry.get("sysctls", [])) item = models.TemplateItem( type=int(entry["type"]), title=entry["title"], platform=entry["platform"], description=entry.get("description", ""), name=entry.get("name", entry["title"].lower()), logo=entry.get("logo", ""), # default logo here! image=entry.get("image", ""), notes=entry.get("note", ""), categories=entry.get("categories", ""), restart_policy=entry.get("restart_policy"), ports=ports, network_mode=entry.get("network_mode", ""), network=entry.get("network", ""), volumes=entry.get("volumes", []), env=entry.get("env", []), devices=entry.get("devices", []), labels=entry.get("labels", []), sysctls=sysctls, cap_add=entry.get("cap_add", []), ) items.append(item) elif type(loaded_file) == dict: entry = loaded_file ports = conv_ports2dict(entry.get("ports", [])) sysctls = conv_sysctls2dict(entry.get("sysctls", [])) # Optional use classmethod from_dict template_content = models.TemplateItem( type=int(entry["type"]), title=entry["title"], platform=entry["platform"], description=entry.get("description", ""), name=entry.get("name", entry["title"].lower()), logo=entry.get("logo", ""), # default logo here! image=entry.get("image", ""), notes=entry.get("note", ""), categories=entry.get("categories", ""), restart_policy=entry.get("restart_policy"), ports=ports, network_mode=entry.get("network_mode", ""), network=entry.get("network", ""), volumes=entry.get("volumes", []), env=entry.get("env", []), devices=entry.get("devices", []), labels=entry.get("labels", []), sysctls=sysctls, cap_add=entry.get("cap_add", []), ) items.append(template_content) except Exception as exc: if hasattr(exc, "code") and exc.code == 404: raise HTTPException(status_code=exc.code, detail=exc.url) else: print("Template update failed. ERR_001", exc) raise HTTPException(status_code=exc.status_code, detail=exc.explanation) else: # db.delete(template) # make_transient(template) # db.commit() template.updated_at = datetime.utcnow() template.items = items try: # db.add(template) db.commit() print(f'Template "{template.title}" updated successfully.') except Exception as exc: db.rollback() print("Template update failed. ERR_002", exc) raise HTTPException(status_code=exc.response.status_code, detail=exc.explanation) return template