浏览代码

Merge pull request #411 from Banno/fig-pull

adding "fig pull [SERVICE]" to pull service images
Ben Firshman 11 年之前
父节点
当前提交
fc4c35e977
共有 5 个文件被更改,包括 28 次插入1 次删除
  1. 4 0
      docs/cli.md
  2. 9 0
      fig/cli/main.py
  3. 4 0
      fig/project.py
  4. 5 0
      fig/service.py
  5. 6 1
      tests/integration/cli_test.py

+ 4 - 0
docs/cli.md

@@ -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.

+ 9 - 0
fig/cli/main.py

@@ -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.

+ 4 - 0
fig/project.py

@@ -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)

+ 5 - 0
fig/service.py

@@ -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+)$')
 
 

+ 6 - 1
tests/integration/cli_test.py

@@ -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')