Replace kafka library by kafka-python library master v16.0 release-v16.0-start v16.0.0
authorgarciadeblas <gerardo.garciadeblas@telefonica.com>
Wed, 7 Aug 2024 11:08:17 +0000 (13:08 +0200)
committergarciadeblas <gerardo.garciadeblas@telefonica.com>
Wed, 7 Aug 2024 11:08:17 +0000 (13:08 +0200)
Change-Id: Ia1da842373d8b3e79b0e6fc39e127b17a9033b89
Signed-off-by: garciadeblas <gerardo.garciadeblas@telefonica.com>
15 files changed:
osm_mon/collector/infra_collectors/vmware.py
osm_mon/collector/vnf_collectors/vmware.py
osm_mon/core/common_db.py
osm_mon/core/models.py
osm_mon/core/response.py
osm_mon/evaluator/backends/base.py
osm_mon/evaluator/backends/prometheus.py
osm_mon/evaluator/evaluator.py
osm_mon/evaluator/service.py
osm_mon/tests/unit/core/test_common_db_client.py
osm_mon/tests/unit/evaluator/test_evaluator_service.py
requirements-dev.txt
requirements-test.txt
requirements.in
requirements.txt

index 09db0db..8f39464 100644 (file)
@@ -25,7 +25,7 @@
 
 import logging
 from typing import List
 
 import logging
 from typing import List
-from xml.etree import ElementTree as XmlElementTree
+from lxml import etree as XmlElementTree
 
 import requests
 from pyvcloud.vcd.client import BasicLoginCredentials
 
 import requests
 from pyvcloud.vcd.client import BasicLoginCredentials
@@ -117,6 +117,7 @@ class VMwareInfraCollector(BaseVimInfraCollector):
             client = self.connect_vim_as_admin()
             if client._session:
                 org_list = client.get_org_list()
             client = self.connect_vim_as_admin()
             if client._session:
                 org_list = client.get_org_list()
+                org_uuid = ""
                 for org in org_list.Org:
                     if org.get("name") == self.org_name:
                         org_uuid = org.get("href").split("/")[-1]
                 for org in org_list.Org:
                     if org.get("name") == self.org_name:
                         org_uuid = org.get("href").split("/")[-1]
index 2e03ebe..7284298 100644 (file)
@@ -23,7 +23,7 @@
 
 import logging
 import traceback
 
 import logging
 import traceback
-from xml.etree import ElementTree as XmlElementTree
+from lxml import etree as XmlElementTree
 
 import requests
 from pyvcloud.vcd.client import BasicLoginCredentials
 
 import requests
 from pyvcloud.vcd.client import BasicLoginCredentials
index a9fcfbe..66f81fe 100644 (file)
@@ -17,7 +17,6 @@
 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 # License for the specific language governing permissions and limitations
 # under the License.
 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 # License for the specific language governing permissions and limitations
 # under the License.
-
 # For those usages not covered by the Apache License, Version 2.0 please
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
 # For those usages not covered by the Apache License, Version 2.0 please
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
@@ -190,6 +189,12 @@ class CommonDbClient:
         )
         return modified_count
 
         )
         return modified_count
 
+    def update_alarm_extra_labels(self, alarm_labels: dict, uuid):
+        modified_count = self.common_db.set_one(
+            "alarms", {"uuid": uuid}, {"extra_labels": alarm_labels}
+        )
+        return modified_count
+
     def get_alarm_by_uuid(self, uuid: str):
         return self.common_db.get_one("alarms", {"uuid": uuid})
 
     def get_alarm_by_uuid(self, uuid: str):
         return self.common_db.get_one("alarms", {"uuid": uuid})
 
index 48fe8c4..d076e5e 100644 (file)
@@ -35,6 +35,7 @@ class Alarm:
         action: str = None,
         tags: dict = {},
         alarm_status: str = "ok",
         action: str = None,
         tags: dict = {},
         alarm_status: str = "ok",
+        extra_labels: dict = {},
     ):
         self.uuid = str(uuid.uuid4())
         self.name = name
     ):
         self.uuid = str(uuid.uuid4())
         self.name = name
@@ -46,6 +47,7 @@ class Alarm:
         self.action = action
         self.tags = tags
         self.alarm_status = alarm_status
         self.action = action
         self.tags = tags
         self.alarm_status = alarm_status
+        self.extra_labels = extra_labels
 
     def to_dict(self) -> dict:
         alarm = {
 
     def to_dict(self) -> dict:
         alarm = {
@@ -58,6 +60,7 @@ class Alarm:
             "tags": self.tags,
             "operation": self.operation,
             "alarm_status": self.alarm_status,
             "tags": self.tags,
             "operation": self.operation,
             "alarm_status": self.alarm_status,
+            "extra_labels": self.extra_labels,
         }
         return alarm
 
         }
         return alarm
 
@@ -73,4 +76,5 @@ class Alarm:
         alarm.tags = data.get("tags")
         alarm.operation = data.get("operation")
         alarm.alarm_status = data.get("alarm_status")
         alarm.tags = data.get("tags")
         alarm.operation = data.get("operation")
         alarm.alarm_status = data.get("alarm_status")
