public async prompts()

in source/packages/services/installer/src/commands/modules/service/provisioning.ts [54:261]


    public async prompts(answers: Answers): Promise<Answers> {
        delete answers.provisioning?.redeploy;

        let updatedAnswers: Answers = await inquirer.prompt(
            [redeployIfAlreadyExistsPrompt(this.name, this.stackName)],
            answers
        );

        if ((updatedAnswers.provisioning?.redeploy ?? true) === false) {
            return updatedAnswers;
        }

        if (updatedAnswers.provisioning === undefined) {
            updatedAnswers.provisioning = {};
        }

        const pcaAliases = await this.getPcaAliases(answers);
        updatedAnswers.provisioning.pcaAliases = pcaAliases;

        const iotCaAliases = await this.getIotCaAliases(answers);
        updatedAnswers.provisioning.iotCaAliases = iotCaAliases;

        // eslint-disable-next-line
        const _ = this;

        updatedAnswers = await inquirer.prompt(
            [
                {
                    message: `ACM PCA integration enabled ?`,
                    type: 'confirm',
                    name: 'provisioning.pcaIntegrationEnabled',
                    default: answers.provisioning?.pcaIntegrationEnabled ?? false,
                    askAnswered: true,
                },

                {
                    message: `If using ACM PCA, and ACM PCA is located in another AWS Account, enter the IAM cross-account role (leave blank otherwise)`,
                    type: 'input',
                    name: 'provisioning.pcaCrossAccountRoleArn',
                    default: answers.provisioning?.pcaCrossAccountRoleArn ?? '',
                    askAnswered: true,
                    validate(answer: string) {
                        if (answer?.length === 0) {
                            return true;
                        }
                        return CommonArnValidations.validateAwsIAMRoleArn(answer);
                    },
                    when(answers: Answers) {
                        return answers.provisioning?.pcaIntegrationEnabled;
                    },
                },

                {
                    message: `If ACM PCA is located in a different region, enter the region name (leave blank for default region)`,
                    type: 'input',
                    name: 'provisioning.pcaRegion',
                    default: answers.provisioning?.pcaRegion ?? answers.region,
                    askAnswered: true,
                    validate(answer: string) {
                        if (answer?.length === 0) {
                            return false;
                        }
                        return true;
                    },
                    when(answers: Answers) {
                        return answers.provisioning?.pcaIntegrationEnabled;
                    },
                },
            ],
            updatedAnswers
        );

        updatedAnswers = await inquirer.prompt(
            [
                {
                    message: `Create or modify AWS IoT CA alias list ?`,
                    type: 'confirm',
                    name: 'provisioning.setIotCaAliases',
                    default: answers.provisioning?.setIotCaAliases ?? true,
                    askAnswered: true,
                    when(answers: Answers) {
                        return answers.provisioning?.pcaIntegrationEnabled;
                    },
                },
            ],
            updatedAnswers
        );

        //Collect the IoT CA List
        let iotCaFinished = false;
        if (updatedAnswers.provisioning?.setIotCaAliases) {
            while (!iotCaFinished) {
                const iotCaAliases = await this.getIotCaAliases(updatedAnswers);
                updatedAnswers.provisioning.iotCaAliases = iotCaAliases;
                updatedAnswers = await inquirer.prompt(
                    [..._.getIoTCAPrompt(answers, iotCaAliases)],
                    updatedAnswers
                );
                // Update the iotCaAlias to upper case
                if (updatedAnswers.provisioning.iotCaAlias === undefined) {
                    updatedAnswers.provisioning.iotCaFinished = true;
                } else {
                    updatedAnswers.provisioning.iotCaAlias =
                        updatedAnswers.provisioning.iotCaAlias.toUpperCase();
                    if (
                        !updatedAnswers.provisioning.iotCaAliases.list.includes(
                            updatedAnswers.provisioning.iotCaAlias
                        )
                    ) {
                        const alias = updatedAnswers.provisioning.iotCaAlias;
                        const value = updatedAnswers.provisioning.iotCaArn;
                        updatedAnswers.provisioning.iotCaAliases.cas.push({ alias, value });
                        updatedAnswers.provisioning.iotCaAliases.list.push(alias);
                    }
                }

                iotCaFinished = updatedAnswers.provisioning.iotCaFinished;
            }
        }

        updatedAnswers = await inquirer.prompt(
            [
                {
                    message: `Create or modify ACM PCA CA alias list ?`,
                    type: 'confirm',
                    name: 'provisioning.setPcaAliases',
                    default: answers.provisioning?.setPcaAliases ?? true,
                    askAnswered: true,
                    when(answers: Answers) {
                        return answers.provisioning?.pcaIntegrationEnabled;
                    },
                },
            ],
            updatedAnswers
        );

        //Collect the ACM PCA List
        let pcaFinished = false;
        if (updatedAnswers.provisioning?.setPcaAliases) {
            while (!pcaFinished) {
                const pcaAliases = await this.getPcaAliases(updatedAnswers);
                updatedAnswers.provisioning.pcaAliases = pcaAliases;
                updatedAnswers = await inquirer.prompt(
                    [..._.getPCAPrompt(answers, pcaAliases)],
                    updatedAnswers
                );
                if (updatedAnswers.provisioning.pcaAlias === undefined) {
                    updatedAnswers.provisioning.pcaFinished = true;
                } else {
                    // Update the pcaAlias to upper case to be stored in the installer config
                    updatedAnswers.provisioning.pcaAlias =
                        updatedAnswers.provisioning.pcaAlias.toUpperCase();
                    if (
                        !updatedAnswers.provisioning.pcaAliases.list.includes(
                            updatedAnswers.provisioning.pcaAlias
                        )
                    ) {
                        const alias = updatedAnswers.provisioning.pcaAlias;
                        const value = updatedAnswers.provisioning.pcaArn;
                        updatedAnswers.provisioning.pcaAliases.cas.push({ alias, value });
                        updatedAnswers.provisioning.pcaAliases.list.push(alias);
                    }
                }
                pcaFinished = updatedAnswers.provisioning.pcaFinished;
            }
        }

        updatedAnswers = await inquirer.prompt(
            [
                ...customDomainPrompt(this.name, answers),
                ...applicationConfigurationPrompt(this.name, answers, [
                    {
                        question: 'Allow service to delete AWS IoT Certificates ?',
                        defaultConfiguration: false,
                        propertyName: 'deleteCertificates',
                    },
                    {
                        question: 'Allow service to delete AWS IoT Policies ?',
                        defaultConfiguration: false,
                        propertyName: 'deletePolicies',
                    },
                    {
                        question: 'Certificate expiry in days ?',
                        defaultConfiguration: 365,
                        propertyName: 'certificateExpiryInDays',
                    },
                    {
                        question: 'The S3 key suffix where templates are stored ?',
                        defaultConfiguration: '.json',
                        propertyName: 'templateSuffix',
                    },
                    {
                        question: 'The S3 key prefix where templates are stored ?',
                        defaultConfiguration: 'templates/',
                        propertyName: 'templatesPrefix',
                    },
                    {
                        question: 'The S3 key prefix where bulk requests are stored ?',
                        defaultConfiguration: 'bullkrequests/',
                        propertyName: 'bulkRequestsPrefix',
                    },
                ]),
            ],
            updatedAnswers
        );

        return updatedAnswers;
    }