Skip to content

Commit 7edd2ba

Browse files
committed
Bug 1450291 - Improve logs in image pruning
1 parent 90592c5 commit 7edd2ba

File tree

1 file changed

+46
-36
lines changed

1 file changed

+46
-36
lines changed

pkg/image/prune/prune.go

+46-36
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@ import (
66
"net/http"
77
"reflect"
88
"sort"
9+
"strings"
910
"time"
1011

1112
"github.com/docker/distribution/manifest/schema2"
1213
"github.com/docker/distribution/registry/api/errcode"
1314
"github.com/golang/glog"
1415
gonum "github.com/gonum/graph"
1516

17+
kmeta "k8s.io/apimachinery/pkg/api/meta"
1618
"k8s.io/apimachinery/pkg/api/resource"
1719
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
20+
"k8s.io/apimachinery/pkg/runtime"
1821
kerrors "k8s.io/apimachinery/pkg/util/errors"
1922
"k8s.io/apimachinery/pkg/util/sets"
2023
kapi "k8s.io/kubernetes/pkg/api"
@@ -377,7 +380,7 @@ func addImageStreamsToGraph(g graph.Graph, streams *imageapi.ImageStreamList, li
377380
for i := range streams.Items {
378381
stream := &streams.Items[i]
379382

380-
glog.V(4).Infof("Examining ImageStream %s/%s", stream.Namespace, stream.Name)
383+
glog.V(4).Infof("Examining ImageStream %s", getName(stream))
381384

382385
// use a weak reference for old image revisions by default
383386
oldImageRevisionReferenceKind := WeakReferencedImageEdgeKind
@@ -388,7 +391,7 @@ func addImageStreamsToGraph(g graph.Graph, streams *imageapi.ImageStreamList, li
388391
oldImageRevisionReferenceKind = ReferencedImageEdgeKind
389392
}
390393

391-
glog.V(4).Infof("Adding ImageStream %s/%s to graph", stream.Namespace, stream.Name)
394+
glog.V(4).Infof("Adding ImageStream %s to graph", getName(stream))
392395
isNode := imagegraph.EnsureImageStreamNode(g, stream)
393396
imageStreamNode := isNode.(*imagegraph.ImageStreamNode)
394397

@@ -415,7 +418,7 @@ func addImageStreamsToGraph(g graph.Graph, streams *imageapi.ImageStreamList, li
415418
}
416419
}
417420

418-
glog.V(4).Infof("Checking for existing strong reference from stream %s/%s to image %s", stream.Namespace, stream.Name, imageNode.Image.Name)
421+
glog.V(4).Infof("Checking for existing strong reference from stream %s to image %s", getName(stream), imageNode.Image.Name)
419422
if edge := g.Edge(imageStreamNode, imageNode); edge != nil && g.EdgeKinds(edge).Has(ReferencedImageEdgeKind) {
420423
glog.V(4).Infof("Strong reference found")
421424
continue
@@ -432,7 +435,7 @@ func addImageStreamsToGraph(g graph.Graph, streams *imageapi.ImageStreamList, li
432435
continue
433436
}
434437

435-
glog.V(4).Infof("Adding reference from stream %q to %s", stream.Name, cn.Describe())
438+
glog.V(4).Infof("Adding reference from stream %s to %s", getName(stream), cn.Describe())
436439
if cn.Type == imagegraph.ImageComponentTypeConfig {
437440
g.AddEdge(imageStreamNode, s, ReferencedImageConfigEdgeKind)
438441
} else {
@@ -447,10 +450,7 @@ func addImageStreamsToGraph(g graph.Graph, streams *imageapi.ImageStreamList, li
447450
// exceedsLimits checks if given image exceeds LimitRanges defined in ImageStream's namespace.
448451
func exceedsLimits(is *imageapi.ImageStream, image *imageapi.Image, limits map[string][]*kapi.LimitRange) bool {
449452
limitRanges, ok := limits[is.Namespace]
450-
if !ok {
451-
return false
452-
}
453-
if len(limitRanges) == 0 {
453+
if !ok || len(limitRanges) == 0 {
454454
return false
455455
}
456456

@@ -470,8 +470,8 @@ func exceedsLimits(is *imageapi.ImageStream, image *imageapi.Image, limits map[s
470470
}
471471
if limitQuantity.Cmp(*imageSize) < 0 {
472472
// image size is larger than the permitted limit range max size
473-
glog.V(4).Infof("Image %s in stream %s/%s exceeds limit %s: %v vs %v",
474-
image.Name, is.Namespace, is.Name, limitRange.Name, *imageSize, limitQuantity)
473+
glog.V(4).Infof("Image %s in stream %s exceeds limit %s: %v vs %v",
474+
image.Name, getName(is), limitRange.Name, *imageSize, limitQuantity)
475475
return true
476476
}
477477
}
@@ -481,28 +481,26 @@ func exceedsLimits(is *imageapi.ImageStream, image *imageapi.Image, limits map[s
481481

482482
// addPodsToGraph adds pods to the graph.
483483
//
484-
// A pod is only *excluded* from being added to the graph if its phase is not
485-
// pending or running and it is at least as old as the minimum age threshold
486-
// defined by algorithm.
487-
//
488484
// Edges are added to the graph from each pod to the images specified by that
489485
// pod's list of containers, as long as the image is managed by OpenShift.
490486
func addPodsToGraph(g graph.Graph, pods *kapi.PodList, algorithm pruneAlgorithm) {
491487
for i := range pods.Items {
492488
pod := &pods.Items[i]
493489

494-
glog.V(4).Infof("Examining pod %s/%s", pod.Namespace, pod.Name)
490+
glog.V(4).Infof("Examining pod %s", getName(pod))
495491

492+
// A pod is only *excluded* from being added to the graph if its phase is not
493+
// pending or running. Additionally, it has to be at least as old as the minimum
494+
// age threshold defined by the algorithm.
496495
if pod.Status.Phase != kapi.PodRunning && pod.Status.Phase != kapi.PodPending {
497496
age := metav1.Now().Sub(pod.CreationTimestamp.Time)
498497
if age >= algorithm.keepYoungerThan {
499-
glog.V(4).Infof("Pod %s/%s is not running or pending and age is at least minimum pruning age - skipping", pod.Namespace, pod.Name)
500-
// not pending or running, age is at least minimum pruning age, skip
498+
glog.V(4).Infof("Pod %s is not running nor pending and age exceeds keepYoungerThan (%v) - skipping", getName(pod), age)
501499
continue
502500
}
503501
}
504502

505-
glog.V(4).Infof("Adding pod %s/%s to graph", pod.Namespace, pod.Name)
503+
glog.V(4).Infof("Adding pod %s to graph", getName(pod))
506504
podNode := kubegraph.EnsurePodNode(g, pod)
507505

508506
addPodSpecToGraph(g, &pod.Spec, podNode)
@@ -548,7 +546,7 @@ func addPodSpecToGraph(g graph.Graph, spec *kapi.PodSpec, predecessor gonum.Node
548546
func addReplicationControllersToGraph(g graph.Graph, rcs *kapi.ReplicationControllerList) {
549547
for i := range rcs.Items {
550548
rc := &rcs.Items[i]
551-
glog.V(4).Infof("Examining replication controller %s/%s", rc.Namespace, rc.Name)
549+
glog.V(4).Infof("Examining replication controller %s", getName(rc))
552550
rcNode := kubegraph.EnsureReplicationControllerNode(g, rc)
553551
addPodSpecToGraph(g, &rc.Spec.Template.Spec, rcNode)
554552
}
@@ -562,7 +560,7 @@ func addReplicationControllersToGraph(g graph.Graph, rcs *kapi.ReplicationContro
562560
func addDeploymentConfigsToGraph(g graph.Graph, dcs *deployapi.DeploymentConfigList) {
563561
for i := range dcs.Items {
564562
dc := &dcs.Items[i]
565-
glog.V(4).Infof("Examining DeploymentConfig %s/%s", dc.Namespace, dc.Name)
563+
glog.V(4).Infof("Examining DeploymentConfig %s", getName(dc))
566564
dcNode := deploygraph.EnsureDeploymentConfigNode(g, dc)
567565
addPodSpecToGraph(g, &dc.Spec.Template.Spec, dcNode)
568566
}
@@ -574,7 +572,7 @@ func addDeploymentConfigsToGraph(g graph.Graph, dcs *deployapi.DeploymentConfigL
574572
func addBuildConfigsToGraph(g graph.Graph, bcs *buildapi.BuildConfigList) {
575573
for i := range bcs.Items {
576574
bc := &bcs.Items[i]
577-
glog.V(4).Infof("Examining BuildConfig %s/%s", bc.Namespace, bc.Name)
575+
glog.V(4).Infof("Examining BuildConfig %s", getName(bc))
578576
bcNode := buildgraph.EnsureBuildConfigNode(g, bc)
579577
addBuildStrategyImageReferencesToGraph(g, bc.Spec.Strategy, bcNode)
580578
}
@@ -586,7 +584,7 @@ func addBuildConfigsToGraph(g graph.Graph, bcs *buildapi.BuildConfigList) {
586584
func addBuildsToGraph(g graph.Graph, builds *buildapi.BuildList) {
587585
for i := range builds.Items {
588586
build := &builds.Items[i]
589-
glog.V(4).Infof("Examining build %s/%s", build.Namespace, build.Name)
587+
glog.V(4).Infof("Examining build %s", getName(build))
590588
buildNode := buildgraph.EnsureBuildNode(g, build)
591589
addBuildStrategyImageReferencesToGraph(g, build.Spec.Strategy, buildNode)
592590
}
@@ -761,7 +759,7 @@ func pruneStreams(g graph.Graph, imageNodes []*imagegraph.ImageNode, streamPrune
761759
stream := streamNode.ImageStream
762760
updatedTags := sets.NewString()
763761

764-
glog.V(4).Infof("Checking if ImageStream %s/%s has references to image %s in status.tags", stream.Namespace, stream.Name, imageNode.Image.Name)
762+
glog.V(4).Infof("Checking if ImageStream %s has references to image %s in status.tags", getName(stream), imageNode.Image.Name)
765763

766764
for tag, history := range stream.Status.Tags {
767765
glog.V(4).Infof("Checking tag %q", tag)
@@ -780,7 +778,7 @@ func pruneStreams(g graph.Graph, imageNodes []*imagegraph.ImageNode, streamPrune
780778
}
781779
}
782780
if len(newHistory.Items) == 0 {
783-
glog.V(4).Infof("Removing tag %q from status.tags of ImageStream %s/%s", tag, stream.Namespace, stream.Name)
781+
glog.V(4).Infof("Removing tag %q from status.tags of ImageStream %s", tag, getName(stream))
784782
delete(stream.Status.Tags, tag)
785783
} else {
786784
stream.Status.Tags[tag] = newHistory
@@ -789,7 +787,8 @@ func pruneStreams(g graph.Graph, imageNodes []*imagegraph.ImageNode, streamPrune
789787

790788
updatedStream, err := streamPruner.DeleteImageStream(stream, imageNode.Image, updatedTags.List())
791789
if err != nil {
792-
errs = append(errs, fmt.Errorf("error pruning image from stream: %v", err))
790+
errs = append(errs, fmt.Errorf("error removing image %s from stream %s: %v",
791+
imageNode.Image.Name, getName(stream), err))
793792
continue
794793
}
795794

@@ -806,7 +805,7 @@ func pruneImages(g graph.Graph, imageNodes []*imagegraph.ImageNode, imagePruner
806805

807806
for _, imageNode := range imageNodes {
808807
if err := imagePruner.DeleteImage(imageNode.Image); err != nil {
809-
errs = append(errs, fmt.Errorf("error pruning image %q: %v", imageNode.Image.Name, err))
808+
errs = append(errs, fmt.Errorf("error removing image %q: %v", imageNode.Image.Name, err))
810809
}
811810
}
812811

@@ -904,7 +903,7 @@ func (p *pruner) Prune(
904903
glog.V(1).Infof("Using registry: %s", registryURL)
905904

906905
if err := p.registryPinger.ping(registryURL); err != nil {
907-
return fmt.Errorf("error communicating with registry: %v", err)
906+
return fmt.Errorf("error communicating with registry %s: %v", registryURL, err)
908907
}
909908

910909
prunableImageNodes, prunableImageIDs := calculatePrunableImages(p.g, imageNodes)
@@ -1001,9 +1000,9 @@ func pruneBlobs(
10011000
errs := []error{}
10021001

10031002
for _, cn := range componentNodes {
1004-
glog.V(4).Infof("Pruning registry=%q, blob=%q", registryURL, cn.Component)
10051003
if err := blobPruner.DeleteBlob(registryClient, registryURL, cn.Component); err != nil {
1006-
errs = append(errs, fmt.Errorf("error pruning blob %q: %v", cn.Component, err))
1004+
errs = append(errs, fmt.Errorf("error removing blob from registry %s: blob %q: %v",
1005+
registryURL, cn.Component, err))
10071006
}
10081007
}
10091008

@@ -1069,7 +1068,7 @@ func NewImageStreamDeleter(streams client.ImageStreamsNamespacer) ImageStreamDel
10691068
}
10701069

10711070
func (p *imageStreamDeleter) DeleteImageStream(stream *imageapi.ImageStream, image *imageapi.Image, updatedTags []string) (*imageapi.ImageStream, error) {
1072-
glog.V(4).Infof("Updating ImageStream %s/%s", stream.Namespace, stream.Name)
1071+
glog.V(4).Infof("Updating ImageStream %s", getName(stream))
10731072
glog.V(5).Infof("Updated stream: %#v", stream)
10741073
return p.streams.ImageStreams(stream.Namespace).UpdateStatus(stream)
10751074
}
@@ -1081,14 +1080,16 @@ func deleteFromRegistry(registryClient *http.Client, url string) error {
10811080
deleteFunc := func(proto, url string) error {
10821081
req, err := http.NewRequest("DELETE", url, nil)
10831082
if err != nil {
1084-
glog.Errorf("Error creating request: %v", err)
1085-
return fmt.Errorf("error creating request: %v", err)
1083+
return err
10861084
}
10871085

10881086
glog.V(4).Infof("Sending request to registry")
10891087
resp, err := registryClient.Do(req)
10901088
if err != nil {
1091-
return fmt.Errorf("error sending request: %v", err)
1089+
if proto != "https" && strings.Contains(err.Error(), "malformed HTTP response") {
1090+
return fmt.Errorf("%v.\n* Are you trying to connect to a TLS-enabled registry without TLS?", err)
1091+
}
1092+
return err
10921093
}
10931094
defer resp.Body.Close()
10941095

@@ -1147,7 +1148,7 @@ func NewLayerLinkDeleter() LayerLinkDeleter {
11471148
}
11481149

11491150
func (p *layerLinkDeleter) DeleteLayerLink(registryClient *http.Client, registryURL, repoName, linkName string) error {
1150-
glog.V(4).Infof("Pruning registry %q, repo %q, layer link %q", registryURL, repoName, linkName)
1151+
glog.V(4).Infof("Deleting layer link from registry %q: repo %q, layer link %q", registryURL, repoName, linkName)
11511152
return deleteFromRegistry(registryClient, fmt.Sprintf("%s/v2/%s/blobs/%s", registryURL, repoName, linkName))
11521153
}
11531154

@@ -1162,7 +1163,7 @@ func NewBlobDeleter() BlobDeleter {
11621163
}
11631164

11641165
func (p *blobDeleter) DeleteBlob(registryClient *http.Client, registryURL, blob string) error {
1165-
glog.V(4).Infof("Pruning registry %q, blob %q", registryURL, blob)
1166+
glog.V(4).Infof("Deleting blob from registry %q: blob %q", registryURL, blob)
11661167
return deleteFromRegistry(registryClient, fmt.Sprintf("%s/admin/blobs/%s", registryURL, blob))
11671168
}
11681169

@@ -1177,6 +1178,15 @@ func NewManifestDeleter() ManifestDeleter {
11771178
}
11781179

11791180
func (p *manifestDeleter) DeleteManifest(registryClient *http.Client, registryURL, repoName, manifest string) error {
1180-
glog.V(4).Infof("Pruning manifest for registry %q, repo %q, manifest %q", registryURL, repoName, manifest)
1181+
glog.V(4).Infof("Deleting manifest from registry %q: repo %q, manifest %q", registryURL, repoName, manifest)
11811182
return deleteFromRegistry(registryClient, fmt.Sprintf("%s/v2/%s/manifests/%s", registryURL, repoName, manifest))
11821183
}
1184+
1185+
func getName(obj runtime.Object) string {
1186+
accessor, err := kmeta.Accessor(obj)
1187+
if err != nil {
1188+
glog.V(4).Infof("Error getting accessor for %#v", obj)
1189+
return "<unknown>"
1190+
}
1191+
return fmt.Sprintf("%s/%s", accessor.GetNamespace(), accessor.GetName())
1192+
}

0 commit comments

Comments
 (0)