data_center.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package topology
  2. import (
  3. "slices"
  4. "strings"
  5. "github.com/seaweedfs/seaweedfs/weed/pb/master_pb"
  6. )
  7. type DataCenter struct {
  8. NodeImpl
  9. }
  10. func NewDataCenter(id string) *DataCenter {
  11. dc := &DataCenter{}
  12. dc.id = NodeId(id)
  13. dc.nodeType = "DataCenter"
  14. dc.diskUsages = newDiskUsages()
  15. dc.children = make(map[NodeId]Node)
  16. dc.capacityReservations = newCapacityReservations()
  17. dc.NodeImpl.value = dc
  18. return dc
  19. }
  20. func (dc *DataCenter) GetOrCreateRack(rackName string) *Rack {
  21. dc.Lock()
  22. defer dc.Unlock()
  23. for _, c := range dc.children {
  24. rack := c.(*Rack)
  25. if string(rack.Id()) == rackName {
  26. return rack
  27. }
  28. }
  29. rack := NewRack(rackName)
  30. dc.doLinkChildNode(rack)
  31. return rack
  32. }
  33. type DataCenterInfo struct {
  34. Id NodeId `json:"Id"`
  35. Racks []RackInfo `json:"Racks"`
  36. }
  37. func (dc *DataCenter) ToInfo() (info DataCenterInfo) {
  38. info.Id = dc.Id()
  39. var racks []RackInfo
  40. for _, c := range dc.Children() {
  41. rack := c.(*Rack)
  42. racks = append(racks, rack.ToInfo())
  43. }
  44. slices.SortFunc(racks, func(a, b RackInfo) int {
  45. return strings.Compare(string(a.Id), string(b.Id))
  46. })
  47. info.Racks = racks
  48. return
  49. }
  50. func (dc *DataCenter) ToDataCenterInfo() *master_pb.DataCenterInfo {
  51. m := &master_pb.DataCenterInfo{
  52. Id: string(dc.Id()),
  53. DiskInfos: dc.diskUsages.ToDiskInfo(),
  54. }
  55. for _, c := range dc.Children() {
  56. rack := c.(*Rack)
  57. m.RackInfos = append(m.RackInfos, rack.ToRackInfo())
  58. }
  59. return m
  60. }