PAVICS Web Processing Services using OGC-API integration with Weaver

When Weaver component is enabled, all WPS birds registered as process providers will be automatically accessible using OGC-API - Processes interface from the endpoint where Weaver is defined.

import json
import os
import time

import requests
import urllib3

WEAVER_TEST_FQDN = os.getenv(
    "WEAVER_TEST_FQDN", os.getenv("PAVICS_HOST", "pavics.ouranos.ca")
)
WEAVER_TEST_URL = os.getenv("WEAVER_TEST_URL", f"https://{WEAVER_TEST_FQDN}/weaver")
WEAVER_TEST_SSL_VERIFY = str(os.getenv("WEAVER_TEST_SSL_VERIFY", "true")).lower() in [
    "true",
    "1",
    "on",
    "yes",
]
WEAVER_TEST_DEFAULT_BIRDS = "finch, hummingbird, raven"
WEAVER_TEST_KNOWN_BIRDS = os.getenv(
    "WEAVER_TEST_KNOWN_BIRDS", WEAVER_TEST_DEFAULT_BIRDS
)
WEAVER_TEST_KNOWN_BIRDS = list(
    bird.strip() for bird in WEAVER_TEST_KNOWN_BIRDS.split(",")
)
WEAVER_TEST_DEFAULT_FILE = "/twitcher/ows/proxy/thredds/dodsC/birdhouse/testdata/ta_Amon_MRI-CGCM3_decadal1980_r1i1p1_199101-200012.nc"
WEAVER_TEST_FILE = os.getenv(
    "WEAVER_TEST_FILE",
    f"https://{WEAVER_TEST_FQDN}{WEAVER_TEST_DEFAULT_FILE}",
)
WEAVER_TEST_WPS_OUTPUTS = f"https://{WEAVER_TEST_FQDN}/wpsoutputs"  # for validation

WEAVER_TEST_REQUEST_HEADERS = {
    "Accept": "application/json",
    "Content-Type": "application/json",
}
WEAVER_TEST_REQUEST_XARGS = dict(
    headers=WEAVER_TEST_REQUEST_HEADERS, verify=WEAVER_TEST_SSL_VERIFY, timeout=5
)

if not WEAVER_TEST_SSL_VERIFY:
    urllib3.disable_warnings()

print("Variables:")
variables = [
    ("WEAVER_TEST_FQDN", WEAVER_TEST_FQDN),
    ("WEAVER_TEST_URL", WEAVER_TEST_URL),
    ("WEAVER_TEST_WPS_OUTPUTS", WEAVER_TEST_WPS_OUTPUTS),
    ("WEAVER_TEST_SSL_VERIFY", WEAVER_TEST_SSL_VERIFY),
    ("WEAVER_TEST_FILE", WEAVER_TEST_FILE),
    ("WEAVER_TEST_KNOWN_BIRDS", WEAVER_TEST_KNOWN_BIRDS),
    ("WEAVER_TEST_REQUEST_XARGS", WEAVER_TEST_REQUEST_XARGS),
]
max_len = max(len(var[0]) for var in variables) + 2
msg = f"  {{:{max_len}}}{{}}"
for var, val in variables:
    print(msg.format(var, val))


assert (
    len(WEAVER_TEST_KNOWN_BIRDS) >= 1
), "No test WPS provider provided in 'WEAVER_TEST_KNOWN_BIRDS'."
Variables:
  WEAVER_TEST_FQDN           pavics.ouranos.ca
  WEAVER_TEST_URL            https://pavics.ouranos.ca/weaver
  WEAVER_TEST_WPS_OUTPUTS    https://pavics.ouranos.ca/wpsoutputs
  WEAVER_TEST_SSL_VERIFY     True
  WEAVER_TEST_FILE           https://pavics.ouranos.ca/twitcher/ows/proxy/thredds/dodsC/birdhouse/testdata/ta_Amon_MRI-CGCM3_decadal1980_r1i1p1_199101-200012.nc
  WEAVER_TEST_KNOWN_BIRDS    ['finch', 'hummingbird', 'raven']
  WEAVER_TEST_REQUEST_XARGS  {'headers': {'Accept': 'application/json', 'Content-Type': 'application/json'}, 'verify': True, 'timeout': 5}

Define some utility functions for displaying test results

def json_dump(_json):
    try:
        if isinstance(_json, str):
            _json = json.loads(_json)
        return json.dumps(_json, indent=2, ensure_ascii=False)
    except Exception:
        return str(_json)


def json_print(_json):
    print(json_dump(_json))

Start with simple listing of registered WPS providers in Weaver

print("Listing WPS providers registered under Weaver...\n")

path = f"{WEAVER_TEST_URL}/providers"
query = {
    "detail": False,
    "check": False,
}  # skip pre-fetch to obtain results quickly (all checked in following cells)
resp = requests.get(path, params=query, **WEAVER_TEST_REQUEST_XARGS)
assert (
    resp.status_code == 200
), f"Error during WPS bird providers listing from [{path}]:\n{json_dump(resp.text)}"
body = resp.json()
json_print(body)

assert "providers" in body and len(
    body["providers"]
), f"Could not find Weaver WPS providers in response:\n{json_dump(body)}"
missing = []
for bird in sorted(WEAVER_TEST_KNOWN_BIRDS):
    if bird not in body["providers"]:
        missing.append(bird)
assert (
    not missing
), f"Could not find all expected Weaver WPS providers.\nMissing: [{missing}]\nExpected: [{WEAVER_TEST_KNOWN_BIRDS}]"
bird_ids = body["providers"]
Listing WPS providers registered under Weaver...

