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