python-terraform-3 Refactor readme and how default value being passed
reorder readme, refactor name
This commit is contained in:
parent
ed03239db2
commit
144b4c61c4
3 changed files with 27 additions and 22 deletions
26
README.md
26
README.md
|
@ -8,16 +8,7 @@ python-terraform is a python module provide a wrapper of `terraform` command lin
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
pip install python-terraform
|
pip install python-terraform
|
||||||
|
|
||||||
## Implementation
|
|
||||||
IMHO, how terraform design boolean options is confusing.
|
|
||||||
Take `input=True` and `-no-color` option of `apply` command for example,
|
|
||||||
they're all boolean value but with different option type.
|
|
||||||
This make api caller don't have a general rule to follow but to do
|
|
||||||
a exhaustive method implementation which I don't prefer to.
|
|
||||||
Therefore I end-up with using `IsFlagged` or `IsNotFlagged` as value of option
|
|
||||||
like `-no-color` and `True/False` value reserved for option like
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
For any terraform command
|
For any terraform command
|
||||||
|
|
||||||
|
@ -35,7 +26,7 @@ For any options
|
||||||
if it's a flag could be used multiple times, assign list to it's value
|
if it's a flag could be used multiple times, assign list to it's value
|
||||||
if it's a "var" variable flag, assign dictionary to it
|
if it's a "var" variable flag, assign dictionary to it
|
||||||
if a value is None, will skip this option
|
if a value is None, will skip this option
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
### Have a test.tf file under folder "/home/test"
|
### Have a test.tf file under folder "/home/test"
|
||||||
#### 1. apply with variables a=b, c=d, refresh=false, no color in the output
|
#### 1. apply with variables a=b, c=d, refresh=false, no color in the output
|
||||||
|
@ -67,6 +58,19 @@ In python-terraform:
|
||||||
from python_terraform import Terraform
|
from python_terraform import Terraform
|
||||||
tf = terraform(working_dir='/home/test')
|
tf = terraform(working_dir='/home/test')
|
||||||
tf.fmt(diff=True)
|
tf.fmt(diff=True)
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
IMHO, how terraform design boolean options is confusing.
|
||||||
|
Take `input=True` and `-no-color` option of `apply` command for example,
|
||||||
|
they're all boolean value but with different option type.
|
||||||
|
This make api caller don't have a general rule to follow but to do
|
||||||
|
a exhaustive method implementation which I don't prefer to.
|
||||||
|
Therefore I end-up with using `IsFlagged` or `IsNotFlagged` as value of option
|
||||||
|
like `-no-color` and `True/False` value reserved for option like
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -73,11 +73,10 @@ class Terraform(object):
|
||||||
:returns return_code, stdout, stderr
|
:returns return_code, stdout, stderr
|
||||||
"""
|
"""
|
||||||
default = dict()
|
default = dict()
|
||||||
args, option_dict = self._create_cmd_args(dir_or_plan, default, kwargs)
|
args, option_dict = self._generate_default_args(dir_or_plan, default, kwargs)
|
||||||
|
|
||||||
return self.cmd('apply', *args, **option_dict)
|
return self.cmd('apply', *args, **option_dict)
|
||||||
|
|
||||||
def _create_cmd_args(self, dir_or_plan, default_dict, kwargs):
|
def _generate_default_args(self, dir_or_plan, default_dict, kwargs):
|
||||||
option_dict = default_dict
|
option_dict = default_dict
|
||||||
option_dict['state'] = self.state
|
option_dict['state'] = self.state
|
||||||
option_dict['target'] = self.targets
|
option_dict['target'] = self.targets
|
||||||
|
@ -97,7 +96,7 @@ class Terraform(object):
|
||||||
:return: ret_code, stdout, stderr
|
:return: ret_code, stdout, stderr
|
||||||
"""
|
"""
|
||||||
default = {'force': IsFlagged}
|
default = {'force': IsFlagged}
|
||||||
args, option_dict = self._create_cmd_args(dir_or_plan, default, kwargs)
|
args, option_dict = self._generate_default_args(dir_or_plan, default, kwargs)
|
||||||
return self.cmd('destroy', *args, **option_dict)
|
return self.cmd('destroy', *args, **option_dict)
|
||||||
|
|
||||||
def generate_cmd_string(self, cmd, *args, **kwargs):
|
def generate_cmd_string(self, cmd, *args, **kwargs):
|
||||||
|
|
|
@ -79,16 +79,18 @@ class TestTerraform(object):
|
||||||
assert ret == 0
|
assert ret == 0
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("folder", "variables", "var_files", "expected_output"),
|
("folder", "variables", "var_files", "expected_output", "options"),
|
||||||
[
|
[
|
||||||
("var_to_output", {'test_var': 'test'}, None, "test_output=test"),
|
("var_to_output",
|
||||||
("var_to_output", {'test_list_var': ['c', 'd']}, None, "test_list_output=[c,d]"),
|
{'test_var': 'test'}, None, "test_output=test", {}),
|
||||||
("var_to_output", {'test_map_var': {"c": "c", "d": "d"}}, None, "test_map_output={a=ab=bc=cd=d}"),
|
("var_to_output", {'test_list_var': ['c', 'd']}, None, "test_list_output=[c,d]", {}),
|
||||||
("var_to_output", {'test_map_var': {"c": "c", "d": "d"}}, 'var_to_output/test_map_var.json', "test_map_output={a=ab=bc=cd=de=ef=f}")
|
("var_to_output", {'test_map_var': {"c": "c", "d": "d"}}, None, "test_map_output={a=ab=bc=cd=d}", {}),
|
||||||
|
("var_to_output", {'test_map_var': {"c": "c", "d": "d"}}, 'var_to_output/test_map_var.json', "test_map_output={a=ab=bc=cd=de=ef=f}", {}),
|
||||||
|
("var_to_output", {}, None, "\x1b[0m\x1b[1m\x1b[32mApplycomplete!", {"no_color": IsNotFlagged})
|
||||||
])
|
])
|
||||||
def test_apply(self, folder, variables, var_files, expected_output):
|
def test_apply(self, folder, variables, var_files, expected_output, options):
|
||||||
tf = Terraform(working_dir=current_path, variables=variables, var_file=var_files)
|
tf = Terraform(working_dir=current_path, variables=variables, var_file=var_files)
|
||||||
ret, out, err = tf.apply(folder)
|
ret, out, err = tf.apply(folder, **options)
|
||||||
assert ret == 0
|
assert ret == 0
|
||||||
assert expected_output in out.replace('\n', '').replace(' ', '')
|
assert expected_output in out.replace('\n', '').replace(' ', '')
|
||||||
assert err == ''
|
assert err == ''
|
||||||
|
|
Loading…
Reference in a new issue