Skip to content

Regression

Regression #66

GitHub Actions / Regression test results for ops failed Jun 4, 2024 in 0s

9 fail, 267 pass in 3h 19m 17s

276 tests   267 ✅  3h 19m 17s ⏱️
  1 suites    0 💤
  1 files      9 ❌

Results for commit 8dd8ccd.

Annotations

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

@github-actions github-actions / Regression test results for ops

test_spatial_subset[C2832221740-POCLOUD] (tests.verify_collection) failed

test-results/ops_test_report.xml [took 42s]
Raw output
harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.10.0: Service request failed with an unknown error
collection_concept_id = 'C2832221740-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2832221740-POCLOUD', 'concept-id': 'G3059748792-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': 'C2832221740-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/test_spatial_subset_C2832221740')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...M1SxaPfRwaV4PnJa7zbVFlZLcvBhRvf4vqzuF5YM7NH6FVZLvYlGKaafF6MKL_It0xU_qyGVtYqXMQZPxtw3-X8U0FJk7UpNs1KArBsF0dKaHHXtrfp8lA'

    @pytest.mark.timeout(600)
    def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
                            harmony_env, tmp_path: pathlib.Path, bearer_token):
        test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
    
        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)
    
        # 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=True)

verify_collection.py:361: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <harmony.harmony.Client object at 0x7f2245c0de70>
job_id = 'b198f28e-38d5-41ec-b7f0-31142736b900', show_progress = True

    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)
E                       harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.10.0: Service request failed with an unknown error

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:986: ProcessingFailedException
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:344 Using granule G3059748792-POCLOUD for test
INFO     root:verify_collection.py:356 Sending harmony request https://harmony.earthdata.nasa.gov/C2832221740-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat%28-82.29042474999999%3A82.03317474999999%29&subset=lon%28-171.0%3A171.0%29&granuleId=G3059748792-POCLOUD
INFO     root:verify_collection.py:360 Submitted harmony job b198f28e-38d5-41ec-b7f0-31142736b900

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

@github-actions github-actions / Regression test results for ops

test_spatial_subset[C2087216100-GES_DISC] (tests.verify_collection) failed

test-results/ops_test_report.xml [took 33s]
Raw output
OSError: [Errno group not found: PRODUCT] 'PRODUCT'
ds = <[AttributeError('NetCDF: Not a valid ID') raised in repr()] Group object at 0x7f2243904840>
group = '/METADATA/PRODUCT', mode = 'r'
create_group = <function _netcdf4_create_group at 0x7f224c1353f0>

    def _nc4_require_group(ds, group, mode, create_group=_netcdf4_create_group):
        if group in {None, "", "/"}:
            # use the root group
            return ds
        else:
            # make sure it's a string
            if not isinstance(group, str):
                raise ValueError("group must be a string or None")
            # support path-like syntax
            path = group.strip("/").split("/")
            for key in path:
                try:
>                   ds = ds.groups[key]
E                   KeyError: 'PRODUCT'

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:190: KeyError

During handling of the above exception, another exception occurred:

collection_concept_id = 'C2087216100-GES_DISC', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2087216100-GES_DISC', 'concept-id': 'G3061367241-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': 'C2087216100-GES_DISC'}]}, 'meta': {'association-details': {'collect...m/variable/v1.9.0', 'Version': '1.9.0'}, 'Name': 'METADATA/QA_STATISTICS/aerosol_mid_pressure_histogram_bounds'}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/test_spatial_subset_C2087216100')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...M1SxaPfRwaV4PnJa7zbVFlZLcvBhRvf4vqzuF5YM7NH6FVZLvYlGKaafF6MKL_It0xU_qyGVtYqXMQZPxtw3-X8U0FJk7UpNs1KArBsF0dKaHHXtrfp8lA'

    @pytest.mark.timeout(600)
    def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
                            harmony_env, tmp_path: pathlib.Path, bearer_token):
        test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
    
        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)
    
        # 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=True)
        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)
        lat_var_name = lat_var_name.split('/')[-1]
        lon_var_name = lon_var_name.split('/')[-1]
    
        with netCDF4.Dataset(subsetted_filepath) as f:
            group_list = []
            def group_walk(groups, nc_d, current_group):
                global subsetted_ds_new
                subsetted_ds_new = None
                # check if the top group has lat or lon variable
                if lat_var_name in list(nc_d.variables.keys()):
                    subsetted_ds_new = subsetted_ds
                else:
                    # if not then we'll need to keep track of the group layers
                    group_list.append(current_group)
    
                # loop through the groups in the current layer
                for g in groups:
                    # end the loop if we've already found latitude
                    if subsetted_ds_new:
                        break
                    # check if the groups have latitude, define the dataset and end the loop if found
                    if lat_var_name in list(nc_d.groups[g].variables.keys()):
                        group_list.append(g)
                        g = '/'.join(group_list)
                        subsetted_ds_new = xarray.open_dataset(subsetted_filepath, group=g, decode_times=False)
                        break
                    # recall the function on a group that has groups in it and didn't find latitude
                    # this is going 'deeper' into the groups
                    if len(list(nc_d.groups[g].groups.keys())) > 0:
                        group_walk(nc_d.groups[g].groups, nc_d.groups[g], g)
                    else:
                        continue
    
