aboutsummaryrefslogtreecommitdiff
path: root/go/topology/topo_test.go
blob: f3ae2096b410ba3121c67525065a9a49de79df87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package topology

import (
	"code.google.com/p/weed-fs/go/sequence"
	"code.google.com/p/weed-fs/go/storage"
	"encoding/json"
	"fmt"
	"testing"
)

var topologyLayout = `
{
	"dc1":{
		"rack1":{
			"server1":{
				"volumes":[
					{"id":1, "size":12312},
					{"id":2, "size":12312},
					{"id":3, "size":12312}
				],
				"limit":3
			},
			"server2":{
				"volumes":[
					{"id":4, "size":12312},
					{"id":5, "size":12312},
					{"id":6, "size":12312}
				],
				"limit":10
			}
		},
		"rack2":{
			"server1":{
				"volumes":[
					{"id":4, "size":12312},
					{"id":5, "size":12312},
					{"id":6, "size":12312}
				],
				"limit":4
			},
			"server2":{
				"volumes":[],
				"limit":4
			},
			"server3":{
				"volumes":[
					{"id":2, "size":12312},
					{"id":3, "size":12312},
					{"id":4, "size":12312}
				],
				"limit":2
			}
		}
	},
	"dc2":{
	},
	"dc3":{
		"rack2":{
			"server1":{
				"volumes":[
					{"id":1, "size":12312},
					{"id":3, "size":12312},
					{"id":5, "size":12312}
				],
				"limit":4
			}
		}
	}
}
`

func setup(topologyLayout string) *Topology {
	var data interface{}
	err := json.Unmarshal([]byte(topologyLayout), &data)
	if err != nil {
		fmt.Println("error:", err)
	}

	//need to connect all nodes first before server adding volumes
	topo, err := NewTopology("mynetwork", "/etc/weed.conf", sequence.NewMemorySequencer(), 234, 5)
	if err != nil {
		fmt.Println("error:", err)
	}
	mTopology := data.(map[string]interface{})
	for dcKey, dcValue := range mTopology {
		dc := NewDataCenter(dcKey)
		dcMap := dcValue.(map[string]interface{})
		topo.LinkChildNode(dc)
		for rackKey, rackValue := range dcMap {
			rack := NewRack(rackKey)
			rackMap := rackValue.(map[string]interface{})
			dc.LinkChildNode(rack)
			for serverKey, serverValue := range rackMap {
				server := NewDataNode(serverKey)
				serverMap := serverValue.(map[string]interface{})
				rack.LinkChildNode(server)
				for _, v := range serverMap["volumes"].([]interface{}) {
					m := v.(map[string]interface{})
					vi := storage.VolumeInfo{
						Id:         storage.VolumeId(int64(m["id"].(float64))),
						Size:       uint64(m["size"].(float64)),
						Collection: "testingCollection",
						Version:    storage.CurrentVersion}
					server.AddOrUpdateVolume(vi)
				}
				server.UpAdjustMaxVolumeCountDelta(int(serverMap["limit"].(float64)))
			}
		}
	}

	return topo
}

func TestRemoveDataCenter(t *testing.T) {
	topo := setup(topologyLayout)
	topo.UnlinkChildNode(NodeId("dc2"))
	if topo.GetActiveVolumeCount() != 15 {
		t.Fail()
	}
	topo.UnlinkChildNode(NodeId("dc3"))
	if topo.GetActiveVolumeCount() != 12 {
		t.Fail()
	}
}