func()

in pkg/skoop/plugin/flannel.go [323:393]


func (r *flannelRoute) getDstNodeInfo(nodeName string) (*flannelNodeInfo, error) {
	if info, ok := r.nodeInfoCache[nodeName]; ok {
		return info, nil
	}

	node, err := r.ipCache.GetNodeFromName(nodeName)
	if err != nil {
		return nil, err
	}
	if node == nil {
		return nil, fmt.Errorf("node %s not found in k8s nodes", nodeName)
	}

	ip, cidr, err := net.ParseCIDR(node.Spec.PodCIDR)
	if err != nil {
		return nil, err
	}
	nextNodeIP := node.Annotations["flannel.alpha.coreos.com/public-ip"]
	if nextNodeIP == "" {
		return nil, fmt.Errorf("node %s does not have flannel public-ip annotation", nodeName)
	}
	backendTypeAnnotation, ok := node.Annotations["flannel.alpha.coreos.com/backend-type"]
	if !ok {
		return nil, fmt.Errorf("node %s does not have flannel backend-type annotation", nodeName)
	}

	var backendType FlannelBackendType
	var dev *netstack.Interface
	var vtep net.IP
	if strings.EqualFold(backendTypeAnnotation, string(FlannelBackendTypeVxlan)) {
		vtep = ip
		dev = &netstack.Interface{
			Name:   flannelVxlanInterface,
			MTU:    1450,
			Driver: "vxlan",
		}
		backendType = FlannelBackendTypeVxlan
	} else if strings.EqualFold(backendTypeAnnotation, string(FlannelBackendTypeHostGW)) {
		vtep = net.ParseIP(nextNodeIP)
		backendType = FlannelBackendTypeHostGW
	} else {
		backendType = r.cniMode
	}

	if dev == nil {
		dev = &netstack.Interface{
			Name: r.iface,
		}
	}

	route := assertions.RouteAssertion{}
	if vtep != nil && !vtep.IsUnspecified() {
		route.Gw = &vtep
	}

	if dev != nil {
		route.Dev = &dev.Name
	}

	info := &flannelNodeInfo{
		Vtep:        vtep,
		CIDR:        cidr,
		BackendType: backendType,
		NodeIP:      net.ParseIP(nextNodeIP),
		Dev:         dev,
		Route:       route,
	}

	r.nodeInfoCache[nodeName] = info
	return info, nil
}