func environProvider(st *state.State) (environs.EnvironProvider, error) { model, err := st.Model() if err != nil { return nil, errors.Annotate(err, "getting model") } cloud, err := st.Cloud(model.Cloud()) if err != nil { return nil, errors.Annotate(err, "getting cloud") } // EnvironProvider implements state.ConfigValidator. return environs.Provider(cloud.Type) }
// retrieveLatestCharmInfo looks up the charm store to return the charm URLs for the // latest revision of the deployed charms. func retrieveLatestCharmInfo(st *state.State) ([]latestCharmInfo, error) { // First get the uuid for the environment to use when querying the charm store. env, err := st.Model() if err != nil { return nil, err } services, err := st.AllApplications() if err != nil { return nil, err } client, err := NewCharmStoreClient(st) if err != nil { return nil, errors.Trace(err) } var charms []charmstore.CharmID var resultsIndexedServices []*state.Application for _, service := range services { curl, _ := service.CharmURL() if curl.Schema == "local" { // Version checking for charms from local repositories is not // currently supported, since we don't yet support passing in // a path to the local repo. This may change if the need arises. continue } cid := charmstore.CharmID{ URL: curl, Channel: service.Channel(), } charms = append(charms, cid) resultsIndexedServices = append(resultsIndexedServices, service) } metadata := map[string]string{ "environment_uuid": env.UUID(), "cloud": env.Cloud(), "cloud_region": env.CloudRegion(), } cloud, err := st.Cloud(env.Cloud()) if err != nil { metadata["provider"] = "unknown" } else { metadata["provider"] = cloud.Type } results, err := charmstore.LatestCharmInfo(client, charms, metadata) if err != nil { return nil, err } var latest []latestCharmInfo for i, result := range results { if result.Error != nil { logger.Errorf("retrieving charm info for %s: %v", charms[i].URL, result.Error) continue } service := resultsIndexedServices[i] latest = append(latest, latestCharmInfo{ CharmInfo: result.CharmInfo, service: service, }) } return latest, nil }