+        alarm.extra_labels = data.get("extra_labels")
         return alarm
         return alarm
index 0879fcb..91f594b 100644 (file)
@@ -88,6 +88,7 @@ class ResponseBuilder(object):
                 "status": kwargs["status"],
                 "start_date": kwargs["date"],
                 "tags": kwargs["tags"],
                 "status": kwargs["status"],
                 "start_date": kwargs["date"],
                 "tags": kwargs["tags"],
+                "extra_labels": kwargs["extra_labels"],
             },
         }
         return notify_alarm_resp
             },
         }
         return notify_alarm_resp
index 5ef1598..30793c1 100644 (file)
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
 # Copyright 2018 Whitestack, LLC
 # *************************************************************
 
 # Copyright 2018 Whitestack, LLC
 # *************************************************************
 
@@ -15,7 +17,6 @@
 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 # License for the specific language governing permissions and limitations
 # under the License.
 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 # License for the specific language governing permissions and limitations
 # under the License.
-
 # For those usages not covered by the Apache License, Version 2.0 please
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
 # For those usages not covered by the Apache License, Version 2.0 please
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
@@ -27,5 +28,5 @@ class BaseBackend:
     def __init__(self, config: Config):
         pass
 
     def __init__(self, config: Config):
         pass
 
-    def get_metric_value(self, metric_name: str, tags: dict):
+    def get_metric_data(self, metric_name: str, tags: dict):
         pass
         pass
index ad4919f..c5b935e 100644 (file)
@@ -22,7 +22,7 @@
 ##
 import base64
 import logging
 ##
 import base64
 import logging
-from typing import Dict
+from typing import Dict, List
 
 import requests
 
 
 import requests
 
@@ -33,13 +33,15 @@ log = logging.getLogger(__name__)
 
 OSM_METRIC_PREFIX = "osm_"
 
 
 OSM_METRIC_PREFIX = "osm_"
 
+DEFAULT_QUERY_METRICS = ["ns_id", "vnf_member_index", "vdu_name"]
+
 
 class PrometheusBackend(BaseBackend):
     def __init__(self, config: Config):
         super().__init__(config)
         self.conf = config
 
 
 class PrometheusBackend(BaseBackend):
     def __init__(self, config: Config):
         super().__init__(config)
         self.conf = config
 
-    def get_metric_value(self, metric_name: str, tags: dict):
+    def get_metric_data(self, metric_name: str, tags: dict):
         query = self._build_query(metric_name, tags)
         request_url = self._build_url(query)
         request_headers = self._build_headers()
         query = self._build_query(metric_name, tags)
         request_url = self._build_url(query)
         request_headers = self._build_headers()
@@ -55,7 +57,7 @@ class PrometheusBackend(BaseBackend):
         if r.status_code == 200:
             json_response = r.json()
             if json_response["status"] == "success":
         if r.status_code == 200:
             json_response = r.json()
             if json_response["status"] == "success":
-                return self._get_metric_value_from_response(json_response)
+                return self._get_metric_data_from_response(json_response)
             else:
                 log.warning(
                     "Prometheus response is not success. Got status %s",
             else:
                 log.warning(
                     "Prometheus response is not success. Got status %s",
@@ -91,11 +93,15 @@ class PrometheusBackend(BaseBackend):
             headers["Authorization"] = f"Basic {token}"
         return headers
 
             headers["Authorization"] = f"Basic {token}"
         return headers
 
-    def _get_metric_value_from_response(self, json_response):
+    def _get_metric_data_from_response(self, json_response) -> List[Dict[str, str]]:
         result = json_response["data"]["result"]
         result = json_response["data"]["result"]
+        metrics_data = []
         if len(result):
         if len(result):
-            metric_value = float(result[0]["value"][1])
-            log.info("Metric value: %s", metric_value)
-            return metric_value
+            for metric in result:
+                metrics_labels = metric["metric"]
+                metric_value = float(metric["value"][1])
+                log.info("Metric value: %s", metric_value)
+                metrics_data.append({"labels": metrics_labels, "value": metric_value})
+            return metrics_data
         else:
             return None
         else:
             return None
index 61b788a..44b0af6 100644 (file)
@@ -1,5 +1,3 @@
-# -*- coding: utf-8 -*-
-
 # Copyright 2018 Whitestack, LLC
 # *************************************************************
 
 # Copyright 2018 Whitestack, LLC
 # *************************************************************
 
@@ -71,6 +69,7 @@ class Evaluator:
         )
         evaluator_service = EvaluatorService(self.conf)
         evaluator_service.update_alarm_status(status.value, alarm.uuid)
         )
         evaluator_service = EvaluatorService(self.conf)
         evaluator_service.update_alarm_status(status.value, alarm.uuid)
+        evaluator_service.update_alarm_extra_labels(alarm.extra_labels, alarm.uuid)
         return
 
     def _build_alarm_response(self, alarm: Alarm, status: AlarmStatus):
         return
 
     def _build_alarm_response(self, alarm: Alarm, status: AlarmStatus):
