Merge pull request #45266 from Crazykev/remove-image

Automatic merge from submit-queue (batch tested with PRs 45684, 45266, 45669, 44787, 44984)

[CRI] Return success if ImageNotFound in RemoveImage() 

Signed-off-by: Crazykev <crazykev@zju.edu.cn>



**What this PR does / why we need it**:

**Sorry for close the [old one](https://github.com/kubernetes/kubernetes/pull/44381) mistakenly,  rebase and move to here.**
RemoveImage() operation should be idempotent, [ref](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/api/v1alpha1/runtime/api.proto#L89-L92)
 @feiskyer @Random-Liu PTAL


**Which issue this PR fixes**

**Special notes for your reviewer**:

**Release note**:

```release-note
NONE
```
This commit is contained in:
Kubernetes Submit Queue 2017-05-12 03:20:38 -07:00 committed by GitHub
commit 1d4f0b4ac9
3 changed files with 16 additions and 2 deletions

View File

@ -94,15 +94,20 @@ func (ds *dockerService) RemoveImage(image *runtimeapi.ImageSpec) error {
imageInspect, err := ds.client.InspectImageByID(image.Image)
if err == nil && imageInspect != nil && len(imageInspect.RepoTags) > 1 {
for _, tag := range imageInspect.RepoTags {
if _, err := ds.client.RemoveImage(tag, dockertypes.ImageRemoveOptions{PruneChildren: true}); err != nil {
if _, err := ds.client.RemoveImage(tag, dockertypes.ImageRemoveOptions{PruneChildren: true}); err != nil && !libdocker.IsImageNotFoundError(err) {
return err
}
}
return nil
} else if err != nil && libdocker.IsImageNotFoundError(err) {
return nil
}
_, err = ds.client.RemoveImage(image.Image, dockertypes.ImageRemoveOptions{PruneChildren: true})
return err
if err != nil && !libdocker.IsImageNotFoundError(err) {
return err
}
return nil
}
// getImageRef returns the image digest if exists, or else returns the image ID.

View File

@ -129,3 +129,9 @@ func matchImageIDOnly(inspected dockertypes.ImageInspect, image string) bool {
glog.V(4).Infof("The reference %s does not directly refer to the given image's ID (%q)", image, inspected.ID)
return false
}
// isImageNotFoundError returns whether the err is caused by image not found in docker
// TODO: Use native error tester once ImageNotFoundError is supported in docker-engine client(eg. ImageRemove())
func isImageNotFoundError(err error) bool {
return strings.Contains(err.Error(), "No such image:")
}

View File

@ -382,6 +382,9 @@ func (d *kubeDockerClient) RemoveImage(image string, opts dockertypes.ImageRemov
if ctxErr := contextError(ctx); ctxErr != nil {
return nil, ctxErr
}
if isImageNotFoundError(err) {
return nil, ImageNotFoundError{ID: image}
}
return resp, err
}