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