>           group_walk(f.groups, f, '')

verify_collection.py:407: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
verify_collection.py:398: in group_walk
    subsetted_ds_new = xarray.open_dataset(subsetted_filepath, group=g, decode_times=False)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/api.py:571: in open_dataset
    backend_ds = backend.open_dataset(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:646: in open_dataset
    store = NetCDF4DataStore.open(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:409: in open
    return cls(manager, group=group, mode=mode, lock=lock, autoclose=autoclose)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:356: in __init__
    self.format = self.ds.data_model
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:418: in ds
    return self._acquire()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:413: in _acquire
    ds = _nc4_require_group(root, self._group, self._mode)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

ds = <[AttributeError('NetCDF: Not a valid ID') raised in repr()] Group object at 0x7f2243904840>
group = '/METADATA/PRODUCT', mode = 'r'
create_group = <function _netcdf4_create_group at 0x7f224c1353f0>

    def _nc4_require_group(ds, group, mode, create_group=_netcdf4_create_group):
        if group in {None, "", "/"}:
            # use the root group
            return ds
        else:
            # make sure it's a string
            if not isinstance(group, str):
                raise ValueError("group must be a string or None")
            # support path-like syntax
            path = group.strip("/").split("/")
            for key in path:
                try:
                    ds = ds.groups[key]
                except KeyError as e:
                    if mode != "r":
                        ds = create_group(ds, key)
                    else:
                        # wrap error to provide slightly more helpful message
>                       raise OSError(f"group not found: {key}", e)
E                       OSError: [Errno group not found: PRODUCT] 'PRODUCT'

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:196: OSError
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:344 Using granule G3061367241-GES_DISC for test
INFO     root:verify_collection.py:356 Sending harmony request https://harmony.earthdata.nasa.gov/C2087216100-GES_DISC/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat%28-77.50425%3A-60.223749999999995%29&subset=lon%2811.025624999999998%3A88.56937500000001%29&granuleId=G3061367241-GES_DISC
INFO     root:verify_collection.py:360 Submitted harmony job a23792ba-d444-408f-bef1-0d97a67d8569
INFO     root:verify_collection.py:366 Downloaded: /tmp/pytest-of-runner/pytest-0/test_spatial_subset_C2087216100/63527439_S5P_OFFL_L2_AER_LH_20240530T110820_20240530T124950_34349_03_020600_20240603T133310_subsetted.nc4

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

@github-actions github-actions / Regression test results for ops

test_spatial_subset[C1918210023-GES_DISC] (tests.verify_collection) failed

test-results/ops_test_report.xml [took 51s]
Raw output
OSError: [Errno group not found: PRODUCT] 'PRODUCT'
ds = <[AttributeError('NetCDF: Not a valid ID') raised in repr()] Group object at 0x7f2243a1de40>
group = '/METADATA/PRODUCT', mode = 'r'
create_group = <function _netcdf4_create_group at 0x7f224c1353f0>

    def _nc4_require_group(ds, group, mode, create_group=_netcdf4_create_group):
        if group in {None, "", "/"}:
            # use the root group
            return ds
        else:
            # make sure it's a string
            if not isinstance(group, str):
                raise ValueError("group must be a string or None")
            # support path-like syntax
            path = group.strip("/").split("/")
            for key in path:
                try:
>                   ds = ds.groups[key]
E                   KeyError: 'PRODUCT'

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:190: KeyError

During handling of the above exception, another exception occurred:

collection_concept_id = 'C1918210023-GES_DISC', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C1918210023-GES_DISC', 'concept-id': 'G3061490195-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': 'C1918210023-GES_DISC'}]}, 'meta': {'association-details': {'collect...RL': 'https://cdn.earthdata.nasa.gov/umm/variable/v1.9.0', 'Version': '1.9.0'}, 'Name': 'PRODUCT/qa_value', ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/test_spatial_subset_C1918210020')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...M1SxaPfRwaV4PnJa7zbVFlZLcvBhRvf4vqzuF5YM7NH6FVZLvYlGKaafF6MKL_It0xU_qyGVtYqXMQZPxtw3-X8U0FJk7UpNs1KArBsF0dKaHHXtrfp8lA'

    @pytest.mark.timeout(600)
    def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
                            harmony_env, tmp_path: pathlib.Path, bearer_token):
        test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
    
        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)
    
        # 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=True)
        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)
        lat_var_name = lat_var_name.split('/')[-1]
        lon_var_name = lon_var_name.split('/')[-1]
    
        with netCDF4.Dataset(subsetted_filepath) as f:
            group_list = []
            def group_walk(groups, nc_d, current_group):
                global subsetted_ds_new
                subsetted_ds_new = None
                # check if the top group has lat or lon variable
                if lat_var_name in list(nc_d.variables.keys()):
                    subsetted_ds_new = subsetted_ds
                else:
                    # if not then we'll need to keep track of the group layers
                    group_list.append(current_group)
    
                # loop through the groups in the current layer
                for g in groups:
                    # end the loop if we've already found latitude
                    if subsetted_ds_new:
                        break
                    # check if the groups have latitude, define the dataset and end the loop if found
                    if lat_var_name in list(nc_d.groups[g].variables.keys()):
                        group_list.append(g)
                        g = '/'.join(group_list)
                        subsetted_ds_new = xarray.open_dataset(subsetted_filepath, group=g, decode_times=False)
                        break
                    # recall the function on a group that has groups in it and didn't find latitude
                    # this is going 'deeper' into the groups
                    if len(list(nc_d.groups[g].groups.keys())) > 0:
                        group_walk(nc_d.groups[g].groups, nc_d.groups[g], g)
                    else:
                        continue
    
