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 }