Skip to content

Re-Run Unverified PRs #199

Re-Run Unverified PRs

Re-Run Unverified PRs #199

GitHub Actions / Regression test results for uat failed Dec 16, 2024 in 0s

6 errors, 9 fail, 3 skipped, 464 pass in 27m 36s

482 tests   464 ✅  27m 36s ⏱️
  1 suites    3 💤
  1 files      9 ❌  6 🔥

Results for commit 8731645.

Annotations

Check failure on line 0 in tests.verify_collection

See this annotation in the file changed.

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

test_spatial_subset[C1244810554-POCLOUD] (tests.verify_collection) with error

test-results/uat_test_report.xml [took 1s]
Raw output
failed on setup with "requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))"
self = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f1165247760>
method = 'GET'
url = '/search/variables.umm_json?concept_id%5B%5D=V1257407947-POCLOUD&concept_id%5B%5D=V1257407911-POCLOUD&concept_id%5B%5D...V1257407937-POCLOUD&concept_id%5B%5D=V1257407939-POCLOUD&concept_id%5B%5D=V1257407959-POCLOUD&page_size=28&page_num=17'
body = None
headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
redirect = False, assert_same_host = False
timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
release_conn = False, chunked = False, body_pos = None, preload_content = False
decode_content = False, response_kw = {}
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/search/variables.umm_json', query='concept_id%5B%5D=V12574079...OUD&concept_id%5B%5D=V1257407939-POCLOUD&concept_id%5B%5D=V1257407959-POCLOUD&page_size=28&page_num=17', fragment=None)
destination_scheme = None, conn = None, release_this_conn = True
http_tunnel_required = False, err = None, clean_exit = False

    def urlopen(  # type: ignore[override]
        self,
        method: str,
        url: str,
        body: _TYPE_BODY | None = None,
        headers: typing.Mapping[str, str] | None = None,
        retries: Retry | bool | int | None = None,
        redirect: bool = True,
        assert_same_host: bool = True,
        timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
        pool_timeout: int | None = None,
        release_conn: bool | None = None,
        chunked: bool = False,
        body_pos: _TYPE_BODY_POSITION | None = None,
        preload_content: bool = True,
        decode_content: bool = True,
        **response_kw: typing.Any,
    ) -> BaseHTTPResponse:
        """
        Get a connection from the pool and perform an HTTP request. This is the
        lowest level call for making a request, so you'll need to specify all
        the raw details.
    
        .. note::
    
           More commonly, it's appropriate to use a convenience method
           such as :meth:`request`.
    
        .. note::
    
           `release_conn` will only behave as expected if
           `preload_content=False` because we want to make
           `preload_content=False` the default behaviour someday soon without
           breaking backwards compatibility.
    
        :param method:
            HTTP request method (such as GET, POST, PUT, etc.)
    
        :param url:
            The URL to perform the request on.
    
        :param body:
            Data to send in the request body, either :class:`str`, :class:`bytes`,
            an iterable of :class:`str`/:class:`bytes`, or a file-like object.
    
        :param headers:
            Dictionary of custom headers to send, such as User-Agent,
            If-None-Match, etc. If None, pool headers are used. If provided,
            these headers completely replace any pool-specific headers.
    
        :param retries:
            Configure the number of retries to allow before raising a
            :class:`~urllib3.exceptions.MaxRetryError` exception.
    
            If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
            :class:`~urllib3.util.retry.Retry` object for fine-grained control
            over different types of retries.
            Pass an integer number to retry connection errors that many times,
            but no other types of errors. Pass zero to never retry.
    
            If ``False``, then retries are disabled and any exception is raised
            immediately. Also, instead of raising a MaxRetryError on redirects,
            the redirect response will be returned.
    
        :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
    
        :param redirect:
            If True, automatically handle redirects (status codes 301, 302,
            303, 307, 308). Each redirect counts as a retry. Disabling retries
            will disable redirect, too.
    
        :param assert_same_host:
            If ``True``, will make sure that the host of the pool requests is
            consistent else will raise HostChangedError. When ``False``, you can
            use the pool on an HTTP proxy and request foreign hosts.
    
        :param timeout:
            If specified, overrides the default timeout for this one
            request. It may be a float (in seconds) or an instance of
            :class:`urllib3.util.Timeout`.
    
        :param pool_timeout:
            If set and the pool is set to block=True, then this method will
            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
            connection is available within the time period.
    
        :param bool preload_content:
            If True, the response's body will be preloaded into memory.
    
        :param bool decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.
    
        :param release_conn:
            If False, then the urlopen call will not release the connection
            back into the pool once a response is received (but will release if
            you read the entire contents of the response such as when
            `preload_content=True`). This is useful if you're not preloading
            the response's content immediately. You will need to call
            ``r.release_conn()`` on the response ``r`` to return the connection
            back into the pool. If None, it takes the value of ``preload_content``
            which defaults to ``True``.
    
        :param bool chunked:
            If True, urllib3 will send the body using chunked transfer
            encoding. Otherwise, urllib3 will send the body using the standard
            content-length form. Defaults to False.
    
        :param int body_pos:
            Position to seek to in file-like body in the event of a retry or
            redirect. Typically this won't need to be set because urllib3 will
            auto-populate the value when needed.
        """
        parsed_url = parse_url(url)
        destination_scheme = parsed_url.scheme
    
        if headers is None:
            headers = self.headers
    
        if not isinstance(retries, Retry):
            retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
    
        if release_conn is None:
            release_conn = preload_content
    
        # Check host
        if assert_same_host and not self.is_same_host(url):
            raise HostChangedError(self, url, retries)
    
        # Ensure that the URL we're connecting to is properly encoded
        if url.startswith("/"):
            url = to_str(_encode_target(url))
        else:
            url = to_str(parsed_url.url)
    
        conn = None
    
        # Track whether `conn` needs to be released before
        # returning/raising/recursing. Update this variable if necessary, and
        # leave `release_conn` constant throughout the function. That way, if
        # the function recurses, the original value of `release_conn` will be
        # passed down into the recursive call, and its value will be respected.
        #
        # See issue #651 [1] for details.
        #
        # [1] <https://github.com/urllib3/urllib3/issues/651>
        release_this_conn = release_conn
    
        http_tunnel_required = connection_requires_http_tunnel(
            self.proxy, self.proxy_config, destination_scheme
        )
    
        # Merge the proxy headers. Only done when not using HTTP CONNECT. We
        # have to copy the headers dict so we can safely change it without those
        # changes being reflected in anyone else's copy.
        if not http_tunnel_required:
            headers = headers.copy()  # type: ignore[attr-defined]
            headers.update(self.proxy_headers)  # type: ignore[union-attr]
    
        # Must keep the exception bound to a separate variable or else Python 3
        # complains about UnboundLocalError.
        err = None
    
        # Keep track of whether we cleanly exited the except block. This
        # ensures we do proper cleanup in finally.
        clean_exit = False
    
        # Rewind body position, if needed. Record current position
        # for future rewinds in the event of a redirect/retry.
        body_pos = set_file_position(body, body_pos)
    
        try:
            # Request a connection from the queue.
            timeout_obj = self._get_timeout(timeout)
            conn = self._get_conn(timeout=pool_timeout)
    
            conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
    
            # Is this a closed/new connection that requires CONNECT tunnelling?
            if self.proxy is not None and http_tunnel_required and conn.is_closed:
                try:
                    self._prepare_proxy(conn)
                except (BaseSSLError, OSError, SocketTimeout) as e:
                    self._raise_timeout(
                        err=e, url=self.proxy.url, timeout_value=conn.timeout
                    )
                    raise
    
            # If we're going to release the connection in ``finally:``, then
            # the response doesn't need to know about the connection. Otherwise
            # it will also try to release it and we'll have a double-release
            # mess.
            response_conn = conn if not release_conn else None
    
            # Make the request on the HTTPConnection object
>           response = self._make_request(
                conn,
                method,
                url,
                timeout=timeout_obj,
                body=body,
                headers=headers,
                chunked=chunked,
                retries=retries,
                response_conn=response_conn,
                preload_content=preload_content,
                decode_content=decode_content,
                **response_kw,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:536: in _make_request
    response = conn.getresponse()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:507: in getresponse
    httplib_response = super().getresponse()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:1375: in getresponse
    response.begin()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:318: in begin
    version, status, reason = self._read_status()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <http.client.HTTPResponse object at 0x7f1165567580>

    def _read_status(self):
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
        if len(line) > _MAXLINE:
            raise LineTooLong("status line")
        if self.debuglevel > 0:
            print("reply:", repr(line))
        if not line:
            # Presumably, the server closed the connection before
            # sending a valid response.
>           raise RemoteDisconnected("Remote end closed connection without"
                                     " response")
E           http.client.RemoteDisconnected: Remote end closed connection without response

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:287: RemoteDisconnected

During handling of the above exception, another exception occurred:

self = <requests.adapters.HTTPAdapter object at 0x7f1165244970>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
>           resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:667: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:843: in urlopen
    retries = retries.increment(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/retry.py:474: in increment
    raise reraise(type(error), error, _stacktrace)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/util.py:38: in reraise
    raise value.with_traceback(tb)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: in urlopen
    response = self._make_request(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:536: in _make_request
    response = conn.getresponse()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:507: in getresponse
    httplib_response = super().getresponse()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:1375: in getresponse
    response.begin()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:318: in begin
    version, status, reason = self._read_status()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <http.client.HTTPResponse object at 0x7f1165567580>

    def _read_status(self):
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
        if len(line) > _MAXLINE:
            raise LineTooLong("status line")
        if self.debuglevel > 0:
            print("reply:", repr(line))
        if not line:
            # Presumably, the server closed the connection before
            # sending a valid response.
>           raise RemoteDisconnected("Remote end closed connection without"
                                     " response")
E           urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:287: ProtocolError

During handling of the above exception, another exception occurred:

cmr_mode = 'https://cmr.uat.earthdata.nasa.gov/search/'
collection_concept_id = 'C1244810554-POCLOUD', env = 'uat'
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'

    @pytest.fixture(scope="function")
    def collection_variables(cmr_mode, collection_concept_id, env, bearer_token):
        collection_query = cmr.queries.CollectionQuery(mode=cmr_mode)
        variable_query = cmr.queries.VariableQuery(mode=cmr_mode)
    
        collection_res = collection_query.concept_id(collection_concept_id).token(bearer_token).get()[0]
        collection_associations = collection_res.get("associations")
        variable_concept_ids = collection_associations.get("variables")
    
        if variable_concept_ids is None:
            pytest.fail(f'There are no umm-v associated with this collection in {env}')
    
        variables = []
        for i in range(0, len(variable_concept_ids), 40):
            variables_items = variable_query \
                .concept_id(variable_concept_ids[i:i + 40]) \
                .token(bearer_token) \
                .format('umm_json') \
>               .get_all()

verify_collection.py:171: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:127: in get_all
    return self.get(self.hits())
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:1121: in get
    response = requests.get(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:73: in get
    return request("get", url, params=params, **kwargs)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:59: in request
    return session.request(method=method, url=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)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <requests.adapters.HTTPAdapter object at 0x7f1165244970>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
            resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )
    
        except (ProtocolError, OSError) as err:
>           raise ConnectionError(err, request=request)
E           requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:682: ConnectionError
--------------------------------- Captured Log ---------------------------------

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

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

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

test-results/uat_test_report.xml [took 39s]
Raw output
Failed: No data in lon and lat
collection_concept_id = 'C1233405381-GES_DISC', env = 'uat'
granule_json = {'meta': {'collection-concept-id': 'C1233405381-GES_DISC', 'concept-id': 'G1255750648-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': 'C1233405381-GES_DISC'}]}, 'meta': {'association-details': {'collect...https://cdn.earthdata.nasa.gov/umm/variable/v1.9.0', 'Version': '1.9.0'}, 'Name': 'ave_kern/air_temp_func_htop'}}, ...]
harmony_env = <Environment.UAT: 3>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw3/test_spatial_subset_C1233405380')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'
skip_spatial = set()

    @pytest.mark.timeout(600)
    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=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, 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 G1255750648-GES_DISC for test
