Files
influx-cli/pkg/template/summary_printer.go
2021-07-02 10:19:51 -04:00

200 lines
6.1 KiB
Go

package template
import (
"fmt"
"io"
"time"
"github.com/influxdata/influx-cli/v2/api"
"github.com/influxdata/influx-cli/v2/pkg/influxid"
)
// PrintSummary renders high-level info about a template as a table for display on the console.
//
// NOTE: The implementation here is very "static" in that it's hard-coded to look for specific
// resource-kinds and fields within those kinds. If the API changes to add more kinds / more fields,
// this function won't automatically pick them up & print them. It'd be nice to rework this to be
// less opinionated / more resilient to extension in the future...
func PrintSummary(summary api.TemplateSummaryResources, out io.Writer, useColor bool, useBorders bool) error {
newPrinter := func(title string, headers []string) *TablePrinter {
return NewTablePrinter(out, useColor, useBorders).
Title(title).
SetHeaders(append([]string{"Package Name", "ID", "Resource Name"}, headers...)...)
}
if labels := summary.Labels; len(labels) > 0 {
printer := newPrinter("LABELS", []string{"Description", "Color"})
for _, l := range labels {
id := influxid.ID(l.Id).String()
var desc string
if l.Properties.Description != nil {
desc = *l.Properties.Description
}
printer.Append([]string{l.TemplateMetaName, id, l.Name, desc, l.Properties.Color})
}
printer.Render()
_, _ = out.Write([]byte("\n"))
}
if buckets := summary.Buckets; len(buckets) > 0 {
printer := newPrinter("BUCKETS", []string{"Retention", "Description", "Schema Type"})
for _, b := range buckets {
id := influxid.ID(b.Id).String()
var desc string
if b.Description != nil {
desc = *b.Description
}
rp := "inf"
if b.RetentionPeriod != 0 {
rp = time.Duration(b.RetentionPeriod).String()
}
schemaType := api.SCHEMATYPE_IMPLICIT
if b.SchemaType != nil {
schemaType = *b.SchemaType
}
printer.Append([]string{b.TemplateMetaName, id, b.Name, rp, desc, schemaType.String()})
}
printer.Render()
_, _ = out.Write([]byte("\n"))
}
if checks := summary.Checks; len(checks) > 0 {
printer := newPrinter("CHECKS", []string{"Description"})
for _, c := range checks {
id := influxid.ID(c.Id).String()
var desc string
if c.Description != nil {
desc = *c.Description
}
printer.Append([]string{c.TemplateMetaName, id, c.Name, desc})
}
printer.Render()
_, _ = out.Write([]byte("\n"))
}
if dashboards := summary.Dashboards; len(dashboards) > 0 {
printer := newPrinter("DASHBOARDS", []string{"Description"})
for _, d := range dashboards {
id := influxid.ID(d.Id).String()
var desc string
if d.Description != nil {
desc = *d.Description
}
printer.Append([]string{d.TemplateMetaName, id, d.Name, desc})
}
printer.Render()
_, _ = out.Write([]byte("\n"))
}
if endpoints := summary.NotificationEndpoints; len(endpoints) > 0 {
printer := newPrinter("NOTIFICATION ENDPOINTS", []string{"Description", "Status"})
for _, e := range endpoints {
id := influxid.ID(e.Id).String()
var desc string
if e.Description != nil {
desc = *e.Description
}
printer.Append([]string{e.TemplateMetaName, id, e.Name, desc, e.Status})
}
printer.Render()
_, _ = out.Write([]byte("\n"))
}
if rules := summary.NotificationRules; len(rules) > 0 {
printer := newPrinter("NOTIFICATION RULES", []string{"Description", "Every", "Offset", "Endpoint Name", "Endpoint ID", "Endpoint Type"})
for _, r := range rules {
id := influxid.ID(r.Id).String()
eid := influxid.ID(r.EndpointID).String()
var desc string
if r.Description != nil {
desc = *r.Description
}
printer.Append([]string{r.TemplateMetaName, id, r.Name, desc, r.Every, r.Offset, r.EndpointTemplateMetaName, eid, r.EndpointType})
}
printer.Render()
_, _ = out.Write([]byte("\n"))
}
if tasks := summary.Tasks; len(tasks) > 0 {
printer := newPrinter("TASKS", []string{"Description", "Cycle"})
for _, t := range tasks {
id := influxid.ID(t.Id).String()
var desc string
if t.Description != nil {
desc = *t.Description
}
var timing string
if t.Cron != nil {
timing = *t.Cron
} else {
offset := time.Duration(0).String()
if t.Offset != nil {
offset = *t.Offset
}
// If `cron` isn't set, `every` must be set
timing = fmt.Sprintf("every: %s offset: %s", *t.Every, offset)
}
printer.Append([]string{t.TemplateMetaName, id, t.Name, desc, timing})
}
printer.Render()
_, _ = out.Write([]byte("\n"))
}
if teles := summary.TelegrafConfigs; len(teles) > 0 {
printer := newPrinter("TELEGRAF CONFIGS", []string{"Description"})
for _, t := range teles {
var desc string
if t.TelegrafConfig.Description != nil {
desc = *t.TelegrafConfig.Description
}
printer.Append([]string{t.TemplateMetaName, t.TelegrafConfig.Id, t.TelegrafConfig.Name, desc})
}
printer.Render()
_, _ = out.Write([]byte("\n"))
}
if vars := summary.Variables; len(vars) > 0 {
printer := newPrinter("VARIABLES", []string{"Description", "Arg Type", "Arg Values"})
for _, v := range vars {
id := influxid.ID(v.Id).String()
var desc string
if v.Description != nil {
desc = *v.Description
}
var argType string
if v.Arguments != nil {
argType = v.Arguments.Type
}
printer.Append([]string{v.TemplateMetaName, id, v.Name, desc, argType, v.Arguments.Render()})
}
printer.Render()
_, _ = out.Write([]byte("\n"))
}
if mappings := summary.LabelMappings; len(mappings) > 0 {
printer := NewTablePrinter(out, useColor, useBorders).
Title("LABEL ASSOCIATIONS").
SetHeaders("Resource Type", "Resource Name", "Resource ID", "Label Name", "Label ID")
for _, m := range mappings {
rid := influxid.ID(m.ResourceID).String()
lid := influxid.ID(m.LabelID).String()
printer.Append([]string{m.ResourceType, m.ResourceName, rid, m.LabelName, lid})
}
printer.Render()
_, _ = out.Write([]byte("\n"))
}
if secrets := summary.MissingSecrets; len(secrets) > 0 {
printer := NewTablePrinter(out, useColor, useBorders).
Title("MISSING SECRETS").
SetHeaders("Secret Key")
for _, sk := range secrets {
printer.Append([]string{sk})
}
printer.Render()
_, _ = out.Write([]byte("\n"))
}
return nil
}