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