INFO     root:verify_collection.py:457 Sending harmony request https://harmony.uat.earthdata.nasa.gov/C1233405381-GES_DISC/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-30.28875%3A-7.821250000000001%29&subset=lon%28-5.668749999999999%3A15.278749999999999%29&granuleId=G1255750648-GES_DISC&variable=all
INFO     root:verify_collection.py:461 Submitted harmony job 98f39e5d-f009-465d-83e2-9e9556946d08
INFO     root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw3/test_spatial_subset_C1233405380/4930584_SNDR.AQUA.AIRS_IM.20160101T0059.m06.g010.L2_CLIMCAPS_RET.std.v02_39.G.210412145010_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 failure on line 0 in tests.verify_collection

See this annotation in the file changed.

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

test_spatial_subset[C1238538240-POCLOUD] (tests.verify_collection) with error

test-results/uat_test_report.xml [took 3s]
Raw output
failed on setup with "requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))"
self = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7fbfb2364820>
method = 'GET'
url = '/search/variables.umm_json?concept_id%5B%5D=V1240763819-POCLOUD&concept_id%5B%5D=V1240764079-POCLOUD&concept_id%5B%5D...=V1240763874-POCLOUD&concept_id%5B%5D=V1240763762-POCLOUD&concept_id%5B%5D=V1240763941-POCLOUD&page_size=40&page_num=5'
body = None
headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
redirect = False, assert_same_host = False
timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
release_conn = False, chunked = False, body_pos = None, preload_content = False
decode_content = False, response_kw = {}
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/search/variables.umm_json', query='concept_id%5B%5D=V12407638...LOUD&concept_id%5B%5D=V1240763762-POCLOUD&concept_id%5B%5D=V1240763941-POCLOUD&page_size=40&page_num=5', fragment=None)
destination_scheme = None, conn = None, release_this_conn = True
http_tunnel_required = False, err = None, clean_exit = False

    def urlopen(  # type: ignore[override]
        self,
        method: str,
        url: str,
        body: _TYPE_BODY | None = None,
        headers: typing.Mapping[str, str] | None = None,
        retries: Retry | bool | int | None = None,
        redirect: bool = True,
        assert_same_host: bool = True,
        timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
        pool_timeout: int | None = None,
        release_conn: bool | None = None,
        chunked: bool = False,
        body_pos: _TYPE_BODY_POSITION | None = None,
        preload_content: bool = True,
        decode_content: bool = True,
        **response_kw: typing.Any,
    ) -> BaseHTTPResponse:
        """
        Get a connection from the pool and perform an HTTP request. This is the
        lowest level call for making a request, so you'll need to specify all
        the raw details.
    
        .. note::
    
           More commonly, it's appropriate to use a convenience method
           such as :meth:`request`.
    
        .. note::
    
           `release_conn` will only behave as expected if
           `preload_content=False` because we want to make
           `preload_content=False` the default behaviour someday soon without
           breaking backwards compatibility.
    
        :param method:
            HTTP request method (such as GET, POST, PUT, etc.)
    
        :param url:
            The URL to perform the request on.
    
        :param body:
            Data to send in the request body, either :class:`str`, :class:`bytes`,
            an iterable of :class:`str`/:class:`bytes`, or a file-like object.
    
        :param headers:
            Dictionary of custom headers to send, such as User-Agent,
            If-None-Match, etc. If None, pool headers are used. If provided,
            these headers completely replace any pool-specific headers.
    
        :param retries:
            Configure the number of retries to allow before raising a
            :class:`~urllib3.exceptions.MaxRetryError` exception.
    
            If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
            :class:`~urllib3.util.retry.Retry` object for fine-grained control
            over different types of retries.
            Pass an integer number to retry connection errors that many times,
            but no other types of errors. Pass zero to never retry.
    
            If ``False``, then retries are disabled and any exception is raised
            immediately. Also, instead of raising a MaxRetryError on redirects,
            the redirect response will be returned.
    
        :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
    
        :param redirect:
            If True, automatically handle redirects (status codes 301, 302,
            303, 307, 308). Each redirect counts as a retry. Disabling retries
            will disable redirect, too.
    
        :param assert_same_host:
            If ``True``, will make sure that the host of the pool requests is
            consistent else will raise HostChangedError. When ``False``, you can
            use the pool on an HTTP proxy and request foreign hosts.
    
        :param timeout:
            If specified, overrides the default timeout for this one
            request. It may be a float (in seconds) or an instance of
            :class:`urllib3.util.Timeout`.
    
        :param pool_timeout:
            If set and the pool is set to block=True, then this method will
            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
            connection is available within the time period.
    
        :param bool preload_content:
            If True, the response's body will be preloaded into memory.
    
        :param bool decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.
    
        :param release_conn:
            If False, then the urlopen call will not release the connection
            back into the pool once a response is received (but will release if
            you read the entire contents of the response such as when
            `preload_content=True`). This is useful if you're not preloading
            the response's content immediately. You will need to call
            ``r.release_conn()`` on the response ``r`` to return the connection
            back into the pool. If None, it takes the value of ``preload_content``
            which defaults to ``True``.
    
        :param bool chunked:
            If True, urllib3 will send the body using chunked transfer
            encoding. Otherwise, urllib3 will send the body using the standard
            content-length form. Defaults to False.
    
        :param int body_pos:
            Position to seek to in file-like body in the event of a retry or
            redirect. Typically this won't need to be set because urllib3 will
            auto-populate the value when needed.
        """
        parsed_url = parse_url(url)
        destination_scheme = parsed_url.scheme
    
        if headers is None:
            headers = self.headers
    
        if not isinstance(retries, Retry):
            retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
    
        if release_conn is None:
            release_conn = preload_content
    
        # Check host
        if assert_same_host and not self.is_same_host(url):
            raise HostChangedError(self, url, retries)
    
        # Ensure that the URL we're connecting to is properly encoded
        if url.startswith("/"):
            url = to_str(_encode_target(url))
        else:
            url = to_str(parsed_url.url)
    
        conn = None
    
        # Track whether `conn` needs to be released before
        # returning/raising/recursing. Update this variable if necessary, and
        # leave `release_conn` constant throughout the function. That way, if
        # the function recurses, the original value of `release_conn` will be
        # passed down into the recursive call, and its value will be respected.
        #
        # See issue #651 [1] for details.
        #
        # [1] <https://github.com/urllib3/urllib3/issues/651>
        release_this_conn = release_conn
    
        http_tunnel_required = connection_requires_http_tunnel(
            self.proxy, self.proxy_config, destination_scheme
        )
    
        # Merge the proxy headers. Only done when not using HTTP CONNECT. We
        # have to copy the headers dict so we can safely change it without those
        # changes being reflected in anyone else's copy.
        if not http_tunnel_required:
            headers = headers.copy()  # type: ignore[attr-defined]
            headers.update(self.proxy_headers)  # type: ignore[union-attr]
    
        # Must keep the exception bound to a separate variable or else Python 3
        # complains about UnboundLocalError.
        err = None
    
        # Keep track of whether we cleanly exited the except block. This
        # ensures we do proper cleanup in finally.
        clean_exit = False
    
        # Rewind body position, if needed. Record current position
        # for future rewinds in the event of a redirect/retry.
        body_pos = set_file_position(body, body_pos)
    
        try:
            # Request a connection from the queue.
            timeout_obj = self._get_timeout(timeout)
            conn = self._get_conn(timeout=pool_timeout)
    
            conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
    
            # Is this a closed/new connection that requires CONNECT tunnelling?
            if self.proxy is not None and http_tunnel_required and conn.is_closed:
                try:
                    self._prepare_proxy(conn)
                except (BaseSSLError, OSError, SocketTimeout) as e:
                    self._raise_timeout(
                        err=e, url=self.proxy.url, timeout_value=conn.timeout
                    )
                    raise
    
            # If we're going to release the connection in ``finally:``, then
            # the response doesn't need to know about the connection. Otherwise
            # it will also try to release it and we'll have a double-release
            # mess.
            response_conn = conn if not release_conn else None
    
            # Make the request on the HTTPConnection object
