eotk: import instance information from terraform
This commit is contained in:
parent
567fcce0bb
commit
ce520b87a5
11 changed files with 233 additions and 74 deletions
110
app/terraform/eotk/aws.py
Normal file
110
app/terraform/eotk/aws.py
Normal 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()
|
Loading…
Add table
Add a link
Reference in a new issue