Commit f1124eb0 authored by feisky's avatar feisky

Refactor image manager to operate on Runtime

parent 650e38e1
......@@ -22,12 +22,11 @@ import (
"sync"
"time"
docker "github.com/fsouza/go-dockerclient"
"github.com/golang/glog"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/kubelet/cadvisor"
"k8s.io/kubernetes/pkg/kubelet/dockertools"
"k8s.io/kubernetes/pkg/kubelet/container"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util/sets"
)
......@@ -59,8 +58,8 @@ type ImageGCPolicy struct {
}
type realImageManager struct {
// Connection to the Docker daemon.
dockerClient dockertools.DockerInterface
// Container runtime
runtime container.Runtime
// Records of images and their use.
imageRecords map[string]*imageRecord
......@@ -91,7 +90,7 @@ type imageRecord struct {
size int64
}
func newImageManager(dockerClient dockertools.DockerInterface, cadvisorInterface cadvisor.Interface, recorder record.EventRecorder, nodeRef *api.ObjectReference, policy ImageGCPolicy) (imageManager, error) {
func newImageManager(runtime container.Runtime, cadvisorInterface cadvisor.Interface, recorder record.EventRecorder, nodeRef *api.ObjectReference, policy ImageGCPolicy) (imageManager, error) {
// Validate policy.
if policy.HighThresholdPercent < 0 || policy.HighThresholdPercent > 100 {
return nil, fmt.Errorf("invalid HighThresholdPercent %d, must be in range [0-100]", policy.HighThresholdPercent)
......@@ -100,7 +99,7 @@ func newImageManager(dockerClient dockertools.DockerInterface, cadvisorInterface
return nil, fmt.Errorf("invalid LowThresholdPercent %d, must be in range [0-100]", policy.LowThresholdPercent)
}
im := &realImageManager{
dockerClient: dockerClient,
runtime: runtime,
policy: policy,
imageRecords: make(map[string]*imageRecord),
cadvisor: cadvisorInterface,
......@@ -130,21 +129,21 @@ func (im *realImageManager) Start() error {
}
func (im *realImageManager) detectImages(detected time.Time) error {
images, err := im.dockerClient.ListImages(docker.ListImagesOptions{})
images, err := im.runtime.ListImages()
if err != nil {
return err
}
containers, err := im.dockerClient.ListContainers(docker.ListContainersOptions{
All: true,
})
pods, err := im.runtime.GetPods(true)
if err != nil {
return err
}
// Make a set of images in use by containers.
imagesInUse := sets.NewString()
for _, container := range containers {
imagesInUse.Insert(container.Image)
for _, pod := range pods {
for _, container := range pod.Containers {
imagesInUse.Insert(container.Image)
}
}
// Add new images and record those being used.
......@@ -163,11 +162,11 @@ func (im *realImageManager) detectImages(detected time.Time) error {
}
// Set last used time to now if the image is being used.
if isImageUsed(&image, imagesInUse) {
if isImageUsed(image, imagesInUse) {
im.imageRecords[image.ID].lastUsed = now
}
im.imageRecords[image.ID].size = image.VirtualSize
im.imageRecords[image.ID].size = image.Size
}
// Remove old images from our records.
......@@ -253,7 +252,7 @@ func (im *realImageManager) freeSpace(bytesToFree int64) (int64, error) {
// Remove image. Continue despite errors.
glog.Infof("[ImageManager]: Removing image %q to free %d bytes", image.id, image.size)
err := im.dockerClient.RemoveImage(image.id)
err := im.runtime.RemoveImage(container.ImageSpec{Image: image.id})
if err != nil {
lastErr = err
continue
......@@ -287,12 +286,12 @@ func (ev byLastUsedAndDetected) Less(i, j int) bool {
}
}
func isImageUsed(image *docker.APIImages, imagesInUse sets.String) bool {
func isImageUsed(image container.Image, imagesInUse sets.String) bool {
// Check the image ID and all the RepoTags.
if _, ok := imagesInUse[image.ID]; ok {
return true
}
for _, tag := range image.RepoTags {
for _, tag := range image.Tags {
if _, ok := imagesInUse[tag]; ok {
return true
}
......
......@@ -234,10 +234,7 @@ func NewMainKubelet(
if err != nil {
return nil, err
}
imageManager, err := newImageManager(dockerClient, cadvisorInterface, recorder, nodeRef, imageGCPolicy)
if err != nil {
return nil, fmt.Errorf("failed to initialize image manager: %v", err)
}
diskSpaceManager, err := newDiskSpaceManager(cadvisorInterface, diskSpacePolicy)
if err != nil {
return nil, fmt.Errorf("failed to initialize disk manager: %v", err)
......@@ -275,7 +272,6 @@ func NewMainKubelet(
recorder: recorder,
cadvisor: cadvisorInterface,
containerGC: containerGC,
imageManager: imageManager,
diskSpaceManager: diskSpaceManager,
statusManager: statusManager,
volumeManager: volumeManager,
......@@ -356,6 +352,13 @@ func NewMainKubelet(
return nil, fmt.Errorf("unsupported container runtime %q specified", containerRuntime)
}
// setup imageManager
imageManager, err := newImageManager(klet.containerRuntime, cadvisorInterface, recorder, nodeRef, imageGCPolicy)
if err != nil {
return nil, fmt.Errorf("failed to initialize image manager: %v", err)
}
klet.imageManager = imageManager
// Setup container manager, can fail if the devices hierarchy is not mounted
// (it is required by Docker however).
containerManager, err := newContainerManager(cadvisorInterface, dockerDaemonContainer, systemContainer, resourceContainer)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment