From 11c4a759d09baa9b678228c08f6137f77c9c348b Mon Sep 17 00:00:00 2001
From: Haibo Huang <hhb@google.com>
Date: Thu, 31 Jan 2019 15:07:03 -0800
Subject: [PATCH] [Updater] Rate limit updates

If the version is a SHA, only send upgrade every month.

Test: local run
Change-Id: Ic941a00134d3fa9e7761a55035945d8aa1dd90ff
---
 Android.bp  |  1 +
 notifier.py | 21 ++++++++++++++++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/Android.bp b/Android.bp
index 328cf7a..c4f158d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -27,6 +27,7 @@ python_binary_host {
     name: "external_updater_notifier",
     main: "notifier.py",
     srcs: [
+        "git_utils.py",
         "notifier.py",
     ],
 }
diff --git a/notifier.py b/notifier.py
index 982354c..1e2c7cd 100644
--- a/notifier.py
+++ b/notifier.py
@@ -21,6 +21,7 @@ external_updater_notifier \
     googletest
 """
 
+from datetime import timedelta, datetime
 import argparse
 import json
 import os
@@ -28,6 +29,7 @@ import re
 import subprocess
 import time
 
+import git_utils
 
 def parse_args():
     """Parses commandline arguments."""
@@ -73,6 +75,22 @@ def _send_email(proj, latest_ver, recipient, upgrade_log):
                    input=msg, encoding='ascii')
 
 
+NOTIFIED_TIME_KEY_NAME = 'latest_notified_time'
+
+
+def _should_notify(latest_ver, proj_history):
+    if latest_ver in proj_history:
+        # Processed this version before.
+        return False
+
+    timestamp = proj_history.get(NOTIFIED_TIME_KEY_NAME, 0)
+    time_diff = datetime.today() - datetime.fromtimestamp(timestamp)
+    if git_utils.is_commit(latest_ver) and time_diff <= timedelta(days=30):
+        return False
+
+    return True
+
+
 def _process_results(args, history, results):
     for proj, res in results.items():
         if 'latest' not in res:
@@ -82,11 +100,12 @@ def _process_results(args, history, results):
         if latest_ver == current_ver:
             continue
         proj_history = history.setdefault(proj, {})
-        if latest_ver not in proj_history:
+        if _should_notify(latest_ver, proj_history):
             upgrade_log = _upgrade(proj) if args.generate_change else ""
             try:
                 _send_email(proj, latest_ver, args.recipients, upgrade_log)
                 proj_history[latest_ver] = int(time.time())
+                proj_history[NOTIFIED_TIME_KEY_NAME] = int(time.time())
             except subprocess.CalledProcessError as err:
                 msg = """Failed to send email for {} ({}).
 stdout: {}
-- 
GitLab