diff --git a/cmd/chronograf-migrator/main.go b/cmd/chronograf-migrator/main.go index 97168a7497..001e7ea154 100644 --- a/cmd/chronograf-migrator/main.go +++ b/cmd/chronograf-migrator/main.go @@ -48,7 +48,7 @@ func exec(dbPath, out string) error { return err } - pkg.Objects = append(pkg.Objects, pkger.DashboardToObject(d2, d2.Name)) + pkg.Objects = append(pkg.Objects, pkger.DashboardToObject(d2.Name, d2)) for _, v := range vs { name := strings.ToLower(v.Name) diff --git a/cmd/influx/pkg.go b/cmd/influx/pkg.go index b1f28a8184..df18ac51ed 100644 --- a/cmd/influx/pkg.go +++ b/cmd/influx/pkg.go @@ -791,18 +791,30 @@ func (b *cmdPkgBuilder) printPkgDiff(diff pkger.Diff) error { printer.Render() } - tablePrintFn := b.tablePrinterGen() if dashes := diff.Dashboards; len(dashes) > 0 { - headers := []string{"New", "Name", "Description", "Num Charts"} - tablePrintFn("DASHBOARDS", headers, len(dashes), func(i int) []string { - d := dashes[i] - return []string{ - boolDiff(true), - d.Name, - green(d.Desc), - green(strconv.Itoa(len(d.Charts))), + printer := diffPrinterGen("Dashboards", []string{"Description", "Num Charts"}) + + appendValues := func(id pkger.SafeID, pkgName string, v pkger.DiffDashboardValues) []string { + return []string{pkgName, id.String(), v.Name, v.Desc, strconv.Itoa(len(v.Charts))} + } + + for _, d := range dashes { + var oldRow []string + if d.Old != nil { + oldRow = appendValues(d.ID, d.PkgName, *d.Old) } - }) + + newRow := appendValues(d.ID, d.PkgName, d.New) + switch { + case d.IsNew(): + printer.AppendDiff(nil, newRow) + case d.Remove: + printer.AppendDiff(oldRow, nil) + default: + printer.AppendDiff(oldRow, newRow) + } + } + printer.Render() } if endpoints := diff.NotificationEndpoints; len(endpoints) > 0 { @@ -873,6 +885,7 @@ func (b *cmdPkgBuilder) printPkgDiff(diff pkger.Diff) error { printer.Render() } + tablePrintFn := b.tablePrinterGen() if teles := diff.Telegrafs; len(teles) > 0 { headers := []string{"New", "Name", "Description"} tablePrintFn("TELEGRAF CONFIGS", headers, len(teles), func(i int) []string { diff --git a/pkger/clone_resource.go b/pkger/clone_resource.go index c71de115c1..90df90ae11 100644 --- a/pkger/clone_resource.go +++ b/pkger/clone_resource.go @@ -217,7 +217,7 @@ func (ex *resourceExporter) resourceCloneToKind(ctx context.Context, r ResourceT if err != nil { return err } - mapResource(dash.OrganizationID, dash.ID, KindDashboard, DashboardToObject(*dash, r.Name)) + mapResource(dash.OrganizationID, dash.ID, KindDashboard, DashboardToObject(r.Name, *dash)) case r.Kind.is(KindLabel): l, err := ex.labelSVC.FindLabelByID(ctx, r.ID) if err != nil { @@ -761,7 +761,7 @@ func convertQueries(iQueries []influxdb.DashboardQuery) queries { } // DashboardToObject converts an influxdb.Dashboard to an Object. -func DashboardToObject(dash influxdb.Dashboard, name string) Object { +func DashboardToObject(name string, dash influxdb.Dashboard) Object { if name == "" { name = dash.Name } diff --git a/pkger/models.go b/pkger/models.go index b9ea96e4a9..e577965b53 100644 --- a/pkger/models.go +++ b/pkger/models.go @@ -275,30 +275,76 @@ func (d DiffCheck) IsNew() bool { return d.Old == nil } -// DiffDashboard is a diff of an individual dashboard. This resource is always new. -type DiffDashboard struct { +// DiffDashboardValues are values for a dashboard. +type DiffDashboardValues struct { Name string `json:"name"` Desc string `json:"description"` Charts []DiffChart `json:"charts"` } +// DiffDashboard is a diff of an individual dashboard. +type DiffDashboard struct { + ID SafeID `json:"id"` + Remove bool `json:"remove"` + PkgName string `json:"pkgName"` + New DiffDashboardValues `json:"new"` + Old *DiffDashboardValues `json:"old"` +} + func newDiffDashboard(d *dashboard) DiffDashboard { diff := DiffDashboard{ - Name: d.Name(), - Desc: d.Description, + ID: SafeID(d.ID()), + PkgName: d.PkgName(), + New: DiffDashboardValues{ + Name: d.Name(), + Desc: d.Description, + Charts: make([]DiffChart, 0, len(d.Charts)), + }, } for _, c := range d.Charts { - diff.Charts = append(diff.Charts, DiffChart{ + diff.New.Charts = append(diff.New.Charts, DiffChart{ Properties: c.properties(), Height: c.Height, Width: c.Width, }) } + if !d.Exists() { + return diff + } + + oldDiff := DiffDashboardValues{ + Name: d.existing.Name, + Desc: d.existing.Description, + Charts: make([]DiffChart, 0, len(d.existing.Cells)), + } + + for _, c := range d.existing.Cells { + var props influxdb.ViewProperties + if c.View != nil { + props = c.View.Properties + } + + oldDiff.Charts = append(oldDiff.Charts, DiffChart{ + Properties: props, + XPosition: int(c.X), + YPosition: int(c.Y), + Height: int(c.H), + Width: int(c.W), + }) + } + + diff.Old = &oldDiff + return diff } +// IsNew indicates whether the pkg dashboard is new to the platform. +func (d DiffDashboard) IsNew() bool { + return d.Old != nil +} + // DiffChart is a diff of oa chart. Since all charts are new right now. // the SummaryChart is reused here. type DiffChart SummaryChart @@ -2317,6 +2363,8 @@ type dashboard struct { Charts []chart labels sortedLabels + + existing *influxdb.Dashboard } func (d *dashboard) ID() influxdb.ID { @@ -2332,7 +2380,7 @@ func (d *dashboard) ResourceType() influxdb.ResourceType { } func (d *dashboard) Exists() bool { - return false + return d.existing != nil } func (d *dashboard) summarize() SummaryDashboard {