@@ -19,7 +19,6 @@ package openstack
1919import (
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}
0 commit comments