Skip to content

Commit 2b6404c

Browse files
authored
Merge pull request #146 from oracle-devrel/develop
Automation Toolkit Release v2025.1.3
2 parents a918380 + 92f67e8 commit 2b6404c

35 files changed

+428
-360
lines changed

Dockerfile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ ARG USE_DEVOPS=YES
1414
ARG USERNAME=cd3user
1515
ARG USER_GID=$USER_UID
1616
# Whether to download Provider as part of image creation
17-
ARG DOWNLOAD_PROVIDER=YES
17+
ARG DOWNLOAD_PROVIDER=NO
1818
# TF Provider version
19-
ARG TF_OCI_PROVIDER=6.30.0
19+
ARG TF_OCI_PROVIDER=7.8.0
2020
ARG TF_NULL_PROVIDER=3.2.3
2121

2222
RUN microdnf install -y sudo && \
@@ -31,6 +31,7 @@ RUN microdnf install -y sudo && \
3131
microdnf install -y wget && \
3232
microdnf install -y unzip && \
3333
microdnf install -y graphviz && \
34+
ln -sf /usr/bin/python3 /usr/bin/python && \
3435
echo 'alias vi="vim"' >> /etc/bashrc
3536

3637
USER $USERNAME

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
<br>
99

10-
[What's New](https://github.com/oracle-devrel/cd3-automation-toolkit/releases/tag/v2025.1.2) &nbsp;&nbsp;[Excel Templates](https://oracle-devrel.github.io/cd3-automation-toolkit/latest/excel-templates/) &nbsp;&nbsp;[CD3 Docs](https://oracle-devrel.github.io/cd3-automation-toolkit/)&nbsp;&nbsp; [Watch & Learn](https://www.youtube.com/playlist?list=PLPIzp-E1msrbJ3WawXVhzimQnLw5iafcp) &nbsp;&nbsp;[Blogs & Tutorials](https://oracle-devrel.github.io/cd3-automation-toolkit/latest/tutorials/) &nbsp;&nbsp;[Livelabs](https://apexapps.oracle.com/pls/apex/f?p=133:180:112501098061930::::wid:3724) &nbsp;&nbsp;[Slack Channel](https://oracle-devrel.github.io/cd3-automation-toolkit/latest/queries)
10+
[What's New](https://github.com/oracle-devrel/cd3-automation-toolkit/releases/tag/v2025.1.3) &nbsp;&nbsp;[Excel Templates](https://oracle-devrel.github.io/cd3-automation-toolkit/latest/excel-templates/) &nbsp;&nbsp;[CD3 Docs](https://oracle-devrel.github.io/cd3-automation-toolkit/)&nbsp;&nbsp; [Watch & Learn](https://www.youtube.com/playlist?list=PLPIzp-E1msrbJ3WawXVhzimQnLw5iafcp) &nbsp;&nbsp;[Blogs & Tutorials](https://oracle-devrel.github.io/cd3-automation-toolkit/latest/tutorials/) &nbsp;&nbsp;[Livelabs](https://apexapps.oracle.com/pls/apex/f?p=133:180:112501098061930::::wid:3724) &nbsp;&nbsp;[Slack Channel](https://oracle-devrel.github.io/cd3-automation-toolkit/latest/queries)
1111

1212
<br>
1313

cd3_automation_toolkit/Database/create_terraform_mysql_configuration.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ def make_config_value(config):
6565
for i in df.index:
6666
# Get values from row
6767
region = str(df.loc[i, 'Region']).strip()
68+
if (region in commonTools.endNames):
69+
break
70+
region = region.strip().lower()
6871
compartment_name = str(df.loc[i, 'Compartment Name']).strip()
6972
display_name = str(df.loc[i, 'Display Name']).strip()
7073
description = str(df.loc[i, 'Description']).strip()

cd3_automation_toolkit/Database/create_terraform_mysql_db.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def create_terraform_mysql_db(inputfile, outdir, service_dir, prefix, ct):
5050

5151
# Iterate over rows
5252
for i in df.index:
53-
region = str(df.loc[i, 'Region']).strip().lower()
53+
region = str(df.loc[i, 'Region']).strip()
5454

5555
if (region in commonTools.endNames):
5656
break

cd3_automation_toolkit/Database/templates/mysql-template

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,6 @@ mysql_db_system = {
2525
mysql_db_system_fault_domain = "{{ fault_domain }}"
2626
configuration_compartment_id = "{{ configuration_compartment_id }}"
2727
configuration_id = "{{ configuration_id }}"
28-
{% if depends_on_mysql_configuration %}
29-
# Add explicit depends_on to ensure configuration is created first
30-
depends_on = ["module.mysql_configurations[\"{{ configuration_id }}\"]"]
31-
{% endif %}
3228
mysql_shape_name = "{{ shape }}"
3329
vcn_names = "{{ vcn_names }}"
3430
subnet_id = "{{ subnet_id }}"

cd3_automation_toolkit/DeveloperServices/OKE/templates/nodepool-template

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ nodepools = {
3939
{% if boot_volume_size_in_gbs %}
4040
boot_volume_size_in_gbs = {{ boot_volume_size_in_gbs }}
4141
{% endif %}
42+
{% if is_pv_encryption_in_transit_enabled %}
43+
is_pv_encryption_in_transit_enabled = {{ is_pv_encryption_in_transit_enabled }}
44+
{% endif %}
45+
{% if init_script_path %}
46+
init_script_path = "{{ init_script_path }}"
47+
{% endif %}
4248
{% if oke_labels and oke_labels != 'nan' and defined_tags != '' and oke_labels != [['nan']] %}
4349
{% if oke_labels[0] %}
4450
initial_node_labels = {

cd3_automation_toolkit/Identity/Users/export_users_nonGreenField.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,14 @@ def export_users(inputfile, outdir, service_dir, config, signer, ct,export_domai
112112
domain_name = domain_key.split("@")[1]
113113
domain_client = oci.identity_domains.IdentityDomainsClient(config=config, signer=signer,retry_strategy=oci.retry.DEFAULT_RETRY_STRATEGY,
114114
service_endpoint=idcs_endpoint)
115-
list_users_response = domain_client.list_users() # change this to pagination once api supports
116-
users = list_users_response.data.resources
117-
while list_users_response.has_next_page:
118-
list_users_response = domain_client.list_users(page=list_users_response.next_page)
119-
users.extend(list_users_response.data.resources)
115+
users = []
116+
next_page = None
117+
while True:
118+
response = domain_client.list_users(page=next_page)
119+
users.extend(response.data.resources)
120+
if not response.next_page or len(users) == response.data.total_results:
121+
break
122+
next_page = response.next_page
120123

121124
index = 0
122125
for user in users:

cd3_automation_toolkit/Identity/export_identity_nonGreenField.py

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -359,13 +359,18 @@ def process_group(grp_info, members_list,membership_id_list, domain_name, is_dyn
359359
domain_name = domain_key.split("@")[1]
360360
domain_client = oci.identity_domains.IdentityDomainsClient(config=config, signer=signer,retry_strategy=oci.retry.DEFAULT_RETRY_STRATEGY,
361361
service_endpoint=idcs_endpoint)
362-
list_groups_response = domain_client.list_groups(attributes=['members'], attribute_sets=['all'])
363-
groups = list_groups_response.data.resources
364-
page_done = []
365-
while list_groups_response.has_next_page and list_groups_response.next_page not in page_done:
366-
page_done.append(list_groups_response.next_page)
367-
list_groups_response = domain_client.list_groups(attributes=['members'], attribute_sets=['all'],page=list_groups_response.next_page)
368-
groups.extend(list_groups_response.data.resources)
362+
groups = []
363+
next_page = None
364+
while True:
365+
response = domain_client.list_groups(
366+
attributes=['members'],
367+
attribute_sets=['all'],
368+
page=next_page
369+
)
370+
groups.extend(response.data.resources)
371+
if not response.next_page or len(groups) == response.data.total_results:
372+
break
373+
next_page = response.next_page
369374

370375
for grp_info in groups:
371376
if grp_info.display_name in ["Domain_Administrators", "All Domain Users", "Administrators"]:
@@ -374,16 +379,18 @@ def process_group(grp_info, members_list,membership_id_list, domain_name, is_dyn
374379
members_list = [section.name for section in grp_info.members if section and section.name] if grp_info.members else []
375380
importCommands, values_for_column_groups = process_group(grp_info, members_list,[], domain_name, is_dynamic=False, importCommands=importCommands, values_for_column_groups=values_for_column_groups)
376381

377-
dyngroups_response = domain_client.list_dynamic_resource_groups(attributes=['matching_rule'],
378-
attribute_sets=['all']
379-
)
380-
dyngroups = dyngroups_response.data.resources
381-
while dyngroups_response.has_next_page:
382-
dyngroups_response = domain_client.list_dynamic_resource_groups(attributes=['matching_rule'],
383-
attribute_sets=['all'],
384-
page=dyngroups_response.next_page
385-
)
386-
dyngroups.extend(dyngroups_response.data.resources)
382+
dyngroups = []
383+
next_page = None
384+
while True:
385+
response = domain_client.list_dynamic_resource_groups(
386+
attributes=['matching_rule'],
387+
attribute_sets=['all'],
388+
page=next_page
389+
)
390+
dyngroups.extend(response.data.resources)
391+
if not response.next_page or len(dyngroups) == response.data.total_results:
392+
break
393+
next_page = response.next_page
387394

388395
for dg in dyngroups:
389396
total_g += 1

cd3_automation_toolkit/Network/BaseNetwork/exportRoutetable.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,11 @@ def insert_values(routetable,values_for_column,region,comp_name,name,routerule,e
209209

210210
elif (routerule != None and col_header == 'Route Destination Object'):
211211
network_entity_id = routerule.network_entity_id
212-
network_entity_name = get_network_entity_name(config, signer, network_entity_id,export_tags)
212+
try:
213+
network_entity_name = get_network_entity_name(config, signer, network_entity_id,export_tags)
214+
except Exception as e:
215+
print("\nCheck route rules for Route Table: '"+routetable.display_name+"' and Re-Try")
216+
exit(1)
213217
values_for_column[col_header].append(network_entity_name)
214218
if ('internetgateway' in network_entity_id):
215219
if (routerule.destination not in values_for_vcninfo['igw_destinations']):
@@ -240,7 +244,11 @@ def insert_values_drg(routetable,import_drg_route_distribution_name,values_for_c
240244

241245
elif (routerule != None and col_header == 'Next Hop Attachment'):
242246
next_hop_attachment_id=routerule.next_hop_drg_attachment_id
243-
network_entity_name = get_network_entity_name(config, signer, next_hop_attachment_id,export_tags)
247+
try:
248+
network_entity_name = get_network_entity_name(config, signer, next_hop_attachment_id,export_tags)
249+
except Exception as e:
250+
print("\nCheck route rules for DRG Route Table: '"+routetable.display_name+"' and Re-Try")
251+
exit(1)
244252
values_for_column_drg[col_header].append(network_entity_name)
245253

246254
else:

cd3_automation_toolkit/Network/BaseNetwork/export_network_nonGreenField.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from .exportSeclist import export_seclist
1010
from .exportNSG import export_nsg
1111
import subprocess as sp
12+
from pathlib import Path
1213

1314
sys.path.append(os.getcwd() + "/..")
1415
from commonTools import *
@@ -348,6 +349,9 @@ def get_drg_rt_name(drg_rpc_attachment_list, source_rpc_id, rpc_source_client, d
348349

349350
def get_rpc_resources(source_region, SOURCE_RPC_LIST, dest_rpc_dict, rpc_source_client, ct, values_for_column,
350351
ntk_compartment_name, outdir, drg_info, drg_attachment_info, state_rpc):
352+
# Get path to OCI_Regions file relative to current rpc script
353+
oci_regions_path = Path(__file__).resolve().parents[2] / "OCI_Regions"
354+
351355
# Variables
352356
dest_rpc_drg_name = ""
353357
src_drg_rt_name = ""
@@ -456,7 +460,8 @@ def get_comp_details(comp_data):
456460
# Fetch Dest DRG RT name, id
457461
if dest_drg_rpc_attachment_list.data:
458462
dest_drg_rt_name, dest_drg_rt_id = get_drg_rt_name(dest_drg_rpc_attachment_list,
459-
dest_rpc_id, client,dest_rpc.drg_id)
463+
dest_rpc_id, client,
464+
dest_rpc.drg_id)
460465

461466
if dest_drg_rt_name is not None:
462467
# Fetch source DRG import route distribution id, name
@@ -467,15 +472,24 @@ def get_comp_details(comp_data):
467472
dest_import_rt_info = client.get_drg_route_distribution(
468473
drg_route_distribution_id=dest_drg_rt_import_dist_id)
469474
dest_drg_rt_dist_info = dest_import_rt_info
470-
dest_drg_rt_import_dist_name = getattr(dest_import_rt_info.data, "display_name")
475+
dest_drg_rt_import_dist_name = getattr(dest_import_rt_info.data,
476+
"display_name")
471477
dest_import_rt_statements = client.list_drg_route_distribution_statements(
472478
drg_route_distribution_id=dest_drg_rt_import_dist_id)
473479

474-
tf_resource = f'module.rpcs[\\"{rpc_tf_name}\\"].oci_core_remote_peering_connection.{source_region.lower()}_{region.lower()}_requester_rpc[\\"region\\"]'
480+
source_region_for_tf = next(
481+
line.split(':')[1].strip().replace("-", "_") for line in open(oci_regions_path) if
482+
line.startswith(f"{source_region.lower()}:"))
483+
484+
region_for_tf = next(
485+
line.split(':')[1].strip().replace("-", "_") for line in open(oci_regions_path) if
486+
line.startswith(f"{region.lower()}:"))
487+
488+
tf_resource = f'module.rpcs[\\"{rpc_tf_name}\\"].oci_core_remote_peering_connection.{source_region_for_tf}_{region_for_tf}_requester_rpc[\\"region\\"]'
475489
if tf_resource not in state_rpc["resources"]:
476490
importCommands_rpc["global"].write(
477491
f'\n{tf_or_tofu} import "{tf_resource}" {str(source_rpc_id)}')
478-
tf_resource = f'module.rpcs[\\"{rpc_tf_name}\\"].oci_core_remote_peering_connection.{source_region.lower()}_{region.lower()}_accepter_rpc[\\"region\\"]'
492+
tf_resource = f'module.rpcs[\\"{rpc_tf_name}\\"].oci_core_remote_peering_connection.{source_region_for_tf}_{region_for_tf}_accepter_rpc[\\"region\\"]'
479493
if tf_resource not in state_rpc["resources"]:
480494
importCommands_rpc["global"].write(
481495
f'\n{tf_or_tofu} import "{tf_resource}" {str(dest_rpc_id)}')
@@ -589,6 +603,7 @@ def get_comp_details(comp_data):
589603
rpc_safe_file["global"].close()
590604

591605

606+
592607
def export_major_objects(inputfile, outdir, service_dir, config, signer, ct, export_compartments=[], export_regions=[],
593608
export_tags=[]):
594609
global sheet_dict_vcns

0 commit comments

Comments
 (0)