>           group_walk(f.groups, f, '')

verify_collection.py:407: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
verify_collection.py:398: in group_walk
    subsetted_ds_new = xarray.open_dataset(subsetted_filepath, group=g, decode_times=False)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/api.py:571: in open_dataset
    backend_ds = backend.open_dataset(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:646: in open_dataset
    store = NetCDF4DataStore.open(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:409: in open
    return cls(manager, group=group, mode=mode, lock=lock, autoclose=autoclose)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:356: in __init__
    self.format = self.ds.data_model
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:418: in ds
    return self._acquire()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:413: in _acquire
    ds = _nc4_require_group(root, self._group, self._mode)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

ds = <[AttributeError('NetCDF: Not a valid ID') raised in repr()] Group object at 0x7f2243a1de40>
group = '/METADATA/PRODUCT', mode = 'r'
create_group = <function _netcdf4_create_group at 0x7f224c1353f0>

    def _nc4_require_group(ds, group, mode, create_group=_netcdf4_create_group):
        if group in {None, "", "/"}:
            # use the root group
            return ds
        else:
            # make sure it's a string
            if not isinstance(group, str):
                raise ValueError("group must be a string or None")
            # support path-like syntax
            path = group.strip("/").split("/")
            for key in path:
                try:
                    ds = ds.groups[key]
                except KeyError as e:
                    if mode != "r":
                        ds = create_group(ds, key)
                    else:
                        # wrap error to provide slightly more helpful message
>                       raise OSError(f"group not found: {key}", e)
E                       OSError: [Errno group not found: PRODUCT] 'PRODUCT'

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:196: OSError
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:344 Using granule G3061490195-GES_DISC for test
INFO     root:verify_collection.py:356 Sending harmony request https://harmony.earthdata.nasa.gov/C1918210023-GES_DISC/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat%28-77.495625%3A-60.267375%29&subset=lon%28-40.278800000000004%3A37.818799999999996%29&granuleId=G3061490195-GES_DISC
INFO     root:verify_collection.py:360 Submitted harmony job adbc7f07-76c3-45a8-b7d6-d2f33438a0b3
INFO     root:verify_collection.py:366 Downloaded: /tmp/pytest-of-runner/pytest-0/test_spatial_subset_C1918210020/63542362_S5P_OFFL_L2_HCHO_20240530T143120_20240530T161249_34351_03_020601_20240604T075226_subsetted.nc4

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

@github-actions github-actions / Regression test results for ops

test_spatial_subset[C2147478146-POCLOUD] (tests.verify_collection) failed

test-results/ops_test_report.xml [took 10m 0s]
Raw output
Failed: Timeout >600.0s
collection_concept_id = 'C2147478146-POCLOUD', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2147478146-POCLOUD', 'concept-id': 'G3059217589-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': 'C2147478146-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/test_spatial_subset_C2147478140')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...M1SxaPfRwaV4PnJa7zbVFlZLcvBhRvf4vqzuF5YM7NH6FVZLvYlGKaafF6MKL_It0xU_qyGVtYqXMQZPxtw3-X8U0FJk7UpNs1KArBsF0dKaHHXtrfp8lA'

    @pytest.mark.timeout(600)
    def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
                            harmony_env, tmp_path: pathlib.Path, bearer_token):
        test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
    
        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)
    
        # 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=True)

