Merge pull request #40285 from rallytime/docker-test-fixes

Dockerng unit tests fixes: isolate global variables
This commit is contained in:
Mike Place 2017-03-27 17:05:02 -06:00 committed by GitHub
commit 2b7b2f1cb4
2 changed files with 168 additions and 118 deletions

View file

@ -25,15 +25,11 @@ ensure_in_syspath('../../')
import salt.modules.dockerng as dockerng_mod
from salt.exceptions import CommandExecutionError, SaltInvocationError
dockerng_mod.__context__ = {'docker.docker_version': ''}
dockerng_mod.__context__ = {}
dockerng_mod.__salt__ = {}
dockerng_mod.__opts__ = {}
def _docker_py_version():
return dockerng_mod.docker.version_info if dockerng_mod.HAS_DOCKER_PY else None
@skipIf(NO_MOCK, NO_MOCK_REASON)
@skipIf(dockerng_mod.HAS_DOCKER_PY is False, 'docker-py must be installed to run these tests. Skipping.')
class DockerngTestCase(TestCase):
@ -41,6 +37,34 @@ class DockerngTestCase(TestCase):
Validate dockerng module
'''
docker_version = dockerng_mod.docker.version_info
client_args_mock = MagicMock(return_value={
'create_container': [
'image', 'command', 'hostname', 'user', 'detach', 'stdin_open',
'tty', 'ports', 'environment', 'volumes', 'network_disabled',
'name', 'entrypoint', 'working_dir', 'domainname', 'cpuset',
'host_config', 'mac_address', 'labels', 'volume_driver',
'stop_signal', 'networking_config', 'healthcheck',
'stop_timeout'],
'host_config': [
'binds', 'port_bindings', 'lxc_conf', 'publish_all_ports',
'links', 'privileged', 'dns', 'dns_search', 'volumes_from',
'network_mode', 'restart_policy', 'cap_add', 'cap_drop',
'devices', 'extra_hosts', 'read_only', 'pid_mode', 'ipc_mode',
'security_opt', 'ulimits', 'log_config', 'mem_limit',
'memswap_limit', 'mem_reservation', 'kernel_memory',
'mem_swappiness', 'cgroup_parent', 'group_add', 'cpu_quota',
'cpu_period', 'blkio_weight', 'blkio_weight_device',
'device_read_bps', 'device_write_bps', 'device_read_iops',
'device_write_iops', 'oom_kill_disable', 'shm_size', 'sysctls',
'tmpfs', 'oom_score_adj', 'dns_opt', 'cpu_shares',
'cpuset_cpus', 'userns_mode', 'pids_limit', 'isolation',
'auto_remove', 'storage_opt'],
'networking_config': [
'aliases', 'links', 'ipv4_address', 'ipv6_address',
'link_local_ips'],
})
def test_ps_with_host_true(self):
'''
Check that dockerng.ps called with host is ``True``,
@ -93,13 +117,13 @@ class DockerngTestCase(TestCase):
{'mine.send': mine_send,
'container_resource.run': MagicMock(),
'cp.cache_file': MagicMock(return_value=False)}):
with patch.dict(dockerng_mod.__context__,
{'docker.client': docker_client}):
command('container', *args)
with patch.object(dockerng_mod, 'get_client_args', self.client_args_mock):
with patch.dict(dockerng_mod.__context__, {'docker.client': docker_client}):
command('container', *args)
mine_send.assert_called_with('dockerng.ps', verbose=True, all=True,
host=True)
@skipIf(_docker_py_version() < (1, 4, 0),
@skipIf(docker_version < (1, 4, 0),
'docker module must be installed to run this test or is too old. >=1.4.0')
@patch.object(dockerng_mod, 'images', MagicMock())
@patch.object(dockerng_mod, 'inspect_image')
@ -117,18 +141,17 @@ class DockerngTestCase(TestCase):
client.api_version = '1.19'
client.create_host_config.return_value = host_config
client.create_container.return_value = {}
with patch.dict(dockerng_mod.__dict__,
{'__salt__': __salt__}):
with patch.dict(dockerng_mod.__context__,
{'docker.client': client}):
dockerng_mod.create('image', cmd='ls', name='ctn')
with patch.dict(dockerng_mod.__dict__, {'__salt__': __salt__}):
with patch.object(dockerng_mod, 'get_client_args', self.client_args_mock):
with patch.dict(dockerng_mod.__context__, {'docker.client': client}):
dockerng_mod.create('image', cmd='ls', name='ctn')
client.create_container.assert_called_once_with(
command='ls',
host_config=host_config,
image='image',
name='ctn')
@skipIf(_docker_py_version() < (1, 4, 0),
@skipIf(docker_version < (1, 4, 0),
'docker module must be installed to run this test or is too old. >=1.4.0')
@patch.object(dockerng_mod, 'images', MagicMock())
@patch.object(dockerng_mod, 'inspect_image')
@ -146,17 +169,16 @@ class DockerngTestCase(TestCase):
client.api_version = '1.19'
client.create_host_config.return_value = host_config
client.create_container.return_value = {}
with patch.dict(dockerng_mod.__dict__,
{'__salt__': __salt__}):
with patch.dict(dockerng_mod.__context__,
{'docker.client': client}):
dockerng_mod.create('image', name='ctn', publish_all_ports=True)
with patch.dict(dockerng_mod.__dict__, {'__salt__': __salt__}):
with patch.object(dockerng_mod, 'get_client_args', self.client_args_mock):
with patch.dict(dockerng_mod.__context__, {'docker.client': client}):
dockerng_mod.create('image', name='ctn', publish_all_ports=True)
client.create_container.assert_called_once_with(
host_config=host_config,
image='image',
name='ctn')
@skipIf(_docker_py_version() < (1, 4, 0),
@skipIf(docker_version < (1, 4, 0),
'docker module must be installed to run this test or is too old. >=1.4.0')
@patch.object(dockerng_mod, 'images', MagicMock())
@patch.object(dockerng_mod, 'inspect_image')
@ -168,22 +190,22 @@ class DockerngTestCase(TestCase):
__salt__ = {
'config.get': Mock(),
'mine.send': Mock(),
'dockerng.version': MagicMock(return_value={}),
}
host_config = {}
client = Mock()
client.api_version = '1.19'
client.create_host_config.return_value = host_config
client.create_container.return_value = {}
with patch.dict(dockerng_mod.__dict__,
{'__salt__': __salt__}):
with patch.dict(dockerng_mod.__context__,
{'docker.client': client}):
dockerng_mod.create(
'image',
name='ctn',
labels={'KEY': 'VALUE'},
validate_input=True,
)
with patch.dict(dockerng_mod.__dict__, {'__salt__': __salt__}):
with patch.object(dockerng_mod, 'get_client_args', self.client_args_mock):
with patch.dict(dockerng_mod.__context__, {'docker.client': client}):
dockerng_mod.create(
'image',
name='ctn',
labels={'KEY': 'VALUE'},
validate_input=True,
)
client.create_container.assert_called_once_with(
labels={'KEY': 'VALUE'},
host_config=host_config,
@ -191,7 +213,7 @@ class DockerngTestCase(TestCase):
name='ctn',
)
@skipIf(_docker_py_version() < (1, 4, 0),
@skipIf(docker_version < (1, 4, 0),
'docker module must be installed to run this test or is too old. >=1.4.0')
@patch.object(dockerng_mod, 'images', MagicMock())
@patch.object(dockerng_mod, 'inspect_image')
@ -203,22 +225,22 @@ class DockerngTestCase(TestCase):
__salt__ = {
'config.get': Mock(),
'mine.send': Mock(),
'dockerng.version': MagicMock(return_value={}),
}
host_config = {}
client = Mock()
client.api_version = '1.19'
client.create_host_config.return_value = host_config
client.create_container.return_value = {}
with patch.dict(dockerng_mod.__dict__,
{'__salt__': __salt__}):
with patch.dict(dockerng_mod.__context__,
{'docker.client': client}):
dockerng_mod.create(
'image',
name='ctn',
labels=['KEY1', 'KEY2'],
validate_input=True,
)
with patch.dict(dockerng_mod.__dict__, {'__salt__': __salt__}):
with patch.object(dockerng_mod, 'get_client_args', self.client_args_mock):
with patch.dict(dockerng_mod.__context__, {'docker.client': client}):
dockerng_mod.create(
'image',
name='ctn',
labels=['KEY1', 'KEY2'],
validate_input=True,
)
client.create_container.assert_called_once_with(
labels=['KEY1', 'KEY2'],
host_config=host_config,
@ -226,7 +248,7 @@ class DockerngTestCase(TestCase):
name='ctn',
)
@skipIf(_docker_py_version() < (1, 4, 0),
@skipIf(docker_version < (1, 4, 0),
'docker module must be installed to run this test or is too old. >=1.4.0')
@patch.object(dockerng_mod, 'images', MagicMock())
@patch.object(dockerng_mod, 'inspect_image')
@ -238,6 +260,7 @@ class DockerngTestCase(TestCase):
__salt__ = {
'config.get': Mock(),
'mine.send': Mock(),
'dockerng.version': MagicMock(return_value={}),
}
host_config = {}
client = Mock()
@ -256,7 +279,7 @@ class DockerngTestCase(TestCase):
validate_input=True,
)
@skipIf(_docker_py_version() < (1, 4, 0),
@skipIf(docker_version < (1, 4, 0),
'docker module must be installed to run this test or is too old. >=1.4.0')
@patch.object(dockerng_mod, 'images', MagicMock())
@patch.object(dockerng_mod, 'inspect_image')
@ -268,22 +291,22 @@ class DockerngTestCase(TestCase):
__salt__ = {
'config.get': Mock(),
'mine.send': Mock(),
'dockerng.version': MagicMock(return_value={}),
}
host_config = {}
client = Mock()
client.api_version = '1.19'
client.create_host_config.return_value = host_config
client.create_container.return_value = {}
with patch.dict(dockerng_mod.__dict__,
{'__salt__': __salt__}):
with patch.dict(dockerng_mod.__context__,
{'docker.client': client}):
dockerng_mod.create(
'image',
name='ctn',
labels=[{'KEY1': 'VALUE1'}, {'KEY2': 'VALUE2'}],
validate_input=True,
)
with patch.dict(dockerng_mod.__dict__, {'__salt__': __salt__}):
with patch.object(dockerng_mod, 'get_client_args', self.client_args_mock):
with patch.dict(dockerng_mod.__context__, {'docker.client': client}):
dockerng_mod.create(
'image',
name='ctn',
labels=[{'KEY1': 'VALUE1'}, {'KEY2': 'VALUE2'}],
validate_input=True,
)
client.create_container.assert_called_once_with(
labels={'KEY1': 'VALUE1', 'KEY2': 'VALUE2'},
host_config=host_config,
@ -291,8 +314,10 @@ class DockerngTestCase(TestCase):
name='ctn',
)
@skipIf(_docker_py_version() < (1, 5, 0),
@skipIf(docker_version < (1, 5, 0),
'docker module must be installed to run this test or is too old. >=1.5.0')
@patch('salt.modules.dockerng._get_docker_py_versioninfo',
MagicMock(return_value=docker_version))
def test_list_networks(self, *args):
'''
test list networks.
@ -317,8 +342,10 @@ class DockerngTestCase(TestCase):
ids=['01234'],
)
@skipIf(_docker_py_version() < (1, 5, 0),
@skipIf(docker_version < (1, 5, 0),
'docker module must be installed to run this test or is too old. >=1.5.0')
@patch('salt.modules.dockerng._get_docker_py_versioninfo',
MagicMock(return_value=docker_version))
def test_create_network(self, *args):
'''
test create network.
@ -343,8 +370,10 @@ class DockerngTestCase(TestCase):
driver='bridge',
)
@skipIf(_docker_py_version() < (1, 5, 0),
@skipIf(docker_version < (1, 5, 0),
'docker module must be installed to run this test or is too old. >=1.5.0')
@patch('salt.modules.dockerng._get_docker_py_versioninfo',
MagicMock(return_value=docker_version))
def test_remove_network(self, *args):
'''
test remove network.
@ -363,8 +392,10 @@ class DockerngTestCase(TestCase):
dockerng_mod.remove_network('foo')
client.remove_network.assert_called_once_with('foo')
@skipIf(_docker_py_version() < (1, 5, 0),
@skipIf(docker_version < (1, 5, 0),
'docker module must be installed to run this test or is too old. >=1.5.0')
@patch('salt.modules.dockerng._get_docker_py_versioninfo',
MagicMock(return_value=docker_version))
def test_inspect_network(self, *args):
'''
test inspect network.
@ -383,8 +414,10 @@ class DockerngTestCase(TestCase):
dockerng_mod.inspect_network('foo')
client.inspect_network.assert_called_once_with('foo')
@skipIf(_docker_py_version() < (1, 5, 0),
@skipIf(docker_version < (1, 5, 0),
'docker module must be installed to run this test or is too old. >=1.5.0')
@patch('salt.modules.dockerng._get_docker_py_versioninfo',
MagicMock(return_value=docker_version))
def test_connect_container_to_network(self, *args):
'''
test inspect network.
@ -404,8 +437,10 @@ class DockerngTestCase(TestCase):
client.connect_container_to_network.assert_called_once_with(
'container', 'foo')
@skipIf(_docker_py_version() < (1, 5, 0),
@skipIf(docker_version < (1, 5, 0),
'docker module must be installed to run this test or is too old. >=1.5.0')
@patch('salt.modules.dockerng._get_docker_py_versioninfo',
MagicMock(return_value=docker_version))
def test_disconnect_container_from_network(self, *args):
'''
test inspect network.
@ -425,8 +460,10 @@ class DockerngTestCase(TestCase):
client.disconnect_container_from_network.assert_called_once_with(
'container', 'foo')
@skipIf(_docker_py_version() < (1, 5, 0),
@skipIf(docker_version < (1, 5, 0),
'docker module must be installed to run this test or is too old. >=1.5.0')
@patch('salt.modules.dockerng._get_docker_py_versioninfo',
MagicMock(return_value=docker_version))
def test_list_volumes(self, *args):
'''
test list volumes.
@ -448,8 +485,10 @@ class DockerngTestCase(TestCase):
filters={'dangling': [True]},
)
@skipIf(_docker_py_version() < (1, 5, 0),
@skipIf(docker_version < (1, 5, 0),
'docker module must be installed to run this test or is too old. >=1.5.0')
@patch('salt.modules.dockerng._get_docker_py_versioninfo',
MagicMock(return_value=docker_version))
def test_create_volume(self, *args):
'''
test create volume.
@ -475,8 +514,10 @@ class DockerngTestCase(TestCase):
driver_opts={},
)
@skipIf(_docker_py_version() < (1, 5, 0),
@skipIf(docker_version < (1, 5, 0),
'docker module must be installed to run this test or is too old. >=1.5.0')
@patch('salt.modules.dockerng._get_docker_py_versioninfo',
MagicMock(return_value=docker_version))
def test_remove_volume(self, *args):
'''
test remove volume.
@ -494,8 +535,10 @@ class DockerngTestCase(TestCase):
dockerng_mod.remove_volume('foo')
client.remove_volume.assert_called_once_with('foo')
@skipIf(_docker_py_version() < (1, 5, 0),
@skipIf(docker_version < (1, 5, 0),
'docker module must be installed to run this test or is too old. >=1.5.0')
@patch('salt.modules.dockerng._get_docker_py_versioninfo',
MagicMock(return_value=docker_version))
def test_inspect_volume(self, *args):
'''
test inspect volume.

View file

@ -25,7 +25,7 @@ from salt.exceptions import CommandExecutionError
import salt.modules.dockerng as dockerng_mod
import salt.states.dockerng as dockerng_state
dockerng_mod.__context__ = {'docker.docker_version': ''}
dockerng_mod.__context__ = {}
dockerng_mod.__salt__ = {}
dockerng_state.__context__ = {}
dockerng_state.__opts__ = {'test': False}
@ -131,12 +131,13 @@ class DockerngTestCase(TestCase):
'dockerng.create': dockerng_create,
'dockerng.start': dockerng_start,
}
with patch.dict(dockerng_state.__dict__,
{'__salt__': __salt__}):
dockerng_state.running(
'cont',
image='image:latest',
port_bindings=['9090:9797/tcp'])
with patch.dict(dockerng_state.__dict__, {'__salt__': __salt__}):
with patch.dict(dockerng_mod.__salt__,
{'dockerng.version': MagicMock(return_value={})}):
dockerng_state.running(
'cont',
image='image:latest',
port_bindings=['9090:9797/tcp'])
dockerng_create.assert_called_with(
'image:latest',
validate_input=False,
@ -185,12 +186,13 @@ class DockerngTestCase(TestCase):
'dockerng.create': dockerng_create,
'dockerng.start': dockerng_start,
}
with patch.dict(dockerng_state.__dict__,
{'__salt__': __salt__}):
dockerng_state.running(
'cont',
image='image:latest',
port_bindings=['9090:9797/tcp'])
with patch.dict(dockerng_state.__dict__, {'__salt__': __salt__}):
with patch.dict(dockerng_mod.__salt__,
{'dockerng.version': MagicMock(return_value={})}):
dockerng_state.running(
'cont',
image='image:latest',
port_bindings=['9090:9797/tcp'])
dockerng_create.assert_called_with(
'image:latest',
validate_input=False,
@ -243,12 +245,13 @@ class DockerngTestCase(TestCase):
'dockerng.create': dockerng_create,
'dockerng.start': dockerng_start,
}
with patch.dict(dockerng_state.__dict__,
{'__salt__': __salt__}):
dockerng_state.running(
'cont',
image='image:latest',
port_bindings=['9090:9797/udp'])
with patch.dict(dockerng_state.__dict__, {'__salt__': __salt__}):
with patch.dict(dockerng_mod.__salt__,
{'dockerng.version': MagicMock(return_value={})}):
dockerng_state.running(
'cont',
image='image:latest',
port_bindings=['9090:9797/udp'])
dockerng_create.assert_called_with(
'image:latest',
validate_input=False,
@ -291,14 +294,15 @@ class DockerngTestCase(TestCase):
'dockerng.stop': dockerng_stop,
'dockerng.rm': dockerng_rm,
}
with patch.dict(dockerng_state.__dict__,
{'__salt__': __salt__}):
ret = dockerng_state.running(
'cont',
image='image:latest',
)
dockerng_stop.assert_called_with('cont', timeout=10, unpause=True)
dockerng_rm.assert_called_with('cont')
with patch.dict(dockerng_state.__dict__, {'__salt__': __salt__}):
with patch.dict(dockerng_mod.__salt__,
{'dockerng.version': MagicMock(return_value={})}):
ret = dockerng_state.running(
'cont',
image='image:latest',
)
dockerng_stop.assert_called_with('cont', timeout=10, unpause=True)
dockerng_rm.assert_called_with('cont')
self.assertEqual(ret, {'name': 'cont',
'comment': "Container 'cont' was replaced",
'result': True,
@ -465,13 +469,14 @@ class DockerngTestCase(TestCase):
'dockerng.create': dockerng_create,
'dockerng.start': dockerng_start,
}
with patch.dict(dockerng_state.__dict__,
{'__salt__': __salt__}):
ret = dockerng_state.running(
'cont',
image='image:latest',
start=False,
)
with patch.dict(dockerng_state.__dict__, {'__salt__': __salt__}):
with patch.dict(dockerng_mod.__salt__,
{'dockerng.version': MagicMock(return_value={})}):
ret = dockerng_state.running(
'cont',
image='image:latest',
start=False,
)
self.assertEqual(ret, {'name': 'cont',
'comment': "Container 'cont' is already "
"configured as specified",
@ -599,19 +604,20 @@ class DockerngTestCase(TestCase):
'dockerng.create': MagicMock(),
'dockerng.start': MagicMock(),
}
with patch.dict(dockerng_state.__dict__,
{'__salt__': __salt__}):
for wrong_value in (1, .2, (), [], {}):
ret = dockerng_state.running(
'cont',
image='image:latest',
environment=[{'KEY': wrong_value}])
self.assertEqual(ret,
{'changes': {},
'comment': 'Environment values must'
' be strings KEY=\'{0}\''.format(wrong_value),
'name': 'cont',
'result': False})
with patch.dict(dockerng_state.__dict__, {'__salt__': __salt__}):
with patch.dict(dockerng_mod.__salt__,
{'dockerng.version': MagicMock(return_value={})}):
for wrong_value in (1, .2, (), [], {}):
ret = dockerng_state.running(
'cont',
image='image:latest',
environment=[{'KEY': wrong_value}])
self.assertEqual(ret,
{'changes': {},
'comment': 'Environment values must'
' be strings KEY=\'{0}\''.format(wrong_value),
'name': 'cont',
'result': False})
def test_running_with_labels(self):
'''
@ -625,13 +631,14 @@ class DockerngTestCase(TestCase):
'dockerng.inspect_image': MagicMock(),
'dockerng.create': dockerng_create,
}
with patch.dict(dockerng_state.__dict__,
{'__salt__': __salt__}):
dockerng_state.running(
'cont',
image='image:latest',
labels=['LABEL1', 'LABEL2'],
)
with patch.dict(dockerng_state.__dict__, {'__salt__': __salt__}):
with patch.dict(dockerng_mod.__salt__,
{'dockerng.version': MagicMock(return_value={})}):
dockerng_state.running(
'cont',
image='image:latest',
labels=['LABEL1', 'LABEL2'],
)
dockerng_create.assert_called_with(
'image:latest',
validate_input=False,