github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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 "strings" 9 10 jc "github.com/juju/testing/checkers" 11 gc "launchpad.net/gocheck" 12 13 "github.com/juju/juju/constraints" 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/environs/manual" 16 "github.com/juju/juju/environs/storage" 17 "github.com/juju/juju/environs/tools" 18 "github.com/juju/juju/instance" 19 "github.com/juju/juju/juju/arch" 20 coretesting "github.com/juju/juju/testing" 21 ) 22 23 type environSuite struct { 24 coretesting.FakeJujuHomeSuite 25 env *manualEnviron 26 } 27 28 type dummyStorage struct { 29 storage.Storage 30 } 31 32 var _ = gc.Suite(&environSuite{}) 33 34 func (s *environSuite) SetUpTest(c *gc.C) { 35 s.FakeJujuHomeSuite.SetUpTest(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, stdin string) (string, error) { 91 c.Assert(host, gc.Equals, "ubuntu@hostname") 92 c.Assert(command, gc.DeepEquals, []string{"sudo", "/bin/bash"}) 93 c.Assert(stdin, gc.DeepEquals, ` 94 set -x 95 pkill -6 jujud && exit 96 stop juju-db 97 rm -f /etc/init/juju* 98 rm -f /etc/rsyslog.d/*juju* 99 rm -fr '/var/lib/juju' '/var/log/juju' 100 exit 0 101 `) 102 return resultStderr, resultErr 103 } 104 s.PatchValue(&runSSHCommand, runSSHCommandTesting) 105 type test struct { 106 stderr string 107 err error 108 match string 109 } 110 tests := []test{ 111 {"", nil, ""}, 112 {"abc", nil, ""}, 113 {"", errors.New("oh noes"), "oh noes"}, 114 {"123", errors.New("abc"), "abc \\(123\\)"}, 115 } 116 for i, t := range tests { 117 c.Logf("test %d: %v", i, t) 118 resultStderr, resultErr = t.stderr, t.err 119 err := s.env.Destroy() 120 if t.match == "" { 121 c.Assert(err, gc.IsNil) 122 } else { 123 c.Assert(err, gc.ErrorMatches, t.match) 124 } 125 } 126 } 127 128 func (s *environSuite) TestLocalStorageConfig(c *gc.C) { 129 c.Assert(s.env.StorageDir(), gc.Equals, "/var/lib/juju/storage") 130 c.Assert(s.env.cfg.storageListenAddr(), gc.Equals, ":8040") 131 c.Assert(s.env.StorageAddr(), gc.Equals, s.env.cfg.storageListenAddr()) 132 c.Assert(s.env.SharedStorageAddr(), gc.Equals, "") 133 c.Assert(s.env.SharedStorageDir(), gc.Equals, "") 134 } 135 136 func (s *environSuite) TestEnvironSupportsCustomSources(c *gc.C) { 137 sources, err := tools.GetMetadataSources(s.env) 138 c.Assert(err, gc.IsNil) 139 c.Assert(len(sources), gc.Equals, 2) 140 url, err := sources[0].URL("") 141 c.Assert(err, gc.IsNil) 142 c.Assert(strings.Contains(url, "/tools"), jc.IsTrue) 143 } 144 145 func (s *environSuite) TestSupportedArchitectures(c *gc.C) { 146 arches, err := s.env.SupportedArchitectures() 147 c.Assert(err, gc.IsNil) 148 c.Assert(arches, gc.DeepEquals, arch.AllSupportedArches) 149 } 150 151 func (s *environSuite) TestSupportNetworks(c *gc.C) { 152 c.Assert(s.env.SupportNetworks(), jc.IsFalse) 153 } 154 155 func (s *environSuite) TestConstraintsValidator(c *gc.C) { 156 validator, err := s.env.ConstraintsValidator() 157 c.Assert(err, gc.IsNil) 158 cons := constraints.MustParse("arch=amd64 instance-type=foo tags=bar cpu-power=10 cpu-cores=2 mem=1G") 159 unsupported, err := validator.Validate(cons) 160 c.Assert(err, gc.IsNil) 161 c.Assert(unsupported, jc.SameContents, []string{"cpu-power", "instance-type", "tags"}) 162 }