func (c *APIAddressUpdater) Handle(_ <-chan struct{}) error { addresses, err := c.addresser.APIHostPorts() if err != nil { return fmt.Errorf("error getting addresses: %v", err) } // Filter out any LXC bridge addresses. See LP bug #1416928. hpsToSet := make([][]network.HostPort, 0, len(addresses)) for _, hostPorts := range addresses { // Strip ports, filter, then add ports again. filtered := network.FilterLXCAddresses(network.HostsWithoutPort(hostPorts)) hps := make([]network.HostPort, 0, len(filtered)) for _, hostPort := range hostPorts { for _, addr := range filtered { if addr.Value == hostPort.Address.Value { hps = append(hps, hostPort) } } } if len(hps) > 0 { hpsToSet = append(hpsToSet, hps) } } if err := c.setter.SetAPIHostPorts(hpsToSet); err != nil { return fmt.Errorf("error setting addresses: %v", err) } return nil }
func (*HostPortSuite) TestAddressesWithPortAndHostsWithoutPort(c *gc.C) { addrs := network.NewAddresses("0.1.2.3", "0.2.4.6") hps := network.AddressesWithPort(addrs, 999) c.Assert(hps, jc.DeepEquals, []network.HostPort{{ Address: network.NewAddress("0.1.2.3"), Port: 999, }, { Address: network.NewAddress("0.2.4.6"), Port: 999, }}) c.Assert(network.HostsWithoutPort(hps), jc.DeepEquals, addrs) }
// setServerAPIAddresses sets the given addresses on the dummy // bootstrap instance and in state. func (s *EndpointSuite) setServerAPIAddresses(c *gc.C, addresses ...network.HostPort) { insts, err := s.Environ.Instances([]instance.Id{dummy.BootstrapInstanceId}) c.Assert(err, jc.ErrorIsNil) err = s.State.SetAPIHostPorts([][]network.HostPort{addresses}) c.Assert(err, jc.ErrorIsNil) dummy.SetInstanceAddresses(insts[0], network.HostsWithoutPort(addresses)) instAddrs, err := insts[0].Addresses() c.Assert(err, jc.ErrorIsNil) stateAddrs, err := s.State.APIHostPorts() c.Assert(err, jc.ErrorIsNil) c.Logf("instance addresses set to %v", instAddrs) c.Logf("state addresses set to %v", stateAddrs) }
// Handle is part of the watcher.NotifyHandler interface. func (c *APIAddressUpdater) Handle(_ <-chan struct{}) error { addresses, err := c.addresser.APIHostPorts() if err != nil { return fmt.Errorf("error getting addresses: %v", err) } // Filter out any LXC bridge addresses. See LP bug #1416928. hpsToSet := make([][]network.HostPort, 0, len(addresses)) for _, hostPorts := range addresses { // First try to keep only addresses in the default space where all API servers are on. defaultSpaceHP, ok := network.SelectHostPortBySpace(hostPorts, network.DefaultSpace) if ok { hpsToSet = append(hpsToSet, []network.HostPort{defaultSpaceHP}) continue } else { // As a fallback, use the old behavior. logger.Warningf("cannot determine API addresses by space %q (using all as fallback)", network.DefaultSpace) } // Strip ports, filter, then add ports again. filtered := network.FilterLXCAddresses(network.HostsWithoutPort(hostPorts)) hps := make([]network.HostPort, 0, len(filtered)) for _, hostPort := range hostPorts { for _, addr := range filtered { if addr.Value == hostPort.Address.Value { hps = append(hps, hostPort) } } } if len(hps) > 0 { hpsToSet = append(hpsToSet, hps) } } logger.Debugf("updating API hostPorts to %+v", hpsToSet) if err := c.setter.SetAPIHostPorts(hpsToSet); err != nil { return fmt.Errorf("error setting addresses: %v", err) } return nil }