{ "cells": [ { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "# PAVICS Web Processing Services using OGC-API integration with Weaver\n", "\n", "When [Weaver component](https://github.com/bird-house/birdhouse-deploy/tree/master/birdhouse/components#weaver)\n", "is enabled, all WPS *birds* registered as process *providers* will be automatically accessible using\n", "[OGC-API - Processes][ogcapi-proc] interface from the endpoint where [Weaver][weaver] is defined.\n", "\n", "[weaver]: https://github.com/crim-ca/weaver\n", "[ogcapi-proc]: https://github.com/opengeospatial/ogcapi-processes/\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "is_executing": true, "pycharm": { "name": "#%%\n" }, "tags": [] }, "outputs": [], "source": [ "import json\n", "import os\n", "import time\n", "\n", "import requests\n", "import urllib3\n", "\n", "WEAVER_TEST_FQDN = os.getenv(\n", " \"WEAVER_TEST_FQDN\", os.getenv(\"PAVICS_HOST\", \"pavics.ouranos.ca\")\n", ")\n", "WEAVER_TEST_URL = os.getenv(\"WEAVER_TEST_URL\", f\"https://{WEAVER_TEST_FQDN}/weaver\")\n", "WEAVER_TEST_SSL_VERIFY = str(os.getenv(\"WEAVER_TEST_SSL_VERIFY\", \"true\")).lower() in [\n", " \"true\",\n", " \"1\",\n", " \"on\",\n", " \"yes\",\n", "]\n", "WEAVER_TEST_DEFAULT_BIRDS = \"finch, hummingbird, raven\"\n", "WEAVER_TEST_KNOWN_BIRDS = os.getenv(\n", " \"WEAVER_TEST_KNOWN_BIRDS\", WEAVER_TEST_DEFAULT_BIRDS\n", ")\n", "WEAVER_TEST_KNOWN_BIRDS = list(\n", " bird.strip() for bird in WEAVER_TEST_KNOWN_BIRDS.split(\",\")\n", ")\n", "WEAVER_TEST_DEFAULT_FILE = \"/twitcher/ows/proxy/thredds/dodsC/birdhouse/testdata/ta_Amon_MRI-CGCM3_decadal1980_r1i1p1_199101-200012.nc\"\n", "WEAVER_TEST_FILE = os.getenv(\n", " \"WEAVER_TEST_FILE\",\n", " f\"https://{WEAVER_TEST_FQDN}{WEAVER_TEST_DEFAULT_FILE}\",\n", ")\n", "WEAVER_TEST_WPS_OUTPUTS = f\"https://{WEAVER_TEST_FQDN}/wpsoutputs\" # for validation\n", "\n", "WEAVER_TEST_REQUEST_HEADERS = {\n", " \"Accept\": \"application/json\",\n", " \"Content-Type\": \"application/json\",\n", "}\n", "WEAVER_TEST_REQUEST_XARGS = dict(\n", " headers=WEAVER_TEST_REQUEST_HEADERS, verify=WEAVER_TEST_SSL_VERIFY, timeout=5\n", ")\n", "\n", "if not WEAVER_TEST_SSL_VERIFY:\n", " urllib3.disable_warnings()\n", "\n", "print(\"Variables:\")\n", "variables = [\n", " (\"WEAVER_TEST_FQDN\", WEAVER_TEST_FQDN),\n", " (\"WEAVER_TEST_URL\", WEAVER_TEST_URL),\n", " (\"WEAVER_TEST_WPS_OUTPUTS\", WEAVER_TEST_WPS_OUTPUTS),\n", " (\"WEAVER_TEST_SSL_VERIFY\", WEAVER_TEST_SSL_VERIFY),\n", " (\"WEAVER_TEST_FILE\", WEAVER_TEST_FILE),\n", " (\"WEAVER_TEST_KNOWN_BIRDS\", WEAVER_TEST_KNOWN_BIRDS),\n", " (\"WEAVER_TEST_REQUEST_XARGS\", WEAVER_TEST_REQUEST_XARGS),\n", "]\n", "max_len = max(len(var[0]) for var in variables) + 2\n", "msg = f\" {{:{max_len}}}{{}}\"\n", "for var, val in variables:\n", " print(msg.format(var, val))\n", "\n", "\n", "assert (\n", " len(WEAVER_TEST_KNOWN_BIRDS) >= 1\n", "), \"No test WPS provider provided in 'WEAVER_TEST_KNOWN_BIRDS'.\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Define some utility functions for displaying test results" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [] }, "outputs": [], "source": [ "def json_dump(_json):\n", " try:\n", " if isinstance(_json, str):\n", " _json = json.loads(_json)\n", " return json.dumps(_json, indent=2, ensure_ascii=False)\n", " except Exception:\n", " return str(_json)\n", "\n", "\n", "def json_print(_json):\n", " print(json_dump(_json))" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "### Start with simple listing of registered WPS providers in Weaver\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "pycharm": { "name": "#%%\n" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Listing WPS providers registered under Weaver...\n", "\n", "{\n", " \"checked\": false,\n", " \"providers\": [\n", " \"finch\",\n", " \"hummingbird\",\n", " \"raven\"\n", " ]\n", "}\n" ] } ], "source": [ "print(\"Listing WPS providers registered under Weaver...\\n\")\n", "\n", "path = f\"{WEAVER_TEST_URL}/providers\"\n", "query = {\n", " \"detail\": False,\n", " \"check\": False,\n", "} # skip pre-fetch to obtain results quickly (all checked in following cells)\n", "resp = requests.get(path, params=query, **WEAVER_TEST_REQUEST_XARGS)\n", "assert (\n", " resp.status_code == 200\n", "), f\"Error during WPS bird providers listing from [{path}]:\\n{json_dump(resp.text)}\"\n", "body = resp.json()\n", "json_print(body)\n", "\n", "assert \"providers\" in body and len(\n", " body[\"providers\"]\n", "), f\"Could not find Weaver WPS providers in response:\\n{json_dump(body)}\"\n", "missing = []\n", "for bird in sorted(WEAVER_TEST_KNOWN_BIRDS):\n", " if bird not in body[\"providers\"]:\n", " missing.append(bird)\n", "assert (\n", " not missing\n", "), f\"Could not find all expected Weaver WPS providers.\\nMissing: [{missing}]\\nExpected: [{WEAVER_TEST_KNOWN_BIRDS}]\"\n", "bird_ids = body[\"providers\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Obtain OGC-API converted WPS processes by Weaver from original WPS providers endpoints\n", "\n", "For each registered provider, Weaver sends a *GetCapabilities* WPS request to the remote endpoint and parses\n", "the XML result in order to form the corresponding OGC-API JSON content." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "pycharm": { "name": "#%%\n" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Listing WPS provider processes converted to OGC-API interface by Weaver:\n", "\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/average_polygon\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/base_flow_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/biologically_effective_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/blowing_snow\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/calm_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/cdd\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/cold_and_dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/cold_and_wet_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/cold_spell_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/cold_spell_duration_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/cold_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/consecutive_frost_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/consecutive_frost_free_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/continuous_snow_cover_end\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/continuous_snow_cover_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/cool_night_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/cooling_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/corn_heat_units\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/cwd\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/days_over_precip_doy_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/days_over_precip_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/days_with_snow\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/degree_days_exceedance_date\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/dlyfrzthw\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/doy_qmax\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/doy_qmin\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/dry_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/dry_spell_total_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/dtr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/dtrmax\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/dtrvar\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/effective_growing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/empirical_quantile_mapping\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cdd\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cold_and_dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cold_and_wet_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cold_spell_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cold_spell_duration_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cold_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_consecutive_frost_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_consecutive_frost_free_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cooling_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_corn_heat_units\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_cwd\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_days_over_precip_doy_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_days_over_precip_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_degree_days_exceedance_date\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dlyfrzthw\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dry_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dry_spell_total_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dtr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dtrmax\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_dtrvar\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_effective_growing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_etr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_first_day_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_first_day_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_fraction_over_precip_doy_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_fraction_over_precip_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_freezethaw_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_freezethaw_spell_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_freezethaw_spell_mean_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_freezing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_freshet_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_frost_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_frost_free_season_end\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_frost_free_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_frost_free_season_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_frost_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_growing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_growing_season_end\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_growing_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_growing_season_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_heat_wave_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_heat_wave_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_heat_wave_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_heat_wave_total_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_heating_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_high_precip_low_temp\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_hot_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_hot_spell_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_ice_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_last_spring_frost\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_liquid_precip_ratio\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_liquidprcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_max_n_day_precipitation_amount\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_max_pr_intensity\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_maximum_consecutive_warm_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_prcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_prlp\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_prsn\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_rain_frzgr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_rx1day\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_sdii\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_solidprcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tg_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_thawing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tn_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tropical_nights\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_tx_tn_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_warm_and_dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_warm_and_wet_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_warm_spell_duration_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_wet_prcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_wetdays\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_bbox_wetdays_prop\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cdd\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cold_and_dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cold_and_wet_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cold_spell_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cold_spell_duration_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cold_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_consecutive_frost_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_consecutive_frost_free_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cooling_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_corn_heat_units\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_cwd\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_days_over_precip_doy_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_days_over_precip_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_degree_days_exceedance_date\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dlyfrzthw\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dry_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dry_spell_total_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dtr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dtrmax\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_dtrvar\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_effective_growing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_etr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_first_day_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_first_day_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_fraction_over_precip_doy_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_fraction_over_precip_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_freezethaw_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_freezethaw_spell_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_freezethaw_spell_mean_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_freezing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_freshet_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_frost_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_frost_free_season_end\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_frost_free_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_frost_free_season_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_frost_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_growing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_growing_season_end\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_growing_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_growing_season_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_heat_wave_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_heat_wave_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_heat_wave_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_heat_wave_total_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_heating_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_high_precip_low_temp\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_hot_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_hot_spell_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_ice_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_last_spring_frost\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_liquid_precip_ratio\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_liquidprcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_max_n_day_precipitation_amount\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_max_pr_intensity\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_maximum_consecutive_warm_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_prcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_prlp\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_prsn\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_rain_frzgr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_rx1day\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_sdii\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_solidprcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tg_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_thawing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tn_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tropical_nights\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_tx_tn_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_warm_and_dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_warm_and_wet_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_warm_spell_duration_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_wet_prcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_wetdays\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_grid_point_wetdays_prop\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cdd\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cold_and_dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cold_and_wet_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cold_spell_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cold_spell_duration_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cold_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_consecutive_frost_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_consecutive_frost_free_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cooling_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_corn_heat_units\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_cwd\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_days_over_precip_doy_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_days_over_precip_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_degree_days_exceedance_date\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dlyfrzthw\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dry_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dry_spell_total_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dtr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dtrmax\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_dtrvar\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_effective_growing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_etr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_first_day_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_first_day_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_fraction_over_precip_doy_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_fraction_over_precip_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_freezethaw_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_freezethaw_spell_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_freezethaw_spell_mean_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_freezing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_freshet_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_frost_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_frost_free_season_end\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_frost_free_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_frost_free_season_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_frost_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_growing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_growing_season_end\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_growing_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_growing_season_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_heat_wave_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_heat_wave_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_heat_wave_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_heat_wave_total_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_heating_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_high_precip_low_temp\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_hot_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_hot_spell_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_ice_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_last_spring_frost\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_liquid_precip_ratio\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_liquidprcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_max_n_day_precipitation_amount\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_max_pr_intensity\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_maximum_consecutive_warm_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_prcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_prlp\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_prsn\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_rain_frzgr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_rx1day\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_sdii\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_solidprcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tg_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_thawing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tn_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tropical_nights\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_tx_tn_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_warm_and_dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_warm_and_wet_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_warm_spell_duration_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_wet_prcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_wetdays\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ensemble_polygon_wetdays_prop\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/etr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/fire_season\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/first_day_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/first_day_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/first_snowfall\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/fit\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/fraction_over_precip_doy_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/fraction_over_precip_thresh\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/freezethaw_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/freezethaw_spell_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/freezethaw_spell_mean_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/freezing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/freq_analysis\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/freshet_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/frost_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/frost_free_season_end\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/frost_free_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/frost_free_season_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/frost_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/geoseries_to_netcdf\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/growing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/growing_season_end\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/growing_season_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/growing_season_start\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/heat_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/heat_wave_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/heat_wave_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/heat_wave_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/heat_wave_total_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/heating_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/high_precip_low_temp\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/hot_spell_frequency\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/hot_spell_max_length\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/hourly_to_daily\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/huglin_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/humidex\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/hurs\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/hurs_fromdewpoint\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/huss_fromdewpoint\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/ice_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/jetstream_metric_woollings\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/last_snowfall\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/last_spring_frost\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/latitude_temperature_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/liquid_precip_ratio\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/liquidprcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/max_n_day_precipitation_amount\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/max_pr_intensity\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/maximum_consecutive_warm_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/mean_radiant_temperature\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/melt_and_precip_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/potential_evapotranspiration\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/prcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/prlp\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/prsn\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/rain_frzgr\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/rb_flashiness_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/rprctot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/rx1day\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/sdii\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/sea_ice_area\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/sea_ice_extent\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/snd_max_doy\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/snow_cover_duration\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/snow_depth\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/snow_melt_we_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/snw_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/snw_max_doy\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/solidprcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/stats\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/subset_bbox\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/subset_bbox_dataset\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/subset_grid_point_dataset\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/subset_gridpoint\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/subset_polygon\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tg_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/thawing_degree_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tn_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tropical_nights\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx10p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx90p\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_days_below\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_max\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_mean\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_min\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/tx_tn_days_above\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/utci\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/warm_and_dry_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/warm_and_wet_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/warm_spell_duration_index\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/water_budget\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/water_budget_from_tas\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/wet_prcptot\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/wetdays\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/wetdays_prop\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/wind_chill\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/wind_speed_from_vector\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/wind_vector_from_speed\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/windy_days\n", " - https://pavics.ouranos.ca/weaver/providers/finch/processes/winter_storm\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cchecker\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_bbox\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_copy\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_indices\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_inter_mpi\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_operation\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cdo_sinfo\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cfchecker\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/cmor_checker\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ensembles\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/qa_cfchecker\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/qa_checker\n", " - https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/spotchecker\n", " - https://pavics.ouranos.ca/weaver/providers/raven/processes/hydrobasins-select\n", " - https://pavics.ouranos.ca/weaver/providers/raven/processes/nalcms-zonal-stats\n", " - https://pavics.ouranos.ca/weaver/providers/raven/processes/nalcms-zonal-stats-raster\n", " - https://pavics.ouranos.ca/weaver/providers/raven/processes/raster-subset\n", " - https://pavics.ouranos.ca/weaver/providers/raven/processes/shape-properties\n", " - https://pavics.ouranos.ca/weaver/providers/raven/processes/terrain-analysis\n", " - https://pavics.ouranos.ca/weaver/providers/raven/processes/zonal-stats\n" ] } ], "source": [ "print(\"Listing WPS provider processes converted to OGC-API interface by Weaver:\\n\")\n", "\n", "process_locations = []\n", "for bird in sorted(WEAVER_TEST_KNOWN_BIRDS):\n", " path = f\"{WEAVER_TEST_URL}/providers/{bird}/processes\"\n", " resp = requests.get(path, **WEAVER_TEST_REQUEST_XARGS)\n", " assert (\n", " resp.status_code == 200\n", " ), f\"Error during WPS bird processes retrieval on: [{path}]\\n[{json_dump(resp.text)}]\"\n", " body = resp.json()\n", " assert len(body[\"processes\"]), f\"WPS bird [{bird}] did not list any process!\"\n", " for process in sorted(body[\"processes\"], key=lambda p: p[\"id\"]):\n", " process_desc_url = f\"{path}/{process['id']}\"\n", " process_locations.append(process_desc_url)\n", " print(\" -\", process_desc_url)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dispatched execution of Hummingbird WPS process\n", "\n", "Here, we attempt running the `ncdump` process defined Hummingbird. This is analogous to the [WPS_example notebook](../notebooks/wps_with_owslib.md), but\n", "through the OGC-API interface provided by Weaver.\n", "\n", "The process execution received by Weaver gets dispatched to the real WPS location. Weaver then\n", "monitors the process until completion and, once completed, returns the location where results can be retrieved." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "pycharm": { "name": "#%%\n" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Will run process: [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump]\n" ] } ], "source": [ "assert (\n", " \"hummingbird\" in WEAVER_TEST_KNOWN_BIRDS\n", "), \"Hummingbird not specified within known WPS provider birds by Weaver. Cannot test dispatched process execution...\"\n", "\n", "WEAVER_BIRD_URL = f\"{WEAVER_TEST_URL}/providers/hummingbird\"\n", "WEAVER_BIRD_PROCESS_URL = f\"{WEAVER_BIRD_URL}/processes/ncdump\"\n", "assert (\n", " WEAVER_BIRD_PROCESS_URL in process_locations\n", "), f\"Could not find WPS bird process URL to test execution [{WEAVER_BIRD_PROCESS_URL}].\"\n", "\n", "print(f\"Will run process: [{WEAVER_BIRD_PROCESS_URL}]\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### First let's obtain the specific description of the test WPS process\n", "\n", "This request will tell us the explicit details of the process such as its inputs, outputs, and other metadata.\n", "Weaver parses the results retrieved from the original WPS provider using *DescribeProcess* request to\n", "generate the corresponding outputs. Weaver also adds additional metadata when it can infer some missing\n", "details from returned description fields." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "pycharm": { "name": "#%%\n" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Getting WPS process description...\n", "\n", "{\n", " \"id\": \"ncdump\",\n", " \"title\": \"NCDump\",\n", " \"version\": \"4.4.1.1\",\n", " \"mutable\": true,\n", " \"description\": \"Run ncdump to retrieve NetCDF header metadata.\",\n", " \"keywords\": [\n", " \"hummingbird\",\n", " \"Hummingbird\",\n", " \"wps-remote\"\n", " ],\n", " \"metadata\": [\n", " {\n", " \"title\": \"Birdhouse\",\n", " \"href\": \"http://bird-house.github.io/\",\n", " \"rel\": \"birdhouse\"\n", " },\n", " {\n", " \"title\": \"User Guide\",\n", " \"href\": \"http://birdhouse-hummingbird.readthedocs.io/en/latest/\",\n", " \"rel\": \"user-guide\"\n", " }\n", " ],\n", " \"inputs\": {\n", " \"dataset\": {\n", " \"title\": \"Dataset\",\n", " \"description\": \"Enter a URL pointing to a NetCDF file (optional)\",\n", " \"minOccurs\": 0,\n", " \"maxOccurs\": 100,\n", " \"schema\": {\n", " \"type\": \"array\",\n", " \"items\": {\n", " \"type\": \"string\"\n", " },\n", " \"minItems\": 0,\n", " \"maxItems\": 100\n", " },\n", " \"formats\": [\n", " {\n", " \"default\": true,\n", " \"mediaType\": \"application/x-netcdf\"\n", " }\n", " ]\n", " },\n", " \"dataset_opendap\": {\n", " \"title\": \"Remote OpenDAP Data URL\",\n", " \"description\": \"Or provide a remote OpenDAP data URL, for example: http://my.opendap/thredds/dodsC/path/to/file.nc\",\n", " \"minOccurs\": 0,\n", " \"maxOccurs\": 100,\n", " \"schema\": {\n", " \"type\": \"array\",\n", " \"items\": {\n", " \"type\": \"string\"\n", " },\n", " \"minItems\": 0,\n", " \"maxItems\": 100\n", " },\n", " \"literalDataDomains\": [\n", " {\n", " \"default\": true,\n", " \"dataType\": {\n", " \"name\": \"string\"\n", " },\n", " \"valueDefinition\": {\n", " \"anyValue\": true\n", " }\n", " }\n", " ]\n", " }\n", " },\n", " \"outputs\": {\n", " \"output\": {\n", " \"title\": \"NetCDF Metadata\",\n", " \"description\": \"NetCDF Metadata\",\n", " \"schema\": {\n", " \"type\": \"string\"\n", " },\n", " \"formats\": [\n", " {\n", " \"default\": true,\n", " \"mediaType\": \"text/plain\"\n", " }\n", " ]\n", " }\n", " },\n", " \"visibility\": \"private\",\n", " \"jobControlOptions\": [\n", " \"async-execute\"\n", " ],\n", " \"outputTransmission\": [\n", " \"reference\",\n", " \"value\"\n", " ],\n", " \"processDescriptionURL\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump\",\n", " \"processEndpointWPS1\": \"https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird?service=WPS&request=DescribeProcess&version=1.0.0&identifier=ncdump\",\n", " \"executeEndpoint\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs\",\n", " \"deploymentProfile\": \"http://www.opengis.net/profiles/eoc/wpsApplication\",\n", " \"links\": [\n", " {\n", " \"title\": \"Current process description.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump:4.4.1\",\n", " \"type\": \"application/json\",\n", " \"rel\": \"self\"\n", " },\n", " {\n", " \"title\": \"Process definition.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump\",\n", " \"type\": \"application/json\",\n", " \"rel\": \"process-meta\"\n", " },\n", " {\n", " \"title\": \"Process execution endpoint for job submission.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/execution\",\n", " \"type\": \"application/json\",\n", " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/execute\"\n", " },\n", " {\n", " \"title\": \"List of registered processes.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird/processes\",\n", " \"type\": \"application/json\",\n", " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/processes\"\n", " },\n", " {\n", " \"title\": \"List of job executions corresponding to this process.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs\",\n", " \"type\": \"application/json\",\n", " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/job-list\"\n", " },\n", " {\n", " \"title\": \"List of processes registered under the service.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird/processes\",\n", " \"type\": \"application/json\",\n", " \"rel\": \"up\"\n", " },\n", " {\n", " \"title\": \"Tagged version of this process description.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump:4.4.1\",\n", " \"type\": \"application/json\",\n", " \"rel\": \"working-copy\"\n", " },\n", " {\n", " \"title\": \"Most recent revision of this process.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump\",\n", " \"type\": \"application/json\",\n", " \"rel\": \"latest-version\"\n", " },\n", " {\n", " \"title\": \"Listing of all revisions of this process.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird/processes?detail=false&revisions=true&process=ncdump\",\n", " \"type\": \"application/json\",\n", " \"rel\": \"version-history\"\n", " },\n", " {\n", " \"title\": \"Provider service description.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird\",\n", " \"type\": \"application/xml\",\n", " \"rel\": \"service\"\n", " },\n", " {\n", " \"title\": \"Provider service definition.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/weaver/providers/hummingbird\",\n", " \"type\": \"application/xml\",\n", " \"rel\": \"service-meta\"\n", " },\n", " {\n", " \"title\": \"Remote service description.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird?service=WPS&request=GetCapabilities&version=1.0.0\",\n", " \"type\": \"application/xml\",\n", " \"rel\": \"service-desc\"\n", " },\n", " {\n", " \"title\": \"Remote process description.\",\n", " \"hreflang\": \"en-CA\",\n", " \"href\": \"https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird?service=WPS&request=DescribeProcess&version=1.0.0&identifier=ncdump\",\n", " \"type\": \"application/xml\",\n", " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/process-desc\"\n", " }\n", " ]\n", "}\n" ] } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "# ignore detailed description prone to changes, instead run a few basic manual validations\n", "\n", "print(\"Getting WPS process description...\\n\")\n", "\n", "resp = requests.get(WEAVER_BIRD_PROCESS_URL, **WEAVER_TEST_REQUEST_XARGS)\n", "assert (\n", " resp.status_code == 200\n", "), f\"Error getting WPS process description:\\n[{json_dump(resp.text)}]\"\n", "body = resp.json()\n", "json_print(body)\n", "\n", "assert \"hummingbird\" in body[\"keywords\"]\n", "assert \"wps-remote\" in body[\"keywords\"]\n", "assert body[\"id\"] == \"ncdump\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Submit the new process execution\n", "\n", "Using OGC-API interface, WPS process execution are accomplished using a *Job*. That job will tell us the status\n", "location where we can monitor the process execution.\n", "\n", "From the previous response, we can see that the process accepts many inputs and format variations.\n", "In this case, we are interested in the input named `dataset` to submit the file defined by `WEAVER_TEST_FILE`.\n", "\n", "Following execution of the process, we expect to obtain a raw text data dump of the test file content.\n", "The location of the raw text file is expected be provided by output named `output` according to the process description." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "pycharm": { "name": "#%%\n" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Submitting process job with:\n", " File: [https://pavics.ouranos.ca/twitcher/ows/proxy/thredds/dodsC/birdhouse/testdata/ta_Amon_MRI-CGCM3_decadal1980_r1i1p1_199101-200012.nc]\n", " Process: [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump]\n", "Job Status Location: [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs/7e219013-cbb8-45b2-994f-8c8b33cf6d94]\n" ] } ], "source": [ "print(\"Submitting process job with:\")\n", "print(f\" File: [{WEAVER_TEST_FILE}]\")\n", "print(f\" Process: [{WEAVER_BIRD_PROCESS_URL}]\")\n", "\n", "data = {\n", " \"mode\": \"async\", # This tells Weaver to run the process asynchronously, such that we get non-blocking status location\n", " \"response\": \"document\", # Type of status response (only this mode supported for the time being)\n", " \"inputs\": [\n", " {\n", " \"id\": \"dataset_opendap\", # Target input of the process\n", " # Note: even though this is an URL, the expected type is a 'string' (not a 'File')\n", " # therefore, 'data' (or 'value') must be used instead of 'href'\n", " \"data\": WEAVER_TEST_FILE,\n", " }\n", " ],\n", " \"outputs\": [\n", " {\n", " \"id\": \"output\", # Target output we want to retrieve\n", " \"transmissionMode\": \"reference\", # Ask to provide the result as HTTP reference\n", " }\n", " ],\n", "}\n", "\n", "\n", "# define a function to allow re-submitting later in case of error\n", "def submit_job() -> str:\n", " _path = f\"{WEAVER_BIRD_PROCESS_URL}/jobs\"\n", " _resp = requests.post(_path, json=data, **WEAVER_TEST_REQUEST_XARGS)\n", " assert _resp.status_code in [\n", " 200,\n", " 201,\n", " ], f\"Error during WPS job submission:\\n{json_dump(resp.text)}\"\n", " loc = _resp.headers.get(\"Location\")\n", " assert loc, \"Could not find status location URL\"\n", " return loc\n", "\n", "\n", "status_location = submit_job()\n", "print(f\"Job Status Location: [{status_location}]\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Monitor execution until completion\n", "\n", "Now, we wait until the process completes by periodically verifying the provided status location of the job.\n", "The job will be running asynchronously and will be gradually updated with progression and logging details.\n", "\n", "Following job submission request, the `status` can be either `accepted` if it is still in queue pending execution, or\n", "already be `running`. Once the job completes, the `status` should indicate it was either `succeeded` or `failed`.\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "pycharm": { "name": "#%%\n" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Waiting for job completion with pooling monitoring of its status...\n", "Delay: 5s, Duration: 00:00:00, Status: running\n", "Final job status: [failed]\n", "Retrying execution... (1/10)\n", "Job Status Location: [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs/91b62b44-fb06-4be9-ad2b-43d5265d0048] (retry: 1/10)\n", "Delay: 5s, Duration: 00:00:00, Status: accepted\n", "Final job status: [succeeded]\n" ] } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "# ignore status updates of job monitoring\n", "\n", "print(\"Waiting for job completion with pooling monitoring of its status...\")\n", "\n", "# Define a timeout to abandon this monitoring. Process is relatively quick and shouldn't last too long.\n", "# The process will be retried if failed to handle possible sporadic errors from the WPS remote provider.\n", "# Stops on first maximum timout/retry reached, whichever happens first.\n", "timeout = 60\n", "retries = 10\n", "attempt = retries\n", "delta = 5\n", "body = {}\n", "while timeout >= 0:\n", " resp = requests.get(status_location, **WEAVER_TEST_REQUEST_XARGS)\n", " assert (\n", " resp.status_code == 200\n", " ), f\"Failed retrieving job status at location [{status_location}]\"\n", " body = resp.json()\n", " timeout -= delta\n", " status = body[\"status\"]\n", " if status in [\"accepted\", \"running\"]:\n", " print(f\"Delay: {delta}s, Duration: {body['duration']}, Status: {status}\")\n", " time.sleep(delta)\n", " continue\n", " if status in [\"failed\", \"succeeded\"]:\n", " print(f\"Final job status: [{status}]\")\n", " if status == \"failed\":\n", " if attempt > 0:\n", " attempt -= 1\n", " retry_msg = f\"{retries - attempt}/{retries}\"\n", " print(f\"Retrying execution... ({retry_msg})\")\n", " status_location = submit_job()\n", " print(f\"Job Status Location: [{status_location}] (retry: {retry_msg})\")\n", " continue\n", " else:\n", " print(f\"Final retry attempt reached ({retries}). Aborting.\")\n", " break\n", " raise ValueError(f\"Unhandled job status during monitoring: [{status}]\")\n", "assert timeout > 0, \"Timeout reached. Process job submission never finished.\"\n", "\n", "# note: don't assert the process success/failure yet, to retrieve more details in case it failed\n", "assert body and \"status\" in body, f\"Could not retrieve job status [{status_location}]\"\n", "status = body[\"status\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Obtain job execution logs\n", "\n", "Retrieve job logs listing execution steps accomplished by Weaver and the underlying process if it provided\n", "status messages. During job execution, Weaver attempts to collect any output the original WPS produces and\n", "integrates them within its own job logs in order to generate sequential chain of log events by each executed steps.\n", "\n", "In case the job `failed` execution, this log will help us identify the cause of the problem.\n", "Otherwise, we will have a summary of processing steps.\n", "\n", "**NOTE**:\n", "\n", "> Job logs is a feature specific to Weaver that is not necessarily implemented by other implementations\n", " of [OGC-API - Processes](https://github.com/opengeospatial/ogcapi-processes/).\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "pycharm": { "name": "#%%\n" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Obtaining job logs from execution...\n", "Job logs retrieved from [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs/91b62b44-fb06-4be9-ad2b-43d5265d0048/logs]:\n", "\n", "[2023-09-01 16:39:07] INFO [weaver.datatype.Job] 00:00:00 0% accepted Job task submitted for execution.\n", "[2023-09-01 16:39:07] INFO [weaver.datatype.Job] 00:00:00 0% running Job started.\n", "[2023-09-01 16:39:07] INFO [weaver.datatype.Job] 00:00:00 0% running Job task setup initiated.\n", "[2023-09-01 16:39:07] INFO [weaver.datatype.Job] 00:00:00 1% running Job task setup completed.\n", "[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]\n", "[2023-09-01 16:39:07] INFO [weaver.datatype.Job] 00:00:00 2% running Execute WPS request for process [ncdump]\n", "[2023-09-01 16:39:08] INFO [weaver.datatype.Job] 00:00:00 3% running Fetching job input definitions.\n", "[2023-09-01 16:39:08] INFO [weaver.datatype.Job] 00:00:00 4% running Fetching job output definitions.\n", "[2023-09-01 16:39:08] INFO [weaver.datatype.Job] 00:00:00 5% running Starting job process execution.\n", "[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...\n", "[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].\n", "[2023-09-01 16:39:12] INFO [weaver.datatype.Job] 00:00:04 7% running Starting monitoring of job execution.\n", "[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.\n", "[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...\n", "[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]\n", "[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'\n", "[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\n", "[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.\n", "[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.\n", "[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.\n", "[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)\n", "[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.\n", "[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...\n", "[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.\n", "[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\n", "[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.\n", "[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.\n", "[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.\n", "[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.\n", "[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.\n", "[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.\n", "[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\n", "[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\n", "[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.\n", "[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.\n", "[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.\n", "[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.\n", "[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.\n", "[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.\n", "[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.\n", "[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]\n", "[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.\n", "[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.\n", "[2023-09-01 16:39:12] INFO [weaver.datatype.Job] 00:00:04 96% succeeded Job succeeded (status: Package complete.).\n", "[2023-09-01 16:39:12] INFO [weaver.datatype.Job] 00:00:04 98% succeeded Job succeeded.\n", "[2023-09-01 16:39:12] INFO [weaver.datatype.Job] 00:00:04 100% succeeded Job task complete.\n" ] } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "# ignore variable logs values that could easily change, only informative\n", "\n", "print(\"Obtaining job logs from execution...\")\n", "\n", "path = f\"{status_location}/logs\"\n", "resp = requests.get(path, **WEAVER_TEST_REQUEST_XARGS)\n", "assert resp.status_code == 200, f\"Failed to retrieve job logs [{path}]\"\n", "logs = resp.json()\n", "\n", "log_lines = \"\\n\".join(logs)\n", "assert len(logs) > 1\n", "assert (\n", " status == \"succeeded\"\n", "), f\"Job execution was not successful. Status: [{status}]\\nFull Logs:\\n\\n{log_lines}\"\n", "assert (\n", " \"100%\" in logs[-1] and \"succeeded\" in logs[-1]\n", "), f\"Log entry: [{logs[-1]}]\\nFull Logs:\\n\\n{log_lines}\"\n", "print(f\"Job logs retrieved from [{path}]:\\n\\n{log_lines}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Obtain the result location and output the data\n", "\n", "When job is `succeeded`, the result endpoint under the corresponding job will provide the downloadable file references\n", "for each of the available output ID defined by the WPS process.\n", "\n", "Since the sample NetCDF file provided as input is expected to be converted to raw text data, it can be displayed below." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "pycharm": { "name": "#%%\n" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Job was successful! Retrieving result location...\n", "Result is located at: [https://pavics.ouranos.ca/wpsoutputs/weaver/public/91b62b44-fb06-4be9-ad2b-43d5265d0048/output/nc_dump_2QIB8z.txt]\n", "\n", "Fetching output contents...\n", "\n", "NCDUMP 'output' result content:\n", "\n", "netcdf ta_Amon_MRI-CGCM3_decadal1980_r1i1p1_199101-200012.nc {\n", "dimensions:\n", "\ttime = UNLIMITED ; // (120 currently)\n", "\tbnds = 2 ;\n", "\tlat = 160 ;\n", "\tlon = 320 ;\n", "\tplev = 23 ;\n", "variables:\n", "\tdouble time(time) ;\n", "\t\ttime:bounds = \"time_bnds\" ;\n", "\t\ttime:units = \"days since 1981-01-01\" ;\n", "\t\ttime:calendar = \"standard\" ;\n", "\t\ttime:axis = \"T\" ;\n", "\t\ttime:long_name = \"time\" ;\n", "\t\ttime:standard_name = \"time\" ;\n", "\tdouble time_bnds(time, bnds) ;\n", "\tdouble plev(plev) ;\n", "\t\tplev:units = \"Pa\" ;\n", "\t\tplev:axis = \"Z\" ;\n", "\t\tplev:positive = \"down\" ;\n", "\t\tplev:long_name = \"pressure\" ;\n", "\t\tplev:standard_name = \"air_pressure\" ;\n", "\tdouble lat(lat) ;\n", "\t\tlat:bounds = \"lat_bnds\" ;\n", "\t\tlat:units = \"degrees_north\" ;\n", "\t\tlat:axis = \"Y\" ;\n", "\t\tlat:long_name = \"latitude\" ;\n", "\t\tlat:standard_name = \"latitude\" ;\n", "\tdouble lat_bnds(lat, bnds) ;\n", "\tdouble lon(lon) ;\n", "\t\tlon:bounds = \"lon_bnds\" ;\n", "\t\tlon:units = \"degrees_east\" ;\n", "\t\tlon:axis = \"X\" ;\n", "\t\tlon:long_name = \"longitude\" ;\n", "\t\tlon:standard_name = \"longitude\" ;\n", "\tdouble lon_bnds(lon, bnds) ;\n", "\tfloat ta(time, plev, lat, lon) ;\n", "\t\tta:standard_name = \"air_temperature\" ;\n", "\t\tta:long_name = \"Air Temperature\" ;\n", "\t\tta:units = \"K\" ;\n", "\t\tta:original_name = \"T\" ;\n", "\t\tta:cell_methods = \"time: mean (interval: 30 minutes)\" ;\n", "\t\tta:cell_measures = \"area: areacella\" ;\n", "\t\tta:history = \"2011-08-12T05:05:34Z altered by CMOR: replaced missing value flag (-9.99e+33) with standard missing value (1e+20).\" ;\n", "\t\tta:missing_value = 1.e+20f ;\n", "\t\tta:_FillValue = 1.e+20f ;\n", "\t\tta: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\" ;\n", "\n", "// global attributes:\n", "\t\t:institution = \"MRI (Meteorological Research Institute, Tsukuba, Japan)\" ;\n", "\t\t:institute_id = \"MRI\" ;\n", "\t\t:experiment_id = \"decadal1980\" ;\n", "\t\t: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)\" ;\n", "\t\t:model_id = \"MRI-CGCM3\" ;\n", "\t\t:forcing = \"GHG, SA, Oz, LU, Sl, Vl, BC, OC (GHG includes CO2, CH4, N2O, CFC-11, CFC-12, and HCFC-22)\" ;\n", "\t\t:parent_experiment_id = \"N/A\" ;\n", "\t\t:parent_experiment_rip = \"N/A\" ;\n", "\t\t:branch_time = 0. ;\n", "\t\t:contact = \"Seiji Yukimoto (yukimoto@mri-jma.go.jp)\" ;\n", "\t\t: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.\" ;\n", "\t\t:references = \"Model described by Yukimoto et al. (Technical Report of the Meteorological Research Institute, 2011, 64, 83pp.)\" ;\n", "\t\t:initialization_method = 1 ;\n", "\t\t:physics_version = 1 ;\n", "\t\t:tracking_id = \"ce91e727-5f22-44fc-b24d-5bb53393ac69\" ;\n", "\t\t:product = \"output\" ;\n", "\t\t:experiment = \"10- or 30-year run initialized in year 1980\" ;\n", "\t\t:frequency = \"mon\" ;\n", "\t\t:creation_date = \"2011-08-12T05:05:34Z\" ;\n", "\t\t:Conventions = \"CF-1.4\" ;\n", "\t\t:project_id = \"CMIP5\" ;\n", "\t\t:table_id = \"Table Amon (26 July 2011) 976b7fd1d9e1be31dddd28f5dc79b7a1\" ;\n", "\t\t:title = \"MRI-CGCM3 model output prepared for CMIP5 10- or 30-year run initialized in year 1980\" ;\n", "\t\t:parent_experiment = \"N/A\" ;\n", "\t\t:modeling_realm = \"atmos\" ;\n", "\t\t:realization = 1 ;\n", "\t\t:cmor_version = \"2.7.1\" ;\n", "\t\t:DODS_EXTRA.Unlimited_Dimension = \"time\" ;\n", "}\n", "\n", "\n" ] } ], "source": [ "# If execution succeeded, the results endpoint will return 200 with corresponding references.\n", "# Otherwise, 400 occurs because results were not produced due to failing job, and requesting its outputs is an invalid request.\n", "path = f\"{status_location}/results\"\n", "resp = requests.get(path, **WEAVER_TEST_REQUEST_XARGS)\n", "assert (\n", " resp.status_code == 200\n", "), f\"Failed to retrieve job results location [{path}]. Code: [{resp.status_code}].\"\n", "print(\"\\nJob was successful! Retrieving result location...\")\n", "body = resp.json()\n", "\n", "# Here, our target output ID is named 'output' according to the process description\n", "output = body.get(\"output\")\n", "assert isinstance(\n", " output, dict\n", "), f\"Could not find result matching ID 'output' within:\\n{json_dump(body)}\"\n", "href = output[\"href\"]\n", "assert isinstance(href, str) and href.startswith(\n", " WEAVER_TEST_WPS_OUTPUTS\n", "), f\"Output result location does not have expected reference format: [{href}]\"\n", "print(f\"Result is located at: [{href}]\\n\")\n", "assert href.endswith(\".txt\")\n", "\n", "print(\"Fetching output contents...\")\n", "resp = requests.get(href)\n", "print(f\"\\nNCDUMP 'output' result content:\\n\\n{resp.text}\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.4" } }, "nbformat": 4, "nbformat_minor": 4 }