verify_collection.py:361: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:984: in wait_for_processing
    progress, status, message = self.progress(job_id)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:955: in progress
    response = session.get(self._status_url(job_id))
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/sessions.py:602: in get
    return self.request("GET", url, **kwargs)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/sessions.py:589: in request
    resp = self.send(prep, **send_kwargs)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/sessions.py:703: in send
    r = adapter.send(request, **kwargs)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:589: in send
    resp = conn.urlopen(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:793: in urlopen
    response = self._make_request(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:537: in _make_request
    response = conn.getresponse()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:466: in getresponse
    httplib_response = super().getresponse()
/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/http/client.py:1375: in getresponse
    response.begin()
/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/http/client.py:318: in begin
    version, status, reason = self._read_status()
/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/http/client.py:279: in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/socket.py:705: in readinto
    return self._sock.recv_into(b)
/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/ssl.py:1307: in recv_into
    return self.read(nbytes, buffer)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <ssl.SSLSocket [closed] fd=-1, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6>
len = 8192, buffer = <memory at 0x7f22437fab00>

    def read(self, len=1024, buffer=None):
        """Read up to LEN bytes and return them.
        Return zero-length string on EOF."""
    
        self._checkClosed()
        if self._sslobj is None:
            raise ValueError("Read on closed or unwrapped SSL socket.")
        try:
            if buffer is not None:
>               return self._sslobj.read(len, buffer)
E               Failed: Timeout >600.0s

/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/ssl.py:1163: Failed
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:344 Using granule G3059217589-POCLOUD for test
INFO     root:verify_collection.py:356 Sending harmony request https://harmony.earthdata.nasa.gov/C2147478146-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat%280.6085027500000031%3A37.255807250000004%29&subset=lon%28-12.84315425%3A23.50026425%29&granuleId=G3059217589-POCLOUD
INFO     root:verify_collection.py:360 Submitted harmony job c1e4fe3f-a33b-4843-819e-aee982fcec2b

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

@github-actions github-actions / Regression test results for ops

test_spatial_subset[C1627516287-GES_DISC] (tests.verify_collection) failed

test-results/ops_test_report.xml [took 31s]
Raw output
OSError: [Errno group not found: PRODUCT] 'PRODUCT'
ds = <[AttributeError('NetCDF: Not a valid ID') raised in repr()] Group object at 0x7f2243a1f140>
group = '/METADATA/PRODUCT', mode = 'r'
create_group = <function _netcdf4_create_group at 0x7f224c1353f0>

    def _nc4_require_group(ds, group, mode, create_group=_netcdf4_create_group):
        if group in {None, "", "/"}:
            # use the root group
            return ds
        else:
            # make sure it's a string
            if not isinstance(group, str):
                raise ValueError("group must be a string or None")
            # support path-like syntax
            path = group.strip("/").split("/")
            for key in path:
                try:
>                   ds = ds.groups[key]
E                   KeyError: 'PRODUCT'

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:190: KeyError

During handling of the above exception, another exception occurred:

collection_concept_id = 'C1627516287-GES_DISC', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C1627516287-GES_DISC', 'concept-id': 'G2084463561-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': 'C1627516287-GES_DISC'}]}, 'meta': {'association-details': {'collect...'URL': 'https://cdn.earthdata.nasa.gov/umm/variable/v1.9.0', 'Version': '1.9.0'}, 'Name': 'PRODUCT/corner', ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/test_spatial_subset_C1627516281')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...M1SxaPfRwaV4PnJa7zbVFlZLcvBhRvf4vqzuF5YM7NH6FVZLvYlGKaafF6MKL_It0xU_qyGVtYqXMQZPxtw3-X8U0FJk7UpNs1KArBsF0dKaHHXtrfp8lA'

    @pytest.mark.timeout(600)
    def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
                            harmony_env, tmp_path: pathlib.Path, bearer_token):
        test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
    
        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)
    
        # 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=True)
        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)
        lat_var_name = lat_var_name.split('/')[-1]
        lon_var_name = lon_var_name.split('/')[-1]
    
        with netCDF4.Dataset(subsetted_filepath) as f:
            group_list = []
            def group_walk(groups, nc_d, current_group):
                global subsetted_ds_new
                subsetted_ds_new = None
                # check if the top group has lat or lon variable
                if lat_var_name in list(nc_d.variables.keys()):
                    subsetted_ds_new = subsetted_ds
                else:
                    # if not then we'll need to keep track of the group layers
                    group_list.append(current_group)
    
                # loop through the groups in the current layer
                for g in groups:
                    # end the loop if we've already found latitude
                    if subsetted_ds_new:
                        break
                    # check if the groups have latitude, define the dataset and end the loop if found
                    if lat_var_name in list(nc_d.groups[g].variables.keys()):
                        group_list.append(g)
                        g = '/'.join(group_list)
                        subsetted_ds_new = xarray.open_dataset(subsetted_filepath, group=g, decode_times=False)
                        break
                    # recall the function on a group that has groups in it and didn't find latitude
                    # this is going 'deeper' into the groups
                    if len(list(nc_d.groups[g].groups.keys())) > 0:
                        group_walk(nc_d.groups[g].groups, nc_d.groups[g], g)
                    else:
                        continue
    
