func getImageStreamSize(g graph.Graph, node *imagegraph.ImageStreamNode) (int64, int, int) { imageEdges := g.OutboundEdges(node, ImageStreamImageEdgeKind) storage := int64(0) images := len(imageEdges) layers := 0 blobSet := sets.NewString() for _, e := range imageEdges { imageNode, ok := e.To().(*imagegraph.ImageNode) if !ok { continue } image := imageNode.Image layers += len(image.DockerImageLayers) // we're counting only unique layers per the entire stream for _, layer := range image.DockerImageLayers { if blobSet.Has(layer.Name) { continue } blobSet.Insert(layer.Name) storage += layer.LayerSize } if len(image.DockerImageConfig) > 0 && !blobSet.Has(image.DockerImageMetadata.ID) { blobSet.Insert(image.DockerImageMetadata.ID) storage += int64(len(image.DockerImageConfig)) } } return storage, images, layers }
func markParentsInGraph(g graph.Graph) { imageNodes := getImageNodes(g.Nodes()) for _, in := range imageNodes { // find image's top layer, should be just one for _, e := range g.OutboundEdges(in, ImageTopLayerEdgeKind) { layerNode, _ := e.To().(*imagegraph.ImageLayerNode) // find image's containing this layer but not being their top layer for _, ed := range g.InboundEdges(layerNode, ImageLayerEdgeKind) { childNode, _ := ed.From().(*imagegraph.ImageNode) if in.ID() == childNode.ID() { // don't add self edge, otherwise gonum/graph will panic continue } g.AddEdge(in, childNode, ParentImageEdgeKind) } // TODO: Find image's containing THIS layer being their top layer, // this happens when image contents is not being changed. // TODO: If two layers have exactly the same contents the current // mechanism might trip over that as well. We should check for // a series of layers when checking for parents. } } }
// hasControllerRefEdge returns true if a given node contains one or more "ManagedByController" outbound edges func hasControllerRefEdge(g osgraph.Graph, node graph.Node) bool { managedEdges := g.OutboundEdges(node, kubeedges.ManagedByControllerEdgeKind) return len(managedEdges) > 0 }