docker.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package widget
  2. import (
  3. "context"
  4. "golang.org/x/text/cases"
  5. "golang.org/x/text/language"
  6. "html/template"
  7. "time"
  8. "github.com/glanceapp/glance/internal/assets"
  9. "github.com/glanceapp/glance/internal/feed"
  10. )
  11. type containerData struct {
  12. Id string
  13. Image string
  14. URL string
  15. Title string
  16. Icon CustomIcon
  17. StatusShort string
  18. StatusFull string
  19. StatusStyle string
  20. }
  21. type Docker struct {
  22. widgetBase `yaml:",inline"`
  23. Containers []containerData `yaml:"-"`
  24. }
  25. func (widget *Docker) Initialize() error {
  26. widget.withTitle("Docker").withCacheDuration(1 * time.Minute)
  27. return nil
  28. }
  29. func (widget *Docker) Update(ctx context.Context) {
  30. containers, err := feed.FetchDockerContainers(ctx)
  31. if !widget.canContinueUpdateAfterHandlingErr(err) {
  32. return
  33. }
  34. var items []containerData
  35. for _, container := range containers {
  36. var item containerData
  37. item.Id = container.Id
  38. item.Image = container.Image
  39. item.URL = container.URL
  40. item.Title = container.Title
  41. _ = item.Icon.FromURL(container.IconURL)
  42. switch container.State {
  43. case "paused":
  44. case "starting":
  45. case "unhealthy":
  46. item.StatusStyle = "warning"
  47. break
  48. case "stopped":
  49. case "dead":
  50. case "exited":
  51. item.StatusStyle = "error"
  52. break
  53. default:
  54. item.StatusStyle = "success"
  55. }
  56. item.StatusFull = container.Status
  57. item.StatusShort = cases.Title(language.English, cases.Compact).String(container.State)
  58. items = append(items, item)
  59. }
  60. widget.Containers = items
  61. }
  62. func (widget *Docker) Render() template.HTML {
  63. return widget.render(widget, assets.DockerTemplate)
  64. }