コード例 #1
0
def create_workspace(login: str, workspace_data: dict) -> dict:
    """
    Creates a workspace (on disk and in the database) from the given workspace data

    :param workspace_data: The workspace configuration data
    :return: The created workspace
    """
    wsName = shlex.quote(workspace_data["name"])
    session = db_session()

    # test if ws Name exists in database
    user = get_user(login)

    existingWorkspaces = list(session.query(Workspace)
                              .filter(Workspace.owner == user)
                              .filter(Workspace.name == wsName))
    if len(existingWorkspaces) > 0:
        raise NameConflict("Workspace with name " + wsName + " already exists")

    wsPath = path.join(WORKSPACES_DIR, user.name, wsName)
    # prepare db insert
    try:
        ws = Workspace(name=wsName, path=wsPath, owner=user)
        session.add(ws)
        if 'platforms' in workspace_data:
            for platform in workspace_data['platforms']:
                ptf = Platform(platform['name'], platform['url'], True, ws)
                if 'token' in platform:
                    ptf.token_path = create_token_file(platform['token'])
                session.add(ptf)
                test_url(platform['name'], platform['url'] + "/api/v2/packages")
        if 'catalogues' in workspace_data:
            for catalogue in workspace_data['catalogues']:
                session.add(Catalogue(catalogue['name'], catalogue['url'], True, ws))
                test_url(catalogue['name'], catalogue['url'])
    except Exception as e:
        logger.exception(e)
        session.rollback()
        raise
    # create workspace on disk
    proc = Popen(['son-workspace', '--init', '--workspace', wsPath], stdout=PIPE, stderr=PIPE)

    out, err = proc.communicate()
    exitcode = proc.returncode

    if out.decode().find('existing') >= 0:
        workspace_exists = True
    else:
        workspace_exists = False

    if exitcode == 0 and not workspace_exists:
        update_workspace_descriptor(ws)
        session.commit()
        return ws.as_dict()
    else:
        session.rollback()
        if workspace_exists:
            raise NameConflict(out.decode())
        raise Exception(err, out)
コード例 #2
0
def create_workspace(login: str, workspace_data: dict) -> dict:
    """
    Creates a workspace (on disk and in the database) from the given workspace data

    :param workspace_data: The workspace configuration data
    :return: The created workspace
    """
    wsName = shlex.quote(workspace_data["name"])
    session = db_session()

    # test if ws Name exists in database
    user = get_user(login)

    existingWorkspaces = list(
        session.query(Workspace).filter(Workspace.owner == user).filter(
            Workspace.name == wsName))
    if len(existingWorkspaces) > 0:
        raise NameConflict("Workspace with name " + wsName + " already exists")

    wsPath = path.join(WORKSPACES_DIR, user.name, wsName)
    # prepare db insert
    try:
        ws = Workspace(name=wsName, path=wsPath, owner=user)
        session.add(ws)
        if 'platforms' in workspace_data:
            for platform in workspace_data['platforms']:
                ptf = Platform(platform['name'], platform['url'], True, ws)
                if 'token' in platform:
                    ptf.token_path = create_token_file(platform['token'])
                session.add(ptf)
                test_url(platform['name'],
                         platform['url'] + "/api/v2/packages")
        if 'catalogues' in workspace_data:
            for catalogue in workspace_data['catalogues']:
                session.add(
                    Catalogue(catalogue['name'], catalogue['url'], True, ws))
                test_url(catalogue['name'], catalogue['url'])
    except Exception as e:
        logger.exception(e)
        session.rollback()
        raise
    # create workspace on disk
    proc = Popen(['son-workspace', '--init', '--workspace', wsPath],
                 stdout=PIPE,
                 stderr=PIPE)

    out, err = proc.communicate()
    exitcode = proc.returncode

    if out.decode().find('existing') >= 0:
        workspace_exists = True
    else:
        workspace_exists = False

    if exitcode == 0 and not workspace_exists:
        update_workspace_descriptor(ws)
        session.commit()
        return ws.as_dict()
    else:
        session.rollback()
        if workspace_exists:
            raise NameConflict(out.decode())
        raise Exception(err, out)