func (ep *endpoint) UnmarshalJSON(b []byte) error { var ( err error epMap map[string]interface{} ) if err = json.Unmarshal(b, &epMap); err != nil { return fmt.Errorf("Failed to unmarshal to macvlan endpoint: %v", err) } if v, ok := epMap["MacAddress"]; ok { if ep.mac, err = net.ParseMAC(v.(string)); err != nil { return types.InternalErrorf("failed to decode macvlan endpoint MAC address (%s) after json unmarshal: %v", v.(string), err) } } if v, ok := epMap["Addr"]; ok { if ep.addr, err = types.ParseCIDR(v.(string)); err != nil { return types.InternalErrorf("failed to decode macvlan endpoint IPv4 address (%s) after json unmarshal: %v", v.(string), err) } } if v, ok := epMap["Addrv6"]; ok { if ep.addrv6, err = types.ParseCIDR(v.(string)); err != nil { return types.InternalErrorf("failed to decode macvlan endpoint IPv6 address (%s) after json unmarshal: %v", v.(string), err) } } ep.id = epMap["id"].(string) ep.nid = epMap["nid"].(string) ep.srcName = epMap["SrcName"].(string) return nil }
func (ncfg *networkConfiguration) UnmarshalJSON(b []byte) error { var ( err error nMap map[string]interface{} ) if err = json.Unmarshal(b, &nMap); err != nil { return err } if v, ok := nMap["AddressIPv4"]; ok { if ncfg.AddressIPv4, err = types.ParseCIDR(v.(string)); err != nil { return types.InternalErrorf("failed to decode bridge network address IPv4 after json unmarshal: %s", v.(string)) } } if v, ok := nMap["AddressIPv6"]; ok { if ncfg.AddressIPv6, err = types.ParseCIDR(v.(string)); err != nil { return types.InternalErrorf("failed to decode bridge network address IPv6 after json unmarshal: %s", v.(string)) } } ncfg.DefaultBindingIP = net.ParseIP(nMap["DefaultBindingIP"].(string)) ncfg.DefaultGatewayIPv4 = net.ParseIP(nMap["DefaultGatewayIPv4"].(string)) ncfg.DefaultGatewayIPv6 = net.ParseIP(nMap["DefaultGatewayIPv6"].(string)) ncfg.ID = nMap["ID"].(string) ncfg.BridgeName = nMap["BridgeName"].(string) ncfg.EnableIPv6 = nMap["EnableIPv6"].(bool) ncfg.EnableIPMasquerade = nMap["EnableIPMasquerade"].(bool) ncfg.EnableICC = nMap["EnableICC"].(bool) ncfg.Mtu = int(nMap["Mtu"].(float64)) return nil }
// parseInterfaces validates all the parameters of an Interface and returns them. func parseInterface(r api.CreateEndpointResponse) (*api.Interface, error) { var outIf *api.Interface inIf := r.Interface if inIf != nil { var err error outIf = &api.Interface{} if inIf.Address != "" { if outIf.Address, err = types.ParseCIDR(inIf.Address); err != nil { return nil, err } } if inIf.AddressIPv6 != "" { if outIf.AddressIPv6, err = types.ParseCIDR(inIf.AddressIPv6); err != nil { return nil, err } } if inIf.MacAddress != "" { if outIf.MacAddress, err = net.ParseMAC(inIf.MacAddress); err != nil { return nil, err } } } return outIf, nil }
func (n *network) SetValue(value []byte) error { var ( overlayNetmap map[string]interface{} err error ) err = json.Unmarshal(value, &overlayNetmap) if err != nil { return err } subnetIPstr := overlayNetmap["subnetIP"].(string) gwIPstr := overlayNetmap["gwIP"].(string) vni := uint32(overlayNetmap["vni"].(float64)) subnetIP, _ := types.ParseCIDR(subnetIPstr) gwIP, _ := types.ParseCIDR(gwIPstr) s := &subnet{ subnetIP: subnetIP, gwIP: gwIP, vni: vni, once: &sync.Once{}, } n.subnets = append(n.subnets, s) sNet := n.getMatchingSubnet(subnetIP) if sNet != nil { sNet.vni = vni } return nil }
// UnmarshalJSON decodes a json message into IPAMData func (i *IPAMData) UnmarshalJSON(data []byte) error { var ( m map[string]interface{} err error ) if err := json.Unmarshal(data, &m); err != nil { return err } i.AddressSpace = m["AddressSpace"].(string) if v, ok := m["Pool"]; ok { if i.Pool, err = types.ParseCIDR(v.(string)); err != nil { return err } } if v, ok := m["Gateway"]; ok { if i.Gateway, err = types.ParseCIDR(v.(string)); err != nil { return err } } if v, ok := m["AuxAddresses"]; ok { b, _ := json.Marshal(v) var am map[string]string if err = json.Unmarshal(b, &am); err != nil { return err } i.AuxAddresses = make(map[string]*net.IPNet, len(am)) for k, v := range am { if i.AuxAddresses[k], err = types.ParseCIDR(v); err != nil { return err } } } return nil }
func (n *network) SetValue(value []byte) error { var ( m map[string]interface{} newNet bool isMap = true netJSON = []*subnetJSON{} ) if err := json.Unmarshal(value, &m); err != nil { err := json.Unmarshal(value, &netJSON) if err != nil { return err } isMap = false } if len(n.subnets) == 0 { newNet = true } if isMap { if val, ok := m["secure"]; ok { n.secure = val.(bool) } bytes, err := json.Marshal(m["subnets"]) if err != nil { return err } if err := json.Unmarshal(bytes, &netJSON); err != nil { return err } } for _, sj := range netJSON { subnetIPstr := sj.SubnetIP gwIPstr := sj.GwIP vni := sj.Vni subnetIP, _ := types.ParseCIDR(subnetIPstr) gwIP, _ := types.ParseCIDR(gwIPstr) if newNet { s := &subnet{ subnetIP: subnetIP, gwIP: gwIP, vni: vni, once: &sync.Once{}, } n.subnets = append(n.subnets, s) } else { sNet := n.getMatchingSubnet(subnetIP) if sNet != nil { sNet.vni = vni } } } return nil }
func (epi *endpointInterface) UnmarshalJSON(b []byte) error { var ( err error epMap map[string]interface{} ) if err = json.Unmarshal(b, &epMap); err != nil { return err } if v, ok := epMap["mac"]; ok { if epi.mac, err = net.ParseMAC(v.(string)); err != nil { return types.InternalErrorf("failed to decode endpoint interface mac address after json unmarshal: %s", v.(string)) } } if v, ok := epMap["addr"]; ok { if epi.addr, err = types.ParseCIDR(v.(string)); err != nil { return types.InternalErrorf("failed to decode endpoint interface ipv4 address after json unmarshal: %v", err) } } if v, ok := epMap["addrv6"]; ok { if epi.addrv6, err = types.ParseCIDR(v.(string)); err != nil { return types.InternalErrorf("failed to decode endpoint interface ipv6 address after json unmarshal: %v", err) } } epi.srcName = epMap["srcName"].(string) epi.dstPrefix = epMap["dstPrefix"].(string) rb, _ := json.Marshal(epMap["routes"]) var routes []string json.Unmarshal(rb, &routes) epi.routes = make([]*net.IPNet, 0) for _, route := range routes { ip, ipr, err := net.ParseCIDR(route) if err == nil { ipr.IP = ip epi.routes = append(epi.routes, ipr) } } epi.v4PoolID = epMap["v4PoolID"].(string) epi.v6PoolID = epMap["v6PoolID"].(string) al, _ := json.Marshal(epMap["ipAliases"]) // TODO check var aliases []string json.Unmarshal(al, &aliases) epi.ipAliases = make([]*net.IPNet, 0) for _, alias := range aliases { ip, err := types.ParseCIDR(alias) if err == nil { epi.ipAliases = append(epi.ipAliases, ip) } else { // TODO log error } } return nil }
func TestCreateFullOptions(t *testing.T) { defer testutils.SetupTestOSContext(t)() d := newDriver() config := &configuration{ EnableIPForwarding: true, EnableIPTables: true, } // Test this scenario: Default gw address does not belong to // container network and it's greater than bridge address cnw, _ := types.ParseCIDR("172.16.122.0/24") bnw, _ := types.ParseCIDR("172.16.0.0/24") br, _ := types.ParseCIDR("172.16.0.1/16") defgw, _ := types.ParseCIDR("172.16.0.100/16") netConfig := &networkConfiguration{ BridgeName: DefaultBridgeName, EnableIPv6: true, } genericOption := make(map[string]interface{}) genericOption[netlabel.GenericData] = config if err := d.configure(genericOption); err != nil { t.Fatalf("Failed to setup driver config: %v", err) } netOption := make(map[string]interface{}) netOption[netlabel.GenericData] = netConfig ipdList := []driverapi.IPAMData{ driverapi.IPAMData{ Pool: bnw, Gateway: br, AuxAddresses: map[string]*net.IPNet{DefaultGatewayV4AuxKey: defgw}, }, } err := d.CreateNetwork("dummy", netOption, ipdList, nil) if err != nil { t.Fatalf("Failed to create bridge: %v", err) } // Verify the IP address allocated for the endpoint belongs to the container network epOptions := make(map[string]interface{}) te := newTestEndpoint(cnw, 10) err = d.CreateEndpoint("dummy", "ep1", te.Interface(), epOptions) if err != nil { t.Fatalf("Failed to create an endpoint : %s", err.Error()) } if !cnw.Contains(te.Interface().Address().IP) { t.Fatalf("endpoint got assigned address outside of container network(%s): %s", cnw.String(), te.Interface().Address()) } }
func (epi *endpointInterface) UnmarshalJSON(b []byte) error { var ( err error epMap map[string]interface{} ) if err = json.Unmarshal(b, &epMap); err != nil { return err } if v, ok := epMap["mac"]; ok { if epi.mac, err = net.ParseMAC(v.(string)); err != nil { return types.InternalErrorf("failed to decode endpoint interface mac address after json unmarshal: %s", v.(string)) } } if v, ok := epMap["addr"]; ok { if epi.addr, err = types.ParseCIDR(v.(string)); err != nil { return types.InternalErrorf("failed to decode endpoint interface ipv4 address after json unmarshal: %v", err) } } if v, ok := epMap["addrv6"]; ok { if epi.addrv6, err = types.ParseCIDR(v.(string)); err != nil { return types.InternalErrorf("failed to decode endpoint interface ipv6 address after json unmarshal: %v", err) } } if v, ok := epMap["llAddrs"]; ok { list := v.([]interface{}) epi.llAddrs = make([]*net.IPNet, 0, len(list)) for _, llS := range list { ll, err := types.ParseCIDR(llS.(string)) if err != nil { return types.InternalErrorf("failed to decode endpoint interface link-local address (%v) after json unmarshal: %v", llS, err) } epi.llAddrs = append(epi.llAddrs, ll) } } epi.srcName = epMap["srcName"].(string) epi.dstPrefix = epMap["dstPrefix"].(string) rb, _ := json.Marshal(epMap["routes"]) var routes []string json.Unmarshal(rb, &routes) epi.routes = make([]*net.IPNet, 0) for _, route := range routes { ip, ipr, err := net.ParseCIDR(route) if err == nil { ipr.IP = ip epi.routes = append(epi.routes, ipr) } } epi.v4PoolID = epMap["v4PoolID"].(string) epi.v6PoolID = epMap["v6PoolID"].(string) return nil }
// UnmarshalJSON decodes data into the PoolData object func (p *PoolData) UnmarshalJSON(data []byte) error { var ( err error t struct { ParentKey SubnetKey Pool string Range *AddressRange `json:",omitempty"` RefCount int } ) if err = json.Unmarshal(data, &t); err != nil { return err } p.ParentKey = t.ParentKey p.Range = t.Range p.RefCount = t.RefCount if t.Pool != "" { if p.Pool, err = types.ParseCIDR(t.Pool); err != nil { return err } } return nil }
func (test *testEndpoint) AddressIPv6() *net.IPNet { if test.addressIPv6 == "" { return nil } nw, _ := types.ParseCIDR(test.addressIPv6) return nw }
func (ep *endpoint) UnmarshalJSON(value []byte) error { var ( err error epMap map[string]interface{} ) json.Unmarshal(value, &epMap) ep.id = epMap["id"].(string) ep.nid = epMap["nid"].(string) if v, ok := epMap["mac"]; ok { if ep.mac, err = net.ParseMAC(v.(string)); err != nil { return types.InternalErrorf("failed to decode endpoint interface mac address after json unmarshal: %s", v.(string)) } } if v, ok := epMap["addr"]; ok { if ep.addr, err = types.ParseCIDR(v.(string)); err != nil { return types.InternalErrorf("failed to decode endpoint interface ipv4 address after json unmarshal: %v", err) } } if v, ok := epMap["ifName"]; ok { ep.ifName = v.(string) } return nil }
func createInterface(t *testing.T, name string, nws ...string) { // Add interface link := &netlink.Bridge{ LinkAttrs: netlink.LinkAttrs{ Name: "test", }, } bips := []*net.IPNet{} for _, nw := range nws { bip, err := types.ParseCIDR(nw) if err != nil { t.Fatal(err) } bips = append(bips, bip) } if err := netlink.LinkAdd(link); err != nil { t.Fatalf("Failed to create interface via netlink: %v", err) } for _, bip := range bips { if err := netlink.AddrAdd(link, &netlink.Addr{IPNet: bip}); err != nil { t.Fatal(err) } } if err := netlink.LinkSetUp(link); err != nil { t.Fatal(err) } }
func TestIpamReleaseOnNetDriverFailures(t *testing.T) { if !testutils.IsRunningInContainer() { defer testutils.SetupTestOSContext(t)() } cfgOptions, err := OptionBoltdbWithRandomDBFile() c, err := New(cfgOptions...) if err != nil { t.Fatal(err) } defer c.Stop() cc := c.(*controller) bd := badDriver{failNetworkCreation: true} cc.drivers[badDriverName] = &driverData{driver: &bd, capability: driverapi.Capability{DataScope: datastore.LocalScope}} // Test whether ipam state release is invoked on network create failure from net driver // by checking whether subsequent network creation requesting same gateway IP succeeds ipamOpt := NetworkOptionIpam(ipamapi.DefaultIPAM, "", []*IpamConf{&IpamConf{PreferredPool: "10.34.0.0/16", Gateway: "10.34.255.254"}}, nil) if _, err := c.NewNetwork(badDriverName, "badnet1", ipamOpt); err == nil { t.Fatalf("bad network driver should have failed network creation") } gnw, err := c.NewNetwork("bridge", "goodnet1", ipamOpt) if err != nil { t.Fatal(err) } gnw.Delete() // Now check whether ipam release works on endpoint creation failure bd.failNetworkCreation = false bnw, err := c.NewNetwork(badDriverName, "badnet2", ipamOpt) if err != nil { t.Fatal(err) } defer bnw.Delete() if _, err := bnw.CreateEndpoint("ep0"); err == nil { t.Fatalf("bad network driver should have failed endpoint creation") } // Now create good bridge network with different gateway ipamOpt2 := NetworkOptionIpam(ipamapi.DefaultIPAM, "", []*IpamConf{&IpamConf{PreferredPool: "10.34.0.0/16", Gateway: "10.34.255.253"}}, nil) gnw, err = c.NewNetwork("bridge", "goodnet2", ipamOpt2) if err != nil { t.Fatal(err) } defer gnw.Delete() ep, err := gnw.CreateEndpoint("ep1") if err != nil { t.Fatal(err) } defer ep.Delete() expectedIP, _ := types.ParseCIDR("10.34.0.1/16") if !types.CompareIPNet(ep.Info().Iface().Address(), expectedIP) { t.Fatalf("Ipam release must have failed, endpoint has unexpected address: %v", ep.Info().Iface().Address()) } }
func (ep *bridgeEndpoint) UnmarshalJSON(b []byte) error { var ( err error epMap map[string]interface{} ) if err = json.Unmarshal(b, &epMap); err != nil { return fmt.Errorf("Failed to unmarshal to bridge endpoint: %v", err) } if v, ok := epMap["MacAddress"]; ok { if ep.macAddress, err = net.ParseMAC(v.(string)); err != nil { return types.InternalErrorf("failed to decode bridge endpoint MAC address (%s) after json unmarshal: %v", v.(string), err) } } if v, ok := epMap["Addr"]; ok { if ep.addr, err = types.ParseCIDR(v.(string)); err != nil { return types.InternalErrorf("failed to decode bridge endpoint IPv4 address (%s) after json unmarshal: %v", v.(string), err) } } if v, ok := epMap["Addrv6"]; ok { if ep.addrv6, err = types.ParseCIDR(v.(string)); err != nil { return types.InternalErrorf("failed to decode bridge endpoint IPv6 address (%s) after json unmarshal: %v", v.(string), err) } } ep.id = epMap["id"].(string) ep.nid = epMap["nid"].(string) ep.srcName = epMap["SrcName"].(string) d, _ := json.Marshal(epMap["Config"]) if err := json.Unmarshal(d, &ep.config); err != nil { logrus.Warnf("Failed to decode endpoint config %v", err) } d, _ = json.Marshal(epMap["ContainerConfig"]) if err := json.Unmarshal(d, &ep.containerConfig); err != nil { logrus.Warnf("Failed to decode endpoint container config %v", err) } d, _ = json.Marshal(epMap["ExternalConnConfig"]) if err := json.Unmarshal(d, &ep.extConnConfig); err != nil { logrus.Warnf("Failed to decode endpoint external connectivity configuration %v", err) } d, _ = json.Marshal(epMap["PortMapping"]) if err := json.Unmarshal(d, &ep.portMapping); err != nil { logrus.Warnf("Failed to decode endpoint port mapping %v", err) } return nil }
func init() { // We allow ourselves to panic in this special case because we indicate a // failure to parse a compile-time define constant. var err error if bridgeIPv6, err = types.ParseCIDR(bridgeIPv6Str); err != nil { panic(fmt.Sprintf("Cannot parse default bridge IPv6 address %q: %v", bridgeIPv6Str, err)) } }
// RequestPool requests an address pool in the specified address space func (a *allocator) RequestPool(addressSpace, pool, subPool string, options map[string]string, v6 bool) (string, *net.IPNet, map[string]string, error) { req := &api.RequestPoolRequest{AddressSpace: addressSpace, Pool: pool, SubPool: subPool, Options: options, V6: v6} res := &api.RequestPoolResponse{} if err := a.call("RequestPool", req, res); err != nil { return "", nil, nil, err } retPool, err := types.ParseCIDR(res.Pool) return res.PoolID, retPool, res.Data, err }
func testNetwork(networkType string, t *testing.T) { d := newDriver(networkType) bnw, _ := types.ParseCIDR("172.16.0.0/24") br, _ := types.ParseCIDR("172.16.0.1/16") netOption := make(map[string]interface{}) networkOptions := map[string]string{ NetworkName: "TestNetwork", } netOption[netlabel.GenericData] = networkOptions ipdList := []driverapi.IPAMData{ { Pool: bnw, Gateway: br, }, } err := d.CreateNetwork("dummy", netOption, ipdList, nil) if err != nil { t.Fatalf("Failed to create bridge: %v", err) } defer func() { err = d.DeleteNetwork("dummy") if err != nil { t.Fatalf("Failed to create bridge: %v", err) } }() epOptions := make(map[string]interface{}) te := &testEndpoint{} err = d.CreateEndpoint("dummy", "ep1", te.Interface(), epOptions) if err != nil { t.Fatalf("Failed to create an endpoint : %s", err.Error()) } err = d.DeleteEndpoint("dummy", "ep1") if err != nil { t.Fatalf("Failed to delete an endpoint : %s", err.Error()) } }
// RequestAddress requests an address from the address pool func (a *allocator) RequestAddress(poolID string, address net.IP, options map[string]string) (*net.IPNet, map[string]string, error) { var prefAddress string if address != nil { prefAddress = address.String() } req := &api.RequestAddressRequest{PoolID: poolID, Address: prefAddress, Options: options} res := &api.RequestAddressResponse{} if err := a.call("RequestAddress", req, res); err != nil { return nil, nil, err } retAddress, err := types.ParseCIDR(res.Address) return retAddress, res.Data, err }
// UnmarshalJSON decodes data into the Range object func (r *AddressRange) UnmarshalJSON(data []byte) error { m := map[string]interface{}{} err := json.Unmarshal(data, &m) if err != nil { return err } if r.Sub, err = types.ParseCIDR(m["Sub"].(string)); err != nil { return err } r.Start = uint64(m["Start"].(float64)) r.End = uint64(m["End"].(float64)) return nil }
func (n *network) SetValue(value []byte) error { var newNet bool netJSON := []*subnetJSON{} err := json.Unmarshal(value, &netJSON) if err != nil { return err } if len(n.subnets) == 0 { newNet = true } for _, sj := range netJSON { subnetIPstr := sj.SubnetIP gwIPstr := sj.GwIP vni := sj.Vni subnetIP, _ := types.ParseCIDR(subnetIPstr) gwIP, _ := types.ParseCIDR(gwIPstr) if newNet { s := &subnet{ subnetIP: subnetIP, gwIP: gwIP, vni: vni, once: &sync.Once{}, } n.subnets = append(n.subnets, s) } else { sNet := n.getMatchingSubnet(subnetIP) if sNet != nil { sNet.vni = vni } } } return nil }
func (d *driver) EventNotify(etype driverapi.EventType, nid, tableName, key string, value []byte) { if tableName != ovPeerTable { logrus.Errorf("Unexpected table notification for table %s received", tableName) return } eid := key var peer PeerRecord if err := proto.Unmarshal(value, &peer); err != nil { logrus.Errorf("Failed to unmarshal peer record: %v", err) return } n := d.network(nid) if n == nil { return } // Ignore local peers. We already know about them and they // should not be added to vxlan fdb. if peer.TunnelEndpointIP == n.providerAddress { return } addr, err := types.ParseCIDR(peer.EndpointIP) if err != nil { logrus.Errorf("Invalid peer IP %s received in event notify", peer.EndpointIP) return } mac, err := net.ParseMAC(peer.EndpointMAC) if err != nil { logrus.Errorf("Invalid mac %s received in event notify", peer.EndpointMAC) return } vtep := net.ParseIP(peer.TunnelEndpointIP) if vtep == nil { logrus.Errorf("Invalid VTEP %s received in event notify", peer.TunnelEndpointIP) return } if etype == driverapi.Delete { d.peerDelete(nid, eid, addr.IP, addr.Mask, mac, vtep, true) return } d.peerAdd(nid, eid, addr.IP, addr.Mask, mac, vtep, true) }
func TestEndpointMarshalling(t *testing.T) { ip, nw6, err := net.ParseCIDR("2001:db8:4003::122/64") if err != nil { t.Fatal(err) } nw6.IP = ip var lla []*net.IPNet for _, nw := range []string{"169.254.0.1/16", "169.254.1.1/16", "169.254.2.2/16"} { ll, _ := types.ParseCIDR(nw) lla = append(lla, ll) } e := &endpoint{ name: "Bau", id: "efghijklmno", sandboxID: "ambarabaciccicocco", anonymous: true, iface: &endpointInterface{ mac: []byte{11, 12, 13, 14, 15, 16}, addr: &net.IPNet{ IP: net.IP{10, 0, 1, 23}, Mask: net.IPMask{255, 255, 255, 0}, }, addrv6: nw6, srcName: "veth12ab1314", dstPrefix: "eth", v4PoolID: "poolpool", v6PoolID: "poolv6", llAddrs: lla, }, } b, err := json.Marshal(e) if err != nil { t.Fatal(err) } ee := &endpoint{} err = json.Unmarshal(b, ee) if err != nil { t.Fatal(err) } if e.name != ee.name || e.id != ee.id || e.sandboxID != ee.sandboxID || !compareEndpointInterface(e.iface, ee.iface) || e.anonymous != ee.anonymous { t.Fatalf("JSON marsh/unmarsh failed.\nOriginal:\n%#v\nDecoded:\n%#v\nOriginal iface: %#v\nDecodediface:\n%#v", e, ee, e.iface, ee.iface) } }
func TestUnknownEndpoint(t *testing.T) { if !testutils.IsRunningInContainer() { defer testutils.SetupTestOSContext(t)() } subnet, err := types.ParseCIDR("192.168.100.1/24") if err != nil { t.Fatal(err) } netOption := options.Generic{ "BridgeName": "testnetwork", "AddressIPv4": subnet, } option := options.Generic{ netlabel.GenericData: netOption, } network, err := createTestNetwork(bridgeNetType, "testnetwork", option) if err != nil { t.Fatal(err) } _, err = network.CreateEndpoint("") if err == nil { t.Fatal("Expected to fail. But instead succeeded") } if _, ok := err.(libnetwork.ErrInvalidName); !ok { t.Fatalf("Expected to fail with ErrInvalidName error. Actual error: %v", err) } ep, err := network.CreateEndpoint("testep") if err != nil { t.Fatal(err) } err = ep.Delete() if err != nil { t.Fatal(err) } // Done testing. Now cleanup if err := network.Delete(); err != nil { t.Fatal(err) } }
func TestDisableIPv6DAD(t *testing.T) { if testutils.RunningOnCircleCI() { t.Skipf("Skipping as not supported on CIRCLE CI kernel") } defer testutils.SetupTestOSContext(t)() ipv6, _ := types.ParseCIDR("2001:db8::44/64") iface := &nwIface{addressIPv6: ipv6} veth := &netlink.Veth{ LinkAttrs: netlink.LinkAttrs{Name: "sideA"}, PeerName: "sideB", } nlh, err := netlink.NewHandle(syscall.NETLINK_ROUTE) if err != nil { t.Fatal(err) } err = nlh.LinkAdd(veth) if err != nil { t.Fatal(err) } link, err := nlh.LinkByName("sideA") if err != nil { t.Fatal(err) } err = setInterfaceIPv6(nlh, link, iface) if err != nil { t.Fatal(err) } addrList, err := nlh.AddrList(link, nl.FAMILY_V6) if err != nil { t.Fatal(err) } if addrList[0].Flags&syscall.IFA_F_NODAD == 0 { t.Fatalf("Unexpected interface flags: 0x%x. Expected to contain 0x%x", addrList[0].Flags, syscall.IFA_F_NODAD) } }
func createInterface(t *testing.T, name, nw string) { // Add interface link := &netlink.Bridge{ LinkAttrs: netlink.LinkAttrs{ Name: "test", }, } bip, err := types.ParseCIDR(nw) if err != nil { t.Fatal(err) } if err = netlink.LinkAdd(link); err != nil { t.Fatalf("Failed to create interface via netlink: %v", err) } if err := netlink.AddrAdd(link, &netlink.Addr{IPNet: bip}); err != nil { t.Fatal(err) } if err = netlink.LinkSetUp(link); err != nil { t.Fatal(err) } }
func (d *driver) EventNotify(etype driverapi.EventType, nid, tableName, key string, value []byte) { if tableName != ovPeerTable { log.Errorf("Unexpected table notification for table %s received", tableName) return } eid := key values := strings.Split(string(value), ",") if len(values) < 3 { log.Errorf("Invalid value %s received through event notify", string(value)) return } addr, err := types.ParseCIDR(values[0]) if err != nil { log.Errorf("Invalid peer IP %s received in event notify", values[0]) return } mac, err := net.ParseMAC(values[1]) if err != nil { log.Errorf("Invalid mac %s received in event notify", values[1]) return } vtep := net.ParseIP(values[2]) if vtep == nil { log.Errorf("Invalid VTEP %s received in event notify", values[2]) return } if etype == driverapi.Delete { d.peerDelete(nid, eid, addr.IP, addr.Mask, mac, vtep, true) return } d.peerAdd(nid, eid, addr.IP, addr.Mask, mac, vtep, true) }
func parseStaticRoutes(r api.JoinResponse) ([]*types.StaticRoute, error) { var routes = make([]*types.StaticRoute, len(r.StaticRoutes)) for i, inRoute := range r.StaticRoutes { var err error outRoute := &types.StaticRoute{RouteType: inRoute.RouteType} if inRoute.Destination != "" { if outRoute.Destination, err = types.ParseCIDR(inRoute.Destination); err != nil { return nil, err } } if inRoute.NextHop != "" { outRoute.NextHop = net.ParseIP(inRoute.NextHop) if outRoute.NextHop == nil { return nil, fmt.Errorf("failed to parse nexthop IP %s", inRoute.NextHop) } } routes[i] = outRoute } return routes, nil }
"github.com/docker/libnetwork/discoverapi" "github.com/docker/libnetwork/ipamapi" "github.com/docker/libnetwork/netlabel" "github.com/docker/libnetwork/types" ) const ( localAddressSpace = "LocalDefault" globalAddressSpace = "GlobalDefault" ) // DefaultIPAM defines the default ipam-driver for local-scoped windows networks const DefaultIPAM = "windows" var ( defaultPool, _ = types.ParseCIDR("0.0.0.0/0") ) type allocator struct { } // GetInit registers the built-in ipam service with libnetwork func GetInit(ipamName string) func(ic ipamapi.Callback, l, g interface{}) error { return func(ic ipamapi.Callback, l, g interface{}) error { return ic.RegisterIpamDriver(ipamName, &allocator{}) } } func (a *allocator) GetDefaultAddressSpaces() (string, string, error) { return localAddressSpace, globalAddressSpace, nil }
func (n *network) ipamAllocateVersion(ipVer int, ipam ipamapi.Ipam) error { var ( cfgList *[]*IpamConf infoList *[]*IpamInfo err error ) switch ipVer { case 4: cfgList = &n.ipamV4Config infoList = &n.ipamV4Info case 6: cfgList = &n.ipamV6Config infoList = &n.ipamV6Info default: return types.InternalErrorf("incorrect ip version passed to ipam allocate: %d", ipVer) } if len(*cfgList) == 0 { if ipVer == 6 { return nil } *cfgList = []*IpamConf{{}} } *infoList = make([]*IpamInfo, len(*cfgList)) log.Debugf("Allocating IPv%d pools for network %s (%s)", ipVer, n.Name(), n.ID()) for i, cfg := range *cfgList { if err = cfg.Validate(); err != nil { return err } d := &IpamInfo{} (*infoList)[i] = d d.AddressSpace = n.addrSpace d.PoolID, d.Pool, d.Meta, err = n.requestPoolHelper(ipam, n.addrSpace, cfg.PreferredPool, cfg.SubPool, n.ipamOptions, ipVer == 6) if err != nil { return err } defer func() { if err != nil { if err := ipam.ReleasePool(d.PoolID); err != nil { log.Warnf("Failed to release address pool %s after failure to create network %s (%s)", d.PoolID, n.Name(), n.ID()) } } }() if gws, ok := d.Meta[netlabel.Gateway]; ok { if d.Gateway, err = types.ParseCIDR(gws); err != nil { return types.BadRequestErrorf("failed to parse gateway address (%v) returned by ipam driver: %v", gws, err) } } // If user requested a specific gateway, libnetwork will allocate it // irrespective of whether ipam driver returned a gateway already. // If none of the above is true, libnetwork will allocate one. if cfg.Gateway != "" || d.Gateway == nil { var gatewayOpts = map[string]string{ ipamapi.RequestAddressType: netlabel.Gateway, } if d.Gateway, _, err = ipam.RequestAddress(d.PoolID, net.ParseIP(cfg.Gateway), gatewayOpts); err != nil { return types.InternalErrorf("failed to allocate gateway (%v): %v", cfg.Gateway, err) } } // Auxiliary addresses must be part of the master address pool // If they fall into the container addressable pool, libnetwork will reserve them if cfg.AuxAddresses != nil { var ip net.IP d.IPAMData.AuxAddresses = make(map[string]*net.IPNet, len(cfg.AuxAddresses)) for k, v := range cfg.AuxAddresses { if ip = net.ParseIP(v); ip == nil { return types.BadRequestErrorf("non parsable secondary ip address (%s:%s) passed for network %s", k, v, n.Name()) } if !d.Pool.Contains(ip) { return types.ForbiddenErrorf("auxilairy address: (%s:%s) must belong to the master pool: %s", k, v, d.Pool) } // Attempt reservation in the container addressable pool, silent the error if address does not belong to that pool if d.IPAMData.AuxAddresses[k], _, err = ipam.RequestAddress(d.PoolID, ip, nil); err != nil && err != ipamapi.ErrIPOutOfRange { return types.InternalErrorf("failed to allocate secondary ip address (%s:%s): %v", k, v, err) } } } } return nil }