Skip to content

Commit 5a3a5a2

Browse files
committed
rename types
Signed-off-by: Javan Lacerda <javanlacerda@google.com>
1 parent 5a92336 commit 5a3a5a2

12 files changed

Lines changed: 90 additions & 81 deletions

File tree

src/clusterfuzz/_internal/batch/service.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
from clusterfuzz._internal.datastore import ndb_utils
3636
from clusterfuzz._internal.google_cloud_utils import credentials
3737
from clusterfuzz._internal.metrics import logs
38-
from clusterfuzz._internal.remote_task import types
38+
from clusterfuzz._internal.remote_task import remote_task_types
3939
from clusterfuzz._internal.system import environment
4040

4141
# A named tuple that defines the execution environment for a batch workload.
@@ -170,7 +170,8 @@ def count_queued_or_scheduled_tasks(project: str,
170170
"""Counts the number of queued and scheduled tasks."""
171171
region = f'projects/{project}/locations/{region}'
172172
jobs_filter = 'Status.State="SCHEDULED" OR Status.State="QUEUED"'
173-
req = batch.types.ListJobsRequest(parent=region, filter=jobs_filter)
173+
req = batch.remote_task_types.ListJobsRequest(
174+
parent=region, filter=jobs_filter)
174175
queued = 0
175176
scheduled = 0
176177
for job in _batch_client().list_jobs(request=req):
@@ -193,13 +194,14 @@ def is_remote_task(command: str, job_name: str) -> bool:
193194
be found for the given command and job type.
194195
"""
195196
try:
196-
_get_specs_from_config([types.RemoteTask(command, job_name, None)])
197+
_get_specs_from_config(
198+
[remote_task_types.RemoteTask(command, job_name, None)])
197199
return True
198200
except ValueError:
199201
return False
200202

201203

202-
def _get_config_names(batch_tasks: List[types.RemoteTask]):
204+
def _get_config_names(batch_tasks: List[remote_task_types.RemoteTask]):
203205
""""Gets the name of the configs for each batch_task. Returns a dict
204206
that is indexed by command and job_type for efficient lookup."""
205207
job_names = {task.job_type for task in batch_tasks}
@@ -253,7 +255,8 @@ def _get_subconfig(batch_config, instance_spec):
253255
return all_subconfigs[weighted_subconfig.name]
254256

255257

256-
def _get_specs_from_config(batch_tasks: List[types.RemoteTask]) -> Dict:
258+
def _get_specs_from_config(
259+
batch_tasks: List[remote_task_types.RemoteTask]) -> Dict:
257260
"""Gets the configured specifications for a batch workload."""
258261
if not batch_tasks:
259262
return {}
@@ -321,7 +324,7 @@ def _get_specs_from_config(batch_tasks: List[types.RemoteTask]) -> Dict:
321324
return specs
322325

323326

324-
class GcpBatchService(types.RemoteTaskInterface):
327+
class GcpBatchService(remote_task_types.RemoteTaskInterface):
325328
"""A high-level service for creating and managing remote tasks.
326329
327330
This service provides a simple interface for scheduling ClusterFuzz tasks on
@@ -371,13 +374,16 @@ def create_utask_main_job(self, module: str, job_type: str,
371374
input_download_url: str):
372375
"""Creates a single batch job for a uworker main task."""
373376
command = task_utils.get_command_from_module(module)
374-
batch_tasks = [types.RemoteTask(command, job_type, input_download_url)]
377+
batch_tasks = [
378+
remote_task_types.RemoteTask(command, job_type, input_download_url)
379+
]
375380
result = self.create_utask_main_jobs(batch_tasks)
376381
if result is None:
377382
return result
378383
return result[0]
379384

380-
def create_utask_main_jobs(self, remote_tasks: List[types.RemoteTask]):
385+
def create_utask_main_jobs(self,
386+
remote_tasks: List[remote_task_types.RemoteTask]):
381387
"""Creates a batch job for a list of uworker main tasks.
382388
383389
This method groups the tasks by their workload specification and creates a

src/clusterfuzz/_internal/k8s/service.py

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
from clusterfuzz._internal.datastore import feature_flags
3535
from clusterfuzz._internal.datastore import ndb_utils
3636
from clusterfuzz._internal.metrics import logs
37-
from clusterfuzz._internal.remote_task import types
37+
from clusterfuzz._internal.remote_task import remote_task_types
3838
from clusterfuzz._internal.system import environment
3939

4040
CLUSTER_NAME = 'clusterfuzz-cronjobs-gke'
@@ -50,7 +50,7 @@
5050
])
5151

5252

53-
def _get_config_names(remote_tasks: typing.List[types.RemoteTask]):
53+
def _get_config_names(remote_tasks: typing.List[remote_task_types.RemoteTask]):
5454
""""Gets the name of the configs for each batch_task. Returns a dict
5555
5656
that is indexed by command and job_type for efficient lookup."""
@@ -62,7 +62,7 @@ def _get_config_names(remote_tasks: typing.List[types.RemoteTask]):
6262
config_map = {}
6363
for task in remote_tasks:
6464
if task.job_type not in job_map:
65-
logs.error(f'{task.job_type} doesn\'t exist.')
65+
logs.error(f"{task.job_type} doesn't exist.")
6666
continue
6767
if task.command == 'fuzz':
6868
suffix = '-PREEMPTIBLE-UNPRIVILEGED'
@@ -88,13 +88,13 @@ def _get_config_names(remote_tasks: typing.List[types.RemoteTask]):
8888

8989

9090
def _get_k8s_job_configs(
91-
remote_tasks: typing.List[types.RemoteTask]
91+
remote_tasks: typing.List[remote_task_types.RemoteTask]
9292
) -> typing.Dict[typing.Tuple[str, str], KubernetesJobConfig]:
9393
"""Gets the configured specifications for a batch workload."""
9494

9595
if not remote_tasks:
9696
return {}
97-
#TODO(javanlacerda): Create remote task config
97+
# TODO(javanlacerda): Create remote task config
9898
batch_config = local_config.BatchConfig()
9999
config_map = _get_config_names(remote_tasks)
100100
configs = {}
@@ -162,7 +162,7 @@ def _create_job_body(config: KubernetesJobConfig, input_url: str,
162162
return yaml.safe_load(rendered_spec)
163163

164164

165-
class KubernetesService(types.RemoteTaskInterface):
165+
class KubernetesService(remote_task_types.RemoteTaskInterface):
166166
"""A remote task execution client for Kubernetes."""
167167

168168
def __init__(self, k8s_config_loaded: bool = False):
@@ -178,7 +178,7 @@ def _load_gke_credentials(self):
178178
credentials, _ = google.auth.default()
179179
project = utils.get_application_id()
180180
service = discovery.build('container', 'v1', credentials=credentials)
181-
parent = f'projects/{project}/locations/-'
181+
parent = f"projects/{project}/locations/-"
182182

183183
try:
184184
# pylint: disable=no-member
@@ -188,12 +188,12 @@ def _load_gke_credentials(self):
188188
cluster = next((c for c in clusters if c['name'] == CLUSTER_NAME), None)
189189

190190
if not cluster:
191-
logs.error(f'Cluster {CLUSTER_NAME} not found in project {project}.')
192-
print(f'DEBUG: Cluster {CLUSTER_NAME} not found in project {project}.')
191+
logs.error(f"Cluster {CLUSTER_NAME} not found in project {project}.")
192+
print(f"DEBUG: Cluster {CLUSTER_NAME} not found in project {project}.")
193193
return
194194

195195
except Exception as e:
196-
logs.error(f'Failed to list clusters in {project}: {e}')
196+
logs.error(f"Failed to list clusters in {project}: {e}")
197197
return
198198

199199
endpoint = cluster['endpoint']
@@ -214,13 +214,13 @@ def get_token(creds):
214214
request = google_requests.Request()
215215
if not creds.valid or creds.expired:
216216
creds.refresh(request)
217-
return {'authorization': 'Bearer ' + creds.token}
217+
return {"authorization": "Bearer " + creds.token}
218218

219219
configuration.refresh_api_key_hook = lambda _: get_token(credentials)
220220
configuration.api_key = get_token(credentials)
221221

222222
k8s_client.Configuration.set_default(configuration)
223-
logs.info('GKE credentials loaded successfully.')
223+
logs.info("GKE credentials loaded successfully.")
224224

225225
def _create_service_account_if_needed(self,
226226
service_account_email: str) -> str:
@@ -266,36 +266,39 @@ def _get_pending_jobs_count(self) -> int:
266266
namespace='default',
267267
label_selector='app.kubernetes.io/name=clusterfuzz-kata-job',
268268
field_selector='status.phase=Pending')
269-
logs.info(f'Found {len(pods.items)} pending jobs.')
269+
logs.info(f"Found {len(pods.items)} pending jobs.")
270270
return len(pods.items)
271271
except Exception as e:
272-
logs.error(f'Failed to list pods: {e}')
272+
logs.error(f"Failed to list pods: {e}")
273273
return 0
274274

275275
def create_utask_main_job(self, module: str, job_type: str,
276276
input_download_url: str):
277277
"""Creates a single batch job for a uworker main task."""
278278

279279
command = task_utils.get_command_from_module(module)
280-
batch_tasks = [types.RemoteTask(command, job_type, input_download_url)]
280+
batch_tasks = [
281+
remote_task_types.RemoteTask(command, job_type, input_download_url)
282+
]
281283
result = self.create_utask_main_jobs(batch_tasks)
282284

283285
if result is None:
284286
return result
285287
return result[0]
286288

287-
def create_utask_main_jobs(self, remote_tasks: typing.List[types.RemoteTask]):
289+
def create_utask_main_jobs(
290+
self, remote_tasks: typing.List[remote_task_types.RemoteTask]):
288291
"""Creates a batch job for a list of uworker main tasks.
289292
290293
This method groups the tasks by their workload specification and creates a
291294
separate batch job for each group. This allows tasks with similar
292295
requirements to be processed together, which can improve efficiency.
293296
"""
294-
if feature_flags.FeatureFlags.K8S_PENDING_JOBS_LIMITER.enabled and \
295-
feature_flags.FeatureFlags.K8S_PENDING_JOBS_LIMITER.content is not None\
296-
and self._get_pending_jobs_count() >= int(feature_flags
297-
.FeatureFlags.
298-
K8S_PENDING_JOBS_LIMITER.content):
297+
limit = None
298+
if feature_flags.FeatureFlags.K8S_PENDING_JOBS_LIMITER.enabled:
299+
limit = feature_flags.FeatureFlags.K8S_PENDING_JOBS_LIMITER.content
300+
301+
if limit is not None and self._get_pending_jobs_count() >= int(limit):
299302
logs.warning(
300303
f'Kubernetes job limit reached. Not acking {len(remote_tasks)} tasks.'
301304
)
@@ -310,11 +313,10 @@ def create_utask_main_jobs(self, remote_tasks: typing.List[types.RemoteTask]):
310313
logs.info(f'Scheduling {remote_task.command}, {remote_task.job_type}.')
311314
config = configs[(remote_task.command, remote_task.job_type)]
312315
job_specs[config].append(remote_task.input_download_url)
313-
logs.info('Creating Kubernetes jobs.')
316+
logs.info('Creating batch jobs.')
314317
jobs = []
315-
logs.info('Batching k8s utask_mains.')
318+
logs.info('Batching utask_mains.')
316319
for config, input_urls in job_specs.items():
317-
# TODO(javanlacerda): Batch multiple tasks into a single job.
318320
for input_url in input_urls:
319321
jobs.append(self.create_job(config, input_url))
320322

src/clusterfuzz/_internal/remote_task/__init__.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626

2727
from clusterfuzz._internal.datastore import feature_flags
2828
from clusterfuzz._internal.metrics import logs
29-
from clusterfuzz._internal.remote_task import types
29+
from clusterfuzz._internal.remote_task import remote_task_types
3030

3131

32-
class RemoteTaskGate(types.RemoteTaskInterface):
32+
class RemoteTaskGate(remote_task_types.RemoteTaskInterface):
3333
"""A generic dispatcher for remote task execution.
3434
3535
This class acts as a high-level manager that abstracts away the specific
@@ -116,7 +116,8 @@ def create_utask_main_job(self, module: str, job_type: str,
116116
service = self._service_map[adapter_id]
117117
return service.create_utask_main_job(module, job_type, input_download_url)
118118

119-
def create_utask_main_jobs(self, remote_tasks: List[types.RemoteTask]):
119+
def create_utask_main_jobs(self,
120+
remote_tasks: List[remote_task_types.RemoteTask]):
120121
"""Creates a batch of remote tasks, distributing them across backends.
121122
122123
This method handles two cases:
File renamed without changes.

src/clusterfuzz/_internal/tests/core/batch/batch_service_test.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
from clusterfuzz._internal.batch import service as batch_service
2424
from clusterfuzz._internal.datastore import data_types
25-
from clusterfuzz._internal.remote_task import types
25+
from clusterfuzz._internal.remote_task import remote_task_types
2626
from clusterfuzz._internal.tests.test_libs import helpers
2727
from clusterfuzz._internal.tests.test_libs import test_utils
2828

@@ -199,9 +199,9 @@ def test_create_uworker_main_batch_jobs(self):
199199
('command2', 'job2'): spec2,
200200
}
201201
tasks = [
202-
types.RemoteTask('command1', 'job1', 'url1'),
203-
types.RemoteTask('command1', 'job1', 'url2'),
204-
types.RemoteTask('command2', 'job2', 'url3'),
202+
remote_task_types.RemoteTask('command1', 'job1', 'url1'),
203+
remote_task_types.RemoteTask('command1', 'job1', 'url2'),
204+
remote_task_types.RemoteTask('command2', 'job2', 'url3'),
205205
]
206206

207207
# Call the function.
@@ -374,14 +374,14 @@ def test_get_specs_from_config_disk_size(self):
374374
name='libfuzzer_asan_test').put()
375375

376376
spec = batch_service._get_specs_from_config(
377-
[types.RemoteTask('fuzz', 'libfuzzer_asan_test', None)])
377+
[remote_task_types.RemoteTask('fuzz', 'libfuzzer_asan_test', None)])
378378
self.assertEqual(spec['fuzz', 'libfuzzer_asan_test'].disk_size_gb, size)
379379

380380
def test_get_specs_from_config_no_disk_size(self):
381381
"""Test that disk_size_gb isn't mandatory."""
382382
data_types.Job(platform='LINUX', name='libfuzzer_asan_test').put()
383383
spec = batch_service._get_specs_from_config(
384-
[types.RemoteTask('fuzz', 'libfuzzer_asan_test', None)])
384+
[remote_task_types.RemoteTask('fuzz', 'libfuzzer_asan_test', None)])
385385
conf = batch_service._get_batch_config()
386386
expected_size = (
387387
conf.get('mapping')['LINUX-PREEMPTIBLE-UNPRIVILEGED']['disk_size_gb'])
@@ -406,7 +406,7 @@ def test_get_specs_from_config_with_disk_size_override(self):
406406
name=job_name).put()
407407

