AETHER-752 Fix scheduled downtime on wrong pod bug

Change-Id: I7f2771f6a8da852a0f944ae633435d2a5cf587ed
diff --git a/edge-monitoring/VERSION b/edge-monitoring/VERSION
index d15723f..1d0ba9e 100644
--- a/edge-monitoring/VERSION
+++ b/edge-monitoring/VERSION
@@ -1 +1 @@
-0.3.2
+0.4.0
diff --git a/edge-monitoring/edge_monitoring_server.py b/edge-monitoring/edge_monitoring_server.py
index 1bea10c..c5bb2f4 100755
--- a/edge-monitoring/edge_monitoring_server.py
+++ b/edge-monitoring/edge_monitoring_server.py
@@ -23,13 +23,20 @@
 from flask import Flask, jsonify, abort, request, Response
 import prometheus_client as prom
 
+# URL of maintenance calendar
 SECRET_ICAL_URL = os.environ.get("SECRET_ICAL_URL")
+
+# Aether environment that the server is monitoring (e.g., "production")
+# To schedule downtime, postfix the cluster name with the env: "ace-tucson-production"
+AETHER_ENV = os.environ.get("AETHER_ENV", "production")
+
+# Move to "no result" status if we don't hear from agent for this many seconds
 NO_RESULT_THRESHOLD = 720
 
 app = Flask(__name__)
 edges = [
     {
-        'name': 'production-edge-example',
+        'name': 'ace-example',
         'status': {
             'control_plane': 'connected',
             'user_plane': 'connected'
@@ -47,8 +54,7 @@
 }
 
 room_mapping = {
-    "production-edge-onf-menlo": "(Compute)-MP-1-Aether Production",
-    "production-edge-example": "(Compute)-MP-1-Aether Production" # for testing
+    "ace-menlo-pixel": "(Compute)-MP-1-Aether Production"
 }
 
 cp_status = prom.Gauge("aetheredge_status_control_plane", "Control plane status code", ["name"])
@@ -58,8 +64,14 @@
 
 def is_my_event(event, name):
     for field in ["summary", "location", "description"]:
-        if name in getattr(event, field, ""):
+        fullname = name
+        if name.startswith("ace-"):
+            fullname = "%s-%s" % (name, AETHER_ENV)
+        if fullname in getattr(event, field, ""):
             return True
+        if name in room_mapping:
+            if room_mapping[name] in getattr(event, field, ""):
+                return True
     return False
 
 def is_naive_datetime(d):
@@ -80,8 +92,6 @@
         if event.start < now and event.end > now:
             if is_my_event(event, name):
                 return True
-            if name in room_mapping and is_my_event(event, room_mapping[name]):
-                return True
     return False
 
 def pull_maintenance_events():
@@ -113,7 +123,7 @@
     res = []
     time_out_stale_results()
     for edge in edges:
-        if edge['name'] == "production-edge-example":
+        if edge['name'] == "ace-example":
             continue
 
         cp_status.labels(edge['name']).set(status_codes[edge['status']['control_plane']])
@@ -195,8 +205,8 @@
 
 
 if __name__ == '__main__':
-    if SECRET_ICAL_URL:
-        print(" * Starting maintenance calendar polling thread")
+    if SECRET_ICAL_URL and AETHER_ENV:
+        print(" * Starting maintenance calendar polling thread (Aether env: %s)" % AETHER_ENV)
         t = threading.Thread(target=pull_maintenance_events)
         t.start()
     app.run(debug=True, host='0.0.0.0', port=80)
diff --git a/edge-monitoring/test_edge_monitoring_server.py b/edge-monitoring/test_edge_monitoring_server.py
index cb3a78a..5e4748f 100755
--- a/edge-monitoring/test_edge_monitoring_server.py
+++ b/edge-monitoring/test_edge_monitoring_server.py
@@ -23,7 +23,7 @@
 
 
 test_edge = {
-    'name': 'production-edge-onf-menlo',
+    'name': 'ace-menlo-pixel',
     'status': {
         'control_plane': 'connected',
         'user_plane': 'connected'
@@ -52,28 +52,32 @@
         self.app = ems.app.test_client()
 
     def test_match_location(self):
-        event = MyEvent(location = "production-edge-onf-menlo, (Compute)-MP-1-Aether Production")
-        self.assertTrue(ems.is_my_event(event, "production-edge-onf-menlo"))
-        self.assertTrue(ems.is_my_event(event, "(Compute)-MP-1-Aether Production"))
+        event = MyEvent(location = "ace-menlo-pixel-production")
+        self.assertTrue(ems.is_my_event(event, "ace-menlo-pixel"))
+        event = MyEvent(location = "(Compute)-MP-1-Aether Production")
+        self.assertTrue(ems.is_my_event(event, "ace-menlo-pixel"))
 
     def test_match_description(self):
-        event = MyEvent(description = "production-edge-onf-menlo, (Compute)-MP-1-Aether Production")
-        self.assertTrue(ems.is_my_event(event, "production-edge-onf-menlo"))
-        self.assertTrue(ems.is_my_event(event, "(Compute)-MP-1-Aether Production"))
+        event = MyEvent(description = "ace-menlo-pixel-production")
+        self.assertTrue(ems.is_my_event(event, "ace-menlo-pixel"))
+        event = MyEvent(description = "(Compute)-MP-1-Aether Production")
+        self.assertTrue(ems.is_my_event(event, "ace-menlo-pixel"))
 
     def test_match_summary(self):
-        event = MyEvent(summary = "production-edge-onf-menlo, (Compute)-MP-1-Aether Production")
-        self.assertTrue(ems.is_my_event(event, "production-edge-onf-menlo"))
-        self.assertTrue(ems.is_my_event(event, "(Compute)-MP-1-Aether Production"))
+        event = MyEvent(summary = "ace-menlo-pixel-production")
+        self.assertTrue(ems.is_my_event(event, "ace-menlo-pixel"))
+        event = MyEvent(summary = "(Compute)-MP-1-Aether Production")
+        self.assertTrue(ems.is_my_event(event, "ace-menlo-pixel"))
 
     def test_no_match(self):
-        event = MyEvent(summary = "production-edge-onf-menlo, (Compute)-MP-1-Aether Production")
-        self.assertFalse(ems.is_my_event(event, "production-edge-intel"))
+        event = MyEvent(summary = "ace-menlo-pixel-production, (Compute)-MP-1-Aether Production")
+        self.assertFalse(ems.is_my_event(event, "ace-intel"))
         self.assertFalse(ems.is_my_event(event, "(Compute)-MP-1-Aether Staging"))
+        self.assertFalse(ems.is_my_event(event, "ace-menlo"))
 
     def test_missing_field(self):
-        event = MyEventNoLoc(description = "production-edge-onf-menlo, (Compute)-MP-1-Aether Production")
-        self.assertTrue(ems.is_my_event(event, "production-edge-onf-menlo"))
+        event = MyEventNoLoc(description = "(Compute)-MP-1-Aether Production")
+        self.assertTrue(ems.is_my_event(event, "ace-menlo-pixel"))
 
     def test_in_window(self):
         events = []
@@ -81,25 +85,25 @@
         events.append(MyEvent(location = "(Compute)-MP-1-Aether Production",
             start = now - datetime.timedelta(hours=1),
             end = now + datetime.timedelta(hours=1)))
-        self.assertTrue(ems.in_maintenance_window(events, "production-edge-onf-menlo", now))
-        self.assertFalse(ems.in_maintenance_window(events, "production-edge-onf-tucson", now))
+        self.assertTrue(ems.in_maintenance_window(events, "ace-menlo-pixel", now))
+        self.assertFalse(ems.in_maintenance_window(events, "ace-tucson", now))
 
     def test_not_in_window(self):
         events = []
         now = datetime.datetime.now(pytz.utc)
-        events.append(MyEvent(location = "production-edge-onf-menlo",
+        events.append(MyEvent(location = "ace-menlo-pixel-production",
             start = now + datetime.timedelta(hours=1),
             end = now + datetime.timedelta(hours=2)))
-        self.assertFalse(ems.in_maintenance_window(events, "production-edge-onf-menlo", now))
+        self.assertFalse(ems.in_maintenance_window(events, "ace-menlo-pixel", now))
 
     def test_no_events(self):
         events = []
         now = datetime.datetime.now(pytz.utc)
-        self.assertFalse(ems.in_maintenance_window(events, "production-edge-onf-menlo", now))
+        self.assertFalse(ems.in_maintenance_window(events, "ace-menlo-pixel", now))
 
     def test_all_day_events(self):
         events = []
-        events.append(MyEvent(location = "production-edge-onf-menlo",
+        events.append(MyEvent(location = "ace-menlo-pixel-production",
             start = datetime.datetime(2020, 9, 2, 0, 0),
             end = datetime.datetime(2020, 9, 3, 0, 0),
             all_day = True))
@@ -107,27 +111,27 @@
         ems.process_all_day_events(events)
 
         now = datetime.datetime(2020, 9, 2, 12, 0, tzinfo=pytz.utc)
-        self.assertTrue(ems.in_maintenance_window(events, "production-edge-onf-menlo", now))
+        self.assertTrue(ems.in_maintenance_window(events, "ace-menlo-pixel", now))
 
         now = datetime.datetime(2020, 9, 3, 12, 0, tzinfo=pytz.utc)
-        self.assertFalse(ems.in_maintenance_window(events, "production-edge-onf-menlo", now))
+        self.assertFalse(ems.in_maintenance_window(events, "ace-menlo-pixel", now))
 
     def test_get_edges(self):
         response = self.app.get('/edges')
         data = json.loads(response.get_data(as_text=True))
         self.assertEqual(len(data['edges']), 1)
-        self.assertEqual(data['edges'][0]['name'], 'production-edge-example')
+        self.assertEqual(data['edges'][0]['name'], 'ace-example')
 
     def test_create_and_delete_edge(self):
         response = self.app.post('/edges', json=test_edge)
         data = json.loads(response.get_data(as_text=True))
-        self.assertEqual(data['edge']['name'], 'production-edge-onf-menlo')
+        self.assertEqual(data['edge']['name'], 'ace-menlo-pixel')
 
         response = self.app.get('/edges')
         data = json.loads(response.get_data(as_text=True))
         self.assertEqual(len(data['edges']), 2)
 
-        response = self.app.delete('/edges/production-edge-onf-menlo')
+        response = self.app.delete('/edges/ace-menlo-pixel')
         data = json.loads(response.get_data(as_text=True))
         self.assertEqual(data['result'], True)
         response = self.app.get('/edges', json=test_edge)