Esempio n. 1
0
def _scan_workspace_dir(ws_path, ws):
    """
    Scan a workspace directory

    Scans the workspace directory for any projects.
        Will visit every one to add new functions and services via scan_project_dir
        
    :param ws_path: the workspaces path to scan
    :param ws: the current workspace from the database to attach the projects to
    """
    from son_editor.models.project import Project
    session = db_session()
    # Scan private catalogue in workspace
    _scan_private_catalogue(ws_path + "/catalogues", ws)

    for project_name in os.listdir(os.path.join(ws_path, "projects")):
        if not Path(os.path.join(ws_path, "projects", project_name)).is_dir():
            continue
        pj = session.query(Project). \
            filter(Project.name == project_name). \
            filter(Project.workspace == ws).first()
        if pj is None:
            logger.info("Found project in Workspace {}: {}".format(ws_path, project_name))
            pj = Project(project_name, project_name, ws)
            sync_project_descriptor(pj)
            session.add(pj)
            session.commit()
        scan_project_dir(os.path.join(ws_path, "projects", project_name), pj)
def update_project(project_data, project_id):
    """
    Update the Project

    :param project_data: The project Data
    :param project_id: The project ID to update
    :return: The updated project descriptor
    """
    session = db_session()
    project = session.query(Project).filter(Project.id == project_id).first()
    if project is None:
        raise NotFound("Project with id {} could not be found".format(project_id))

    # Update name
    if 'name' in project_data and project_data['name'] != project.name:
        if os.path.exists(get_project_path(project.workspace.path, project.rel_path)):
            new_name = shlex.quote(project_data['name'])
            old_path = get_project_path(project.workspace.path, project.rel_path)
            new_path = rreplace(old_path, project.name, new_name, 1)

            if os.path.exists(new_path):
                raise NameConflict("Invalid name parameter, workspace '{}' already exists".format(new_name))

            # Do not allow move directories outside of the workspaces_dir
            if not new_path.startswith(WORKSPACES_DIR):
                raise Exception("Invalid path parameter, you are not allowed to break out of {}".format(WORKSPACES_DIR))
            else:
                # Move the directory
                shutil.move(old_path, new_path)
                project.name = new_name
                project.rel_path = new_name
    set_data(project, project_data)
    sync_project_descriptor(project)
    db_session.commit()
    return project.as_dict()
Esempio n. 3
0
def _scan_workspace_dir(ws_path, ws):
    """
    Scan a workspace directory

    Scans the workspace directory for any projects.
        Will visit every one to add new functions and services via scan_project_dir
        
    :param ws_path: the workspaces path to scan
    :param ws: the current workspace from the database to attach the projects to
    """
    from son_editor.models.project import Project
    session = db_session()
    # Scan private catalogue in workspace
    _scan_private_catalogue(ws_path + "/catalogues", ws)

    for project_name in os.listdir(os.path.join(ws_path, "projects")):
        if not Path(os.path.join(ws_path, "projects", project_name)).is_dir():
            continue
        pj = session.query(Project). \
            filter(Project.name == project_name). \
            filter(Project.workspace == ws).first()
        if pj is None:
            logger.info("Found project in Workspace {}: {}".format(
                ws_path, project_name))
            pj = Project(project_name, project_name, ws)
            sync_project_descriptor(pj)
            session.add(pj)
            session.commit()
        scan_project_dir(os.path.join(ws_path, "projects", project_name), pj)
def update_project(project_data, project_id):
    """
    Update the Project
    :param project_data:
    :param project_id:
    :return:
    """
    session = db_session()
    project = session.query(Project).filter(Project.id == project_id).first()
    if project is None:
        raise NotFound("Project with id {} could not be found".format(project_id))

    # Update name
    if 'name' in project_data and project_data['name'] != project.name:
        if os.path.exists(get_project_path(project.workspace.path, project.rel_path)):
            new_name = shlex.quote(project_data['name'])
            old_path = get_project_path(project.workspace.path, project.rel_path)
            new_path = rreplace(old_path, project.name, new_name, 1)

            if os.path.exists(new_path):
                raise NameConflict("Invalid name parameter, workspace '{}' already exists".format(new_name))

            # Do not allow move directories outside of the workspaces_dir
            if not new_path.startswith(WORKSPACES_DIR):
                raise Exception("Invalid path parameter, you are not allowed to break out of {}".format(WORKSPACES_DIR))
            else:
                # Move the directory
                shutil.move(old_path, new_path)
                project.name = new_name
                project.rel_path = new_name
    set_data(project, project_data)
    sync_project_descriptor(project)
    db_session.commit()
    return project.as_dict()