{
  "checked": false,
  "providers": [
    "catalog",
    "finch",
    "flyingpigeon",
    "hummingbird",
    "malleefowl",
    "raven"
  ]
}

Obtain OGC-API converted WPS processes by Weaver from original WPS providers endpoints

For each registered provider, Weaver sends a GetCapabilities WPS request to the remote endpoint and parses the XML result in order to form the corresponding OGC-API JSON content.

print("Listing WPS provider processes converted to OGC-API interface by Weaver:\n")

process_locations = []
for bird in sorted(WEAVER_TEST_KNOWN_BIRDS):
    path = f"{WEAVER_TEST_URL}/providers/{bird}/processes"
    resp = requests.get(path, **WEAVER_TEST_REQUEST_XARGS)
    assert (
        resp.status_code == 200
    ), f"Error during WPS bird processes retrieval on: [{path}]\n[{json_dump(resp.text)}]"
    body = resp.json()
    assert len(body["processes"]), f"WPS bird [{bird}] did not list any process!"
    for process in sorted(body["processes"], key=lambda p: p["id"]):
        process_desc_url = f"{path}/{process['id']}"
        process_locations.append(process_desc_url)
        print(" -", process_desc_url)
Listing WPS provider processes converted to OGC-API interface by Weaver:
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/average_polygon
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/base_flow_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/biologically_effective_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/blowing_snow
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/calm_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/cdd
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/cold_and_dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/cold_and_wet_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/cold_spell_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/cold_spell_duration_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/cold_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/consecutive_frost_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/consecutive_frost_free_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/continuous_snow_cover_end
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/continuous_snow_cover_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/cool_night_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/cooling_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/corn_heat_units
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/cwd
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/days_over_precip_doy_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/days_over_precip_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/days_with_snow
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/degree_days_exceedance_date
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/dlyfrzthw
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/doy_qmax
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/doy_qmin
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/dry_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/dry_spell_total_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/dtr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/dtrmax
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/dtrvar
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/effective_growing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/empirical_quantile_mapping
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cdd
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cold_and_dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cold_and_wet_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cold_spell_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cold_spell_duration_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cold_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_consecutive_frost_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_consecutive_frost_free_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cooling_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_corn_heat_units
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cwd
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_days_over_precip_doy_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_days_over_precip_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_degree_days_exceedance_date
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dlyfrzthw
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dry_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dry_spell_total_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dtr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dtrmax
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dtrvar
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_effective_growing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_etr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_first_day_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_first_day_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_fraction_over_precip_doy_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_fraction_over_precip_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_freezethaw_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_freezethaw_spell_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_freezethaw_spell_mean_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_freezing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_freshet_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_frost_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_frost_free_season_end
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_frost_free_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_frost_free_season_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_frost_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_growing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_growing_season_end
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_growing_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_growing_season_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_heat_wave_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_heat_wave_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_heat_wave_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_heat_wave_total_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_heating_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_high_precip_low_temp
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_hot_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_hot_spell_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_ice_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_last_spring_frost
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_liquid_precip_ratio
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_liquidprcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_max_n_day_precipitation_amount
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_max_pr_intensity
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_maximum_consecutive_warm_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_prcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_prlp
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_prsn
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_rain_frzgr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_rx1day
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_sdii
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_solidprcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_thawing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tropical_nights
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_tn_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_warm_and_dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_warm_and_wet_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_warm_spell_duration_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_wet_prcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_wetdays
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_wetdays_prop
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cdd
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cold_and_dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cold_and_wet_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cold_spell_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cold_spell_duration_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cold_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_consecutive_frost_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_consecutive_frost_free_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cooling_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_corn_heat_units
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cwd
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_days_over_precip_doy_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_days_over_precip_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_degree_days_exceedance_date
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dlyfrzthw
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dry_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dry_spell_total_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dtr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dtrmax
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dtrvar
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_effective_growing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_etr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_first_day_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_first_day_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_fraction_over_precip_doy_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_fraction_over_precip_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_freezethaw_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_freezethaw_spell_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_freezethaw_spell_mean_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_freezing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_freshet_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_frost_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_frost_free_season_end
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_frost_free_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_frost_free_season_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_frost_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_growing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_growing_season_end
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_growing_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_growing_season_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_heat_wave_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_heat_wave_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_heat_wave_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_heat_wave_total_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_heating_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_high_precip_low_temp
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_hot_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_hot_spell_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_ice_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_last_spring_frost
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_liquid_precip_ratio
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_liquidprcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_max_n_day_precipitation_amount
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_max_pr_intensity
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_maximum_consecutive_warm_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_prcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_prlp
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_prsn
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_rain_frzgr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_rx1day
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_sdii
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_solidprcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_thawing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tropical_nights
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_tn_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_warm_and_dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_warm_and_wet_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_warm_spell_duration_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_wet_prcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_wetdays
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_wetdays_prop
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cdd
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cold_and_dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cold_and_wet_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cold_spell_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cold_spell_duration_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cold_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_consecutive_frost_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_consecutive_frost_free_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cooling_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_corn_heat_units
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cwd
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_days_over_precip_doy_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_days_over_precip_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_degree_days_exceedance_date
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dlyfrzthw
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dry_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dry_spell_total_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dtr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dtrmax
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dtrvar
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_effective_growing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_etr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_first_day_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_first_day_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_fraction_over_precip_doy_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_fraction_over_precip_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_freezethaw_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_freezethaw_spell_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_freezethaw_spell_mean_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_freezing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_freshet_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_frost_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_frost_free_season_end
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_frost_free_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_frost_free_season_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_frost_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_growing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_growing_season_end
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_growing_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_growing_season_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_heat_wave_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_heat_wave_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_heat_wave_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_heat_wave_total_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_heating_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_high_precip_low_temp
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_hot_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_hot_spell_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_ice_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_last_spring_frost
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_liquid_precip_ratio
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_liquidprcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_max_n_day_precipitation_amount
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_max_pr_intensity
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_maximum_consecutive_warm_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_prcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_prlp
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_prsn
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_rain_frzgr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_rx1day
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_sdii
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_solidprcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_thawing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tropical_nights
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_tn_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_warm_and_dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_warm_and_wet_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_warm_spell_duration_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_wet_prcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_wetdays
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_wetdays_prop
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/etr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/fire_season
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/first_day_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/first_day_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/first_snowfall
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/fit
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/fraction_over_precip_doy_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/fraction_over_precip_thresh
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/freezethaw_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/freezethaw_spell_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/freezethaw_spell_mean_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/freezing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/freq_analysis
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/freshet_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/frost_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/frost_free_season_end
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/frost_free_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/frost_free_season_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/frost_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/geoseries_to_netcdf
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/growing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/growing_season_end
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/growing_season_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/growing_season_start
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/heat_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/heat_wave_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/heat_wave_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/heat_wave_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/heat_wave_total_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/heating_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/high_precip_low_temp
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/hot_spell_frequency
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/hot_spell_max_length
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/hourly_to_daily
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/huglin_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/humidex
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/hurs
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/hurs_fromdewpoint
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/huss_fromdewpoint
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/ice_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/jetstream_metric_woollings
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/last_snowfall
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/last_spring_frost
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/latitude_temperature_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/liquid_precip_ratio
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/liquidprcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/max_n_day_precipitation_amount
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/max_pr_intensity
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/maximum_consecutive_warm_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/mean_radiant_temperature
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/melt_and_precip_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/potential_evapotranspiration
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/prcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/prlp
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/prsn
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/rain_frzgr
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/rb_flashiness_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/rprctot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/rx1day
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/sdii
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/sea_ice_area
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/sea_ice_extent
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/snd_max_doy
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/snow_cover_duration
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/snow_depth
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/snow_melt_we_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/snw_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/snw_max_doy
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/solidprcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/stats
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/subset_bbox
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/subset_bbox_dataset
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/subset_grid_point_dataset
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/subset_gridpoint
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/subset_polygon
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/thawing_degree_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tropical_nights
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx10p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx90p
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_days_below
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_max
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_mean
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_min
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_tn_days_above
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/utci
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/warm_and_dry_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/warm_and_wet_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/warm_spell_duration_index
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/water_budget
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/water_budget_from_tas
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/wet_prcptot
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/wetdays
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/wetdays_prop
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/wind_chill
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/wind_speed_from_vector
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/wind_vector_from_speed
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/windy_days
 - https://pavics.ouranos.ca/weaver/providers/finch/processes/winter_storm
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cchecker
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_bbox
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_copy
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_indices
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_inter_mpi
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_operation
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_sinfo
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cfchecker
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cmor_checker
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ensembles
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/qa_cfchecker
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/qa_checker
 - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/spotchecker
 - https://pavics.ouranos.ca/weaver/providers/raven/processes/hydrobasins-select
 - https://pavics.ouranos.ca/weaver/providers/raven/processes/nalcms-zonal-stats
 - https://pavics.ouranos.ca/weaver/providers/raven/processes/nalcms-zonal-stats-raster
 - https://pavics.ouranos.ca/weaver/providers/raven/processes/raster-subset
 - https://pavics.ouranos.ca/weaver/providers/raven/processes/shape-properties
 - https://pavics.ouranos.ca/weaver/providers/raven/processes/terrain-analysis
 - https://pavics.ouranos.ca/weaver/providers/raven/processes/zonal-stats

