// Describe returns the output of the graph starting from the provided // image stream tag (name:tag) in namespace. Namespace is needed here // because image stream tags with the same name can be found across // different namespaces. func (d *ChainDescriber) Describe(ist *imageapi.ImageStreamTag, includeInputImages bool) (string, error) { g, err := d.MakeGraph() if err != nil { return "", err } // Retrieve the imageStreamTag node of interest istNode := g.Find(imagegraph.ImageStreamTagNodeName(ist)) if istNode == nil { return "", NotFoundErr(fmt.Sprintf("%q", ist.Name)) } buildInputEdgeKinds := []string{buildedges.BuildTriggerImageEdgeKind} if includeInputImages { buildInputEdgeKinds = append(buildInputEdgeKinds, buildedges.BuildInputImageEdgeKind) } // Partition down to the subgraph containing the ist of interest partitioned := partition(g, istNode, buildInputEdgeKinds) switch strings.ToLower(d.outputFormat) { case "dot": data, err := dot.Marshal(partitioned, fmt.Sprintf("%q", ist.Name), "", " ", false) if err != nil { return "", err } return string(data), nil case "": return d.humanReadableOutput(partitioned, istNode), nil } return "", fmt.Errorf("unknown specified format %q", d.outputFormat) }
// Describe returns the output of the graph starting from the provided // image stream tag (name:tag) in namespace. Namespace is needed here // because image stream tags with the same name can be found across // different namespaces. func (d *ChainDescriber) Describe(ist *imageapi.ImageStreamTag, includeInputImages, reverse bool) (string, error) { g, err := d.MakeGraph() if err != nil { return "", err } // Retrieve the imageStreamTag node of interest istNode := g.Find(imagegraph.ImageStreamTagNodeName(ist)) if istNode == nil { return "", NotFoundErr(fmt.Sprintf("%q", ist.Name)) } markers := buildanalysis.FindCircularBuilds(g, d.namer) if len(markers) > 0 { for _, marker := range markers { if strings.Contains(marker.Message, ist.Name) { return marker.Message, nil } } } buildInputEdgeKinds := []string{buildedges.BuildTriggerImageEdgeKind} if includeInputImages { buildInputEdgeKinds = append(buildInputEdgeKinds, buildedges.BuildInputImageEdgeKind) } // Partition down to the subgraph containing the imagestreamtag of interest var partitioned osgraph.Graph if reverse { partitioned = partitionReverse(g, istNode, buildInputEdgeKinds) } else { partitioned = partition(g, istNode, buildInputEdgeKinds) } switch strings.ToLower(d.outputFormat) { case "dot": data, err := dot.Marshal(partitioned, dotutil.Quote(ist.Name), "", " ", false) if err != nil { return "", err } return string(data), nil case "": return d.humanReadableOutput(partitioned, d.namer, istNode, reverse), nil } return "", fmt.Errorf("unknown specified format %q", d.outputFormat) }