From 2768716c496e4ff92964253e0cc2cba5bb5e0cb0 Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Sat, 2 Aug 2025 17:00:24 -0400 Subject: [PATCH 1/8] Delete WIS2-Development directory --- WIS2-Development/Readme.md | 1 - WIS2-Development/Sensor-Centre.adoc | 1 - 2 files changed, 2 deletions(-) delete mode 100644 WIS2-Development/Readme.md delete mode 100644 WIS2-Development/Sensor-Centre.adoc diff --git a/WIS2-Development/Readme.md b/WIS2-Development/Readme.md deleted file mode 100644 index 06eaef52..00000000 --- a/WIS2-Development/Readme.md +++ /dev/null @@ -1 +0,0 @@ -Welcome to the WIS2 Development Repository, the reference hub for new advancements in the WMO Information System 2.0 (WIS2). This repository includes proposals for the establishment of Sensor Centres, the WIS2 Global Replay service, a shared MQTT service, and other key components aimed at enhancing the WIS 2.0. diff --git a/WIS2-Development/Sensor-Centre.adoc b/WIS2-Development/Sensor-Centre.adoc deleted file mode 100644 index 8b137891..00000000 --- a/WIS2-Development/Sensor-Centre.adoc +++ /dev/null @@ -1 +0,0 @@ - From 71bcf7690ff3d4b1a0614a47c4ef739ba57000ea Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Sun, 5 Oct 2025 10:05:30 -0400 Subject: [PATCH 2/8] fix README syntax --- guide/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/guide/README.md b/guide/README.md index 6cb9ee1a..aed6f517 100644 --- a/guide/README.md +++ b/guide/README.md @@ -27,10 +27,7 @@ asciidoctor --trace -o wis2-guide.html index.adoc asciidoctor --trace -r asciidoctor-pdf --trace -b pdf -o wis2-guide.pdf index.adoc # create Word document asciidoctor --trace --backend docbook --out-file - index.adoc | pandoc --from docbook --to docx --output wis2-guide.docx -``` - # check links -```bash find . -name "???.adoc" -exec asciidoc-link-check -p -c asciidoc-link-check-config.json {} \; ``` From 6eabfb76b0425fe5fc016576c1993972ce35c41e Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Thu, 4 Dec 2025 22:39:24 -0500 Subject: [PATCH 3/8] Change cron schedule to run every 15 minutes --- .github/workflows/gdc-all-channels.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/gdc-all-channels.yml b/.github/workflows/gdc-all-channels.yml index 2f9624de..4ef1799d 100644 --- a/.github/workflows/gdc-all-channels.yml +++ b/.github/workflows/gdc-all-channels.yml @@ -2,7 +2,8 @@ name: Generate list of all GDC channels on: schedule: - - cron: '0 * * * *' # runs every hour + - cron: '0/15 * * * *' # runs every 15 minutes + # - cron: '0 * * * *' # runs every hour # - cron: '* * * * *' # runs every minute, for debugging env: From f1d427a1e5f68539d93abc537f1d957f2fcd4078 Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Fri, 12 Dec 2025 06:15:32 -0500 Subject: [PATCH 4/8] add CI doc build / publish for INFCOM-4 review --- .github/workflows/guide-infcom.yml | 46 +++++++++++++++++++++++++ .github/workflows/test-guide-infcom.yml | 31 +++++++++++++++++ .github/workflows/test-guide.yml | 2 +- 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/guide-infcom.yml create mode 100644 .github/workflows/test-guide-infcom.yml diff --git a/.github/workflows/guide-infcom.yml b/.github/workflows/guide-infcom.yml new file mode 100644 index 00000000..f79918ed --- /dev/null +++ b/.github/workflows/guide-infcom.yml @@ -0,0 +1,46 @@ +name: WIS2 Guide for INFCOM review + +on: + push: + branches: + - INFCOM-4 + +env: + FILE_BASENAME: wis2-guide-DRAFT-INFCOM-4 + +jobs: + build-wis2-guide: + name: Generate documentation + runs-on: ubuntu-latest + steps: + - name: Install dependencies + run: | + sudo apt-get update -y \ + && sudo apt-get install -y pandoc \ + && sudo gem install asciidoctor asciidoctor-pdf + - name: checkout repository + uses: actions/checkout@v3 + - name: build documentation + run: | + mkdir -p /tmp/wis2-guide/guide/images \ + && cd guide \ + && asciidoctor --trace -o /tmp/wis2-guide/guide/${FILE_BASENAME}.html index.adoc \ + && asciidoctor --trace --backend docbook --out-file - index.adoc | pandoc --from docbook --to docx --output /tmp/wis2-guide/guide/${FILE_BASENAME}.docx \ + && asciidoctor --trace -r asciidoctor-pdf --trace -b pdf -o /tmp/wis2-guide/guide/${FILE_BASENAME}.pdf index.adoc \ + && cp images/*.png /tmp/wis2-guide/guide/images \ + && cd .. + - name: checkout gh-pages branch + uses: actions/checkout@v3 + with: + ref: gh-pages + - name: update gh-pages branch and publish + run: | + git checkout gh-pages + git config --global user.email "tomkralidis@gmail.com" + git config --global user.name "Tom Kralidis" + rm -rf guide + mv -f /tmp/wis2-guide/* . + git add . + git commit -am "update WIS2 Guide build" + git push + diff --git a/.github/workflows/test-guide-infcom.yml b/.github/workflows/test-guide-infcom.yml new file mode 100644 index 00000000..e896cf63 --- /dev/null +++ b/.github/workflows/test-guide-infcom.yml @@ -0,0 +1,31 @@ +name: Test WIS2 Guide build for INFCOM review + +on: + pull_request: + branches: + - INFCOM-4 + paths: + - '**.adoc' + +env: + FILE_BASENAME: wis2-guide-DRAFT-INFCOM-4 + +jobs: + build-wis2-guide: + name: Test documentation build + runs-on: ubuntu-latest + steps: + - name: Install dependencies + run: | + sudo apt-get update -y \ + && sudo apt-get install -y pandoc \ + && sudo gem install asciidoctor asciidoctor-pdf + - name: checkout repository + uses: actions/checkout@v3 + - name: build documentation + run: | + mkdir -p /tmp/wis2-guide/guide/images \ + && cd guide \ + && asciidoctor --trace -o /tmp/wis2-guide/guide/${FILE_BASENAME}.html index.adoc \ + && asciidoctor --trace --backend docbook --out-file - index.adoc | pandoc --from docbook --to docx --output /tmp/wis2-guide/guide/${FILE_BASENAME}.docx \ + && asciidoctor --trace -r asciidoctor-pdf --trace -b pdf -o /tmp/wis2-guide/guide/${FILE_BASENAME}.pdf index.adoc diff --git a/.github/workflows/test-guide.yml b/.github/workflows/test-guide.yml index ac48da73..a3caa321 100644 --- a/.github/workflows/test-guide.yml +++ b/.github/workflows/test-guide.yml @@ -3,7 +3,7 @@ name: Test WIS2 Guide build on: pull_request: paths: - - '**.adoc' + - '**.adoc' env: FILE_BASENAME: wis2-guide-APPROVED From cece6e8937cc3c044566d1b7122f1dc7a66eaa9f Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Fri, 12 Dec 2025 07:22:04 -0500 Subject: [PATCH 5/8] update INFCOM build CI --- .github/workflows/guide-infcom.yml | 11 ++++++----- .github/workflows/guide.yml | 4 ++-- .github/workflows/test-guide-infcom.yml | 2 +- .github/workflows/test-guide.yml | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/guide-infcom.yml b/.github/workflows/guide-infcom.yml index f79918ed..4b70839a 100644 --- a/.github/workflows/guide-infcom.yml +++ b/.github/workflows/guide-infcom.yml @@ -19,7 +19,7 @@ jobs: && sudo apt-get install -y pandoc \ && sudo gem install asciidoctor asciidoctor-pdf - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@master - name: build documentation run: | mkdir -p /tmp/wis2-guide/guide/images \ @@ -30,7 +30,7 @@ jobs: && cp images/*.png /tmp/wis2-guide/guide/images \ && cd .. - name: checkout gh-pages branch - uses: actions/checkout@v3 + uses: actions/checkout@master with: ref: gh-pages - name: update gh-pages branch and publish @@ -38,9 +38,10 @@ jobs: git checkout gh-pages git config --global user.email "tomkralidis@gmail.com" git config --global user.name "Tom Kralidis" - rm -rf guide - mv -f /tmp/wis2-guide/* . + rm -rf guide/infcom + mkdir -p guide/infcom + mv -f /tmp/wis2-guide/* guide/infcom git add . - git commit -am "update WIS2 Guide build" + git commit -am "update WIS2 Guide INFCOM build" git push diff --git a/.github/workflows/guide.yml b/.github/workflows/guide.yml index 37b90bc6..8a077c6c 100644 --- a/.github/workflows/guide.yml +++ b/.github/workflows/guide.yml @@ -19,7 +19,7 @@ jobs: && sudo apt-get install -y pandoc \ && sudo gem install asciidoctor asciidoctor-pdf - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@master - name: build documentation run: | mkdir -p /tmp/wis2-guide/guide/images \ @@ -30,7 +30,7 @@ jobs: && cp images/*.png /tmp/wis2-guide/guide/images \ && cd .. - name: checkout gh-pages branch - uses: actions/checkout@v3 + uses: actions/checkout@master with: ref: gh-pages - name: update gh-pages branch and publish diff --git a/.github/workflows/test-guide-infcom.yml b/.github/workflows/test-guide-infcom.yml index e896cf63..0d4ea3c3 100644 --- a/.github/workflows/test-guide-infcom.yml +++ b/.github/workflows/test-guide-infcom.yml @@ -21,7 +21,7 @@ jobs: && sudo apt-get install -y pandoc \ && sudo gem install asciidoctor asciidoctor-pdf - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@master - name: build documentation run: | mkdir -p /tmp/wis2-guide/guide/images \ diff --git a/.github/workflows/test-guide.yml b/.github/workflows/test-guide.yml index a3caa321..4f78233a 100644 --- a/.github/workflows/test-guide.yml +++ b/.github/workflows/test-guide.yml @@ -19,7 +19,7 @@ jobs: && sudo apt-get install -y pandoc \ && sudo gem install asciidoctor asciidoctor-pdf - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@master - name: build documentation run: | mkdir -p /tmp/wis2-guide/guide/images \ From fcff3f7facd7c88b39b300eb6ce2576a2abe6e61 Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Tue, 20 Jan 2026 08:19:13 -0500 Subject: [PATCH 6/8] add CSS to HTML build (#227) --- .github/workflows/guide-infcom.yml | 2 +- .github/workflows/guide.yml | 2 +- .github/workflows/test-guide-infcom.yml | 2 +- .github/workflows/test-guide.yml | 2 +- guide/Makefile | 2 +- guide/css/wmo-asciidoc.css | 65 ++++++++++++++++++++++++ guide/images/wmo-logo-en.png | Bin 0 -> 45936 bytes 7 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 guide/css/wmo-asciidoc.css create mode 100644 guide/images/wmo-logo-en.png diff --git a/.github/workflows/guide-infcom.yml b/.github/workflows/guide-infcom.yml index 4b70839a..a7569103 100644 --- a/.github/workflows/guide-infcom.yml +++ b/.github/workflows/guide-infcom.yml @@ -24,7 +24,7 @@ jobs: run: | mkdir -p /tmp/wis2-guide/guide/images \ && cd guide \ - && asciidoctor --trace -o /tmp/wis2-guide/guide/${FILE_BASENAME}.html index.adoc \ + && asciidoctor --trace -a stylesheet=css/wmo-asciidoc.css -o /tmp/wis2-guide/guide/${FILE_BASENAME}.html index.adoc \ && asciidoctor --trace --backend docbook --out-file - index.adoc | pandoc --from docbook --to docx --output /tmp/wis2-guide/guide/${FILE_BASENAME}.docx \ && asciidoctor --trace -r asciidoctor-pdf --trace -b pdf -o /tmp/wis2-guide/guide/${FILE_BASENAME}.pdf index.adoc \ && cp images/*.png /tmp/wis2-guide/guide/images \ diff --git a/.github/workflows/guide.yml b/.github/workflows/guide.yml index 8a077c6c..d6b87ef1 100644 --- a/.github/workflows/guide.yml +++ b/.github/workflows/guide.yml @@ -24,7 +24,7 @@ jobs: run: | mkdir -p /tmp/wis2-guide/guide/images \ && cd guide \ - && asciidoctor --trace -o /tmp/wis2-guide/guide/${FILE_BASENAME}.html index.adoc \ + && asciidoctor --trace -a stylesheet=css/wmo-asciidoc.css -o /tmp/wis2-guide/guide/${FILE_BASENAME}.html index.adoc \ && asciidoctor --trace --backend docbook --out-file - index.adoc | pandoc --from docbook --to docx --output /tmp/wis2-guide/guide/${FILE_BASENAME}.docx \ && asciidoctor --trace -r asciidoctor-pdf --trace -b pdf -o /tmp/wis2-guide/guide/${FILE_BASENAME}.pdf index.adoc \ && cp images/*.png /tmp/wis2-guide/guide/images \ diff --git a/.github/workflows/test-guide-infcom.yml b/.github/workflows/test-guide-infcom.yml index 0d4ea3c3..ff8a6c4c 100644 --- a/.github/workflows/test-guide-infcom.yml +++ b/.github/workflows/test-guide-infcom.yml @@ -26,6 +26,6 @@ jobs: run: | mkdir -p /tmp/wis2-guide/guide/images \ && cd guide \ - && asciidoctor --trace -o /tmp/wis2-guide/guide/${FILE_BASENAME}.html index.adoc \ + && asciidoctor --trace -a stylesheet=css/wmo-asciidoc.css -o /tmp/wis2-guide/guide/${FILE_BASENAME}.html index.adoc \ && asciidoctor --trace --backend docbook --out-file - index.adoc | pandoc --from docbook --to docx --output /tmp/wis2-guide/guide/${FILE_BASENAME}.docx \ && asciidoctor --trace -r asciidoctor-pdf --trace -b pdf -o /tmp/wis2-guide/guide/${FILE_BASENAME}.pdf index.adoc diff --git a/.github/workflows/test-guide.yml b/.github/workflows/test-guide.yml index 4f78233a..dd4229e2 100644 --- a/.github/workflows/test-guide.yml +++ b/.github/workflows/test-guide.yml @@ -24,6 +24,6 @@ jobs: run: | mkdir -p /tmp/wis2-guide/guide/images \ && cd guide \ - && asciidoctor --trace -o /tmp/wis2-guide/guide/${FILE_BASENAME}.html index.adoc \ + && asciidoctor --trace -a stylesheet=css/wmo-asciidoc.css -o /tmp/wis2-guide/guide/${FILE_BASENAME}.html index.adoc \ && asciidoctor --trace --backend docbook --out-file - index.adoc | pandoc --from docbook --to docx --output /tmp/wis2-guide/guide/${FILE_BASENAME}.docx \ && asciidoctor --trace -r asciidoctor-pdf --trace -b pdf -o /tmp/wis2-guide/guide/${FILE_BASENAME}.pdf index.adoc diff --git a/guide/Makefile b/guide/Makefile index b18ad3d3..1ff50f92 100644 --- a/guide/Makefile +++ b/guide/Makefile @@ -1,7 +1,7 @@ FILE_BASENAME=wis2-guide-APPROVED html: - asciidoctor --trace -o ${FILE_BASENAME}.html index.adoc + asciidoctor --trace -a stylesheet=css/wmo-asciidoc.css -o ${FILE_BASENAME}.html index.adoc pdf: asciidoctor --trace -r asciidoctor-pdf --trace -b pdf -o ${FILE_BASENAME}.pdf index.adoc diff --git a/guide/css/wmo-asciidoc.css b/guide/css/wmo-asciidoc.css new file mode 100644 index 00000000..acb8e596 --- /dev/null +++ b/guide/css/wmo-asciidoc.css @@ -0,0 +1,65 @@ +@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; +@import "https://cdn.jsdelivr.net/gh/asciidoctor/asciidoctor@2.0/data/stylesheets/asciidoctor-default.css"; + +h1, h2, h3, h4, h5, h6, +.sidebarblock > .content > .title { + color: #005398; + font-weight: bold; +} + +#toctitle { + color: #005398; + font-weight: bold; +} + +#content #toc { + border: 1px solid #005398; + margin-bottom: 1.25em; + padding: 1.25em; + background: #ffffff; + border-radius: 4px; +} + +#header { + border-bottom: 4px solid #005398; + margin-top: 10px; + +} + +#header>h1:first-child { + color: #005398; + margin-top: 15px; + margin-bottom: 0; +} + +#header::before { + content: ""; + display: block; + height: 72px; + background: url("images/wmo-logo-en.png") no-repeat left center; + background-size: contain; +} + +body { + font-family: "Montserrat", sans-serif; +} + +.subheader, .admonitionblock td.content>.title, .audioblock>.title, .exampleblock>.title, .imageblock>.title, .listingblock>.title, .literalblock>.title, .stemblock>.title, .openblock>.title, .paragraph>.title, .quoteblock>.title, table.tableblock>.title, .verseblock>.title, .videoblock>.title, .dlist>.title, .olist>.title, .ulist>.title, .qlist>.title, .hdlist>.title { + line-height: 1.45; + color: #005398; + font-weight: 400; + margin-top: 0; + margin-bottom: .25em; +} + +#footer { + max-width: none; + background: #005398; + padding: 1.25em; +} + +#footer-text { + color: #ffffff; + line-height: 1.44; + font-weight: bold; +} diff --git a/guide/images/wmo-logo-en.png b/guide/images/wmo-logo-en.png new file mode 100644 index 0000000000000000000000000000000000000000..6d5f66f01bdde9f86c6759d43d357418bf3554ec GIT binary patch literal 45936 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 literal 0 HcmV?d00001 From dc191151c29028ecae14df5fecfedbcb229489af Mon Sep 17 00:00:00 2001 From: Anna Milan Date: Mon, 9 Feb 2026 17:05:11 +0100 Subject: [PATCH 7/8] FT2025-2 (#216) * update OGC API - Records - Part 1: Core link to approved document (#188) * fix footnote syntax (#192) * update metadata publishing requirement (#196) * add identification of Global Caches to WNM (#190) (#191) * update OGC API - Records - Part 1: Core link to approved document (#188) * add identification of Global Caches to WNM (#190) * Update global-services.adoc (#199) * add HTTP header to GDC requests (#138) (#197) * Update global-services.adoc Add implementation details of wmo_wis2_gb_connected_flag. --------- Co-authored-by: Tom Kralidis * update OARec reference (#189) (#198) * editorial * editorial fixes (#201) * update properties.global-cache to properties.source * Update global-services.adoc * replace tabs with spaces, capitalize Reference Implementation (#204) * Update guide/sections/part2/global-services.adoc Co-authored-by: Anna Milan * Update global-services.adoc * FT2025-2 update (#205) * move properties.global-cache requirement #190 * Update global-services.adoc * Update global-services.adoc * add statement on WCMP2 re-publishing (#200) (#208) * Delete WIS2-Development directory * add statement on daily WCMP2 re-publishing (#200) * update tld convention (#206) (#210) * Delete WIS2-Development directory * update tld convention (#206) * editorial fix/update (#212) * 1.2 release prep draft * move annex * move annex * add milestone 7 * add milestone 7 * update front matter --------- Co-authored-by: Tom Kralidis Co-authored-by: Remy Giraud --- guide/index.adoc | 12 ++++---- guide/sections/annex_a.adoc | 11 +++++++ guide/sections/part1/data-consumer.adoc | 2 +- guide/sections/part1/data-publisher.adoc | 6 ++-- guide/sections/part2/global-services.adoc | 33 +++++++++++---------- guide/sections/part2/operations.adoc | 2 +- guide/sections/part2/wis2-architecture.adoc | 14 ++++----- guide/sections/part2/wis2node.adoc | 4 +-- 8 files changed, 50 insertions(+), 34 deletions(-) create mode 100644 guide/sections/annex_a.adoc diff --git a/guide/index.adoc b/guide/index.adoc index c7d97c24..f7fa0da2 100644 --- a/guide/index.adoc +++ b/guide/index.adoc @@ -1,8 +1,8 @@ -:title: Guide to the WMO Information System Volume II (APPROVED) - WMO Information System 2.0 +:title: Guide to the WMO Information System (WMO-No. 1061), Volume II - WMO Information System 2.0 (APPROVED) :titletext: {title} -:version: 1.0.0 -:date: {docdate} -:copyright: Copyright © 2024 World Meteorological Organization (WMO) +:version: 1.2.0 +:date: 2026-02-02 +:copyright: Copyright © 2026 World Meteorological Organization (WMO) :doctype: book :encoding: utf-8 :lang: en @@ -17,7 +17,7 @@ |=== |{set:cellbgcolor:#FFFFFF} |[big]*World Meteorological Organization* -|Date: {date} +|Date: 2026-02-02 |Version: {version} |Document status: APPROVED |Document location: https://wmo-im.github.io/wis2-guide/guide/wis2-guide-APPROVED.html @@ -42,6 +42,8 @@ include::sections/part4/index.adoc[] include::sections/part5/index.adoc[] +include::sections/annex_a.adoc[] + // include::sections/other-considerations.adoc[] diff --git a/guide/sections/annex_a.adoc b/guide/sections/annex_a.adoc new file mode 100644 index 00000000..02a50433 --- /dev/null +++ b/guide/sections/annex_a.adoc @@ -0,0 +1,11 @@ +[appendix] +:appendix-caption: Annex +== Revision History + +[cols="12,18,12,12,46",options="header"] +|=== +|Date |Release |Proposed by | Primary clauses modified |Approved by +|June 2024| 1.0.0 | SC-IMT | Initial approval for publication| EC-78 +|November 2024 | 1.1.0 | SC-IMT |https://github.com/wmo-im/wis2-guide/milestone/3?closed=1[See GitHub]| Fast-track 2024-2 +|February 2026 | 1.2.0 | SC-IMT |https://github.com/wmo-im/wis2-guide/milestone/7?closed=1[See GitHub] |Fast-track 2025-2 +|=== diff --git a/guide/sections/part1/data-consumer.adoc b/guide/sections/part1/data-consumer.adoc index 8afcda8d..45ff9143 100644 --- a/guide/sections/part1/data-consumer.adoc +++ b/guide/sections/part1/data-consumer.adoc @@ -12,7 +12,7 @@ The Global Discovery Catalogue is accessible via an API and provides a low-barri ==== 1.2.2 How to subscribe to notifications about the availability of new data -WIS2 provides notifications about updates to datasets, for example, a notification may indicate that a new observation record from an automatic weather station has been added to a dataset of surface observations. These notifications are published on Message Brokers. Where data consumers need to use data rapidly once they have been published (for example, as inputs to a weather prediction model), they should subscribe to one or more Global Brokers to get notification messages using Message Queuing Telemetry Transport (MQTT) protocol.footnote[Subscribing to notifications about newly available data ensures that the data consumers do not need to continually to poll the data server to check for updates.] +WIS2 provides notifications about updates to datasets, for example, a notification may indicate that a new observation record from an automatic weather station has been added to a dataset of surface observations. These notifications are published on Message Brokers. Where data consumers need to use data rapidly once they have been published (for example, as inputs to a weather prediction model), they should subscribe to one or more Global Brokers to get notification messages using Message Queuing Telemetry Transport (MQTT) protocol.footnote:[Subscribing to notifications about newly available data ensures that the data consumers do not need to continually to poll the data server to check for updates.] In WIS2, notifications are republished by Global Brokers to ensure resilient distribution. Consequently, there will be multiple places where one can subscribe. Data consumers requiring real-time notifications must subscribe to Global Brokers. Data consumers should subscribe to more than one Global Broker to ensure that notifications continue to be received if a Global Broker instance fails. diff --git a/guide/sections/part1/data-publisher.adoc b/guide/sections/part1/data-publisher.adoc index 6f6ea672..9dd80304 100644 --- a/guide/sections/part1/data-publisher.adoc +++ b/guide/sections/part1/data-publisher.adoc @@ -27,9 +27,9 @@ Copies of all discovery metadata records from WIS2 are held in the Global Discov Depending on local arrangements, your GISC may be able to assist in transferring discovery metadata record(s) to the Global Discovery Catalogues. If this is not the case, data publishers will need to publish the discovery metadata record(s) themselvesfootnote:[In the future, WIS2 may provide metadata publication services (for example, through a WIS2 metadata management portal) to assist with this task. However, such services are not currently available.] using one of two methods: * The simplest method is to encode the discovery metadata record as a file and publish it to an HTTP server, where it can be accessed with a URL. -* Alternatively, a data publisher may operate a local metadata catalogue through which discovery metadata records can be shared using an API (for example, OGC API – Recordsfootnote:[See OGC API - Records - Part 1: Core: https://docs.ogc.org/DRAFTS/20-004.html.]). Each discovery metadata record (for instance, an item that is part of the discovery metadata catalogue) can be accessed with a unique URL via the API . +* Alternatively, a data publisher may operate a local metadata catalogue through which discovery metadata records can be shared using an API (for example, OGC API – Records). Each discovery metadata record (for instance, an item that is part of the discovery metadata catalogue) can be accessed with a unique URL via the API. -In both cases, a notification message needs to be published on a Message Broker that tells WIS2 that there is a new discovery metadata record to upload and that it can be accessed at the specified URL.footnote:[Both data and metadata are published using the same notification message mechanism to announce the availability of new resources.] Notification messages shall conform to the specification given in the _Manual on WIS_, Volume II - Appendix E. WIS2 Notification Message. They must also be published on a topic that conforms to the specification given in the _Manual on WIS_, Volume II - Appendix D. WIS2 Topic Hierarchy. For example, metadata published by Deutscher Wetterdienst would use the following topic: ``origin/a/wis2/de-dwd/metadata/core``. +In both cases, a notification message needs to be published on a Message Broker that tells WIS2 that there is a new discovery metadata record to upload and that it can be accessed at the specified URL.footnote:[Both data and metadata are published using the same notification message mechanism to announce the availability of new resources.] Notification messages shall conform to the specification given in the _Manual on WIS_, Volume II - Appendix E. WIS2 Notification Message. They must also be published on a topic that conforms to the specification given in the _Manual on WIS_, Volume II - Appendix D. WIS2 Topic Hierarchy. For example, metadata published by Deutscher Wetterdienst would use the following topic: ``origin/a/wis2/de-dwd/metadata``. These discovery metadata records are then propagated through the Global Service components into the Global Discovery Catalogue, where data consumers can search and browse for datasets of interest. @@ -37,6 +37,8 @@ Upon receipt of a new discovery metadata record, a Global Discovery Catalogue (s Discovery metadata must be published in the Global Discovery Catalogues before the data are published. +Discovery metadata should be re-published on a daily basis. + ==== 1.3.3 How to provide data to WIS2 WIS2 is based on the web architecture.footnote:[See Architecture of the World Wide Web, Volume One: https://www.w3.org/TR/webarch/.] As such it is _resource oriented_. Datasets are resources; the "granules" of data grouped in a dataset are resources; and the discovery metadata records that describe datasets are resources. In web architecture, every resource has a unique identifier (such as a URIfootnote:[See RFC 3986 - Uniform Resource Identifier (URI) - Generic Syntax: https://datatracker.ietf.org/doc/html/rfc3986.]), which can be used to resolve the identified resource and interact with it (for example, to download a representation of the resource over an open-standard protocol such as HTTP). diff --git a/guide/sections/part2/global-services.adoc b/guide/sections/part2/global-services.adoc index 3dcaa003..3dd9bbe5 100644 --- a/guide/sections/part2/global-services.adoc +++ b/guide/sections/part2/global-services.adoc @@ -5,9 +5,9 @@ The successful operation of WIS2 depends on a set of Global Services running wel Depending on the nature of the Global Service, the following are the minimum capabilities needed to ensure that the level of service as a whole reaches 100% (or very close): -* Three Global Brokers, with each Global Broker connected to at least two other Global Brokers; -* Three Global Caches, with each Global Cache connected to at least two Global Brokers and capable of downloading data from all WIS2 Nodes providing core data; -* Two Global Discovery Catalogues, with each Global Discovery Catalogue connected to at least one Global Broker; +* Three Global Brokers, with each Global Broker connected to at least two other Global Brokers; +* Three Global Caches, with each Global Cache connected to at least two Global Brokers and capable of downloading data from all WIS2 Nodes providing core data; +* Two Global Discovery Catalogues, with each Global Discovery Catalogue connected to at least one Global Broker; * Two Global Monitors - each Global Monitor should scrape the metrics from all other Global Services In addition to the above, WIS architecture can accommodate adding (or removing) Global Services. Candidate WIS centres should inform their WIS NFP and contact the WMO Secretariat to discuss their offer to provide a Global Service. @@ -36,11 +36,10 @@ WIS2 Global Services (Global Brokers, Global Caches, and Global Discovery Catalo There is no requirement for WIS2 Nodes to provide monitoring metrics. However their WIS2 interfaces may be queried remotely by Global Services, which can then provide metrics on the availability of WIS2 Nodes. -Metrics for WIS2 monitoring should follow the naming convention ``wmo__``, where ```` is the name of the responsible WMO programme and ```` is the name of the metric. Examples of WIS2 metrics include: +Metrics for WIS2 monitoring should follow the naming convention ``wmo__``, where ```` is the name of the responsible WMO programme and ```` is the name of the metric. Examples of WIS2 metrics include (but are not limited to): - ``wmo_wis2_gc_downloaded_total``, and - - ``wmo_wis2_gb_messages_invalid_total``. +* ``wmo_wis2_gc_downloaded_total`` +* ``wmo_wis2_gb_messages_invalid_total`` The full set of the WIS2 monitoring metrics is given in WMO: WIS2 Metric Hierarchy footnote:[See https://github.com/wmo-im/wis2-metric-hierarchy.] @@ -83,6 +82,7 @@ In the following sections, and for each Global Service, a set of metrics is defi ** An off the shelf broker implementing both MQTT 3.1.1 and MQTT 5.0 in a highly available setup, typically in a cluster mode. Tools such as EMQX, HiveMQ, VerneMQ, RabbitMQ (in its latest versions) are compliant with these requirements. The open source version of Mosquitto cannot be clustered and therefore should not be used as part of a Global Broker. ** Additional features, including anti-loop detection, notification message format compliance, validation of the published topic, and metrics provision. +* When connected to a local WIS centre broker or a Global Service broker, the metric ``wmo_wis2_gb_connected_flag`` will be equal to 1. When the connection cannot be established or is interrupted the metric ``wmo_wis2_gb_connected_flag`` will be equal to 0. * When receiving a message from a local WIS centre broker or a Global Service broker, the metric ``wmo_wis2_gb_messages_received_total`` will be increased by 1. * A Global Broker will check if a discovery metadata record exists corresponding to the topic on which a message has been published. If there is no corresponding discovery metadata record, the Global Broker will discard non-compliant messages and will raise an alert. The metric ``wmo_wis2_gb_messages_no_metadata_total`` will be increased by 1. The Global Broker should not request information from a Global Discovery Catalogue for each notification message but should keep a cache of all valid topics for every ``centre-id``. * A Global Broker will check that the topic on which the message is received is valid. If the topic is invalid, the Global Broker will discard non-compliant messages and will raise an alert. The metric ``wmo_wis2_gb_invalid_topic_total`` will be increased by 1. @@ -91,7 +91,7 @@ In the following sections, and for each Global Service, a set of metrics is defi * A Global Broker will republish a message only once. It will record the message identifier (``id``) (as defined in the WIS2 Notification Message) of messages already published and will discard subsequent identical messages (those with the same message ``id``). This is the anti-loop feature of the Global Broker. * When publishing a message to the local broker, the metric ``wmo_wis2_gb_messages_published_total`` will be increased by 1. * All above-defined metrics will be made available on HTTPS endpoints that the Global Monitor will ingest from regularly. -* As a convention, the Global Broker centre-id will be ``tld-{centre-name}-global-broker``. +* As a convention, the Global Broker centre-id will be ``{tld}-{centre-name}-global-broker``. * A Global Broker should operate with a fixed IP address so that WIS2 Nodes can permit access to download resources based on IP address filtering. A Global Broker should also operate with a publicly resolvable Domain Name System (DNS) name pointing to that IP address. The WMO Secretariat must be informed of the IP address and/or hostname and any subsequent changes. ==== 2.7.4 Global Cache @@ -120,7 +120,7 @@ In WIS2, Global Caches provide access to WMO core data for data consumers. This * If core data are not cached on a Global Cache (that is, if the data are flagged as ``"cache": false`` or if the Global Cache decides not to cache these data), the Global Cache shall nevertheless republish the WIS2 Notification Message to the ``cache/a/wis2/...`` topic. In this case, the message id will be changed, and the rest of the message will not be modified. * A Global Cache should operate with a fixed IP address so that WIS2 Nodes can permit access to download resources based on IP address filtering. A Global Cache should also operate with a publicly resolvable DNS name pointing to that IP address. The WMO Secretariat must be informed of the IP address and/or hostname, and any subsequent changes. * A Global Cache should validate the integrity of the resources it caches and only accept data that match the integrity value from the WIS2 Notification Message. If the WIS2 Notification Message does not contain an integrity value, the Global Cache should accept the data as valid. In this case, the Global Cache may add an integrity value to the message it republishes. -* As a convention, the Global Cache centre-id will be ``tld-{centre-name}-global-cache``. +* As a convention, the Global Cache centre-id will be ``{tld}-{centre-name}-global-cache``. ===== 2.7.4.2 Practices and procedures @@ -138,6 +138,7 @@ In WIS2, Global Caches provide access to WMO core data for data consumers. This **** If the message contains an integrity value for the data, verify the integrity of the data; **** If data is downloaded successfully, move the data to the HTTP endpoint of the Global Cache; **** Wait until the data becomes available at the endpoint; +**** Add the property ``properties.global-cache`` with the value of the centre identifier of the Global Cache to identify the origin of the data source downloaded by downstream applications; **** Modify the message identifier and the canonical link's ``href`` of the received message and leave all other fields untouched; **** Republish the modified message to topic ``cache/a/wis2/...`` ,matching the ``+/a/wis2/...`` where the original message has been received; **** The metric ``wmo_wis2_gc_downloaded_total`` will be increased by 1; The metric ``wmo_wis2_gc_dataserver_last_download_timestamp_seconds`` will be updated with the timestamp (in seconds) of the last successful download from the WIS2 Node or Global Cache; @@ -156,12 +157,12 @@ In WIS2, Global Caches provide access to WMO core data for data consumers. This ===== 2.7.5.1 Technical considerations * The Global Discovery Catalogue provides data consumers with a mechanism for discovering and searching for datasets of interest as well as learning how to interact with and find out more information about those datasets. -* The Global Discovery Catalogue implements the OGC API – Records – Part 1: Core standardfootnote:[See OGC-API Records - Part 1 https://docs.ogc.org/DRAFTS/20-004.html.], adhering to the following conformance classes and their dependencies: +* The Global Discovery Catalogue implements the OGC API – Records – Part 1: Core standardfootnote:[See OGC-API Records - Part 1 https://docs.ogc.org/is/20-004r1/20-004r1.html.], adhering to the following conformance classes and their dependencies: ** Searchable Catalog (Deployment); ** Searchable Catalog - Sorting (Deployment); ** Searchable Catalog - Filtering (Deployment); -** JSON (Building Block); -** HTML (Building Block). +** JSON (Common Component); +** HTML (Common Component). * The Global Discovery Catalogue will make discovery metadata available via the collection identifier `wis2-discovery-metadata`. * The Global Discovery Catalogue advertises the availability of datasets and how to access them or subscribe to updates. * The Global Discovery Catalogue does not advertise or list the availability of individual data objects that comprise a dataset (that is, data files). @@ -181,13 +182,13 @@ In WIS2, Global Caches provide access to WMO core data for data consumers. This * A Global Discovery Catalogue will generate and store a zip file of all WCMP2 records once a day; this file will be made be accessible via HTTP. The zipfile will include a directory named after the centre-id of the Global Discovery Catalogue containing all WCMP2 records. * A Global Discovery Catalogue will publish a WIS2 Notification Message of its zip file of all WCMP2 records on its centre-id's +metadata+ topic (for example, `origin/a/wis2/centre-id/metadata`, where `centre-id` is the centre identifier of the Global Discovery Catalogue). * A Global Discovery Catalogue may initialize itself (cold start) from a zip file of all WCMP2 records published. -* As a convention, a Global Discovery Catalogue's centre-id will be ``tld-{centre-name}-global-discovery-catalogue``. +* As a convention, a Global Discovery Catalogue's centre-id will be ``{tld}-{centre-name}-global-discovery-catalogue``. -===== 2.7.5.2 Global Discovery Catalogue reference implementation: wis2-gdc +===== 2.7.5.2 Global Discovery Catalogue Reference Implementation: wis2-gdc To provide a Global Discovery Catalogue, Members may use whichever software components they consider most appropriate to comply with the WIS2 technical regulations. -To assist Members in participating in WIS2, a free and open-source Global Discovery Catalogue reference implementation, wis2-gdc, is available for download and use. wis2-gdc builds on mature and robust free and open-source software components that are widely adopted for operational use. +To assist Members in participating in WIS2, a free and open-source Global Discovery Catalogue Reference Implementation, wis2-gdc, is available for download and use. wis2-gdc builds on mature and robust free and open-source software components that are widely adopted for operational use. wis2-gdc provides the functionality required for the Global Discovery Catalogue, including the following technical functions: @@ -210,5 +211,5 @@ wis2-gdc is managed as a free and open source project. Source code, issue tracki * The Global Monitor will collect metrics as defined in the OpenMetrics standard. * The Global Monitor will monitor the "health" (that is, the performance) of components at NCs/DCPCs, as well as Global Services. * The Global Monitor will provide a web-based dashboard that displays the WIS2 system performance and data availability. -* As a convention, the Global Monitor centre-id will be ``tld-{centre-name}-global-monitor``. +* As a convention, the Global Monitor centre-id will be ``{tld}-{centre-name}-global-monitor``. * The main task of the Global Monitor will be to regularly query the metrics provided by the relevant WIS2 entities, aggregate and process the data and then provide the results to the end user in a suitable presentation. diff --git a/guide/sections/part2/operations.adoc b/guide/sections/part2/operations.adoc index bbadcfb0..00890bd1 100644 --- a/guide/sections/part2/operations.adoc +++ b/guide/sections/part2/operations.adoc @@ -277,7 +277,7 @@ harvest and merge these catalogues, creating a global map of the ocean data. IODE harvests all metadata shared by ODIS partners, combines these metadata and creates a knowledge graph, and processes these metadata to export derivative products (for example, diagnostic reports and cloud-optimized data products). -The Ocean InfoHub (OIH) system is IODE's reference implementation of a +The Ocean InfoHub (OIH) system is IODE's Reference Implementation of a discovery system leveraging ODIS. ODIS architecture and tools are free and open-source software (FOSS), with regular releases published for the community. diff --git a/guide/sections/part2/wis2-architecture.adoc b/guide/sections/part2/wis2-architecture.adoc index 7859dbcc..15621ada 100644 --- a/guide/sections/part2/wis2-architecture.adoc +++ b/guide/sections/part2/wis2-architecture.adoc @@ -38,17 +38,17 @@ These roles are outlined below. ==== 2.2.3 Global Service operator * To ensure highly available global data exchange, a WIS centre may operate one or more Global Services: - i) The Global Discovery Catalogue enables users to search all datasets provided by data publishers and discover where and how to interact with those datasets (for example, to subscribe to updates, to access/download/visualize data, to access more detailed information about the dataset); - ii) A Global Broker provides highly available messaging services through which users may subscribe to notifications about all datasets provided by data publishers; - iii) A Global Cache provides a highly available download service for cached copies of core data downloaded from data publishers’ web services; - iv) A Global Monitor gathers and displays system performance, data availability, and other metrics from all WIS2 Nodes and Global Services. + i) The Global Discovery Catalogue enables users to search all datasets provided by data publishers and discover where and how to interact with those datasets (for example, to subscribe to updates, to access/download/visualize data, to access more detailed information about the dataset); + ii) A Global Broker provides highly available messaging services through which users may subscribe to notifications about all datasets provided by data publishers; + iii) A Global Cache provides a highly available download service for cached copies of core data downloaded from data publishers’ web services; + iv) A Global Monitor gathers and displays system performance, data availability, and other metrics from all WIS2 Nodes and Global Services. ==== 2.2.4 Data consumer * This role represents anyone wanting to find, access, and use data from WIS2. Examples include NMHSs, government agencies, research institutions, private sector organizations, and so forth. * Data consumers search or browse a Global Discovery Catalogue (or another search engine) to discover the datasets that meet their needs ("datasets of interest"). -* Data consumers subscribe via a Global Broker to receive notification messages about the availability of data or metadata associated with their datasets of interest. -* Data consumers determine whether the data or metadata referenced in the notification messages are required. -* Data consumers download data from a Global Cache or WIS2 Node. +* Data consumers subscribe via a Global Broker to receive notification messages about the availability of data or metadata associated with their datasets of interest. +* Data consumers determine whether the data or metadata referenced in the notification messages are required. +* Data consumers download data from a Global Cache or WIS2 Node. === 2.3 WIS2 specifications diff --git a/guide/sections/part2/wis2node.adoc b/guide/sections/part2/wis2node.adoc index a14a0028..8dc5c448 100644 --- a/guide/sections/part2/wis2node.adoc +++ b/guide/sections/part2/wis2node.adoc @@ -93,11 +93,11 @@ A WIS2 Node must be able to publish datasets and compliant discovery metadata. T If contacted by a Global Monitor for a performance issue via a GISC, the WIS2 Node should provide metrics to the GISC and the Global Monitor when service is restored to inform them of the resolution of the issue. -==== 2.6.3 WIS2 Node reference implementation: WIS2 in a box +==== 2.6.3 WIS2 Node Reference Implementation: WIS2 in a box When providing a WIS2 Node, Members may use whichever software components they consider most appropriate to comply with the WIS2 technical regulations. -To assist Members, a free and open-source reference implementation called “WIS2 in a box” (wis2box) is available. wis2box implements the requirements for a WIS2 Node and contains additional enhancements. wis2box is built free and open-source software components that are mature, robust and widely adopted for operational use. +To assist Members, a free and open-source Reference Implementation called “WIS2 in a box” (wis2box) is available. wis2box implements the requirements for a WIS2 Node and contains additional enhancements. wis2box is built free and open-source software components that are mature, robust and widely adopted for operational use. wis2box provides the functionality required for both data publisher and data consumer roles, as well as the following technical functions: From f5761039f710be5ec272f18a415cc21a035223a7 Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Fri, 6 Feb 2026 12:50:36 -0500 Subject: [PATCH 8/8] add clarification on use of HTTP status codes for GC Technical considerations (#230) --- guide/sections/part2/global-services.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/guide/sections/part2/global-services.adoc b/guide/sections/part2/global-services.adoc index 3dd9bbe5..82d48360 100644 --- a/guide/sections/part2/global-services.adoc +++ b/guide/sections/part2/global-services.adoc @@ -148,6 +148,7 @@ In WIS2, Global Caches provide access to WMO core data for data consumers. This * If the Global Cache is not able to download the data, the metric ``wmo_wis2_gc_downloaded_error_total`` will be increased by 1. * A Global Cache shall provide the metric defined in this Guide at an HTTP endpoint. * A Global Cache should make sure that data are downloaded in parallel and that downloads are not blocking each other. +* A Global Cache will implement https://datatracker.ietf.org/doc/html/rfc2616#section-10[Status Code Definitions] as defined by the https://datatracker.ietf.org/doc/html/rfc2616[HTTP specification]. * The metric ``wmo_wis2_gc_dataserver_status_flag`` will reflect the status of the connection to the download endpoint of the centre. Its value will be 1 when the endpoint is up and 0 otherwise. * The metric ``wmo_wis2_gc_last_metadata_timestamp_seconds`` will reflect the datetime (as a timestamp, the number of seconds since the UNIX epoch) of the last metadata resource processed by a given centre.