eotk: import instance information from terraform

This commit is contained in:
Iain Learmonth 2022-05-13 15:40:59 +01:00
parent 567fcce0bb
commit ce520b87a5
11 changed files with 233 additions and 74 deletions

110
app/terraform/eotk/aws.py Normal file
View file

@ -0,0 +1,110 @@
import datetime
from typing import Any
from app import app
from app.extensions import db
from app.models.base import Group
from app.models.onions import Eotk
from app.terraform.terraform import TerraformAutomation
def update_eotk_instance(group_id: int, region: str, instance_id: str):
instance = Eotk.query.filter(
Eotk.group_id == group_id,
Eotk.region == region,
Eotk.provider == "aws",
Eotk.destroyed == None
).first()
if instance is None:
instance = Eotk()
instance.added = datetime.datetime.utcnow()
instance.group_id = group_id
instance.provider = "aws"
instance.region = region
db.session.add(instance)
instance.updated = datetime.datetime.utcnow()
instance.instance_id = instance_id
class EotkAWSAutomation(TerraformAutomation):
short_name = "eotk_aws"
description = "Deploy EOTK instances to AWS"
template_parameters = [
"aws_access_key",
"aws_secret_key"
]
template = """
terraform {
required_providers {
aws = {
version = "~> 4.4.0"
}
}
}
provider "aws" {
access_key = "{{ aws_access_key }}"
secret_key = "{{ aws_secret_key }}"
region = "us-east-2"
}
provider "aws" {
access_key = "{{ aws_access_key }}"
secret_key = "{{ aws_secret_key }}"
region = "eu-central-1"
alias = "second_region"
}
{% for group in groups %}
module "eotk_{{ group.id }}" {
providers = {
aws = aws,
aws.second_region = aws.second_region
}
source = "sr2c/eotk/aws"
version = "0.0.5"
namespace = "{{ global_namespace }}"
tenant = "{{ group.group_name }}"
name = "eotk"
label_order = ["namespace", "tenant", "name", "attributes"]
disable_api_termination = true
}
{% endfor %}
"""
def tf_generate(self):
self.tf_write(
self.template,
groups=Group.query.filter(
Group.eotk == True,
Group.destroyed == None
).all(),
global_namespace=app.config['GLOBAL_NAMESPACE'],
**{
k: app.config[k.upper()]
for k in self.template_parameters
}
)
def tf_posthook(self, *, prehook_result: Any = None) -> None:
state = self.tf_show()
for g in state["values"]["root_module"]["child_modules"]:
if g["address"].startswith("module.eotk_"):
group_id = int(g["address"][len("module.eotk_"):])
for i in g["child_modules"]:
if ".module.instance_" in i["address"]:
instance = int(i["address"][-1])
region = "us-east-2" if instance == 1 else "eu-central-1"
for s in i["child_modules"]:
if s["address"].endswith(".module.instance"):
for x in s["resources"]:
if x["address"].endswith(".module.instance.aws_instance.default[0]"):
update_eotk_instance(group_id, region, x['values']['id'])
db.session.commit()
with app.app_context():
auto = EotkAWSAutomation()
auto.tf_posthook()