From 216cc0d605af432e19ce6d6e4146dff886e46c22 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Wed, 19 Oct 2016 17:43:24 +0000 Subject: [PATCH] Add image table to container nodes Also, extend metadata of images with sizes --- probe/docker/reporter.go | 31 ++++++++++++++++++++++--------- render/container.go | 2 ++ report/table.go | 4 ++-- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/probe/docker/reporter.go b/probe/docker/reporter.go index fd0ef6cf4..56290c4c0 100644 --- a/probe/docker/reporter.go +++ b/probe/docker/reporter.go @@ -4,6 +4,7 @@ import ( "net" "strings" + humanize "github.com/dustin/go-humanize" docker_client "github.com/fsouza/go-dockerclient" "github.com/weaveworks/scope/probe" @@ -15,8 +16,11 @@ import ( const ( ImageID = "docker_image_id" ImageName = "docker_image_name" + ImageSize = "docker_image_size" + ImageVirtualSize = "docker_image_virtual_size" ImageLabelPrefix = "docker_image_label_" IsInHostNetwork = "docker_is_in_host_network" + ImageTableID = "image_table" ) // Exposed for testing @@ -46,6 +50,14 @@ var ( ContainerTableTemplates = report.TableTemplates{ LabelPrefix: {ID: LabelPrefix, Label: "Docker Labels", Prefix: LabelPrefix}, EnvPrefix: {ID: EnvPrefix, Label: "Environment Variables", Prefix: EnvPrefix}, + ImageTableID: {ID: ImageTableID, Label: "Image", + FixedRows: map[string]string{ + ImageID: "ID", + ImageName: "Name", + ImageSize: "Size", + ImageVirtualSize: "Virtual Size", + }, + }, } ContainerImageTableTemplates = report.TableTemplates{ @@ -236,16 +248,17 @@ func (r *Reporter) containerImageTopology() report.Topology { r.registry.WalkImages(func(image docker_client.APIImages) { imageID := trimImageID(image.ID) - nodeID := report.MakeContainerImageNodeID(imageID) - node := report.MakeNodeWith(nodeID, map[string]string{ - ImageID: imageID, - }) - node = node.AddPrefixTable(ImageLabelPrefix, image.Labels) - - if len(image.RepoTags) > 0 { - node = node.WithLatests(map[string]string{ImageName: image.RepoTags[0]}) + latests := map[string]string{ + ImageID: imageID, + ImageSize: humanize.Bytes(uint64(image.Size)), + ImageVirtualSize: humanize.Bytes(uint64(image.VirtualSize)), } - + if len(image.RepoTags) > 0 { + latests[ImageName] = image.RepoTags[0] + } + nodeID := report.MakeContainerImageNodeID(imageID) + node := report.MakeNodeWith(nodeID, latests) + node = node.AddPrefixTable(ImageLabelPrefix, image.Labels) result.AddNode(node) }) diff --git a/render/container.go b/render/container.go index eec54e872..82974107d 100644 --- a/render/container.go +++ b/render/container.go @@ -192,6 +192,8 @@ func (r containerWithImageNameRenderer) Render(rpt report.Report, dct Decorator) imageNodeID := report.MakeContainerImageNodeID(imageNameWithoutVersion) c = propagateLatest(docker.ImageName, image, c) + c = propagateLatest(docker.ImageSize, image, c) + c = propagateLatest(docker.ImageVirtualSize, image, c) c = propagateLatest(docker.ImageLabelPrefix+"works.weave.role", image, c) c.Parents = c.Parents. Delete(report.ContainerImage). diff --git a/report/table.go b/report/table.go index e77c51ad0..4d84467bd 100644 --- a/report/table.go +++ b/report/table.go @@ -42,7 +42,7 @@ func (node Node) extractTable(template TableTemplate) (rows map[string]string, t if label, ok := template.FixedRows[key]; ok { rows[label] = value } - if strings.HasPrefix(key, template.Prefix) { + if len(template.Prefix) > 0 && strings.HasPrefix(key, template.Prefix) { label := key[len(template.Prefix):] rows[label] = value } @@ -85,8 +85,8 @@ func (t Table) Copy() Table { // FixedRow describes a row which is part of a TableTemplate and whose value is extracted // from a predetermined key type FixedRow struct { - Key string `json:"key"` Label string `json:"label"` + Key string `json:"key"` } // TableTemplate describes how to render a table for the UI.