utf-queue-client 1.17.0__tar.gz → 1.17.1__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.
Files changed (53) hide show
  1. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/PKG-INFO +1 -1
  2. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/setup.py +1 -1
  3. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_amqp_connections.py +1 -1
  4. utf-queue-client-1.17.1/test/test_publish_release_info.py +145 -0
  5. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/scripts/publish_release_info_cli.py +40 -21
  6. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client.egg-info/PKG-INFO +1 -1
  7. utf-queue-client-1.17.0/test/test_publish_release_info.py +0 -72
  8. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/README.md +0 -0
  9. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/setup.cfg +0 -0
  10. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_async_consumer.py +0 -0
  11. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_connection_retry.py +0 -0
  12. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_data_lake_data_producer.py +0 -0
  13. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_http_producer.py +0 -0
  14. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_legacy_base_model.py +0 -0
  15. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_models.py +0 -0
  16. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_opentelemetry_data_producer.py +0 -0
  17. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_publish_test_results.py +0 -0
  18. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_rail_data_producer_tests.py +0 -0
  19. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_sqa_test_result_producer.py +0 -0
  20. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_ubai_copy.py +0 -0
  21. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_ubai_search.py +0 -0
  22. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_ubai_update_retention.py +0 -0
  23. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_ubai_upload.py +0 -0
  24. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/test/test_utils.py +0 -0
  25. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/__init__.py +0 -0
  26. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/clients/__init__.py +0 -0
  27. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/clients/async_consumer.py +0 -0
  28. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/clients/base_producer.py +0 -0
  29. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/clients/data_lake_data_producer.py +0 -0
  30. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/clients/http_producer.py +0 -0
  31. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/clients/opentelemetry_data_producer.py +0 -0
  32. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/clients/sqa_test_result_producer.py +0 -0
  33. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/clients/test_rail_data_producer.py +0 -0
  34. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/clients/ubai_artifact_upload_request_producer.py +0 -0
  35. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/exceptions/__init__.py +0 -0
  36. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/models/__init__.py +0 -0
  37. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/models/base_model.py +0 -0
  38. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/models/model_factory.py +0 -0
  39. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/models/schemas/__init__.py +0 -0
  40. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/scripts/__init__.py +0 -0
  41. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/scripts/publish_test_results_cli.py +0 -0
  42. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/scripts/ubai_copy_cli.py +0 -0
  43. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/scripts/ubai_search_cli.py +0 -0
  44. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/scripts/ubai_update_retention_cli.py +0 -0
  45. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/scripts/ubai_upload_cli.py +0 -0
  46. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/utils/__init__.py +0 -0
  47. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/utils/queue_metrics_exporter.py +0 -0
  48. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client/utils/queue_span_exporter.py +0 -0
  49. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client.egg-info/SOURCES.txt +0 -0
  50. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client.egg-info/dependency_links.txt +0 -0
  51. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client.egg-info/entry_points.txt +0 -0
  52. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client.egg-info/requires.txt +0 -0
  53. {utf-queue-client-1.17.0 → utf-queue-client-1.17.1}/utf_queue_client.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: utf-queue-client
3
- Version: 1.17.0
3
+ Version: 1.17.1
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  Author: Joe Savage
@@ -6,7 +6,7 @@
6
6
  from setuptools import setup, find_packages # noqa: H301
7
7
 
8
8
  NAME = "utf-queue-client"
9
- VERSION = "1.17.0"
9
+ VERSION = "1.17.1"
10
10
  # To install the library, run the following
11
11
  #
12
12
  # python setup.py install
@@ -25,7 +25,7 @@ def queue_server(request):
25
25
  ],
26
26
  )
27
27
  def test_producer(queue_server, username, password):
28
- suffix = ".dev.silabs.net"
28
+ suffix = ".silabs.net"
29
29
  queue_server = f"{queue_server}{suffix}"
30
30
  l = logging.getLogger("test_producer")
31
31
  l.info("Creating producer...")
