diff --git a/docs/source/dev/builddocs.rst b/docs/source/dev/builddocs.rst index 35eeb42e..3247c6ff 100644 --- a/docs/source/dev/builddocs.rst +++ b/docs/source/dev/builddocs.rst @@ -2,18 +2,13 @@ Building the docs ================= +These docs are automatically built by ReadTheDocs, but can also be built locally. + To build the docs, grab a copy of the `pavics-sdi`_ repository on github:: git clone https://github.com/Ouranosinc/pavics-sdi.git -This is the repository presently storing the comprehensive documentation for the PAVICS platform. Because PAVICS processes are documented using the `autoprocess` directive, you'll also need to install a few other packages that contribute services for documentation to :: - - git clone https://github.com/bird-house/finch.git - cd finch - make clean install - cd .. - -There are other requirements (sphinx and a few extensions) that can be installed using `pip` in Python (2 or 3):: +There are requirements (sphinx and a few extensions) that can be installed using `pip`:: pip install -r requirements.txt @@ -23,36 +18,6 @@ After installing these libraries, you should be able to build the docs without e mkdir source/_static make html -Publishing the docs online --------------------------- - -If you have write permissions to `pavics-sdi`_, you can also deploy the html `online `_. -To do so for the first time, create a new directory next to the :file:`pavics-sdi` directory and clone the repo into an :file:`html` directory:: - - mkdir pavics-sdi-docs - cd pavics-sdi-docs - git clone git@github.com:Ouranosinc/pavics-sdi.git html - -Then enter :file:`html`, checkout the `gh-pages` branch and enter some voodoo incantations:: - - cd html - git checkout gh-pages - git symbolic-ref HEAD refs/heads/gh-pages # auto-switches branches to gh-pages - rm .git/index - git clean -fdx - -You'll also need to add a :file:`.nojekyll` file to make sure the stylesheets are loaded on github.io:: - - git add .nojekyll - git commit -m 'added .nojekyll' - git push - -You should then be able to go back to pavics-sdi/docs and run make `gh-pages`, which will build the html docs, copy them to the :file:`pavics-sdi-docs` just created and push them to the github gh-branch:: - - make gh-pages - -For more details, see the original `instructions `_. - Translations ------------ diff --git a/docs/source/dev/configuration.rst b/docs/source/dev/configuration.rst deleted file mode 100644 index a8c7c8a4..00000000 --- a/docs/source/dev/configuration.rst +++ /dev/null @@ -1,164 +0,0 @@ -.. _config: - -=============================== -Birdhouse service configuration -=============================== - -All birdhouse components are deployed and configured using the following methods: - -* Run ``docker-compose`` on a :file:`docker-compose.yml` config file to launch a group of containers using their images and some options. -* When a container is starting a make call with the target update-config and start is done (specified by the dockerfile CMD statement) - - * The update-config target update the container application config using buildout and the custom.cfg config file - * The start target launch the application using supervisor - -To customize the container application config we must also update the custom.cfg file used by the buildout recipe of each container. - - * Since custom.cfg is built into the docker image and thus reset each time we run an image the only way to alter it is to mount a host file inside the container using the volume option. Therefore a :file:`custom.cfg` is configured on host for each birdhouse component and mounted inside the container using the volume option of the :file:`docker-compose.yml` file. This way each time a container is started, it is configured by the host :file:`custom.cfg` file which indeed persist the lifecycle of a container - - * The :file:`custom.cfg` is a buildout configuration file which extends :file:`buildout.cfg` providing default parameters. Each birdhouse component has it's own buildout recipe looking for particular parameters to configure their application. - -.. note:: - An exemple recipe for ncWMS configuration can be found here: https://github.com/bird-house/birdhousebuilder.recipe.ncwms. Look on github for other components recipe : https://github.com/bird-house. - -Hummingbird ------------ - -For more information on Hummingbird, see the `Hummingbird-Birdhouse documentation `_. - -.. warning:: - First try at running CDO operation using the Hummingbird WPS (with url for input NetCDF file, only seems to work with the fileserver, not OPeNDAP), e.g. : http://132.217.140.31:8092/wps?service=WPS&version=1.0.0&request=Execute&identifier=cdo_operation&DataInputs=dataset=http://192.168.101.175:8083/thredds/fileServer/birdhouse/nrcan/nrcan_canada_daily/nrcan_canada_daily_pr_1960.nc;operator=monmax returns "PyWPS Process cdo_operation successfully calculated". However the output points to a NetCDF file on localhost (http://localhost:38092/wpsoutputs/hummingbird/output-4f80cb02-58db-11e6-8a37-533b457038a6.nc). Need to substitute localhost for the ip (132.217.140.31) and keep the same port : http://132.217.140.31:38092/wpsoutputs/hummingbird/output-4f80cb02-58db-11e6-8a37-533b457038a6.nc Previous note: the same operation with the command-line, and using the OPeNDAP link (i.e. >> cdo monmax http://132.217.140.31:8083/thredds/dodsC/birdhouse/nrcan/nrcan_canada_daily/nrcan_canada_daily_pr_1960.nc output.nc) succeeds, in ~3 minutes. It is much faster if the file is local. This brings up the question of whether we should pass the catalogue url when we know the file is actually on a local machine... Trying to execute the same process via our Phoenix installation is not possible. The execute button remains greyed out after entering an url and selecting an operator. - - -Phoenix -------- - -.. note:: - The Phoenix service requires a valid ssl certificate and key prior to running ``docker-compose`` in order to make use of HTTPS. In the :file:`docker-compose.yml` file, within the `phoenix/volumes` configuration, set the environment variable SSL_CERTIFICATE to a valid certificate. This certificate file should contain both the CERTIFICATE and PRIVATE KEY parts as required by the nginx "ssl_certificate_key" and "ssl_certificate" parameters. - -For more information on Phoenix, see the `Pyramid-Phoenix documentation `_. - -.. code-block:: bash - :caption: :file:`/config/phoenix/custom.cfg` - - [settings] - # User: admin, Password: querty - phoenix-password = sha256:... - -To change password get into the phoenix running container and use ``make passwd``. This will update the persistant host :file:`custom.cfg` with the new password hash. -If an error about missing ``IPython.lib`` occurs install `ipython`_ like this:: - - source $ANACONDA_HOME/bin/activate birdhouse - pip install ipython - -Phoenix still requires manual configuration in order for Solr to correctly index the THREDDS catalog: - -#. Go to https://:8443/ -#. Click on the login button |login| -#. Use the admin phoenix access with 'querty' password: - - .. image:: images/phoenix_username.* - -#. Go to the settings page |settings| -#. Click on the |service| button: - - .. image:: images/phoenix_services.* - -#. Register a new service: - - .. image:: images/phoenix_register.* - -#. Fill the form using the thredds catalog url (use the OpenStack internal IP), a service name of your choice and be sure to check the Thredds Catalog service type : - - .. image:: images/phoenix_register_thredds.* - -#. Click on the register button -#. Go to the Solr settings page by repeating the steps 4 and 5 but this time using the Solr button. - - .. image:: images/phoenix_solr.* - -#. Use the Parameters tab and increase the crawling depth to match the deepest catalog depth : -#. Activate the crawling in the Thredds Services tab by clicking on the toggle button near the + symbol. - - .. image:: images/phoenix_thredds_activate.png - -#. The status should turn to green when you click on the refresh button. - - -ncWMS ------ - -.. code-block:: bash - :caption: :file:`/config/ncwms2/custom.mfg` - - [settings] - tomcat-ncwms-password = - - [ncwms] - data_dir = /pavics-data - -Manual setup of the running docker ----------------------------------- -To access the ncWMS admin page (changes be overriden each time the container is restarted), edit the file: :file:`/opt/conda/envs/birdhouse/opt/apache-tomcat/conf/tomcat-users.xml` and remove the comment block around the manager-gui and ncWMS-admin role. -The administration page allow administrators to add new datasets but again it will not persist upon container restarting. - - -Default Tomcat credentials:: - - username="birdhouse" - password="4FO72WcTt7K9gYiNKApf" - -Default ncWMS credentials:: - - username="admin" - password="ju68hfld" - -Dynamic services ----------------- - -.. warning:: - The dynamic services section allow with only one command to enable access to all the database available at :file:`M:\data16\projets\multi\PAVICS\data` by configuring a file system entrypoint. The only thing to do is to use the following url: http://:8080/ncWMS2/wms?SERVICE=WMS&REQUEST=GetCapabilities&VERSION=1.3.0&DATASET=outputs/ and replace ```` by the relative path to :file:`M:\data16\projets\multi\PAVICS\data` to the required dataset. So thanks to this config and to the catalog service we should be able to get the entire database list from the catalog and access their WMS by using the relative path in the wms url. - -THREDDS -------- - -.. code-block:: bash - - [thredds] - data_root = /pavics-data - allow_wcs = true - allow_wms = true - - -PAVICS-DataCatalog ------------------- - -In the catalog.cfg file: -* Provide the solr and THREDDS host. -* Set the wps host to the server that will be exposing the catalog (this is the server where wps temporary output files will be saved). -* Set the WMS alternate server if desired. - - -.. |login| image:: images/phoenix_login.* -.. |settings| image:: images/phoenix_setting.* -.. |refresh| image:: images/phoenix_refresh.* -.. |service| image:: images/phoenix_services.* - -.. _pavics-sdi: https://github.com/Ouranosinc/pavics-sdi.git -.. _Docker: http://docker.com -.. _DockerHub: https://hub.docker.com/ -.. _ipython: https://ipython.org - - -Magpie ------- - -Emu ---- - -Other Birds? ------------- - - -.. todo:: - Examine the Birdhouse/Birdhouse-Docs to see if this section can be merged back to it and joined as a submodule here. Birds of interest are listed there. diff --git a/docs/source/dev/contributing.rst b/docs/source/dev/contributing.rst deleted file mode 100644 index a3fa49e4..00000000 --- a/docs/source/dev/contributing.rst +++ /dev/null @@ -1,187 +0,0 @@ -.. _contrib: - -============ -Contributing -============ - -Benchmark development environment -================================= - -For debugging and editing purposes, PAVICS should be set up on a virtual machine. We recommend installing the `Oracle VM VirtualBox with Extensions `_ and creating a VM with the following base specifications: - -- AMD64 Ubuntu Linux 16.04 Long-Term-Support (LTS) (via `Ubuntu Downloads `_) -- > 8 GB RAM -- > 70 GB Storage -- > 2 CPUs -- Network bridge access -- Install VBoxGuestAdditions within the Ubuntu guest for corresponding - VirtualBox version. This can be done via the `Devices` tab of the VM via the `Insert Guest Additions ISO image...` and following the install instruction from the ``autorun.sh`` script. - -Required VM packages for various PAVICS components (most can be installed via `apt-get` with root privileges): - -- python-dev -- curl `or` wget -- git -- docker.io -- docker-compose - -Setting up PyCharm -================== - -.. note:: - For missing python modules: https://www.jetbrains.com/help/pycharm/installing-uninstalling-and-upgrading-packages.html - -The PAVICS back-end relies on developmental builds based on the Open Geospatial Consortium Web Processing Services. To install these libraries in your working environment, run the following within your PyCharm console:: - - import pip - pip.main(['install', 'https://github.com/geopython/pywps/archive/7cab3866e34ce24d3df56e3c1c546739b1cda2d7.zip']) - pip.main(['install', '--upgrade', '--force-reinstall', 'https://github.com/bird-house/OWSLib/archive/pingudev.zip']) - -.. warning:: - Some packages are not happy with Python ``wheel``, try uninstalling it if all else fails. - - -Launching individual local components -===================================== - -Solr ----- - -:: - - docker pull pavics/solr - docker run --name my_solr -d -p 8983:8983 -t pavics/solr - -Check that Solr is running at http://localhost:8983/solr/#/birdhouse - -Public THREDDS --------------- - -:: - - git clone https://github.com/Ouranosinc/PAVICS.git - cp PAVICS/birdhouse/templates/docker-compose.override.public_thredds.yml PAVICS/birdhouse/docker-compose.override.yml - -In this new docker-compose.override.yml change ${PATH_TO_LOCAL_NETCDF_FILES} -to an actual path on disk with NetCDF files. - -:: - - docker-compose up -d thredds - -Check that thredds is running at http://localhost:8083/thredds/ - -Secure THREDDS (HTTPS) ----------------------- - -First you will need a self-signed certificate: - -:: - - openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 - -This will ask for various inputs that may be left blank. - -:: - - cat key.pem >> cert.pem - -cert.pm is your self-signed certificate. - -:: - - git clone https://github.com/Ouranosinc/PAVICS.git - -Switch to PAVICS/birdhouse directory. - -:: - - ./set_hostname.sh dummy - -Add this dummy hostname to /etc/hosts - -:: - - 127.0.0.1 dummy.crim.ca - -Either set SSL_CERTIFICATE to the location of cert.pem and HOSTNAME to -dummy.crim.ca or use the template docker-compose_shorcut.sh and set those -values in it (here renamed to mycompose.sh). - -:: - - cp PAVICS/birdhouse/templates/docker-compose.override.local_https_thredds.yml PAVICS/birdhouse/docker-compose.override.yml - -In this override file specify the path to local netcdf files and set -localhost IP. - -:: - - ./mycompose.sh up -d thredds proxy magpie twitcher - -It may take a minute for twitcher to get online. If it does not -respond after a while, try to restart everything once or twice. - -:: - - ./mycompose down - ./mycompose.sh up -d thredds proxy magpie twitcher - -Check that twitcher is running at https://localhost/twitcher/ (returns hello) - -Check that magpie is running at https://localhost/magpie/ - -Check that thredds is running at https://localhost/twitcher/ows/proxy/thredds/ - -Play around with magpie permissions to check that the security is working - -HTTPS custom WPS service ------------------------- - -Follow all the steps of the HTTPS THREDDS setup above up to the -template copy, instead use:: - - cp PAVICS/birdhouse/templates/docker-compose.override.local_https_wps.yml PAVICS/birdhouse/docker-compose.override.yml - -In this override file, set the localhost IP, then you can switch the -wpsandbox image for the wps service image of your choice and assign it -an available port of your choice. Then assign a corresponding port to -the proxy. A new proxy configuration file need to be added to -PAVICS/birdhouse/config/proxy/conf.d/wpsandbox.conf for this service, -e.g.:: - - server { - listen 8081; - location / { - proxy_pass http://wpsandbox; - } - } - -:: - - ./mycompose.sh up -d proxy magpie twitcher wpsandbox - -It may take a minute for twitcher to get online. If it does not -respond after a while, try to restart everything once or twice. - -:: - - ./mycompose down - ./mycompose.sh up -d thredds proxy magpie twitcher - -Check that twitcher is running at https://localhost/twitcher/ (returns hello) - -Check that magpie is running at https://localhost/magpie/ - -Register the new wps service in magpie: In Home > Edit Services > -wps > Add Service. In our case the name is wpsandbox and the public -url is https://dummy.crim.ca/twitcher/ows/proxy/wpsandbox with the wps -service type. Then edit this new service Protected URL to -http://dummy.crim.ca:8081 - -Alternatively, this can be entered in -PAVICS/birdhouse/config/magpie/providers.cfg - -Check that the wps is running at https://localhost/twitcher/ows/proxy/wpsandbox/pywps?service=WPS&version=1.0.0&request=GetCapabilities - -Play around with magpie permissions to check that the security is working diff --git a/docs/source/dev/data_management.rst b/docs/source/dev/data_management.rst index 4d6f8aad..e30ca9e3 100644 --- a/docs/source/dev/data_management.rst +++ b/docs/source/dev/data_management.rst @@ -1,111 +1,29 @@ -=========================== -Data and service management -=========================== +======================= +NetCDF data management +======================= -The PAVICS project Data Server is built around a Thematic Real-time Environmental Distributed Data Service (THREDDS). This service allows for real-time collection and presentation of archived data and metadata using remote access protocols to bridge the gap between data providers and researchers. +The PAVICS architecture relies on the Thematic Real-time Environmental Distributed Data Service (THREDDS) server to distribute netCDF files. This service allows for real-time collection and presentation of archived data and metadata using remote access protocols to bridge the gap between data providers and researchers. The THREDDS Project is an Open Source initiative maintained by UCAR's Unidata Program. For more information on Unidata, see the `Project Home Page `_. To learn more about THREDDS, view the `Project Description `_ on GitHub. To better understand the way THREDDS integrates within PAVICS, see the System Architecture :doc:`../arch/overview`. -NetCDF file management in THREDDS -================================= - - Data preparation for inclusion in the platform ---------------------------------------------- NetCDF files integrated in the PAVICS platform must follow the CF Conventions document: http://cfconventions.org/ -In order to benefit from the search engine capabilities, typical global -attributes should be set. Currently the platorms searches the following -fields:: - - project - institute - model - experiment - frequency - For variables, the standard_name and units should follow the CF standard name table: http://cfconventions.org/standard-names.html -It is recommended to provide a dataset_id as a global attribute -in each NetCDF file that is unique for each collection of files that constitute -a timeseries. - -NetCDF files with multiple variables are presently not fully supported. - - Adding files ------------ -NetCDF files can be manually added to the THREDDS Data Server by copying them to the directory used as a docker volume in ``docker-compose.yml`` (see :doc:`installation`). - -In order for new files to be catalogued, the Solr and PAVICS-DataCatalog components must be running and pavicrawler must be run:: - - # replace localhost and port number with your PAVICS-DataCatalog deployment address - http://localhost:8086/pywps?service=WPS&request=execute&version=1.0.0&identifier=pavicrawler&storeExecuteResponse=true&status=true&DataInputs= - -Note that this crawls the whole THREDDS server and can take a very long time. In order to partially crawl the THREDDS server, use:: - - http://localhost:8086/pywps?service=WPS&request=execute&version=1.0.0&identifier=pavicrawler&storeExecuteResponse=true&status=true&DataInputs=target_thredds=https://thredds_host.com/twitcher/ows/proxy/thredds/catalog/birdhouse/subpath/to/crawl - -It is possible to restrict the crawling even more from the specified THREDDS path with the target_files argument to pavicrawler. - -.. note:: - The pavicrawler scans for typical attributes (mostly defined by CMIP) in the NetCDF global attributes. This allows search by facets by other components of the platform. - -After running the pavicrawler, new entries in the catalog should appear in Solr:: +NetCDF files can be added to the THREDDS Data Server by system administrators, simply by copying them to the directory used as a docker volume in ``docker-compose.yml``. Contact pavics@ouranos.ca if there are datasets you'd like to see included. - http://localhost:8983/solr/#/birdhouse/query - # must Execute Query, with relevant search criteria, or by increasing rows to get more results - -By default, the dataset_id will be made up of the relative path on the thredds -server. Inspecting metadata ------------------- -An essential requirement for a functional platform is that netCDF data stored in THREDDS has complete and uniform -metadata. To do so, the :func:`pavics.catalog.thredds_crawler` function can be used to extract the metadata from the -netCDF files and see if there are missing entries:: - - from pavics.catalog import thredds_crawler as crawler - crawler('http://pavics.ouranos.ca/thredds', index_facets=['project'], exclude_files=['birdhouse/wps_outputs', 'birdhouse/workspaces']) - -Note that running this command can take a long while, so the `include_files` argument can be passed to restrict the -crawler to certain directories, such as :file:`birdhouse/ouranos/climex/`. - - -Birdhouse Solr -============== - -The birdhouse solr uses deduplication -(http://wiki.apache.org/solr/Deduplication) on the fields "source" and "url". -Essentially the id is a hash of the combination of those fields. This is -defined in solrconfig.xml -(e.g. https://github.com/bird-house/birdhousebuilder.recipe.solr/blob/master/birdhousebuilder/recipe/solr/templates/solrconfig.xml) - -THREDDS Data Server example -=========================== - -An example of a public THREDDS Data Server can be found here: -https://data.nodc.noaa.gov/thredds/catalog.html - -Adding external services -======================== - -.. todo:: - How to add WPS, WMS, WFS servers to PAVICS. - - -Using thredds_crawler -===================== - -Test code :: - - from thredds_crawler.crawl import Crawl - Crawl('https://pavics.ouranos.ca/thredds/birdhouse/ouranos/climex/catalog.xml') - Crawl('https://pavics.ouranos.ca/thredds/catalog/birdhouse/ouranos/climex/QC11d3_CCCma-CanESM2_rcp85/day/historical-r1-r1i1p1/tasmin/catalog.xml') +An essential requirement for a functional platform is that netCDF data stored in THREDDS has complete and uniform metadata. Work is in progress to validate metadata fields as part of the cataloguing process. diff --git a/docs/source/dev/index.rst b/docs/source/dev/index.rst index 872117ea..d70293c5 100644 --- a/docs/source/dev/index.rst +++ b/docs/source/dev/index.rst @@ -8,12 +8,7 @@ Developer Documentation :maxdepth: 2 installation - load_balancing - configuration - vm - permissions - geoserver data_management + geoserver integration_tests builddocs - contributing diff --git a/docs/source/dev/installation.md b/docs/source/dev/installation.md new file mode 100644 index 00000000..5e37935d --- /dev/null +++ b/docs/source/dev/installation.md @@ -0,0 +1,4 @@ +Installation +============ + +Deployment instructions for system administrators are provided in the birdhouse-deploy [documentation](https://birdhouse-deploy.readthedocs.io/). diff --git a/docs/source/dev/installation.rst b/docs/source/dev/installation.rst deleted file mode 100644 index d1e415cd..00000000 --- a/docs/source/dev/installation.rst +++ /dev/null @@ -1,200 +0,0 @@ -============ -Installation -============ - -.. note:: - PAVICS is built to work within POSIX and POSIX-like systems (e.g. Unix/Linux). For Windows users who want to administer a PAVICS data server, you may need to either install `PuTTY `_, a Unux/Linux virtual machine or use a POSIX API environment like the `Windows Subsytem for Linux `_ or `Cygwin `_ to interface with the PAVICS server system. - - -Deployment methods -================== - -PAVICS can be installed from source on `GitHub `_ or by using `Docker `_. Git/Github is a versioning software and platform that can fetch development branches of pavics while Docker is a virtualization tool for running isolated service images built with specific library environments. Depending on your needs and interests (e.g. debugging vs deploying) either platform may suit your needs. - -Proposing changes to PAVICS or :ref:`contrib` requires free a `GitHub account `_ but anyone can download the source code for PAVICS withour registering. Git is normally in most standard Linux software repositories and can be installed (using Debian/Ubuntu-based systems) with the following:: - - # Enable root access - sudo su - - # Updating software catalogues and and installed libraries - apt-get update; sudo apt-get upgrade - - # Installing git will also install dependent libraries - apt-get install -y git - - # Configuring git for code commits using your user credentials - exit # Leave superuser - git config --global user.name "Your Name" - git config --global user.email "youremail@domain.com" - - -For Docker installations, begin by following the guide for installing ``Docker Community Edition`` on your home machine from the `Docker Installation Page `_. Docker Community Edition is a set of command line tools for creating and launching container-based applications. - -Depending on your Linux distribution, you can either download and launch the installer directly or you may need to add a new ppa/apt/yum/dnf/etc. software repository to your system to install the most recent version. For Debian/Ubuntu-based systems:: - - # Enable root access - sudo su - - # Install base library requirements - apt-get install -y apt-transport-https ca-certificates wget software-properties-common - - # Install the Docker suite of tools - apt-get install -y docker docker.io docker-engine - -For users not using Linux, refer to the following installation guides for `Mac OS `_ and for `Windows `_. - -PAVICS and Dockerhub images -=========================== - -All code produced for the PAVICS project is Open Source and hosted publicly through GitHub repositories. Among our members/users, the preferred method for packaging and deployment relies on Docker images. As such, we use the Docker Image building and hosting features of `DockerHub`_. This feature automatically builds a new image for all major releases to the GitHub repository, for all repositories that include a ``Dockerfile``. The `resulting images `_ are all publicly available for distribution and deployment. Any PAVICS Docker image can be obtained using the following command:: - - docker pull pavics/[image_name] - -Most of the code base for PAVICS is forked from the `Birdhouse Project `_ which already has multiple DockerHub `build processes `_. Using our own DockerHub build gives us the advantage of having our own upstream build process for the code being modified by CRIM / Ouranos. Many of the modifications to these birdhouse components are merged upstream, but some are specific to the PAVICS project and we felt it was worthwhile to maintain an independent build process. - - -PAVICS installation with `docker-compose` -=========================================== - -.. todo:: - Base PAVICS installation is incomplete. The following lines refer to Phoenix instance. Need to specify which birds are needed for a bare installation of PAVICS: Phoenix, FlyingPigeon, Malleefowl, Emu, etc. - -First mount or create a symlink for the datasets storage at ``/data``. -Mount or make a symlink for the geoserver data storage so that ``/geoserver_data`` could be used (read/write) by geoserver. - -To install the suite of docker images you must use `docker-compose `_. Docker-compose is a docker helper for coordinating multiple docker images at once. Docker-compose exists in most Linux software repositories but can also be installed using ``pip`` or ``conda``. Depending on your Linux distribution and whether you have Anaconda/miniconda installed, run any of the following:: - - # For standard libraries (Ubuntu/Debian) - sudo apt-get install docker-compose - - # For system-installed Python2 or Python3 (requires sudo) - sudo apt-get install -y python-dev python3-dev - sudo -H pip install docker-compose - - # For Anaconda/miniconda (Python2 or Python3) - conda install docker-compose - -.. note:: - Presently, the main ``PAVICS`` repo is closed to the public while it is under heavy development - -After installing docker-compose, clone the PAVICS repository and navigate to the docker *build recipe* within `PAVICS`_:: - - # Cloning the PAVICS repository - git clone https://github.com/Ouranosinc/PAVICS.git - cd pavics-sdi/birdhouse - # Open the docker-compose.yml using a text editor - nano docker-compose.yml - -.. note:: - The :file:`docker-compose.yml` contains many of the setup configurations needed to successfully launch Birdhouse. Be sure to read the :ref:`config` and the :ref:`load_balancing` suggestions before continuing the installation. - -After modifying the necessary variables in the :file:`docker-compose.yml` file, simply run the following command, taking care to select an appropriate host name:: - - HOSTNAME='' bash -c 'docker-compose up -d' - -This installation will run on a single server instance, but there are instructions for :ref:`load_balancing`. - - -Updating containers to the latest version -========================================= - -To synchronize a deployment with the latest container available on dockerhub:: - - # Set working directory where the docker-compose.yml is located. Usually : - cd ~/PAVICS/birdhouse - - # Docker requires root privileges - sudo su - - # Pull the latest containers (container_name is optional but can limit the operation to only one container rather than applying to all containers) - HOSTNAME='' bash -c 'docker-compose pull [container_name]' - - # Stopping containers - HOSTNAME='' bash -c 'docker-compose stop [container_name]' - - # Start again containers (-d is for detached, avoid it to get all output to the command line) - HOSTNAME='' bash -c 'docker-compose up -d [container_name]' - -.. note:: - ``container_name`` is the name chosen in the docker-compose.yml, not the name of the docker image. - - -Resetting Bird services -======================= - -If a Bird Service becomes unusable, the docker containers can easily be reset to default settings:: - - # Docker requires root privileges - sudo su - - # Stopping and removing containers (this will flush their states) - HOSTNAME='' bash -c 'docker-compose down' - - # Start again containers (-d is for detached, avoid it to get all output to the command line) - HOSTNAME='' bash -c 'docker-compose up -d' - -.. note:: - Some manual tasks are required after resetting the birdhouse environment : See the manual steps under the Phoenix configuration - -Restarting Bird services -======================== - -If the dockers containers need to be stopped (including the docker service, if required) these steps will preserve the docker state and all configurations set via Bird Service web portals:: - - # Docker requires root privileges - sudo su - - # Stopping running containers - HOSTNAME='' bash -c 'docker-compose stop' - - # Stopping the docker service - service docker stop - -Restarting Bird Services (required after restarting the host vm):: - - # Docker requires root privileges - sudo su - - # Starting the docker service - service docker start - - # Starting the birdhouse containers - HOSTNAME='' bash -c 'docker-compose start' - - -Port specification -================== - -The :file:`docker-compose.yml` config file exposes ports for each docker container (left part is the public one, right part the container internal one). We try to respect the following convention:: - - 8xxx : port usually responding for the service (The HTTP port) - 28xxx: https port - 38xxx: the output port (To be documented) - 48xxx: the supervisor port of the container - -Container xxx value:: - - Phoenix : 443 (With 8081 as http and 8443 as https) - Malleefowl : 091 - Flyingpigeon : 093 - Emu : 094 - Solr : 983 (No https or output ports) - ncWMS2 : 080 (No https or output ports) - thredds : 083 (No https or output ports) - pavics-catalog : 086 (No https or output ports) - geoserver : 087 (No https or output ports) - -The exception is the Pavics-frontend, which has port 3000. - -To find which shell process uses a given port, use: - -.. code-block:: sh - - netstat -nlp | grep : - -.. _PAVICS: https://github.com/Ouranosinc/PAVICS.git -.. _DockerHub: https://hub.docker.com/ -.. _ipython: https://ipython.org - -.. todo:: - Update the installation and config with security changes diff --git a/docs/source/dev/integration_tests.md b/docs/source/dev/integration_tests.md new file mode 100644 index 00000000..66279f7d --- /dev/null +++ b/docs/source/dev/integration_tests.md @@ -0,0 +1,4 @@ +Integration tests +================= + +Notebooks found in in this repo are used as integration tests for the platform. That is, each time a change is made in the [birdhouse-deploy](https://github.com/bird-house/birdhouse-deploy) repository, the notebooks are run in the same Python environment run by the JupyterLab server. diff --git a/docs/source/dev/integration_tests.rst b/docs/source/dev/integration_tests.rst deleted file mode 100644 index 88640360..00000000 --- a/docs/source/dev/integration_tests.rst +++ /dev/null @@ -1,7 +0,0 @@ -================= -Integration tests -================= - -.. todo:: - - Document how to run integration tests diff --git a/docs/source/dev/load_balancing.rst b/docs/source/dev/load_balancing.rst deleted file mode 100644 index 41fac550..00000000 --- a/docs/source/dev/load_balancing.rst +++ /dev/null @@ -1,59 +0,0 @@ -.. _load_balancing: - -============== -Load balancing -============== - -Here we'll cover the case where pavics-sdi is installed on more than one machine and you want to balance the load across these machines. This is done with `NGINX`_ and requires modifications to :file:`docker-compose.yml` and creating a configuration file for the `NGINX`_ server. - -Modifying the :file:`docker-compose.yml` -======================================== - -To enable load balancing, we need a proxy to redirect requests to machines according to their usage. This is done by mapping proxy ports (5XXXX) to the *service* ports, such as those of flyingpigeon (8093) and malleefowl (8091). - -.. code-block:: bash - :caption: :file:`docker-compose.yml` - - proxy: - image: nginx - ports: - - "58094:8094" - - "58093:8093" - - "58091:8091" - volumes: - - ./config/proxy/conf.d:/etc/nginx/conf.d - - ./config/proxy/nginx.conf:/etc/nginx/nginx.conf - restart: always - - - -Modifying the Nginx configuration ---------------------------------- - -In the :file:`config/proxy` directory, there should be a file named :file:`nginx.conf`. This file can be edited for example to specify the number of *worker_processes*. In the :file:`conf.d` directory, there are a number of additional configuration file for each *load balanced* service, for example :file:`flyingpigeon.conf`, which would look like: - -.. code-block:: bash - :caption: :file:`config/proxy/conf.d/flyingpigeon.conf` - - upstream flyingpigeon { - hash $http_machineid; - server :8093; - server :8093; - server :8093; - } - server { - listen 8093; - location / { - proxy_pass http://flyingpigeon; - } - } - -This tell the proxy, listing on port 8093, to redirect requests to servers 1, 2 or 3 according to the ``machineid`` argument passed in the request header. That is, requests with the same ``machineid`` will be sent to the same server. This is important to control since output files are not automatically visible to all servers. So if for example process A downloads a file from a remote server and process B subsets the file, both have to be run on the same machine otherwise process B won't find the downloaded file. - -.. note:: - - * Server configuration is static - * It is not possible to assign port numbers to environment variables (eg ``$PORT_NUMBER``) - * When you change a configuration file and restart NGINX to pick up the new configuration, it implements a *graceful restart*. Both the old and new copies of NGINX run side-by-side for a short period of time. The old processes don’t accept any new connections and terminate once all their existing connections terminate. - -.. _NGINX: https://nginx.org diff --git a/docs/source/dev/permissions.rst b/docs/source/dev/permissions.rst deleted file mode 100644 index fb30700b..00000000 --- a/docs/source/dev/permissions.rst +++ /dev/null @@ -1,39 +0,0 @@ -========================= -User and Group management -========================= - -The following guide explains the management of users, groups, and permissions for the PAVICS deployment. Permissions and group settings for users both server-side and client-side and can be configured to unique deployment specifications. - -As mentioned, PAVICS is built to work within POSIX and POSIX-like systems. As such, user/group management within servers running PAVICS is synonymous with conventions for user/group management in Linux and Unix systems. - - -.. warning:: - Are we clarifying both within-server permissions and permissions as set within the Birds? - -Adding Users and Groups to PAVICS server -======================================== - -Users added to the PAVICS server for the purpose of adding data or administering Bird services may need unique access privileges. Once a user has been created with `useradd `_ and groups initiatialized with `groupadd `_ group membership and privileges can be later specified with ``usermod`` and ``groupmod``. - -Begin by tunneling into the server:: - - ssh user@server - -User and Group management for Bird services -=========================================== - -.. todo:: - - How authorizations for services work (the concept) - How to grant users access to data and services - - -Permissions and authorizations ------------------------------- - -Twitcher? ---------- - - -Malleefowl? ------------ diff --git a/docs/source/dev/vm.rst b/docs/source/dev/vm.rst deleted file mode 100644 index 25533ba8..00000000 --- a/docs/source/dev/vm.rst +++ /dev/null @@ -1,52 +0,0 @@ -================ -VM configuration -================ - -For development and testing it can be useful to install pavics-sdi in a virtual machine. Here we describe the configuration for an `OpenStack`_ environment. - -Data volumes -============ - -* Attach 2 openstack volumes to the vm (take note of its name looking like ``/dev/vdx``) -* Mount them at ``/data`` and ``/geoserver_data`` using the following command:: - - mount /dev/vdx /[geoserver_]data - -* New volumes must first be formatted using the command :command:`mkfs.ext4 /dev/vdx` - -Docker volume -============= - -Docker can take a lot of space to maintain all containers and the default directory ``/var/lib/docker`` on the host can rapidly run out of disk space. The easy solution is to mount a bigger volume at this position: - -#. Attach an openstack volume to the vm (take note of its name looking like ``/dev/vdx``) -#. Stop the docker service : :command:`service docker stop` -#. Mount the new volume at :file:`/var/lib/docker` using the following command:: - - mount /dev/vdx /var/lib/docker - -#. Start the docker service: :command:`service docker start` - -Automount -========= - -To automatically mount volumes at reboot we modified the :file:`/etc/fstab` file to include the attached `OpenStack`_ volumes. For example (mind the tabspaces): - -.. code-block:: bash - :caption: :file:`/etc/fstab` - - LABEL=cloudimg-rootfs / ext4 defaults 0 0 - /dev/vdb none swap sw,comment=cloudconfig 0 0 - /dev/vdd /data ext4 defaults 0 0 - /dev/vdc /var/lib/docker ext4 defaults 0 0 - - -Hostname resolution -=================== - -The virtual machine is publicly visible by using the `OpenStack`_ external IP. But this IP is not visible from inside, the internal IP must be used. To resolve this issue, create a DNS entry mapping a hostname to the external IP and edit :file:`/etc/hosts` from inside the VM so that the same hostname maps the internal IP. - -For example, ``outarde.crim.ca`` is resolved as 132.217.140.52 (OpenStack external IP) everywhere but from the inside of this vm the :file:`/etc/hosts` config resolve this hostname to 192.168.101.91 (OpenStack internal IP). - - -.. _`OpenStack`: https://www.openstack.org/ diff --git a/docs/source/notebook-components/weaver_example.ipynb b/docs/source/notebook-components/weaver_example.ipynb index 675f21b0..62afa504 100644 --- a/docs/source/notebook-components/weaver_example.ipynb +++ b/docs/source/notebook-components/weaver_example.ipynb @@ -22,12 +22,10 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "jupyter": { - "outputs_hidden": false - }, "pycharm": { "name": "#%%\n" - } + }, + "tags": [] }, "outputs": [ { @@ -40,7 +38,7 @@ " WEAVER_TEST_WPS_OUTPUTS https://pavics.ouranos.ca/wpsoutputs\n", " WEAVER_TEST_SSL_VERIFY True\n", " WEAVER_TEST_FILE https://pavics.ouranos.ca/twitcher/ows/proxy/thredds/dodsC/birdhouse/testdata/ta_Amon_MRI-CGCM3_decadal1980_r1i1p1_199101-200012.nc\n", - " WEAVER_TEST_KNOWN_BIRDS ['finch', 'flyingpigeon', 'hummingbird', 'raven']\n", + " WEAVER_TEST_KNOWN_BIRDS ['finch', 'hummingbird', 'raven']\n", " WEAVER_TEST_REQUEST_XARGS {'headers': {'Accept': 'application/json', 'Content-Type': 'application/json'}, 'verify': True, 'timeout': 5}\n" ] } @@ -63,7 +61,7 @@ " \"on\",\n", " \"yes\",\n", "]\n", - "WEAVER_TEST_DEFAULT_BIRDS = \"finch, flyingpigeon, hummingbird, raven\"\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", @@ -119,7 +117,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "def json_dump(_json):\n", @@ -150,12 +150,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "jupyter": { - "outputs_hidden": false - }, "pycharm": { "name": "#%%\n" - } + }, + "tags": [] }, "outputs": [ { @@ -168,7 +166,6 @@ " \"checked\": false,\n", " \"providers\": [\n", " \"finch\",\n", - " \"flyingpigeon\",\n", " \"hummingbird\",\n", " \"raven\"\n", " ]\n", @@ -218,12 +215,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "jupyter": { - "outputs_hidden": false - }, "pycharm": { "name": "#%%\n" - } + }, + "tags": [] }, "outputs": [ { @@ -232,14 +227,6 @@ "text": [ "Listing WPS provider processes converted to OGC-API interface by Weaver:\n", "\n", - " - https://pavics.ouranos.ca/weaver/providers/catalog/processes/getpoint\n", - " - https://pavics.ouranos.ca/weaver/providers/catalog/processes/ncplotly\n", - " - https://pavics.ouranos.ca/weaver/providers/catalog/processes/pavicrawler\n", - " - https://pavics.ouranos.ca/weaver/providers/catalog/processes/pavicsearch\n", - " - https://pavics.ouranos.ca/weaver/providers/catalog/processes/pavicstestdocs\n", - " - https://pavics.ouranos.ca/weaver/providers/catalog/processes/pavicsupdate\n", - " - https://pavics.ouranos.ca/weaver/providers/catalog/processes/pavicsvalidate\n", - " - https://pavics.ouranos.ca/weaver/providers/catalog/processes/period2indices\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", @@ -670,19 +657,6 @@ " - 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/flyingpigeon/processes/climatechange_signal\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/plot_map_timemean\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/plot_spaghetti\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/plot_spatial_analog\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/plot_uncertainty\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/plot_uncertaintyrcp\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/pointinspection\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/robustness_statistic\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/spatial_analog\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/subset-wfs-polygon\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/subset_bbox\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/subset_continents\n", - " - https://pavics.ouranos.ca/weaver/providers/flyingpigeon/processes/subset_countries\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", @@ -697,36 +671,12 @@ " - 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/climatology_esp\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/climpred_hindcast_verification\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/forecast-floodrisk\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/graph_ensemble_uncertainty\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/graph_fit\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/graph_forecast_uncertainty\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/graph_objective_function_fit\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/graph_single_hydrograph\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/hindcast-evaluation\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/hindcasting\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/objective-function\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/ostrich-gr4j-cemaneige\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/ostrich-hbv-ec\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/ostrich-hmets\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/ostrich-mohyse\n", " - https://pavics.ouranos.ca/weaver/providers/raven/processes/raster-subset\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/raven\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/raven-gr4j-cemaneige\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/raven-hbv-ec\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/raven-hmets\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/raven-mohyse\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/raven-multi-model\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/realtime-forecast\n", - " - https://pavics.ouranos.ca/weaver/providers/raven/processes/regionalisation\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/ts_stats_graph\n", " - https://pavics.ouranos.ca/weaver/providers/raven/processes/zonal-stats\n" ] } @@ -766,12 +716,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "jupyter": { - "outputs_hidden": false - }, "pycharm": { "name": "#%%\n" - } + }, + "tags": [] }, "outputs": [ { @@ -810,14 +758,12 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": { - "jupyter": { - "outputs_hidden": false - }, "pycharm": { "name": "#%%\n" - } + }, + "tags": [] }, "outputs": [ { @@ -1056,14 +1002,12 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 11, "metadata": { - "jupyter": { - "outputs_hidden": false - }, "pycharm": { "name": "#%%\n" - } + }, + "tags": [] }, "outputs": [ { @@ -1073,7 +1017,7 @@ "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/fe9753e3-f0d8-457e-9171-7a0b732fc02c]\n" + "Job Status Location: [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs/7e219013-cbb8-45b2-994f-8c8b33cf6d94]\n" ] } ], @@ -1134,14 +1078,12 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 12, "metadata": { - "jupyter": { - "outputs_hidden": false - }, "pycharm": { "name": "#%%\n" - } + }, + "tags": [] }, "outputs": [ { @@ -1152,7 +1094,7 @@ "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/6e23a817-e202-497e-841b-f1d5b2d6eb42] (retry: 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" ] @@ -1226,14 +1168,12 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 13, "metadata": { - "jupyter": { - "outputs_hidden": false - }, "pycharm": { "name": "#%%\n" - } + }, + "tags": [] }, "outputs": [ { @@ -1241,75 +1181,54 @@ "output_type": "stream", "text": [ "Obtaining job logs from execution...\n", - "Job logs retrieved from [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs/6e23a817-e202-497e-841b-f1d5b2d6eb42/logs]:\n", + "Job logs retrieved from [https://pavics.ouranos.ca/weaver/providers/hummingbird/processes/ncdump/jobs/91b62b44-fb06-4be9-ad2b-43d5265d0048/logs]:\n", "\n", - "[2022-08-24 15:25:05] INFO [weaver.datatype.Job] 00:00:00 0% accepted Job task submitted for execution.\n", - "[2022-08-24 15:25:05] INFO [weaver.datatype.Job] 00:00:00 0% running Job started.\n", - "[2022-08-24 15:25:05] INFO [weaver.datatype.Job] 00:00:00 0% running Job task setup initiated.\n", - "[2022-08-24 15:25:05] INFO [weaver.datatype.Job] 00:00:00 1% running Job task setup completed.\n", - "[2022-08-24 15:25:05] DEBUG [weaver.datatype.Job] 00:00:00 2% running Employed WPS URL: [https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird]\n", - "[2022-08-24 15:25:05] INFO [weaver.datatype.Job] 00:00:00 2% running Execute WPS request for process [ncdump]\n", - "[2022-08-24 15:25:05] INFO [weaver.datatype.Job] 00:00:00 3% running Fetching job input definitions.\n", - "[2022-08-24 15:25:05] INFO [weaver.datatype.Job] 00:00:00 4% running Fetching job output definitions.\n", - "[2022-08-24 15:25:06] INFO [weaver.datatype.Job] 00:00:00 5% running Starting job process execution.\n", - "[2022-08-24 15:25:06] INFO [weaver.datatype.Job] 00:00:00 5% running Following updates could take a while until the Application Package answers...\n", - "[2022-08-24 15:25:09] DEBUG [weaver.datatype.Job] 00:00:03 6% running Updated job status location: [/data/wps_outputs/weaver/6e23a817-e202-497e-841b-f1d5b2d6eb42.xml].\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 7% running Starting monitoring of job execution.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 8% running [2022-08-24 19:25:06] INFO [weaver.processes.wps_package|ncdump] 1% running Preparing package logs done.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 9% running [2022-08-24 19:25:06] INFO [weaver.processes.wps_package|ncdump] 2% running Launching package...\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 11% running [2022-08-24 19:25:06] INFO [weaver.processes.wps_package|ncdump] Visible application CWL euid:egid [1000:1000]\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 13% running [2022-08-24 19:25:06] DEBUG [weaver.processes.wps_package|ncdump] Using cwltool.RuntimeContext args:\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 14% running {\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 16% running \"no_read_only\": false,\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 18% running \"no_match_user\": false,\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 19% running \"tmpdir_prefix\": \"/tmp/wps_workdir/weaver/cwltool_tmp_\",\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 21% running \"tmp_outdir_prefix\": \"/tmp/wps_workdir/weaver/cwltool_out_\",\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 23% running \"outdir\": \"/tmp/wps_workdir/weaver/pywps_process_xnuwfx_d\",\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 24% running \"debug\": true,\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 26% running \"user_space_docker_cmd\": null,\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 28% running \"strict_memory_limit\": false\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 30% running }\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 31% running [2022-08-24 19:25:06] INFO [cwltool] Resolved '/tmp/tmpo7ereawa/ncdump' to 'file:///tmp/tmpo7ereawa/ncdump'\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 33% running [2022-08-24 19:25:06] INFO [cwltool] ../../../../tmp/tmpo7ereawa/ncdump:1:1: Unknown hint file:///tmp/tmpo7ereawa/WPS1Requirement\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 35% running [2022-08-24 19:25:06] INFO [weaver.processes.wps_package|ncdump] 5% running Loading package content done.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 36% running [2022-08-24 19:25:06] INFO [weaver.processes.wps_package|ncdump] 6% running Retrieve package inputs done.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 38% running [2022-08-24 19:25:06] DEBUG [weaver.processes.wps_package|ncdump] File input (dataset) DROPPED. Detected default format as data.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 40% running [2022-08-24 19:25:06] INFO [weaver.processes.wps_package|ncdump] 8% running Convert package inputs done.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 41% running [2022-08-24 19:25:06] INFO [weaver.processes.wps_package|ncdump] 9% running Checking package prerequisites... (operation could take a while depending on requirements)\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 43% running [2022-08-24 19:25:06] DEBUG [weaver.processes.wps_package|ncdump] Skipping Docker setup not needed for remote execution.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 45% running [2022-08-24 19:25:06] INFO [weaver.processes.wps_package|ncdump] 9% running Package ready for execution.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 46% running [2022-08-24 19:25:06] INFO [weaver.processes.wps_package|ncdump] 10% running Running package...\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 48% running [2022-08-24 19:25:06] DEBUG [weaver.processes.wps_package|ncdump] Launching process package with inputs:\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 50% running {\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 52% running \"dataset_opendap\": \"https://pavics.ouranos.ca/twitcher/ows/proxy/thredds/dodsC/birdhouse/testdata/ta_Amon_MRI-CGCM3_decadal1980_r1i1p1_199101-200012.nc\"\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 53% running }\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 55% running [2022-08-24 19:25:06] INFO [weaver.processes.wps_package|ncdump] 10% running Preparing to launch package ncdump.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 57% running [2022-08-24 19:25:06] INFO [weaver.processes.wps_package|ncdump] WPS-1 Package resolved from requirement/hint: WPS1Requirement\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 58% running [2022-08-24 19:25:06] 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", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 60% running [2022-08-24 19:25:07] 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", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 62% running [2022-08-24 19:25:07] 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", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 63% running [2022-08-24 19:25:07] 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", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 65% running [2022-08-24 19:25:07] INFO [weaver.processes.wps_package|ncdump] 22% running [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Executing remote process job.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 67% running [2022-08-24 19:25:08] 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", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 68% running [2022-08-24 19:25:09] 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", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 70% running [2022-08-24 19:25:09] INFO [weaver.processes.wps_package|ncdump] 82% running [provider: https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird, step: ncdump] - Retrieving job results definitions.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 72% running [2022-08-24 19:25:09] 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", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 74% running [2022-08-24 19:25:09] 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", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 75% running [2022-08-24 19:25:09] 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", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 77% running [2022-08-24 19:25:09] 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", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 79% running [2022-08-24 19:25:09] DEBUG [cwltool] Moving /tmp/wps_workdir/weaver/cwltool_out_erxzjwdu/nc_dump_cieH1d.txt to /tmp/wps_workdir/weaver/pywps_process_xnuwfx_d/nc_dump_cieH1d.txt\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 80% running [2022-08-24 19:25:09] DEBUG [cwltool] Moving /tmp/wps_workdir/weaver/cwltool_out_erxzjwdu/stderr.log to /tmp/wps_workdir/weaver/pywps_process_xnuwfx_d/stderr.log\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 82% running [2022-08-24 19:25:09] DEBUG [cwltool] Moving /tmp/wps_workdir/weaver/cwltool_out_erxzjwdu/stdout.log to /tmp/wps_workdir/weaver/pywps_process_xnuwfx_d/stdout.log\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 84% running [2022-08-24 19:25:09] DEBUG [cwltool] Removing intermediate output directory /tmp/wps_workdir/weaver/cwltool_out_erxzjwdu\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 85% running [2022-08-24 19:25:09] DEBUG [cwltool] Removing intermediate output directory /tmp/wps_workdir/weaver/cwltool_out_dr_ff_5_\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 87% running [2022-08-24 19:25:09] INFO [weaver.processes.wps_package|ncdump] 95% running Package execution done.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 89% running [2022-08-24 19:25:09] INFO [weaver.processes.wps_package|ncdump] 95% running Nothing captured from internal application logs.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 90% running [2022-08-24 19:25:09] INFO [weaver.processes.wps_package|ncdump] Resolved WPS output [output] as file reference: [/tmp/wps_workdir/weaver/pywps_process_xnuwfx_d/nc_dump_cieH1d.txt]\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 92% running [2022-08-24 19:25:09] INFO [weaver.processes.wps_package|ncdump] 98% running Generate package outputs done.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 94% running [2022-08-24 19:25:09] INFO [weaver.processes.wps_package|ncdump] 100% succeeded Package complete.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 96% succeeded Job succeeded (status: Package complete.).\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 98% succeeded Job succeeded.\n", - "[2022-08-24 15:25:09] INFO [weaver.datatype.Job] 00:00:03 100% succeeded Job task complete.\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" ] } ], @@ -1349,14 +1268,12 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 18, "metadata": { - "jupyter": { - "outputs_hidden": false - }, "pycharm": { "name": "#%%\n" - } + }, + "tags": [] }, "outputs": [ { @@ -1365,7 +1282,7 @@ "text": [ "\n", "Job was successful! Retrieving result location...\n", - "Result is located at: [https://pavics.ouranos.ca/wpsoutputs/weaver/public/54ce8f3f-8fe4-4081-8063-24fb8ea52250/nc_dump_6zwZ5z.txt]\n", + "Result is located at: [https://pavics.ouranos.ca/wpsoutputs/weaver/public/91b62b44-fb06-4be9-ad2b-43d5265d0048/nc_dump_2QIB8z.txt]\n", "\n", "Fetching output contents...\n", "\n", @@ -1485,7 +1402,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1499,7 +1416,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.10.4" } }, "nbformat": 4, diff --git a/docs/source/notebooks/subsetting.ipynb b/docs/source/notebooks/subsetting.ipynb index 3506e741..33132410 100644 --- a/docs/source/notebooks/subsetting.ipynb +++ b/docs/source/notebooks/subsetting.ipynb @@ -24,14 +24,12 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEXCAYAAAC+mHPKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABQdUlEQVR4nO2deZwkRZn3v7/q7pmek2G45FIOGV1wORRd7xXFG8V3VdTXA112cZX1vkDd9cQXddf1WnXxRBcPPFB0UQRWUDxA7htBBUSQ+5hhmJk+nvePiJqKjKrMyuqp6q4enm9/8tOZGZERTx5VUZHxi+eRmeE4juM43WjMtQGO4zjO/MAbDMdxHKcW3mA4juM4tfAGw3Ecx6mFNxiO4zhOLbzBcBzHcWrhDcYcIOmBktZIGplrWxzHceriDcYsIOlaSQc2t83sejNbamZTc2lXGZIWSvqipOskrZZ0gaRnZnmeIulKSWsl/UzSg5I0SfqwpNvj8hFJyo5/g6Q/SrpX0hWSVlXYs0usY22s88AkbXtJJ0m6UZJJ2qXLuXXNL+lASedH2/4k6RBJT4iN/Jq435LtNfFHwCGSfhXtPCMrc5WkH0i6VdIdkk6R9JAutr5J0l8k3S3pS5IWJmkrJZ0YbblO0v/tUtYm3S/HAW8wnM6MAn8C/hbYAvgX4ITml6ukrYHvxf0rgXOBbyXHHw48D9gH2Bs4CHh1M1HSPwCHAc8Glsb02yrs+QZwAbAV8C7gO5K2iWnTwE+A59c8t8r8kvYEvh7r2QLYFzjPzH4RG/mlwF4x+4rmPjO7HrgD+DhwTIeiVwAnAQ8BtgPOAX5QZqSkpwNHAk8BdgF2A96XZPlPYEMs66XAZyXtRQc29X45zkbMzJcBLsDXCF9S9wFrgLcTvgAMGI15zgA+CPwq5vkh4cvxeOAe4LfALkmZDwVOJXxBXQUcMgvncTHw/Lh+OPCrJG1JPL+Hxu1fAYcn6YcBv4nrDUJj9JSa9a4C1gPLkn2/AP4pyzcar+kuNcvtmJ/QWHygy7GF+9ch/R+AM7qUsTKWsVVJ+teBDyXbTwH+klzvDcCq7Dk7pqSsGd8vX3xJF+9hDBgzezlwPfAcC79EP1KS9cXAy4Edgd2BXwNfJnyxXAG8B0DSEkJj8XVgW+AlwGcqfl1+RtJdJcvFdc5B0naEL+7L4q69gIuSc7wX+D2tX96F9LjeTNspLg+Lr3v+KOl9ksqexb2AP5jZ6pLy+s2jASRdIukmSf8taeUA6nkioQG4Pdb3eEl3JemdruF2krYi3IspM/tdlr7xmsT7+/hOZfV4vxxnI95gDA9fNrPfm9ndwI+B35vZaWY2CXwb2C/mOwi41sy+bGaTZnY+8F3gBZ0KNbPXmtmKkmXvbkZJGiP0dI4zsyvj7qXA3VnWu4FlJel3A0vje/Gd4r6nAX8NHEBo9A4rMaFbXf1mJ0LD/XxgD2AR8Kl+ViBpJ8IrpTc395nZWWa2IsnW6RpCOO+u1yTe37NKysrzV90vx9mINxjDw83J+n0dtpfG9QcBf5P2FAjvsB/Qb4Pir/6vEV5//HOStAZYnmVfDqwuSV8OrDEzI5wLwEfM7C4zuxb4L+BZsc7LkoHkJ9Soq8r+dKD6sm75I/cRGu/fmdka4ENN2/pBHHv5KfAZM/tGRdZO1xDCefd6TTblfjnORrzBmB36+cH7E3Bm1lNYamav6ZRZ0ucyNc+aOl+i8dflFwmDqs83s4kk+TLCAGkz7xLCa7TLOqXH9WbaVYQGqOM1MbO9rDWQ/It43G6S0h5FWl4plgxUm1ndVywXl9m2qUjaktBYnGRmR3fJ3uka3hxfYf0OGJW0R5Zedk025X45zka8wZgdbiaoXPrBj4BVkl4uaSwuj5T0V50ym9k/JV+a+VL1JfpZ4K8IYy/3ZWknEsYgni9pHPhX4OLkldVXgTdL2lHSDsBbgK9Ee9YSFDpvl7Qsvp75x3henez/HXAh8B5J45L+D0HJ891mnmhDU3K6MG6X0iX/l4FXSdpN0mLgHWW2dSh3JJY1CjSivWMxbTlwCvBLMzuyRnFfBQ6TtGdsaN5N6xreS1A9vV/SEkmPAw4m9AY7MeP75TgF5nrU/f6wED7M1wN3AW+ls0rqH5L8HwS+kmwfCFyTbD8E+B/gVuB24H+Bffto74OifesIryuay0szm64kvMI5g6KKS8BHCCquO+K6kvTlwDcJr0T+RPgCU4U9u8Q67iP0UA7M0i1fupxfZX6CfPXWuHwN2LKDPW0qKeCVHcr+Skw7NG7fm13TB8b0JxBeA6XlvZnwY+MeQkO2MElbCXw/lnc98H+zY9cAT+jH/fLFl+YiM39N6TiO43THX0k5juM4tfAGw3Ecx6mFNxiO4zhOLbzBcBzHcWoxOsjCFbxxpk7OdiMoYr4a9+8CXEvwhXRnVVljC5bY+OItAbB8AmrN+aiazgb4q8b7+zTHtc3WflC3yF7Oz8qTyIURad4ermlb3rIDK+3u4XrWFXS0FVlRR5Jkeb5s00ZaO5RfpqrTSNOms+NGW4l5GZb+/Mt+ChbyVqXlpkx3XgfQZFLkVPEENZFtTyaZJ4tOmm06K7jMltHs66qRnEijeBL3rPvLbWa2DTPk6QcssdvvqOdM+ryL159iZs+YaV3ziVlTSSnEfvgz8DfAEcAdZnaMpCMJssV3VB2/bMVOtt/fvgGA6dHiw2GN8g9R+uEbW5s9mFVfdiPlnyLL+2Xpcdlh0xXl1P3ibz+neuerqfJ7a9kHLP0yb2Sfk7wcTba2R9dOFtIaSZqmitdb61p5lX9JpM9hXl+SZmNZCJGqBmSidSLKnvNCQ57fo+SLqK3BT/Jao/gg2IKibRuWj7UOmyieb3r982ckbRRG1hWPW7+i9aU5tbB43MTi1vbUoqLZkwtb69MLi2nTLTPbnqexNa310XXFtPE7Wtd0/M7iQ7Pw5uLUnZFb72rVcXvxt+HUmjWUoZHWNR1ZuWUxccmSVplLiid1yqUfOs/M9i8tuAuP2Gfczj5lp+4ZgbHtf79Jdc0nZvOV1FMI/pGuI8xLOC7uP47gWtlxHGdIMKZsutZyf2Kgr6QyXkyIawCwnZndBGBmN0nattMBkg4nuGZm4aIVs2Gj4zgOBkwPxkPMvGZWehiSFgDPJXhdrY2ZHWtm+5vZ/mMLlnQ/wHEcp09M1/y7PzFbPYxnAuebWdMD682Sto+9i+2BW2bJDsdxnK4YxpR7wWhjtsYwXkLrdRSEUJWHxvVDqQhV6TiOM9sYMMF0reX+xMB7GNHj51Mpxgg+hhAj+jCC47QX1imrqeCokhOmKp2Q1so8ubBCUkRR+pjXkcsia1NxXEFRlIuGUvlmrqJJjMlFPNVyzXKZZy/nlyqqpjNlEI3WiWgyS5pq5Z0eGyumrW15T1ejaMz0aMXvmkRRpQ3FCnNlVCFtw0RpWkGumZ+ftbZtvGjX1KJcwdVa3bCs+FFLlX4jE/n5ttImlhbrSK/pdPESpqYxnZkyvSCxM/PlOzWeqNDyS12lQqt6ZvJykvutZUsLSaPLE8/1i4vyruktFm9cX7+iqISaXNw6ydv/Kvsqu7TCtpr4GEY7A28wLLiz3irbdztBNeU4jjN0GPgrqQ7MpkrKcRxn3nD/etlUD28wHMdxMgxjyl9JteENhuM4ToYZTHh70YY3GI7jOG2IqX45lNuMmDcNho2IycVBepH7QSoqiihNQ4NXEVepqxrZTxYr+CXKykm321RhFcelvqRyZ3Gp08DMX1NjMvVPlaVlBthYUmnuIylVdE1nx6WKo9y303jrUcx/2BXUT/k5VTiuq3T8uCCRGGX+qaqOm1rWkhtNjWfKpzGVbuf+zwr+m/K00fL7O7UkVbqV/wROVVF5fakqCmBqUXINp8ttaWTCstTh4OiaTKGWPV/TSxJp1pKiTGtiZUsZdd+2RenX+uWtC3D3HlmZC1N1V39HHIx2V3POPGowHMdxZhPvYbTjDYbjOE6G4Q1GJ7zBcBzH6cB05SzY+yfeYDiO42RMIzYw0j3j/QwP0eo4jtOBaVOtpRuSxiWdI+kiSZdJel/cv1LSqZKujv+3TI45StI1kq6S9PQBnmZPzJsexvQIrN8itm+V6oXysJm5b6OqV5R1w1a2lVNl26LyKHe58qsQCrRuOE9ASeCzXEWTpjVypVnyY6qxoVhmHpUx9VPUyH5zWBpQZqSYNp2orxq5uqqgZivWTxJ1LfczVYhfk0XAK0Tqy5VPSVZbUPwYTC5N/B5ldk6NjyTr2e+trI6CP6ce3m6kx+XKq6nEndJUnpaIj9oi7i1uXYupxdm1H0v8f+UqqbScTLKVPk9TC3O53li22Upfv6KYdut+rbQNK7Nwj4vXb1xtjGYRHNPyp/r727fPYxjrgSeb2RpJY8BZkn4M/B1wehJ59EjgHZL2JMQP2gvYAThN0iozqxczdoB4D8NxHKcNMWWNWks3LNCMQzsWF6M88ujBwDfNbL2Z/RG4BnhUH09uxniD4TiOkxEi7jVqLcDWks5NlsPz8iSNSLqQEPvnVDM7myzyKNCMPLoj8Kfk8Bvivjln3rySchzHmU16eCV1m5ntX5Uhvk7aV9IK4ERJD6vI3qnioZhG6A2G4zhOhpmYyN1G9KVcu0vSGcAzKI88egOwc3LYTsCNfTdmBvgrKcdxnIww6N2otXRD0jaxZ4GkRcCBwJWURx49CXixpIWSdgX2AM7p6wnOkHnTw7ARWL8irOcqnkaiHRi9t/24JnmEsqooc23KpFS1VJG3MVWe1uYTKlXVVETOq7JTWX2pgsvyiIIVBRUUPQsyYzIfQqnZbb67EqWSsuiHIxtaxuVyRCXbmsxVPMmHcipPS25qfg3TSH2W+09KfFflirH0sMWZn6kkbx7Vrq2cJD2/T41C5LxyhVxOwbY8ql6qoCoGpyv4i7IFmdpoNA01mSniEtXU2p3y+9kyZmLxWJaWKc/GW+Xctap4gpMrWxdDizKfVCOpbYUkbLriQ7nJqNaAdk22B46TNEL4kX6Cmf1I0q/pEHnUzC6TdAJwOTAJHDEMCimYRw2G4zjObNEc9O5LWWYXA/t12F8aedTMjgaO7osBfcQbDMdxnA5MuWuQNrzBcBzHyTDEhPnXY44PejuO42T0c9B7UMS5HafNZp3ehDqO42QYGvpXUmY2JWmtpC3M7O7ZqNMbDMdxnA70a9B7wKwDLpF0KrBRI2pmrx9EZfOmwbAGTEZHaCO5nDCVfVaEJa2Syubbed5KOeNYeVqV3C+VwI5lcuCpBZ3zVZUBYBPlaamUtU2Om9g5nYXX1FiFBDa/3smxjczZ42TiIK6RSW5TOXIux20kMtvcGWCx8kzWmoQXnRrLPvxpeNxenoOCTLpcRgvFZya/FulzkYfurXpmGhPlst40hGojl5BPJbZOZnan+UayyhMJ7lTm+PHuh6YS6mKZC2/PHE8m9kyuyB6+pA7Lw/pahXQ2lZ43+qurNaOfstpB8j9xmRUG3mDECStfAB5GuOV/D1wFfAvYBbgWOMTM7hy0LY7jOPUQ0/Mg4p6ZHdc9V/+YjSb0E8BPzOyhwD7AFQQ3vqeb2R7A6XHbcRxnKDBgg43WWuaCOLEPSZdIujhfBlXvQM9W0nLgicArAcxsA7BB0sHAk2K244AzgHcM0hbHcZy6GPWCI80hb4j/D5rNSgfdw9gNuBX4sqQLJH1B0hLK3fo6juMMBcMsq02+P69LF4KjwrcPqt5Bn+0o8HDgs2a2H2EUv/brJ0mHN33MT917b/cDHMdx+oAB09aotcw1kvaV9BFJ1wIfJDg2HAiDfgF3A3BDDBYC8B1Cg1Hm1reAmR0LHAswvtPO1gxB2eZEMA0Vubg8bWRdVn5+r5Me6HR2ZaYT1dLkosxB28IkFOhYptbIVSeFA8uVK6lqaGRtFhozUdzk6pvUMWOeVjguV1cVqs9VUcW8qRKtTSU1Xa6gSpVRuUprJFH4jKzPVFKJMqgx0cjSqmRo5UlV+QrCnCrHhHlU0nw7UWJNZ8/F9Egq8SmvPye9pyMbyvO1q/xaxuWCrdThYCHELqD0nEaL52CjrZuY34X7tii3jVzRVBUOOXn4cgVXul3lWHNmqJ8hWvuOpFWEMK4vAW4niIhkZgcMst6BNo9m9hfgT5IeEnc9heCBscytr+M4zpwzD3oYVxK+T59jZo83s08BA/doOxtD/K8Djpe0APgD8Cqii9/cra/jOM4wMKgASn3k+YQexs8k/QT4JvX71DNm4A2GmV0IdApf2NGtr+M4zjAwzBP3zOxEQqjXJcDzgDcB20n6LHCimf10EPUO7xVxHMeZI0I8DNVa5tROs3vN7HgzO4igkLqQAc5rmzeuQRzHcWaPvkbcmxXM7A7gv+IyEOZNg2GNRI3UFiO1tdomlki3lxeTqoQVuRLLEkWG5WqRsXIlR6GSKl9WFX6fphZnypVENZQrqEbWJ4qi9cUyU1XNdIVfnq6fk/SU2lRSyXqu4Er8GeUKrtQfWO4jaSRRRjWycLGNxLdUHh6XqZkpZwr+xyrytavsyn9tTlWEYa0K9dr2Gr0idG+jQhGYPs+NLATvVEFtlNmZhvytUDe1+XLq6bs2qb9RroRqjBQftkaf/UflFg35xL05Yd40GI7jOLNFCKA01IPec8L86nM5juPMEtM0ai1zjaQHSTowri+StGxQdc392TqO4wwZwb25ai1ziaR/JEyIbo5b7AR8f1D1eYPhOI7TgWlTrWWOOQJ4HHAPgJldzQB98/kYhuM4TkbwVjsvfk+vN7MNTbGCpFGqtRqbxLxqMKajOqlKCVUdIa3LdUyfj0yBUXh28nKqfmQUDOjB71EjVV5lUqTUr9XC4kM9ta61nSuopteXq5QKPpK6RCasGwEw9xdV8HOVq52SJ3F6NFPxpKqwzHdUo0JBpUQKVmVz5fdCphpKfYy1+Y6q8olUEVSvKq1uxEYoXu9cMTZ6X5ox8xWWREKcGs/9RSXXMPu2KKim8pPPFWtVn71UFdb20Ur9XGX3IlVwDeCX/jD7kko4U9I7gUWSngq8FvjhoCqrbDAknVSjjDvM7JX9McdxHGfuMcRkrneeIZJ2Br4KPIAgVD7WzD4haR/gc8BSQuTRl5rZPfGYo4DDCE3v683slJLij4z5LgFeDZxMiHA6ELr1MP4K+IeKdAH/2T9zHMdxhoM+zuKeBN5iZudHBdN5kk4lfLG/1czOlPT3wNuAf5G0J8FP1F7ADsBpklaZWSfngouAL5nZ5wEkjcR9a/tlfEq3BuNdZnZmVQZJ7+ujPY7jOHNOUyXVn7LsJqAZ8Gi1pCuAHYGHAD+P2U4FTgH+BTgY+KaZrQf+KOka4FHArzsUfzpwILAmbi8Cfgo8ti/GZ1SO6pjZCd0KqJPHcRxnvtGDe/Otm4He4nJ4WZmSdgH2A84GLgWeG5NeCOwc13cE/pQcdkPc14lxM2s2FsT1xSV5N5lag94xWMfbgAelx5jZkwdkl+M4zpzRY0zv28ysk0fuApKWAt8F3mhm98TXUJ+U9K+EGEFNWUinistUA/dKeriZnR/reARwX0neTaauSurbhMGZzzMLQTo6IjZGr6vUOvXiX6YtKlnq0ybLmpZbpZLql6At9dOT1VewZbQolZkeSyKrZQqq6bWtQbyRdZlSJon4VxVhrxuVEelGaqZlY42pH6TpPDJhoqAaXVce1a7tlhXUXNn1rfIxlkbRyz49uWopTW/zc1X3OenhrUjBbVmVgqotUl+FD6zx1rq1+UkrqbxXKg61xP9Yns8KH5KZV19GPz3RShojNBbHm9n3AMzsSuBpMX0V8OyY/QZavQ0Ik/FuLCn6jcC3JTXTtwde1DfDM+o2GJNm9tlBGeE4jjNMGPRTJSXgi8AVZvaxZP+2ZnaLpAbwbsKPcgi9ja9L+hhh0HsP4JyOdpr9VtJDCeMhAq40s4lOeftBN1ntyrj6Q0mvBU4ENvpAje50HcdxNi/6O4v7ccDLgUskXRj3vRPYQ9IRcft7wJcBzOwySScQwllPAkeUKKSaPATYExgH9pOEmX21X8andOthnEdobJtX7m1JmgG7DcIox3GcuaQZQKkvZZmdRflLs0+UHHM0cHS3siW9B3gSocE4GXgmcBZh3kffqWwwzGzXaNS4mRU87Esa73yU4zjO/GcI/ETV4QXAPsAFZvYqSdsxwIl7dZ2l/KrmPsdxnHlPM4DSPHA+eJ+ZTQOTkpYDtzDANz/dxjAeQND/LpK0H61u1XIGqPV1HMeZS4JrkHnhfPBcSSsICtbzCBP4Og6Q94NuYxhPB15JkHX9O60G4x7CoM3sIWs5QsvDOPYpVGPBJ1vucK8xXZ5WJSms+wMklwxahZwwScvPfWRBa2zMMqeFBYVio6gASUN6plJV6CIJrTi/XDpb5biPLJxsigp2Z2UmpzGdh0GtIjmHRptUt9xpYUE2nMt/M6eJSjzptZ1vlZS0oo40LZf1pnnztFSaXBlIbrriHLKsVZ+XSnq5TennoErePeSy2n4j6XFm9kvgTXFG+Ock/QRYbmYXD6rebmMYx0n6GvASMzt+UEY4juMMFTb0YxifBB5BcBfycAAzu3bQlXadh2Fm05JeDXiD4TjO/YLmGMYQMyHpy8BOkj6ZJ5rZ6wdRad2Je6dKeivwLeDexCifh+E4zmbJkDcYBxGcDj6ZMHYxK9RtMP4+/j8i2VdrHoaka4HVBJcik2a2f5wQ+C1gF4If+EPM7M6atjiO4wyUHn1JzTpmdpukbwM7mNlxs1VvLRmAme3aYelFunWAme2bOOg6EjjdzPYguOc9ske7HcdxBsqUNWotc0Wc/f2c2ayzrrfaMeA1wBPjrjOA/9oEnyUHE2YnAhwXy3tHtRGgsSiT6CVEalWRPaibKvNWHpduZOFFE4VTHpqyqJJSllZSfm5K9iw3UgVVpq6aGm1JZ+y+zGnhgsJmMfTqdLkBNlYe7nNqqnhcqjAaze1OnOXlYV8L5z/DkKlVaqe20K69CPISA/r1Y7WghBorpk0uKU8rfK/lz1qhzCrPi/lzmKrJ8gc/K6dwb8o/vzP+TPa5M2DDP+jd5FeSPk37cMH5g6is7iupzwJjwGfi9svjvqpofE0M+KnC3f0vMzsW2C4GFcHMbpK0bacDo1/5wwFGtlpR01THcZxNZxBxwgdAM1DS+5N9Rhjb6Dt1G4xHmtk+yfb/Srqo5rGPM7MbY6NwqqQr6xoXG5djARbuulO/HIc7juN0YbjHMJqY2QF18nVSUnXgHjN7d1WGug3GlKTdzez3sfLdqBkXw8xujP9vkXQiIdTgzZK2j72L7QnT2R3HcYaG+dDDiMGX2jCz92e7DgY65k04kuBmvZS6DcbbgJ9J+gPhbeGDgFd1O0jSEqAR49guIQQLeT/B3/uhwDHx/w9q2uE4jjNwzGCqYnxuiLg3WR8nyG2v6JDvP7qpqSRt2a2yWg2GmZ0uaQ+KQToqnDlsZDvgxBA/hFHg62b2E0m/BU6QdBhwPSGereM4ztAwzK5BmpjZv6fbkv6N8IM85ztlZUh6jpn90Mw+3q2+uj0MCNPQd4nH7FMnSIeZ/YHgejfffzvwlB7qDiqpGI60tmKpQxmFzdwn1QzLVZXKoyp8a2WESeu42o20G22Z9GokUTvZWCb/GW+9YZxekimYJjIZ0bqW5KWxvihNSlVF7aFWE3vGs9CyC5PQpwuKZY6taaXl4UVT1VQeYqZwK/JrmPqSysusEgql6qNu3yd1hXUVtrWFsk39TLWFGG6tt/mZShRqbb6kEgMqlWWTeWKrwvx5Upu/qjT8cYUvuCqVYZtBreMaffIn18SYH6+kOrCYzvPjTpf09Nx9SIwr/i7gh3UKryur/RqwO3AhrbELY0BBOhzHceaW+THoLekSWq3xCLANRcVUkzcRREfPMrOr47FHAf8X+Nu69dXtYewP7Gn5T1bHcZzNlHnybXdQsj4J3Gxmk3kmMztZ0nrgx5KeR5gS8Ujgib142ag7TfFS4AF1C3Ucx5nvmKnWMhdIWixpzMyuM7PrCAPeh1Ax89vMTieEqziD8NrqKb26ZKrbw9gauFzSOSSRC8zsub1U5jiOMx8IKqmhDqD0E+Aw4GpJDya4OT8eOEjS35hZwd2SpNWEV1cCFhLGkG9RUCSZmS2vU2ndBuO9NfM5juNsFgz5K6ktm2MRhKkJ3zCz10laQPBeW2gwzGxZPyqtK6s9sypd0q/N7DH9MKi8EqNRQyWVqypmGg0vP05Vacn2SIVaIx9Em55OFU1ZpLOkzKpzyI+btppllpYIUyONbLtY/3QSrc8yn1DaUK5oskZi22h2TotaKpup3AfVWMuekXuLthUiBWZvbpVst/mESrYnx7Pj0vVMeZUqkfL62vw3VV3kml9GlkfOS7bz+qrKL0bjy5V8FT6ZCr66svuSPBfKy6xQQjWy56mRRIbsSamY2NaYqXKygiFXSaUn/GTgowBmtkFqe9r7Ri+y2irGu2dxHMeZHxhzNz5Rk4vjnIs/Aw8GfgoQ43u3Iel8M3t4VYF18vSrwRjuzpvjOE6P9OtLTdLOhCkIDyD0bY81s09I2hf4HOEH9yTwWjM7Jx5zFGGMYgp4vZmdkhX7j8AbCHPjnmZma+P+PYF/62DGX0mqivUtYItu59KvBsNxHGfzwfr6SmoSeIuZnS9pGXCepFOBjwDvM7MfS3pW3H6SpD2BFwN7ATsAp0laFeNfBPPM7iO4VtqIpIeb2a+AX3Ww4aE17OzqH7BfDcZQ990cx3F6xfrkSyqGcmiGc1gt6QpgR0InpqlO2gK4Ma4fDHwzul/6o6RrCE5bf92lqi8AHV8pRentJlN3pvcS4D4zm5a0itBa/TgJoPTyfhjjOI4zLAxCJSVpF2A/4GzgjcApcSyiQSu2xY7Ab5LDboj7uhbfN0NLqNvD+DnwhOjN8HTgXOBFwEsBzOzSwZjXQoLRsc49poKQo1EuEKj0S0O10qJamZUqmsrLz93rpA9k3v1Nt6vqbtOKp6ffQ4S/6aSciXXVj4USVct05hNKid8pZec0em9rO5+Kamk5mV+iVKWVR4SbSnxZja4t1teY6LwORQVV5cvqhbmhrdXcX1P+ca2KcleFJeqn9VvmUQuT9UxtVLjceVqiYtLC4ucoVSlNT+XOq1qruQ+oVO2UfzZHR4vbVqHeK5SZfX6r8yb1j9SKtlCbHn1JbS3p3GT72BjLp4CkpcB3gTea2T2SPgi8ycy+K+kQ4IvAgXT+4m97giSNAMeZ2cvirvfVNXim1G0wZGZro3fZT5nZRyRdMEjDHMdx5gyjl7i6t5nZ/lUZYpjr7wLHm9n34u5DCQPXAN8mvFKC0KPYOTl8J1qvq1ommk1J2kbSAjPbYGbfr2OspAcBe5jZaZIWAaNmtrrOsbUbDEmPIfQoDuvxWMdxnHlHv15JxdnUXwSuMLOPJUk3Ehz/nUGYS9GciHcS8HVJHyMMeu8BnFNS/LXALyWdRDGm98c6ZZb0j4Sw1ysJDmV3Iii1ankPr/ul/0bgKOBEM7ssRtz7Wc1jHcdx5hnq26A38DjCOO8lki6M+95JkMZ+QtIosI7wRU78jj0BuJzw9vaIVCGVcWNcGkCd2dxHEAbQz451XR3DZ9eil5neZ8bB72aci9fXrcRxHGfe0acehpmdRfmA9CNKjjkaOLpG2b2OW6yPs8EBiI1V7TOtq5J6DKFLtRR4oKR9gFeb2Wt7NNZxHGf46e88jIEhaRvg7YQ5Gxs9bpjZk0sOOVPSO4FFkp4KvJaawZOgvnvzjwNPB26PxlwEPLFuJY7jOPMOq7nMLccDVwK7ElRS1wK/rcj/DuBW4BLg1cDJwLvrVlZ74NrM/qSiZrS/OrYuNGQsHGuLCxLSUsdmFY4B244jz1tdfxlFh3/lZeTlp2XmjgnrDrhNZTE8JyZbsta8zLFE6jidvZ9NfQjaRLm0EoAFLeljY1HxnkylEuO78jihrUpG1mYODpP1/NVxQQY6mkluxxJHiJnTxMb6pL4N5ZLb3MFgiclttLl4y/NW3MNCqNXsMk0uah04uUXROCXXfmxRUSu8YEHnzwfAkoUtT5BjmQQ1/YxUufS+d/2Cwnb6uVuQlZnXsSF5LvNndqafn/HR1vmOVMjpZ87w9zCArczsi5LekAwddHQWK6kBXGxmDwM+P5PK6jYYf5L0WMCi+9zXA1fMpELHcZx5wdz3HurQ/NVwk6RnEwbAd+qUMU68vkjSA83s+plUVrfB+CfgE4TZhjcQPCMeMZMKHcdxhh6jvas7nHxQ0hbAW4BPEVyNvKki//bAZTEYXirDrRUMr65K6jbirG7HcZz7A0MeQAkAM/tRXL0bOKDGIZs0G7yuSmoV8FlgOzN7mKS9geea2Qc3pXLHcZyhZR40GL1+N3cLhteNuiqpzxMm7k3ESi8muN91HMfZPDHVW+aWnr6bJa2WdE9c1kmaknRP3crqjmEsNrNzMpVUuSSj3cgRgsPCP5vZQZJWAt8iBP+4FjjEzO6sKqMhY/GCiaossa76PwuqFFV5Wqqo6ilkaqK0aFdlVTgVTJQkudqpkK9C1TKVvYNNlSTjmdpofLR1bXNHbnffvrRYcOoYMVOnNMZbx04tz5RJ97aUMrkzwGLG4nUZSZwRjmRO7aYS1VCqmAKYui9RUOUqqURB1cjSUvWTVfykylVS+W0qhEVtCzubpK3I1E5LWoqmhdn5rly6duP6sgXrC2mjiUHjI+Ufz/GR8oufP/cbplsncdeGRcW0qdydZjkLEnuqPiNVz3PO4rEN3TNtAgOI+joIevpuzmN7S3oeYeZ3Lerendsk7U7spEl6AdG/e03eQFFVdSRwupntQfB+e2THoxzHceaCunMw5r5R2aTv5uiwsGySXxt1exhHAMcCD5X0Z+CP1BwEl7QT8GzCNPc3x90HA0+K68cRnG+9o6YtjuM4A0bzRSXV6bv5ZWWZJf1dstkA9qefrkHi66TXmNmB0ZdUo64r3MjHCVPX067QdjEKFWZ2U5nzK0mHEx1yLdh2eacsjuM4g2Huew9diX79evlufk6yPkkYEji4bn1dG4zoc/0Rcf3ebvlTJB0E3GJm50l6Ui/HxvqOJbSeLF21/Ty4fY7jbDYM8TeOpFeU7AfAzL5acugXzOyX2TGPA26pU2/dV1IXRH/r36Y42eN75YcAwa3vc2OA83FguaT/Bm6WtH3sXWxf11jHcZxZobcASnPBIzvsE6EHsSNQ1mB8iva43532daRug7GS4HgwHRwxoLLBMLOjCJIvYg/jrWb2MkkfJUSbOib+/0E3AyRjUQ1VRJWHydzfTF3/UHne0byc5KdIXmZaTlV9OZOJPCdXo1SpphYm/nUms3CbqRqlyvfOLiuKgrXbx4tqnFvvaamm8pgB6fWfytROhVCrGzK9RZKmLETraOIjaTxTyqWhZdeNjBXSJlJfXSPZNUz8TjWKLpKKYW4zCrcwu525omp6QRISd1FR7bRwi9Y13XHLuwppK8fv27i+eKT4zFc9Q2ONVh2jFQ6y8jJGKn5KNxLl1ZYL1hbS7ptqXe+7NiwuLaMbVZ+RyQrVVPo5rPpMzJRhVkmZ2eua6zFA00sJ48C/oYNb9Ohx/LHANpLenCQtpz16dCl1Z3q/qm6BNTkGOCGGfL0eeGGfy3ccx9k0hrjBgI2xLF5JcAtyNvACM7uqJPsCQniKUYrjyfcAL6hbZ92Z3p/ssPtu4Fwz69o7ADCzMwhqKMzsdmqGBHQcx5kLhrmHIekIwnSF04FnmNl1VfkTT7Zf6Za3irqvpMaBhxLGMACeD1wGHCbpADN740wNcBzHGUqGewzjU4Sx38cDP0wm7gkwM9u75Li1cUigbsClAnUbjAcDTzazSQBJnyV4rH0qIRCH4zjO5sNwTMqrYtcZHnc8wcvGQQQv5IcSAirVom6DsSOwhPAairi+Q5Tcri8/zHEcZ54yxA3GJrxWqh1wqRN1G4yPABdKOoPQ5Xki8KE4WeS0Xi2eCQ2sLapXreNS/1DZE9DmL6rCl1TlcTWfrF4UVGnaZBZJLlVNTWduY1JVSa4w2TBVfrtT1dSaiaJsaOeldxW2lyRqtXuzvJOJbesmi/WtXdDKO7Euj8bXWh1dWLzPqTJqURZ1seD/K1N+3ZekTYwUr68tbF3f6UxNZkn4QU3Vfy1hWR1a0DqPsfGi3TuvbCnRdlhc9P22ZLT1G2xRhd+nXhipjDxZM1pdlm2DWvdw6Wjm16pR/7NaZdtU8jmYrnDsNVnl9GuGDPMYxiZQO+BSJ+qqpL4o6WSCkyoB7zSzG2Py23ow1nEcZ34wiKivc0+vAZcK1FVJiaBq2s3M3i/pgZIeZWbnzMRix3GcYUa2+fUwopunPWLQpboBlwrU7cd9BngM8JK4vRr4z14rcxzHmTfMg3gYkg6SdIGkO2KMi9Vl8S3MbAqoFYq1jLoNxt+Y2RHAuljxnYSJII7jOJsnfXJvLmlnST+TdIWkyyS9Ie7/lqQL43KtpAuTY46SdI2kqyQ9vaL4jxOUTluZ2XIzW2ZmVZ5afyXp05KeIOnhzaX7WQTqDnpPxO5M0+f6Nmyub/gcx3Ho6yupSeAtZna+pGXAeZJONbMXbaxL+neiClXSnoSoeXsBOwCnSVoVewg5fwIuNasdgfyx8f/7k31GzZgYdRuMTwInAttKOpowlfzdNY/tC5KVRhGrrW7qopKqq+xY0CjaUaXyqGIiiWbWiy+cDY3WbcvVIQV1Va6SSlRmuX+q9FosyK5DHmlt92W3dawvbLfqvHuieNyf72398LlztOh7KH3cF4xlKqnEP9aC0fzat363LMyej1RRtWFx8XwnJlvbuc+tySRtaqKYpmSzMVL8zTSSbY8l0fK2XrqmkLbTkrs3ri8fXVdIS88j9wk1kvxOq1LW5VR9Lias3JXQZEXaoiRs4qIshGIjD0eYkKud0rx52hSpSqr8/KoUVDOmTw1GDOXQDOewWtIVhKkKl8PGMeJDaH1pHwx808zWA3+UdA1BcPTrDsW/HTg5SmM3StXM7GMltvQ8bpFSVyV1vKTzCAPfAp5nZld0OcxxHGd+Yu0heCvYWtK5yfaxMTRDG5J2AfYj+H5q8gTgZjO7Om7vSHAi2OSGuK8TRwNrCLO2uw4TSNoO+BBhHt0zY2/mMWb2xW7HQpcGI8bebnIL8I00zczuqFOJ4zjOvKN+D+M2M9u/WyZJS4HvAm80s3Rg+iUk361Ap65UmTUrzexptS2FrwBfBt4Vt39HmPldq8Ho1o87Dzg3/r81Fn51XD+vByMdx3HmFU1pbbelVlnSGKGxOD6NIxQ9zv4d4Uu7yQ3Azsn2ToQJdp04TVIvDcbWZnYCcQw6unuqPcuyssEws13NbDfgFOA5Zra1mW1F8EPSLXiS4zjO/Z44RvFF4IoOYwsHAlea2Q3JvpOAF0taKGlXYA+gbM7bEcBPJN3XTVYbuVfSVrQETI+m5fKpK3UHvR9pZv/U3DCzH0v6QN1KHMdx5h39U0k9Dng5cEkinX2nmZ1MUEOlr6Mws8sknUAYFJ8EjihRSGFmyzrtr+DNhAZpd0m/BLah3/EwgNskvRv4b8JlfBkhAp/jOM7mR2+D3tVFmZ1F53EJzOyVJfuPpkPkvBxJTyw5/ucl+8+X9LfAQ6JNV5lZbYdldRuMlwDvIUhrDfg5rVnfs8KIjKVjnR3jjlbc2VSy103+Wgy1Wh7ONQ9pWSULrEpLJZNV8sU2OxNbNkzn4VtbdeTXJXXeuE7lt74tBG123W5e15LH7rP8hkJaKnNNnQ1CUY48lkl3U8eIeZoqZNPpOeVy4C2TUKfrMseLqWPEiewapg4UJypChObOMHNZ73aLW1LabReuLs2bS2fHKsKrpte3zenlDCcdj1R8fqaSH7YLVaxgqva836IktkrGm0/vahRSyiW3Y+osud8k5odrkNSX3zhBfnseJfMqJI0DryXE0TDgF5I+Z2brOuXPqSurvYMQ3clxHGezR8wPX1Jm9px0W9LOBO/iZXyV4NrpU3H7JcDXqBkmu/IngqT3diugTh7HcZx5R59cg8wyNwAPq0h/iJkdZmY/i8vhwKq6hXfrYfxDlxF3EQZt3lu3QsdxnKFnnnirlfQpWs1WA9gXuKjikAskPdrMfhOP/xvgl3Xr69ZgfB7oNgr/+bqVOY7jzBvmQYNBmCfXZBL4hplVNQB/A7xC0vVx+4HAFZIuoToWONClwTCz99Uw2HEcZ7OjXyqpQWJmx/V4yDM2pb66Kqk5Z0TTbDF2X+e0ip8CqUopV9j04jSwbhjLXhQgY+l69nRWOl2rGHmatgqnb0mZuYIqdWKY1zdeESb0stU7FLYfvOSWjevbL7ir9Lh1U2OF7TvWtxwV5iqtVP2Up6XnsXh0QyEtVVutz1VSo636c6VZFVVOGvPnc5sFLWVUrvwqlEn+XNZ71nIlX9XnoC5TPUitJqYTpVk3lV9SbCNzrFp43iqqz+tI7+hMHYBWMg96GJIOAj4APIhwSUToKXR0cW5m10nakjCTfDTZf36d+uZNg+E4jjNrDOeAdic+TnAtckkdF+dxwvUrgd/TOsO+uzefEVHz+3NgYazrO2b2nujU8FvALsC1wCExKJPjOM5QMB8Gvek9HsYhwO5mtqFrzg7UmnkjaZWk0yVdGrf3jjO/u7EeeLKZ7UMYvX9G9F1yJHC6me0BnB63Hcdxhof5IattxsM4StKbm0tF/kuBFTOtrO5Uzc8DRwETAGZ2MUFOW4kFmtNdx+JihAAhzcGa44Dn1TfZcRxn8PTTW+0AORpYS5jlvSxZyvh/BGntKZJOai51K6v7SmqxmZ2jomuAWnPxY2jX84AHA/9pZmdL2i5GocLMbpK0bV2DHcdxBo4xX4JQ9xoP4zjgw8AlzOAMe3E+uDstl7gvIIYc7Eb0srivpBXAiZKqZiEWkHQ4cDjA8u0XtYWy7MR4Hioy6TNOZxKMqYqwjnWVKnk5Y5lTyYKyo0IBkvvJSX0YTZCrQ1p1NBqZ4iSpZKoqZGfuD6ugksr9YWV5k2OXZMqgNG/uE2nX8Vs3rq+ZWlhIu2eitZ2rtBaPtu5prkRamPinylVDY4mian2j+KhPjHb2S9ZeZvHc1yfKoFyVtCQrc4vRzqq+bhT8n1X4LRvJ/S5V/NytCm+a+oTKlUhp/bmCaiR59sa6/H6sKidVW+Wf0YKdgwjDWoKYsWuu2eY0SU8zs5/WzH+bmX1yppXVbTCOAI4FHirpz8AfCR5ra2Nmd0k6g6ADvlnS9rF3sT0hml+nY46N9bL9XlvOfefPcZz7D/PjG+cI4O2S1hOGDCpltcB5kv4fwcV5GgO8f7JaM/sDcKCkJUDDzFZ3OwZA0jbARGwsFhGChXw4GnsocEz8/4M65TmO48wWQzA+0ZUZxMPYL/5/dFoM/ZDVlo22N8cyOkSPytkeOC6OYzSAE8zsR5J+DZwg6TDgemp6SnQcx5k1hrjBkPRQM7tS0sM7pZf1GMzsgE2pt1sPo9l6PQR4JKFnAPAcwvyKSqKaar8O+28HnlLfTMdxnFmkjwGUBsSbCeO7/94hrbTHIGk74EPADmb2TEl7Ao8xsy/WqbSWLylJPwUe3nwVFV2af7tOBY7jOPOSIe5hRLfkM+kxfAX4MvCuuP07wiTqTW8wEh4IpDMDNxBmac8aDYxlI51VUqkapypaWa4A6cVvTqocytUajbTO3O1TMgEzr79KuTJd4dupKjpflTIqZTT3bZT8mprOXt7mfqcWjbQehVy5tnikpRTaYaw4ef+uqcUb13cev6OQdseGJa18GxYV0lJbcyXS0qS+XNlWeC7Gyp+LKqoUPaliCmBpfi0aLdtyBVN6T9t8nCU3Iz+nVKE2UyVfTvpc5sqrlLFse0rlyrqcXMGWMp1Ey6v6jFYpxrr6spoB82EMI7r6eG8z5rek5cAnzOxVWb5RM5sEtjazEyQdBWBmk1LFl2ZGXZ3a14BzJL1X0nuAswmRmxzHcTZP5sdM71HCd/Pekp4G/JYw7y3nnPj/Xklb0Zoi8Wjg7l4q64qZHS3px8AT4q5XmdkFdStxHMeZb8yHHoaZHSXpdMKP+DuBJ5rZNR2yNrtqbyaMRe8u6ZfANsAL6tZXq8GQ9EDgNuDEdJ+ZXV9+lOM4zjxlOHoPXZH0ROATwPuBvwY+LenvzezGLOs2ier1ROBkQiOynjDd4eI69dUdw/gfWpdvEbArcBWwV83jHcdx5g1i6FVSTf4NeKGZXQ4g6e+A/wUemuUbAZbSPoF9MT1Q95XUX6fbUfv76l4qchzHmVfMgx4GQRK7cdDazL4n6cwO+W4ys/dvamUziodhZudLeuSmVu44jjOsqHaIiS7lSDsTREIPIOgRjzWzT8S01wH/THDm+j9m9va4/yjgMGAKeL2ZndKpbDObkvRswtue8SQpbxz64hqr7hhGOuO7ATwcuLUk+0AY1RRbjt7b83FF+eJ0llYuEsvllNPJz42qcnpxkJY6HEydDeb1V9qZyWjrhqrMnQ+OjZT3v3MJbiplXTyShUVNFHo3TmxZSEtlpitG1hbS9lzWeuV66eodC2lrJxdsXL93pOi0cMvRVjm548m0vqkKQWAuxV6gckd6GyyV1RaFpmPZcak9bWFYG+XXuyoc8ExDkaZl5o4ui+XP7D1ML899fi9GNFGaVlvyW18ZWo/+jmFMAm+JP7SXEfw5nQpsRwj1sLeZrW967Y6T6V5MaAR2IDgYXJX2JJpI+hzhtdIBwBcIA9jn5Pno00Tpunc59bO+kDCmcXA/DHAcxxlG+hUPw8xuarrqiJOfrwB2BF4DHGNm62Na0wnrwcA3zWy9mf0RuAZ4VEnxjzWzVwB3xonWjyHE685tuKPtyBlQ95XU5WZWmNkt6YX4bG/HcTZTeuhsbS3p3GT72Ohpu71MaReCu6SzgY8CT5B0NLAOeKuZ/ZbQmPwmOeyGuK8TTR/6ayXtANxOECUNhLoNxlG0Nw6d9jmO42we1H8ldZuZ7d8tk6SlwHeBN5rZPZJGgS0JnmMfSXDIuhudxxvKrPlRjDX0UeD8mO8LtS3vkW7eap8JPAvYUVIadGM5NSPuOY7jzDv6HH5V0hihsTjezL4Xd98AfM/MjDBbexrYOu5PXyvtBOTzKoKZZh+Iq9+V9CNg3Mxqz9zulW49jBuBc4HnUpxuvhp406CMchzHmXP61GAoxIP4InBFFhLi+wSvsmdIWgUsIEyQPgn4uqSPEQa99yAbyI7zLcrqI2mU+ko3b7UXARdJOj46rpozGjKWRNVLrsgohiXNFRhJGfkTkCkrUkVV7mgt7SROWPGyrUsuY15/lXqjqOAq9kIXJoqbvIx+OFrLHbm1OSNMyOtPQ5guzRxCjlcoXlK2GS2PwbXzoqLTwivuecDG9ZvXFePFrBhrqaRWjq4ppK1MVHXrMkXTOmtt5+qbhck55KqkhdZKW9IoOkLM1U1VaqSq56JKDVSor8qhX8XnYCpXyFXYUuXMMj2/9JqF+op1pM9s1ec3P/e6ijWsv7PsRF97GI8DXg5cIunCuO+dwJeAL0m6lODQ9dDY27hM0gnA5YQ3OUd0UEh9B7gwLk2Tmxgw+w2GpBPM7BDgAqn98pnZ3oMwynEcZ87p0zwMMzuL8nkQHUNdm9nRwNEVxT4feBGwNyFi6TdKfEj1lW6vpN4Q/x80aEMcx3GGhiEPoGRmJwInxrDZBwP/Hr3QvsvMOs307guV8zDM7Ka4+lozuy5dgNcOyijHcZy5RtP1ljlmHcE9+T3AEoqzvftO3Yl7T+2w75n9NMRxHGeoGOJ4GJIOkHQsQYx0ACFo0n5lLkT6RbcxjNcQehK7SUrd3y4DfjlIwxzHceaSIY+HcTrBJflZBO8br5D0imaimb1+EJV2G8P4OvBj4P8BRyb7V/drqnk/aBT8PNVXn7SrNeqpj3KfQYU6GuVP2Vg2dSVVp+ThPqtI1Ud5+NZUuVKlcMlVLKOJLblPpja/U4lKajxTx+THltmWX8M8nGvKbRuWbly/dd3SQtpN67bYuJ77tUqVWNuM3lNIWz1dDANbOG7kniRfsYefhiXNn6cqn1R3TS3J8rbS8nvRy30rO67KJ1RbqNVKNVdrPVdepWqr/FrkCq40fUP2OatSk1X5wCp8flX3ZUlNjL4Neg+IV3XP0n+6yWrvJrwfewlAdI41DiyVtNQDKDmOs7kyzD0MMztuLuqt1SxLeo6kq4E/AmcC1xJ6Ho7jOJsdzQBK82DQe1ap24/7IMHfye/MbFeCq1wfw3AcZ/PErP5yP6JugzFhZrcDDUkNM/sZsO/gzHIcx5lb+uXefKA2Sitns766DcZd0dPiz4HjJX2CGs4HJe0s6WeSrpB0maQ3xP0rJZ0q6er4f8tuZTmO48wqQyyrTThb0rclPSv6rBoodaU5BxMmiLwJeCmwBe0hADtRFmnqlcDpZnaMpCMJCqx39Gp8kypFSKqkyNU+VYqqKuVITupHZ6zC5VZbNLGk/lR5BNVR9gplZH6lJqaT7ezxaSQ/h/Jrlip8FmZKpypfQ21+pir8MFX5SErVVitHij6hHr389xvXLxsthgX4y7rlG9dvWFf83bHFyH0b13dbeEshLfUDtaxxXyFtRbadUvBBVaEEguL9Xpz5narykbQyiSL4l8nlhbSqZ72Rqud6eH5HaN3DKoXWgszfWJo3969W9fwuyJ6ZVG1VFUEytRMo/NztJeJfXea691CTVcCBwN8Dn5L0LeArZva7QVRWq8EwszQ2au3R+ThT/Ka4vlpSM9LUwcCTkvLOYBMaDMdxnL5iwNTwtxjRWeGpwKmSDgD+G3itpIuAI83s1/2sr9vEvdV07nQp2rq8Q1pZWbvQijS1XdPtiJnd1Ixl2+GYw4HDAbbaYUGnLI7jOANhPvQwov+olxG84d4MvI7gHn1fQoC7vkbf6zYPY1lVel06RJqqdVwMc3gswK5/vXQe3D7HcTYb5ocC6tfA14DnmdkNyf5zJX2u35XVn148Q0oiTd0safvYu9geuKW8BMdxnNlnPvQwgIfE11JtmNmH+13ZQBuMikhTJwGHAsfE/z8YpB2O4zg9MRwKqFIk/ZBoYac3Nmb23EHUO+geRlmkqWMIAc8PA64HXtitoAbWUtJUvNHakEejK0Tcq56Wmfr3qfRbU0VmW1U0wFRh1KZ2qhlVbywLxDXVSKOX1Y+slvr+yfPl/qKKZRbVPqkvqVwNU0V6bVaMrC2kLWu0ovptt7wYrvjSBTttXP/L+i0Kaek1bHsuEnK/UmO5GichVTe1RXDMaCTl5Nc0VTvlz8UdU4s75oOiEiuvv1BmDyqpgpKw4rPVrqxL0rIfufn1ni7UkfmdSs5pJP/cJdttKrsBikhDxL0hbjHg3+ai0oE2GF0iTT1lkHU7juNsChpildQggyRVMfAxDMdxnHnH8L+SOsHMDpF0CR0sHVT4bG8wHMdx2hh6P1FzEj7bGwzHcZwODLNKKpnHdt1s1tv/+fSO4zibA/PAW62kR0v6raQ1kjZImpJ0T/cjZ4b3MBzHcXJs3sS6+DTwYsKs7v2BVwAPHlRl86bBELZRwtlLSEsqJJLVZHLVihCQ1fW3mFa5VLcq3GcehrXgRLCLVDgllUVWSUJz+WQuq81lkWV5e5GEFvMV08YTx33LWVdI22dRK+jjTmPF8K0LCtewXK65dnphIS2VeS5vFOu7JwnZ2haeNtsuhMvtQQNaCDncw/M70+MKz1pmZ3qdqqTlubw6l7BPVIQ/Tj/PU3mo16qXIOljMgiJ7XR/eg+Sdga+CjwAmAaONbNPSHov8I/ArTHrO83s5HjMUcBhhC+i15vZKWXlm9k1kkbMbAr4sqRf9cXwDsybBsNxHGc26eM8jDKv3QD/YWaFORWS9iT0GvYCdgBOk7QqNgg5ayUtAC6U9BGCs9clHfL1BR/DcBzH6USfxjDM7CYzOz+urwaaXrvLOBj4ppmtN7M/AtcAjyrJ+3LC9/g/A/cCOwPPr32OPeINhuM4To4RXh7VWXog89oN8M+SLpb0pSSQ3I7An5LDbqCkgYkqqWXAQjN7n5m92cyu6c2q+niD4TiOkyEMWb0F2FrSuclyeMcyM6/dwGeB3QmuyG8C/n1j9e0UujIKvFfSbcCVwO8k3SrpX/tx/mX4GIbjOE4npmt3H24zs/2rMnTy2m1mNyfpnwd+FDdvILxaarITcGNW5BsJvvoeGV9bIWk34LOS3mRm/1HX+F6YNw2GqHCel6iPRioc5eVqpl4ctKXte37cSE3V0lQeIjZ1ulYZenNm+r7cgWKxvvLwqbkKKj+n9NjctirnfKkCp+p8c8d16XauRFqiDRvXx0aLjglTlVSuUkodDi5WHj61ddy6LPRoWn9uS+5scV2iKsqdSVapj9JrmD/zdZ1S5nRzlFiWL1Vb5fdsg5V/feQhaKucLRbqy35bp44g2869B8eiPdN8JdUHyrx2N0M8xM3/A1wa108Cvi7pY4RB7z2Ac7JiXwE81cxu22iy2R8kvQz4KXD/bjAcx3Fmkz6qpMq8dr9E0r6E5ula4NUAZnaZpBOAywkKqyM6KKTG0saiiZndGnszA8EbDMdxnE70qcGo8Np9csUxRwNHVxS7YYZpm4Q3GI7jOG3MvduPLuxT4gJEwHiH/X3BGwzHcZwcY6gbDLMZDmZtIt5gOI7jdGCYAyjNFfOmwVASojX3d1NFqkbJ/dJUhR7NlRypL5yZjijl9Y8UfA2Vq5ZyVVaV76qiUqdeSNb8uG6Kk1TxUuUDq40KdUzqPyovIb32VSqhPLRqeh7jmV1LRlqveRuZYiz13bW4UXwdPFFxDrkSK93Or0tq67qKJ2qdFdPqhmjNr9N0hS11WVAR8rdbCOMqtVVlGNYKcp9jfWeIexhzxbxpMBzHcWYNo2/OBzcnvMFwHMdpY+gHvecEbzAcx3E64Q1GG95gOI7jdMIbjDa8wXAcx8kxg6mZBl/bfJk3DUZD0yyJkddyRUaVX6I0bx7xroopZYqXNDpezfqgOtJYwbYKv1ZtPrCS88gjyaWRz3J/UVXqpyrlU10/RG1l5sdVXbdExZP7ZCooxqqUVln56TXdkJmS1tHuKyu1q1jfVkkEvtuni/Oj2hVNrUpXjqwtpO2cVDKR1X9XMtiaj7suTO7pysZYltb6ON85vbqQdvnEso3ruZosJX9ei899udKrLQpmhZIxV1uleavub+6fKmWmz2gl3sNoY6DuzaOP91skXZrsWynpVElXx/9bVpXhOI4z6zRVUnWW+xGDjofxFeAZ2b4jgdPNbA/g9LjtOI4zXPQp4t7mxEAbDDP7OXBHtvtg4Li4fhzwvEHa4DiOMyO8wWhjLsYwtmv6gDezmyRtW5YxRq46HGC7HefEdYrjOPdHfNC7I0MdotXMjjWz/c1s/xUrvcFwHGcW8R5GG3PRw7i5GWlK0vbALXUOChH3gppkrEtEuJSpCmXUdFsEvtZ2I1NrjDfK/U4Vy8iOo3VcroTKlViFtLT+CtdZvfjVSpUkVUqvbtT14ZOrssYKvo6Kj14hyl7b/bV6aRXk1z6NhpdH+EsVVLnfpXsTu/O6t2oUlVA7jE4naUsKaeut9VzcMbWukLYseS7GG3mkvkRBVXHui1UeKTC/9ul9yhVUqfqpXfmU+mnLlXXl5M9eo6DEmtkXcN8j7sH9rjGow1z0ME4CDo3rhwI/mAMbHMdxKqipkLqfqaQG2sOQ9A3gScDWkm4A3gMcA5wg6TDgeuCFg7TBcRynZwzMBtBrmecMtMEws5eUJD1lkPU6juNsMvez3kMd5s1Mb8dxnFnDVVId8QbDcRynEz7o3YY3GI7jOB2waR/DyNksGoxUyppLZWdK7gCvuv5WnZVy1bYfLOWyxFTOWeWYsMqWnJmGtMzLTG1tC7fZJVRnpzIAFlTctlz2WqDgNLH8/PL6NkVWvLHMLg737khiQo9xXyHt8omW48DV00V3ag8Zu3Pj+rYjiwppd063pLvXZb74GmqFk13RKD6/u4y2Mud36LrJhUkZ5aGC12Vy3PRed/u8VD6XFY4vK8us6RB0Ztz/5ljUYbNoMBzHcfqKh2jtyFDP9HYcx5kLDLCpqVpLNyTtLOlnkq6QdJmkN2Tpb5VkkrZO9h0l6RpJV0l6ev/PcGZ4D8NxHCfHDPo3D2MSeIuZnS9pGXCepFPN7HJJOwNPJcxJA0DSnsCLgb2AHYDTJK0yszmXbXkPw3EcpwM2bbWWruWY3WRm58f11cAVwI4x+T+At1Mc4TwY+KaZrTezPwLXAI/q57nNFO9hOI7jdKJ+D2NrSecm28ea2bGdMkraBdgPOFvSc4E/m9lFKvqV2xH4TbJ9A60GZk6ZNw3GlZdsuO1RD7ruugEUvTVw2wDK3RSG0SYYTruG0Sbom11/2fQiigzj9RqETQ/alINXc+cpp9l3tu6eE4DbzCwPFNeGpKXAd4E3El5TvQt4WqesHfYNxQj8vGkwzGybQZQr6Vwz238QZc+UYbQJhtOuYbQJ3K5eGEab6jQAvSBpjNBYHG9m35P018CuQLN3sRNwvqRHEXoUOyeH7wTc2E97ZoqPYTiO4wwQhRbhi8AVZvYxADO7xMy2NbNdzGwXQiPxcDP7C8Gj94slLZS0K7AHcM4cmV9g3vQwHMdx5imPA14OXCLpwrjvnWZ2cqfMZnaZpBOAywmvro4YBoUUeIMB0HFwao4ZRptgOO0aRpvA7eqFYbSpb5jZWVSGQYPYy0i3jwaOHqBZM0Lm098dx3GcGvgYhuM4jlMLbzAcx3GcWmzWDUaZDxdJKyWdKunq+H/L5JiB+nCpsOmjkq6UdLGkEyWtmC2bquxK0ufE302VXZJeF+u+TNJHZsuuinu4r6TfSLpQ0rlRIjkrNsU6xiWdI+miaNf74v65fN7LbJrT592ZIWa22S7A9gSpGsAy4HfAnsBHgCPj/iOBD8f1PYGLgIUEjfTvgZFZsulpwGjc/+HZtKnKrri9M3AKcB2w9TDYBRwAnAYsjGnbDsE9/CnwzLj/WcAZs3ytBCyN62PA2cCj5/h5L7NpTp93X2a2bNY9DCv34XIwcFzMdhzwvLg+cB8uZTaZ2U/NrBm04DeEyTqzYlOVXTF5zvzdVNj1GuAYM1sf026ZLbsqbDJgecy2Ba3JVrN1rczM1sTNsbgYc/u8d7Rprp93Z2Zs1g1GSurDBdjOzG6C8OEHto3ZdgT+lBw2UB8umU0pfw/8eC5syu1K/d1k2ebULmAV8ARJZ0s6U9Ij58KuzKY3Ah+V9Cfg34CjZtsmSSNR638LcKqZzfnzXmJTypw+70597hcNhhIfLmZ2T1XWDvsGojsus0nSuwiTdY6fbZtyu2j5u/nXTlnnyq54vUaBLQmvN94GnBBn1M7lPXwN8CYz2xl4E2F2L7Npk5lNmdm+hF/sj5L0sIrss2JXlU1z/bw7vbHZNxjKfLjE3TdL2j6mb0/45QOz5MOlxCYkHQocBLzUzJofklnzK9PBrt1p+bu5lpa/mwfMsV3E+r8XX3mcA0wTnNjN5T08FGiuf5vWq5RZ9w1kZncBZwDPYI6f9xKb5vx5d2bAXA+iDHIh/Fr5KvDxbP9HKQ4CfiSu70VxwO0PDGYQsJNNzyC4Atgm2z9wm6rsyvJcS2vQe07tAv4JeH9cX0V4jaE5vodXAE+K608Bzpvla7UNsCKuLwJ+QfhCnsvnvcymOX3efZnh/ZxrAwZ6cvB4Qnf2YuDCuDwL2Ao4Hbg6/l+ZHPMugjLjKqLiZZZsuiZ+6TX3fW62bKqyK8tzLbHBmGu7gAXAfwOXAucDTx6Ce/h44Lz4hXc28IhZvlZ7AxdEuy4F/jXun8vnvcymOX3efZnZ4q5BHMdxnFps9mMYjuM4Tn/wBsNxHMephTcYjuM4Ti28wXAcx3Fq4Q2G4ziOUwtvMBzHcZxaeIOxmSBpTfdcPZf5XElHxvXnSdpzBmWcIWn/HvNfFX1Y5Wm7SLq0VxvmK5Lemawvim7TN6Qu5h1nNvEGwynFzE4ys2Pi5vMIrqdng5ea2UmDrEDSyCDL7xMbGwwzu8+CPyZ3k+HMGd5gbGYo8FFJl0q6RNKL4v4nxV/v34mBa46PzvqQ9Ky47yxJn5T0o7j/lZI+LemxwHMJnlgvlLR72nOQtHX0NdX8JfzNGBjnWwR3EE3bnibp15LOl/Tt6Lyv2/k8Igbf+TVwRLJ/JJ7nb2Ndr477G5I+E4P1/EjSyZJeENOulfSvks4CXlhmT6zzTEnnSTol8cP0ekmXx/q+WWHzEklfirZdIOnguH8XSb+I9Z0fryuStpf083htL5X0BEnHAM1exfFldTnOrDLXU8196c8CrIn/nw+cCowA2wHXEwL+PAm4m+DMrQH8muDKYpzgomHXePw3gB/F9VcCn47rXwFekNR3BrB/XN8auDauvxn4Ulzfm+CJdP+Y5+fAkpj2DqKbiOw8NpYbty8G/jaufxS4NK4fDrw7ri8EziX4HnoBcHI8xwcAdzbtJrg2eXtic5s9hHgNvyL6OAJelJzPjbQCNq2ouBcfAl7WzEcIsLQEWAyMx/17AOfG9bcA74rrI8Cy9J5mZV9L4p7FF19mcxnF2dx4PPANM5sieCk9E3gkcA9wjpndAKAQn2AXYA3wBwvBaiA0GIdvQv1PBD4JYGYXS7o47n804ZXWL2PHZgGh0SpF0haEL+Yz466vAc+M608D9m72HggBi/YgnP+3zWwa+Iukn2XFfquLPQ8BHgacGvePADfFYy4Gjpf0feD7FaY/DXiupLfG7XHggYQG59OS9gWmCE4TAX4LfCl6wP2+mV1YUbbjzBneYGx+dIon0GR9sj5FuP9V+auYpPVKczxL6+SgTITgOS/poQ6VlNVMe52ZnVLYKT27S5n3Vtkj6a+By8zsMR2OfTahQXwu8C+S9rJW1Ljctueb2VVZ2e8Fbgb2IVy7dQBm9nNJT4zlf03SR83sq13Ow3FmHR/D2Pz4OfCi+I5/G8IX3DkV+a8EdlOIHAfhFUwnVhPiVze5FnhEXH9Bsv/nwEsBFALl7B33/wZ4nKQHx7TFklZRgYX4CXdLenzc9dIk+RTgNfFXOZJWSVoCnAU8P45lbEd4FdeJMnuuAraR9Ji4f0zSXpIawM5m9jNCuNoVQNkYzCnA65Ixov3i/i2Am2Lv5+WE3guSHgTcYmafJwRdenjMP9E8P8cZBrzB2Pw4kfDq5CLgfwnv7P9SltnM7gNeC/wkDgbfTBjryPkm8LY4iLs7IQTpayT9ijAe0OSzwNL4KurtxMbKzG4ljIl8I6b9BnhojfN5FfCfcdD7vmT/FwjxFM5XkNr+F6HH9F1CEJ7mvrM7nU+ZPWa2gdAAfljSRQTX248lfLn/t6RLCO66/yM2aJ34AGEs5OJo2wfi/s8Ah0r6DeF1VLO38yTgQkkXEMagPhH3HxvL8EFvZyhw9+YOkpaa2Zr4i/g/gavN7D/myJYzgLea2bmbUEbzfLYiNFiPq2o05xNRjba/md0217Y49z+8h+EA/GMcBL+M8Nrkv+bQljuAr6jDxL0e+FE8n18AH9gcGgvFiXuEnsv0HJvj3E/xHobjzBBJrwLekO3+pZkd0Sm/48x3vMFwHMdxauGvpBzHcZxaeIPhOI7j1MIbDMdxHKcW3mA4juM4tfj/NeRwQW1FQCMAAAAASUVORK5CYII=\n", + "image/png": "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", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -173,7 +171,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "URL: https://pavics.ouranos.ca/wpsoutputs/finch/d90fb9ac-19cf-11ee-b08c-0242ac130017/tasmax_amon_mpi_esm_mr_rcp45_r1i1p1_200601_200612_sub.nc\n" + "URL: https://pavics.ouranos.ca/wpsoutputs/finch/1f35ed46-2800-11ee-b672-0242ac130014/tasmax_amon_mpi_esm_mr_rcp45_r1i1p1_200601_200612_sub.nc\n", + "Downloading to /tmp/tmpyl0fy6yy/tasmax_amon_mpi_esm_mr_rcp45_r1i1p1_200601_200612_sub.nc.\n" ] }, { @@ -210,6 +209,7 @@ "}\n", "\n", "html[theme=dark],\n", + "body[data-theme=dark],\n", "body.vscode-dark {\n", " --xr-font-color0: rgba(255, 255, 255, 1);\n", " --xr-font-color2: rgba(255, 255, 255, 0.54);\n", @@ -439,6 +439,11 @@ " grid-column: 4;\n", "}\n", "\n", + ".xr-index-preview {\n", + " grid-column: 2 / 5;\n", + " color: var(--xr-font-color2);\n", + "}\n", + "\n", ".xr-var-name,\n", ".xr-var-dims,\n", ".xr-var-dtype,\n", @@ -460,14 +465,16 @@ "}\n", "\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " display: none;\n", " background-color: var(--xr-background-color) !important;\n", " padding-bottom: 5px !important;\n", "}\n", "\n", ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n", - ".xr-var-data-in:checked ~ .xr-var-data {\n", + ".xr-var-data-in:checked ~ .xr-var-data,\n", + ".xr-index-data-in:checked ~ .xr-index-data {\n", " display: block;\n", "}\n", "\n", @@ -477,13 +484,16 @@ "\n", ".xr-var-name span,\n", ".xr-var-data,\n", + ".xr-index-name div,\n", + ".xr-index-data,\n", ".xr-attrs {\n", " padding-left: 25px !important;\n", "}\n", "\n", ".xr-attrs,\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " grid-column: 1 / -1;\n", "}\n", "\n", @@ -521,7 +531,8 @@ "}\n", "\n", ".xr-icon-database,\n", - ".xr-icon-file-text2 {\n", + ".xr-icon-file-text2,\n", + ".xr-no-icon {\n", " display: inline-block;\n", " vertical-align: middle;\n", " width: 1em;\n", @@ -534,15 +545,15 @@ "Dimensions: (time: 12, region: 1, bnds: 2)\n", "Coordinates:\n", " * time (time) datetime64[ns] 2006-01-16T12:00:00 ... 2006-12...\n", - " lat float64 49.43\n", - " lon float64 200.6\n", + " lat float64 ...\n", + " lon float64 ...\n", "Dimensions without coordinates: region, bnds\n", "Data variables:\n", - " time_bnds (region, time, bnds) datetime64[ns] 2006-01-01 ... 20...\n", - " lat_bnds (region, bnds) float64 48.5 50.36\n", - " lon_bnds (region, bnds) float64 199.7 201.6\n", - " latitude_longitude (region) |S1 b''\n", - " tasmax (region, time) float32 278.5 278.2 278.6 ... 280.5 279.3\n", + " time_bnds (region, time, bnds) datetime64[ns] ...\n", + " lat_bnds (region, bnds) float64 ...\n", + " lon_bnds (region, bnds) float64 ...\n", + " latitude_longitude (region) |S1 ...\n", + " tasmax (region, time) float32 ...\n", "Attributes: (12/27)\n", " institution: Max Planck Institute for Meteorology\n", " institute_id: MPI-M\n", @@ -556,27 +567,19 @@ " parent_experiment: historical\n", " modeling_realm: atmos\n", " realization: 1\n", - " cmor_version: 2.6.0" ], "text/plain": [ @@ -645,7 +648,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.1" + "version": "3.9.16" } }, "nbformat": 4, diff --git a/docs/source/processes/impacts.rst b/docs/source/processes/impacts.rst deleted file mode 100644 index 004d0f7f..00000000 --- a/docs/source/processes/impacts.rst +++ /dev/null @@ -1,21 +0,0 @@ -====================== -Impacts and adaptation -====================== - -The following are processes for analyzing impact and adaptation metrics for the purpose of tracking biodiversity health. - -.. - Biodiversity - ------------ - - .. autoprocess:: flyingpigeon.processes.GBIFfetchProcess - - .. autoprocess:: flyingpigeon.processes.SDMgetindicesProcess - - .. autoprocess:: flyingpigeon.processes.SDMcsvProcess - - .. autoprocess:: flyingpigeon.processes.SDMcsvindicesProcess - - .. autoprocess:: flyingpigeon.processes.SDMallinoneProcess - - .. autoprocess:: flyingpigeon.processes.SegetalfloraProcess diff --git a/docs/source/processes/indices.rst b/docs/source/processes/indices.rst index 02d76219..8b96ffb9 100644 --- a/docs/source/processes/indices.rst +++ b/docs/source/processes/indices.rst @@ -2,4 +2,4 @@ Climate indicators ================== -PAVICS now relies on :doc:`Finch ` to provide processes for climate indicators (it previously used FlyingPigeon, which itself used ICCLIM indicators wrapped using ocgis). The full list of available processes can be found :ref:`here `. +PAVICS now relies on :doc:`Finch ` to provide processes for climate indicators. The full list of available processes can be found :ref:`here `. diff --git a/docs/source/processes/visualization.rst b/docs/source/processes/visualization.rst deleted file mode 100644 index fa075e26..00000000 --- a/docs/source/processes/visualization.rst +++ /dev/null @@ -1,11 +0,0 @@ -============= -Visualization -============= - - -.. - .. autoprocess:: flyingpigeon.processes.PlottimeseriesProcess - - #.. autoprocess:: flyingpigeon.processes.AnalogsviewerProcess (moved to blackswan) - - .. autoprocess:: flyingpigeon.processes.MapSpatialAnalogProcess