1+ #!/usr/bin/python3
2+ # Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
3+ #
4+ # This script will produce a Terraform file that will be used to set up OCI Database
5+ # MySQL Configuration
6+ #
7+ # Author: Generated by Cascade
8+ # Oracle Consulting
9+ #
10+
11+ import os
12+ import re
13+ from jinja2 import Environment , FileSystemLoader
14+ from oci .config import DEFAULT_LOCATION
15+ from pathlib import Path
16+ from commonTools import *
17+
18+ def create_terraform_mysql_configuration (inputfile , outdir , service_dir , prefix , ct ):
19+ filename = inputfile
20+ sheetName = "MySQL-Configurations"
21+ auto_tfvars_filename = prefix + '_' + sheetName .lower () + '.auto.tfvars'
22+
23+ # Initialize tracking variables
24+ prev_values = {
25+ 'region' : '' ,
26+ 'compartment_name' : '' ,
27+ 'display_name' : '' ,
28+ 'description' : '' ,
29+ 'shape_name' : ''
30+ }
31+
32+ tfStr = {}
33+ mysql_config_vars = {}
34+
35+ # Load the template file
36+ file_loader = FileSystemLoader (f'{ Path (__file__ ).parent } /templates' )
37+ env = Environment (loader = file_loader , keep_trailing_newline = True , trim_blocks = True , lstrip_blocks = True )
38+ template = env .get_template ('mysql-configuration-template' )
39+
40+ # Add custom functions to template environment
41+ def make_config_keys (config ):
42+ return lambda : config .keys ()
43+ def make_config_value (config ):
44+ return lambda key : config .get (key , '' )
45+ env .globals ['config_keys' ] = None
46+ env .globals ['config_value' ] = None
47+
48+ # Read cd3 using pandas dataframe
49+ df , col_headers = commonTools .read_cd3 (filename , sheetName )
50+ df = df .dropna (how = 'all' )
51+ df = df .reset_index (drop = True )
52+
53+ # List of column headers
54+ dfcolumns = df .columns .values .tolist ()
55+
56+ # Initialize empty TF string for each region
57+ for reg in ct .all_regions :
58+ tfStr [reg ] = ''
59+ srcdir = outdir + "/" + reg + "/" + service_dir + "/"
60+ resource = sheetName .lower ()
61+ commonTools .backup_file (srcdir , resource , auto_tfvars_filename )
62+ mysql_config_vars [reg ] = {}
63+
64+ # Process each row
65+ for i in df .index :
66+ # Get values from row
67+ region = str (df .loc [i , 'Region' ]).strip ()
68+ compartment_name = str (df .loc [i , 'Compartment Name' ]).strip ()
69+ display_name = str (df .loc [i , 'Display Name' ]).strip ()
70+ description = str (df .loc [i , 'Description' ]).strip ()
71+ shape_name = str (df .loc [i , 'Shape Name' ]).strip ()
72+
73+ # Handle empty values using previous values
74+ if region .lower () == 'nan' or region == '' :
75+ region = prev_values ['region' ]
76+ if compartment_name .lower () == 'nan' or compartment_name == '' :
77+ compartment_name = prev_values ['compartment_name' ]
78+ if display_name .lower () == 'nan' or display_name == '' :
79+ display_name = prev_values ['display_name' ]
80+ if description .lower () == 'nan' or description == '' :
81+ description = prev_values ['description' ]
82+ if shape_name .lower () == 'nan' or shape_name == '' :
83+ shape_name = prev_values ['shape_name' ]
84+
85+ # Update previous values
86+ prev_values .update ({
87+ 'region' : region ,
88+ 'compartment_name' : compartment_name ,
89+ 'display_name' : display_name ,
90+ 'description' : description ,
91+ 'shape_name' : shape_name
92+ })
93+
94+ # Skip if essential values are missing
95+ if region .lower () == 'nan' or display_name .lower () == 'nan' :
96+ continue
97+
98+ # Initialize region if needed
99+ region = region .strip ().lower ()
100+ if region not in ct .all_regions :
101+ print ("\n ERROR!!! Invalid Region; It should be one of the regions tenancy is subscribed to..Exiting!" )
102+ exit (1 )
103+
104+ # Check for variable row
105+ user_var_name = str (df .loc [i , 'users_variable_name' ]).strip ()
106+ user_var_value = str (df .loc [i , 'users_variable_value' ]).strip ()
107+
108+ # Initialize config if needed
109+ config_tf_name = commonTools .check_tf_variable (display_name )
110+ if config_tf_name not in mysql_config_vars [region ]:
111+ mysql_config_vars [region ][config_tf_name ] = {
112+ 'config_display_tf_name' : config_tf_name ,
113+ 'compartment_tf_name' : commonTools .check_tf_variable (compartment_name ),
114+ 'display_name' : display_name ,
115+ 'description' : description ,
116+ 'shape_name' : shape_name
117+ }
118+
119+ # Only process variable if both name and value are present and not empty
120+ if (user_var_name .lower () != 'nan' and user_var_name != '' and
121+ user_var_value .lower () != 'nan' and user_var_value != '' ):
122+ # Add variable with mysql_configuration_ prefix
123+ var_name = f"mysql_configuration_variables_{ user_var_name } "
124+ # Handle boolean values
125+ if user_var_value .lower () in ['true' , 'false' ]:
126+ mysql_config_vars [region ][config_tf_name ][var_name ] = user_var_value .capitalize ()
127+ else :
128+ mysql_config_vars [region ][config_tf_name ][var_name ] = user_var_value
129+
130+ # Generate terraform configuration for each region
131+ for region in mysql_config_vars :
132+ if not mysql_config_vars [region ]:
133+ continue
134+
135+ # Start with count = 0 to generate opening
136+ env .globals ['count' ] = 0
137+ tfStr [region ] = template .render ()
138+
139+ configs = list (mysql_config_vars [region ].items ())
140+ for i , (config_name , config ) in enumerate (configs ):
141+ # Update template functions for this config
142+ env .globals ['config_keys' ] = make_config_keys (config )
143+ env .globals ['config_value' ] = make_config_value (config )
144+ config ['loop' ] = {'last' : i == len (configs ) - 1 }
145+ env .globals ['count' ] = 1
146+
147+ # Render configuration
148+ rendered_config = template .render (** config )
149+ tfStr [region ] += rendered_config
150+
151+ # Add closing brace
152+ env .globals ['count' ] = 2
153+ tfStr [region ] += template .render ()
154+
155+ # Write files
156+ for region in tfStr :
157+ if tfStr [region ] != '' :
158+ srcdir = outdir + "/" + region + "/" + service_dir + "/"
159+ os .makedirs (srcdir , exist_ok = True )
160+
161+ outfile = srcdir + "/" + auto_tfvars_filename
162+ # Clean up the output
163+ tfStr [region ] = tfStr [region ].strip ()
164+ # Fix any potential formatting issues
165+ tfStr [region ] = re .sub (r'\s+mysql_configuration_variables_' , '\n mysql_configuration_variables_' , tfStr [region ])
166+ tfStr [region ] = re .sub (r'}\s*,\s*' , '},\n ' , tfStr [region ])
167+ tfStr [region ] = re .sub (r'\n\s*\n\s*\n' , '\n \n ' , tfStr [region ])
168+
169+ with open (outfile , 'w' ) as f :
170+ f .write (tfStr [region ])
171+ print (f"Created MySQL configuration for region { region } in { outfile } " )
0 commit comments