| # 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() |