Dispatched execution of Hummingbird WPS process

Here, we attempt running the ncdump process defined Hummingbird. This is analogous to the WPS_example notebook, but through the OGC-API interface provided by Weaver.

The process execution received by Weaver gets dispatched to the real WPS location. Weaver then monitors the process until completion and, once completed, returns the location where results can be retrieved.

assert (
    "hummingbird" in WEAVER_TEST_KNOWN_BIRDS
), "Hummingbird not specified within known WPS provider birds by Weaver. Cannot test dispatched process execution..."

WEAVER_BIRD_URL = f"{WEAVER_TEST_URL}/providers/hummingbird"
WEAVER_BIRD_PROCESS_URL = f"{WEAVER_BIRD_URL}/processes/ncdump"
assert (
    WEAVER_BIRD_PROCESS_URL in process_locations
), f"Could not find WPS bird process URL to test execution [{WEAVER_BIRD_PROCESS_URL}]."

print(f"Will run process: [{WEAVER_BIRD_PROCESS_URL}]")
Will run process: [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump]

First let’s obtain the specific description of the test WPS process

This request will tell us the explicit details of the process such as its inputs, outputs, and other metadata. Weaver parses the results retrieved from the original WPS provider using DescribeProcess request to generate the corresponding outputs. Weaver also adds additional metadata when it can infer some missing details from returned description fields.

# NBVAL_IGNORE_OUTPUT
# ignore detailed description prone to changes, instead run a few basic manual validations

print("Getting WPS process description...\n")