408408
spec = batch_service._get_specs_from_config(
409-
[types.RemoteTask('fuzz', job_name, None)])
409+
[remote_task_types.RemoteTask('fuzz', job_name, None)])
410410
self.assertEqual(spec['fuzz', job_name].disk_size_gb, overridden_size)
411411

412412
@mock.patch('clusterfuzz._internal.batch.service.utils.is_oss_fuzz')
@@ -422,7 +422,7 @@ def test_get_config_names_os_version(self, mock_get_all_from_query,
422422
name='job1', platform='LINUX', base_os_version='job-os-ubuntu-20')
423423
mock_get_all_from_query.return_value = [job1]
424424
config_map = batch_service._get_config_names(
425-
[types.RemoteTask('fuzz', 'job1', None)])
425+
[remote_task_types.RemoteTask('fuzz', 'job1', None)])
426426
self.assertEqual(config_map[('fuzz', 'job1')][2], 'job-os-ubuntu-20')
427427

428428
# Test Case 2: OSS-Fuzz project, project-level version overrides job-level.
@@ -437,23 +437,23 @@ def test_get_config_names_os_version(self, mock_get_all_from_query,
437437
mock_get_all_from_query.return_value = [job2]
438438
mock_oss_fuzz_project_query.return_value.get.return_value = project
439439
config_map = batch_service._get_config_names(
440-
[types.RemoteTask('fuzz', 'job2', None)])
440+
[remote_task_types.RemoteTask('fuzz', 'job2', None)])
441441
self.assertEqual(config_map[('fuzz', 'job2')][2], 'project-os-ubuntu-24')
442442