>           group_walk(f.groups, f, '')

verify_collection.py:407: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
verify_collection.py:398: in group_walk
    subsetted_ds_new = xarray.open_dataset(subsetted_filepath, group=g, decode_times=False)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/api.py:571: in open_dataset
    backend_ds = backend.open_dataset(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:646: in open_dataset
    store = NetCDF4DataStore.open(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:409: in open
    return cls(manager, group=group, mode=mode, lock=lock, autoclose=autoclose)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:356: in __init__
    self.format = self.ds.data_model
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:418: in ds
    return self._acquire()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:413: in _acquire
    ds = _nc4_require_group(root, self._group, self._mode)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

ds = <[AttributeError('NetCDF: Not a valid ID') raised in repr()] Group object at 0x7f2243a1f140>
group = '/METADATA/PRODUCT', mode = 'r'
create_group = <function _netcdf4_create_group at 0x7f224c1353f0>

    def _nc4_require_group(ds, group, mode, create_group=_netcdf4_create_group):
        if group in {None, "", "/"}:
            # use the root group
            return ds
        else:
            # make sure it's a string
            if not isinstance(group, str):
                raise ValueError("group must be a string or None")
            # support path-like syntax
            path = group.strip("/").split("/")
            for key in path:
                try:
                    ds = ds.groups[key]
                except KeyError as e:
                    if mode != "r":
                        ds = create_group(ds, key)
                    else:
                        # wrap error to provide slightly more helpful message
>                       raise OSError(f"group not found: {key}", e)
E                       OSError: [Errno group not found: PRODUCT] 'PRODUCT'

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:196: OSError
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:344 Using granule G2084463561-GES_DISC for test
INFO     root:verify_collection.py:356 Sending harmony request https://harmony.earthdata.nasa.gov/C1627516287-GES_DISC/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat%28-76.99937499999999%3A-59.951625%29&subset=lon%28-76.6214%3A-1.5866000000000042%29&granuleId=G2084463561-GES_DISC
INFO     root:verify_collection.py:360 Submitted harmony job f7537cd7-15ca-4fcb-ba23-40ab99636a2c
INFO     root:verify_collection.py:366 Downloaded: /tmp/pytest-of-runner/pytest-0/test_spatial_subset_C1627516281/63548838_S5P_OFFL_L2_CO_20210701T170324_20210701T184453_19257_01_010400_20210703T065107_subsetted.nc4

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

@github-actions github-actions / Regression test results for ops

test_spatial_subset[C1627516290-GES_DISC] (tests.verify_collection) failed

test-results/ops_test_report.xml [took 14s]
Raw output
Exception: ('Internal Server Error', 'Error: Internal server error')
collection_concept_id = 'C1627516290-GES_DISC', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C1627516290-GES_DISC', 'concept-id': 'G2897233694-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': 'C1627516290-GES_DISC'}]}, 'meta': {'association-details': {'collect...tracted from _FillValue metadata attribute', 'Type': 'SCIENCE_FILLVALUE', 'Value': 9.969209968386869e+36}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/test_spatial_subset_C1627516293')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...M1SxaPfRwaV4PnJa7zbVFlZLcvBhRvf4vqzuF5YM7NH6FVZLvYlGKaafF6MKL_It0xU_qyGVtYqXMQZPxtw3-X8U0FJk7UpNs1KArBsF0dKaHHXtrfp8lA'

    @pytest.mark.timeout(600)
    def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
                            harmony_env, tmp_path: pathlib.Path, bearer_token):
        test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
    
        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)
    
        # 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=True)

verify_collection.py:361: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:984: in wait_for_processing
    progress, status, message = self.progress(job_id)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:960: in progress
    self._handle_error_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <harmony.harmony.Client object at 0x7f224d1bc730>
response = <Response [500]>

    def _handle_error_response(self, response: Response):
        """Raises the appropriate exception based on the response
        received from Harmony. Tries to pull out an error message
        from a Harmony JSON response when possible.
    
        Args:
            response: The Response from Harmony
    
        Raises:
            Exception with a Harmony error message or a more generic
            HTTPError
        """
        if 'application/json' in response.headers.get('Content-Type', ''):
            exception_message = None
            try:
                response_json = response.json()
                if hasattr(response_json, 'get'):
                    exception_message = response_json.get('description')
                    if not exception_message:
                        exception_message = response_json.get('error')
            except JSONDecodeError:
                pass
            if exception_message:
