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