diff options
author | Filip Tehlar <ftehlar@cisco.com> | 2022-08-09 14:44:47 +0000 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2022-09-19 21:00:18 +0000 |
commit | 229f5fcf188cf710f4a8fb269d92f1a1d04a99da (patch) | |
tree | bc2c85a49bac6aea4e5ef3304c356acb75ad9493 /extras/hs-test/topo.go | |
parent | 6cacc94de3984d9f0cf6d562a27d89a4ab0a89f9 (diff) |
misc: add test framework for host stack
Type: feature
Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
Change-Id: I5a64a2c095cae3a4d5f8fdc73e624b010339ec8e
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) +} |