From f102e48cc91f825bef6dcec8350230b498c42851 Mon Sep 17 00:00:00 2001 From: Bradley Cicenas Date: Mon, 6 Mar 2017 08:25:59 +0000 Subject: [PATCH] add WidgetUpdater interface to container, replace struct fields with metamap --- container.go | 41 ++++++++++++++++++++-------------------- cwidgets/compact/main.go | 9 +++++++++ cwidgets/main.go | 15 ++++----------- debug.go | 4 +++- dockersource.go | 4 ++-- grid.go | 2 -- mocksource.go | 2 +- sort.go | 13 ++++++++----- 8 files changed, 48 insertions(+), 42 deletions(-) diff --git a/container.go b/container.go index 57b37e9..cf7677e 100644 --- a/container.go +++ b/container.go @@ -1,6 +1,7 @@ package main import ( + "github.com/bcicen/ctop/cwidgets" "github.com/bcicen/ctop/cwidgets/compact" "github.com/bcicen/ctop/metrics" ) @@ -9,25 +10,36 @@ import ( type Container struct { metrics.Metrics Id string - Name string - State string Meta map[string]string - Updates chan [2]string Widgets *compact.Compact + updater cwidgets.WidgetUpdater collector metrics.Collector } func NewContainer(id string, collector metrics.Collector) *Container { + widgets := compact.NewCompact(id) return &Container{ Metrics: metrics.NewMetrics(), Id: id, Meta: make(map[string]string), - Updates: make(chan [2]string), - Widgets: compact.NewCompact(id), + Widgets: widgets, + updater: widgets, collector: collector, } } +func (c *Container) SetUpdater(u cwidgets.WidgetUpdater) { + c.updater = u + for k, v := range c.Meta { + c.updater.SetMeta(k, v) + } +} + +func (c *Container) SetMeta(k, v string) { + c.Meta[k] = v + c.updater.SetMeta(k, v) +} + func (c *Container) GetMeta(k string) string { if v, ok := c.Meta[k]; ok { return v @@ -35,26 +47,15 @@ func (c *Container) GetMeta(k string) string { return "" } -func (c *Container) SetMeta(k, v string) { - c.Meta[k] = v - c.Updates <- [2]string{k, v} -} - -func (c *Container) SetName(n string) { - c.Name = n - c.Widgets.Name.Set(n) -} - func (c *Container) SetState(s string) { - c.State = s - c.Widgets.Status.Set(s) + c.SetMeta("state", s) // start collector, if needed - if c.State == "running" && !c.collector.Running() { + if s == "running" && !c.collector.Running() { c.collector.Start() c.Read(c.collector.Stream()) } // stop collector, if needed - if c.State != "running" && c.collector.Running() { + if s != "running" && c.collector.Running() { c.collector.Stop() } } @@ -64,7 +65,7 @@ func (c *Container) Read(stream chan metrics.Metrics) { go func() { for metrics := range stream { c.Metrics = metrics - c.Widgets.SetMetrics(metrics) + c.updater.SetMetrics(metrics) } log.Infof("reader stopped for container: %s", c.Id) c.Metrics = metrics.NewMetrics() diff --git a/cwidgets/compact/main.go b/cwidgets/compact/main.go index 665bbb8..b979040 100644 --- a/cwidgets/compact/main.go +++ b/cwidgets/compact/main.go @@ -46,6 +46,15 @@ func NewCompact(id string) *Compact { //} //} +func (row *Compact) SetMeta(k, v string) { + switch k { + case "name": + row.Name.Set(v) + case "state": + row.Status.Set(v) + } +} + func (row *Compact) SetMetrics(m metrics.Metrics) { row.SetCPU(m.CPUUtil) row.SetNet(m.NetRx, m.NetTx) diff --git a/cwidgets/main.go b/cwidgets/main.go index 5bf9481..8ccafc7 100644 --- a/cwidgets/main.go +++ b/cwidgets/main.go @@ -2,19 +2,12 @@ package cwidgets import ( "github.com/bcicen/ctop/logging" - ui "github.com/gizak/termui" + "github.com/bcicen/ctop/metrics" ) var log = logging.Init() -type ContainerWidgets interface { - Buffer() ui.Buffer - Highlight() - UnHighlight() - SetY(int) - SetWidth(int) - SetStatus(string) - SetCPU(int) - SetNet(int64, int64) - SetMem(int64, int64, int) +type WidgetUpdater interface { + SetMeta(string, string) + SetMetrics(metrics.Metrics) } diff --git a/debug.go b/debug.go index 9faf3dc..e3a6ab3 100644 --- a/debug.go +++ b/debug.go @@ -21,7 +21,9 @@ func logEvent(e ui.Event) { // log container, metrics, and widget state func dumpContainer(c *Container) { msg := fmt.Sprintf("logging state for container: %s\n", c.Id) - msg += fmt.Sprintf("Id = %s\nname = %s\nstate = %s\n", c.Id, c.Name, c.State) + for k, v := range c.Meta { + msg += fmt.Sprintf("Meta.%s = %s\n", k, v) + } msg += inspect(&c.Metrics) log.Infof(msg) } diff --git a/dockersource.go b/dockersource.go index d270f54..9ebcb37 100644 --- a/dockersource.go +++ b/dockersource.go @@ -65,7 +65,7 @@ func (cm *DockerContainerSource) refresh(c *Container) { cm.delByID(c.Id) return } - c.SetName(shortName(insp.Name)) + c.SetMeta("name", shortName(insp.Name)) c.SetState(insp.State.Status) } @@ -89,7 +89,7 @@ func (cm *DockerContainerSource) refreshAll() { for _, i := range allContainers { c := cm.MustGet(i.ID) - c.SetName(shortName(i.Names[0])) + c.SetMeta("name", shortName(i.Names[0])) c.SetState(i.State) cm.needsRefresh <- c.Id } diff --git a/grid.go b/grid.go index 7d61dab..23c6c88 100644 --- a/grid.go +++ b/grid.go @@ -1,8 +1,6 @@ package main import ( - "fmt" - "github.com/bcicen/ctop/config" ui "github.com/gizak/termui" ) diff --git a/mocksource.go b/mocksource.go index 6b4e28e..10a38c3 100644 --- a/mocksource.go +++ b/mocksource.go @@ -31,7 +31,7 @@ func (cs *MockContainerSource) Init() { time.Sleep(1 * time.Second) collector := metrics.NewMock() c := NewContainer(makeID(), collector) - c.SetName(makeName()) + c.SetMeta("name", makeName()) c.SetState(makeState()) cs.containers = append(cs.containers, c) } diff --git a/sort.go b/sort.go index 2a67328..d618d1b 100644 --- a/sort.go +++ b/sort.go @@ -14,10 +14,11 @@ var stateMap = map[string]int{ "paused": 2, "exited": 1, "created": 0, + "": 0, } var idSorter = func(c1, c2 *Container) bool { return c1.Id < c2.Id } -var nameSorter = func(c1, c2 *Container) bool { return c1.Name < c2.Name } +var nameSorter = func(c1, c2 *Container) bool { return c1.GetMeta("name") < c2.GetMeta("name") } var Sorters = map[string]sortMethod{ "id": idSorter, @@ -54,10 +55,12 @@ var Sorters = map[string]sortMethod{ }, "state": func(c1, c2 *Container) bool { // Use secondary sort method if equal values - if c1.State == c2.State { + c1state := c1.GetMeta("state") + c2state := c2.GetMeta("state") + if c1state == c2state { return nameSorter(c1, c2) } - return stateMap[c1.State] > stateMap[c2.State] + return stateMap[c1state] > stateMap[c2state] }, } @@ -86,11 +89,11 @@ func (a Containers) Filter() (filtered []*Container) { for _, c := range a { // Apply name filter - if re.FindAllString(c.Name, 1) == nil { + if re.FindAllString(c.GetMeta("name"), 1) == nil { continue } // Apply state filter - if !config.GetSwitchVal("allContainers") && c.State != "running" { + if !config.GetSwitchVal("allContainers") && c.GetMeta("state") != "running" { continue } filtered = append(filtered, c)