>           response = self._make_request(
                conn,
                method,
                url,
                timeout=timeout_obj,
                body=body,
                headers=headers,
                chunked=chunked,
                retries=retries,
                response_conn=response_conn,
                preload_content=preload_content,
                decode_content=decode_content,
                **response_kw,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:536: in _make_request
    response = conn.getresponse()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:507: in getresponse
    httplib_response = super().getresponse()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:1375: in getresponse
    response.begin()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:318: in begin
    version, status, reason = self._read_status()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <http.client.HTTPResponse object at 0x7fbfb2366b30>

    def _read_status(self):
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
        if len(line) > _MAXLINE:
            raise LineTooLong("status line")
        if self.debuglevel > 0:
            print("reply:", repr(line))
        if not line:
            # Presumably, the server closed the connection before
            # sending a valid response.
>           raise RemoteDisconnected("Remote end closed connection without"
                                     " response")
E           http.client.RemoteDisconnected: Remote end closed connection without response

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:287: RemoteDisconnected

During handling of the above exception, another exception occurred:

self = <requests.adapters.HTTPAdapter object at 0x7fbfa91a49a0>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
>           resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:667: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:843: in urlopen
    retries = retries.increment(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/retry.py:474: in increment
    raise reraise(type(error), error, _stacktrace)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/util.py:38: in reraise
    raise value.with_traceback(tb)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: in urlopen
    response = self._make_request(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:536: in _make_request
    response = conn.getresponse()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:507: in getresponse
    httplib_response = super().getresponse()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:1375: in getresponse
    response.begin()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:318: in begin
    version, status, reason = self._read_status()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <http.client.HTTPResponse object at 0x7fbfb2366b30>

    def _read_status(self):
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
        if len(line) > _MAXLINE:
            raise LineTooLong("status line")
        if self.debuglevel > 0:
            print("reply:", repr(line))
        if not line:
            # Presumably, the server closed the connection before
            # sending a valid response.
>           raise RemoteDisconnected("Remote end closed connection without"
                                     " response")
E           urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:287: ProtocolError

During handling of the above exception, another exception occurred:

cmr_mode = 'https://cmr.uat.earthdata.nasa.gov/search/'
collection_concept_id = 'C1238538240-POCLOUD', env = 'uat'
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'

    @pytest.fixture(scope="function")
    def collection_variables(cmr_mode, collection_concept_id, env, bearer_token):
        collection_query = cmr.queries.CollectionQuery(mode=cmr_mode)
        variable_query = cmr.queries.VariableQuery(mode=cmr_mode)
    
        collection_res = collection_query.concept_id(collection_concept_id).token(bearer_token).get()[0]
        collection_associations = collection_res.get("associations")
        variable_concept_ids = collection_associations.get("variables")
    
        if variable_concept_ids is None:
            pytest.fail(f'There are no umm-v associated with this collection in {env}')
    
        variables = []
        for i in range(0, len(variable_concept_ids), 40):
            variables_items = variable_query \
                .concept_id(variable_concept_ids[i:i + 40]) \
                .token(bearer_token) \
                .format('umm_json') \
>               .get_all()

verify_collection.py:171: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:127: in get_all
    return self.get(self.hits())
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:1121: in get
    response = requests.get(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:73: in get
    return request("get", url, params=params, **kwargs)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:59: in request
    return session.request(method=method, url=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)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <requests.adapters.HTTPAdapter object at 0x7fbfa91a49a0>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
            resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )
    
        except (ProtocolError, OSError) as err:
>           raise ConnectionError(err, request=request)
E           requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:682: ConnectionError
--------------------------------- Captured Log ---------------------------------

Check failure on line 0 in tests.verify_collection

See this annotation in the file changed.

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

test_spatial_subset[C1238538241-POCLOUD] (tests.verify_collection) with error

test-results/uat_test_report.xml [took 3s]
Raw output
failed on setup with "requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))"
self = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7efe98a57460>
method = 'GET'
url = '/search/variables.umm_json?concept_id%5B%5D=V1257409608-POCLOUD&concept_id%5B%5D=V1257409936-POCLOUD&concept_id%5B%5D...=V1257409628-POCLOUD&concept_id%5B%5D=V1257409750-POCLOUD&concept_id%5B%5D=V1257409691-POCLOUD&page_size=40&page_num=6'
body = None
headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
redirect = False, assert_same_host = False
timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
release_conn = False, chunked = False, body_pos = None, preload_content = False
decode_content = False, response_kw = {}
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/search/variables.umm_json', query='concept_id%5B%5D=V12574096...LOUD&concept_id%5B%5D=V1257409750-POCLOUD&concept_id%5B%5D=V1257409691-POCLOUD&page_size=40&page_num=6', fragment=None)
destination_scheme = None, conn = None, release_this_conn = True
http_tunnel_required = False, err = None, clean_exit = False

    def urlopen(  # type: ignore[override]
        self,
        method: str,
        url: str,
        body: _TYPE_BODY | None = None,
        headers: typing.Mapping[str, str] | None = None,
        retries: Retry | bool | int | None = None,
        redirect: bool = True,
        assert_same_host: bool = True,
        timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
        pool_timeout: int | None = None,
        release_conn: bool | None = None,
        chunked: bool = False,
        body_pos: _TYPE_BODY_POSITION | None = None,
        preload_content: bool = True,
        decode_content: bool = True,
        **response_kw: typing.Any,
    ) -> BaseHTTPResponse:
        """
        Get a connection from the pool and perform an HTTP request. This is the
        lowest level call for making a request, so you'll need to specify all
        the raw details.
    
        .. note::
    
           More commonly, it's appropriate to use a convenience method
           such as :meth:`request`.
    
        .. note::
    
           `release_conn` will only behave as expected if
           `preload_content=False` because we want to make
           `preload_content=False` the default behaviour someday soon without
           breaking backwards compatibility.
    
        :param method:
            HTTP request method (such as GET, POST, PUT, etc.)
    
        :param url:
            The URL to perform the request on.
    
        :param body:
            Data to send in the request body, either :class:`str`, :class:`bytes`,
            an iterable of :class:`str`/:class:`bytes`, or a file-like object.
    
        :param headers:
            Dictionary of custom headers to send, such as User-Agent,
            If-None-Match, etc. If None, pool headers are used. If provided,
            these headers completely replace any pool-specific headers.
    
        :param retries:
            Configure the number of retries to allow before raising a
            :class:`~urllib3.exceptions.MaxRetryError` exception.
    
            If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
            :class:`~urllib3.util.retry.Retry` object for fine-grained control
            over different types of retries.
            Pass an integer number to retry connection errors that many times,
            but no other types of errors. Pass zero to never retry.
    
            If ``False``, then retries are disabled and any exception is raised
            immediately. Also, instead of raising a MaxRetryError on redirects,
            the redirect response will be returned.
    
        :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
    
        :param redirect:
            If True, automatically handle redirects (status codes 301, 302,
            303, 307, 308). Each redirect counts as a retry. Disabling retries
            will disable redirect, too.
    
        :param assert_same_host:
            If ``True``, will make sure that the host of the pool requests is
            consistent else will raise HostChangedError. When ``False``, you can
            use the pool on an HTTP proxy and request foreign hosts.
    
        :param timeout:
            If specified, overrides the default timeout for this one
            request. It may be a float (in seconds) or an instance of
            :class:`urllib3.util.Timeout`.
    
        :param pool_timeout:
            If set and the pool is set to block=True, then this method will
            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
            connection is available within the time period.
    
        :param bool preload_content:
            If True, the response's body will be preloaded into memory.
    
        :param bool decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.
    
        :param release_conn:
            If False, then the urlopen call will not release the connection
            back into the pool once a response is received (but will release if
            you read the entire contents of the response such as when
            `preload_content=True`). This is useful if you're not preloading
            the response's content immediately. You will need to call
            ``r.release_conn()`` on the response ``r`` to return the connection
            back into the pool. If None, it takes the value of ``preload_content``
            which defaults to ``True``.
    
        :param bool chunked:
            If True, urllib3 will send the body using chunked transfer
            encoding. Otherwise, urllib3 will send the body using the standard
            content-length form. Defaults to False.
    
        :param int body_pos:
            Position to seek to in file-like body in the event of a retry or
            redirect. Typically this won't need to be set because urllib3 will
            auto-populate the value when needed.
        """
        parsed_url = parse_url(url)
        destination_scheme = parsed_url.scheme
    
        if headers is None:
            headers = self.headers
    
        if not isinstance(retries, Retry):
            retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
    
        if release_conn is None:
            release_conn = preload_content
    
        # Check host
        if assert_same_host and not self.is_same_host(url):
            raise HostChangedError(self, url, retries)
    
        # Ensure that the URL we're connecting to is properly encoded
        if url.startswith("/"):
            url = to_str(_encode_target(url))
        else:
            url = to_str(parsed_url.url)
    
        conn = None
    
        # Track whether `conn` needs to be released before
        # returning/raising/recursing. Update this variable if necessary, and
        # leave `release_conn` constant throughout the function. That way, if
        # the function recurses, the original value of `release_conn` will be
        # passed down into the recursive call, and its value will be respected.
        #
        # See issue #651 [1] for details.
        #
        # [1] <https://github.com/urllib3/urllib3/issues/651>
        release_this_conn = release_conn
    
        http_tunnel_required = connection_requires_http_tunnel(
            self.proxy, self.proxy_config, destination_scheme
        )
    
        # Merge the proxy headers. Only done when not using HTTP CONNECT. We
        # have to copy the headers dict so we can safely change it without those
        # changes being reflected in anyone else's copy.
        if not http_tunnel_required:
            headers = headers.copy()  # type: ignore[attr-defined]
            headers.update(self.proxy_headers)  # type: ignore[union-attr]
    
        # Must keep the exception bound to a separate variable or else Python 3
        # complains about UnboundLocalError.
        err = None
    
        # Keep track of whether we cleanly exited the except block. This
        # ensures we do proper cleanup in finally.
        clean_exit = False
    
        # Rewind body position, if needed. Record current position
        # for future rewinds in the event of a redirect/retry.
        body_pos = set_file_position(body, body_pos)
    
        try:
            # Request a connection from the queue.
            timeout_obj = self._get_timeout(timeout)
            conn = self._get_conn(timeout=pool_timeout)
    
            conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
    
            # Is this a closed/new connection that requires CONNECT tunnelling?
            if self.proxy is not None and http_tunnel_required and conn.is_closed:
                try:
                    self._prepare_proxy(conn)
                except (BaseSSLError, OSError, SocketTimeout) as e:
                    self._raise_timeout(
                        err=e, url=self.proxy.url, timeout_value=conn.timeout
                    )
                    raise
    
            # If we're going to release the connection in ``finally:``, then
            # the response doesn't need to know about the connection. Otherwise
            # it will also try to release it and we'll have a double-release
            # mess.
            response_conn = conn if not release_conn else None
    
            # Make the request on the HTTPConnection object
>           response = self._make_request(
                conn,
                method,
                url,
                timeout=timeout_obj,
                body=body,
                headers=headers,
                chunked=chunked,
                retries=retries,
                response_conn=response_conn,
                preload_content=preload_content,
                decode_content=decode_content,
                **response_kw,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:536: in _make_request
    response = conn.getresponse()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:507: in getresponse
    httplib_response = super().getresponse()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:1375: in getresponse
    response.begin()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:318: in begin
    version, status, reason = self._read_status()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <http.client.HTTPResponse object at 0x7efe9891a8c0>

    def _read_status(self):
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
        if len(line) > _MAXLINE:
            raise LineTooLong("status line")
        if self.debuglevel > 0:
            print("reply:", repr(line))
        if not line:
            # Presumably, the server closed the connection before
            # sending a valid response.
>           raise RemoteDisconnected("Remote end closed connection without"
                                     " response")
E           http.client.RemoteDisconnected: Remote end closed connection without response

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:287: RemoteDisconnected

During handling of the above exception, another exception occurred:

self = <requests.adapters.HTTPAdapter object at 0x7efe98ab4940>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
>           resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:667: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:843: in urlopen
    retries = retries.increment(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/retry.py:474: in increment
    raise reraise(type(error), error, _stacktrace)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/util.py:38: in reraise
    raise value.with_traceback(tb)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: in urlopen
    response = self._make_request(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:536: in _make_request
    response = conn.getresponse()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:507: in getresponse
    httplib_response = super().getresponse()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:1375: in getresponse
    response.begin()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:318: in begin
    version, status, reason = self._read_status()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <http.client.HTTPResponse object at 0x7efe9891a8c0>

    def _read_status(self):
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
        if len(line) > _MAXLINE:
            raise LineTooLong("status line")
        if self.debuglevel > 0:
            print("reply:", repr(line))
        if not line:
            # Presumably, the server closed the connection before
            # sending a valid response.
>           raise RemoteDisconnected("Remote end closed connection without"
                                     " response")
E           urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:287: ProtocolError

During handling of the above exception, another exception occurred:

cmr_mode = 'https://cmr.uat.earthdata.nasa.gov/search/'
collection_concept_id = 'C1238538241-POCLOUD', env = 'uat'
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'

    @pytest.fixture(scope="function")
    def collection_variables(cmr_mode, collection_concept_id, env, bearer_token):
        collection_query = cmr.queries.CollectionQuery(mode=cmr_mode)
        variable_query = cmr.queries.VariableQuery(mode=cmr_mode)
    
        collection_res = collection_query.concept_id(collection_concept_id).token(bearer_token).get()[0]
        collection_associations = collection_res.get("associations")
        variable_concept_ids = collection_associations.get("variables")
    
        if variable_concept_ids is None:
            pytest.fail(f'There are no umm-v associated with this collection in {env}')
    
        variables = []
        for i in range(0, len(variable_concept_ids), 40):
            variables_items = variable_query \
                .concept_id(variable_concept_ids[i:i + 40]) \
                .token(bearer_token) \
                .format('umm_json') \
>               .get_all()

verify_collection.py:171: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:127: in get_all
    return self.get(self.hits())
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:1121: in get
    response = requests.get(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:73: in get
    return request("get", url, params=params, **kwargs)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:59: in request
    return session.request(method=method, url=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)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <requests.adapters.HTTPAdapter object at 0x7efe98ab4940>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
            resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )
    
        except (ProtocolError, OSError) as err:
>           raise ConnectionError(err, request=request)
E           requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:682: ConnectionError
--------------------------------- Captured Log ---------------------------------

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

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

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

test-results/uat_test_report.xml [took 10m 0s]
Raw output
Failed: Timeout >600.0s
collection_concept_id = 'C1257081728-POCLOUD', env = 'uat'
granule_json = {'meta': {'collection-concept-id': 'C1257081728-POCLOUD', 'concept-id': 'G1257838751-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': 'C1257081728-POCLOUD'}]}, 'meta': {'association-details': {'collecti...ample', 'Size': 585310, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -9999.0}], ...}}, ...]
harmony_env = <Environment.UAT: 3>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw7/test_spatial_subset_C1257081720')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'
skip_spatial = set()

    @pytest.mark.timeout(600)
    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=True)

verify_collection.py:462: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <harmony.harmony.Client object at 0x7efe9878c730>
job_id = '931c90d0-a40d-4cef-a4a1-91350d9ddb65', 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)
                    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)
