launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/provider/manual/environ_test.go (about) 1 // Copyright 2012 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package manual 5 6 import ( 7 "errors" 8 "io" 9 "strings" 10 11 gc "launchpad.net/gocheck" 12 13 "launchpad.net/juju-core/environs" 14 "launchpad.net/juju-core/environs/manual" 15 "launchpad.net/juju-core/environs/storage" 16 envtesting "launchpad.net/juju-core/environs/testing" 17 "launchpad.net/juju-core/environs/tools" 18 "launchpad.net/juju-core/instance" 19 coretesting "launchpad.net/juju-core/testing" 20 jc "launchpad.net/juju-core/testing/checkers" 21 "launchpad.net/juju-core/testing/testbase" 22 ) 23 24 type environSuite struct { 25 testbase.LoggingSuite 26 env *manualEnviron 27 } 28 29 type dummyStorage struct { 30 storage.Storage 31 } 32 33 var _ = gc.Suite(&environSuite{}) 34 35 func (s *environSuite) SetUpTest(c *gc.C) { 36 env, err := manualProvider{}.Open(MinimalConfig(c)) 37 c.Assert(err, gc.IsNil) 38 s.env = env.(*manualEnviron) 39 } 40 41 func (s *environSuite) TestSetConfig(c *gc.C) { 42 err := s.env.SetConfig(MinimalConfig(c)) 43 c.Assert(err, gc.IsNil) 44 45 testConfig := MinimalConfig(c) 46 testConfig, err = testConfig.Apply(map[string]interface{}{"bootstrap-host": ""}) 47 c.Assert(err, gc.IsNil) 48 err = s.env.SetConfig(testConfig) 49 c.Assert(err, gc.ErrorMatches, "bootstrap-host must be specified") 50 } 51 52 func (s *environSuite) TestInstances(c *gc.C) { 53 var ids []instance.Id 54 55 instances, err := s.env.Instances(ids) 56 c.Assert(err, gc.Equals, environs.ErrNoInstances) 57 c.Assert(instances, gc.HasLen, 0) 58 59 ids = append(ids, manual.BootstrapInstanceId) 60 instances, err = s.env.Instances(ids) 61 c.Assert(err, gc.IsNil) 62 c.Assert(instances, gc.HasLen, 1) 63 c.Assert(instances[0], gc.NotNil) 64 65 ids = append(ids, manual.BootstrapInstanceId) 66 instances, err = s.env.Instances(ids) 67 c.Assert(err, gc.IsNil) 68 c.Assert(instances, gc.HasLen, 2) 69 c.Assert(instances[0], gc.NotNil) 70 c.Assert(instances[1], gc.NotNil) 71 72 ids = append(ids, instance.Id("invalid")) 73 instances, err = s.env.Instances(ids) 74 c.Assert(err, gc.Equals, environs.ErrPartialInstances) 75 c.Assert(instances, gc.HasLen, 3) 76 c.Assert(instances[0], gc.NotNil) 77 c.Assert(instances[1], gc.NotNil) 78 c.Assert(instances[2], gc.IsNil) 79 80 ids = []instance.Id{instance.Id("invalid")} 81 instances, err = s.env.Instances(ids) 82 c.Assert(err, gc.Equals, environs.ErrNoInstances) 83 c.Assert(instances, gc.HasLen, 1) 84 c.Assert(instances[0], gc.IsNil) 85 } 86 87 func (s *environSuite) TestDestroy(c *gc.C) { 88 var resultStderr string 89 var resultErr error 90 runSSHCommandTesting := func(host string, command []string) (string, error) { 91 c.Assert(host, gc.Equals, "ubuntu@hostname") 92 c.Assert(command, gc.DeepEquals, []string{"sudo", "pkill", "-6", "jujud"}) 93 return resultStderr, resultErr 94 } 95 s.PatchValue(&runSSHCommand, runSSHCommandTesting) 96 type test struct { 97 stderr string 98 err error 99 match string 100 } 101 tests := []test{ 102 {"", nil, ""}, 103 {"abc", nil, ""}, 104 {"", errors.New("oh noes"), "oh noes"}, 105 {"123", errors.New("abc"), "abc \\(123\\)"}, 106 } 107 for i, t := range tests { 108 c.Logf("test %d: %v", i, t) 109 resultStderr, resultErr = t.stderr, t.err 110 err := s.env.Destroy() 111 if t.match == "" { 112 c.Assert(err, gc.IsNil) 113 } else { 114 c.Assert(err, gc.ErrorMatches, t.match) 115 } 116 } 117 } 118 119 func (s *environSuite) TestLocalStorageConfig(c *gc.C) { 120 c.Assert(s.env.StorageDir(), gc.Equals, "/var/lib/juju/storage") 121 c.Assert(s.env.cfg.storageListenAddr(), gc.Equals, ":8040") 122 c.Assert(s.env.StorageAddr(), gc.Equals, s.env.cfg.storageListenAddr()) 123 c.Assert(s.env.SharedStorageAddr(), gc.Equals, "") 124 c.Assert(s.env.SharedStorageDir(), gc.Equals, "") 125 } 126 127 func (s *environSuite) TestEnvironSupportsCustomSources(c *gc.C) { 128 sources, err := tools.GetMetadataSources(s.env) 129 c.Assert(err, gc.IsNil) 130 c.Assert(len(sources), gc.Equals, 2) 131 url, err := sources[0].URL("") 132 c.Assert(err, gc.IsNil) 133 c.Assert(strings.Contains(url, "/tools"), jc.IsTrue) 134 } 135 136 func (s *environSuite) TestEnvironBootstrapStorager(c *gc.C) { 137 var initUbuntuResult error 138 s.PatchValue(&initUbuntuUser, func(host, user, authorizedKeys string, stdin io.Reader, stdout io.Writer) error { 139 return initUbuntuResult 140 }) 141 142 ctx := envtesting.NewBootstrapContext(coretesting.Context(c)) 143 initUbuntuResult = errors.New("failed to initialise ubuntu user") 144 c.Assert(s.env.EnableBootstrapStorage(ctx), gc.Equals, initUbuntuResult) 145 initUbuntuResult = nil 146 c.Assert(s.env.EnableBootstrapStorage(ctx), gc.IsNil) 147 // after the user is initialised once successfully, 148 // another attempt will not be made. 149 initUbuntuResult = errors.New("failed to initialise ubuntu user") 150 c.Assert(s.env.EnableBootstrapStorage(ctx), gc.IsNil) 151 }