@@ -90,4 +89,5 @@ class Evaluator:
             status=status.value,
             date=now,
             tags=tags,
             status=status.value,
             date=now,
             tags=tags,
+            extra_tabels=alarm.extra_labels,
         )
         )
index ae6191b..e97586c 100644 (file)
@@ -48,10 +48,10 @@ class EvaluatorService:
         self.common_db = CommonDbClient(self.conf)
         self.queue = multiprocessing.Queue()
 
         self.common_db = CommonDbClient(self.conf)
         self.queue = multiprocessing.Queue()
 
-    def _get_metric_value(self, metric_name: str, tags: dict):
+    def _get_metric_data(self, metric_name: str, tags: dict):
         return BACKENDS[self.conf.get("evaluator", "backend")](
             self.conf
         return BACKENDS[self.conf.get("evaluator", "backend")](
             self.conf
-        ).get_metric_value(metric_name, tags)
+        ).get_metric_data(metric_name, tags)
 
     def _evaluate_metric(self, alarm: Alarm):
         """Method to evaluate a metric value comparing it against an alarm threshold.
 
     def _evaluate_metric(self, alarm: Alarm):
         """Method to evaluate a metric value comparing it against an alarm threshold.
@@ -61,38 +61,52 @@ class EvaluatorService:
         """
 
         log.debug("_evaluate_metric")
         """
 
         log.debug("_evaluate_metric")
-        metric_value = self._get_metric_value(alarm.metric, alarm.tags)
-        if alarm.alarm_status.upper() != AlarmStatus.DISABLED.value.upper():
-            if metric_value is None:
-                log.warning("No metric result for alarm %s", alarm.uuid)
-                self.queue.put((alarm, AlarmStatus.INSUFFICIENT))
-            else:
-                if (
-                    (alarm.operation.upper() == "GT" and metric_value > alarm.threshold)
-                    or (
-                        alarm.operation.upper() == "LT"
-                        and metric_value < alarm.threshold
-                    )
-                    or (
-                        alarm.operation.upper() == "GE"
-                        and metric_value >= alarm.threshold
-                    )
-                    or (
-                        alarm.operation.upper() == "LE"
-                        and metric_value <= alarm.threshold
-                    )
-                    or (
-                        alarm.operation.upper() == "EQ"
-                        and metric_value == alarm.threshold
-                    )
-                    or (
-                        alarm.operation.upper() == "NE"
-                        and metric_value != alarm.threshold
-                    )
-                ):
-                    self.queue.put((alarm, AlarmStatus.ALARM))
-                elif alarm.operation.upper() in ("GT", "LT", "GE", "LE", "EQ", "NE"):
-                    self.queue.put((alarm, AlarmStatus.OK))
+        metric_data = self._get_metric_data(alarm.metric, alarm.tags)
+        if metric_data is None:
+            log.warning("No metric result for alarm %s", alarm.uuid)
+            self.queue.put((alarm, AlarmStatus.INSUFFICIENT))
+        else:
+            for metric in metric_data:
+                metric_value = metric["value"]
+                metric_labels = metric["labels"]
+                alarm.extra_labels.update(metric_labels)
+                if alarm.alarm_status.upper() != AlarmStatus.DISABLED.value.upper():
+                    if (
+                        (
+                            alarm.operation.upper() == "GT"
+                            and metric_value > alarm.threshold
+                        )
+                        or (
+                            alarm.operation.upper() == "LT"
+                            and metric_value < alarm.threshold
+                        )
+                        or (
+                            alarm.operation.upper() == "GE"
+                            and metric_value >= alarm.threshold
+                        )
+                        or (
+                            alarm.operation.upper() == "LE"
+                            and metric_value <= alarm.threshold
+                        )
+                        or (
+                            alarm.operation.upper() == "EQ"
+                            and metric_value == alarm.threshold
+                        )
+                        or (
+                            alarm.operation.upper() == "NE"
+                            and metric_value != alarm.threshold
+                        )
+                    ):
+                        self.queue.put((alarm, AlarmStatus.ALARM))
+                    elif alarm.operation.upper() in (
+                        "GT",
+                        "LT",
+                        "GE",
+                        "LE",
+                        "EQ",
+                        "NE",
+                    ):
+                        self.queue.put((alarm, AlarmStatus.OK))
 
     def update_alarm_status(self, alarm_state, uuid):
         alarm_data = self.common_db.get_alarm_by_uuid(uuid)
 
     def update_alarm_status(self, alarm_state, uuid):
         alarm_data = self.common_db.get_alarm_by_uuid(uuid)
@@ -100,6 +114,10 @@ class EvaluatorService:
             self.common_db.update_alarm_status(alarm_state, uuid)
         return
 
             self.common_db.update_alarm_status(alarm_state, uuid)
         return
 
