Skip to content

Commit ec5c864

Browse files
committed
Merge pull request #460 from dnephin/fix_tests_for_docker_1.1
Fix test failures on docker 1.1.2
2 parents cabe47a + 71e7103 commit ec5c864

5 files changed

Lines changed: 51 additions & 32 deletions

File tree

fig/container.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def number(self):
6767
@property
6868
def ports(self):
6969
self.inspect_if_not_inspected()
70-
return self.dictionary['NetworkSettings']['Ports'] or {}
70+
return self.get('NetworkSettings.Ports') or {}
7171

7272
@property
7373
def human_readable_ports(self):
@@ -82,33 +82,35 @@ def format_port(private, public):
8282

8383
@property
8484
def human_readable_state(self):
85-
self.inspect_if_not_inspected()
86-
if self.dictionary['State']['Running']:
87-
if self.dictionary['State'].get('Ghost'):
88-
return 'Ghost'
89-
else:
90-
return 'Up'
85+
if self.is_running:
86+
return 'Ghost' if self.get('State.Ghost') else 'Up'
9187
else:
92-
return 'Exit %s' % self.dictionary['State']['ExitCode']
88+
return 'Exit %s' % self.get('State.ExitCode')
9389

9490
@property
9591
def human_readable_command(self):
96-
self.inspect_if_not_inspected()
97-
if self.dictionary['Config']['Cmd']:
98-
return ' '.join(self.dictionary['Config']['Cmd'])
99-
else:
100-
return ''
92+
return ' '.join(self.get('Config.Cmd') or '')
10193

10294
@property
10395
def environment(self):
104-
self.inspect_if_not_inspected()
105-
return dict(var.split("=", 1)
106-
for var in self.dictionary.get('Config', {}).get('Env', []))
96+
return dict(var.split("=", 1) for var in self.get('Config.Env') or [])
10797

10898
@property
10999
def is_running(self):
100+
return self.get('State.Running')
101+
102+
def get(self, key):
103+
"""Return a value from the container or None if the value is not set.
104+
105+
:param key: a string using dotted notation for nested dictionary
106+
lookups
107+
"""
110108
self.inspect_if_not_inspected()
111-
return self.dictionary['State']['Running']
109+
110+
def get_value(dictionary, key):
111+
return (dictionary or {}).get(key)
112+
113+
return reduce(get_value, key.split('.'), self.dictionary)
112114

113115
def get_local_port(self, port, protocol='tcp'):
114116
port = self.ports.get("%s/%s" % (port, protocol))

fig/service.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,10 @@ def recreate_containers(self, **override_options):
205205
return tuples
206206

207207
def recreate_container(self, container, **override_options):
208+
"""Recreate a container. An intermediate container is created so that
209+
the new container has the same name, while still supporting
210+
`volumes-from` the original container.
211+
"""
208212
try:
209213
container.stop()
210214
except APIError as e:

tests/integration/project_test.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,23 +94,22 @@ def test_project_up(self):
9494

9595
def test_project_up_recreates_containers(self):
9696
web = self.create_service('web')
97-
db = self.create_service('db', volumes=['/var/db'])
97+
db = self.create_service('db', volumes=['/etc'])
9898
project = Project('figtest', [web, db], self.client)
9999
project.start()
100100
self.assertEqual(len(project.containers()), 0)
101101

102102
project.up(['db'])
103103
self.assertEqual(len(project.containers()), 1)
104104
old_db_id = project.containers()[0].id
105-
db_volume_path = project.containers()[0].inspect()['Volumes']['/var/db']
105+
db_volume_path = project.containers()[0].get('Volumes./etc')
106106

107107
project.up()
108108
self.assertEqual(len(project.containers()), 2)
109109

110110
db_container = [c for c in project.containers() if 'db' in c.name][0]
111111
self.assertNotEqual(db_container.id, old_db_id)
112-
self.assertEqual(db_container.inspect()['Volumes']['/var/db'],
113-
db_volume_path)
112+
self.assertEqual(db_container.get('Volumes./etc'), db_volume_path)
114113

115114
project.kill()
116115
project.remove_stopped()

