예제 #1
0
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
예제 #2
0
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)
예제 #3
0
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