+    def update_alarm_extra_labels(self, alarm_labels, uuid):
+        self.common_db.update_alarm_extra_labels(alarm_labels, uuid)
+        return
+
     def evaluate_alarms(self) -> List[Tuple[Alarm, AlarmStatus]]:
         log.debug("evaluate_alarms")
         processes = []
     def evaluate_alarms(self) -> List[Tuple[Alarm, AlarmStatus]]:
         log.debug("evaluate_alarms")
         processes = []
index 3ce117a..7f0768d 100644 (file)
@@ -20,6 +20,7 @@
 # For those usages not covered by the Apache License, Version 2.0 please
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
 # For those usages not covered by the Apache License, Version 2.0 please
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
+
 import unittest
 from unittest import mock
 
 import unittest
 from unittest import mock
 
@@ -211,6 +212,7 @@ class CommonDbClientTest(unittest.TestCase):
                 "operation": "operation",
                 "uuid": "1",
                 "alarm_status": "ok",
                 "operation": "operation",
                 "uuid": "1",
                 "alarm_status": "ok",
+                "extra_labels": {},
             },
         )
 
             },
         )
 
index 15af5b6..54368dd 100644 (file)
@@ -20,6 +20,7 @@
 # For those usages not covered by the Apache License, Version 2.0 please
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
 # For those usages not covered by the Apache License, Version 2.0 please
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
+
 from unittest import TestCase, mock
 
 from osm_mon.core.common_db import CommonDbClient
 from unittest import TestCase, mock
 
 from osm_mon.core.common_db import CommonDbClient
@@ -132,13 +133,23 @@ class EvaluatorTest(TestCase):
         super().setUp()
         self.config = Config()
 
         super().setUp()
         self.config = Config()
 
-    @mock.patch.object(EvaluatorService, "_get_metric_value")
-    def test_evaluate_metric(self, get_metric_value):
+    @mock.patch.object(EvaluatorService, "_get_metric_data")
+    def test_evaluate_metric(self, get_metric_data):
         mock_alarm = mock.Mock()
         mock_alarm.operation = "gt"
         mock_alarm.threshold = 50.0
         mock_alarm.metric = "metric_name"
         mock_alarm = mock.Mock()
         mock_alarm.operation = "gt"
         mock_alarm.threshold = 50.0
         mock_alarm.metric = "metric_name"
-        get_metric_value.return_value = 100.0
+        get_metric_data.return_value = [
+            {
+                "labels": {
+                    "vdu_name": "cirros_vnfd-VM",
+                    "ns_id": "87776f33-b67c-417a-8119-cb08e4098951",
+                    "vnf_member_index": "1",
+                    "extra_label": "run_time_added_label",
+                },
+                "value": 100.0,
+            }
+        ]
 
         service = EvaluatorService(self.config)
         service.queue = mock.Mock()
 
         service = EvaluatorService(self.config)
         service.queue = mock.Mock()
@@ -151,7 +162,7 @@ class EvaluatorTest(TestCase):
         service.queue.put.assert_called_with((mock_alarm, AlarmStatus.OK))
         service.queue.reset_mock()
 
         service.queue.put.assert_called_with((mock_alarm, AlarmStatus.OK))
         service.queue.reset_mock()
 
-        get_metric_value.return_value = None
+        get_metric_data.return_value = None
         service._evaluate_metric(mock_alarm)
         service.queue.put.assert_called_with((mock_alarm, AlarmStatus.INSUFFICIENT))
 
         service._evaluate_metric(mock_alarm)
         service.queue.put.assert_called_with((mock_alarm, AlarmStatus.INSUFFICIENT))
 
@@ -176,10 +187,10 @@ class EvaluatorTest(TestCase):
 
         process.assert_called_with(target=evaluate_metric, args=(mock_alarm,))
 
 
         process.assert_called_with(target=evaluate_metric, args=(mock_alarm,))
 
-    @mock.patch.object(PrometheusBackend, "get_metric_value")
-    def test_get_metric_value_prometheus(self, get_metric_value):
+    @mock.patch.object(PrometheusBackend, "get_metric_data")
+    def test_get_metric_data_prometheus(self, get_metric_data):
         self.config.set("evaluator", "backend", "prometheus")
         evaluator = EvaluatorService(self.config)
         self.config.set("evaluator", "backend", "prometheus")
         evaluator = EvaluatorService(self.config)
-        evaluator._get_metric_value("test", {})
+        evaluator._get_metric_data("test", {})
 
 
-        get_metric_value.assert_called_with("test", {})
+        get_metric_data.assert_called_with("test", {})
index ea62ee3..b91baaf 100644 (file)
@@ -18,7 +18,7 @@
     # via -r requirements-dev.in
 -e git+https://osm.etsi.org/gerrit/osm/common.git@master#egg=osm-common
     # via -r requirements-dev.in
     # via -r requirements-dev.in
 -e git+https://osm.etsi.org/gerrit/osm/common.git@master#egg=osm-common
     # via -r requirements-dev.in
-aiokafka==0.8.1
+aiokafka==0.11.0
     # via -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
 async-timeout==4.0.3
     # via
     # via -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
 async-timeout==4.0.3
     # via
