in pkg/openstack/instances.go [459:566]
func nodeAddresses(srv *servers.Server, interfaces []attachinterfaces.Interface, networkingOpts NetworkingOpts) ([]v1.NodeAddress, error) {
addrs := []v1.NodeAddress{}
// parse private IP addresses first in an ordered manner
for _, iface := range interfaces {
for _, fixedIP := range iface.FixedIPs {
if iface.PortState == "ACTIVE" {
isIPv6 := net.ParseIP(fixedIP.IPAddress).To4() == nil
if !(isIPv6 && networkingOpts.IPv6SupportDisabled) {
AddToNodeAddresses(&addrs,
v1.NodeAddress{
Type: v1.NodeInternalIP,
Address: fixedIP.IPAddress,
},
)
}
}
}
}
// process public IP addresses
if srv.AccessIPv4 != "" {
AddToNodeAddresses(&addrs,
v1.NodeAddress{
Type: v1.NodeExternalIP,
Address: srv.AccessIPv4,
},
)
}
if srv.AccessIPv6 != "" && !networkingOpts.IPv6SupportDisabled {
AddToNodeAddresses(&addrs,
v1.NodeAddress{
Type: v1.NodeExternalIP,
Address: srv.AccessIPv6,
},
)
}
if srv.Metadata[TypeHostName] != "" {
AddToNodeAddresses(&addrs,
v1.NodeAddress{
Type: v1.NodeHostName,
Address: srv.Metadata[TypeHostName],
},
)
}
// process the rest
type Address struct {
IPType string `mapstructure:"OS-EXT-IPS:type"`
Addr string
}
var addresses map[string][]Address
err := mapstructure.Decode(srv.Addresses, &addresses)
if err != nil {
return nil, err
}
var networks []string
for k := range addresses {
networks = append(networks, k)
}
sort.Strings(networks)
for _, network := range networks {
for _, props := range addresses[network] {
var addressType v1.NodeAddressType
if props.IPType == "floating" {
addressType = v1.NodeExternalIP
} else if util.Contains(networkingOpts.PublicNetworkName, network) {
addressType = v1.NodeExternalIP
// removing already added address to avoid listing it as both ExternalIP and InternalIP
// may happen due to listing "private" network as "public" in CCM's config
RemoveFromNodeAddresses(&addrs,
v1.NodeAddress{
Address: props.Addr,
},
)
} else {
if len(networkingOpts.InternalNetworkName) == 0 || util.Contains(networkingOpts.InternalNetworkName, network) {
addressType = v1.NodeInternalIP
} else {
klog.V(5).Infof("Node '%s' address '%s' ignored due to 'internal-network-name' option", srv.Name, props.Addr)
RemoveFromNodeAddresses(&addrs,
v1.NodeAddress{
Address: props.Addr,
},
)
continue
}
}
isIPv6 := net.ParseIP(props.Addr).To4() == nil
if !(isIPv6 && networkingOpts.IPv6SupportDisabled) {
AddToNodeAddresses(&addrs,
v1.NodeAddress{
Type: addressType,
Address: props.Addr,
},
)
}
}
}
return addrs, nil
}