>               raise Exception(response.reason, exception_message)
E               Exception: ('Internal Server Error', 'Error: Internal server error')

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:784: Exception
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:344 Using granule G2897233694-GES_DISC for test
INFO     root:verify_collection.py:356 Sending harmony request https://harmony.earthdata.nasa.gov/C1627516290-GES_DISC/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat%28-76.855425%3A-59.695575%29&subset=lon%28-76.722325%3A-1.608674999999998%29&granuleId=G2897233694-GES_DISC
INFO     root:verify_collection.py:360 Submitted harmony job 97b6ddb9-cc28-4977-8cec-b2f7fadafa0e

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

@github-actions github-actions / Regression test results for ops

test_spatial_subset[C2041965187-GES_DISC] (tests.verify_collection) failed

test-results/ops_test_report.xml [took 3s]
Raw output
Exception: ('Internal Server Error', 'Error: Failed to query the CMR')
collection_concept_id = 'C2041965187-GES_DISC', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C2041965187-GES_DISC', 'concept-id': 'G2058787902-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': 'C2041965187-GES_DISC'}]}, 'meta': {'association-details': {'collect...Description': 'Extracted from _FillValue metadata attribute', 'Type': 'SCIENCE_FILLVALUE', 'Value': -999}], ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/test_spatial_subset_C2041965180')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...M1SxaPfRwaV4PnJa7zbVFlZLcvBhRvf4vqzuF5YM7NH6FVZLvYlGKaafF6MKL_It0xU_qyGVtYqXMQZPxtw3-X8U0FJk7UpNs1KArBsF0dKaHHXtrfp8lA'

    @pytest.mark.timeout(600)
    def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
                            harmony_env, tmp_path: pathlib.Path, bearer_token):
        test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
    
        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)
    
        # 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)

verify_collection.py:359: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:851: in submit
    self._handle_error_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <harmony.harmony.Client object at 0x7f2244de7940>
response = <Response [500]>

    def _handle_error_response(self, response: Response):
        """Raises the appropriate exception based on the response
        received from Harmony. Tries to pull out an error message
        from a Harmony JSON response when possible.
    
        Args:
            response: The Response from Harmony
    
        Raises:
            Exception with a Harmony error message or a more generic
            HTTPError
        """
        if 'application/json' in response.headers.get('Content-Type', ''):
            exception_message = None
            try:
                response_json = response.json()
                if hasattr(response_json, 'get'):
                    exception_message = response_json.get('description')
                    if not exception_message:
                        exception_message = response_json.get('error')
            except JSONDecodeError:
                pass
            if exception_message:
>               raise Exception(response.reason, exception_message)
E               Exception: ('Internal Server Error', 'Error: Failed to query the CMR')

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:784: Exception
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:344 Using granule G2058787902-GES_DISC for test
INFO     root:verify_collection.py:356 Sending harmony request https://harmony.earthdata.nasa.gov/C2041965187-GES_DISC/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat%28-58.5%3A-1.5%29&subset=lon%28101.95%3A176.05%29&granuleId=G2058787902-GES_DISC

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

@github-actions github-actions / Regression test results for ops

test_spatial_subset[C1729925806-GES_DISC] (tests.verify_collection) failed

