@@ -27,9 +27,9 @@ import (
2727 "strings"
2828
2929 "github.com/gophercloud/gophercloud"
30- "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces"
3130 "github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
3231 "github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
32+ "github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
3333 "github.com/gophercloud/gophercloud/pagination"
3434 "github.com/mitchellh/mapstructure"
3535 v1 "k8s.io/api/core/v1"
@@ -43,11 +43,13 @@ import (
4343 "k8s.io/cloud-provider-openstack/pkg/util"
4444 "k8s.io/cloud-provider-openstack/pkg/util/errors"
4545 "k8s.io/cloud-provider-openstack/pkg/util/metadata"
46+ "k8s.io/cloud-provider-openstack/pkg/util/openstack"
4647)
4748
4849// Instances encapsulates an implementation of Instances for OpenStack.
4950type Instances struct {
5051 compute * gophercloud.ServiceClient
52+ network * gophercloud.ServiceClient
5153 region string
5254 regionProviderID bool
5355 opts metadata.Opts
@@ -148,13 +150,20 @@ func (os *OpenStack) instances() (*Instances, bool) {
148150 return nil , false
149151 }
150152
153+ network , err := client .NewNetworkV2 (os .provider , os .epOpts )
154+ if err != nil {
155+ klog .Errorf ("unable to access network v2 API : %v" , err )
156+ return nil , false
157+ }
158+
151159 regionalProviderID := false
152160 if isRegionalProviderID := sysos .Getenv (RegionalProviderIDEnv ); isRegionalProviderID == "true" {
153161 regionalProviderID = true
154162 }
155163
156164 return & Instances {
157165 compute : compute ,
166+ network : network ,
158167 region : os .epOpts .Region ,
159168 regionProviderID : regionalProviderID ,
160169 opts : os .metadataOpts ,
@@ -226,12 +235,12 @@ func (i *Instances) NodeAddressesByProviderID(ctx context.Context, providerID st
226235 return []v1.NodeAddress {}, err
227236 }
228237
229- interfaces , err := getAttachedInterfacesByID (i .compute , server .ID )
238+ ports , err := getAttachedPorts (i .network , server .ID )
230239 if err != nil {
231240 return []v1.NodeAddress {}, err
232241 }
233242
234- addresses , err := nodeAddresses (server , interfaces , i .networkingOpts )
243+ addresses , err := nodeAddresses (server , ports , i .networkingOpts )
235244 if err != nil {
236245 return []v1.NodeAddress {}, err
237246 }
@@ -332,11 +341,11 @@ func (i *Instances) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloud
332341 return nil , err
333342 }
334343
335- interfaces , err := getAttachedInterfacesByID (i .compute , srv .ID )
344+ ports , err := getAttachedPorts (i .network , srv .ID )
336345 if err != nil {
337346 return nil , err
338347 }
339- addresses , err := nodeAddresses (srv , interfaces , i .networkingOpts )
348+ addresses , err := nodeAddresses (srv , ports , i .networkingOpts )
340349 if err != nil {
341350 return nil , err
342351 }
@@ -564,13 +573,13 @@ func getServerByName(client *gophercloud.ServiceClient, name types.NodeName) (*S
564573// * access IPs
565574// * metadata hostname
566575// * server object Addresses (floating type)
567- func nodeAddresses (srv * servers.Server , interfaces []attachinterfaces. Interface , networkingOpts NetworkingOpts ) ([]v1.NodeAddress , error ) {
576+ func nodeAddresses (srv * servers.Server , ports []ports. Port , networkingOpts NetworkingOpts ) ([]v1.NodeAddress , error ) {
568577 addrs := []v1.NodeAddress {}
569578
570579 // parse private IP addresses first in an ordered manner
571- for _ , iface := range interfaces {
572- for _ , fixedIP := range iface .FixedIPs {
573- if iface . PortState == "ACTIVE" {
580+ for _ , port := range ports {
581+ for _ , fixedIP := range port .FixedIPs {
582+ if port . Status == "ACTIVE" {
574583 isIPv6 := net .ParseIP (fixedIP .IPAddress ).To4 () == nil
575584 if ! (isIPv6 && networkingOpts .IPv6SupportDisabled ) {
576585 AddToNodeAddresses (& addrs ,
@@ -683,31 +692,20 @@ func getAddressesByName(client *gophercloud.ServiceClient, name types.NodeName,
683692 return nil , err
684693 }
685694
686- interfaces , err := getAttachedInterfacesByID (client , srv .ID )
695+ ports , err := getAttachedPorts (client , srv .ID )
687696 if err != nil {
688697 return nil , err
689698 }
690699
691- return nodeAddresses (& srv .Server , interfaces , networkingOpts )
700+ return nodeAddresses (& srv .Server , ports , networkingOpts )
692701}
693702
694- // getAttachedInterfacesByID returns the node interfaces of the specified instance.
695- func getAttachedInterfacesByID (client * gophercloud.ServiceClient , serviceID string ) ([]attachinterfaces.Interface , error ) {
696- var interfaces []attachinterfaces.Interface
697-
698- mc := metrics .NewMetricContext ("server_os_interface" , "list" )
699- pager := attachinterfaces .List (client , serviceID )
700- err := pager .EachPage (func (page pagination.Page ) (bool , error ) {
701- s , err := attachinterfaces .ExtractInterfaces (page )
702- if err != nil {
703- return false , err
704- }
705- interfaces = append (interfaces , s ... )
706- return true , nil
707- })
708- if mc .ObserveRequest (err ) != nil {
709- return interfaces , err
703+ // getAttachedPorts returns a list of ports attached to a server.
704+ func getAttachedPorts (client * gophercloud.ServiceClient , serverID string ) ([]ports.Port , error ) {
705+ listOpts := ports.ListOpts {
706+ DeviceID : serverID ,
707+ DeviceOwner : "compute:nova" ,
710708 }
711709
712- return interfaces , nil
710+ return openstack . GetPorts ( client , listOpts )
713711}
0 commit comments