From 9d1383ba269e2b04b93a7a5042d6589f7870b077 Mon Sep 17 00:00:00 2001 From: Aanand Prasad Date: Wed, 26 Feb 2014 15:45:14 +0000 Subject: [PATCH] Alternate fig file can be specified with -f --- fig/cli/command.py | 13 +++++++++++-- fig/cli/main.py | 1 + tests/cli_test.py | 22 ++++++++++++++++++++++ tests/fixtures/multiple-figfiles/fig.yml | 6 ++++++ tests/fixtures/multiple-figfiles/fig2.yml | 3 +++ 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/multiple-figfiles/fig.yml create mode 100644 tests/fixtures/multiple-figfiles/fig2.yml diff --git a/fig/cli/command.py b/fig/cli/command.py index 5ac0b48f1..8a945a67a 100644 --- a/fig/cli/command.py +++ b/fig/cli/command.py @@ -22,6 +22,9 @@ log = logging.getLogger(__name__) class Command(DocoptCommand): base_dir = '.' + def __init__(self): + self.yaml_path = os.environ.get('FIG_FILE', None) + def dispatch(self, *args, **kwargs): try: super(Command, self).dispatch(*args, **kwargs) @@ -54,6 +57,11 @@ Couldn't connect to Docker daemon at %s - is it running? If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable. """ % self.client.base_url) + def perform_command(self, options, *args, **kwargs): + if options['--file'] is not None: + self.yaml_path = os.path.join(self.base_dir, options['--file']) + return super(Command, self).perform_command(options, *args, **kwargs) + @cached_property def client(self): return Client(docker_url()) @@ -61,9 +69,10 @@ If it's at a non-standard location, specify the URL with the DOCKER_HOST environ @cached_property def project(self): try: - yaml_path = self.check_yaml_filename() + yaml_path = self.yaml_path + if yaml_path is None: + yaml_path = self.check_yaml_filename() config = yaml.load(open(yaml_path)) - except IOError as e: if e.errno == errno.ENOENT: log.error("Can't find %s. Are you in the right directory?", os.path.basename(e.filename)) diff --git a/fig/cli/main.py b/fig/cli/main.py index eee5563f5..37c425f12 100644 --- a/fig/cli/main.py +++ b/fig/cli/main.py @@ -70,6 +70,7 @@ class TopLevelCommand(Command): Options: --verbose Show more output --version Print version and exit + -f, --file FILE Specify an alternate fig file (default: fig.yml) Commands: build Build or rebuild services diff --git a/tests/cli_test.py b/tests/cli_test.py index b6d02daad..38a9cd28c 100644 --- a/tests/cli_test.py +++ b/tests/cli_test.py @@ -31,6 +31,28 @@ class CLITestCase(DockerClientTestCase): self.command.dispatch(['ps'], None) self.assertIn('fig_simple_1', mock_stdout.getvalue()) + @patch('sys.stdout', new_callable=StringIO) + def test_default_figfile(self, mock_stdout): + self.command.base_dir = 'tests/fixtures/multiple-figfiles' + self.command.dispatch(['up', '-d'], None) + self.command.dispatch(['ps'], None) + + output = mock_stdout.getvalue() + self.assertIn('fig_simple_1', output) + self.assertIn('fig_another_1', output) + self.assertNotIn('fig_yetanother_1', output) + + @patch('sys.stdout', new_callable=StringIO) + def test_alternate_figfile(self, mock_stdout): + self.command.base_dir = 'tests/fixtures/multiple-figfiles' + self.command.dispatch(['-f', 'fig2.yml', 'up', '-d'], None) + self.command.dispatch(['-f', 'fig2.yml', 'ps'], None) + + output = mock_stdout.getvalue() + self.assertNotIn('fig_simple_1', output) + self.assertNotIn('fig_another_1', output) + self.assertIn('fig_yetanother_1', output) + def test_scale(self): project = self.command.project diff --git a/tests/fixtures/multiple-figfiles/fig.yml b/tests/fixtures/multiple-figfiles/fig.yml new file mode 100644 index 000000000..225323755 --- /dev/null +++ b/tests/fixtures/multiple-figfiles/fig.yml @@ -0,0 +1,6 @@ +simple: + image: ubuntu + command: /bin/sleep 300 +another: + image: ubuntu + command: /bin/sleep 300 diff --git a/tests/fixtures/multiple-figfiles/fig2.yml b/tests/fixtures/multiple-figfiles/fig2.yml new file mode 100644 index 000000000..330ed771d --- /dev/null +++ b/tests/fixtures/multiple-figfiles/fig2.yml @@ -0,0 +1,3 @@ +yetanother: + image: ubuntu + command: /bin/sleep 300