Browse Source

adding "fig pull [SERVICE]" to pull service images

Fixes #158

Signed-off-by: Luke Amdor <[email protected]>
Luke Amdor 11 years ago
parent
commit
e51851c884
4 changed files with 24 additions and 1 deletions
  1. 9 0
      fig/cli/main.py
  2. 4 0
      fig/project.py
  3. 5 0
      fig/service.py
  4. 6 1
      tests/integration/cli_test.py

+ 9 - 0
fig/cli/main.py

@@ -85,6 +85,7 @@ class TopLevelCommand(Command):
       kill      Kill containers
       logs      View output from containers
       ps        List containers
+      pull      Pulls service images
       rm        Remove stopped containers
       run       Run a one-off command
       scale     Set number of containers for a service
@@ -182,6 +183,14 @@ class TopLevelCommand(Command):
                 ])
             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):
         """
         Remove stopped service containers.

+ 4 - 0
fig/project.py

@@ -176,6 +176,10 @@ class Project(object):
 
         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):
         for service in self.get_services(service_names):
             service.remove_stopped(**options)

+ 5 - 0
fig/service.py

@@ -401,6 +401,11 @@ class Service(object):
                 return False
         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+)$')
 

+ 6 - 1
tests/integration/cli_test.py

@@ -51,6 +51,12 @@ class CLITestCase(DockerClientTestCase):
         self.assertNotIn('multiplefigfiles_another_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)
     def test_build_no_cache(self, mock_stdout):
         self.command.base_dir = 'tests/fixtures/simple-dockerfile'
@@ -66,7 +72,6 @@ class CLITestCase(DockerClientTestCase):
         self.command.dispatch(['build', '--no-cache', 'simple'], None)
         output = mock_stdout.getvalue()
         self.assertNotIn(cache_indicator, output)
-
     def test_up(self):
         self.command.dispatch(['up', '-d'], None)
         service = self.project.get_service('simple')