OLD | NEW |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |