Skip to content

Commit

Permalink
image-pruning: derefence imagestreamtags
Browse files Browse the repository at this point in the history
Create strong references to images for each pod/bc/dc/etc that uses
<host>/<repo>:tag reference.

Resolves [bz#1498604](https://bugzilla.redhat.com/show_bug.cgi?id=1498604)

Signed-off-by: Michal Minář <[email protected]>
  • Loading branch information
Michal Minář committed Oct 26, 2017
1 parent d61dcb0 commit cc695ab
Show file tree
Hide file tree
Showing 8 changed files with 1,803 additions and 1,137 deletions.
8 changes: 6 additions & 2 deletions pkg/image/graph/nodes/nodes.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,12 @@ func EnsureAllImageStreamTagNodes(g osgraph.MutableUniqueGraph, is *imageapi.Ima
return ret
}

func FindImage(g osgraph.MutableUniqueGraph, imageName string) graph.Node {
return g.Find(ImageNodeName(&imageapi.Image{ObjectMeta: metav1.ObjectMeta{Name: imageName}}))
func FindImage(g osgraph.MutableUniqueGraph, imageName string) *ImageNode {
n := g.Find(ImageNodeName(&imageapi.Image{ObjectMeta: metav1.ObjectMeta{Name: imageName}}))
if imageNode, ok := n.(*ImageNode); ok {
return imageNode
}
return nil
}

// EnsureDockerRepositoryNode adds the named Docker repository tag reference to the graph if it does
Expand Down
59 changes: 59 additions & 0 deletions pkg/image/prune/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"sort"
"strings"

kapi "k8s.io/kubernetes/pkg/api"

"github.com/docker/distribution/registry/api/errcode"
"github.com/golang/glog"

Expand Down Expand Up @@ -206,3 +208,60 @@ func TryProtocolsWithRegistryURL(registry string, allowInsecure bool, action fun
type retryPath struct{ err error }

func (rp *retryPath) Error() string { return rp.err.Error() }

// ErrBadReference denotes an invalid reference to image, imagestreamtag or imagestreamimage stored in a
// particular object. The object is identified by kind, namespace and name.
type ErrBadReference struct {
kind string
namespace string
name string
targetKind string
reference string
reason string
}

func newErrBadReferenceToImage(reference string, obj *kapi.ObjectReference, reason string) error {
kind := "<UnknownType>"
namespace := ""
name := "<unknown-name>"
if obj != nil {
kind = obj.Kind
namespace = obj.Namespace
name = obj.Name
}

return &ErrBadReference{
kind: kind,
namespace: namespace,
name: name,
reference: reference,
reason: reason,
}
}

func newErrBadReferenceTo(targetKind, reference string, obj *kapi.ObjectReference, reason string) error {
return &ErrBadReference{
kind: obj.Kind,
namespace: obj.Namespace,
name: obj.Name,
targetKind: targetKind,
reference: reference,
reason: reason,
}
}

func (e *ErrBadReference) Error() string {
return e.String()
}

func (e *ErrBadReference) String() string {
name := e.name
if len(e.namespace) > 0 {
name = e.namespace + "/" + name
}
targetKind := "docker image"
if len(e.targetKind) > 0 {
targetKind = e.targetKind
}
return fmt.Sprintf("%s[%s]: invalid %s reference %q: %s", e.kind, name, targetKind, e.reference, e.reason)
}
Loading

0 comments on commit cc695ab

Please sign in to comment.