launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/provider/local/environ_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  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  	"strings"
    11  
    12  	gc "launchpad.net/gocheck"
    13  
    14  	"launchpad.net/juju-core/agent"
    15  	coreCloudinit "launchpad.net/juju-core/cloudinit"
    16  	"launchpad.net/juju-core/constraints"
    17  	"launchpad.net/juju-core/environs"
    18  	"launchpad.net/juju-core/environs/cloudinit"
    19  	"launchpad.net/juju-core/environs/config"
    20  	"launchpad.net/juju-core/environs/jujutest"
    21  	envtesting "launchpad.net/juju-core/environs/testing"
    22  	"launchpad.net/juju-core/environs/tools"
    23  	"launchpad.net/juju-core/instance"
    24  	"launchpad.net/juju-core/provider/local"
    25  	"launchpad.net/juju-core/state"
    26  	coretesting "launchpad.net/juju-core/testing"
    27  	jc "launchpad.net/juju-core/testing/checkers"
    28  )
    29  
    30  type environSuite struct {
    31  	baseProviderSuite
    32  	envtesting.ToolsFixture
    33  }
    34  
    35  var _ = gc.Suite(&environSuite{})
    36  
    37  func (s *environSuite) SetUpTest(c *gc.C) {
    38  	s.baseProviderSuite.SetUpTest(c)
    39  	s.ToolsFixture.SetUpTest(c)
    40  }
    41  
    42  func (s *environSuite) TearDownTest(c *gc.C) {
    43  	s.ToolsFixture.TearDownTest(c)
    44  	s.baseProviderSuite.TearDownTest(c)
    45  }
    46  
    47  func (*environSuite) TestOpenFailsWithProtectedDirectories(c *gc.C) {
    48  	testConfig := minimalConfig(c)
    49  	testConfig, err := testConfig.Apply(map[string]interface{}{
    50  		"root-dir": "/usr/lib/juju",
    51  	})
    52  	c.Assert(err, gc.IsNil)
    53  
    54  	environ, err := local.Provider.Open(testConfig)
    55  	c.Assert(err, gc.ErrorMatches, "mkdir .* permission denied")
    56  	c.Assert(environ, gc.IsNil)
    57  }
    58  
    59  func (s *environSuite) TestNameAndStorage(c *gc.C) {
    60  	testConfig := minimalConfig(c)
    61  	environ, err := local.Provider.Open(testConfig)
    62  	c.Assert(err, gc.IsNil)
    63  	c.Assert(environ.Name(), gc.Equals, "test")
    64  	c.Assert(environ.Storage(), gc.NotNil)
    65  }
    66  
    67  func (s *environSuite) TestGetToolsMetadataSources(c *gc.C) {
    68  	testConfig := minimalConfig(c)
    69  	environ, err := local.Provider.Open(testConfig)
    70  	c.Assert(err, gc.IsNil)
    71  	sources, err := tools.GetMetadataSources(environ)
    72  	c.Assert(err, gc.IsNil)
    73  	c.Assert(len(sources), gc.Equals, 1)
    74  	url, err := sources[0].URL("")
    75  	c.Assert(err, gc.IsNil)
    76  	c.Assert(strings.Contains(url, "/tools"), jc.IsTrue)
    77  }
    78  
    79  func (s *environSuite) TestPrecheck(c *gc.C) {
    80  	testConfig := minimalConfig(c)
    81  	environ, err := local.Provider.Open(testConfig)
    82  	c.Assert(err, gc.IsNil)
    83  	var cons constraints.Value
    84  	prechecker, ok := environ.(environs.Prechecker)
    85  	c.Assert(ok, jc.IsTrue)
    86  
    87  	err = prechecker.PrecheckInstance("precise", cons)
    88  	c.Check(err, gc.IsNil)
    89  
    90  	err = prechecker.PrecheckContainer("precise", instance.LXC)
    91  	c.Check(err, gc.ErrorMatches, "local provider does not support nested containers")
    92  }
    93  
    94  type localJujuTestSuite struct {
    95  	baseProviderSuite
    96  	jujutest.Tests
    97  	restoreRootCheck   func()
    98  	oldUpstartLocation string
    99  	oldPath            string
   100  	testPath           string
   101  	dbServiceName      string
   102  }
   103  
   104  func (s *localJujuTestSuite) SetUpTest(c *gc.C) {
   105  	s.baseProviderSuite.SetUpTest(c)
   106  	// Construct the directories first.
   107  	err := local.CreateDirs(c, minimalConfig(c))
   108  	c.Assert(err, gc.IsNil)
   109  	s.oldPath = os.Getenv("PATH")
   110  	s.testPath = c.MkDir()
   111  	os.Setenv("PATH", s.testPath+":"+s.oldPath)
   112  
   113  	// Add in an admin secret
   114  	s.Tests.TestConfig["admin-secret"] = "sekrit"
   115  	s.restoreRootCheck = local.SetRootCheckFunction(func() bool { return false })
   116  	s.Tests.SetUpTest(c)
   117  
   118  	cfg, err := config.New(config.NoDefaults, s.TestConfig)
   119  	c.Assert(err, gc.IsNil)
   120  	s.dbServiceName = "juju-db-" + local.ConfigNamespace(cfg)
   121  }
   122  
   123  func (s *localJujuTestSuite) TearDownTest(c *gc.C) {
   124  	s.Tests.TearDownTest(c)
   125  	os.Setenv("PATH", s.oldPath)
   126  	s.restoreRootCheck()
   127  	s.baseProviderSuite.TearDownTest(c)
   128  }
   129  
   130  func (s *localJujuTestSuite) MakeTool(c *gc.C, name, script string) {
   131  	path := filepath.Join(s.testPath, name)
   132  	script = "#!/bin/bash\n" + script
   133  	err := ioutil.WriteFile(path, []byte(script), 0755)
   134  	c.Assert(err, gc.IsNil)
   135  }
   136  
   137  func (s *localJujuTestSuite) StoppedStatus(c *gc.C) {
   138  	s.MakeTool(c, "status", `echo "some-service stop/waiting"`)
   139  }
   140  
   141  func (s *localJujuTestSuite) RunningStatus(c *gc.C) {
   142  	s.MakeTool(c, "status", `echo "some-service start/running, process 123"`)
   143  }
   144  
   145  var _ = gc.Suite(&localJujuTestSuite{
   146  	Tests: jujutest.Tests{
   147  		TestConfig: minimalConfigValues(),
   148  	},
   149  })
   150  
   151  func (s *localJujuTestSuite) TestBootstrap(c *gc.C) {
   152  	s.PatchValue(local.FinishBootstrap, func(mcfg *cloudinit.MachineConfig, cloudcfg *coreCloudinit.Config, ctx environs.BootstrapContext) error {
   153  		c.Assert(cloudcfg.AptUpdate(), jc.IsFalse)
   154  		c.Assert(cloudcfg.AptUpgrade(), jc.IsFalse)
   155  		c.Assert(cloudcfg.Packages(), gc.HasLen, 0)
   156  		c.Assert(mcfg.AgentEnvironment, gc.Not(gc.IsNil))
   157  		// local does not allow machine-0 to host units
   158  		bootstrapJobs, err := agent.UnmarshalBootstrapJobs(mcfg.AgentEnvironment[agent.BootstrapJobs])
   159  		c.Assert(err, gc.IsNil)
   160  		c.Assert(bootstrapJobs, gc.DeepEquals, []state.MachineJob{state.JobManageEnviron})
   161  		return nil
   162  	})
   163  	testConfig := minimalConfig(c)
   164  	environ, err := local.Provider.Prepare(testConfig)
   165  	c.Assert(err, gc.IsNil)
   166  	envtesting.UploadFakeTools(c, environ.Storage())
   167  	defer environ.Storage().RemoveAll()
   168  	ctx := envtesting.NewBootstrapContext(coretesting.Context(c))
   169  	err = environ.Bootstrap(ctx, constraints.Value{})
   170  	c.Assert(err, gc.IsNil)
   171  }
   172  
   173  func (s *localJujuTestSuite) TestStartStop(c *gc.C) {
   174  	c.Skip("StartInstance not implemented yet.")
   175  }