networks.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package views
  2. import (
  3. "fmt"
  4. "time"
  5. "fyne.io/fyne/v2"
  6. "fyne.io/fyne/v2/container"
  7. "fyne.io/fyne/v2/layout"
  8. "fyne.io/fyne/v2/theme"
  9. "fyne.io/fyne/v2/widget"
  10. "github.com/gravitl/netmaker/netclient/config"
  11. "github.com/gravitl/netmaker/netclient/functions"
  12. "github.com/gravitl/netmaker/netclient/gui/components"
  13. "github.com/gravitl/netmaker/netclient/ncutils"
  14. )
  15. var currentNetwork *string
  16. // GetNetworksView - displays the view of all networks
  17. func GetNetworksView(networks []string) fyne.CanvasObject {
  18. // renders := []fyne.CanvasObject{}
  19. if networks == nil || len(networks) == 0 {
  20. return container.NewCenter(widget.NewLabel("No networks present"))
  21. }
  22. grid := container.New(layout.NewGridLayout(4),
  23. container.NewCenter(widget.NewLabel("Network Name")),
  24. container.NewCenter(widget.NewLabel("Node Info")),
  25. container.NewCenter(widget.NewLabel("Pull Latest")),
  26. container.NewCenter(widget.NewLabel("Leave network")),
  27. )
  28. for i := range networks {
  29. network := &networks[i]
  30. grid.AddObject(
  31. container.NewCenter(widget.NewLabel(*network)),
  32. )
  33. grid.AddObject(
  34. components.ColoredIconButton("info", theme.InfoIcon(), func() {
  35. RefreshComponent(NetDetails, GetSingleNetworkView(*network))
  36. ShowView(NetDetails)
  37. }, components.Gold_color),
  38. )
  39. grid.AddObject(
  40. components.ColoredIconButton("pull", theme.DownloadIcon(), func() {
  41. // TODO call pull with network name
  42. pull(*network)
  43. }, components.Blue_color),
  44. )
  45. grid.AddObject(
  46. components.ColoredIconButton("leave", theme.DeleteIcon(), func() {
  47. leave(*network)
  48. }, components.Danger_color),
  49. )
  50. // renders = append(renders, container.NewCenter(netToolbar))
  51. }
  52. return container.NewCenter(grid)
  53. }
  54. const fakeData = `{"networks":[{"name":"devops","node_id":"5aeb3e18-1236-46d8-8415-8699bfe5d44e","current_node":{"name":"ingress","interface":"nm-devops","private_ipv4":"10.10.10.1","public_endpoint":"167.71.106.39"},"peers":[{"public_key":"QlLJlQKy6C7XirHdnkXiMcCSCed2ieDt6qL3DSzjSxo=","public_endpoint":"167.71.100.69:51821","addresses":[{"cidr":"10.10.10.3/32","ip":"10.10.10.3"},{"cidr":"10.10.10.0/24","ip":"10.10.10.0"}]},{"public_key":"WnU5t2Rl9kD7lzASe8nH7VyS+jhTLUCigMJKKt+UrnU=","public_endpoint":"167.71.98.164:51821","addresses":[{"cidr":"10.10.10.2/32","ip":"10.10.10.2"},{"cidr":"165.227.116.94/32","ip":"165.227.116.94"}]},{"public_key":"rRI9qNHIiSQsIyZgGBvyZML98bZ6z8iZYfZLWPSZJ1k=","public_endpoint":"167.71.100.25:51821","addresses":[{"cidr":"10.10.10.5/32","ip":"10.10.10.5"}]},{"public_key":"R7JoXHCj9q/yXizr9q7p3xW5dxAX+l6Hg17k/98T0GI=","public_endpoint":"167.71.164.7:51821","addresses":[{"cidr":"10.10.10.254/32","ip":"10.10.10.254"}]},{"public_key":"M5gwhvr1Qrg55gGrPrkd3NbLJoDqTsjiEPvvf1yyaiQ=","public_endpoint":"\u003cnil\u003e","addresses":[{"cidr":"10.10.10.6/32","ip":"10.10.10.6"}]}]}]}`
  55. // GetSingleNetworkView - returns details and option to pull a network
  56. func GetSingleNetworkView(network string) fyne.CanvasObject {
  57. if network == "" || len(network) == 0 {
  58. return container.NewCenter(widget.NewLabel("No valid network selected"))
  59. }
  60. // == read node values ==
  61. var nodecfg config.ClientConfig
  62. nodecfg.Network = network
  63. nodecfg.ReadConfig()
  64. nodeID := nodecfg.Node.ID
  65. lastCheckInTime := time.Unix(nodecfg.Node.LastCheckIn, 0)
  66. lastCheckIn := lastCheckInTime.Format("2006-01-02 15:04:05")
  67. privateAddr := nodecfg.Node.Address
  68. privateAddr6 := nodecfg.Node.Address6
  69. endpoint := nodecfg.Node.Endpoint
  70. health := " (HEALTHY)"
  71. if time.Now().After(lastCheckInTime.Add(time.Minute * 5)) {
  72. health = " (WARNING)"
  73. } else if time.Now().After(lastCheckInTime.Add(time.Minute * 30)) {
  74. health = " (ERROR)"
  75. }
  76. lastCheckIn += health
  77. version := nodecfg.Node.Version
  78. pullBtn := components.ColoredButton("pull "+network, func() { pull(network) }, components.Blue_color)
  79. pullBtn.Resize(fyne.NewSize(pullBtn.Size().Width, 50))
  80. LoadingNotify()
  81. netDetailsView := container.NewCenter(
  82. // components.ColoredText("Selected "+network, components.Orange_color),
  83. container.NewGridWithColumns(1, widget.NewRichTextFromMarkdown(fmt.Sprintf(`### %s
  84. - ID: %s
  85. - Last Check In: %s
  86. - Endpoint: %s
  87. - Address (IPv4): %s
  88. - Address6 (IPv6): %s
  89. - Version: %s
  90. `, network, nodeID, lastCheckIn, endpoint, privateAddr, privateAddr6, version)),
  91. container.NewCenter(pullBtn),
  92. ))
  93. ClearNotification()
  94. return netDetailsView
  95. }
  96. // == private ==
  97. func pull(network string) {
  98. LoadingNotify()
  99. _, err := functions.Pull(network, true)
  100. if err != nil {
  101. ErrorNotify("Failed to pull " + network + " : " + err.Error())
  102. } else {
  103. SuccessNotify("Pulled " + network + "!")
  104. }
  105. }
  106. func leave(network string) {
  107. confirmView := GetConfirmation("Confirm leaving "+network+"?", func() {
  108. ShowView(Networks)
  109. }, func() {
  110. LoadingNotify()
  111. err := functions.LeaveNetwork(network, true)
  112. if err != nil {
  113. ErrorNotify("Failed to leave " + network + " : " + err.Error())
  114. } else {
  115. SuccessNotify("Left " + network)
  116. }
  117. networks, err := ncutils.GetSystemNetworks()
  118. if err != nil {
  119. networks = []string{}
  120. ErrorNotify("Failed to read local networks!")
  121. }
  122. RefreshComponent(Networks, GetNetworksView(networks))
  123. ShowView(Networks)
  124. })
  125. RefreshComponent(Confirm, confirmView)
  126. ShowView(Confirm)
  127. }