From ddcc8e78875a1dc9c818e4f2fcbcf3f6dff839be Mon Sep 17 00:00:00 2001 From: Douglas Paz Date: Mon, 3 Dec 2018 13:32:00 -0300 Subject: [PATCH 1/3] Fix update_stack request url mount, add env-file param in update_stack, fix clear-env in update_stack --- portainer_cli/__init__.py | 59 ++++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/portainer_cli/__init__.py b/portainer_cli/__init__.py index 109ea5b..9284c50 100755 --- a/portainer_cli/__init__.py +++ b/portainer_cli/__init__.py @@ -22,10 +22,7 @@ env_arg_regex = r'--env\.(.+)=(.+)' def env_arg_to_dict(s): split = re.split(env_arg_regex, s) - return { - 'name': split[1], - 'value': split[2], - } + return (split[1], split[2],) class PortainerCLI(object): @@ -119,11 +116,12 @@ class PortainerCLI(object): self.jwt = jwt @plac.annotations( + env_file=('Environment Variable file', 'option'), prune=('Prune services', 'flag', 'p'), clear_env=('Clear all env vars', 'flag', 'c'), ) - def update_stack(self, id, endpoint_id, stack_file='', prune=False, - clear_env=False, *args): + def update_stack(self, id, endpoint_id, stack_file='', env_file='', + prune=False, clear_env=False, *args): stack_url = 'stacks/{}?endpointId={}'.format( id, endpoint_id, @@ -134,24 +132,53 @@ class PortainerCLI(object): stack_file_content = open(stack_file).read() else: stack_file_content = self.request( - 'stacks/{}/file?endpointId={}').format( + 'stacks/{}/file?endpointId={}'.format( id, endpoint_id, - ).json().get('StackFileContent') - env_args = filter( - lambda x: re.match(env_arg_regex, x), - args, + ) + ).json().get('StackFileContent') + if env_file: + env = {} + for env_line in open(env_file).readlines(): + env_line = env_line.strip() + if not env_line \ + or env_line.startswith('#') \ + or '=' not in env_line: + continue + k, v = env_line.split('=', 1) + k, v = k.strip(), v.strip() + env[k] = v + else: + env_args = filter( + lambda x: re.match(env_arg_regex, x), + args, + ) + env = dict(map( + lambda x: env_arg_to_dict(x), + env_args, + )) + if not clear_env: + current_env = dict( + map( + lambda x: (x.get('name'), x.get('value'),), + current.get('Env'), + ), + ) + current_env.update(env) + env = current_env + final_env = list( + map( + lambda x: {'name': x[0], 'value': x[1]}, + env.items() + ), ) - env = list(map( - lambda x: env_arg_to_dict(x), - env_args, - )) data = { 'Id': id, 'StackFileContent': stack_file_content, 'Prune': prune, - 'Env': env if len(env) > 0 or clear_env else current.get('Env'), + 'Env': final_env if len(final_env) > 0 else current.get('Env'), } + logger.debug('update stack data: {}'.format(data)) self.request( stack_url, self.METHOD_PUT, From 7101e255be1a783a64d961bddf5cd0881365d5a0 Mon Sep 17 00:00:00 2001 From: Douglas Paz Date: Mon, 3 Dec 2018 13:44:04 -0300 Subject: [PATCH 2/3] Update README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e158a79..6a484b7 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ portainer-cli login douglas d1234 Update stack. ```bash -portainer-cli update_stack id endpoint_id [stack_file] +portainer-cli update_stack id endpoint_id [stack_file] [-env-file] ``` **E.g:** @@ -73,6 +73,7 @@ Where `var` is the environment variable name and `value` is the environment vari | Flag | Description | |--|--| +| `-env-file` | Pass env file path, usually `.env` | | `-p` or `--prune` | Prune services | | `-c` or `--clear-env` | Clear all environment variables | From 1adea2c6d6a16626ed6e337481acfc65567c0f99 Mon Sep 17 00:00:00 2001 From: Douglas Paz Date: Mon, 3 Dec 2018 13:44:43 -0300 Subject: [PATCH 3/3] Bump version to 0.3.0 --- portainer_cli/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portainer_cli/__init__.py b/portainer_cli/__init__.py index 9284c50..2d03e53 100755 --- a/portainer_cli/__init__.py +++ b/portainer_cli/__init__.py @@ -13,7 +13,7 @@ try: except NameError: FileNotFoundError = IOError -__version__ = '0.2.2' +__version__ = '0.3.0' logger = logging.getLogger('portainer-cli')