github.com/Heebron/moby@v0.0.0-20221111184709-6eab4f55faf7/daemon/containerd/service.go (about)

     1  package containerd
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/containerd/containerd"
     7  	"github.com/containerd/containerd/plugin"
     8  	"github.com/containerd/containerd/snapshots"
     9  	"github.com/docker/docker/api/types"
    10  	"github.com/docker/docker/api/types/filters"
    11  	"github.com/docker/docker/container"
    12  	"github.com/docker/docker/daemon/images"
    13  	"github.com/docker/docker/errdefs"
    14  	"github.com/docker/docker/image"
    15  	"github.com/docker/docker/layer"
    16  	"github.com/pkg/errors"
    17  	"golang.org/x/sync/singleflight"
    18  )
    19  
    20  // ImageService implements daemon.ImageService
    21  type ImageService struct {
    22  	client      *containerd.Client
    23  	snapshotter string
    24  	usage       singleflight.Group
    25  }
    26  
    27  // NewService creates a new ImageService.
    28  func NewService(c *containerd.Client, snapshotter string) *ImageService {
    29  	return &ImageService{
    30  		client:      c,
    31  		snapshotter: snapshotter,
    32  	}
    33  }
    34  
    35  // DistributionServices return services controlling daemon image storage.
    36  func (i *ImageService) DistributionServices() images.DistributionServices {
    37  	return images.DistributionServices{}
    38  }
    39  
    40  // CountImages returns the number of images stored by ImageService
    41  // called from info.go
    42  func (i *ImageService) CountImages() int {
    43  	imgs, err := i.client.ListImages(context.TODO())
    44  	if err != nil {
    45  		return 0
    46  	}
    47  
    48  	return len(imgs)
    49  }
    50  
    51  // Children returns the children image.IDs for a parent image.
    52  // called from list.go to filter containers
    53  // TODO: refactor to expose an ancestry for image.ID?
    54  func (i *ImageService) Children(id image.ID) []image.ID {
    55  	panic("not implemented")
    56  }
    57  
    58  // CreateLayer creates a filesystem layer for a container.
    59  // called from create.go
    60  // TODO: accept an opt struct instead of container?
    61  func (i *ImageService) CreateLayer(container *container.Container, initFunc layer.MountInit) (layer.RWLayer, error) {
    62  	return nil, errdefs.NotImplemented(errdefs.NotImplemented(errors.New("not implemented")))
    63  }
    64  
    65  // GetLayerByID returns a layer by ID
    66  // called from daemon.go Daemon.restore(), and Daemon.containerExport().
    67  func (i *ImageService) GetLayerByID(cid string) (layer.RWLayer, error) {
    68  	return nil, errdefs.NotImplemented(errors.New("not implemented"))
    69  }
    70  
    71  // LayerStoreStatus returns the status for each layer store
    72  // called from info.go
    73  func (i *ImageService) LayerStoreStatus() [][2]string {
    74  	// TODO(thaJeztah) do we want to add more details about the driver here?
    75  	return [][2]string{
    76  		{"driver-type", string(plugin.SnapshotPlugin)},
    77  	}
    78  }
    79  
    80  // GetLayerMountID returns the mount ID for a layer
    81  // called from daemon.go Daemon.Shutdown(), and Daemon.Cleanup() (cleanup is actually continerCleanup)
    82  // TODO: needs to be refactored to Unmount (see callers), or removed and replaced with GetLayerByID
    83  func (i *ImageService) GetLayerMountID(cid string) (string, error) {
    84  	return "", errdefs.NotImplemented(errors.New("not implemented"))
    85  }
    86  
    87  // Cleanup resources before the process is shutdown.
    88  // called from daemon.go Daemon.Shutdown()
    89  func (i *ImageService) Cleanup() error {
    90  	return nil
    91  }
    92  
    93  // StorageDriver returns the name of the default storage-driver (snapshotter)
    94  // used by the ImageService.
    95  func (i *ImageService) StorageDriver() string {
    96  	return i.snapshotter
    97  }
    98  
    99  // ReleaseLayer releases a layer allowing it to be removed
   100  // called from delete.go Daemon.cleanupContainer(), and Daemon.containerExport()
   101  func (i *ImageService) ReleaseLayer(rwlayer layer.RWLayer) error {
   102  	return errdefs.NotImplemented(errors.New("not implemented"))
   103  }
   104  
   105  // LayerDiskUsage returns the number of bytes used by layer stores
   106  // called from disk_usage.go
   107  func (i *ImageService) LayerDiskUsage(ctx context.Context) (int64, error) {
   108  	ch := i.usage.DoChan("LayerDiskUsage", func() (interface{}, error) {
   109  		var allLayersSize int64
   110  		snapshotter := i.client.SnapshotService(i.snapshotter)
   111  		snapshotter.Walk(ctx, func(ctx context.Context, info snapshots.Info) error {
   112  			usage, err := snapshotter.Usage(ctx, info.Name)
   113  			if err != nil {
   114  				return err
   115  			}
   116  			allLayersSize += usage.Size
   117  			return nil
   118  		})
   119  		return allLayersSize, nil
   120  	})
   121  	select {
   122  	case <-ctx.Done():
   123  		return 0, ctx.Err()
   124  	case res := <-ch:
   125  		if res.Err != nil {
   126  			return 0, res.Err
   127  		}
   128  		return res.Val.(int64), nil
   129  	}
   130  }
   131  
   132  // ImageDiskUsage returns information about image data disk usage.
   133  func (i *ImageService) ImageDiskUsage(ctx context.Context) ([]*types.ImageSummary, error) {
   134  	ch := i.usage.DoChan("ImageDiskUsage", func() (interface{}, error) {
   135  		// Get all top images with extra attributes
   136  		imgs, err := i.Images(ctx, types.ImageListOptions{
   137  			Filters:        filters.NewArgs(),
   138  			SharedSize:     true,
   139  			ContainerCount: true,
   140  		})
   141  		if err != nil {
   142  			return nil, errors.Wrap(err, "failed to retrieve image list")
   143  		}
   144  		return imgs, nil
   145  	})
   146  	select {
   147  	case <-ctx.Done():
   148  		return nil, ctx.Err()
   149  	case res := <-ch:
   150  		if res.Err != nil {
   151  			return nil, res.Err
   152  		}
   153  		return res.Val.([]*types.ImageSummary), nil
   154  	}
   155  }
   156  
   157  // UpdateConfig values
   158  //
   159  // called from reload.go
   160  func (i *ImageService) UpdateConfig(maxDownloads, maxUploads int) {
   161  	panic("not implemented")
   162  }
   163  
   164  // GetLayerFolders returns the layer folders from an image RootFS.
   165  func (i *ImageService) GetLayerFolders(img *image.Image, rwLayer layer.RWLayer) ([]string, error) {
   166  	return nil, errdefs.NotImplemented(errors.New("not implemented"))
   167  }
   168  
   169  // GetContainerLayerSize returns the real size & virtual size of the container.
   170  func (i *ImageService) GetContainerLayerSize(containerID string) (int64, int64) {
   171  	panic("not implemented")
   172  }