// apiInfoConnect looks for endpoint on the given environment and // tries to connect to it, sending the result on the returned channel. func apiInfoConnect(store configstore.Storage, info configstore.EnvironInfo, apiOpen apiOpenFunc, stop <-chan struct{}) (apiState, error) { endpoint := info.APIEndpoint() if info == nil || len(endpoint.Addresses) == 0 { return nil, &infoConnectError{fmt.Errorf("no cached addresses")} } logger.Infof("connecting to API addresses: %v", endpoint.Addresses) apiInfo := &api.Info{ Addrs: endpoint.Addresses, CACert: endpoint.CACert, Tag: names.UserTag(info.APICredentials().User), Password: info.APICredentials().Password, } st, err := apiOpen(apiInfo, api.DefaultDialOpts()) if err != nil { return nil, &infoConnectError{err} } return st, nil }
// cacheChangedAPIAddresses updates the local environment settings (.jenv file) // with the provided API server addresses if they have changed. func cacheChangedAPIAddresses(info configstore.EnvironInfo, st apiState) error { var addrs []string for _, serverHostPorts := range st.APIHostPorts() { for _, hostPort := range serverHostPorts { // Only cache addresses that are likely to be usable, // exclude IPv6 for now and localhost style ones. if hostPort.Type != instance.Ipv6Address && hostPort.NetworkScope != instance.NetworkMachineLocal { addrs = append(addrs, hostPort.NetAddr()) } } } endpoint := info.APIEndpoint() if len(addrs) == 0 || !addrsChanged(endpoint.Addresses, addrs) { return nil } logger.Debugf("API addresses changed from %q to %q", endpoint.Addresses, addrs) endpoint.Addresses = addrs info.SetAPIEndpoint(endpoint) if err := info.Write(); err != nil { return err } logger.Infof("updated API connection settings cache") return nil }