launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/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  	gc "launchpad.net/gocheck"
     8  
     9  	"launchpad.net/juju-core/environs"
    10  	"launchpad.net/juju-core/testing"
    11  	"launchpad.net/juju-core/testing/testbase"
    12  	"launchpad.net/juju-core/utils"
    13  )
    14  
    15  type configSuite struct {
    16  	testbase.LoggingSuite
    17  }
    18  
    19  var _ = gc.Suite(&configSuite{})
    20  
    21  // copyAttrs copies values from src into dest.  If src contains a key that was
    22  // already in dest, its value in dest will still be updated to the one from
    23  // src.
    24  func copyAttrs(src, dest map[string]interface{}) {
    25  	for k, v := range src {
    26  		dest[k] = v
    27  	}
    28  }
    29  
    30  // newConfig creates a MAAS environment config from attributes.
    31  func newConfig(values map[string]interface{}) (*maasEnvironConfig, error) {
    32  	attrs := testing.FakeConfig().Merge(testing.Attrs{
    33  		"name": "testenv",
    34  		"type": "maas",
    35  	}).Merge(values)
    36  	env, err := environs.NewFromAttrs(attrs)
    37  	if err != nil {
    38  		return nil, err
    39  	}
    40  	return env.(*maasEnviron).ecfg(), nil
    41  }
    42  
    43  func (*configSuite) TestParsesMAASSettings(c *gc.C) {
    44  	server := "http://maas.testing.invalid/maas/"
    45  	oauth := "consumer-key:resource-token:resource-secret"
    46  	future := "futurama"
    47  	uuid, err := utils.NewUUID()
    48  	c.Assert(err, gc.IsNil)
    49  	ecfg, err := newConfig(map[string]interface{}{
    50  		"maas-server":     server,
    51  		"maas-oauth":      oauth,
    52  		"maas-agent-name": uuid.String(),
    53  		"future-key":      future,
    54  	})
    55  	c.Assert(err, gc.IsNil)
    56  	c.Check(ecfg.maasServer(), gc.Equals, server)
    57  	c.Check(ecfg.maasOAuth(), gc.DeepEquals, oauth)
    58  	c.Check(ecfg.maasAgentName(), gc.Equals, uuid.String())
    59  	c.Check(ecfg.UnknownAttrs()["future-key"], gc.DeepEquals, future)
    60  }
    61  
    62  func (*configSuite) TestMaasAgentNameDefault(c *gc.C) {
    63  	ecfg, err := newConfig(map[string]interface{}{
    64  		"maas-server": "http://maas.testing.invalid/maas/",
    65  		"maas-oauth":  "consumer-key:resource-token:resource-secret",
    66  	})
    67  	c.Assert(err, gc.IsNil)
    68  	c.Check(ecfg.maasAgentName(), gc.Equals, "")
    69  }
    70  
    71  func (*configSuite) TestChecksWellFormedMaasServer(c *gc.C) {
    72  	_, err := newConfig(map[string]interface{}{
    73  		"maas-server": "This should have been a URL.",
    74  		"maas-oauth":  "consumer-key:resource-token:resource-secret",
    75  	})
    76  	c.Assert(err, gc.NotNil)
    77  	c.Check(err, gc.ErrorMatches, ".*malformed maas-server.*")
    78  }
    79  
    80  func (*configSuite) TestChecksWellFormedMaasOAuth(c *gc.C) {
    81  	_, err := newConfig(map[string]interface{}{
    82  		"maas-server": "http://maas.testing.invalid/maas/",
    83  		"maas-oauth":  "This should have been a 3-part token.",
    84  	})
    85  	c.Assert(err, gc.NotNil)
    86  	c.Check(err, gc.ErrorMatches, ".*malformed maas-oauth.*")
    87  }
    88  
    89  func (*configSuite) TestValidateUpcallsEnvironsConfigValidate(c *gc.C) {
    90  	// The base Validate() function will not allow an environment to
    91  	// change its name.  Trigger that error so as to prove that the
    92  	// environment provider's Validate() calls the base Validate().
    93  	baseAttrs := map[string]interface{}{
    94  		"maas-server": "http://maas.testing.invalid/maas/",
    95  		"maas-oauth":  "consumer-key:resource-token:resource-secret",
    96  	}
    97  	oldCfg, err := newConfig(baseAttrs)
    98  	c.Assert(err, gc.IsNil)
    99  	newName := oldCfg.Name() + "-but-different"
   100  	newCfg, err := oldCfg.Apply(map[string]interface{}{"name": newName})
   101  	c.Assert(err, gc.IsNil)
   102  
   103  	_, err = maasEnvironProvider{}.Validate(newCfg, oldCfg.Config)
   104  
   105  	c.Assert(err, gc.NotNil)
   106  	c.Check(err, gc.ErrorMatches, ".*cannot change name.*")
   107  }
   108  
   109  func (*configSuite) TestValidateCannotChangeAgentName(c *gc.C) {
   110  	baseAttrs := map[string]interface{}{
   111  		"maas-server":     "http://maas.testing.invalid/maas/",
   112  		"maas-oauth":      "consumer-key:resource-token:resource-secret",
   113  		"maas-agent-name": "1234-5678",
   114  	}
   115  	oldCfg, err := newConfig(baseAttrs)
   116  	c.Assert(err, gc.IsNil)
   117  	newCfg, err := oldCfg.Apply(map[string]interface{}{
   118  		"maas-agent-name": "9876-5432",
   119  	})
   120  	c.Assert(err, gc.IsNil)
   121  	_, err = maasEnvironProvider{}.Validate(newCfg, oldCfg.Config)
   122  	c.Assert(err, gc.ErrorMatches, "cannot change maas-agent-name")
   123  }