From 99aac1703048e1b93a8bd160242018d3e653550d Mon Sep 17 00:00:00 2001 From: Bradley Cicenas Date: Fri, 6 Jan 2017 19:46:30 +0000 Subject: [PATCH] init expanded view, add cpu histogram --- container.go | 10 ++++-- grid.go | 18 ++++++++++ widgets/compact.go | 4 +++ widgets/expanded.go | 80 +++++++++++++++++++++++++++++++++++++++++ widgets/expanded_cpu.go | 30 ++++++++++++++++ widgets/hist.go | 22 ++++++++++++ 6 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 widgets/expanded.go create mode 100644 widgets/expanded_cpu.go create mode 100644 widgets/hist.go diff --git a/container.go b/container.go index 024a68a..dc5fcfa 100644 --- a/container.go +++ b/container.go @@ -29,8 +29,15 @@ func NewContainer(c docker.APIContainers) *Container { } } -func (c *Container) Collect(client *docker.Client) { +func (c *Container) Expand() { + c.widgets = widgets.NewExpanded(c.id, c.name) +} +func (c *Container) Collapse() { + c.widgets = widgets.NewCompact(c.id, c.name) +} + +func (c *Container) Collect(client *docker.Client) { go func() { opts := docker.StatsOptions{ ID: c.id, @@ -49,5 +56,4 @@ func (c *Container) Collect(client *docker.Client) { c.widgets.SetNet(c.reader.NetRx, c.reader.NetTx) } }() - } diff --git a/grid.go b/grid.go index cba83ee..4c0f94b 100644 --- a/grid.go +++ b/grid.go @@ -115,8 +115,18 @@ func (g *Grid) OpenView(v View) { v(g) } +func (g *Grid) ExpandView() { + ResetView() + defer ResetView() + container := g.containerMap.Get(g.cursorID) + container.Expand() + container.widgets.Render() + container.Collapse() +} + func Display(g *Grid) bool { var newView View + var expand bool // calculate layout ui.Body.Align() @@ -129,6 +139,10 @@ func Display(g *Grid) bool { ui.Handle("/sys/kbd/", func(ui.Event) { g.cursorDown() }) + ui.Handle("/sys/kbd/", func(ui.Event) { + expand = true + ui.StopLoop() + }) ui.Handle("/sys/kbd/h", func(ui.Event) { newView = HelpMenu ui.StopLoop() @@ -157,5 +171,9 @@ func Display(g *Grid) bool { g.OpenView(newView) return false } + if expand { + g.ExpandView() + return false + } return true } diff --git a/widgets/compact.go b/widgets/compact.go index d90df92..aebdbb2 100644 --- a/widgets/compact.go +++ b/widgets/compact.go @@ -9,6 +9,7 @@ import ( type ContainerWidgets interface { Row() *ui.Row + Render() Highlight() UnHighlight() SetCPU(int) @@ -34,6 +35,9 @@ func NewCompact(id string, name string) *Compact { } } +func (w *Compact) Render() { +} + func (w *Compact) Row() *ui.Row { return ui.NewRow( ui.NewCol(2, 0, w.Name), diff --git a/widgets/expanded.go b/widgets/expanded.go new file mode 100644 index 0000000..d271ac5 --- /dev/null +++ b/widgets/expanded.go @@ -0,0 +1,80 @@ +package widgets + +import ( + "fmt" + + ui "github.com/gizak/termui" +) + +type Expanded struct { + Info *ui.Table + Net *ui.Par + Cpu *ExpandedCpu + Memory *ui.Gauge +} + +func NewExpanded(id, name string) *Expanded { + return &Expanded{ + Info: NewInfo(id, name), + Net: ui.NewPar("-"), + Cpu: NewExpandedCpu(), + Memory: mkGauge(), + } +} + +func NewInfo(id, name string) *ui.Table { + p := ui.NewTable() + p.Rows = [][]string{ + []string{"name", name}, + []string{"id", id}, + } + p.Height = 4 + p.Width = 40 + p.FgColor = ui.ColorWhite + p.Seperator = false + return p +} + +func (w *Expanded) Render() { + ui.Render(w.Info, w.Cpu) + ui.Handle("/timer/1s", func(ui.Event) { + ui.Render(w.Info, w.Cpu) + }) + ui.Handle("/sys/kbd/", func(ui.Event) { + ui.StopLoop() + }) + ui.Loop() +} + +func (w *Expanded) Row() *ui.Row { + return ui.NewRow( + ui.NewCol(2, 0, w.Cpu), + ui.NewCol(2, 0, w.Memory), + ui.NewCol(2, 0, w.Net), + ) +} + +func (w *Expanded) Highlight() { +} + +func (w *Expanded) UnHighlight() { +} + +func (w *Expanded) SetCPU(val int) { + w.Cpu.Update(val) +} + +func (w *Expanded) SetNet(rx int64, tx int64) { + w.Net.Text = fmt.Sprintf("%s / %s", byteFormat(rx), byteFormat(tx)) +} + +func (w *Expanded) SetMem(val int64, limit int64, percent int) { + w.Memory.Label = fmt.Sprintf("%s / %s", byteFormat(val), byteFormat(limit)) + if percent < 5 { + percent = 5 + w.Memory.BarColor = ui.ColorBlack + } else { + w.Memory.BarColor = ui.ColorGreen + } + w.Memory.Percent = percent +} diff --git a/widgets/expanded_cpu.go b/widgets/expanded_cpu.go new file mode 100644 index 0000000..0f6351e --- /dev/null +++ b/widgets/expanded_cpu.go @@ -0,0 +1,30 @@ +package widgets + +import ( + ui "github.com/gizak/termui" +) + +type ExpandedCpu struct { + *ui.BarChart + hist HistData +} + +func NewExpandedCpu() *ExpandedCpu { + cpu := &ExpandedCpu{ui.NewBarChart(), NewHistData(12)} + cpu.BorderLabel = "CPU Util" + cpu.Height = 10 + cpu.Width = 50 + cpu.BarColor = ui.ColorGreen + cpu.BarWidth = 3 + cpu.BarGap = 1 + cpu.X = 0 + cpu.Y = 4 + cpu.Data = cpu.hist.data + cpu.DataLabels = cpu.hist.labels + return cpu +} + +func (w *ExpandedCpu) Update(val int) { + w.hist.Append(val) + w.Data = w.hist.data +} diff --git a/widgets/hist.go b/widgets/hist.go new file mode 100644 index 0000000..c69f702 --- /dev/null +++ b/widgets/hist.go @@ -0,0 +1,22 @@ +package widgets + +type HistData struct { + data []int + labels []string + maxSize int +} + +func NewHistData(max int) HistData { + return HistData{ + data: make([]int, max), + labels: make([]string, max), + maxSize: max, + } +} + +func (h HistData) Append(val int) { + if len(h.data) >= h.maxSize { + h.data = append(h.data[:0], h.data[1:]...) + } + h.data = append(h.data, val) +}