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 }