diff options
Diffstat (limited to 'extras/hs-test/topo.go')
-rwxr-xr-x | extras/hs-test/topo.go | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/extras/hs-test/topo.go b/extras/hs-test/topo.go new file mode 100755 index 00000000000..f11761460d8 --- /dev/null +++ b/extras/hs-test/topo.go @@ -0,0 +1,75 @@ +package main + +import ( + "fmt" + "io/ioutil" + "os" + "strings" + + "gopkg.in/yaml.v3" +) + +type NetDevConfig map[string]interface{} + +type YamlTopology struct { + Devices []NetDevConfig `yaml:"devices"` +} + +func AddAddress(device, address, ns string) error { + c := []string{"ip", "addr", "add", address, "dev", device} + cmd := appendNetns(c, ns) + err := cmd.Run() + if err != nil { + return fmt.Errorf("failed to set ip address for %s: %v", device, err) + } + return nil +} + +func convertToNetConfig(t *YamlTopology) (*NetTopology, error) { + var topology NetTopology + for _, dev := range t.Devices { + topology = append(topology, NewNetConfig(dev)) + } + return &topology, nil +} + +func loadTopoFile(topoName string) (*NetTopology, error) { + var yamlTopo YamlTopology + + data, err := ioutil.ReadFile(topoName) + if err != nil { + return nil, fmt.Errorf("read error: %v", err) + } + + err = yaml.Unmarshal(data, &yamlTopo) + if err != nil { + return nil, fmt.Errorf("error parsing topology data: %v", err) + } + + return convertToNetConfig(&yamlTopo) +} + +func LoadTopology(path, topoName string) (*NetTopology, error) { + dir, err := os.Open(path) + if err != nil { + return nil, err + } + defer dir.Close() + + files, err := dir.Readdir(0) + if err != nil { + return nil, err + } + + for i := range files { + file := files[i] + fileName := file.Name() + + // cut off file extension + f := strings.Split(fileName, ".")[0] + if f == topoName { + return loadTopoFile(path + fileName) + } + } + return nil, fmt.Errorf("topology '%s' not found", topoName) +} |