Skip to content

Commit aad1dde

Browse files
author
Taniya Mathur
committed
Fix YAML syntax error in deployment validation script
1 parent bcbb3dc commit aad1dde

File tree

1 file changed

+82
-81
lines changed

1 file changed

+82
-81
lines changed

.gitlab-ci.yml

Lines changed: 82 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -114,85 +114,86 @@ deployment_validation:
114114
# Validate CloudFormation service role template syntax
115115
- aws cloudformation validate-template --template-body file://iam-roles/cloudformation-management/IDP-Cloudformation-Service-Role.yaml --no-cli-pager
116116
# Check if service role has sufficient permissions for main stack deployment
117-
- python3 -c "
118-
import yaml
119-
import sys
120-
import os
121-
import glob
122-
123-
def extract_aws_services_from_template(template_path):
124-
'''Extract AWS services used in a CloudFormation template'''
125-
try:
126-
with open(template_path, 'r') as f:
127-
template = yaml.safe_load(f)
128-
129-
services = set()
130-
if 'Resources' in template:
131-
for resource in template['Resources'].values():
132-
if 'Type' in resource:
133-
resource_type = resource['Type']
134-
if resource_type.startswith('AWS::'):
135-
service = resource_type.split('::')[1].lower()
136-
services.add(service)
137-
return services
138-
except Exception as e:
139-
print(f'Error processing {template_path}: {e}')
140-
return set()
141-
142-
def extract_permissions_from_role(role_template_path):
143-
'''Extract permissions from IAM role template'''
144-
with open(role_template_path, 'r') as f:
145-
role_template = yaml.safe_load(f)
146-
147-
permissions = set()
148-
for resource in role_template['Resources'].values():
149-
if resource['Type'] == 'AWS::IAM::Role':
150-
for policy in resource['Properties']['Policies']:
151-
for statement in policy['PolicyDocument']['Statement']:
152-
if statement['Effect'] == 'Allow':
153-
actions = statement['Action']
154-
if isinstance(actions, str):
155-
permissions.add(actions)
156-
else:
157-
permissions.update(actions)
158-
return permissions
159-
160-
# Extract permissions from service role
161-
role_permissions = extract_permissions_from_role('iam-roles/cloudformation-management/IDP-Cloudformation-Service-Role.yaml')
162-
163-
# Find all CloudFormation templates
164-
template_files = []
165-
template_files.append('template.yaml') # Main template
166-
template_files.extend(glob.glob('patterns/*/template.yaml'))
167-
template_files.extend(glob.glob('options/*/template.yaml'))
168-
169-
# Extract required services from all templates
170-
required_services = set()
171-
for template_file in template_files:
172-
if os.path.exists(template_file):
173-
services = extract_aws_services_from_template(template_file)
174-
required_services.update(services)
175-
print(f'Services in {template_file}: {sorted(services)}')
176-
177-
print(f'\\nAll required services: {sorted(required_services)}')
178-
179-
# Check if role has permissions for each service
180-
missing_services = []
181-
for service in required_services:
182-
# Check if role has wildcard or specific permissions for this service
183-
has_permission = any(
184-
perm == f'{service}:*' or
185-
perm.startswith(f'{service}:') or
186-
perm == '*'
187-
for perm in role_permissions
188-
)
189-
if not has_permission:
190-
missing_services.append(service)
191-
192-
if missing_services:
193-
print(f'\\nWARNING: Service role may be missing permissions for: {sorted(missing_services)}')
194-
sys.exit(1)
195-
else:
196-
print(f'\\nSUCCESS: Service role appears to have sufficient permissions for all required services')
197-
"
117+
- |
118+
python3 -c "
119+
import yaml
120+
import sys
121+
import os
122+
import glob
123+
124+
def extract_aws_services_from_template(template_path):
125+
'''Extract AWS services used in a CloudFormation template'''
126+
try:
127+
with open(template_path, 'r') as f:
128+
template = yaml.safe_load(f)
129+
130+
services = set()
131+
if 'Resources' in template:
132+
for resource in template['Resources'].values():
133+
if 'Type' in resource:
134+
resource_type = resource['Type']
135+
if resource_type.startswith('AWS::'):
136+
service = resource_type.split('::')[1].lower()
137+
services.add(service)
138+
return services
139+
except Exception as e:
140+
print(f'Error processing {template_path}: {e}')
141+
return set()
142+
143+
def extract_permissions_from_role(role_template_path):
144+
'''Extract permissions from IAM role template'''
145+
with open(role_template_path, 'r') as f:
146+
role_template = yaml.safe_load(f)
147+
148+
permissions = set()
149+
for resource in role_template['Resources'].values():
150+
if resource['Type'] == 'AWS::IAM::Role':
151+
for policy in resource['Properties']['Policies']:
152+
for statement in policy['PolicyDocument']['Statement']:
153+
if statement['Effect'] == 'Allow':
154+
actions = statement['Action']
155+
if isinstance(actions, str):
156+
permissions.add(actions)
157+
else:
158+
permissions.update(actions)
159+
return permissions
160+
161+
# Extract permissions from service role
162+
role_permissions = extract_permissions_from_role('iam-roles/cloudformation-management/IDP-Cloudformation-Service-Role.yaml')
163+
164+
# Find all CloudFormation templates
165+
template_files = []
166+
template_files.append('template.yaml') # Main template
167+
template_files.extend(glob.glob('patterns/*/template.yaml'))
168+
template_files.extend(glob.glob('options/*/template.yaml'))
169+
170+
# Extract required services from all templates
171+
required_services = set()
172+
for template_file in template_files:
173+
if os.path.exists(template_file):
174+
services = extract_aws_services_from_template(template_file)
175+
required_services.update(services)
176+
print(f'Services in {template_file}: {sorted(services)}')
177+
178+
print(f'\\nAll required services: {sorted(required_services)}')
179+
180+
# Check if role has permissions for each service
181+
missing_services = []
182+
for service in required_services:
183+
# Check if role has wildcard or specific permissions for this service
184+
has_permission = any(
185+
perm == f'{service}:*' or
186+
perm.startswith(f'{service}:') or
187+
perm == '*'
188+
for perm in role_permissions
189+
)
190+
if not has_permission:
191+
missing_services.append(service)
192+
193+
if missing_services:
194+
print(f'\\nWARNING: Service role may be missing permissions for: {sorted(missing_services)}')
195+
sys.exit(1)
196+
else:
197+
print(f'\\nSUCCESS: Service role appears to have sufficient permissions for all required services')
198+
"
198199

0 commit comments

Comments
 (0)