resp = requests.get(WEAVER_BIRD_PROCESS_URL, **WEAVER_TEST_REQUEST_XARGS)
assert (
    resp.status_code == 200
), f"Error getting WPS process description:\n[{json_dump(resp.text)}]"
body = resp.json()
json_print(body)

assert "hummingbird" in body["keywords"]
assert "wps-remote" in body["keywords"]
assert body["id"] == "ncdump"
Getting WPS process description...
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://schemas.opengis.net/ogcapi/processes/part1/1.0/openapi/schemas/process.yaml",
  "id": "ncdump",
  "title": "NCDump",
  "version": "4.4.1.1",
  "mutable": true,
  "description": "Run ncdump to retrieve NetCDF header metadata.",
  "keywords": [
    "hummingbird",
    "Hummingbird",
    "wps-remote"
  ],
  "metadata": [
    {
      "title": "Birdhouse",
      "href": "http://bird-house.github.io/",
      "rel": "birdhouse"
    },
    {
      "title": "User Guide",
      "href": "http://birdhouse-hummingbird.readthedocs.io/en/latest/",
      "rel": "user-guide"
    }
  ],
  "inputs": {
    "dataset": {
      "title": "Dataset",
      "description": "Enter a URL pointing to a NetCDF file (optional)",
      "minOccurs": 0,
      "maxOccurs": 100,
      "schema": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "minItems": 0,
        "maxItems": 100
      },
      "formats": [
        {
          "default": true,
          "mediaType": "application/x-netcdf"
        }
      ]
    },
    "dataset_opendap": {
      "title": "Remote OpenDAP Data URL",
      "description": "Or provide a remote OpenDAP data URL, for example: http://my.opendap/thredds/dodsC/path/to/file.nc",
      "minOccurs": 0,
      "maxOccurs": 100,
      "schema": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "minItems": 0,
        "maxItems": 100
      },
      "literalDataDomains": [
        {
          "default": true,
          "dataType": {
            "$id": "https://schemas.opengis.net/ogcapi/processes/part1/1.0/openapi/schemas/nameReferenceType.yaml",
            "name": "string"
          },
          "valueDefinition": {
            "anyValue": true
          }
        }
      ]
    }
  },
  "outputs": {
    "output": {
      "title": "NetCDF Metadata",
      "description": "NetCDF Metadata",
      "schema": {
        "type": "string"
      },
      "formats": [
        {
          "default": true,
          "mediaType": "text/plain"
        }
      ]
    }
  },
  "visibility": "public",
  "jobControlOptions": [
    "async-execute"
  ],
  "outputTransmission": [
    "reference",
    "value"
  ],
  "processDescriptionURL": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump",
  "processEndpointWPS1": "https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird?service=WPS&request=DescribeProcess&version=1.0.0&identifier=ncdump",
  "executeEndpoint": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs",
  "deploymentProfile": "http://www.opengis.net/profiles/eoc/wpsApplication",
  "links": [
    {
      "title": "Current process description.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump:4.4.1",
      "type": "application/json",
      "rel": "self"
    },
    {
      "title": "Process definition.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump",
      "type": "application/json",
      "rel": "process-meta"
    },
    {
      "title": "Process execution endpoint for job submission.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/execution",
      "type": "application/json",
      "rel": "http://www.opengis.net/def/rel/ogc/1.0/execute"
    },
    {
      "title": "List of registered processes.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes",
      "type": "application/json",
      "rel": "http://www.opengis.net/def/rel/ogc/1.0/processes"
    },
    {
      "title": "List of job executions corresponding to this process.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs",
      "type": "application/json",
      "rel": "http://www.opengis.net/def/rel/ogc/1.0/job-list"
    },
    {
      "title": "List of processes registered under the service.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes",
      "type": "application/json",
      "rel": "up"
    },
    {
      "title": "Tagged version of this process description.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump:4.4.1",
      "type": "application/json",
      "rel": "working-copy"
    },
    {
      "title": "Most recent revision of this process.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump",
      "type": "application/json",
      "rel": "latest-version"
    },
    {
      "title": "Listing of all revisions of this process.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes?detail=false&revisions=true&process=ncdump",
      "type": "application/json",
      "rel": "version-history"
    },
    {
      "title": "Provider service description.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird",
      "type": "application/xml",
      "rel": "service"
    },
    {
      "title": "Provider service definition.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird",
      "type": "application/xml",
      "rel": "service-meta"
    },
    {
      "title": "Remote service description.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird?service=WPS&request=GetCapabilities&version=1.0.0",
      "type": "application/xml",
      "rel": "service-desc"
    },
    {
      "title": "Remote process description.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird?service=WPS&request=DescribeProcess&version=1.0.0&identifier=ncdump",
      "type": "application/xml",
      "rel": "http://www.opengis.net/def/rel/ogc/1.0/process-desc"
    }
  ]
}

Submit the new process execution

Using OGC-API interface, WPS process execution are accomplished using a Job. That job will tell us the status location where we can monitor the process execution.

From the previous response, we can see that the process accepts many inputs and format variations. In this case, we are interested in the input named dataset to submit the file defined by WEAVER_TEST_FILE.

Following execution of the process, we expect to obtain a raw text data dump of the test file content. The location of the raw text file is expected be provided by output named output according to the process description.

print("Submitting process job with:")
print(f"  File:     [{WEAVER_TEST_FILE}]")
print(f"  Process:  [{WEAVER_BIRD_PROCESS_URL}]")