E                           Failed: Timeout >600.0s

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/harmony/harmony.py:1108: Failed
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:441 Using granule G1257838751-POCLOUD for test
INFO     root:verify_collection.py:457 Sending harmony request https://harmony.uat.earthdata.nasa.gov/C1257081728-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-57.0%3A57.0%29&subset=lon%284.5%3A175.5%29&granuleId=G1257838751-POCLOUD&variable=all
INFO     root:verify_collection.py:461 Submitted harmony job 931c90d0-a40d-4cef-a4a1-91350d9ddb65

Check failure on line 0 in tests.verify_collection

See this annotation in the file changed.

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

test_spatial_subset[C1240557243-GES_DISC] (tests.verify_collection) with error

test-results/uat_test_report.xml [took 1s]
Raw output
failed on setup with "requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))"
self = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f115cc9c430>
method = 'GET'
url = '/search/variables.umm_json?concept_id%5B%5D=V1263076172-GES_DISC&concept_id%5B%5D=V1263076148-GES_DISC&concept_id%5B%...63076164-GES_DISC&concept_id%5B%5D=V1263076130-GES_DISC&concept_id%5B%5D=V1263076152-GES_DISC&page_size=25&page_num=20'
body = None
headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
redirect = False, assert_same_host = False
timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
release_conn = False, chunked = False, body_pos = None, preload_content = False
decode_content = False, response_kw = {}
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/search/variables.umm_json', query='concept_id%5B%5D=V12630761...C&concept_id%5B%5D=V1263076130-GES_DISC&concept_id%5B%5D=V1263076152-GES_DISC&page_size=25&page_num=20', fragment=None)
destination_scheme = None, conn = None, release_this_conn = True
http_tunnel_required = False, err = None, clean_exit = False

    def urlopen(  # type: ignore[override]
        self,
        method: str,
        url: str,
        body: _TYPE_BODY | None = None,
        headers: typing.Mapping[str, str] | None = None,
        retries: Retry | bool | int | None = None,
        redirect: bool = True,
        assert_same_host: bool = True,
        timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
        pool_timeout: int | None = None,
        release_conn: bool | None = None,
        chunked: bool = False,
        body_pos: _TYPE_BODY_POSITION | None = None,
        preload_content: bool = True,
        decode_content: bool = True,
        **response_kw: typing.Any,
    ) -> BaseHTTPResponse:
        """
        Get a connection from the pool and perform an HTTP request. This is the
        lowest level call for making a request, so you'll need to specify all
        the raw details.
    
        .. note::
    
           More commonly, it's appropriate to use a convenience method
           such as :meth:`request`.
    
        .. note::
    
           `release_conn` will only behave as expected if
           `preload_content=False` because we want to make
           `preload_content=False` the default behaviour someday soon without
           breaking backwards compatibility.
    
        :param method:
            HTTP request method (such as GET, POST, PUT, etc.)
    
        :param url:
            The URL to perform the request on.
    
        :param body:
            Data to send in the request body, either :class:`str`, :class:`bytes`,
            an iterable of :class:`str`/:class:`bytes`, or a file-like object.
    
        :param headers:
            Dictionary of custom headers to send, such as User-Agent,
            If-None-Match, etc. If None, pool headers are used. If provided,
            these headers completely replace any pool-specific headers.
    
        :param retries:
            Configure the number of retries to allow before raising a
            :class:`~urllib3.exceptions.MaxRetryError` exception.
    
            If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
            :class:`~urllib3.util.retry.Retry` object for fine-grained control
            over different types of retries.
            Pass an integer number to retry connection errors that many times,
            but no other types of errors. Pass zero to never retry.
    
            If ``False``, then retries are disabled and any exception is raised
            immediately. Also, instead of raising a MaxRetryError on redirects,
            the redirect response will be returned.
    
        :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
    
        :param redirect:
            If True, automatically handle redirects (status codes 301, 302,
            303, 307, 308). Each redirect counts as a retry. Disabling retries
            will disable redirect, too.
    
        :param assert_same_host:
            If ``True``, will make sure that the host of the pool requests is
            consistent else will raise HostChangedError. When ``False``, you can
            use the pool on an HTTP proxy and request foreign hosts.
    
        :param timeout:
            If specified, overrides the default timeout for this one
            request. It may be a float (in seconds) or an instance of
            :class:`urllib3.util.Timeout`.
    
        :param pool_timeout:
            If set and the pool is set to block=True, then this method will
            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
            connection is available within the time period.
    
        :param bool preload_content:
            If True, the response's body will be preloaded into memory.
    
        :param bool decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.
    
        :param release_conn:
            If False, then the urlopen call will not release the connection
            back into the pool once a response is received (but will release if
            you read the entire contents of the response such as when
            `preload_content=True`). This is useful if you're not preloading
            the response's content immediately. You will need to call
            ``r.release_conn()`` on the response ``r`` to return the connection
            back into the pool. If None, it takes the value of ``preload_content``
            which defaults to ``True``.
    
        :param bool chunked:
            If True, urllib3 will send the body using chunked transfer
            encoding. Otherwise, urllib3 will send the body using the standard
            content-length form. Defaults to False.
    
        :param int body_pos:
            Position to seek to in file-like body in the event of a retry or
            redirect. Typically this won't need to be set because urllib3 will
            auto-populate the value when needed.
        """
        parsed_url = parse_url(url)
        destination_scheme = parsed_url.scheme
    
        if headers is None:
            headers = self.headers
    
        if not isinstance(retries, Retry):
            retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
    
        if release_conn is None:
            release_conn = preload_content
    
        # Check host
        if assert_same_host and not self.is_same_host(url):
            raise HostChangedError(self, url, retries)
    
        # Ensure that the URL we're connecting to is properly encoded
        if url.startswith("/"):
            url = to_str(_encode_target(url))
        else:
            url = to_str(parsed_url.url)
    
        conn = None
    
        # Track whether `conn` needs to be released before
        # returning/raising/recursing. Update this variable if necessary, and
        # leave `release_conn` constant throughout the function. That way, if
        # the function recurses, the original value of `release_conn` will be
        # passed down into the recursive call, and its value will be respected.
        #
        # See issue #651 [1] for details.
        #
        # [1] <https://github.com/urllib3/urllib3/issues/651>
        release_this_conn = release_conn
    
        http_tunnel_required = connection_requires_http_tunnel(
            self.proxy, self.proxy_config, destination_scheme
        )
    
        # Merge the proxy headers. Only done when not using HTTP CONNECT. We
        # have to copy the headers dict so we can safely change it without those
        # changes being reflected in anyone else's copy.
        if not http_tunnel_required:
            headers = headers.copy()  # type: ignore[attr-defined]
            headers.update(self.proxy_headers)  # type: ignore[union-attr]
    
        # Must keep the exception bound to a separate variable or else Python 3
        # complains about UnboundLocalError.
        err = None
    
        # Keep track of whether we cleanly exited the except block. This
        # ensures we do proper cleanup in finally.
        clean_exit = False
    
        # Rewind body position, if needed. Record current position
        # for future rewinds in the event of a redirect/retry.
        body_pos = set_file_position(body, body_pos)
    
        try:
            # Request a connection from the queue.
            timeout_obj = self._get_timeout(timeout)
            conn = self._get_conn(timeout=pool_timeout)
    
            conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
    
            # Is this a closed/new connection that requires CONNECT tunnelling?
            if self.proxy is not None and http_tunnel_required and conn.is_closed:
                try:
                    self._prepare_proxy(conn)
                except (BaseSSLError, OSError, SocketTimeout) as e:
                    self._raise_timeout(
                        err=e, url=self.proxy.url, timeout_value=conn.timeout
                    )
                    raise
    
            # If we're going to release the connection in ``finally:``, then
            # the response doesn't need to know about the connection. Otherwise
            # it will also try to release it and we'll have a double-release
            # mess.
            response_conn = conn if not release_conn else None
    
            # Make the request on the HTTPConnection object
