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)
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)