@@ -26,35 +26,35 @@ async-timeout==4.0.3
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
     #   aiokafka
     #   retrying-async
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
     #   aiokafka
     #   retrying-async
-bcrypt==4.0.1
+bcrypt==4.2.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   paramiko
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   paramiko
-cachetools==5.3.1
+cachetools==5.4.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   google-auth
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   google-auth
-certifi==2023.7.22
+certifi==2024.7.4
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
     #   requests
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
     #   requests
-cffi==1.16.0
+cffi==1.17.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   cryptography
     #   pynacl
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   cryptography
     #   pynacl
-charset-normalizer==3.2.0
+charset-normalizer==3.3.2
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   requests
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   requests
-cryptography==41.0.4
+cryptography==43.0.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   paramiko
 dataclasses==0.6
     # via -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   paramiko
 dataclasses==0.6
     # via -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
-dnspython==2.4.2
+dnspython==2.6.1
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
@@ -63,7 +63,7 @@ google-auth==2.17.3
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
-idna==3.4
+idna==3.7
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   requests
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   requests
@@ -73,20 +73,16 @@ jujubundlelib==0.5.7
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   theblues
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   theblues
-kafka-python==2.0.2
-    # via
-    #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
-    #   aiokafka
-kubernetes==26.1.0
+kubernetes==30.1.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
-macaroonbakery==1.3.1
+macaroonbakery==1.3.4
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     #   theblues
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     #   theblues
-motor==3.3.1
+motor==3.5.1
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
@@ -97,8 +93,9 @@ mypy-extensions==1.0.0
 oauthlib==3.2.2
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
 oauthlib==3.2.2
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
+    #   kubernetes
     #   requests-oauthlib
     #   requests-oauthlib
-packaging==23.1
+packaging==24.1
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
     #   aiokafka
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
     #   aiokafka
@@ -110,27 +107,27 @@ protobuf==3.20.3
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   macaroonbakery
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   macaroonbakery
-pyasn1==0.5.0
+pyasn1==0.6.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     #   pyasn1-modules
     #   rsa
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     #   pyasn1-modules
     #   rsa
-pyasn1-modules==0.3.0
+pyasn1-modules==0.4.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   google-auth
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   google-auth
-pycparser==2.21
+pycparser==2.22
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   cffi
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   cffi
-pycryptodome==3.19.0
+pycryptodome==3.20.0
     # via -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
 pymacaroons==0.13.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   macaroonbakery
     # via -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
 pymacaroons==0.13.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   macaroonbakery
-pymongo==4.5.0
+pymongo==4.8.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
@@ -146,29 +143,29 @@ pyrfc3339==1.1
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     #   macaroonbakery
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     #   macaroonbakery
-python-dateutil==2.8.2
+python-dateutil==2.9.0.post0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
-pytz==2023.3.post1
+pytz==2024.1
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   pyrfc3339
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   pyrfc3339
-pyyaml==6.0.1
+pyyaml==6.0.2
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     #   jujubundlelib
     #   kubernetes
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     #   jujubundlelib
     #   kubernetes
-requests==2.31.0
+requests==2.32.3
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
     #   macaroonbakery
     #   requests-oauthlib
     #   theblues
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
     #   macaroonbakery
     #   requests-oauthlib
     #   theblues
-requests-oauthlib==1.3.1
+requests-oauthlib==2.0.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
@@ -195,27 +192,26 @@ toposort==1.10
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
-typing-extensions==4.8.0
+typing-extensions==4.12.2
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
+    #   -r https://osm.etsi.org/gitweb/?p=osm/common.git;a=blob_plain;f=requirements.txt;hb=master
+    #   aiokafka
     #   typing-inspect
 typing-inspect==0.9.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     #   typing-inspect
 typing-inspect==0.9.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
-urllib3==2.0.5
+urllib3==2.2.2
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
     #   requests
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
     #   requests
-websocket-client==1.6.3
+websocket-client==1.8.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   kubernetes
-websockets==11.0.3
+websockets==12.0
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
     # via
     #   -r https://osm.etsi.org/gitweb/?p=osm/N2VC.git;a=blob_plain;f=requirements.txt;hb=master
     #   juju
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
index a2e1554..db0f0ed 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #######################################################################################
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #######################################################################################
-certifi==2023.7.22
+certifi==2024.7.4
     # via
     #   -r requirements-test.in
     #   requests
     # via
     #   -r requirements-test.in
     #   requests
-charset-normalizer==3.2.0
+charset-normalizer==3.3.2
     # via
     #   -r requirements-test.in
     #   requests
     # via
     #   -r requirements-test.in
     #   requests
-coverage==7.3.1
+coverage==7.6.1
     # via -r requirements-test.in
     # via -r requirements-test.in
-idna==3.4
+idna==3.7
     # via requests
 mock==5.1.0
     # via -r requirements-test.in
     # via requests
 mock==5.1.0
     # via -r requirements-test.in
-nose2==0.13.0
+nose2==0.15.1
     # via -r requirements-test.in
     # via -r requirements-test.in
-requests==2.31.0
+requests==2.32.3
     # via requests-mock
     # via requests-mock
