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  }