>           response = self._make_request(
                conn,
                method,
                url,
                timeout=timeout_obj,
                body=body,
                headers=headers,
                chunked=chunked,
                retries=retries,
                response_conn=response_conn,
                preload_content=preload_content,
                decode_content=decode_content,
                **response_kw,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:536: in _make_request
    response = conn.getresponse()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:507: in getresponse
    httplib_response = super().getresponse()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:1375: in getresponse
    response.begin()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:318: in begin
    version, status, reason = self._read_status()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <http.client.HTTPResponse object at 0x7f115caaba00>

    def _read_status(self):
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
        if len(line) > _MAXLINE:
            raise LineTooLong("status line")
        if self.debuglevel > 0:
            print("reply:", repr(line))
        if not line:
            # Presumably, the server closed the connection before
            # sending a valid response.
>           raise RemoteDisconnected("Remote end closed connection without"
                                     " response")
E           http.client.RemoteDisconnected: Remote end closed connection without response

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:287: RemoteDisconnected

During handling of the above exception, another exception occurred:

self = <requests.adapters.HTTPAdapter object at 0x7f115ccadcf0>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
>           resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:667: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:843: in urlopen
    retries = retries.increment(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/retry.py:474: in increment
    raise reraise(type(error), error, _stacktrace)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/util.py:38: in reraise
    raise value.with_traceback(tb)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: in urlopen
    response = self._make_request(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:536: in _make_request
    response = conn.getresponse()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:507: in getresponse
    httplib_response = super().getresponse()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:1375: in getresponse
    response.begin()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:318: in begin
    version, status, reason = self._read_status()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <http.client.HTTPResponse object at 0x7f115caaba00>

    def _read_status(self):
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
        if len(line) > _MAXLINE:
            raise LineTooLong("status line")
        if self.debuglevel > 0:
            print("reply:", repr(line))
        if not line:
            # Presumably, the server closed the connection before
            # sending a valid response.
>           raise RemoteDisconnected("Remote end closed connection without"
                                     " response")
E           urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:287: ProtocolError

During handling of the above exception, another exception occurred:

cmr_mode = 'https://cmr.uat.earthdata.nasa.gov/search/'
collection_concept_id = 'C1240557243-GES_DISC', env = 'uat'
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'

    @pytest.fixture(scope="function")
    def collection_variables(cmr_mode, collection_concept_id, env, bearer_token):
        collection_query = cmr.queries.CollectionQuery(mode=cmr_mode)
        variable_query = cmr.queries.VariableQuery(mode=cmr_mode)
    
        collection_res = collection_query.concept_id(collection_concept_id).token(bearer_token).get()[0]
        collection_associations = collection_res.get("associations")
        variable_concept_ids = collection_associations.get("variables")
    
        if variable_concept_ids is None:
            pytest.fail(f'There are no umm-v associated with this collection in {env}')
    
        variables = []
        for i in range(0, len(variable_concept_ids), 40):
            variables_items = variable_query \
                .concept_id(variable_concept_ids[i:i + 40]) \
                .token(bearer_token) \
                .format('umm_json') \
>               .get_all()

verify_collection.py:171: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:127: in get_all
    return self.get(self.hits())
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:1121: in get
    response = requests.get(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:73: in get
    return request("get", url, params=params, **kwargs)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:59: in request
    return session.request(method=method, url=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)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <requests.adapters.HTTPAdapter object at 0x7f115ccadcf0>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
            resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )
    
        except (ProtocolError, OSError) as err:
>           raise ConnectionError(err, request=request)
E           requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:682: ConnectionError
--------------------------------- Captured Log ---------------------------------

Check failure on line 0 in tests.verify_collection

See this annotation in the file changed.

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

test_spatial_subset[C1238538232-POCLOUD] (tests.verify_collection) with error

test-results/uat_test_report.xml [took 8s]
Raw output
failed on setup with "requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))"
self = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f67206f2aa0>
method = 'GET'
url = '/search/variables.umm_json?concept_id%5B%5D=V1257422867-POCLOUD&concept_id%5B%5D=V1257423291-POCLOUD&concept_id%5B%5D...V1257423339-POCLOUD&concept_id%5B%5D=V1257423153-POCLOUD&concept_id%5B%5D=V1257422829-POCLOUD&page_size=40&page_num=19'
body = None
headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
redirect = False, assert_same_host = False
timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
release_conn = False, chunked = False, body_pos = None, preload_content = False
decode_content = False, response_kw = {}
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/search/variables.umm_json', query='concept_id%5B%5D=V12574228...OUD&concept_id%5B%5D=V1257423153-POCLOUD&concept_id%5B%5D=V1257422829-POCLOUD&page_size=40&page_num=19', fragment=None)
destination_scheme = None, conn = None, release_this_conn = True
http_tunnel_required = False, err = None, clean_exit = False

    def urlopen(  # type: ignore[override]
        self,
        method: str,
        url: str,
        body: _TYPE_BODY | None = None,
        headers: typing.Mapping[str, str] | None = None,
        retries: Retry | bool | int | None = None,
        redirect: bool = True,
        assert_same_host: bool = True,
        timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
        pool_timeout: int | None = None,
        release_conn: bool | None = None,
        chunked: bool = False,
        body_pos: _TYPE_BODY_POSITION | None = None,
        preload_content: bool = True,
        decode_content: bool = True,
        **response_kw: typing.Any,
    ) -> BaseHTTPResponse:
        """
        Get a connection from the pool and perform an HTTP request. This is the
        lowest level call for making a request, so you'll need to specify all
        the raw details.
    
        .. note::
    
           More commonly, it's appropriate to use a convenience method
           such as :meth:`request`.
    
        .. note::
    
           `release_conn` will only behave as expected if
           `preload_content=False` because we want to make
           `preload_content=False` the default behaviour someday soon without
           breaking backwards compatibility.
    
        :param method:
            HTTP request method (such as GET, POST, PUT, etc.)
    
        :param url:
            The URL to perform the request on.
    
        :param body:
            Data to send in the request body, either :class:`str`, :class:`bytes`,
            an iterable of :class:`str`/:class:`bytes`, or a file-like object.
    
        :param headers:
            Dictionary of custom headers to send, such as User-Agent,
            If-None-Match, etc. If None, pool headers are used. If provided,
            these headers completely replace any pool-specific headers.
    
        :param retries:
            Configure the number of retries to allow before raising a
            :class:`~urllib3.exceptions.MaxRetryError` exception.
    
            If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
            :class:`~urllib3.util.retry.Retry` object for fine-grained control
            over different types of retries.
            Pass an integer number to retry connection errors that many times,
            but no other types of errors. Pass zero to never retry.
    
            If ``False``, then retries are disabled and any exception is raised
            immediately. Also, instead of raising a MaxRetryError on redirects,
            the redirect response will be returned.
    
        :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
    
        :param redirect:
            If True, automatically handle redirects (status codes 301, 302,
            303, 307, 308). Each redirect counts as a retry. Disabling retries
            will disable redirect, too.
    
        :param assert_same_host:
            If ``True``, will make sure that the host of the pool requests is
            consistent else will raise HostChangedError. When ``False``, you can
            use the pool on an HTTP proxy and request foreign hosts.
    
        :param timeout:
            If specified, overrides the default timeout for this one
            request. It may be a float (in seconds) or an instance of
            :class:`urllib3.util.Timeout`.
    
        :param pool_timeout:
            If set and the pool is set to block=True, then this method will
            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
            connection is available within the time period.
    
        :param bool preload_content:
            If True, the response's body will be preloaded into memory.
    
        :param bool decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.
    
        :param release_conn:
            If False, then the urlopen call will not release the connection
            back into the pool once a response is received (but will release if
            you read the entire contents of the response such as when
            `preload_content=True`). This is useful if you're not preloading
            the response's content immediately. You will need to call
            ``r.release_conn()`` on the response ``r`` to return the connection
            back into the pool. If None, it takes the value of ``preload_content``
            which defaults to ``True``.
    
        :param bool chunked:
            If True, urllib3 will send the body using chunked transfer
            encoding. Otherwise, urllib3 will send the body using the standard
            content-length form. Defaults to False.
    
        :param int body_pos:
            Position to seek to in file-like body in the event of a retry or
            redirect. Typically this won't need to be set because urllib3 will
            auto-populate the value when needed.
        """
        parsed_url = parse_url(url)
        destination_scheme = parsed_url.scheme
    
        if headers is None:
            headers = self.headers
    
        if not isinstance(retries, Retry):
            retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
    
        if release_conn is None:
            release_conn = preload_content
    
        # Check host
        if assert_same_host and not self.is_same_host(url):
            raise HostChangedError(self, url, retries)
    
        # Ensure that the URL we're connecting to is properly encoded
        if url.startswith("/"):
            url = to_str(_encode_target(url))
        else:
            url = to_str(parsed_url.url)
    
        conn = None
    
        # Track whether `conn` needs to be released before
        # returning/raising/recursing. Update this variable if necessary, and
        # leave `release_conn` constant throughout the function. That way, if
        # the function recurses, the original value of `release_conn` will be
        # passed down into the recursive call, and its value will be respected.
        #
        # See issue #651 [1] for details.
        #
        # [1] <https://github.com/urllib3/urllib3/issues/651>
        release_this_conn = release_conn
    
        http_tunnel_required = connection_requires_http_tunnel(
            self.proxy, self.proxy_config, destination_scheme
        )
    
        # Merge the proxy headers. Only done when not using HTTP CONNECT. We
        # have to copy the headers dict so we can safely change it without those
        # changes being reflected in anyone else's copy.
        if not http_tunnel_required:
            headers = headers.copy()  # type: ignore[attr-defined]
            headers.update(self.proxy_headers)  # type: ignore[union-attr]
    
        # Must keep the exception bound to a separate variable or else Python 3
        # complains about UnboundLocalError.
        err = None
    
        # Keep track of whether we cleanly exited the except block. This
        # ensures we do proper cleanup in finally.
        clean_exit = False
    
        # Rewind body position, if needed. Record current position
        # for future rewinds in the event of a redirect/retry.
        body_pos = set_file_position(body, body_pos)
    
        try:
            # Request a connection from the queue.
            timeout_obj = self._get_timeout(timeout)
            conn = self._get_conn(timeout=pool_timeout)
    
            conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
    
            # Is this a closed/new connection that requires CONNECT tunnelling?
            if self.proxy is not None and http_tunnel_required and conn.is_closed:
                try:
                    self._prepare_proxy(conn)
                except (BaseSSLError, OSError, SocketTimeout) as e:
                    self._raise_timeout(
                        err=e, url=self.proxy.url, timeout_value=conn.timeout
                    )
                    raise
    
            # If we're going to release the connection in ``finally:``, then
            # the response doesn't need to know about the connection. Otherwise
            # it will also try to release it and we'll have a double-release
            # mess.
            response_conn = conn if not release_conn else None
    
            # Make the request on the HTTPConnection object
>           response = self._make_request(
                conn,
                method,
                url,
                timeout=timeout_obj,
                body=body,
                headers=headers,
                chunked=chunked,
                retries=retries,
                response_conn=response_conn,
                preload_content=preload_content,
                decode_content=decode_content,
                **response_kw,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:536: in _make_request
    response = conn.getresponse()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:507: in getresponse
    httplib_response = super().getresponse()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:1375: in getresponse
    response.begin()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:318: in begin
    version, status, reason = self._read_status()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <http.client.HTTPResponse object at 0x7f6717a0db40>

    def _read_status(self):
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
        if len(line) > _MAXLINE:
            raise LineTooLong("status line")
        if self.debuglevel > 0:
            print("reply:", repr(line))
        if not line:
            # Presumably, the server closed the connection before
            # sending a valid response.
>           raise RemoteDisconnected("Remote end closed connection without"
                                     " response")
E           http.client.RemoteDisconnected: Remote end closed connection without response

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:287: RemoteDisconnected

During handling of the above exception, another exception occurred:

self = <requests.adapters.HTTPAdapter object at 0x7f67177f51e0>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
>           resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:667: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:843: in urlopen
    retries = retries.increment(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/retry.py:474: in increment
    raise reraise(type(error), error, _stacktrace)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/util.py:38: in reraise
    raise value.with_traceback(tb)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: in urlopen
    response = self._make_request(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:536: in _make_request
    response = conn.getresponse()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:507: in getresponse
    httplib_response = super().getresponse()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:1375: in getresponse
    response.begin()
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:318: in begin
    version, status, reason = self._read_status()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <http.client.HTTPResponse object at 0x7f6717a0db40>

    def _read_status(self):
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
        if len(line) > _MAXLINE:
            raise LineTooLong("status line")
        if self.debuglevel > 0:
            print("reply:", repr(line))
        if not line:
            # Presumably, the server closed the connection before
            # sending a valid response.
>           raise RemoteDisconnected("Remote end closed connection without"
                                     " response")
E           urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/http/client.py:287: ProtocolError

During handling of the above exception, another exception occurred:

cmr_mode = 'https://cmr.uat.earthdata.nasa.gov/search/'
collection_concept_id = 'C1238538232-POCLOUD', env = 'uat'
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'

    @pytest.fixture(scope="function")
    def collection_variables(cmr_mode, collection_concept_id, env, bearer_token):
        collection_query = cmr.queries.CollectionQuery(mode=cmr_mode)
        variable_query = cmr.queries.VariableQuery(mode=cmr_mode)
    
        collection_res = collection_query.concept_id(collection_concept_id).token(bearer_token).get()[0]
        collection_associations = collection_res.get("associations")
        variable_concept_ids = collection_associations.get("variables")
    
        if variable_concept_ids is None:
            pytest.fail(f'There are no umm-v associated with this collection in {env}')
    
        variables = []
        for i in range(0, len(variable_concept_ids), 40):
            variables_items = variable_query \
                .concept_id(variable_concept_ids[i:i + 40]) \
                .token(bearer_token) \
                .format('umm_json') \
>               .get_all()

verify_collection.py:171: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:127: in get_all
    return self.get(self.hits())
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:1121: in get
    response = requests.get(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:73: in get
    return request("get", url, params=params, **kwargs)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:59: in request
    return session.request(method=method, url=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)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <requests.adapters.HTTPAdapter object at 0x7f67177f51e0>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
            resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )
    
        except (ProtocolError, OSError) as err:
>           raise ConnectionError(err, request=request)
E           requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:682: ConnectionError
--------------------------------- Captured Log ---------------------------------

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

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

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

test-results/uat_test_report.xml [took 21s]
Raw output
Failed: Unable to find latitude and longitude variables.
collection_concept_id = 'C1261591413-POCLOUD', env = 'uat'
granule_json = {'meta': {'collection-concept-id': 'C1261591413-POCLOUD', 'concept-id': 'G1262404153-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': 'C1261591413-POCLOUD'}]}, 'meta': {'association-details': {'collecti...me': 'look', 'Size': 2, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -9999.0}], ...}}, ...]
harmony_env = <Environment.UAT: 3>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw8/test_spatial_subset_C1261591410')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'
skip_spatial = set()

    @pytest.mark.timeout(600)
    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=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, collection_concept_id)

verify_collection.py:474: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

dataset = <xarray.Dataset> Size: 232B
Dimensions:                 (ydim_grid: 1, xdim_grid: 1, look: 1,
                        ...                                 -0.43
    history_json:                                       [{"date_time": "2024-...
file_to_subset = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw8/test_spatial_subset_C1261591410/4930850_RSS_SMAP_SSS_L2C_r48015_20240127T143608_2024027_NRT_V06.0_002.nc4')
collection_variable_list = [{'associations': {'collections': [{'concept-id': 'C1261591413-POCLOUD'}]}, 'meta': {'association-details': {'collecti...me': 'look', 'Size': 2, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -9999.0}], ...}}, ...]
collection_concept_id = 'C1261591413-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 G1262404153-POCLOUD for test
INFO     root:verify_collection.py:457 Sending harmony request https://harmony.uat.earthdata.nasa.gov/C1261591413-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-82.290425%3A82.081425%29&subset=lon%284.506825000000006%3A175.500175%29&granuleId=G1262404153-POCLOUD&variable=all
INFO     root:verify_collection.py:461 Submitted harmony job c4262e5b-d0ec-4f19-b09d-91920c80283f
INFO     root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw8/test_spatial_subset_C1261591410/4930850_RSS_SMAP_SSS_L2C_r48015_20240127T143608_2024027_NRT_V06.0_002.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 failure on line 0 in tests.verify_collection

See this annotation in the file changed.

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

test_spatial_subset[C1240560267-GES_DISC] (tests.verify_collection) with error

test-results/uat_test_report.xml [took 3s]
Raw output
failed on setup with "requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))"
self = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7fe22fa76080>
method = 'GET'
url = '/search/variables.umm_json?concept_id%5B%5D=V1263702649-GES_DISC&concept_id%5B%5D=V1263703374-GES_DISC&concept_id%5B%...63702532-GES_DISC&concept_id%5B%5D=V1263702416-GES_DISC&concept_id%5B%5D=V1263703355-GES_DISC&page_size=40&page_num=16'
body = None
headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
redirect = False, assert_same_host = False
timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
release_conn = False, chunked = False, body_pos = None, preload_content = False
decode_content = False, response_kw = {}
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/search/variables.umm_json', query='concept_id%5B%5D=V12637026...C&concept_id%5B%5D=V1263702416-GES_DISC&concept_id%5B%5D=V1263703355-GES_DISC&page_size=40&page_num=16', fragment=None)
destination_scheme = None, conn = None, release_this_conn = True
http_tunnel_required = False, err = None, clean_exit = False

    def urlopen(  # type: ignore[override]
        self,
        method: str,
        url: str,
        body: _TYPE_BODY | None = None,
        headers: typing.Mapping[str, str] | None = None,
        retries: Retry | bool | int | None = None,
        redirect: bool = True,
        assert_same_host: bool = True,
        timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
        pool_timeout: int | None = None,
        release_conn: bool | None = None,
        chunked: bool = False,
        body_pos: _TYPE_BODY_POSITION | None = None,
        preload_content: bool = True,
        decode_content: bool = True,
        **response_kw: typing.Any,
    ) -> BaseHTTPResponse:
        """
        Get a connection from the pool and perform an HTTP request. This is the
        lowest level call for making a request, so you'll need to specify all
        the raw details.
    
        .. note::
    
           More commonly, it's appropriate to use a convenience method
           such as :meth:`request`.
    
        .. note::
    
           `release_conn` will only behave as expected if
           `preload_content=False` because we want to make
           `preload_content=False` the default behaviour someday soon without
           breaking backwards compatibility.
    
        :param method:
            HTTP request method (such as GET, POST, PUT, etc.)
    
        :param url:
            The URL to perform the request on.
    
        :param body:
            Data to send in the request body, either :class:`str`, :class:`bytes`,
            an iterable of :class:`str`/:class:`bytes`, or a file-like object.
    
        :param headers:
            Dictionary of custom headers to send, such as User-Agent,
            If-None-Match, etc. If None, pool headers are used. If provided,
            these headers completely replace any pool-specific headers.
    
        :param retries:
            Configure the number of retries to allow before raising a
            :class:`~urllib3.exceptions.MaxRetryError` exception.
    
            If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
            :class:`~urllib3.util.retry.Retry` object for fine-grained control
            over different types of retries.
            Pass an integer number to retry connection errors that many times,
            but no other types of errors. Pass zero to never retry.
    
            If ``False``, then retries are disabled and any exception is raised
            immediately. Also, instead of raising a MaxRetryError on redirects,
            the redirect response will be returned.
    
        :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
    
        :param redirect:
            If True, automatically handle redirects (status codes 301, 302,
            303, 307, 308). Each redirect counts as a retry. Disabling retries
            will disable redirect, too.
    
        :param assert_same_host:
            If ``True``, will make sure that the host of the pool requests is
            consistent else will raise HostChangedError. When ``False``, you can
            use the pool on an HTTP proxy and request foreign hosts.
    
        :param timeout:
            If specified, overrides the default timeout for this one
            request. It may be a float (in seconds) or an instance of
            :class:`urllib3.util.Timeout`.
    
        :param pool_timeout:
            If set and the pool is set to block=True, then this method will
            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
            connection is available within the time period.
    
        :param bool preload_content:
            If True, the response's body will be preloaded into memory.
    
        :param bool decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.
    
        :param release_conn:
            If False, then the urlopen call will not release the connection
            back into the pool once a response is received (but will release if
            you read the entire contents of the response such as when
            `preload_content=True`). This is useful if you're not preloading
            the response's content immediately. You will need to call
            ``r.release_conn()`` on the response ``r`` to return the connection
            back into the pool. If None, it takes the value of ``preload_content``
            which defaults to ``True``.
    
        :param bool chunked:
            If True, urllib3 will send the body using chunked transfer
            encoding. Otherwise, urllib3 will send the body using the standard
            content-length form. Defaults to False.
    
        :param int body_pos:
            Position to seek to in file-like body in the event of a retry or
            redirect. Typically this won't need to be set because urllib3 will
            auto-populate the value when needed.
        """
        parsed_url = parse_url(url)
        destination_scheme = parsed_url.scheme
    
        if headers is None:
            headers = self.headers
    
        if not isinstance(retries, Retry):
            retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
    
        if release_conn is None:
            release_conn = preload_content
    
        # Check host
        if assert_same_host and not self.is_same_host(url):
            raise HostChangedError(self, url, retries)
    
        # Ensure that the URL we're connecting to is properly encoded
        if url.startswith("/"):
            url = to_str(_encode_target(url))
        else:
            url = to_str(parsed_url.url)
    
        conn = None
    
        # Track whether `conn` needs to be released before
        # returning/raising/recursing. Update this variable if necessary, and
        # leave `release_conn` constant throughout the function. That way, if
        # the function recurses, the original value of `release_conn` will be
        # passed down into the recursive call, and its value will be respected.
        #
        # See issue #651 [1] for details.
        #
        # [1] <https://github.com/urllib3/urllib3/issues/651>
        release_this_conn = release_conn
    
        http_tunnel_required = connection_requires_http_tunnel(
            self.proxy, self.proxy_config, destination_scheme
        )
    
        # Merge the proxy headers. Only done when not using HTTP CONNECT. We
        # have to copy the headers dict so we can safely change it without those
        # changes being reflected in anyone else's copy.
        if not http_tunnel_required:
            headers = headers.copy()  # type: ignore[attr-defined]
            headers.update(self.proxy_headers)  # type: ignore[union-attr]
    
        # Must keep the exception bound to a separate variable or else Python 3
        # complains about UnboundLocalError.
        err = None
    
        # Keep track of whether we cleanly exited the except block. This
        # ensures we do proper cleanup in finally.
        clean_exit = False
    
        # Rewind body position, if needed. Record current position
        # for future rewinds in the event of a redirect/retry.
        body_pos = set_file_position(body, body_pos)
    
        try:
            # Request a connection from the queue.
            timeout_obj = self._get_timeout(timeout)
            conn = self._get_conn(timeout=pool_timeout)
    
            conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
    
            # Is this a closed/new connection that requires CONNECT tunnelling?
            if self.proxy is not None and http_tunnel_required and conn.is_closed:
                try:
                    self._prepare_proxy(conn)
                except (BaseSSLError, OSError, SocketTimeout) as e:
                    self._raise_timeout(
                        err=e, url=self.proxy.url, timeout_value=conn.timeout
                    )
                    raise
    
            # If we're going to release the connection in ``finally:``, then
            # the response doesn't need to know about the connection. Otherwise
            # it will also try to release it and we'll have a double-release
            # mess.
            response_conn = conn if not release_conn else None
    
            # Make the request on the HTTPConnection object
>           response = self._make_request(
                conn,
                method,
                url,
                timeout=timeout_obj,
                body=body,
                headers=headers,
                chunked=chunked,
                retries=retries,
                response_conn=response_conn,
                preload_content=preload_content,
                decode_content=decode_content,
                **response_kw,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:490: in _make_request
    raise new_e
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:466: in _make_request
    self._validate_conn(conn)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:1095: in _validate_conn
    conn.connect()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:730: in connect
    sock_and_verified = _ssl_wrap_socket_and_match_hostname(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:909: in _ssl_wrap_socket_and_match_hostname
    ssl_sock = ssl_wrap_socket(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/ssl_.py:469: in ssl_wrap_socket
    ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/ssl_.py:513: in _ssl_wrap_socket_impl
    return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/ssl.py:513: in wrap_socket
    return self.sslsocket_class._create(
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/ssl.py:1104: in _create
    self.do_handshake()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <ssl.SSLSocket [closed] fd=-1, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6>
block = False

    @_sslcopydoc
    def do_handshake(self, block=False):
        self._check_connected()
        timeout = self.gettimeout()
        try:
            if timeout == 0.0 and block:
                self.settimeout(None)
>           self._sslobj.do_handshake()
E           ConnectionResetError: [Errno 104] Connection reset by peer

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/ssl.py:1375: ConnectionResetError

During handling of the above exception, another exception occurred:

self = <requests.adapters.HTTPAdapter object at 0x7fe22fa75f00>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
>           resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:667: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:843: in urlopen
    retries = retries.increment(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/retry.py:474: in increment
    raise reraise(type(error), error, _stacktrace)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/util.py:38: in reraise
    raise value.with_traceback(tb)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:789: in urlopen
    response = self._make_request(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:490: in _make_request
    raise new_e
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:466: in _make_request
    self._validate_conn(conn)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connectionpool.py:1095: in _validate_conn
    conn.connect()
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:730: in connect
    sock_and_verified = _ssl_wrap_socket_and_match_hostname(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/connection.py:909: in _ssl_wrap_socket_and_match_hostname
    ssl_sock = ssl_wrap_socket(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/ssl_.py:469: in ssl_wrap_socket
    ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/urllib3/util/ssl_.py:513: in _ssl_wrap_socket_impl
    return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/ssl.py:513: in wrap_socket
    return self.sslsocket_class._create(
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/ssl.py:1104: in _create
    self.do_handshake()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <ssl.SSLSocket [closed] fd=-1, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6>
block = False

    @_sslcopydoc
    def do_handshake(self, block=False):
        self._check_connected()
        timeout = self.gettimeout()
        try:
            if timeout == 0.0 and block:
                self.settimeout(None)
>           self._sslobj.do_handshake()
E           urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/ssl.py:1375: ProtocolError

During handling of the above exception, another exception occurred:

cmr_mode = 'https://cmr.uat.earthdata.nasa.gov/search/'
collection_concept_id = 'C1240560267-GES_DISC', env = 'uat'
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'

    @pytest.fixture(scope="function")
    def collection_variables(cmr_mode, collection_concept_id, env, bearer_token):
        collection_query = cmr.queries.CollectionQuery(mode=cmr_mode)
        variable_query = cmr.queries.VariableQuery(mode=cmr_mode)
    
        collection_res = collection_query.concept_id(collection_concept_id).token(bearer_token).get()[0]
        collection_associations = collection_res.get("associations")
        variable_concept_ids = collection_associations.get("variables")
    
        if variable_concept_ids is None:
            pytest.fail(f'There are no umm-v associated with this collection in {env}')
    
        variables = []
        for i in range(0, len(variable_concept_ids), 40):
            variables_items = variable_query \
                .concept_id(variable_concept_ids[i:i + 40]) \
                .token(bearer_token) \
                .format('umm_json') \
>               .get_all()

verify_collection.py:171: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:127: in get_all
    return self.get(self.hits())
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/cmr/queries.py:1121: in get
    response = requests.get(
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:73: in get
    return request("get", url, params=params, **kwargs)
../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/api.py:59: in request
    return session.request(method=method, url=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)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <requests.adapters.HTTPAdapter object at 0x7fe22fa75f00>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict()

    def send(
        self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
    ):
        """Sends PreparedRequest object. Returns Response object.
    
        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple or urllib3 Timeout object
        :param verify: (optional) Either a boolean, in which case it controls whether
            we verify the server's TLS certificate, or a string, in which case it
            must be a path to a CA bundle to use
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: requests.Response
        """
    
        try:
            conn = self.get_connection_with_tls_context(
                request, verify, proxies=proxies, cert=cert
            )
        except LocationValueError as e:
            raise InvalidURL(e, request=request)
    
        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(
            request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies,
        )
    
        chunked = not (request.body is None or "Content-Length" in request.headers)
    
        if isinstance(timeout, tuple):
            try:
                connect, read = timeout
                timeout = TimeoutSauce(connect=connect, read=read)
            except ValueError:
                raise ValueError(
                    f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                    f"or a single float to set both timeouts to the same value."
                )
        elif isinstance(timeout, TimeoutSauce):
            pass
        else:
            timeout = TimeoutSauce(connect=timeout, read=timeout)
    
        try:
            resp = conn.urlopen(
                method=request.method,
                url=url,
                body=request.body,
                headers=request.headers,
                redirect=False,
                assert_same_host=False,
                preload_content=False,
                decode_content=False,
                retries=self.max_retries,
                timeout=timeout,
                chunked=chunked,
            )
    
        except (ProtocolError, OSError) as err:
>           raise ConnectionError(err, request=request)
E           requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))

../../../../.cache/pypoetry/virtualenvs/l2ss-py-autotest-iYz8Sff2-py3.10/lib/python3.10/site-packages/requests/adapters.py:682: ConnectionError
--------------------------------- Captured Log ---------------------------------

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

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

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

test-results/uat_test_report.xml [took 18s]
Raw output
Failed: No data in lon and lat
collection_concept_id = 'C1243175554-POCLOUD', env = 'uat'
granule_json = {'meta': {'collection-concept-id': 'C1243175554-POCLOUD', 'concept-id': 'G1259247476-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': 'C1243175554-POCLOUD'}]}, 'meta': {'association-details': {'collecti...me': 'look', 'Size': 2, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -9999.0}], ...}}, ...]
harmony_env = <Environment.UAT: 3>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw8/test_spatial_subset_C1243175550')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'
skip_spatial = set()

    @pytest.mark.timeout(600)
    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=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, 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 G1259247476-POCLOUD for test
INFO     root:verify_collection.py:457 Sending harmony request https://harmony.uat.earthdata.nasa.gov/C1243175554-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-82.00275421142578%3A81.95951080322266%29&subset=lon%28-170.85684242248536%3A170.8543857574463%29&granuleId=G1259247476-POCLOUD&variable=all
INFO     root:verify_collection.py:461 Submitted harmony job cdf1fd88-f882-4cc2-adca-8bb68f6dc9a7
INFO     root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw8/test_spatial_subset_C1243175550/4930909_RSS_SMAP_SSS_L2C_r45665_20230819T221139_2023231_FNL_V05.0.nc4
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

See this annotation in the file changed.

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

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

test-results/uat_test_report.xml [took 21s]
Raw output
Failed: No data in lon and lat
collection_concept_id = 'C1261591414-POCLOUD', env = 'uat'
granule_json = {'meta': {'collection-concept-id': 'C1261591414-POCLOUD', 'concept-id': 'G1262685644-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': 'C1261591414-POCLOUD'}]}, 'meta': {'association-details': {'collecti...me': 'look', 'Size': 2, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -9999.0}], ...}}, ...]
harmony_env = <Environment.UAT: 3>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw6/test_spatial_subset_C1261591410')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'
skip_spatial = set()

    @pytest.mark.timeout(600)
    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=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, 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 G1262685644-POCLOUD for test
INFO     root:verify_collection.py:457 Sending harmony request https://harmony.uat.earthdata.nasa.gov/C1261591414-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=lat%28-82.28791065216065%3A82.04254169464112%29&subset=lon%28-170.9522521972656%3A170.9765441894531%29&granuleId=G1262685644-POCLOUD&variable=all
INFO     root:verify_collection.py:461 Submitted harmony job 6dc21cd8-0b31-4168-97dc-35860ab96c04
INFO     root:verify_collection.py:467 Downloaded: /tmp/pytest-of-runner/pytest-0/popen-gw6/test_spatial_subset_C1261591410/4931021_RSS_SMAP_SSS_L2C_r48736_20240316T214722_2024076_FNL_V06.0.nc4
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

See this annotation in the file changed.

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

test_temporal_subset[C1256946216-ASDC_DEV2] (tests.verify_collection) failed

test-results/uat_test_report.xml [took 0s]
Raw output
ValueError: time data '2021-12-31T22:53:23.666666+00:00' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'
collection_concept_id = 'C1256946216-ASDC_DEV2', env = 'uat'
granule_json = {'meta': {'collection-concept-id': 'C1256946216-ASDC_DEV2', 'concept-id': 'G1262213008-ASDC_DEV2', 'concept-type': 'gr...me': '2024-02-27T19:58:40+00:00'}, 'GranuleUR': 'CPF_LEO_N20_INTERCAL_RAD_L1A.STC_b001.20211231.225323.PT04M48S', ...}}
collection_variables = [{'associations': {'collections': [{'concept-id': 'C1256946216-ASDC_DEV2'}]}, 'meta': {'association-details': {'collec...scription': 'Extracted from _FillValue metadata attribute', 'Type': 'SCIENCE_FILLVALUE', 'Value': -999.0}], ...}}, ...]
harmony_env = <Environment.UAT: 3>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw9/test_temporal_subset_C125694620')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'
skip_temporal = {'C1238658389-POCLOUD', 'C1238658392-POCLOUD', 'C1265136917-OB_CLOUD', 'C1265136919-OB_CLOUD', 'C1265136924-OB_CLOUD', 'C1265136990-OB_CLOUD', ...}

    @pytest.mark.timeout(600)
    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)

