github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/provider/maas/config.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  	"fmt"
     9  	"net/url"
    10  	"strings"
    11  
    12  	"github.com/juju/schema"
    13  
    14  	"github.com/juju/juju/environs/config"
    15  )
    16  
    17  var configFields = schema.Fields{
    18  	"maas-server": schema.String(),
    19  	// maas-oauth is a colon-separated triplet of:
    20  	// consumer-key:resource-token:resource-secret
    21  	"maas-oauth": schema.String(),
    22  	// maas-agent-name is an optional UUID to group the instances
    23  	// acquired from MAAS, to support multiple environments per MAAS user.
    24  	"maas-agent-name": schema.String(),
    25  }
    26  var configDefaults = schema.Defaults{
    27  	// For backward-compatibility, maas-agent-name is the empty string
    28  	// by default. However, new environments should all use a UUID.
    29  	"maas-agent-name": "",
    30  }
    31  
    32  type maasEnvironConfig struct {
    33  	*config.Config
    34  	attrs map[string]interface{}
    35  }
    36  
    37  func (cfg *maasEnvironConfig) maasServer() string {
    38  	return cfg.attrs["maas-server"].(string)
    39  }
    40  
    41  func (cfg *maasEnvironConfig) maasOAuth() string {
    42  	return cfg.attrs["maas-oauth"].(string)
    43  }
    44  
    45  func (cfg *maasEnvironConfig) maasAgentName() string {
    46  	if uuid, ok := cfg.attrs["maas-agent-name"].(string); ok {
    47  		return uuid
    48  	}
    49  	return ""
    50  }
    51  
    52  func (prov maasEnvironProvider) newConfig(cfg *config.Config) (*maasEnvironConfig, error) {
    53  	validCfg, err := prov.Validate(cfg, nil)
    54  	if err != nil {
    55  		return nil, err
    56  	}
    57  	result := new(maasEnvironConfig)
    58  	result.Config = validCfg
    59  	result.attrs = validCfg.UnknownAttrs()
    60  	return result, nil
    61  }
    62  
    63  var errMalformedMaasOAuth = errors.New("malformed maas-oauth (3 items separated by colons)")
    64  
    65  func (prov maasEnvironProvider) Validate(cfg, oldCfg *config.Config) (*config.Config, error) {
    66  	// Validate base configuration change before validating MAAS specifics.
    67  	err := config.Validate(cfg, oldCfg)
    68  	if err != nil {
    69  		return nil, err
    70  	}
    71  
    72  	validated, err := cfg.ValidateUnknownAttrs(configFields, configDefaults)
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  
    77  	// Add MAAS specific defaults.
    78  	providerDefaults := make(map[string]interface{})
    79  
    80  	// Storage.
    81  	if _, ok := cfg.StorageDefaultBlockSource(); !ok {
    82  		providerDefaults[config.StorageDefaultBlockSourceKey] = maasStorageProviderType
    83  	}
    84  	if len(providerDefaults) > 0 {
    85  		if cfg, err = cfg.Apply(providerDefaults); err != nil {
    86  			return nil, err
    87  		}
    88  	}
    89  
    90  	if oldCfg != nil {
    91  		oldAttrs := oldCfg.UnknownAttrs()
    92  		validMaasAgentName := false
    93  		if oldName, ok := oldAttrs["maas-agent-name"]; !ok || oldName == nil {
    94  			// If maas-agent-name was nil (because the config was
    95  			// generated pre-1.16.2 the only correct value for it is ""
    96  			// See bug #1256179
    97  			validMaasAgentName = (validated["maas-agent-name"] == "")
    98  		} else {
    99  			validMaasAgentName = (validated["maas-agent-name"] == oldName)
   100  		}
   101  		if !validMaasAgentName {
   102  			return nil, fmt.Errorf("cannot change maas-agent-name")
   103  		}
   104  	}
   105  	envCfg := new(maasEnvironConfig)
   106  	envCfg.Config = cfg
   107  	envCfg.attrs = validated
   108  	server := envCfg.maasServer()
   109  	serverURL, err := url.Parse(server)
   110  	if err != nil || serverURL.Scheme == "" || serverURL.Host == "" {
   111  		return nil, fmt.Errorf("malformed maas-server URL '%v': %s", server, err)
   112  	}
   113  	oauth := envCfg.maasOAuth()
   114  	if strings.Count(oauth, ":") != 2 {
   115  		return nil, errMalformedMaasOAuth
   116  	}
   117  	return cfg.Apply(envCfg.attrs)
   118  }