Merge branch 'release/0.7.7'

This commit is contained in:
Freddy Tan 2016-11-24 16:22:03 +08:00
commit 9920effc64
10 changed files with 58 additions and 50 deletions

7
.bumpversion.cfg Normal file
View file

@ -0,0 +1,7 @@
[bumpversion]
current_version = 0.7.7
commit = True
tag = False
[bumpversion:file:VERSION]

1
.gitignore vendored
View file

@ -5,3 +5,4 @@
.idea .idea
.cache .cache
/.pypirc /.pypirc
/.tox/

View file

@ -17,16 +17,12 @@ before_script:
install: install:
- "curl https://bootstrap.pypa.io/ez_setup.py -o - | python" - "curl https://bootstrap.pypa.io/ez_setup.py -o - | python"
- "pip install -r test/requirements.txt" - "pip install tox-travis"
- "sudo apt-get -y install pandoc"
- "pip install pypandoc"
- "pip install ." - "pip install ."
# command to run tests # command to run tests
script: script:
- "export PATH=$PATH:$PWD/tf_bin" - "export PATH=$PATH:$PWD/tf_bin"
- cd test - tox
- py.test
- cd ..
deploy: deploy:
# test pypi # test pypi

View file

@ -29,10 +29,6 @@ For any terraform command
if a value is None, will skip this option if a value is None, will skip this option
:return: ret_code, out, err :return: ret_code, out, err
For apply/destroy method, the flag options, like, `-no-color` or `-force`
have been implemented as boolean argument. simply use `is_no_color=True/False` for
apply/destroy method
## Examples ## Examples
### Have a test.tf file under folder "/home/test" ### Have a test.tf file under folder "/home/test"
@ -46,7 +42,7 @@ 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.apply(is_no_color=True, refresh=False, var={'a':'b', 'c':'d'}) tf.apply(no_color=IsFlagged, refresh=False, var={'a':'b', 'c':'d'})
#### taint command, allow-missing and no color #### taint command, allow-missing and no color
In shell: In shell:

View file

@ -1 +1 @@
0.7.6 0.7.7

View file

@ -53,57 +53,40 @@ class Terraform:
# store the tfstate data # store the tfstate data
self.tfstate = dict() self.tfstate = dict()
def apply(self, def apply(self, dir_or_plan=None, **kwargs):
dir=None,
is_no_color=True,
is_input=False,
**kwargs):
""" """
refer to https://terraform.io/docs/commands/apply.html refer to https://terraform.io/docs/commands/apply.html
:raise RuntimeError when return code is not zero no-color is flagged by default
:param is_no_color: if True, add flag -no-color :param dir_or_plan: folder relative to working folder
:param is_input: if True, add option -input=true
:param dir: folder relative to working folder
:param kwargs: same as kwags in method 'cmd' :param kwargs: same as kwags in method 'cmd'
:returns return_code, stdout, stderr :returns return_code, stdout, stderr
""" """
default = dict()
args, option_dict = self._create_cmd_args(is_input, args, option_dict = self._create_cmd_args(dir_or_plan, default, kwargs)
is_no_color,
dir,
kwargs)
return self.cmd('apply', *args, **option_dict) return self.cmd('apply', *args, **option_dict)
def _create_cmd_args(self, is_input, is_no_color, dir, kwargs): def _create_cmd_args(self, dir_or_plan, default_dict, kwargs):
option_dict = 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
option_dict['var'] = self.variables option_dict['var'] = self.variables
option_dict['var_file'] = self.var_file option_dict['var_file'] = self.var_file
option_dict['parallelism'] = self.parallelism option_dict['parallelism'] = self.parallelism
if is_no_color:
option_dict['no_color'] = IsFlagged option_dict['no_color'] = IsFlagged
option_dict['input'] = is_input option_dict['input'] = True
option_dict.update(kwargs) option_dict.update(kwargs)
args = [dir] if dir else [] args = [dir_or_plan] if dir_or_plan else []
return args, option_dict return args, option_dict
def destroy(self, working_dir=None, is_force=True, def destroy(self, dir_or_plan=None, **kwargs):
is_no_color=True, is_input=False, **kwargs):
""" """
refer to https://www.terraform.io/docs/commands/destroy.html refer to https://www.terraform.io/docs/commands/destroy.html
:raise RuntimeError when return code is not zero force/no-color option is flagged by default
:return: ret_code, stdout, stderr :return: ret_code, stdout, stderr
""" """
default = {'force': IsFlagged}
args, option_dict = self._create_cmd_args(is_input, args, option_dict = self._create_cmd_args(dir_or_plan, default, kwargs)
is_no_color,
working_dir,
kwargs)
if is_force:
option_dict['force'] = IsFlagged
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):

