github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/provider/maas/config_test.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  	"github.com/juju/gomaasapi"
     8  	jc "github.com/juju/testing/checkers"
     9  	"github.com/juju/utils"
    10  	"github.com/juju/utils/set"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/environs"
    14  	"github.com/juju/juju/environs/config"
    15  	"github.com/juju/juju/testing"
    16  )
    17  
    18  type configSuite struct {
    19  	testing.BaseSuite
    20  }
    21  
    22  var _ = gc.Suite(&configSuite{})
    23  
    24  // copyAttrs copies values from src into dest.  If src contains a key that was
    25  // already in dest, its value in dest will still be updated to the one from
    26  // src.
    27  func copyAttrs(src, dest map[string]interface{}) {
    28  	for k, v := range src {
    29  		dest[k] = v
    30  	}
    31  }
    32  
    33  // newConfig creates a MAAS environment config from attributes.
    34  func newConfig(values map[string]interface{}) (*maasModelConfig, error) {
    35  	attrs := testing.FakeConfig().Merge(testing.Attrs{
    36  		"name": "testenv",
    37  		"type": "maas",
    38  	}).Merge(values)
    39  	cfg, err := config.New(config.NoDefaults, attrs)
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  	env, err := environs.New(cfg)
    44  	if err != nil {
    45  		return nil, err
    46  	}
    47  	return env.(*maasEnviron).ecfg(), nil
    48  }
    49  
    50  func (s *configSuite) SetUpTest(c *gc.C) {
    51  	s.BaseSuite.SetUpTest(c)
    52  	mockCapabilities := func(client *gomaasapi.MAASObject) (set.Strings, error) {
    53  		return set.NewStrings("network-deployment-ubuntu"), nil
    54  	}
    55  	s.PatchValue(&GetCapabilities, mockCapabilities)
    56  	mockGetController := func(maasServer, apiKey string) (gomaasapi.Controller, error) {
    57  		return nil, gomaasapi.NewUnsupportedVersionError("oops")
    58  	}
    59  	s.PatchValue(&GetMAAS2Controller, mockGetController)
    60  }
    61  
    62  func (*configSuite) TestParsesMAASSettings(c *gc.C) {
    63  	server := "http://maas.testing.invalid/maas/"
    64  	oauth := "consumer-key:resource-token:resource-secret"
    65  	future := "futurama"
    66  
    67  	uuid, err := utils.NewUUID()
    68  	c.Assert(err, jc.ErrorIsNil)
    69  	ecfg, err := newConfig(map[string]interface{}{
    70  		"maas-server":     server,
    71  		"maas-oauth":      oauth,
    72  		"maas-agent-name": uuid.String(),
    73  		"future-key":      future,
    74  	})
    75  	c.Assert(err, jc.ErrorIsNil)
    76  	c.Check(ecfg.maasServer(), gc.Equals, server)
    77  	c.Check(ecfg.maasOAuth(), gc.DeepEquals, oauth)
    78  	c.Check(ecfg.maasAgentName(), gc.Equals, uuid.String())
    79  	c.Check(ecfg.UnknownAttrs()["future-key"], gc.DeepEquals, future)
    80  }
    81  
    82  func (*configSuite) TestMaasAgentNameDefault(c *gc.C) {
    83  	ecfg, err := newConfig(map[string]interface{}{
    84  		"maas-server": "http://maas.testing.invalid/maas/",
    85  		"maas-oauth":  "consumer-key:resource-token:resource-secret",
    86  	})
    87  	c.Assert(err, jc.ErrorIsNil)
    88  	c.Check(ecfg.maasAgentName(), gc.Equals, "")
    89  }
    90  
    91  func (*configSuite) TestChecksWellFormedMaasServer(c *gc.C) {
    92  	_, err := newConfig(map[string]interface{}{
    93  		"maas-server": "This should have been a URL.",
    94  		"maas-oauth":  "consumer-key:resource-token:resource-secret",
    95  	})
    96  	c.Assert(err, gc.NotNil)
    97  	c.Check(err, gc.ErrorMatches, ".*malformed maas-server.*")
    98  }
    99  
   100  func (*configSuite) TestChecksWellFormedMaasOAuth(c *gc.C) {
   101  	_, err := newConfig(map[string]interface{}{
   102  		"maas-server": "http://maas.testing.invalid/maas/",
   103  		"maas-oauth":  "This should have been a 3-part token.",
   104  	})
   105  	c.Assert(err, gc.NotNil)
   106  	c.Check(err, gc.ErrorMatches, ".*malformed maas-oauth.*")
   107  }
   108  
   109  func (*configSuite) TestBlockStorageProviderDefault(c *gc.C) {
   110  	ecfg, err := newConfig(map[string]interface{}{
   111  		"maas-server": "http://maas.testing.invalid/maas/",
   112  		"maas-oauth":  "consumer-key:resource-token:resource-secret",
   113  	})
   114  	c.Assert(err, jc.ErrorIsNil)
   115  	src, _ := ecfg.StorageDefaultBlockSource()
   116  	c.Assert(src, gc.Equals, "maas")
   117  }
   118  
   119  func (*configSuite) TestValidateUpcallsEnvironsConfigValidate(c *gc.C) {
   120  	// The base Validate() function will not allow an environment to
   121  	// change its name.  Trigger that error so as to prove that the
   122  	// environment provider's Validate() calls the base Validate().
   123  	baseAttrs := map[string]interface{}{
   124  		"maas-server": "http://maas.testing.invalid/maas/",
   125  		"maas-oauth":  "consumer-key:resource-token:resource-secret",
   126  	}
   127  	oldCfg, err := newConfig(baseAttrs)
   128  	c.Assert(err, jc.ErrorIsNil)
   129  	newName := oldCfg.Name() + "-but-different"
   130  	newCfg, err := oldCfg.Apply(map[string]interface{}{"name": newName})
   131  	c.Assert(err, jc.ErrorIsNil)
   132  
   133  	_, err = maasEnvironProvider{}.Validate(newCfg, oldCfg.Config)
   134  
   135  	c.Assert(err, gc.NotNil)
   136  	c.Check(err, gc.ErrorMatches, ".*cannot change name.*")
   137  }
   138  
   139  func (*configSuite) TestValidateCannotChangeAgentName(c *gc.C) {
   140  	baseAttrs := map[string]interface{}{
   141  		"maas-server":     "http://maas.testing.invalid/maas/",
   142  		"maas-oauth":      "consumer-key:resource-token:resource-secret",
   143  		"maas-agent-name": "1234-5678",
   144  	}
   145  	oldCfg, err := newConfig(baseAttrs)
   146  	c.Assert(err, jc.ErrorIsNil)
   147  	newCfg, err := oldCfg.Apply(map[string]interface{}{
   148  		"maas-agent-name": "9876-5432",
   149  	})
   150  	c.Assert(err, jc.ErrorIsNil)
   151  	_, err = maasEnvironProvider{}.Validate(newCfg, oldCfg.Config)
   152  	c.Assert(err, gc.ErrorMatches, "cannot change maas-agent-name")
   153  }
   154  
   155  func (*configSuite) TestSchema(c *gc.C) {
   156  	fields := providerInstance.Schema()
   157  	// Check that all the fields defined in environs/config
   158  	// are in the returned schema.
   159  	globalFields, err := config.Schema(nil)
   160  	c.Assert(err, gc.IsNil)
   161  	for name, field := range globalFields {
   162  		c.Check(fields[name], jc.DeepEquals, field)
   163  	}
   164  }