// RunStatus contains all the necessary functionality for the OpenShift cli status command. func (o StatusOptions) RunStatus() error { var ( s string err error ) switch o.outputFormat { case "": s, err = o.describer.Describe(o.namespace, "") if err != nil { return err } case "dot": g, _, err := o.describer.MakeGraph(o.namespace) if err != nil { return err } data, err := dot.Marshal(g, dotutil.Quote(o.namespace), "", " ", false) if err != nil { return err } s = string(data) default: return fmt.Errorf("invalid output format provided: %s", o.outputFormat) } fmt.Fprintf(o.out, s) return nil }
// 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) }