Browse Source

read topology configuration

pull/2/head
Chris Lu 12 years ago
parent
commit
a34570fc5b
  1. 34
      weed-fs/src/pkg/topology/configuration.go
  2. 42
      weed-fs/src/pkg/topology/configuration_test.go
  3. 33
      weed-fs/src/pkg/topology/topo_test.go

34
weed-fs/src/pkg/topology/configuration.go

@ -0,0 +1,34 @@
package topology
import (
"encoding/xml"
)
type rack struct {
Name string `xml:"name,attr"`
Ips []string `xml:"Ip"`
}
type dataCenter struct {
Name string `xml:"name,attr"`
Racks []rack `xml:"Rack"`
}
type topology struct {
DataCenters []dataCenter `xml:"DataCenter"`
}
type configuration struct {
XMLName xml.Name `xml:"Configuration"`
Topo topology `xml:"Topology"`
}
func NewConfiguration(b []byte) (*configuration, error){
c := &configuration{}
err := xml.Unmarshal(b, c)
return c, err
}
func (c *configuration) String() string{
if b, e := xml.MarshalIndent(c, " ", " "); e==nil {
return string(b)
}
return ""
}

42
weed-fs/src/pkg/topology/configuration_test.go

@ -0,0 +1,42 @@
package topology
import (
"fmt"
"testing"
)
func TestLoadConfiguration(t *testing.T) {
confContent := `
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration>
<Topology>
<DataCenter name="dc1">
<Rack name="rack1">
<Ip>192.168.1.1</Ip>
</Rack>
</DataCenter>
<DataCenter name="dc2">
<Rack name="rack1">
<Ip>192.168.1.2</Ip>
</Rack>
<Rack name="rack2">
<Ip>192.168.1.3</Ip>
<Ip>192.168.1.4</Ip>
</Rack>
</DataCenter>
</Topology>
</Configuration>
`
c, err := NewConfiguration([]byte(confContent))
fmt.Printf("%s\n", c)
if err!=nil{
t.Fatalf("unmarshal error:%s",err.Error())
}
if len(c.Topo.DataCenters) <= 0 || c.Topo.DataCenters[0].Name != "dc1" {
t.Fatalf("unmarshal error:%s",c)
}
}

33
weed-fs/src/pkg/topology/topo_test.go

@ -76,8 +76,6 @@ func setup(topologyLayout string) *Topology {
if err != nil {
fmt.Println("error:", err)
}
//fmt.Println("data:", data)
//printMap(data)
//need to connect all nodes first before server adding volumes
topo := NewTopology("mynetwork","/tmp","test",234,5)
@ -104,39 +102,9 @@ func setup(topologyLayout string) *Topology {
}
}
fmt.Println("topology:", *topo)
bytes, err := json.Marshal(topo.children)
if err != nil {
fmt.Println("json error:", err)
}
fmt.Println("json topo:", string(bytes))
return topo
}
func printMap(mm interface{}) {
m := mm.(map[string]interface{})
for k, v := range m {
switch vv := v.(type) {
case string:
fmt.Println(k, "\"", vv, "\"")
case int, float64:
fmt.Println(k, ":", vv)
case []interface{}:
fmt.Println(k, ":[")
for _, u := range vv {
fmt.Println(u)
fmt.Println(",")
}
fmt.Println("]")
default:
fmt.Println(k, ":")
printMap(vv)
}
}
}
func TestRemoveDataCenter(t *testing.T) {
topo := setup(topologyLayout)
topo.UnlinkChildNode(NodeId("dc2"))
@ -154,7 +122,6 @@ func TestReserveOneVolume(t *testing.T) {
rand.Seed(time.Now().UnixNano())
rand.Seed(1)
ret, node, vid := topo.RandomlyReserveOneVolume()
fmt.Println("topology:", topo)
fmt.Println("assigned :", ret, ", node :", node,", volume id:", vid)
}
Loading…
Cancel
Save