blob: d751208065a3072785bf8742b57cc433aef39205 [file] [log] [blame]
Damien Martin-Guillerezf88f4d82015-09-25 13:56:55 +00001# Copyright 2015 The Bazel Authors. All rights reserved.
Damien Martin-Guillerez5f258912015-07-27 08:27:53 +00002#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14"""Testing for rewrite_json."""
15
16import unittest
17
18from tools.build_defs.docker.rewrite_json import _DOCKER_VERSION
19from tools.build_defs.docker.rewrite_json import _OPERATING_SYSTEM
20from tools.build_defs.docker.rewrite_json import _PROCESSOR_ARCHITECTURE
21from tools.build_defs.docker.rewrite_json import MetadataOptions
22from tools.build_defs.docker.rewrite_json import RewriteMetadata
23
24
25class RewriteJsonTest(unittest.TestCase):
26 """Testing for rewrite_json."""
27
28 def testNewEntrypoint(self):
29 in_data = {
30 'config': {
31 'User': 'mattmoor',
32 'WorkingDir': '/usr/home/mattmoor'
33 }
34 }
35 name = 'deadbeef'
36 parent = 'blah'
37 entrypoint = ['/bin/bash']
38 expected = {
39 'id': name,
40 'parent': parent,
41 'config': {
42 'User': 'mattmoor',
43 'WorkingDir': '/usr/home/mattmoor',
44 'Entrypoint': entrypoint
45 },
46 'docker_version': _DOCKER_VERSION,
47 'architecture': _PROCESSOR_ARCHITECTURE,
48 'os': _OPERATING_SYSTEM,
49 }
50
51 actual = RewriteMetadata(in_data, MetadataOptions(
52 name=name, entrypoint=entrypoint, parent=parent))
53 self.assertEquals(expected, actual)
54
55 def testOverrideEntrypoint(self):
56 in_data = {
57 'config': {
58 'User': 'mattmoor',
59 'WorkingDir': '/usr/home/mattmoor',
60 'Entrypoint': ['/bin/sh', 'does', 'not', 'matter'],
61 }
62 }
63 name = 'deadbeef'
64 parent = 'blah'
65 entrypoint = ['/bin/bash']
66 expected = {
67 'id': name,
68 'parent': parent,
69 'config': {
70 'User': 'mattmoor',
71 'WorkingDir': '/usr/home/mattmoor',
72 'Entrypoint': entrypoint
73 },
74 'docker_version': _DOCKER_VERSION,
75 'architecture': _PROCESSOR_ARCHITECTURE,
76 'os': _OPERATING_SYSTEM,
77 }
78
79 actual = RewriteMetadata(in_data, MetadataOptions(
80 name=name, entrypoint=entrypoint, parent=parent))
81 self.assertEquals(expected, actual)
82
83 def testNewCmd(self):
84 in_data = {
85 'config': {
86 'User': 'mattmoor',
87 'WorkingDir': '/usr/home/mattmoor',
88 'Entrypoint': ['/bin/bash'],
89 }
90 }
91 name = 'deadbeef'
92 parent = 'blah'
93 cmd = ['/bin/bash']
94 expected = {
95 'id': name,
96 'parent': parent,
97 'config': {
98 'User': 'mattmoor',
99 'WorkingDir': '/usr/home/mattmoor',
100 'Entrypoint': ['/bin/bash'],
101 'Cmd': cmd
102 },
103 'docker_version': _DOCKER_VERSION,
104 'architecture': _PROCESSOR_ARCHITECTURE,
105 'os': _OPERATING_SYSTEM,
106 }
107
108 actual = RewriteMetadata(in_data, MetadataOptions(
109 name=name, cmd=cmd, parent=parent))
110 self.assertEquals(expected, actual)
111
112 def testOverrideCmd(self):
113 in_data = {
114 'config': {
115 'User': 'mattmoor',
116 'WorkingDir': '/usr/home/mattmoor',
117 'Entrypoint': ['/bin/bash'],
118 'Cmd': ['does', 'not', 'matter'],
119 }
120 }
121 name = 'deadbeef'
122 parent = 'blah'
123 cmd = ['does', 'matter']
124 expected = {
125 'id': name,
126 'parent': parent,
127 'config': {
128 'User': 'mattmoor',
129 'WorkingDir': '/usr/home/mattmoor',
130 'Entrypoint': ['/bin/bash'],
131 'Cmd': cmd
132 },
133 'docker_version': _DOCKER_VERSION,
134 'architecture': _PROCESSOR_ARCHITECTURE,
135 'os': _OPERATING_SYSTEM,
136 }
137
138 actual = RewriteMetadata(in_data, MetadataOptions(
139 name=name, cmd=cmd, parent=parent))
140 self.assertEquals(expected, actual)
141
142 def testOverrideBoth(self):
143 in_data = {
144 'config': {
145 'User': 'mattmoor',
146 'WorkingDir': '/usr/home/mattmoor',
147 'Entrypoint': ['/bin/sh'],
148 'Cmd': ['does', 'not', 'matter'],
149 }
150 }
151 name = 'deadbeef'
152 parent = 'blah'
153 entrypoint = ['/bin/bash', '-c']
154 cmd = ['my-command', 'my-arg1', 'my-arg2']
155 expected = {
156 'id': name,
157 'parent': parent,
158 'config': {
159 'User': 'mattmoor',
160 'WorkingDir': '/usr/home/mattmoor',
161 'Entrypoint': entrypoint,
162 'Cmd': cmd
163 },
164 'docker_version': _DOCKER_VERSION,
165 'architecture': _PROCESSOR_ARCHITECTURE,
166 'os': _OPERATING_SYSTEM,
167 }
168
169 actual = RewriteMetadata(in_data, MetadataOptions(
170 name=name, entrypoint=entrypoint, cmd=cmd, parent=parent))
171 self.assertEquals(expected, actual)
172
173 def testOverrideParent(self):
174 name = 'me!'
175 parent = 'parent'
176 # In the typical case, we expect the parent to
177 # come in as the 'id', and our grandparent to
178 # be its 'parent'.
179 in_data = {
180 'id': parent,
181 'parent': 'grandparent',
182 }
183 expected = {
184 'id': name,
185 'parent': parent,
186 'config': {},
187 'docker_version': _DOCKER_VERSION,
188 'architecture': _PROCESSOR_ARCHITECTURE,
189 'os': _OPERATING_SYSTEM,
190 }
191
192 actual = RewriteMetadata(in_data, MetadataOptions(
193 name=name, parent=parent))
194 self.assertEquals(expected, actual)
195
196 def testNewSize(self):
197 # Size is one of the few fields that, when omitted,
198 # should be removed.
199 in_data = {
200 'id': 'you',
201 'Size': '124',
202 }
203 name = 'me'
204 parent = 'blah'
205 size = '4321'
206 expected = {
207 'id': name,
208 'parent': parent,
209 'Size': size,
210 'config': {},
211 'docker_version': _DOCKER_VERSION,
212 'architecture': _PROCESSOR_ARCHITECTURE,
213 'os': _OPERATING_SYSTEM,
214 }
215
216 actual = RewriteMetadata(in_data, MetadataOptions(
217 name=name, size=size, parent=parent))
218 self.assertEquals(expected, actual)
219
220 def testOmitSize(self):
221 # Size is one of the few fields that, when omitted,
222 # should be removed.
223 in_data = {
224 'id': 'you',
225 'Size': '124',
226 }
227 name = 'me'
228 parent = 'blah'
229 expected = {
230 'id': name,
231 'parent': parent,
232 'config': {},
233 'docker_version': _DOCKER_VERSION,
234 'architecture': _PROCESSOR_ARCHITECTURE,
235 'os': _OPERATING_SYSTEM,
236 }
237
238 actual = RewriteMetadata(in_data, MetadataOptions(
239 name=name, parent=parent))
240 self.assertEquals(expected, actual)
241
242 def testOmitName(self):
243 # Name is required.
244 with self.assertRaises(Exception):
245 RewriteMetadata({}, MetadataOptions(name=None))
246
247 def testStripContainerConfig(self):
248 # Size is one of the few fields that, when omitted,
249 # should be removed.
250 in_data = {
251 'id': 'you',
252 'container_config': {},
253 }
254 name = 'me'
255 parent = 'blah'
256 expected = {
257 'id': name,
258 'parent': parent,
259 'config': {},
260 'docker_version': _DOCKER_VERSION,
261 'architecture': _PROCESSOR_ARCHITECTURE,
262 'os': _OPERATING_SYSTEM,
263 }
264
265 actual = RewriteMetadata(in_data, MetadataOptions(
266 name=name, parent=parent))
267 self.assertEquals(expected, actual)
268
269 def testEmptyBase(self):
270 in_data = {}
271 name = 'deadbeef'
272 entrypoint = ['/bin/bash', '-c']
273 cmd = ['my-command', 'my-arg1', 'my-arg2']
274 size = '999'
275 expected = {
276 'id': name,
277 'config': {
278 'Entrypoint': entrypoint,
279 'Cmd': cmd,
280 'ExposedPorts': {
281 '80/tcp': {}
282 }
283 },
284 'docker_version': _DOCKER_VERSION,
285 'architecture': _PROCESSOR_ARCHITECTURE,
286 'os': _OPERATING_SYSTEM,
287 'Size': size,
288 }
289
290 actual = RewriteMetadata(in_data, MetadataOptions(
291 name=name, entrypoint=entrypoint, cmd=cmd, size=size,
292 ports=['80']))
293 self.assertEquals(expected, actual)
294
295 def testOmitParentWithBase(self):
296 # Our input data should be empty when parent is omitted
297 in_data = {
298 'id': 'you',
299 }
300 with self.assertRaises(Exception):
301 RewriteMetadata(in_data, MetadataOptions(name='me'))
302
303 def testNewPort(self):
304 in_data = {
305 'config': {
306 'User': 'mattmoor',
307 'WorkingDir': '/usr/home/mattmoor'
308 }
309 }
310 name = 'deadbeef'
311 parent = 'blah'
312 port = '80'
313 expected = {
314 'id': name,
315 'parent': parent,
316 'config': {
317 'User': 'mattmoor',
318 'WorkingDir': '/usr/home/mattmoor',
319 'ExposedPorts': {
320 port + '/tcp': {}
321 }
322 },
323 'docker_version': _DOCKER_VERSION,
324 'architecture': _PROCESSOR_ARCHITECTURE,
325 'os': _OPERATING_SYSTEM,
326 }
327
328 actual = RewriteMetadata(in_data, MetadataOptions(
329 name=name, parent=parent, ports=[port]))
330 self.assertEquals(expected, actual)
331
332 def testAugmentPort(self):
333 in_data = {
334 'config': {
335 'User': 'mattmoor',
336 'WorkingDir': '/usr/home/mattmoor',
337 'ExposedPorts': {
338 '443/tcp': {}
339 }
340 }
341 }
342 name = 'deadbeef'
343 parent = 'blah'
344 port = '80'
345 expected = {
346 'id': name,
347 'parent': parent,
348 'config': {
349 'User': 'mattmoor',
350 'WorkingDir': '/usr/home/mattmoor',
351 'ExposedPorts': {
352 '443/tcp': {},
353 port + '/tcp': {}
354 }
355 },
356 'docker_version': _DOCKER_VERSION,
357 'architecture': _PROCESSOR_ARCHITECTURE,
358 'os': _OPERATING_SYSTEM,
359 }
360
361 actual = RewriteMetadata(in_data, MetadataOptions(
362 name=name, parent=parent, ports=[port]))
363 self.assertEquals(expected, actual)
364
365 def testMultiplePorts(self):
366 in_data = {
367 'config': {
368 'User': 'mattmoor',
369 'WorkingDir': '/usr/home/mattmoor'
370 }
371 }
372 name = 'deadbeef'
373 parent = 'blah'
374 port1 = '80'
375 port2 = '8080'
376 expected = {
377 'id': name,
378 'parent': parent,
379 'config': {
380 'User': 'mattmoor',
381 'WorkingDir': '/usr/home/mattmoor',
382 'ExposedPorts': {
383 port1 + '/tcp': {},
384 port2 + '/tcp': {}
385 }
386 },
387 'docker_version': _DOCKER_VERSION,
388 'architecture': _PROCESSOR_ARCHITECTURE,
389 'os': _OPERATING_SYSTEM,
390 }
391
392 actual = RewriteMetadata(in_data, MetadataOptions(
393 name=name, parent=parent, ports=[port1, port2]))
394 self.assertEquals(expected, actual)
395
396 def testPortCollision(self):
397 port = '80'
398 in_data = {
399 'config': {
400 'User': 'mattmoor',
401 'WorkingDir': '/usr/home/mattmoor',
402 'ExposedPorts': {
403 port + '/tcp': {}
404 }
405 }
406 }
407 name = 'deadbeef'
408 parent = 'blah'
409 expected = {
410 'id': name,
411 'parent': parent,
412 'config': {
413 'User': 'mattmoor',
414 'WorkingDir': '/usr/home/mattmoor',
415 'ExposedPorts': {
416 port + '/tcp': {}
417 }
418 },
419 'docker_version': _DOCKER_VERSION,
420 'architecture': _PROCESSOR_ARCHITECTURE,
421 'os': _OPERATING_SYSTEM,
422 }
423
424 actual = RewriteMetadata(in_data, MetadataOptions(
425 name=name, parent=parent, ports=[port]))
426 self.assertEquals(expected, actual)
427
428 def testPortWithProtocol(self):
429 in_data = {
430 'config': {
431 'User': 'mattmoor',
432 'WorkingDir': '/usr/home/mattmoor'
433 }
434 }
435 name = 'deadbeef'
436 parent = 'blah'
437 port = '80/tcp'
438 expected = {
439 'id': name,
440 'parent': parent,
441 'config': {
442 'User': 'mattmoor',
443 'WorkingDir': '/usr/home/mattmoor',
444 'ExposedPorts': {
445 port: {}
446 }
447 },
448 'docker_version': _DOCKER_VERSION,
449 'architecture': _PROCESSOR_ARCHITECTURE,
450 'os': _OPERATING_SYSTEM,
451 }
452
453 actual = RewriteMetadata(in_data, MetadataOptions(
454 name=name, parent=parent, ports=[port]))
455 self.assertEquals(expected, actual)
456
457 def testNewVolume(self):
458 in_data = {
459 'config': {
460 'User': 'mattmoor',
461 'WorkingDir': '/usr/home/mattmoor'
462 }
463 }
464 name = 'deadbeef'
465 parent = 'blah'
466 volume = '/logs'
467 expected = {
468 'id': name,
469 'parent': parent,
470 'config': {
471 'User': 'mattmoor',
472 'WorkingDir': '/usr/home/mattmoor',
473 'Volumes': {
474 volume: {}
475 }
476 },
477 'docker_version': _DOCKER_VERSION,
478 'architecture': _PROCESSOR_ARCHITECTURE,
479 'os': _OPERATING_SYSTEM,
480 }
481
482 actual = RewriteMetadata(in_data, MetadataOptions(
483 name=name, parent=parent, volumes=[volume]))
484 self.assertEquals(expected, actual)
485
486 def testAugmentVolume(self):
487 in_data = {
488 'config': {
489 'User': 'mattmoor',
490 'WorkingDir': '/usr/home/mattmoor',
491 'Volumes': {
492 '/original': {}
493 }
494 }
495 }
496 name = 'deadbeef'
497 parent = 'blah'
498 volume = '/data'
499 expected = {
500 'id': name,
501 'parent': parent,
502 'config': {
503 'User': 'mattmoor',
504 'WorkingDir': '/usr/home/mattmoor',
505 'Volumes': {
506 '/original': {},
507 volume: {}
508 }
509 },
510 'docker_version': _DOCKER_VERSION,
511 'architecture': _PROCESSOR_ARCHITECTURE,
512 'os': _OPERATING_SYSTEM,
513 }
514
515 actual = RewriteMetadata(in_data, MetadataOptions(
516 name=name, parent=parent, volumes=[volume]))
517 self.assertEquals(expected, actual)
518
519 def testMultipleVolumes(self):
520 in_data = {
521 'config': {
522 'User': 'mattmoor',
523 'WorkingDir': '/usr/home/mattmoor'
524 }
525 }
526 name = 'deadbeef'
527 parent = 'blah'
528 volume1 = '/input'
529 volume2 = '/output'
530 expected = {
531 'id': name,
532 'parent': parent,
533 'config': {
534 'User': 'mattmoor',
535 'WorkingDir': '/usr/home/mattmoor',
536 'Volumes': {
537 volume1: {},
538 volume2: {}
539 }
540 },
541 'docker_version': _DOCKER_VERSION,
542 'architecture': _PROCESSOR_ARCHITECTURE,
543 'os': _OPERATING_SYSTEM,
544 }
545
546 actual = RewriteMetadata(in_data, MetadataOptions(
547 name=name, parent=parent, volumes=[volume1, volume2]))
548 self.assertEquals(expected, actual)
549
550 def testEnv(self):
551 in_data = {
552 'config': {
553 'User': 'mattmoor',
554 'WorkingDir': '/usr/home/mattmoor'
555 }
556 }
557 name = 'deadbeef'
558 parent = 'blah'
Yuki Yugui Sonodafb939b52015-12-17 22:21:51 +0000559 env = {'baz': 'blah', 'foo': 'bar',}
Damien Martin-Guillerez5f258912015-07-27 08:27:53 +0000560 expected = {
561 'id': name,
562 'parent': parent,
563 'config': {
564 'User': 'mattmoor',
565 'WorkingDir': '/usr/home/mattmoor',
Yuki Yugui Sonodafb939b52015-12-17 22:21:51 +0000566 'Env': [
567 'baz=blah',
568 'foo=bar',
569 ],
Damien Martin-Guillerez5f258912015-07-27 08:27:53 +0000570 },
571 'docker_version': _DOCKER_VERSION,
572 'architecture': _PROCESSOR_ARCHITECTURE,
573 'os': _OPERATING_SYSTEM,
574 }
575
576 actual = RewriteMetadata(in_data, MetadataOptions(
577 name=name, env=env, parent=parent))
578 self.assertEquals(expected, actual)
579
580 def testEnvResolveReplace(self):
581 in_data = {
582 'config': {
583 'User': 'mattmoor',
584 'WorkingDir': '/usr/home/mattmoor',
585 'Env': [
586 'foo=bar',
587 'baz=blah',
588 'blah=still around',
589 ],
590 }
591 }
592 name = 'deadbeef'
593 parent = 'blah'
Yuki Yugui Sonodafb939b52015-12-17 22:21:51 +0000594 env = {'baz': 'replacement', 'foo': '$foo:asdf',}
Damien Martin-Guillerez5f258912015-07-27 08:27:53 +0000595 expected = {
596 'id': name,
597 'parent': parent,
598 'config': {
599 'User': 'mattmoor',
600 'WorkingDir': '/usr/home/mattmoor',
601 'Env': [
602 'baz=replacement',
603 'blah=still around',
604 'foo=bar:asdf',
605 ],
606 },
607 'docker_version': _DOCKER_VERSION,
608 'architecture': _PROCESSOR_ARCHITECTURE,
609 'os': _OPERATING_SYSTEM,
610 }
611
612 actual = RewriteMetadata(in_data, MetadataOptions(
613 name=name, env=env, parent=parent))
614 self.assertEquals(expected, actual)
615
Yuki Yugui Sonodafb939b52015-12-17 22:21:51 +0000616 def testLabel(self):
617 in_data = {
618 'config': {
619 'User': 'mattmoor',
620 'WorkingDir': '/usr/home/mattmoor'
621 }
622 }
623 name = 'deadbeef'
624 parent = 'blah'
625 labels = {'baz': 'blah', 'foo': 'bar',}
626 expected = {
627 'id': name,
628 'parent': parent,
629 'config': {
630 'User': 'mattmoor',
631 'WorkingDir': '/usr/home/mattmoor',
632 'Label': [
633 'baz=blah',
634 'foo=bar',
635 ],
636 },
637 'docker_version': _DOCKER_VERSION,
638 'architecture': _PROCESSOR_ARCHITECTURE,
639 'os': _OPERATING_SYSTEM,
640 }
641
642 actual = RewriteMetadata(in_data,
643 MetadataOptions(name=name,
644 labels=labels,
645 parent=parent))
646 self.assertEquals(expected, actual)
647
648 def testAugmentLabel(self):
649 in_data = {
650 'config': {
651 'User': 'mattmoor',
652 'WorkingDir': '/usr/home/mattmoor',
653 'Label': [
654 'baz=blah',
655 'blah=still around',
656 ],
657 }
658 }
659 name = 'deadbeef'
660 parent = 'blah'
661 labels = {'baz': 'replacement', 'foo': 'bar',}
662 expected = {
663 'id': name,
664 'parent': parent,
665 'config': {
666 'User': 'mattmoor',
667 'WorkingDir': '/usr/home/mattmoor',
668 'Label': [
669 'baz=replacement',
670 'blah=still around',
671 'foo=bar',
672 ],
673 },
674 'docker_version': _DOCKER_VERSION,
675 'architecture': _PROCESSOR_ARCHITECTURE,
676 'os': _OPERATING_SYSTEM,
677 }
678
679 actual = RewriteMetadata(in_data,
680 MetadataOptions(name=name,
681 labels=labels,
682 parent=parent))
683 self.assertEquals(expected, actual)
684
Damien Martin-Guillerez63e98222015-08-07 19:08:21 +0000685 def testAugmentVolumeWithNullInput(self):
686 in_data = {
687 'config': {
688 'User': 'mattmoor',
689 'WorkingDir': '/usr/home/mattmoor',
690 'Volumes': None,
691 }
692 }
693 name = 'deadbeef'
694 parent = 'blah'
695 volume = '/data'
696 expected = {
697 'id': name,
698 'parent': parent,
699 'config': {
700 'User': 'mattmoor',
701 'WorkingDir': '/usr/home/mattmoor',
702 'Volumes': {
703 volume: {}
704 }
705 },
706 'docker_version': _DOCKER_VERSION,
707 'architecture': _PROCESSOR_ARCHITECTURE,
708 'os': _OPERATING_SYSTEM,
709 }
710
711 actual = RewriteMetadata(in_data, MetadataOptions(
712 name=name, parent=parent, volumes=[volume]))
713 self.assertEquals(expected, actual)
Damien Martin-Guillerez5f258912015-07-27 08:27:53 +0000714
Damien Martin-Guillerezb00b7ac2015-09-29 15:11:30 +0000715 def testSetWorkingDir(self):
716 in_data = {
717 'config': {
718 'User': 'bleh',
719 'WorkingDir': '/home/bleh',
720 'Volumes': {
721 }
722 }
723 }
724 name = 'deadbeef'
725 parent = 'blah'
726 workdir = '/some/path'
727 expected = {
728 'id': name,
729 'parent': parent,
730 'config': {
731 'User': 'bleh',
732 'WorkingDir': '/some/path',
733 'Volumes': {
734 }
735 },
736 'docker_version': _DOCKER_VERSION,
737 'architecture': _PROCESSOR_ARCHITECTURE,
738 'os': _OPERATING_SYSTEM,
739 }
740
741 actual = RewriteMetadata(in_data, MetadataOptions(
742 name=name, parent=parent, workdir=workdir))
743 self.assertEquals(expected, actual)
744
Damien Martin-Guillerez5f258912015-07-27 08:27:53 +0000745if __name__ == '__main__':
746 unittest.main()