diff --git a/pkg/cloudprovider/providers/openstack/openstack.go b/pkg/cloudprovider/providers/openstack/openstack.go index 6cae13d4c40c1..56eb351b8bb16 100644 --- a/pkg/cloudprovider/providers/openstack/openstack.go +++ b/pkg/cloudprovider/providers/openstack/openstack.go @@ -23,6 +23,7 @@ import ( "fmt" "io" "io/ioutil" + "net" "net/http" "os" "regexp" @@ -511,7 +512,7 @@ func getAddressesByName(client *gophercloud.ServiceClient, name types.NodeName) return nodeAddresses(srv) } -func getAddressByName(client *gophercloud.ServiceClient, name types.NodeName) (string, error) { +func getAddressByName(client *gophercloud.ServiceClient, name types.NodeName, needIPv6 bool) (string, error) { addrs, err := getAddressesByName(client, name) if err != nil { return "", err @@ -520,12 +521,20 @@ func getAddressByName(client *gophercloud.ServiceClient, name types.NodeName) (s } for _, addr := range addrs { - if addr.Type == v1.NodeInternalIP { + isIPv6 := net.ParseIP(addr.Address).To4() == nil + if (addr.Type == v1.NodeInternalIP) && (isIPv6 == needIPv6) { return addr.Address, nil } } - return addrs[0].Address, nil + for _, addr := range addrs { + isIPv6 := net.ParseIP(addr.Address).To4() == nil + if (addr.Type == v1.NodeExternalIP) && (isIPv6 == needIPv6) { + return addr.Address, nil + } + } + // It should never return an address from a different IP Address family than the one needed + return "", ErrNoAddressFound } // getAttachedInterfacesByID returns the node interfaces of the specified instance. diff --git a/pkg/cloudprovider/providers/openstack/openstack_routes.go b/pkg/cloudprovider/providers/openstack/openstack_routes.go index 9e2b4cda1cd68..4b0b8047a7dd9 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_routes.go +++ b/pkg/cloudprovider/providers/openstack/openstack_routes.go @@ -19,6 +19,7 @@ package openstack import ( "context" "errors" + "net" "github.com/gophercloud/gophercloud" "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" @@ -146,7 +147,10 @@ func (r *Routes) CreateRoute(ctx context.Context, clusterName string, nameHint s onFailure := newCaller() - addr, err := getAddressByName(r.compute, route.TargetNode) + ip, _, _ := net.ParseCIDR(route.DestinationCIDR) + isCIDRv6 := ip.To4() == nil + addr, err := getAddressByName(r.compute, route.TargetNode, isCIDRv6) + if err != nil { return err } @@ -219,7 +223,10 @@ func (r *Routes) DeleteRoute(ctx context.Context, clusterName string, route *clo onFailure := newCaller() - addr, err := getAddressByName(r.compute, route.TargetNode) + ip, _, _ := net.ParseCIDR(route.DestinationCIDR) + isCIDRv6 := ip.To4() == nil + addr, err := getAddressByName(r.compute, route.TargetNode, isCIDRv6) + if err != nil { return err }