diff --git a/.deps/resolved/linux-aarch64_3.13.txt b/.deps/resolved/linux-aarch64_3.13.txt index 89f4f14f235e9..0e88330fb512d 100644 --- a/.deps/resolved/linux-aarch64_3.13.txt +++ b/.deps/resolved/linux-aarch64_3.13.txt @@ -1,30 +1,30 @@ aerospike @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/aerospike/aerospike-7.1.1-20260423151051-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=13e750c0fbc8fd5f41810e5b3e72be2d132124e47a148dd147352a84b90fc614 -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260427212409-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260428182602-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 cm-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cm-client/cm_client-45.0.4-20260326173357-py3-none-manylinux2014_aarch64.whl#sha256=0bbcf2766028850c26a917deef3704a096cc9ba0c25220d45ff424334d25dcd7 -confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260427212843-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=4e1376443bd6d35dff13d6ece36d3dd91bf4c1c28cecbc4ce180ab318a1f91cb -cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.7-20260427212844-cp313-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=557c1336c852e241cb5abac754a8e9275c48cf45e7ae5c985012211828b60cae +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260428182944-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=e32d72646392defe1a7e5c5828039a08baa9deeb12a56f0bf820ccca357436ea +cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.7-20260428182945-cp313-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=d7aac68f9869a17abff8a6536090bcb1dffbccb3905e3c4d3d84382f60941b33 ddtrace @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/ddtrace/ddtrace-3.19.5-20260417115249-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl#sha256=a4f8d07adccdd43908156ab2c143dbb6261ed9a3c43ba58a3bb6bd1b6ef94734 foundationdb @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/foundationdb/foundationdb-6.3.25-20260326173358-py3-none-manylinux2014_aarch64.whl#sha256=d34180500220db4458e57505c774de0363456d4129f0e3fe98c9e99e8eef77c2 gssapi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/gssapi/gssapi-1.11.1-20260423151125-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=861b3cde93aec1b05a5e9ac917780dbac66d773bd427834bdf738825e559d197 -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260427212429-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260428182617-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260423151143-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=f6dd9d9a2d81b129b52ace318104ea9c04c1e7a5e11724aede73ba7c12f7fcac -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260427212441-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf -os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260427212451-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260427212500-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260428182625-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf +os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260428182632-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260428182640-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e psutil @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psutil/psutil-6.0.0-20260326173401-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=22e075e3cbc57b5da0d93f72f691746c5198ce88c5aea6fdb54186b3e8c46832 psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260423151232-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=0bee628a33b6d05bae2f8ba97995e4f6c95ae6a6bb4c7b27160a17b7fb21c8ec pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260415154515-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=30d8af4ef8fda85d1a865bdb254e6b2e3988f26b723eb39a4843c766371ff517 pyodbc @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyodbc/pyodbc-5.3.0-20260415154516-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=91a4191cf30930755d82e8edd6ac861443dfb6fbbf7915753b73209038ad5ad2 -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260427212511-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 +pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260428182649-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 pyvmomi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyvmomi/pyvmomi-8.0.3.0.1-20260326173403-py2.py3-none-manylinux2014_aarch64.whl#sha256=dd71476b7308286ed4219373ca9523e4f06bfed3f5932f60e5c67d8d5a673e1e -requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260427212521-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260427212530-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260427212540-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 +requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260428182657-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260428182704-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260428182712-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 simplejson @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/simplejson/simplejson-3.20.2-20260326173404-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=cb739020a718c2e32041a0fa0a3f79398f45c067347fe8f286c8222fa777bc5d -stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260427212549-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260427212559-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd -vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260427212608-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da -websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260427212618-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260428182720-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260428182728-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd +vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260428182736-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da +websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260428182744-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 annotated-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/annotated-types/annotated_types-0.7.0-py3-none-any.whl#sha256=1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 attrs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/attrs/attrs-26.1.0-py3-none-any.whl#sha256=c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 aws-msk-iam-sasl-signer-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/aws-msk-iam-sasl-signer-python/aws_msk_iam_sasl_signer_python-1.0.2-py2.py3-none-any.whl#sha256=310eb2db9ca0ff55ed06a24212739b87533e7f1cf6f34e43aabbd97a3b21290e diff --git a/.deps/resolved/linux-x86_64_3.13.txt b/.deps/resolved/linux-x86_64_3.13.txt index 723fba7c54d7a..15c00e3d8e5ee 100644 --- a/.deps/resolved/linux-x86_64_3.13.txt +++ b/.deps/resolved/linux-x86_64_3.13.txt @@ -1,31 +1,31 @@ -aerospike @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/aerospike/aerospike-7.1.1-20260423150254-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=aba4253796375b00ed7850c6cab414673bdf429861ecdb4338208665ea9df767 -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260427212409-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +aerospike @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/aerospike/aerospike-7.1.1-20260428164312-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=c0e3d8e4300f46d3b95e3e4dad5845b27041ecf186d13f6239f16c07e571dc34 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260428182602-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 cm-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cm-client/cm_client-45.0.4-20260326173305-py3-none-manylinux2014_x86_64.whl#sha256=0bbcf2766028850c26a917deef3704a096cc9ba0c25220d45ff424334d25dcd7 -confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260427212415-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=d539b46f85ee8c7c460eed0eaff0812c47ff136a5edd2b0d72947650ec572e15 -cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.7-20260427212417-cp313-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=9c275a5e1ea3d83f502be5cb0d006fd88768735e01d701f7946384c0cb83860a +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260428182607-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=fb4f9f3782824fa71e9effcbe96822fe21c2a840c1c31bfa5bf8b11884ee1722 +cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.7-20260428182608-cp313-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=7ea743141ea5b19157c70ab1051714de74a7a67bfe755c5e53756b9a754f0b31 ddtrace @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/ddtrace/ddtrace-3.19.5-20260417115349-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl#sha256=e0aa298cfd1947902fed35d8fa6129c90f6d5e687328b0cba6fe137714198608 foundationdb @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/foundationdb/foundationdb-6.3.25-20260326173307-py3-none-manylinux2014_x86_64.whl#sha256=d34180500220db4458e57505c774de0363456d4129f0e3fe98c9e99e8eef77c2 gssapi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/gssapi/gssapi-1.11.1-20260423150329-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b0eefba08d72fa793402e49072b61c84e8414c9fdeda2b80dfa8a47c3865dc66 -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260427212429-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260428182617-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260423150348-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=1814588e913f80e3f81753b2cb601eb1fce0001d33749cdc78b6134c20f1382a -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260427212441-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf -os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260427212451-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260427212500-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260428182625-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf +os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260428182632-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260428182640-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e psutil @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psutil/psutil-6.0.0-20260326173308-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=af8dd07e6f1bf1d41381ad59dff0a0a36153c7dd5a69becc765010329f17db01 -psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260423150438-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=e7eafc789e999ae259d825fc9425655f627584bc1ff76c8c0847d53e236df6cf -pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260423150439-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a0bc69dc57d3ba6db1fc23ac471ddd5edeeef737fef8e912b0b96126f0b13a8c -pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260423150440-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=20b5e67134719cae77a2b6c20da5219931b3735e30538567fb2b73e34219203b -pyodbc @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyodbc/pyodbc-5.3.0-20260423150441-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=80d6bdc8ba09a778205c68493fa72a44a599fd8c31803a4f4d4e3bcf1f2284fe -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260427212511-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 +psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260428164611-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=17b02dd30d9542d6d12e0cf395d564bb55b053e2a0ab68e09dc0b89899359475 +pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260428164613-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=384c10d235c7d9c912cfc2630276acfb5714f3565cb41d689a6a391fe0896df6 +pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260428164614-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b766051362a35867bdd4815e86b3492cdf28da34411d9a41217b44e65797ad42 +pyodbc @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyodbc/pyodbc-5.3.0-20260428164615-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=d7c1547851bd768a8af2020c079a6ce5d687657dab3eaaf275db3fb788ef3b2e +pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260428182649-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 pyvmomi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyvmomi/pyvmomi-8.0.3.0.1-20260326173310-py2.py3-none-manylinux2014_x86_64.whl#sha256=dd71476b7308286ed4219373ca9523e4f06bfed3f5932f60e5c67d8d5a673e1e -requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260427212521-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260427212530-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260427212540-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 +requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260428182657-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260428182704-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260428182712-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 simplejson @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/simplejson/simplejson-3.20.2-20260326173311-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=dec16958f71ce93ac1c2fdc212800892ca22a9e90efcab5b5e01d121146cc5cc -stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260427212549-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260427212559-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd -vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260427212608-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da -websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260427212618-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260428182720-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260428182728-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd +vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260428182736-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da +websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260428182744-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 annotated-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/annotated-types/annotated_types-0.7.0-py3-none-any.whl#sha256=1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 attrs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/attrs/attrs-26.1.0-py3-none-any.whl#sha256=c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 aws-msk-iam-sasl-signer-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/aws-msk-iam-sasl-signer-python/aws_msk_iam_sasl_signer_python-1.0.2-py2.py3-none-any.whl#sha256=310eb2db9ca0ff55ed06a24212739b87533e7f1cf6f34e43aabbd97a3b21290e diff --git a/.deps/resolved/macos-aarch64_3.13.txt b/.deps/resolved/macos-aarch64_3.13.txt index ad111f29f0eb3..671785a94a8e4 100644 --- a/.deps/resolved/macos-aarch64_3.13.txt +++ b/.deps/resolved/macos-aarch64_3.13.txt @@ -1,28 +1,28 @@ -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260427191304-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260428165817-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 cm-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cm-client/cm_client-45.0.4-20260326173218-py3-none-macosx_12_0_universal2.whl#sha256=0bbcf2766028850c26a917deef3704a096cc9ba0c25220d45ff424334d25dcd7 -confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260427211935-cp313-cp313-macosx_12_0_arm64.whl#sha256=4245f4d0a45b50580395828d84bf7aa5379d72fd24f879bc8545e62832553ed8 +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260428182215-cp313-cp313-macosx_12_0_arm64.whl#sha256=121901916bd8694a90d0c8cfab28f583073cc5141ed2c33ab0b7a4bfa5a2a249 ddtrace @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/ddtrace/ddtrace-3.19.5-20260417115301-cp313-cp313-macosx_12_0_arm64.whl#sha256=1274db819aa41b189135f83ad2b8e37c6e26b8d2f25c60a725a01637ebd63ee4 foundationdb @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/foundationdb/foundationdb-6.3.25-20260326173219-py3-none-macosx_12_0_universal2.whl#sha256=d34180500220db4458e57505c774de0363456d4129f0e3fe98c9e99e8eef77c2 gssapi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/gssapi/gssapi-1.11.1-20260326173323-cp311-abi3-macosx_11_0_arm64.whl#sha256=b5f5ac28470db99338814e4285a491dc218b9bee3f8d20bfa219274e84bd87c4 -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260427191339-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260428165912-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260326173323-cp311-abi3-macosx_11_0_arm64.whl#sha256=47f731bebe725962f7b644e7238a4c68eca2879f6c35842babda9140f263c615 -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260427191404-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf -os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260427191431-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260427191457-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260428165944-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf +os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260428170015-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260428170013-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e psutil @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psutil/psutil-6.0.0-20260326173324-cp38-abi3-macosx_11_0_arm64.whl#sha256=33472398d3e6da655a430b106920164b04f036f891bd0ea803a4309ed2a80ef9 psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260423145618-cp313-cp313-macosx_12_0_arm64.whl#sha256=bfe56ecdab4dce0ae8442ef05e1a37df4b1d63741f7188f66f9005fc11bfd013 pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260326173325-cp313-cp313-macosx_12_0_arm64.whl#sha256=7c94a2b73c148f84ab217ea2084d07e01e834d49244dec026b473e889016f556 pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260326173325-cp313-cp313-macosx_12_0_arm64.whl#sha256=482b0d2593868c595ec53db794a61a792c0e1fcad04aee86db96afaadf986baf -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260427191527-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 +pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260428170031-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 pyvmomi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyvmomi/pyvmomi-8.0.3.0.1-20260326173224-py2.py3-none-macosx_12_0_universal2.whl#sha256=dd71476b7308286ed4219373ca9523e4f06bfed3f5932f60e5c67d8d5a673e1e -requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260427191554-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260427191622-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260427191649-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 +requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260428170046-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260428170102-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260428170117-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 simplejson @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/simplejson/simplejson-3.20.2-20260326173326-cp313-cp313-macosx_11_0_arm64.whl#sha256=fc3c4e9feecd85f1831fb0983b04e7170765b5047c3c629ab97c0c49190a5da8 -stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260427191717-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260427191744-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd -vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260427191811-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da -websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260427191839-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260428170132-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260428170148-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd +vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260428170204-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da +websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260428170219-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 annotated-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/annotated-types/annotated_types-0.7.0-py3-none-any.whl#sha256=1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 attrs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/attrs/attrs-26.1.0-py3-none-any.whl#sha256=c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 aws-msk-iam-sasl-signer-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/aws-msk-iam-sasl-signer-python/aws_msk_iam_sasl_signer_python-1.0.2-py2.py3-none-any.whl#sha256=310eb2db9ca0ff55ed06a24212739b87533e7f1cf6f34e43aabbd97a3b21290e diff --git a/.deps/resolved/macos-x86_64_3.13.txt b/.deps/resolved/macos-x86_64_3.13.txt index d93047769563b..40a6b901e8d5a 100644 --- a/.deps/resolved/macos-x86_64_3.13.txt +++ b/.deps/resolved/macos-x86_64_3.13.txt @@ -1,28 +1,28 @@ -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260427212409-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260428182602-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 cm-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cm-client/cm_client-45.0.4-20260326173218-py3-none-macosx_12_0_universal2.whl#sha256=0bbcf2766028850c26a917deef3704a096cc9ba0c25220d45ff424334d25dcd7 -confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260427212633-cp313-cp313-macosx_12_0_x86_64.whl#sha256=a6eb1a2d889d6c4c69885559db7aaa16f8abe345377135f3064ce2ddc80df188 +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260428182757-cp313-cp313-macosx_12_0_x86_64.whl#sha256=b266c48dcd2a4908a3c913d841eb5342dcb2ab1415b5abf990e078973f572e5f ddtrace @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/ddtrace/ddtrace-3.19.5-20260417115332-cp313-cp313-macosx_12_0_x86_64.whl#sha256=813c9fae90bd65d60d97e183b21dff8f9d54591a9186cf163f606fb11b7a6575 foundationdb @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/foundationdb/foundationdb-6.3.25-20260326173219-py3-none-macosx_12_0_universal2.whl#sha256=d34180500220db4458e57505c774de0363456d4129f0e3fe98c9e99e8eef77c2 gssapi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/gssapi/gssapi-1.11.1-20260326173219-cp311-abi3-macosx_10_9_x86_64.whl#sha256=91608d102056a7768b9e572ccbe2ccbe7da84688a84f05bb8c4ea56e9d0e979d -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260427212429-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260428182617-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260326173220-cp311-abi3-macosx_10_9_x86_64.whl#sha256=0fe3a687f4e9a8d305ba0183f9b8368e9ed13f4e32716ba3a14de77e12f1e978 -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260427212441-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf -os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260427212451-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260427212500-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260428182625-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf +os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260428182632-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260428182640-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e psutil @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psutil/psutil-6.0.0-20260326173222-cp36-abi3-macosx_10_9_x86_64.whl#sha256=81ae816033cb82995bc78424b02886430400b730698d6a7c492e3256b7854777 psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260423150827-cp313-cp313-macosx_12_0_x86_64.whl#sha256=e8ab0dba4501610ffbddf96a2747ab5894650634498b6933c7646852f1933520 pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260326173223-cp313-cp313-macosx_12_0_x86_64.whl#sha256=8b8c0174d55284134d7373fa1116522a241804560b86f05b883d4964692caaaa pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260326173223-cp313-cp313-macosx_12_0_x86_64.whl#sha256=95ed07eebe53c2720cdaaf5d7de3364c80d373b9286b4a1b301f157592ee8ccb -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260427212511-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 +pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260428182649-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 pyvmomi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyvmomi/pyvmomi-8.0.3.0.1-20260326173224-py2.py3-none-macosx_12_0_universal2.whl#sha256=dd71476b7308286ed4219373ca9523e4f06bfed3f5932f60e5c67d8d5a673e1e -requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260427212521-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260427212530-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260427212540-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 +requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260428182657-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260428182704-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260428182712-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 simplejson @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/simplejson/simplejson-3.20.2-20260326173225-cp313-cp313-macosx_10_13_x86_64.whl#sha256=41b283f75ddb7e47b24fb57dc37d88078e51cd777438f368224e1282fc8ee465 -stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260427212549-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260427212559-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd -vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260427212608-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da -websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260427212618-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260428182720-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260428182728-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd +vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260428182736-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da +websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260428182744-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 annotated-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/annotated-types/annotated_types-0.7.0-py3-none-any.whl#sha256=1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 attrs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/attrs/attrs-26.1.0-py3-none-any.whl#sha256=c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 aws-msk-iam-sasl-signer-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/aws-msk-iam-sasl-signer-python/aws_msk_iam_sasl_signer_python-1.0.2-py2.py3-none-any.whl#sha256=310eb2db9ca0ff55ed06a24212739b87533e7f1cf6f34e43aabbd97a3b21290e diff --git a/.deps/resolved/windows-x86_64_3.13.txt b/.deps/resolved/windows-x86_64_3.13.txt index 243857daaaf56..83d8093a847b1 100644 --- a/.deps/resolved/windows-x86_64_3.13.txt +++ b/.deps/resolved/windows-x86_64_3.13.txt @@ -1,28 +1,28 @@ -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260427212137-py3-none-any.whl#sha256=6f69d4818864f67ab304ac48497fefcc7f4fdd9bbcb9403cbc22dbe211177824 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260428182359-py3-none-any.whl#sha256=6f69d4818864f67ab304ac48497fefcc7f4fdd9bbcb9403cbc22dbe211177824 cm-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cm-client/cm_client-45.0.4-20260326173335-py3-none-win_amd64.whl#sha256=6a11ff78eeff20d6a20036e7320a2cb1fd4a5c318a2f1b81b1449efea34048eb colorama @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/colorama/colorama-0.4.6-20260417115313-py2.py3-none-any.whl#sha256=3eb3f5bc1022d96fbe8df6f419cfb07d028e24c055cc3c59517fa49a95ab067a -confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260427212142-cp313-cp313-win_amd64.whl#sha256=2836bccdd5658b20331ccd10c7b66f3feb1a0e3d76e9c699b1d78ff8a9322499 +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260428182403-cp313-cp313-win_amd64.whl#sha256=07fe5c1949ca7b3c42073dabee454405729ec2a99c7bd8cd77fb43ef78be8327 ddtrace @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/ddtrace/ddtrace-3.19.5-20260417115314-cp313-cp313-win_amd64.whl#sha256=4f3009589d1c2e0ca84fe8bdb20367de10f090e84cb401ab1d538055927ac0f7 foundationdb @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/foundationdb/foundationdb-6.3.25-20260326173337-py3-none-win_amd64.whl#sha256=828ed23b81a64a5495b1091dd8a66ea51e84c55d9d814c5b6baf7b80dbd9881b -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260427212152-py3-none-any.whl#sha256=81b21cc6f3283215bb1a993f7c8240a0aeef36775d52ccca99c438075e054fba -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260427212200-py3-none-any.whl#sha256=4ac88799ad5c355825b9567f5ca00fe9bcbd97cfe2649f60500fbe5f66610732 -os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260427212209-py3-none-any.whl#sha256=668903c54b88cc4db5fd1dcbaf7cf7417220ef70592b70b49a76d202e8a7f4e8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260427212218-py2.py3-none-any.whl#sha256=dbc2e1e0dbf694097374a40b72c890c915302ae4dd7d37c73db9cff8bf520c4b +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260428182411-py3-none-any.whl#sha256=81b21cc6f3283215bb1a993f7c8240a0aeef36775d52ccca99c438075e054fba +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260428182419-py3-none-any.whl#sha256=4ac88799ad5c355825b9567f5ca00fe9bcbd97cfe2649f60500fbe5f66610732 +os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260428182426-py3-none-any.whl#sha256=668903c54b88cc4db5fd1dcbaf7cf7417220ef70592b70b49a76d202e8a7f4e8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260428182434-py2.py3-none-any.whl#sha256=dbc2e1e0dbf694097374a40b72c890c915302ae4dd7d37c73db9cff8bf520c4b psutil @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psutil/psutil-6.0.0-20260326173339-cp37-abi3-win_amd64.whl#sha256=484a4a6e0e16a9adf22b01dc2917426536c8bf63378e445816eee9833aad4f71 -psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260427212223-cp313-cp313-win_amd64.whl#sha256=dcb8873b7389663fc749e4b96d03df930501feaeb511440508d7d5baae6061fe -pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260427212228-cp313-cp313-win_amd64.whl#sha256=d112eb3efbf7eca4e10a70719fd8377f5871b26f530adfdda09771fa216594e6 -pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260427212233-cp313-cp313-win_amd64.whl#sha256=41e731aca7bc070d5a0d408a76c7182c48a0656260036326b93a1b0e0313d87c -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260427212243-py2.py3-none-any.whl#sha256=b3796e82ce920d942b3e2de5af4c8567738b72caffac49ec6d88684fd0365690 +psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260428182438-cp313-cp313-win_amd64.whl#sha256=22b8b22df9629a9d493fe280719cc0f2c608cb7bae665be1921d19b6f38018a1 +pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260428182442-cp313-cp313-win_amd64.whl#sha256=a161a13e7325dee0c874ad0ebd76213555e0901d41834e20a08c1254fa103585 +pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260428182447-cp313-cp313-win_amd64.whl#sha256=4cadc152e5402359f3ca35a7f2deb1a1a09daa3d2f46ecc9f0d46a18ac7469e5 +pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260428182455-py2.py3-none-any.whl#sha256=b3796e82ce920d942b3e2de5af4c8567738b72caffac49ec6d88684fd0365690 pyvmomi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyvmomi/pyvmomi-8.0.3.0.1-20260326173340-py2.py3-none-win_amd64.whl#sha256=c8487fb88881dc6bfc3507b9c351929221c8e85aa5e74179b82cda9d21364218 pywin32 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pywin32/pywin32-311-20260326173341-cp313-cp313-win_amd64.whl#sha256=1e7784bf006cbfd7ffc4ce238eecc6ae43bfaf5d8132a6401d58a4ad0a36aea5 -requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260427212252-py3-none-any.whl#sha256=7f0bbfc823535680dd0e1ad2aedad8dc958130a180c421288244a33509ea2b0d -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260427212302-py3-none-any.whl#sha256=4b33353c4d80e63f2417fff600939c30580c49721c76b0f7cf1ea4a18a131c4b -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260427212311-py3-none-any.whl#sha256=3e5b8439ed8ba11221d6479f27a25a261cba045c357a912dc60e236710504ef6 +requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260428182503-py3-none-any.whl#sha256=7f0bbfc823535680dd0e1ad2aedad8dc958130a180c421288244a33509ea2b0d +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260428182511-py3-none-any.whl#sha256=4b33353c4d80e63f2417fff600939c30580c49721c76b0f7cf1ea4a18a131c4b +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260428182519-py3-none-any.whl#sha256=3e5b8439ed8ba11221d6479f27a25a261cba045c357a912dc60e236710504ef6 simplejson @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/simplejson/simplejson-3.20.2-20260326173342-cp313-cp313-win_amd64.whl#sha256=cd71398a228fa91cd9ee2bb88079ba6693c60a68c14e684d386181a8a5eb67bc -stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260427212321-py3-none-any.whl#sha256=b6ba40fc40b665f04276c98a21b7ddd029b6b5d80bc3c3e68dc58964f2ca0828 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260427212331-py2.py3-none-any.whl#sha256=01f0c6c7fbc4b9a0ccb659a6463319eb83742ba0d6c156e5256484aaedef2917 -vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260427212341-py3-none-any.whl#sha256=3a094a32c4a892c32be2acb3e77452c8d7b907b6b6ebaa1e6b0a1f5bbecf4d38 -websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260427212352-py3-none-any.whl#sha256=cb12e51596b0dbb085df6efdbd7d00cc315ea04e88f667513702899903ec39fc +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260428182527-py3-none-any.whl#sha256=b6ba40fc40b665f04276c98a21b7ddd029b6b5d80bc3c3e68dc58964f2ca0828 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260428182535-py2.py3-none-any.whl#sha256=01f0c6c7fbc4b9a0ccb659a6463319eb83742ba0d6c156e5256484aaedef2917 +vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260428182543-py3-none-any.whl#sha256=3a094a32c4a892c32be2acb3e77452c8d7b907b6b6ebaa1e6b0a1f5bbecf4d38 +websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260428182551-py3-none-any.whl#sha256=cb12e51596b0dbb085df6efdbd7d00cc315ea04e88f667513702899903ec39fc annotated-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/annotated-types/annotated_types-0.7.0-py3-none-any.whl#sha256=1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 attrs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/attrs/attrs-26.1.0-py3-none-any.whl#sha256=c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 aws-msk-iam-sasl-signer-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/aws-msk-iam-sasl-signer-python/aws_msk_iam_sasl_signer_python-1.0.2-py2.py3-none-any.whl#sha256=310eb2db9ca0ff55ed06a24212739b87533e7f1cf6f34e43aabbd97a3b21290e diff --git a/.github/workflows/release-dispatch.yml b/.github/workflows/release-dispatch.yml index 9e2775500b8d8..e0d21d99dee87 100644 --- a/.github/workflows/release-dispatch.yml +++ b/.github/workflows/release-dispatch.yml @@ -92,7 +92,7 @@ jobs: run: python .github/workflows/scripts/release_dispatch.py dispatch: - name: Dispatch wheel builds (batch ${{ strategy.job-index + 1 }}) + name: Dispatch wheel builds (batch ${{ strategy.job-index }}) needs: prepare if: needs.prepare.outputs.has_packages == 'true' && !inputs.dry-run runs-on: ubuntu-latest diff --git a/bentoml/assets/configuration/spec.yaml b/bentoml/assets/configuration/spec.yaml index 6ed1a85eed9ac..d5f358fe23a97 100644 --- a/bentoml/assets/configuration/spec.yaml +++ b/bentoml/assets/configuration/spec.yaml @@ -10,6 +10,7 @@ files: options: - template: instances/openmetrics overrides: + openmetrics_endpoint.display_priority: 3 openmetrics_endpoint.value.example: http://localhost:3000/metrics openmetrics_endpoint.description: | Endpoint exposing the BentoML Prometheus metrics. For more information refer to: diff --git a/boundary/assets/configuration/spec.yaml b/boundary/assets/configuration/spec.yaml index 03dcc159dce37..0b6511556c114 100644 --- a/boundary/assets/configuration/spec.yaml +++ b/boundary/assets/configuration/spec.yaml @@ -10,6 +10,7 @@ files: options: - name: health_endpoint fleet_configurable: true + display_priority: 5 required: true description: | The Boundary controller's health endpoint. @@ -18,6 +19,7 @@ files: example: http://localhost:9203/health - template: instances/openmetrics overrides: + openmetrics_endpoint.display_priority: 3 openmetrics_endpoint.value.example: http://localhost:9203/metrics openmetrics_endpoint.description: | The URL where Boundary exposes Prometheus metrics. diff --git a/ddev/changelog.d/23489.added b/ddev/changelog.d/23489.added new file mode 100644 index 0000000000000..44e12064f3148 --- /dev/null +++ b/ddev/changelog.d/23489.added @@ -0,0 +1,8 @@ +Rework event bus error handling around a single `on_error` router and a new `fail_fast` orchestrator policy. The `ddev validate all` command is updated to align with the new lifecycle (the orchestrator no longer aborts the process from inside `on_finalize`; the command checks `had_failures` and exits accordingly). + +* Add `fail_fast` constructor option to `EventBusOrchestrator` (default `False`). When an `on_error` handler raises a non-Fatal exception, `fail_fast=True` stops the bus while `fail_fast=False` logs and continues. +* Add `EventBusOrchestrator.on_error(error)`: handles `on_initialize`, `on_message_received`, and `on_finalize` failures. Default re-raises so unmodified subclasses fall through to `fail_fast`. +* `BaseProcessor.on_error` signature changes from `on_error(message, error)` to `on_error(error)`. The message is now reachable as `error.message` on the wrapped exception (alongside `error.processor_name` and `error.original_exception`). Existing subclasses that override `on_error` must update their signature and replace `message` with `error.message` — code using the old signature will fail at runtime. The default implementation now re-raises so unmodified processors fall through to the new `fail_fast` policy. +* Add `HookExecutionError` hierarchy (`OrchestratorHookError`, `ProcessorHookError`) and `HookName` enum for identifying which hook failed. +* Add `SkipMessageError`: raise from `on_message_received` to skip dispatch for the current message and continue the loop. +* `on_initialize` and `on_finalize` failures now route through `on_error` instead of always propagating from `run()`. Under default `fail_fast=False` they log and continue; subclasses that need the old behavior should pass `fail_fast=True` or override `on_error` to escalate. `ValidationOrchestrator` opts into `fail_fast=True` so finalize failures still surface in the validation report. diff --git a/ddev/src/ddev/cli/validate/all/__init__.py b/ddev/src/ddev/cli/validate/all/__init__.py index 216313ef57fe2..23eeecec442b4 100644 --- a/ddev/src/ddev/cli/validate/all/__init__.py +++ b/ddev/src/ddev/cli/validate/all/__init__.py @@ -80,3 +80,6 @@ def all( subprocess_timeout=subprocess_timeout, ) orchestrator.run() + + if orchestrator.had_failures: + app.abort() diff --git a/ddev/src/ddev/cli/validate/all/orchestrator.py b/ddev/src/ddev/cli/validate/all/orchestrator.py index 9a6c7e8c8ba04..ace5fe9960b3f 100644 --- a/ddev/src/ddev/cli/validate/all/orchestrator.py +++ b/ddev/src/ddev/cli/validate/all/orchestrator.py @@ -193,6 +193,9 @@ def __init__( max_timeout=max_timeout, grace_period=grace_period, executor=ThreadPoolExecutor(max_workers=len(validations)), + # Surface lifecycle hook failures so on_finalize can render them in the + # validation report instead of silently logging. + fail_fast=True, ) self._app = app self._validations = validations @@ -226,6 +229,11 @@ async def on_finalize(self, exception: Exception | None) -> None: self._publish_report(exception) self._print_console_output() + @property + def had_failures(self) -> bool: + """True if any validation failed or did not complete.""" + return any(not r.success for r in self._results.values()) or len(self._results) < len(self._validations) + def _build_error_and_warning(self, exception: Exception | None) -> tuple[str | None, str | None]: error_msg = f"Error running validations: {exception}" if exception else None @@ -323,6 +331,5 @@ def _print_console_output(self) -> None: if self._target: fix_all_cmd = f"ddev validate all {self._target} --fix" self._app.display_info(f"\nRun `{fix_all_cmd}` to attempt to auto-fix supported validations.") - self._app.abort() else: self._app.display_success(f"All {passed} validations passed") diff --git a/ddev/src/ddev/event_bus/exceptions.py b/ddev/src/ddev/event_bus/exceptions.py index c9201672c5bf1..eea465d094ba8 100644 --- a/ddev/src/ddev/event_bus/exceptions.py +++ b/ddev/src/ddev/event_bus/exceptions.py @@ -3,12 +3,22 @@ # Licensed under a 3-clause BSD style license (see LICENSE) from __future__ import annotations +from enum import StrEnum, auto from typing import TYPE_CHECKING if TYPE_CHECKING: from .orchestrator import BaseMessage +class HookName(StrEnum): + """Names of the lifecycle hooks exposed by the event bus.""" + + ON_INITIALIZE = auto() + ON_FINALIZE = auto() + ON_MESSAGE_RECEIVED = auto() + ON_SUCCESS = auto() + + class ProcessorQueueError(Exception): """ Exception raised when a processor queue is not initialized. @@ -19,7 +29,10 @@ class ProcessorQueueError(Exception): class MessageProcessingError(Exception): """ - Exception raised when a processor fails to process a message. + Exception raised when a processor's ``process_message`` call fails. + + Routed to the processor's ``on_error`` so the developer can decide what to do + with a per-message failure. """ def __init__(self, processor_name: str, message: BaseMessage, original_exception: Exception): @@ -32,26 +45,93 @@ def __init__(self, processor_name: str, message: BaseMessage, original_exception ) -class ProcessorSuccessHookError(MessageProcessingError): +class HookExecutionError(Exception): """ - Exception raised when the on_success hook of a processor fails. + Base class for hook execution failures. + + Hook failures are routed to the appropriate ``on_error`` (orchestrator-scope + or processor-scope) so the developer can decide whether to keep going, + stop the bus via ``FatalProcessingError``, or let the orchestrator's + ``fail_fast`` policy decide. """ - def __init__(self, processor_name: str, message: BaseMessage, original_exception: Exception): - super(Exception, self).__init__( - f"Error in 'on_success' hook for processor '{processor_name}'. " - f"Message: {message}. " - f"Original error: {original_exception}" + def __init__(self, hook_name: HookName, original_exception: Exception, description: str): + self.hook_name = hook_name + self.original_exception = original_exception + super().__init__(description) + + +class OrchestratorHookError(HookExecutionError): + """ + Exception raised when an orchestrator-level hook (``on_initialize``, + ``on_message_received``, ``on_finalize``) fails. + + ``message`` is the message being processed when the failure occurred, if any. + For ``on_initialize`` and ``on_finalize`` failures it will be ``None``. + """ + + def __init__( + self, + hook_name: HookName, + original_exception: Exception, + message: BaseMessage | None = None, + ): + rendered_message = f"Message: {message}. " if message is not None else "" + super().__init__( + hook_name, + original_exception, + f"Error in '{hook_name.value}' orchestrator hook. {rendered_message}Original error: {original_exception}", + ) + self.message = message + + +class ProcessorHookError(HookExecutionError): + """ + Exception raised when a processor-level hook (e.g. ``on_success``) fails. + """ + + def __init__( + self, + hook_name: HookName, + processor_name: str, + message: BaseMessage, + original_exception: Exception, + ): + super().__init__( + hook_name, + original_exception, + f"Error in '{hook_name.value}' hook for processor '{processor_name}'. " + f"Message: {message}. Original error: {original_exception}", ) self.processor_name = processor_name self.message = message - self.original_exception = original_exception class FatalProcessingError(Exception): """ - Raised by hooks or processors to signal that the Orchestrator should - stop processing immediately and shutdown gracefully. + Raised by hooks or processors to signal that the orchestrator should stop + processing immediately and shut down gracefully. + + This is the explicit "stop the bus" signal. Any hook (including ``on_error``) + can raise it to halt the orchestrator regardless of the ``fail_fast`` policy. + """ + + pass + + +class SkipMessageError(Exception): + """ + Raised directly from ``on_message_received`` to skip dispatch for the current + message and continue the loop. + + Use this when the orchestrator decides a specific message cannot be processed + safely and no processor should receive it. Per-processor filtering (when + *some* processors should still see the message) belongs in + ``BaseProcessor.should_process_message`` instead. + + Only honored when raised directly from ``on_message_received``. From any other + hook (``on_initialize``, ``on_finalize``, ``on_error``, processor scope) it + propagates as a regular exception subject to the ``fail_fast`` policy. """ pass diff --git a/ddev/src/ddev/event_bus/orchestrator.py b/ddev/src/ddev/event_bus/orchestrator.py index 070a81c08ca60..17b7f541c2306 100644 --- a/ddev/src/ddev/event_bus/orchestrator.py +++ b/ddev/src/ddev/event_bus/orchestrator.py @@ -7,11 +7,22 @@ import contextlib import logging from abc import ABC, abstractmethod +from collections.abc import Awaitable, Callable from concurrent.futures import Executor, ThreadPoolExecutor from dataclasses import dataclass from typing import assert_never -from .exceptions import FatalProcessingError, MessageProcessingError, ProcessorQueueError, ProcessorSuccessHookError +from .exceptions import ( + FatalProcessingError, + HookName, + MessageProcessingError, + OrchestratorHookError, + ProcessorHookError, + ProcessorQueueError, + SkipMessageError, +) + +ErrorHandler = Callable[[Exception], Awaitable[None]] @dataclass @@ -33,8 +44,24 @@ def __init__(self, name: str): async def on_success(self, message: T) -> None: pass - async def on_error(self, message: T, error: Exception) -> None: - pass + async def on_error(self, error: Exception) -> None: + """ + Handle a processor-scoped failure. + + Receives a :class:`MessageProcessingError` when ``process_message`` fails, or a + :class:`ProcessorHookError` when a processor hook (e.g. ``on_success``) fails. + Both wrappers expose ``.message``, ``.original_exception``, and ``.processor_name`` + so the developer can decide what to do. + + Behavior of the return: + - Return cleanly: the error is considered handled, processing continues. + - Raise :class:`FatalProcessingError`: stop the orchestrator. + - Raise anything else: the orchestrator's ``fail_fast`` policy decides. + + The default implementation re-raises so unmodified processors fall through to + the orchestrator-level ``fail_fast`` policy. + """ + raise error def submit_message(self, message: BaseMessage) -> None: if self.queue is None: @@ -69,6 +96,7 @@ def __init__( max_timeout: float = 300, grace_period: float = 10, executor: Executor | None = None, + fail_fast: bool = False, ): """ Args: @@ -78,12 +106,17 @@ def __init__( messages have been processed. executor: The executor to use for running sync processors. The default will be a ThreadpoolExecutor with 4 workers. + fail_fast: If True, any exception that escapes an ``on_error`` handler stops + the orchestrator. If False (default), such exceptions are logged + and processing continues. ``FatalProcessingError`` always stops the + orchestrator regardless of this flag. """ self.__validate_parameters(max_timeout, grace_period) self._logger = logger self._max_timeout = max_timeout self._grace_period = grace_period self._executor = executor or ThreadPoolExecutor(max_workers=4) + self._fail_fast = fail_fast self._subscribers: dict[type[BaseMessage], list[Processor]] = {} # These will be initialized in the running loop self._queue = asyncio.Queue[BaseMessage]() @@ -144,7 +177,15 @@ async def initialize(self): Initializes the orchestrator. """ self._running = True - await self.on_initialize() + try: + await self.on_initialize() + except (FatalProcessingError, asyncio.CancelledError): + raise + except Exception as e: + await self._apply_error_policy( + OrchestratorHookError(HookName.ON_INITIALIZE, e), + self.on_error, + ) @abstractmethod async def on_initialize(self): # pragma: no cover @@ -160,7 +201,15 @@ async def finalize(self, exception: Exception | None): In the case that the execution failed, the exception will be passed to the method """ self._running = False - await self.on_finalize(exception) + try: + await self.on_finalize(exception) + except (FatalProcessingError, asyncio.CancelledError): + raise + except Exception as e: + await self._apply_error_policy( + OrchestratorHookError(HookName.ON_FINALIZE, e), + self.on_error, + ) @abstractmethod async def on_finalize(self, exception: Exception | None): # pragma: no cover @@ -173,9 +222,57 @@ async def on_finalize(self, exception: Exception | None): # pragma: no cover async def on_message_received(self, message: BaseMessage): # pragma: no cover """ Hook for subclasses to perform actions when a message is received. + + Returning cleanly proceeds with dispatching the message to every processor + whose ``should_process_message`` accepts it. To prevent dispatch for this + message specifically, raise :class:`SkipMessageError` directly from this + hook. To stop the bus entirely, raise :class:`FatalProcessingError`. Any + other exception is wrapped as :class:`OrchestratorHookError` and routed + through :meth:`on_error`. """ pass + async def on_error(self, error: Exception) -> None: + """ + Handle an orchestrator-scoped failure. + + Called when ``on_initialize``, ``on_message_received``, or ``on_finalize`` + raises a non-Fatal exception. ``error`` is always an + :class:`OrchestratorHookError` whose ``.hook_name`` and ``.original_exception`` + identify what failed. + + Behavior of the return: + - Return cleanly: the error is considered handled, processing continues. + - Raise :class:`FatalProcessingError`: stop the orchestrator. + - Raise anything else: the orchestrator's ``fail_fast`` policy decides. + + The default implementation re-raises so unmodified orchestrators fall through + to the ``fail_fast`` policy. + """ + raise error + + async def _apply_error_policy(self, wrapped_error: Exception, handler: ErrorHandler) -> None: + """ + Routes ``wrapped_error`` through ``handler`` and applies the orchestrator's policy. + + See :meth:`on_error` for the contract. ``FatalProcessingError`` and + ``asyncio.CancelledError`` always propagate as explicit signal exceptions. + """ + try: + await handler(wrapped_error) + except (FatalProcessingError, asyncio.CancelledError): + raise + except Exception as e: + if self._fail_fast: + raise + hook_name = getattr(wrapped_error, "hook_name", type(wrapped_error).__name__) + self._logger.error( + "on_error handler for '%s' raised %s while processing %s", + hook_name, + e, + wrapped_error, + ) + def _remaining_time(self, start_time: float) -> float: """ Calculates the remaining time until the max timeout is reached. @@ -290,19 +387,21 @@ async def __process_new_message( # Re-create the get_task to keep the loop alive return asyncio.create_task(self._queue.get()) - # If we successfully got a message, process it + # If we successfully got a message, process it. SkipMessageError raised + # directly from on_message_received skips dispatch for this message and + # continues with the next one. try: await self.on_message_received(msg) - except asyncio.CancelledError: - # If the await suspension raises a CancelledError, we should respect - # the global shutdown. + except (asyncio.CancelledError, FatalProcessingError): raise - except FatalProcessingError as e: - # If the hook raises a FatalProcessingError, we should stop the orchestrator. - self._logger.error("Fatal error processing on_message_received hook: %s", e) - return None + except SkipMessageError as e: + self._logger.warning("Skipping message %s: %s", msg.id, e) + return asyncio.create_task(self._queue.get()) except Exception as e: - self._logger.warning("Error in on_message_received: %s", e) + await self._apply_error_policy( + OrchestratorHookError(HookName.ON_MESSAGE_RECEIVED, e, message=msg), + self.on_error, + ) # Launch the processors self._handle_message(msg, running_tasks) @@ -316,12 +415,27 @@ def __process_finished_tasks( get_task: asyncio.Task, running_tasks: set[asyncio.Task], ): + # Tasks that escape with an exception have already been through their processor's + # on_error and the orchestrator's policy. The escape itself means the policy + # decided to stop the bus, so propagate the first failure to finalize(). + # FIRST_COMPLETED can deliver several failed tasks in one batch; log the rest + # so post-mortems aren't single-task views of multi-task failures. + first_exc: BaseException | None = None for task in done: if task is get_task: continue running_tasks.discard(task) - if not task.cancelled() and task.exception(): - self._logger.error("Task failed: %s", task.exception()) + if task.cancelled(): + continue + exc = task.exception() + if exc is None: + continue + if first_exc is None: + first_exc = exc + else: + self._logger.error("Additional task failure suppressed: %s", exc) + if first_exc is not None: + raise first_exc def _handle_message(self, msg: BaseMessage, running_tasks: set[asyncio.Task]): """ @@ -338,6 +452,10 @@ def _handle_message(self, msg: BaseMessage, running_tasks: set[asyncio.Task]): async def _task_wrapper(self, processor: Processor, message: BaseMessage): """ Processes a message by the given processor. + + Routes any process_message failure (wrapped as :class:`MessageProcessingError`) + and any on_success failure (wrapped as :class:`ProcessorHookError`) + through the processor's ``on_error`` and applies the orchestrator's policy. """ try: match processor: @@ -347,17 +465,21 @@ async def _task_wrapper(self, processor: Processor, message: BaseMessage): await asyncio.get_running_loop().run_in_executor(self._executor, processor.process_message, message) case _: assert_never(processor) - except Exception as e: - try: - await processor.on_error(message, e) - except Exception as hook_error: - self._logger.error("Error in processor %s on_error: %s", processor.__class__.__name__, hook_error) - - raise MessageProcessingError(processor.name, message, e) from e + except (FatalProcessingError, asyncio.CancelledError): + raise + except Exception as processing_error: + await self._apply_error_policy( + MessageProcessingError(processor.name, message, processing_error), + processor.on_error, + ) + return try: await processor.on_success(message) + except (FatalProcessingError, asyncio.CancelledError): + raise except Exception as e: - # Raise a ProcessorSuccessHookError to ensure the error to show that the failure happened even if the - # process_message call succeeded. - raise ProcessorSuccessHookError(processor.name, message, e) from e + await self._apply_error_policy( + ProcessorHookError(HookName.ON_SUCCESS, processor.name, message, e), + processor.on_error, + ) diff --git a/ddev/tests/cli/validate/all/test_orchestrator.py b/ddev/tests/cli/validate/all/test_orchestrator.py index bc379d89c943b..56f87602f0b9e 100644 --- a/ddev/tests/cli/validate/all/test_orchestrator.py +++ b/ddev/tests/cli/validate/all/test_orchestrator.py @@ -138,15 +138,16 @@ def test_on_initialize_submits_one_message_per_validation(mock_app): # --- ValidationOrchestrator exit code logic --- -def test_all_pass_abort_not_called(mock_app): +def test_all_pass_had_failures_is_false(mock_app): with patch("subprocess.run", return_value=completed_process(returncode=0)): orch = ValidationOrchestrator(app=mock_app, validations=["config", "ci"], target=None, grace_period=0) orch.run() + assert orch.had_failures is False mock_app.abort.assert_not_called() -def test_any_failure_calls_abort(mock_app): +def test_any_failure_marks_had_failures(mock_app): def fake_run(cmd, **kwargs): if "config" in cmd: return completed_process(returncode=1, stderr="bad config") @@ -154,22 +155,25 @@ def fake_run(cmd, **kwargs): with patch("subprocess.run", side_effect=fake_run): orch = ValidationOrchestrator(app=mock_app, validations=["config", "ci"], target=None, grace_period=0) - with pytest.raises(SystemExit): - orch.run() + orch.run() - mock_app.abort.assert_called_once() + assert orch.had_failures is True + # Aborting is the CLI command's responsibility, not the orchestrator's. + mock_app.abort.assert_not_called() -def test_on_finalize_warns_on_incomplete_validations(mock_app): +def test_incomplete_validations_marks_had_failures(mock_app): orch = ValidationOrchestrator(app=mock_app, validations=["config", "ci", "metadata"], target=None) orch._results = { "config": ValidationResult(name="config", success=True, stdout="ok", stderr="", duration=1.0), } - with pytest.raises(SystemExit): - asyncio.run(orch.on_finalize(exception=None)) + asyncio.run(orch.on_finalize(exception=None)) + + assert orch.had_failures is True mock_app.display_warning.assert_called() warning_args = [str(c) for c in mock_app.display_warning.call_args_list] assert any("2 validation(s) did not complete" in w for w in warning_args) + mock_app.abort.assert_not_called() def test_on_finalize_logs_exception(mock_app): @@ -209,8 +213,7 @@ def test_on_finalize_posts_pr_comment_on_failure(mock_app): orch._results = { "config": ValidationResult(name="config", success=False, stdout="err", stderr="", duration=1.0), } - with pytest.raises(SystemExit): - asyncio.run(orch.on_finalize(exception=None)) + asyncio.run(orch.on_finalize(exception=None)) mock_app.github.post_pull_request_comment.assert_called_once() body = mock_app.github.post_pull_request_comment.call_args[0][1] @@ -230,8 +233,7 @@ def test_on_finalize_pr_comment_omits_run_link_when_env_missing(mock_app, monkey orch._results = { "config": ValidationResult(name="config", success=False, stdout="err", stderr="", duration=1.0), } - with pytest.raises(SystemExit): - asyncio.run(orch.on_finalize(exception=None)) + asyncio.run(orch.on_finalize(exception=None)) body = mock_app.github.post_pull_request_comment.call_args[0][1] assert "[View full run]" not in body @@ -246,8 +248,7 @@ def test_on_finalize_step_summary_does_not_include_run_link(mock_app, tmp_path, orch._results = { "config": ValidationResult(name="config", success=False, stdout="err", stderr="", duration=1.0), } - with pytest.raises(SystemExit): - asyncio.run(orch.on_finalize(exception=None)) + asyncio.run(orch.on_finalize(exception=None)) content = summary_file.read_text(encoding="utf-8") assert "[View full run]" not in content @@ -312,8 +313,7 @@ def test_on_finalize_handles_post_failure(mock_app): orch._results = { "config": ValidationResult(name="config", success=False, stdout="err", stderr="", duration=1.0), } - with pytest.raises(SystemExit): - asyncio.run(orch.on_finalize(exception=None)) + asyncio.run(orch.on_finalize(exception=None)) mock_app.display_warning.assert_called() warning_args = [str(c) for c in mock_app.display_warning.call_args_list] diff --git a/ddev/tests/event_bus/test_event_bus.py b/ddev/tests/event_bus/test_event_bus.py index 9d852c6a6291d..d92799a7e77e7 100644 --- a/ddev/tests/event_bus/test_event_bus.py +++ b/ddev/tests/event_bus/test_event_bus.py @@ -14,7 +14,16 @@ import pytest from pytest_mock import MockerFixture -from ddev.event_bus.exceptions import FatalProcessingError, ProcessorQueueError +from ddev.event_bus.exceptions import ( + FatalProcessingError, + HookExecutionError, + HookName, + MessageProcessingError, + OrchestratorHookError, + ProcessorHookError, + ProcessorQueueError, + SkipMessageError, +) from ddev.event_bus.orchestrator import AsyncProcessor, BaseMessage, EventBusOrchestrator, SyncProcessor # Test Structure Documentation @@ -81,6 +90,7 @@ def __init__(self, name: str): self.delivered_memos: list[BaseMessage] = [] self.confirmations: list[BaseMessage] = [] self.failed_deliveries: list[tuple[BaseMessage, Exception]] = [] + self.hook_failures: list[ProcessorHookError] = [] async def process_message(self, message: Memo) -> None: if message.content.startswith("fail_processing"): @@ -92,10 +102,13 @@ async def on_success(self, message: Memo) -> None: raise RuntimeError("Success hook failed intentionally") self.confirmations.append(message) - async def on_error(self, message: Memo, error: Exception) -> None: - if message.content == "fail_processing_and_error": - raise RuntimeError("Error hook failed intentionally") - self.failed_deliveries.append((message, error)) + async def on_error(self, error: Exception) -> None: + if isinstance(error, MessageProcessingError): + if error.message.content == "fail_processing_and_error": + raise RuntimeError("Error hook failed intentionally") + self.failed_deliveries.append((error.message, error.original_exception)) + elif isinstance(error, ProcessorHookError): + self.hook_failures.append(error) class Analyst(AsyncProcessor[TaskAssignment | Announcement]): @@ -123,8 +136,19 @@ async def process_message(self, message: Memo) -> None: class MockOrchestrator(EventBusOrchestrator): - def __init__(self, logger: logging.Logger, max_timeout: float = 300, grace_period: float = 10): - super().__init__(logger=logger, max_timeout=max_timeout, grace_period=grace_period) + def __init__( + self, + logger: logging.Logger, + max_timeout: float = 300, + grace_period: float = 10, + fail_fast: bool = False, + ): + super().__init__( + logger=logger, + max_timeout=max_timeout, + grace_period=grace_period, + fail_fast=fail_fast, + ) self.events: list[str] = [] self.received_messages: list[BaseMessage] = [] self.finalized_exception: Exception | None = None @@ -226,46 +250,46 @@ def test_workflow_success( def test_processor_processing_failure( orchestrator: MockOrchestrator, secretary: Secretary, - caplog: pytest.LogCaptureFixture, memo_content: str, expected_error_type: type[Exception], ) -> None: + """Secretary's on_error returns cleanly, so the failure is handled and the bus continues.""" orchestrator.submit_message(Memo("failed_memo", content=memo_content)) orchestrator.run() - # Secretary should have failed processing assert len(secretary.delivered_memos) == 0 assert len(secretary.confirmations) == 0 assert len(secretary.failed_deliveries) == 1 + assert orchestrator.finalized_exception is None failed_msg, error = secretary.failed_deliveries[0] assert failed_msg.id == "failed_memo" assert isinstance(error, expected_error_type) - # Check that MessageProcessingError was logged (as the task failure) - # The log format is "Task failed: %s" where %s is the exception repr - assert "Error processing message by processor" in caplog.text - assert "Processing failed intentionally" in caplog.text - -def test_processor_success_hook_failure( - orchestrator: MockOrchestrator, secretary: Secretary, caplog: pytest.LogCaptureFixture +def test_processor_success_hook_failure_routed_to_on_error( + orchestrator: MockOrchestrator, secretary: Secretary ) -> None: + """on_success failure is wrapped and routed to the processor's on_error.""" orchestrator.submit_message(Memo("hook_fail_memo", content="fail_success_hook")) + orchestrator.run() - # Processing succeeded + # process_message succeeded but on_success failed assert len(secretary.delivered_memos) == 1 - # But success hook failed assert len(secretary.confirmations) == 0 - - # Error hook should NOT be called for success hook failure + # Routed as a ProcessorHookError, not a MessageProcessingError assert len(secretary.failed_deliveries) == 0 + assert len(secretary.hook_failures) == 1 - # Check that ProcessorSuccessHookError was logged - assert "Error in 'on_success' hook for processor" in caplog.text - assert "Success hook failed intentionally" in caplog.text + hook_err = secretary.hook_failures[0] + assert hook_err.hook_name is HookName.ON_SUCCESS + assert isinstance(hook_err.original_exception, RuntimeError) + assert isinstance(hook_err, ProcessorHookError) + assert isinstance(hook_err, HookExecutionError) + # Bus continues — Secretary handled the failure + assert orchestrator.finalized_exception is None def test_mixed_messages(orchestrator: MockOrchestrator, secretary: Secretary, analyst: Analyst) -> None: @@ -328,34 +352,94 @@ def test_validate_parameters(max_timeout: float, grace_period: float, expectatio MockOrchestrator(logger, max_timeout=max_timeout, grace_period=grace_period) -def test_default_on_error(orchestrator: MockOrchestrator, analyst: Analyst, caplog: pytest.LogCaptureFixture) -> None: - # Analyst uses default on_error (pass) +def test_default_on_error_with_default_policy_logs_and_continues( + orchestrator: MockOrchestrator, analyst: Analyst, caplog: pytest.LogCaptureFixture +) -> None: + """Analyst uses the default re-raising on_error; under fail_fast=False the bus logs and continues.""" orchestrator.submit_message(TaskAssignment("bad_task", priority=-1)) orchestrator.run() assert len(analyst.completed_tasks) == 0 assert "finalize" in orchestrator.events + assert orchestrator.finalized_exception is None assert "Analyst failed intentionally" in caplog.text -def test_processor_on_error_failure( - orchestrator: MockOrchestrator, - secretary: Secretary, - caplog: pytest.LogCaptureFixture, +def test_default_on_error_with_fail_fast_stops_bus(secretary: Secretary, analyst: Analyst, manager: Manager) -> None: + """Default on_error re-raises; under fail_fast=True the bus stops.""" + logger = logging.getLogger("test") + orchestrator = MockOrchestrator(logger, grace_period=0.1, fail_fast=True) + orchestrator.register_processor(analyst, [TaskAssignment, Announcement]) + + orchestrator.submit_message(TaskAssignment("bad_task", priority=-1)) + + with pytest.raises(MessageProcessingError) as exc_info: + orchestrator.run() + + assert isinstance(exc_info.value.original_exception, ValueError) + assert "finalize" in orchestrator.events + assert orchestrator.finalized_exception is exc_info.value + + +def test_processor_on_error_failure_logs_under_default_policy( + orchestrator: MockOrchestrator, secretary: Secretary, caplog: pytest.LogCaptureFixture ) -> None: + """on_error itself raising a non-Fatal error is logged under fail_fast=False; bus continues.""" orchestrator.submit_message(Memo("double_fail_memo", content="fail_processing_and_error")) orchestrator.run() assert len(secretary.delivered_memos) == 0 assert len(secretary.failed_deliveries) == 0 - - # The orchestrator should have caught the double failure and continued assert "finalize" in orchestrator.events - # We should have logged the error + assert orchestrator.finalized_exception is None assert "Error hook failed intentionally" in caplog.text - # And the task should have failed with the original processing error wrapped - assert "Error processing message by processor" in caplog.text + + +def test_processor_on_error_failure_stops_bus_under_fail_fast(secretary: Secretary) -> None: + """on_error itself raising a non-Fatal error stops the bus when fail_fast=True.""" + logger = logging.getLogger("test") + orchestrator = MockOrchestrator(logger, grace_period=0.1, fail_fast=True) + orchestrator.register_processor(secretary, [Memo]) + + orchestrator.submit_message(Memo("double_fail_memo", content="fail_processing_and_error")) + + with pytest.raises(RuntimeError, match="Error hook failed intentionally"): + orchestrator.run() + + assert "finalize" in orchestrator.events + assert isinstance(orchestrator.finalized_exception, RuntimeError) + + +def test_on_error_returning_cleanly_continues_under_fail_fast(secretary: Secretary) -> None: + """A processor whose on_error returns cleanly keeps the bus running even with fail_fast=True.""" + logger = logging.getLogger("test") + orchestrator = MockOrchestrator(logger, grace_period=0.1, fail_fast=True) + orchestrator.register_processor(secretary, [Memo]) + + orchestrator.submit_message(Memo("recoverable_memo", content="fail_processing")) + orchestrator.submit_message(Memo("ok_memo", content="ok")) + + orchestrator.run() + + assert orchestrator.finalized_exception is None + assert len(secretary.delivered_memos) == 1 + assert secretary.delivered_memos[0].id == "ok_memo" + assert len(secretary.failed_deliveries) == 1 + + +def test_processor_on_error_recovers_processing_failure(orchestrator: MockOrchestrator, secretary: Secretary) -> None: + """process_message() failures handled by on_error keep the bus running normally.""" + orchestrator.submit_message(Memo("recoverable_memo", content="fail_processing")) + orchestrator.submit_message(Memo("ok_memo", content="ok")) + + orchestrator.run() + + assert "finalize" in orchestrator.events + assert orchestrator.finalized_exception is None + assert len(secretary.delivered_memos) == 1 + assert secretary.delivered_memos[0].id == "ok_memo" + assert len(secretary.failed_deliveries) == 1 def test_no_subscribers() -> None: @@ -371,7 +455,47 @@ def test_no_subscribers() -> None: assert len(orchestrator.received_messages) == 0 -def test_initialization_failure() -> None: +@pytest.mark.parametrize( + "hook_name, hook_attr", + [ + (HookName.ON_INITIALIZE, "on_initialize"), + (HookName.ON_MESSAGE_RECEIVED, "on_message_received"), + (HookName.ON_FINALIZE, "on_finalize"), + ], + ids=["on_initialize", "on_message_received", "on_finalize"], +) +def test_orchestrator_hook_failure_surfaces_under_fail_fast( + hook_name: HookName, + hook_attr: str, +) -> None: + """Each orchestrator-level hook surfaces its failure through run() when fail_fast=True.""" + logger = logging.getLogger("test") + orchestrator = MockOrchestrator(logger, grace_period=0.1, fail_fast=True) + + async def hook_boom(*_args, **_kwargs): + raise RuntimeError(f"{hook_attr} boom") + + setattr(orchestrator, hook_attr, hook_boom) + + if hook_name is HookName.ON_MESSAGE_RECEIVED: + secretary = Secretary("secretary") + orchestrator.register_processor(secretary, [Memo]) + orchestrator.submit_message(Memo("trigger")) + else: + secretary = None + + with pytest.raises(OrchestratorHookError) as exc_info: + orchestrator.run() + + assert exc_info.value.hook_name is hook_name + assert isinstance(exc_info.value.original_exception, RuntimeError) + assert str(exc_info.value.original_exception) == f"{hook_attr} boom" + if secretary is not None: + assert len(secretary.delivered_memos) == 0 + + +def test_initialization_failure_swallowed_under_default_policy(caplog: pytest.LogCaptureFixture) -> None: + """Under fail_fast=False the default on_error re-raise is logged and the bus continues.""" logger = logging.getLogger("test") orchestrator = MockOrchestrator(logger, grace_period=0.1) @@ -379,14 +503,36 @@ async def on_init_fail(): raise RuntimeError("Init failed") orchestrator.on_initialize = on_init_fail + orchestrator.run() - with pytest.raises(RuntimeError, match="Init failed"): - orchestrator.run() + assert "finalize" in orchestrator.events + assert orchestrator.finalized_exception is None + assert "Init failed" in caplog.text + + +def test_orchestrator_on_error_can_handle_initialization_failure() -> None: + """A custom orchestrator on_error can swallow init failures cleanly.""" + logger = logging.getLogger("test") + orchestrator = MockOrchestrator(logger, grace_period=0.1, fail_fast=True) + + seen: list[OrchestratorHookError] = [] + + async def on_init_fail(): + raise RuntimeError("Init failed") - # Finalize should still be called + async def on_error_handle(error): + seen.append(error) + # Return cleanly = handled + + orchestrator.on_initialize = on_init_fail # type: ignore[method-assign] + orchestrator.on_error = on_error_handle # type: ignore[method-assign] + + orchestrator.run() + + assert len(seen) == 1 + assert seen[0].hook_name is HookName.ON_INITIALIZE assert "finalize" in orchestrator.events - assert isinstance(orchestrator.finalized_exception, RuntimeError) - assert str(orchestrator.finalized_exception) == "Init failed" + assert orchestrator.finalized_exception is None def test_finalize_receives_exception_on_process_messages_failure(mocker: MockerFixture) -> None: @@ -501,9 +647,7 @@ def test_processor_submit_without_bus() -> None: processor.submit_message(Memo("fail")) -def test_fatal_processing_error_stops_orchestrator( - orchestrator: MockOrchestrator, caplog: pytest.LogCaptureFixture -) -> None: +def test_fatal_processing_error_stops_orchestrator(orchestrator: MockOrchestrator) -> None: # Capture the original method to preserve its behavior (tracking received messages) original_on_message = orchestrator.on_message_received @@ -518,17 +662,160 @@ async def on_message_fatal(message: BaseMessage): orchestrator.submit_message(Memo("fatal_msg")) orchestrator.submit_message(Memo("ignored_msg")) - orchestrator.run() + with pytest.raises(FatalProcessingError, match="Fatal error triggered"): + orchestrator.run() - # Should stop + # Finalize ran with the fatal error attached assert "finalize" in orchestrator.events - assert "Fatal error processing on_message_received hook" in caplog.text + assert isinstance(orchestrator.finalized_exception, FatalProcessingError) - # Assert that only the first message was processed/received by the hook + # Only the first message was processed/received by the hook assert len(orchestrator.received_messages) == 1 assert orchestrator.received_messages[0].id == "fatal_msg" +def test_orchestrator_hook_failure_swallowed_under_default_policy( + secretary: Secretary, caplog: pytest.LogCaptureFixture +) -> None: + """Under fail_fast=False, an orchestrator hook failure is logged and processing continues.""" + logger = logging.getLogger("test") + orchestrator = MockOrchestrator(logger, grace_period=0.1) + orchestrator.register_processor(secretary, [Memo]) + + call_count = [0] + + async def on_message_first_fails(message: BaseMessage): + call_count[0] += 1 + if call_count[0] == 1: + raise RuntimeError("first message hook failed") + + orchestrator.on_message_received = on_message_first_fails # type: ignore[method-assign] + + orchestrator.submit_message(Memo("boom_msg")) + orchestrator.submit_message(Memo("ok_msg")) + orchestrator.run() + + assert orchestrator.finalized_exception is None + assert "first message hook failed" in caplog.text + # Both messages were dispatched: hook error didn't stop the loop + assert len(secretary.delivered_memos) == 2 + + +def test_processor_on_error_can_signal_fatal(orchestrator: MockOrchestrator, secretary: Secretary) -> None: + """on_error raising FatalProcessingError stops the bus regardless of fail_fast.""" + + async def fatal_on_error(error: Exception) -> None: + raise FatalProcessingError("on_error decided to stop the bus") + + secretary.on_error = fatal_on_error # type: ignore[method-assign] + + orchestrator.submit_message(Memo("trigger_fatal", content="fail_processing")) + + with pytest.raises(FatalProcessingError, match="on_error decided to stop the bus"): + orchestrator.run() + + assert "finalize" in orchestrator.events + assert isinstance(orchestrator.finalized_exception, FatalProcessingError) + assert len(secretary.delivered_memos) == 0 + + +def test_finalize_failure_swallowed_under_default_policy(caplog: pytest.LogCaptureFixture) -> None: + """Under fail_fast=False on_finalize failures route through on_error and are absorbed.""" + logger = logging.getLogger("test") + orchestrator = MockOrchestrator(logger, grace_period=0.1) + + async def on_finalize_boom(exception: Exception | None) -> None: + orchestrator.events.append("finalize") + raise RuntimeError("finalize boom") + + orchestrator.on_finalize = on_finalize_boom # type: ignore[method-assign] + + orchestrator.run() + + assert "finalize" in orchestrator.events + assert "finalize boom" in caplog.text + + +def test_finalize_failure_takes_precedence_over_earlier_exception_under_fail_fast() -> None: + """When init and finalize both fail under fail_fast=True, the finalize failure surfaces.""" + logger = logging.getLogger("test") + orchestrator = MockOrchestrator(logger, grace_period=0.1, fail_fast=True) + + saw_exception: list[Exception | None] = [] + + async def on_init_fail() -> None: + raise RuntimeError("init failed") + + async def on_finalize_boom(exception: Exception | None) -> None: + orchestrator.events.append("finalize") + saw_exception.append(exception) + raise RuntimeError("finalize boom") + + orchestrator.on_initialize = on_init_fail # type: ignore[method-assign] + orchestrator.on_finalize = on_finalize_boom # type: ignore[method-assign] + + with pytest.raises(OrchestratorHookError) as exc_info: + orchestrator.run() + + assert exc_info.value.hook_name is HookName.ON_FINALIZE + assert isinstance(exc_info.value.original_exception, RuntimeError) + assert str(exc_info.value.original_exception) == "finalize boom" + + # on_finalize received the wrapped initialization failure + assert len(saw_exception) == 1 + init_err = saw_exception[0] + assert isinstance(init_err, OrchestratorHookError) + assert init_err.hook_name is HookName.ON_INITIALIZE + + +def test_skip_message_error_from_on_message_received( + orchestrator: MockOrchestrator, secretary: Secretary, caplog: pytest.LogCaptureFixture +) -> None: + """SkipMessageError from on_message_received skips dispatch and continues with the next message.""" + + async def on_message_skip_first(message: BaseMessage): + if message.id == "skip_me": + raise SkipMessageError("not safe to process") + + orchestrator.on_message_received = on_message_skip_first # type: ignore[method-assign] + + orchestrator.submit_message(Memo("skip_me")) + orchestrator.submit_message(Memo("ok_msg")) + orchestrator.run() + + assert orchestrator.finalized_exception is None + assert [m.id for m in secretary.delivered_memos] == ["ok_msg"] + assert "Skipping message skip_me" in caplog.text + assert "not safe to process" in caplog.text + + +def test_skip_message_error_outside_on_message_received_has_no_special_behavior( + bare_orchestrator: MockOrchestrator, caplog: pytest.LogCaptureFixture +) -> None: + """SkipMessageError raised in processor scope has no special skip behavior.""" + + class SkipperProcessor(AsyncProcessor[Memo]): + def __init__(self, name: str): + super().__init__(name) + self.attempts: list[Memo] = [] + + async def process_message(self, message: Memo) -> None: + self.attempts.append(message) + raise SkipMessageError("skip from processor scope") + + proc = SkipperProcessor("skipper") + bare_orchestrator.register_processor(proc, [Memo]) + + bare_orchestrator.submit_message(Memo("m1")) + bare_orchestrator.submit_message(Memo("m2")) + bare_orchestrator.run() + + # process_message was attempted for both messages — bus did not short-circuit + assert len(proc.attempts) == 2 + # No "Skipping message" log line — that path is reserved for on_message_received context + assert "Skipping message" not in caplog.text + + def test_should_process_message_conditional_filtering(bare_orchestrator: MockOrchestrator) -> None: """Processor processes only messages matching a custom predicate on message attributes.""" diff --git a/kyverno/assets/configuration/spec.yaml b/kyverno/assets/configuration/spec.yaml index bf81a71f3de85..e701d3c5f5c0b 100644 --- a/kyverno/assets/configuration/spec.yaml +++ b/kyverno/assets/configuration/spec.yaml @@ -10,6 +10,7 @@ files: options: - template: instances/openmetrics overrides: + openmetrics_endpoint.display_priority: 3 openmetrics_endpoint.value.example: http://localhost:8000/metrics openmetrics_endpoint.description: | Endpoint exposing the Kyverno Controller's Prometheus metrics. For more information refer to: diff --git a/ray/assets/configuration/spec.yaml b/ray/assets/configuration/spec.yaml index 210857694bb37..42ceb5f8f0d94 100644 --- a/ray/assets/configuration/spec.yaml +++ b/ray/assets/configuration/spec.yaml @@ -9,6 +9,8 @@ files: - template: instances options: - template: instances/openmetrics + overrides: + openmetrics_endpoint.display_priority: 3 - template: logs example: - type: file diff --git a/strimzi/assets/configuration/spec.yaml b/strimzi/assets/configuration/spec.yaml index 6f444d1c6cc40..df9e5d36e19b4 100644 --- a/strimzi/assets/configuration/spec.yaml +++ b/strimzi/assets/configuration/spec.yaml @@ -9,6 +9,7 @@ files: - template: instances options: - name: cluster_operator_endpoint + display_priority: 5 description: | Endpoint exposing the Cluster Operator's Prometheus metrics. fleet_configurable: true @@ -17,6 +18,7 @@ files: example: http://cluster-operator-address:8080/metrics type: string - name: topic_operator_endpoint + display_priority: 4 description: | Endpoint exposing the Topic Operator's Prometheus metrics. fleet_configurable: true @@ -25,6 +27,7 @@ files: example: http://topic-operator-address:8080/metrics type: string - name: user_operator_endpoint + display_priority: 3 description: | Endpoint exposing the User Operator's Prometheus metrics. fleet_configurable: true