docs: def execute(self, eopatch=None, bbox=None, time_interval=None):
          """
          Creates OGC (WMS or WCS) request, downloads requested data and stores it together
          with valid data mask in newly created EOPatch. Returns the EOPatch.
  
          :param eopatch:
          :type eopatch: EOPatch or None
          :param bbox: specifies the bounding box of the requested image. Coordinates must be in
                       the specified coordinate reference system. Required.
          :type bbox: BBox
          :param time_interval: time or time range for which to return the results, in ISO8601 format
                                (year-month-date, for example: ``2016-01-01``, or year-month-dateThours:minutes:seconds
                                format, i.e. ``2016-01-01T16:31:21``). When a single time is specified the request will
                                return data for that specific date, if it exists. If a time range is specified the result
                                is a list of all scenes between the specified dates conforming to the cloud coverage
                                criteria. Most recent acquisition being first in the list. For the latest acquisition use
                                ``latest``. Examples: ``latest``, ``'2016-01-01'``, or ``('2016-01-01', ' 2016-01-31')``
           :type time_interval: datetime.datetime, str, or tuple of datetime.datetime/str
          """
          if eopatch is None:
              eopatch = EOPatch()
  
          request_params, service_type = self._prepare_request_data(eopatch, bbox, time_interval)
          request = {ServiceType.WMS: WmsRequest,
                     ServiceType.WCS: WcsRequest}[service_type](**request_params)
  
          request_dates = request.get_dates()
  
          if not eopatch.timestamp:
              eopatch.timestamp = request_dates
  
          download_frames = None
          if self.feature_type.is_time_dependent():
              download_frames = get_common_timestamps(request_dates, eopatch.timestamp)
  
          images = request.get_data(raise_download_errors=self.raise_download_errors, data_filter=download_frames)
  
          if not self.raise_download_errors:
              bad_data = [idx for idx, value in enumerate(images) if value is None]
              for idx in reversed(bad_data):
                  LOGGER.warning('Data from %s could not be downloaded for %s!', str(request_dates[idx]), self.layer)
                  del images[idx]
                  del request_dates[idx]
  
              for removed_frame in eopatch.consolidate_timestamps(request_dates):
                  LOGGER.warning('Removed data for frame %s from EOPatch '
                                 'due to unavailability of %s!', str(removed_frame), self.layer)
  
          self._add_data(eopatch, np.asarray(images))
          self._add_meta_info(eopatch, request_params, service_type)
          return eopatch