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 }