Merge pull request #411 from Banno/fig-pull

adding "fig pull [SERVICE]" to pull service images
This commit is contained in:
Ben Firshman 2014-09-10 23:57:20 +01:00
commit fc4c35e977
5 changed files with 28 additions and 1 deletions

View File

@ -36,6 +36,10 @@ Print the public port for a port binding
List containers. List containers.
## pull
Pulls service images.
## rm ## rm
Remove stopped service containers. Remove stopped service containers.

View File

@ -86,6 +86,7 @@ class TopLevelCommand(Command):
logs View output from containers logs View output from containers
port Print the public port for a port binding port Print the public port for a port binding
ps List containers ps List containers
pull Pulls service images
rm Remove stopped containers rm Remove stopped containers
run Run a one-off command run Run a one-off command
scale Set number of containers for a service scale Set number of containers for a service
@ -204,6 +205,14 @@ class TopLevelCommand(Command):
]) ])
print(Formatter().table(headers, rows)) print(Formatter().table(headers, rows))
def pull(self, project, options):
"""
Pulls images for services.
Usage: pull [SERVICE...]
"""
project.pull(service_names=options['SERVICE'])
def rm(self, project, options): def rm(self, project, options):
""" """
Remove stopped service containers. Remove stopped service containers.

View File

@ -180,6 +180,10 @@ class Project(object):
return running_containers return running_containers
def pull(self, service_names=None):
for service in self.get_services(service_names, include_links=True):
service.pull()
def remove_stopped(self, service_names=None, **options): def remove_stopped(self, service_names=None, **options):
for service in self.get_services(service_names): for service in self.get_services(service_names):
service.remove_stopped(**options) service.remove_stopped(**options)

View File

@ -410,6 +410,11 @@ class Service(object):
return False return False
return True return True
def pull(self):
if 'image' in self.options:
log.info('Pulling %s (%s)...' % (self.name, self.options.get('image')))
self.client.pull(self.options.get('image'))
NAME_RE = re.compile(r'^([^_]+)_([^_]+)_(run_)?(\d+)$') NAME_RE = re.compile(r'^([^_]+)_([^_]+)_(run_)?(\d+)$')

View File

@ -53,6 +53,12 @@ class CLITestCase(DockerClientTestCase):
self.assertNotIn('multiplefigfiles_another_1', output) self.assertNotIn('multiplefigfiles_another_1', output)
self.assertIn('multiplefigfiles_yetanother_1', output) self.assertIn('multiplefigfiles_yetanother_1', output)
@patch('fig.service.log')
def test_pull(self, mock_logging):
self.command.dispatch(['pull'], None)
mock_logging.info.assert_any_call('Pulling simple (busybox:latest)...')
mock_logging.info.assert_any_call('Pulling another (busybox:latest)...')
@patch('sys.stdout', new_callable=StringIO) @patch('sys.stdout', new_callable=StringIO)
def test_build_no_cache(self, mock_stdout): def test_build_no_cache(self, mock_stdout):
self.command.base_dir = 'tests/fixtures/simple-dockerfile' self.command.base_dir = 'tests/fixtures/simple-dockerfile'
@ -68,7 +74,6 @@ class CLITestCase(DockerClientTestCase):
self.command.dispatch(['build', '--no-cache', 'simple'], None) self.command.dispatch(['build', '--no-cache', 'simple'], None)
output = mock_stdout.getvalue() output = mock_stdout.getvalue()
self.assertNotIn(cache_indicator, output) self.assertNotIn(cache_indicator, output)
def test_up(self): def test_up(self):
self.command.dispatch(['up', '-d'], None) self.command.dispatch(['up', '-d'], None)
service = self.project.get_service('simple') service = self.project.get_service('simple')