443443
# Test Case 3: OSS-Fuzz project, only project-level version exists.
444444
job3 = data_types.Job(name='job3', project='my-project', platform='LINUX')
445445
mock_get_all_from_query.return_value = [job3]
446446
mock_oss_fuzz_project_query.return_value.get.return_value = project
447447
config_map = batch_service._get_config_names(
448-
[types.RemoteTask('fuzz', 'job3', None)])
448+
[remote_task_types.RemoteTask('fuzz', 'job3', None)])
449449
self.assertEqual(config_map[('fuzz', 'job3')][2], 'project-os-ubuntu-24')
450450

451451
# Test Case 4: Internal project, no version is set, should be None.
452452
mock_is_oss_fuzz.return_value = False
453453
job4 = data_types.Job(name='job4', platform='LINUX')
454454
mock_get_all_from_query.return_value = [job4]
455455
config_map = batch_service._get_config_names(
456-
[types.RemoteTask('fuzz', 'job4', None)])
456+
[remote_task_types.RemoteTask('fuzz', 'job4', None)])
457457
self.assertIsNone(config_map[('fuzz', 'job4')][2])
458458

459459
# Test Case 5: OSS-Fuzz project, but no versions are set anywhere.
@@ -464,11 +464,11 @@ def test_get_config_names_os_version(self, mock_get_all_from_query,
464464
mock_get_all_from_query.return_value = [job5]
465465
mock_oss_fuzz_project_query.return_value.get.return_value = project_no_version
466466
config_map = batch_service._get_config_names(
467-
[types.RemoteTask('fuzz', 'job5', None)])
467+
[remote_task_types.RemoteTask('fuzz', 'job5', None)])
468468
self.assertIsNone(config_map[('fuzz', 'job5')][2])
469469

