// getConfig looks for configuration info on the given environment func getConfig(info configstore.EnvironInfo, envs *environs.Environs, envName string) (*config.Config, error) { if info != nil && len(info.BootstrapConfig()) > 0 { cfg, err := config.New(config.NoDefaults, info.BootstrapConfig()) if err != nil { logger.Warningf("failed to parse bootstrap-config: %v", err) } return cfg, err } if envs != nil { cfg, err := envs.Config(envName) if err != nil && !errors.IsNotFound(err) { logger.Warningf("failed to get config for environment %q: %v", envName, err) } return cfg, err } return nil, errors.NotFoundf("environment %q", envName) }
// cacheAPIInfo updates the local environment settings (.jenv file) // with the provided apiInfo, assuming we've just successfully // connected to the API server. func cacheAPIInfo(info configstore.EnvironInfo, apiInfo *api.Info) error { info.SetAPIEndpoint(configstore.APIEndpoint{ Addresses: apiInfo.Addrs, CACert: string(apiInfo.CACert), }) _, username, err := names.ParseTag(apiInfo.Tag, names.UserTagKind) if err != nil { return fmt.Errorf("invalid API user tag: %v", err) } info.SetAPICredentials(configstore.APICredentials{ User: username, Password: apiInfo.Password, }) return info.Write() }
// 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 }