def _get_product_id()

in control-tower-account-factory/src/common.py [0:0]


    def _get_product_id(self, product_name, product_version, portfolio_name):
        """Return product id , artifact id and path id for porvided product and porfolio name"""

        product_id = None
        artifact_id = None
        path_id = None
        version = None

        # add lamda role to portfolio
        if not self.__add_lambda_to_portfolio_principal(portfolio_name):
            return product_id, artifact_id, path_id

        self._log_info(f'Searching product name: {product_name}')

        try:

            sc_response = self.sc_client.search_products_as_admin(
                SortBy='Title',
                SortOrder='ASCENDING',
                ProductSource='ACCOUNT',
                Filters={
                    'FullTextSearch': [
                        product_name
                    ]
                }
            )

            product_list = []
            #Iterate through all return products
            for product in sc_response['ProductViewDetails']:
                # find product
                if product_name in product['ProductViewSummary']['Name']:
                    product_list.append({'ProductId': product['ProductViewSummary']['ProductId'], 'CreatedTime': product['CreatedTime']})

            # if product found
            if product_list:
                # if more the on product get the latest one based on the date/time
                last_product_id = max(product_list, key=lambda item: item['CreatedTime'])
                product_id = last_product_id['ProductId']

                # search artifacts (versions) of product
                product_artifacts = self.sc_client.list_provisioning_artifacts(
                    AcceptLanguage='en',
                    ProductId=product_id
                )

                if product_version:
                    version = product_version
                    for artifact in product_artifacts['ProvisioningArtifactDetails']:
                        # find product that match provided version
                        if artifact['Name'] == product_version:
                            artifact_id = artifact['Id']
                else:
                    # get last product version by creation date
                    last_artifact_id = max(product_artifacts['ProvisioningArtifactDetails'], key=lambda item: item['CreatedTime'])
                    artifact_id = last_artifact_id['Id']
                    version = last_artifact_id['Name']

                # get product launch path id
                launch_paths_list = self.sc_client.list_launch_paths(
                    ProductId=product_id
                )
                for launch_path in launch_paths_list['LaunchPathSummaries']:
                    if launch_path['Name'] == portfolio_name:
                        path_id = launch_path['Id']

        except ClientError as error:
            self._log_error(f'Error obtain id for product: {product_name}. Error: {error.response["Error"]}')
            self._send_notification('Error obtain product id', f'Product name: {product_name}. Error: {error.response["Error"]}')

        return product_id, artifact_id, path_id, version