func (d *directory) Lookup(ctx context.Context, name string) (fs.Node, error) { if d.commitID == "" { commitInfo, err := pfsutil.GetCommitInfo( d.fs.apiClient, d.fs.repositoryName, name, ) if err != nil { return nil, err } if commitInfo == nil { return nil, fuse.ENOENT } return &directory{ d.fs, name, commitInfo.CommitType == pfs.CommitType_COMMIT_TYPE_WRITE, "", }, nil } fileInfo, err := pfsutil.GetFileInfo( d.fs.apiClient, d.fs.repositoryName, d.commitID, path.Join(d.path, name), ) if err != nil { return nil, err } return d.nodeFromFileInfo(fileInfo) }
func (b *brancher) getParentCommitID( repositoryName string, commitID string, ) (string, error) { commitInfo, err := pfsutil.GetCommitInfo( b.pfsAPIClient, repositoryName, commitID, ) if err != nil { return "", err } if commitInfo.ParentCommit == nil { return "", nil } return commitInfo.ParentCommit.Id, nil }
func testSimple(t *testing.T, apiClient pfs.ApiClient) { repositoryName := testRepositoryName() err := pfsutil.InitRepository(apiClient, repositoryName) require.NoError(t, err) getCommitInfoResponse, err := pfsutil.GetCommitInfo(apiClient, repositoryName, "scratch") require.NoError(t, err) require.NotNil(t, getCommitInfoResponse) require.Equal(t, "scratch", getCommitInfoResponse.CommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, getCommitInfoResponse.CommitInfo.CommitType) require.Nil(t, getCommitInfoResponse.CommitInfo.ParentCommit) branchResponse, err := pfsutil.Branch(apiClient, repositoryName, "scratch") require.NoError(t, err) require.NotNil(t, branchResponse) newCommitID := branchResponse.Commit.Id getCommitInfoResponse, err = pfsutil.GetCommitInfo(apiClient, repositoryName, newCommitID) require.NoError(t, err) require.NotNil(t, getCommitInfoResponse) require.Equal(t, newCommitID, getCommitInfoResponse.CommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_WRITE, getCommitInfoResponse.CommitInfo.CommitType) require.Equal(t, "scratch", getCommitInfoResponse.CommitInfo.ParentCommit.Id) err = pfsutil.MakeDirectory(apiClient, repositoryName, newCommitID, "a/b") require.NoError(t, err) err = pfsutil.MakeDirectory(apiClient, repositoryName, newCommitID, "a/c") require.NoError(t, err) var wg sync.WaitGroup for i := 0; i < testSize; i++ { i := i wg.Add(1) go func() { defer wg.Done() iErr := pfsutil.PutFile(apiClient, repositoryName, newCommitID, fmt.Sprintf("a/b/file%d", i), strings.NewReader(fmt.Sprintf("hello%d", i))) require.NoError(t, iErr) iErr = pfsutil.PutFile(apiClient, repositoryName, newCommitID, fmt.Sprintf("a/c/file%d", i), strings.NewReader(fmt.Sprintf("hello%d", i))) require.NoError(t, iErr) }() } wg.Wait() err = pfsutil.Commit(apiClient, repositoryName, newCommitID) require.NoError(t, err) getCommitInfoResponse, err = pfsutil.GetCommitInfo(apiClient, repositoryName, newCommitID) require.NoError(t, err) require.NotNil(t, getCommitInfoResponse) require.Equal(t, newCommitID, getCommitInfoResponse.CommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, getCommitInfoResponse.CommitInfo.CommitType) require.Equal(t, "scratch", getCommitInfoResponse.CommitInfo.ParentCommit.Id) wg = sync.WaitGroup{} for i := 0; i < testSize; i++ { i := i wg.Add(1) go func() { defer wg.Done() reader, iErr := pfsutil.GetFile(apiClient, repositoryName, newCommitID, fmt.Sprintf("a/b/file%d", i)) require.NoError(t, iErr) buffer := bytes.NewBuffer(nil) _, iErr = buffer.ReadFrom(reader) require.NoError(t, iErr) require.Equal(t, fmt.Sprintf("hello%d", i), buffer.String()) reader, iErr = pfsutil.GetFile(apiClient, repositoryName, newCommitID, fmt.Sprintf("a/c/file%d", i)) require.NoError(t, iErr) buffer = bytes.NewBuffer(nil) _, iErr = buffer.ReadFrom(reader) require.NoError(t, iErr) require.Equal(t, fmt.Sprintf("hello%d", i), buffer.String()) }() } wg.Wait() listFilesResponse, err := pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/b", 0, 1) require.NoError(t, err) require.Equal(t, testSize, len(listFilesResponse.FileInfo)) listFilesResponse, err = pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/c", 0, 1) require.NoError(t, err) require.Equal(t, testSize, len(listFilesResponse.FileInfo)) var fileInfos [7][]*pfs.FileInfo wg = sync.WaitGroup{} for i := 0; i < 7; i++ { i := i wg.Add(1) go func() { defer wg.Done() listFilesResponse, iErr := pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/b", i, 7) require.NoError(t, iErr) fileInfos[i] = listFilesResponse.FileInfo }() } wg.Wait() count := 0 for i := 0; i < 7; i++ { count += len(fileInfos[i]) } require.Equal(t, testSize, count) }
func do(appEnvObj interface{}) error { appEnv := appEnvObj.(*appEnv) clientConn, err := grpc.Dial(appEnv.Address) if err != nil { return err } apiClient := pfs.NewApiClient(clientConn) var shard int var modulus int initCmd := cobramainutil.Command{ Use: "init repository-name", Long: "Initalize a repository.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.InitRepository(apiClient, args[0], false) }, }.ToCobraCommand() mkdirCmd := cobramainutil.Command{ Use: "mkdir repository-name commit-id path/to/dir", Long: "Make a directory. Sub directories must already exist.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.MakeDirectory(apiClient, args[0], args[1], args[2]) }, }.ToCobraCommand() putCmd := cobramainutil.Command{ Use: "put repository-name branch-id path/to/file", Long: "Put a file from stdin. Directories must exist. branch-id must be a writeable commit.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { _, err := pfsutil.PutFile(apiClient, args[0], args[1], args[2], 0, os.Stdin) return err }, }.ToCobraCommand() getCmd := cobramainutil.Command{ Use: "get repository-name commit-id path/to/file", Long: "Get a file from stdout. commit-id must be a readable commit.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.GetFile(apiClient, args[0], args[1], args[2], 0, pfsutil.GetAll, os.Stdout) }, }.ToCobraCommand() lsCmd := cobramainutil.Command{ Use: "ls repository-name branch-id path/to/dir", Long: "List a directory. Directory must exist.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { listFilesResponse, err := pfsutil.ListFiles(apiClient, args[0], args[1], args[2], uint64(shard), uint64(modulus)) if err != nil { return err } for _, fileInfo := range listFilesResponse.FileInfo { fmt.Printf("%+v\n", fileInfo) } return nil }, }.ToCobraCommand() lsCmd.Flags().IntVarP(&shard, "shard", "s", 0, "shard to read from") lsCmd.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") branchCmd := cobramainutil.Command{ Use: "branch repository-name commit-id", Long: "Branch a commit. commit-id must be a readable commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { branchResponse, err := pfsutil.Branch(apiClient, args[0], args[1]) if err != nil { return err } fmt.Println(branchResponse.Commit.Id) return nil }, }.ToCobraCommand() commitCmd := cobramainutil.Command{ Use: "commit repository-name branch-id", Long: "Commit a branch. branch-id must be a writeable commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.Commit(apiClient, args[0], args[1]) }, }.ToCobraCommand() commitInfoCmd := cobramainutil.Command{ Use: "commit-info repository-name commit-id", Long: "Get info for a commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { commitInfoResponse, err := pfsutil.GetCommitInfo(apiClient, args[0], args[1]) if err != nil { return err } fmt.Printf("%+v\n", commitInfoResponse.CommitInfo) return nil }, }.ToCobraCommand() listCommitsCmd := cobramainutil.Command{ Use: "list-commits repository-name", Long: "List commits on the repository.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { listCommitsResponse, err := pfsutil.ListCommits(apiClient, args[0]) if err != nil { return err } for _, commitInfo := range listCommitsResponse.CommitInfo { fmt.Printf("%+v\n", commitInfo) } return nil }, }.ToCobraCommand() mountCmd := cobramainutil.Command{ Use: "mount repository-name", Long: "Mount a repository as a local file system.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { return fuse.NewMounter().Mount(apiClient, args[0], args[0], uint64(shard), uint64(modulus)) }, }.ToCobraCommand() mountCmd.Flags().IntVarP(&shard, "shard", "s", 0, "shard to read from") mountCmd.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") rootCmd := &cobra.Command{ Use: "pfs", Long: `Access the PFS API. Note that this CLI is experimental and does not even check for common errors. The environment variable PFS_ADDRESS controls what server the CLI connects to, the default is 0.0.0.0:650.`, } rootCmd.AddCommand(cobramainutil.NewVersionCommand(clientConn, pachyderm.Version)) rootCmd.AddCommand(initCmd) rootCmd.AddCommand(mkdirCmd) rootCmd.AddCommand(putCmd) rootCmd.AddCommand(getCmd) rootCmd.AddCommand(lsCmd) rootCmd.AddCommand(branchCmd) rootCmd.AddCommand(commitCmd) rootCmd.AddCommand(commitInfoCmd) rootCmd.AddCommand(listCommitsCmd) rootCmd.AddCommand(mountCmd) return rootCmd.Execute() }
func testReplica(t *testing.T, apiClient pfs.ApiClient, internalAPIClient pfs.InternalApiClient) { masterName := TestRepositoryName() err := pfsutil.InitRepository(apiClient, masterName, false) require.NoError(t, err) replicaName := TestRepositoryName() err = pfsutil.InitRepository(apiClient, replicaName, true) require.NoError(t, err) for i := 0; i < testShardsPerServer*testNumServers; i++ { var buffer bytes.Buffer err := pfsutil.PullDiff(internalAPIClient, masterName, "scratch", uint64(i), &buffer) require.NoError(t, err) err = pfsutil.PushDiff(internalAPIClient, replicaName, "scratch", uint64(i), &buffer) require.NoError(t, err) } getCommitInfoResponse, err := pfsutil.GetCommitInfo(apiClient, replicaName, "scratch") require.NoError(t, err) require.NotNil(t, getCommitInfoResponse) require.NotNil(t, getCommitInfoResponse.CommitInfo) require.Equal(t, "scratch", getCommitInfoResponse.CommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, getCommitInfoResponse.CommitInfo.CommitType) require.Nil(t, getCommitInfoResponse.CommitInfo.ParentCommit) branchResponse, err := pfsutil.Branch(apiClient, masterName, "scratch") require.NoError(t, err) require.NotNil(t, branchResponse) newCommitID := branchResponse.Commit.Id var wg sync.WaitGroup for i := 0; i < testSize; i++ { i := i wg.Add(1) go func() { defer wg.Done() _, iErr := pfsutil.PutFile(apiClient, masterName, newCommitID, fmt.Sprintf("file%d", i), 0, strings.NewReader(fmt.Sprintf("hello%d", i))) require.NoError(t, iErr) }() } wg.Wait() err = pfsutil.Commit(apiClient, masterName, newCommitID) require.NoError(t, err) for i := 0; i < testShardsPerServer*testNumServers; i++ { var buffer bytes.Buffer err := pfsutil.PullDiff(internalAPIClient, masterName, newCommitID, uint64(i), &buffer) require.NoError(t, err) err = pfsutil.PushDiff(internalAPIClient, replicaName, newCommitID, uint64(i), &buffer) require.NoError(t, err) } getCommitInfoResponse, err = pfsutil.GetCommitInfo(apiClient, replicaName, newCommitID) require.NoError(t, err) require.NotNil(t, getCommitInfoResponse) require.NotNil(t, getCommitInfoResponse.CommitInfo) require.Equal(t, newCommitID, getCommitInfoResponse.CommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, getCommitInfoResponse.CommitInfo.CommitType) require.Equal(t, "scratch", getCommitInfoResponse.CommitInfo.ParentCommit.Id) }
func testSimple(t *testing.T, apiClient pfs.ApiClient, internalAPIClient pfs.InternalApiClient, cluster Cluster) { repositoryName := TestRepositoryName() err := pfsutil.InitRepository(apiClient, repositoryName) require.NoError(t, err) commitInfo, err := pfsutil.GetCommitInfo(apiClient, repositoryName, "scratch") require.NoError(t, err) require.NotNil(t, commitInfo) require.Equal(t, "scratch", commitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, commitInfo.CommitType) require.Nil(t, commitInfo.ParentCommit) scratchCommitInfo := commitInfo commitInfos, err := pfsutil.ListCommits(apiClient, repositoryName) require.NoError(t, err) require.Equal(t, 1, len(commitInfos.CommitInfo)) require.Equal(t, scratchCommitInfo, commitInfos.CommitInfo[0]) commit, err := pfsutil.Branch(apiClient, repositoryName, "scratch") require.NoError(t, err) require.NotNil(t, commit) newCommitID := commit.Id commitInfo, err = pfsutil.GetCommitInfo(apiClient, repositoryName, newCommitID) require.NoError(t, err) require.NotNil(t, commitInfo) require.Equal(t, newCommitID, commitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_WRITE, commitInfo.CommitType) require.Equal(t, "scratch", commitInfo.ParentCommit.Id) newCommitInfo := commitInfo commitInfos, err = pfsutil.ListCommits(apiClient, repositoryName) require.NoError(t, err) require.Equal(t, 2, len(commitInfos.CommitInfo)) require.Equal(t, newCommitInfo, commitInfos.CommitInfo[0]) require.Equal(t, scratchCommitInfo, commitInfos.CommitInfo[1]) err = pfsutil.MakeDirectory(apiClient, repositoryName, newCommitID, "a/b") require.NoError(t, err) err = pfsutil.MakeDirectory(apiClient, repositoryName, newCommitID, "a/c") require.NoError(t, err) doWrites(t, apiClient, repositoryName, newCommitID) err = pfsutil.Write(apiClient, repositoryName, newCommitID) require.NoError(t, err) commitInfo, err = pfsutil.GetCommitInfo(apiClient, repositoryName, newCommitID) require.NoError(t, err) require.NotNil(t, commitInfo) require.Equal(t, newCommitID, commitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, commitInfo.CommitType) require.Equal(t, "scratch", commitInfo.ParentCommit.Id) checkWrites(t, apiClient, repositoryName, newCommitID) fileInfos, err := pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/b", 0, 1) require.NoError(t, err) require.Equal(t, testSize, len(fileInfos.FileInfo)) fileInfos, err = pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/c", 0, 1) require.NoError(t, err) require.Equal(t, testSize, len(fileInfos.FileInfo)) var fileInfos2 [7][]*pfs.FileInfo var wg sync.WaitGroup for i := 0; i < 7; i++ { i := i wg.Add(1) go func() { defer wg.Done() fileInfos3, iErr := pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/b", uint64(i), 7) require.NoError(t, iErr) fileInfos2[i] = fileInfos3.FileInfo }() } wg.Wait() count := 0 for i := 0; i < 7; i++ { count += len(fileInfos2[i]) } require.Equal(t, testSize, count) }