-requests-mock==1.11.0
+requests-mock==1.12.1
     # via -r requirements-test.in
     # via -r requirements-test.in
-six==1.16.0
-    # via requests-mock
-urllib3==2.0.5
+urllib3==2.2.2
     # via requests
     # via requests
index 1dd93f6..16dc462 100644 (file)
@@ -25,6 +25,7 @@ charset-normalizer
 cryptography
 gnocchiclient
 humanfriendly
 cryptography
 gnocchiclient
 humanfriendly
+kafka-python
 lxml
 prometheus-api-client
 prometheus-client
 lxml
 prometheus-api-client
 prometheus-client
index 1a8c97d..b78ca8d 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #######################################################################################
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #######################################################################################
-aiokafka==0.8.1
+aiokafka==0.11.0
     # via -r requirements.in
     # via -r requirements.in
-appdirs==1.4.4
-    # via openstacksdk
 async-timeout==4.0.3
     # via aiokafka
 async-timeout==4.0.3
     # via aiokafka
-attrs==23.1.0
+attrs==24.2.0
     # via cmd2
     # via cmd2
-autopage==0.5.1
+autopage==0.5.2
     # via cliff
     # via cliff
-certifi==2023.7.22
+certifi==2024.7.4
     # via
     #   -r requirements.in
     #   requests
     # via
     #   -r requirements.in
     #   requests
-cffi==1.16.0
+cffi==1.17.0
     # via
     #   -r requirements.in
     #   cryptography
     # via
     #   -r requirements.in
     #   cryptography
-charset-normalizer==3.2.0
+charset-normalizer==3.3.2
     # via
     #   -r requirements.in
     #   requests
     # via
     #   -r requirements.in
     #   requests
-cliff==4.3.0
+cliff==4.7.0
     # via
     #   gnocchiclient
     #   osc-lib
     #   python-neutronclient
 cmd2==2.4.3
     # via cliff
     # via
     #   gnocchiclient
     #   osc-lib
     #   python-neutronclient
 cmd2==2.4.3
     # via cliff
-contourpy==1.1.1
+contourpy==1.2.1
     # via matplotlib
     # via matplotlib
-cryptography==41.0.4
+cryptography==43.0.0
     # via
     #   -r requirements.in
     #   openstacksdk
     # via
     #   -r requirements.in
     #   openstacksdk
-cycler==0.12.0
+cycler==0.12.1
     # via matplotlib
     # via matplotlib
-dateparser==1.1.8
+dateparser==1.2.0
     # via prometheus-api-client
     # via prometheus-api-client
-debtcollector==2.5.0
+debtcollector==3.0.0
     # via
     #   gnocchiclient
     #   oslo-config
     #   oslo-context
     # via
     #   gnocchiclient
     #   oslo-config
     #   oslo-context
-    #   oslo-log
     #   oslo-utils
     #   python-keystoneclient
     #   python-neutronclient
     #   oslo-utils
     #   python-keystoneclient
     #   python-neutronclient
@@ -66,11 +63,11 @@ decorator==5.1.1
     # via
     #   dogpile-cache
     #   openstacksdk
     # via
     #   dogpile-cache
     #   openstacksdk
-dogpile-cache==1.2.2
+dogpile-cache==1.3.3
     # via openstacksdk
     # via openstacksdk
-fonttools==4.42.1
+fonttools==4.53.1
     # via matplotlib
     # via matplotlib
-futurist==2.4.1
+futurist==3.0.0
     # via gnocchiclient
 gnocchiclient==7.0.8
     # via -r requirements.in
     # via gnocchiclient
 gnocchiclient==7.0.8
     # via -r requirements.in
@@ -80,11 +77,9 @@ humanfriendly==10.0
     # via
     #   -r requirements.in
     #   pyvcloud
     # via
     #   -r requirements.in
     #   pyvcloud
-idna==3.4
+idna==3.7
     # via requests
     # via requests
-importlib-metadata==6.8.0
-    # via cliff
-iso8601==2.0.0
+iso8601==2.1.0
     # via
     #   gnocchiclient
     #   keystoneauth1
     # via
     #   gnocchiclient
     #   keystoneauth1
@@ -97,11 +92,11 @@ jmespath==1.0.1
     # via openstacksdk
 jsonpatch==1.33
     # via openstacksdk
     # via openstacksdk
 jsonpatch==1.33
     # via openstacksdk
-jsonpointer==2.4
+jsonpointer==3.0.0
     # via jsonpatch
 kafka-python==2.0.2
     # via jsonpatch
 kafka-python==2.0.2
-    # via aiokafka
-keystoneauth1==5.3.0
+    # via -r requirements.in
+keystoneauth1==5.7.0
     # via
     #   gnocchiclient
     #   openstacksdk
     # via
     #   gnocchiclient
     #   openstacksdk
@@ -113,16 +108,16 @@ keystoneauth1==5.3.0
     #   python-novaclient
 kiwisolver==1.4.5
     # via matplotlib
     #   python-novaclient
 kiwisolver==1.4.5
     # via matplotlib
