12 type NetDevConfig map[string]interface{}
13 type ContainerConfig map[string]interface{}
14 type VolumeConfig map[string]interface{}
16 type YamlTopology struct {
17 Devices []NetDevConfig `yaml:"devices"`
18 Containers []ContainerConfig `yaml:"containers"`
19 Volumes []VolumeConfig `yaml:"volumes"`
22 func AddAddress(device, address, ns string) error {
23 c := []string{"ip", "addr", "add", address, "dev", device}
24 cmd := appendNetns(c, ns)
27 return fmt.Errorf("failed to set ip address for %s: %v", device, err)
32 func convertToNetConfig(t *YamlTopology) (*NetTopology, error) {
33 var topology NetTopology
34 for _, dev := range t.Devices {
35 topology = append(topology, NewNetConfig(dev))
40 func loadTopoFile(topoName string) (*NetTopology, error) {
41 var yamlTopo YamlTopology
43 data, err := ioutil.ReadFile(topoName)
45 return nil, fmt.Errorf("read error: %v", err)
48 err = yaml.Unmarshal(data, &yamlTopo)
50 return nil, fmt.Errorf("error parsing topology data: %v", err)
53 return convertToNetConfig(&yamlTopo)
56 func LoadTopology(path, topoName string) (*NetTopology, error) {
57 dir, err := os.Open(path)
63 files, err := dir.Readdir(0)
68 for i := range files {
70 fileName := file.Name()
72 // cut off file extension
73 f := strings.Split(fileName, ".")[0]
75 return loadTopoFile(path + fileName)
78 return nil, fmt.Errorf("topology '%s' not found", topoName)