data = {
    "mode": "async",  # This tells Weaver to run the process asynchronously, such that we get non-blocking status location
    "response": "document",  # Type of status response (only this mode supported for the time being)
    "inputs": [
        {
            "id": "dataset_opendap",  # Target input of the process
            # Note: even though this is an URL, the expected type is a 'string' (not a 'File')
            #       therefore, 'data' (or 'value') must be used instead of 'href'
            "data": WEAVER_TEST_FILE,
        }
    ],
    "outputs": [
        {
            "id": "output",  # Target output we want to retrieve
            "transmissionMode": "reference",  # Ask to provide the result as HTTP reference
        }
    ],
}


# define a function to allow re-submitting later in case of error
def submit_job() -> str:
    _path = f"{WEAVER_BIRD_PROCESS_URL}/jobs"
    _resp = requests.post(_path, json=data, **WEAVER_TEST_REQUEST_XARGS)
    assert _resp.status_code in [
        200,
        201,
    ], f"Error during WPS job submission:\n{json_dump(resp.text)}"
    loc = _resp.headers.get("Location")
    assert loc, "Could not find status location URL"
    return loc


status_location = submit_job()
print(f"Job Status Location: [{status_location}]")
Submitting process job with:
  File:     [https://pavics.ouranos.ca/twitcher/ows/proxy/thredds/dodsC/birdhouse/testdata/ta_Amon_MRI-CGCM3_decadal1980_r1i1p1_199101-200012.nc]
  Process:  [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump]
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
Cell In[7], line 38
     34     assert loc, "Could not find status location URL"
     35     return loc
---> 38 status_location = submit_job()
     39 print(f"Job Status Location: [{status_location}]")

Cell In[7], line 29, in submit_job()
     27 _path = f"{WEAVER_BIRD_PROCESS_URL}/jobs"
     28 _resp = requests.post(_path, json=data, **WEAVER_TEST_REQUEST_XARGS)
---> 29 assert _resp.status_code in [
     30     200,
     31     201,
     32 ], f"Error during WPS job submission:\n{json_dump(resp.text)}"
     33 loc = _resp.headers.get("Location")
     34 assert loc, "Could not find status location URL"

AssertionError: Error during WPS job submission:
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://schemas.opengis.net/ogcapi/processes/part1/1.0/openapi/schemas/process.yaml",
  "id": "ncdump",
  "title": "NCDump",
  "version": "4.4.1.1",
  "mutable": true,
  "description": "Run ncdump to retrieve NetCDF header metadata.",
  "keywords": [
    "hummingbird",
    "Hummingbird",
    "wps-remote"
  ],
  "metadata": [
    {
      "title": "Birdhouse",
      "href": "http://bird-house.github.io/",
      "rel": "birdhouse"
    },
    {
      "title": "User Guide",
      "href": "http://birdhouse-hummingbird.readthedocs.io/en/latest/",
      "rel": "user-guide"
    }
  ],
  "inputs": {
    "dataset": {
      "title": "Dataset",
      "description": "Enter a URL pointing to a NetCDF file (optional)",
      "minOccurs": 0,
      "maxOccurs": 100,
      "schema": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "minItems": 0,
        "maxItems": 100
      },
      "formats": [
        {
          "default": true,
          "mediaType": "application/x-netcdf"
        }
      ]
    },
    "dataset_opendap": {
      "title": "Remote OpenDAP Data URL",
      "description": "Or provide a remote OpenDAP data URL, for example: http://my.opendap/thredds/dodsC/path/to/file.nc",
      "minOccurs": 0,
      "maxOccurs": 100,
      "schema": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "minItems": 0,
        "maxItems": 100
      },
      "literalDataDomains": [
        {
          "default": true,
          "dataType": {
            "$id": "https://schemas.opengis.net/ogcapi/processes/part1/1.0/openapi/schemas/nameReferenceType.yaml",
            "name": "string"
          },
          "valueDefinition": {
            "anyValue": true
          }
        }
      ]
    }
  },
  "outputs": {
    "output": {
      "title": "NetCDF Metadata",
      "description": "NetCDF Metadata",
      "schema": {
        "type": "string"
      },
      "formats": [
        {
          "default": true,
          "mediaType": "text/plain"
        }
      ]
    }
  },
  "visibility": "public",
  "jobControlOptions": [
    "async-execute"
  ],
  "outputTransmission": [
    "reference",
    "value"
  ],
  "processDescriptionURL": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump",
  "processEndpointWPS1": "https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird?service=WPS&request=DescribeProcess&version=1.0.0&identifier=ncdump",
  "executeEndpoint": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs",
  "deploymentProfile": "http://www.opengis.net/profiles/eoc/wpsApplication",
  "links": [
    {
      "title": "Current process description.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump:4.4.1",
      "type": "application/json",
      "rel": "self"
    },
    {
      "title": "Process definition.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump",
      "type": "application/json",
      "rel": "process-meta"
    },
    {
      "title": "Process execution endpoint for job submission.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/execution",
      "type": "application/json",
      "rel": "http://www.opengis.net/def/rel/ogc/1.0/execute"
    },
    {
      "title": "List of registered processes.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes",
      "type": "application/json",
      "rel": "http://www.opengis.net/def/rel/ogc/1.0/processes"
    },
    {
      "title": "List of job executions corresponding to this process.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs",
      "type": "application/json",
      "rel": "http://www.opengis.net/def/rel/ogc/1.0/job-list"
    },
    {
      "title": "List of processes registered under the service.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes",
      "type": "application/json",
      "rel": "up"
    },
    {
      "title": "Tagged version of this process description.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump:4.4.1",
      "type": "application/json",
      "rel": "working-copy"
    },
    {
      "title": "Most recent revision of this process.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump",
      "type": "application/json",
      "rel": "latest-version"
    },
    {
      "title": "Listing of all revisions of this process.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird/processes?detail=false&revisions=true&process=ncdump",
      "type": "application/json",
      "rel": "version-history"
    },
    {
      "title": "Provider service description.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird",
      "type": "application/xml",
      "rel": "service"
    },
    {
      "title": "Provider service definition.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/weaver/providers/hummingbird",
      "type": "application/xml",
      "rel": "service-meta"
    },
    {
      "title": "Remote service description.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird?service=WPS&request=GetCapabilities&version=1.0.0",
      "type": "application/xml",
      "rel": "service-desc"
    },
    {
      "title": "Remote process description.",
      "hreflang": "en-CA",
      "href": "https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird?service=WPS&request=DescribeProcess&version=1.0.0&identifier=ncdump",
      "type": "application/xml",
      "rel": "http://www.opengis.net/def/rel/ogc/1.0/process-desc"
    }
  ]
}