def _scan_workspace_dir(ws_path, ws):
    from son_editor.models.project import Project
    session = db_session()
    # Scan private catalogue in workspace
    _scan_private_catalogue(ws_path + "/catalogues", ws)

    for project_name in os.listdir(os.path.join(ws_path, "projects")):
        if not Path(os.path.join(ws_path, "projects", project_name)).is_dir():
            continue
        pj = session.query(Project). \
            filter(Project.name == project_name). \
            filter(Project.workspace == ws).first()
        if pj is None:
            logger.info("Found project in Workspace {}: {}".format(ws_path, project_name))
            pj = Project(project_name, project_name, ws)
            sync_project_descriptor(pj)
            session.add(pj)
            session.commit()
        scan_project_dir(os.path.join(ws_path, "projects", project_name), pj)
def _scan_workspace_dir(ws_path, ws):
    from son_editor.models.project import Project
    session = db_session()
    # Scan private catalogue in workspace
    _scan_private_catalogue(ws_path + "/catalogues", ws)

    for project_name in os.listdir(os.path.join(ws_path, "projects")):
        if not Path(os.path.join(ws_path, "projects", project_name)).is_dir():
            continue
        pj = session.query(Project). \
            filter(Project.name == project_name). \
            filter(Project.workspace == ws).first()
        if pj is None:
            logger.info("Found project in Workspace {}: {}".format(
                ws_path, project_name))
            pj = Project(project_name, project_name, ws)
            sync_project_descriptor(pj)
            session.add(pj)
            session.commit()
        scan_project_dir(os.path.join(ws_path, "projects", project_name), pj)
def create_project(ws_id: int, project_data: dict) -> dict:
    """
    Create a new Project in this workspace

    :param ws_id: The workpace ID
    :param project_data: The project data to create
    :return: The new project descriptor as a dict
    """
    project_name = shlex.quote(project_data["name"])
    repo = None
    if "repo" in project_data:
        repo = project_data["repo"]

    if repo:
        return gitimpl.clone(ws_id, repo, project_name)

    session = db_session()

    # test if ws Name exists in database

    workspace = session.query(Workspace). \
        filter(Workspace.id == ws_id).first()
    if workspace is None:
        raise NotFound("No workspace with id {} was found".format(ws_id))

    existing_projects = list(session.query(Project)
                             .filter(Project.workspace == workspace)
                             .filter(Project.name == project_name))
    if len(existing_projects) > 0:
        raise NameConflict("Project with name '{}' already exists in this workspace".format(project_name))

    # prepare db insert
    try:
        project = Project(name=project_name, rel_path=project_name, workspace=workspace)
        set_data(project, project_data)

        session.add(project)
    except:
        session.rollback()
        raise
    # create workspace on disk
    proc = Popen(['son-workspace',
                  '--workspace', workspace.path,
                  '--project', get_project_path(workspace.path, project_name)],
                 stdout=PIPE, stderr=PIPE)
    out, err = proc.communicate()
    exitcode = proc.returncode

    if err.decode().find('exists') >= 0:
        project_exists = True
    else:
        project_exists = False

    if exitcode == 0 and not project_exists:
        sync_project_descriptor(project)
        session.commit()
        scan_project_dir(get_project_path(workspace.path, project_name), project)
        return project.as_dict()
    else:
        session.rollback()
        if project_exists:
            raise NameConflict("Project with name '{}' already exists in this workspace".format(project_name))
        raise Exception(err.decode(), out.decode())
def create_project(ws_id: int, project_data: dict) -> dict:
    """
    Create a new Project in this workspace
    :param ws_id:
    :param project_data:
    :return: The new project descriptor as a dict
    """
    project_name = shlex.quote(project_data["name"])
    repo = None
    if "repo" in project_data:
        repo = project_data["repo"]

    if repo:
        return gitimpl.clone(ws_id, repo, project_name)

    session = db_session()

    # test if ws Name exists in database

    workspace = session.query(Workspace). \
        filter(Workspace.id == ws_id).first()
    if workspace is None:
        raise NotFound("No workspace with id {} was found".format(ws_id))

    existing_projects = list(session.query(Project)
                             .filter(Project.workspace == workspace)
                             .filter(Project.name == project_name))
    if len(existing_projects) > 0:
        raise NameConflict("Project with name '{}' already exists in this workspace".format(project_name))

    # prepare db insert
    try:
        project = Project(name=project_name, rel_path=project_name, workspace=workspace)
        set_data(project, project_data)

        session.add(project)
    except:
        session.rollback()
        raise
    # create workspace on disk
    proc = Popen(['son-workspace',
                  '--workspace', workspace.path,
                  '--project', get_project_path(workspace.path, project_name)],
                 stdout=PIPE, stderr=PIPE)
    out, err = proc.communicate()
    exitcode = proc.returncode

    if err.decode().find('exists') >= 0:
        project_exists = True
    else:
        project_exists = False

    if exitcode == 0 and not project_exists:
        sync_project_descriptor(project)
        session.commit()
        scan_project_dir(get_project_path(workspace.path, project_name), project)
        return project.as_dict()
    else:
        session.rollback()
        if project_exists:
            raise NameConflict("Project with name '{}' already exists in this workspace".format(project_name))
        raise Exception(err.decode(), out.decode())