From 4ef52dca4483d51ceb0561594091dc948b5c211a Mon Sep 17 00:00:00 2001 From: Freddy Tan Date: Thu, 25 Feb 2016 17:22:11 +0800 Subject: [PATCH] refactor --- .gitignore | 2 + VERSION | 1 + {terraform => python_terraform}/__init__.py | 48 ++++++++++++++------- setup.py | 16 +++++-- test/test.tf | 24 +++++++++++ test/test_terraform.py | 23 ++++------ 6 files changed, 82 insertions(+), 32 deletions(-) create mode 100644 VERSION rename {terraform => python_terraform}/__init__.py (79%) diff --git a/.gitignore b/.gitignore index 7e99e36..aaa8228 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ +*.tfstate +*.tfstate.backup *.pyc \ No newline at end of file diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..8a9ecc2 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.0.1 \ No newline at end of file diff --git a/terraform/__init__.py b/python_terraform/__init__.py similarity index 79% rename from terraform/__init__.py rename to python_terraform/__init__.py index 7e534d2..ce1a649 100644 --- a/terraform/__init__.py +++ b/python_terraform/__init__.py @@ -11,13 +11,16 @@ class Terraform: self.targets = [] if targets is None else targets self.variables = dict() if variables is None else variables - self.state = state - self.state_data = None + self.state_filename = state + self.state_data = dict() self.parallelism = 50 - def apply(self, targets=None, variables=None): + def apply(self, targets=None, variables=None, **kargs): """ refer to https://terraform.io/docs/commands/apply.html + :param variables: variables in dict type + :param targets: targets in list + :returns return_code, stdout, stderr """ variables = self.variables if variables is None else variables targets = self.targets if targets is None else targets @@ -25,13 +28,20 @@ class Terraform: parameters = [] parameters += self._generate_targets(targets) parameters += self._generate_var_string(variables) - parameters += ['-parallelism=%s' % self.parallelism] + parameters += self._gen_param_string(kargs) + parameters = \ - ['terraform', 'apply', '-state=%s' % self.state] + parameters + ['terraform', 'apply', '-state=%s' % self.state_filename] + parameters cmd = ' '.join(parameters) return self._run_cmd(cmd) + def _gen_param_string(self, kargs): + params = [] + for key, value in kargs.items(): + params += ['%s=%s' % (key, value)] + return params + def _run_cmd(self, cmd): log.debug('command: ' + cmd) @@ -43,10 +53,10 @@ class Terraform: if ret_code == 0: log.debug('error: ' + err) - self.read_state() + self.read_state_file() return ret_code, out, err - def destroy(self, targets=None, variables=None): + def destroy(self, targets=None, variables=None, **kwargs): variables = self.variables if variables is None else variables targets = self.targets if targets is None else targets @@ -55,7 +65,7 @@ class Terraform: parameters += self._generate_var_string(variables) parameters = \ - ['terraform', 'destroy', '-force', '-state=%s' % self.state] + \ + ['terraform', 'destroy', '-force', '-state=%s' % self.state_filename] + \ parameters cmd = ' '.join(parameters) return self._run_cmd(cmd) @@ -68,15 +78,18 @@ class Terraform: parameters += self._generate_targets(targets) parameters += self._generate_var_string(variables) parameters = \ - ['terraform', 'refresh', '-state=%s' % self.state] + \ + ['terraform', 'refresh', '-state=%s' % self.state_filename] + \ parameters cmd = ' '.join(parameters) return self._run_cmd(cmd) - def read_state(self, state=None): - state = self.state if state is None else state - if os.path.exists(state): - with open(state) as f: + def read_state_file(self): + """ + read .tfstate file + :return: states file in dict type + """ + if os.path.exists(self.state_filename): + with open(self.state_filename) as f: json_data = json.load(f) self.state_data = json_data log.debug("state_data=%s" % str(self.state_data)) @@ -86,11 +99,11 @@ class Terraform: def is_any_aws_instance_alive(self): self.refresh() - if not os.path.exists(self.state): + if not os.path.exists(self.state_filename): log.debug("can't find %s " % self.state_data) return False - self.read_state() + self.read_state_file() try: main_module = self._get_main_module() for resource_key, info in main_module['resources'].items(): @@ -136,6 +149,11 @@ class Terraform: return None def get_output_value(self, output_name): + """ + + :param output_name: + :return: + """ try: main_module = self._get_main_module() return main_module['outputs'][output_name] diff --git a/setup.py b/setup.py index 30ab15b..3c4bbe0 100644 --- a/setup.py +++ b/setup.py @@ -5,19 +5,29 @@ from distutils.core import setup import os dependencies = [] -module_name = 'terraform' +module_name = 'python-terraform' +def get_version(): + p = os.path.join(os.path.dirname( + os.path.abspath(__file__)), "VERSION") + with open(p) as f: + version = f.read() + version = version.strip() + if not version: + raise ValueError("could not read version") + return version + setup( name=module_name, - version="0.0.1", + version=get_version(), url='https://github.com/beelit94/python-terraform', license='BSD', author='Freddy Tan', author_email='beelit94@gmail.com', description='This is a python module provide a wrapper of terraform command line tool', long_description=__doc__, - packages=[module_name], + packages=['python_terraform'], include_package_data=True, package_data={}, zip_safe=False, diff --git a/test/test.tf b/test/test.tf index e69de29..6219dce 100644 --- a/test/test.tf +++ b/test/test.tf @@ -0,0 +1,24 @@ +variable "access_key" {} +variable "secret_key" {} + +provider "aws" { + access_key = "${var.access_key}" + secret_key = "${var.secret_key}" + region = "us-west-2" +} + +resource "aws_instance" "ubuntu-1404" { + ami = "ami-9abea4fb" + instance_type = "t2.micro" + security_groups = ["terraform-salty-splunk"] + tags { + Name = "python-terraform-test" + } +// key_name = "${aws_key_pair.key.key_name}" +// connection { +// type = "ssh" +// user = "ubuntu" +// key_file = "${var.key_path}" +// timeout = "10m" +// } +} \ No newline at end of file diff --git a/test/test_terraform.py b/test/test_terraform.py index 00c4e02..6fbdd32 100644 --- a/test/test_terraform.py +++ b/test/test_terraform.py @@ -1,20 +1,15 @@ -from terraform import Terraform +from python_terraform import Terraform class TestTerraform: - def test_apply(self): - tf = Terraform() - - tf.apply() + def test_apply_and_destory(self): + tf = Terraform() + ret_code, out, err = tf.apply() - def test_refresh(self): - tf = Terraform() + print out + print err + # assert ret_code, 0 - tf.refresh() + ret_code, out, err = tf.destroy() - def test_destroy(self): - tf = Terraform() - - tf.destroy() - - \ No newline at end of file + assert ret_code, 0