github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/provider/cloudsigma/environinstance_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package cloudsigma 5 6 import ( 7 "time" 8 9 "github.com/altoros/gosigma/mock" 10 "github.com/juju/errors" 11 "github.com/juju/loggo" 12 jc "github.com/juju/testing/checkers" 13 "github.com/juju/version" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/cloudconfig/instancecfg" 17 "github.com/juju/juju/environs" 18 "github.com/juju/juju/environs/config" 19 "github.com/juju/juju/environs/imagemetadata" 20 "github.com/juju/juju/instance" 21 "github.com/juju/juju/testing" 22 "github.com/juju/juju/tools" 23 ) 24 25 type environInstanceSuite struct { 26 testing.BaseSuite 27 cloud environs.CloudSpec 28 baseConfig *config.Config 29 } 30 31 var _ = gc.Suite(&environInstanceSuite{}) 32 33 func (s *environInstanceSuite) SetUpSuite(c *gc.C) { 34 s.BaseSuite.SetUpSuite(c) 35 36 mock.Start() 37 38 s.cloud = fakeCloudSpec() 39 s.cloud.Endpoint = mock.Endpoint("") 40 41 attrs := testing.Attrs{ 42 "name": "testname", 43 "uuid": "f54aac3a-9dcd-4a0c-86b5-24091478478c", 44 } 45 s.baseConfig = newConfig(c, validAttrs().Merge(attrs)) 46 } 47 48 func (s *environInstanceSuite) TearDownSuite(c *gc.C) { 49 mock.Stop() 50 s.BaseSuite.TearDownSuite(c) 51 } 52 53 func (s *environInstanceSuite) SetUpTest(c *gc.C) { 54 s.BaseSuite.SetUpTest(c) 55 56 ll := logger.LogLevel() 57 logger.SetLogLevel(loggo.TRACE) 58 s.AddCleanup(func(*gc.C) { logger.SetLogLevel(ll) }) 59 60 mock.Reset() 61 } 62 63 func (s *environInstanceSuite) TearDownTest(c *gc.C) { 64 mock.Reset() 65 s.BaseSuite.TearDownTest(c) 66 } 67 68 func (s *environInstanceSuite) createEnviron(c *gc.C, cfg *config.Config) environs.Environ { 69 s.PatchValue(&findInstanceImage, func([]*imagemetadata.ImageMetadata) (*imagemetadata.ImageMetadata, error) { 70 img := &imagemetadata.ImageMetadata{ 71 Id: validImageId, 72 } 73 return img, nil 74 }) 75 if cfg == nil { 76 cfg = s.baseConfig 77 } 78 79 environ, err := environs.New(environs.OpenParams{ 80 Cloud: s.cloud, 81 Config: cfg, 82 }) 83 84 c.Assert(err, gc.IsNil) 85 c.Assert(environ, gc.NotNil) 86 return environ 87 } 88 89 func (s *environInstanceSuite) TestInstances(c *gc.C) { 90 env := s.createEnviron(c, nil) 91 92 instances, err := env.AllInstances() 93 c.Assert(instances, gc.NotNil) 94 c.Assert(err, gc.IsNil) 95 c.Check(instances, gc.HasLen, 0) 96 97 uuid0 := addTestClientServer(c, jujuMetaInstanceServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c") 98 uuid1 := addTestClientServer(c, jujuMetaInstanceController, "f54aac3a-9dcd-4a0c-86b5-24091478478c") 99 addTestClientServer(c, jujuMetaInstanceServer, "other-model") 100 addTestClientServer(c, jujuMetaInstanceController, "other-model") 101 102 instances, err = env.AllInstances() 103 c.Assert(instances, gc.NotNil) 104 c.Assert(err, gc.IsNil) 105 c.Check(instances, gc.HasLen, 2) 106 107 ids := []instance.Id{instance.Id(uuid0), instance.Id(uuid1)} 108 instances, err = env.Instances(ids) 109 c.Assert(instances, gc.NotNil) 110 c.Assert(err, gc.IsNil) 111 c.Check(instances, gc.HasLen, 2) 112 113 ids = append(ids, instance.Id("fake-instance")) 114 instances, err = env.Instances(ids) 115 c.Assert(instances, gc.NotNil) 116 c.Assert(errors.Cause(err), gc.Equals, environs.ErrPartialInstances) 117 c.Check(instances, gc.HasLen, 3) 118 c.Check(instances[0], gc.NotNil) 119 c.Check(instances[1], gc.NotNil) 120 c.Check(instances[2], gc.IsNil) 121 122 err = env.StopInstances(ids...) 123 c.Assert(err, gc.ErrorMatches, "404 Not Found.*") 124 125 instances, err = env.Instances(ids) 126 c.Assert(instances, gc.NotNil) 127 c.Assert(errors.Cause(err), gc.Equals, environs.ErrNoInstances) 128 c.Check(instances, gc.HasLen, 3) 129 c.Check(instances[0], gc.IsNil) 130 c.Check(instances[1], gc.IsNil) 131 c.Check(instances[2], gc.IsNil) 132 } 133 134 func (s *environInstanceSuite) TestInstancesFail(c *gc.C) { 135 136 newClientFunc := newClient 137 s.PatchValue(&newClient, func(spec environs.CloudSpec, uuid string) (*environClient, error) { 138 spec.Endpoint = "https://0.1.2.3:2000/api/2.0/" 139 cli, err := newClientFunc(spec, uuid) 140 if cli != nil { 141 cli.conn.ConnectTimeout(10 * time.Millisecond) 142 } 143 return cli, err 144 }) 145 146 environ := s.createEnviron(c, nil) 147 148 instances, err := environ.AllInstances() 149 c.Assert(instances, gc.IsNil) 150 c.Assert(err, gc.NotNil) 151 152 instances, err = environ.Instances([]instance.Id{instance.Id("123"), instance.Id("321")}) 153 c.Assert(instances, gc.IsNil) 154 c.Assert(err, gc.NotNil) 155 } 156 157 func (s *environInstanceSuite) TestStartInstanceError(c *gc.C) { 158 environ := s.createEnviron(c, nil) 159 160 res, err := environ.StartInstance(environs.StartInstanceParams{}) 161 c.Check(res, gc.IsNil) 162 c.Check(err, gc.ErrorMatches, "instance configuration is nil") 163 164 toolsVal := &tools.Tools{ 165 Version: version.Binary{ 166 Series: "trusty", 167 }, 168 URL: "https://0.1.2.3:2000/x.y.z.tgz", 169 } 170 171 res, err = environ.StartInstance(environs.StartInstanceParams{ 172 InstanceConfig: &instancecfg.InstanceConfig{}, 173 }) 174 c.Check(res, gc.IsNil) 175 c.Check(err, gc.ErrorMatches, "tools not found") 176 177 icfg := &instancecfg.InstanceConfig{} 178 err = icfg.SetTools(tools.List{toolsVal}) 179 c.Assert(err, jc.ErrorIsNil) 180 res, err = environ.StartInstance(environs.StartInstanceParams{ 181 Tools: tools.List{toolsVal}, 182 InstanceConfig: icfg, 183 }) 184 c.Check(res, gc.IsNil) 185 c.Check(err, gc.ErrorMatches, "cannot make user data: series \"\" not valid") 186 }