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  }