feat: support overwrite of groups & max_total_score in task.toml
			#22
		
		
	|  | @ -29,19 +29,25 @@ def convert_joj3_conf(repo_conf: repo.Config, task_conf: task.Config) -> result. | ||||||
|         expire_unix_timestamp=int(task_conf.release.end_time.timestamp()), |         expire_unix_timestamp=int(task_conf.release.end_time.timestamp()), | ||||||
|         effective_unix_timestamp=int(task_conf.release.begin_time.timestamp()), |         effective_unix_timestamp=int(task_conf.release.begin_time.timestamp()), | ||||||
|         actor_csv_path=str(ACTOR_CSV_PATH),  # students.csv position |         actor_csv_path=str(ACTOR_CSV_PATH),  # students.csv position | ||||||
|         max_total_score=repo_conf.max_total_score, |         max_total_score=( | ||||||
|  |             repo_conf.max_total_score | ||||||
|  |             if not task_conf.max_total_score | ||||||
|  |             else task_conf.max_total_score | ||||||
|  |         ), | ||||||
|         stage=result.Stage(sandbox_token=repo_conf.sandbox_token), |         stage=result.Stage(sandbox_token=repo_conf.sandbox_token), | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|     current_test = os.environ.get("PYTEST_CURRENT_TEST") is not None |     current_test = os.environ.get("PYTEST_CURRENT_TEST") is not None | ||||||
|     # Construct health check stage |     # Construct health check stage | ||||||
|     if not repo_conf.force_skip_health_check_on_test or not current_test: |     if not repo_conf.force_skip_health_check_on_test or not current_test: | ||||||
|         result_conf.stage.stages.append(get_health_check_stage(repo_conf)) |         result_conf.stage.stages.append(get_health_check_stage(repo_conf, task_conf)) | ||||||
|     cached: Dict[str, None] = {} |     cached: Dict[str, None] = {} | ||||||
|     # Convert each stage in the task configuration |     # Convert each stage in the task configuration | ||||||
|     for task_stage in task_conf.stages: |     for task_stage in task_conf.stages: | ||||||
|         result_conf.stage.stages.append(get_conf_stage(task_conf, task_stage, cached)) |         result_conf.stage.stages.append(get_conf_stage(task_conf, task_stage, cached)) | ||||||
|     if not repo_conf.force_skip_teapot_on_test or not current_test: |     if not repo_conf.force_skip_teapot_on_test or not current_test: | ||||||
|         result_conf.stage.post_stages.append(get_teapot_post_stage(repo_conf)) |         result_conf.stage.post_stages.append( | ||||||
|  |             get_teapot_post_stage(repo_conf, task_conf) | ||||||
|  |         ) | ||||||
| 
 | 
 | ||||||