-lxml==4.9.3
+lxml==5.2.2
     # via
     #   -r requirements.in
     #   pyvcloud
     #   unittest-xml-reporting
     # via
     #   -r requirements.in
     #   pyvcloud
     #   unittest-xml-reporting
-matplotlib==3.8.0
+matplotlib==3.9.1.post1
     # via prometheus-api-client
     # via prometheus-api-client
-msgpack==1.0.7
+msgpack==1.0.8
     # via oslo-serialization
     # via oslo-serialization
-netaddr==0.9.0
+netaddr==1.3.0
     # via
     #   oslo-config
     #   oslo-utils
     # via
     #   oslo-config
     #   oslo-utils
@@ -131,13 +126,13 @@ netifaces==0.11.0
     # via
     #   openstacksdk
     #   oslo-utils
     # via
     #   openstacksdk
     #   oslo-utils
-numpy==1.26.0
+numpy==2.0.1
     # via
     #   contourpy
     #   matplotlib
     #   pandas
     #   prometheus-api-client
     # via
     #   contourpy
     #   matplotlib
     #   pandas
     #   prometheus-api-client
-openstacksdk==1.5.0
+openstacksdk==3.3.0
     # via
     #   os-client-config
     #   osc-lib
     # via
     #   os-client-config
     #   osc-lib
@@ -148,15 +143,15 @@ os-service-types==1.7.0
     # via
     #   keystoneauth1
     #   openstacksdk
     # via
     #   keystoneauth1
     #   openstacksdk
-osc-lib==2.8.1
+osc-lib==3.1.0
     # via python-neutronclient
     # via python-neutronclient
-oslo-config==9.2.0
+oslo-config==9.5.0
     # via
     #   oslo-log
     #   python-keystoneclient
     # via
     #   oslo-log
     #   python-keystoneclient
-oslo-context==5.2.0
+oslo-context==5.5.0
     # via oslo-log
     # via oslo-log
-oslo-i18n==6.1.0
+oslo-i18n==6.3.0
     # via
     #   osc-lib
     #   oslo-config
     # via
     #   osc-lib
     #   oslo-config
@@ -167,16 +162,16 @@ oslo-i18n==6.1.0
     #   python-keystoneclient
     #   python-neutronclient
     #   python-novaclient
     #   python-keystoneclient
     #   python-neutronclient
     #   python-novaclient
-oslo-log==5.3.0
+oslo-log==6.1.1
     # via python-neutronclient
     # via python-neutronclient
-oslo-serialization==5.2.0
+oslo-serialization==5.4.0
     # via
     #   oslo-log
     #   python-ceilometerclient
     #   python-keystoneclient
     #   python-neutronclient
     #   python-novaclient
     # via
     #   oslo-log
     #   python-ceilometerclient
     #   python-keystoneclient
     #   python-neutronclient
     #   python-novaclient
-oslo-utils==6.2.1
+oslo-utils==7.2.0
     # via
     #   osc-lib
     #   oslo-log
     # via
     #   osc-lib
     #   oslo-log
@@ -186,16 +181,16 @@ oslo-utils==6.2.1
     #   python-keystoneclient
     #   python-neutronclient
     #   python-novaclient
     #   python-keystoneclient
     #   python-neutronclient
     #   python-novaclient
-packaging==23.1
+packaging==24.1
     # via
     #   aiokafka
     #   matplotlib
     #   oslo-utils
     #   python-keystoneclient
     #   pyvcloud
     # via
     #   aiokafka
     #   matplotlib
     #   oslo-utils
     #   python-keystoneclient
     #   pyvcloud
-pandas==2.1.1
+pandas==2.2.2
     # via prometheus-api-client
     # via prometheus-api-client
-pbr==5.11.1
+pbr==6.0.0
     # via
     #   keystoneauth1
     #   openstacksdk
     # via
     #   keystoneauth1
     #   openstacksdk
@@ -211,35 +206,35 @@ pbr==5.11.1
     #   python-neutronclient
     #   python-novaclient
     #   stevedore
     #   python-neutronclient
     #   python-novaclient
     #   stevedore
-pillow==10.0.1
+pillow==10.4.0
     # via matplotlib
     # via matplotlib
+platformdirs==4.2.2
+    # via openstacksdk
 prettytable==0.7.2
     # via
     #   cliff
     #   python-ceilometerclient
     #   python-cinderclient
     #   python-novaclient
 prettytable==0.7.2
     # via
     #   cliff
     #   python-ceilometerclient
     #   python-cinderclient
     #   python-novaclient
-prometheus-api-client==0.5.4
+prometheus-api-client==0.5.5
     # via -r requirements.in
     # via -r requirements.in
-prometheus-client==0.17.1
+prometheus-client==0.20.0
     # via -r requirements.in
     # via -r requirements.in
-pycparser==2.21
+pycparser==2.22
     # via cffi
     # via cffi
-pygments==2.16.1
+pygments==2.18.0
     # via pyvcloud
     # via pyvcloud
