summaryrefslogtreecommitdiffstats
path: root/extras/hs-test/topo.go
diff options
context:
space:
mode:
authorFilip Tehlar <ftehlar@cisco.com>2022-08-09 14:44:47 +0000
committerFlorin Coras <florin.coras@gmail.com>2022-09-19 21:00:18 +0000
commit229f5fcf188cf710f4a8fb269d92f1a1d04a99da (patch)
treebc2c85a49bac6aea4e5ef3304c356acb75ad9493 /extras/hs-test/topo.go
parent6cacc94de3984d9f0cf6d562a27d89a4ab0a89f9 (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-xextras/hs-test/topo.go75
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)
+}