func (c *statusHistoryCommand) Run(ctx *cmd.Context) error { apiclient, err := c.NewAPIClient() if err != nil { return errors.Trace(err) } defer apiclient.Close() kind := status.HistoryKind(c.outputContent) var delta *time.Duration if c.backlogSizeDays != 0 { t := time.Duration(c.backlogSizeDays*24) * time.Hour delta = &t } filterArgs := status.StatusHistoryFilter{ Size: c.backlogSize, Delta: delta, } if !c.date.IsZero() { filterArgs.Date = &c.date } var tag names.Tag switch kind { case status.KindUnit, status.KindWorkload, status.KindUnitAgent: if !names.IsValidUnit(c.entityName) { return errors.Errorf("%q is not a valid name for a %s", c.entityName, kind) } tag = names.NewUnitTag(c.entityName) default: if !names.IsValidMachine(c.entityName) { return errors.Errorf("%q is not a valid name for a %s", c.entityName, kind) } tag = names.NewMachineTag(c.entityName) } statuses, err := apiclient.StatusHistory(kind, tag, filterArgs) historyLen := len(statuses) if err != nil { if historyLen == 0 { return errors.Trace(err) } // Display any error, but continue to print status if some was returned fmt.Fprintf(ctx.Stderr, "%v\n", err) } if historyLen == 0 { return errors.Errorf("no status history available") } table := [][]string{{"TIME", "TYPE", "STATUS", "MESSAGE"}} lengths := []int{1, 1, 1, 1} statuses = statuses.SquashLogs(1) statuses = statuses.SquashLogs(2) statuses = statuses.SquashLogs(3) for _, v := range statuses { fields := []string{common.FormatTime(v.Since, c.isoTime), string(v.Kind), string(v.Status), v.Info} for k, v := range fields { if len(v) > lengths[k] { lengths[k] = len(v) } } table = append(table, fields) } f := fmt.Sprintf("%%-%ds\t%%-%ds\t%%-%ds\t%%-%ds\n", lengths[0], lengths[1], lengths[2], lengths[3]) for _, v := range table { fmt.Printf(f, v[0], v[1], v[2], v[3]) } return nil }