def __baseline_products()

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