Monitor execution until completion

Now, we wait until the process completes by periodically verifying the provided status location of the job. The job will be running asynchronously and will be gradually updated with progression and logging details.

Following job submission request, the status can be either accepted if it is still in queue pending execution, or already be running. Once the job completes, the status should indicate it was either succeeded or failed.

# NBVAL_IGNORE_OUTPUT
# ignore status updates of job monitoring

print("Waiting for job completion with pooling monitoring of its status...")

# Define a timeout to abandon this monitoring. Process is relatively quick and shouldn't last too long.
# The process will be retried if failed to handle possible sporadic errors from the WPS remote provider.
# Stops on first maximum timout/retry reached, whichever happens first.
timeout = 60
retries = 10
attempt = retries
delta = 5
body = {}
while timeout >= 0:
    resp = requests.get(status_location, **WEAVER_TEST_REQUEST_XARGS)
    assert (
        resp.status_code == 200
    ), f"Failed retrieving job status at location [{status_location}]"
    body = resp.json()
    timeout -= delta
    status = body["status"]
    if status in ["accepted", "running"]:
        print(f"Delay: {delta}s, Duration: {body['duration']}, Status: {status}")
        time.sleep(delta)
        continue
    if status in ["failed", "succeeded"]:
        print(f"Final job status: [{status}]")
        if status == "failed":
            if attempt > 0:
                attempt -= 1
                retry_msg = f"{retries - attempt}/{retries}"
                print(f"Retrying execution... ({retry_msg})")
                status_location = submit_job()
                print(f"Job Status Location: [{status_location}] (retry: {retry_msg})")
                continue
            else:
                print(f"Final retry attempt reached ({retries}). Aborting.")
        break
    raise ValueError(f"Unhandled job status during monitoring: [{status}]")
assert timeout > 0, "Timeout reached. Process job submission never finished."

# note: don't assert the process success/failure yet, to retrieve more details in case it failed
assert body and "status" in body, f"Could not retrieve job status [{status_location}]"
status = body["status"]
Waiting for job completion with pooling monitoring of its status...
Delay: 5s, Duration: 00:00:00, Status: running
Final job status: [failed]
Retrying execution... (1/10)
Job Status Location: [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs/91b62b44-fb06-4be9-ad2b-43d5265d0048] (retry: 1/10)
Delay: 5s, Duration: 00:00:00, Status: accepted
Final job status: [succeeded]

Obtain job execution logs

Retrieve job logs listing execution steps accomplished by Weaver and the underlying process if it provided status messages. During job execution, Weaver attempts to collect any output the original WPS produces and integrates them within its own job logs in order to generate sequential chain of log events by each executed steps.

In case the job failed execution, this log will help us identify the cause of the problem. Otherwise, we will have a summary of processing steps.

NOTE:

Job logs is a feature specific to Weaver that is not necessarily implemented by other implementations of OGC-API - Processes.

# NBVAL_IGNORE_OUTPUT
# ignore variable logs values that could easily change, only informative

print("Obtaining job logs from execution...")

path = f"{status_location}/logs"
resp = requests.get(path, **WEAVER_TEST_REQUEST_XARGS)
assert resp.status_code == 200, f"Failed to retrieve job logs [{path}]"
logs = resp.json()

log_lines = "\n".join(logs)
assert len(logs) > 1
assert (
    status == "succeeded"
), f"Job execution was not successful. Status: [{status}]\nFull Logs:\n\n{log_lines}"
assert (
    "100%" in logs[-1] and "succeeded" in logs[-1]
), f"Log entry: [{logs[-1]}]\nFull Logs:\n\n{log_lines}"
print(f"Job logs retrieved from [{path}]:\n\n{log_lines}")
Obtaining job logs from execution...
Job logs retrieved from [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs/91b62b44-fb06-4be9-ad2b-43d5265d0048/logs]:

