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