Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions sky/utils/resource_checker.py
Original file line number Diff line number Diff line change
Expand Up @@ -276,9 +276,10 @@ def get_all_managed_jobs():
# pylint: disable=import-outside-toplevel
from sky.jobs.server import core as managed_jobs_core
try:
return managed_jobs_core.queue(refresh=False,
skip_finished=True,
all_users=True)
filtered_jobs, _, _, _ = managed_jobs_core.queue(refresh=False,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @seongsukwon-moreh, could you please help add return type List[Dict[str, Any]] for the get_all_clusters and get_all_managed_jobs functions, so that any mismatch changes can be caught later?
Thanks!

skip_finished=True,
all_users=True)
return filtered_jobs
except exceptions.ClusterNotUpError:
logger.warning('All jobs should be finished.')
return []
Expand Down
40 changes: 20 additions & 20 deletions tests/unit_tests/test_sky/utils/test_resource_checker.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ def test_check_no_active_resources_for_users_no_resources(
"""Test resource check passes when user has no active resources."""
# Setup mocks - no resources
mock_get_clusters.return_value = []
mock_queue.return_value = []
mock_queue.return_value = ([], 0, {}, 0)

# Should not raise any exception
resource_checker.check_no_active_resources_for_users([('user123',
Expand All @@ -111,7 +111,7 @@ def test_check_no_active_resources_for_users_with_clusters(
"""Test resource check fails when user has active clusters."""
# Setup mocks - user has clusters
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = []
mock_queue.return_value = ([], 0, {}, 0)

# Should raise ValueError for user with clusters
with pytest.raises(ValueError) as exc_info:
Expand All @@ -130,7 +130,7 @@ def test_check_no_active_resources_for_users_with_jobs(
"""Test resource check fails when user has active managed jobs."""
# Setup mocks - user has jobs
mock_get_clusters.return_value = []
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)

# Should raise ValueError for user with jobs
with pytest.raises(ValueError) as exc_info:
Expand All @@ -151,7 +151,7 @@ def test_check_no_active_resources_for_users_with_mixed_resources(
"""Test resource check fails when user has both clusters and jobs."""
# Setup mocks - user has both clusters and jobs
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)
mock_get_user.return_value = sample_user

# Should raise ValueError for user with both types of resources
Expand All @@ -173,7 +173,7 @@ def test_check_no_active_resources_for_service_account(
"""Test resource check for service account user."""
# Setup mocks
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)

# Should raise ValueError for service account with resources
with pytest.raises(ValueError) as exc_info:
Expand All @@ -194,7 +194,7 @@ def test_check_no_active_resources_for_multiple_users(
"""Test resource check for multiple users with mixed results."""
# Setup mocks
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)

# Should raise ValueError with details for multiple users
with pytest.raises(ValueError) as exc_info:
Expand Down Expand Up @@ -239,7 +239,7 @@ def test_check_no_active_resources_for_workspaces(self, mock_queue,
"""Test resource check for workspaces."""
# Setup mocks
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)

# Should raise ValueError for workspace with resources
with pytest.raises(ValueError) as exc_info:
Expand Down Expand Up @@ -273,7 +273,7 @@ def test_check_no_active_resources_update_operation(self, mock_queue,
"""Test resource check for update operations (not just delete)."""
# Setup mocks
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = []
mock_queue.return_value = ([], 0, {}, 0)

# Should raise ValueError even for update operations with active resources
with pytest.raises(ValueError) as exc_info:
Expand All @@ -293,7 +293,7 @@ def test_check_no_active_resources_mixed_operations(self, mock_queue,
"""Test resource check with mixed update and delete operations."""
# Setup mocks
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)

# Should handle mixed operations correctly
with pytest.raises(ValueError) as exc_info:
Expand Down Expand Up @@ -323,7 +323,7 @@ def test_check_users_workspaces_active_resources_all_authorized(
]

mock_get_clusters.return_value = workspace_clusters
mock_queue.return_value = workspace_jobs
mock_queue.return_value = (workspace_jobs, 0, {}, 0)

# All users who have resources in these workspaces
authorized_users = ['user123', 'user456', 'sa-service123']
Expand All @@ -345,7 +345,7 @@ def test_check_users_workspaces_active_resources_unauthorized_users(
"""Test when some active resources belong to unauthorized users."""
# Setup mocks
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)

# Mock user data for name resolution
class MockUser:
Expand Down Expand Up @@ -382,7 +382,7 @@ def test_check_users_workspaces_active_resources_no_resources(
"""Test when there are no active resources in specified workspaces."""
# Setup mocks - no resources
mock_get_clusters.return_value = []
mock_queue.return_value = []
mock_queue.return_value = ([], 0, {}, 0)

authorized_users = ['user123', 'user456']
workspaces = ['empty-workspace']
Expand All @@ -403,7 +403,7 @@ def test_check_users_workspaces_active_resources_clusters_only(
"""Test when only clusters exist (no managed jobs)."""
# Setup mocks - only clusters
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = []
mock_queue.return_value = ([], 0, {}, 0)

# Mock user data
class MockUser:
Expand Down Expand Up @@ -436,7 +436,7 @@ def test_check_users_workspaces_active_resources_jobs_only(
"""Test when only managed jobs exist (no clusters)."""
# Setup mocks - only jobs
mock_get_clusters.return_value = []
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)

# Mock user data
class MockUser:
Expand Down Expand Up @@ -468,7 +468,7 @@ def test_get_active_resources_for_workspaces_multiple_workspaces(
"""Test getting active resources for multiple workspaces."""
# Setup mocks
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)

workspaces = ['default', 'production']

Expand All @@ -493,7 +493,7 @@ def test_get_active_resources_for_workspaces_single_workspace(
"""Test getting active resources for a single workspace."""
# Setup mocks
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)

workspaces = ['default']

Expand Down Expand Up @@ -541,7 +541,7 @@ def test_get_active_resources_for_workspaces_nonexistent_workspace(
"""Test getting active resources for non-existent workspace."""
# Setup mocks
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)

workspaces = ['nonexistent-workspace']

Expand All @@ -561,7 +561,7 @@ def test_check_users_workspaces_active_resources_user_without_name(
"""Test handling users without names (fallback to user ID)."""
# Setup mocks - only clusters
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = []
mock_queue.return_value = ([], 0, {}, 0)

# Mock user data with some users having no name
class MockUser:
Expand Down Expand Up @@ -615,7 +615,7 @@ def test_get_active_resources_by_names_filter_functionality(
"""Test the generic _get_active_resources_by_names function."""
# Setup mocks
mock_get_clusters.return_value = sample_clusters
mock_queue.return_value = sample_managed_jobs
mock_queue.return_value = (sample_managed_jobs, 0, {}, 0)

# Create a custom filter factory for testing
def test_filter_factory(resource_names):
Expand Down Expand Up @@ -697,7 +697,7 @@ def test_check_users_workspaces_active_resources_mixed_workspace_resources(
}]

mock_get_clusters.return_value = mixed_clusters
mock_queue.return_value = mixed_jobs
mock_queue.return_value = (mixed_jobs, 0, {}, 0)

# Mock user data
class MockUser:
Expand Down