Skip to content

Commit

Permalink
First import
Browse files Browse the repository at this point in the history
  • Loading branch information
melmorabity committed Nov 6, 2018
0 parents commit 5c5f558
Show file tree
Hide file tree
Showing 14 changed files with 1,195 additions and 0 deletions.
24 changes: 24 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
repos:
- repo: https://github.com/ambv/black
rev: 18.9b0
hooks:
- id: black
args:
- --line-length=79
language_version: python3
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.0.0
hooks:
- id: check-docstring-first
- id: check-merge-conflict
- id: check-yaml
- id: end-of-file-fixer
- id: fix-encoding-pragma
- id: flake8
- id: mixed-line-ending
- id: trailing-whitespace
- repo: https://github.com/pre-commit/pre-commit
rev: v1.12.0
hooks:
- id: validate_manifest
7 changes: 7 additions & 0 deletions .pre-commit-hooks.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
- id: terraform-fmt
name: Rewrite Terraform configuration files to a canonical format and style
entry: terraform-fmt
language: python
files: (\.tf|\.tfvars)$
exclude: \.terraform\/.*$
674 changes: 674 additions & 0 deletions LICENSE

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# pre-commit-terraform-fmt

A [pre-commit](https://pre-commit.com/) hook to rewrite Terraform configuration files to a canonical format.

## Usage

`.pre-commit-config.yaml`:

```yaml
- repo: https://github.com/melmorabity/pre-commit-terraform-fmt
rev: 0.0.1
hooks:
- id: terraform-fmt
# Optional argument: path to the Terraform executable
# args: [--terraform=/usr/local/bin/terraform]
```
6 changes: 6 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[aliases]
test = pytest

[tool:pytest]
addopts = --pylint
max-line-length = 79
32 changes: 32 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""setup.py - Generic setup script."""


import setuptools


setuptools.setup(
name="pre-commit-terraform-fmt",
description="Rewrite Terraform configuration files to a canonical format"
"and style",
url="https://github.com/melmorabity/pre-commit-terraform-fmt",
version="0.0.1",
author="Mohamed El Morabity",
author_email="[email protected]",
classifiers=[
"License :: OSI Approved :: GNU General Public License v3 or later "
"(GPLv3+)",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
],
packages=setuptools.find_packages(exclude="tests"),
setup_requires=["pytest-runner"],
install_requires=['future;python_version<"3.0"'],
tests_require=["pytest", "pytest-datafiles", "pytest-pylint"],
entry_points={"console_scripts": ["terraform-fmt = terraform.fmt:main"]},
)
Empty file added terraform/__init__.py
Empty file.
63 changes: 63 additions & 0 deletions terraform/fmt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-

"""Rewrite Terraform configuration files to a canonical format and style."""


from __future__ import print_function
import argparse
import subprocess
import sys


def run(filenames, terraform=None):
"""Run 'terraform fmt' command on a set of files."""

if not terraform:
terraform = "terraform"

invalid = False
command = [
terraform,
"fmt",
"-check=false",
"-list=true",
"-diff=false",
"-write=true",
]

# terraform 'fmt' command only takes one file at a time
for path in filenames:
try:
stdout = subprocess.check_output(command + [path])
if stdout:
invalid = True
print("reformatted {}".format(path), file=sys.stderr)
except subprocess.CalledProcessError:
invalid = True
except IOError as ex:
print(ex, file=sys.stderr)
invalid = True
break

return int(invalid)


def main(argv=None):
"""Main execution path."""

parser = argparse.ArgumentParser()
parser.add_argument(
"filenames",
nargs="*",
help="Filenames pre-commit believes are changed.",
)
parser.add_argument(
"--terraform", help="Path to the Terraform executable."
)

args = parser.parse_args(argv)
return run(args.filenames, terraform=args.terraform)


if __name__ == "__main__":
exit(main())
1 change: 1 addition & 0 deletions tests/data/ko/ko_terraform.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is not a Terraform file
142 changes: 142 additions & 0 deletions tests/data/ok/formatted/ok_terraform_1.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
# Specify the provider and access details
provider "aws" {
region = "${var.aws_region}"
}

# Create a VPC to launch our instances into
resource "aws_vpc" "default" {
cidr_block = "10.0.0.0/16"
}

# Create an internet gateway to give our subnet access to the outside world
resource "aws_internet_gateway" "default" {
vpc_id = "${aws_vpc.default.id}"
}

# Grant the VPC internet access on its main route table
resource "aws_route" "internet_access" {
route_table_id = "${aws_vpc.default.main_route_table_id}"
destination_cidr_block = "0.0.0.0/0"
gateway_id = "${aws_internet_gateway.default.id}"
}

# Create a subnet to launch our instances into
resource "aws_subnet" "default" {
vpc_id = "${aws_vpc.default.id}"
cidr_block = "10.0.1.0/24"
map_public_ip_on_launch = true
}

# A security group for the ELB so it is accessible via the web
resource "aws_security_group" "elb" {
name = "terraform_example_elb"
description = "Used in the terraform"
vpc_id = "${aws_vpc.default.id}"

# HTTP access from anywhere
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}

# outbound internet access
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}

# Our default security group to access
# the instances over SSH and HTTP
resource "aws_security_group" "default" {
name = "terraform_example"
description = "Used in the terraform"
vpc_id = "${aws_vpc.default.id}"

# SSH access from anywhere
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}

# HTTP access from the VPC
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["10.0.0.0/16"]
}

# outbound internet access
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}

resource "aws_elb" "web" {
name = "terraform-example-elb"

subnets = ["${aws_subnet.default.id}"]
security_groups = ["${aws_security_group.elb.id}"]
instances = ["${aws_instance.web.id}"]

listener {
instance_port = 80
instance_protocol = "http"
lb_port = 80
lb_protocol = "http"
}
}

resource "aws_key_pair" "auth" {
key_name = "${var.key_name}"
public_key = "${file(var.public_key_path)}"
}

resource "aws_instance" "web" {
# The connection block tells our provisioner how to
# communicate with the resource (instance)
connection {
# The default username for our AMI
user = "ubuntu"

# The connection will use the local SSH agent for authentication.
}

instance_type = "t2.micro"

# Lookup the correct AMI based on the region
# we specified
ami = "${lookup(var.aws_amis, var.aws_region)}"

# The name of our SSH keypair we created above.
key_name = "${aws_key_pair.auth.id}"

# Our Security group to allow HTTP and SSH access
vpc_security_group_ids = ["${aws_security_group.default.id}"]

# We're going to launch into the same subnet as our ELB. In a production
# environment it's more common to have a separate private subnet for
# backend instances.
subnet_id = "${aws_subnet.default.id}"

# We run a remote provisioner on the instance after creating it.
# In this case, we just install nginx and start it. By default,
# this should be on port 80
provisioner "remote-exec" {
inline = [
"sudo apt-get -y update",
"sudo apt-get -y install nginx",
"sudo service nginx start",
]
}
}
3 changes: 3 additions & 0 deletions tests/data/ok/formatted/ok_terraform_2.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
output "address" {
value = "${aws_elb.web.dns_name}"
}
Loading

0 comments on commit 5c5f558

Please sign in to comment.