Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(208)

Side by Side Diff: environs/tools/tools_test.go

Issue 13278043: Bootstrap uses tools matching major.minor (Closed)
Patch Set: Bootstrap uses tools matching major.minor Created 11 years, 7 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « environs/tools/tools.go ('k') | provider/instance.go » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012, 2013 Canonical Ltd. 1 // Copyright 2012, 2013 Canonical Ltd.
2 // Licensed under the AGPLv3, see LICENCE file for details. 2 // Licensed under the AGPLv3, see LICENCE file for details.
3 3
4 package tools_test 4 package tools_test
5 5
6 import ( 6 import (
7 gc "launchpad.net/gocheck" 7 gc "launchpad.net/gocheck"
8 8
9 "launchpad.net/juju-core/constraints"
10 "launchpad.net/juju-core/environs" 9 "launchpad.net/juju-core/environs"
11 "launchpad.net/juju-core/environs/config" 10 "launchpad.net/juju-core/environs/config"
12 envtesting "launchpad.net/juju-core/environs/testing" 11 envtesting "launchpad.net/juju-core/environs/testing"
13 envtools "launchpad.net/juju-core/environs/tools" 12 envtools "launchpad.net/juju-core/environs/tools"
14 "launchpad.net/juju-core/errors" 13 "launchpad.net/juju-core/errors"
15 "launchpad.net/juju-core/provider/dummy" 14 "launchpad.net/juju-core/provider/dummy"
16 "launchpad.net/juju-core/testing" 15 "launchpad.net/juju-core/testing"
17 jc "launchpad.net/juju-core/testing/checkers" 16 jc "launchpad.net/juju-core/testing/checkers"
18 coretools "launchpad.net/juju-core/tools" 17 coretools "launchpad.net/juju-core/tools"
19 "launchpad.net/juju-core/version" 18 "launchpad.net/juju-core/version"
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 final[k] = v 53 final[k] = v
55 } 54 }
56 cfg, err := config.New(final) 55 cfg, err := config.New(final)
57 c.Assert(err, gc.IsNil) 56 c.Assert(err, gc.IsNil)
58 env, err := environs.Prepare(cfg) 57 env, err := environs.Prepare(cfg)
59 c.Assert(err, gc.IsNil) 58 c.Assert(err, gc.IsNil)
60 s.env = env 59 s.env = env
61 envtesting.RemoveAllTools(c, s.env) 60 envtesting.RemoveAllTools(c, s.env)
62 } 61 }
63 62
64 var (
65 v100 = version.MustParse("1.0.0")
66 v100p64 = version.MustParseBinary("1.0.0-precise-amd64")
67 v100p32 = version.MustParseBinary("1.0.0-precise-i386")
68 v100p = []version.Binary{v100p64, v100p32}
69
70 v100q64 = version.MustParseBinary("1.0.0-quantal-amd64")
71 v100q32 = version.MustParseBinary("1.0.0-quantal-i386")
72 v100q = []version.Binary{v100q64, v100q32}
73 v100all = append(v100p, v100q...)
74
75 v1001 = version.MustParse("1.0.0.1")
76 v1001p64 = version.MustParseBinary("1.0.0.1-precise-amd64")
77 v100Xall = append(v100all, v1001p64)
78
79 v110 = version.MustParse("1.1.0")
80 v110p64 = version.MustParseBinary("1.1.0-precise-amd64")
81 v110p32 = version.MustParseBinary("1.1.0-precise-i386")
82 v110p = []version.Binary{v110p64, v110p32}
83
84 v110q64 = version.MustParseBinary("1.1.0-quantal-amd64")
85 v110q32 = version.MustParseBinary("1.1.0-quantal-i386")
86 v110q = []version.Binary{v110q64, v110q32}
87 v110all = append(v110p, v110q...)
88
89 v120 = version.MustParse("1.2.0")
90 v120p64 = version.MustParseBinary("1.2.0-precise-amd64")
91 v120p32 = version.MustParseBinary("1.2.0-precise-i386")
92 v120p = []version.Binary{v120p64, v120p32}
93
94 v120q64 = version.MustParseBinary("1.2.0-quantal-amd64")
95 v120q32 = version.MustParseBinary("1.2.0-quantal-i386")
96 v120q = []version.Binary{v120q64, v120q32}
97 v120all = append(v120p, v120q...)
98 v1all = append(v100Xall, append(v110all, v120all...)...)
99
100 v220 = version.MustParse("2.2.0")
101 v220p32 = version.MustParseBinary("2.2.0-precise-i386")
102 v220p64 = version.MustParseBinary("2.2.0-precise-amd64")
103 v220q32 = version.MustParseBinary("2.2.0-quantal-i386")
104 v220q64 = version.MustParseBinary("2.2.0-quantal-amd64")
105 v220all = []version.Binary{v220p64, v220p32, v220q64, v220q32}
106 vAll = append(v1all, v220all...)
107 )
108
109 func (s *ToolsSuite) uploadVersions(c *gc.C, storage environs.Storage, verses .. .version.Binary) map[version.Binary]string { 63 func (s *ToolsSuite) uploadVersions(c *gc.C, storage environs.Storage, verses .. .version.Binary) map[version.Binary]string {
110 uploaded := map[version.Binary]string{} 64 uploaded := map[version.Binary]string{}
111 for _, vers := range verses { 65 for _, vers := range verses {
112 uploaded[vers] = envtesting.UploadFakeToolsVersion(c, storage, v ers).URL 66 uploaded[vers] = envtesting.UploadFakeToolsVersion(c, storage, v ers).URL
113 } 67 }
114 return uploaded 68 return uploaded
115 } 69 }
116 70
117 func (s *ToolsSuite) uploadPrivate(c *gc.C, verses ...version.Binary) map[versio n.Binary]string { 71 func (s *ToolsSuite) uploadPrivate(c *gc.C, verses ...version.Binary) map[versio n.Binary]string {
118 return s.uploadVersions(c, s.env.Storage(), verses...) 72 return s.uploadVersions(c, s.env.Storage(), verses...)
119 } 73 }
120 74
121 func (s *ToolsSuite) uploadPublic(c *gc.C, verses ...version.Binary) map[version .Binary]string { 75 func (s *ToolsSuite) uploadPublic(c *gc.C, verses ...version.Binary) map[version .Binary]string {
122 storage := s.env.PublicStorage().(environs.Storage) 76 storage := s.env.PublicStorage().(environs.Storage)
123 return s.uploadVersions(c, storage, verses...) 77 return s.uploadVersions(c, storage, verses...)
124 } 78 }
125 79
126 var findToolsTests = []struct { 80 var findToolsTests = []struct {
127 info string 81 info string
128 major int 82 major int
83 minor int
129 private []version.Binary 84 private []version.Binary
130 public []version.Binary 85 public []version.Binary
131 expect []version.Binary 86 expect []version.Binary
132 err error 87 err error
133 }{{ 88 }{{
134 info: "none available anywhere", 89 info: "none available anywhere",
135 major: 1, 90 major: 1,
136 err: envtools.ErrNoTools, 91 err: envtools.ErrNoTools,
137 }, { 92 }, {
138 info: "private tools only, none matching", 93 info: "private tools only, none matching",
139 major: 1, 94 major: 1,
140 » private: v220all, 95 » minor: 2,
96 » private: envtesting.V220all,
141 err: coretools.ErrNoMatches, 97 err: coretools.ErrNoMatches,
142 }, { 98 }, {
143 info: "tools found in private bucket", 99 info: "tools found in private bucket",
144 major: 1, 100 major: 1,
145 » private: vAll, 101 » minor: 2,
146 » expect: v1all, 102 » private: envtesting.VAll,
103 » expect: envtesting.V120all,
147 }, { 104 }, {
148 info: "tools found in public bucket", 105 info: "tools found in public bucket",
149 major: 1, 106 major: 1,
150 » public: vAll, 107 » minor: 1,
151 » expect: v1all, 108 » public: envtesting.VAll,
109 » expect: envtesting.V110all,
152 }, { 110 }, {
153 info: "tools found in both buckets, only taken from private", 111 info: "tools found in both buckets, only taken from private",
154 major: 1, 112 major: 1,
155 » private: v110p, 113 » minor: 1,
156 » public: vAll, 114 » private: envtesting.V110p,
157 » expect: v110p, 115 » public: envtesting.VAll,
116 » expect: envtesting.V110p,
158 }, { 117 }, {
159 info: "private tools completely block public ones", 118 info: "private tools completely block public ones",
160 major: 1, 119 major: 1,
161 » private: v220all, 120 » private: envtesting.V220all,
162 » public: vAll, 121 » public: envtesting.VAll,
163 err: coretools.ErrNoMatches, 122 err: coretools.ErrNoMatches,
123 }, {
124 info: "tools matching major version only",
125 major: 1,
126 minor: -1,
127 public: envtesting.VAll,
128 expect: envtesting.V1all,
164 }} 129 }}
165 130
166 func (s *ToolsSuite) TestFindTools(c *gc.C) { 131 func (s *ToolsSuite) TestFindTools(c *gc.C) {
167 for i, test := range findToolsTests { 132 for i, test := range findToolsTests {
168 c.Logf("\ntest %d: %s", i, test.info) 133 c.Logf("\ntest %d: %s", i, test.info)
169 s.Reset(c, nil) 134 s.Reset(c, nil)
170 private := s.uploadPrivate(c, test.private...) 135 private := s.uploadPrivate(c, test.private...)
171 public := s.uploadPublic(c, test.public...) 136 public := s.uploadPublic(c, test.public...)
172 » » actual, err := envtools.FindTools(s.env, test.major, coretools.F ilter{}) 137 » » actual, err := envtools.FindTools(environs.StorageInstances(s.en v), test.major, test.minor, coretools.Filter{})
173 if test.err != nil { 138 if test.err != nil {
174 if len(actual) > 0 { 139 if len(actual) > 0 {
175 c.Logf(actual.String()) 140 c.Logf(actual.String())
176 } 141 }
177 c.Check(err, jc.Satisfies, errors.IsNotFoundError) 142 c.Check(err, jc.Satisfies, errors.IsNotFoundError)
178 continue 143 continue
179 } 144 }
180 source := private 145 source := private
181 if len(source) == 0 { 146 if len(source) == 0 {
182 // We only use the public bucket if the private one has *no* envtools. 147 // We only use the public bucket if the private one has *no* envtools.
183 source = public 148 source = public
184 } 149 }
185 expect := map[version.Binary]string{} 150 expect := map[version.Binary]string{}
186 for _, expected := range test.expect { 151 for _, expected := range test.expect {
187 expect[expected] = source[expected] 152 expect[expected] = source[expected]
188 } 153 }
189 c.Check(actual.URLs(), gc.DeepEquals, expect) 154 c.Check(actual.URLs(), gc.DeepEquals, expect)
190 } 155 }
191 } 156 }
192 157
193 var findBootstrapToolsTests = []struct {
194 info string
195 available []version.Binary
196 cliVersion version.Binary
197 defaultSeries string
198 agentVersion version.Number
199 development bool
200 constraints string
201 expect []version.Binary
202 err error
203 }{{
204 info: "no tools at all",
205 cliVersion: v100p64,
206 defaultSeries: "precise",
207 err: envtools.ErrNoTools,
208 }, {
209 info: "released cli: use newest compatible release version",
210 available: vAll,
211 cliVersion: v100p64,
212 defaultSeries: "precise",
213 expect: v120p,
214 }, {
215 info: "released cli: cli arch ignored",
216 available: vAll,
217 cliVersion: v100p32,
218 defaultSeries: "precise",
219 expect: v120p,
220 }, {
221 info: "released cli: cli series ignored",
222 available: vAll,
223 cliVersion: v100q64,
224 defaultSeries: "precise",
225 expect: v120p,
226 }, {
227 info: "released cli: series taken from default-series",
228 available: v100Xall,
229 cliVersion: v100p64,
230 defaultSeries: "quantal",
231 expect: v100q,
232 }, {
233 info: "released cli: ignore close dev match",
234 available: v100Xall,
235 cliVersion: v120p64,
236 defaultSeries: "precise",
237 expect: v100p,
238 }, {
239 info: "released cli: use older release version if necessary",
240 available: v100Xall,
241 cliVersion: v120p64,
242 defaultSeries: "quantal",
243 expect: v100q,
244 }, {
245 info: "released cli: ignore irrelevant constraints",
246 available: v100Xall,
247 cliVersion: v100p64,
248 defaultSeries: "precise",
249 constraints: "mem=32G",
250 expect: v100p,
251 }, {
252 info: "released cli: filter by arch constraints",
253 available: v120all,
254 cliVersion: v100p64,
255 defaultSeries: "precise",
256 constraints: "arch=i386",
257 expect: []version.Binary{v120p32},
258 }, {
259 info: "released cli: specific released version",
260 available: vAll,
261 cliVersion: v120p64,
262 agentVersion: v100,
263 defaultSeries: "precise",
264 expect: v100p,
265 }, {
266 info: "released cli: specific dev version",
267 available: vAll,
268 cliVersion: v120p64,
269 agentVersion: v110,
270 defaultSeries: "precise",
271 expect: v110p,
272 }, {
273 info: "released cli: major upgrades bad",
274 available: v220all,
275 cliVersion: v100p64,
276 defaultSeries: "precise",
277 err: coretools.ErrNoMatches,
278 }, {
279 info: "released cli: major downgrades bad",
280 available: v100Xall,
281 cliVersion: v220p64,
282 defaultSeries: "precise",
283 err: coretools.ErrNoMatches,
284 }, {
285 info: "released cli: no matching series",
286 available: vAll,
287 cliVersion: v100p64,
288 defaultSeries: "raring",
289 err: coretools.ErrNoMatches,
290 }, {
291 info: "released cli: no matching arches",
292 available: vAll,
293 cliVersion: v100p64,
294 defaultSeries: "precise",
295 constraints: "arch=arm",
296 err: coretools.ErrNoMatches,
297 }, {
298 info: "released cli: specific bad major 1",
299 available: vAll,
300 cliVersion: v220p64,
301 agentVersion: v120,
302 defaultSeries: "precise",
303 err: coretools.ErrNoMatches,
304 }, {
305 info: "released cli: specific bad major 2",
306 available: vAll,
307 cliVersion: v120p64,
308 agentVersion: v220,
309 defaultSeries: "precise",
310 err: coretools.ErrNoMatches,
311 }, {
312 info: "released cli: ignore dev tools 1",
313 available: v110all,
314 cliVersion: v100p64,
315 defaultSeries: "precise",
316 err: coretools.ErrNoMatches,
317 }, {
318 info: "released cli: ignore dev tools 2",
319 available: v110all,
320 cliVersion: v120p64,
321 defaultSeries: "precise",
322 err: coretools.ErrNoMatches,
323 }, {
324 info: "released cli: ignore dev tools 3",
325 available: []version.Binary{v1001p64},
326 cliVersion: v100p64,
327 defaultSeries: "precise",
328 err: coretools.ErrNoMatches,
329 }, {
330 info: "released cli with dev setting picks newest matching 1",
331 available: v100Xall,
332 cliVersion: v120q32,
333 defaultSeries: "precise",
334 development: true,
335 expect: []version.Binary{v1001p64},
336 }, {
337 info: "released cli with dev setting picks newest matching 2",
338 available: vAll,
339 cliVersion: v100q64,
340 defaultSeries: "precise",
341 development: true,
342 constraints: "arch=i386",
343 expect: []version.Binary{v120p32},
344 }, {
345 info: "released cli with dev setting respects agent-version",
346 available: vAll,
347 cliVersion: v100q32,
348 agentVersion: v1001,
349 defaultSeries: "precise",
350 development: true,
351 expect: []version.Binary{v1001p64},
352 }, {
353 info: "dev cli picks newest matching 1",
354 available: v100Xall,
355 cliVersion: v110q32,
356 defaultSeries: "precise",
357 expect: []version.Binary{v1001p64},
358 }, {
359 info: "dev cli picks newest matching 2",
360 available: vAll,
361 cliVersion: v110q64,
362 defaultSeries: "precise",
363 constraints: "arch=i386",
364 expect: []version.Binary{v120p32},
365 }, {
366 info: "dev cli respects agent-version",
367 available: vAll,
368 cliVersion: v110q32,
369 agentVersion: v1001,
370 defaultSeries: "precise",
371 expect: []version.Binary{v1001p64},
372 }}
373
374 func (s *ToolsSuite) TestFindBootstrapTools(c *gc.C) { 158 func (s *ToolsSuite) TestFindBootstrapTools(c *gc.C) {
375 » for i, test := range findBootstrapToolsTests { 159 » for i, test := range envtesting.BootstrapToolsTests {
376 » » c.Logf("\ntest %d: %s", i, test.info) 160 » » c.Logf("\ntest %d: %s", i, test.Info)
377 attrs := map[string]interface{}{ 161 attrs := map[string]interface{}{
378 » » » "development": test.development, 162 » » » "development": test.Development,
379 » » » "default-series": test.defaultSeries, 163 » » » "default-series": test.DefaultSeries,
380 } 164 }
381 » » if test.agentVersion != version.Zero { 165 » » var agentVersion *version.Number
382 » » » attrs["agent-version"] = test.agentVersion.String() 166 » » if test.AgentVersion != version.Zero {
167 » » » attrs["agent-version"] = test.AgentVersion.String()
168 » » » agentVersion = &test.AgentVersion
383 } 169 }
384 s.Reset(c, attrs) 170 s.Reset(c, attrs)
385 » » version.Current = test.cliVersion 171 » » version.Current = test.CliVersion
386 » » available := s.uploadPrivate(c, test.available...) 172 » » available := s.uploadPrivate(c, test.Available...)
387 if len(available) > 0 { 173 if len(available) > 0 {
388 // These should never be chosen. 174 // These should never be chosen.
389 » » » s.uploadPublic(c, vAll...) 175 » » » s.uploadPublic(c, envtesting.VAll...)
390 } 176 }
391 177
392 » » cons := constraints.MustParse(test.constraints) 178 » » cfg := s.env.Config()
393 » » actual, err := envtools.FindBootstrapTools(s.env, cons) 179 » » actual, err := envtools.FindBootstrapTools(
394 » » if test.err != nil { 180 » » » environs.StorageInstances(s.env), agentVersion, cfg.Defa ultSeries(), &test.Arch, cfg.Development())
181 » » if test.Err != nil {
395 if len(actual) > 0 { 182 if len(actual) > 0 {
396 c.Logf(actual.String()) 183 c.Logf(actual.String())
397 } 184 }
398 c.Check(err, jc.Satisfies, errors.IsNotFoundError) 185 c.Check(err, jc.Satisfies, errors.IsNotFoundError)
399 continue 186 continue
400 } 187 }
401 expect := map[version.Binary]string{} 188 expect := map[version.Binary]string{}
402 » » unique := map[version.Number]bool{} 189 » » for _, expected := range test.Expect {
403 » » for _, expected := range test.expect {
404 expect[expected] = available[expected] 190 expect[expected] = available[expected]
405 unique[expected.Number] = true
406 } 191 }
407 c.Check(actual.URLs(), gc.DeepEquals, expect) 192 c.Check(actual.URLs(), gc.DeepEquals, expect)
408 for expectAgentVersion := range unique {
409 agentVersion, ok := s.env.Config().AgentVersion()
410 c.Check(ok, gc.Equals, true)
411 c.Check(agentVersion, gc.Equals, expectAgentVersion)
412 }
413 } 193 }
414 } 194 }
415 195
416 var findInstanceToolsTests = []struct { 196 var findInstanceToolsTests = []struct {
417 info string 197 info string
418 available []version.Binary 198 available []version.Binary
419 agentVersion version.Number 199 agentVersion version.Number
420 series string 200 series string
421 » constraints string 201 » arch string
422 expect []version.Binary 202 expect []version.Binary
423 err error 203 err error
424 }{{ 204 }{{
425 info: "nothing at all", 205 info: "nothing at all",
426 » agentVersion: v120, 206 » agentVersion: envtesting.V120,
427 series: "precise", 207 series: "precise",
428 err: envtools.ErrNoTools, 208 err: envtools.ErrNoTools,
429 }, { 209 }, {
430 info: "nothing matching 1", 210 info: "nothing matching 1",
431 » available: v100Xall, 211 » available: envtesting.V100Xall,
432 » agentVersion: v120, 212 » agentVersion: envtesting.V120,
433 series: "precise", 213 series: "precise",
434 err: coretools.ErrNoMatches, 214 err: coretools.ErrNoMatches,
435 }, { 215 }, {
436 info: "nothing matching 2", 216 info: "nothing matching 2",
437 » available: v120all, 217 » available: envtesting.V120all,
438 » agentVersion: v110, 218 » agentVersion: envtesting.V110,
439 series: "precise", 219 series: "precise",
440 err: coretools.ErrNoMatches, 220 err: coretools.ErrNoMatches,
441 }, { 221 }, {
442 info: "nothing matching 3", 222 info: "nothing matching 3",
443 » available: v120q, 223 » available: envtesting.V120q,
444 » agentVersion: v120, 224 » agentVersion: envtesting.V120,
445 series: "precise", 225 series: "precise",
446 err: coretools.ErrNoMatches, 226 err: coretools.ErrNoMatches,
447 }, { 227 }, {
448 info: "nothing matching 4", 228 info: "nothing matching 4",
449 » available: v120q, 229 » available: envtesting.V120q,
450 » agentVersion: v120, 230 » agentVersion: envtesting.V120,
451 series: "quantal", 231 series: "quantal",
452 » constraints: "arch=arm", 232 » arch: "arm",
453 err: coretools.ErrNoMatches, 233 err: coretools.ErrNoMatches,
454 }, { 234 }, {
455 info: "actual match 1", 235 info: "actual match 1",
456 » available: vAll, 236 » available: envtesting.VAll,
457 » agentVersion: v1001, 237 » agentVersion: envtesting.V1001,
458 series: "precise", 238 series: "precise",
459 » expect: []version.Binary{v1001p64}, 239 » expect: []version.Binary{envtesting.V1001p64},
460 }, { 240 }, {
461 info: "actual match 2", 241 info: "actual match 2",
462 » available: vAll, 242 » available: envtesting.VAll,
463 » agentVersion: v120, 243 » agentVersion: envtesting.V120,
464 series: "quantal", 244 series: "quantal",
465 » expect: []version.Binary{v120q64, v120q32}, 245 » expect: []version.Binary{envtesting.V120q64, envtesting.V120q32},
466 }, { 246 }, {
467 info: "actual match 3", 247 info: "actual match 3",
468 » available: vAll, 248 » available: envtesting.VAll,
469 » agentVersion: v110, 249 » agentVersion: envtesting.V110,
470 series: "quantal", 250 series: "quantal",
471 » constraints: "arch=i386", 251 » arch: "i386",
472 » expect: []version.Binary{v110q32}, 252 » expect: []version.Binary{envtesting.V110q32},
473 }} 253 }}
474 254
475 func (s *ToolsSuite) TestFindInstanceTools(c *gc.C) { 255 func (s *ToolsSuite) TestFindInstanceTools(c *gc.C) {
476 for i, test := range findInstanceToolsTests { 256 for i, test := range findInstanceToolsTests {
477 c.Logf("\ntest %d: %s", i, test.info) 257 c.Logf("\ntest %d: %s", i, test.info)
478 s.Reset(c, map[string]interface{}{ 258 s.Reset(c, map[string]interface{}{
479 "agent-version": test.agentVersion.String(), 259 "agent-version": test.agentVersion.String(),
480 }) 260 })
481 available := s.uploadPrivate(c, test.available...) 261 available := s.uploadPrivate(c, test.available...)
482 if len(available) > 0 { 262 if len(available) > 0 {
483 // These should never be chosen. 263 // These should never be chosen.
484 » » » s.uploadPublic(c, vAll...) 264 » » » s.uploadPublic(c, envtesting.VAll...)
485 } 265 }
486 266
487 » » cons := constraints.MustParse(test.constraints) 267 » » agentVersion, _ := s.env.Config().AgentVersion()
488 » » actual, err := envtools.FindInstanceTools(s.env, test.series, co ns) 268 » » actual, err := envtools.FindInstanceTools(environs.StorageInstan ces(s.env), agentVersion, test.series, &test.arch)
489 if test.err != nil { 269 if test.err != nil {
490 if len(actual) > 0 { 270 if len(actual) > 0 {
491 c.Logf(actual.String()) 271 c.Logf(actual.String())
492 } 272 }
493 c.Check(err, jc.Satisfies, errors.IsNotFoundError) 273 c.Check(err, jc.Satisfies, errors.IsNotFoundError)
494 continue 274 continue
495 } 275 }
496 expect := map[version.Binary]string{} 276 expect := map[version.Binary]string{}
497 for _, expected := range test.expect { 277 for _, expected := range test.expect {
498 expect[expected] = available[expected] 278 expect[expected] = available[expected]
499 } 279 }
500 c.Check(actual.URLs(), gc.DeepEquals, expect) 280 c.Check(actual.URLs(), gc.DeepEquals, expect)
501 } 281 }
502 } 282 }
503 283
504 var findExactToolsTests = []struct { 284 var findExactToolsTests = []struct {
505 info string 285 info string
506 private []version.Binary 286 private []version.Binary
507 public []version.Binary 287 public []version.Binary
508 seek version.Binary 288 seek version.Binary
509 err error 289 err error
510 }{{ 290 }{{
511 info: "nothing available", 291 info: "nothing available",
512 » seek: v100p64, 292 » seek: envtesting.V100p64,
513 err: envtools.ErrNoTools, 293 err: envtools.ErrNoTools,
514 }, { 294 }, {
515 info: "only non-matches available in private", 295 info: "only non-matches available in private",
516 » private: append(v110all, v100p32, v100q64, v1001p64), 296 » private: append(envtesting.V110all, envtesting.V100p32, envtesting.V100q 64, envtesting.V1001p64),
517 » seek: v100p64, 297 » seek: envtesting.V100p64,
518 err: coretools.ErrNoMatches, 298 err: coretools.ErrNoMatches,
519 }, { 299 }, {
520 info: "exact match available in private", 300 info: "exact match available in private",
521 » private: []version.Binary{v100p64}, 301 » private: []version.Binary{envtesting.V100p64},
522 » seek: v100p64, 302 » seek: envtesting.V100p64,
523 }, { 303 }, {
524 info: "only non-matches available in public", 304 info: "only non-matches available in public",
525 » private: append(v110all, v100p32, v100q64, v1001p64), 305 » private: append(envtesting.V110all, envtesting.V100p32, envtesting.V100q 64, envtesting.V1001p64),
526 » seek: v100p64, 306 » seek: envtesting.V100p64,
527 err: coretools.ErrNoMatches, 307 err: coretools.ErrNoMatches,
528 }, { 308 }, {
529 info: "exact match available in public", 309 info: "exact match available in public",
530 » public: []version.Binary{v100p64}, 310 » public: []version.Binary{envtesting.V100p64},
531 » seek: v100p64, 311 » seek: envtesting.V100p64,
532 }, { 312 }, {
533 info: "exact match in public blocked by private", 313 info: "exact match in public blocked by private",
534 » private: v110all, 314 » private: envtesting.V110all,
535 » public: []version.Binary{v100p64}, 315 » public: []version.Binary{envtesting.V100p64},
536 » seek: v100p64, 316 » seek: envtesting.V100p64,
537 err: coretools.ErrNoMatches, 317 err: coretools.ErrNoMatches,
538 }} 318 }}
539 319
540 func (s *ToolsSuite) TestFindExactTools(c *gc.C) { 320 func (s *ToolsSuite) TestFindExactTools(c *gc.C) {
541 for i, test := range findExactToolsTests { 321 for i, test := range findExactToolsTests {
542 c.Logf("\ntest %d: %s", i, test.info) 322 c.Logf("\ntest %d: %s", i, test.info)
543 s.Reset(c, nil) 323 s.Reset(c, nil)
544 private := s.uploadPrivate(c, test.private...) 324 private := s.uploadPrivate(c, test.private...)
545 public := s.uploadPublic(c, test.public...) 325 public := s.uploadPublic(c, test.public...)
546 » » actual, err := envtools.FindExactTools(s.env, test.seek) 326 » » actual, err := envtools.FindExactTools(environs.StorageInstances (s.env), test.seek.Number, test.seek.Series, test.seek.Arch)
547 if test.err == nil { 327 if test.err == nil {
548 c.Check(err, gc.IsNil) 328 c.Check(err, gc.IsNil)
549 c.Check(actual.Version, gc.Equals, test.seek) 329 c.Check(actual.Version, gc.Equals, test.seek)
550 source := private 330 source := private
551 if len(source) == 0 { 331 if len(source) == 0 {
552 // We only use the public bucket if the private one has *no* envtools. 332 // We only use the public bucket if the private one has *no* envtools.
553 source = public 333 source = public
554 } 334 }
555 c.Check(actual.URL, gc.DeepEquals, source[actual.Version ]) 335 c.Check(actual.URL, gc.DeepEquals, source[actual.Version ])
556 } else { 336 } else {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 c.Assert(err, gc.NotNil) 383 c.Assert(err, gc.NotNil)
604 c.Check(err, gc.ErrorMatches, "tools mismatch: expected series warty, go t hoary") 384 c.Check(err, gc.ErrorMatches, "tools mismatch: expected series warty, go t hoary")
605 } 385 }
606 386
607 func (s *ToolsSuite) TestCheckToolsSeriesRejectsToolsForMixedSeries(c *gc.C) { 387 func (s *ToolsSuite) TestCheckToolsSeriesRejectsToolsForMixedSeries(c *gc.C) {
608 list := fakeToolsList("precise", "raring") 388 list := fakeToolsList("precise", "raring")
609 err := envtools.CheckToolsSeries(list, "precise") 389 err := envtools.CheckToolsSeries(list, "precise")
610 c.Assert(err, gc.NotNil) 390 c.Assert(err, gc.NotNil)
611 c.Check(err, gc.ErrorMatches, "expected single series, got .*") 391 c.Check(err, gc.ErrorMatches, "expected single series, got .*")
612 } 392 }
OLDNEW
« no previous file with comments | « environs/tools/tools.go ('k') | provider/instance.go » ('j') | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b