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)