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

     1  package client
     2  
     3  import (
     4  	"io"
     5  
     6  	"github.com/gogo/protobuf/types"
     7  	"github.com/pachyderm/pachyderm/src/client/admin"
     8  	"github.com/pachyderm/pachyderm/src/client/pkg/errors"
     9  	"github.com/pachyderm/pachyderm/src/client/pkg/grpcutil"
    10  	"github.com/pachyderm/pachyderm/src/client/pkg/pbutil"
    11  	"github.com/pachyderm/pachyderm/src/client/pps"
    12  )
    13  
    14  // InspectCluster retrieves cluster state
    15  func (c APIClient) InspectCluster() (*admin.ClusterInfo, error) {
    16  	clusterInfo, err := c.AdminAPIClient.InspectCluster(c.Ctx(), &types.Empty{})
    17  	if err != nil {
    18  		return nil, grpcutil.ScrubGRPC(err)
    19  	}
    20  	return clusterInfo, nil
    21  }
    22  
    23  // Extract all cluster state, call f with each operation.
    24  func (c APIClient) Extract(objects, enterprise, auth bool, f func(op *admin.Op) error) error {
    25  	extractClient, err := c.AdminAPIClient.Extract(c.Ctx(), &admin.ExtractRequest{
    26  		NoObjects:    !objects,
    27  		NoEnterprise: !enterprise,
    28  		NoAuth:       !auth,
    29  	})
    30  	if err != nil {
    31  		return grpcutil.ScrubGRPC(err)
    32  	}
    33  	for {
    34  		op, err := extractClient.Recv()
    35  		if errors.Is(err, io.EOF) {
    36  			break
    37  		}
    38  		if err != nil {
    39  			return grpcutil.ScrubGRPC(err)
    40  		}
    41  		if err := f(op); err != nil {
    42  			return err
    43  		}
    44  	}
    45  	return nil
    46  }
    47  
    48  // ExtractAll cluster state as a slice of operations.
    49  func (c APIClient) ExtractAll(objects, enterprise, auth bool) ([]*admin.Op, error) {
    50  	var result []*admin.Op
    51  	if err := c.Extract(objects, enterprise, auth, func(op *admin.Op) error {
    52  		result = append(result, op)
    53  		return nil
    54  	}); err != nil {
    55  		return nil, err
    56  	}
    57  	return result, nil
    58  }
    59  
    60  // ExtractWriter extracts all cluster state and marshals it to w.
    61  func (c APIClient) ExtractWriter(objects, enterprise, auth bool, w io.Writer) error {
    62  	writer := pbutil.NewWriter(w)
    63  	return c.Extract(objects, enterprise, auth, func(op *admin.Op) error {
    64  		_, err := writer.Write(op)
    65  		return err
    66  	})
    67  }
    68  
    69  // ExtractURL extracts all cluster state and marshalls it to object storage.
    70  func (c APIClient) ExtractURL(url string, enterprise, auth bool) error {
    71  	extractClient, err := c.AdminAPIClient.Extract(c.Ctx(), &admin.ExtractRequest{
    72  		URL:          url,
    73  		NoEnterprise: !enterprise,
    74  		NoAuth:       !auth,
    75  	})
    76  	if err != nil {
    77  		return grpcutil.ScrubGRPC(err)
    78  	}
    79  	resp, err := extractClient.Recv()
    80  	if err == nil {
    81  		return errors.Errorf("unexpected response from extract: %v", resp)
    82  	}
    83  	if !errors.Is(err, io.EOF) {
    84  		return err
    85  	}
    86  	return nil
    87  }
    88  
    89  // ExtractPipeline extracts a single pipeline.
    90  func (c APIClient) ExtractPipeline(pipelineName string) (*pps.CreatePipelineRequest, error) {
    91  	op, err := c.AdminAPIClient.ExtractPipeline(c.Ctx(), &admin.ExtractPipelineRequest{Pipeline: NewPipeline(pipelineName)})
    92  	if err != nil {
    93  		return nil, grpcutil.ScrubGRPC(err)
    94  	}
    95  	if op.Op1_13 == nil || op.Op1_13.Pipeline == nil {
    96  		return nil, errors.Errorf("malformed response is missing pipeline")
    97  	}
    98  	return op.Op1_13.Pipeline, nil
    99  }
   100  
   101  // Restore cluster state from an extract series of operations.
   102  func (c APIClient) Restore(ops []*admin.Op) (retErr error) {
   103  	restoreClient, err := c.AdminAPIClient.Restore(c.Ctx())
   104  	if err != nil {
   105  		return grpcutil.ScrubGRPC(err)
   106  	}
   107  	defer func() {
   108  		if _, err := restoreClient.CloseAndRecv(); err != nil && retErr == nil {
   109  			retErr = grpcutil.ScrubGRPC(err)
   110  		}
   111  	}()
   112  	for _, op := range ops {
   113  		if err := restoreClient.Send(&admin.RestoreRequest{Op: op}); err != nil {
   114  			return grpcutil.ScrubGRPC(err)
   115  		}
   116  	}
   117  	return nil
   118  }
   119  
   120  // RestoreReader restores cluster state from a reader containing marshaled ops.
   121  // Such as those written by ExtractWriter.
   122  func (c APIClient) RestoreReader(r io.Reader) (retErr error) {
   123  	restoreClient, err := c.AdminAPIClient.Restore(c.Ctx())
   124  	if err != nil {
   125  		return grpcutil.ScrubGRPC(err)
   126  	}
   127  	defer func() {
   128  		if _, err := restoreClient.CloseAndRecv(); err != nil && retErr == nil {
   129  			retErr = grpcutil.ScrubGRPC(err)
   130  		}
   131  	}()
   132  	reader := pbutil.NewReader(r)
   133  	op := &admin.Op{}
   134  	for {
   135  		if err := reader.Read(op); err != nil {
   136  			if errors.Is(err, io.EOF) {
   137  				break
   138  			}
   139  			return err
   140  		}
   141  		if err := restoreClient.Send(&admin.RestoreRequest{Op: op}); err != nil {
   142  			return grpcutil.ScrubGRPC(err)
   143  		}
   144  	}
   145  	return nil
   146  }
   147  
   148  // RestoreFrom restores state from another cluster which can be access through otherC.
   149  func (c APIClient) RestoreFrom(objects, enterprise, auth bool, otherC *APIClient) (retErr error) {
   150  	restoreClient, err := c.AdminAPIClient.Restore(c.Ctx())
   151  	if err != nil {
   152  		return grpcutil.ScrubGRPC(err)
   153  	}
   154  	defer func() {
   155  		if _, err := restoreClient.CloseAndRecv(); err != nil && retErr == nil {
   156  			retErr = grpcutil.ScrubGRPC(err)
   157  		}
   158  	}()
   159  	return otherC.Extract(objects, enterprise, auth, func(op *admin.Op) error {
   160  		return restoreClient.Send(&admin.RestoreRequest{Op: op})
   161  	})
   162  }
   163  
   164  // RestoreURL restures cluster state from object storage.
   165  func (c APIClient) RestoreURL(url string) (retErr error) {
   166  	restoreClient, err := c.AdminAPIClient.Restore(c.Ctx())
   167  	if err != nil {
   168  		return grpcutil.ScrubGRPC(err)
   169  	}
   170  	defer func() {
   171  		if _, err := restoreClient.CloseAndRecv(); err != nil && retErr == nil {
   172  			retErr = grpcutil.ScrubGRPC(err)
   173  		}
   174  	}()
   175  	return grpcutil.ScrubGRPC(restoreClient.Send(&admin.RestoreRequest{URL: url}))
   176  }