func (d *directory) readFiles(ctx context.Context) ([]fuse.Dirent, error) { fileInfos, err := pfsutil.ListFile( d.fs.apiClient, d.File.Commit.Repo.Name, d.File.Commit.Id, d.File.Path, d.fs.getFromCommitID(d.File.Commit.Repo.Name), d.Shard, ) if err != nil { return nil, err } var result []fuse.Dirent for _, fileInfo := range fileInfos { shortPath := strings.TrimPrefix(fileInfo.File.Path, d.File.Path) switch fileInfo.FileType { case pfs.FileType_FILE_TYPE_REGULAR: result = append(result, fuse.Dirent{Name: shortPath, Type: fuse.DT_File}) case pfs.FileType_FILE_TYPE_DIR: result = append(result, fuse.Dirent{Name: shortPath, Type: fuse.DT_Dir}) default: continue } } return result, nil }
func (d *directory) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { if d.commitID == "" { return d.readCommits(ctx) } fileInfos, err := pfsutil.ListFile(d.fs.apiClient, d.fs.repositoryName, d.commitID, d.path, d.fs.shard, d.fs.modulus) if err != nil { return nil, err } result := make([]fuse.Dirent, 0, len(fileInfos)) for _, fileInfo := range fileInfos { shortPath := strings.TrimPrefix(fileInfo.File.Path, d.path) switch fileInfo.FileType { case pfs.FileType_FILE_TYPE_REGULAR: result = append(result, fuse.Dirent{Name: shortPath, Type: fuse.DT_File}) case pfs.FileType_FILE_TYPE_DIR: result = append(result, fuse.Dirent{Name: shortPath, Type: fuse.DT_Dir}) default: continue } } return result, nil }
func testSimple(t *testing.T, apiClient pfs.APIClient, cluster Cluster) { repoName := "testSimpleRepo" err := pfsutil.CreateRepo(apiClient, repoName) require.NoError(t, err) commit, err := pfsutil.StartCommit(apiClient, repoName, "") require.NoError(t, err) require.NotNil(t, commit) newCommitID := commit.Id newCommitInfo, err := pfsutil.InspectCommit(apiClient, repoName, newCommitID) require.NoError(t, err) require.NotNil(t, newCommitInfo) require.Equal(t, newCommitID, newCommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_WRITE, newCommitInfo.CommitType) require.Nil(t, newCommitInfo.ParentCommit) commitInfos, err := pfsutil.ListCommit(apiClient, repoName) require.NoError(t, err) require.Equal(t, 1, len(commitInfos)) require.Equal(t, newCommitInfo.Commit, commitInfos[0].Commit) err = pfsutil.MakeDirectory(apiClient, repoName, newCommitID, "a/b") require.NoError(t, err) err = pfsutil.MakeDirectory(apiClient, repoName, newCommitID, "a/c") require.NoError(t, err) err = pfsutil.MakeDirectory(apiClient, repoName, newCommitID, "a/d") require.NoError(t, err) doWrites(t, apiClient, repoName, newCommitID) doBlockWrites(t, apiClient, repoName, newCommitID) err = pfsutil.FinishCommit(apiClient, repoName, newCommitID) require.NoError(t, err) newCommitInfo, err = pfsutil.InspectCommit(apiClient, repoName, newCommitID) require.NoError(t, err) require.NotNil(t, newCommitInfo) require.Equal(t, newCommitID, newCommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, newCommitInfo.CommitType) require.Nil(t, newCommitInfo.ParentCommit) checkWrites(t, apiClient, repoName, newCommitID) checkBlockWrites(t, apiClient, repoName, newCommitID) fileInfos, err := pfsutil.ListFile(apiClient, repoName, newCommitID, "a/b", &pfs.Shard{Number: 0, Modulus: 1}) require.NoError(t, err) require.Equal(t, testSize, len(fileInfos)) fileInfos, err = pfsutil.ListFile(apiClient, repoName, newCommitID, "a/c", &pfs.Shard{Number: 0, Modulus: 1}) require.NoError(t, err) require.Equal(t, testSize, len(fileInfos)) 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.ListFile(apiClient, repoName, newCommitID, "a/b", &pfs.Shard{Number: uint64(i), Modulus: 7}) require.NoError(t, iErr) fileInfos2[i] = fileInfos3 }() } wg.Wait() count := 0 for i := 0; i < 7; i++ { count += len(fileInfos2[i]) } require.Equal(t, testSize, count) }
func Cmds(address string) ([]*cobra.Command, error) { var number int var modulus int shard := func() *pfs.Shard { return &pfs.Shard{Number: uint64(number), Modulus: uint64(modulus)} } createRepo := &cobra.Command{ Use: "create-repo repo-name", Short: "Create a new repo.", Long: "Create a new repo.", Run: pkgcobra.RunFixedArgs(1, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.CreateRepo(apiClient, args[0]) }), } inspectRepo := &cobra.Command{ Use: "inspect-repo repo-name", Short: "Return info about a repo.", Long: "Return info about a repo.", Run: pkgcobra.RunFixedArgs(1, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } repoInfo, err := pfsutil.InspectRepo(apiClient, args[0]) if err != nil { return err } if repoInfo == nil { return fmt.Errorf("repo %s not found", args[0]) } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintRepoHeader(writer) pretty.PrintRepoInfo(writer, repoInfo) return writer.Flush() }), } listRepo := &cobra.Command{ Use: "list-repo", Short: "Return all repos.", Long: "Reutrn all repos.", Run: pkgcobra.RunFixedArgs(0, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } repoInfos, err := pfsutil.ListRepo(apiClient) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintRepoHeader(writer) for _, repoInfo := range repoInfos { pretty.PrintRepoInfo(writer, repoInfo) } return writer.Flush() }), } deleteRepo := &cobra.Command{ Use: "delete-repo repo-name", Short: "Delete a repo.", Long: "Delete a repo.", Run: pkgcobra.RunFixedArgs(1, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.DeleteRepo(apiClient, args[0]) }), } startCommit := &cobra.Command{ Use: "start-commit repo-name [parent-commit-id]", Short: "Start a new commit.", Long: "Start a new commit with parent-commit-id as the parent.", Run: pkgcobra.RunBoundedArgs(pkgcobra.Bounds{Min: 1, Max: 2}, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } parentCommitID := "" if len(args) == 2 { parentCommitID = args[1] } commit, err := pfsutil.StartCommit(apiClient, args[0], parentCommitID) if err != nil { return err } fmt.Println(commit.Id) return nil }), } finishCommit := &cobra.Command{ Use: "finish-commit repo-name commit-id", Short: "Finish a started commit.", Long: "Finish a started commit. Commit-id must be a writeable commit.", Run: pkgcobra.RunFixedArgs(2, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.FinishCommit(apiClient, args[0], args[1]) }), } inspectCommit := &cobra.Command{ Use: "inspect-commit repo-name commit-id", Short: "Return info about a commit.", Long: "Return info about a commit.", Run: pkgcobra.RunFixedArgs(2, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } commitInfo, err := pfsutil.InspectCommit(apiClient, args[0], args[1]) if err != nil { return err } if commitInfo == nil { return fmt.Errorf("commit %s not found", args[1]) } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintCommitInfoHeader(writer) pretty.PrintCommitInfo(writer, commitInfo) return writer.Flush() }), } listCommit := &cobra.Command{ Use: "list-commit repo-name", Short: "Return all commits on a repo.", Long: "Return all commits on a repo.", Run: pkgcobra.RunFixedArgs(1, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } commitInfos, err := pfsutil.ListCommit(apiClient, args) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintCommitInfoHeader(writer) for _, commitInfo := range commitInfos { pretty.PrintCommitInfo(writer, commitInfo) } return writer.Flush() }), } deleteCommit := &cobra.Command{ Use: "delete-commit repo-name commit-id", Short: "Delete a commit.", Long: "Delete a commit.", Run: pkgcobra.RunFixedArgs(2, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.DeleteCommit(apiClient, args[0], args[1]) }), } mkdir := &cobra.Command{ Use: "mkdir repo-name commit-id path/to/dir", Short: "Make a directory.", Long: "Make a directory. Parent directories need not exist.", Run: pkgcobra.RunFixedArgs(3, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.MakeDirectory(apiClient, args[0], args[1], args[2]) }), } putFile := &cobra.Command{ Use: "put-file repo-name commit-id path/to/file", Short: "Put a file from stdin", Long: "Put a file from stdin. Directories must exist. commit-id must be a writeable commit.", Run: pkgcobra.RunFixedArgs(3, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } _, err = pfsutil.PutFile(apiClient, args[0], args[1], args[2], 0, os.Stdin) return err }), } getFile := &cobra.Command{ Use: "get-file repo-name commit-id path/to/file", Short: "Return the contents of a file.", Long: "Return the contents of a file.", Run: pkgcobra.RunFixedArgs(3, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.GetFile(apiClient, args[0], args[1], args[2], 0, math.MaxInt64, shard(), os.Stdout) }), } getFile.Flags().IntVarP(&number, "shard", "s", 0, "shard to read from") getFile.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") inspectFile := &cobra.Command{ Use: "inspect-file repo-name commit-id path/to/file", Short: "Return info about a file.", Long: "Return info about a file.", Run: pkgcobra.RunFixedArgs(3, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } fileInfo, err := pfsutil.InspectFile(apiClient, args[0], args[1], args[2], shard()) if err != nil { return err } if fileInfo == nil { return fmt.Errorf("file %s not found", args[2]) } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintFileInfoHeader(writer) pretty.PrintFileInfo(writer, fileInfo) return writer.Flush() }), } inspectFile.Flags().IntVarP(&number, "shard", "s", 0, "shard to read from") inspectFile.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") listFile := &cobra.Command{ Use: "list-file repo-name commit-id path/to/dir", Short: "Return the files in a directory.", Long: "Return the files in a directory.", Run: pkgcobra.RunBoundedArgs(pkgcobra.Bounds{Min: 2, Max: 3}, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } var path string if len(args) == 3 { path = args[2] } fileInfos, err := pfsutil.ListFile(apiClient, args[0], args[1], path, shard()) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintFileInfoHeader(writer) for _, fileInfo := range fileInfos { pretty.PrintFileInfo(writer, fileInfo) } return writer.Flush() }), } listFile.Flags().IntVarP(&number, "shard", "s", 0, "shard to read from") listFile.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") deleteFile := &cobra.Command{ Use: "delete-file repo-name commit-id path/to/file", Short: "Delete a file.", Long: "Delete a file.", Run: pkgcobra.RunFixedArgs(2, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.DeleteFile(apiClient, args[0], args[1], args[2]) }), } listChange := &cobra.Command{ Use: "list-change repo-name commit-id path/to/dir", Short: "Return the changes in a directory.", Long: "Return the changes in a directory.", Run: pkgcobra.RunFixedArgs(3, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } changeInfos, err := pfsutil.ListChange(apiClient, args[0], args[1], args[2], shard()) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintChangeHeader(writer) for _, changeInfo := range changeInfos { pretty.PrintChange(writer, changeInfo) } return writer.Flush() }), } listChange.Flags().IntVarP(&number, "shard", "s", 0, "shard to read from") listChange.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") inspectServer := &cobra.Command{ Use: "inspect-server server-id", Short: "Inspect a server.", Long: "Inspect a server.", Run: pkgcobra.RunFixedArgs(1, func(args []string) error { clusterAPIClient, err := getClusterAPIClient(address) if err != nil { return err } serverInfo, err := pfsutil.InspectServer(clusterAPIClient, args[0]) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintServerInfoHeader(writer) pretty.PrintServerInfo(writer, serverInfo) return writer.Flush() }), } listServer := &cobra.Command{ Use: "list-server", Short: "Return all servers in the cluster.", Long: "Return all servers in the cluster.", Run: pkgcobra.RunFixedArgs(0, func(args []string) error { clusterAPIClient, err := getClusterAPIClient(address) if err != nil { return err } serverInfos, err := pfsutil.ListServer(clusterAPIClient) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintServerInfoHeader(writer) for _, serverInfo := range serverInfos { pretty.PrintServerInfo(writer, serverInfo) } return writer.Flush() }), } var mountPoint string mount := &cobra.Command{ Use: "mount [repo/commit:alias...]", Short: "Mount pfs locally.", Long: "Mount pfs locally.", Run: pkgcobra.Run(func(args []string) error { protolog.SetLevel(protolog.Level_LEVEL_DEBUG) apiClient, err := getAPIClient(address) if err != nil { return err } mounter := fuse.NewMounter(address, apiClient) return mounter.Mount(mountPoint, shard(), parseCommitMounts(args), nil) }), } mount.Flags().IntVarP(&number, "shard", "s", 0, "shard to read from") mount.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") mount.Flags().StringVarP(&mountPoint, "mount-point", "p", "/pfs", "root of mounted filesystem") var result []*cobra.Command result = append(result, createRepo) result = append(result, inspectRepo) result = append(result, listRepo) result = append(result, deleteRepo) result = append(result, startCommit) result = append(result, finishCommit) result = append(result, inspectCommit) result = append(result, listCommit) result = append(result, deleteCommit) result = append(result, mkdir) result = append(result, putFile) result = append(result, getFile) result = append(result, inspectFile) result = append(result, listFile) result = append(result, deleteFile) result = append(result, listChange) result = append(result, inspectServer) result = append(result, listServer) result = append(result, mount) return result, nil }
func do(appEnvObj interface{}) error { appEnv := appEnvObj.(*appEnv) logrus.Register() address := appEnv.PachydermPfsd1Port if address == "" { address = appEnv.Address } else { address = strings.Replace(address, "tcp://", "", -1) } clientConn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { return err } apiClient := pfs.NewApiClient(clientConn) var shard int var modulus int createRepo := cobramainutil.Command{ Use: "create-repo repo-name", Short: "Create a new repo.", Long: "Create a new repo.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.CreateRepo(apiClient, args[0]) }, }.ToCobraCommand() inspectRepo := cobramainutil.Command{ Use: "inspect-repo repo-name", Short: "Return info about a repo.", Long: "Return info about a repo.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { repoInfo, err := pfsutil.InspectRepo(apiClient, args[0]) if err != nil { return err } if repoInfo == nil { return fmt.Errorf("repo %s not found", args[0]) } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintRepoHeader(writer) pretty.PrintRepoInfo(writer, repoInfo) return writer.Flush() }, }.ToCobraCommand() listRepo := cobramainutil.Command{ Use: "list-repo", Short: "Return all repos.", Long: "Reutrn all repos.", NumArgs: 0, Run: func(cmd *cobra.Command, args []string) error { repoInfos, err := pfsutil.ListRepo(apiClient) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintRepoHeader(writer) for _, repoInfo := range repoInfos { pretty.PrintRepoInfo(writer, repoInfo) } return writer.Flush() }, }.ToCobraCommand() deleteRepo := cobramainutil.Command{ Use: "delete-repo repo-name", Short: "Delete a repo.", Long: "Delete a repo.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.DeleteRepo(apiClient, args[0]) }, }.ToCobraCommand() startCommit := cobramainutil.Command{ Use: "start-commit repo-name parent-commit-id", Short: "Start a new commit.", Long: "Start a new commit with parent-commit-id as the parent.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { commit, err := pfsutil.StartCommit(apiClient, args[0], args[1]) if err != nil { return err } fmt.Println(commit.Id) return nil }, }.ToCobraCommand() finishCommit := cobramainutil.Command{ Use: "finish-commit repo-name commit-id", Short: "Finish a started commit.", Long: "Finish a started commit. Commit-id must be a writeable commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.FinishCommit(apiClient, args[0], args[1]) }, }.ToCobraCommand() inspectCommit := cobramainutil.Command{ Use: "inspect-commit repo-name commit-id", Short: "Return info about a commit.", Long: "Return info about a commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { commitInfo, err := pfsutil.InspectCommit(apiClient, args[0], args[1]) if err != nil { return err } if commitInfo == nil { return fmt.Errorf("commit %s not found", args[1]) } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintCommitInfoHeader(writer) pretty.PrintCommitInfo(writer, commitInfo) return writer.Flush() }, }.ToCobraCommand() listCommit := cobramainutil.Command{ Use: "list-commit repo-name", Short: "Return all commits on a repo.", Long: "Return all commits on a repo.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { commitInfos, err := pfsutil.ListCommit(apiClient, args[0]) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintCommitInfoHeader(writer) for _, commitInfo := range commitInfos { pretty.PrintCommitInfo(writer, commitInfo) } return writer.Flush() }, }.ToCobraCommand() deleteCommit := cobramainutil.Command{ Use: "delete-commit repo-name commit-id", Short: "Delete a commit.", Long: "Delete a commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.DeleteCommit(apiClient, args[0], args[1]) }, }.ToCobraCommand() putBlock := cobramainutil.Command{ Use: "put-block repo-name commit-id path/to/file", Short: "Put a block from stdin", Long: "Put a block from stdin. Directories must exist. commit-id must be a writeable commit.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { block, err := pfsutil.PutBlock(apiClient, args[0], args[1], args[2], os.Stdin) if err != nil { return err } fmt.Println(block.Hash) return nil }, }.ToCobraCommand() getBlock := cobramainutil.Command{ Use: "get-block hash", Short: "Return the contents of a block.", Long: "Return the contents of a block.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.GetBlock(apiClient, args[0], os.Stdout) }, }.ToCobraCommand() inspectBlock := cobramainutil.Command{ Use: "inspect-block hash", Short: "Return info about a block.", Long: "Return info about a block.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { blockInfo, err := pfsutil.InspectBlock(apiClient, args[0]) if err != nil { return err } if blockInfo == nil { return fmt.Errorf("block %s not found", args[2]) } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintBlockInfoHeader(writer) pretty.PrintBlockInfo(writer, blockInfo) return writer.Flush() }, }.ToCobraCommand() listBlock := cobramainutil.Command{ Use: "list-block", Short: "Return the blocks in a directory.", Long: "Return the blocks in a directory.", NumArgs: 0, Run: func(cmd *cobra.Command, args []string) error { blockInfos, err := pfsutil.ListBlock(apiClient, uint64(shard), uint64(modulus)) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintBlockInfoHeader(writer) for _, blockInfo := range blockInfos { pretty.PrintBlockInfo(writer, blockInfo) } return writer.Flush() }, }.ToCobraCommand() listBlock.Flags().IntVarP(&shard, "shard", "s", 0, "shard to read from") listBlock.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") mkdir := cobramainutil.Command{ Use: "mkdir repo-name commit-id path/to/dir", Short: "Make a directory.", Long: "Make a directory. Parent directories need not exist.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.MakeDirectory(apiClient, args[0], args[1], args[2]) }, }.ToCobraCommand() putFile := cobramainutil.Command{ Use: "put-file repo-name commit-id path/to/file", Short: "Put a file from stdin", Long: "Put a file from stdin. Directories must exist. commit-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() getFile := cobramainutil.Command{ Use: "get-file repo-name commit-id path/to/file", Short: "Return the contents of a file.", Long: "Return the contents of a file.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.GetFile(apiClient, args[0], args[1], args[2], 0, math.MaxInt64, os.Stdout) }, }.ToCobraCommand() inspectFile := cobramainutil.Command{ Use: "inspect-file repo-name commit-id path/to/file", Short: "Return info about a file.", Long: "Return info about a file.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { fileInfo, err := pfsutil.InspectFile(apiClient, args[0], args[1], args[2]) if err != nil { return err } if fileInfo == nil { return fmt.Errorf("file %s not found", args[2]) } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintFileInfoHeader(writer) pretty.PrintFileInfo(writer, fileInfo) return writer.Flush() }, }.ToCobraCommand() listFile := cobramainutil.Command{ Use: "list-file repo-name commit-id path/to/dir", Short: "Return the files in a directory.", Long: "Return the files in a directory.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { fileInfos, err := pfsutil.ListFile(apiClient, args[0], args[1], args[2], uint64(shard), uint64(modulus)) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintFileInfoHeader(writer) for _, fileInfo := range fileInfos { pretty.PrintFileInfo(writer, fileInfo) } return writer.Flush() }, }.ToCobraCommand() listFile.Flags().IntVarP(&shard, "shard", "s", 0, "shard to read from") listFile.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") deleteFile := cobramainutil.Command{ Use: "delete-file repo-name commit-id path/to/file", Short: "Delete a file.", Long: "Delete a file.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.DeleteFile(apiClient, args[0], args[1], args[2]) }, }.ToCobraCommand() listChange := cobramainutil.Command{ Use: "list-change repo-name commit-id path/to/dir", Short: "Return the changes in a directory.", Long: "Return the changes in a directory.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { changeInfos, err := pfsutil.ListChange(apiClient, args[0], args[1], args[2], uint64(shard), uint64(modulus)) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintChangeHeader(writer) for _, changeInfo := range changeInfos { pretty.PrintChange(writer, changeInfo) } return writer.Flush() }, }.ToCobraCommand() listChange.Flags().IntVarP(&shard, "shard", "s", 0, "shard to read from") listChange.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") inspectServer := cobramainutil.Command{ Use: "inspect-server server-id", Short: "Inspect a server.", Long: "Inspect a server.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { serverInfo, err := pfsutil.InspectServer(apiClient, args[0]) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintServerInfoHeader(writer) pretty.PrintServerInfo(writer, serverInfo) return writer.Flush() }, }.ToCobraCommand() listServer := cobramainutil.Command{ Use: "list-server", Short: "Return all servers in the cluster.", Long: "Return all servers in the cluster.", NumArgs: 0, Run: func(cmd *cobra.Command, args []string) error { serverInfos, err := pfsutil.ListServer(apiClient) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintServerInfoHeader(writer) for _, serverInfo := range serverInfos { pretty.PrintServerInfo(writer, serverInfo) } return writer.Flush() }, }.ToCobraCommand() mount := cobramainutil.Command{ Use: "mount mountpoint repo-name [commit-id]", Short: "Mount a repo as a local file system.", Long: "Mount a repo as a local file system.", MinNumArgs: 2, MaxNumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { mountPoint := args[0] repo := args[1] commitID := "" if len(args) == 3 { commitID = args[2] } mounter := fuse.NewMounter(apiClient) if err := mounter.Mount(repo, commitID, mountPoint, uint64(shard), uint64(modulus)); err != nil { return err } return mounter.Wait(mountPoint) }, }.ToCobraCommand() mount.Flags().IntVarP(&shard, "shard", "s", 0, "shard to read from") mount.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(protoclient.NewVersionCommand(clientConn, pachyderm.Version, nil)) rootCmd.AddCommand(createRepo) rootCmd.AddCommand(inspectRepo) rootCmd.AddCommand(listRepo) rootCmd.AddCommand(deleteRepo) rootCmd.AddCommand(startCommit) rootCmd.AddCommand(finishCommit) rootCmd.AddCommand(inspectCommit) rootCmd.AddCommand(listCommit) rootCmd.AddCommand(deleteCommit) rootCmd.AddCommand(mkdir) rootCmd.AddCommand(putBlock) rootCmd.AddCommand(getBlock) rootCmd.AddCommand(inspectBlock) rootCmd.AddCommand(listBlock) rootCmd.AddCommand(putFile) rootCmd.AddCommand(getFile) rootCmd.AddCommand(inspectFile) rootCmd.AddCommand(listFile) rootCmd.AddCommand(deleteFile) rootCmd.AddCommand(listChange) rootCmd.AddCommand(inspectServer) rootCmd.AddCommand(listServer) rootCmd.AddCommand(mount) return rootCmd.Execute() }
func Cmds(address string) []*cobra.Command { var fileNumber int var fileModulus int var blockNumber int var blockModulus int shard := func() *pfs.Shard { return &pfs.Shard{ FileNumber: uint64(fileNumber), FileModulus: uint64(fileModulus), BlockNumber: uint64(blockNumber), BlockModulus: uint64(blockModulus), } } addShardFlags := func(cmd *cobra.Command) { cmd.Flags().IntVarP(&fileNumber, "file-shard", "s", 0, "file shard to read") cmd.Flags().IntVarP(&fileModulus, "file-modulus", "m", 1, "modulus of file shard") cmd.Flags().IntVarP(&blockNumber, "block-shard", "b", 0, "block shard to read") cmd.Flags().IntVarP(&blockModulus, "block-modulus", "n", 1, "modulus of block shard") } repo := &cobra.Command{ Use: "repo", Short: "Docs for repos.", Long: `Repos, short for repository, are the top level data object in Pachyderm. Repos are created with create-repo.`, Run: pkgcobra.RunFixedArgs(0, func(args []string) error { return nil }), } createRepo := &cobra.Command{ Use: "create-repo repo-name", Short: "Create a new repo.", Long: "Create a new repo.", Run: pkgcobra.RunFixedArgs(1, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.CreateRepo(apiClient, args[0]) }), } inspectRepo := &cobra.Command{ Use: "inspect-repo repo-name", Short: "Return info about a repo.", Long: "Return info about a repo.", Run: pkgcobra.RunFixedArgs(1, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } repoInfo, err := pfsutil.InspectRepo(apiClient, args[0]) if err != nil { return err } if repoInfo == nil { return fmt.Errorf("repo %s not found", args[0]) } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintRepoHeader(writer) pretty.PrintRepoInfo(writer, repoInfo) return writer.Flush() }), } listRepo := &cobra.Command{ Use: "list-repo", Short: "Return all repos.", Long: "Reutrn all repos.", Run: pkgcobra.RunFixedArgs(0, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } repoInfos, err := pfsutil.ListRepo(apiClient) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintRepoHeader(writer) for _, repoInfo := range repoInfos { pretty.PrintRepoInfo(writer, repoInfo) } return writer.Flush() }), } deleteRepo := &cobra.Command{ Use: "delete-repo repo-name", Short: "Delete a repo.", Long: "Delete a repo.", Run: pkgcobra.RunFixedArgs(1, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.DeleteRepo(apiClient, args[0]) }), } commit := &cobra.Command{ Use: "commit", Short: "Docs for commits.", Long: `Commits are atomic transactions on the content of a repo. Creating a commit is a multistep process: - start a new commit with start-commit - write files to it through fuse or with put-file - finish the new commit with finish-commit Commits that have been started but not finished are NOT durable storage. Commits become reliable (and immutable) when they are finished. Commits can be created with another commit as a parent. This layers the data in the commit over the data in the parent.`, Run: pkgcobra.RunFixedArgs(0, func(args []string) error { return nil }), } startCommit := &cobra.Command{ Use: "start-commit repo-name [parent-commit-id]", Short: "Start a new commit.", Long: "Start a new commit with parent-commit-id as the parent.", Run: pkgcobra.RunBoundedArgs(pkgcobra.Bounds{Min: 1, Max: 2}, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } parentCommitID := "" if len(args) == 2 { parentCommitID = args[1] } commit, err := pfsutil.StartCommit(apiClient, args[0], parentCommitID) if err != nil { return err } fmt.Println(commit.Id) return nil }), } finishCommit := &cobra.Command{ Use: "finish-commit repo-name commit-id", Short: "Finish a started commit.", Long: "Finish a started commit. Commit-id must be a writeable commit.", Run: pkgcobra.RunFixedArgs(2, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.FinishCommit(apiClient, args[0], args[1]) }), } inspectCommit := &cobra.Command{ Use: "inspect-commit repo-name commit-id", Short: "Return info about a commit.", Long: "Return info about a commit.", Run: pkgcobra.RunFixedArgs(2, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } commitInfo, err := pfsutil.InspectCommit(apiClient, args[0], args[1]) if err != nil { return err } if commitInfo == nil { return fmt.Errorf("commit %s not found", args[1]) } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintCommitInfoHeader(writer) pretty.PrintCommitInfo(writer, commitInfo) return writer.Flush() }), } listCommit := &cobra.Command{ Use: "list-commit repo-name", Short: "Return all commits on a repo.", Long: "Return all commits on a repo.", Run: pkgcobra.RunFixedArgs(1, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } commitInfos, err := pfsutil.ListCommit(apiClient, args) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintCommitInfoHeader(writer) for _, commitInfo := range commitInfos { pretty.PrintCommitInfo(writer, commitInfo) } return writer.Flush() }), } deleteCommit := &cobra.Command{ Use: "delete-commit repo-name commit-id", Short: "Delete a commit.", Long: "Delete a commit.", Run: pkgcobra.RunFixedArgs(2, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.DeleteCommit(apiClient, args[0], args[1]) }), } file := &cobra.Command{ Use: "file", Short: "Docs for files.", Long: `Files are the lowest level data object in Pachyderm. Files can be written to started (but not finished) commits with put-file. Files can be read from finished commits with get-file.`, Run: pkgcobra.RunFixedArgs(0, func(args []string) error { return nil }), } putFile := &cobra.Command{ Use: "put-file repo-name commit-id path/to/file", Short: "Put a file from stdin", Long: "Put a file from stdin. Directories must exist. commit-id must be a writeable commit.", Run: pkgcobra.RunFixedArgs(3, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } _, err = pfsutil.PutFile(apiClient, args[0], args[1], args[2], 0, os.Stdin) return err }), } getFile := &cobra.Command{ Use: "get-file repo-name commit-id path/to/file", Short: "Return the contents of a file.", Long: "Return the contents of a file.", Run: pkgcobra.RunFixedArgs(3, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.GetFile(apiClient, args[0], args[1], args[2], 0, 0, "", shard(), os.Stdout) }), } addShardFlags(getFile) inspectFile := &cobra.Command{ Use: "inspect-file repo-name commit-id path/to/file", Short: "Return info about a file.", Long: "Return info about a file.", Run: pkgcobra.RunFixedArgs(3, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } fileInfo, err := pfsutil.InspectFile(apiClient, args[0], args[1], args[2], "", shard()) if err != nil { return err } if fileInfo == nil { return fmt.Errorf("file %s not found", args[2]) } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintFileInfoHeader(writer) pretty.PrintFileInfo(writer, fileInfo) return writer.Flush() }), } addShardFlags(inspectFile) listFile := &cobra.Command{ Use: "list-file repo-name commit-id path/to/dir", Short: "Return the files in a directory.", Long: "Return the files in a directory.", Run: pkgcobra.RunBoundedArgs(pkgcobra.Bounds{Min: 2, Max: 3}, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } var path string if len(args) == 3 { path = args[2] } fileInfos, err := pfsutil.ListFile(apiClient, args[0], args[1], path, "", shard()) if err != nil { return err } writer := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) pretty.PrintFileInfoHeader(writer) for _, fileInfo := range fileInfos { pretty.PrintFileInfo(writer, fileInfo) } return writer.Flush() }), } addShardFlags(listFile) deleteFile := &cobra.Command{ Use: "delete-file repo-name commit-id path/to/file", Short: "Delete a file.", Long: "Delete a file.", Run: pkgcobra.RunFixedArgs(2, func(args []string) error { apiClient, err := getAPIClient(address) if err != nil { return err } return pfsutil.DeleteFile(apiClient, args[0], args[1], args[2]) }), } var mountPoint string mount := &cobra.Command{ Use: "mount [repo/commit:alias...]", Short: "Mount pfs locally.", Long: "Mount pfs locally.", Run: pkgcobra.Run(func(args []string) error { //lion.SetLevel(lion.LevelDebug) apiClient, err := getAPIClient(address) if err != nil { return err } mounter := fuse.NewMounter(address, apiClient) return mounter.Mount(mountPoint, shard(), parseCommitMounts(args), nil) }), } mount.Flags().StringVarP(&mountPoint, "mount-point", "p", "/pfs", "root of mounted filesystem") addShardFlags(mount) var result []*cobra.Command result = append(result, repo) result = append(result, createRepo) result = append(result, inspectRepo) result = append(result, listRepo) result = append(result, deleteRepo) result = append(result, commit) result = append(result, startCommit) result = append(result, finishCommit) result = append(result, inspectCommit) result = append(result, listCommit) result = append(result, deleteCommit) result = append(result, file) result = append(result, putFile) result = append(result, getFile) result = append(result, inspectFile) result = append(result, listFile) result = append(result, deleteFile) result = append(result, mount) return result }