func (vb *VXLANBackend) handleSubnetEvents(batch subnet.EventBatch) { for _, evt := range batch { switch evt.Type { case subnet.SubnetAdded: log.Info("Subnet added: ", evt.Lease.Network) if evt.Lease.Attrs.BackendType != "vxlan" { log.Warningf("Ignoring non-vxlan subnet: type=%v", evt.Lease.Attrs.BackendType) continue } var attrs vxlanLeaseAttrs if err := json.Unmarshal(evt.Lease.Attrs.BackendData, &attrs); err != nil { log.Error("Error decoding subnet lease JSON: ", err) continue } if err := vb.dev.AddL2(neigh{IP: evt.Lease.Attrs.PublicIP, MAC: net.HardwareAddr(attrs.VtepMAC)}); err != nil { log.Error("Error adding L2 entry: ", err) } if err := vb.dev.AddL3(neigh{IP: evt.Lease.Network.IP, MAC: net.HardwareAddr(attrs.VtepMAC)}); err != nil { log.Error("Error adding L3 entry: ", err) } if err := vb.dev.AddRoute(evt.Lease.Network); err != nil { log.Error("Error adding route: ", err) } case subnet.SubnetRemoved: log.Info("Subnet removed: ", evt.Lease.Network) if evt.Lease.Attrs.BackendType != "vxlan" { log.Warningf("Ignoring non-vxlan subnet: type=%v", evt.Lease.Attrs.BackendType) continue } var attrs vxlanLeaseAttrs if err := json.Unmarshal(evt.Lease.Attrs.BackendData, &attrs); err != nil { log.Error("Error decoding subnet lease JSON: ", err) continue } if err := vb.dev.DelRoute(evt.Lease.Network); err != nil { log.Error("Error deleting route: ", err) } if len(attrs.VtepMAC) > 0 { if err := vb.dev.DelL2(neigh{IP: evt.Lease.Attrs.PublicIP, MAC: net.HardwareAddr(attrs.VtepMAC)}); err != nil { log.Error("Error deleting L2 entry: ", err) } if err := vb.dev.DelL3(neigh{IP: evt.Lease.Network.IP, MAC: net.HardwareAddr(attrs.VtepMAC)}); err != nil { log.Error("Error deleting L3 entry: ", err) } } default: log.Error("Internal error: unknown event type: ", int(evt.Type)) } } }
func (rb *HostgwBackend) handleSubnetEvents(batch subnet.EventBatch) { for _, evt := range batch { switch evt.Type { case subnet.SubnetAdded: log.Infof("Subnet added: %v via %v", evt.Lease.Network, evt.Lease.Attrs.PublicIP) if evt.Lease.Attrs.BackendType != "host-gw" { log.Warningf("Ignoring non-host-gw subnet: type=%v", evt.Lease.Attrs.BackendType) continue } route := netlink.Route{ Dst: evt.Lease.Network.ToIPNet(), Gw: evt.Lease.Attrs.PublicIP.ToIP(), LinkIndex: rb.extIface.Index, } if err := netlink.RouteAdd(&route); err != nil { log.Errorf("Error adding route to %v via %v: %v", evt.Lease.Network, evt.Lease.Attrs.PublicIP, err) continue } case subnet.SubnetRemoved: log.Info("Subnet removed: ", evt.Lease.Network) if evt.Lease.Attrs.BackendType != "host-gw" { log.Warningf("Ignoring non-host-gw subnet: type=%v", evt.Lease.Attrs.BackendType) continue } route := netlink.Route{ Dst: evt.Lease.Network.ToIPNet(), Gw: evt.Lease.Attrs.PublicIP.ToIP(), LinkIndex: rb.extIface.Index, } if err := netlink.RouteDel(&route); err != nil { log.Errorf("Error deleting route to %v: %v", evt.Lease.Network, err) continue } default: log.Error("Internal error: unknown event type: ", int(evt.Type)) } } }
func ensureLink(vxlan *netlink.Vxlan) (*netlink.Vxlan, error) { err := netlink.LinkAdd(vxlan) if err == syscall.EEXIST { // it's ok if the device already exists as long as config is similar existing, err := netlink.LinkByName(vxlan.Name) if err != nil { return nil, err } incompat := vxlanLinksIncompat(vxlan, existing) if incompat == "" { return existing.(*netlink.Vxlan), nil } // delete existing log.Warningf("%q already exists with incompatable configuration: %v; recreating device", vxlan.Name, incompat) if err = netlink.LinkDel(existing); err != nil { return nil, fmt.Errorf("failed to delete interface: %v", err) } // create new if err = netlink.LinkAdd(vxlan); err != nil { return nil, fmt.Errorf("failed to create vxlan interface: %v", err) } } else if err != nil { return nil, err } ifindex := vxlan.Index link, err := netlink.LinkByIndex(vxlan.Index) if err != nil { return nil, fmt.Errorf("can't locate created vxlan device with index %v", ifindex) } var ok bool if vxlan, ok = link.(*netlink.Vxlan); !ok { return nil, fmt.Errorf("created vxlan device with index %v is not vxlan", ifindex) } return vxlan, nil }
func (ipt *IPTables) Exists(table string, args ...string) (bool, error) { checkPresent, err := getIptablesHasCheckCommand() if err != nil { log.Warningf("Error checking iptables version, assuming version at least 1.4.11: %v\n", err) checkPresent = true } if !checkPresent { cmd := append([]string{"-A"}, args...) return existsForOldIpTables(table, strings.Join(cmd, " ")) } else { cmd := append([]string{"-t", table, "-C"}, args...) err = exec.Command(ipt.path, cmd...).Run() } switch { case err == nil: return true, nil case err.(*exec.ExitError).Sys().(syscall.WaitStatus).ExitStatus() == 1: return false, nil default: return false, err } }