def case_updates()

in tools/google-cloud-support-slackbot/case_updates.py [0:0]


def case_updates(is_test):
    """
    Infinite loop that pulls all of the open Google Cloud support cases for our
    org and their associated public comments every 15 seconds and compares it
    to the cases and comments from the previous pull. If any change is detected
    between the two versions of the case, the change is posted to any channel
    that is tracking it.

    Parameters
    ----------
    is_test : bool
      flag indicating if we are running the loop a single time for testing
    """
    ORG_ID = os.environ.get("ORG_ID")
    # Must be double quotes for the query
    query_string = f'organization="organizations/{ORG_ID}" AND state=OPEN'

    service = support_service()

    if not firebase_admin._apps:
        PROJECT_ID = os.environ.get("PROJECT_ID")
        cred = credentials.ApplicationDefault()
        firebase_admin.initialize_app(cred, {
            "projectId": PROJECT_ID,
        })

    while True:
        loop_skip = False
        sleep_timer = 10
        closed_cases = []
        cases = get_firestore_cases()
        req = service.cases().search(query=query_string)
        try:
            resp = req.execute(num_retries=MAX_RETRIES).get("cases", [])
        except BrokenPipeError as e:
            error_message = f"{e} : {datetime.now()}"
            logger.error(error_message)
            time.sleep(5)
            continue

        temp_cases = []

        for case in resp:
            try:
                temp_case = SupportCase(case)
            except NameError as e:
                error_message = f"{e} : {datetime.now()}"
                logger.error(error_message)
                loop_skip = True
                break
            else:
                temp_cases.append(vars(temp_case))

        if loop_skip:
            time.sleep(5)
            continue

        # Check for cases that have closed since the last loop and notify slack
        for fs_case in cases:
            delete_entry = True
            if fs_case["update_time"] == "2100-12-31 23:59:59+00:00":
                delete_entry = False
            else:
                for t_case in temp_cases:
                    if t_case["case_number"] == fs_case["case_number"]:
                        delete_entry = False
                        break
            if delete_entry:
                fs_case["update_time"] = "2100-12-31 23:59:59+00:00"
                guid = firestore_write("cases", fs_case)
                first_doc_in = get_firestore_first_in(fs_case["case_number"],
                                                      fs_case["update_time"])
                if first_doc_in:
                    if guid == first_doc_in["guid"]:
                        notify_slack(fs_case["case_number"], "closed", "")
                        closed_cases.append(fs_case["case_number"])

        # Check for existing cases that have a new update time. Post their
        # relevant update to the channels that are tracking those cases.
        for t_case in temp_cases:
            is_new = True
            for fs_case in cases:
                if t_case["case_number"] == fs_case["case_number"]:
                    is_new = False
                    if not t_case["update_time"] == fs_case["update_time"]:
                        guid = firestore_write("cases", t_case)
                        first_doc_in = get_firestore_first_in(
                            t_case["case_number"], t_case["update_time"])
                    if len(fs_case["comment_list"]) < len(
                           t_case["comment_list"]):
                        if "googleSupport" in t_case["comment_list"][0][
                                "creator"]:
                            if guid == first_doc_in["guid"]:
                                notify_slack(t_case["case_number"], "comment",
                                             t_case["comment_list"][0]["body"])
                    if fs_case["priority"] != t_case["priority"]:
                        if guid == first_doc_in["guid"]:
                            notify_slack(t_case["case_number"], "priority",
                                         t_case["priority"])
                    if fs_case["escalated"] != t_case["escalated"]:
                        if t_case["escalated"]:
                            if guid == first_doc_in["guid"]:
                                notify_slack(t_case, "escalated",
                                             t_case["escalated"])
                        else:
                            if guid == first_doc_in["guid"]:
                                notify_slack(t_case["case_number"],
                                             "de-escalated",
                                             t_case["escalated"])

            if is_new:
                firestore_write("cases", t_case)
                auto_cc(t_case)
                auto_track(t_case)

        # Wait to try again so we don"t spam the API
        time.sleep(sleep_timer)

        # Delete closed cases after waiting to minimize duplicate Slack updates
        for case in closed_cases:
            firestore_delete_cases(case)
        if is_test:
            break