Skip to content

Commit 30f12d7

Browse files
committed
Bug 1450291 - Improve logs in image pruning
1 parent 93af347 commit 30f12d7

File tree

1 file changed

+43
-32
lines changed

1 file changed

+43
-32
lines changed

pkg/image/prune/prune.go

Lines changed: 43 additions & 32 deletions
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
}
@@ -491,18 +491,17 @@ func addPodsToGraph(g graph.Graph, pods *kapi.PodList, algorithm pruneAlgorithm)
491491
for i := range pods.Items {
492492
pod := &pods.Items[i]
493493

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

496496
if pod.Status.Phase != kapi.PodRunning && pod.Status.Phase != kapi.PodPending {
497497
age := metav1.Now().Sub(pod.CreationTimestamp.Time)
498498
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
499+
glog.V(4).Infof("Pod %s is not running nor pending and age exceeds keepYoungerThan (%v) - skipping", getName(pod), age)
501500
continue
502501
}
503502
}
504503

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

508507
addPodSpecToGraph(g, &pod.Spec, podNode)
@@ -548,7 +547,7 @@ func addPodSpecToGraph(g graph.Graph, spec *kapi.PodSpec, predecessor gonum.Node
548547
func addReplicationControllersToGraph(g graph.Graph, rcs *kapi.ReplicationControllerList) {
549548
for i := range rcs.Items {
550549
rc := &rcs.Items[i]
551-
glog.V(4).Infof("Examining replication controller %s/%s", rc.Namespace, rc.Name)
550+
glog.V(4).Infof("Examining replication controller %s", getName(rc))
552551
rcNode := kubegraph.EnsureReplicationControllerNode(g, rc)
553552
addPodSpecToGraph(g, &rc.Spec.Template.Spec, rcNode)
554553
}
@@ -562,7 +561,7 @@ func addReplicationControllersToGraph(g graph.Graph, rcs *kapi.ReplicationContro
562561
func addDeploymentConfigsToGraph(g graph.Graph, dcs *deployapi.DeploymentConfigList) {
563562
for i := range dcs.Items {
564563
dc := &dcs.Items[i]
565-
glog.V(4).Infof("Examining DeploymentConfig %s/%s", dc.Namespace, dc.Name)
564+
glog.V(4).Infof("Examining DeploymentConfig %s", getName(dc))
566565
dcNode := deploygraph.EnsureDeploymentConfigNode(g, dc)
567566
addPodSpecToGraph(g, &dc.Spec.Template.Spec, dcNode)
568567
}
@@ -574,7 +573,7 @@ func addDeploymentConfigsToGraph(g graph.Graph, dcs *deployapi.DeploymentConfigL
574573
func addBuildConfigsToGraph(g graph.Graph, bcs *buildapi.BuildConfigList) {
575574
for i := range bcs.Items {
576575
bc := &bcs.Items[i]
577-
glog.V(4).Infof("Examining BuildConfig %s/%s", bc.Namespace, bc.Name)
576+
glog.V(4).Infof("Examining BuildConfig %s", getName(bc))
578577
bcNode := buildgraph.EnsureBuildConfigNode(g, bc)
579578
addBuildStrategyImageReferencesToGraph(g, bc.Spec.Strategy, bcNode)
580579
}
@@ -586,7 +585,7 @@ func addBuildConfigsToGraph(g graph.Graph, bcs *buildapi.BuildConfigList) {
586585
func addBuildsToGraph(g graph.Graph, builds *buildapi.BuildList) {
587586
for i := range builds.Items {
588587
build := &builds.Items[i]
589-
glog.V(4).Infof("Examining build %s/%s", build.Namespace, build.Name)
588+
glog.V(4).Infof("Examining build %s", getName(build))
590589
buildNode := buildgraph.EnsureBuildNode(g, build)
591590
addBuildStrategyImageReferencesToGraph(g, build.Spec.Strategy, buildNode)
592591
}
@@ -761,7 +760,7 @@ func pruneStreams(g graph.Graph, imageNodes []*imagegraph.ImageNode, streamPrune
761760
stream := streamNode.ImageStream
762761
updatedTags := sets.NewString()
763762

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)
763+
glog.V(4).Infof("Checking if ImageStream %s has references to image %s in status.tags", getName(stream), imageNode.Image.Name)
765764

766765
for tag, history := range stream.Status.Tags {
767766
glog.V(4).Infof("Checking tag %q", tag)
@@ -780,7 +779,7 @@ func pruneStreams(g graph.Graph, imageNodes []*imagegraph.ImageNode, streamPrune
780779
}
781780
}
782781
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)
782+
glog.V(4).Infof("Removing tag %q from status.tags of ImageStream %s", tag, getName(stream))
784783
delete(stream.Status.Tags, tag)
785784
} else {
786785
stream.Status.Tags[tag] = newHistory
@@ -789,7 +788,8 @@ func pruneStreams(g graph.Graph, imageNodes []*imagegraph.ImageNode, streamPrune
789788

790789
updatedStream, err := streamPruner.DeleteImageStream(stream, imageNode.Image, updatedTags.List())
791790
if err != nil {
792-
errs = append(errs, fmt.Errorf("error pruning image from stream: %v", err))
791+
errs = append(errs, fmt.Errorf("error removing image %s from stream %s: %v",
792+
imageNode.Image.Name, getName(stream), err))
793793
continue
794794
}
795795

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

807807
for _, imageNode := range imageNodes {
808808
if err := imagePruner.DeleteImage(imageNode.Image); err != nil {
809-
errs = append(errs, fmt.Errorf("error pruning image %q: %v", imageNode.Image.Name, err))
809+
errs = append(errs, fmt.Errorf("error removing image %q: %v", imageNode.Image.Name, err))
810810
}
811811
}
812812

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

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

910910
prunableImageNodes, prunableImageIDs := calculatePrunableImages(p.g, imageNodes)
@@ -1001,9 +1001,9 @@ func pruneBlobs(
10011001
errs := []error{}
10021002

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

@@ -1069,7 +1069,7 @@ func NewImageStreamDeleter(streams client.ImageStreamsNamespacer) ImageStreamDel
10691069
}
10701070

10711071
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)
1072+
glog.V(4).Infof("Updating ImageStream %s", getName(stream))
10731073
glog.V(5).Infof("Updated stream: %#v", stream)
10741074
return p.streams.ImageStreams(stream.Namespace).UpdateStatus(stream)
10751075
}
@@ -1081,14 +1081,16 @@ func deleteFromRegistry(registryClient *http.Client, url string) error {
10811081
deleteFunc := func(proto, url string) error {
10821082
req, err := http.NewRequest("DELETE", url, nil)
10831083
if err != nil {
1084-
glog.Errorf("Error creating request: %v", err)
1085-
return fmt.Errorf("error creating request: %v", err)
1084+
return err
10861085
}
10871086

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

@@ -1147,7 +1149,7 @@ func NewLayerLinkDeleter() LayerLinkDeleter {
11471149
}
11481150

11491151
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)
1152+
glog.V(4).Infof("Deleting layer link from registry %q: repo %q, layer link %q", registryURL, repoName, linkName)
11511153
return deleteFromRegistry(registryClient, fmt.Sprintf("%s/v2/%s/blobs/%s", registryURL, repoName, linkName))
11521154
}
11531155

@@ -1162,7 +1164,7 @@ func NewBlobDeleter() BlobDeleter {
11621164
}
11631165

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

@@ -1177,6 +1179,15 @@ func NewManifestDeleter() ManifestDeleter {
11771179
}
11781180

11791181
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)
1182+
glog.V(4).Infof("Deleting manifest from registry %q: repo %q, manifest %q", registryURL, repoName, manifest)
11811183
return deleteFromRegistry(registryClient, fmt.Sprintf("%s/v2/%s/manifests/%s", registryURL, repoName, manifest))
11821184
}
1185+
1186+
func getName(obj runtime.Object) string {
1187+
accessor, err := kmeta.Accessor(obj)
1188+
if err != nil {
1189+
glog.V(4).Infof("Error getting accessor for %#v", obj)
1190+
return "<unknown>"
1191+
}
1192+
return fmt.Sprintf("%s/%s", accessor.GetNamespace(), accessor.GetName())
1193+
}

0 commit comments

Comments
 (0)