launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/provider/maas/environprovider.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package maas 5 6 import ( 7 "errors" 8 "os" 9 10 "github.com/loggo/loggo" 11 12 "launchpad.net/juju-core/environs" 13 "launchpad.net/juju-core/environs/config" 14 "launchpad.net/juju-core/instance" 15 "launchpad.net/juju-core/juju/osenv" 16 "launchpad.net/juju-core/utils" 17 ) 18 19 // Logger for the MAAS provider. 20 var logger = loggo.GetLogger("juju.provider.maas") 21 22 type maasEnvironProvider struct{} 23 24 var _ environs.EnvironProvider = (*maasEnvironProvider)(nil) 25 26 var providerInstance maasEnvironProvider 27 28 func init() { 29 environs.RegisterProvider("maas", maasEnvironProvider{}) 30 } 31 32 func (maasEnvironProvider) Open(cfg *config.Config) (environs.Environ, error) { 33 logger.Debugf("opening environment %q.", cfg.Name()) 34 env, err := NewEnviron(cfg) 35 if err != nil { 36 return nil, err 37 } 38 return env, nil 39 } 40 41 var errAgentNameAlreadySet = errors.New( 42 "maas-agent-name is already set; this should not be set by hand") 43 44 func (p maasEnvironProvider) Prepare(cfg *config.Config) (environs.Environ, error) { 45 attrs := cfg.UnknownAttrs() 46 oldName, found := attrs["maas-agent-name"] 47 if found && oldName != "" { 48 return nil, errAgentNameAlreadySet 49 } 50 uuid, err := utils.NewUUID() 51 if err != nil { 52 return nil, err 53 } 54 attrs["maas-agent-name"] = uuid.String() 55 cfg, err = cfg.Apply(attrs) 56 if err != nil { 57 return nil, err 58 } 59 return p.Open(cfg) 60 } 61 62 // Boilerplate config YAML. Don't mess with the indentation or add newlines! 63 var boilerplateYAML = ` 64 # https://juju.ubuntu.com/docs/config-maas.html 65 maas: 66 type: maas 67 68 # maas-server specifies the location of the MAAS server. It must 69 # specify the base path. 70 maas-server: 'http://192.168.1.1/MAAS/' 71 72 # maas-oauth holds the OAuth credentials from MAAS. 73 maas-oauth: '<add your OAuth credentials from MAAS here>' 74 75 `[1:] 76 77 // BoilerplateConfig is specified in the EnvironProvider interface. 78 func (maasEnvironProvider) BoilerplateConfig() string { 79 return boilerplateYAML 80 } 81 82 // SecretAttrs is specified in the EnvironProvider interface. 83 func (prov maasEnvironProvider) SecretAttrs(cfg *config.Config) (map[string]string, error) { 84 secretAttrs := make(map[string]string) 85 maasCfg, err := prov.newConfig(cfg) 86 if err != nil { 87 return nil, err 88 } 89 secretAttrs["maas-oauth"] = maasCfg.maasOAuth() 90 return secretAttrs, nil 91 } 92 93 func (maasEnvironProvider) hostname() (string, error) { 94 // Hack to get container ip addresses properly for MAAS demo. 95 if os.Getenv(osenv.JujuContainerTypeEnvKey) == string(instance.LXC) { 96 return utils.GetAddressForInterface("eth0") 97 } 98 info := machineInfo{} 99 err := info.load() 100 if err != nil { 101 return "", err 102 } 103 return info.Hostname, nil 104 } 105 106 // PublicAddress is specified in the EnvironProvider interface. 107 func (prov maasEnvironProvider) PublicAddress() (string, error) { 108 return prov.hostname() 109 } 110 111 // PrivateAddress is specified in the EnvironProvider interface. 112 func (prov maasEnvironProvider) PrivateAddress() (string, error) { 113 return prov.hostname() 114 }