12 type NetDevConfig map[string]interface{}
13 type ContainerConfig map[string]interface{}
15 type YamlTopology struct {
16 Devices []NetDevConfig `yaml:"devices"`
17 Containers []ContainerConfig `yaml:"containers"`
18 Volumes []string `yaml:"volumes"`
21 func AddAddress(device, address, ns string) error {
22 c := []string{"ip", "addr", "add", address, "dev", device}
23 cmd := appendNetns(c, ns)
26 return fmt.Errorf("failed to set ip address for %s: %v", device, err)
31 func convertToNetConfig(t *YamlTopology) (*NetTopology, error) {
32 var topology NetTopology
33 for _, dev := range t.Devices {
34 topology = append(topology, NewNetConfig(dev))
39 func loadTopoFile(topoName string) (*NetTopology, error) {
40 var yamlTopo YamlTopology
42 data, err := ioutil.ReadFile(topoName)
44 return nil, fmt.Errorf("read error: %v", err)
47 err = yaml.Unmarshal(data, &yamlTopo)
49 return nil, fmt.Errorf("error parsing topology data: %v", err)
52 return convertToNetConfig(&yamlTopo)
55 func LoadTopology(path, topoName string) (*NetTopology, error) {
56 dir, err := os.Open(path)
62 files, err := dir.Readdir(0)
67 for i := range files {
69 fileName := file.Name()
71 // cut off file extension
72 f := strings.Split(fileName, ".")[0]
74 return loadTopoFile(path + fileName)
77 return nil, fmt.Errorf("topology '%s' not found", topoName)