@@ -0,0 +1,145 @@
1
+ import pytest
2
+ from otel_extensions import inject_context_to_env, instrumented
3
+ import os
4
+ import subprocess
5
+ import sys
6
+ from utf_queue_client.scripts.publish_release_info_cli import publish_release_information, \
7
+ update_artifacts_retention_days_to_keep_forever, cli
8
+ import requests
9
+ from unittest import mock
10
+ from unittest.mock import MagicMock, patch
11
+
12
+
13
+ @pytest.fixture
14
+ def publish_release_info():
15
+ yield [
16
+ ("releaseDate", "2023-06-16"),
17
+ ("branchName", "release/gecko_sdk_3.2"),
18
+ ("releaseType", "GA"),
19
+ ("releaseName", "23Q2-GA"),
20
+ ("SDKBuildNum", "407"),
21
+ ("installerURLSDK", "https://jenkins-cbs-gecko-sdk.silabs.net/job/Gecko_SDK_Suite_super/job/release%252F21q4/284/"),
22
+ ("IARVersionNum", "9.20.4"),
23
+ ("GCCVersionNum", "10.3.1"),
24
+ ("CommanderVersionNum", "v1.8.1"),
25
+ ("SEVersionNum", "1.2.4"),
26
+ ("WSTKFirmwareVersionNum", "v1.4.4")
27
+ ]
28
+
29
+
30
+ @instrumented
31
+ def test_publish_release_info(request, publish_release_info):
32
+ args = ["--username", "svc_sqabot", "--password", "password"]
33
+ for k, v in publish_release_info:
34
+ args += ["--data", k, v]
35
+
36
+ base_dir = os.path.dirname(os.path.dirname(__file__))
37
+ @inject_context_to_env
38
+ def call_cli_script():
39
+ assert "TRACEPARENT" in os.environ
40
+ process = subprocess.Popen(
41
+ [
42
+ sys.executable,
43
+ os.path.join(
44
+ base_dir, "utf_queue_client", "scripts", "publish_release_info_cli.py"
45
+ ),
46
+ ]
47
+ + args,
48
+ )
49
+ process.communicate()
50
+ assert process.poll() == 0
51
+
52
+ call_cli_script()
53
+
54
+
55
+ def test_publish_release_information():
56
+ requests_post = requests.post
57
+ requests.post = MagicMock()
58
+ publish_release_information("", "", {})
59
+ assert requests.post.call_count == 2
60
+ requests.post = requests_post
61
+
62
+
63
+ def test_publish_release_cli_insufficient_params():
64
+ requests_post = requests.post
65
+ requests_post_mock = MagicMock()
66
+ requests.post = requests_post_mock
67
+ cli("", "", {})
68
+ assert requests.post.call_count == 0
69
+ requests.post = requests_post
70
+
71
+
72
+ def test_publish_release_cli():
73
+ requests_post = requests.post
74
+ requests_post_mock = MagicMock()
75
+ requests.post = requests_post_mock
76
+ cli("", "", {("branchName", "test"), ("releaseData", "")})
77
+ assert requests_post_mock.call_count == 2
78
+ post_params = requests_post_mock.call_args.kwargs.get('json')
79
+ assert post_params.get("branchName") == "test"
80
+ assert post_params.get("releaseData") is None
81
+ requests.post = requests_post
82
+
83
+
84
+ def test_update_artifacts_retention_days_to_keep_forever():
85
+ requests_patch = requests.patch
86
+ requests.patch = MagicMock()
87
+ data_dict = {"branchName": "release/gec", "SDKBuildNum": "407"}
88
+ update_artifacts_retention_days_to_keep_forever(data_dict)
89
+ assert requests.patch.call_count == 1
90
+ requests.patch = requests_patch
91
+ patch_response = MagicMock()
92
+ mocked_patch =mock.patch.object(requests, "patch", return_value=patch_response)
93
+ patch_response.status_code = 200
94
+ update_artifacts_retention_days_to_keep_forever(data_dict)
95
+
96
+
97
+ @patch('requests.post')
98
+ def test_publish_release_information_success(mock_post):
99
+ mock_response_auth = MagicMock()
100
+ mock_response_auth.json.return_value = {"access_token": "test_token"}
101
+ mock_response_auth.raise_for_status.return_value = None
102
+
103
+ mock_response_release = MagicMock()
104
+ mock_response_release.status_code = 201
105
+ mock_response_release.json.return_value = {"message": "success"}
106
+
107
+ mock_post.side_effect = [mock_response_auth, mock_response_release]
108
+
109
+ result = publish_release_information("test_username", "test_password", {"test_key": "test_value"})
110
+ assert mock_response_release.json.called
111
+ assert result
112
+
113
+ @patch('requests.post')
114
+ def test_publish_release_information_release_fail(mock_post):
115
+ # Mock the responses
116
+ mock_response_auth = MagicMock()
117
+ mock_response_auth.json.return_value = {"access_token": "test_token"}
118
+ mock_response_auth.raise_for_status.return_value = None
119
+
120
+ mock_response_release = MagicMock()
121
+ mock_response_release.status_code = 400
122
+ mock_response_release.text = "Release failed"
123
+
124
+ mock_post.side_effect = [mock_response_auth, mock_response_release]
125
+
126
+ result = publish_release_information("test_username", "test_password", {"test_key": "test_value"})
127
+ assert result is None
128
+
129
+ @patch('requests.post')
130
+ def test_publish_release_information_release_fail_422(mock_post):
131
+ # Mock the responses
132
+ mock_response_auth = MagicMock()
133
+ mock_response_auth.json.return_value = {"access_token": "test_token"}
134
+ mock_response_auth.raise_for_status.return_value = None
135
+
136
+ mock_response_release = MagicMock()
137
+ mock_response_release.status_code = 422
138
+ mock_response_release.json.return_value = {"detail": [{"loc": ["", "test_field"], "msg": "test_error"}]}
139
+
140
+ mock_post.side_effect = [mock_response_auth, mock_response_release]
141
+
142
+ # Call the function
143
+ result = publish_release_information("test_username", "test_password", {"test_key": "test_value"})
144
+ assert mock_response_release.json.called
145
+ assert result is None
@@ -1,3 +1,5 @@
1
+ import json
2
+
1
3
  import click
