7575
7676AUTO_IMPORT_JOB_STAGE = "auto-import-job-stage"
7777AUTO_IMPORT_JOB_STATUS = "auto-import-job-status"
78+ IMPORT_SUMMARY_FILE = "import_summary.json"
79+ STAGING_PATH = "staging"
7880
7981
8082class ImportStatus (Enum ):
@@ -129,6 +131,7 @@ class ImportStatusSummary:
129131 latest_version : str = ''
130132 execution_time : int = 0 # seconds
131133 data_volume : int = 0 # bytes
134+ job_id : str = ''
132135 next_refresh : datetime = None
133136 """Holds a set of monitoring stats for an import."""
134137 import_stats : dict = dataclasses .field (default_factory = dict )
@@ -794,11 +797,9 @@ def _update_import_status_table(
794797 ]
795798 values = [
796799 import_summary .import_name , import_summary .status .name ,
797- os .getenv ('BATCH_JOB_NAME' ,
798- os .getenv ('BATCH_JOB_UID' , 'local-run' )),
799- import_summary .execution_time , import_summary .data_volume ,
800- spanner .COMMIT_TIMESTAMP , import_summary .next_refresh ,
801- import_summary .latest_version
800+ import_summary .job_id , import_summary .execution_time ,
801+ import_summary .data_volume , spanner .COMMIT_TIMESTAMP ,
802+ import_summary .next_refresh , import_summary .latest_version
802803 ]
803804 # Update import timestamp only if import completed successfully.
804805 if import_summary .status == ImportStatus .READY :
@@ -813,15 +814,22 @@ def _update_import_status_table(
813814
814815 def _update_latest_version (self , version , output_dir , import_spec ,
815816 import_summary ):
817+ if self .config .skip_gcs_upload :
818+ logging .warning (
819+ "Skipping latest version update as per import config." )
820+ return
816821 logging .info (f'Updating import latest version { version } ' )
817822 self .uploader .upload_string (
818823 version ,
819824 os .path .join (output_dir , self .config .storage_version_filename ))
820825 self .uploader .upload_string (
821826 self ._import_metadata_mcf_helper (import_spec ),
822827 os .path .join (output_dir , self .config .import_metadata_mcf_filename ))
828+ self .uploader .upload_string (
829+ json .dumps (dataclasses .asdict (import_summary ), default = str ),
830+ os .path .join (output_dir , IMPORT_SUMMARY_FILE ))
831+ # Add current version to the history of versions if import was successful.
823832 if self .config .storage_version_history_filename :
824- # Add current version to the history of versions.
825833 history_filename = os .path .join (
826834 output_dir , self .config .storage_version_history_filename )
827835 versions_history = [version ]
@@ -847,7 +855,11 @@ def _import_one_helper(
847855 """
848856 start_time = time .time ()
849857 import_name = import_spec ['import_name' ]
850- import_summary = ImportStatusSummary (import_name = import_name )
858+ job_id = os .getenv ('BATCH_JOB_NAME' ,
859+ os .getenv ('BATCH_JOB_UID' , 'local-run' ))
860+ import_summary = ImportStatusSummary (import_name = import_name ,
861+ job_id = job_id )
862+
851863 self .counters .add_counter (f'import-{ import_name } ' , 1 )
852864 urls = import_spec .get ('data_download_url' )
853865 if urls :
@@ -935,19 +947,22 @@ def _import_one_helper(
935947 import_summary .import_stats .get ('mcf_data_size' , 0 ) +
936948 import_summary .import_stats .get ('validation_data_size' , 0 ))
937949 logging .info (import_summary )
950+ self .uploader .upload_string (
951+ json .dumps (dataclasses .asdict (import_summary ), default = str ),
952+ os .path .join (output_dir , version , IMPORT_SUMMARY_FILE ))
953+
938954 if self .config .ignore_validation_status or validation_status :
939955 import_summary .status = ImportStatus .READY
940- if not self .config .skip_gcs_upload :
941- self ._update_latest_version (version , output_dir ,
942- import_spec , import_summary )
943- else :
944- logging .warning (
945- "Skipping latest version update as per import config." )
946956 else :
947957 logging .error (
948- "Skipping latest version update due to validation failure." )
958+ "Staging latest version update due to validation failure." )
949959 import_summary .status = ImportStatus .VALIDATION
950- self ._update_import_status_table (import_summary )
960+
961+ # Update version and metadata files in staging folder for failed imports
962+ version_dir = output_dir if import_summary .status == ImportStatus .READY else os .path .join (
963+ output_dir , STAGING_PATH )
964+ self ._update_latest_version (version , version_dir , import_spec ,
965+ import_summary )
951966
952967 if self .importer :
953968 self .importer .delete_previous_output (relative_import_dir ,
0 commit comments