func getBackendAddrsFromTrafficDirector()

in dp_check/dp_check.go [1054:1136]


func getBackendAddrsFromTrafficDirector(addressFamily string) ([]string, error) {
	// Open a RPC stream to Traffic Director
	ctx, cancel := context.WithTimeout(context.Background(), time.Second*20)
	defer cancel()
	stream, err := openAdsStream(ctx)
	if err != nil {
		return []string{}, fmt.Errorf("failed to open stream to Traffic Director: %v", err)
	}
	// Create node
	zone, err := getZone(10 * time.Second)
	if err != nil {
		return []string{}, fmt.Errorf("failed to get zone from metadata server: %v", err)
	}
	var ipv6Capable bool
	if *ipv6CapableNodeMetadataOverride != "" {
		if *ipv6CapableNodeMetadataOverride == "true" {
			ipv6Capable = true
		} else if *ipv6CapableNodeMetadataOverride == "false" {
			ipv6Capable = false
		} else {
			return []string{}, fmt.Errorf("invalid value for --ipv6_capable_node_metadata_override: %v", *ipv6CapableNodeMetadataOverride)
		}
	} else {
		if addressFamily == "IPv6" {
			ipv6Capable = true
		} else if addressFamily == "IPv4" {
			ipv6Capable = false
		} else {
			return []string{}, fmt.Errorf("invalid address family: %v", addressFamily)
		}
	}
	node := newNode(zone, ipv6Capable)
	// XDS
	versionInfoMap := map[string]string{
		V3ListenerURL:    "",
		V3RouteConfigURL: "",
		V3ClusterURL:     "",
		V3EndpointsURL:   "",
	}
	nonceMap := map[string]string{
		V3ListenerURL:    "",
		V3RouteConfigURL: "",
		V3ClusterURL:     "",
		V3EndpointsURL:   "",
	}
	// LDS
	clusterName, err := checkLDS(stream, node, versionInfoMap, nonceMap)
	if err != nil {
		return []string{}, fmt.Errorf("LDS failed: %v", err)
	}
	// CDS
	serviceName, err := checkCDS(stream, node, clusterName, versionInfoMap, nonceMap)
	if err != nil {
		return []string{}, fmt.Errorf("CDS failed: %v", err)
	}
	// EDS
	xdsBackendAddrs, err := checkEDS(stream, node, serviceName, versionInfoMap, nonceMap)
	if err != nil {
		return []string{}, fmt.Errorf("EDS failed: %v", err)
	}
	for _, backend := range xdsBackendAddrs {
		// check if the backend address is of the expected address family
		if addressFamily == "IPv4" {
			ip, err := parseAddress(backend)
			if err != nil {
				return []string{}, fmt.Errorf("failed to parse backend address %v: %v", backend, err)
			}
			if ip.To4() == nil {
				return []string{}, fmt.Errorf("backend address %v is not IPv4", backend)
			}
		} else if addressFamily == "IPv6" {
			ip, err := parseAddress(backend)
			if err != nil {
				return []string{}, fmt.Errorf("failed to parse backend address %v: %v", backend, err)
			}
			if ip.To4() != nil {
				return []string{}, fmt.Errorf("backend address %v is not IPv6", backend)
			}
		}
		infoLog.Printf("Found %v backend address from Traffic Director: |%v|", addressFamily, backend)
	}
	return xdsBackendAddrs, nil
}