utf-queue-client 1.21.4b1__tar.gz → 1.21.4b2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.gitmodules +0 -1
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/Jenkinsfile +1 -1
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/PKG-INFO +2 -1
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/pyproject.toml +4 -1
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/requirements.txt +2 -0
- utf_queue_client-1.21.4b2/test/scripts/test_package_release_metadata_cli.py +293 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_publish_release_info.py +3 -1
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_publish_test_results.py +6 -2
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_ubai_copy.py +3 -1
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_ubai_update_retention.py +1 -1
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_ubai_upload.py +9 -3
- utf_queue_client-1.21.4b2/test-requirements-pydantic-v1.txt +28 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test-requirements.txt +1 -1
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/utf_queue_models/models/python/generated_models.py +0 -3
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/utf_queue_models/models/python/generated_models_pydantic_v1.py +1 -21
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/utf_queue_models/models/python/generated_models_pydantic_v2.py +1 -21
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/utf_queue_models/schema/queue_message.json +51 -223
- utf_queue_client-1.21.4b2/utf_queue_client/scripts/package_release_metadata_cli.py +377 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/PKG-INFO +2 -1
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/SOURCES.txt +18 -16
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/entry_points.txt +2 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/requires.txt +1 -0
- utf_queue_client-1.21.4b1/test-requirements-pydantic-v1.txt +0 -14
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.gitignore +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.idea/.gitignore +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.idea/modules.xml +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.idea/utf_queue_client_python.iml +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.idea/vcs.xml +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.pre-commit-config.yaml +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/README.md +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/examples/example_async_consumer.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/setup.cfg +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/sonar-project.properties +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/.gitattributes +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/Dockerfile.script_test +0 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_amqp_connections.py +0 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_async_consumer.py +0 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_connection_retry.py +0 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_data_lake_data_producer.py +0 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_http_producer.py +0 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_opentelemetry_data_producer.py +0 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_rail_data_producer_tests.py +0 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_sqa_test_result_producer.py +0 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_xray_data_producer.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/conftest.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/pytest.ini +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/script_test.groovy +0 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_ca_cert.py +0 -0
- {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_ubai_search.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/silabs-intermediate.pem +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/silabs-root.pem +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/stopwatch.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/test.hex +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/test_models.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/test_utils.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/build_dist.bat +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/setup_venv.bat +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/silabs-net.pem +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/silabs.pem +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/update_schema.bat +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/upload_to_nexus.bat +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/upload_to_pypi.bat +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/upload_to_testpypi.bat +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tox.ini +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/__init__.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/__init__.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/async_consumer.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/base_producer.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/data_lake_data_producer.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/http_producer.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/opentelemetry_data_producer.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/sqa_test_result_producer.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/test_rail_data_producer.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/ubai_artifact_upload_request_producer.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/xray_data_producer.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/exceptions/__init__.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/__init__.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/base_model.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/model_factory.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/__init__.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/utf_queue_models/models/python/__init__.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/__init__.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/publish_release_info_cli.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/publish_test_results_cli.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/ubai_copy_cli.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/ubai_search_cli.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/ubai_update_retention_cli.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/ubai_upload_cli.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/utils/__init__.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/utils/queue_metrics_exporter.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/utils/queue_span_exporter.py +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/dependency_links.txt +0 -0
- {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: utf-queue-client
|
|
3
|
-
Version: 1.21.
|
|
3
|
+
Version: 1.21.4b2
|
|
4
4
|
Summary: No description provided
|
|
5
5
|
Author-email: Joe Savage <joe.savage@silabs.com>
|
|
6
6
|
Keywords: UTF
|
|
@@ -14,6 +14,7 @@ Requires-Dist: typing_extensions; python_version < "3.8"
|
|
|
14
14
|
Requires-Dist: click
|
|
15
15
|
Requires-Dist: certifi>=2020.4
|
|
16
16
|
Requires-Dist: ubai-client>=1.2.0
|
|
17
|
+
Requires-Dist: package-release-metadata-client
|
|
17
18
|
Requires-Dist: opentelemetry-distro[otlp]
|
|
18
19
|
Requires-Dist: otel-extensions>=0.1.2
|
|
19
20
|
Requires-Dist: retry>=0.9.2
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "utf-queue-client"
|
|
7
|
-
version = "1.21.
|
|
7
|
+
version = "1.21.4b2"
|
|
8
8
|
description = "No description provided"
|
|
9
9
|
authors = [
|
|
10
10
|
{ name = "Joe Savage", email = "joe.savage@silabs.com" }
|
|
@@ -20,6 +20,7 @@ dependencies = [
|
|
|
20
20
|
"click",
|
|
21
21
|
"certifi >= 2020.4",
|
|
22
22
|
"ubai-client >= 1.2.0",
|
|
23
|
+
"package-release-metadata-client",
|
|
23
24
|
"opentelemetry-distro[otlp]",
|
|
24
25
|
"otel-extensions >= 0.1.2",
|
|
25
26
|
"retry>=0.9.2",
|
|
@@ -36,6 +37,8 @@ publish_test_results_cli = "utf_queue_client.scripts.publish_test_results_cli:cl
|
|
|
36
37
|
ubai_update_retention_cli = "utf_queue_client.scripts.ubai_update_retention_cli:cli_entrypoint"
|
|
37
38
|
publish_release_info_cli = "utf_queue_client.scripts.publish_release_info_cli:cli_entrypoint"
|
|
38
39
|
ubai_copy_cli = "utf_queue_client.scripts.ubai_copy_cli:cli_entrypoint"
|
|
40
|
+
pkgrelease_quality_status_update = "utf_queue_client.scripts.package_release_metadata_cli:update_cli_entrypoint"
|
|
41
|
+
pkgrelease_quality_status_enquiry = "utf_queue_client.scripts.package_release_metadata_cli:enquiry_cli_entrypoint"
|
|
39
42
|
|
|
40
43
|
[tool.setuptools.packages.find]
|
|
41
44
|
include = ["utf_queue_client"]
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
--extra-index-url https://artifactory-bos.silabs.net/artifactory/api/pypi/infrasw-python-local/simple
|
|
1
2
|
pika>=1.2.0
|
|
2
3
|
jsonschema>=3.2.0
|
|
3
4
|
msgpack>=1.0.2
|
|
@@ -8,6 +9,7 @@ typing_extensions; python_version < '3.8'
|
|
|
8
9
|
click
|
|
9
10
|
certifi>=2020.4
|
|
10
11
|
ubai-client>=1.2.0
|
|
12
|
+
package-release-metadata-client==0.1.0
|
|
11
13
|
opentelemetry-distro[otlp]
|
|
12
14
|
otel-extensions>=0.2.4
|
|
13
15
|
retry>=0.9.2
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
from unittest.mock import MagicMock, patch
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from click.testing import CliRunner
|
|
5
|
+
|
|
6
|
+
pytest.importorskip("package_release_metadata_client")
|
|
7
|
+
|
|
8
|
+
from utf_queue_client.scripts.package_release_metadata_cli import ( # noqa: E402
|
|
9
|
+
DEV_URL,
|
|
10
|
+
PROD_URL,
|
|
11
|
+
enquiry_cli_entrypoint,
|
|
12
|
+
update_cli_entrypoint,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
runner = CliRunner()
|
|
16
|
+
|
|
17
|
+
# ---------------------------------------------------------------------------
|
|
18
|
+
# Shared fixtures / helpers
|
|
19
|
+
# ---------------------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
REQUIRED_UPDATE_ARGS = [
|
|
22
|
+
"--release-name",
|
|
23
|
+
"2.4.1",
|
|
24
|
+
"--build-number",
|
|
25
|
+
"42",
|
|
26
|
+
"--job-url",
|
|
27
|
+
"https://ci/build/1",
|
|
28
|
+
"--stack-name",
|
|
29
|
+
"zigbee",
|
|
30
|
+
"--test-result-type",
|
|
31
|
+
"sanity",
|
|
32
|
+
"--status",
|
|
33
|
+
"pass",
|
|
34
|
+
"--run-num",
|
|
35
|
+
"1",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _mock_api(create_return=None, latest_return=None, list_return=None):
|
|
40
|
+
"""Build a MagicMock PkgReleaseMetadataApi with pre-configured return values."""
|
|
41
|
+
api = MagicMock()
|
|
42
|
+
qs = api.quality_status_api
|
|
43
|
+
if create_return is not None:
|
|
44
|
+
qs.create_quality_status_api_v1_quality_status_post.return_value = create_return
|
|
45
|
+
if latest_return is not None:
|
|
46
|
+
qs.get_latest_quality_status_api_v1_quality_status_latest_get.return_value = (
|
|
47
|
+
latest_return
|
|
48
|
+
)
|
|
49
|
+
if list_return is not None:
|
|
50
|
+
qs.list_quality_status_api_v1_quality_status_get.return_value = list_return
|
|
51
|
+
return api
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# ---------------------------------------------------------------------------
|
|
55
|
+
# pkgrelease_quality_status_update — argument validation
|
|
56
|
+
# ---------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_update_help_exits_cleanly():
|
|
60
|
+
result = runner.invoke(update_cli_entrypoint, ["--help"])
|
|
61
|
+
assert result.exit_code == 0
|
|
62
|
+
assert "QualityStatusRead" in result.output
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_update_missing_required_args_fails():
|
|
66
|
+
result = runner.invoke(update_cli_entrypoint, ["--release-name", "2.4.1"])
|
|
67
|
+
assert result.exit_code != 0
|
|
68
|
+
assert "Missing option" in result.output
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def test_update_invalid_status_rejected():
|
|
72
|
+
args = REQUIRED_UPDATE_ARGS[:]
|
|
73
|
+
args[args.index("pass")] = "passed" # not in choices
|
|
74
|
+
result = runner.invoke(update_cli_entrypoint, args)
|
|
75
|
+
assert result.exit_code != 0
|
|
76
|
+
assert "'passed' is not" in result.output
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@pytest.mark.parametrize("status", ["pass", "fail", "aborted"])
|
|
80
|
+
def test_update_all_valid_statuses_accepted(status):
|
|
81
|
+
args = REQUIRED_UPDATE_ARGS[:]
|
|
82
|
+
args[args.index("pass")] = status
|
|
83
|
+
mock_result = MagicMock(id=1, to_dict=lambda: {"id": 1})
|
|
84
|
+
with patch(
|
|
85
|
+
"utf_queue_client.scripts.package_release_metadata_cli._make_api"
|
|
86
|
+
) as mock_make:
|
|
87
|
+
mock_make.return_value = _mock_api(create_return=mock_result)
|
|
88
|
+
result = runner.invoke(update_cli_entrypoint, args + ["--retries", "1"])
|
|
89
|
+
assert result.exit_code == 0
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# ---------------------------------------------------------------------------
|
|
93
|
+
# pkgrelease_quality_status_update — API routing and URL selection
|
|
94
|
+
# ---------------------------------------------------------------------------
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
|
|
98
|
+
def test_update_targets_prod_by_default(mock_make):
|
|
99
|
+
mock_result = MagicMock(id=1, to_dict=lambda: {"id": 1})
|
|
100
|
+
mock_make.return_value = _mock_api(create_return=mock_result)
|
|
101
|
+
runner.invoke(update_cli_entrypoint, REQUIRED_UPDATE_ARGS + ["--retries", "1"])
|
|
102
|
+
mock_make.assert_called_once_with(False)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
|
|
106
|
+
def test_update_dev_flag_targets_dev(mock_make):
|
|
107
|
+
mock_result = MagicMock(id=1, to_dict=lambda: {"id": 1})
|
|
108
|
+
mock_make.return_value = _mock_api(create_return=mock_result)
|
|
109
|
+
runner.invoke(
|
|
110
|
+
update_cli_entrypoint, REQUIRED_UPDATE_ARGS + ["--dev", "--retries", "1"]
|
|
111
|
+
)
|
|
112
|
+
mock_make.assert_called_once_with(True)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
|
|
116
|
+
def test_update_calls_create_api(mock_make):
|
|
117
|
+
mock_result = MagicMock(id=99, to_dict=lambda: {"id": 99})
|
|
118
|
+
api = _mock_api(create_return=mock_result)
|
|
119
|
+
mock_make.return_value = api
|
|
120
|
+
result = runner.invoke(
|
|
121
|
+
update_cli_entrypoint, REQUIRED_UPDATE_ARGS + ["--retries", "1"]
|
|
122
|
+
)
|
|
123
|
+
assert result.exit_code == 0
|
|
124
|
+
api.quality_status_api.create_quality_status_api_v1_quality_status_post.assert_called_once()
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
|
|
128
|
+
def test_update_optional_fields_forwarded(mock_make):
|
|
129
|
+
mock_result = MagicMock(id=1, to_dict=lambda: {"id": 1})
|
|
130
|
+
api = _mock_api(create_return=mock_result)
|
|
131
|
+
mock_make.return_value = api
|
|
132
|
+
result = runner.invoke(
|
|
133
|
+
update_cli_entrypoint,
|
|
134
|
+
REQUIRED_UPDATE_ARGS
|
|
135
|
+
+ [
|
|
136
|
+
"--pass-cnt",
|
|
137
|
+
"80",
|
|
138
|
+
"--fail-cnt",
|
|
139
|
+
"20",
|
|
140
|
+
"--total-cnt",
|
|
141
|
+
"100",
|
|
142
|
+
"--pass-pct",
|
|
143
|
+
"80.0",
|
|
144
|
+
"--sub-stack",
|
|
145
|
+
"core",
|
|
146
|
+
"--retries",
|
|
147
|
+
"1",
|
|
148
|
+
],
|
|
149
|
+
)
|
|
150
|
+
assert result.exit_code == 0
|
|
151
|
+
call_kwargs = api.quality_status_api.create_quality_status_api_v1_quality_status_post.call_args[
|
|
152
|
+
0
|
|
153
|
+
][0]
|
|
154
|
+
assert call_kwargs.pass_cnt == 80
|
|
155
|
+
assert call_kwargs.fail_cnt == 20
|
|
156
|
+
assert call_kwargs.sub_stack == "core"
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
|
|
160
|
+
def test_update_output_is_json(mock_make):
|
|
161
|
+
mock_result = MagicMock(id=7, to_dict=lambda: {"id": 7, "status": "pass"})
|
|
162
|
+
mock_make.return_value = _mock_api(create_return=mock_result)
|
|
163
|
+
result = runner.invoke(
|
|
164
|
+
update_cli_entrypoint, REQUIRED_UPDATE_ARGS + ["--retries", "1"]
|
|
165
|
+
)
|
|
166
|
+
assert result.exit_code == 0
|
|
167
|
+
import json
|
|
168
|
+
|
|
169
|
+
parsed = json.loads(result.output)
|
|
170
|
+
assert parsed["id"] == 7
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
# ---------------------------------------------------------------------------
|
|
174
|
+
# pkgrelease_quality_status_enquiry — argument validation
|
|
175
|
+
# ---------------------------------------------------------------------------
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def test_enquiry_help_exits_cleanly():
|
|
179
|
+
result = runner.invoke(enquiry_cli_entrypoint, ["--help"])
|
|
180
|
+
assert result.exit_code == 0
|
|
181
|
+
assert "LatestQualityStatusResponse" in result.output
|
|
182
|
+
assert "List[QualityStatusRead]" in result.output
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def test_enquiry_missing_release_name_fails():
|
|
186
|
+
result = runner.invoke(enquiry_cli_entrypoint, [])
|
|
187
|
+
assert result.exit_code != 0
|
|
188
|
+
assert "Missing option" in result.output
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
# ---------------------------------------------------------------------------
|
|
192
|
+
# pkgrelease_quality_status_enquiry — API routing
|
|
193
|
+
# ---------------------------------------------------------------------------
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
|
|
197
|
+
def test_enquiry_release_name_only_calls_latest(mock_make):
|
|
198
|
+
mock_latest = MagicMock(
|
|
199
|
+
to_dict=lambda: {"release_name": "2.4.1", "build_number": 42, "stacks": []}
|
|
200
|
+
)
|
|
201
|
+
mock_make.return_value = _mock_api(latest_return=mock_latest)
|
|
202
|
+
result = runner.invoke(
|
|
203
|
+
enquiry_cli_entrypoint, ["--release-name", "2.4.1", "--retries", "1"]
|
|
204
|
+
)
|
|
205
|
+
assert result.exit_code == 0
|
|
206
|
+
mock_make.return_value.quality_status_api.get_latest_quality_status_api_v1_quality_status_latest_get.assert_called_once_with(
|
|
207
|
+
release_name="2.4.1", build_number=None
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
|
|
212
|
+
def test_enquiry_with_build_num_calls_latest(mock_make):
|
|
213
|
+
mock_latest = MagicMock(to_dict=lambda: {})
|
|
214
|
+
mock_make.return_value = _mock_api(latest_return=mock_latest)
|
|
215
|
+
result = runner.invoke(
|
|
216
|
+
enquiry_cli_entrypoint,
|
|
217
|
+
["--release-name", "2.4.1", "--build-num", "42", "--retries", "1"],
|
|
218
|
+
)
|
|
219
|
+
assert result.exit_code == 0
|
|
220
|
+
mock_make.return_value.quality_status_api.get_latest_quality_status_api_v1_quality_status_latest_get.assert_called_once_with(
|
|
221
|
+
release_name="2.4.1", build_number=42
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
|
|
226
|
+
def test_enquiry_with_stack_name_calls_list(mock_make):
|
|
227
|
+
mock_make.return_value = _mock_api(list_return=[])
|
|
228
|
+
result = runner.invoke(
|
|
229
|
+
enquiry_cli_entrypoint,
|
|
230
|
+
["--release-name", "2.4.1", "--stack-name", "zigbee", "--retries", "1"],
|
|
231
|
+
)
|
|
232
|
+
assert result.exit_code == 0
|
|
233
|
+
mock_make.return_value.quality_status_api.list_quality_status_api_v1_quality_status_get.assert_called_once_with(
|
|
234
|
+
release_name="2.4.1",
|
|
235
|
+
build_number=None,
|
|
236
|
+
stack_name="zigbee",
|
|
237
|
+
test_result_type=None,
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
|
|
242
|
+
def test_enquiry_with_test_result_type_calls_list(mock_make):
|
|
243
|
+
mock_make.return_value = _mock_api(list_return=[])
|
|
244
|
+
result = runner.invoke(
|
|
245
|
+
enquiry_cli_entrypoint,
|
|
246
|
+
["--release-name", "2.4.1", "--test-result-type", "sanity", "--retries", "1"],
|
|
247
|
+
)
|
|
248
|
+
assert result.exit_code == 0
|
|
249
|
+
mock_make.return_value.quality_status_api.list_quality_status_api_v1_quality_status_get.assert_called_once_with(
|
|
250
|
+
release_name="2.4.1",
|
|
251
|
+
build_number=None,
|
|
252
|
+
stack_name=None,
|
|
253
|
+
test_result_type="sanity",
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
|
|
258
|
+
def test_enquiry_targets_prod_by_default(mock_make):
|
|
259
|
+
mock_latest = MagicMock(to_dict=lambda: {})
|
|
260
|
+
mock_make.return_value = _mock_api(latest_return=mock_latest)
|
|
261
|
+
runner.invoke(enquiry_cli_entrypoint, ["--release-name", "2.4.1", "--retries", "1"])
|
|
262
|
+
mock_make.assert_called_once_with(False)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
|
|
266
|
+
def test_enquiry_dev_flag_targets_dev(mock_make):
|
|
267
|
+
mock_latest = MagicMock(to_dict=lambda: {})
|
|
268
|
+
mock_make.return_value = _mock_api(latest_return=mock_latest)
|
|
269
|
+
runner.invoke(
|
|
270
|
+
enquiry_cli_entrypoint, ["--release-name", "2.4.1", "--dev", "--retries", "1"]
|
|
271
|
+
)
|
|
272
|
+
mock_make.assert_called_once_with(True)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
# ---------------------------------------------------------------------------
|
|
276
|
+
# _make_api — URL resolution
|
|
277
|
+
# ---------------------------------------------------------------------------
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli.PkgReleaseMetadataApi")
|
|
281
|
+
def test_make_api_uses_prod_url_by_default(mock_cls):
|
|
282
|
+
from utf_queue_client.scripts.package_release_metadata_cli import _make_api
|
|
283
|
+
|
|
284
|
+
_make_api(dev=False)
|
|
285
|
+
mock_cls.assert_called_once_with(server_url=PROD_URL)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
@patch("utf_queue_client.scripts.package_release_metadata_cli.PkgReleaseMetadataApi")
|
|
289
|
+
def test_make_api_uses_dev_url_when_dev_true(mock_cls):
|
|
290
|
+
from utf_queue_client.scripts.package_release_metadata_cli import _make_api
|
|
291
|
+
|
|
292
|
+
_make_api(dev=True)
|
|
293
|
+
mock_cls.assert_called_once_with(server_url=DEV_URL)
|
|
@@ -41,7 +41,9 @@ def test_publish_release_info(request, publish_release_info):
|
|
|
41
41
|
for k, v in publish_release_info:
|
|
42
42
|
args += ["--data", k, v]
|
|
43
43
|
|
|
44
|
-
base_dir = os.path.dirname(
|
|
44
|
+
base_dir = os.path.dirname(
|
|
45
|
+
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
46
|
+
)
|
|
45
47
|
|
|
46
48
|
@inject_context_to_env
|
|
47
49
|
def call_cli_script():
|
|
@@ -118,7 +118,9 @@ def test_jobstatus_session_data(request, session_start_data, session_stop_data):
|
|
|
118
118
|
for k, v in session_stop_data:
|
|
119
119
|
stop_args += ["--data", k, v]
|
|
120
120
|
|
|
121
|
-
base_dir = os.path.dirname(
|
|
121
|
+
base_dir = os.path.dirname(
|
|
122
|
+
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
123
|
+
)
|
|
122
124
|
|
|
123
125
|
@inject_context_to_env
|
|
124
126
|
def call_cli_script():
|
|
@@ -177,7 +179,9 @@ def test_app_build_results_data(request, app_build_results_data):
|
|
|
177
179
|
for k, v in app_build_results_data:
|
|
178
180
|
args += ["--data", k, v]
|
|
179
181
|
|
|
180
|
-
base_dir = os.path.dirname(
|
|
182
|
+
base_dir = os.path.dirname(
|
|
183
|
+
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
184
|
+
)
|
|
181
185
|
|
|
182
186
|
@inject_context_to_env
|
|
183
187
|
def call_cli_script():
|
|
@@ -101,7 +101,9 @@ def test_ubai_copy_cli(
|
|
|
101
101
|
def test_ubai_copy_cli_script(
|
|
102
102
|
artifact_id, copy_name, copy_extension, copy_metadata, set_environment_variables
|
|
103
103
|
):
|
|
104
|
-
base_dir = os.path.dirname(
|
|
104
|
+
base_dir = os.path.dirname(
|
|
105
|
+
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
106
|
+
)
|
|
105
107
|
|
|
106
108
|
args = [
|
|
107
109
|
"--artifact_id",
|
|
@@ -47,7 +47,7 @@ def test_ubai_search_cli_script(set_environment_variable):
|
|
|
47
47
|
[
|
|
48
48
|
sys.executable,
|
|
49
49
|
str(
|
|
50
|
-
pathlib.Path(__file__).parent.parent
|
|
50
|
+
pathlib.Path(__file__).resolve().parent.parent.parent
|
|
51
51
|
/ os.path.join(
|
|
52
52
|
"utf_queue_client", "scripts", "ubai_update_retention_cli.py"
|
|
53
53
|
)
|
{utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_ubai_upload.py
RENAMED
|
@@ -30,7 +30,9 @@ def metadata():
|
|
|
30
30
|
)
|
|
31
31
|
@pytest.mark.parametrize("use_queue", [True, False])
|
|
32
32
|
def test_ubai_upload_cli(request, metadata, set_environment_variable, use_queue):
|
|
33
|
-
file = os.path.join(
|
|
33
|
+
file = os.path.join(
|
|
34
|
+
os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "test.hex"
|
|
35
|
+
)
|
|
34
36
|
|
|
35
37
|
username = os.environ["UTF_QUEUE_USERNAME"]
|
|
36
38
|
password = os.environ["UTF_QUEUE_PASSWORD"]
|
|
@@ -103,8 +105,12 @@ def test_ubai_upload_cli_large_file(
|
|
|
103
105
|
def test_ubai_upload_cli_script(
|
|
104
106
|
request, metadata, use_queue, set_environment_variables
|
|
105
107
|
):
|
|
106
|
-
file = os.path.join(
|
|
107
|
-
|
|
108
|
+
file = os.path.join(
|
|
109
|
+
os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "test.hex"
|
|
110
|
+
)
|
|
111
|
+
base_dir = os.path.dirname(
|
|
112
|
+
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
113
|
+
)
|
|
108
114
|
|
|
109
115
|
client_id = request.node.name
|
|
110
116
|
args = ["--file-path", file, "--client-id", client_id]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
--extra-index-url https://artifactory-bos.silabs.net/artifactory/api/pypi/infrasw-python-local/simple
|
|
2
|
+
pika>=1.2.0
|
|
3
|
+
jsonschema>=3.2.0
|
|
4
|
+
msgpack>=1.0.2
|
|
5
|
+
datamodel-code-generator
|
|
6
|
+
regex
|
|
7
|
+
typing_extensions; python_version < '3.8'
|
|
8
|
+
click
|
|
9
|
+
certifi>=2020.4
|
|
10
|
+
ubai-client>=1.2.0
|
|
11
|
+
opentelemetry-distro[otlp]
|
|
12
|
+
otel-extensions>=0.2.4
|
|
13
|
+
retry>=0.9.2
|
|
14
|
+
requests
|
|
15
|
+
ndjson~=0.3
|
|
16
|
+
urllib3>=1.25.3,<2.6.0
|
|
17
|
+
pytest
|
|
18
|
+
black
|
|
19
|
+
wheel
|
|
20
|
+
twine
|
|
21
|
+
pytest-cov
|
|
22
|
+
opentelemetry-distro[otlp]==0.35b0
|
|
23
|
+
opentelemetry-instrumentation-urllib3==0.35b0
|
|
24
|
+
otel-extensions-pytest>=0.1.2
|
|
25
|
+
pytest-mock
|
|
26
|
+
pytest-xdist
|
|
27
|
+
pydantic==1.*
|
|
28
|
+
pre-commit
|
|
@@ -14,7 +14,6 @@ if IS_PYDANTIC_V1:
|
|
|
14
14
|
from .generated_models_pydantic_v1 import SqaAppBuildResult
|
|
15
15
|
from .generated_models_pydantic_v1 import SqaTestResult
|
|
16
16
|
from .generated_models_pydantic_v1 import SqaTestSession
|
|
17
|
-
from .generated_models_pydantic_v1 import SqaQualityStatus
|
|
18
17
|
from .generated_models_pydantic_v1 import LogEvent
|
|
19
18
|
from .generated_models_pydantic_v1 import ExceptionEvent
|
|
20
19
|
from .generated_models_pydantic_v1 import TestRailResult
|
|
@@ -40,7 +39,6 @@ else:
|
|
|
40
39
|
from .generated_models_pydantic_v2 import SqaAppBuildResult
|
|
41
40
|
from .generated_models_pydantic_v2 import SqaTestResult
|
|
42
41
|
from .generated_models_pydantic_v2 import SqaTestSession
|
|
43
|
-
from .generated_models_pydantic_v2 import SqaQualityStatus
|
|
44
42
|
from .generated_models_pydantic_v2 import LogEvent
|
|
45
43
|
from .generated_models_pydantic_v2 import ExceptionEvent
|
|
46
44
|
from .generated_models_pydantic_v2 import TestRailResult
|
|
@@ -67,7 +65,6 @@ __all__ = [
|
|
|
67
65
|
"SqaAppBuildResult",
|
|
68
66
|
"SqaTestResult",
|
|
69
67
|
"SqaTestSession",
|
|
70
|
-
"SqaQualityStatus",
|
|
71
68
|
"LogEvent",
|
|
72
69
|
"ExceptionEvent",
|
|
73
70
|
"TestRailResult",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: queue_message.json
|
|
3
|
-
# timestamp:
|
|
3
|
+
# timestamp: 2025-11-20T23:53:05+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -222,23 +222,6 @@ class SqaTestSession(BaseModel):
|
|
|
222
222
|
)
|
|
223
223
|
|
|
224
224
|
|
|
225
|
-
class SqaQualityStatus(BaseModel):
|
|
226
|
-
stackName: constr(max_length=256)
|
|
227
|
-
releaseName: constr(max_length=256)
|
|
228
|
-
buildNumber: float
|
|
229
|
-
testResultType: constr(max_length=256)
|
|
230
|
-
total: Optional[float] = None
|
|
231
|
-
passCnt: Optional[float] = None
|
|
232
|
-
failCnt: Optional[float] = None
|
|
233
|
-
skipCnt: Optional[float] = None
|
|
234
|
-
blockCnt: Optional[float] = None
|
|
235
|
-
jobUrl: constr(max_length=256)
|
|
236
|
-
runNum: float
|
|
237
|
-
jobStatus: constr(max_length=256)
|
|
238
|
-
subStackName: Optional[constr(max_length=256)] = None
|
|
239
|
-
startTime: Optional[str] = Field(None, description="ISO-8601 datetime")
|
|
240
|
-
|
|
241
|
-
|
|
242
225
|
class LogEvent(BaseModel):
|
|
243
226
|
pass
|
|
244
227
|
|
|
@@ -341,7 +324,6 @@ class QueueMessage(BaseModel):
|
|
|
341
324
|
"EXCEPTION_EVENT",
|
|
342
325
|
"LOG_EVENT",
|
|
343
326
|
"OPENTELEMETRY_DATA",
|
|
344
|
-
"SQA_TEST_EVENT",
|
|
345
327
|
"TEST_RAIL_EVENT",
|
|
346
328
|
"UTF_TEST_EVENT",
|
|
347
329
|
"XRAY_EVENT",
|
|
@@ -352,8 +334,6 @@ class QueueMessage(BaseModel):
|
|
|
352
334
|
"IMPORT_TEST_EXECUTION",
|
|
353
335
|
"SESSION_START",
|
|
354
336
|
"SESSION_STOP",
|
|
355
|
-
"SQA_TEST_RUN_START",
|
|
356
|
-
"SQA_TEST_RUN_STOP",
|
|
357
337
|
"TEST_RESULT",
|
|
358
338
|
"TEST_RESULT_APP",
|
|
359
339
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: queue_message.json
|
|
3
|
-
# timestamp:
|
|
3
|
+
# timestamp: 2025-11-20T23:53:07+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -220,23 +220,6 @@ class SqaTestSession(BaseModel):
|
|
|
220
220
|
)
|
|
221
221
|
|
|
222
222
|
|
|
223
|
-
class SqaQualityStatus(BaseModel):
|
|
224
|
-
stackName: constr(max_length=256)
|
|
225
|
-
releaseName: constr(max_length=256)
|
|
226
|
-
buildNumber: float
|
|
227
|
-
testResultType: constr(max_length=256)
|
|
228
|
-
total: Optional[float] = None
|
|
229
|
-
passCnt: Optional[float] = None
|
|
230
|
-
failCnt: Optional[float] = None
|
|
231
|
-
skipCnt: Optional[float] = None
|
|
232
|
-
blockCnt: Optional[float] = None
|
|
233
|
-
jobUrl: constr(max_length=256)
|
|
234
|
-
runNum: float
|
|
235
|
-
jobStatus: constr(max_length=256)
|
|
236
|
-
subStackName: Optional[constr(max_length=256)] = None
|
|
237
|
-
startTime: Optional[str] = Field(None, description="ISO-8601 datetime")
|
|
238
|
-
|
|
239
|
-
|
|
240
223
|
class LogEvent(BaseModel):
|
|
241
224
|
pass
|
|
242
225
|
|
|
@@ -345,7 +328,6 @@ class QueueMessage(BaseModel):
|
|
|
345
328
|
"EXCEPTION_EVENT",
|
|
346
329
|
"LOG_EVENT",
|
|
347
330
|
"OPENTELEMETRY_DATA",
|
|
348
|
-
"SQA_TEST_EVENT",
|
|
349
331
|
"TEST_RAIL_EVENT",
|
|
350
332
|
"UTF_TEST_EVENT",
|
|
351
333
|
"XRAY_EVENT",
|
|
@@ -356,8 +338,6 @@ class QueueMessage(BaseModel):
|
|
|
356
338
|
"IMPORT_TEST_EXECUTION",
|
|
357
339
|
"SESSION_START",
|
|
358
340
|
"SESSION_STOP",
|
|
359
|
-
"SQA_TEST_RUN_START",
|
|
360
|
-
"SQA_TEST_RUN_STOP",
|
|
361
341
|
"TEST_RESULT",
|
|
362
342
|
"TEST_RESULT_APP",
|
|
363
343
|
]
|