470470

471471
def _get_spec_from_config(command, job_name):
472472
return list(
473473
batch_service._get_specs_from_config(
474-
[types.RemoteTask(command, job_name, None)]).values())[0]
474+
[remote_task_types.RemoteTask(command, job_name, None)]).values())[0]

src/clusterfuzz/_internal/tests/core/k8s/k8s_service_e2e_test.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from clusterfuzz._internal.datastore import data_types
3030
from clusterfuzz._internal.k8s import service as kubernetes_service
3131
from clusterfuzz._internal.k8s.service import KubernetesJobConfig
32-
from clusterfuzz._internal.remote_task import types
32+
from clusterfuzz._internal.remote_task import remote_task_types
3333
from clusterfuzz._internal.tests.test_libs import test_utils
3434

3535

@@ -182,7 +182,7 @@ def tearDownClass(cls):
182182
def test_create_job(self, mock_get_logging_config_dict):
183183
"""Tests creating a job."""
184184
input_url = 'url'
185-
task = types.RemoteTask(None, 'test-job', None)
185+
task = remote_task_types.RemoteTask(None, 'test-job', None)
186186
task.docker_image = self.image
187187

188188
config = KubernetesJobConfig(
@@ -298,8 +298,8 @@ def test_create_uworker_main_batch_jobs(self, mock_get_command_from_module,
298298
}
299299

300300
tasks = [
301-
types.RemoteTask('fuzz', 'test-job1', 'url1'),
302-
types.RemoteTask('fuzz', 'test-job2', 'url2'),
301+
remote_task_types.RemoteTask('fuzz', 'test-job1', 'url1'),
302+
remote_task_types.RemoteTask('fuzz', 'test-job2', 'url2'),
303303
]
304304

305305
actual_job_names = \

0 commit comments

Comments
 (0)