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 }