def main()

in static/watool/200_Using_AWSCLI_To_Manage_WA_Reviews/Code/LabExample.py [0:0]


def main():
    boto3_min_version = "1.16.38"
    # Verify if the version of Boto3 we are running has the wellarchitected APIs included
    if (packaging.version.parse(boto3.__version__) < packaging.version.parse(boto3_min_version)):
        logger.error("Your Boto3 version (%s) is less than %s. You must ugprade to run this script (pip3 upgrade boto3)" % (boto3.__version__, boto3_min_version))
        exit()

    # STEP 1 - Configure environment
    logger.info("1 - Starting Boto %s Session" % boto3.__version__)
    # Create a new boto3 session
    SESSION = boto3.session.Session()
    # Initiate the well-architected session using the region defined above
    WACLIENT = SESSION.client(
        service_name='wellarchitected',
        region_name=REGION_NAME,
    )

    WORKLOADNAME = 'WA Lab Test Workload'
    DESCRIPTION = 'Test Workload for WA Lab'
    REVIEWOWNER = 'WA Python Script'
    ENVIRONMENT= 'PRODUCTION'
    AWSREGIONS = [REGION_NAME]
    LENSES = ['wellarchitected', 'serverless']

    # STEP 2 - Creating a workload
    #  https://wellarchitectedlabs.com/well-architectedtool/200_labs/200_using_awscli_to_manage_wa_reviews/2_create_workload/
    logger.info("2 - Creating a new workload")
    CreateNewWorkload(WACLIENT,WORKLOADNAME,DESCRIPTION,REVIEWOWNER,ENVIRONMENT,AWSREGIONS,LENSES)

    logger.info("2 - Finding your WorkloadId")
    workloadId = FindWorkload(WACLIENT,WORKLOADNAME)
    logger.info("New workload created with id %s" % workloadId)


    logger.info("2 - Using WorkloadId to remove and add lenses")
    listOfLenses = listLens(WACLIENT)
    logger.info("Lenses currently available: %s" % listOfLenses)
    workloadJson = GetWorkload(WACLIENT,workloadId)
    logger.info("Workload ID '%s' has lenses '%s'" % (workloadId, workloadJson['Lenses']))
    logger.info("Removing the serverless lens")
    disassociateLens(WACLIENT,workloadId,['serverless'])

    workloadJson = GetWorkload(WACLIENT,workloadId)
    logger.info("Now workload ID '%s' has lenses '%s'" % (workloadId, workloadJson['Lenses']))

    logger.info("Adding serverless lens back into the workload")
    associateLens(WACLIENT,workloadId,['serverless'])
    workloadJson = GetWorkload(WACLIENT,workloadId)
    logger.info("Now workload ID '%s' has lenses '%s'" % (workloadId, workloadJson['Lenses']))

    # STEP 3 - Performing a review
    # https://wellarchitectedlabs.com/well-architectedtool/200_labs/200_using_awscli_to_manage_wa_reviews/3_perform_review/
    logger.info("3 - Performing a review")

    logger.info("3 - STEP1 - Find the QuestionId and ChoiceID for a particular pillar question and best practice")
    questionSearch = "How do you reduce defects, ease remediation, and improve flow into production"
    questionId = findQuestionId(WACLIENT,workloadId,'wellarchitected','operationalExcellence',questionSearch)
    logger.info("Found QuestionID of '%s' for the question text of '%s'" % (questionId, questionSearch))

    choiceSet = []
    choiceSet.append(findChoiceId(WACLIENT,workloadId,'wellarchitected',questionId,"Use version control"))
    logger.info("Found choiceId of '%s' for the choice text of 'Use version control'" % choiceSet)
    choiceSet.append(findChoiceId(WACLIENT,workloadId,'wellarchitected',questionId,"Use configuration management systems"))
    choiceSet.append(findChoiceId(WACLIENT,workloadId,'wellarchitected',questionId,"Use build and deployment management systems"))
    choiceSet.append(findChoiceId(WACLIENT,workloadId,'wellarchitected',questionId,"Perform patch management"))
    choiceSet.append(findChoiceId(WACLIENT,workloadId,'wellarchitected',questionId,"Use multiple environments"))
    logger.info("All choices we will select for questionId of %s is %s" % (questionId, choiceSet))

    logger.info("3 - STEP2 - Use the QuestionID and ChoiceID to update the answer in well-architected review")
    answers = getAnswersForQuestion(WACLIENT,workloadId,'wellarchitected',questionId)
    logger.info("Current answer for questionId '%s' is '%s'" % (questionId, answers))
    logger.info("Adding answers found in choices above (%s)" % choiceSet)

    updateAnswersForQuestion(WACLIENT,workloadId,'wellarchitected',questionId,choiceSet,'Added by Python')
    answers = getAnswersForQuestion(WACLIENT,workloadId,'wellarchitected',questionId)
    logger.info("Now the answer for questionId '%s' is '%s'" % (questionId, answers))


    # STEP 4 - Saving a milestone
    # https://wellarchitectedlabs.com/well-architectedtool/200_labs/200_using_awscli_to_manage_wa_reviews/4_save_milestone/
    logger.info("4 - Saving a Milestone")

    logger.info("4 - STEP1 - Create a Milestone")

    milestones = listMilestones(WACLIENT,workloadId)
    milestoneCount = jmespath.search("length([*].MilestoneNumber)",milestones)
    logger.info("Workload %s has %s milestones" % (workloadId, milestoneCount))

    milestoneNumber = createMilestone(WACLIENT,workloadId,'Rev1')
    logger.info("Created Milestone #%s called Rev1" % milestoneNumber)

    logger.info("4 - STEP2 - List all Milestones")

    milestones = listMilestones(WACLIENT,workloadId)
    milestoneCount = jmespath.search("length([*].MilestoneNumber)",milestones)
    logger.info("Now workload %s has %s milestones" % (workloadId, milestoneCount))

    logger.info("4 - STEP3 - Retrieve the results from a milestone")

    riskCounts = getMilestoneRiskCounts(WACLIENT,workloadId,milestoneNumber)
    logger.info("Risk counts for all lenses for milestone %s are: %s " % (milestoneNumber,riskCounts))

    logger.info("4 - STEP4 - List all question and answers based from a milestone")
    answers = listAllAnswers(WACLIENT,workloadId,'wellarchitected',milestoneNumber)

    # STEP 5 - Viewing and downloading the report
    # https://wellarchitectedlabs.com/well-architectedtool/200_labs/200_using_awscli_to_manage_wa_reviews/5_view_report/
    logger.info("5 - Viewing and downloading the report")
    logger.info("5 - STEP1 - Gather pillar and risk data for a workload")

    lensReview = getLensReview(WACLIENT,workloadId,'wellarchitected')
    logger.info("The Well-Architected base framework has the following RiskCounts %s " % lensReview['RiskCounts'])


    logger.info("5 - STEP2 - Generate and download workload PDF")
    lensReviewBase64PDF = getLensReviewPDFReport(WACLIENT,workloadId,'wellarchitected')
    # lensReviewPDF = base64.b64decode(lensReviewBase64PDF)
    # We will write the PDF to a file in the same directory
    with open("WAReviewOutput.pdf", "wb") as fh:
        fh.write(base64.b64decode(lensReviewBase64PDF))

    # STEP 6 - Teardown
    # https://wellarchitectedlabs.com/well-architectedtool/200_labs/200_using_awscli_to_manage_wa_reviews/6_cleanup/
    logger.info("6 - Teardown")

    # Allow user to keep the workload
    input("\n*** Press Enter to delete the workload or use ctrl-c to abort the script and keep the workload")

    logger.info("6 - STEP1 - Delete Workload")
    DeleteWorkload(WACLIENT, workloadId)