-pyinotify==0.9.6
-    # via oslo-log
-pyparsing==3.1.1
+pyparsing==3.1.2
     # via
     #   matplotlib
     #   oslo-utils
     # via
     #   matplotlib
     #   oslo-utils
-pyperclip==1.8.2
+pyperclip==1.9.0
     # via cmd2
 python-ceilometerclient==2.9.0
     # via -r requirements.in
 python-cinderclient==8.3.0
     # via -r requirements.in
     # via cmd2
 python-ceilometerclient==2.9.0
     # via -r requirements.in
 python-cinderclient==8.3.0
     # via -r requirements.in
-python-dateutil==2.8.2
+python-dateutil==2.9.0.post0
     # via
     #   dateparser
     #   gnocchiclient
     # via
     #   dateparser
     #   gnocchiclient
@@ -247,36 +242,36 @@ python-dateutil==2.8.2
     #   oslo-log
     #   pandas
     #   pyvcloud
     #   oslo-log
     #   pandas
     #   pyvcloud
-python-keystoneclient==5.2.0
+python-keystoneclient==5.4.0
     # via
     #   -r requirements.in
     #   python-neutronclient
     # via
     #   -r requirements.in
     #   python-neutronclient
-python-neutronclient==11.0.0
+python-neutronclient==11.3.1
     # via -r requirements.in
     # via -r requirements.in
-python-novaclient==18.4.0
+python-novaclient==18.6.0
     # via -r requirements.in
     # via -r requirements.in
-pytz==2023.3.post1
+pytz==2024.1
     # via
     #   dateparser
     # via
     #   dateparser
-    #   oslo-serialization
-    #   oslo-utils
     #   pandas
 pyvcloud==23.0.4
     # via -r requirements.in
     #   pandas
 pyvcloud==23.0.4
     # via -r requirements.in
-pyyaml==6.0.1
+pyyaml==6.0.2
     # via
     #   -r requirements.in
     #   cliff
     #   openstacksdk
     #   oslo-config
     # via
     #   -r requirements.in
     #   cliff
     #   openstacksdk
     #   oslo-config
+    #   oslo-utils
     #   pyvcloud
     #   pyvcloud
-regex==2023.8.8
+regex==2024.7.24
     # via dateparser
     # via dateparser
-requests==2.31.0
+requests==2.32.3
     # via
     #   -r requirements.in
     #   httmock
     #   keystoneauth1
     # via
     #   -r requirements.in
     #   httmock
     #   keystoneauth1
+    #   osc-lib
     #   oslo-config
     #   prometheus-api-client
     #   python-ceilometerclient
     #   oslo-config
     #   prometheus-api-client
     #   python-ceilometerclient
@@ -288,19 +283,15 @@ requestsexceptions==1.4.0
     # via openstacksdk
 rfc3986==2.0.0
     # via oslo-config
     # via openstacksdk
 rfc3986==2.0.0
     # via oslo-config
-simplejson==3.19.1
-    # via
-    #   osc-lib
-    #   python-cinderclient
-    #   python-neutronclient
+simplejson==3.19.2
+    # via python-cinderclient
 six==1.16.0
     # via
     #   -r requirements.in
     #   gnocchiclient
     #   python-ceilometerclient
     #   python-dateutil
 six==1.16.0
     # via
     #   -r requirements.in
     #   gnocchiclient
     #   python-ceilometerclient
     #   python-dateutil
-    #   python-keystoneclient
-stevedore==5.1.0
+stevedore==5.2.0
     # via
     #   cliff
     #   dogpile-cache
     # via
     #   cliff
     #   dogpile-cache
@@ -311,26 +302,26 @@ stevedore==5.1.0
     #   python-cinderclient
     #   python-keystoneclient
     #   python-novaclient
     #   python-cinderclient
     #   python-keystoneclient
     #   python-novaclient
-typing-extensions==4.8.0
-    # via dogpile-cache
-tzdata==2023.3
+typing-extensions==4.12.2
+    # via
+    #   aiokafka
+    #   dogpile-cache
+tzdata==2024.1
     # via
     #   oslo-serialization
     #   oslo-utils
     #   pandas
     # via
     #   oslo-serialization
     #   oslo-utils
     #   pandas
-tzlocal==5.0.1
+tzlocal==5.2
     # via dateparser
     # via dateparser
-ujson==5.8.0
+ujson==5.10.0
     # via gnocchiclient
 unittest-xml-reporting==3.2.0
     # via pyvcloud
     # via gnocchiclient
 unittest-xml-reporting==3.2.0
     # via pyvcloud
-urllib3==2.0.5
+urllib3==2.2.2
     # via requests
 vcd-api-schemas-type==10.3.0.dev72
     # via pyvcloud
     # via requests
 vcd-api-schemas-type==10.3.0.dev72
     # via pyvcloud
-wcwidth==0.2.7
+wcwidth==0.2.13
     # via cmd2
     # via cmd2
-wrapt==1.15.0
+wrapt==1.16.0
     # via debtcollector
     # via debtcollector
-zipp==3.17.0
-    # via importlib-metadata