verify_collection.py:576: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
verify_collection.py:179: in get_half_temporal_extent
    start_dt = datetime.strptime(start, '%Y-%m-%dT%H:%M:%S.%fZ')
/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/_strptime.py:568: in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

data_string = '2021-12-31T22:53:23.666666+00:00'
format = '%Y-%m-%dT%H:%M:%S.%fZ'

    def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"):
        """Return a 2-tuple consisting of a time struct and an int containing
        the number of microseconds based on the input string and the
        format string."""
    
        for index, arg in enumerate([data_string, format]):
            if not isinstance(arg, str):
                msg = "strptime() argument {} must be str, not {}"
                raise TypeError(msg.format(index, type(arg)))
    
        global _TimeRE_cache, _regex_cache
        with _cache_lock:
            locale_time = _TimeRE_cache.locale_time
            if (_getlang() != locale_time.lang or
                time.tzname != locale_time.tzname or
                time.daylight != locale_time.daylight):
                _TimeRE_cache = TimeRE()
                _regex_cache.clear()
                locale_time = _TimeRE_cache.locale_time
            if len(_regex_cache) > _CACHE_MAX_SIZE:
                _regex_cache.clear()
            format_regex = _regex_cache.get(format)
            if not format_regex:
                try:
                    format_regex = _TimeRE_cache.compile(format)
                # KeyError raised when a bad format is found; can be specified as
                # \\, in which case it was a stray % but with a space after it
                except KeyError as err:
                    bad_directive = err.args[0]
                    if bad_directive == "\\":
                        bad_directive = "%"
                    del err
                    raise ValueError("'%s' is a bad directive in format '%s'" %
                                        (bad_directive, format)) from None
                # IndexError only occurs when the format string is "%"
                except IndexError:
                    raise ValueError("stray %% in format '%s'" % format) from None
                _regex_cache[format] = format_regex
        found = format_regex.match(data_string)
        if not found:
