client.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package diff
  2. import (
  3. diffapi "github.com/containerd/containerd/api/services/diff/v1"
  4. "github.com/containerd/containerd/api/types"
  5. "github.com/containerd/containerd/diff"
  6. "github.com/containerd/containerd/mount"
  7. ocispec "github.com/opencontainers/image-spec/specs-go/v1"
  8. "golang.org/x/net/context"
  9. )
  10. // NewDiffServiceFromClient returns a new diff service which communicates
  11. // over a GRPC connection.
  12. func NewDiffServiceFromClient(client diffapi.DiffClient) diff.Differ {
  13. return &remote{
  14. client: client,
  15. }
  16. }
  17. type remote struct {
  18. client diffapi.DiffClient
  19. }
  20. func (r *remote) Apply(ctx context.Context, diff ocispec.Descriptor, mounts []mount.Mount) (ocispec.Descriptor, error) {
  21. req := &diffapi.ApplyRequest{
  22. Diff: fromDescriptor(diff),
  23. Mounts: fromMounts(mounts),
  24. }
  25. resp, err := r.client.Apply(ctx, req)
  26. if err != nil {
  27. return ocispec.Descriptor{}, err
  28. }
  29. return toDescriptor(resp.Applied), nil
  30. }
  31. func (r *remote) DiffMounts(ctx context.Context, a, b []mount.Mount, opts ...diff.Opt) (ocispec.Descriptor, error) {
  32. var config diff.Config
  33. for _, opt := range opts {
  34. if err := opt(&config); err != nil {
  35. return ocispec.Descriptor{}, err
  36. }
  37. }
  38. req := &diffapi.DiffRequest{
  39. Left: fromMounts(a),
  40. Right: fromMounts(b),
  41. MediaType: config.MediaType,
  42. Ref: config.Reference,
  43. Labels: config.Labels,
  44. }
  45. resp, err := r.client.Diff(ctx, req)
  46. if err != nil {
  47. return ocispec.Descriptor{}, err
  48. }
  49. return toDescriptor(resp.Diff), nil
  50. }
  51. func toDescriptor(d *types.Descriptor) ocispec.Descriptor {
  52. return ocispec.Descriptor{
  53. MediaType: d.MediaType,
  54. Digest: d.Digest,
  55. Size: d.Size_,
  56. }
  57. }
  58. func fromDescriptor(d ocispec.Descriptor) *types.Descriptor {
  59. return &types.Descriptor{
  60. MediaType: d.MediaType,
  61. Digest: d.Digest,
  62. Size_: d.Size,
  63. }
  64. }
  65. func fromMounts(mounts []mount.Mount) []*types.Mount {
  66. apiMounts := make([]*types.Mount, len(mounts))
  67. for i, m := range mounts {
  68. apiMounts[i] = &types.Mount{
  69. Type: m.Type,
  70. Source: m.Source,
  71. Options: m.Options,
  72. }
  73. }
  74. return apiMounts
  75. }