@@ -48,7 +48,7 @@ func TestAddressManagerNoRequestedIP(t *testing.T) {
48
48
require .NoError (t , err )
49
49
targetIP := ""
50
50
51
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , targetIP , cloud .SchemeInternal , cloud .NetworkTierDefault , address .IPv4Version , klog .TODO ())
51
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , targetIP , cloud .SchemeInternal , cloud .NetworkTierDefault , address .IPv4Version , klog .TODO ())
52
52
testHoldAddress (t , mgr , svc , testLBName , vals .Region , targetIP , string (cloud .SchemeInternal ), cloud .NetworkTierDefault .ToGCEValue ())
53
53
testReleaseAddress (t , mgr , svc , testLBName , vals .Region )
54
54
}
@@ -59,7 +59,7 @@ func TestAddressManagerBasic(t *testing.T) {
59
59
require .NoError (t , err )
60
60
targetIP := "1.1.1.1"
61
61
62
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , targetIP , cloud .SchemeInternal , cloud .NetworkTierDefault , address .IPv4Version , klog .TODO ())
62
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , targetIP , cloud .SchemeInternal , cloud .NetworkTierDefault , address .IPv4Version , klog .TODO ())
63
63
testHoldAddress (t , mgr , svc , testLBName , vals .Region , targetIP , string (cloud .SchemeInternal ), cloud .NetworkTierDefault .ToGCEValue ())
64
64
testReleaseAddress (t , mgr , svc , testLBName , vals .Region )
65
65
}
@@ -75,7 +75,7 @@ func TestAddressManagerOrphaned(t *testing.T) {
75
75
err = svc .ReserveRegionAddress (addr , vals .Region )
76
76
require .NoError (t , err )
77
77
78
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , targetIP , cloud .SchemeInternal , cloud .NetworkTierDefault , address .IPv4Version , klog .TODO ())
78
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , targetIP , cloud .SchemeInternal , cloud .NetworkTierDefault , address .IPv4Version , klog .TODO ())
79
79
testHoldAddress (t , mgr , svc , testLBName , vals .Region , targetIP , string (cloud .SchemeInternal ), cloud .NetworkTierDefault .ToGCEValue ())
80
80
testReleaseAddress (t , mgr , svc , testLBName , vals .Region )
81
81
}
@@ -87,7 +87,7 @@ func TestAddressManagerStandardNetworkTier(t *testing.T) {
87
87
require .NoError (t , err )
88
88
targetIP := "1.1.1.1"
89
89
90
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , targetIP , cloud .SchemeExternal , cloud .NetworkTierStandard , address .IPv4Version , klog .TODO ())
90
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , targetIP , cloud .SchemeExternal , cloud .NetworkTierStandard , address .IPv4Version , klog .TODO ())
91
91
testHoldAddress (t , mgr , svc , testLBName , vals .Region , targetIP , string (cloud .SchemeExternal ), cloud .NetworkTierStandard .ToGCEValue ())
92
92
testReleaseAddress (t , mgr , svc , testLBName , vals .Region )
93
93
}
@@ -98,7 +98,7 @@ func TestAddressManagerStandardNetworkTierNotAvailableForInternalAddress(t *test
98
98
require .NoError (t , err )
99
99
targetIP := "1.1.1.1"
100
100
101
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , targetIP , cloud .SchemeInternal , cloud .NetworkTierStandard , address .IPv4Version , klog .TODO ())
101
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , targetIP , cloud .SchemeInternal , cloud .NetworkTierStandard , address .IPv4Version , klog .TODO ())
102
102
testHoldAddress (t , mgr , svc , testLBName , vals .Region , targetIP , string (cloud .SchemeInternal ), cloud .NetworkTierPremium .ToGCEValue ())
103
103
testReleaseAddress (t , mgr , svc , testLBName , vals .Region )
104
104
}
@@ -115,7 +115,7 @@ func TestAddressManagerOutdatedOrphan(t *testing.T) {
115
115
err = svc .ReserveRegionAddress (addr , vals .Region )
116
116
require .NoError (t , err )
117
117
118
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , targetIP , cloud .SchemeInternal , cloud .NetworkTierDefault , address .IPv4Version , klog .TODO ())
118
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , targetIP , cloud .SchemeInternal , cloud .NetworkTierDefault , address .IPv4Version , klog .TODO ())
119
119
testHoldAddress (t , mgr , svc , testLBName , vals .Region , targetIP , string (cloud .SchemeInternal ), cloud .NetworkTierDefault .ToGCEValue ())
120
120
testReleaseAddress (t , mgr , svc , testLBName , vals .Region )
121
121
}
@@ -131,7 +131,7 @@ func TestAddressManagerExternallyOwned(t *testing.T) {
131
131
err = svc .ReserveRegionAddress (addr , vals .Region )
132
132
require .NoError (t , err )
133
133
134
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , targetIP , cloud .SchemeInternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
134
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , targetIP , cloud .SchemeInternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
135
135
ipToUse , ipType , err := mgr .HoldAddress ()
136
136
require .NoError (t , err )
137
137
assert .NotEmpty (t , ipToUse )
@@ -144,14 +144,53 @@ func TestAddressManagerExternallyOwned(t *testing.T) {
144
144
testReleaseAddress (t , mgr , svc , testLBName , vals .Region )
145
145
}
146
146
147
+ // TestAddressManagerExternallyOwnedAndOrphaned tests the case where extrenal address is used
148
+ // and obsolete orphaned address is removed
149
+ func TestAddressManagerExternallyOwnedAndOrphaned (t * testing.T ) {
150
+ svc , err := fakeGCECloud (vals )
151
+ require .NoError (t , err )
152
+
153
+ // ExternallyOwned IP
154
+ externalName := "my-important-address"
155
+ externalIP := "1.1.1.1"
156
+ addr := & compute.Address {Name : externalName , Address : externalIP , AddressType : string (cloud .SchemeInternal )}
157
+ err = svc .ReserveRegionAddress (addr , vals .Region )
158
+ require .NoError (t , err )
159
+
160
+ // Orphaned IP with default LBName name
161
+ orphanedName := testLBName
162
+ orphanedIP := "1.1.1.100"
163
+ orphaned_addr := & compute.Address {Name : orphanedName , Address : orphanedIP , AddressType : string (cloud .SchemeInternal )}
164
+ err = svc .ReserveRegionAddress (orphaned_addr , vals .Region )
165
+ require .NoError (t , err )
166
+
167
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , externalName , externalIP , cloud .SchemeInternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
168
+ ipToUse , ipType , err := mgr .HoldAddress ()
169
+ require .NoError (t , err )
170
+ assert .Equal (t , ipToUse , externalIP )
171
+ assert .Equal (t , address .IPAddrUnmanaged , ipType , "IP Address should not be marked as controller's managed" )
172
+
173
+ // Orphaned IP should be removed
174
+ _ , err = svc .GetRegionAddress (testLBName , vals .Region )
175
+ assert .True (t , utils .IsNotFoundError (err ), "Orphaned Address should be removed" )
176
+
177
+ err = mgr .ReleaseAddress ()
178
+ require .NoError (t , err )
179
+
180
+ // ExternallyOwned IP should stay untouched
181
+ addr , _ = svc .GetRegionAddress (externalName , vals .Region )
182
+ assert .NotNil (t , addr )
183
+
184
+ }
185
+
147
186
// TestAddressManagerNonExisting tests the case where the address can't be reserved
148
187
// automatically and was not reserved by the user (external address case).
149
188
func TestAddressManagerNonExisting (t * testing.T ) {
150
189
svc , err := fakeGCECloud (vals )
151
190
require .NoError (t , err )
152
191
targetIP := "1.1.1.1"
153
192
154
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , targetIP , cloud .SchemeExternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
193
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , targetIP , cloud .SchemeExternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
155
194
156
195
svc .Compute ().(* cloud.MockGCE ).MockAddresses .InsertHook = test .InsertAddressNotAllocatedToProjectErrorHook
157
196
_ , _ , err = mgr .HoldAddress ()
@@ -171,7 +210,7 @@ func TestAddressManagerWrongTypeReserved(t *testing.T) {
171
210
t .Errorf ("svc.ReserveRegionAddress returned err: %v" , err )
172
211
}
173
212
174
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , targetIP , cloud .SchemeExternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
213
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , targetIP , cloud .SchemeExternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
175
214
176
215
_ , _ , err = mgr .HoldAddress ()
177
216
require .Error (t , err )
@@ -188,7 +227,7 @@ func TestAddressManagerExternallyOwnedWrongNetworkTier(t *testing.T) {
188
227
addr := & compute.Address {Name : "my-important-address" , Address : targetIP , AddressType : string (cloud .SchemeInternal ), NetworkTier : string (cloud .NetworkTierStandard )}
189
228
err = svc .ReserveRegionAddress (addr , vals .Region )
190
229
require .NoError (t , err , "" )
191
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , targetIP , cloud .SchemeInternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
230
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , targetIP , cloud .SchemeInternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
192
231
svc .Compute ().(* cloud.MockGCE ).MockAddresses .InsertHook = test .InsertAddressNetworkErrorHook
193
232
_ , _ , err = mgr .HoldAddress ()
194
233
if err == nil || ! utils .IsNetworkTierError (err ) {
@@ -207,12 +246,40 @@ func TestAddressManagerBadExternallyOwned(t *testing.T) {
207
246
err = svc .ReserveRegionAddress (addr , vals .Region )
208
247
require .NoError (t , err )
209
248
210
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , targetIP , cloud .SchemeInternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
249
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , targetIP , cloud .SchemeInternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
211
250
ad , _ , err := mgr .HoldAddress ()
212
251
assert .NotNil (t , err ) // FIXME
213
252
require .Equal (t , ad , "" )
214
253
}
215
254
255
+ // TestAddressManagerBadExternallyOwnedFromAnnotation tests the case where the address exists but isn't
256
+ // owned by the controller. However, this address has the wrong type.
257
+ func TestAddressManagerBadExternallyOwnedFromAnnotation (t * testing.T ) {
258
+ svc , err := fakeGCECloud (vals )
259
+ require .NoError (t , err )
260
+ targetIP := "1.1.1.1"
261
+ addrName := "my-important-address"
262
+
263
+ addrExternal := & compute.Address {Name : addrName , Address : targetIP , AddressType : string (cloud .SchemeExternal )}
264
+ err = svc .ReserveRegionAddress (addrExternal , vals .Region )
265
+ require .NoError (t , err )
266
+
267
+ addrDefault := & compute.Address {Name : testLBName , Address : "1.1.1.100" , AddressType : string (cloud .SchemeInternal )}
268
+ err = svc .ReserveRegionAddress (addrDefault , vals .Region )
269
+ require .NoError (t , err )
270
+
271
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , addrName , targetIP , cloud .SchemeInternal , cloud .NetworkTierPremium , address .IPv4Version , klog .TODO ())
272
+ ad , _ , err := mgr .HoldAddress ()
273
+ assert .NotNil (t , err ) // FIXME
274
+ require .Equal (t , ad , "" )
275
+
276
+ addrExternal , _ = svc .GetRegionAddress (addrName , vals .Region )
277
+ assert .NotNil (t , addrExternal , "ExternallyOwned IP should stay untouched" )
278
+
279
+ _ , err = svc .GetRegionAddress (testLBName , vals .Region )
280
+ assert .True (t , utils .IsNotFoundError (err ), "Orphaned Address should be removed" )
281
+ }
282
+
216
283
// TestAddressManagerIPv6 tests the typical case of reserving and releasing an IPv6 address.
217
284
func TestAddressManagerIPv6 (t * testing.T ) {
218
285
testCases := []struct {
@@ -239,7 +306,7 @@ func TestAddressManagerIPv6(t *testing.T) {
239
306
t .Fatalf ("fakeGCECloud(%v) returned error %v" , vals , err )
240
307
}
241
308
242
- mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , tc .targetIP , cloud .SchemeInternal , cloud .NetworkTierDefault , address .IPv6Version , klog .TODO ())
309
+ mgr := address .NewManager (svc , testSvcName , vals .Region , testSubnet , testLBName , "" , tc .targetIP , cloud .SchemeInternal , cloud .NetworkTierDefault , address .IPv6Version , klog .TODO ())
243
310
testHoldAddress (t , mgr , svc , testLBName , vals .Region , tc .targetIP , string (cloud .SchemeInternal ), cloud .NetworkTierDefault .ToGCEValue ())
244
311
testReleaseAddress (t , mgr , svc , testLBName , vals .Region )
245
312
})
0 commit comments