>           raise ValueError("time data %r does not match format %r" %
                             (data_string, format))
E           ValueError: time data '2021-12-31T22:53:23.666666+00:00' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'

/opt/hostedtoolcache/Python/3.10.15/x64/lib/python3.10/_strptime.py:349: ValueError
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:572 Using granule G1262213008-ASDC_DEV2 for test

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

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

test_temporal_subset[C1243658323-GES_DISC] (tests.verify_collection) failed

test-results/uat_test_report.xml [took 47s]
Raw output
harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.12.0rc14: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2335, in function '_binary_op': '>=' not supported between instances of 'Array' and 'datetime.datetime'
collection_concept_id = 'C1243658323-GES_DISC', env = 'uat'
granule_json = {'meta': {'collection-concept-id': 'C1243658323-GES_DISC', 'concept-id': 'G1256529750-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': 'C1243658323-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.UAT: 3>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw5/test_temporal_subset_C124365830')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'
skip_temporal = {'C1238658389-POCLOUD', 'C1238658392-POCLOUD', 'C1265136917-OB_CLOUD', 'C1265136919-OB_CLOUD', 'C1265136924-OB_CLOUD', 'C1265136990-OB_CLOUD', ...}

    @pytest.mark.timeout(600)
    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=True)

verify_collection.py:591: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <harmony.harmony.Client object at 0x7f7a8f5fa8f0>
job_id = '8a2c2875-4154-4333-afff-92d9b868381f', 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.12.0rc14: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2335, 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:1085: ProcessingFailedException
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:572 Using granule G1256529750-GES_DISC for test
INFO     root:verify_collection.py:585 Sending harmony request https://harmony.uat.earthdata.nasa.gov/C1243658323-GES_DISC/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=time%28%222022-01-15T06%3A00%3A00%22%3A%222022-01-15T18%3A00%3A00%22%29&granuleId=G1256529750-GES_DISC&variable=all
INFO     root:verify_collection.py:589 Submitted harmony job 8a2c2875-4154-4333-afff-92d9b868381f

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

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

