Skip to content
Snippets Groups Projects
Commit 5e7cd8f0 authored by debora.benedetto@hpe.com's avatar debora.benedetto@hpe.com
Browse files

add automation for terraform config file generation

parent eb47bf76
Branches
No related tags found
No related merge requests found
...@@ -30,9 +30,9 @@ def choose_plugin(parameters, template_generated_folder): ...@@ -30,9 +30,9 @@ def choose_plugin(parameters, template_generated_folder):
for step in parameters["steps"]: for step in parameters["steps"]:
if step["programming_language"] == "ansible": if step["programming_language"] == "ansible":
logging.info("Ansible Plugin chosen") logging.info("Ansible Plugin chosen")
metadata_root_folder["iac"].append("ansible") # metadata_root_folder["iac"].append("ansible")
input_data = step["data"] # input_data = step["data"]
AnsiblePlugin.create_files(input_data, template_generated_folder) # AnsiblePlugin.create_files(input_data, template_generated_folder)
elif step["programming_language"] == "terraform": elif step["programming_language"] == "terraform":
logging.info("Terraform Plugin chosen") logging.info("Terraform Plugin chosen")
metadata_root_folder["iac"].append("terraform") metadata_root_folder["iac"].append("terraform")
......
...@@ -85,6 +85,9 @@ def save_references_info(from_object, to_object): ## TODO refactoring ...@@ -85,6 +85,9 @@ def save_references_info(from_object, to_object): ## TODO refactoring
update_missing_parsed_resources(reference_object, reference=ref, is_to_be_parsed=True) update_missing_parsed_resources(reference_object, reference=ref, is_to_be_parsed=True)
return to_object return to_object
def get_references(from_object):
refs = from_object.eClass.eAllReferences()
return list(refs)
def save_inner_components(from_object, to_object): def save_inner_components(from_object, to_object):
inner_components = from_object.eAllContents() inner_components = from_object.eAllContents()
......
...@@ -76,13 +76,34 @@ def parse_infrastructural_objects(doml_model): ...@@ -76,13 +76,34 @@ def parse_infrastructural_objects(doml_model):
infra_object_step = include_missing_objects_from_infrastructure_layer(infra_object_step) infra_object_step = include_missing_objects_from_infrastructure_layer(infra_object_step)
return infra_object_step return infra_object_step
def parse_application_layer(doml_model):
logging.info("DOML parsing: getting active configuration")
application_object_step = {"programming_language": "ansible", "data": {}}
active_configuration = doml_model.activeConfiguration
logging.info(f"Found active configuration '{active_configuration.name}'")
for deployment in list(active_configuration.deployments):
deployment_component_name = deployment.component.name
logging.info(f'Parsing deployment for component {deployment_component_name}')
refs = DomlParserUtilities.get_references(deployment)
object_list_representation = []
for ref in refs:
object_representation = {}
obj = deployment.eGet(ref.name)
object_representation = DomlParserUtilities.save_annotations(obj, object_representation)
object_representation = DomlParserUtilities.save_attributes(obj, object_representation)
object_list_representation.append(object_representation)
application_object_step["data"][deployment.component.name] = object_list_representation
return application_object_step
def create_intermediate_representation(model_loaded): def create_intermediate_representation(model_loaded):
model_name = model_loaded.name model_name = model_loaded.name
output_path = OUTPUT_BASE_DIR_PATH + model_name + "/" output_path = OUTPUT_BASE_DIR_PATH + model_name + "/"
intermediate_representation_steps = [] intermediate_representation_steps = []
infra_object_step = parse_infrastructural_objects(model_loaded) infra_object_step = parse_infrastructural_objects(model_loaded)
application_step = parse_application_layer(model_loaded)
intermediate_representation_steps.append(infra_object_step) intermediate_representation_steps.append(infra_object_step)
intermediate_representation_steps.append(application_step)
intermediate_representation = { intermediate_representation = {
"output_path": output_path, "output_path": output_path,
"steps": intermediate_representation_steps "steps": intermediate_representation_steps
......
...@@ -94,6 +94,21 @@ ...@@ -94,6 +94,21 @@
] ]
}, },
"programming_language": "terraform" "programming_language": "terraform"
},
{
"data": {
"nginx": [
{
"name": "vm1",
"os": "ubuntu-20.04.3"
},
{
"name": "nginx",
"source_code": "/usr/share/nginx/html/index.html"
}
]
},
"programming_language": "ansible"
} }
] ]
} }
\ No newline at end of file
from plugin import TemplateUtils
def createExecutionFileInstructions(iac_language, key, data):
template_for_config_path = TemplateUtils.find_template_path(iac_language, key, "config")
template_for_config = TemplateUtils.read_template(template_for_config_path)
template_for_config_path_edited = TemplateUtils.edit_template(template_for_config, data)
return template_for_config_path_edited
...@@ -23,7 +23,7 @@ def find_template_path(iac_language, key, resource_name): ...@@ -23,7 +23,7 @@ def find_template_path(iac_language, key, resource_name):
def edit_template(template, parameters: dict): def edit_template(template, parameters: dict):
logging.info("Starting editing template") logging.info(f"Starting editing template '{template}'")
template.globals['context'] = get_context template.globals['context'] = get_context
template.globals['callable'] = callable template.globals['callable'] = callable
render = template.render(parameters) render = template.render(parameters)
...@@ -47,4 +47,4 @@ def write_template(template, output_path_file): ...@@ -47,4 +47,4 @@ def write_template(template, output_path_file):
file = open(output_path_file, "w+") file = open(output_path_file, "w+")
file.write(template) file.write(template)
logging.info("Writing file at: '%s'", output_path_file) logging.info("Writing file at: '%s'", output_path_file)
file.close() file.close()
\ No newline at end of file
import logging import logging
from plugin import TemplateUtils from plugin import TemplateUtils, PluginUtility
def create_files(parameters, output_path): def create_files(parameters, output_path):
language = "terraform" language = "terraform"
provider = parameters["provider"] provider = parameters["provider"]
config_file = PluginUtility.createExecutionFileInstructions(language, provider, parameters)
resources = parameters.keys() resources = parameters.keys()
terraform_main_file = create_init_file(language, provider) terraform_main_file = create_init_file(language, provider)
terraform_out_file = "" terraform_out_file = ""
...@@ -27,11 +30,12 @@ def create_files(parameters, output_path): ...@@ -27,11 +30,12 @@ def create_files(parameters, output_path):
# resource = parameters[resource_name] # resource = parameters[resource_name]
template_out_filled = TemplateUtils.edit_template(template_out, resource_params) template_out_filled = TemplateUtils.edit_template(template_out, resource_params)
terraform_out_file = terraform_out_file + template_out_filled + "\n" terraform_out_file = terraform_out_file + template_out_filled + "\n"
main_file_stored_path = output_path + "/main.tf" main_file_stored_path = output_path + "/main.tf"
TemplateUtils.write_template(terraform_main_file, main_file_stored_path) TemplateUtils.write_template(terraform_main_file, main_file_stored_path)
output_file_stored_path = output_path + "/output.tf" output_file_stored_path = output_path + "/output.tf"
TemplateUtils.write_template(terraform_out_file, output_file_stored_path) TemplateUtils.write_template(terraform_out_file, output_file_stored_path)
config_file_stored_path = output_path + "/config.yaml"
TemplateUtils.write_template(config_file, config_file_stored_path)
logging.info("Terraform main file available at: {}".format(main_file_stored_path)) logging.info("Terraform main file available at: {}".format(main_file_stored_path))
logging.info(f"Terraform output file available at {output_file_stored_path}") logging.info(f"Terraform output file available at {output_file_stored_path}")
......
[terraform.openstack] [terraform.openstack]
init = templates/terraform/open_stack/init.tpl init = templates/terraform/open_stack/init.tpl
config = templates/terraform/open_stack/config.tpl
vms = templates/terraform/open_stack/virtual_machine.tpl vms = templates/terraform/open_stack/virtual_machine.tpl
vms_out = templates/terraform/open_stack/virtual_machine_out.tpl vms_out = templates/terraform/open_stack/virtual_machine_out.tpl
networks = templates/terraform/open_stack/network.tpl networks = templates/terraform/open_stack/network.tpl
......
---
engine: terraform
input:
- OS_USERNAME
- OS_PASSWORD
- OS_AUTH_URL
- OS_PROJECT_NAME
output:
{% for vm in vms %}
- instance_server_public_key_{{ vm.vm_key_name }}
- instance_server_private_key_{{ vm.vm_key_name }}
- instance_ip_{{ vm.vm_name }}
{% endfor %}
...
...@@ -6,6 +6,6 @@ output "instance_server_private_key_{{ vm_key_name }}" { ...@@ -6,6 +6,6 @@ output "instance_server_private_key_{{ vm_key_name }}" {
value = openstack_compute_keypair_v2.{{ vm_key_name }}.private_key value = openstack_compute_keypair_v2.{{ vm_key_name }}.private_key
} }
output "instance_ip" { output "instance_ip_{{ vm_name }}" {
value = openstack_compute_floatingip_associate_v2.{{ infra_element_name ~ "_floating_ip_association" }}.floating_ip value = openstack_compute_floatingip_associate_v2.{{ infra_element_name ~ "_floating_ip_association" }}.floating_ip
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment