diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..0193e37144384f921a8e9533e96b301a7735a3ca --- /dev/null +++ b/.gitignore @@ -0,0 +1,154 @@ +.idea + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ \ No newline at end of file diff --git a/DB-templates/AWStemplateDB.tpl b/DB-templates/AWStemplateDB.tpl deleted file mode 100644 index d486f227762253b48135266290fb7904aaeb1c3b..0000000000000000000000000000000000000000 --- a/DB-templates/AWStemplateDB.tpl +++ /dev/null @@ -1,14 +0,0 @@ -resource "aws_db_instance" "{{ identifier }}" { - identifier = "{{ identifier }}" - instance_class = "{{ instance }}" - allocated_storage = {{ storage }} - engine = "{{ engine }}" - engine_version = "{{ version }}" - username = "{{ username }}" - password = {{ password }} - db_subnet_group_name = {{ subnet }} - vpc_security_group_ids = {{ security }} - parameter_group_name = {{ parameter }} - publicly_accessible = {{ accessible }} - skip_final_snapshot = {{ skip }} -} \ No newline at end of file diff --git a/DB-templates/AZUREtemplateDB.tpl b/DB-templates/AZUREtemplateDB.tpl deleted file mode 100644 index a8d4600e9f706ba8ba5eede3bbfb0887b95601e0..0000000000000000000000000000000000000000 --- a/DB-templates/AZUREtemplateDB.tpl +++ /dev/null @@ -1,15 +0,0 @@ -resource "azurerm_sql_database" "test2" { - name = "{{ name }}" - resource_group_name = "{{ group_name}}" - location = "{{ location }}" - server_name = "{{ server_name }}" - - threat_detection_policy { - state = "{{ state }}" - email_addresses = {{ email }} - retention_days = "{{ days }}" - storage_account_access_key = "{{ access_key }}" - storage_endpoint = "{{ endpoint }}" - use_server_default = "{{ default }}" - } -} \ No newline at end of file diff --git a/DB-templates/GCPtemplateDB.tpl b/DB-templates/GCPtemplateDB.tpl deleted file mode 100644 index 7d0b9786f696dcccdc77f0c0d4ea7a4844ade7e4..0000000000000000000000000000000000000000 --- a/DB-templates/GCPtemplateDB.tpl +++ /dev/null @@ -1,14 +0,0 @@ -resource "google_sql_database" "database" { - name = "{{ name }}" - instance = {{ instance }} -} - -resource "google_sql_database_instance" "instance" { - name = "{{ instance_name }}" - region = "{{ region }}" - settings { - tier = "{{ tier }}" - } - - deletion_protection = "{{ deletion_protection }}" -} \ No newline at end of file diff --git a/DB-templates/templatepostgresql.tpl b/DB-templates/templatepostgresql.tpl deleted file mode 100644 index dffff85c600669c213b080fe14cd8986a3c70479..0000000000000000000000000000000000000000 --- a/DB-templates/templatepostgresql.tpl +++ /dev/null @@ -1,8 +0,0 @@ -resource "postgresql_database" {{ name }} { - name = {{ name }} - owner = {{ owner }} - template = {{ template }} - lc_collate = {{ lc_collate }} - connection_limit = {{ connection_limit }} - allow_connections = {{ allow_connections }} -} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 3775b6c2eda7128581a767ffde794bbfa2aa05c8..e26e070e1691c7e5016e2e908a9ca332ba09a02f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,4 +5,4 @@ COPY . /opt/ RUN pip install -r requirements.txt -CMD [ "python3", "/opt/app.py"] \ No newline at end of file +CMD ["uvicorn", "app.main:fast_api", "--host", "0.0.0.0", "--port", "8080"] \ No newline at end of file diff --git a/ICG.py b/ICG.py deleted file mode 100644 index 5cc58a84121074e0944cee5f7fa8debb75d41aef..0000000000000000000000000000000000000000 --- a/ICG.py +++ /dev/null @@ -1,26 +0,0 @@ -from ansibleBuilder import * -from terraformBuilder import * -import json, sys, os - -def ICG_call(parameters): - os.system('rm -f /opt/Output-code/*') - for step in parameters["steps"]: - if step["programming_language"] == "ansible": - input_data = InputData(app_type=step["type"], code_path=step["output_path"], template_type=step["info"]["name"], template_path=step["info"]["template_path"], template_data=step["data"]) - icg = AnsibleICG() - icg.generate_code(input_data) - elif step["programming_language"] == "terraform": - input_data = step["data"] - TerraformICG(input_data) - -if __name__ == '__main__': - arg_len = len(sys.argv) - if arg_len > 1: - file_name = sys.argv[1] - else: - print("Add parameters file name") - sys.exit() - - input_file = open(file_name, "r") - parameters = json.load(input_file) - ICG_call(parameters) \ No newline at end of file diff --git a/Output-file-example/Nginx-openstack/main.tf b/Output-file-example/Nginx-openstack/main.tf deleted file mode 100644 index eb0a8e52973ae2ff74dfca924f1008dbf7d6591d..0000000000000000000000000000000000000000 --- a/Output-file-example/Nginx-openstack/main.tf +++ /dev/null @@ -1,111 +0,0 @@ -terraform { -required_version = ">= 0.14.0" - required_providers { - openstack = { - source = "terraform-provider-openstack/openstack" - version = "~> 1.35.0" - } - } -} - -# Configure the OpenStack Provider -provider "openstack" { - user_name = "admin" - tenant_name = "admin" - password = "pwd" - auth_url = "http://myauthurl:5000/v2.0" - region = "RegionOne" -} - -resource "openstack_compute_keypair_v2" "user_key" { - name = "user1" - public_key = "ssh-rsa XXXXXX" -} - -# Router creation. UUID external gateway -resource "openstack_networking_router_v2" "generic" { - name = "router-generic" - external_network_id = "f67f0d72-0ddf-11e4-9d95-e1f29f417e2f" -} - -# Network creation -resource "openstack_networking_network_v2" "generic" { - name = "ostack2" -} - -#### HTTP SUBNET #### - -# Subnet http configuration -resource "openstack_networking_subnet_v2" "nginx" { - name = "subnet-nginx" - network_id = openstack_networking_network_v2.generic.id - cidr = "16.0.0.0/24" - dns_nameservers = ["8.8.8.8", "8.8.8.4"] -} - -# Router interface configuration -resource "openstack_networking_router_interface_v2" "nginx" { - router_id = openstack_networking_router_v2.generic.id - subnet_id = openstack_networking_subnet_v2.nginx.id -} - -resource "openstack_compute_secgroup_v2" "http" { - name = "http" - description = "Open input http port" - rule { - from_port = 80 - to_port = 80 - ip_protocol = "tcp" - cidr = "0.0.0.0/0" - } -} - -resource "openstack_compute_secgroup_v2" "ssh" { - name = "ssh" - description = "Open input ssh port" - rule { - from_port = 22 - to_port = 22 - ip_protocol = "tcp" - cidr = "0.0.0.0/0" - } -} - -# -# Create instance -# -resource "openstack_compute_instance_v2" "nginx" { - name = "nginx-host" - image_name = "ubuntu-20.04.3" - flavor_name = "t2.small" - key_pair = openstack_compute_keypair_v2.user_key.name - network { - port = openstack_networking_port_v2.nginx.id - } -} - -# Create network port -resource "openstack_networking_port_v2" "nginx" { - name = "nginx" - network_id = openstack_networking_network_v2.generic.id - admin_state_up = true - security_group_ids = [ - openstack_compute_secgroup_v2.ssh.id, - openstack_compute_secgroup_v2.http.id, - ] - fixed_ip { - subnet_id = openstack_networking_subnet_v2.nginx.id - } -} - -# Create floating ip -resource "openstack_networking_floatingip_v2" "nginx" { - pool = "external-network" - fixed_ip = "16.0.0.1" -} - -# Attach floating ip to instance -resource "openstack_compute_floatingip_associate_v2" "nginx" { - floating_ip = openstack_networking_floatingip_v2.nginx.address - instance_id = openstack_compute_instance_v2.nginx.id -} \ No newline at end of file diff --git a/VM-templates/templatevm.tpl b/VM-templates/templatevm.tpl deleted file mode 100644 index 33b6b1bad4f7ed139325be1305a6e688ee27f38b..0000000000000000000000000000000000000000 --- a/VM-templates/templatevm.tpl +++ /dev/null @@ -1,16 +0,0 @@ - -data "{{ vm }}" "ami{{ id }}" { - #executable_users = {{ executable_users }} - most_recent = {{ mostrecent }} - name_regex = "{{ name_regex }}" - #owners = {{ owners }} - {{ filters }} - owners = ["099720109477"] # Canonical -} -resource "aws_instance" "instance{{ id }}" { - ami = data.aws_ami.ami{{ id }}.id - instance_type = "{{ instance_type }}" - tags = { - Name = "{{ name }}" - } -} diff --git a/__pycache__/aws.cpython-39.pyc b/__pycache__/aws.cpython-39.pyc deleted file mode 100644 index 832a1cf7c8084844fa0bd7f7307559bccc153cea..0000000000000000000000000000000000000000 Binary files a/__pycache__/aws.cpython-39.pyc and /dev/null differ diff --git a/__pycache__/terraformBuilder.cpython-39.pyc b/__pycache__/terraformBuilder.cpython-39.pyc deleted file mode 100644 index 7dbd1d0d2b16a694a8d2ecade079a9045c0dec54..0000000000000000000000000000000000000000 Binary files a/__pycache__/terraformBuilder.cpython-39.pyc and /dev/null differ diff --git a/__pycache__/terraformUtils.cpython-39.pyc b/__pycache__/terraformUtils.cpython-39.pyc deleted file mode 100644 index 256ea0ad1790954c3e118e20b1e0d4f204bc97f5..0000000000000000000000000000000000000000 Binary files a/__pycache__/terraformUtils.cpython-39.pyc and /dev/null differ diff --git a/api/InfrastructureTemplateController.py b/api/InfrastructureTemplateController.py new file mode 100644 index 0000000000000000000000000000000000000000..070602457c76c64a257f45ecbf7ea7a9ac654c50 --- /dev/null +++ b/api/InfrastructureTemplateController.py @@ -0,0 +1,40 @@ +import logging +import tarfile + +from fastapi import APIRouter, Body +from fastapi.responses import FileResponse + +from plugin import TerraformPlugin +from plugin import AnsiblePlugin + + +api_router = APIRouter() + +@api_router.post("/infrastructure/files") +def create_infrastructure_files(intermediate_representation: dict = Body(...)): + logging.info("Received intermediate representation create_infrastructure_files request") + choose_plugin(intermediate_representation) + logging.info("Creating compress folder with iac files") + output_template_folder = intermediate_representation["output_path"] + compress_file_name = "outputIaC.tar.gz" + compress_file_path = compress_file(output_template_folder, compress_file_name) + return FileResponse(compress_file_path, media_type='application/octet-stream', filename=compress_file_name) + +def choose_plugin(parameters): + # os.system('rm -f /opt/Output-code/*') + for step in parameters["steps"]: + if step["programming_language"] == "ansible": + input_data = step["data"] + AnsiblePlugin.create_files(input_data, parameters["output_path"]) + elif step["programming_language"] == "terraform": + input_data = step["data"] + TerraformPlugin.create_files(input_data, parameters["output_path"]) + +def compress_file(source_folder, dest_file_name): + # prefix_path = "/opt/" + prefix_path = "" + logging.info("Compressing folder %s into destination %s", prefix_path + source_folder, + prefix_path + dest_file_name) + with tarfile.open(prefix_path + dest_file_name, "w:gz") as tar: + tar.add(source_folder, arcname='.') + return prefix_path + dest_file_name diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app.py b/app.py deleted file mode 100644 index a500035cb562be6623a0e9c744d8ab4d58950696..0000000000000000000000000000000000000000 --- a/app.py +++ /dev/null @@ -1,26 +0,0 @@ -from ICG import * -from flask import Flask, request, send_file -import tarfile -import os.path - -def create_app(test_config=None): - app = Flask(__name__) - - app.config["CLIENT_IMAGES"] = "/opt" - - @app.post("/") - def ICG(): - if request.is_json: - parameters = request.get_json() - ICG_call(parameters) - with tarfile.open("/opt/outputIaC.tar.gz", "w:gz") as tar: - tar.add("/opt/Output-code", arcname=os.path.basename("/opt/Output-code")) - file_name = "/opt/outputIaC.tar.gz" - return send_file(file_name, attachment_filename='outputIaC.tar.gz'), 201 - return {"error": "Request must be JSON"}, 415 - return app - -APP = create_app() - -if __name__ == '__main__': - APP.run(host='0.0.0.0', port=5000, debug=True) \ No newline at end of file diff --git a/aws.py b/aws.py deleted file mode 100644 index 85c01dc55b8d943803326154288daeddfc6fed84..0000000000000000000000000000000000000000 --- a/aws.py +++ /dev/null @@ -1,163 +0,0 @@ -def vmcatalog1 (vcpu, gib, sigla): - vcpu = str(vcpu) - gib = str(gib) - if sigla == "mac" and vcpu=='12' and gib=='32': - return "mac1.metal" - elif sigla == "t2": - if vcpu == '1': - if gib == '0.5': - return "t2.nano" - elif gib == '1': - return "t2.micro" - elif gib == '2': - return "t2.small" - elif vcpu == '2': - if gib == '4': - return "t2.medium" - elif gib == '8': - return "t2.large" - elif vcpu == '4' and gib == '16': - return "t2.xlarge" - elif vcpu == '8' and gib == '32': - return "t2.2xlarge" - elif sigla == "m6g" or sigla == "m6gd": - if vcpu == '1' and gib == '4': - return sigla+".medium" - if vcpu == '2' and gib == '8': - return sigla+".large" - if vcpu == '4' and gib == '16': - return sigla+".xlarge" - if vcpu == '8' and gib == '32': - return sigla+".2xlarge" - if vcpu == '16' and gib == '64': - return sigla+".4xlarge" - if vcpu == '32' and gib == '128': - return sigla+".8xlarge" - if vcpu == '48' and gib == '192': - return sigla+".12xlarge" - if vcpu == '64' and gib == '256': - return sigla+".16xlarge" - elif "m5" in sigla or sigla == "m4": - if vcpu == '2' and gib == '8': - return sigla+".large" - if vcpu == '4' and gib == '16': - return sigla+".xlarge" - if vcpu == '8' and gib == '32': - return sigla+".2xlarge" - if vcpu == '16' and gib == '64': - return sigla+".4xlarge" - if vcpu == '32' and gib == '128': - return sigla+".8xlarge" - if vcpu == '48' and gib == '192': - return sigla+".12xlarge" - if vcpu == '64' and gib == '256': - return sigla+".16xlarge" - if vcpu == '96' and gib == '384': - return sigla+".24xlarge" - elif sigla == "a1": - if vcpu == '1' and gib == '2': - return "a1.media" - if vcpu == '2' and gib == '4': - return "a1.large" - if vcpu == '4' and gib == '8': - return "a1.xlarge" - if vcpu == '8' and gib == '16': - return "a1.2xlarge" - if vcpu == '16' and gib == '32': - return "a1.4xlarge" - elif vcpu=='2': - if gib == '0.5': - return sigla+".nano" - elif gib == '1': - return sigla+".micro" - elif gib == '2': - return sigla+".small" - elif gib == '4': - return sigla+".medium" - elif gib == '8': - return sigla+".large" - elif vcpu == '4' and gib == '16': - return sigla+".xlarge" - elif vcpu == '8' and gib == '32': - return sigla+".2xlarge" - return "t3.micro" - -def vmcatalog (vcpu, gib): - vcpu = str(vcpu) - gib = str(gib) - if vcpu=='12' and gib=='32': - return "mac1.metal" - if vcpu == '1': - if gib == '0.5': - return "t2.nano" - if gib == '1': - return "t2.micro" - if gib == '2': - return "t2.small" - if vcpu == '2': - if gib == '4': - return "t2.medium" - if gib == '8': - return "t2.large" - if vcpu == '4' and gib == '16': - return "t2.xlarge" - if vcpu == '8' and gib == '32': - return "t2.2xlarge" - if vcpu == '1' and gib == '4': - return "m6g.medium" - if vcpu == '2' and gib == '8': - return "m6g.large" - if vcpu == '4' and gib == '16': - return "m6g.xlarge" - if vcpu == '8' and gib == '32': - return "m6g.2xlarge" - if vcpu == '16' and gib == '64': - return "m6g.4xlarge" - if vcpu == '32' and gib == '128': - return "m6g.8xlarge" - if vcpu == '48' and gib == '192': - return "m6g.12xlarge" - if vcpu == '64' and gib == '256': - return "m6g.16xlarge" - if vcpu == '2' and gib == '8': - return "m4.large" - if vcpu == '4' and gib == '16': - return "m4.xlarge" - if vcpu == '8' and gib == '32': - return "m4.2xlarge" - if vcpu == '16' and gib == '64': - return "m4.4xlarge" - if vcpu == '32' and gib == '128': - return "m4.8xlarge" - if vcpu == '48' and gib == '192': - return "m4.12xlarge" - if vcpu == '64' and gib == '256': - return "m4.16xlarge" - if vcpu == '96' and gib == '384': - return "m4.24xlarge" - if vcpu == '1' and gib == '2': - return "a1.media" - if vcpu == '2' and gib == '4': - return "a1.large" - if vcpu == '4' and gib == '8': - return "a1.xlarge" - if vcpu == '8' and gib == '16': - return "a1.2xlarge" - if vcpu == '16' and gib == '32': - return "a1.4xlarge" - if vcpu=='2': - if gib == '0.5': - return "t3.nano" - if gib == '1': - return "t3.micro" - if gib == '2': - return "t3.small" - if gib == '4': - return "t3.medium" - if gib == '8': - return "t3.large" - if vcpu == '4' and gib == '16': - return "t3.xlarge" - if vcpu == '8' and gib == '32': - return "t3.2xlarge" - return "t2.micro" diff --git a/azure.py b/azure.py deleted file mode 100644 index 2f1a93301bf19f987857e2634b5fc500244064d9..0000000000000000000000000000000000000000 --- a/azure.py +++ /dev/null @@ -1 +0,0 @@ -# Azure specific functionalities \ No newline at end of file diff --git a/gcp.py b/gcp.py deleted file mode 100644 index 9b404661ab0e32337f1b52471aa03ca0dd4d2039..0000000000000000000000000000000000000000 --- a/gcp.py +++ /dev/null @@ -1 +0,0 @@ -# Google Clud Platform specific functionalities \ No newline at end of file diff --git a/input_file_example/nginx/parameter.json b/input_file_example/nginx/parameter.json new file mode 100644 index 0000000000000000000000000000000000000000..87c35d855ceb8315ed17d9f057d6fadb30d5e43b --- /dev/null +++ b/input_file_example/nginx/parameter.json @@ -0,0 +1,55 @@ +{ + "output_path": "output_file_example/nginx_openstack/", + "steps": [ + { + "programming_language": "terraform", + "data": { + "provider": "openstack", + "vm": [{ + "name": "nginx-host", + "flavor": "small", + "vm_security_groups": "default", + "ssh_user": "ubuntu", + "ssh_key_file": "/home/user1/.ssh/openstack.key", + "address": "16.0.0.1", + "image": "ubuntu-20.04.3", + "network_name": "ostack2" + }], + "net": [{ + "name": "ostack2", + "address": "16.0.0.0/24", + "protocol": "tcp/ip", + "rules_name": ["rule_1", "rule_2"] + }], + "sg": [{ + "name": "rule_1", + "from_port": 80, + "to_port": 80, + "ip_protocol": "tcp", + "ipv6_cidr_blocks": "0.0.0.0/0" + }, { + "name": "rule_2", + "from_port": 22, + "to_port": 22, + "ip_protocol": "tcp", + "ipv6_cidr_blocks": "0.0.0.0/0" + }] + } + }, + { + "programming_language": "ansible", + "data": { + "operating_system": "ubuntu", + "nginx": { + "ssh_user": "ubuntu", + "ssh_key_file": "/home/user1/.ssh/openstack.key", + "address": "16.0.0.1", + "source_code": [ + "/var/www/html/index.html", + "/usr/share/nginx/html/index.html" + ] + } + } + } + ] +} \ No newline at end of file diff --git a/Input-file-examples/parametri.JSON b/input_file_example/parametri.JSON similarity index 100% rename from Input-file-examples/parametri.JSON rename to input_file_example/parametri.JSON diff --git a/Input-file-examples/parametri.txt b/input_file_example/parametri.txt similarity index 100% rename from Input-file-examples/parametri.txt rename to input_file_example/parametri.txt diff --git a/Input-file-examples/parametriaz.JSON b/input_file_example/parametriaz.JSON similarity index 100% rename from Input-file-examples/parametriaz.JSON rename to input_file_example/parametriaz.JSON diff --git a/Input-file-examples/parametriaz.txt b/input_file_example/parametriaz.txt similarity index 100% rename from Input-file-examples/parametriaz.txt rename to input_file_example/parametriaz.txt diff --git a/Input-file-examples/parametrig.JSON b/input_file_example/parametrig.JSON similarity index 100% rename from Input-file-examples/parametrig.JSON rename to input_file_example/parametrig.JSON diff --git a/Input-file-examples/parametrig.txt b/input_file_example/parametrig.txt similarity index 100% rename from Input-file-examples/parametrig.txt rename to input_file_example/parametrig.txt diff --git a/Input-file-examples/properties.JSON b/input_file_example/properties.JSON similarity index 100% rename from Input-file-examples/properties.JSON rename to input_file_example/properties.JSON diff --git a/Input-file-examples/properties.yaml b/input_file_example/properties.yaml similarity index 100% rename from Input-file-examples/properties.yaml rename to input_file_example/properties.yaml diff --git a/Input-file-examples/propertiesaz.yaml b/input_file_example/propertiesaz.yaml similarity index 100% rename from Input-file-examples/propertiesaz.yaml rename to input_file_example/propertiesaz.yaml diff --git a/Input-file-examples/propertiesg.yaml b/input_file_example/propertiesg.yaml similarity index 100% rename from Input-file-examples/propertiesg.yaml rename to input_file_example/propertiesg.yaml diff --git a/Input-file-examples/toscainput.yaml b/input_file_example/toscainput.yaml similarity index 100% rename from Input-file-examples/toscainput.yaml rename to input_file_example/toscainput.yaml diff --git a/parameters.json b/input_file_example/wordpress/parameters.json similarity index 100% rename from parameters.json rename to input_file_example/wordpress/parameters.json diff --git a/main.py b/main.py new file mode 100644 index 0000000000000000000000000000000000000000..960b240d75c7416f94feaf85efda25b249f1691c --- /dev/null +++ b/main.py @@ -0,0 +1,16 @@ +import json +import logging +from fastapi import FastAPI + +import api.InfrastructureTemplateController +from api import InfrastructureTemplateController + +fast_api = FastAPI() + +fast_api.include_router(api.InfrastructureTemplateController.api_router) +logging.getLogger().setLevel(logging.INFO) + +if __name__ == '__main__': + parameters_file = open("input_file_example/nginx/parameter.json") + parameters_file = json.load(parameters_file) + InfrastructureTemplateController.choose_plugin(parameters_file) diff --git a/output_file_example/nginx_openstack/ansible/nginx.play b/output_file_example/nginx_openstack/ansible/nginx.play new file mode 100644 index 0000000000000000000000000000000000000000..c8790e19071787ba9fef7d270947c8ec6f09048d --- /dev/null +++ b/output_file_example/nginx_openstack/ansible/nginx.play @@ -0,0 +1,45 @@ +--- +- hosts: 16.0.0.1 + gather_facts: no + become: yes + vars: + ansible_ssh_private_key_file: "/home/user1/.ssh/openstack.key" + ansible_ssh_user: "ubuntu" + tasks: + - name: Update repositories + apt: + update_cache: yes + + - name: Install nginx + package: + name: nginx + + - name: Start nginx + service: + name: nginx + enabled: yes + state: started + + - name: Set attributes + set_stats: + data: + site_config_dir: /etc/nginx/conf.d + + - name: Install sample site + copy: + dest: "" + content: | + <!doctype html> + <html lang="en"> + <head> + <title>Hello World!</title> + </head> + <body> + <h1>Sample web page</h1> + <p>With little content ;)</p> + </body> + </html> + with_items: + - /var/www/html/index.html + - /usr/share/nginx/html/index.html + diff --git a/output_file_example/nginx_openstack/terraform/main.tf b/output_file_example/nginx_openstack/terraform/main.tf new file mode 100644 index 0000000000000000000000000000000000000000..a91ec88b9008734246ae07cb869fd23ad8b910f4 --- /dev/null +++ b/output_file_example/nginx_openstack/terraform/main.tf @@ -0,0 +1,101 @@ +terraform { +required_version = ">= 0.14.0" + required_providers { + openstack = { + source = "terraform-provider-openstack/openstack" + version = "~> 1.35.0" + } + } +} + +# Configure the OpenStack Provider +provider "openstack" { + user_name = "admin" + tenant_name = "test" + password = "wRpuXgVqBzQqGwx8Bu0sylEeb8FgjSYG" + auth_url = "https://127.0.0.1:5000/v3" + insecure = true +} +# Create virtual machine +resource "openstack_compute_instance_v2" "nginx-host" { + name = "nginx-host" + image_name = "ubuntu-20.04.3" + flavor_name = "small" + key_pair = openstack_compute_keypair_v2.nginx-host_ssh_key.name + network { + port = openstack_networking_port_v2.ostack2.id + } +} + +# Create ssh keys +resource "openstack_compute_keypair_v2" "nginx-host_ssh_key" { + name = "ubuntu" + public_key = "/home/user1/.ssh/openstack.key" +} + +# Create floating ip +resource "openstack_networking_floatingip_v2" "nginx-host_floating_ip" { + pool = "external" + # fixed_ip = "16.0.0.1" +} + +# Attach floating ip to instance +resource "openstack_compute_floatingip_associate_v2" "nginx-host_floating_ip_association" { + floating_ip = openstack_networking_floatingip_v2.nginx-host_floating_ip.address + instance_id = openstack_compute_instance_v2.nginx-host.id +} + +## Network + +# Create Network +resource "openstack_networking_network_v2" "ostack2" { + name = "ostack2" +} + +# Create Subnet +resource "openstack_networking_subnet_v2" "ostack2_subnet" { + name = "ostack2_subnet" + network_id = openstack_networking_network_v2.ostack2.id + cidr = "16.0.0.0/24" + dns_nameservers = ["8.8.8.8", "8.8.8.4"] +} + +# Attach networking port +resource "openstack_networking_port_v2" "ostack2" { + name = "ostack2" + network_id = openstack_networking_network_v2.ostack2.id + admin_state_up = true + security_group_ids = [ + + openstack_compute_secgroup_v2.rule_1_secgroup.id, + + openstack_compute_secgroup_v2.rule_2_secgroup.id, + + ] + fixed_ip { + subnet_id = openstack_networking_subnet_v2.ostack2_subnet.id + } +} + +resource "openstack_compute_secgroup_v2" "rule_1_secgroup" { + name = "rule_1" + description = "Security group rule for port 80-80" + rule { + from_port = 80 + to_port = 80 + ip_protocol = "tcp" + cidr = "0.0.0.0/0" + } +} + +resource "openstack_compute_secgroup_v2" "rule_2_secgroup" { + name = "rule_2" + description = "Security group rule for port 22-22" + rule { + from_port = 22 + to_port = 22 + ip_protocol = "tcp" + cidr = "0.0.0.0/0" + } +} + diff --git a/Output-file-example/Wordpress-azure/Ansible/ansible.cfg b/output_file_example/wordpress_azure/ansible/ansible.cfg similarity index 100% rename from Output-file-example/Wordpress-azure/Ansible/ansible.cfg rename to output_file_example/wordpress_azure/ansible/ansible.cfg diff --git a/Output-file-example/Wordpress-azure/Ansible/docker-play.yml b/output_file_example/wordpress_azure/ansible/docker-play.yml similarity index 100% rename from Output-file-example/Wordpress-azure/Ansible/docker-play.yml rename to output_file_example/wordpress_azure/ansible/docker-play.yml diff --git a/Output-file-example/Wordpress-azure/Ansible/hosts.ini b/output_file_example/wordpress_azure/ansible/hosts.ini similarity index 100% rename from Output-file-example/Wordpress-azure/Ansible/hosts.ini rename to output_file_example/wordpress_azure/ansible/hosts.ini diff --git a/Output-file-example/Wordpress-azure/Ansible/mysql-play.yml b/output_file_example/wordpress_azure/ansible/mysql-play.yml similarity index 100% rename from Output-file-example/Wordpress-azure/Ansible/mysql-play.yml rename to output_file_example/wordpress_azure/ansible/mysql-play.yml diff --git a/Output-file-example/Wordpress-azure/Ansible/vars.yml b/output_file_example/wordpress_azure/ansible/vars.yml similarity index 100% rename from Output-file-example/Wordpress-azure/Ansible/vars.yml rename to output_file_example/wordpress_azure/ansible/vars.yml diff --git a/Output-file-example/Wordpress-azure/Ansible/vars2.yml b/output_file_example/wordpress_azure/ansible/vars2.yml similarity index 100% rename from Output-file-example/Wordpress-azure/Ansible/vars2.yml rename to output_file_example/wordpress_azure/ansible/vars2.yml diff --git a/Output-file-example/Wordpress-azure/Terraform/.terraform.lock.hcl b/output_file_example/wordpress_azure/terraform/.terraform.lock.hcl similarity index 100% rename from Output-file-example/Wordpress-azure/Terraform/.terraform.lock.hcl rename to output_file_example/wordpress_azure/terraform/.terraform.lock.hcl diff --git a/Output-file-example/Wordpress-azure/Terraform/README.md b/output_file_example/wordpress_azure/terraform/README.md similarity index 100% rename from Output-file-example/Wordpress-azure/Terraform/README.md rename to output_file_example/wordpress_azure/terraform/README.md diff --git a/Output-file-example/Wordpress-azure/Terraform/main.tf b/output_file_example/wordpress_azure/terraform/main.tf similarity index 100% rename from Output-file-example/Wordpress-azure/Terraform/main.tf rename to output_file_example/wordpress_azure/terraform/main.tf diff --git a/Output-file-example/Wordpress-azure/Terraform/output.tf b/output_file_example/wordpress_azure/terraform/output.tf similarity index 100% rename from Output-file-example/Wordpress-azure/Terraform/output.tf rename to output_file_example/wordpress_azure/terraform/output.tf diff --git a/Output-file-example/Wordpress-azure/Terraform/ssh_keys/wordpress_rsa b/output_file_example/wordpress_azure/terraform/ssh_keys/wordpress_rsa similarity index 100% rename from Output-file-example/Wordpress-azure/Terraform/ssh_keys/wordpress_rsa rename to output_file_example/wordpress_azure/terraform/ssh_keys/wordpress_rsa diff --git a/Output-file-example/Wordpress-azure/Terraform/ssh_keys/wordpress_rsa.pub b/output_file_example/wordpress_azure/terraform/ssh_keys/wordpress_rsa.pub similarity index 100% rename from Output-file-example/Wordpress-azure/Terraform/ssh_keys/wordpress_rsa.pub rename to output_file_example/wordpress_azure/terraform/ssh_keys/wordpress_rsa.pub diff --git a/Output-file-example/Wordpress-azure/Terraform/terraform.tfstate b/output_file_example/wordpress_azure/terraform/terraform.tfstate similarity index 100% rename from Output-file-example/Wordpress-azure/Terraform/terraform.tfstate rename to output_file_example/wordpress_azure/terraform/terraform.tfstate diff --git a/Output-file-example/Wordpress-azure/Terraform/terraform.tfstate.backup b/output_file_example/wordpress_azure/terraform/terraform.tfstate.backup similarity index 100% rename from Output-file-example/Wordpress-azure/Terraform/terraform.tfstate.backup rename to output_file_example/wordpress_azure/terraform/terraform.tfstate.backup diff --git a/Output-file-example/Wordpress-azure/Terraform/variables.tf b/output_file_example/wordpress_azure/terraform/variables.tf similarity index 100% rename from Output-file-example/Wordpress-azure/Terraform/variables.tf rename to output_file_example/wordpress_azure/terraform/variables.tf diff --git a/plugin/AnsiblePlugin.py b/plugin/AnsiblePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..0065bdfe972146f3b563f696eede6cddb2ad0fd7 --- /dev/null +++ b/plugin/AnsiblePlugin.py @@ -0,0 +1,20 @@ +import logging +from plugin import TemplateUtils + + +def create_files(parameters, output_path): + language = "ansible" + operating_system = parameters["operating_system"] + resources = parameters.keys() + for resource_name in resources: + logging.info("Creating template for resource '%s'", resource_name) + template_path = TemplateUtils.find_template_path(language, operating_system, resource_name) + if template_path: + #for resource_params in parameters[resource_name]: + resource_params = parameters[resource_name] + output_file_path = output_path + "/".join([language, resource_name]) + ".play" + template = TemplateUtils.read_template(template_path) + template_filled = TemplateUtils.edit_template(template, resource_params) + TemplateUtils.write_template(template_filled, output_file_path) + logging.info("File available at: {}".format(output_path)) + diff --git a/plugin/TemplateUtils.py b/plugin/TemplateUtils.py new file mode 100644 index 0000000000000000000000000000000000000000..c90ff5d0585e75e07aae53b2c4deb0723535510b --- /dev/null +++ b/plugin/TemplateUtils.py @@ -0,0 +1,41 @@ +import configparser +import logging +import jinja2 +from jinja2 import Template + + +def find_template_path(iac_language, key, resource_name): + try: + properties_reader = configparser.ConfigParser() + properties_reader.read("template-location.properties") + template_path = properties_reader.get(iac_language + "." + key, resource_name) + logging.info("Chosen template at: '%s'", template_path) + return template_path + except configparser.NoOptionError as error: + logging.warning("%s. Please check properties file", error) + pass + + +def edit_template(template, parameters: dict): + logging.info("Starting editing template") + render = template.render(parameters) + template_with_custom_params = ""+render+"\n" + return template_with_custom_params + + +def read_template(template_path): + logging.info("Reading template at: '%s'", template_path) + try: + template = Template(open(template_path, "r").read()) + return template + except jinja2.exceptions.TemplateSyntaxError as exc: + # TODO or error? + logging.warning('Syntax error on template %s, %s', template_path, exc) + pass + + +def write_template(template, output_path_file): + file = open(output_path_file, "w+") + file.write(template) + logging.info("Writing file at: '%s'", output_path_file) + file.close() diff --git a/plugin/TerraformPlugin.py b/plugin/TerraformPlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..4ca1617aa3bef8490cc777652ef3d0b73efb1825 --- /dev/null +++ b/plugin/TerraformPlugin.py @@ -0,0 +1,28 @@ +import logging +from plugin import TemplateUtils + + +def create_files(parameters, output_path): + language = "terraform" + provider = parameters["provider"] + resources = parameters.keys() + terraform_file = create_init_file(language, provider) + for resource_name in resources: + logging.info("Creating template for resource '%s'", resource_name) + template_path = TemplateUtils.find_template_path(language, provider, resource_name) + if template_path: + for resource_params in parameters[resource_name]: + template = TemplateUtils.read_template(template_path) + # resource = parameters[resource_name] + template_filled = TemplateUtils.edit_template(template, resource_params) + terraform_file = terraform_file + template_filled + "\n" + output_file_path = output_path + "/".join([language, "main.tf"]) + TemplateUtils.write_template(terraform_file, output_file_path) + logging.info("File available at: {}".format(output_path)) + + +def create_init_file(language, provider): + logging.info("Creating init %s file for provider %s", language, provider) + template_path = TemplateUtils.find_template_path(language, provider, "init") + template = TemplateUtils.read_template(template_path) + return template.render() + "\n" diff --git a/plugin/__init__.py b/plugin/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/requirements.txt b/requirements.txt index 24019da8be99b95f5956e27c981f972e57ed0dd9..7c2d192a2b22eaeb9d5db09f79ba33c25adfb8a8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ Jinja2==3.0.3 flask==2.0.2 -PyYAML==6.0 \ No newline at end of file +PyYAML==6.0 +fastapi~=0.74.1 +uvicorn=0.17.5 \ No newline at end of file diff --git a/template-location.properties b/template-location.properties new file mode 100644 index 0000000000000000000000000000000000000000..eb216af71be4ada502569c9a5c0a13652a9dd57e --- /dev/null +++ b/template-location.properties @@ -0,0 +1,8 @@ +[terraform.openstack] +init = templates/terraform/open_stack/init.tpl +vm = templates/terraform/open_stack/virtual_machine.tpl +net = templates/terraform/open_stack/network.tpl +sg = templates/terraform/open_stack/port_rule.tpl + +[ansible.ubuntu] +nginx = templates/ansible/ubuntu/nginx.tpl \ No newline at end of file diff --git a/Databases-templates/mysql-play.tpl b/templates/ansible/Databases-templates/mysql-play.tpl similarity index 100% rename from Databases-templates/mysql-play.tpl rename to templates/ansible/Databases-templates/mysql-play.tpl diff --git a/Databases-templates/mysql-vars.tpl b/templates/ansible/Databases-templates/mysql-vars.tpl similarity index 100% rename from Databases-templates/mysql-vars.tpl rename to templates/ansible/Databases-templates/mysql-vars.tpl diff --git a/Databases-templates/postgres-play.tpl b/templates/ansible/Databases-templates/postgres-play.tpl similarity index 100% rename from Databases-templates/postgres-play.tpl rename to templates/ansible/Databases-templates/postgres-play.tpl diff --git a/Databases-templates/postgres-vars.tpl b/templates/ansible/Databases-templates/postgres-vars.tpl similarity index 100% rename from Databases-templates/postgres-vars.tpl rename to templates/ansible/Databases-templates/postgres-vars.tpl diff --git a/Docker-services-templates/wordpress-play.tpl b/templates/ansible/Docker-services-templates/wordpress-play.tpl similarity index 100% rename from Docker-services-templates/wordpress-play.tpl rename to templates/ansible/Docker-services-templates/wordpress-play.tpl diff --git a/Docker-services-templates/wordpress-vars.tpl b/templates/ansible/Docker-services-templates/wordpress-vars.tpl similarity index 100% rename from Docker-services-templates/wordpress-vars.tpl rename to templates/ansible/Docker-services-templates/wordpress-vars.tpl diff --git a/templates/ansible/ubuntu/nginx.tpl b/templates/ansible/ubuntu/nginx.tpl new file mode 100644 index 0000000000000000000000000000000000000000..05b342b22af18c9be8c3038b3eb084a10a1f37f9 --- /dev/null +++ b/templates/ansible/ubuntu/nginx.tpl @@ -0,0 +1,45 @@ +--- +- hosts: {{ address }} + gather_facts: no + become: yes + vars: + ansible_ssh_private_key_file: "{{ ssh_key_file }}" + ansible_ssh_user: "{{ ssh_user }}" + tasks: + - name: Update repositories + apt: + update_cache: yes + + - name: Install nginx + package: + name: nginx + + - name: Start nginx + service: + name: nginx + enabled: yes + state: started + + - name: Set attributes + set_stats: + data: + site_config_dir: /etc/nginx/conf.d + + - name: Install sample site + copy: + dest: "{{ item }}" + content: | + <!doctype html> + <html lang="en"> + <head> + <title>Hello World!</title> + </head> + <body> + <h1>Sample web page</h1> + <p>With little content ;)</p> + </body> + </html> + with_items: + - /var/www/html/index.html + - /usr/share/nginx/html/index.html + diff --git a/Network-templates/AWStemplateNetwork.tpl b/templates/terraform/aws/network.tpl similarity index 100% rename from Network-templates/AWStemplateNetwork.tpl rename to templates/terraform/aws/network.tpl diff --git a/VM-templates/AWStemplateVM.tpl b/templates/terraform/aws/vm.tpl similarity index 99% rename from VM-templates/AWStemplateVM.tpl rename to templates/terraform/aws/vm.tpl index 33b6b1bad4f7ed139325be1305a6e688ee27f38b..41ec39aee04aea340dc8183dd21bea2ba39140b1 100644 --- a/VM-templates/AWStemplateVM.tpl +++ b/templates/terraform/aws/vm.tpl @@ -1,4 +1,3 @@ - data "{{ vm }}" "ami{{ id }}" { #executable_users = {{ executable_users }} most_recent = {{ mostrecent }} diff --git a/Network-templates/AZUREtemplateNetwork.tpl b/templates/terraform/azure/network.tpl similarity index 100% rename from Network-templates/AZUREtemplateNetwork.tpl rename to templates/terraform/azure/network.tpl diff --git a/VM-templates/AZUREtemplateVM.tpl b/templates/terraform/azure/vm.tpl similarity index 100% rename from VM-templates/AZUREtemplateVM.tpl rename to templates/terraform/azure/vm.tpl diff --git a/Network-templates/GCPtemplateNetwork.tpl b/templates/terraform/google_cloud/network.tpl similarity index 100% rename from Network-templates/GCPtemplateNetwork.tpl rename to templates/terraform/google_cloud/network.tpl diff --git a/VM-templates/GCPtemplateVM.tpl b/templates/terraform/google_cloud/vm.tpl similarity index 100% rename from VM-templates/GCPtemplateVM.tpl rename to templates/terraform/google_cloud/vm.tpl diff --git a/templates/terraform/open_stack/init.tpl b/templates/terraform/open_stack/init.tpl new file mode 100644 index 0000000000000000000000000000000000000000..5f82e604a15a79340f5b02ece7c76dcd33cd24bf --- /dev/null +++ b/templates/terraform/open_stack/init.tpl @@ -0,0 +1,18 @@ +terraform { +required_version = ">= 0.14.0" + required_providers { + openstack = { + source = "terraform-provider-openstack/openstack" + version = "~> 1.35.0" + } + } +} + +# Configure the OpenStack Provider +provider "openstack" { + user_name = "admin" + tenant_name = "test" + password = "wRpuXgVqBzQqGwx8Bu0sylEeb8FgjSYG" + auth_url = "https://127.0.0.1:5000/v3" + insecure = true +} \ No newline at end of file diff --git a/templates/terraform/open_stack/network.tpl b/templates/terraform/open_stack/network.tpl new file mode 100644 index 0000000000000000000000000000000000000000..938cc0df9ef6151307ef7039d659282810d5e6da --- /dev/null +++ b/templates/terraform/open_stack/network.tpl @@ -0,0 +1,29 @@ +## Network + +# Create Network +resource "openstack_networking_network_v2" "{{ name }}" { + name = "{{ name }}" +} + +# Create Subnet +resource "openstack_networking_subnet_v2" "{{ name ~ "_subnet" }}" { + name = "{{ name ~ "_subnet" }}" + network_id = openstack_networking_network_v2.{{ name }}.id + cidr = "{{ address }}" + dns_nameservers = ["8.8.8.8", "8.8.8.4"] +} + +# Attach networking port +resource "openstack_networking_port_v2" "{{ name }}" { + name = "{{ name }}" + network_id = openstack_networking_network_v2.{{ name }}.id + admin_state_up = true + security_group_ids = [ + {% for rule_name in rules_name %} + openstack_compute_secgroup_v2.{{ rule_name ~ "_secgroup" }}.id, + {% endfor %} + ] + fixed_ip { + subnet_id = openstack_networking_subnet_v2.{{ name ~ "_subnet" }}.id + } +} \ No newline at end of file diff --git a/templates/terraform/open_stack/port_rule.tpl b/templates/terraform/open_stack/port_rule.tpl new file mode 100644 index 0000000000000000000000000000000000000000..bb02290dc13e1c50e576213fb64fbdd318b4ca70 --- /dev/null +++ b/templates/terraform/open_stack/port_rule.tpl @@ -0,0 +1,10 @@ +resource "openstack_compute_secgroup_v2" "{{ name ~ "_secgroup" }}" { + name = "{{ name }}" + description = "Security group rule for port {{ from_port }}-{{ to_port }}" + rule { + from_port = {{ from_port }} + to_port = {{ to_port }} + ip_protocol = "{{ ip_protocol }}" + cidr = "{{ ipv6_cidr_blocks }}" + } +} \ No newline at end of file diff --git a/templates/terraform/open_stack/virtual_machine.tpl b/templates/terraform/open_stack/virtual_machine.tpl new file mode 100644 index 0000000000000000000000000000000000000000..50b203c2ab9ddbc822eafb7f36b5dd5ae874109a --- /dev/null +++ b/templates/terraform/open_stack/virtual_machine.tpl @@ -0,0 +1,28 @@ +# Create virtual machine +resource "openstack_compute_instance_v2" "{{ name }}" { + name = "{{ name }}" + image_name = "{{ image }}" + flavor_name = "{{ flavor }}" + key_pair = openstack_compute_keypair_v2.{{ name ~ "_ssh_key" }}.name + network { + port = openstack_networking_port_v2.{{ network_name }}.id + } +} + +# Create ssh keys +resource "openstack_compute_keypair_v2" "{{ name ~ "_ssh_key" }}" { + name = "{{ ssh_user }}" + public_key = "{{ ssh_key_file }}" +} + +# Create floating ip +resource "openstack_networking_floatingip_v2" "{{name ~ "_floating_ip"}}" { + pool = "external" + # fixed_ip = "{{ address }}" +} + +# Attach floating ip to instance +resource "openstack_compute_floatingip_associate_v2" "{{ name ~ "_floating_ip_association" }}" { + floating_ip = openstack_networking_floatingip_v2.{{ name ~ "_floating_ip" }}.address + instance_id = openstack_compute_instance_v2.{{ name }}.id +} diff --git a/terraformBuilder.py b/terraformBuilder.py deleted file mode 100644 index 9f768fae100eb70faa056dbc153c198d8304b73f..0000000000000000000000000000000000000000 --- a/terraformBuilder.py +++ /dev/null @@ -1,27 +0,0 @@ -import json -import yaml -from terraformUtils import * -import sys - - -def TerraformICG(parameters): - if 'vm' in parameters: - if (parameters['provider']=='aws'): - if 'vm' in parameters: - awsvm(parameters['vm']) - if 'network' in parameters: - networkaws(parameters['network']) - if 'db' in parameters: - awsdb(parameters['db']) - elif (parameters['provider']=='gcp'): - gcpvm(parameters['vm']) - if 'network' in parameters: - networkg(parameters['network']) - if 'db' in parameters: - googlesql(parameters['db']) - elif (parameters['provider']=='azure'): - azurevm(parameters['vm']) - if 'network' in parameters: - networkaz(parameters['network']) - if 'db' in parameters: - azuredb(parameters['db']) \ No newline at end of file diff --git a/terraformUtils.py b/terraformUtils.py deleted file mode 100644 index 0420f110af2eda1b8d9dd31359cba6132df0e98b..0000000000000000000000000000000000000000 --- a/terraformUtils.py +++ /dev/null @@ -1,284 +0,0 @@ -from jinja2 import Template, Environment, FileSystemLoader -import re -from aws import * - -def awsvm(parametri): - finalString = "" - jinjaTemplate = Template(open("VM-templates/AWStemplateVM.tpl", "r").read()) - for parameter in parametri: - my_dict = {'vm':'aws_ami', - 'id': '1', - 'id': 'vm1', - 'os': 'ubuntu', - 'executable_users':["self"], - 'mostrecent': 'true', - 'name_regex': "^myami-\\d{3}", - 'owners': ["self"], - 'type':None, - 'cpu':'2', - 'ram':'2', - 'filter': [{'name': 'name', 'values':["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]}, - {'name': 'virtualization-type', 'values': ["hvm"]}] - } - if 'vm' in parameter: - my_dict['vm'] = parameter['vm'] - if 'id' in parameter: - my_dict['id'] = parameter['id'] - if 'name' in parameter: - my_dict['name'] = parameter['name'] - if 'os' in parameter: - my_dict['name_regex'] = parameter['os']+"*" - if 'executable_users'in parameter: - my_dict['executable_users'] = parameter['executable_users'] - if 'mostrecent' in parameter: - my_dict['mostrecent'] = parameter['mostrecent'] - if 'name_regex' in parameter: - my_dict['name_regex'] = parameter['name_regex'] - if 'owners' in parameter: - my_dict['owners'] = parameter['owners'] - if 'filter' in parameter: - my_dict['filter'] = parametri['filter'] - if 'cpu' in parameter: - my_dict['cpu'] = parameter['cpu'] - if 'ram' in parameter: - my_dict['ram'] = parameter['ram'] - if 'type' in parameter: - my_dict['type'] = parameter['type'] - my_dict['instance_type'] = vmcatalog1(my_dict['cpu'], my_dict['ram'], my_dict['sigla']) - if my_dict['type'] is None: - my_dict['instance_type'] = vmcatalog(my_dict['cpu'], my_dict['ram']) - if 'instance_type' in parameter: - my_dict['instance_type'] = parameter['instance_type'] - tm = Template("filter {\n name = \"{{ name }}\"\n values = {{ values }}\n }") - string = '' - render = jinjaTemplate.render(my_dict, filters=string) - render = re.sub("'", "\"", render) - finalString = finalString+render+"\n" - - create_file = open("Output-code/outputvm.tf", "w") - create_file.write(finalString) - create_file.close() - -def gcpvm(parametri): - finalString = "" - jinjaTemplate = Template(open("VM-templates/GCPtemplateVM.tpl", "r").read()) - for parameter in parametri: - my_dict = {'default': 'default', 'name': 'test', 'machine_type': 'e2-medium', 'zone': 'us-central1-a'} - if 'default' in parameter: - my_dict['default'] = parameter['default'] - if 'name' in parameter: - my_dict['name'] = parameter['name'] - if 'machine_type' in parameter: - my_dict['machine_type'] = parameter['machine_type'] - if 'zone' in parameter: - my_dict['zone'] = parameter['zone'] - render = jinjaTemplate.render(my_dict) - render = re.sub("'", "\"", render) - finalString = finalString+render+"\n" - - create_file = open("Output-code/outputvm.tf", "w") - create_file.write(finalString) - create_file.close() - -def azurevm(parametri): - finalString = "" - jinjaTemplate = Template(open("VM-templates/AZUREtemplateVM.tpl", "r").read()) - for parameter in parametri: - my_dict = {'source': "hashicorp/azurerm", 'version': "~>2.0", 'name': "<resource_group_name>", 'location': "<location>"} - if 'source' in parameter: - my_dict['source'] = parameter['source'] - if 'version' in parameter: - my_dict['version'] = parameter['version'] - if 'name' in parameter: - my_dict['name'] = parameter['name'] - if 'location' in parameter: - my_dict['location'] = parameter['location'] - render = jinjaTemplate.render(my_dict) - render = re.sub("'", "\"", render) - finalString = finalString+render+"\n" - - create_file = open("Output-code/outputvm.tf", "w") - create_file.write(finalString) - create_file.close() - -def networkaws(parametri): - finalString = "" - jinjaTemplate = Template(open("Network-templates/AWStemplateNetwork.tpl", "r").read()) - for parameter in parametri: - my_dict = {'subname':'subname', 'vpcname': 'vpcname', 'subnet_cidrblock':'subnet_cidrblock', 'vpc_cidr': 'vpc_cidr'} - if 'subnet_cidrblock' in parameter: - my_dict['subnet_cidrblock'] = parameter['subnet_cidrblock'] - if 'vpc_cidr' in parameter: - my_dict['vpc_cidr'] = parameter['vpc_cidr'] - if 'subnetname' in parameter: - my_dict['subnetname'] = parameter['subnetname'] - if 'vpcname' in parameter: - my_dict['vpcname'] = parameter['vpcname'] - render = jinjaTemplate.render(my_dict) - render = re.sub("'", "\"", render) - finalString = finalString+render+"\n" - - create_file = open("Output-code/outputNetwork.tf", "w") - create_file.write(finalString) - create_file.close() - -def networkg(parametri): - finalString = "" - jinjaTemplate = Template(open("Network-templates/GCPtemplateNetwork.tpl", "r").read()) - for parameter in parametri: - my_dict = {'network':'terraform-network', 'subnetwork': 'terraform-subnetwork'} - if 'network' in parameter: - my_dict['network'] = parameter['network'] - if 'subnetwork' in parameter: - my_dict['subnetwork'] = parameter['subnetwork'] - render = jinjaTemplate.render(my_dict) - render = re.sub("'", "\"", render) - finalString = finalString+render+"\n" - - create_file = open("Output-code/outputNetwork.tf", "w") - create_file.write(finalString) - create_file.close() - -def networkaz(parametri): - finalString = "" - jinjaTemplate = Template(open("Network-templates/AZUREtemplateNetwork.tpl", "r").read()) - for parameter in parametri: - my_dict = {'name':'my-resources', 'subnet_names': ["subnet1", "subnet2", "subnet3"]} - if 'name' in parameter: - my_dict['name'] = parameter['name'] - if 'subnet_names' in parameter: - my_dict['subnet_names'] = parameter['subnet_names'] - tm = Template("\"{{ name }}\" : [\"Microsoft.Sql\"]") - string = '' - i = len(my_dict['subnet_names']) - for elem in my_dict['subnet_names']: - rend = tm.render(name = elem) - string = string+rend - i = i-1 - if i>0: - string = string+",\n " - render = jinjaTemplate.render(my_dict, endpoints=string) - render = re.sub("'", "\"", render) - finalString = finalString+render+"\n" - - create_file = open("Output-code/outputNetwork.tf", "w") - create_file.write(finalString) - create_file.close() - -def awsdb(parametri): - finalString = "" - jinjaTemplate = Template(open("DB-templates/AWStemplateDB.tpl", "r").read()) - for parameter in parametri: - my_dict = {'identifier':'education', 'instance':'db.t3.micro', 'storage':'5', 'engine':'postgres', 'version':'13.1', 'username': 'edu', 'password':'var.db_password', 'subnet': 'aws_db_subnet_group.education.name', 'security': '[aws_security_group.rds.id]', 'parameter': 'aws_db_parameter_group.education.name', 'accessible': 'true', 'skip': 'true'} - if 'identifier' in parameter: - my_dict['identifier'] = parameter['identifier'] - if 'instance' in parameter: - my_dict['instance'] = parameter['instance'] - if 'storage' in parameter: - my_dict['storage'] = parameter['storage'] - if 'engine' in parameter: - my_dict['engine'] = parameter['engine'] - if 'version' in parameter: - my_dict['version'] = parameter['version'] - if 'username' in parameter: - my_dict['username'] = parameter['username'] - if 'password' in parameter: - my_dict['password'] = parameter['password'] - if 'subnet' in parameter: - my_dict['subnet'] = parameter['subnet'] - if 'security' in parameter: - my_dict['security'] = parameter['security'] - if 'parameter' in parameter: - my_dict['parameter'] = parameter['parameter'] - if 'accessible' in parameter: - my_dict['accessible'] = parameter['accessible'] - if 'skip' in parameter: - my_dict['skip'] = parameter['skip'] - render = jinjaTemplate.render(my_dict) - render = re.sub("'", "\"", render) - finalString = finalString+render+"\n" - - create_file = open("Output-code/outputdb.tf", "w") - create_file.write(finalString) - create_file.close() - -def azuredb(parametri): - finalString = "" - jinjaTemplate = Template(open("DB-templates/AZUREtemplateDB.tpl", "r").read()) - for parameter in parametri: - my_dict = {'name':'sqldbtf01', 'group_name':'${azurerm_resource_group.test2.name}', 'location':'North Central US', 'server_name':'${azurerm_sql_server.test2.name}', 'state':'Enabled', 'email':'["dbgrl93@gmail.com"]', 'days':'30', 'access_key':'${azurerm_storage_account.test2sa.primary_access_key}', 'endpoint':'${azurerm_storage_account.test2sa.primary_blob_endpoint}', 'default':'Enabled'} - if 'name' in parameter: - my_dict['name'] = parameter['name'] - if 'group_name' in parameter: - my_dict['group_name'] = parameter['group_name'] - if 'location' in parameter: - my_dict['location'] = parameter['location'] - if 'engine' in parameter: - my_dict['server_name'] = parameter['server_name'] - if 'version' in parameter: - my_dict['server_name'] = parameter['server_name'] - if 'state' in parameter: - my_dict['state'] = parameter['state'] - if 'email' in parameter: - my_dict['email'] = parameter['email'] - if 'days' in parameter: - my_dict['days'] = parameter['days'] - if 'access_key' in parameter: - my_dict['access_key'] = parameter['access_key'] - if 'endpoint' in parameter: - my_dict['endpoint'] = parameter['endpoint'] - if 'default' in parameter: - my_dict['default'] = parameter['v'] - render = jinjaTemplate.render(my_dict) - render = re.sub("'", "\"", render) - finalString = finalString+render+"\n" - - create_file = open("Output-code/outputdb.tf", "w") - create_file.write(finalString) - create_file.close() - -def googlesql(parametri): - finalString = "" - jinjaTemplate = Template(open("DB-templates/GCPtemplateDB.tpl", "r").read()) - for parameter in parametri: - my_dict = {'name':'my-database', 'instance':'google_sql_database_instance.instance.name', 'instance_name':'my-database-instance','region':'us-central1', 'tier':'db-f1-micro', 'deletion_protection':'true'} - if 'name' in parameter: - my_dict['name'] = parameter['name'] - if 'instance' in parameter: - my_dict['instance'] = parameter['instance'] - if 'instance_name' in parameter: - my_dict['instance_name'] = parameter['instance_name'] - if 'region' in parameter: - my_dict['region'] = parameter['region'] - if 'tier' in parameter: - my_dict['tier'] = parameter['tier'] - if 'deletion_protection' in parameter: - my_dict['deletion_protection'] = parameter['deletion_protection'] - render = jinjaTemplate.render(my_dict) - render = re.sub("'", "\"", render) - finalString = finalString+render+"\n" - - create_file = open("Output-code/outputdb.tf", "w") - create_file.write(finalString) - create_file.close() - -def postgresql(parametri): - jinjaTemplate = Template(open("DB-templates/AWStemplateDB.tpl", "r").read()) - my_dict = {'name': 'my_db', 'owner': 'my_role', 'template': 'template0', 'lc_collate':'C', 'connection_limit':-1, 'allow_connections': 'true'} - if 'name' in parametri: - my_dict['name'] = parametri['name'] - if 'owner' in parametri: - my_dict['owner'] = parametri['owner'] - if 'template' in parametri: - my_dict['template'] = parametri['template'] - if 'lc_collate' in parametri: - my_dict['lc_collate'] = parametri['lc_collate'] - if 'connection_limit' in parametri: - my_dict['connection_limit'] = parametri['connection_limit'] - if 'allow_connections' in parametri: - my_dict['allow_connections'] = parametri['allow_connections'] - render = jinjaTemplate.render(my_dict) - render = re.sub("'", "\"", render) - create_file = open("Output-code/outputdb.tf", "w") - create_file.write(render) - create_file.close()