Skip to content

Commit da607d2

Browse files
authored
Update warning message string for k8s version compatibility check (#229)
* Update warning message string for k8s version compatibility check **Description** The warning message earlier was not formatted well enough. Made it explicitly look like a warning. **Testing Done** - Added unit test case to check if the warning will be displayed or not. - Checking the warning color to be yellow.
1 parent 84aabcf commit da607d2

File tree

2 files changed

+101
-17
lines changed

2 files changed

+101
-17
lines changed

src/sagemaker/hyperpod/common/utils.py

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -483,14 +483,12 @@ def verify_kubernetes_version_compatibility(logger) -> bool:
483483
has_min_compatibility = True
484484

485485
# Check if client version is below minimum compatibility
486-
if client_version[0] < min_major or (client_version[0] == min_major and client_version[1] < min_minor):
487-
logger.warning(
488-
f"Kubernetes version incompatibility detected! Your client version {client_version_str} "
489-
f"(package: {kubernetes_client_version}) is below the minimum compatible version {min_major}.{min_minor} "
490-
f"required by server {server_version_str}. The server explicitly requires a minimum client version."
491-
)
492-
logger.warning(
493-
f"To resolve this issue, please update your kubernetes Python client to meet the minimum requirement."
486+
if client_version[0] < min_major or (client_version[0] == min_major and client_version[1] < min_minor):
487+
click.secho(
488+
f"\nWARNING: Kubernetes client version {client_version_str} is incompatible with server {server_version_str}. "
489+
f"Server requires minimum client version {min_major}.{min_minor}. "
490+
f"\nPlease update Kubernetes Python Client: pip install --upgrade kubernetes>={min_major}.{min_minor}.0",
491+
fg="yellow"
494492
)
495493
is_compatible = False
496494
except (ValueError, TypeError, AttributeError) as e:
@@ -500,15 +498,12 @@ def verify_kubernetes_version_compatibility(logger) -> bool:
500498
if not has_min_compatibility:
501499
# Fall back to standard compatibility check if min versions not provided
502500
server_version_parsed = (int(server_version_info.major), int(server_version_info.minor))
503-
if not is_kubernetes_version_compatible(client_version, server_version_parsed):
504-
logger.warning(
505-
f"Kubernetes version incompatibility detected! Your client version {client_version_str} "
506-
f"(package: {kubernetes_client_version}) is not compatible with server version {server_version_str}. "
507-
f"According to Kubernetes support policy, client should be within 3 minor versions behind "
508-
f"and not more than 1 minor version ahead of the server."
509-
)
510-
logger.warning(
511-
f"To resolve this issue, please update your kubernetes Python client to a compatible version."
501+
if not is_kubernetes_version_compatible(client_version, server_version_parsed):
502+
click.secho(
503+
f"\nWARNING: Kubernetes client version {client_version_str} is incompatible with server {server_version_str}. "
504+
f"Client must be within 3 minor versions behind and not more than 1 ahead of server. "
505+
f"\nPlease update Kubernetes Python Client: pip install --upgrade kubernetes",
506+
fg="yellow"
512507
)
513508
is_compatible = False
514509

test/unit_tests/common/test_utils.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,95 @@ def test_is_kubernetes_version_compatible_default_versions(self):
182182
self.assertTrue(is_kubernetes_version_compatible((1, 24), (0, 0)))
183183
self.assertTrue(is_kubernetes_version_compatible((0, 0), (0, 0)))
184184

185+
@patch('click.secho')
186+
@patch('kubernetes.client.VersionApi')
187+
@patch('sagemaker.hyperpod.common.utils.kubernetes_client_version', '12.0.0')
188+
def test_verify_kubernetes_version_compatibility_incompatible_min_version(self, mock_version_api, mock_secho):
189+
"""Test verify_kubernetes_version_compatibility with incompatible minimum version"""
190+
# Mock server version info with minimum compatibility requirements
191+
mock_server_info = MagicMock()
192+
mock_server_info.major = '1'
193+
mock_server_info.minor = '28'
194+
mock_server_info.min_compatibility_major = '1'
195+
mock_server_info.min_compatibility_minor = '25'
196+
197+
mock_version_api_instance = MagicMock()
198+
mock_version_api_instance.get_code.return_value = mock_server_info
199+
mock_version_api.return_value = mock_version_api_instance
200+
201+
mock_logger = MagicMock()
202+
203+
from sagemaker.hyperpod.common.utils import verify_kubernetes_version_compatibility
204+
result = verify_kubernetes_version_compatibility(mock_logger)
205+
206+
# Should return False for incompatible versions
207+
self.assertFalse(result)
208+
209+
# Should call click.secho with yellow color for warning
210+
mock_secho.assert_called_once()
211+
call_args = mock_secho.call_args
212+
self.assertIn('WARNING:', call_args[0][0])
213+
self.assertIn('1.16 is incompatible with server 1.28', call_args[0][0])
214+
self.assertEqual(call_args[1]['fg'], 'yellow')
215+
216+
@patch('click.secho')
217+
@patch('kubernetes.client.VersionApi')
218+
@patch('sagemaker.hyperpod.common.utils.kubernetes_client_version', '12.0.0')
219+
def test_verify_kubernetes_version_compatibility_incompatible_standard_policy(self, mock_version_api, mock_secho):
220+
"""Test verify_kubernetes_version_compatibility with standard policy incompatibility"""
221+
# Mock server version info without minimum compatibility requirements
222+
mock_server_info = MagicMock()
223+
mock_server_info.major = '1'
224+
mock_server_info.minor = '28'
225+
mock_server_info.min_compatibility_major = None
226+
mock_server_info.min_compatibility_minor = None
227+
228+
mock_version_api_instance = MagicMock()
229+
mock_version_api_instance.get_code.return_value = mock_server_info
230+
mock_version_api.return_value = mock_version_api_instance
231+
232+
mock_logger = MagicMock()
233+
234+
from sagemaker.hyperpod.common.utils import verify_kubernetes_version_compatibility
235+
result = verify_kubernetes_version_compatibility(mock_logger)
236+
237+
# Should return False for incompatible versions
238+
self.assertFalse(result)
239+
240+
# Should call click.secho with yellow color for warning
241+
mock_secho.assert_called_once()
242+
call_args = mock_secho.call_args
243+
self.assertIn('WARNING:', call_args[0][0])
244+
self.assertIn('1.16 is incompatible with server 1.28', call_args[0][0])
245+
self.assertEqual(call_args[1]['fg'], 'yellow')
246+
247+
@patch('click.secho')
248+
@patch('kubernetes.client.VersionApi')
249+
@patch('sagemaker.hyperpod.common.utils.kubernetes_client_version', '24.0.0')
250+
def test_verify_kubernetes_version_compatibility_compatible_no_warning(self, mock_version_api, mock_secho):
251+
"""Test verify_kubernetes_version_compatibility with compatible versions - no warning should show"""
252+
# Mock server version info with compatible version
253+
mock_server_info = MagicMock()
254+
mock_server_info.major = '1'
255+
mock_server_info.minor = '24'
256+
mock_server_info.min_compatibility_major = None
257+
mock_server_info.min_compatibility_minor = None
258+
259+
mock_version_api_instance = MagicMock()
260+
mock_version_api_instance.get_code.return_value = mock_server_info
261+
mock_version_api.return_value = mock_version_api_instance
262+
263+
mock_logger = MagicMock()
264+
265+
from sagemaker.hyperpod.common.utils import verify_kubernetes_version_compatibility
266+
result = verify_kubernetes_version_compatibility(mock_logger)
267+
268+
# Should return True for compatible versions
269+
self.assertTrue(result)
270+
271+
# Should NOT call click.secho since no warning needed
272+
mock_secho.assert_not_called()
273+
185274
def test_is_eks_orchestrator_true(self):
186275
mock_client = MagicMock()
187276
mock_client.describe_cluster.return_value = {"Orchestrator": {"Eks": {}}}

0 commit comments

Comments
 (0)