static/watool/200_Using_AWSCLI_To_Manage_WA_Reviews/Code/LabExample.py [274:485]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    return answers

def updateAnswersForQuestion(
    waclient,
    workloadId,
    lensAlias,
    questionId,
    selectedChoices,
    notes
    ):

    # Update a answer to a question
    try:
        response=waclient.update_answer(
        WorkloadId=workloadId,
        LensAlias=lensAlias,
        QuestionId=questionId,
        SelectedChoices=selectedChoices,
        Notes=notes
        )
    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    # print(json.dumps(response))
    jmesquery = "Answer.SelectedChoices"
    answers = jmespath.search(jmesquery, response)
    return answers

def listMilestones(
    waclient,
    workloadId
    ):

    # Find a milestone for a workloadId
    try:
        response=waclient.list_milestones(
        WorkloadId=workloadId,
        MaxResults=50 # Need to check why I am having to pass this parameter
        )
    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)
    # print("Full JSON:",json.dumps(response['MilestoneSummaries'], cls=DateTimeEncoder))
    milestoneNumber = response['MilestoneSummaries']
    return milestoneNumber

def createMilestone(
    waclient,
    workloadId,
    milestoneName
    ):

    # Create a new milestone with milestoneName
    try:
        response=waclient.create_milestone(
        WorkloadId=workloadId,
        MilestoneName=milestoneName
        )
    except waclient.exceptions.ConflictException as e:
        milestones = listMilestones(waclient,workloadId)
        jmesquery = "[?starts_with(MilestoneName,`"+milestoneName+"`) == `true`].MilestoneNumber"
        milestoneNumber = jmespath.search(jmesquery,milestones)
        logger.error("ERROR - The milestone name %s already exists as milestone %s" % (milestoneName, milestoneNumber))
        return milestoneNumber[0]
    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    # print("Full JSON:",json.dumps(response['MilestoneSummaries'], cls=DateTimeEncoder))
    milestoneNumber = response['MilestoneNumber']
    return milestoneNumber

def getMilestone(
    waclient,
    workloadId,
    milestoneNumber
    ):

    # Use get_milestone to return the milestone structure
    try:
        response=waclient.get_milestone(
        WorkloadId=workloadId,
        MilestoneNumber=milestoneNumber
        )
    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    # print("Full JSON:",json.dumps(response['Milestone'], cls=DateTimeEncoder))
    milestoneResponse = response['Milestone']
    return milestoneResponse

def getMilestoneRiskCounts(
    waclient,
    workloadId,
    milestoneNumber
    ):

    # Return just the RiskCount for a particular milestoneNumber

    milestone = getMilestone(waclient,workloadId,milestoneNumber)
    # print("Full JSON:",json.dumps(milestone['Workload']['RiskCounts'], cls=DateTimeEncoder))
    milestoneRiskCounts = milestone['Workload']['RiskCounts']
    return milestoneRiskCounts

def listAllAnswers(
    waclient,
    workloadId,
    lensAlias,
    milestoneNumber=""
    ):

    # Get a list of all answers
    try:
        if milestoneNumber:
            response=waclient.list_answers(
            WorkloadId=workloadId,
            LensAlias=lensAlias,
            MilestoneNumber=milestoneNumber
            )
        else:
            response=waclient.list_answers(
            WorkloadId=workloadId,
            LensAlias=lensAlias
            )

    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    answers = response['AnswerSummaries']
    while "NextToken" in response:
        if milestoneNumber:
            response = waclient.list_answers(WorkloadId=workloadId,LensAlias=lensAlias,MilestoneNumber=milestoneNumber,NextToken=response["NextToken"])
        else:
            response = waclient.list_answers(WorkloadId=workloadId,LensAlias=lensAlias,NextToken=response["NextToken"])
        answers.extend(response["AnswerSummaries"])

    # print("Full JSON:",json.dumps(answers, cls=DateTimeEncoder))
    return answers

def getLensReview(
    waclient,
    workloadId,
    lensAlias,
    milestoneNumber=""
    ):

    # Use get_lens_review to return the lens review structure
    try:
        if milestoneNumber:
            response=waclient.get_lens_review(
            WorkloadId=workloadId,
            LensAlias=lensAlias,
            MilestoneNumber=milestoneNumber
            )
        else:
            response=waclient.get_lens_review(
            WorkloadId=workloadId,
            LensAlias=lensAlias
            )

    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    # print("Full JSON:",json.dumps(response['LensReview'], cls=DateTimeEncoder))
    lensReview = response['LensReview']
    return lensReview

def getLensReviewPDFReport(
    waclient,
    workloadId,
    lensAlias,
    milestoneNumber=""
    ):

    # Use get_lens_review_report to return the lens review PDF in base64 structure
    try:
        if milestoneNumber:
            response=waclient.get_lens_review_report(
            WorkloadId=workloadId,
            LensAlias=lensAlias,
            MilestoneNumber=milestoneNumber
            )
        else:
            response=waclient.get_lens_review_report(
            WorkloadId=workloadId,
            LensAlias=lensAlias
            )

    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    # print("Full JSON:",json.dumps(response['LensReviewReport']['Base64String'], cls=DateTimeEncoder))
    lensReviewPDF = response['LensReviewReport']['Base64String']
    return lensReviewPDF


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)):
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



static/watool/utilities/Code/duplicateWAFR.py [399:609]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    return answers