|     return result_conf |     return result_conf | ||||||
|  |  | ||||||
|  | @ -20,6 +20,7 @@ from joj3_config_generator.models.const import ( | ||||||
|     DEFAULT_MEMORY_LIMIT, |     DEFAULT_MEMORY_LIMIT, | ||||||
|     DEFAULT_PROC_LIMIT, |     DEFAULT_PROC_LIMIT, | ||||||
| ) | ) | ||||||
|  | from joj3_config_generator.models.repo import Groups | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ParserResultDetail(BaseModel): | class ParserResultDetail(BaseModel): | ||||||
|  | @ -204,3 +205,7 @@ class Config(BaseModel): | ||||||
|     task: Task = Task()  # Task name (e.g., hw3 ex5) |     task: Task = Task()  # Task name (e.g., hw3 ex5) | ||||||
|     release: Release = Release()  # Release configuration |     release: Release = Release()  # Release configuration | ||||||
|     stages: List[Stage] = []  # list of stage configurations |     stages: List[Stage] = []  # list of stage configurations | ||||||
|  |     groups: Groups = Groups() | ||||||
|  |     max_total_score: int = Field( | ||||||
|  |         100, validation_alias=AliasChoices("max-total-score", "max_total_score") | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  | @ -2,11 +2,13 @@ import hashlib | ||||||
| from pathlib import Path | from pathlib import Path | ||||||
| from typing import List | from typing import List | ||||||
| 
 | 
 | ||||||
| from joj3_config_generator.models import common, repo, result | from joj3_config_generator.models import common, repo, result, task | ||||||
| from joj3_config_generator.models.const import TEAPOT_CONFIG_ROOT, TEAPOT_LOG_PATH | from joj3_config_generator.models.const import TEAPOT_CONFIG_ROOT, TEAPOT_LOG_PATH | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_teapot_post_stage(repo_conf: repo.Config) -> result.StageDetail: | def get_teapot_post_stage( | ||||||
|  |     repo_conf: repo.Config, task_conf: task.Config | ||||||
|  | ) -> result.StageDetail: | ||||||
|     args = [ |     args = [ | ||||||
|         "/usr/local/bin/joint-teapot", |         "/usr/local/bin/joint-teapot", | ||||||
|         "joj3-all-env", |         "joj3-all-env", | ||||||
|  | @ -14,7 +16,11 @@ def get_teapot_post_stage(repo_conf: repo.Config) -> result.StageDetail: | ||||||
|         "--grading-repo-name", |         "--grading-repo-name", | ||||||
|         repo_conf.grading_repo_name, |         repo_conf.grading_repo_name, | ||||||
|         "--max-total-score", |         "--max-total-score", | ||||||
|         str(repo_conf.max_total_score), |         ( | ||||||
|  |             str(repo_conf.max_total_score) | ||||||
|  |             if not task_conf.max_total_score | ||||||
|  |             else str(task_conf.max_total_score) | ||||||
|  |         ), | ||||||
|     ] |     ] | ||||||
|     if not repo_conf.submitter_in_issue_title: |     if not repo_conf.submitter_in_issue_title: | ||||||
|         args.append("--no-submitter-in-issue-title") |         args.append("--no-submitter-in-issue-title") | ||||||
|  | @ -52,7 +58,7 @@ def get_health_check_args(repo_conf: repo.Config) -> List[str]: | ||||||
|     ] |     ] | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_teapot_check_args(repo_conf: repo.Config) -> List[str]: | def get_teapot_check_args(repo_conf: repo.Config, task_conf: task.Config) -> List[str]: | ||||||
|     res = [ |     res = [ | ||||||
|         "/usr/local/bin/joint-teapot", |         "/usr/local/bin/joint-teapot", | ||||||
|         "joj3-check-env", |         "joj3-check-env", | ||||||
|  | @ -69,11 +75,24 @@ def get_teapot_check_args(repo_conf: repo.Config) -> List[str]: | ||||||
|                 repo_conf.groups.time_period_hour, |                 repo_conf.groups.time_period_hour, | ||||||
|             ) |             ) | ||||||
|         ) |         ) | ||||||
|         res.extend(["--group-config", group_config_str]) |         if task_conf.groups.name: | ||||||
|  |             overwrite_group_config_str = ",".join( | ||||||
|  |                 f"{name}={max_count}:{time_period}" | ||||||
|  |                 for name, max_count, time_period in zip( | ||||||
|  |                     task_conf.groups.name, | ||||||
|  |                     task_conf.groups.max_count, | ||||||
|  |                     task_conf.groups.time_period_hour, | ||||||
|  |                 ) | ||||||
|  |             ) | ||||||
|  |             res.extend(["--group-config", overwrite_group_config_str]) | ||||||
|  |         else: | ||||||
|  |             res.extend(["--group-config", group_config_str]) | ||||||
|     return res |     return res | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_health_check_stage(repo_conf: repo.Config) -> result.StageDetail: | def get_health_check_stage( | ||||||
|  |     repo_conf: repo.Config, task_conf: task.Config | ||||||
|  | ) -> result.StageDetail: | ||||||
|     health_check_stage = result.StageDetail( |     health_check_stage = result.StageDetail( | ||||||
|         name="Health Check", |         name="Health Check", | ||||||
|         group="", |         group="", | ||||||
|  | @ -88,7 +107,7 @@ def get_health_check_stage(repo_conf: repo.Config) -> result.StageDetail: | ||||||
|                         args=get_health_check_args(repo_conf), |                         args=get_health_check_args(repo_conf), | ||||||
|                     ), |                     ), | ||||||
|                     result.OptionalCmd( |                     result.OptionalCmd( | ||||||
|                         args=get_teapot_check_args(repo_conf), |                         args=get_teapot_check_args(repo_conf, task_conf), | ||||||
|                         env=[f"LOG_FILE_PATH={TEAPOT_LOG_PATH}"], |                         env=[f"LOG_FILE_PATH={TEAPOT_LOG_PATH}"], | ||||||
|                     ), |                     ), | ||||||
|                 ], |                 ], | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ grading-repo-name = "ece280-joj" | ||||||
| 
 | 
 | ||||||
