Update from master 55/13455/1
authorDario Faccin <dario.faccin@canonical.com>
Wed, 24 May 2023 14:58:47 +0000 (16:58 +0200)
committerDario Faccin <dario.faccin@canonical.com>
Wed, 24 May 2023 14:58:58 +0000 (16:58 +0200)
Squashed commit of the following:

commit 7cedba14204492f7373db6e3362d04181658fc1b
Author: Mark Beierl <mark.beierl@canonical.com>
Date:   Wed May 10 21:35:27 2023 -0400

    Update to Python 3.10 and Ubuntu 22.04

    Removal of deprecated event loop
    Updated pip requirements

    Change-Id: I0eeba1b700187ec87197f5b28e6e20fd15bd945b
Signed-off-by: Mark Beierl <mark.beierl@canonical.com>
commit d1dfd8b598a2852cc6400d323b29c405816f36a6
Author: garciadeblas <gerardo.garciadeblas@telefonica.com>
Date:   Tue Apr 18 18:25:13 2023 +0200

    Set autoescape to True in Jinja2 environment

    Change-Id: I2af8d9e30f610bb18928b4c85b16ecd6754129b8
Signed-off-by: garciadeblas <gerardo.garciadeblas@telefonica.com>
commit 2da4c43fa6e13582ffb79e852c47e986bf4a1384
Author: garciadeblas <gerardo.garciadeblas@telefonica.com>
Date:   Tue Apr 18 14:40:48 2023 +0200

    Clean stage-archive.sh

    Change-Id: Ie0a1c29cd15f4b9510bdbf8e14a051df93b24edd
Signed-off-by: garciadeblas <gerardo.garciadeblas@telefonica.com>
commit 9bd1ee2d3893c1450b3650ead9e71b5e01d0883f
Author: garciadeblas <gerardo.garciadeblas@telefonica.com>
Date:   Tue Mar 28 13:45:28 2023 +0200

    Fix black and cover errors

    Change-Id: I5525e17a4536686091967ceb3ac2900bce47d9e2
Signed-off-by: garciadeblas <gerardo.garciadeblas@telefonica.com>
Change-Id: I1f150e4b0bbe8c537940a2445c94bdf8da4c7e60
Signed-off-by: Dario Faccin <dario.faccin@canonical.com>
Dockerfile
devops-stages/stage-archive.sh
osm_pla/cmd/pla_server.py
osm_pla/placement/mznplacement.py
osm_pla/server/server.py
osm_pla/test/test_server.py
requirements-dev.txt
requirements-test.txt
tox.ini

index 7470d52..e3e66cf 100644 (file)
@@ -21,7 +21,7 @@
 #   devops-stages/stage-build.sh
 #
 
-FROM ubuntu:20.04
+FROM ubuntu:22.04
 
 ARG APT_PROXY
 RUN if [ ! -z $APT_PROXY ] ; then \
@@ -37,10 +37,12 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
         python3 \
         python3-all \
         python3-dev \
-        python3-setuptools
+        python3-setuptools \
+        python3-pip \
+        tox
 
-RUN python3 -m easy_install pip==21.3.1
-RUN pip install tox==3.24.5
+ENV LC_ALL C.UTF-8
+ENV LANG C.UTF-8
 
 ADD https://github.com/MiniZinc/MiniZincIDE/releases/download/2.4.2/MiniZincIDE-2.4.2-bundle-linux-x86_64.tgz /minizinc.tgz
 
