@@ -48,6 +48,8 @@ def generate_job_request(
4848 memory_mb : Optional [int ] = None ,
4949 queue : Optional [str ] = None ,
5050 allocation : Optional [str ] = None ,
51+ archive_system : Optional [str ] = None ,
52+ archive_path : Optional [str ] = None ,
5153 extra_file_inputs : Optional [List [Dict [str , Any ]]] = None ,
5254 extra_app_args : Optional [List [Dict [str , Any ]]] = None ,
5355 extra_env_vars : Optional [List [Dict [str , Any ]]] = None ,
@@ -78,6 +80,11 @@ def generate_job_request(
7880 memory_mb (int, optional): Memory in MB. Overrides app default.
7981 queue (str, optional): Execution queue name. Overrides app default.
8082 allocation (str, optional): TACC allocation to charge for compute time.
83+ archive_system (str, optional): Archive system for job outputs. If "designsafe" is specified,
84+ uses "designsafe.storage.default". If None, uses app default.
85+ archive_path (str, optional): Archive directory path. Can be a full path or just a directory name
86+ in MyData (e.g., "tapis-jobs-archive"). If None and archive_system is "designsafe",
87+ defaults to "${EffectiveUserId}/tapis-jobs-archive/${JobCreateDate}/${JobUUID}".
8188 extra_file_inputs (List[Dict[str, Any]], optional): Additional file inputs beyond the main input directory.
8289 extra_app_args (List[Dict[str, Any]], optional): Additional application arguments.
8390 extra_env_vars (List[Dict[str, Any]], optional): Additional environment variables.
@@ -128,13 +135,44 @@ def generate_job_request(
128135 final_description = (
129136 description or app_details .description or f"dapi job for { app_details .id } "
130137 )
138+
139+ # Handle archive system configuration
140+ archive_system_id = None
141+ archive_system_dir = None
142+
143+ if archive_system :
144+ if archive_system .lower () == "designsafe" :
145+ archive_system_id = "designsafe.storage.default"
146+ # Handle archive path configuration
147+ if archive_path :
148+ # Check if it's a full path or just a directory name
149+ if archive_path .startswith ("/" ) or archive_path .startswith ("${" ):
150+ # Full path provided
151+ archive_system_dir = archive_path
152+ else :
153+ # Directory name provided, construct the full path
154+ archive_system_dir = f"${{EffectiveUserId}}/{ archive_path } /${{JobCreateDate}}/${{JobUUID}}"
155+ else :
156+ # Default path for DesignSafe
157+ archive_system_dir = "${EffectiveUserId}/tapis-jobs-archive/${JobCreateDate}/${JobUUID}"
158+ else :
159+ # Use the provided archive system as-is
160+ archive_system_id = archive_system
161+ if archive_path :
162+ archive_system_dir = archive_path
163+ else :
164+ # Use app defaults
165+ archive_system_id = getattr (job_attrs , "archiveSystemId" , None )
166+ archive_system_dir = getattr (job_attrs , "archiveSystemDir" , None )
167+
131168 job_req = {
132169 "name" : final_job_name ,
133170 "appId" : app_details .id ,
134171 "appVersion" : final_app_version ,
135172 "description" : final_description ,
136173 "execSystemId" : getattr (job_attrs , "execSystemId" , None ),
137- "archiveSystemId" : getattr (job_attrs , "archiveSystemId" , None ),
174+ "archiveSystemId" : archive_system_id ,
175+ ** ({"archiveSystemDir" : archive_system_dir } if archive_system_dir else {}),
138176 "archiveOnAppError" : getattr (job_attrs , "archiveOnAppError" , True ),
139177 "execSystemLogicalQueue" : queue
140178 if queue is not None
0 commit comments