| sandbox-token = "test" | sandbox-token = "test" | ||||||
| # reconfigure later | # reconfigure later | ||||||
| max-total-score = 100 | max-total-score = 1000 | ||||||
| max-size = 50.5 | max-size = 50.5 | ||||||
| 
 | 
 | ||||||
| # for tests | # for tests | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|     "expireUnixTimestamp": 1735574399, |     "expireUnixTimestamp": 1735574399, | ||||||
|     "effectiveUnixTimestamp": 1735487999, |     "effectiveUnixTimestamp": 1735487999, | ||||||
|     "actorCsvPath": "/home/tt/.config/joj/students.csv", |     "actorCsvPath": "/home/tt/.config/joj/students.csv", | ||||||
|     "maxTotalScore": 100, |     "maxTotalScore": 10245871, | ||||||
| 
					
					jon-lee marked this conversation as resolved
					
				 | |||||||
|     "stage": { |     "stage": { | ||||||
|         "sandboxExecServer": "172.17.0.1:5051", |         "sandboxExecServer": "172.17.0.1:5051", | ||||||
|         "sandboxToken": "test", |         "sandboxToken": "test", | ||||||
|  | @ -76,7 +76,7 @@ | ||||||
|                                     "--grading-repo-name", |                                     "--grading-repo-name", | ||||||
|                                     "ece280-joj", |                                     "ece280-joj", | ||||||
|                                     "--group-config", |                                     "--group-config", | ||||||
|                                     "joj=1000:24,run=1000:24" |                                     "Manuel=500:24,Boming=501:48,Nuvole=502:72" | ||||||
|                                 ], |                                 ], | ||||||
|                                 "env": [ |                                 "env": [ | ||||||
|                                     "LOG_FILE_PATH=/home/tt/.cache/joint-teapot-debug.log" |                                     "LOG_FILE_PATH=/home/tt/.cache/joint-teapot-debug.log" | ||||||
|  | @ -798,7 +798,7 @@ | ||||||
|                                 "--grading-repo-name", |                                 "--grading-repo-name", | ||||||
|                                 "ece280-joj", |                                 "ece280-joj", | ||||||
|                                 "--max-total-score", |                                 "--max-total-score", | ||||||
|                                 "100" |                                 "10245871" | ||||||
|                             ], |                             ], | ||||||
|                             "env": [ |                             "env": [ | ||||||
|                                 "LOG_FILE_PATH=/home/tt/.cache/joint-teapot-debug.log" |                                 "LOG_FILE_PATH=/home/tt/.cache/joint-teapot-debug.log" | ||||||
|  |  | ||||||
|  | @ -1,9 +1,15 @@ | ||||||
| # general task configuration | # general task configuration | ||||||
| task.name = "hw7 ex2" # task name | task.name = "hw7 ex2" # task name | ||||||
| 
 | 
 | ||||||
|  | max-total-score = 10245871 | ||||||
| release.end-time = 2024-12-30 23:59:59+08:00 | release.end-time = 2024-12-30 23:59:59+08:00 | ||||||
| release.begin-time = 2024-12-29 23:59:59+08:00 | release.begin-time = 2024-12-29 23:59:59+08:00 | ||||||
| 
 | 
 | ||||||
|  | [groups] | ||||||
|  | name = ["Manuel", "Boming", "Nuvole"] | ||||||
|  | max-count = [500, 501, 502] | ||||||
|  | time-period-hour = [24, 48, 72] | ||||||
|  | 
 | ||||||
| [[stages]] | [[stages]] | ||||||
| name = "Compilation" | name = "Compilation" | ||||||
| env = [ "CC=clang", "CXX=clang++" ] | env = [ "CC=clang", "CXX=clang++" ] | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	
@bomingzh is this already outdated? Shall I remove it?
what?
oh, my bad, the other one is for giving message to
teapot😃