3
requirements.txt Normal file
View file

@ -0,0 +1,3 @@
tox-pyenv
pytest
tox

View file

@ -1 +0,0 @@
pytest

View file

@ -5,7 +5,7 @@ import logging
import re import re
logging.basicConfig(level=logging.WARN) logging.basicConfig(level=logging.WARN)
current_path = os.path.dirname(os.path.realpath(__file__))
STRING_CASES = [ STRING_CASES = [
[ [
@ -61,28 +61,40 @@ class TestTerraform:
@pytest.mark.parametrize(*CMD_CASES) @pytest.mark.parametrize(*CMD_CASES)
def test_cmd(self, method, expected_output): def test_cmd(self, method, expected_output):
tf = Terraform() tf = Terraform(working_dir=current_path)
ret, out, err = method(tf) ret, out, err = method(tf)
assert expected_output in out assert expected_output in out
assert ret == 0 assert ret == 0
def test_state_data(self): def test_state_data(self):
tf = Terraform(working_dir='test_tfstate_file', state='tfstate.test') cwd = os.path.join(current_path, 'test_tfstate_file')
tf = Terraform(working_dir=cwd, state='tfstate.test')
tf.read_state_file() tf.read_state_file()
assert tf.tfstate.modules[0]['path'] == ['root'] assert tf.tfstate.modules[0]['path'] == ['root']
def test_apply(self): def test_apply(self):
tf = Terraform(working_dir='apply_tf', variables={'test_var': 'test'}) cwd = os.path.join(current_path, 'apply_tf')
tf = Terraform(working_dir=cwd, variables={'test_var': 'test'})
ret, out, err = tf.apply(var={'test_var': 'test2'}) ret, out, err = tf.apply(var={'test_var': 'test2'})
assert ret == 0 assert ret == 0
def test_override_no_color(self):
cwd = os.path.join(current_path, 'apply_tf')
tf = Terraform(working_dir=cwd, variables={'test_var': 'test'})
ret, out, err = tf.apply(var={'test_var': 'test2'},
no_color=IsNotFlagged)
out = out.replace('\n', '')
assert '\x1b[0m\x1b[1m\x1b[32mApply' in out
def test_get_output(self): def test_get_output(self):
tf = Terraform(working_dir='apply_tf', variables={'test_var': 'test'}) cwd = os.path.join(current_path, 'apply_tf')
tf = Terraform(working_dir=cwd, variables={'test_var': 'test'})
tf.apply() tf.apply()
assert tf.output('test_output') == 'test' assert tf.output('test_output') == 'test'
def test_destroy(self): def test_destroy(self):
tf = Terraform(working_dir='apply_tf', variables={'test_var': 'test'}) cwd = os.path.join(current_path, 'apply_tf')
tf = Terraform(working_dir=cwd, variables={'test_var': 'test'})
ret, out, err = tf.destroy() ret, out, err = tf.destroy()
assert ret == 0 assert ret == 0
assert 'Destroy complete! Resources: 0 destroyed.' in out assert 'Destroy complete! Resources: 0 destroyed.' in out

11
tox.ini Normal file
View file

@ -0,0 +1,11 @@
# content of: tox.ini , put in same dir as setup.py
[tox]
envlist = py27, py35
[testenv]
deps=pytest
commands=py.test test
[travis]
python =
2.7: py27
3.5: py35