generate/main.py (53 lines of code) (raw):
#!/usr/bin/env python
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import copy
import yaml
from cdktf import App
import util
from resources import MyStack, creation
app = App()
def run_cdktf(config):
"""run cdktf stack"""
config["eztf"]["tf_vars"] = config["eztf"].get("tf_vars", {})
domain = config["variable"]["domain"]
config_stack = config["eztf"]["stacks"]
tfstacks = set(config["eztf"].get("tf_stacks", []))
for sub_stack, range_resources in config_stack.items():
if sub_stack not in tfstacks:
continue
config["eztf"]["tf_vars"][sub_stack] = config["eztf"]["tf_vars"].get(
sub_stack, {}
)
stack_name = f"gcp-{util.clean_res_id(domain)}-{sub_stack}"
eztf_config = copy.deepcopy(config)
app_stack = MyStack(app, stack_name, eztf_config, sub_stack, range_resources)
provided_vars = eztf_config.get("variable", {})
for var in app_stack.created["vars"].keys():
config["eztf"]["tf_vars"][sub_stack][var] = provided_vars.get(var, "")
return config
def is_stack_tf(eztf_range_resources):
for range_resource in eztf_range_resources:
for _, resource in range_resource.items():
if creation.get(resource):
return True
return False
def tf_stacks(config_stack):
tfstacks = []
for sub_stack, range_resources in config_stack.items():
if is_stack_tf(range_resources):
tfstacks.append(sub_stack)
return tfstacks
if __name__ == "__main__":
CONFIG_BUCKET = os.environ.get("EZTF_CONFIG_BUCKET")
CONFIG_FILE = os.environ.get("EZTF_INPUT_CONFIG")
if not CONFIG_FILE:
raise ValueError("EZTF_INPUT_CONFIG missing")
if CONFIG_BUCKET:
config_yaml = util.download_from_gcs(CONFIG_BUCKET, CONFIG_FILE)
config_dict = yaml.safe_load(config_yaml)
else:
config_dict = util.get_file_yaml(CONFIG_FILE)
tfstack = tf_stacks(config_dict["eztf"]["stacks"])
config_dict["eztf"]["tf_stacks"] = tfstack
if tfstack:
config_dict = run_cdktf(config_dict)
app.synth()
util.write_file_yaml(CONFIG_FILE, config_dict)