github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/provider/local/config_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package local_test 5 6 import ( 7 "path/filepath" 8 9 jc "github.com/juju/testing/checkers" 10 "github.com/juju/utils" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/container/kvm" 14 "github.com/juju/juju/container/lxc" 15 "github.com/juju/juju/environs" 16 "github.com/juju/juju/environs/config" 17 envtesting "github.com/juju/juju/environs/testing" 18 "github.com/juju/juju/instance" 19 "github.com/juju/juju/provider" 20 "github.com/juju/juju/provider/local" 21 "github.com/juju/juju/testing" 22 ) 23 24 type configSuite struct { 25 baseProviderSuite 26 } 27 28 var _ = gc.Suite(&configSuite{}) 29 30 func minimalConfigValues() map[string]interface{} { 31 return testing.FakeConfig().Merge(testing.Attrs{ 32 "name": "test", 33 "type": provider.Local, 34 }) 35 } 36 37 func minimalConfig(c *gc.C) *config.Config { 38 minimal := minimalConfigValues() 39 testConfig, err := config.New(config.NoDefaults, minimal) 40 c.Assert(err, jc.ErrorIsNil) 41 valid, err := local.Provider.Validate(testConfig, nil) 42 c.Assert(err, jc.ErrorIsNil) 43 return valid 44 } 45 46 func localConfig(c *gc.C, extra map[string]interface{}) *config.Config { 47 values := minimalConfigValues() 48 for key, value := range extra { 49 values[key] = value 50 } 51 testConfig, err := config.New(config.NoDefaults, values) 52 c.Assert(err, jc.ErrorIsNil) 53 valid, err := local.Provider.Validate(testConfig, nil) 54 c.Assert(err, jc.ErrorIsNil) 55 return valid 56 } 57 58 func (s *configSuite) TestDefaultNetworkBridge(c *gc.C) { 59 config := minimalConfig(c) 60 unknownAttrs := config.UnknownAttrs() 61 c.Assert(unknownAttrs["container"], gc.Equals, "lxc") 62 c.Assert(unknownAttrs["network-bridge"], gc.Equals, "lxcbr0") 63 } 64 65 func (s *configSuite) TestDefaultNetworkBridgeForKVMContainers(c *gc.C) { 66 minAttrs := testing.FakeConfig().Merge(testing.Attrs{ 67 "container": "kvm", 68 }) 69 testConfig, err := config.New(config.NoDefaults, minAttrs) 70 c.Assert(err, jc.ErrorIsNil) 71 containerType, bridgeName := local.ContainerAndBridge(c, testConfig) 72 c.Check(containerType, gc.Equals, string(instance.KVM)) 73 c.Check(bridgeName, gc.Equals, kvm.DefaultKvmBridge) 74 } 75 76 func (s *configSuite) TestExplicitNetworkBridgeForLXCContainers(c *gc.C) { 77 minAttrs := testing.FakeConfig().Merge(testing.Attrs{ 78 "container": "lxc", 79 "network-bridge": "foo", 80 }) 81 testConfig, err := config.New(config.NoDefaults, minAttrs) 82 c.Assert(err, jc.ErrorIsNil) 83 containerType, bridgeName := local.ContainerAndBridge(c, testConfig) 84 c.Check(containerType, gc.Equals, string(instance.LXC)) 85 c.Check(bridgeName, gc.Equals, "foo") 86 } 87 88 func (s *configSuite) TestExplicitNetworkBridgeForKVMContainers(c *gc.C) { 89 minAttrs := testing.FakeConfig().Merge(testing.Attrs{ 90 "container": "kvm", 91 "network-bridge": "lxcbr0", 92 }) 93 testConfig, err := config.New(config.NoDefaults, minAttrs) 94 c.Assert(err, jc.ErrorIsNil) 95 containerType, bridgeName := local.ContainerAndBridge(c, testConfig) 96 c.Check(containerType, gc.Equals, string(instance.KVM)) 97 c.Check(bridgeName, gc.Equals, "lxcbr0") 98 } 99 100 func (s *configSuite) TestDefaultNetworkBridgeForLXCContainers(c *gc.C) { 101 minAttrs := testing.FakeConfig().Merge(testing.Attrs{ 102 "container": "lxc", 103 }) 104 testConfig, err := config.New(config.NoDefaults, minAttrs) 105 c.Assert(err, jc.ErrorIsNil) 106 containerType, bridgeName := local.ContainerAndBridge(c, testConfig) 107 c.Check(containerType, gc.Equals, string(instance.LXC)) 108 c.Check(bridgeName, gc.Equals, lxc.DefaultLxcBridge) 109 } 110 111 func (s *configSuite) TestSetNetworkBridge(c *gc.C) { 112 config := localConfig(c, map[string]interface{}{ 113 "network-bridge": "br0", 114 }) 115 unknownAttrs := config.UnknownAttrs() 116 c.Assert(unknownAttrs["network-bridge"], gc.Equals, "br0") 117 _, bridgeName := local.ContainerAndBridge(c, config) 118 c.Check(bridgeName, gc.Equals, "br0") 119 } 120 121 func (s *configSuite) TestValidateConfig(c *gc.C) { 122 valid := minimalConfig(c) 123 expectedRootDir := filepath.Join(utils.Home(), ".juju", "test") 124 unknownAttrs := valid.UnknownAttrs() 125 c.Assert(unknownAttrs["root-dir"], gc.Equals, expectedRootDir) 126 } 127 128 func (s *configSuite) TestValidateConfigWithRootDir(c *gc.C) { 129 root := c.MkDir() 130 valid := localConfig(c, map[string]interface{}{ 131 "root-dir": root, 132 }) 133 unknownAttrs := valid.UnknownAttrs() 134 c.Assert(unknownAttrs["root-dir"], gc.Equals, root) 135 } 136 137 func (s *configSuite) TestValidateConfigWithTildeInRootDir(c *gc.C) { 138 valid := localConfig(c, map[string]interface{}{ 139 "root-dir": "~/.juju/foo", 140 }) 141 expectedRootDir := filepath.Join(utils.Home(), ".juju", "foo") 142 unknownAttrs := valid.UnknownAttrs() 143 c.Assert(unknownAttrs["root-dir"], gc.Equals, expectedRootDir) 144 } 145 146 func (s *configSuite) TestValidateConfigWithFloatPort(c *gc.C) { 147 // When the config values get serialized through JSON, the integers 148 // get coerced to float64 values. The parsing needs to handle this. 149 valid := localConfig(c, map[string]interface{}{ 150 "storage-port": float64(8040), 151 }) 152 unknownAttrs := valid.UnknownAttrs() 153 c.Assert(unknownAttrs["storage-port"], gc.Equals, int(8040)) 154 } 155 156 func (s *configSuite) TestNamespace(c *gc.C) { 157 testConfig := minimalConfig(c) 158 s.PatchEnvironment("USER", "tester") 159 c.Assert(local.ConfigNamespace(testConfig), gc.Equals, "tester-test") 160 } 161 162 func (s *configSuite) TestBootstrapAsRoot(c *gc.C) { 163 s.PatchValue(local.CheckIfRoot, func() bool { return true }) 164 env, err := local.Provider.PrepareForBootstrap(envtesting.BootstrapContext(c), minimalConfig(c)) 165 c.Assert(err, jc.ErrorIsNil) 166 _, _, _, err = env.Bootstrap(envtesting.BootstrapContext(c), environs.BootstrapParams{}) 167 c.Assert(err, gc.ErrorMatches, "bootstrapping a local environment must not be done as root") 168 } 169 170 func (s *configSuite) TestLocalDisablesUpgradesWhenCloning(c *gc.C) { 171 // Default config files set these to true. 172 testConfig := minimalConfig(c) 173 c.Check(testConfig.EnableOSRefreshUpdate(), jc.IsTrue) 174 c.Check(testConfig.EnableOSUpgrade(), jc.IsTrue) 175 176 // If using lxc-clone, we set updates to false 177 minAttrs := testing.FakeConfig().Merge(testing.Attrs{ 178 "lxc-clone": true, 179 }) 180 testConfig, err := config.New(config.NoDefaults, minAttrs) 181 c.Assert(err, jc.ErrorIsNil) 182 validConfig, err := local.Provider.Validate(testConfig, nil) 183 c.Assert(err, jc.ErrorIsNil) 184 c.Check(validConfig.EnableOSRefreshUpdate(), jc.IsTrue) 185 c.Check(validConfig.EnableOSUpgrade(), jc.IsFalse) 186 } 187 188 // If settings are provided, don't overwrite with defaults. 189 func (s *configSuite) TestLocalRespectsUpgradeSettings(c *gc.C) { 190 minAttrs := testing.FakeConfig().Merge(testing.Attrs{ 191 "lxc-clone": true, 192 "enable-os-upgrades": true, 193 "enable-os-updates": true, 194 }) 195 testConfig, err := config.New(config.NoDefaults, minAttrs) 196 c.Assert(err, jc.ErrorIsNil) 197 c.Check(testConfig.EnableOSRefreshUpdate(), jc.IsTrue) 198 c.Check(testConfig.EnableOSUpgrade(), jc.IsTrue) 199 }