Update to Python 3.10 and Ubuntu 22.04

Removal of deprecated event loop
Updated pip requirements

Change-Id: I96a895d8f9fa8db89e6bbfd6f009d4f56deaa418
Signed-off-by: Mark Beierl <mark.beierl@canonical.com>
diff --git a/osm_mon/cmd/mon_server.py b/osm_mon/cmd/mon_server.py
index 7d676d7..c4fa08b 100644
--- a/osm_mon/cmd/mon_server.py
+++ b/osm_mon/cmd/mon_server.py
@@ -22,7 +22,6 @@
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
 import argparse
-import asyncio
 import logging
 import sys
 
@@ -52,9 +51,8 @@
         log.info("Starting MON Server...")
         log.debug("Config: %s", cfg.conf)
         log.info("Initializing database...")
-        loop = asyncio.get_event_loop()
         try:
-            server = Server(cfg, loop)
+            server = Server(cfg)
             server.run()
         except Exception as e:
             log.error("Failed to start MON Server")
diff --git a/osm_mon/collector/vnf_collectors/juju.py b/osm_mon/collector/vnf_collectors/juju.py
index cb924a6..fbc6bc2 100644
--- a/osm_mon/collector/vnf_collectors/juju.py
+++ b/osm_mon/collector/vnf_collectors/juju.py
@@ -39,7 +39,6 @@
     def __init__(self, config: Config):
         super().__init__(config)
         self.common_db = CommonDbClient(config)
-        self.loop = asyncio.get_event_loop()
         # host = config.get("vca", "host")
         # port = config.get("vca", "port") if "port" in config.conf["vca"] else 17070
 
@@ -60,7 +59,6 @@
             db=self.common_db.common_db,
             fs=object(),
             log=log,
-            loop=self.loop,
             on_update_db=None,
         )
 
@@ -110,7 +108,7 @@
                     if vca_deployment_info.get("model") and vca_deployment_info.get(
                         "application"
                     ):