def updateAnswersForQuestion(
    waclient,
    workloadId,
    lensAlias,
    questionId,
    selectedChoices,
    notes
    ):

    # Update a answer to a question
    try:
        response=waclient.update_answer(
        WorkloadId=workloadId,
        LensAlias=lensAlias,
        QuestionId=questionId,
        SelectedChoices=selectedChoices,
        Notes=notes
        )
    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    # print(json.dumps(response))
    jmesquery = "Answer.SelectedChoices"
    answers = jmespath.search(jmesquery, response)
    return answers

def listMilestones(
    waclient,
    workloadId
    ):

    # Find a milestone for a workloadId
    try:
        response=waclient.list_milestones(
        WorkloadId=workloadId,
        MaxResults=50 # Need to check why I am having to pass this parameter
        )
    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)
    # print("Full JSON:",json.dumps(response['MilestoneSummaries'], cls=DateTimeEncoder))
    milestoneNumber = response['MilestoneSummaries']
    return milestoneNumber

def createMilestone(
    waclient,
    workloadId,
    milestoneName
    ):

    # Create a new milestone with milestoneName
    try:
        response=waclient.create_milestone(
        WorkloadId=workloadId,
        MilestoneName=milestoneName
        )
    except waclient.exceptions.ConflictException as e:
        milestones = listMilestones(waclient,workloadId)
        jmesquery = "[?starts_with(MilestoneName,`"+milestoneName+"`) == `true`].MilestoneNumber"
        milestoneNumber = jmespath.search(jmesquery,milestones)
        logger.error("ERROR - The milestone name %s already exists as milestone %s" % (milestoneName, milestoneNumber))
        return milestoneNumber[0]
    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    # print("Full JSON:",json.dumps(response['MilestoneSummaries'], cls=DateTimeEncoder))
    milestoneNumber = response['MilestoneNumber']
    return milestoneNumber

def getMilestone(
    waclient,
    workloadId,
    milestoneNumber
    ):

    # Use get_milestone to return the milestone structure
    try:
        response=waclient.get_milestone(
        WorkloadId=workloadId,
        MilestoneNumber=milestoneNumber
        )
    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    # print("Full JSON:",json.dumps(response['Milestone'], cls=DateTimeEncoder))
    milestoneResponse = response['Milestone']
    return milestoneResponse

def getMilestoneRiskCounts(
    waclient,
    workloadId,
    milestoneNumber
    ):

    # Return just the RiskCount for a particular milestoneNumber

    milestone = getMilestone(waclient,workloadId,milestoneNumber)
    # print("Full JSON:",json.dumps(milestone['Workload']['RiskCounts'], cls=DateTimeEncoder))
    milestoneRiskCounts = milestone['Workload']['RiskCounts']
    return milestoneRiskCounts

def listAllAnswers(
    waclient,
    workloadId,
    lensAlias,
    milestoneNumber=""
    ):

    # Get a list of all answers
    try:
        if milestoneNumber:
            response=waclient.list_answers(
            WorkloadId=workloadId,
            LensAlias=lensAlias,
            MilestoneNumber=milestoneNumber
            )
        else:
            response=waclient.list_answers(
            WorkloadId=workloadId,
            LensAlias=lensAlias
            )

    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    answers = response['AnswerSummaries']
    while "NextToken" in response:
        if milestoneNumber:
            response = waclient.list_answers(WorkloadId=workloadId,LensAlias=lensAlias,MilestoneNumber=milestoneNumber,NextToken=response["NextToken"])
        else:
            response = waclient.list_answers(WorkloadId=workloadId,LensAlias=lensAlias,NextToken=response["NextToken"])
        answers.extend(response["AnswerSummaries"])

    # print("Full JSON:",json.dumps(answers, cls=DateTimeEncoder))
    return answers

def getLensReview(
    waclient,
    workloadId,
    lensAlias,
    milestoneNumber=""
    ):

    # Use get_lens_review to return the lens review structure
    try:
        if milestoneNumber:
            response=waclient.get_lens_review(
            WorkloadId=workloadId,
            LensAlias=lensAlias,
            MilestoneNumber=milestoneNumber
            )
        else:
            response=waclient.get_lens_review(
            WorkloadId=workloadId,
            LensAlias=lensAlias
            )

    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    # print("Full JSON:",json.dumps(response['LensReview'], cls=DateTimeEncoder))
    lensReview = response['LensReview']
    return lensReview

def getLensReviewPDFReport(
    waclient,
    workloadId,
    lensAlias,
    milestoneNumber=""
    ):

    # Use get_lens_review_report to return the lens review PDF in base64 structure
    try:
        if milestoneNumber:
            response=waclient.get_lens_review_report(
            WorkloadId=workloadId,
            LensAlias=lensAlias,
            MilestoneNumber=milestoneNumber
            )
        else:
            response=waclient.get_lens_review_report(
            WorkloadId=workloadId,
            LensAlias=lensAlias
            )

    except botocore.exceptions.ParamValidationError as e:
        logger.error("ERROR - Parameter validation error: %s" % e)
    except botocore.exceptions.ClientError as e:
        logger.error("ERROR - Unexpected error: %s" % e)

    # print("Full JSON:",json.dumps(response['LensReviewReport']['Base64String'], cls=DateTimeEncoder))
    lensReviewPDF = response['LensReviewReport']['Base64String']
    return lensReviewPDF

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)):
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



