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  }