test-results/ops_test_report.xml [took 27s]
Raw output
assert False
collection_concept_id = 'C1729925806-GES_DISC', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C1729925806-GES_DISC', 'concept-id': 'G3058235026-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/test_spatial_subset_C1729925800')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...M1SxaPfRwaV4PnJa7zbVFlZLcvBhRvf4vqzuF5YM7NH6FVZLvYlGKaafF6MKL_It0xU_qyGVtYqXMQZPxtw3-X8U0FJk7UpNs1KArBsF0dKaHHXtrfp8lA'

    @pytest.mark.timeout(600)
    def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
                            harmony_env, tmp_path: pathlib.Path, bearer_token):
        test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
    
        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)
    
        # 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=True)
        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)
        lat_var_name = lat_var_name.split('/')[-1]
        lon_var_name = lon_var_name.split('/')[-1]
    
        with netCDF4.Dataset(subsetted_filepath) as f:
            group_list = []
            def group_walk(groups, nc_d, current_group):
                global subsetted_ds_new
                subsetted_ds_new = None
                # check if the top group has lat or lon variable
                if lat_var_name in list(nc_d.variables.keys()):
                    subsetted_ds_new = subsetted_ds
                else:
                    # if not then we'll need to keep track of the group layers
                    group_list.append(current_group)
    
                # loop through the groups in the current layer
                for g in groups:
                    # end the loop if we've already found latitude
                    if subsetted_ds_new:
                        break
                    # check if the groups have latitude, define the dataset and end the loop if found
                    if lat_var_name in list(nc_d.groups[g].variables.keys()):
                        group_list.append(g)
                        g = '/'.join(group_list)
                        subsetted_ds_new = xarray.open_dataset(subsetted_filepath, group=g, decode_times=False)
                        break
                    # recall the function on a group that has groups in it and didn't find latitude
                    # this is going 'deeper' into the groups
                    if len(list(nc_d.groups[g].groups.keys())) > 0:
                        group_walk(nc_d.groups[g].groups, nc_d.groups[g], g)
                    else:
                        continue
    
            group_walk(f.groups, f, '')
    
        assert lat_var_name and lon_var_name
    
        var_ds = None
        msk = None
    
        if science_vars := get_science_vars(collection_variables):
            for idx, value in enumerate(science_vars):
                science_var_name = science_vars[idx]['umm']['Name']
                try:
                    var_ds = subsetted_ds_new[science_var_name]
                    msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
                    break
                except Exception:
                    try:
                        # if the variable couldn't be found because the name includes a group, e.g.,
                        # `geolocation/relative_azimuth_angle`,
                        # then try to access the variable after removing the group name.
                        var_ds = subsetted_ds_new[science_var_name.rsplit("/", 1)[-1]]
                        msk = np.logical_not(np.isnan(var_ds.data.squeeze()))
                        break
                    except Exception:
                        var_ds = None
                        msk = None
    
            if var_ds is None and msk is None:
                pytest.fail(f"Unable to find variable from umm-v to use as science variable.")
    
        else:
            # Can't find a science var in UMM-V, just pick one
    
            science_var_name = next(iter([v for v in subsetted_ds_new.variables if
                                        str(v) not in lat_var_name and str(v) not in lon_var_name and 'time' not in str(v)]))
    
            var_ds = subsetted_ds_new[science_var_name]
    
        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')
    
        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")
            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")
            else:
>               assert False
E               assert False

verify_collection.py:479: AssertionError
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:344 Using granule G3058235026-GES_DISC for test
INFO     root:verify_collection.py:356 Sending harmony request https://harmony.earthdata.nasa.gov/C1729925806-GES_DISC/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat%28-85.5%3A85.5%29&subset=lon%28-171.0%3A171.0%29&granuleId=G3058235026-GES_DISC
INFO     root:verify_collection.py:360 Submitted harmony job 4e077ddd-cf16-45c4-b618-3ea4206bc106
INFO     root:verify_collection.py:366 Downloaded: /tmp/pytest-of-runner/pytest-0/test_spatial_subset_C1729925800/63548878_MLS-Aura_L2GP-O3_v05-03-c01_2024d153_subsetted.nc4
INFO     root:verify_collection.py:467 Successful Latitude subsetting

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

@github-actions github-actions / Regression test results for ops

test_spatial_subset[C1627516288-GES_DISC] (tests.verify_collection) failed

test-results/ops_test_report.xml [took 47s]
Raw output
OSError: [Errno group not found: PRODUCT] 'PRODUCT'
ds = <[AttributeError('NetCDF: Not a valid ID') raised in repr()] Group object at 0x7f2243904640>
group = '/METADATA/PRODUCT', mode = 'r'
create_group = <function _netcdf4_create_group at 0x7f224c1353f0>

    def _nc4_require_group(ds, group, mode, create_group=_netcdf4_create_group):
        if group in {None, "", "/"}:
            # use the root group
            return ds
        else:
            # make sure it's a string
            if not isinstance(group, str):
                raise ValueError("group must be a string or None")
            # support path-like syntax
            path = group.strip("/").split("/")
            for key in path:
                try:
>                   ds = ds.groups[key]
E                   KeyError: 'PRODUCT'

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:190: KeyError

During handling of the above exception, another exception occurred:

