mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-14 13:45:06 +00:00
kuberuntime/dockershim: add image ref to ImageService interfaces
This commit is contained in:
@@ -63,8 +63,8 @@ func (ds *dockerService) ImageStatus(image *runtimeapi.ImageSpec) (*runtimeapi.I
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PullImage pulls an image with authentication config.
|
// PullImage pulls an image with authentication config.
|
||||||
func (ds *dockerService) PullImage(image *runtimeapi.ImageSpec, auth *runtimeapi.AuthConfig) error {
|
func (ds *dockerService) PullImage(image *runtimeapi.ImageSpec, auth *runtimeapi.AuthConfig) (string, error) {
|
||||||
return ds.client.PullImage(image.GetImage(),
|
err := ds.client.PullImage(image.GetImage(),
|
||||||
dockertypes.AuthConfig{
|
dockertypes.AuthConfig{
|
||||||
Username: auth.GetUsername(),
|
Username: auth.GetUsername(),
|
||||||
Password: auth.GetPassword(),
|
Password: auth.GetPassword(),
|
||||||
@@ -74,6 +74,11 @@ func (ds *dockerService) PullImage(image *runtimeapi.ImageSpec, auth *runtimeapi
|
|||||||
},
|
},
|
||||||
dockertypes.ImagePullOptions{},
|
dockertypes.ImagePullOptions{},
|
||||||
)
|
)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return dockertools.GetImageRef(ds.client, image.GetImage())
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveImage removes the image.
|
// RemoveImage removes the image.
|
||||||
|
@@ -200,11 +200,11 @@ func (d *dockerService) ImageStatus(ctx context.Context, r *runtimeapi.ImageStat
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *dockerService) PullImage(ctx context.Context, r *runtimeapi.PullImageRequest) (*runtimeapi.PullImageResponse, error) {
|
func (d *dockerService) PullImage(ctx context.Context, r *runtimeapi.PullImageRequest) (*runtimeapi.PullImageResponse, error) {
|
||||||
err := d.imageService.PullImage(r.GetImage(), r.GetAuth())
|
image, err := d.imageService.PullImage(r.GetImage(), r.GetAuth())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &runtimeapi.PullImageResponse{}, nil
|
return &runtimeapi.PullImageResponse{ImageRef: &image}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *dockerService) RemoveImage(ctx context.Context, r *runtimeapi.RemoveImageRequest) (*runtimeapi.RemoveImageResponse, error) {
|
func (d *dockerService) RemoveImage(ctx context.Context, r *runtimeapi.RemoveImageRequest) (*runtimeapi.RemoveImageResponse, error) {
|
||||||
|
@@ -239,13 +239,13 @@ func (in instrumentedImageManagerService) ImageStatus(image *runtimeapi.ImageSpe
|
|||||||
return out, err
|
return out, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (in instrumentedImageManagerService) PullImage(image *runtimeapi.ImageSpec, auth *runtimeapi.AuthConfig) error {
|
func (in instrumentedImageManagerService) PullImage(image *runtimeapi.ImageSpec, auth *runtimeapi.AuthConfig) (string, error) {
|
||||||
const operation = "pull_image"
|
const operation = "pull_image"
|
||||||
defer recordOperation(operation, time.Now())
|
defer recordOperation(operation, time.Now())
|
||||||
|
|
||||||
err := in.service.PullImage(image, auth)
|
imageRef, err := in.service.PullImage(image, auth)
|
||||||
recordError(operation, err)
|
recordError(operation, err)
|
||||||
return err
|
return imageRef, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (in instrumentedImageManagerService) RemoveImage(image *runtimeapi.ImageSpec) error {
|
func (in instrumentedImageManagerService) RemoveImage(image *runtimeapi.ImageSpec) error {
|
||||||
|
@@ -51,7 +51,7 @@ import (
|
|||||||
// * run the post start lifecycle hooks (if applicable)
|
// * run the post start lifecycle hooks (if applicable)
|
||||||
func (m *kubeGenericRuntimeManager) startContainer(podSandboxID string, podSandboxConfig *runtimeapi.PodSandboxConfig, container *v1.Container, pod *v1.Pod, podStatus *kubecontainer.PodStatus, pullSecrets []v1.Secret, podIP string) (string, error) {
|
func (m *kubeGenericRuntimeManager) startContainer(podSandboxID string, podSandboxConfig *runtimeapi.PodSandboxConfig, container *v1.Container, pod *v1.Pod, podStatus *kubecontainer.PodStatus, pullSecrets []v1.Secret, podIP string) (string, error) {
|
||||||
// Step 1: pull the image.
|
// Step 1: pull the image.
|
||||||
err, msg := m.imagePuller.EnsureImageExists(pod, container, pullSecrets)
|
imageRef, msg, err := m.imagePuller.EnsureImageExists(pod, container, pullSecrets)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return msg, err
|
return msg, err
|
||||||
}
|
}
|
||||||
@@ -70,7 +70,7 @@ func (m *kubeGenericRuntimeManager) startContainer(podSandboxID string, podSandb
|
|||||||
restartCount = containerStatus.RestartCount + 1
|
restartCount = containerStatus.RestartCount + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
containerConfig, err := m.generateContainerConfig(container, pod, restartCount, podIP)
|
containerConfig, err := m.generateContainerConfig(container, pod, restartCount, podIP, imageRef)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.recorder.Eventf(ref, v1.EventTypeWarning, events.FailedToCreateContainer, "Failed to create container with error: %v", err)
|
m.recorder.Eventf(ref, v1.EventTypeWarning, events.FailedToCreateContainer, "Failed to create container with error: %v", err)
|
||||||
return "Generate Container Config Failed", err
|
return "Generate Container Config Failed", err
|
||||||
@@ -129,7 +129,7 @@ func (m *kubeGenericRuntimeManager) startContainer(podSandboxID string, podSandb
|
|||||||
}
|
}
|
||||||
|
|
||||||
// generateContainerConfig generates container config for kubelet runtime v1.
|
// generateContainerConfig generates container config for kubelet runtime v1.
|
||||||
func (m *kubeGenericRuntimeManager) generateContainerConfig(container *v1.Container, pod *v1.Pod, restartCount int, podIP string) (*runtimeapi.ContainerConfig, error) {
|
func (m *kubeGenericRuntimeManager) generateContainerConfig(container *v1.Container, pod *v1.Pod, restartCount int, podIP, imageRef string) (*runtimeapi.ContainerConfig, error) {
|
||||||
opts, err := m.runtimeHelper.GenerateRunContainerOptions(pod, container, podIP)
|
opts, err := m.runtimeHelper.GenerateRunContainerOptions(pod, container, podIP)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -156,7 +156,7 @@ func (m *kubeGenericRuntimeManager) generateContainerConfig(container *v1.Contai
|
|||||||
Name: &container.Name,
|
Name: &container.Name,
|
||||||
Attempt: &restartCountUint32,
|
Attempt: &restartCountUint32,
|
||||||
},
|
},
|
||||||
Image: &runtimeapi.ImageSpec{Image: &container.Image},
|
Image: &runtimeapi.ImageSpec{Image: &imageRef},
|
||||||
Command: command,
|
Command: command,
|
||||||
Args: args,
|
Args: args,
|
||||||
WorkingDir: &container.WorkingDir,
|
WorkingDir: &container.WorkingDir,
|
||||||
|
@@ -28,16 +28,16 @@ import (
|
|||||||
|
|
||||||
// PullImage pulls an image from the network to local storage using the supplied
|
// PullImage pulls an image from the network to local storage using the supplied
|
||||||
// secrets if necessary.
|
// secrets if necessary.
|
||||||
func (m *kubeGenericRuntimeManager) PullImage(image kubecontainer.ImageSpec, pullSecrets []v1.Secret) error {
|
func (m *kubeGenericRuntimeManager) PullImage(image kubecontainer.ImageSpec, pullSecrets []v1.Secret) (string, error) {
|
||||||
img := image.Image
|
img := image.Image
|
||||||
repoToPull, _, _, err := parsers.ParseImageName(img)
|
repoToPull, _, _, err := parsers.ParseImageName(img)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
keyring, err := credentialprovider.MakeDockerKeyring(pullSecrets, m.keyring)
|
keyring, err := credentialprovider.MakeDockerKeyring(pullSecrets, m.keyring)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
imgSpec := &runtimeapi.ImageSpec{Image: &img}
|
imgSpec := &runtimeapi.ImageSpec{Image: &img}
|
||||||
@@ -45,13 +45,13 @@ func (m *kubeGenericRuntimeManager) PullImage(image kubecontainer.ImageSpec, pul
|
|||||||
if !withCredentials {
|
if !withCredentials {
|
||||||
glog.V(3).Infof("Pulling image %q without credentials", img)
|
glog.V(3).Infof("Pulling image %q without credentials", img)
|
||||||
|
|
||||||
err = m.imageService.PullImage(imgSpec, nil)
|
imageRef, err := m.imageService.PullImage(imgSpec, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Pull image %q failed: %v", img, err)
|
glog.Errorf("Pull image %q failed: %v", img, err)
|
||||||
return err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return imageRef, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var pullErrs []error
|
var pullErrs []error
|
||||||
@@ -66,26 +66,34 @@ func (m *kubeGenericRuntimeManager) PullImage(image kubecontainer.ImageSpec, pul
|
|||||||
RegistryToken: &authConfig.RegistryToken,
|
RegistryToken: &authConfig.RegistryToken,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.imageService.PullImage(imgSpec, auth)
|
imageRef, err := m.imageService.PullImage(imgSpec, auth)
|
||||||
// If there was no error, return success
|
// If there was no error, return success
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return nil
|
return imageRef, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
pullErrs = append(pullErrs, err)
|
pullErrs = append(pullErrs, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return utilerrors.NewAggregate(pullErrs)
|
return "", utilerrors.NewAggregate(pullErrs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsImagePresent checks whether the container image is already in the local storage.
|
// IsImagePresent checks whether the container image is already in the local storage.
|
||||||
func (m *kubeGenericRuntimeManager) IsImagePresent(image kubecontainer.ImageSpec) (bool, error) {
|
func (m *kubeGenericRuntimeManager) IsImagePresent(image kubecontainer.ImageSpec) (string, error) {
|
||||||
status, err := m.imageService.ImageStatus(&runtimeapi.ImageSpec{Image: &image.Image})
|
status, err := m.imageService.ImageStatus(&runtimeapi.ImageSpec{Image: &image.Image})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("ImageStatus for image %q failed: %v", image, err)
|
glog.Errorf("ImageStatus for image %q failed: %v", image, err)
|
||||||
return false, err
|
return "", err
|
||||||
}
|
}
|
||||||
return status != nil, nil
|
if status == nil {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
imageRef := status.GetId()
|
||||||
|
if len(status.RepoDigests) > 0 {
|
||||||
|
imageRef = status.RepoDigests[0]
|
||||||
|
}
|
||||||
|
return imageRef, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListImages gets all images currently on the machine.
|
// ListImages gets all images currently on the machine.
|
||||||
|
@@ -28,8 +28,9 @@ func TestPullImage(t *testing.T) {
|
|||||||
_, _, fakeManager, err := createTestRuntimeManager()
|
_, _, fakeManager, err := createTestRuntimeManager()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
err = fakeManager.PullImage(kubecontainer.ImageSpec{Image: "busybox"}, nil)
|
imageRef, err := fakeManager.PullImage(kubecontainer.ImageSpec{Image: "busybox"}, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "busybox", imageRef)
|
||||||
|
|
||||||
images, err := fakeManager.ListImages()
|
images, err := fakeManager.ListImages()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
@@ -61,16 +62,16 @@ func TestIsImagePresent(t *testing.T) {
|
|||||||
|
|
||||||
image := "busybox"
|
image := "busybox"
|
||||||
fakeImageService.SetFakeImages([]string{image})
|
fakeImageService.SetFakeImages([]string{image})
|
||||||
present, err := fakeManager.IsImagePresent(kubecontainer.ImageSpec{Image: image})
|
imageRef, err := fakeManager.IsImagePresent(kubecontainer.ImageSpec{Image: image})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, true, present)
|
assert.Equal(t, image, imageRef)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRemoveImage(t *testing.T) {
|
func TestRemoveImage(t *testing.T) {
|
||||||
_, fakeImageService, fakeManager, err := createTestRuntimeManager()
|
_, fakeImageService, fakeManager, err := createTestRuntimeManager()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
err = fakeManager.PullImage(kubecontainer.ImageSpec{Image: "busybox"}, nil)
|
_, err = fakeManager.PullImage(kubecontainer.ImageSpec{Image: "busybox"}, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, 1, len(fakeImageService.Images))
|
assert.Equal(t, 1, len(fakeImageService.Images))
|
||||||
|
|
||||||
|
@@ -145,7 +145,7 @@ func makeFakeContainer(t *testing.T, m *kubeGenericRuntimeManager, template cont
|
|||||||
sandboxConfig, err := m.generatePodSandboxConfig(template.pod, template.sandboxAttempt)
|
sandboxConfig, err := m.generatePodSandboxConfig(template.pod, template.sandboxAttempt)
|
||||||
assert.NoError(t, err, "generatePodSandboxConfig for container template %+v", template)
|
assert.NoError(t, err, "generatePodSandboxConfig for container template %+v", template)
|
||||||
|
|
||||||
containerConfig, err := m.generateContainerConfig(template.container, template.pod, template.attempt, "")
|
containerConfig, err := m.generateContainerConfig(template.container, template.pod, template.attempt, "", template.container.Image)
|
||||||
assert.NoError(t, err, "generateContainerConfig for container template %+v", template)
|
assert.NoError(t, err, "generateContainerConfig for container template %+v", template)
|
||||||
|
|
||||||
podSandboxID := apitest.BuildSandboxName(sandboxConfig.Metadata)
|
podSandboxID := apitest.BuildSandboxName(sandboxConfig.Metadata)
|
||||||
|
@@ -79,20 +79,20 @@ func (r *RemoteImageService) ImageStatus(image *runtimeapi.ImageSpec) (*runtimea
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PullImage pulls an image with authentication config.
|
// PullImage pulls an image with authentication config.
|
||||||
func (r *RemoteImageService) PullImage(image *runtimeapi.ImageSpec, auth *runtimeapi.AuthConfig) error {
|
func (r *RemoteImageService) PullImage(image *runtimeapi.ImageSpec, auth *runtimeapi.AuthConfig) (string, error) {
|
||||||
ctx, cancel := getContextWithTimeout(r.timeout)
|
ctx, cancel := getContextWithTimeout(r.timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
_, err := r.imageClient.PullImage(ctx, &runtimeapi.PullImageRequest{
|
resp, err := r.imageClient.PullImage(ctx, &runtimeapi.PullImageRequest{
|
||||||
Image: image,
|
Image: image,
|
||||||
Auth: auth,
|
Auth: auth,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("PullImage %q from image service failed: %v", image.GetImage(), err)
|
glog.Errorf("PullImage %q from image service failed: %v", image.GetImage(), err)
|
||||||
return err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return resp.GetImageRef(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveImage removes the image.
|
// RemoveImage removes the image.
|
||||||
|
Reference in New Issue
Block a user