diff options
Diffstat (limited to 'tools/build_defs/docker/create_image_config_test.py')
-rw-r--r-- | tools/build_defs/docker/create_image_config_test.py | 603 |
1 files changed, 603 insertions, 0 deletions
diff --git a/tools/build_defs/docker/create_image_config_test.py b/tools/build_defs/docker/create_image_config_test.py new file mode 100644 index 0000000000..e01a17c398 --- /dev/null +++ b/tools/build_defs/docker/create_image_config_test.py @@ -0,0 +1,603 @@ +# Copyright 2016 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 create_image_config.""" + +import unittest + +from tools.build_defs.docker.create_image_config import _OPERATING_SYSTEM +from tools.build_defs.docker.create_image_config import _PROCESSOR_ARCHITECTURE +from tools.build_defs.docker.create_image_config import ConfigOptions +from tools.build_defs.docker.create_image_config import CreateImageConfig + + +class CreateImageConfigTest(unittest.TestCase): + """Testing for create_image_config.""" + + base_expected = { + 'created': '0001-01-01T00:00:00Z', + 'author': 'Bazel', + 'architecture': _PROCESSOR_ARCHITECTURE, + 'os': _OPERATING_SYSTEM, + 'config': {}, + 'rootfs': {'diff_ids': [], + 'type': 'layers'}, + 'history': [{'author': 'Bazel', + 'created': '0001-01-01T00:00:00Z', + 'created_by': 'bazel build ...'}], + } + + def testNewUser(self): + in_data = {'config': {'WorkingDir': '/usr/home/mattmoor'}} + user = 'mattmoor' + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(user=user)) + self.assertEquals(expected, actual) + + def testOverrideUser(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + } + } + user = 'mattmoor2' + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor2', + 'WorkingDir': '/usr/home/mattmoor', + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(user=user)) + self.assertEquals(expected, actual) + + def testNewEntrypoint(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor' + } + } + entrypoint = ['/bin/bash'] + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Entrypoint': entrypoint + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(entrypoint=entrypoint)) + self.assertEquals(expected, actual) + + def testOverrideEntrypoint(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Entrypoint': ['/bin/sh', 'does', 'not', 'matter'], + } + } + entrypoint = ['/bin/bash'] + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Entrypoint': entrypoint + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(entrypoint=entrypoint)) + self.assertEquals(expected, actual) + + def testNewCmd(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Entrypoint': ['/bin/bash'], + } + } + cmd = ['/bin/bash'] + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Entrypoint': ['/bin/bash'], + 'Cmd': cmd + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(cmd=cmd)) + self.assertEquals(expected, actual) + + def testOverrideCmd(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Entrypoint': ['/bin/bash'], + 'Cmd': ['does', 'not', 'matter'], + } + } + cmd = ['does', 'matter'] + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Entrypoint': ['/bin/bash'], + 'Cmd': cmd + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(cmd=cmd)) + self.assertEquals(expected, actual) + + def testOverrideBoth(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Entrypoint': ['/bin/sh'], + 'Cmd': ['does', 'not', 'matter'], + } + } + entrypoint = ['/bin/bash', '-c'] + cmd = ['my-command', 'my-arg1', 'my-arg2'] + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Entrypoint': entrypoint, + 'Cmd': cmd + }, + }) + + actual = CreateImageConfig(in_data, + ConfigOptions(entrypoint=entrypoint, + cmd=cmd)) + self.assertEquals(expected, actual) + + def testStripContainerConfig(self): + in_data = {'container_config': {},} + expected = self.base_expected.copy() + + actual = CreateImageConfig(in_data, ConfigOptions()) + self.assertEquals(expected, actual) + + def testEmptyBase(self): + in_data = {} + entrypoint = ['/bin/bash', '-c'] + cmd = ['my-command', 'my-arg1', 'my-arg2'] + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'Entrypoint': entrypoint, + 'Cmd': cmd, + 'ExposedPorts': { + '80/tcp': {} + } + }, + }) + + actual = CreateImageConfig(in_data, + ConfigOptions(entrypoint=entrypoint, + cmd=cmd, + ports=['80'])) + self.assertEquals(expected, actual) + + def testNewPort(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor' + } + } + port = '80' + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'ExposedPorts': { + port + '/tcp': {} + } + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(ports=[port])) + self.assertEquals(expected, actual) + + def testAugmentPort(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'ExposedPorts': { + '443/tcp': {} + } + } + } + port = '80' + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'ExposedPorts': { + '443/tcp': {}, + port + '/tcp': {} + } + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(ports=[port])) + self.assertEquals(expected, actual) + + def testMultiplePorts(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor' + } + } + port1 = '80' + port2 = '8080' + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'ExposedPorts': { + port1 + '/tcp': {}, + port2 + '/tcp': {} + } + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(ports=[port1, port2])) + self.assertEquals(expected, actual) + + def testPortCollision(self): + port = '80' + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'ExposedPorts': { + port + '/tcp': {} + } + } + } + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'ExposedPorts': { + port + '/tcp': {} + } + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(ports=[port])) + self.assertEquals(expected, actual) + + def testPortWithProtocol(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor' + } + } + port = '80/tcp' + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'ExposedPorts': { + port: {} + } + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(ports=[port])) + self.assertEquals(expected, actual) + + def testNewVolume(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor' + } + } + volume = '/logs' + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Volumes': { + volume: {} + } + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(volumes=[volume])) + self.assertEquals(expected, actual) + + def testAugmentVolume(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Volumes': { + '/original': {} + } + } + } + volume = '/data' + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Volumes': { + '/original': {}, + volume: {} + } + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(volumes=[volume])) + self.assertEquals(expected, actual) + + def testMultipleVolumes(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor' + } + } + volume1 = '/input' + volume2 = '/output' + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Volumes': { + volume1: {}, + volume2: {} + } + }, + }) + + actual = CreateImageConfig(in_data, + ConfigOptions(volumes=[volume1, volume2])) + self.assertEquals(expected, actual) + + def testEnv(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor' + } + } + env = {'baz': 'blah', + 'foo': 'bar',} + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Env': [ + 'baz=blah', + 'foo=bar', + ], + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(env=env)) + self.assertEquals(expected, actual) + + def testEnvResolveReplace(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Env': [ + 'foo=bar', + 'baz=blah', + 'blah=still around', + ], + } + } + env = {'baz': 'replacement', + 'foo': '$foo:asdf',} + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Env': [ + 'baz=replacement', + 'blah=still around', + 'foo=bar:asdf', + ], + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(env=env)) + self.assertEquals(expected, actual) + + def testLabel(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor' + } + } + labels = {'baz': 'blah', + 'foo': 'bar',} + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Label': [ + 'baz=blah', + 'foo=bar', + ], + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(labels=labels)) + self.assertEquals(expected, actual) + + def testAugmentLabel(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Label': [ + 'baz=blah', + 'blah=still around', + ], + } + } + labels = {'baz': 'replacement', + 'foo': 'bar',} + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Label': [ + 'baz=replacement', + 'blah=still around', + 'foo=bar', + ], + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(labels=labels)) + self.assertEquals(expected, actual) + + def testAugmentVolumeWithNullInput(self): + in_data = { + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Volumes': None, + } + } + volume = '/data' + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'mattmoor', + 'WorkingDir': '/usr/home/mattmoor', + 'Volumes': { + volume: {} + } + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(volumes=[volume])) + self.assertEquals(expected, actual) + + def testSetWorkingDir(self): + in_data = { + 'config': { + 'User': 'bleh', + 'WorkingDir': '/home/bleh', + 'Volumes': { + } + } + } + workdir = '/some/path' + expected = self.base_expected.copy() + expected.update({ + 'config': { + 'User': 'bleh', + 'WorkingDir': '/some/path', + 'Volumes': { + } + }, + }) + + actual = CreateImageConfig(in_data, ConfigOptions(workdir=workdir)) + self.assertEquals(expected, actual) + + def testLayersAddedToDiffIds(self): + initial_diff_ids = [ + 'sha256:1', + 'sha256:2', + ] + in_data = { + 'rootfs': { + 'type': 'layers', + 'diff_ids': initial_diff_ids, + } + } + layers = ['3', '4'] + expected = self.base_expected.copy() + expected.update({ + 'rootfs': { + 'type': 'layers', + 'diff_ids': initial_diff_ids + ['sha256:%s' % l for l in layers], + } + }) + + actual = CreateImageConfig(in_data, ConfigOptions(layers=layers)) + self.assertEquals(expected, actual) + + def testHistoryAdded(self): + in_data = self.base_expected.copy() + expected = self.base_expected.copy() + expected.update({ + 'history': [ + { + 'author': 'Bazel', + 'created': '0001-01-01T00:00:00Z', + 'created_by': 'bazel build ...' + }, { + 'author': 'Bazel', + 'created': '0001-01-01T00:00:00Z', + 'created_by': 'bazel build ...' + } + ] + }) + + actual = CreateImageConfig(in_data, ConfigOptions()) + self.assertEquals(expected, actual) + + +if __name__ == '__main__': + unittest.main() |