index 831c8c8..aa72043 100755 (executable)
@@ -17,7 +17,4 @@ rm -rf pool
 rm -rf dists
 mkdir -p pool/$MDG
 mv deb_dist/*.deb pool/$MDG/
-mkdir -p dists/unstable/$MDG/binary-amd64/
-apt-ftparchive packages pool/$MDG > dists/unstable/$MDG/binary-amd64/Packages
-gzip -9fk dists/unstable/$MDG/binary-amd64/Packages
-echo "dists/**,pool/$MDG/*.deb"
+
index 409f14d..29c7332 100755 (executable)
@@ -15,7 +15,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 import argparse
-import asyncio
 import logging
 import sys
 
@@ -42,8 +41,7 @@ def main():
     log = logging.getLogger(__name__)
     log.info("Starting PLA Server...")
 
-    loop = asyncio.get_event_loop()
-    server = Server(cfg, loop)
+    server = Server(cfg)
     server.run()
 
 
index d507bbd..ac25448 100755 (executable)
@@ -131,7 +131,7 @@ class MznModelGenerator(object):
         """loads the jinja template used for model generation"""
         loader1 = FileSystemLoader(MznModelGenerator.template_search_path)
         loader2 = PackageLoader("osm_pla", ".")
-        env = Environment(loader=ChoiceLoader([loader1, loader2]))
+        env = Environment(loader=ChoiceLoader([loader1, loader2]), autoescape=True)
         return env.get_template(template_name)
 
 
index d2476ec..ede6f86 100644 (file)
@@ -33,12 +33,11 @@ class Server:
     pil_price_list_file = Path("/placement/pil_price_list.yaml")
     vnf_price_list_file = Path("/placement/vnf_price_list.yaml")
 
-    def __init__(self, config: Config, loop=None):
+    def __init__(self, config: Config):
         self.log = logging.getLogger("pla.server")
         self.db = None
         self.msgBus = None
         self.config = config
-        self.loop = loop or asyncio.get_event_loop()
 
         try:
             if config.get("database", "driver") == "mongo":
@@ -64,7 +63,6 @@ class Server:
                         config.get("message", "driver")
                     )
                 )
-            self.msgBus.loop = loop
             self.msgBus.connect(config.get("message"))
 
         except Exception as e:
@@ -259,21 +257,19 @@ class Server:
         self.log.info("Kafka msg arrived: {} {} {}".format(topic, command, params))
         if topic == "pla" and command == "get_placement":
             nslcmop_id = params.get("nslcmopId")
-            self.loop.create_task(self.get_placement(nslcmop_id))
+            asyncio.create_task(self.get_placement(nslcmop_id))
 
     async def kafka_read(self):
         self.log.info("Task kafka_read start")
         while True:
             try:
                 topics = "pla"
-                await self.msgBus.aioread(topics, self.loop, self.handle_kafka_command)
+                await self.msgBus.aioread(topics, self.handle_kafka_command)
             except Exception as e:
                 self.log.error("kafka read error. Exception: {}".format(e))
-                await asyncio.sleep(5, loop=self.loop)
+                await asyncio.sleep(5)
 
     def run(self):
-        self.loop.run_until_complete(self.kafka_read())
-        self.loop.close()
-        self.loop = None
+        asyncio.run(self.kafka_read())
         if self.msgBus:
             self.msgBus.disconnect()
index 127b4d1..d58ee03 100644 (file)
@@ -576,18 +576,18 @@ class TestServer(TestCase):
         }
         self.assertEqual(expected_keys, ppi["pil"][0].keys(), "expected keys not found")
 
-    def test_handle_kafka_command(self):  # OK
-        server = self.serverSetup()
-        server.loop.create_task = Mock()
-        server.handle_kafka_command("pli", "get_placement", {})
-        server.loop.create_task.assert_not_called()
-        server.loop.create_task.reset_mock()
-        server.handle_kafka_command(
-            "pla", "get_placement", {"nslcmopId": nslcmop_record_wo_pinning["id"]}
-        )
-        self.assertTrue(server.loop.create_task.called, "create_task not called")
-        args, kwargs = server.loop.create_task.call_args
-        self.assertIn("Server.get_placement", str(args[0]), "get_placement not called")
+    def test_handle_kafka_command(self):  # OK
+        server = self.serverSetup()
+        server.loop.create_task = Mock()
+        server.handle_kafka_command("pli", "get_placement", {})
+        server.loop.create_task.assert_not_called()
+        server.loop.create_task.reset_mock()
+        server.handle_kafka_command(
+            "pla", "get_placement", {"nslcmopId": nslcmop_record_wo_pinning["id"]}
+        )
+        self.assertTrue(server.loop.create_task.called, "create_task not called")
+        args, kwargs = server.loop.create_task.call_args
+        self.assertIn("Server.get_placement", str(args[0]), "get_placement not called")
 
     @mock.patch.object(
         NsPlacementDataFactory, "__init__", lambda x0, x1, x2, x3, x4, x5, x6: None
index 0304e4f..67d95d8 100644 (file)
@@ -22,21 +22,25 @@ async-timeout==4.0.2
     #   aiokafka
 dataclasses==0.6
     # via -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=paas
+dnspython==2.3.0
+    # via
+    #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=paas
+    #   pymongo
 kafka-python==2.0.2
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=paas
     #   aiokafka
-motor==1.3.1
+motor==3.1.2
     # via -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=paas
 osm-common @ git+https://osm.etsi.org/gerrit/osm/common.git@paas
     # via -r requirements-dev.in
-packaging==23.0
+packaging==23.1
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=paas
     #   aiokafka
 pycryptodome==3.17
     # via -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=paas
-pymongo==3.13.0
+pymongo==4.3.3
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=paas
     #   motor
index fd0128d..295394e 100644 (file)
@@ -14,9 +14,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #######################################################################################
-coverage==7.1.0
+coverage==7.2.5
     # via -r requirements-test.in
-mock==5.0.1
+mock==5.0.2
     # via -r requirements-test.in
-nose2==0.12.0
+nose2==0.13.0
     # via -r requirements-test.in
diff --git a/tox.ini b/tox.ini
index 9f416bc..98409d3 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -23,7 +23,7 @@ toxworkdir = /tmp/.tox
 
 [testenv]
 usedevelop = True
-basepython = python3.8
+basepython = python3.10
 setenv = VIRTUAL_ENV={envdir}
          PYTHONDONTWRITEBYTECODE = 1
 deps =  -r{toxinidir}/requirements.txt
@@ -49,7 +49,7 @@ commands =
         coverage report --omit='*tests*'
         coverage html -d ./cover --omit='*tests*'
         coverage xml -o coverage.xml --omit=*tests*
-whitelist_externals = sh
+allowlist_externals = sh
 
 
 #######################################################################################
@@ -84,7 +84,7 @@ commands =
 [testenv:pip-compile]
 deps =  pip-tools==6.6.2
 skip_install = true
-whitelist_externals = bash
+allowlist_externals = bash
         [
 commands =
         - bash -c "for file in requirements*.in ; do \
@@ -108,7 +108,7 @@ commands =
         python3 setup.py --command-packages=stdeb.command sdist_dsc
         sh -c 'cd deb_dist/osm-pla*/ && dpkg-buildpackage -rfakeroot -uc -us'
         sh -c 'rm osm_pla/requirements.txt'
-whitelist_externals = sh
+allowlist_externals = sh
 
 #######################################################################################
 [flake8]