github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/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 return localConfig(c, nil) 39 } 40 41 func localConfig(c *gc.C, extra map[string]interface{}) *config.Config { 42 values := minimalConfigValues() 43 for key, value := range extra { 44 values[key] = value 45 } 46 testConfig, err := config.New(config.NoDefaults, values) 47 c.Assert(err, jc.ErrorIsNil) 48 testEnv, err := local.Provider.PrepareForBootstrap(envtesting.BootstrapContext(c), testConfig) 49 c.Assert(err, jc.ErrorIsNil) 50 return testEnv.Config() 51 } 52 53 func (s *configSuite) TestDefaultNetworkBridge(c *gc.C) { 54 config := minimalConfig(c) 55 unknownAttrs := config.UnknownAttrs() 56 c.Assert(unknownAttrs["container"], gc.Equals, "lxc") 57 c.Assert(unknownAttrs["network-bridge"], gc.Equals, "lxcbr0") 58 } 59 60 func (s *configSuite) TestDefaultNetworkBridgeForKVMContainers(c *gc.C) { 61 testConfig := localConfig(c, map[string]interface{}{ 62 "container": "kvm", 63 }) 64 containerType, bridgeName := local.ContainerAndBridge(c, testConfig) 65 c.Check(containerType, gc.Equals, string(instance.KVM)) 66 c.Check(bridgeName, gc.Equals, kvm.DefaultKvmBridge) 67 } 68 69 func (s *configSuite) TestExplicitNetworkBridgeForLXCContainers(c *gc.C) { 70 testConfig := localConfig(c, map[string]interface{}{ 71 "container": "lxc", 72 "network-bridge": "foo", 73 }) 74 containerType, bridgeName := local.ContainerAndBridge(c, testConfig) 75 c.Check(containerType, gc.Equals, string(instance.LXC)) 76 c.Check(bridgeName, gc.Equals, "foo") 77 } 78 79 func (s *configSuite) TestExplicitNetworkBridgeForKVMContainers(c *gc.C) { 80 testConfig := localConfig(c, map[string]interface{}{ 81 "container": "kvm", 82 "network-bridge": "lxcbr0", 83 }) 84 containerType, bridgeName := local.ContainerAndBridge(c, testConfig) 85 c.Check(containerType, gc.Equals, string(instance.KVM)) 86 c.Check(bridgeName, gc.Equals, "lxcbr0") 87 } 88 89 func (s *configSuite) TestDefaultNetworkBridgeForLXCContainers(c *gc.C) { 90 testConfig := localConfig(c, map[string]interface{}{ 91 "container": "lxc", 92 }) 93 containerType, bridgeName := local.ContainerAndBridge(c, testConfig) 94 c.Check(containerType, gc.Equals, string(instance.LXC)) 95 c.Check(bridgeName, gc.Equals, lxc.DefaultLxcBridge) 96 } 97 98 func (s *configSuite) TestSetNetworkBridge(c *gc.C) { 99 config := localConfig(c, map[string]interface{}{ 100 "network-bridge": "br0", 101 }) 102 unknownAttrs := config.UnknownAttrs() 103 c.Assert(unknownAttrs["network-bridge"], gc.Equals, "br0") 104 _, bridgeName := local.ContainerAndBridge(c, config) 105 c.Check(bridgeName, gc.Equals, "br0") 106 } 107 108 func (s *configSuite) TestValidateConfig(c *gc.C) { 109 valid := minimalConfig(c) 110 expectedRootDir := filepath.Join(utils.Home(), ".juju", "test") 111 unknownAttrs := valid.UnknownAttrs() 112 c.Assert(unknownAttrs["root-dir"], gc.Equals, expectedRootDir) 113 } 114 115 func (s *configSuite) TestValidateConfigWithRootDir(c *gc.C) { 116 root := c.MkDir() 117 valid := localConfig(c, map[string]interface{}{ 118 "root-dir": root, 119 }) 120 unknownAttrs := valid.UnknownAttrs() 121 c.Assert(unknownAttrs["root-dir"], gc.Equals, root) 122 } 123 124 func (s *configSuite) TestValidateConfigWithTildeInRootDir(c *gc.C) { 125 valid := localConfig(c, map[string]interface{}{ 126 "root-dir": "~/.juju/foo", 127 }) 128 expectedRootDir := filepath.Join(utils.Home(), ".juju", "foo") 129 unknownAttrs := valid.UnknownAttrs() 130 c.Assert(unknownAttrs["root-dir"], gc.Equals, expectedRootDir) 131 } 132 133 func (s *configSuite) TestValidateConfigWithFloatPort(c *gc.C) { 134 // When the config values get serialized through JSON, the integers 135 // get coerced to float64 values. The parsing needs to handle this. 136 valid := localConfig(c, map[string]interface{}{ 137 "storage-port": float64(8040), 138 }) 139 unknownAttrs := valid.UnknownAttrs() 140 c.Assert(unknownAttrs["storage-port"], gc.Equals, int(8040)) 141 } 142 143 func (s *configSuite) TestNamespace(c *gc.C) { 144 s.PatchEnvironment("USER", "tester") 145 testConfig := minimalConfig(c) 146 c.Logf("\n\nname: %s\n\n", testConfig.Name()) 147 local.CheckConfigNamespace(c, testConfig, "tester-test") 148 } 149 150 func (s *configSuite) TestBootstrapAsRoot(c *gc.C) { 151 s.PatchValue(local.CheckIfRoot, func() bool { return true }) 152 env, err := local.Provider.PrepareForBootstrap(envtesting.BootstrapContext(c), minimalConfig(c)) 153 c.Assert(err, jc.ErrorIsNil) 154 _, _, _, err = env.Bootstrap(envtesting.BootstrapContext(c), environs.BootstrapParams{}) 155 c.Assert(err, gc.ErrorMatches, "bootstrapping a local environment must not be done as root") 156 } 157 158 func (s *configSuite) TestLocalDisablesUpgradesWhenCloning(c *gc.C) { 159 // Default config files set these to true. 160 testConfig := minimalConfig(c) 161 c.Check(testConfig.EnableOSRefreshUpdate(), jc.IsTrue) 162 c.Check(testConfig.EnableOSUpgrade(), jc.IsTrue) 163 164 // If using lxc-clone, we set updates to false 165 validConfig := localConfig(c, map[string]interface{}{ 166 "lxc-clone": true, 167 }) 168 c.Check(validConfig.EnableOSRefreshUpdate(), jc.IsTrue) 169 c.Check(validConfig.EnableOSUpgrade(), jc.IsFalse) 170 } 171 172 // If settings are provided, don't overwrite with defaults. 173 func (s *configSuite) TestLocalRespectsUpgradeSettings(c *gc.C) { 174 minAttrs := testing.FakeConfig().Merge(testing.Attrs{ 175 "lxc-clone": true, 176 "enable-os-upgrades": true, 177 "enable-os-updates": true, 178 }) 179 testConfig, err := config.New(config.NoDefaults, minAttrs) 180 c.Assert(err, jc.ErrorIsNil) 181 c.Check(testConfig.EnableOSRefreshUpdate(), jc.IsTrue) 182 c.Check(testConfig.EnableOSUpgrade(), jc.IsTrue) 183 } 184 185 func (*configSuite) TestSchema(c *gc.C) { 186 fields := local.Provider.Schema() 187 // Check that all the fields defined in environs/config 188 // are in the returned schema. 189 globalFields, err := config.Schema(nil) 190 c.Assert(err, gc.IsNil) 191 for name, field := range globalFields { 192 c.Check(fields[name], jc.DeepEquals, field) 193 } 194 }