// addImagesToGraph adds all images to the graph that belong to one of the // registries in the algorithm and are at least as old as the minimum age // threshold as specified by the algorithm. It also adds all the images' layers // to the graph. func addImagesToGraph(g graph.Graph, images *imageapi.ImageList, algorithm pruneAlgorithm) { for i := range images.Items { image := &images.Items[i] glog.V(4).Infof("Examining image %q", image.Name) if image.Annotations == nil { glog.V(4).Infof("Image %q with DockerImageReference %q belongs to an external registry - skipping", image.Name, image.DockerImageReference) continue } if value, ok := image.Annotations[imageapi.ManagedByOpenShiftAnnotation]; !ok || value != "true" { glog.V(4).Infof("Image %q with DockerImageReference %q belongs to an external registry - skipping", image.Name, image.DockerImageReference) continue } age := unversioned.Now().Sub(image.CreationTimestamp.Time) if !algorithm.pruneOverSizeLimit && age < algorithm.keepYoungerThan { glog.V(4).Infof("Image %q is younger than minimum pruning age, skipping (age=%v)", image.Name, age) continue } glog.V(4).Infof("Adding image %q to graph", image.Name) imageNode := imagegraph.EnsureImageNode(g, image) for _, layer := range image.DockerImageLayers { glog.V(4).Infof("Adding image layer %q to graph", layer.Name) layerNode := imagegraph.EnsureImageLayerNode(g, layer.Name) g.AddEdge(imageNode, layerNode, ReferencedImageLayerEdgeKind) } } }
func addImagesToGraph(g graph.Graph, images *imageapi.ImageList) { for i := range images.Items { image := &images.Items[i] glog.V(4).Infof("Adding image %q to graph", image.Name) imageNode := imagegraph.EnsureImageNode(g, image) topLayerAdded := false // We're looking through layers in reversed order since we need to // find first layer (from top) which is not an empty layer, we're omitting // empty layers because every image has those and they're giving us // false positives about parents. This applies only to schema v1 images // schema v2 does not have that problem. for i := len(image.DockerImageLayers) - 1; i >= 0; i-- { layer := image.DockerImageLayers[i] layerNode := imagegraph.EnsureImageLayerNode(g, layer.Name) edgeKind := ImageLayerEdgeKind if !topLayerAdded && layer.Name != digest.DigestSha256EmptyTar { edgeKind = ImageTopLayerEdgeKind topLayerAdded = true } g.AddEdge(imageNode, layerNode, edgeKind) glog.V(4).Infof("Adding image layer %q to graph (%q)", layer.Name, edgeKind) } } }
// addImagesToGraph adds all images to the graph that belong to one of the // registries in the algorithm and are at least as old as the minimum age // threshold as specified by the algorithm. It also adds all the images' layers // to the graph. func addImagesToGraph(g graph.Graph, images *imageapi.ImageList, algorithm pruneAlgorithm) { for i := range images.Items { image := &images.Items[i] glog.V(4).Infof("Examining image %q", image.Name) if image.Annotations == nil { glog.V(4).Infof("Image %q with DockerImageReference %q belongs to an external registry - skipping", image.Name, image.DockerImageReference) continue } if value, ok := image.Annotations[imageapi.ManagedByOpenShiftAnnotation]; !ok || value != "true" { glog.V(4).Infof("Image %q with DockerImageReference %q belongs to an external registry - skipping", image.Name, image.DockerImageReference) continue } age := unversioned.Now().Sub(image.CreationTimestamp.Time) if !algorithm.pruneOverSizeLimit && age < algorithm.keepYoungerThan { glog.V(4).Infof("Image %q is younger than minimum pruning age, skipping (age=%v)", image.Name, age) continue } glog.V(4).Infof("Adding image %q to graph", image.Name) imageNode := imagegraph.EnsureImageNode(g, image) manifest := imageapi.DockerImageManifest{} if err := json.Unmarshal([]byte(image.DockerImageManifest), &manifest); err != nil { utilruntime.HandleError(fmt.Errorf("unable to extract manifest from image: %v. This image's layers won't be pruned if the image is pruned now.", err)) continue } // schema1 layers for _, layer := range manifest.FSLayers { glog.V(4).Infof("Adding image layer v1 %q to graph", layer.DockerBlobSum) layerNode := imagegraph.EnsureImageLayerNode(g, layer.DockerBlobSum) g.AddEdge(imageNode, layerNode, ReferencedImageLayerEdgeKind) } // schema2 layers for _, layer := range manifest.Layers { glog.V(4).Infof("Adding image layer v2 %q to graph", layer.Digest) layerNode := imagegraph.EnsureImageLayerNode(g, layer.Digest) g.AddEdge(imageNode, layerNode, ReferencedImageLayerEdgeKind) } } }