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