// builtInProviders returns cloud information for those // providers which are built in to Juju. func builtInProviders() map[string]jujucloud.Cloud { builtIn := make(map[string]jujucloud.Cloud) for _, name := range jujucloud.BuiltInProviderNames { provider, err := environs.Provider(name) if err != nil { // Should never happen but it will on go 1.2 // because lxd provider is not built. logger.Warningf("cloud %q not available on this platform", name) continue } var regions []jujucloud.Region if detector, ok := provider.(environs.CloudRegionDetector); ok { regions, err = detector.DetectRegions() if err != nil && !errors.IsNotFound(err) { logger.Warningf("could not detect regions for %q: %v", name, err) } } cloud := jujucloud.Cloud{ Type: name, Regions: regions, } schema := provider.CredentialSchemas() for authType := range schema { if authType == jujucloud.EmptyAuthType { continue } cloud.AuthTypes = append(cloud.AuthTypes, authType) } builtIn[name] = cloud } return builtIn }
func (g bootstrapConfigGetter) getBootstrapConfigParams(controllerName string) (*jujuclient.BootstrapConfig, *environs.PrepareConfigParams, error) { if _, err := g.store.ControllerByName(controllerName); err != nil { return nil, nil, errors.Annotate(err, "resolving controller name") } bootstrapConfig, err := g.store.BootstrapConfigForController(controllerName) if err != nil { return nil, nil, errors.Annotate(err, "getting bootstrap config") } var credential *cloud.Credential if bootstrapConfig.Credential != "" { bootstrapCloud := cloud.Cloud{ Type: bootstrapConfig.CloudType, Endpoint: bootstrapConfig.CloudEndpoint, IdentityEndpoint: bootstrapConfig.CloudIdentityEndpoint, } if bootstrapConfig.CloudRegion != "" { bootstrapCloud.Regions = []cloud.Region{{ Name: bootstrapConfig.CloudRegion, Endpoint: bootstrapConfig.CloudEndpoint, IdentityEndpoint: bootstrapConfig.CloudIdentityEndpoint, }} } credential, _, _, err = GetCredentials( g.ctx, g.store, GetCredentialsParams{ Cloud: bootstrapCloud, CloudName: bootstrapConfig.Cloud, CloudRegion: bootstrapConfig.CloudRegion, CredentialName: bootstrapConfig.Credential, }, ) if err != nil { return nil, nil, errors.Trace(err) } } else { // The credential was auto-detected; run auto-detection again. cloudCredential, err := DetectCredential( bootstrapConfig.Cloud, bootstrapConfig.CloudType, ) if err != nil { return nil, nil, errors.Trace(err) } // DetectCredential ensures that there is only one credential // to choose from. It's still in a map, though, hence for..range. for _, one := range cloudCredential.AuthCredentials { credential = &one } } // Add attributes from the controller details. controllerDetails, err := g.store.ControllerByName(controllerName) if err != nil { return nil, nil, errors.Trace(err) } // TODO(wallyworld) - remove after beta18 controllerModelUUID := bootstrapConfig.ControllerModelUUID if controllerModelUUID == "" { controllerModelUUID = controllerDetails.ControllerUUID } bootstrapConfig.Config[config.UUIDKey] = controllerModelUUID cfg, err := config.New(config.NoDefaults, bootstrapConfig.Config) if err != nil { return nil, nil, errors.Trace(err) } return bootstrapConfig, &environs.PrepareConfigParams{ environs.CloudSpec{ bootstrapConfig.CloudType, bootstrapConfig.Cloud, bootstrapConfig.CloudRegion, bootstrapConfig.CloudEndpoint, bootstrapConfig.CloudIdentityEndpoint, bootstrapConfig.CloudStorageEndpoint, credential, }, cfg, }, nil }