diff --git a/.gitignore b/.gitignore index e51cffd218b5c8e033b772620e1ea7203613f0e4..49f0b2aed603e5ce17ed22f4f38c259754d6ae34 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ .idea *.tar.gz icgparser/doml/*domlx -output_files_generated/* +# output_files_generated/* # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/output_file_example/nginx_openstack/ansible/config.yaml b/output_file_example/nginx_openstack/ansible/config.yaml index 072faf26a97296aeb11aa66838af9905c0fec234..250c62c5c0d69c5bb746d4cef7f8737c9c119485 100644 --- a/output_file_example/nginx_openstack/ansible/config.yaml +++ b/output_file_example/nginx_openstack/ansible/config.yaml @@ -1,6 +1,6 @@ --- input: - - instance_server_public_key + - instance_server_private_key - instance_ip output: [] engine: ansible diff --git a/output_file_example/nginx_openstack/ansible/inventory.j2 b/output_file_example/nginx_openstack/ansible/inventory.j2 index c928da897bf579b40f7c3fed8debc814adc17fe4..3dd97c37a38ac48ad810a7d3369ee84eb02e75f9 100644 --- a/output_file_example/nginx_openstack/ansible/inventory.j2 +++ b/output_file_example/nginx_openstack/ansible/inventory.j2 @@ -4,4 +4,4 @@ [vms:vars] ansible_connection=ssh ansible_user=ubuntu -ansible_ssh_private_key_file={{ ssh_key_file }} +ansible_ssh_private_key_file=ssh_key diff --git a/output_file_example/nginx_openstack/ansible/ssh_key.j2 b/output_file_example/nginx_openstack/ansible/ssh_key.j2 new file mode 100644 index 0000000000000000000000000000000000000000..1b9ad076e0fea507ee1cbf04472da28a893fc929 --- /dev/null +++ b/output_file_example/nginx_openstack/ansible/ssh_key.j2 @@ -0,0 +1 @@ +{{ instance_server_private_key }} \ No newline at end of file diff --git a/output_file_example/nginx_openstack/terraform/main.tf b/output_file_example/nginx_openstack/terraform/main.tf index 6fa10157fe638c18fa5f5ef7a60ccc1e7c69d607..72457624dd545703ea180157375679f162888c9e 100644 --- a/output_file_example/nginx_openstack/terraform/main.tf +++ b/output_file_example/nginx_openstack/terraform/main.tf @@ -18,19 +18,11 @@ data "openstack_networking_network_v2" "external" { name = "external" } -data "openstack_identity_project_v3" "test_tenant" { - name = "admin" -} - -data "openstack_networking_secgroup_v2" "default" { - name = "default" - tenant_id = data.openstack_identity_project_v3.test_tenant.id -} # Create virtual machine resource "openstack_compute_instance_v2" "nginx" { name = "nginx-host" image_name = "Ubuntu-Focal-20.04-Daily-2022-04-19" - flavor_name = "ubuntu" + flavor_name = "łubuntu" key_pair = openstack_compute_keypair_v2.user_key.name network { port = openstack_networking_port_v2.nginx.id @@ -75,7 +67,8 @@ resource "openstack_networking_port_v2" "nginx" { network_id = openstack_networking_network_v2.generic.id admin_state_up = true security_group_ids = [ - data.openstack_networking_secgroup_v2.default.id #default flavour id + openstack_compute_secgroup_v2.ssh.id, + openstack_compute_secgroup_v2.http.id ] fixed_ip { subnet_id = openstack_networking_subnet_v2.nginx.id diff --git a/output_files_generated/nginx_openstack/ansible/config.yaml b/output_files_generated/nginx_openstack/ansible/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e84af9b9c528953c797be67512f73d896b953260 --- /dev/null +++ b/output_files_generated/nginx_openstack/ansible/config.yaml @@ -0,0 +1,8 @@ + +--- +input: + - instance_ip_nginx-host + - instance_server_private_key_ +output: [] +engine: ansible +... diff --git a/output_files_generated/nginx_openstack/ansible/inventory.j2 b/output_files_generated/nginx_openstack/ansible/inventory.j2 new file mode 100644 index 0000000000000000000000000000000000000000..7bd4920470d5540d7083fb63b6a94727bbf04e81 --- /dev/null +++ b/output_files_generated/nginx_openstack/ansible/inventory.j2 @@ -0,0 +1,9 @@ + + +[servers_for_nginx] +{{ instance_ip_nginx-host }} + +[servers_for_nginx:vars] +ansible_connection=ssh +ansible_user= +ansible_ssh_private_key_file={{ instance_server_private_key_ }} diff --git a/output_files_generated/nginx_openstack/ansible/nginx.yaml b/output_files_generated/nginx_openstack/ansible/nginx.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7cd932f2da62f32f3cc506661acd5cb079605858 --- /dev/null +++ b/output_files_generated/nginx_openstack/ansible/nginx.yaml @@ -0,0 +1,44 @@ + + +--- +- hosts: servers_for_nginx + gather_facts: no + become: yes + 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/output_files_generated/nginx_openstack/ansible/ssh_key.j2 b/output_files_generated/nginx_openstack/ansible/ssh_key.j2 new file mode 100644 index 0000000000000000000000000000000000000000..1b9ad076e0fea507ee1cbf04472da28a893fc929 --- /dev/null +++ b/output_files_generated/nginx_openstack/ansible/ssh_key.j2 @@ -0,0 +1 @@ +{{ instance_server_private_key }} \ No newline at end of file diff --git a/output_files_generated/nginx_openstack/config.yaml b/output_files_generated/nginx_openstack/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6464675fc28c7eb4c9e955f4184bf662c8f3f0a5 --- /dev/null +++ b/output_files_generated/nginx_openstack/config.yaml @@ -0,0 +1,5 @@ +--- +iac: +- terraform +- ansible +... \ No newline at end of file diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible.cfg b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible.cfg new file mode 100644 index 0000000000000000000000000000000000000000..660a5ebcbecd0307307b5c2d2d61083e315c4e45 --- /dev/null +++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible.cfg @@ -0,0 +1,7 @@ +# https://docs.ansible.com/ansible/latest/reference_appendices/config.html +[defaults] +host_key_checking = False +inventory = {{CWD}}/hosts.yaml ; This points to the file that lists your hosts +remote_user = esilab +deprecation_warnings=False ; to remove the python version depretation warning +display_skipped_hosts = no \ No newline at end of file diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible_requirements.yml b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible_requirements.yml new file mode 100644 index 0000000000000000000000000000000000000000..58c0cb368b76e9a0313aee87b2296e727877b2d9 --- /dev/null +++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible_requirements.yml @@ -0,0 +1,8 @@ +roles: +# - name: dj-wasabi.telegraf +# version: 0.13.2 +# source: https://galaxy.ansible.com + - name: dj-wasabi.telegraf + src: https://github.com/dj-wasabi/ansible-telegraf.git + scm: git + version: 0.13.2 diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/hosts.yaml b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/hosts.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b9cbfc6d1be7e249a1f6813793dd228083d669fe --- /dev/null +++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/hosts.yaml @@ -0,0 +1,4 @@ +all: + hosts: + localhost: + ansible_connection: local diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/install_playbook_requirements.sh b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/install_playbook_requirements.sh new file mode 100644 index 0000000000000000000000000000000000000000..843bf3b6e0c4dfb6d6157ae22687cd7585ef3a02 --- /dev/null +++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/install_playbook_requirements.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -e + +SCRIPT_DIR=$(dirname "$0") + +# to avoid the being run in a world writable directory we explicitly assign the ANSIBLE_CONFIG variable +if [[ -f ./ansible.cfg ]] +then + export ANSIBLE_CONFIG=./ansible.cfg +else + if [[ -f $SCRIPT_DIR/ansible.cfg ]] + then + export ANSIBLE_CONFIG=$SCRIPT_DIR/ansible.cfg + fi +fi + +if [[ -z "$ANSIBLE_CONFIG" ]] +then + echo ANSIBLE_CONFIG to assigned using default https://docs.ansible.com/ansible/latest/reference_appendices/config.html +else + echo ANSIBLE_CONFIG=$ANSIBLE_CONFIG +fi + +if [[ -z "$1" ]] +then + # echo without params + echo ansible-playbook $SCRIPT_DIR/site_requirements.yaml + ansible-playbook $SCRIPT_DIR/site_requirements.yaml +else + # echo with params + echo ansible-playbook $SCRIPT_DIR/site_requirements.yaml --extra-vars "$1" + ansible-playbook $SCRIPT_DIR/site_requirements.yaml --extra-vars "$1" +fi diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/run-playbook.sh b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/run-playbook.sh new file mode 100644 index 0000000000000000000000000000000000000000..f2bba22bc6dcae68d78545cc6b130677bc5083ef --- /dev/null +++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/run-playbook.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -e + +SCRIPT_DIR=$(dirname "$0") + +# to avoid the being run in a world writable directory we explicitly assign the ANSIBLE_CONFIG variable +if [[ -f ./ansible.cfg ]] +then + export ANSIBLE_CONFIG=./ansible.cfg +else + if [[ -f $SCRIPT_DIR/ansible.cfg ]] + then + export ANSIBLE_CONFIG=$SCRIPT_DIR/ansible.cfg + fi +fi + +if [[ -z "$ANSIBLE_CONFIG" ]] +then + echo ANSIBLE_CONFIG to assigned using default https://docs.ansible.com/ansible/latest/reference_appendices/config.html +else + echo ANSIBLE_CONFIG=$ANSIBLE_CONFIG +fi + +if [[ -z "$1" ]] +then + # echo without params + echo ansible-playbook $SCRIPT_DIR/site.yaml + ansible-playbook $SCRIPT_DIR/site.yaml +else + # echo with params + echo ansible-playbook $SCRIPT_DIR/site.yaml --extra-vars "$1" + ansible-playbook $SCRIPT_DIR/site.yaml --extra-vars "$1" +fi diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site.yaml b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site.yaml new file mode 100644 index 0000000000000000000000000000000000000000..531dbf50d5ca852802196de7eafe0c238b9beb85 --- /dev/null +++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site.yaml @@ -0,0 +1,30 @@ +- hosts: all + pre_tasks: + - name: Check parameters + fail: + msg: 'variable {{item}} not defined' + when: item is not defined + with_items: + - pma_deployment_id + - pma_influxdb_bucket + - pma_influxdb_token + - pma_influxdb_org + - pma_influxdb_addr + - name: Print parameters + debug: + msg: + - "pma_deployment_id: {{ pma_deployment_id }}" + - "pma_influxdb_bucket: {{ pma_influxdb_bucket }}" + - "pma_influxdb_token: {{ pma_influxdb_token }}" + - "pma_influxdb_org: {{ pma_influxdb_org }}" + - "pma_influxdb_addr: {{ pma_influxdb_addr }}" + - name: Ensure gnupg package + package: + name: gnupg + state: present + become: true + + vars_files: + - vars/main.yaml + roles: + - dj-wasabi.telegraf diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site_requirements.yaml b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site_requirements.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3e7665dce4e17365bfd08f90425e9408d0f83045 --- /dev/null +++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site_requirements.yaml @@ -0,0 +1,9 @@ +- hosts: localhost + tasks: + - name: print disclamer + debug: + msg: this can also be done with "ansible-galaxy install -r requirements" + - name: install telegraf from galaxy + community.general.ansible_galaxy_install: + type: role + requirements_file: ansible_requirements.yml diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/vars/main.yaml b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/vars/main.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ada23165aebadbfe12bffb77368f0181fb4f1737 --- /dev/null +++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/vars/main.yaml @@ -0,0 +1,23 @@ +telegraf_agent_package_state: latest + +telegraf_agent_output: + - type: influxdb_v2 + config: + - urls = ["{{ pma_influxdb_addr }}"] + - token = "{{ pma_influxdb_token }}" + - organization = "{{ pma_influxdb_org }}" + - bucket = "{{ pma_influxdb_bucket }}" + - insecure_skip_verify = true + +telegraf_global_tags: + - tag_name: deployment_id + tag_value: "{{ pma_deployment_id }}" + +telegraf_plugins_default: + - plugin: cpu + - plugin: mem + - plugin: processes + - plugin: disk + - plugin: net + + diff --git a/output_files_generated/nginx_openstack/terraform/config.yaml b/output_files_generated/nginx_openstack/terraform/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..405c5565b8f41ad862f87fd7a9478d3817c990c0 --- /dev/null +++ b/output_files_generated/nginx_openstack/terraform/config.yaml @@ -0,0 +1,16 @@ + + +--- +engine: terraform +input: + - OS_USERNAME + - OS_PASSWORD + - OS_AUTH_URL + - OS_PROJECT_NAME +output: + + - instance_server_public_key_ + - instance_server_private_key_ + - instance_ip_nginx-host + +... diff --git a/output_files_generated/nginx_openstack/terraform/main.tf b/output_files_generated/nginx_openstack/terraform/main.tf new file mode 100644 index 0000000000000000000000000000000000000000..11c005ee2e6beaafafba5f4d73ba773786c31dbf --- /dev/null +++ b/output_files_generated/nginx_openstack/terraform/main.tf @@ -0,0 +1,174 @@ + + +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 = var.openstack_username + #tenant_name = "admin" + #password = var.openstack_password + #auth_url = var.openstack_auth_url + insecure = true +} + +# Retrieve data +data "openstack_networking_network_v2" "external" { + name = "external" +} + +data "openstack_identity_project_v3" "test_tenant" { + name = "admin" +} + +data "openstack_networking_secgroup_v2" "default" { + name = "default" + tenant_id = data.openstack_identity_project_v3.test_tenant.id +} + + +# Create virtual machine +resource "openstack_compute_instance_v2" "vm1" { + name = "nginx-host" + image_name = "Ubuntu-Focal-20.04-Daily-2022-04-19" + flavor_name = "small" + key_pair = openstack_compute_keypair_v2.ssh_key.name + network { + port = openstack_networking_port_v2.net1.id + } + + ## AGENTS TO ADD + # this is subject to be moved to IEM as part of its baseline + provisioner "local-exec" { + command = "ansible-galaxy collection install community.general" + } + + # this is subject to be moved to IEM as part of its baseline + provisioner "local-exec" { + command = "ansible-playbook ansible/playbooks/pma/site_requirements.yaml" + } + + # secrets can be taken from environment variables at IEM but these security issues I will leave them to y2, the user can also be problematic ubuntu/root/centos/... + provisioner "local-exec" { + command = "ansible-playbook -u root -i '${openstack_networking_floatingip_v2.vm1_floating_ip.address},' ansible/playbooks/pma/site.yaml --extra-vars '{\"pma_deployment_id\": \"123e4567-e89b-12d3-a456-426614174002\", \"pma_influxdb_bucket\": \"bucket\", \"pma_influxdb_token\": \"piacerePassword\", \"pma_influxdb_org\": \"piacere\", \"pma_influxdb_addr\": \"https://influxdb.pm.ci.piacere.digital.tecnalia.dev\" }'" + } + +} + +# Create floating ip +resource "openstack_networking_floatingip_v2" "vm1_floating_ip" { + pool = "external" + # fixed_ip = "" +} + +# Attach floating ip to instance +resource "openstack_compute_floatingip_associate_v2" "vm1_floating_ip_association" { + floating_ip = openstack_networking_floatingip_v2.vm1_floating_ip.address + instance_id = openstack_compute_instance_v2.vm1.id +} + + + +## Network + +# Create Network +resource "openstack_networking_network_v2" "net1" { + name = "concrete_net" +} + +# Create Subnet +resource "openstack_networking_subnet_v2" "net1_subnet" { + name = "concrete_net_subnet" + network_id = openstack_networking_network_v2.net1.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" "net1" { + name = "concrete_net" + network_id = openstack_networking_network_v2.net1.id + admin_state_up = true + security_group_ids = [ + data.openstack_networking_secgroup_v2.default.id #default flavour id + ] + fixed_ip { + subnet_id = openstack_networking_subnet_v2.net1_subnet.id + } +} + +# Create router +resource "openstack_networking_router_v2" "net1_router" { + name = "net1_router" + external_network_id = data.openstack_networking_network_v2.external.id #External network id +} +# Router interface configuration +resource "openstack_networking_router_interface_v2" "net1_router_interface" { + router_id = openstack_networking_router_v2.net1_router.id + subnet_id = openstack_networking_subnet_v2.net1_subnet.id +} + + + +# Create ssh keys +resource "openstack_compute_keypair_v2" "ssh_key" { + name = "ubuntu" + # public_key = "ubuntu" +} + + + +# CREATING SECURITY_GROUP + +resource "openstack_compute_secgroup_v2" "icmp" { + name = "icmp" + description = "Security group rule for port -1" + rule { + from_port = -1 + to_port = -1 + ip_protocol = "icmp" + cidr = "0.0.0.0/0" + } +} + +resource "openstack_compute_secgroup_v2" "http" { + name = "http" + description = "Security group rule for port 80" + rule { + from_port = 80 + to_port = 80 + ip_protocol = "tcp" + cidr = "0.0.0.0/0" + } +} + +resource "openstack_compute_secgroup_v2" "https" { + name = "https" + description = "Security group rule for port 443" + rule { + from_port = 443 + to_port = 443 + ip_protocol = "tcp" + cidr = "0.0.0.0/0" + } +} + +resource "openstack_compute_secgroup_v2" "ssh" { + name = "ssh" + description = "Security group rule for port 22" + rule { + from_port = 22 + to_port = 22 + ip_protocol = "tcp" + cidr = "0.0.0.0/0" + } +} + + diff --git a/output_files_generated/nginx_openstack/terraform/output.tf b/output_files_generated/nginx_openstack/terraform/output.tf new file mode 100644 index 0000000000000000000000000000000000000000..2f4e6e32723a7b105ad6d6757d6890f75fb9b8f7 --- /dev/null +++ b/output_files_generated/nginx_openstack/terraform/output.tf @@ -0,0 +1,14 @@ + + +output "instance_server_public_key_" { + value = openstack_compute_keypair_v2.ssh_key.public_key +} + +output "instance_server_private_key_" { + value = openstack_compute_keypair_v2.ssh_key.private_key +} + +output "instance_ip_nginx-host" { + value = openstack_compute_floatingip_associate_v2.vm1_floating_ip_association.floating_ip +} + diff --git a/plugin/AnsiblePlugin.py b/plugin/AnsiblePlugin.py index 3ff921aa0be0e6bec7be76154f9cf298fd067135..e0eb144f31a81b23eacee592d97f862b412369bc 100644 --- a/plugin/AnsiblePlugin.py +++ b/plugin/AnsiblePlugin.py @@ -56,6 +56,7 @@ def create_files(parameters, output_path): ansible_output_file_path = output_path + "/".join([language, resource_name]) + ".yaml" inventory_output_file_path = output_path + "/".join([language, "inventory"]) + ".j2" config_output_file_path = output_path + "/".join([language, "config"]) + ".yaml" + ssh_key_output_file_path = output_path + "/".join([language, "ssh_key.j2"]) template = TemplateUtils.read_template(ansible_template_path) template_filled = TemplateUtils.edit_template(template, resource_params) @@ -66,5 +67,6 @@ def create_files(parameters, output_path): TemplateUtils.write_template(inventory_template_filled, inventory_output_file_path) TemplateUtils.write_template(template_filled, ansible_output_file_path) TemplateUtils.write_template(config_template_filled, config_output_file_path) + TemplateUtils.write_template("{{ instance_server_private_key }}", ssh_key_output_file_path) logging.info("File available at: {}".format(output_path)) diff --git a/plugin/TemplateUtils.py b/plugin/TemplateUtils.py index 67a12213a9c8e46d0358902e99b3357f22763e49..6f5a1405e5987a2b3ca74b94e71dc162a1d7d467 100644 --- a/plugin/TemplateUtils.py +++ b/plugin/TemplateUtils.py @@ -11,7 +11,7 @@ # 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 configparser import logging @@ -25,6 +25,7 @@ from jinja2 import Template def get_context(c): return c + def find_template_path(iac_language, key, resource_name): try: properties_reader = configparser.ConfigParser() @@ -42,7 +43,7 @@ def edit_template(template, parameters: dict): template.globals['context'] = get_context template.globals['callable'] = callable render = template.render(parameters) - template_with_custom_params = ""+render+"\n" + template_with_custom_params = "" + render + "\n" return template_with_custom_params @@ -62,4 +63,4 @@ 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() \ No newline at end of file + file.close() diff --git a/templates/ansible/ubuntu/config.tpl b/templates/ansible/ubuntu/config.tpl index b161cb42c211543e239019bbdeed9573b1227f4e..d58935294cef534027a7e6c7d0f3969fb5cff460 100644 --- a/templates/ansible/ubuntu/config.tpl +++ b/templates/ansible/ubuntu/config.tpl @@ -13,7 +13,6 @@ # limitations under the License. #------------------------------------------------------------------------- #} - --- input: - instance_ip_{{ node.vm_name }}