Skip to content

Commit a838e86

Browse files
committed
Ensures via tests that API addresses for CAAS return public addresses
for agents with no duplication.
1 parent ef20f66 commit a838e86

File tree

2 files changed

+160
-14
lines changed

2 files changed

+160
-14
lines changed

state/address.go

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -278,19 +278,13 @@ func (st *State) apiHostPortsForCAAS(public bool) (addresses []network.SpaceHost
278278
logger.Debugf("getting api hostports for CAAS: public %t, addresses %v", public, addresses)
279279
}()
280280

281-
ctrlSt, err := st.newStateNoWorkers(st.ControllerModelUUID())
282-
if err != nil {
283-
return nil, errors.Trace(err)
284-
}
285-
defer func() { _ = ctrlSt.Close() }()
286-
287-
controllerConfig, err := ctrlSt.ControllerConfig()
281+
controllerConfig, err := st.ControllerConfig()
288282
if err != nil {
289283
return nil, errors.Trace(err)
290284
}
291285

292286
apiPort := controllerConfig.APIPort()
293-
svc, err := ctrlSt.CloudService(controllerConfig.ControllerUUID())
287+
svc, err := st.CloudService(controllerConfig.ControllerUUID())
294288
if err != nil {
295289
return nil, errors.Trace(err)
296290
}
@@ -300,15 +294,31 @@ func (st *State) apiHostPortsForCAAS(public bool) (addresses []network.SpaceHost
300294
return []network.SpaceHostPorts{network.SpaceAddressesWithPort(addrs, apiPort)}
301295
}
302296

303-
// select public address.
304-
publicAddr, _ := addrs.OneMatchingScope(network.ScopeMatchPublic)
297+
// Return all publicly available addresses for clients.
298+
// Scope matching falls back through a hierarchy,
299+
// so these may actually be local-cloud addresses.
300+
publicAddrs := addrs.AllMatchingScope(network.ScopeMatchPublic)
305301
if public {
306-
return addrsToHostPorts(publicAddr), nil
302+
return addrsToHostPorts(publicAddrs...), nil
303+
}
304+
305+
// TODO(wallyworld) - for now, return all addresses for agents to try, public last.
306+
307+
// If we are after local-cloud addresses and those were all that public
308+
// matching turned up, just return those.
309+
if len(publicAddrs) > 0 && publicAddrs[0].Scope == network.ScopeCloudLocal {
310+
return addrsToHostPorts(publicAddrs...), nil
311+
}
312+
313+
localAddrs := addrs.AllMatchingScope(network.ScopeMatchCloudLocal)
314+
315+
// If there were no local-cloud addresses, return the public ones.
316+
if len(localAddrs) == 0 || localAddrs[0].Scope == network.ScopePublic {
317+
return addrsToHostPorts(publicAddrs...), nil
307318
}
308319

309-
// TODO(wallyworld) - for now, return all addresses for agents to try, public last
310-
result := addrsToHostPorts(addrs.AllMatchingScope(network.ScopeMatchCloudLocal)...)
311-
return append(result, addrsToHostPorts(publicAddr)...), nil
320+
// Otherwise return everything, local-cloud first.
321+
return addrsToHostPorts(append(localAddrs, publicAddrs...)...), nil
312322
}
313323

314324
// apiHostPortsForKey returns API addresses extracted from the document

state/address_test.go

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,139 @@ func (s *ControllerAddressesSuite) TestWatchAPIHostPortsForAgents(c *gc.C) {
368368
statetesting.AssertStop(c, w)
369369
wc.AssertClosed()
370370
}
371+
372+
type CAASAddressesSuite struct {
373+
statetesting.StateSuite
374+
}
375+
376+
var _ = gc.Suite(&CAASAddressesSuite{})
377+
378+
func (s *CAASAddressesSuite) SetUpTest(c *gc.C) {
379+
s.StateSuite.SetUpTest(c)
380+
state.SetModelTypeToCAAS(c, s.State, s.Model)
381+
}
382+
383+
func (s *CAASAddressesSuite) TestAPIHostPortsCloudLocalOnly(c *gc.C) {
384+
machineAddr := network.MachineAddress{
385+
Value: "10.10.10.10",
386+
Type: network.IPv4Address,
387+
Scope: network.ScopeCloudLocal,
388+
}
389+
390+
_, err := s.State.SaveCloudService(state.SaveCloudServiceArgs{
391+
Id: s.Model.ControllerUUID(),
392+
ProviderId: "whatever",
393+
Addresses: network.SpaceAddresses{{MachineAddress: machineAddr}},
394+
})
395+
c.Assert(err, jc.ErrorIsNil)
396+
397+
exp := []network.SpaceHostPorts{{{
398+
SpaceAddress: network.SpaceAddress{MachineAddress: machineAddr},
399+
NetPort: 17777,
400+
}}}
401+
402+
addrs, err := s.State.APIHostPortsForAgents()
403+
c.Assert(err, jc.ErrorIsNil)
404+
c.Assert(addrs, gc.DeepEquals, exp)
405+
406+
addrs, err = s.State.APIHostPortsForClients()
407+
c.Assert(err, jc.ErrorIsNil)
408+
c.Assert(addrs, gc.DeepEquals, exp)
409+
}
410+
411+
func (s *CAASAddressesSuite) TestAPIHostPortsPublicOnly(c *gc.C) {
412+
machineAddr := network.MachineAddress{
413+
Value: "10.10.10.10",
414+
Type: network.IPv4Address,
415+
Scope: network.ScopePublic,
416+
}
417+
418+
_, err := s.State.SaveCloudService(state.SaveCloudServiceArgs{
419+
Id: s.Model.ControllerUUID(),
420+
ProviderId: "whatever",
421+
Addresses: network.SpaceAddresses{{MachineAddress: machineAddr}},
422+
})
423+
c.Assert(err, jc.ErrorIsNil)
424+
425+
exp := []network.SpaceHostPorts{{{
426+
SpaceAddress: network.SpaceAddress{MachineAddress: machineAddr},
427+
NetPort: 17777,
428+
}}}
429+
430+
addrs, err := s.State.APIHostPortsForAgents()
431+
c.Assert(err, jc.ErrorIsNil)
432+
c.Assert(addrs, gc.DeepEquals, exp)
433+
434+
addrs, err = s.State.APIHostPortsForClients()
435+
c.Assert(err, jc.ErrorIsNil)
436+
c.Assert(addrs, gc.DeepEquals, exp)
437+
}
438+
439+
func (s *CAASAddressesSuite) TestAPIHostPortsMultiple(c *gc.C) {
440+
machineAddr1 := network.MachineAddress{
441+
Value: "10.10.10.1",
442+
Type: network.IPv4Address,
443+
Scope: network.ScopePublic,
444+
}
445+
machineAddr2 := network.MachineAddress{
446+
Value: "10.10.10.2",
447+
Type: network.IPv4Address,
448+
Scope: network.ScopePublic,
449+
}
450+
machineAddr3 := network.MachineAddress{
451+
Value: "100.10.10.1",
452+
Type: network.IPv4Address,
453+
Scope: network.ScopeCloudLocal,
454+
}
455+
machineAddr4 := network.MachineAddress{
456+
Value: "100.10.10.2",
457+
Type: network.IPv4Address,
458+
Scope: network.ScopeCloudLocal,
459+
}
460+
461+
_, err := s.State.SaveCloudService(state.SaveCloudServiceArgs{
462+
Id: s.Model.ControllerUUID(),
463+
ProviderId: "whatever",
464+
Addresses: network.SpaceAddresses{
465+
{MachineAddress: machineAddr1},
466+
{MachineAddress: machineAddr2},
467+
{MachineAddress: machineAddr3},
468+
{MachineAddress: machineAddr4},
469+
},
470+
})
471+
c.Assert(err, jc.ErrorIsNil)
472+
473+
addrs, err := s.State.APIHostPortsForAgents()
474+
c.Assert(err, jc.ErrorIsNil)
475+
476+
// Local-cloud addresses must come first.
477+
c.Assert(addrs[0][:2], jc.SameContents, network.SpaceHostPorts{
478+
{
479+
SpaceAddress: network.SpaceAddress{MachineAddress: machineAddr3},
480+
NetPort: 17777,
481+
},
482+
{
483+
SpaceAddress: network.SpaceAddress{MachineAddress: machineAddr4},
484+
NetPort: 17777,
485+
},
486+
})
487+
488+
exp := network.SpaceHostPorts{
489+
{
490+
SpaceAddress: network.SpaceAddress{MachineAddress: machineAddr1},
491+
NetPort: 17777,
492+
},
493+
{
494+
SpaceAddress: network.SpaceAddress{MachineAddress: machineAddr2},
495+
NetPort: 17777,
496+
},
497+
}
498+
499+
// Public ones should also follow.
500+
c.Assert(addrs[0][2:], jc.SameContents, exp)
501+
502+
// Only the public ones should be returned.
503+
addrs, err = s.State.APIHostPortsForClients()
504+
c.Assert(err, jc.ErrorIsNil)
505+
c.Assert(addrs, gc.DeepEquals, []network.SpaceHostPorts{exp})
506+
}

0 commit comments

Comments
 (0)