Skip to content

Commit

Permalink
Squashed commit of the following:
Browse files Browse the repository at this point in the history
commit 4f053a06c1e9e3f63fd5afde60322f676acbdf45
Merge: 9177380 07a99ea
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Thu Jul 30 14:37:16 2015 +0100

    Merge branch 'master' into fixes

commit 9177380
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Thu Jul 30 14:00:51 2015 +0100

    Tweaks exception message.

commit 6a5832e
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Thu Jul 30 13:17:32 2015 +0100

    Simplifies logic as per feedback.

commit f750edd
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Thu Jul 30 11:09:14 2015 +0100

    Move return from list to dict. Adds exception handling.

commit 8e50f57
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Thu Jul 30 10:15:58 2015 +0100

    Reverts change to .gitignore.

commit 5ba2c1b
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Wed Jul 29 21:15:21 2015 +0100

    Fixes feedback. Adds three unittests.

commit e1c719e
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Wed Jul 29 17:00:16 2015 +0100

    WIP Adds test for parse_env_file

commit 4448ae7
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Wed Jul 29 16:42:49 2015 +0100

    Excludes coverage files.

commit 19a5d01
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Wed Jul 29 16:42:42 2015 +0100

    Switch fixes logic.

commit a8094c6
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Wed Jul 29 11:45:56 2015 +0100

    Implements logic for envfile parsing from Docker-cli

    Ref: https://github.com/docker/docker/blob/master/opts/envfile.go#L19-L51

commit ea9bfd9
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Wed Jul 29 11:41:23 2015 +0100

    Replaces CSV module with manual splitting.

commit a001d28
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Wed Jul 29 11:35:37 2015 +0100

    Removes isinstance on filename.

commit 419d596
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Tue Jul 28 22:39:33 2015 +0100

    Reflects @aanand's feedback.

commit e81e3c8
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Tue Jul 28 15:43:32 2015 +0100

    Typo fix.

commit 2898389
Author: Viktor Petersson <vpetersson@wireload.net>
Date:   Tue Jul 28 15:41:08 2015 +0100

    Refs #565. Adds minimal implementation of env_file client-side support.
  • Loading branch information
vpetersson committed Jul 30, 2015
1 parent 07a99ea commit d400717
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 2 deletions.
2 changes: 1 addition & 1 deletion docker/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
compare_version, convert_port_bindings, convert_volume_binds,
mkbuildcontext, tar, parse_repository_tag, parse_host,
kwargs_from_env, convert_filters, create_host_config,
create_container_config, parse_bytes, ping_registry
create_container_config, parse_bytes, ping_registry, parse_env_file
) # flake8: noqa

from .types import Ulimit, LogConfig # flake8: noqa
Expand Down
27 changes: 27 additions & 0 deletions docker/utils/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,32 @@ def create_host_config(
return host_config


def parse_env_file(env_file):
"""
Reads a line-separated environment file.
The format of each line should be "key=value".
"""
environment = {}

with open(env_file, 'r') as f:
for line in f:

if line[0] == '#':
continue

parse_line = line.strip().split('=')
if len(parse_line) == 2:
k = parse_line[0]
v = parse_line[1]
environment[k] = v
else:
raise errors.DockerException(
'Invalid line in environment file {0}:\n{1}'.format(
env_file, line))

return environment


def create_container_config(
version, image, command, hostname=None, user=None, detach=False,
stdin_open=False, tty=False, mem_limit=None, ports=None, environment=None,
Expand All @@ -528,6 +554,7 @@ def create_container_config(
):
if isinstance(command, six.string_types):
command = shlex.split(str(command))

if isinstance(environment, dict):
environment = [
six.text_type('{0}={1}').format(k, v)
Expand Down
21 changes: 21 additions & 0 deletions docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,27 @@ from. Optionally a single string joining container id's with commas
'Warnings': None}
```

### parse_env_file

A utility for parsing an environment file.

The expected format of the file is as follows:

```
USERNAME=jdoe
PASSWORD=secret
```

The utility can be used as follows:

```python
>> import docker.utils
>> my_envs = docker.utils.parse_env_file('/path/to/file')
>> docker.utils.create_container_config('1.18', '_mongodb', 'foobar', environment=my_envs)
```

You can now use this with 'environment' for `create_container`.

## diff

Inspect changes on a container's filesystem
Expand Down
36 changes: 35 additions & 1 deletion tests/utils_test.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import os
import os.path
import unittest
import tempfile

from docker.client import Client
from docker.errors import DockerException
from docker.utils import (
parse_repository_tag, parse_host, convert_filters, kwargs_from_env,
create_host_config, Ulimit, LogConfig, parse_bytes
create_host_config, Ulimit, LogConfig, parse_bytes, parse_env_file
)
from docker.utils.ports import build_port_bindings, split_port
from docker.auth import resolve_repository_name, resolve_authconfig
Expand All @@ -17,6 +18,17 @@
class UtilsTest(base.BaseTestCase):
longMessage = True

def generate_tempfile(self, file_content=None):
"""
Generates a temporary file for tests with the content
of 'file_content' and returns the filename.
Don't forget to unlink the file with os.unlink() after.
"""
local_tempfile = tempfile.NamedTemporaryFile(delete=False)
local_tempfile.write(file_content.encode('UTF-8'))
local_tempfile.close()
return local_tempfile.name

def setUp(self):
self.os_environ = os.environ.copy()

Expand Down Expand Up @@ -95,6 +107,28 @@ def test_kwargs_from_env(self):
except TypeError as e:
self.fail(e)

def test_parse_env_file_proper(self):
env_file = self.generate_tempfile(
file_content='USER=jdoe\nPASS=secret')
get_parse_env_file = parse_env_file(env_file)
self.assertEqual(get_parse_env_file,
{'USER': 'jdoe', 'PASS': 'secret'})
os.unlink(env_file)

def test_parse_env_file_commented_line(self):
env_file = self.generate_tempfile(
file_content='USER=jdoe\n#PASS=secret')
get_parse_env_file = parse_env_file((env_file))
self.assertEqual(get_parse_env_file, {'USER': 'jdoe'})
os.unlink(env_file)

def test_parse_env_file_invalid_line(self):
env_file = self.generate_tempfile(
file_content='USER jdoe')
self.assertRaises(
DockerException, parse_env_file, env_file)
os.unlink(env_file)

def test_convert_filters(self):
tests = [
({'dangling': True}, '{"dangling": ["true"]}'),
Expand Down

0 comments on commit d400717

Please sign in to comment.