expose supervisor tasks that are fully self-contained fuzzing tasks in the service (#474)

Exposes the functionality added in #454 to the service & CLI.

Fixes #439
This commit is contained in:
bmc-msft
2021-01-28 19:01:59 -05:00
committed by GitHub
parent 14fc1ca51f
commit a46f7b4193
7 changed files with 65 additions and 33 deletions

View File

@ -1378,10 +1378,7 @@ Each event will be submitted via HTTP POST to the user provided URL.
},
"required": [
"type",
"duration",
"target_exe",
"target_env",
"target_options"
"duration"
],
"title": "TaskDetails",
"type": "object"
@ -2761,10 +2758,7 @@ Each event will be submitted via HTTP POST to the user provided URL.
},
"required": [
"type",
"duration",
"target_exe",
"target_env",
"target_options"
"duration"
],
"title": "TaskDetails",
"type": "object"

View File

@ -92,6 +92,25 @@ def check_containers(definition: TaskDefinition, config: TaskConfig) -> None:
)
def check_target_exe(config: TaskConfig, definition: TaskDefinition) -> None:
if config.task.target_exe is None:
if TaskFeature.target_exe in definition.features:
raise TaskConfigError("missing target_exe")
if TaskFeature.target_exe_optional in definition.features:
return
return
container = [x for x in config.containers if x.type == ContainerType.setup][0]
if not blob_exists(container.name, config.task.target_exe, StorageType.corpus):
err = "target_exe `%s` does not exist in the setup container `%s`" % (
config.task.target_exe,
container.name,
)
LOGGER.warning(err)
def check_config(config: TaskConfig) -> None:
if config.task.type not in TASK_DEFINITIONS:
raise TaskConfigError("unsupported task type: %s" % config.task.type.name)
@ -132,14 +151,7 @@ def check_config(config: TaskConfig) -> None:
else:
raise TaskConfigError("either the vm or pool must be specified")
if TaskFeature.target_exe in definition.features:
container = [x for x in config.containers if x.type == ContainerType.setup][0]
if not blob_exists(container.name, config.task.target_exe, StorageType.corpus):
err = "target_exe `%s` does not exist in the setup container `%s`" % (
config.task.target_exe,
container.name,
)
LOGGER.warning(err)
check_target_exe(config, definition)
if TaskFeature.generator_exe in definition.features:
container = [x for x in config.containers if x.type == ContainerType.tools][0]
@ -253,6 +265,12 @@ def build_task_config(
if TaskFeature.target_exe in definition.features:
config.target_exe = "setup/%s" % task_config.task.target_exe
if (
TaskFeature.target_exe_optional in definition.features
and task_config.task.target_exe
):
config.target_exe = "setup/%s" % task_config.task.target_exe
if TaskFeature.target_env in definition.features:
config.target_env = task_config.task.target_env or EMPTY_DICT

View File

@ -232,7 +232,7 @@ TASK_DEFINITIONS = {
),
ContainerDefinition(
type=ContainerType.tools,
compare=Compare.Equal,
compare=Compare.AtMost,
value=1,
permissions=[ContainerPermission.Read, ContainerPermission.List],
),
@ -252,6 +252,36 @@ TASK_DEFINITIONS = {
ContainerPermission.List,
],
),
ContainerDefinition(
type=ContainerType.unique_reports,
compare=Compare.AtMost,
value=1,
permissions=[
ContainerPermission.Write,
ContainerPermission.Read,
ContainerPermission.List,
],
),
ContainerDefinition(
type=ContainerType.reports,
compare=Compare.AtMost,
value=1,
permissions=[
ContainerPermission.Write,
ContainerPermission.Read,
ContainerPermission.List,
],
),
ContainerDefinition(
type=ContainerType.no_repro,
compare=Compare.AtMost,
value=1,
permissions=[
ContainerPermission.Write,
ContainerPermission.Read,
ContainerPermission.List,
],
),
],
monitor_queue=None,
),

View File

@ -828,19 +828,8 @@ class Tasks(Endpoint):
lambda: [str(x.job_id) for x in self.onefuzz.jobs.list()],
)
if target_env is None:
target_env = {}
if tags is None:
tags = {}
if target_options is None:
target_options = []
if supervisor_options is None:
supervisor_options = []
if supervisor_env is None:
supervisor_env = {}
if prereq_tasks is None:
prereq_tasks = []
containers_submit = []
for (container_type, container) in containers:

View File

@ -274,7 +274,7 @@ class TopCache:
type=task.config.task.type,
pool=task.config.pool.pool_name if task.config.pool else "",
state=task.state,
target=task.config.task.target_exe.replace("setup/", "", 0),
target=(task.config.task.target_exe or "").replace("setup/", "", 0),
containers=task.config.containers,
end_time=task.end_time,
)
@ -285,7 +285,7 @@ class TopCache:
task_id=event.task_id,
type=event.config.task.type,
pool=event.config.pool.pool_name if event.config.pool else "",
target=event.config.task.target_exe.replace("setup/", "", 0),
target=(event.config.task.target_exe or "").replace("setup/", "", 0),
containers=event.config.containers,
state=TaskState.init,
)

View File

@ -57,6 +57,7 @@ class TaskFeature(Enum):
stats_file = "stats_file"
stats_format = "stats_format"
target_exe = "target_exe"
target_exe_optional = "target_exe_optional"
target_env = "target_env"
target_options = "target_options"
analyzer_exe = "analyzer_exe"

View File

@ -142,9 +142,9 @@ class ReproConfig(BaseModel):
class TaskDetails(BaseModel):
type: TaskType
duration: int
target_exe: str
target_env: Dict[str, str]
target_options: List[str]
target_exe: Optional[str]
target_env: Optional[Dict[str, str]]
target_options: Optional[List[str]]
target_workers: Optional[int]
target_options_merge: Optional[bool]
check_asan_log: Optional[bool]