2
4
  from utf_queue_client.scripts import setup_telemetry
3
5
  from retry import retry
@@ -36,43 +38,46 @@ def cli(username: str, password: str, data: Iterable[Tuple[str, str]]):
36
38
  with setup_telemetry():
37
39
  data_dict = {}
38
40
  for key, value in data:
39
- data_dict[key] = value
41
+ if value:
42
+ data_dict[key] = value
43
+ else:
44
+ data_dict[key] = None
45
+
46
+ if "branchName" not in data_dict.keys():
47
+ print("Please provide 'branchName' field to add it to the UBAI artifacts")
48
+ return
40
49
 
41
50
  @retry(Exception, delay=5, backoff=2, max_delay=30, tries=NUM_RETRIES + 1)
42
51
  def retry_wrapper():
43
52
  response = publish_release_information(username, password, data_dict)
44
53
  if response is not None:
45
54
  update_artifacts_retention_days_to_keep_forever(data_dict)
55
+
46
56
  retry_wrapper()
47
57
 
48
58
 
49
59
  @instrumented
50
60
  def publish_release_information(username: str, password: str, data_dict: dict):
51
- url = 'https://auth.silabs.net/api/v1/auth'
61
+ url = "https://auth.silabs.net/api/v1/auth"
52
62
 
53
63
  # Create a dictionary with the username and password
54
- credentials = {
55
- 'username': username,
56
- 'password': password
57
- }
64
+ credentials = {"username": username, "password": password}
58
65
 
59
66
  try:
60
67
  response = requests.post(url, json=credentials, verify=False)
61
68
  response.raise_for_status() # Raise an exception for 4xx/5xx status codes
62
69
 
63
70
  # Extract the JWT token from the response
64
- jwt_token = response.json()['access_token']
71
+ jwt_token = response.json()["access_token"]
65
72
 
66
73
  except requests.exceptions.RequestException as e:
67
74
  print(f"Error: {e}")
68
75
  return None
69
76
 
70
- url = 'https://releaseinfo.silabs.net/api/v1/releases'
77
+ url = "https://releaseinfo.silabs.net/api/v1/releases"
71
78
 
72
79
  # Create the Authorization header with the Bearer token
73
- headers = {
74
- 'Authorization': f'JWT {jwt_token}'
75
- }
80
+ headers = {"Authorization": f"JWT {jwt_token}"}
76
81
 
77
82
  # Send the POST request with the headers
78
83
  response = requests.post(url, json=data_dict, headers=headers, verify=False)
@@ -80,26 +85,38 @@ def publish_release_information(username: str, password: str, data_dict: dict):
80
85
  # Check the response status code
81
86
  if response.status_code == 201:
82
87
  # Request successful
83
- print('Publish release information successful!')
84
- print('Response:', response.json())
88
+ print("Publish release information successful!")
89
+ print("Response:", response.json())
85
90
  return True
86
91
  else:
87
92
  # Request failed
88
- print('Publish release information failed.')
89
- print('Status Code:', response.status_code)
93
+ result = response.text
94
+ if response.status_code == 422:
95
+ response_dict = response.json()
96
+ result = ""
97
+ for detail in response_dict["detail"]:
98
+ field_name = detail["loc"][1]
99
+ error_msg = detail["msg"]
100
+ result += f"'{field_name}': {error_msg}. "
101
+
102
+ print("")
103
+ print(
104
+ f"Publish release information failed with status code "
105
+ f"- {response.status_code} due to - {result}"
106
+ )
90
107
  return None
