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  }