github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/provider/cloudsigma/client_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 "fmt" 8 "strings" 9 "time" 10 11 "github.com/altoros/gosigma" 12 "github.com/altoros/gosigma/data" 13 "github.com/altoros/gosigma/mock" 14 "github.com/juju/loggo" 15 jc "github.com/juju/testing/checkers" 16 "github.com/juju/utils" 17 "github.com/juju/version" 18 gc "gopkg.in/check.v1" 19 20 "github.com/juju/juju/cloudconfig/instancecfg" 21 "github.com/juju/juju/constraints" 22 "github.com/juju/juju/environs" 23 "github.com/juju/juju/environs/imagemetadata" 24 "github.com/juju/juju/instance" 25 "github.com/juju/juju/testing" 26 "github.com/juju/juju/tools" 27 ) 28 29 type clientSuite struct { 30 testing.BaseSuite 31 } 32 33 var _ = gc.Suite(&clientSuite{}) 34 35 func (s *clientSuite) SetUpSuite(c *gc.C) { 36 s.BaseSuite.SetUpSuite(c) 37 mock.Start() 38 s.AddCleanup(func(*gc.C) { 39 mock.Stop() 40 }) 41 } 42 43 func (s *clientSuite) SetUpTest(c *gc.C) { 44 s.BaseSuite.SetUpTest(c) 45 46 ll := logger.LogLevel() 47 logger.SetLogLevel(loggo.TRACE) 48 s.AddCleanup(func(*gc.C) { logger.SetLogLevel(ll) }) 49 50 mock.Reset() 51 } 52 53 func (s *clientSuite) TearDownTest(c *gc.C) { 54 s.BaseSuite.TearDownTest(c) 55 } 56 57 func testNewClient(c *gc.C, endpoint, username, password string) (*environClient, error) { 58 ecfg := &environConfig{ 59 Config: newConfig(c, testing.Attrs{"name": "client-test", "uuid": "f54aac3a-9dcd-4a0c-86b5-24091478478c"}), 60 attrs: map[string]interface{}{ 61 "region": "testregion", 62 "endpoint": endpoint, 63 "username": username, 64 "password": password, 65 }, 66 } 67 return newClient(ecfg) 68 } 69 70 func addTestClientServer(c *gc.C, instance, env string) string { 71 json := `{"meta": {` 72 if instance != "" { 73 json += fmt.Sprintf(`"juju-instance": "%s"`, instance) 74 if env != "" { 75 json += fmt.Sprintf(`, "juju-model": "%s"`, env) 76 } 77 } 78 json += `}, "status": "running"}` 79 r := strings.NewReader(json) 80 s, err := data.ReadServer(r) 81 c.Assert(err, gc.IsNil) 82 mock.AddServer(s) 83 return s.UUID 84 } 85 86 func (s *clientSuite) TestClientInstances(c *gc.C) { 87 addTestClientServer(c, "", "") 88 addTestClientServer(c, jujuMetaInstanceServer, "alien") 89 addTestClientServer(c, jujuMetaInstanceController, "alien") 90 addTestClientServer(c, jujuMetaInstanceServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c") 91 addTestClientServer(c, jujuMetaInstanceServer, "f54aac3a-9dcd-4a0c-86b5-24091478478c") 92 suuid := addTestClientServer(c, jujuMetaInstanceController, "f54aac3a-9dcd-4a0c-86b5-24091478478c") 93 94 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 95 c.Assert(err, gc.IsNil) 96 97 ss, err := cli.instances() 98 c.Assert(err, gc.IsNil) 99 c.Assert(ss, gc.NotNil) 100 c.Check(ss, gc.HasLen, 3) 101 102 sm, err := cli.instanceMap() 103 c.Assert(err, gc.IsNil) 104 c.Assert(sm, gc.NotNil) 105 c.Check(sm, gc.HasLen, 3) 106 107 ids, err := cli.getControllerIds() 108 c.Check(err, gc.IsNil) 109 c.Check(len(ids), gc.Equals, 1) 110 c.Check(string(ids[0]), gc.Equals, suuid) 111 } 112 113 func (s *clientSuite) TestClientStopStateInstance(c *gc.C) { 114 addTestClientServer(c, "", "") 115 116 addTestClientServer(c, jujuMetaInstanceServer, "alien") 117 addTestClientServer(c, jujuMetaInstanceController, "alien") 118 addTestClientServer(c, jujuMetaInstanceServer, "client-test") 119 suuid := addTestClientServer(c, jujuMetaInstanceController, "client-test") 120 121 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 122 c.Assert(err, gc.IsNil) 123 124 err = cli.stopInstance(instance.Id(suuid)) 125 c.Assert(err, gc.IsNil) 126 127 _, err = cli.getControllerIds() 128 c.Check(err, gc.Equals, environs.ErrNotBootstrapped) 129 } 130 131 func (s *clientSuite) TestClientInvalidStopInstance(c *gc.C) { 132 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 133 c.Assert(err, gc.IsNil) 134 135 var id instance.Id 136 err = cli.stopInstance(id) 137 c.Check(err, gc.ErrorMatches, "invalid instance id") 138 139 err = cli.stopInstance("1234") 140 c.Check(err, gc.ErrorMatches, "404 Not Found.*") 141 } 142 143 func (s *clientSuite) TestClientInvalidServer(c *gc.C) { 144 cli, err := testNewClient(c, "https://testing.invalid", mock.TestUser, mock.TestPassword) 145 c.Assert(err, gc.IsNil) 146 147 cli.conn.ConnectTimeout(10 * time.Millisecond) 148 149 err = cli.stopInstance("1234") 150 c.Check(err, gc.ErrorMatches, "broken connection") 151 152 _, err = cli.instanceMap() 153 c.Check(err, gc.ErrorMatches, "broken connection") 154 155 _, err = cli.getControllerIds() 156 c.Check(err, gc.ErrorMatches, "broken connection") 157 } 158 159 func (s *clientSuite) TestClientNewInstanceInvalidParams(c *gc.C) { 160 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 161 c.Assert(err, gc.IsNil) 162 163 params := environs.StartInstanceParams{ 164 Constraints: constraints.Value{}, 165 } 166 img := &imagemetadata.ImageMetadata{ 167 Id: validImageId, 168 } 169 server, drive, arch, err := cli.newInstance(params, img, nil) 170 c.Check(server, gc.IsNil) 171 c.Check(arch, gc.Equals, "") 172 c.Check(drive, gc.IsNil) 173 c.Check(err, gc.ErrorMatches, "invalid configuration for new instance: InstanceConfig is nil") 174 } 175 176 func (s *clientSuite) TestClientNewInstanceInvalidTemplate(c *gc.C) { 177 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 178 c.Assert(err, gc.IsNil) 179 180 params := environs.StartInstanceParams{ 181 Constraints: constraints.Value{}, 182 InstanceConfig: &instancecfg.InstanceConfig{ 183 Bootstrap: true, 184 }, 185 } 186 err = params.InstanceConfig.SetTools(tools.List{ 187 &tools.Tools{ 188 Version: version.Binary{ 189 Series: "trusty", 190 }, 191 URL: "https://0.1.2.3:2000/x.y.z.tgz", 192 }, 193 }) 194 c.Assert(err, jc.ErrorIsNil) 195 img := &imagemetadata.ImageMetadata{ 196 Id: "invalid-id", 197 } 198 server, drive, arch, err := cli.newInstance(params, img, nil) 199 c.Check(server, gc.IsNil) 200 c.Check(arch, gc.Equals, "") 201 c.Check(drive, gc.IsNil) 202 c.Check(err, gc.ErrorMatches, "Failed to query drive template: 404 Not Found, notexist, notfound") 203 } 204 205 func (s *clientSuite) TestClientNewInstance(c *gc.C) { 206 cli, err := testNewClient(c, mock.Endpoint(""), mock.TestUser, mock.TestPassword) 207 c.Assert(err, gc.IsNil) 208 209 cli.conn.OperationTimeout(1 * time.Second) 210 211 params := environs.StartInstanceParams{ 212 Constraints: constraints.Value{}, 213 InstanceConfig: &instancecfg.InstanceConfig{ 214 Bootstrap: true, 215 }, 216 } 217 err = params.InstanceConfig.SetTools(tools.List{ 218 &tools.Tools{ 219 Version: version.Binary{ 220 Series: "trusty", 221 }, 222 URL: "https://0.1.2.3:2000/x.y.z.tgz", 223 }, 224 }) 225 c.Assert(err, jc.ErrorIsNil) 226 img := &imagemetadata.ImageMetadata{ 227 Id: validImageId, 228 } 229 cs := newConstraints(params.InstanceConfig.Bootstrap, params.Constraints, img) 230 c.Assert(cs, gc.NotNil) 231 c.Check(err, gc.IsNil) 232 233 templateDrive := &data.Drive{ 234 Resource: data.Resource{URI: "uri", UUID: cs.driveTemplate}, 235 LibraryDrive: data.LibraryDrive{ 236 Arch: "64", 237 ImageType: "image-type", 238 OS: "os", 239 Paid: true, 240 }, 241 Size: 2200 * gosigma.Megabyte, 242 Status: "unmounted", 243 } 244 mock.ResetDrives() 245 mock.LibDrives.Add(templateDrive) 246 247 server, drive, arch, err := cli.newInstance(params, img, utils.Gzip([]byte{})) 248 c.Check(server, gc.NotNil) 249 c.Check(drive, gc.NotNil) 250 c.Check(arch, gc.NotNil) 251 c.Check(err, gc.IsNil) 252 }