91
108
 
92
109
 
93
110
  @instrumented
94
111
  def update_artifacts_retention_days_to_keep_forever(data_dict: dict):
95
- url = 'https://ubai.silabs.net/api/v1/artifacts'
112
+ url = "https://ubai.silabs.net/api/v1/artifacts"
96
113
 
97
114
  artifact_search_spec = {
98
115
  "metadata": {
99
116
  "branch": data_dict["branchName"],
100
- "build_number": data_dict["SDKBuildNum"]
117
+ "build_number": data_dict["SDKBuildNum"],
101
118
  },
102
- "retentionDays": -1
119
+ "retentionDays": -1,
103
120
  }
104
121
 
105
122
  # Send the PATCH request with the headers
@@ -112,9 +129,11 @@ def update_artifacts_retention_days_to_keep_forever(data_dict: dict):
112
129
  print("Response:", response.json())
113
130
  else:
114
131
  # Request failed
115
- print('Update Retention days in UBAI for release artifact to keep forever failed.')
116
- print('Status Code:', response.status_code)
117
- print('Response:', response.json())
132
+ print(
133
+ "Update Retention days in UBAI for release artifact to keep forever failed."
134
+ )
135
+ print("Status Code:", response.status_code)
136
+ print("Response:", response.json())
118
137
  return None
119
138
 
120
139
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: utf-queue-client
3
- Version: 1.17.0
3
+ Version: 1.17.1
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  Author: Joe Savage
@@ -1,72 +0,0 @@
1
- import pytest
2
- from otel_extensions import inject_context_to_env, instrumented
3
- import os
4
- import subprocess
5
- import sys
6
- from utf_queue_client.scripts.publish_release_info_cli import publish_release_information, update_artifacts_retention_days_to_keep_forever
7
- import requests
8
- from unittest import mock
9
- from unittest.mock import MagicMock, patch
10
-
11
-
12
- @pytest.fixture
13
- def publish_release_info():
14
- yield [
15
- ("releaseDate", "2023-06-16"),
16
- ("branchName", "release/gecko_sdk_3.2"),
17
- ("releaseType", "GA"),
18
- ("releaseName", "23Q2-GA"),
19
- ("SDKBuildNum", "407"),
20
- ("installerURLSDK", "https://jenkins-cbs-gecko-sdk.silabs.net/job/Gecko_SDK_Suite_super/job/release%252F21q4/284/"),
21
- ("IARVersionNum", "9.20.4"),
22
- ("GCCVersionNum", "10.3.1"),
23
- ("CommanderVersionNum", "v1.8.1"),
24
- ("SEVersionNum", "1.2.4"),
25
- ("WSTKFirmwareVersionNum", "v1.4.4")
26
- ]
27
-
28
-
29
- @instrumented
30
- def test_publish_release_info(request, publish_release_info):
31
- args = ["--username", "svc_sqabot", "--password", "password"]
32
- for k, v in publish_release_info:
33
- args += ["--data", k, v]
34
-
35
- base_dir = os.path.dirname(os.path.dirname(__file__))
36
- @inject_context_to_env
37
- def call_cli_script():
38
- assert "TRACEPARENT" in os.environ
39
- process = subprocess.Popen(
40
- [
41
- sys.executable,
42
- os.path.join(
43
- base_dir, "utf_queue_client", "scripts", "publish_release_info_cli.py"
44
- ),
45
- ]
46
- + args,
47
- )
48
- process.communicate()
49
- assert process.poll() == 0
50
-
51
- call_cli_script()
52
-
53
-
54
- def test_publish_release_information():
55
- requests_post = requests.post
56
- requests.post = MagicMock()
57
- publish_release_information("", "", {})
58
- assert requests.post.call_count == 2
59
- requests.post = requests_post
60
-
61
-
62
- def test_update_artifacts_retention_days_to_keep_forever():
63
- requests_patch = requests.patch
64
- requests.patch = MagicMock()
65
- data_dict = {"branchName": "release/gec", "SDKBuildNum": "407"}
66
- update_artifacts_retention_days_to_keep_forever(data_dict)
67
- assert requests.patch.call_count == 1
68
- requests.patch = requests_patch
69
- patch_response = MagicMock()
70
- mocked_patch =mock.patch.object(requests, "patch", return_value=patch_response)
71
- patch_response.status_code = 200
72
- update_artifacts_retention_days_to_keep_forever(data_dict)