[2023-09-01 16:39:07] INFO     [weaver.datatype.Job] 00:00:00   0% accepted   Job task submitted for execution.
[2023-09-01 16:39:07] INFO     [weaver.datatype.Job] 00:00:00   0% running    Job started.
[2023-09-01 16:39:07] INFO     [weaver.datatype.Job] 00:00:00   0% running    Job task setup initiated.
[2023-09-01 16:39:07] INFO     [weaver.datatype.Job] 00:00:00   1% running    Job task setup completed.
[2023-09-01 16:39:07] DEBUG    [weaver.datatype.Job] 00:00:00   2% running    Employed WPS URL: [https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird]
[2023-09-01 16:39:07] INFO     [weaver.datatype.Job] 00:00:00   2% running    Execute WPS request for process [ncdump]
[2023-09-01 16:39:08] INFO     [weaver.datatype.Job] 00:00:00   3% running    Fetching job input definitions.
[2023-09-01 16:39:08] INFO     [weaver.datatype.Job] 00:00:00   4% running    Fetching job output definitions.
[2023-09-01 16:39:08] INFO     [weaver.datatype.Job] 00:00:00   5% running    Starting job process execution.
[2023-09-01 16:39:08] INFO     [weaver.datatype.Job] 00:00:00   5% running    Following updates could take a while until the Application Package answers...
[2023-09-01 16:39:12] DEBUG    [weaver.datatype.Job] 00:00:04   6% running    Updated job status location: [/data/wps_outputs/weaver/91b62b44-fb06-4be9-ad2b-43d5265d0048.xml].
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04   7% running    Starting monitoring of job execution.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04   8% running    [2023-09-01 16:39:08] INFO     [weaver.processes.wps_package|ncdump]   1% running    Preparing package logs done.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  10% running    [2023-09-01 16:39:08] INFO     [weaver.processes.wps_package|ncdump]   2% running    Launching package...
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  13% running    [2023-09-01 16:39:08] WARNING  [weaver.processes.wps_package|ncdump] Visible application CWL euid:egid [0:0]
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  16% running    [2023-09-01 16:39:08] INFO     [cwltool] Resolved '/tmp/tmpw4u4bc2w/ncdump' to 'file:///tmp/tmpw4u4bc2w/ncdump'
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  19% running    [2023-09-01 16:39:09] INFO     [cwltool] ../../../../tmp/tmpw4u4bc2w/ncdump:1:1: Unknown hint file:///tmp/tmpw4u4bc2w/WPS1Requirement
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  22% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]   5% running    Loading package content done.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  25% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]   6% running    Retrieve package inputs done.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  27% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]   8% running    Convert package inputs done.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  30% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]   9% running    Checking package prerequisites... (operation could take a while depending on requirements)
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  33% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]   9% running    Package ready for execution.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  36% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]  10% running    Running package...
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  39% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]  10% running    Preparing to launch package ncdump.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  42% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump] WPS-1 Package resolved from requirement/hint: WPS1Requirement
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  44% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]  11% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Preparing process for remote execution.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  47% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]  14% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Process ready for execute remote process.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  50% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]  18% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Staging inputs for remote execution.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  53% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]  20% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Preparing inputs/outputs for remote execution.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  56% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]  22% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Executing remote process job.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  59% running    [2023-09-01 16:39:09] INFO     [weaver.processes.wps_package|ncdump]  27% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Monitoring remote process job until completion.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  61% running    [2023-09-01 16:39:11] INFO     [weaver.processes.wps_package|ncdump]  27% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - 0% accepted   PyWPS Process ncdump accepted
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  64% running    [2023-09-01 16:39:12] INFO     [weaver.processes.wps_package|ncdump]  82% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - 100% succeeded  PyWPS Process NCDump finished
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  67% running    [2023-09-01 16:39:12] INFO     [weaver.processes.wps_package|ncdump]  82% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Retrieving job results definitions.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  70% running    [2023-09-01 16:39:12] INFO     [weaver.processes.wps_package|ncdump]  82% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Retrieving job output definitions from remote WPS-1 provider.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  73% running    [2023-09-01 16:39:12] INFO     [weaver.processes.wps_package|ncdump]  86% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Staging job outputs from remote process.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  76% running    [2023-09-01 16:39:12] INFO     [weaver.processes.wps_package|ncdump]  90% running    [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Running final cleanup operations before completion.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  78% running    [2023-09-01 16:39:12] INFO     [weaver.processes.wps_package|ncdump]  95% succeeded  [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Execution of remote process execution completed successfully.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  81% running    [2023-09-01 16:39:12] INFO     [weaver.processes.wps_package|ncdump]  95% running    Package execution done.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  84% running    [2023-09-01 16:39:12] INFO     [weaver.processes.wps_package|ncdump]  95% running    Nothing captured from internal application logs.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  87% running    [2023-09-01 16:39:12] INFO     [weaver.processes.wps_package|ncdump] Resolved WPS output [output] as file reference: [/tmp/wps_workdir/weaver/pywps_process__ezcfmkz/nc_dump_2QIB8z.txt]
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  90% running    [2023-09-01 16:39:12] INFO     [weaver.processes.wps_package|ncdump]  98% running    Generate package outputs done.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  93% running    [2023-09-01 16:39:12] INFO     [weaver.processes.wps_package|ncdump] 100% succeeded  Package complete.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  96% succeeded  Job succeeded (status: Package complete.).
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04  98% succeeded  Job succeeded.
[2023-09-01 16:39:12] INFO     [weaver.datatype.Job] 00:00:04 100% succeeded  Job task complete.

Obtain the result location and output the data

When job is succeeded, the result endpoint under the corresponding job will provide the downloadable file references for each of the available output ID defined by the WPS process.

Since the sample NetCDF file provided as input is expected to be converted to raw text data, it can be displayed below.

# If execution succeeded, the results endpoint will return 200 with corresponding references.
# Otherwise, 400 occurs because results were not produced due to failing job, and requesting its outputs is an invalid request.
path = f"{status_location}/results"
resp = requests.get(path, **WEAVER_TEST_REQUEST_XARGS)
assert (
    resp.status_code == 200
), f"Failed to retrieve job results location [{path}]. Code: [{resp.status_code}]."
print("\nJob was successful! Retrieving result location...")
body = resp.json()

# Here, our target output ID is named 'output' according to the process description
output = body.get("output")
assert isinstance(
    output, dict
), f"Could not find result matching ID 'output' within:\n{json_dump(body)}"
href = output["href"]
assert isinstance(href, str) and href.startswith(
    WEAVER_TEST_WPS_OUTPUTS
), f"Output result location does not have expected reference format: [{href}]"
print(f"Result is located at: [{href}]\n")
assert href.endswith(".txt")

print("Fetching output contents...")
resp = requests.get(href)
print(f"\nNCDUMP 'output' result content:\n\n{resp.text}")
Job was successful! Retrieving result location...
Result is located at: [https://pavics.ouranos.ca/wpsoutputs/weaver/public/91b62b44-fb06-4be9-ad2b-43d5265d0048/output/nc_dump_2QIB8z.txt]

Fetching output contents...

NCDUMP 'output' result content:

netcdf ta_Amon_MRI-CGCM3_decadal1980_r1i1p1_199101-200012.nc {
dimensions:
	time = UNLIMITED ; // (120 currently)
	bnds = 2 ;
	lat = 160 ;
	lon = 320 ;
	plev = 23 ;
variables:
	double time(time) ;
		time:bounds = "time_bnds" ;
		time:units = "days since 1981-01-01" ;
		time:calendar = "standard" ;
		time:axis = "T" ;
		time:long_name = "time" ;
		time:standard_name = "time" ;
	double time_bnds(time, bnds) ;
	double plev(plev) ;
		plev:units = "Pa" ;
		plev:axis = "Z" ;
		plev:positive = "down" ;
		plev:long_name = "pressure" ;
		plev:standard_name = "air_pressure" ;
	double lat(lat) ;
		lat:bounds = "lat_bnds" ;
		lat:units = "degrees_north" ;
		lat:axis = "Y" ;
		lat:long_name = "latitude" ;
		lat:standard_name = "latitude" ;
	double lat_bnds(lat, bnds) ;
	double lon(lon) ;
		lon:bounds = "lon_bnds" ;
		lon:units = "degrees_east" ;
		lon:axis = "X" ;
		lon:long_name = "longitude" ;
		lon:standard_name = "longitude" ;
	double lon_bnds(lon, bnds) ;
	float ta(time, plev, lat, lon) ;
		ta:standard_name = "air_temperature" ;
		ta:long_name = "Air Temperature" ;
		ta:units = "K" ;
		ta:original_name = "T" ;
		ta:cell_methods = "time: mean (interval: 30 minutes)" ;
		ta:cell_measures = "area: areacella" ;
		ta:history = "2011-08-12T05:05:34Z altered by CMOR: replaced missing value flag (-9.99e+33) with standard missing value (1e+20)." ;
		ta:missing_value = 1.e+20f ;
		ta:_FillValue = 1.e+20f ;
		ta:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_MRI-CGCM3_decadal1980_r0i0p0.nc areacella: areacella_fx_MRI-CGCM3_decadal1980_r0i0p0.nc" ;

// global attributes:
		:institution = "MRI (Meteorological Research Institute, Tsukuba, Japan)" ;
		:institute_id = "MRI" ;
		:experiment_id = "decadal1980" ;
		:source = "MRI-CGCM3 2011 atmosphere: GSMUV (gsmuv-110112, TL159L48); ocean: MRI.COM3 (MRICOM-3_0-20101116, 1x0.5L51); sea ice: MRI.COM3; land: HAL (HAL_cmip5_v0.31_04); aerosol: MASINGAR-mk2 (masingar_mk2-20110111_0203, TL95L48)" ;
		:model_id = "MRI-CGCM3" ;
		:forcing = "GHG, SA, Oz, LU, Sl, Vl, BC, OC (GHG includes CO2, CH4, N2O, CFC-11, CFC-12, and HCFC-22)" ;
		:parent_experiment_id = "N/A" ;
		:parent_experiment_rip = "N/A" ;
		:branch_time = 0. ;
		:contact = "Seiji Yukimoto (yukimoto@mri-jma.go.jp)" ;
		:history = "Output from /sharex3/cmip5/decadal1980/run-C3_decadal1980_01a/grads/atm_avr_mon.ctl 2011-08-12T05:05:34Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ;
		:references = "Model described by Yukimoto et al. (Technical Report of the Meteorological Research Institute, 2011, 64, 83pp.)" ;
		:initialization_method = 1 ;
		:physics_version = 1 ;
		:tracking_id = "ce91e727-5f22-44fc-b24d-5bb53393ac69" ;
		:product = "output" ;
		:experiment = "10- or 30-year run initialized in year 1980" ;
		:frequency = "mon" ;
		:creation_date = "2011-08-12T05:05:34Z" ;
		:Conventions = "CF-1.4" ;
		:project_id = "CMIP5" ;
		:table_id = "Table Amon (26 July 2011) 976b7fd1d9e1be31dddd28f5dc79b7a1" ;
		:title = "MRI-CGCM3 model output prepared for CMIP5 10- or 30-year run initialized in year 1980" ;
		:parent_experiment = "N/A" ;
		:modeling_realm = "atmos" ;
		:realization = 1 ;
		:cmor_version = "2.7.1" ;
		:DODS_EXTRA.Unlimited_Dimension = "time" ;
}