Skip to content

Commit c2d1c1e

Browse files
author
Jing Zhang
committed
Tested with k8s v1.23.
1 parent 91e9026 commit c2d1c1e

File tree

2 files changed

+40
-35
lines changed

2 files changed

+40
-35
lines changed

pkg/openstack/instances.go

Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package openstack
1919
import (
2020
"bytes"
2121
"context"
22-
"encoding/json"
2322
"fmt"
2423
"net"
2524
sysos "os"
@@ -30,7 +29,6 @@ import (
3029
"github.com/gophercloud/gophercloud"
3130
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
3231
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
33-
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/trunk_details"
3432
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
3533
neutronports "github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
3634
"github.com/gophercloud/gophercloud/pagination"
@@ -46,7 +44,6 @@ import (
4644
"k8s.io/cloud-provider-openstack/pkg/util"
4745
"k8s.io/cloud-provider-openstack/pkg/util/errors"
4846
"k8s.io/cloud-provider-openstack/pkg/util/metadata"
49-
"k8s.io/cloud-provider-openstack/pkg/util/openstack"
5047
)
5148

5249
// Instances encapsulates an implementation of Instances for OpenStack.
@@ -576,7 +573,7 @@ func getServerByName(client *gophercloud.ServiceClient, name types.NodeName) (*S
576573
// * access IPs
577574
// * metadata hostname
578575
// * server object Addresses (floating type)
579-
func nodeAddresses(srv *servers.Server, ports []neutronports.Port, client *gophercloud.ServiceClient, networkingOpts NetworkingOpts) ([]v1.NodeAddress, error) {
576+
func nodeAddresses(srv *servers.Server, ports []PortWithTrunkDetails, client *gophercloud.ServiceClient, networkingOpts NetworkingOpts) ([]v1.NodeAddress, error) {
580577
addrs := []v1.NodeAddress{}
581578

582579
// parse private IP addresses first in an ordered manner
@@ -640,35 +637,24 @@ func nodeAddresses(srv *servers.Server, ports []neutronports.Port, client *gophe
640637
// This exposes the vlan networks to which subports are attached
641638
subportAddresses := make(map[string][]Address)
642639

643-
type portWithTrunkDetails struct {
644-
neutronports.Port
645-
trunk_details.TrunkDetailsExt
646-
}
647-
var portDetails []portWithTrunkDetails
648-
649-
bodyBytes, err := json.Marshal(ports)
650-
if err == nil {
651-
if json.Unmarshal(bodyBytes, &portDetails) == nil {
652-
for _, portExt := range portDetails {
653-
klog.V(5).Infof("Node '%s' port '%s' trunk_details '%v'", srv.Name, portExt.Name, portExt.TrunkDetails)
654-
for _, subport := range portExt.TrunkDetails.SubPorts {
655-
p, err := neutronports.Get(client, subport.PortID).Extract()
656-
if err != nil {
657-
klog.Errorf("Failed to get subport %s details: %v", subport.PortID, err)
658-
continue
659-
}
660-
n, err := networks.Get(client, p.NetworkID).Extract()
661-
if err != nil {
662-
klog.Errorf("Failed to get subport %s network details: %v", subport.PortID, err)
663-
continue
664-
}
665-
for _, fixedIP := range p.FixedIPs {
666-
isIPv6 := net.ParseIP(fixedIP.IPAddress).To4() == nil
667-
if !(isIPv6 && networkingOpts.IPv6SupportDisabled) {
668-
addr := Address{IPType: "fixed", Addr: fixedIP.IPAddress}
669-
subportAddresses[n.Name] = append(subportAddresses[n.Name], addr)
670-
}
671-
}
640+
for _, port := range ports {
641+
for _, subport := range port.TrunkDetails.SubPorts {
642+
p, err := neutronports.Get(client, subport.PortID).Extract()
643+
if err != nil {
644+
klog.Errorf("Failed to get subport %s details: %v", subport.PortID, err)
645+
continue
646+
}
647+
n, err := networks.Get(client, p.NetworkID).Extract()
648+
if err != nil {
649+
klog.Errorf("Failed to get subport %s network details: %v", subport.PortID, err)
650+
continue
651+
}
652+
for _, fixedIP := range p.FixedIPs {
653+
isIPv6 := net.ParseIP(fixedIP.IPAddress).To4() == nil
654+
if !(isIPv6 && networkingOpts.IPv6SupportDisabled) {
655+
addr := Address{IPType: "fixed", Addr: fixedIP.IPAddress}
656+
subportAddresses[n.Name] = append(subportAddresses[n.Name], addr)
657+
klog.V(5).Infof("Node '%s' is added subport '%s' address '%s/%s'", srv.Name, p.Name, n.Name, addr)
672658
}
673659
}
674660
}
@@ -735,6 +721,7 @@ func nodeAddresses(srv *servers.Server, ports []neutronports.Port, client *gophe
735721
sortNodeAddresses(addrs, networkingOpts.AddressSortOrder)
736722
}
737723

724+
klog.V(5).Infof("Node '%s' returns addresses '%v'", srv.Name, addrs)
738725
return addrs, nil
739726
}
740727

@@ -753,10 +740,21 @@ func getAddressesByName(client *gophercloud.ServiceClient, name types.NodeName,
753740
}
754741

755742
// getAttachedPorts returns a list of ports attached to a server.
756-
func getAttachedPorts(client *gophercloud.ServiceClient, serverID string) ([]neutronports.Port, error) {
743+
func getAttachedPorts(client *gophercloud.ServiceClient, serverID string) ([]PortWithTrunkDetails, error) {
757744
listOpts := neutronports.ListOpts{
758745
DeviceID: serverID,
759746
}
760747

761-
return openstack.GetPorts(client, listOpts)
748+
var ports []PortWithTrunkDetails
749+
750+
allPages, err := neutronports.List(client, listOpts).AllPages()
751+
if err != nil {
752+
return ports, err
753+
}
754+
err = neutronports.ExtractPortsInto(allPages, &ports)
755+
if err != nil {
756+
return ports, err
757+
}
758+
759+
return ports, nil
762760
}

pkg/openstack/openstack.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import (
2727
"github.com/gophercloud/gophercloud"
2828
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones"
2929
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
30+
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/trunk_details"
31+
neutronports "github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
3032
"github.com/spf13/pflag"
3133
gcfg "gopkg.in/gcfg.v1"
3234
"k8s.io/apimachinery/pkg/types"
@@ -67,6 +69,11 @@ func AddExtraFlags(fs *pflag.FlagSet) {
6769
fs.StringArrayVar(&userAgentData, "user-agent", nil, "Extra data to add to gophercloud user-agent. Use multiple times to add more than one component.")
6870
}
6971

72+
type PortWithTrunkDetails struct {
73+
neutronports.Port
74+
trunk_details.TrunkDetailsExt
75+
}
76+
7077
// LoadBalancer is used for creating and maintaining load balancers
7178
type LoadBalancer struct {
7279
secret *gophercloud.ServiceClient

0 commit comments

Comments
 (0)