collection_concept_id = 'C1627516288-GES_DISC', env = 'ops'
granule_json = {'meta': {'collection-concept-id': 'C1627516288-GES_DISC', 'concept-id': 'G2085128317-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': 'C1627516288-GES_DISC'}]}, 'meta': {'association-details': {'collect... 'https://cdn.earthdata.nasa.gov/umm/variable/v1.9.0', 'Version': '1.9.0'}, 'Name': 'PRODUCT/ground_pixel', ...}}, ...]
harmony_env = <Environment.PROD: 4>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/test_spatial_subset_C1627516282')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...M1SxaPfRwaV4PnJa7zbVFlZLcvBhRvf4vqzuF5YM7NH6FVZLvYlGKaafF6MKL_It0xU_qyGVtYqXMQZPxtw3-X8U0FJk7UpNs1KArBsF0dKaHHXtrfp8lA'

    @pytest.mark.timeout(600)
    def test_spatial_subset(collection_concept_id, env, granule_json, collection_variables,
                            harmony_env, tmp_path: pathlib.Path, bearer_token):
        test_spatial_subset.__doc__ = f"Verify spatial subset for {collection_concept_id} in {env}"
    
        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)
    
        # 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=True)
        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)
        lat_var_name = lat_var_name.split('/')[-1]
        lon_var_name = lon_var_name.split('/')[-1]
    
        with netCDF4.Dataset(subsetted_filepath) as f:
            group_list = []
            def group_walk(groups, nc_d, current_group):
                global subsetted_ds_new
                subsetted_ds_new = None
                # check if the top group has lat or lon variable
                if lat_var_name in list(nc_d.variables.keys()):
                    subsetted_ds_new = subsetted_ds
                else:
                    # if not then we'll need to keep track of the group layers
                    group_list.append(current_group)
    
                # loop through the groups in the current layer
                for g in groups:
                    # end the loop if we've already found latitude
                    if subsetted_ds_new:
                        break
                    # check if the groups have latitude, define the dataset and end the loop if found
                    if lat_var_name in list(nc_d.groups[g].variables.keys()):
                        group_list.append(g)
                        g = '/'.join(group_list)
                        subsetted_ds_new = xarray.open_dataset(subsetted_filepath, group=g, decode_times=False)
                        break
                    # recall the function on a group that has groups in it and didn't find latitude
                    # this is going 'deeper' into the groups
                    if len(list(nc_d.groups[g].groups.keys())) > 0:
                        group_walk(nc_d.groups[g].groups, nc_d.groups[g], g)
                    else:
                        continue
    
>           group_walk(f.groups, f, '')

verify_collection.py:407: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
verify_collection.py:398: in group_walk
    subsetted_ds_new = xarray.open_dataset(subsetted_filepath, group=g, decode_times=False)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/api.py:571: in open_dataset
    backend_ds = backend.open_dataset(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:646: in open_dataset
    store = NetCDF4DataStore.open(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:409: in open
    return cls(manager, group=group, mode=mode, lock=lock, autoclose=autoclose)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:356: in __init__
    self.format = self.ds.data_model
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:418: in ds
    return self._acquire()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:413: in _acquire
    ds = _nc4_require_group(root, self._group, self._mode)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

ds = <[AttributeError('NetCDF: Not a valid ID') raised in repr()] Group object at 0x7f2243904640>
group = '/METADATA/PRODUCT', mode = 'r'
create_group = <function _netcdf4_create_group at 0x7f224c1353f0>

    def _nc4_require_group(ds, group, mode, create_group=_netcdf4_create_group):
        if group in {None, "", "/"}:
            # use the root group
            return ds
        else:
            # make sure it's a string
            if not isinstance(group, str):
                raise ValueError("group must be a string or None")
            # support path-like syntax
            path = group.strip("/").split("/")
            for key in path:
                try:
                    ds = ds.groups[key]
                except KeyError as e:
                    if mode != "r":
                        ds = create_group(ds, key)
                    else:
                        # wrap error to provide slightly more helpful message
>                       raise OSError(f"group not found: {key}", e)
E                       OSError: [Errno group not found: PRODUCT] 'PRODUCT'

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/xarray/backends/netCDF4_.py:196: OSError
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:344 Using granule G2085128317-GES_DISC for test
INFO     root:verify_collection.py:356 Sending harmony request https://harmony.earthdata.nasa.gov/C1627516288-GES_DISC/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat%28-76.99937499999999%3A-59.951625%29&subset=lon%28-76.6214%3A-1.5866000000000042%29&granuleId=G2085128317-GES_DISC
INFO     root:verify_collection.py:360 Submitted harmony job cca70eb0-c671-4aa6-acad-c59b794e4950
INFO     root:verify_collection.py:366 Downloaded: /tmp/pytest-of-runner/pytest-0/test_spatial_subset_C1627516282/63548896_S5P_OFFL_L2_CH4_20210701T170324_20210701T184453_19257_01_010400_20210703T102338_subsetted.nc4

Check notice on line 0 in .github

See this annotation in the file changed.

@github-actions github-actions / Regression test results for ops

276 tests found

There are 276 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[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[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[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[C2601581863-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2601584109-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[C2724037909-LARC_CLOUD]
tests.verify_collection ‑ test_spatial_subset[C2724046381-LARC_CLOUD]
tests.verify_collection ‑ test_spatial_subset[C2724057189-LARC_CLOUD]
tests.verify_collection ‑ test_spatial_subset[C2730520815-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2732717000-LARC_CLOUD]
tests.verify_collection ‑ test_spatial_subset[C2746966926-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C2746966927-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[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]