aboutsummaryrefslogtreecommitdiff
path: root/weed/topology/topology_info.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/topology/topology_info.go')
-rw-r--r--weed/topology/topology_info.go105
1 files changed, 105 insertions, 0 deletions
diff --git a/weed/topology/topology_info.go b/weed/topology/topology_info.go
new file mode 100644
index 000000000..21ce77edf
--- /dev/null
+++ b/weed/topology/topology_info.go
@@ -0,0 +1,105 @@
+package topology
+
+import (
+ "github.com/chrislusf/seaweedfs/weed/pb/master_pb"
+ "golang.org/x/exp/slices"
+)
+
+type TopologyInfo struct {
+ Max int64 `json:"Max"`
+ Free int64 `json:"Free"`
+ DataCenters []DataCenterInfo `json:"DataCenters"`
+ Layouts []VolumeLayoutInfo `json:"Layouts"`
+}
+
+func (t *Topology) ToInfo() (info TopologyInfo) {
+ info.Max = t.diskUsages.GetMaxVolumeCount()
+ info.Free = t.diskUsages.FreeSpace()
+ var dcs []DataCenterInfo
+ for _, c := range t.Children() {
+ dc := c.(*DataCenter)
+ dcs = append(dcs, dc.ToInfo())
+ }
+
+ slices.SortFunc(dcs, func(a, b DataCenterInfo) bool {
+ return a.Id < b.Id
+ })
+
+ info.DataCenters = dcs
+ var layouts []VolumeLayoutInfo
+ for _, col := range t.collectionMap.Items() {
+ c := col.(*Collection)
+ for _, layout := range c.storageType2VolumeLayout.Items() {
+ if layout != nil {
+ tmp := layout.(*VolumeLayout).ToInfo()
+ tmp.Collection = c.Name
+ layouts = append(layouts, tmp)
+ }
+ }
+ }
+ info.Layouts = layouts
+ return
+}
+
+func (t *Topology) ToVolumeMap() interface{} {
+ m := make(map[string]interface{})
+ m["Max"] = t.diskUsages.GetMaxVolumeCount()
+ m["Free"] = t.diskUsages.FreeSpace()
+ dcs := make(map[NodeId]interface{})
+ for _, c := range t.Children() {
+ dc := c.(*DataCenter)
+ racks := make(map[NodeId]interface{})
+ for _, r := range dc.Children() {
+ rack := r.(*Rack)
+ dataNodes := make(map[NodeId]interface{})
+ for _, d := range rack.Children() {
+ dn := d.(*DataNode)
+ var volumes []interface{}
+ for _, v := range dn.GetVolumes() {
+ volumes = append(volumes, v)
+ }
+ dataNodes[d.Id()] = volumes
+ }
+ racks[r.Id()] = dataNodes
+ }
+ dcs[dc.Id()] = racks
+ }
+ m["DataCenters"] = dcs
+ return m
+}
+
+func (t *Topology) ToVolumeLocations() (volumeLocations []*master_pb.VolumeLocation) {
+ for _, c := range t.Children() {
+ dc := c.(*DataCenter)
+ for _, r := range dc.Children() {
+ rack := r.(*Rack)
+ for _, d := range rack.Children() {
+ dn := d.(*DataNode)
+ volumeLocation := &master_pb.VolumeLocation{
+ Url: dn.Url(),
+ PublicUrl: dn.PublicUrl,
+ }
+ for _, v := range dn.GetVolumes() {
+ volumeLocation.NewVids = append(volumeLocation.NewVids, uint32(v.Id))
+ }
+ for _, s := range dn.GetEcShards() {
+ volumeLocation.NewVids = append(volumeLocation.NewVids, uint32(s.VolumeId))
+ }
+ volumeLocations = append(volumeLocations, volumeLocation)
+ }
+ }
+ }
+ return
+}
+
+func (t *Topology) ToTopologyInfo() *master_pb.TopologyInfo {
+ m := &master_pb.TopologyInfo{
+ Id: string(t.Id()),
+ DiskInfos: t.diskUsages.ToDiskInfo(),
+ }
+ for _, c := range t.Children() {
+ dc := c.(*DataCenter)
+ m.DataCenterInfos = append(m.DataCenterInfos, dc.ToDataCenterInfo())
+ }
+ return m
+}