blob: e01a17c3981ed789c6be49fbcf22ee0adb55ce4d [file] [log] [blame]
# 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()