@@ -27,6 +27,7 @@ import (
27
27
"github.com/gophercloud/gophercloud/pagination"
28
28
29
29
"k8s.io/cloud-provider-openstack/pkg/metrics"
30
+ cpoerrors "k8s.io/cloud-provider-openstack/pkg/util/errors"
30
31
)
31
32
32
33
// GetNetworkExtensions returns an extension map.
@@ -89,36 +90,53 @@ func GetFloatingNetworkID(client *gophercloud.ServiceClient) (string, error) {
89
90
networks.Network
90
91
external.NetworkExternalExt
91
92
}
92
- var externalNetworks []NetworkWithExternalExt
93
+ var allNetworks []NetworkWithExternalExt
93
94
94
95
mc := metrics .NewMetricContext ("network" , "list" )
95
96
page , err := networks .List (client , networks.ListOpts {}).AllPages ()
96
97
if err != nil {
97
98
return "" , mc .ObserveRequest (err )
98
99
}
99
100
100
- err = networks .ExtractNetworksInto (page , & externalNetworks )
101
+ err = networks .ExtractNetworksInto (page , & allNetworks )
101
102
if err != nil {
102
103
return "" , mc .ObserveRequest (err )
103
104
}
104
- for _ , externalNet := range externalNetworks {
105
- if externalNet .External {
105
+
106
+ for _ , network := range allNetworks {
107
+ if network .External && len (network .Subnets ) > 0 {
106
108
mc := metrics .NewMetricContext ("subnet" , "list" )
107
- page , err := subnets .List (client , subnets.ListOpts {NetworkID : externalNet .ID , IPVersion : 4 }).AllPages ()
109
+ page , err := subnets .List (client , subnets.ListOpts {NetworkID : network .ID }).AllPages ()
108
110
if err != nil {
109
111
return "" , mc .ObserveRequest (err )
110
112
}
111
113
subnetList , err := subnets .ExtractSubnets (page )
112
114
if err != nil {
113
115
return "" , mc .ObserveRequest (err )
114
116
}
115
- if len (subnetList ) == 0 {
116
- continue
117
+ for _ , networkSubnet := range network .Subnets {
118
+ subnet := getSubnet (networkSubnet , subnetList )
119
+ if subnet != nil {
120
+ if subnet .IPVersion == 4 {
121
+ return network .ID , nil
122
+ }
123
+ } else {
124
+ return network .ID , nil
125
+ }
117
126
}
118
- return externalNet .ID , nil
119
127
}
120
128
}
121
- return "" , nil
129
+ return "" , mc .ObserveRequest (cpoerrors .ErrNotFound )
130
+ }
131
+
132
+ // getSubnet checks if a Subnet is present in the list of Subnets the tenant has access to and returns it
133
+ func getSubnet (networkSubnet string , subnetList []subnets.Subnet ) * subnets.Subnet {
134
+ for _ , subnet := range subnetList {
135
+ if subnet .ID == networkSubnet {
136
+ return & subnet
137
+ }
138
+ }
139
+ return nil
122
140
}
123
141
124
142
// GetPorts gets all the filtered ports.
0 commit comments