// APIInfo returns an api.Info for the environment. The result is populated // with addresses and CA certificate, but no tag or password. func APIInfo(env Environ) (*api.Info, error) { instanceIds, err := env.ControllerInstances() if err != nil { return nil, err } logger.Debugf("ControllerInstances returned: %v", instanceIds) addrs, err := waitAnyInstanceAddresses(env, instanceIds) if err != nil { return nil, err } defaultSpaceAddr, ok := network.SelectAddressBySpace(addrs, network.DefaultSpace) if ok { addrs = []network.Address{defaultSpaceAddr} logger.Debugf("selected %q as API address in space %q", defaultSpaceAddr.Value, network.DefaultSpace) } else { logger.Warningf("using all API addresses (cannot pick by space %q): %+v", network.DefaultSpace, addrs) } config := env.Config() cert, hasCert := config.CACert() if !hasCert { return nil, errors.New("config has no CACert") } apiPort := config.APIPort() apiAddrs := network.HostPortsToStrings( network.AddressesWithPort(addrs, apiPort), ) uuid, uuidSet := config.UUID() if !uuidSet { return nil, errors.New("config has no UUID") } modelTag := names.NewModelTag(uuid) apiInfo := &api.Info{Addrs: apiAddrs, CACert: cert, ModelTag: modelTag} return apiInfo, nil }
// initAPIHostPorts sets the initial API host/port addresses in state. func initAPIHostPorts(c ConfigSetter, st *state.State, addrs []network.Address, apiPort int) error { var hostPorts []network.HostPort // First try to select the correct address using the default space where all // API servers should be accessible on. spaceAddr, ok := network.SelectAddressBySpace(addrs, network.DefaultSpace) if ok { logger.Debugf("selected %q as API address, using space %q", spaceAddr.Value, network.DefaultSpace) hostPorts = network.AddressesWithPort([]network.Address{spaceAddr}, apiPort) } else { // Fallback to using all instead. hostPorts = network.AddressesWithPort(addrs, apiPort) } return st.SetAPIHostPorts([][]network.HostPort{hostPorts}) }