tests/integration/service_test.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,16 @@ def test_create_container_with_volumes_from(self):
107107
host_service = self.create_service('host', volumes_from=[volume_service, volume_container_2])
108108
host_container = host_service.create_container()
109109
host_service.start_container(host_container)
110-
self.assertIn(volume_container_1.id, host_container.inspect()['HostConfig']['VolumesFrom'])
111-
self.assertIn(volume_container_2.id, host_container.inspect()['HostConfig']['VolumesFrom'])
110+
self.assertIn(volume_container_1.id,
111+
host_container.get('HostConfig.VolumesFrom'))
112+
self.assertIn(volume_container_2.id,
113+
host_container.get('HostConfig.VolumesFrom'))
112114

113115
def test_recreate_containers(self):
114116
service = self.create_service(
115117
'db',
116118
environment={'FOO': '1'},
117-
volumes=['/var/db'],
119+
volumes=['/etc'],
118120
entrypoint=['sleep'],
119121
command=['300']
120122
)
@@ -124,7 +126,7 @@ def test_recreate_containers(self):
124126
self.assertIn('FOO=1', old_container.dictionary['Config']['Env'])
125127
self.assertEqual(old_container.name, 'figtest_db_1')
126128
service.start_container(old_container)
127-
volume_path = old_container.inspect()['Volumes']['/var/db']
129+
volume_path = old_container.inspect()['Volumes']['/etc']
128130

129131
num_containers_before = len(self.client.containers(all=True))
130132

@@ -140,7 +142,7 @@ def test_recreate_containers(self):
140142
self.assertEqual(new_container.dictionary['Config']['Cmd'], ['300'])
141143
self.assertIn('FOO=2', new_container.dictionary['Config']['Env'])
142144
self.assertEqual(new_container.name, 'figtest_db_1')
143-
self.assertEqual(new_container.inspect()['Volumes']['/var/db'], volume_path)
145+
self.assertEqual(new_container.inspect()['Volumes']['/etc'], volume_path)
144146
self.assertIn(intermediate_container.id, new_container.dictionary['HostConfig']['VolumesFrom'])
145147

146148
self.assertEqual(len(self.client.containers(all=True)), num_containers_before)
@@ -340,18 +342,18 @@ def test_scale_sets_ports(self):
340342

341343
def test_network_mode_none(self):
342344
service = self.create_service('web', net='none')
343-
container = service.start_container().inspect()
344-
self.assertEqual(container['HostConfig']['NetworkMode'], 'none')
345+
container = service.start_container()
346+
self.assertEqual(container.get('HostConfig.NetworkMode'), 'none')
345347

346348
def test_network_mode_bridged(self):
347349
service = self.create_service('web', net='bridge')
348-
container = service.start_container().inspect()
349-
self.assertEqual(container['HostConfig']['NetworkMode'], 'bridge')
350+
container = service.start_container()
351+
self.assertEqual(container.get('HostConfig.NetworkMode'), 'bridge')
350352

351353
def test_network_mode_host(self):
352354
service = self.create_service('web', net='host')
353-
container = service.start_container().inspect()
354-
self.assertEqual(container['HostConfig']['NetworkMode'], 'host')
355+
container = service.start_container()
356+
self.assertEqual(container.get('HostConfig.NetworkMode'), 'host')
355357

356358
def test_dns_single_value(self):
357359
service = self.create_service('web', dns='8.8.8.8')

tests/unit/container_test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,15 @@ def test_get_local_port(self):
105105
self.assertEqual(
106106
container.get_local_port(45454, protocol='tcp'),
107107
'0.0.0.0:49197')
108+
109+
def test_get(self):
110+
container = Container(None, {
111+
"Status":"Up 8 seconds",
112+
"HostConfig": {
113+
"VolumesFrom": ["volume_id",]
114+
},
115+
}, has_been_inspected=True)
116+
117+
self.assertEqual(container.get('Status'), "Up 8 seconds")
118+
self.assertEqual(container.get('HostConfig.VolumesFrom'), ["volume_id",])
119+
self.assertEqual(container.get('Foo.Bar.DoesNotExist'), None)

0 commit comments

Comments
 (0)