-                        measures = self.loop.run_until_complete(
+                        measures = asyncio.run(
                             self.n2vc.get_metrics(
                                 vca_deployment_info["model"],
                                 vca_deployment_info["application"],
diff --git a/osm_mon/core/message_bus_client.py b/osm_mon/core/message_bus_client.py
index 7d194c3..8eee83a 100644
--- a/osm_mon/core/message_bus_client.py
+++ b/osm_mon/core/message_bus_client.py
@@ -21,7 +21,6 @@
 # For those usages not covered by the Apache License, Version 2.0 please
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
-import asyncio
 from typing import List, Callable
 
 from osm_common import msgkafka, msglocal
@@ -30,7 +29,7 @@
 
 
 class MessageBusClient:
-    def __init__(self, config: Config, loop=None):
+    def __init__(self, config: Config):
         if config.get("message", "driver") == "local":
             self.msg_bus = msglocal.MsgLocal()
         elif config.get("message", "driver") == "kafka":
@@ -40,9 +39,6 @@
                 "Unknown message bug driver {}".format(config.get("section", "driver"))
             )
         self.msg_bus.connect(config.get("message"))
-        if not loop:
-            loop = asyncio.get_event_loop()
-        self.loop = loop
 
     async def aioread(self, topics: List[str], callback: Callable = None, **kwargs):
         """
@@ -52,7 +48,7 @@
         :param kwargs: Keyword arguments to be passed to callback function.
         :return: None
         """
-        await self.msg_bus.aioread(topics, self.loop, aiocallback=callback, **kwargs)
+        await self.msg_bus.aioread(topics, aiocallback=callback, **kwargs)
 
     async def aiowrite(self, topic: str, key: str, msg: dict):
         """
@@ -62,7 +58,7 @@
         :param msg: Dictionary containing message to be written.
         :return: None
         """
-        await self.msg_bus.aiowrite(topic, key, msg, self.loop)
+        await self.msg_bus.aiowrite(topic, key, msg)
 
     async def aioread_once(self, topic: str):
         """
@@ -70,5 +66,5 @@
         :param topic: topic to retrieve message from.
         :return: tuple(topic, key, message)
         """
-        result = await self.msg_bus.aioread(topic, self.loop)
+        result = await self.msg_bus.aioread(topic)
         return result
diff --git a/osm_mon/dashboarder/dashboarder.py b/osm_mon/dashboarder/dashboarder.py
index f3bd97e..1d523cf 100644
--- a/osm_mon/dashboarder/dashboarder.py
+++ b/osm_mon/dashboarder/dashboarder.py
@@ -35,17 +35,14 @@
 
 
 class Dashboarder:
-    def __init__(self, config: Config, loop=None):
+    def __init__(self, config: Config):
         self.conf = config
         self.service = DashboarderService(config)
-        if not loop:
-            loop = asyncio.get_event_loop()
-        self.loop = loop
         self.msg_bus = MessageBusClient(config)
 
     # run consumer for grafana user management
     def run(self):
-        self.loop.run_until_complete(self.start())
+        asyncio.run(self.start())
 
     async def start(self, wait_time=5):
         topics = ["users", "project"]
diff --git a/osm_mon/evaluator/evaluator.py b/osm_mon/evaluator/evaluator.py
index 732f8ac..61b788a 100644
--- a/osm_mon/evaluator/evaluator.py
+++ b/osm_mon/evaluator/evaluator.py
@@ -35,11 +35,8 @@
 
 
 class Evaluator:
-    def __init__(self, config: Config, loop=None):
+    def __init__(self, config: Config):
         self.conf = config
-        if not loop:
-            loop = asyncio.get_event_loop()
-        self.loop = loop
         self.service = EvaluatorService(config)
         self.msg_bus = MessageBusClient(config)
 
@@ -69,7 +66,7 @@
         log.debug("_notify_alarm")
         resp_message = self._build_alarm_response(alarm, status)
         log.info("Sent alarm notification: %s", resp_message)
-        self.loop.run_until_complete(
+        asyncio.run(
             self.msg_bus.aiowrite("alarm_response", "notify_alarm", resp_message)
         )
         evaluator_service = EvaluatorService(self.conf)
diff --git a/osm_mon/server/server.py b/osm_mon/server/server.py
index f05cdec..bb8f0e8 100755
--- a/osm_mon/server/server.py
+++ b/osm_mon/server/server.py
@@ -37,17 +37,14 @@
 
 
 class Server:
-    def __init__(self, config: Config, loop=None):
+    def __init__(self, config: Config):
         self.conf = config
-        if not loop:
-            loop = asyncio.get_event_loop()
-        self.loop = loop
         self.msg_bus = MessageBusClient(config)
         self.service = ServerService(config)
         self.service.populate_prometheus()
 
     def run(self):
-        self.loop.run_until_complete(self.start())
+        asyncio.run(self.start())
 
     async def start(self, wait_time=5):
         topics = ["alarm_request"]
diff --git a/osm_mon/tests/unit/core/test_message_bus_client.py b/osm_mon/tests/unit/core/test_message_bus_client.py
index 126eb9f..b35c6c1 100644
--- a/osm_mon/tests/unit/core/test_message_bus_client.py
+++ b/osm_mon/tests/unit/core/test_message_bus_client.py
@@ -34,39 +34,38 @@
     def setUp(self):
         self.config = Config()
         self.config.set("message", "driver", "kafka")
-        self.loop = asyncio.new_event_loop()
 
     @mock.patch.object(MsgKafka, "aioread")
     def test_aioread(self, aioread):
         async def mock_callback():
             pass
 
-        future = asyncio.Future(loop=self.loop)
+        future = asyncio.Future(loop=asyncio.new_event_loop())
         future.set_result("mock")
         aioread.return_value = future
-        msg_bus = MessageBusClient(self.config, loop=self.loop)
+        msg_bus = MessageBusClient(self.config)
         topic = "test_topic"
-        self.loop.run_until_complete(msg_bus.aioread([topic], mock_callback))
-        aioread.assert_called_with(["test_topic"], self.loop, aiocallback=mock_callback)
+        asyncio.run(msg_bus.aioread([topic], mock_callback))
+        aioread.assert_called_with(["test_topic"], aiocallback=mock_callback)
 
     @mock.patch.object(MsgKafka, "aiowrite")
     def test_aiowrite(self, aiowrite):
-        future = asyncio.Future(loop=self.loop)
+        future = asyncio.Future(loop=asyncio.new_event_loop())
         future.set_result("mock")
         aiowrite.return_value = future
-        msg_bus = MessageBusClient(self.config, loop=self.loop)
+        msg_bus = MessageBusClient(self.config)
         topic = "test_topic"
         key = "test_key"
         msg = {"test": "test_msg"}
-        self.loop.run_until_complete(msg_bus.aiowrite(topic, key, msg))
-        aiowrite.assert_called_with(topic, key, msg, self.loop)
+        asyncio.run(msg_bus.aiowrite(topic, key, msg))
+        aiowrite.assert_called_with(topic, key, msg)
 
     @mock.patch.object(MsgKafka, "aioread")
     def test_aioread_once(self, aioread):
-        future = asyncio.Future(loop=self.loop)
+        future = asyncio.Future(loop=asyncio.new_event_loop())
         future.set_result("mock")
         aioread.return_value = future
-        msg_bus = MessageBusClient(self.config, loop=self.loop)
+        msg_bus = MessageBusClient(self.config)
         topic = "test_topic"
-        self.loop.run_until_complete(msg_bus.aioread_once(topic))
-        aioread.assert_called_with("test_topic", self.loop)
+        asyncio.run(msg_bus.aioread_once(topic))
+        aioread.assert_called_with("test_topic")