Regression #200
14 fail, 2 skipped, 556 pass in 48m 1s
572 tests 556 ✅ 48m 1s ⏱️
1 suites 2 💤
1 files 14 ❌
Results for commit 84dd9fa.
Annotations
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_spatial_subset[C2799465428-POCLOUD] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 23s]
Raw output
Failed: No data in lon and lat
collection_concept_id = 'C2799465428-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2799465428-POCLOUD', 'concept-id': 'G3368035623-POCLOUD', 'concept-type': 'granul...110T235513_PIC2_01.nc', 'SWOT_L2_LR_PreCalSSH_WindWave_026_508_20250110T233006_20250110T233006_PIC2_01.nc', ...], ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2799465428-POCLOUD'}]}, 'meta': {'association-details': {'collecti...pixels', 'Size': 69, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': 2147483647}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw7/test_spatial_subset_C2799465420')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_spatial = set()
@pytest.mark.timeout(1200)
def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_spatial):
test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_spatial:
pytest.skip(f"Known collection to skip for spatial testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
# Compute a box that is smaller than the granule extent bounding box
north, south, east, west = get_bounding_box(granule_json)
east, west, north, south = create_smaller_bounding_box(east, west, north, south, .95)
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_bbox = harmony.BBox(w=west, s=south, e=east, n=north)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection, spatial=request_bbox,
granule_id=[granule_json['meta']['concept-id']])
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
harmony_client.wait_for_processing(job_id, show_progress=False)
subsetted_filepath = None
for filename in [file_future.result()
for file_future
in harmony_client.download_all(job_id, directory=f'{tmp_path}', overwrite=True)]:
logging.info(f'Downloaded: %s', filename)
subsetted_filepath = pathlib.Path(filename)
# Verify spatial subset worked
subsetted_ds = xarray.open_dataset(subsetted_filepath, decode_times=False)
group = None
# Try to read group in file
lat_var_name, lon_var_name = get_lat_lon_var_names(subsetted_ds, subsetted_filepath, collection_variables, collection_concept_id)
lat_var_name = lat_var_name.split('/')[-1]
lon_var_name = lon_var_name.split('/')[-1]
subsetted_ds_new = walk_netcdf_groups(subsetted_filepath, lat_var_name)
assert lat_var_name and lon_var_name
var_ds = None
msk = None
science_vars = get_science_vars(collection_variables)
if science_vars:
for var in science_vars:
science_var_name = var['umm']['Name']
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
else:
for science_var_name in subsetted_ds_new.variables:
if (str(science_var_name) not in lat_var_name and
str(science_var_name) not in lon_var_name and
'time' not in str(science_var_name)):
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
if var_ds is None or msk is None:
pytest.fail("Unable to find variable from umm-v to use as science variable.")
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
llat = subsetted_ds_new[lat_var_name].where(msk)
llon = subsetted_ds_new[lon_var_name].where(msk)
except ValueError:
llat = subsetted_ds_new[lat_var_name]
llon = subsetted_ds_new[lon_var_name]
lat_max = llat.max()
lat_min = llat.min()
lon_min = llon.min()
lon_max = llon.max()
lon_min = (lon_min + 180) % 360 - 180
lon_max = (lon_max + 180) % 360 - 180
lat_var_fill_value = subsetted_ds_new[lat_var_name].encoding.get('_FillValue')
lon_var_fill_value = subsetted_ds_new[lon_var_name].encoding.get('_FillValue')
partial_pass = False
if lat_var_fill_value:
if (lat_max <= north or np.isclose(lat_max, north)) and (lat_min >= south or np.isclose(lat_min, south)):
logging.info("Successful Latitude subsetting")
elif np.isnan(lat_max) and np.isnan(lat_min):
logging.info("Partial Lat Success - no Data")
partial_pass = True
else:
assert False
if lon_var_fill_value:
if (lon_max <= east or np.isclose(lon_max, east)) and (lon_min >= west or np.isclose(lon_min, west)):
logging.info("Successful Longitude subsetting")
elif np.isnan(lon_max) and np.isnan(lon_min):
logging.info("Partial Lon Success - no Data")
partial_pass = True
else:
assert False
if partial_pass:
valid_lon = np.isfinite(llon) & (llon != lon_var_fill_value)
valid_lat = np.isfinite(llat) & (llat != lat_var_fill_value)
if not np.any(valid_lon) or not np.any(valid_lat):
> pytest.fail("No data in lon and lat")
E Failed: No data in lon and lat
verify_collection.py:562: Failed
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:441 Using granule G3368035623-POCLOUD for test
INFO root:verify_collection.py:457 Sending harmony request https://harmony.earthdata.nasa.gov/C2799465428-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-74.19477398455001%3A74.32775380654999%29&subset=lon%2817.414576278650003%3A168.69634153335%29&granuleId=G3368035623-POCLOUD&variable=all
INFO root:verify_collection.py:461 Submitted harmony job 754920ee-199b-4243-bda9-17187751d5dd
INFO root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw7/test_spatial_subset_C2799465420/88080797_SWOT_L2_LR_SSH_Basic_026_508_20250110T233006_20250110T233006_PIC2_01_subsetted.nc4
WARNING root:verify_collection.py:314 Unable to find lat/lon vars in UMM-Var
INFO root:verify_collection.py:543 Partial Lat Success - no Data
INFO root:verify_collection.py:552 Partial Lon Success - no Data
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_spatial_subset[C1693440798-GES_DISC] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 50s]
Raw output
Failed: No data in lon and lat
collection_concept_id = 'C1693440798-GES_DISC', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C1693440798-GES_DISC', 'concept-id': 'G2031458814-GES_DISC', 'concept-type': 'gran...pecification': {'Name': 'UMM-G', 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.6', 'Version': '1.6.6'}, ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C1693440798-GES_DISC'}]}, 'meta': {'association-details': {'collect...RL': 'https://cdn.earthdata.nasa.gov/umm/variable/v1.9.0', 'Version': '1.9.0'}, 'Name': 'aux/fg_surf_temp', ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw9/test_spatial_subset_C1693440790')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_spatial = set()
@pytest.mark.timeout(1200)
def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_spatial):
test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_spatial:
pytest.skip(f"Known collection to skip for spatial testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
# Compute a box that is smaller than the granule extent bounding box
north, south, east, west = get_bounding_box(granule_json)
east, west, north, south = create_smaller_bounding_box(east, west, north, south, .95)
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_bbox = harmony.BBox(w=west, s=south, e=east, n=north)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection, spatial=request_bbox,
granule_id=[granule_json['meta']['concept-id']])
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
harmony_client.wait_for_processing(job_id, show_progress=False)
subsetted_filepath = None
for filename in [file_future.result()
for file_future
in harmony_client.download_all(job_id, directory=f'{tmp_path}', overwrite=True)]:
logging.info(f'Downloaded: %s', filename)
subsetted_filepath = pathlib.Path(filename)
# Verify spatial subset worked
subsetted_ds = xarray.open_dataset(subsetted_filepath, decode_times=False)
group = None
# Try to read group in file
lat_var_name, lon_var_name = get_lat_lon_var_names(subsetted_ds, subsetted_filepath, collection_variables, collection_concept_id)
lat_var_name = lat_var_name.split('/')[-1]
lon_var_name = lon_var_name.split('/')[-1]
subsetted_ds_new = walk_netcdf_groups(subsetted_filepath, lat_var_name)
assert lat_var_name and lon_var_name
var_ds = None
msk = None
science_vars = get_science_vars(collection_variables)
if science_vars:
for var in science_vars:
science_var_name = var['umm']['Name']
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
else:
for science_var_name in subsetted_ds_new.variables:
if (str(science_var_name) not in lat_var_name and
str(science_var_name) not in lon_var_name and
'time' not in str(science_var_name)):
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
if var_ds is None or msk is None:
pytest.fail("Unable to find variable from umm-v to use as science variable.")
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
llat = subsetted_ds_new[lat_var_name].where(msk)
llon = subsetted_ds_new[lon_var_name].where(msk)
except ValueError:
llat = subsetted_ds_new[lat_var_name]
llon = subsetted_ds_new[lon_var_name]
lat_max = llat.max()
lat_min = llat.min()
lon_min = llon.min()
lon_max = llon.max()
lon_min = (lon_min + 180) % 360 - 180
lon_max = (lon_max + 180) % 360 - 180
lat_var_fill_value = subsetted_ds_new[lat_var_name].encoding.get('_FillValue')
lon_var_fill_value = subsetted_ds_new[lon_var_name].encoding.get('_FillValue')
partial_pass = False
if lat_var_fill_value:
if (lat_max <= north or np.isclose(lat_max, north)) and (lat_min >= south or np.isclose(lat_min, south)):
logging.info("Successful Latitude subsetting")
elif np.isnan(lat_max) and np.isnan(lat_min):
logging.info("Partial Lat Success - no Data")
partial_pass = True
else:
assert False
if lon_var_fill_value:
if (lon_max <= east or np.isclose(lon_max, east)) and (lon_min >= west or np.isclose(lon_min, west)):
logging.info("Successful Longitude subsetting")
elif np.isnan(lon_max) and np.isnan(lon_min):
logging.info("Partial Lon Success - no Data")
partial_pass = True
else:
assert False
if partial_pass:
valid_lon = np.isfinite(llon) & (llon != lon_var_fill_value)
valid_lat = np.isfinite(llat) & (llat != lat_var_fill_value)
if not np.any(valid_lon) or not np.any(valid_lat):
> pytest.fail("No data in lon and lat")
E Failed: No data in lon and lat
verify_collection.py:562: Failed
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:441 Using granule G2031458814-GES_DISC for test
INFO root:verify_collection.py:457 Sending harmony request https://harmony.earthdata.nasa.gov/C1693440798-GES_DISC/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-83.56275%3A-58.96725%29&subset=lon%28-95.82525000000001%3A-25.344750000000005%29&granuleId=G2031458814-GES_DISC&variable=all
INFO root:verify_collection.py:461 Submitted harmony job 3d51f9f2-b36c-400b-93c6-bb6c1f9b9f98
INFO root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw9/test_spatial_subset_C1693440790/88080852_SNDR.AQUA.AIRS_IM.20160925T0317.m06.g033.L2_CLIMCAPS_RET.std.v02_39.G.210408174412_subsetted.nc4
WARNING root:verify_collection.py:314 Unable to find lat/lon vars in UMM-Var
INFO root:verify_collection.py:543 Partial Lat Success - no Data
INFO root:verify_collection.py:552 Partial Lon Success - no Data
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_spatial_subset[C1729925806-GES_DISC] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 23s]
Raw output
assert False
collection_concept_id = 'C1729925806-GES_DISC', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C1729925806-GES_DISC', 'concept-id': 'G3368200224-GES_DISC', 'concept-type': 'gran...pecification': {'Name': 'UMM-G', 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.6', 'Version': '1.6.6'}, ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C1729925806-GES_DISC'}]}, 'meta': {'association-details': {'collect...': [{'Type': 'SCIENCE_FILLVALUE', 'Value': 513}], 'LongName': 'HDFEOS/SWATHS/O3 column/Data Fields/Status', ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw7/test_spatial_subset_C1729925800')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_spatial = set()
@pytest.mark.timeout(1200)
def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_spatial):
test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_spatial:
pytest.skip(f"Known collection to skip for spatial testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
# Compute a box that is smaller than the granule extent bounding box
north, south, east, west = get_bounding_box(granule_json)
east, west, north, south = create_smaller_bounding_box(east, west, north, south, .95)
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_bbox = harmony.BBox(w=west, s=south, e=east, n=north)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection, spatial=request_bbox,
granule_id=[granule_json['meta']['concept-id']])
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
harmony_client.wait_for_processing(job_id, show_progress=False)
subsetted_filepath = None
for filename in [file_future.result()
for file_future
in harmony_client.download_all(job_id, directory=f'{tmp_path}', overwrite=True)]:
logging.info(f'Downloaded: %s', filename)
subsetted_filepath = pathlib.Path(filename)
# Verify spatial subset worked
subsetted_ds = xarray.open_dataset(subsetted_filepath, decode_times=False)
group = None
# Try to read group in file
lat_var_name, lon_var_name = get_lat_lon_var_names(subsetted_ds, subsetted_filepath, collection_variables, collection_concept_id)
lat_var_name = lat_var_name.split('/')[-1]
lon_var_name = lon_var_name.split('/')[-1]
subsetted_ds_new = walk_netcdf_groups(subsetted_filepath, lat_var_name)
assert lat_var_name and lon_var_name
var_ds = None
msk = None
science_vars = get_science_vars(collection_variables)
if science_vars:
for var in science_vars:
science_var_name = var['umm']['Name']
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
else:
for science_var_name in subsetted_ds_new.variables:
if (str(science_var_name) not in lat_var_name and
str(science_var_name) not in lon_var_name and
'time' not in str(science_var_name)):
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
if var_ds is None or msk is None:
pytest.fail("Unable to find variable from umm-v to use as science variable.")
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
llat = subsetted_ds_new[lat_var_name].where(msk)
llon = subsetted_ds_new[lon_var_name].where(msk)
except ValueError:
llat = subsetted_ds_new[lat_var_name]
llon = subsetted_ds_new[lon_var_name]
lat_max = llat.max()
lat_min = llat.min()
lon_min = llon.min()
lon_max = llon.max()
lon_min = (lon_min + 180) % 360 - 180
lon_max = (lon_max + 180) % 360 - 180
lat_var_fill_value = subsetted_ds_new[lat_var_name].encoding.get('_FillValue')
lon_var_fill_value = subsetted_ds_new[lon_var_name].encoding.get('_FillValue')
partial_pass = False
if lat_var_fill_value:
if (lat_max <= north or np.isclose(lat_max, north)) and (lat_min >= south or np.isclose(lat_min, south)):
logging.info("Successful Latitude subsetting")
elif np.isnan(lat_max) and np.isnan(lat_min):
logging.info("Partial Lat Success - no Data")
partial_pass = True
else:
assert False
if lon_var_fill_value:
if (lon_max <= east or np.isclose(lon_max, east)) and (lon_min >= west or np.isclose(lon_min, west)):
logging.info("Successful Longitude subsetting")
elif np.isnan(lon_max) and np.isnan(lon_min):
logging.info("Partial Lon Success - no Data")
partial_pass = True
else:
> assert False
E assert False
verify_collection.py:555: AssertionError
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:441 Using granule G3368200224-GES_DISC for test
INFO root:verify_collection.py:457 Sending harmony request https://harmony.earthdata.nasa.gov/C1729925806-GES_DISC/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-85.5%3A85.5%29&subset=lon%28-171.0%3A171.0%29&granuleId=G3368200224-GES_DISC&variable=all
INFO root:verify_collection.py:461 Submitted harmony job b387c70b-c15b-49f9-afb6-a4a315734918
INFO root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw7/test_spatial_subset_C1729925800/88080875_MLS-Aura_L2GP-O3_v05-03-c01_2025d010_subsetted.nc4
INFO root:verify_collection.py:541 Successful Latitude subsetting
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_spatial_subset[C2799465503-POCLOUD] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 44s]
Raw output
Failed: No data in lon and lat
collection_concept_id = 'C2799465503-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2799465503-POCLOUD', 'concept-id': 'G3368035701-POCLOUD', 'concept-type': 'granul...110T235513_PIC2_01.nc', 'SWOT_L2_LR_PreCalSSH_WindWave_026_508_20250110T233006_20250110T233006_PIC2_01.nc', ...], ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2799465503-POCLOUD'}]}, 'meta': {'association-details': {'collecti...ixels', 'Size': 240, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': 2147483647}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw3/test_spatial_subset_C2799465500')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_spatial = set()
@pytest.mark.timeout(1200)
def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_spatial):
test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_spatial:
pytest.skip(f"Known collection to skip for spatial testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
# Compute a box that is smaller than the granule extent bounding box
north, south, east, west = get_bounding_box(granule_json)
east, west, north, south = create_smaller_bounding_box(east, west, north, south, .95)
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_bbox = harmony.BBox(w=west, s=south, e=east, n=north)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection, spatial=request_bbox,
granule_id=[granule_json['meta']['concept-id']])
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
harmony_client.wait_for_processing(job_id, show_progress=False)
subsetted_filepath = None
for filename in [file_future.result()
for file_future
in harmony_client.download_all(job_id, directory=f'{tmp_path}', overwrite=True)]:
logging.info(f'Downloaded: %s', filename)
subsetted_filepath = pathlib.Path(filename)
# Verify spatial subset worked
subsetted_ds = xarray.open_dataset(subsetted_filepath, decode_times=False)
group = None
# Try to read group in file
lat_var_name, lon_var_name = get_lat_lon_var_names(subsetted_ds, subsetted_filepath, collection_variables, collection_concept_id)
lat_var_name = lat_var_name.split('/')[-1]
lon_var_name = lon_var_name.split('/')[-1]
subsetted_ds_new = walk_netcdf_groups(subsetted_filepath, lat_var_name)
assert lat_var_name and lon_var_name
var_ds = None
msk = None
science_vars = get_science_vars(collection_variables)
if science_vars:
for var in science_vars:
science_var_name = var['umm']['Name']
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
else:
for science_var_name in subsetted_ds_new.variables:
if (str(science_var_name) not in lat_var_name and
str(science_var_name) not in lon_var_name and
'time' not in str(science_var_name)):
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
if var_ds is None or msk is None:
pytest.fail("Unable to find variable from umm-v to use as science variable.")
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
llat = subsetted_ds_new[lat_var_name].where(msk)
llon = subsetted_ds_new[lon_var_name].where(msk)
except ValueError:
llat = subsetted_ds_new[lat_var_name]
llon = subsetted_ds_new[lon_var_name]
lat_max = llat.max()
lat_min = llat.min()
lon_min = llon.min()
lon_max = llon.max()
lon_min = (lon_min + 180) % 360 - 180
lon_max = (lon_max + 180) % 360 - 180
lat_var_fill_value = subsetted_ds_new[lat_var_name].encoding.get('_FillValue')
lon_var_fill_value = subsetted_ds_new[lon_var_name].encoding.get('_FillValue')
partial_pass = False
if lat_var_fill_value:
if (lat_max <= north or np.isclose(lat_max, north)) and (lat_min >= south or np.isclose(lat_min, south)):
logging.info("Successful Latitude subsetting")
elif np.isnan(lat_max) and np.isnan(lat_min):
logging.info("Partial Lat Success - no Data")
partial_pass = True
else:
assert False
if lon_var_fill_value:
if (lon_max <= east or np.isclose(lon_max, east)) and (lon_min >= west or np.isclose(lon_min, west)):
logging.info("Successful Longitude subsetting")
elif np.isnan(lon_max) and np.isnan(lon_min):
logging.info("Partial Lon Success - no Data")
partial_pass = True
else:
assert False
if partial_pass:
valid_lon = np.isfinite(llon) & (llon != lon_var_fill_value)
valid_lat = np.isfinite(llat) & (llat != lat_var_fill_value)
if not np.any(valid_lon) or not np.any(valid_lat):
> pytest.fail("No data in lon and lat")
E Failed: No data in lon and lat
verify_collection.py:562: Failed
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:441 Using granule G3368035701-POCLOUD for test
INFO root:verify_collection.py:457 Sending harmony request https://harmony.earthdata.nasa.gov/C2799465503-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-74.19477398455001%3A74.32775380654999%29&subset=lon%2817.414576278650003%3A168.69634153335%29&granuleId=G3368035701-POCLOUD&variable=all
INFO root:verify_collection.py:461 Submitted harmony job bafcba50-2323-48cd-8e25-9e9ec5b5b9b5
INFO root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw3/test_spatial_subset_C2799465500/88080881_SWOT_L2_LR_SSH_Unsmoothed_026_508_20250110T230425_20250110T235513_PIC2_01.nc4
WARNING root:verify_collection.py:314 Unable to find lat/lon vars in UMM-Var
WARNING root:verify_collection.py:324 Unable to find lat/lon vars using cf_xarray
INFO root:verify_collection.py:543 Partial Lat Success - no Data
INFO root:verify_collection.py:552 Partial Lon Success - no Data
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_spatial_subset[C2799465497-POCLOUD] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 39s]
Raw output
Failed: No data in lon and lat
collection_concept_id = 'C2799465497-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2799465497-POCLOUD', 'concept-id': 'G3368035686-POCLOUD', 'concept-type': 'granul...110T235513_PIC2_01.nc', 'SWOT_L2_LR_PreCalSSH_WindWave_026_508_20250110T233006_20250110T233006_PIC2_01.nc', ...], ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2799465497-POCLOUD'}]}, 'meta': {'association-details': {'collecti...'num_pixels', 'Size': 69, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': 32767}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw8/test_spatial_subset_C2799465490')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_spatial = set()
@pytest.mark.timeout(1200)
def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_spatial):
test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_spatial:
pytest.skip(f"Known collection to skip for spatial testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
# Compute a box that is smaller than the granule extent bounding box
north, south, east, west = get_bounding_box(granule_json)
east, west, north, south = create_smaller_bounding_box(east, west, north, south, .95)
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_bbox = harmony.BBox(w=west, s=south, e=east, n=north)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection, spatial=request_bbox,
granule_id=[granule_json['meta']['concept-id']])
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
harmony_client.wait_for_processing(job_id, show_progress=False)
subsetted_filepath = None
for filename in [file_future.result()
for file_future
in harmony_client.download_all(job_id, directory=f'{tmp_path}', overwrite=True)]:
logging.info(f'Downloaded: %s', filename)
subsetted_filepath = pathlib.Path(filename)
# Verify spatial subset worked
subsetted_ds = xarray.open_dataset(subsetted_filepath, decode_times=False)
group = None
# Try to read group in file
lat_var_name, lon_var_name = get_lat_lon_var_names(subsetted_ds, subsetted_filepath, collection_variables, collection_concept_id)
lat_var_name = lat_var_name.split('/')[-1]
lon_var_name = lon_var_name.split('/')[-1]
subsetted_ds_new = walk_netcdf_groups(subsetted_filepath, lat_var_name)
assert lat_var_name and lon_var_name
var_ds = None
msk = None
science_vars = get_science_vars(collection_variables)
if science_vars:
for var in science_vars:
science_var_name = var['umm']['Name']
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
else:
for science_var_name in subsetted_ds_new.variables:
if (str(science_var_name) not in lat_var_name and
str(science_var_name) not in lon_var_name and
'time' not in str(science_var_name)):
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
if var_ds is None or msk is None:
pytest.fail("Unable to find variable from umm-v to use as science variable.")
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
llat = subsetted_ds_new[lat_var_name].where(msk)
llon = subsetted_ds_new[lon_var_name].where(msk)
except ValueError:
llat = subsetted_ds_new[lat_var_name]
llon = subsetted_ds_new[lon_var_name]
lat_max = llat.max()
lat_min = llat.min()
lon_min = llon.min()
lon_max = llon.max()
lon_min = (lon_min + 180) % 360 - 180
lon_max = (lon_max + 180) % 360 - 180
lat_var_fill_value = subsetted_ds_new[lat_var_name].encoding.get('_FillValue')
lon_var_fill_value = subsetted_ds_new[lon_var_name].encoding.get('_FillValue')
partial_pass = False
if lat_var_fill_value:
if (lat_max <= north or np.isclose(lat_max, north)) and (lat_min >= south or np.isclose(lat_min, south)):
logging.info("Successful Latitude subsetting")
elif np.isnan(lat_max) and np.isnan(lat_min):
logging.info("Partial Lat Success - no Data")
partial_pass = True
else:
assert False
if lon_var_fill_value:
if (lon_max <= east or np.isclose(lon_max, east)) and (lon_min >= west or np.isclose(lon_min, west)):
logging.info("Successful Longitude subsetting")
elif np.isnan(lon_max) and np.isnan(lon_min):
logging.info("Partial Lon Success - no Data")
partial_pass = True
else:
assert False
if partial_pass:
valid_lon = np.isfinite(llon) & (llon != lon_var_fill_value)
valid_lat = np.isfinite(llat) & (llat != lat_var_fill_value)
if not np.any(valid_lon) or not np.any(valid_lat):
> pytest.fail("No data in lon and lat")
E Failed: No data in lon and lat
verify_collection.py:562: Failed
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:441 Using granule G3368035686-POCLOUD for test
INFO root:verify_collection.py:457 Sending harmony request https://harmony.earthdata.nasa.gov/C2799465497-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-74.19477398455001%3A74.32775380654999%29&subset=lon%2817.414576278650003%3A168.69634153335%29&granuleId=G3368035686-POCLOUD&variable=all
INFO root:verify_collection.py:461 Submitted harmony job fd200264-37b7-4e3e-a9ee-e96e6476a719
INFO root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw8/test_spatial_subset_C2799465490/88080904_SWOT_L2_LR_SSH_Expert_026_508_20250110T233006_20250110T233006_PIC2_01_subsetted.nc4
WARNING root:verify_collection.py:314 Unable to find lat/lon vars in UMM-Var
INFO root:verify_collection.py:543 Partial Lat Success - no Data
INFO root:verify_collection.py:552 Partial Lon Success - no Data
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_spatial_subset[C2936721448-POCLOUD] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 54s]
Raw output
Failed: Unable to find latitude and longitude variables.
collection_concept_id = 'C2936721448-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2936721448-POCLOUD', 'concept-id': 'G3062447313-POCLOUD', 'concept-type': 'granul...pecification': {'Name': 'UMM-G', 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.6', 'Version': '1.6.6'}, ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2936721448-POCLOUD'}]}, 'meta': {'association-details': {'collecti...rization_2', 'Size': 2, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -9999.0}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw5/test_spatial_subset_C2936721440')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_spatial = set()
@pytest.mark.timeout(1200)
def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_spatial):
test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_spatial:
pytest.skip(f"Known collection to skip for spatial testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
# Compute a box that is smaller than the granule extent bounding box
north, south, east, west = get_bounding_box(granule_json)
east, west, north, south = create_smaller_bounding_box(east, west, north, south, .95)
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_bbox = harmony.BBox(w=west, s=south, e=east, n=north)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection, spatial=request_bbox,
granule_id=[granule_json['meta']['concept-id']])
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
harmony_client.wait_for_processing(job_id, show_progress=False)
subsetted_filepath = None
for filename in [file_future.result()
for file_future
in harmony_client.download_all(job_id, directory=f'{tmp_path}', overwrite=True)]:
logging.info(f'Downloaded: %s', filename)
subsetted_filepath = pathlib.Path(filename)
# Verify spatial subset worked
subsetted_ds = xarray.open_dataset(subsetted_filepath, decode_times=False)
group = None
# Try to read group in file
> lat_var_name, lon_var_name = get_lat_lon_var_names(subsetted_ds, subsetted_filepath, collection_variables, collection_concept_id)
verify_collection.py:474:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
dataset = <xarray.Dataset> Size: 2GB
Dimensions: (ydim_grid: 1316, xdim_grid: 1368, look: 2,
... -0.43
history_json: [{"date_time": "2...
file_to_subset = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw5/test_spatial_subset_C2936721440/88080947_RSS_SMAP_SSS_L2C_r47700_20240106T014035_2024006_FNL_V05.3_subsetted.nc4')
collection_variable_list = [{'associations': {'collections': [{'concept-id': 'C2936721448-POCLOUD'}]}, 'meta': {'association-details': {'collecti...rization_2', 'Size': 2, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -9999.0}], ...}}, ...]
collection_concept_id = 'C2936721448-POCLOUD'
def get_lat_lon_var_names(dataset: xarray.Dataset, file_to_subset: str, collection_variable_list: List[Dict], collection_concept_id: str):
# Try getting it from UMM-Var first
lat_var_json, lon_var_json, _ = get_coordinate_vars_from_umm(collection_variable_list)
lat_var_name = get_variable_name_from_umm_json(lat_var_json)
lon_var_name = get_variable_name_from_umm_json(lon_var_json)
if lat_var_name and lon_var_name:
return lat_var_name, lon_var_name
logging.warning("Unable to find lat/lon vars in UMM-Var")
# If that doesn't work, try using cf-xarray to infer lat/lon variable names
try:
latitude = [lat for lat in dataset.cf.coordinates['latitude']
if lat.lower() in VALID_LATITUDE_VARIABLE_NAMES][0]
longitude = [lon for lon in dataset.cf.coordinates['longitude']
if lon.lower() in VALID_LONGITUDE_VARIABLE_NAMES][0]
return latitude, longitude
except:
logging.warning("Unable to find lat/lon vars using cf_xarray")
# If that still doesn't work, try using l2ss-py directly
try:
# file not able to be flattened unless locally downloaded
filename = f'my_copy_file_{collection_concept_id}.nc'
shutil.copy(file_to_subset, filename)
nc_dataset = netCDF4.Dataset(filename, mode='r+')
# flatten the dataset
nc_dataset_flattened = podaac.subsetter.group_handling.transform_grouped_dataset(nc_dataset, filename)
args = {
'decode_coords': False,
'mask_and_scale': False,
'decode_times': False
}
with xarray.open_dataset(
xarray.backends.NetCDF4DataStore(nc_dataset_flattened),
**args
) as flat_dataset:
# use l2ss-py to find lat and lon names
lat_var_names, lon_var_names = podaac.subsetter.subset.compute_coordinate_variable_names(flat_dataset)
os.remove(filename)
if lat_var_names and lon_var_names:
lat_var_name = lat_var_names.split('__')[-1] if isinstance(lat_var_names, str) else lat_var_names[0].split('__')[-1]
lon_var_name = lon_var_names.split('__')[-1] if isinstance(lon_var_names, str) else lon_var_names[0].split('__')[-1]
return lat_var_name, lon_var_name
except ValueError:
logging.warning("Unable to find lat/lon vars using l2ss-py")
# Still no dice, try using the 'units' variable attribute
for coord_name, coord in dataset.coords.items():
if 'units' not in coord.attrs:
continue
if coord.attrs['units'] == 'degrees_north' and lat_var_name is None:
lat_var_name = coord_name
if coord.attrs['units'] == 'degrees_east' and lon_var_name is None:
lon_var_name = coord_name
if lat_var_name and lon_var_name:
return lat_var_name, lon_var_name
else:
logging.warning("Unable to find lat/lon vars using 'units' attribute")
# Out of options, fail the test because we couldn't determine lat/lon variables
> pytest.fail(f"Unable to find latitude and longitude variables.")
E Failed: Unable to find latitude and longitude variables.
verify_collection.py:371: Failed
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:441 Using granule G3062447313-POCLOUD for test
INFO root:verify_collection.py:457 Sending harmony request https://harmony.earthdata.nasa.gov/C2936721448-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-82.29044999999999%3A82.08044999999998%29&subset=lon%284.51755%3A175.50045%29&granuleId=G3062447313-POCLOUD&variable=all
INFO root:verify_collection.py:461 Submitted harmony job 5d7df096-97f7-40b7-9003-1a64624f3d77
INFO root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw5/test_spatial_subset_C2936721440/88080947_RSS_SMAP_SSS_L2C_r47700_20240106T014035_2024006_FNL_V05.3_subsetted.nc4
WARNING root:verify_collection.py:314 Unable to find lat/lon vars in UMM-Var
WARNING root:verify_collection.py:324 Unable to find lat/lon vars using cf_xarray
WARNING root:verify_collection.py:355 Unable to find lat/lon vars using l2ss-py
WARNING root:verify_collection.py:368 Unable to find lat/lon vars using 'units' attribute
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_spatial_subset[C2799465507-POCLOUD] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 25s]
Raw output
Failed: No data in lon and lat
collection_concept_id = 'C2799465507-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2799465507-POCLOUD', 'concept-id': 'G3368035644-POCLOUD', 'concept-type': 'granul...110T235513_PIC2_01.nc', 'SWOT_L2_LR_PreCalSSH_WindWave_026_508_20250110T233006_20250110T233006_PIC2_01.nc', ...], ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2799465507-POCLOUD'}]}, 'meta': {'association-details': {'collecti...pixels', 'Size': 69, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': 2147483647}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw7/test_spatial_subset_C2799465500')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_spatial = set()
@pytest.mark.timeout(1200)
def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_spatial):
test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_spatial:
pytest.skip(f"Known collection to skip for spatial testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
# Compute a box that is smaller than the granule extent bounding box
north, south, east, west = get_bounding_box(granule_json)
east, west, north, south = create_smaller_bounding_box(east, west, north, south, .95)
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_bbox = harmony.BBox(w=west, s=south, e=east, n=north)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection, spatial=request_bbox,
granule_id=[granule_json['meta']['concept-id']])
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
harmony_client.wait_for_processing(job_id, show_progress=False)
subsetted_filepath = None
for filename in [file_future.result()
for file_future
in harmony_client.download_all(job_id, directory=f'{tmp_path}', overwrite=True)]:
logging.info(f'Downloaded: %s', filename)
subsetted_filepath = pathlib.Path(filename)
# Verify spatial subset worked
subsetted_ds = xarray.open_dataset(subsetted_filepath, decode_times=False)
group = None
# Try to read group in file
lat_var_name, lon_var_name = get_lat_lon_var_names(subsetted_ds, subsetted_filepath, collection_variables, collection_concept_id)
lat_var_name = lat_var_name.split('/')[-1]
lon_var_name = lon_var_name.split('/')[-1]
subsetted_ds_new = walk_netcdf_groups(subsetted_filepath, lat_var_name)
assert lat_var_name and lon_var_name
var_ds = None
msk = None
science_vars = get_science_vars(collection_variables)
if science_vars:
for var in science_vars:
science_var_name = var['umm']['Name']
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
else:
for science_var_name in subsetted_ds_new.variables:
if (str(science_var_name) not in lat_var_name and
str(science_var_name) not in lon_var_name and
'time' not in str(science_var_name)):
var_ds = find_variable(subsetted_ds_new, science_var_name)
if var_ds is not None:
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
break
except Exception:
continue
else:
var_ds, msk = None, None
if var_ds is None or msk is None:
pytest.fail("Unable to find variable from umm-v to use as science variable.")
try:
msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
llat = subsetted_ds_new[lat_var_name].where(msk)
llon = subsetted_ds_new[lon_var_name].where(msk)
except ValueError:
llat = subsetted_ds_new[lat_var_name]
llon = subsetted_ds_new[lon_var_name]
lat_max = llat.max()
lat_min = llat.min()
lon_min = llon.min()
lon_max = llon.max()
lon_min = (lon_min + 180) % 360 - 180
lon_max = (lon_max + 180) % 360 - 180
lat_var_fill_value = subsetted_ds_new[lat_var_name].encoding.get('_FillValue')
lon_var_fill_value = subsetted_ds_new[lon_var_name].encoding.get('_FillValue')
partial_pass = False
if lat_var_fill_value:
if (lat_max <= north or np.isclose(lat_max, north)) and (lat_min >= south or np.isclose(lat_min, south)):
logging.info("Successful Latitude subsetting")
elif np.isnan(lat_max) and np.isnan(lat_min):
logging.info("Partial Lat Success - no Data")
partial_pass = True
else:
assert False
if lon_var_fill_value:
if (lon_max <= east or np.isclose(lon_max, east)) and (lon_min >= west or np.isclose(lon_min, west)):
logging.info("Successful Longitude subsetting")
elif np.isnan(lon_max) and np.isnan(lon_min):
logging.info("Partial Lon Success - no Data")
partial_pass = True
else:
assert False
if partial_pass:
valid_lon = np.isfinite(llon) & (llon != lon_var_fill_value)
valid_lat = np.isfinite(llat) & (llat != lat_var_fill_value)
if not np.any(valid_lon) or not np.any(valid_lat):
> pytest.fail("No data in lon and lat")
E Failed: No data in lon and lat
verify_collection.py:562: Failed
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:441 Using granule G3368035644-POCLOUD for test
INFO root:verify_collection.py:457 Sending harmony request https://harmony.earthdata.nasa.gov/C2799465507-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-74.19477398455001%3A74.32775380654999%29&subset=lon%2817.414576278650003%3A168.69634153335%29&granuleId=G3368035644-POCLOUD&variable=all
INFO root:verify_collection.py:461 Submitted harmony job 6bc140b9-b3ea-4c33-8187-7d347f3ce13b
INFO root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw7/test_spatial_subset_C2799465500/88081029_SWOT_L2_LR_SSH_WindWave_026_508_20250110T233006_20250110T233006_PIC2_01_subsetted.nc4
WARNING root:verify_collection.py:314 Unable to find lat/lon vars in UMM-Var
INFO root:verify_collection.py:543 Partial Lat Success - no Data
INFO root:verify_collection.py:552 Partial Lon Success - no Data
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_spatial_subset[C2832224417-POCLOUD] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 37s]
Raw output
Failed: Unable to find latitude and longitude variables.
collection_concept_id = 'C2832224417-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2832224417-POCLOUD', 'concept-id': 'G3364092840-POCLOUD', 'concept-type': 'granul...pecification': {'Name': 'UMM-G', 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.6', 'Version': '1.6.6'}, ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2832224417-POCLOUD'}]}, 'meta': {'association-details': {'collecti...me': 'look', 'Size': 2, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -9999.0}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw1/test_spatial_subset_C2832224410')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_spatial = set()
@pytest.mark.timeout(1200)
def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_spatial):
test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_spatial:
pytest.skip(f"Known collection to skip for spatial testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
# Compute a box that is smaller than the granule extent bounding box
north, south, east, west = get_bounding_box(granule_json)
east, west, north, south = create_smaller_bounding_box(east, west, north, south, .95)
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_bbox = harmony.BBox(w=west, s=south, e=east, n=north)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection, spatial=request_bbox,
granule_id=[granule_json['meta']['concept-id']])
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
harmony_client.wait_for_processing(job_id, show_progress=False)
subsetted_filepath = None
for filename in [file_future.result()
for file_future
in harmony_client.download_all(job_id, directory=f'{tmp_path}', overwrite=True)]:
logging.info(f'Downloaded: %s', filename)
subsetted_filepath = pathlib.Path(filename)
# Verify spatial subset worked
subsetted_ds = xarray.open_dataset(subsetted_filepath, decode_times=False)
group = None
# Try to read group in file
> lat_var_name, lon_var_name = get_lat_lon_var_names(subsetted_ds, subsetted_filepath, collection_variables, collection_concept_id)
verify_collection.py:474:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
dataset = <xarray.Dataset> Size: 980MB
Dimensions: (ydim_grid: 1128, xdim_grid: 932, look: 2,
... -0.43
history_json: [{"date_time": "2025-...
file_to_subset = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw1/test_spatial_subset_C2832224410/88081160_RSS_SMAP_SSS_L2C_r53090_20250108T144840_2025008_NRT_V06.0_001_subsetted.nc4')
collection_variable_list = [{'associations': {'collections': [{'concept-id': 'C2832224417-POCLOUD'}]}, 'meta': {'association-details': {'collecti...me': 'look', 'Size': 2, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -9999.0}], ...}}, ...]
collection_concept_id = 'C2832224417-POCLOUD'
def get_lat_lon_var_names(dataset: xarray.Dataset, file_to_subset: str, collection_variable_list: List[Dict], collection_concept_id: str):
# Try getting it from UMM-Var first
lat_var_json, lon_var_json, _ = get_coordinate_vars_from_umm(collection_variable_list)
lat_var_name = get_variable_name_from_umm_json(lat_var_json)
lon_var_name = get_variable_name_from_umm_json(lon_var_json)
if lat_var_name and lon_var_name:
return lat_var_name, lon_var_name
logging.warning("Unable to find lat/lon vars in UMM-Var")
# If that doesn't work, try using cf-xarray to infer lat/lon variable names
try:
latitude = [lat for lat in dataset.cf.coordinates['latitude']
if lat.lower() in VALID_LATITUDE_VARIABLE_NAMES][0]
longitude = [lon for lon in dataset.cf.coordinates['longitude']
if lon.lower() in VALID_LONGITUDE_VARIABLE_NAMES][0]
return latitude, longitude
except:
logging.warning("Unable to find lat/lon vars using cf_xarray")
# If that still doesn't work, try using l2ss-py directly
try:
# file not able to be flattened unless locally downloaded
filename = f'my_copy_file_{collection_concept_id}.nc'
shutil.copy(file_to_subset, filename)
nc_dataset = netCDF4.Dataset(filename, mode='r+')
# flatten the dataset
nc_dataset_flattened = podaac.subsetter.group_handling.transform_grouped_dataset(nc_dataset, filename)
args = {
'decode_coords': False,
'mask_and_scale': False,
'decode_times': False
}
with xarray.open_dataset(
xarray.backends.NetCDF4DataStore(nc_dataset_flattened),
**args
) as flat_dataset:
# use l2ss-py to find lat and lon names
lat_var_names, lon_var_names = podaac.subsetter.subset.compute_coordinate_variable_names(flat_dataset)
os.remove(filename)
if lat_var_names and lon_var_names:
lat_var_name = lat_var_names.split('__')[-1] if isinstance(lat_var_names, str) else lat_var_names[0].split('__')[-1]
lon_var_name = lon_var_names.split('__')[-1] if isinstance(lon_var_names, str) else lon_var_names[0].split('__')[-1]
return lat_var_name, lon_var_name
except ValueError:
logging.warning("Unable to find lat/lon vars using l2ss-py")
# Still no dice, try using the 'units' variable attribute
for coord_name, coord in dataset.coords.items():
if 'units' not in coord.attrs:
continue
if coord.attrs['units'] == 'degrees_north' and lat_var_name is None:
lat_var_name = coord_name
if coord.attrs['units'] == 'degrees_east' and lon_var_name is None:
lon_var_name = coord_name
if lat_var_name and lon_var_name:
return lat_var_name, lon_var_name
else:
logging.warning("Unable to find lat/lon vars using 'units' attribute")
# Out of options, fail the test because we couldn't determine lat/lon variables
> pytest.fail(f"Unable to find latitude and longitude variables.")
E Failed: Unable to find latitude and longitude variables.
verify_collection.py:371: Failed
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:441 Using granule G3364092840-POCLOUD for test
INFO root:verify_collection.py:457 Sending harmony request https://harmony.earthdata.nasa.gov/C2832224417-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-82.831425%3A60.374425%29&subset=lon%2817.428325%3A134.176675%29&granuleId=G3364092840-POCLOUD&variable=all
INFO root:verify_collection.py:461 Submitted harmony job 1ced0353-7d40-49c2-8d6f-f70fdd3448fd
INFO root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw1/test_spatial_subset_C2832224410/88081160_RSS_SMAP_SSS_L2C_r53090_20250108T144840_2025008_NRT_V06.0_001_subsetted.nc4
WARNING root:verify_collection.py:314 Unable to find lat/lon vars in UMM-Var
WARNING root:verify_collection.py:324 Unable to find lat/lon vars using cf_xarray
WARNING root:verify_collection.py:355 Unable to find lat/lon vars using l2ss-py
WARNING root:verify_collection.py:368 Unable to find lat/lon vars using 'units' attribute
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_temporal_subset[C2754895884-POCLOUD] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 20m 0s]
Raw output
Failed: Timeout >1200.0s
collection_concept_id = 'C2754895884-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2754895884-POCLOUD', 'concept-id': 'G3368222656-POCLOUD', 'concept-type': 'granul...pecification': {'Name': 'UMM-G', 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.6', 'Version': '1.6.6'}, ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2754895884-POCLOUD'}]}, 'meta': {'association-details': {'collecti...': 3200, 'Type': 'CROSS_TRACK_DIMENSION'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -32768}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw9/test_temporal_subset_C275489580')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_temporal = {'C2036882456-POCLOUD', 'C2205121315-POCLOUD'}
@pytest.mark.timeout(1200)
def test_temporal_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_temporal):
test_spatial_subset.__doc__ = f"Verify temporal subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_temporal:
pytest.skip(f"Known collection to skip for temporal testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
temporal_subset = get_half_temporal_extent(start_time, end_time)
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection,
granule_id=[granule_json['meta']['concept-id']],
temporal=temporal_subset)
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
> harmony_client.wait_for_processing(job_id, show_progress=False)
verify_collection.py:591:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <harmony.harmony.Client object at 0x7f6a34220340>
job_id = '3b45abdc-0bc3-4928-97ca-b0f4c9543dd8', show_progress = False
def wait_for_processing(self, job_id: str, show_progress: bool = False) -> None:
"""Retrieve a submitted job's completion status in percent.
Args:
job_id: UUID string for the job you wish to interrogate.
Returns:
The job's processing progress as a percentage.
:raises
Exception: This can happen if an invalid job_id is provided or Harmony services
can't be reached.
"""
# How often to refresh the screen for progress updates and animating spinners.
ui_update_interval = 0.33 # in seconds
running_w_errors_logged = False
intervals = round(self.check_interval / ui_update_interval)
if show_progress:
with progressbar.ProgressBar(max_value=100, widgets=progressbar_widgets) as bar:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
raise ProcessingFailedException(job_id, message)
if status == 'canceled':
print('Job has been canceled.')
break
if status == 'paused':
print('\nJob has been paused. Call `resume()` to resume.', file=sys.stderr)
break
if (not running_w_errors_logged and status == 'running_with_errors'):
print('\nJob is running with errors.', file=sys.stderr)
running_w_errors_logged = True
# This gets around an issue with progressbar. If we update() with 0, the
# output shows up as "N/A". If we update with, e.g. 0.1, it rounds down or
# truncates to 0 but, importantly, actually displays that.
if progress == 0:
progress = 0.1
for _ in range(intervals):
bar.update(progress) # causes spinner to rotate even when no data change
sys.stdout.flush() # ensures correct behavior in Jupyter notebooks
if progress >= 100:
break
else:
time.sleep(ui_update_interval)
else:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
raise ProcessingFailedException(job_id, message)
if status == 'canceled':
break
if status == 'paused':
print('Job has been paused. Call `resume()` to resume.', file=sys.stderr)
break
if (not running_w_errors_logged and status == 'running_with_errors'):
print('\nJob is running with errors.', file=sys.stderr)
running_w_errors_logged = True
> time.sleep(self.check_interval)
E Failed: Timeout >1200.0s
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:1155: Failed
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:572 Using granule G3368222656-POCLOUD for test
INFO root:verify_collection.py:585 Sending harmony request https://harmony.earthdata.nasa.gov/C2754895884-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=time%28%222025-01-13T06%3A12%3A29.750000%22%3A%222025-01-13T06%3A17%3A29.250000%22%29&granuleId=G3368222656-POCLOUD&variable=all
INFO root:verify_collection.py:589 Submitted harmony job 3b45abdc-0bc3-4928-97ca-b0f4c9543dd8
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_temporal_subset[C2147480877-POCLOUD] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 20m 0s]
Raw output
Failed: Timeout >1200.0s
collection_concept_id = 'C2147480877-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2147480877-POCLOUD', 'concept-id': 'G3368231668-POCLOUD', 'concept-type': 'granul...pecification': {'Name': 'UMM-G', 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.6', 'Version': '1.6.6'}, ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2147480877-POCLOUD'}]}, 'meta': {'association-details': {'collecti...': 3200, 'Type': 'CROSS_TRACK_DIMENSION'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -32768}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw6/test_temporal_subset_C214748080')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_temporal = {'C2036882456-POCLOUD', 'C2205121315-POCLOUD'}
@pytest.mark.timeout(1200)
def test_temporal_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_temporal):
test_spatial_subset.__doc__ = f"Verify temporal subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_temporal:
pytest.skip(f"Known collection to skip for temporal testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
temporal_subset = get_half_temporal_extent(start_time, end_time)
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection,
granule_id=[granule_json['meta']['concept-id']],
temporal=temporal_subset)
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
> harmony_client.wait_for_processing(job_id, show_progress=False)
verify_collection.py:591:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <harmony.harmony.Client object at 0x7f13b0b25930>
job_id = 'c4d6570a-c881-4362-aa95-36db51d406bf', show_progress = False
def wait_for_processing(self, job_id: str, show_progress: bool = False) -> None:
"""Retrieve a submitted job's completion status in percent.
Args:
job_id: UUID string for the job you wish to interrogate.
Returns:
The job's processing progress as a percentage.
:raises
Exception: This can happen if an invalid job_id is provided or Harmony services
can't be reached.
"""
# How often to refresh the screen for progress updates and animating spinners.
ui_update_interval = 0.33 # in seconds
running_w_errors_logged = False
intervals = round(self.check_interval / ui_update_interval)
if show_progress:
with progressbar.ProgressBar(max_value=100, widgets=progressbar_widgets) as bar:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
raise ProcessingFailedException(job_id, message)
if status == 'canceled':
print('Job has been canceled.')
break
if status == 'paused':
print('\nJob has been paused. Call `resume()` to resume.', file=sys.stderr)
break
if (not running_w_errors_logged and status == 'running_with_errors'):
print('\nJob is running with errors.', file=sys.stderr)
running_w_errors_logged = True
# This gets around an issue with progressbar. If we update() with 0, the
# output shows up as "N/A". If we update with, e.g. 0.1, it rounds down or
# truncates to 0 but, importantly, actually displays that.
if progress == 0:
progress = 0.1
for _ in range(intervals):
bar.update(progress) # causes spinner to rotate even when no data change
sys.stdout.flush() # ensures correct behavior in Jupyter notebooks
if progress >= 100:
break
else:
time.sleep(ui_update_interval)
else:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
raise ProcessingFailedException(job_id, message)
if status == 'canceled':
break
if status == 'paused':
print('Job has been paused. Call `resume()` to resume.', file=sys.stderr)
break
if (not running_w_errors_logged and status == 'running_with_errors'):
print('\nJob is running with errors.', file=sys.stderr)
running_w_errors_logged = True
> time.sleep(self.check_interval)
E Failed: Timeout >1200.0s
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:1155: Failed
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:572 Using granule G3368231668-POCLOUD for test
INFO root:verify_collection.py:585 Sending harmony request https://harmony.earthdata.nasa.gov/C2147480877-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=time%28%222025-01-13T05%3A32%3A29.750000%22%3A%222025-01-13T05%3A37%3A29.250000%22%29&granuleId=G3368231668-POCLOUD&variable=all
INFO root:verify_collection.py:589 Submitted harmony job c4d6570a-c881-4362-aa95-36db51d406bf
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_temporal_subset[C2208418228-POCLOUD] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 41s]
Raw output
harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.13.0: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2389, in function '_binary_op': '>=' not supported between instances of 'float' and 'datetime.datetime'
collection_concept_id = 'C2208418228-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2208418228-POCLOUD', 'concept-id': 'G3363930655-POCLOUD', 'concept-type': 'granul...pecification': {'Name': 'UMM-G', 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.6', 'Version': '1.6.6'}, ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2208418228-POCLOUD'}]}, 'meta': {'association-details': {'collecti...ny_dim_1', 'Size': 812, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -9999.0}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw4/test_temporal_subset_C220841820')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_temporal = {'C2036882456-POCLOUD', 'C2205121315-POCLOUD'}
@pytest.mark.timeout(1200)
def test_temporal_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_temporal):
test_spatial_subset.__doc__ = f"Verify temporal subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_temporal:
pytest.skip(f"Known collection to skip for temporal testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
temporal_subset = get_half_temporal_extent(start_time, end_time)
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection,
granule_id=[granule_json['meta']['concept-id']],
temporal=temporal_subset)
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
> harmony_client.wait_for_processing(job_id, show_progress=False)
verify_collection.py:591:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <harmony.harmony.Client object at 0x7fb8ee4a9f60>
job_id = '012875e3-389f-4361-b4a4-bce4224758d2', show_progress = False
def wait_for_processing(self, job_id: str, show_progress: bool = False) -> None:
"""Retrieve a submitted job's completion status in percent.
Args:
job_id: UUID string for the job you wish to interrogate.
Returns:
The job's processing progress as a percentage.
:raises
Exception: This can happen if an invalid job_id is provided or Harmony services
can't be reached.
"""
# How often to refresh the screen for progress updates and animating spinners.
ui_update_interval = 0.33 # in seconds
running_w_errors_logged = False
intervals = round(self.check_interval / ui_update_interval)
if show_progress:
with progressbar.ProgressBar(max_value=100, widgets=progressbar_widgets) as bar:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
raise ProcessingFailedException(job_id, message)
if status == 'canceled':
print('Job has been canceled.')
break
if status == 'paused':
print('\nJob has been paused. Call `resume()` to resume.', file=sys.stderr)
break
if (not running_w_errors_logged and status == 'running_with_errors'):
print('\nJob is running with errors.', file=sys.stderr)
running_w_errors_logged = True
# This gets around an issue with progressbar. If we update() with 0, the
# output shows up as "N/A". If we update with, e.g. 0.1, it rounds down or
# truncates to 0 but, importantly, actually displays that.
if progress == 0:
progress = 0.1
for _ in range(intervals):
bar.update(progress) # causes spinner to rotate even when no data change
sys.stdout.flush() # ensures correct behavior in Jupyter notebooks
if progress >= 100:
break
else:
time.sleep(ui_update_interval)
else:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
> raise ProcessingFailedException(job_id, message)
E harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.13.0: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2389, in function '_binary_op': '>=' not supported between instances of 'float' and 'datetime.datetime'
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:1146: ProcessingFailedException
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:572 Using granule G3363930655-POCLOUD for test
INFO root:verify_collection.py:585 Sending harmony request https://harmony.earthdata.nasa.gov/C2208418228-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=time%28%222025-01-08T08%3A40%3A13.750000%22%3A%222025-01-08T09%3A29%3A27.250000%22%29&granuleId=G3363930655-POCLOUD&variable=all
INFO root:verify_collection.py:589 Submitted harmony job 012875e3-389f-4361-b4a4-bce4224758d2
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_temporal_subset[C2248652649-GES_DISC] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 48s]
Raw output
harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.13.0: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2389, in function '_binary_op': '>=' not supported between instances of 'Array' and 'datetime.datetime'
collection_concept_id = 'C2248652649-GES_DISC', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2248652649-GES_DISC', 'concept-id': 'G2966978055-GES_DISC', 'concept-type': 'gran...pecification': {'Name': 'UMM-G', 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.6', 'Version': '1.6.6'}, ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2248652649-GES_DISC'}]}, 'meta': {'association-details': {'collect...ion': {'Name': 'UMM-Var', 'URL': 'https://cdn.earthdata.nasa.gov/umm/variable/v1.9.0', 'Version': '1.9.0'}, ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw1/test_temporal_subset_C224865260')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_temporal = {'C2036882456-POCLOUD', 'C2205121315-POCLOUD'}
@pytest.mark.timeout(1200)
def test_temporal_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_temporal):
test_spatial_subset.__doc__ = f"Verify temporal subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_temporal:
pytest.skip(f"Known collection to skip for temporal testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
temporal_subset = get_half_temporal_extent(start_time, end_time)
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection,
granule_id=[granule_json['meta']['concept-id']],
temporal=temporal_subset)
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
> harmony_client.wait_for_processing(job_id, show_progress=False)
verify_collection.py:591:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <harmony.harmony.Client object at 0x7f8097701c90>
job_id = 'f46d2ab0-0736-4ee2-9cc0-54bc7363694f', show_progress = False
def wait_for_processing(self, job_id: str, show_progress: bool = False) -> None:
"""Retrieve a submitted job's completion status in percent.
Args:
job_id: UUID string for the job you wish to interrogate.
Returns:
The job's processing progress as a percentage.
:raises
Exception: This can happen if an invalid job_id is provided or Harmony services
can't be reached.
"""
# How often to refresh the screen for progress updates and animating spinners.
ui_update_interval = 0.33 # in seconds
running_w_errors_logged = False
intervals = round(self.check_interval / ui_update_interval)
if show_progress:
with progressbar.ProgressBar(max_value=100, widgets=progressbar_widgets) as bar:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
raise ProcessingFailedException(job_id, message)
if status == 'canceled':
print('Job has been canceled.')
break
if status == 'paused':
print('\nJob has been paused. Call `resume()` to resume.', file=sys.stderr)
break
if (not running_w_errors_logged and status == 'running_with_errors'):
print('\nJob is running with errors.', file=sys.stderr)
running_w_errors_logged = True
# This gets around an issue with progressbar. If we update() with 0, the
# output shows up as "N/A". If we update with, e.g. 0.1, it rounds down or
# truncates to 0 but, importantly, actually displays that.
if progress == 0:
progress = 0.1
for _ in range(intervals):
bar.update(progress) # causes spinner to rotate even when no data change
sys.stdout.flush() # ensures correct behavior in Jupyter notebooks
if progress >= 100:
break
else:
time.sleep(ui_update_interval)
else:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
> raise ProcessingFailedException(job_id, message)
E harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.13.0: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2389, in function '_binary_op': '>=' not supported between instances of 'Array' and 'datetime.datetime'
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:1146: ProcessingFailedException
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:572 Using granule G2966978055-GES_DISC for test
INFO root:verify_collection.py:585 Sending harmony request https://harmony.earthdata.nasa.gov/C2248652649-GES_DISC/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=time%28%222024-03-30T06%3A00%3A00%22%3A%222024-03-30T18%3A00%3A00%22%29&granuleId=G2966978055-GES_DISC&variable=all
INFO root:verify_collection.py:589 Submitted harmony job f46d2ab0-0736-4ee2-9cc0-54bc7363694f
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_temporal_subset[C2799465503-POCLOUD] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 3m 9s]
Raw output
harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.13.0: Error in file 'src/netCDF4/_netCDF4.pyx', line 5936, in function 'netCDF4._netCDF4.Variable._put': expected bytes, float found
collection_concept_id = 'C2799465503-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2799465503-POCLOUD', 'concept-id': 'G3368035701-POCLOUD', 'concept-type': 'granul...110T235513_PIC2_01.nc', 'SWOT_L2_LR_PreCalSSH_WindWave_026_508_20250110T233006_20250110T233006_PIC2_01.nc', ...], ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2799465503-POCLOUD'}]}, 'meta': {'association-details': {'collecti...ixels', 'Size': 240, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': 2147483647}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw1/test_temporal_subset_C279946550')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_temporal = {'C2036882456-POCLOUD', 'C2205121315-POCLOUD'}
@pytest.mark.timeout(1200)
def test_temporal_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_temporal):
test_spatial_subset.__doc__ = f"Verify temporal subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_temporal:
pytest.skip(f"Known collection to skip for temporal testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
temporal_subset = get_half_temporal_extent(start_time, end_time)
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection,
granule_id=[granule_json['meta']['concept-id']],
temporal=temporal_subset)
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
> harmony_client.wait_for_processing(job_id, show_progress=False)
verify_collection.py:591:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <harmony.harmony.Client object at 0x7f80978f5210>
job_id = 'd14ec4b9-eadd-46d0-a6c2-a663446d4be2', show_progress = False
def wait_for_processing(self, job_id: str, show_progress: bool = False) -> None:
"""Retrieve a submitted job's completion status in percent.
Args:
job_id: UUID string for the job you wish to interrogate.
Returns:
The job's processing progress as a percentage.
:raises
Exception: This can happen if an invalid job_id is provided or Harmony services
can't be reached.
"""
# How often to refresh the screen for progress updates and animating spinners.
ui_update_interval = 0.33 # in seconds
running_w_errors_logged = False
intervals = round(self.check_interval / ui_update_interval)
if show_progress:
with progressbar.ProgressBar(max_value=100, widgets=progressbar_widgets) as bar:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
raise ProcessingFailedException(job_id, message)
if status == 'canceled':
print('Job has been canceled.')
break
if status == 'paused':
print('\nJob has been paused. Call `resume()` to resume.', file=sys.stderr)
break
if (not running_w_errors_logged and status == 'running_with_errors'):
print('\nJob is running with errors.', file=sys.stderr)
running_w_errors_logged = True
# This gets around an issue with progressbar. If we update() with 0, the
# output shows up as "N/A". If we update with, e.g. 0.1, it rounds down or
# truncates to 0 but, importantly, actually displays that.
if progress == 0:
progress = 0.1
for _ in range(intervals):
bar.update(progress) # causes spinner to rotate even when no data change
sys.stdout.flush() # ensures correct behavior in Jupyter notebooks
if progress >= 100:
break
else:
time.sleep(ui_update_interval)
else:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
> raise ProcessingFailedException(job_id, message)
E harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.13.0: Error in file 'src/netCDF4/_netCDF4.pyx', line 5936, in function 'netCDF4._netCDF4.Variable._put': expected bytes, float found
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:1146: ProcessingFailedException
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:572 Using granule G3368035701-POCLOUD for test
INFO root:verify_collection.py:585 Sending harmony request https://harmony.earthdata.nasa.gov/C2799465503-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=time%28%222025-01-10T23%3A17%3A09.323750%22%3A%222025-01-10T23%3A43%3A08.137250%22%29&granuleId=G3368035701-POCLOUD&variable=all
INFO root:verify_collection.py:589 Submitted harmony job d14ec4b9-eadd-46d0-a6c2-a663446d4be2
Check warning on line 0 in tests.verify_collection
github-actions / Regression test results for ops
test_temporal_subset[C2082387249-GES_DISC] (tests.verify_collection) failed
test-results/ops_test_report.xml [took 44s]
Raw output
harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.13.0: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2389, in function '_binary_op': '>=' not supported between instances of 'Array' and 'datetime.datetime'
collection_concept_id = 'C2082387249-GES_DISC', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2082387249-GES_DISC', 'concept-id': 'G2808192207-GES_DISC', 'concept-type': 'gran...pecification': {'Name': 'UMM-G', 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.6', 'Version': '1.6.6'}, ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C2082387249-GES_DISC'}]}, 'meta': {'association-details': {'collect...ion': {'Name': 'UMM-Var', 'URL': 'https://cdn.earthdata.nasa.gov/umm/variable/v1.9.0', 'Version': '1.9.0'}, ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw6/test_temporal_subset_C208238720')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...0nlL-K596RCI-k0gbQsTkkjAtWl2o7dAugcj3VuU0Wx3jDeAYyzGA-P2mt852xfkroyDelavsXnCL4W8iyrZudHxVJ4wLhdsH-xJn6npOrQ_-SuR9UtewA'
skip_temporal = {'C2036882456-POCLOUD', 'C2205121315-POCLOUD'}
@pytest.mark.timeout(1200)
def test_temporal_subset(collection_concept_id, env, granule_json, collection_variables,
harmony_env, tmp_path: pathlib.Path, bearer_token, skip_temporal):
test_spatial_subset.__doc__ = f"Verify temporal subset for {collection_concept_id} in {env}"
if collection_concept_id in skip_temporal:
pytest.skip(f"Known collection to skip for temporal testing {collection_concept_id}")
logging.info("Using granule %s for test", granule_json['meta']['concept-id'])
start_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["BeginningDateTime"]
end_time = granule_json['umm']["TemporalExtent"]["RangeDateTime"]["EndingDateTime"]
temporal_subset = get_half_temporal_extent(start_time, end_time)
# Build harmony request
harmony_client = harmony.Client(env=harmony_env, token=bearer_token)
request_collection = harmony.Collection(id=collection_concept_id)
harmony_request = harmony.Request(collection=request_collection,
granule_id=[granule_json['meta']['concept-id']],
temporal=temporal_subset)
logging.info("Sending harmony request %s", harmony_client.request_as_url(harmony_request))
# Submit harmony request and download result
job_id = harmony_client.submit(harmony_request)
logging.info("Submitted harmony job %s", job_id)
> harmony_client.wait_for_processing(job_id, show_progress=False)
verify_collection.py:591:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <harmony.harmony.Client object at 0x7f13b20e6da0>
job_id = 'cd3c6291-49ea-43a3-bd54-99c352f4785f', show_progress = False
def wait_for_processing(self, job_id: str, show_progress: bool = False) -> None:
"""Retrieve a submitted job's completion status in percent.
Args:
job_id: UUID string for the job you wish to interrogate.
Returns:
The job's processing progress as a percentage.
:raises
Exception: This can happen if an invalid job_id is provided or Harmony services
can't be reached.
"""
# How often to refresh the screen for progress updates and animating spinners.
ui_update_interval = 0.33 # in seconds
running_w_errors_logged = False
intervals = round(self.check_interval / ui_update_interval)
if show_progress:
with progressbar.ProgressBar(max_value=100, widgets=progressbar_widgets) as bar:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
raise ProcessingFailedException(job_id, message)
if status == 'canceled':
print('Job has been canceled.')
break
if status == 'paused':
print('\nJob has been paused. Call `resume()` to resume.', file=sys.stderr)
break
if (not running_w_errors_logged and status == 'running_with_errors'):
print('\nJob is running with errors.', file=sys.stderr)
running_w_errors_logged = True
# This gets around an issue with progressbar. If we update() with 0, the
# output shows up as "N/A". If we update with, e.g. 0.1, it rounds down or
# truncates to 0 but, importantly, actually displays that.
if progress == 0:
progress = 0.1
for _ in range(intervals):
bar.update(progress) # causes spinner to rotate even when no data change
sys.stdout.flush() # ensures correct behavior in Jupyter notebooks
if progress >= 100:
break
else:
time.sleep(ui_update_interval)
else:
progress = 0
while progress < 100:
progress, status, message = self.progress(job_id)
if status == 'failed':
> raise ProcessingFailedException(job_id, message)
E harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.13.0: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2389, in function '_binary_op': '>=' not supported between instances of 'Array' and 'datetime.datetime'
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:1146: ProcessingFailedException
--------------------------------- Captured Log ---------------------------------
INFO root:verify_collection.py:572 Using granule G2808192207-GES_DISC for test
INFO root:verify_collection.py:585 Sending harmony request https://harmony.earthdata.nasa.gov/C2082387249-GES_DISC/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=time%28%222023-11-12T06%3A00%3A00%22%3A%222023-11-12T18%3A00%3A00%22%29&granuleId=G2808192207-GES_DISC&variable=all
INFO root:verify_collection.py:589 Submitted harmony job cd3c6291-49ea-43a3-bd54-99c352f4785f
Check notice on line 0 in .github
github-actions / Regression test results for ops
2 skipped tests found
There are 2 skipped tests, see "Raw output" for the full list of skipped tests.
Raw output
tests.verify_collection ‑ test_temporal_subset[C2036882456-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205121315-POCLOUD]
Check notice on line 0 in .github
github-actions / Regression test results for ops
572 tests found
There are 572 tests, see "Raw output" for the full list of tests.
Raw output
tests.verify_collection ‑ test_spatial_subset[C1223720291-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966755-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966757-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966768-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966773-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966779-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966783-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966787-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966791-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966794-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966798-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966810-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966812-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966818-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966827-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966829-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966837-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966842-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239966859-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101115-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101182-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101191-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101199-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101234-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101256-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101402-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101435-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101457-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101497-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101564-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101596-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101649-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101667-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101678-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101730-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101764-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101777-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1251101828-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1266136038-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1266136073-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1266136095-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1266136097-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1266136098-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1266136100-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1266136103-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1266136113-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1266136114-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1266136121-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1442068490-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1442068491-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1442068493-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1442068505-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1442068508-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1442068509-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1442068510-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1442068511-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1627516285-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1627516287-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1627516288-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1627516290-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1627516292-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1627516296-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1627516298-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1627516300-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1692982070-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1692982075-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1692982090-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1693440798-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1720416694-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925083-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925099-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925101-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925104-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925129-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925130-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925152-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925154-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925175-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925178-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925263-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925368-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925474-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925584-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925686-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729925806-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729926181-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729926467-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729926699-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1729926922-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1918209669-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1918209846-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1918210023-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1918210292-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1940470304-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1940471193-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1940472420-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1940473819-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1940475563-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1968979550-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1968979561-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1968979566-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1968979597-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1968979762-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1968979997-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1968980549-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1968980576-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1968980583-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1968980609-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1980429431-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1980429433-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1980429446-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1980429450-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1996881456-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1996881636-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1996881752-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1996881807-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036877495-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036877502-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036877509-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036878029-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036879048-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036880640-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036880717-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036881016-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036882048-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036882055-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036882072-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036882397-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036882456-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036882482-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036882492-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2036882499-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2041963327-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041963409-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041963510-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041963756-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041963848-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041963982-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041964117-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041964232-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041964582-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041964691-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041964952-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041965054-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041965187-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041965312-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041965834-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041965954-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041966092-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041966388-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041966555-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041966693-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041966826-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041967527-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041967844-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041968030-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041968414-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041968586-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2041968764-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2054599696-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2054599702-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2054599705-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2054599713-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2068529568-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2075141524-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2075141559-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2075141605-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2075141638-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2075141684-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2082387249-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2087131083-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2087132178-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2087216100-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2087216530-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2088007541-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2088007544-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2088007546-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2088007557-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2088007559-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2088007562-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2088007569-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2088007577-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2089270961-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2147478146-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2147480877-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2179081499-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2179081510-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2179081525-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2179081538-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2179081549-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2179081553-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2179301732-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2179301740-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2183155461-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205121315-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205121384-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205121394-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205121400-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205121485-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205121520-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205122298-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205553958-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205618215-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205618339-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205618975-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2205620319-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2208418228-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2208420167-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2208421887-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2212151771-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2237732007-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247039814-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247039820-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247039948-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040077-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040116-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040120-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040242-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040357-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040372-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040407-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040461-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040567-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040641-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040650-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040703-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040772-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040913-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040959-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247040984-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2247621105-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2248652649-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2251464495-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2251465126-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2254232941-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2264134106-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2264134196-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2264134345-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C2274919215-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2296989388-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2296989390-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2491731827-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2491731829-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2491731831-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2491735309-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2499940513-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2499940517-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2499940520-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2499940523-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2596983413-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2596986276-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2599212091-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2628593693-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2628595723-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2628598397-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2628598809-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2628600898-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2637180124-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2646932894-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2706513160-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2706520933-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2730520815-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2754895884-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799438350-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799438351-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799438353-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465428-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465497-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465503-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465507-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465509-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465518-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465522-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465526-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465529-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465538-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465542-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2799465544-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2832196001-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2832221740-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2832224417-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2847232153-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2847232536-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2901523432-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2904379383-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2936721448-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1223720291-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966755-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966757-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966768-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966773-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966779-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966783-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966787-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966791-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966794-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966798-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966810-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966812-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966818-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966827-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966829-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966837-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966842-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239966859-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101115-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101182-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101191-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101199-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101234-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101256-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101402-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101435-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101457-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101497-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101564-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101596-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101649-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101667-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101678-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101730-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101764-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101777-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1251101828-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1266136038-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1266136073-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1266136095-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1266136097-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1266136098-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1266136100-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1266136103-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1266136113-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1266136114-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1266136121-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1442068490-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1442068491-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1442068493-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1442068505-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1442068508-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1442068509-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1442068510-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1442068511-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1627516285-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1627516287-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1627516288-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1627516290-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1627516292-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1627516296-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1627516298-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1627516300-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1692982070-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1692982075-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1692982090-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1693440798-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1720416694-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925083-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925099-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925101-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925104-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925129-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925130-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925152-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925154-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925175-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925178-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925263-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925368-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925474-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925584-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925686-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729925806-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729926181-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729926467-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729926699-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1729926922-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1918209669-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1918209846-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1918210023-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1918210292-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1940470304-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1940471193-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1940472420-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1940473819-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1940475563-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1968979550-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1968979561-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1968979566-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1968979597-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1968979762-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1968979997-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1968980549-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1968980576-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1968980583-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1968980609-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1980429431-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1980429433-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1980429446-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1980429450-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1996881456-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1996881636-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1996881752-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1996881807-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036877495-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036877502-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036877509-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036878029-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036879048-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036880640-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036880717-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036881016-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036882048-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036882055-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036882072-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036882397-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036882456-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036882482-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036882492-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2036882499-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2041963327-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041963409-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041963510-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041963756-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041963848-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041963982-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041964117-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041964232-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041964582-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041964691-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041964952-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041965054-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041965187-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041965312-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041965834-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041965954-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041966092-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041966388-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041966555-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041966693-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041966826-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041967527-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041967844-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041968030-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041968414-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041968586-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2041968764-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2054599696-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2054599702-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2054599705-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2054599713-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2068529568-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2075141524-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2075141559-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2075141605-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2075141638-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2075141684-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2082387249-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2087131083-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2087132178-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2087216100-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2087216530-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2088007541-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2088007544-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2088007546-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2088007557-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2088007559-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2088007562-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2088007569-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2088007577-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2089270961-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2147478146-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2147480877-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2179081499-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2179081510-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2179081525-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2179081538-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2179081549-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2179081553-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2179301732-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2179301740-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2183155461-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205121315-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205121384-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205121394-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205121400-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205121485-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205121520-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205122298-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205553958-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205618215-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205618339-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205618975-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2205620319-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2208418228-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2208420167-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2208421887-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2212151771-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2237732007-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247039814-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247039820-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247039948-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040077-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040116-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040120-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040242-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040357-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040372-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040407-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040461-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040567-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040641-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040650-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040703-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040772-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040913-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040959-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247040984-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2247621105-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2248652649-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2251464495-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2251465126-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2254232941-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2264134106-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2264134196-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2264134345-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C2274919215-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2296989388-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2296989390-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2491731827-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2491731829-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2491731831-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2491735309-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2499940513-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2499940517-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2499940520-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2499940523-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2596983413-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2596986276-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2599212091-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2628593693-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2628595723-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2628598397-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2628598809-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2628600898-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2637180124-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2646932894-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2706513160-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2706520933-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2730520815-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2754895884-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799438350-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799438351-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799438353-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465428-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465497-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465503-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465507-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465509-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465518-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465522-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465526-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465529-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465538-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465542-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2799465544-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2832196001-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2832221740-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2832224417-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2847232153-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2847232536-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2901523432-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2904379383-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C2936721448-POCLOUD]