importtime# bien que non utilisé dans la fonction utilisé par les workers .. il le faut .. sinon le callcak n'est pas appélé !!! (histoire de gestion des timeout)
importos,re
importpyessv
frompyessvimportTemplateParsingError
fromvocabularyimportVOCAB
fromglobimportiglob
frompathlibimportPath
fromTimeRangeimportTimeRange
fromlockfileimportLockFile
fromshutilimportrmtree
fromjinja2importTemplate
importargparse
# 1/ on recup les fichiers via glob
# 2/ on les passe à essv (anciennement fait avec pCMIP6) pour les valider et extraire les infos du path pour le catalogue
# 3/ on Cree/MAJ les cat ESM à la granularité ? choisie ?
# 4/ on passe les cat ESM au validateur de intake-esm
classDRS():
def__init__(self,project):
# Get DRS collections.
self.project=project
self.dir_drs=VOCAB[project]['directory_format']
self.file_drs=VOCAB[project]['filename_format']
#print(self.project,self.dir_drs,self.file_drs)
#print(self.file_drs)
# Add time range collection.
time_range=pyessv.create_collection(
pyessv.load('wcrp:{}'.format(project)),
"time_range",
description="Time Range",
term_regex=r'[0-9]+\-[0-9]+'
)
# Override version collection with "latest" pattern.
# * dans quel catalogue (csv) placer le path et les facets et le flag
#
# Au final :
# * append => "a+" le path et les facets et le flag" dans le bon catalogue
#
# Défaut assumé:
# * le catalogue ne sera pas valide tant qu'on aura pas le header dans les csv et créé le json qui décrit mieux chaque colonne
# ces 2 traitements seront fait quand tous les fichiers csv seront créés de façon unitaire par cette fonction en parallele
#filepath exemple : /gpfscmip/gpfsdata/esgf/CMIP6/PMIP/CAS/FGOALS-f3-L/lig127k/r1i1p1f1/day/vas/gr/v20191025/vas_day_FGOALS-f3-L_lig127k_r1i1p1f1_gr_11900101-11991231.nc latest
#########################
# la path vu par ciclad : ET : derniere version ou pas => flag latest
#########################
path,flagLatest=filepath.split(" ")# on sépare le path et le flag "latest"
#TEMP pour le test
#
#
#print("START")
#ft0 = time.time()
#path = filepath
#flagLatest = "1"
#p = Path(filepath[1:]).relative_to(root) # le [1:] juste pour virer le "/" de départ pour que ça soit plus facile pour décoder le path en facets
p=Path(filepath[1:])# le [1:] juste pour virer le "/" de départ pour que ça soit plus facile pour décoder le path en facets
pathFromCiclad=os.path.join("/bdd",p)
#print(path,flagLatest,pathFromCiclad)
#ft1 = time.time()
#########################
# les facets qui correspondent à ce path :
#########################
#ft1 = time.time()
#print("1:",ft1-ft0)
#drs = DRS(project)
#print("DECODE_PATH")
facets=drs.getFacetsFromPath(p)
# Maybe check if there are good ?
# print("A PRIORI ON A DES FACETS ")
# print(facets)
#########################
# dans quel catalogue (csv) placer le path et les facets et le flag
#########################
#ft2 = time.time()
#print("2:",ft2-ft1)
# le catalogue est situé dans /modfs/catalog/"project"/
# son nom dépend des facets et de la granulité choisie:
# exemple pour une gran à "l'experiment_id" : CMIP6_PMIP_CAS_FGOALS-f3-L_lig127k_catalog.csv
parser=argparse.ArgumentParser(description="Script which create an esm catalog (json+csv) from netcdf files in sub-directories from the 'root' dir and put the catalog into 'out_cat' directory using vocabulary as validator from 'project' CV and DRS")
parser.add_argument("project",help="could be CMIP6, CMIP5 , CORDEX",type=str)
parser.add_argument("root",help="root path to scan in order to get an esm cat",type=str)
parser.add_argument("gran",help="granularite where to start scan AND also path of output catalog",type=str)
#pathDesFichiers = "FakeDir/CMIP6_paths.csv" #<= ici les mega fichiers seront dans modf => 1 pour le TGCC ,1 pour l'IDRISS après avoir fait tourner le "super find bash"
pathDesFichiers="bdd/CMIP6/C4MIP/MOHC/.paths.txt"#<= ici les mega fichiers seront dans modf => 1 pour le TGCC ,1 pour l'IDRISS après avoir fait tourner le "super find bash"