in control-tower-account-factory/src/handler.py [0:0]
def __baseline_products(self, products, action):
"""
go through product configuration
check deployment dependencies
start deployment
"""
status = 'done'
for product in products:
# check if product was deployed or failed/skipped deployment
if product['provision_name'] in self.response['deployed_products'] or product['provision_name'] in self.response['failed_products'] or product['provision_name'] in self.response['skipped_products']:
if product['provision_name'] in self.response['deployed_products']:
# check deployemnt status
provision_status = self.__get_provision_status(product['provision_name'])
self._log_info(f'Deployemnt Status - Product: {product["provision_name"]} Status: {provision_status}')
if provision_status in ['error', 'failed']:
self.response['failed_products'].append(product['provision_name'])
self.response['deployed_products'].remove(product['provision_name'])
self._update_deployment_status(product, 'failed')
elif provision_status != 'done':
status = 'progress'
else:
self._update_deployment_status(product, 'done')
continue
# if no dependencies, deploy product
if 'dependson' not in product:
if self.__process_product(product, action):
self.response['deployed_products'].append(product['provision_name'])
status = 'progress'
else:
self.response['failed_products'].append(product['provision_name'])
status = 'failed'
else:
depend_status = 'done'
for depend_product in product['dependson']:
depend_product = f'{self.destination_account}-{depend_product}'
self._log_info(f'Checking dependency {depend_product} for product {product["provision_name"]}')
if depend_product in self.response['failed_products'] or depend_product in self.response['skipped_products']:
self._log_info(f'Status dependency {depend_product} for product {product["provision_name"]}: failed')
self.response['skipped_products'].append(product['provision_name'])
depend_status = 'failed'
break
# if dependency on the list but did not start deployment, wait
elif depend_product in self.deployment_products_list and depend_product not in self.response['deployed_products']:
self._log_info(f'Status dependency {depend_product} for product {product["provision_name"]}: not started')
depend_status = 'progress'
self.iterate = True
# otherwise check dependency deployment status
else:
provision_status = self.__get_provision_status(depend_product)
self._log_info(f'Status dependency {depend_product} for product {product["provision_name"]}: {provision_status}')
# if any dependencies failed to deploy, skip product deployment
if provision_status in ['error', 'failed']:
self.response['failed_products'].append(depend_product)
self.response['skipped_products'].append(product['provision_name'])
depend_status = 'failed'
break
elif provision_status != 'done':
depend_status = 'progress'
# if all dependencies deployed successfuly, start product deployment
if depend_status == 'done':
if self.__process_product(product, action):
self.response['deployed_products'].append(product['provision_name'])
status = 'progress'
else:
self.response['failed_products'].append(product['provision_name'])
return status