test_temporal_subset[C1240739526-POCLOUD] (tests.verify_collection) failed

test-results/uat_test_report.xml [took 33s]
Raw output
harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.12.0rc14: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2335, in function '_binary_op': '>=' not supported between instances of 'float' and 'datetime.datetime'
collection_concept_id = 'C1240739526-POCLOUD', env = 'uat'
granule_json = {'meta': {'collection-concept-id': 'C1240739526-POCLOUD', 'concept-id': 'G1261584421-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': 'C1240739526-POCLOUD'}]}, 'meta': {'association-details': {'collecti...ny_dim_1', 'Size': 812, 'Type': 'OTHER'}], 'FillValues': [{'Type': 'SCIENCE_FILLVALUE', 'Value': -9999.0}], ...}}, ...]
harmony_env = <Environment.UAT: 3>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw2/test_temporal_subset_C124073950')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'
skip_temporal = {'C1238658389-POCLOUD', 'C1238658392-POCLOUD', 'C1265136917-OB_CLOUD', 'C1265136919-OB_CLOUD', 'C1265136924-OB_CLOUD', 'C1265136990-OB_CLOUD', ...}

    @pytest.mark.timeout(600)
    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=True)

verify_collection.py:591: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <harmony.harmony.Client object at 0x7fc791fbd750>
job_id = '6ac8b3c4-3a30-4ef7-85ff-fd86edacea28', 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.12.0rc14: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2335, 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:1085: ProcessingFailedException
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:572 Using granule G1261584421-POCLOUD for test
INFO     root:verify_collection.py:585 Sending harmony request https://harmony.uat.earthdata.nasa.gov/C1240739526-POCLOUD/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=time%28%222024-01-08T13%3A10%3A31.750000%22%3A%222024-01-08T13%3A59%3A45.250000%22%29&granuleId=G1261584421-POCLOUD&variable=all
INFO     root:verify_collection.py:589 Submitted harmony job 6ac8b3c4-3a30-4ef7-85ff-fd86edacea28

Check warning on line 0 in tests.verify_collection

See this annotation in the file changed.

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

test_temporal_subset[C1233154410-GES_DISC] (tests.verify_collection) failed

test-results/uat_test_report.xml [took 45s]
Raw output
harmony.harmony.ProcessingFailedException: WorkItem failed: podaac/l2ss-py:2.12.0rc14: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2335, in function '_binary_op': '>=' not supported between instances of 'Array' and 'datetime.datetime'
collection_concept_id = 'C1233154410-GES_DISC', env = 'uat'
granule_json = {'meta': {'collection-concept-id': 'C1233154410-GES_DISC', 'concept-id': 'G1241748632-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': 'C1233154410-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.UAT: 3>
tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/popen-gw3/test_temporal_subset_C123315440')
bearer_token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfdWF0IiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIj...h4aAV-jV1Q6i4c_ze44KyaSwCIzL9HHovpL2Tewr4XYcAXUNC9iy7q3Xdsmz3ZdFI7mnQx4R8SdSoeWgklpUPCEEcOxdm1pVfwZNGVE6OPMxOyhX7nRFtg'
skip_temporal = {'C1238658389-POCLOUD', 'C1238658392-POCLOUD', 'C1265136917-OB_CLOUD', 'C1265136919-OB_CLOUD', 'C1265136924-OB_CLOUD', 'C1265136990-OB_CLOUD', ...}

    @pytest.mark.timeout(600)
    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=True)

verify_collection.py:591: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <harmony.harmony.Client object at 0x7f6716464310>
job_id = '6f1af452-f37f-4731-ad9f-ac3e8890e2fc', 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.12.0rc14: Error in file '/home/dockeruser/.local/lib/python3.10/site-packages/xarray/core/variable.py', line 2335, 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:1085: ProcessingFailedException
--------------------------------- Captured Log ---------------------------------
INFO     root:verify_collection.py:572 Using granule G1241748632-GES_DISC for test
INFO     root:verify_collection.py:585 Sending harmony request https://harmony.uat.earthdata.nasa.gov/C1233154410-GES_DISC/ogc-api-coverages/1.0.0/collections/parameter_vars/coverage/rangeset?forceAsync=true&subset=time%28%222021-04-01T06%3A00%3A00%22%3A%222021-04-01T18%3A00%3A00%22%29&granuleId=G1241748632-GES_DISC&variable=all
INFO     root:verify_collection.py:589 Submitted harmony job 6f1af452-f37f-4731-ad9f-ac3e8890e2fc

Check notice on line 0 in .github

See this annotation in the file changed.

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

3 skipped tests found

There are 3 skipped tests, see "Raw output" for the full list of skipped tests.
Raw output
tests.verify_collection ‑ test_temporal_subset[C1238658389-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238658392-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1268362659-OB_CLOUD]

Check notice on line 0 in .github

See this annotation in the file changed.

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

482 tests found

There are 482 tests, see "Raw output" for the full list of tests.
Raw output
tests.verify_collection ‑ test_spatial_subset[C1215667655-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215715440-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215718344-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720112-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720117-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720118-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720121-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720122-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720123-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720124-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720125-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720126-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720327-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720341-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720343-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720345-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720346-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720348-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720349-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720428-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720436-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720439-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720440-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720451-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1215720452-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1229667727-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1232989597-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1232995291-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1232998567-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1233154410-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1233405381-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1233979242-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234071416-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1234208436-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1234208437-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1234208438-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1234666333-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666340-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666344-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666359-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666372-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666373-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666374-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666453-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666454-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666455-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666458-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666464-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666465-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666467-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666468-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666469-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666476-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666477-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234666479-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1234724470-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1234724471-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238538224-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238538225-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238538230-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238538231-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238538232-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238538233-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238538240-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238538241-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238543220-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238543223-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621087-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621091-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621092-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621111-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621112-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621115-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621118-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621172-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621176-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621178-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621182-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621185-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621186-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238621219-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238657959-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238657960-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238657961-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238658049-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238658050-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238658051-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238658080-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238658086-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238658088-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238658389-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238658392-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238687282-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238687284-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238687534-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1238687546-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1239396234-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239396235-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1239396240-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557223-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557224-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557225-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557226-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557227-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557228-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557229-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557230-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557231-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557232-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557234-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557235-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557238-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557239-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557242-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557243-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557244-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557245-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557249-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557250-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557251-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557252-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557253-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557258-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557260-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557261-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240557262-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240560226-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240560227-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240560239-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240560242-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240560245-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240560254-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240560262-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240560263-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240560267-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240560272-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240656190-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240656191-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240656192-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240656193-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240739508-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739526-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739547-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739573-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739577-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739588-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739606-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739611-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739644-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739654-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739686-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739688-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739691-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739704-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739709-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739719-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739726-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739734-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739758-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739764-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240739768-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240817851-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1240932130-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240932132-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240932135-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240932137-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240932138-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240932139-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240932140-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1240932141-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1241042620-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1241042621-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1242274070-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1242274079-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1242379922-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1242379923-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1242379924-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1242735870-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1243157089-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1243175554-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1243175881-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1243658308-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1243658323-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1243720259-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1243747507-EEDTEST]
tests.verify_collection ‑ test_spatial_subset[C1244165121-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165122-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165124-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165125-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165126-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165128-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165133-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165134-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165136-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165138-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165140-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165141-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165143-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165144-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165146-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165147-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244165148-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1244459498-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1244810554-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1244968820-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1245295751-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1256420924-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1256420925-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1256445396-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1256524295-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1256946216-ASDC_DEV2]
tests.verify_collection ‑ test_spatial_subset[C1256981321-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1257081728-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1258118953-GES_DISC]
tests.verify_collection ‑ test_spatial_subset[C1258237266-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1258237267-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1258237271-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1258816710-ASDC_DEV2]
tests.verify_collection ‑ test_spatial_subset[C1259966654-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072645-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072646-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072648-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072649-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072650-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072651-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072652-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072654-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072655-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072656-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072658-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072659-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072660-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072661-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261072662-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261591413-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261591414-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261591569-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1261794337-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1262623432-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1263085435-POCLOUD]
tests.verify_collection ‑ test_spatial_subset[C1268362659-OB_CLOUD]
tests.verify_collection ‑ test_temporal_subset[C1215667655-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215715440-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215718344-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720112-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720117-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720118-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720121-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720122-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720123-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720124-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720125-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720126-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720327-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720341-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720343-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720345-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720346-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720348-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720349-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720428-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720436-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720439-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720440-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720451-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1215720452-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1229667727-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1232989597-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1232995291-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1232998567-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1233154410-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1233405381-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1233979242-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234071416-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1234208436-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1234208437-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1234208438-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1234666333-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666340-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666344-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666359-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666372-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666373-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666374-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666453-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666454-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666455-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666458-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666464-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666465-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666467-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666468-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666469-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666476-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666477-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234666479-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1234724470-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1234724471-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238538224-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238538225-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238538230-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238538231-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238538232-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238538233-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238538240-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238538241-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238543220-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238543223-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621087-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621091-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621092-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621111-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621112-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621115-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621118-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621172-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621176-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621178-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621182-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621185-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621186-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238621219-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238657959-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238657960-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238657961-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238658049-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238658050-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238658051-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238658080-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238658086-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238658088-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238658389-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238658392-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238687282-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238687284-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238687534-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1238687546-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1239396234-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239396235-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1239396240-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557223-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557224-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557225-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557226-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557227-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557228-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557229-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557230-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557231-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557232-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557234-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557235-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557238-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557239-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557242-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557243-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557244-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557245-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557249-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557250-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557251-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557252-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557253-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557258-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557260-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557261-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240557262-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240560226-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240560227-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240560239-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240560242-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240560245-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240560254-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240560262-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240560263-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240560267-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240560272-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240656190-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240656191-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240656192-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240656193-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240739508-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739526-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739547-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739573-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739577-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739588-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739606-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739611-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739644-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739654-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739686-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739688-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739691-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739704-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739709-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739719-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739726-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739734-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739758-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739764-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240739768-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240817851-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1240932130-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240932132-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240932135-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240932137-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240932138-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240932139-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240932140-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1240932141-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1241042620-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1241042621-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1242274070-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1242274079-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1242379922-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1242379923-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1242379924-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1242735870-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1243157089-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1243175554-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1243175881-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1243658308-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1243658323-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1243720259-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1243747507-EEDTEST]
tests.verify_collection ‑ test_temporal_subset[C1244165121-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165122-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165124-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165125-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165126-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165128-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165133-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165134-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165136-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165138-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165140-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165141-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165143-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165144-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165146-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165147-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244165148-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1244459498-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1244810554-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1244968820-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1245295751-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1256420924-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1256420925-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1256445396-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1256524295-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1256946216-ASDC_DEV2]
tests.verify_collection ‑ test_temporal_subset[C1256981321-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1257081728-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1258118953-GES_DISC]
tests.verify_collection ‑ test_temporal_subset[C1258237266-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1258237267-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1258237271-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1258816710-ASDC_DEV2]
tests.verify_collection ‑ test_temporal_subset[C1259966654-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072645-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072646-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072648-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072649-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072650-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072651-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072652-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072654-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072655-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072656-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072658-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072659-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072660-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072661-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261072662-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261591413-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261591414-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261591569-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1261794337-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1262623432-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1263085435-POCLOUD]
tests.verify_collection ‑ test_temporal_subset[C1268362659-OB_CLOUD]