# Copyright 2015 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Testing for rewrite_json.""" import unittest from tools.build_defs.docker.rewrite_json import _DOCKER_VERSION from tools.build_defs.docker.rewrite_json import _OPERATING_SYSTEM from tools.build_defs.docker.rewrite_json import _PROCESSOR_ARCHITECTURE from tools.build_defs.docker.rewrite_json import MetadataOptions from tools.build_defs.docker.rewrite_json import RewriteMetadata class RewriteJsonTest(unittest.TestCase): """Testing for rewrite_json.""" def testNewEntrypoint(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor' } } name = 'deadbeef' parent = 'blah' entrypoint = ['/bin/bash'] expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Entrypoint': entrypoint }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, entrypoint=entrypoint, parent=parent)) self.assertEquals(expected, actual) def testOverrideEntrypoint(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Entrypoint': ['/bin/sh', 'does', 'not', 'matter'], } } name = 'deadbeef' parent = 'blah' entrypoint = ['/bin/bash'] expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Entrypoint': entrypoint }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, entrypoint=entrypoint, parent=parent)) self.assertEquals(expected, actual) def testNewCmd(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Entrypoint': ['/bin/bash'], } } name = 'deadbeef' parent = 'blah' cmd = ['/bin/bash'] expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Entrypoint': ['/bin/bash'], 'Cmd': cmd }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, cmd=cmd, parent=parent)) self.assertEquals(expected, actual) def testOverrideCmd(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Entrypoint': ['/bin/bash'], 'Cmd': ['does', 'not', 'matter'], } } name = 'deadbeef' parent = 'blah' cmd = ['does', 'matter'] expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Entrypoint': ['/bin/bash'], 'Cmd': cmd }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, cmd=cmd, parent=parent)) self.assertEquals(expected, actual) def testOverrideBoth(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Entrypoint': ['/bin/sh'], 'Cmd': ['does', 'not', 'matter'], } } name = 'deadbeef' parent = 'blah' entrypoint = ['/bin/bash', '-c'] cmd = ['my-command', 'my-arg1', 'my-arg2'] expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Entrypoint': entrypoint, 'Cmd': cmd }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, entrypoint=entrypoint, cmd=cmd, parent=parent)) self.assertEquals(expected, actual) def testOverrideParent(self): name = 'me!' parent = 'parent' # In the typical case, we expect the parent to # come in as the 'id', and our grandparent to # be its 'parent'. in_data = { 'id': parent, 'parent': 'grandparent', } expected = { 'id': name, 'parent': parent, 'config': {}, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent)) self.assertEquals(expected, actual) def testNewSize(self): # Size is one of the few fields that, when omitted, # should be removed. in_data = { 'id': 'you', 'Size': '124', } name = 'me' parent = 'blah' size = '4321' expected = { 'id': name, 'parent': parent, 'Size': size, 'config': {}, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, size=size, parent=parent)) self.assertEquals(expected, actual) def testOmitSize(self): # Size is one of the few fields that, when omitted, # should be removed. in_data = { 'id': 'you', 'Size': '124', } name = 'me' parent = 'blah' expected = { 'id': name, 'parent': parent, 'config': {}, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent)) self.assertEquals(expected, actual) def testOmitName(self): # Name is required. with self.assertRaises(Exception): RewriteMetadata({}, MetadataOptions(name=None)) def testStripContainerConfig(self): # Size is one of the few fields that, when omitted, # should be removed. in_data = { 'id': 'you', 'container_config': {}, } name = 'me' parent = 'blah' expected = { 'id': name, 'parent': parent, 'config': {}, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent)) self.assertEquals(expected, actual) def testEmptyBase(self): in_data = {} name = 'deadbeef' entrypoint = ['/bin/bash', '-c'] cmd = ['my-command', 'my-arg1', 'my-arg2'] size = '999' expected = { 'id': name, 'config': { 'Entrypoint': entrypoint, 'Cmd': cmd, 'ExposedPorts': { '80/tcp': {} } }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, 'Size': size, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, entrypoint=entrypoint, cmd=cmd, size=size, ports=['80'])) self.assertEquals(expected, actual) def testOmitParentWithBase(self): # Our input data should be empty when parent is omitted in_data = { 'id': 'you', } with self.assertRaises(Exception): RewriteMetadata(in_data, MetadataOptions(name='me')) def testNewPort(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor' } } name = 'deadbeef' parent = 'blah' port = '80' expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'ExposedPorts': { port + '/tcp': {} } }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent, ports=[port])) self.assertEquals(expected, actual) def testAugmentPort(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'ExposedPorts': { '443/tcp': {} } } } name = 'deadbeef' parent = 'blah' port = '80' expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'ExposedPorts': { '443/tcp': {}, port + '/tcp': {} } }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent, ports=[port])) self.assertEquals(expected, actual) def testMultiplePorts(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor' } } name = 'deadbeef' parent = 'blah' port1 = '80' port2 = '8080' expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'ExposedPorts': { port1 + '/tcp': {}, port2 + '/tcp': {} } }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent, ports=[port1, port2])) self.assertEquals(expected, actual) def testPortCollision(self): port = '80' in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'ExposedPorts': { port + '/tcp': {} } } } name = 'deadbeef' parent = 'blah' expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'ExposedPorts': { port + '/tcp': {} } }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent, ports=[port])) self.assertEquals(expected, actual) def testPortWithProtocol(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor' } } name = 'deadbeef' parent = 'blah' port = '80/tcp' expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'ExposedPorts': { port: {} } }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent, ports=[port])) self.assertEquals(expected, actual) def testNewVolume(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor' } } name = 'deadbeef' parent = 'blah' volume = '/logs' expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Volumes': { volume: {} } }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent, volumes=[volume])) self.assertEquals(expected, actual) def testAugmentVolume(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Volumes': { '/original': {} } } } name = 'deadbeef' parent = 'blah' volume = '/data' expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Volumes': { '/original': {}, volume: {} } }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent, volumes=[volume])) self.assertEquals(expected, actual) def testMultipleVolumes(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor' } } name = 'deadbeef' parent = 'blah' volume1 = '/input' volume2 = '/output' expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Volumes': { volume1: {}, volume2: {} } }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent, volumes=[volume1, volume2])) self.assertEquals(expected, actual) def testEnv(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor' } } name = 'deadbeef' parent = 'blah' env = {'baz': 'blah', 'foo': 'bar',} expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Env': [ 'baz=blah', 'foo=bar', ], }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, env=env, parent=parent)) self.assertEquals(expected, actual) def testEnvResolveReplace(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Env': [ 'foo=bar', 'baz=blah', 'blah=still around', ], } } name = 'deadbeef' parent = 'blah' env = {'baz': 'replacement', 'foo': '$foo:asdf',} expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Env': [ 'baz=replacement', 'blah=still around', 'foo=bar:asdf', ], }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, env=env, parent=parent)) self.assertEquals(expected, actual) def testLabel(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor' } } name = 'deadbeef' parent = 'blah' labels = {'baz': 'blah', 'foo': 'bar',} expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Label': [ 'baz=blah', 'foo=bar', ], }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions(name=name, labels=labels, parent=parent)) self.assertEquals(expected, actual) def testAugmentLabel(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Label': [ 'baz=blah', 'blah=still around', ], } } name = 'deadbeef' parent = 'blah' labels = {'baz': 'replacement', 'foo': 'bar',} expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Label': [ 'baz=replacement', 'blah=still around', 'foo=bar', ], }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions(name=name, labels=labels, parent=parent)) self.assertEquals(expected, actual) def testAugmentVolumeWithNullInput(self): in_data = { 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Volumes': None, } } name = 'deadbeef' parent = 'blah' volume = '/data' expected = { 'id': name, 'parent': parent, 'config': { 'User': 'mattmoor', 'WorkingDir': '/usr/home/mattmoor', 'Volumes': { volume: {} } }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent, volumes=[volume])) self.assertEquals(expected, actual) def testSetWorkingDir(self): in_data = { 'config': { 'User': 'bleh', 'WorkingDir': '/home/bleh', 'Volumes': { } } } name = 'deadbeef' parent = 'blah' workdir = '/some/path' expected = { 'id': name, 'parent': parent, 'config': { 'User': 'bleh', 'WorkingDir': '/some/path', 'Volumes': { } }, 'docker_version': _DOCKER_VERSION, 'architecture': _PROCESSOR_ARCHITECTURE, 'os': _OPERATING_SYSTEM, } actual = RewriteMetadata(in_data, MetadataOptions( name=name, parent=parent, workdir=workdir)) self.assertEquals(expected, actual) if __name__ == '__main__': unittest.main()