github.com/pachyderm/pachyderm@v1.13.4/src/client/transaction.go (about)

     1  package client
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/pachyderm/pachyderm/src/client/admin"
     7  	"github.com/pachyderm/pachyderm/src/client/auth"
     8  	"github.com/pachyderm/pachyderm/src/client/debug"
     9  	"github.com/pachyderm/pachyderm/src/client/enterprise"
    10  	"github.com/pachyderm/pachyderm/src/client/pfs"
    11  	"github.com/pachyderm/pachyderm/src/client/pkg/grpcutil"
    12  	"github.com/pachyderm/pachyderm/src/client/pps"
    13  	"github.com/pachyderm/pachyderm/src/client/transaction"
    14  	"github.com/pachyderm/pachyderm/src/client/version/versionpb"
    15  
    16  	types "github.com/gogo/protobuf/types"
    17  	"github.com/pachyderm/pachyderm/src/client/pkg/errors"
    18  	"google.golang.org/grpc"
    19  	"google.golang.org/grpc/metadata"
    20  )
    21  
    22  const transactionMetadataKey = "pach-transaction"
    23  
    24  // WithTransaction (client-side) returns a new APIClient that will run supported
    25  // write operations within the specified transaction.
    26  func (c APIClient) WithTransaction(txn *transaction.Transaction) *APIClient {
    27  	md, _ := metadata.FromOutgoingContext(c.Ctx())
    28  	md = md.Copy()
    29  	if txn != nil {
    30  		md.Set(transactionMetadataKey, txn.ID)
    31  	} else {
    32  		md.Set(transactionMetadataKey)
    33  	}
    34  	ctx := metadata.NewOutgoingContext(c.Ctx(), md)
    35  	return c.WithCtx(ctx)
    36  }
    37  
    38  // WithoutTransaction returns a new APIClient which will run all future operations
    39  // outside of any active transaction
    40  // Removing from both incoming and outgoing metadata is necessary because Ctx() merges them
    41  func (c APIClient) WithoutTransaction() *APIClient {
    42  	ctx := c.Ctx()
    43  	incomingMD, _ := metadata.FromIncomingContext(ctx)
    44  	outgoingMD, _ := metadata.FromOutgoingContext(ctx)
    45  	newIn := make(metadata.MD)
    46  	newOut := make(metadata.MD)
    47  	for k, v := range incomingMD {
    48  		if k == transactionMetadataKey {
    49  			continue
    50  		}
    51  		newIn[k] = v
    52  	}
    53  	for k, v := range outgoingMD {
    54  		if k == transactionMetadataKey {
    55  			continue
    56  		}
    57  		newOut[k] = v
    58  	}
    59  	return c.WithCtx(metadata.NewIncomingContext(metadata.NewOutgoingContext(ctx, newOut), newIn))
    60  }
    61  
    62  // GetTransaction (should be run from the server-side) loads the active
    63  // transaction from the grpc metadata and returns the associated transaction
    64  // object - or `nil` if no transaction is set.
    65  func GetTransaction(ctx context.Context) (*transaction.Transaction, error) {
    66  	md, ok := metadata.FromIncomingContext(ctx)
    67  	if !ok {
    68  		return nil, errors.Errorf("request metadata could not be parsed from context")
    69  	}
    70  
    71  	txns := md.Get(transactionMetadataKey)
    72  	if len(txns) == 0 {
    73  		return nil, nil
    74  	} else if len(txns) > 1 {
    75  		return nil, errors.Errorf("multiple active transactions found in context")
    76  	}
    77  	return &transaction.Transaction{ID: txns[0]}, nil
    78  }
    79  
    80  // GetTransaction is a helper function to get the active transaction from the
    81  // client's context metadata.
    82  func (c APIClient) GetTransaction() (*transaction.Transaction, error) {
    83  	return GetTransaction(c.Ctx())
    84  }
    85  
    86  // NewCommitResponse is a helper function to instantiate a TransactionResponse
    87  // for a transaction item that returns a Commit ID.
    88  func NewCommitResponse(commit *pfs.Commit) *transaction.TransactionResponse {
    89  	return &transaction.TransactionResponse{
    90  		Commit: commit,
    91  	}
    92  }
    93  
    94  // ListTransaction is an RPC that fetches a list of all open transactions in the
    95  // Pachyderm cluster.
    96  func (c APIClient) ListTransaction() ([]*transaction.TransactionInfo, error) {
    97  	response, err := c.TransactionAPIClient.ListTransaction(
    98  		c.Ctx(),
    99  		&transaction.ListTransactionRequest{},
   100  	)
   101  	if err != nil {
   102  		return nil, grpcutil.ScrubGRPC(err)
   103  	}
   104  	return response.TransactionInfo, nil
   105  }
   106  
   107  // StartTransaction is an RPC that registers a new transaction with the
   108  // Pachyderm cluster and returns the identifier of the new transaction.
   109  func (c APIClient) StartTransaction() (*transaction.Transaction, error) {
   110  	response, err := c.TransactionAPIClient.StartTransaction(
   111  		c.Ctx(),
   112  		&transaction.StartTransactionRequest{},
   113  	)
   114  	if err != nil {
   115  		return nil, grpcutil.ScrubGRPC(err)
   116  	}
   117  	return response, nil
   118  }
   119  
   120  // FinishTransaction is an RPC that closes an existing transaction in the
   121  // Pachyderm cluster and commits its changes to the persisted cluster metadata
   122  // transactionally.
   123  func (c APIClient) FinishTransaction(txn *transaction.Transaction) (*transaction.TransactionInfo, error) {
   124  	response, err := c.TransactionAPIClient.FinishTransaction(
   125  		c.Ctx(),
   126  		&transaction.FinishTransactionRequest{
   127  			Transaction: txn,
   128  		},
   129  	)
   130  	if err != nil {
   131  		return nil, grpcutil.ScrubGRPC(err)
   132  	}
   133  	return response, nil
   134  }
   135  
   136  // DeleteTransaction is an RPC that aborts an existing transaction in the
   137  // Pachyderm cluster and removes it from the cluster.
   138  func (c APIClient) DeleteTransaction(txn *transaction.Transaction) error {
   139  	_, err := c.TransactionAPIClient.DeleteTransaction(
   140  		c.Ctx(),
   141  		&transaction.DeleteTransactionRequest{
   142  			Transaction: txn,
   143  		},
   144  	)
   145  	return grpcutil.ScrubGRPC(err)
   146  }
   147  
   148  // InspectTransaction is an RPC that fetches the detailed information for an
   149  // existing transaction in the Pachyderm cluster.
   150  func (c APIClient) InspectTransaction(txn *transaction.Transaction) (*transaction.TransactionInfo, error) {
   151  	response, err := c.TransactionAPIClient.InspectTransaction(
   152  		c.Ctx(),
   153  		&transaction.InspectTransactionRequest{
   154  			Transaction: txn,
   155  		},
   156  	)
   157  	if err != nil {
   158  		return nil, grpcutil.ScrubGRPC(err)
   159  	}
   160  	return response, nil
   161  }
   162  
   163  // ExecuteInTransaction executes a callback within a transaction.
   164  // The callback should use the passed in APIClient.
   165  // If the callback returns a nil error, then the transaction will be finished.
   166  // If the callback returns a non-nil error, then the transaction will be deleted.
   167  func (c APIClient) ExecuteInTransaction(f func(c *APIClient) error) (*transaction.TransactionInfo, error) {
   168  	txn, err := c.StartTransaction()
   169  	if err != nil {
   170  		return nil, err
   171  	}
   172  	if err := f(c.WithTransaction(txn)); err != nil {
   173  		// We ignore the delete error, because we are more interested in the error from the callback.
   174  		c.DeleteTransaction(txn)
   175  		return nil, err
   176  	}
   177  	return c.FinishTransaction(txn)
   178  }
   179  
   180  // TransactionBuilder presents the same interface as a pachyderm APIClient, but
   181  // captures requests rather than sending to the server. If a request is not
   182  // supported by the transaction system, it immediately errors.
   183  type TransactionBuilder struct {
   184  	APIClient
   185  
   186  	parent *APIClient
   187  
   188  	requests []*transaction.TransactionRequest
   189  }
   190  
   191  type pfsBuilderClient struct {
   192  	tb *TransactionBuilder
   193  }
   194  
   195  type ppsBuilderClient struct {
   196  	tb *TransactionBuilder
   197  }
   198  
   199  type objectBuilderClient struct {
   200  	tb *TransactionBuilder
   201  }
   202  
   203  type authBuilderClient struct {
   204  	tb *TransactionBuilder
   205  }
   206  
   207  type versionBuilderClient struct {
   208  	tb *TransactionBuilder
   209  }
   210  
   211  type adminBuilderClient struct {
   212  	tb *TransactionBuilder
   213  }
   214  
   215  type transactionBuilderClient struct {
   216  	tb *TransactionBuilder
   217  }
   218  
   219  type debugBuilderClient struct {
   220  	tb *TransactionBuilder
   221  }
   222  
   223  type enterpriseBuilderClient struct {
   224  	tb *TransactionBuilder
   225  }
   226  
   227  func newPfsBuilderClient(tb *TransactionBuilder) pfs.APIClient {
   228  	return &pfsBuilderClient{tb: tb}
   229  }
   230  
   231  func newPpsBuilderClient(tb *TransactionBuilder) pps.APIClient {
   232  	return &ppsBuilderClient{tb: tb}
   233  }
   234  
   235  func newObjectBuilderClient(tb *TransactionBuilder) pfs.ObjectAPIClient {
   236  	return &objectBuilderClient{tb: tb}
   237  }
   238  
   239  func newAuthBuilderClient(tb *TransactionBuilder) auth.APIClient {
   240  	return &authBuilderClient{tb: tb}
   241  }
   242  
   243  func newEnterpriseBuilderClient(tb *TransactionBuilder) enterprise.APIClient {
   244  	return &enterpriseBuilderClient{tb: tb}
   245  }
   246  
   247  func newVersionBuilderClient(tb *TransactionBuilder) versionpb.APIClient {
   248  	return &versionBuilderClient{tb: tb}
   249  }
   250  
   251  func newAdminBuilderClient(tb *TransactionBuilder) admin.APIClient {
   252  	return &adminBuilderClient{tb: tb}
   253  }
   254  
   255  func newTransactionBuilderClient(tb *TransactionBuilder) transaction.APIClient {
   256  	return &transactionBuilderClient{tb: tb}
   257  }
   258  
   259  func newDebugBuilderClient(tb *TransactionBuilder) debug.DebugClient {
   260  	return &debugBuilderClient{tb: tb}
   261  }
   262  
   263  func newTransactionBuilder(parent *APIClient) *TransactionBuilder {
   264  	tb := &TransactionBuilder{parent: parent}
   265  	tb.PfsAPIClient = newPfsBuilderClient(tb)
   266  	tb.PpsAPIClient = newPpsBuilderClient(tb)
   267  	tb.ObjectAPIClient = newObjectBuilderClient(tb)
   268  	tb.AuthAPIClient = newAuthBuilderClient(tb)
   269  	tb.Enterprise = newEnterpriseBuilderClient(tb)
   270  	tb.VersionAPIClient = newVersionBuilderClient(tb)
   271  	tb.AdminAPIClient = newAdminBuilderClient(tb)
   272  	tb.TransactionAPIClient = newTransactionBuilderClient(tb)
   273  	tb.DebugClient = newDebugBuilderClient(tb)
   274  	return tb
   275  }
   276  
   277  // Close does not exist on a TransactionBuilder because it doesn't represent
   278  // ownership of a connection to the API server. We need this to shadow the
   279  // inherited Close, though.
   280  func (tb *TransactionBuilder) Close() error {
   281  	return errors.Errorf("Close is not implemented on a TransactionBuilder instance")
   282  }
   283  
   284  // GetAddress should not exist on a TransactionBuilder because it doesn't represent
   285  // ownership of a connection to the API server, but it also doesn't return an error,
   286  // so we just passthrough to the parent client's implementation.
   287  func (tb *TransactionBuilder) GetAddress() string {
   288  	return tb.parent.GetAddress()
   289  }
   290  
   291  // RunBatchInTransaction will execute a batch of API calls in a single round-trip
   292  // transactionally. The callback is used to build the request, which is executed
   293  // when the callback returns.
   294  func (c APIClient) RunBatchInTransaction(cb func(builder *TransactionBuilder) error) (*transaction.TransactionInfo, error) {
   295  	tb := newTransactionBuilder(&c)
   296  	if err := cb(tb); err != nil {
   297  		return nil, err
   298  	}
   299  
   300  	return c.BatchTransaction(c.Ctx(), &transaction.BatchTransactionRequest{Requests: tb.requests})
   301  }
   302  
   303  func (c *pfsBuilderClient) CreateRepo(ctx context.Context, req *pfs.CreateRepoRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   304  	c.tb.requests = append(c.tb.requests, &transaction.TransactionRequest{CreateRepo: req})
   305  	return nil, nil
   306  }
   307  func (c *pfsBuilderClient) DeleteRepo(ctx context.Context, req *pfs.DeleteRepoRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   308  	c.tb.requests = append(c.tb.requests, &transaction.TransactionRequest{DeleteRepo: req})
   309  	return nil, nil
   310  }
   311  func (c *pfsBuilderClient) StartCommit(ctx context.Context, req *pfs.StartCommitRequest, opts ...grpc.CallOption) (*pfs.Commit, error) {
   312  	// Note that since we are batching requests (no extra round-trips), we do not
   313  	// have the commit id to return here. If you need an operation that relies
   314  	// upon the commit id, use ExecuteInTransaction instead.
   315  	c.tb.requests = append(c.tb.requests, &transaction.TransactionRequest{StartCommit: req})
   316  	return nil, nil
   317  }
   318  func (c *pfsBuilderClient) FinishCommit(ctx context.Context, req *pfs.FinishCommitRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   319  	c.tb.requests = append(c.tb.requests, &transaction.TransactionRequest{FinishCommit: req})
   320  	return nil, nil
   321  }
   322  func (c *pfsBuilderClient) DeleteCommit(ctx context.Context, req *pfs.DeleteCommitRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   323  	c.tb.requests = append(c.tb.requests, &transaction.TransactionRequest{DeleteCommit: req})
   324  	return nil, nil
   325  }
   326  func (c *pfsBuilderClient) CreateBranch(ctx context.Context, req *pfs.CreateBranchRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   327  	c.tb.requests = append(c.tb.requests, &transaction.TransactionRequest{CreateBranch: req})
   328  	return nil, nil
   329  }
   330  func (c *pfsBuilderClient) DeleteBranch(ctx context.Context, req *pfs.DeleteBranchRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   331  	c.tb.requests = append(c.tb.requests, &transaction.TransactionRequest{DeleteBranch: req})
   332  	return nil, nil
   333  }
   334  func (c *ppsBuilderClient) UpdateJobState(ctx context.Context, req *pps.UpdateJobStateRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   335  	c.tb.requests = append(c.tb.requests, &transaction.TransactionRequest{UpdateJobState: req})
   336  	return nil, nil
   337  }
   338  
   339  // Boilerplate for making unsupported API requests error when used on a TransactionBuilder
   340  func unsupportedError(name string) error {
   341  	return errors.Errorf("the '%s' API call is not supported in transactions", name)
   342  }
   343  
   344  func (c *pfsBuilderClient) InspectRepo(ctx context.Context, req *pfs.InspectRepoRequest, opts ...grpc.CallOption) (*pfs.RepoInfo, error) {
   345  	return nil, unsupportedError("InspectRepo")
   346  }
   347  func (c *pfsBuilderClient) ListRepo(ctx context.Context, req *pfs.ListRepoRequest, opts ...grpc.CallOption) (*pfs.ListRepoResponse, error) {
   348  	return nil, unsupportedError("ListRepo")
   349  }
   350  func (c *pfsBuilderClient) InspectCommit(ctx context.Context, req *pfs.InspectCommitRequest, opts ...grpc.CallOption) (*pfs.CommitInfo, error) {
   351  	return nil, unsupportedError("InspectCommit")
   352  }
   353  func (c *pfsBuilderClient) ListCommit(ctx context.Context, req *pfs.ListCommitRequest, opts ...grpc.CallOption) (*pfs.CommitInfos, error) {
   354  	return nil, unsupportedError("ListCommit")
   355  }
   356  func (c *pfsBuilderClient) ListCommitStream(ctx context.Context, req *pfs.ListCommitRequest, opts ...grpc.CallOption) (pfs.API_ListCommitStreamClient, error) {
   357  	return nil, unsupportedError("ListCommitStream")
   358  }
   359  func (c *pfsBuilderClient) FlushCommit(ctx context.Context, req *pfs.FlushCommitRequest, opts ...grpc.CallOption) (pfs.API_FlushCommitClient, error) {
   360  	return nil, unsupportedError("FlushCommit")
   361  }
   362  func (c *pfsBuilderClient) SubscribeCommit(ctx context.Context, req *pfs.SubscribeCommitRequest, opts ...grpc.CallOption) (pfs.API_SubscribeCommitClient, error) {
   363  	return nil, unsupportedError("SubscribeCommit")
   364  }
   365  func (c *pfsBuilderClient) BuildCommit(ctx context.Context, req *pfs.BuildCommitRequest, opts ...grpc.CallOption) (*pfs.Commit, error) {
   366  	return nil, unsupportedError("BuildCommit")
   367  }
   368  func (c *pfsBuilderClient) InspectBranch(ctx context.Context, req *pfs.InspectBranchRequest, opts ...grpc.CallOption) (*pfs.BranchInfo, error) {
   369  	return nil, unsupportedError("InspectBranch")
   370  }
   371  func (c *pfsBuilderClient) ListBranch(ctx context.Context, req *pfs.ListBranchRequest, opts ...grpc.CallOption) (*pfs.BranchInfos, error) {
   372  	return nil, unsupportedError("ListBranch")
   373  }
   374  func (c *pfsBuilderClient) PutFile(ctx context.Context, opts ...grpc.CallOption) (pfs.API_PutFileClient, error) {
   375  	return nil, unsupportedError("PutFile")
   376  }
   377  func (c *pfsBuilderClient) CopyFile(ctx context.Context, req *pfs.CopyFileRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   378  	return nil, unsupportedError("CopyFile")
   379  }
   380  func (c *pfsBuilderClient) GetFile(ctx context.Context, req *pfs.GetFileRequest, opts ...grpc.CallOption) (pfs.API_GetFileClient, error) {
   381  	return nil, unsupportedError("GetFile")
   382  }
   383  func (c *pfsBuilderClient) InspectFile(ctx context.Context, req *pfs.InspectFileRequest, opts ...grpc.CallOption) (*pfs.FileInfo, error) {
   384  	return nil, unsupportedError("InspectFile")
   385  }
   386  func (c *pfsBuilderClient) ListFile(ctx context.Context, req *pfs.ListFileRequest, opts ...grpc.CallOption) (*pfs.FileInfos, error) {
   387  	return nil, unsupportedError("ListFile")
   388  }
   389  func (c *pfsBuilderClient) ListFileStream(ctx context.Context, req *pfs.ListFileRequest, opts ...grpc.CallOption) (pfs.API_ListFileStreamClient, error) {
   390  	return nil, unsupportedError("ListFileStream")
   391  }
   392  func (c *pfsBuilderClient) WalkFile(ctx context.Context, req *pfs.WalkFileRequest, opts ...grpc.CallOption) (pfs.API_WalkFileClient, error) {
   393  	return nil, unsupportedError("WalkFile")
   394  }
   395  func (c *pfsBuilderClient) GlobFile(ctx context.Context, req *pfs.GlobFileRequest, opts ...grpc.CallOption) (*pfs.FileInfos, error) {
   396  	return nil, unsupportedError("GlobFile")
   397  }
   398  func (c *pfsBuilderClient) GlobFileStream(ctx context.Context, req *pfs.GlobFileRequest, opts ...grpc.CallOption) (pfs.API_GlobFileStreamClient, error) {
   399  	return nil, unsupportedError("GlobFileStream")
   400  }
   401  func (c *pfsBuilderClient) DiffFile(ctx context.Context, req *pfs.DiffFileRequest, opts ...grpc.CallOption) (*pfs.DiffFileResponse, error) {
   402  	return nil, unsupportedError("DiffFile")
   403  }
   404  func (c *pfsBuilderClient) DeleteFile(ctx context.Context, req *pfs.DeleteFileRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   405  	return nil, unsupportedError("DeleteFile")
   406  }
   407  func (c *pfsBuilderClient) DeleteAll(ctx context.Context, req *types.Empty, opts ...grpc.CallOption) (*types.Empty, error) {
   408  	return nil, unsupportedError("DeleteAll")
   409  }
   410  func (c *pfsBuilderClient) Fsck(ctx context.Context, req *pfs.FsckRequest, opts ...grpc.CallOption) (pfs.API_FsckClient, error) {
   411  	return nil, unsupportedError("Fsck")
   412  }
   413  func (c *pfsBuilderClient) FileOperationV2(ctx context.Context, opts ...grpc.CallOption) (pfs.API_FileOperationV2Client, error) {
   414  	return nil, unsupportedError("FileOperationV2")
   415  }
   416  func (c *pfsBuilderClient) GetTarV2(ctx context.Context, req *pfs.GetTarRequestV2, opts ...grpc.CallOption) (pfs.API_GetTarV2Client, error) {
   417  	return nil, unsupportedError("GetTarV2")
   418  }
   419  func (c *pfsBuilderClient) DiffFileV2(ctx context.Context, req *pfs.DiffFileRequest, opts ...grpc.CallOption) (pfs.API_DiffFileV2Client, error) {
   420  	return nil, unsupportedError("DiffFileV2")
   421  }
   422  func (c *pfsBuilderClient) ClearCommitV2(ctx context.Context, req *pfs.ClearCommitRequestV2, opts ...grpc.CallOption) (*types.Empty, error) {
   423  	return nil, unsupportedError("ClearCommitV2")
   424  }
   425  func (c *pfsBuilderClient) CreateTmpFileSet(ctx context.Context, opts ...grpc.CallOption) (pfs.API_CreateTmpFileSetClient, error) {
   426  	return nil, unsupportedError("CreateTmpFileSet")
   427  }
   428  func (c *pfsBuilderClient) RenewTmpFileSet(ctx context.Context, req *pfs.RenewTmpFileSetRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   429  	return nil, unsupportedError("RenewTmpFileSet")
   430  }
   431  
   432  func (c *objectBuilderClient) PutObject(ctx context.Context, opts ...grpc.CallOption) (pfs.ObjectAPI_PutObjectClient, error) {
   433  	return nil, unsupportedError("PutObject")
   434  }
   435  func (c *objectBuilderClient) PutObjectSplit(ctx context.Context, opts ...grpc.CallOption) (pfs.ObjectAPI_PutObjectSplitClient, error) {
   436  	return nil, unsupportedError("PutObjectSplit")
   437  }
   438  func (c *objectBuilderClient) PutObjects(ctx context.Context, opts ...grpc.CallOption) (pfs.ObjectAPI_PutObjectsClient, error) {
   439  	return nil, unsupportedError("PutObjects")
   440  }
   441  func (c *objectBuilderClient) CreateObject(ctx context.Context, req *pfs.CreateObjectRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   442  	return nil, unsupportedError("CreateObject")
   443  }
   444  func (c *objectBuilderClient) GetObject(ctx context.Context, req *pfs.Object, opts ...grpc.CallOption) (pfs.ObjectAPI_GetObjectClient, error) {
   445  	return nil, unsupportedError("GetObject")
   446  }
   447  func (c *objectBuilderClient) GetObjects(ctx context.Context, req *pfs.GetObjectsRequest, opts ...grpc.CallOption) (pfs.ObjectAPI_GetObjectsClient, error) {
   448  	return nil, unsupportedError("GetObjects")
   449  }
   450  func (c *objectBuilderClient) PutBlock(ctx context.Context, opts ...grpc.CallOption) (pfs.ObjectAPI_PutBlockClient, error) {
   451  	return nil, unsupportedError("PutBlock")
   452  }
   453  func (c *objectBuilderClient) GetBlock(ctx context.Context, req *pfs.GetBlockRequest, opts ...grpc.CallOption) (pfs.ObjectAPI_GetBlockClient, error) {
   454  	return nil, unsupportedError("GetBlock")
   455  }
   456  func (c *objectBuilderClient) GetBlocks(ctx context.Context, req *pfs.GetBlocksRequest, opts ...grpc.CallOption) (pfs.ObjectAPI_GetBlocksClient, error) {
   457  	return nil, unsupportedError("GetBlocks")
   458  }
   459  func (c *objectBuilderClient) ListBlock(ctx context.Context, req *pfs.ListBlockRequest, opts ...grpc.CallOption) (pfs.ObjectAPI_ListBlockClient, error) {
   460  	return nil, unsupportedError("ListBlock")
   461  }
   462  func (c *objectBuilderClient) TagObject(ctx context.Context, req *pfs.TagObjectRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   463  	return nil, unsupportedError("TagObject")
   464  }
   465  func (c *objectBuilderClient) InspectObject(ctx context.Context, req *pfs.Object, opts ...grpc.CallOption) (*pfs.ObjectInfo, error) {
   466  	return nil, unsupportedError("InspectObject")
   467  }
   468  func (c *objectBuilderClient) CheckObject(ctx context.Context, req *pfs.CheckObjectRequest, opts ...grpc.CallOption) (*pfs.CheckObjectResponse, error) {
   469  	return nil, unsupportedError("CheckObject")
   470  }
   471  func (c *objectBuilderClient) ListObjects(ctx context.Context, req *pfs.ListObjectsRequest, opts ...grpc.CallOption) (pfs.ObjectAPI_ListObjectsClient, error) {
   472  	return nil, unsupportedError("ListObjects")
   473  }
   474  func (c *objectBuilderClient) DeleteObjects(ctx context.Context, req *pfs.DeleteObjectsRequest, opts ...grpc.CallOption) (*pfs.DeleteObjectsResponse, error) {
   475  	return nil, unsupportedError("DeleteObjects")
   476  }
   477  func (c *objectBuilderClient) GetTag(ctx context.Context, req *pfs.Tag, opts ...grpc.CallOption) (pfs.ObjectAPI_GetTagClient, error) {
   478  	return nil, unsupportedError("GetTag")
   479  }
   480  func (c *objectBuilderClient) InspectTag(ctx context.Context, req *pfs.Tag, opts ...grpc.CallOption) (*pfs.ObjectInfo, error) {
   481  	return nil, unsupportedError("InspectTag")
   482  }
   483  func (c *objectBuilderClient) ListTags(ctx context.Context, req *pfs.ListTagsRequest, opts ...grpc.CallOption) (pfs.ObjectAPI_ListTagsClient, error) {
   484  	return nil, unsupportedError("ListTags")
   485  }
   486  func (c *objectBuilderClient) DeleteTags(ctx context.Context, req *pfs.DeleteTagsRequest, opts ...grpc.CallOption) (*pfs.DeleteTagsResponse, error) {
   487  	return nil, unsupportedError("DeleteTags")
   488  }
   489  func (c *objectBuilderClient) Compact(ctx context.Context, req *types.Empty, opts ...grpc.CallOption) (*types.Empty, error) {
   490  	return nil, unsupportedError("Compact")
   491  }
   492  func (c *objectBuilderClient) PutObjDirect(ctx context.Context, opts ...grpc.CallOption) (pfs.ObjectAPI_PutObjDirectClient, error) {
   493  	return nil, unsupportedError("PutObjDirect")
   494  }
   495  func (c *objectBuilderClient) GetObjDirect(ctx context.Context, req *pfs.GetObjDirectRequest, opts ...grpc.CallOption) (pfs.ObjectAPI_GetObjDirectClient, error) {
   496  	return nil, unsupportedError("GetObjDirect")
   497  }
   498  func (c *objectBuilderClient) DeleteObjDirect(ctx context.Context, req *pfs.DeleteObjDirectRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   499  	return nil, unsupportedError("DeleteObjDirect")
   500  }
   501  
   502  func (c *ppsBuilderClient) CreateJob(ctx context.Context, req *pps.CreateJobRequest, opts ...grpc.CallOption) (*pps.Job, error) {
   503  	return nil, unsupportedError("CreateJob")
   504  }
   505  func (c *ppsBuilderClient) InspectJob(ctx context.Context, req *pps.InspectJobRequest, opts ...grpc.CallOption) (*pps.JobInfo, error) {
   506  	return nil, unsupportedError("InspectJob")
   507  }
   508  func (c *ppsBuilderClient) ListJob(ctx context.Context, req *pps.ListJobRequest, opts ...grpc.CallOption) (*pps.JobInfos, error) {
   509  	return nil, unsupportedError("ListJob")
   510  }
   511  func (c *ppsBuilderClient) ListJobStream(ctx context.Context, req *pps.ListJobRequest, opts ...grpc.CallOption) (pps.API_ListJobStreamClient, error) {
   512  	return nil, unsupportedError("ListJobStream")
   513  }
   514  func (c *ppsBuilderClient) FlushJob(ctx context.Context, req *pps.FlushJobRequest, opts ...grpc.CallOption) (pps.API_FlushJobClient, error) {
   515  	return nil, unsupportedError("FlushJob")
   516  }
   517  func (c *ppsBuilderClient) DeleteJob(ctx context.Context, req *pps.DeleteJobRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   518  	return nil, unsupportedError("DeleteJob")
   519  }
   520  func (c *ppsBuilderClient) StopJob(ctx context.Context, req *pps.StopJobRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   521  	return nil, unsupportedError("StopJob")
   522  }
   523  func (c *ppsBuilderClient) InspectDatum(ctx context.Context, req *pps.InspectDatumRequest, opts ...grpc.CallOption) (*pps.DatumInfo, error) {
   524  	return nil, unsupportedError("InspectDatum")
   525  }
   526  func (c *ppsBuilderClient) ListDatum(ctx context.Context, req *pps.ListDatumRequest, opts ...grpc.CallOption) (*pps.ListDatumResponse, error) {
   527  	return nil, unsupportedError("ListDatum")
   528  }
   529  func (c *ppsBuilderClient) ListDatumStream(ctx context.Context, req *pps.ListDatumRequest, opts ...grpc.CallOption) (pps.API_ListDatumStreamClient, error) {
   530  	return nil, unsupportedError("ListDatumStream")
   531  }
   532  func (c *ppsBuilderClient) RestartDatum(ctx context.Context, req *pps.RestartDatumRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   533  	return nil, unsupportedError("RestartDatum")
   534  }
   535  func (c *ppsBuilderClient) CreatePipeline(ctx context.Context, req *pps.CreatePipelineRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   536  	return nil, unsupportedError("CreatePipeline")
   537  }
   538  func (c *ppsBuilderClient) InspectPipeline(ctx context.Context, req *pps.InspectPipelineRequest, opts ...grpc.CallOption) (*pps.PipelineInfo, error) {
   539  	return nil, unsupportedError("InspectPipeline")
   540  }
   541  func (c *ppsBuilderClient) ListPipeline(ctx context.Context, req *pps.ListPipelineRequest, opts ...grpc.CallOption) (*pps.PipelineInfos, error) {
   542  	return nil, unsupportedError("ListPipeline")
   543  }
   544  func (c *ppsBuilderClient) DeletePipeline(ctx context.Context, req *pps.DeletePipelineRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   545  	return nil, unsupportedError("DeletePipeline")
   546  }
   547  func (c *ppsBuilderClient) StartPipeline(ctx context.Context, req *pps.StartPipelineRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   548  	return nil, unsupportedError("StartPipeline")
   549  }
   550  func (c *ppsBuilderClient) StopPipeline(ctx context.Context, req *pps.StopPipelineRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   551  	return nil, unsupportedError("StopPipeline")
   552  }
   553  func (c *ppsBuilderClient) RunPipeline(ctx context.Context, req *pps.RunPipelineRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   554  	return nil, unsupportedError("RunPipeline")
   555  }
   556  func (c *ppsBuilderClient) DeleteAll(ctx context.Context, req *types.Empty, opts ...grpc.CallOption) (*types.Empty, error) {
   557  	return nil, unsupportedError("DeleteAll")
   558  }
   559  func (c *ppsBuilderClient) GetLogs(ctx context.Context, req *pps.GetLogsRequest, opts ...grpc.CallOption) (pps.API_GetLogsClient, error) {
   560  	return nil, unsupportedError("GetLogs")
   561  }
   562  func (c *ppsBuilderClient) GarbageCollect(ctx context.Context, req *pps.GarbageCollectRequest, opts ...grpc.CallOption) (*pps.GarbageCollectResponse, error) {
   563  	return nil, unsupportedError("GarbageCollect")
   564  }
   565  func (c *ppsBuilderClient) ActivateAuth(ctx context.Context, req *pps.ActivateAuthRequest, opts ...grpc.CallOption) (*pps.ActivateAuthResponse, error) {
   566  	return nil, unsupportedError("ActivateAuth")
   567  }
   568  func (c *ppsBuilderClient) RunCron(ctx context.Context, req *pps.RunCronRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   569  	return nil, unsupportedError("RunCron")
   570  }
   571  func (c *ppsBuilderClient) CreateSecret(ctx context.Context, req *pps.CreateSecretRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   572  	return nil, unsupportedError("CreateSecret")
   573  }
   574  func (c *ppsBuilderClient) DeleteSecret(ctx context.Context, req *pps.DeleteSecretRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   575  	return nil, unsupportedError("DeleteSecret")
   576  }
   577  func (c *ppsBuilderClient) InspectSecret(ctx context.Context, req *pps.InspectSecretRequest, opt ...grpc.CallOption) (*pps.SecretInfo, error) {
   578  	return nil, unsupportedError("InspectSecret")
   579  }
   580  func (c *ppsBuilderClient) ListSecret(ctx context.Context, in *types.Empty, opt ...grpc.CallOption) (*pps.SecretInfos, error) {
   581  	return nil, unsupportedError("ListSecret")
   582  }
   583  
   584  func (c *authBuilderClient) Activate(ctx context.Context, req *auth.ActivateRequest, opts ...grpc.CallOption) (*auth.ActivateResponse, error) {
   585  	return nil, unsupportedError("Activate")
   586  }
   587  func (c *authBuilderClient) Deactivate(ctx context.Context, req *auth.DeactivateRequest, opts ...grpc.CallOption) (*auth.DeactivateResponse, error) {
   588  	return nil, unsupportedError("Deactivate")
   589  }
   590  func (c *authBuilderClient) GetConfiguration(ctx context.Context, req *auth.GetConfigurationRequest, opts ...grpc.CallOption) (*auth.GetConfigurationResponse, error) {
   591  	return nil, unsupportedError("GetConfiguration")
   592  }
   593  func (c *authBuilderClient) SetConfiguration(ctx context.Context, req *auth.SetConfigurationRequest, opts ...grpc.CallOption) (*auth.SetConfigurationResponse, error) {
   594  	return nil, unsupportedError("SetConfiguration")
   595  }
   596  func (c *authBuilderClient) GetAdmins(ctx context.Context, req *auth.GetAdminsRequest, opts ...grpc.CallOption) (*auth.GetAdminsResponse, error) {
   597  	return nil, unsupportedError("GetAdmins")
   598  }
   599  func (c *authBuilderClient) GetClusterRoleBindings(ctx context.Context, req *auth.GetClusterRoleBindingsRequest, opts ...grpc.CallOption) (*auth.GetClusterRoleBindingsResponse, error) {
   600  	return nil, unsupportedError("GetClusterRoleBindings")
   601  }
   602  func (c *authBuilderClient) ModifyAdmins(ctx context.Context, req *auth.ModifyAdminsRequest, opts ...grpc.CallOption) (*auth.ModifyAdminsResponse, error) {
   603  	return nil, unsupportedError("ModifyAdmins")
   604  }
   605  func (c *authBuilderClient) ModifyClusterRoleBinding(ctx context.Context, req *auth.ModifyClusterRoleBindingRequest, opts ...grpc.CallOption) (*auth.ModifyClusterRoleBindingResponse, error) {
   606  	return nil, unsupportedError("ModifyClusterRoleBinding")
   607  }
   608  func (c *authBuilderClient) Authenticate(ctx context.Context, req *auth.AuthenticateRequest, opts ...grpc.CallOption) (*auth.AuthenticateResponse, error) {
   609  	return nil, unsupportedError("Authenticate")
   610  }
   611  func (c *authBuilderClient) Authorize(ctx context.Context, req *auth.AuthorizeRequest, opts ...grpc.CallOption) (*auth.AuthorizeResponse, error) {
   612  	return nil, unsupportedError("Authorize")
   613  }
   614  func (c *authBuilderClient) WhoAmI(ctx context.Context, req *auth.WhoAmIRequest, opts ...grpc.CallOption) (*auth.WhoAmIResponse, error) {
   615  	return nil, unsupportedError("WhoAmI")
   616  }
   617  func (c *authBuilderClient) GetScope(ctx context.Context, req *auth.GetScopeRequest, opts ...grpc.CallOption) (*auth.GetScopeResponse, error) {
   618  	return nil, unsupportedError("GetScope")
   619  }
   620  func (c *authBuilderClient) SetScope(ctx context.Context, req *auth.SetScopeRequest, opts ...grpc.CallOption) (*auth.SetScopeResponse, error) {
   621  	return nil, unsupportedError("SetScope")
   622  }
   623  func (c *authBuilderClient) GetACL(ctx context.Context, req *auth.GetACLRequest, opts ...grpc.CallOption) (*auth.GetACLResponse, error) {
   624  	return nil, unsupportedError("GetACL")
   625  }
   626  func (c *authBuilderClient) SetACL(ctx context.Context, req *auth.SetACLRequest, opts ...grpc.CallOption) (*auth.SetACLResponse, error) {
   627  	return nil, unsupportedError("SetACL")
   628  }
   629  func (c *authBuilderClient) GetAuthToken(ctx context.Context, req *auth.GetAuthTokenRequest, opts ...grpc.CallOption) (*auth.GetAuthTokenResponse, error) {
   630  	return nil, unsupportedError("GetAuthToken")
   631  }
   632  func (c *authBuilderClient) GetOIDCLogin(ctx context.Context, req *auth.GetOIDCLoginRequest, opts ...grpc.CallOption) (*auth.GetOIDCLoginResponse, error) {
   633  	return nil, unsupportedError("GetOIDCLogin")
   634  }
   635  func (c *authBuilderClient) ExtendAuthToken(ctx context.Context, req *auth.ExtendAuthTokenRequest, opts ...grpc.CallOption) (*auth.ExtendAuthTokenResponse, error) {
   636  	return nil, unsupportedError("ExtendAuthToken")
   637  }
   638  func (c *authBuilderClient) RevokeAuthToken(ctx context.Context, req *auth.RevokeAuthTokenRequest, opts ...grpc.CallOption) (*auth.RevokeAuthTokenResponse, error) {
   639  	return nil, unsupportedError("RevokeAuthToken")
   640  }
   641  func (c *authBuilderClient) SetGroupsForUser(ctx context.Context, req *auth.SetGroupsForUserRequest, opts ...grpc.CallOption) (*auth.SetGroupsForUserResponse, error) {
   642  	return nil, unsupportedError("SetGroupsForUser")
   643  }
   644  func (c *authBuilderClient) ModifyMembers(ctx context.Context, req *auth.ModifyMembersRequest, opts ...grpc.CallOption) (*auth.ModifyMembersResponse, error) {
   645  	return nil, unsupportedError("ModifyMembers")
   646  }
   647  func (c *authBuilderClient) GetGroups(ctx context.Context, req *auth.GetGroupsRequest, opts ...grpc.CallOption) (*auth.GetGroupsResponse, error) {
   648  	return nil, unsupportedError("GetGroups")
   649  }
   650  func (c *authBuilderClient) GetUsers(ctx context.Context, req *auth.GetUsersRequest, opts ...grpc.CallOption) (*auth.GetUsersResponse, error) {
   651  	return nil, unsupportedError("GetUsers")
   652  }
   653  func (c *authBuilderClient) GetOneTimePassword(ctx context.Context, req *auth.GetOneTimePasswordRequest, opts ...grpc.CallOption) (*auth.GetOneTimePasswordResponse, error) {
   654  	return nil, unsupportedError("GetOneTimePassword")
   655  }
   656  func (c *authBuilderClient) ExtractAuthTokens(ctx context.Context, req *auth.ExtractAuthTokensRequest, opts ...grpc.CallOption) (*auth.ExtractAuthTokensResponse, error) {
   657  	return nil, unsupportedError("ExtractAuthTokens")
   658  }
   659  func (c *authBuilderClient) RestoreAuthToken(ctx context.Context, req *auth.RestoreAuthTokenRequest, opts ...grpc.CallOption) (*auth.RestoreAuthTokenResponse, error) {
   660  	return nil, unsupportedError("RestoreAuthToken")
   661  }
   662  
   663  func (c *enterpriseBuilderClient) Activate(ctx context.Context, req *enterprise.ActivateRequest, opts ...grpc.CallOption) (*enterprise.ActivateResponse, error) {
   664  	return nil, unsupportedError("Activate")
   665  }
   666  func (c *enterpriseBuilderClient) GetState(ctx context.Context, req *enterprise.GetStateRequest, opts ...grpc.CallOption) (*enterprise.GetStateResponse, error) {
   667  	return nil, unsupportedError("GetState")
   668  }
   669  func (c *enterpriseBuilderClient) GetActivationCode(ctx context.Context, req *enterprise.GetActivationCodeRequest, opts ...grpc.CallOption) (*enterprise.GetActivationCodeResponse, error) {
   670  	return nil, unsupportedError("GetActivationCode")
   671  }
   672  func (c *enterpriseBuilderClient) Deactivate(ctx context.Context, req *enterprise.DeactivateRequest, opts ...grpc.CallOption) (*enterprise.DeactivateResponse, error) {
   673  	return nil, unsupportedError("Deactivate")
   674  }
   675  
   676  func (c *versionBuilderClient) GetVersion(ctx context.Context, req *types.Empty, opts ...grpc.CallOption) (*versionpb.Version, error) {
   677  	return nil, unsupportedError("GetVersion")
   678  }
   679  
   680  func (c *adminBuilderClient) Extract(ctx context.Context, req *admin.ExtractRequest, opts ...grpc.CallOption) (admin.API_ExtractClient, error) {
   681  	return nil, unsupportedError("Extract")
   682  }
   683  func (c *adminBuilderClient) ExtractPipeline(ctx context.Context, req *admin.ExtractPipelineRequest, opts ...grpc.CallOption) (*admin.Op, error) {
   684  	return nil, unsupportedError("ExtractPipeline")
   685  }
   686  func (c *adminBuilderClient) Restore(ctx context.Context, opts ...grpc.CallOption) (admin.API_RestoreClient, error) {
   687  	return nil, unsupportedError("Restore")
   688  }
   689  func (c *adminBuilderClient) InspectCluster(ctx context.Context, req *types.Empty, opts ...grpc.CallOption) (*admin.ClusterInfo, error) {
   690  	return nil, unsupportedError("InspectCluster")
   691  }
   692  
   693  func (c *transactionBuilderClient) BatchTransaction(ctx context.Context, req *transaction.BatchTransactionRequest, opts ...grpc.CallOption) (*transaction.TransactionInfo, error) {
   694  	return nil, unsupportedError("BatchTransaction")
   695  }
   696  func (c *transactionBuilderClient) StartTransaction(ctx context.Context, req *transaction.StartTransactionRequest, opts ...grpc.CallOption) (*transaction.Transaction, error) {
   697  	return nil, unsupportedError("StartTransaction")
   698  }
   699  func (c *transactionBuilderClient) InspectTransaction(ctx context.Context, req *transaction.InspectTransactionRequest, opts ...grpc.CallOption) (*transaction.TransactionInfo, error) {
   700  	return nil, unsupportedError("InspectTransaction")
   701  }
   702  func (c *transactionBuilderClient) DeleteTransaction(ctx context.Context, req *transaction.DeleteTransactionRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   703  	return nil, unsupportedError("DeleteTransaction")
   704  }
   705  func (c *transactionBuilderClient) ListTransaction(ctx context.Context, req *transaction.ListTransactionRequest, opts ...grpc.CallOption) (*transaction.TransactionInfos, error) {
   706  	return nil, unsupportedError("ListTransaction")
   707  }
   708  func (c *transactionBuilderClient) FinishTransaction(ctx context.Context, req *transaction.FinishTransactionRequest, opts ...grpc.CallOption) (*transaction.TransactionInfo, error) {
   709  	return nil, unsupportedError("FinishTransaction")
   710  }
   711  func (c *transactionBuilderClient) DeleteAll(ctx context.Context, req *transaction.DeleteAllRequest, opts ...grpc.CallOption) (*types.Empty, error) {
   712  	return nil, unsupportedError("DeleteAll")
   713  }
   714  
   715  func (c *debugBuilderClient) Profile(ctx context.Context, req *debug.ProfileRequest, opts ...grpc.CallOption) (debug.Debug_ProfileClient, error) {
   716  	return nil, unsupportedError("Profile")
   717  }
   718  func (c *debugBuilderClient) Binary(ctx context.Context, req *debug.BinaryRequest, opts ...grpc.CallOption) (debug.Debug_BinaryClient, error) {
   719  	return nil, unsupportedError("Binary")
   720  }
   721  func (c *debugBuilderClient) Dump(ctx context.Context, req *debug.DumpRequest, opts ...grpc.CallOption) (debug.Debug_DumpClient, error) {
   722  	return nil, unsupportedError("Dump")
   723  }