ctop/container/main.go

165 lines
3.5 KiB
Go
Raw Normal View History

package container
2016-12-22 17:15:22 +01:00
import (
"github.com/bcicen/ctop/connector/collector"
2017-11-22 15:27:38 +01:00
"github.com/bcicen/ctop/connector/manager"
"github.com/bcicen/ctop/cwidgets"
"github.com/bcicen/ctop/cwidgets/compact"
"github.com/bcicen/ctop/logging"
2017-06-27 17:46:03 +02:00
"github.com/bcicen/ctop/models"
2016-12-22 17:15:22 +01:00
)
var (
log = logging.Init()
)
const (
running = "running"
)
2017-03-03 08:57:26 +01:00
// Metrics and metadata representing a container
type Container struct {
2017-06-27 17:46:03 +02:00
models.Metrics
2017-03-03 08:57:26 +01:00
Id string
Meta models.Meta
2019-07-06 01:05:21 +02:00
Widgets *compact.CompactRow
Display bool // display this container in compact view
updater cwidgets.WidgetUpdater
collector collector.Collector
2017-11-20 12:09:36 +01:00
manager manager.Manager
}
2017-11-20 12:09:36 +01:00
func New(id string, collector collector.Collector, manager manager.Manager) *Container {
2019-07-06 01:05:21 +02:00
widgets := compact.NewCompactRow()
shortID := id
if len(shortID) > 12 {
shortID = shortID[0:12]
}
2017-03-03 08:57:26 +01:00
return &Container{
2017-06-27 17:46:03 +02:00
Metrics: models.NewMetrics(),
2017-03-03 08:57:26 +01:00
Id: id,
Meta: models.NewMeta("id", shortID),
Widgets: widgets,
updater: widgets,
2017-03-03 08:57:26 +01:00
collector: collector,
2017-11-20 12:09:36 +01:00
manager: manager,
}
}
2020-01-03 00:02:53 +01:00
func (c *Container) RecreateWidgets() {
c.SetUpdater(cwidgets.NullWidgetUpdater{})
c.Widgets = compact.NewCompactRow()
c.SetUpdater(c.Widgets)
}
func (c *Container) SetUpdater(u cwidgets.WidgetUpdater) {
c.updater = u
c.updater.SetMeta(c.Meta)
}
2017-03-03 08:57:26 +01:00
func (c *Container) SetMeta(k, v string) {
c.Meta[k] = v
c.updater.SetMeta(c.Meta)
}
func (c *Container) GetMeta(k string) string {
return c.Meta.Get(k)
}
2017-02-04 00:33:13 +01:00
func (c *Container) SetState(s string) {
c.SetMeta("state", s)
2017-03-03 08:57:26 +01:00
// start collector, if needed
if s == running && !c.collector.Running() {
2017-03-03 08:57:26 +01:00
c.collector.Start()
c.Read(c.collector.Stream())
}
// stop collector, if needed
if s != running && c.collector.Running() {
2017-03-03 08:57:26 +01:00
c.collector.Stop()
}
2017-02-24 10:10:14 +01:00
}
// Logs returns container log collector
func (c *Container) Logs() collector.LogCollector {
return c.collector.Logs()
}
// Read metric stream, updating widgets
2017-06-27 17:46:03 +02:00
func (c *Container) Read(stream chan models.Metrics) {
go func() {
for metrics := range stream {
2017-03-03 08:57:26 +01:00
c.Metrics = metrics
c.updater.SetMetrics(metrics)
}
2017-03-03 08:57:26 +01:00
log.Infof("reader stopped for container: %s", c.Id)
2017-06-27 17:46:03 +02:00
c.Metrics = models.NewMetrics()
2017-03-03 08:57:26 +01:00
c.Widgets.Reset()
}()
2017-03-03 08:57:26 +01:00
log.Infof("reader started for container: %s", c.Id)
}
2017-11-20 12:09:36 +01:00
func (c *Container) Start() {
if c.Meta["state"] != running {
2017-11-20 12:09:36 +01:00
if err := c.manager.Start(); err != nil {
log.Warningf("container %s: %v", c.Id, err)
log.StatusErr(err)
2017-11-20 12:09:36 +01:00
return
}
c.SetState(running)
2017-11-20 12:09:36 +01:00
}
}
func (c *Container) Stop() {
if c.Meta["state"] == running {
2017-11-20 12:09:36 +01:00
if err := c.manager.Stop(); err != nil {
log.Warningf("container %s: %v", c.Id, err)
log.StatusErr(err)
2017-11-20 12:09:36 +01:00
return
}
c.SetState("exited")
}
}
func (c *Container) Remove() {
if err := c.manager.Remove(); err != nil {
log.Warningf("container %s: %v", c.Id, err)
log.StatusErr(err)
2017-11-20 12:09:36 +01:00
}
}
func (c *Container) Pause() {
if c.Meta["state"] == running {
if err := c.manager.Pause(); err != nil {
log.Warningf("container %s: %v", c.Id, err)
log.StatusErr(err)
return
}
c.SetState("paused")
}
}
func (c *Container) Unpause() {
if c.Meta["state"] == "paused" {
if err := c.manager.Unpause(); err != nil {
log.Warningf("container %s: %v", c.Id, err)
log.StatusErr(err)
return
}
c.SetState(running)
}
}
func (c *Container) Restart() {
if c.Meta["state"] == running {
if err := c.manager.Restart(); err != nil {
log.Warningf("container %s: %v", c.Id, err)
log.StatusErr(err)
return
}
}
}
2018-10-13 07:33:53 +02:00
func (c *Container) Exec(cmd []string) error {
return c.manager.Exec(cmd)
}