From bee50db5e0b8a0ff413adc7b276374ee378f7319 Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Thu, 30 May 2024 11:07:17 -0400 Subject: [PATCH] bootstrap --- .github/workflows/flake8.yml | 24 +++ .gitignore | 136 ++++++++++++ LICENSE | 201 ++++++++++++++++++ Makefile | 54 +++++ README.md | 141 +++++++++++- docker-compose.dev.yml | 29 +++ docker-compose.override.yml | 25 +++ docker-compose.yml | 100 +++++++++ docs/architecture/README.md | 11 + docs/architecture/c4.container.png | Bin 0 -> 154528 bytes wis2-grep-api/Dockerfile | 38 ++++ wis2-grep-api/app.py | 35 +++ wis2-grep-api/docker/entrypoint.sh | 83 ++++++++ wis2-grep-api/docker/wis2-grep-api.yml | 101 +++++++++ wis2-grep-management/Dockerfile | 51 +++++ wis2-grep-management/MANIFEST.in | 1 + wis2-grep-management/README.md | 3 + wis2-grep-management/docker/entrypoint.sh | 34 +++ wis2-grep-management/docker/pywis-pubsub.yml | 12 ++ .../docker/wis2-grep-management.cron | 1 + wis2-grep-management/requirements-backend.txt | 2 + wis2-grep-management/requirements-dev.txt | 3 + wis2-grep-management/requirements.txt | 2 + wis2-grep-management/setup.py | 109 ++++++++++ wis2-grep-management/wis2_grep/__init__.py | 39 ++++ .../wis2_grep/backend/__init__.py | 29 +++ .../wis2_grep/backend/base.py | 77 +++++++ .../wis2_grep/backend/elastic.py | 170 +++++++++++++++ .../wis2_grep/backend/ogcapi_features.py | 69 ++++++ wis2-grep-management/wis2_grep/env.py | 58 +++++ wis2-grep-management/wis2_grep/hook.py | 39 ++++ wis2-grep-management/wis2_grep/loader.py | 145 +++++++++++++ wis2-grep.env | 9 + 33 files changed, 1830 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/flake8.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 docker-compose.dev.yml create mode 100644 docker-compose.override.yml create mode 100644 docker-compose.yml create mode 100644 docs/architecture/README.md create mode 100644 docs/architecture/c4.container.png create mode 100644 wis2-grep-api/Dockerfile create mode 100644 wis2-grep-api/app.py create mode 100644 wis2-grep-api/docker/entrypoint.sh create mode 100644 wis2-grep-api/docker/wis2-grep-api.yml create mode 100644 wis2-grep-management/Dockerfile create mode 100644 wis2-grep-management/MANIFEST.in create mode 100644 wis2-grep-management/README.md create mode 100755 wis2-grep-management/docker/entrypoint.sh create mode 100644 wis2-grep-management/docker/pywis-pubsub.yml create mode 100644 wis2-grep-management/docker/wis2-grep-management.cron create mode 100644 wis2-grep-management/requirements-backend.txt create mode 100644 wis2-grep-management/requirements-dev.txt create mode 100644 wis2-grep-management/requirements.txt create mode 100644 wis2-grep-management/setup.py create mode 100644 wis2-grep-management/wis2_grep/__init__.py create mode 100644 wis2-grep-management/wis2_grep/backend/__init__.py create mode 100644 wis2-grep-management/wis2_grep/backend/base.py create mode 100644 wis2-grep-management/wis2_grep/backend/elastic.py create mode 100644 wis2-grep-management/wis2_grep/backend/ogcapi_features.py create mode 100644 wis2-grep-management/wis2_grep/env.py create mode 100644 wis2-grep-management/wis2_grep/hook.py create mode 100644 wis2-grep-management/wis2_grep/loader.py create mode 100644 wis2-grep.env diff --git a/.github/workflows/flake8.yml b/.github/workflows/flake8.yml new file mode 100644 index 0000000..dba15fe --- /dev/null +++ b/.github/workflows/flake8.yml @@ -0,0 +1,24 @@ +name: flake8 + +on: + [ push, pull_request ] + +jobs: + flake8_py3: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v3 + name: setup Python + with: + python-version: 3.8 + - name: Checkout pywis-pubsub + uses: actions/checkout@master + - name: Install flake8 + run: pip install flake8 + - name: Run flake8 + uses: suo/flake8-github-action@releases/v1 + with: + checkName: 'flake8_py3' # NOTE: this needs to be the same as the job name + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1080ea9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,136 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# wis2-grep +local.env +local.yml + +# architecture diagram backups +*.bkp diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ea77198 --- /dev/null +++ b/Makefile @@ -0,0 +1,54 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +DOCKER_COMPOSE_ARGS=--project-name wis2-grep --file docker-compose.yml --file docker-compose.override.yml + +build: + docker compose $(DOCKER_COMPOSE_ARGS) build + +up: + docker compose $(DOCKER_COMPOSE_ARGS) up --detach + +dev: + docker compose $(DOCKER_COMPOSE_ARGS) --file docker-compose.dev.yml up + +login: + docker exec -it wis2-grep-management /bin/bash + +down: + docker compose $(DOCKER_COMPOSE_ARGS) down + +restart: down up + +force-build: + docker compose $(DOCKER_COMPOSE_ARGS) build --no-cache + +logs: + docker compose $(DOCKER_COMPOSE_ARGS) logs --follow + +clean: + docker system prune -f + docker volume prune -f + +rm: + docker volume rm $(shell docker volume ls --filter name=wis2-grep -q) + +.PHONY: build up dev login down restart force-build logs rm clean diff --git a/README.md b/README.md index 158bfd2..45c68fd 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,141 @@ +[![flake8](https://github.com/wmo-im/wis2-grep/workflows/flake8/badge.svg)](https://github.com/wmo-im/wis2-grep/actions) + # wis2-grep -WIS2 Global Replay Service Reference Implementation + +wis2-grep is a Reference Implementation of a WIS2 Global Replay Service. + +WIS2 Global Replay Service C4 component diagram + +## Workflow + +- connects to a WIS2 Global Broker, subscribed to the following topic: + - `origin/a/wis2/#` +- on notification messages + - publish to a WIS2 Global Replay Service (OGC API - Features) using one of the supported transaction backends: + - [OGC API - Features - Part 4: Create, Replace, Update and Delete](https://docs.ogc.org/DRAFTS/20-002.html) + - Elasticsearch direct (default) + +## Installation + +### Requirements +- Python 3 +- [virtualenv](https://virtualenv.pypa.io) + +### Dependencies +Dependencies are listed in [requirements.txt](requirements.txt). Dependencies +are automatically installed during pywis-pubsub installation. + +### Installing wis2-grep + +```bash +# setup virtualenv +python3 -m venv --system-site-packages wis2-grep +cd wis2-grep +source bin/activate + +# clone codebase and install +git clone https://github.com/wmo-im/wis2-grep.git +cd wis2-grep-management +python3 setup.py install +``` + +## Running + +```bash +# setup environment and configuration +cp wis2-grep.env local.env +vim local.env # update accordingly + +source local.env + +# setup pywis-pubsub - sync WIS2 notification schema +pywis-pubsub schema sync + +# setup backend +wis2-grep setup + +# teardown backend +wis2-grep teardown + +# connect to Global Broker +# notifications will automatically trigger wis2-grep to publish +# WNM to the API identified in wis2-grep.env (WIS2_GREP_GB) +pywis-pubsub subscribe --config pywis-pubsub.yml + +# loading notification messsage manually (single file) +wis2-grep register /path/to/wnm-file.json + +# loading notification messages manually (directory of .json files) +wis2-grep load /path/to/dir/of/wnm-files +``` + +### Docker + +The Docker setup uses Docker and Docker Compose to manage the following services: + +- **wis2-grep-api**: API powered by [pygeoapi](https://pygeoapi.io) +- **wis2-grep-management**: management service to publish notification messages published from a WIS2 Global Broker instance + - the default Global Broker connection is to NOAA. This can be modified in `wis2-grep.env` to point to a different Global Broker +- ** wis2-grep-backend**: API search engine backend (default Elasticsearch) + +See [`wis2-grep.env`](wis2-grep.env) for default environment variable settings. + +To adjust service ports, edit [`docker-compose.override.yml`](docker-compose.override.yml) accordingly. + +The [`Makefile`](Makefile) in the root directory provides options to manage the Docker Compose setup. + +```bash +# build all images +make build + +# build all images (no cache) +make force-build + +# start all containers +make up + +# start all containers in dev mode +make dev + +# view all container logs in realtime +make logs + +# login to the wis2-grep-management container +make login + +# restart all containers +make restart + +# shutdown all containers +make down + +# remove all volumes +make rm +``` + +## Development + +### Running Tests + +```bash +# install dev requirements +pip3 install -r requirements-dev.txt + +# run tests like this: +python3 tests/run_tests.py + +# or this: +python3 setup.py test +``` + +### Code Conventions + +* [PEP8](https://www.python.org/dev/peps/pep-0008) + +### Bugs and Issues + +All bugs, enhancements and issues are managed on [GitHub](https://github.com/wmo-im/wis2-grep/issues). + +## Contact + +* [Tom Kralidis](https://github.com/tomkralidis) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..9756662 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,29 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +services: + wis2-grep-backend: + ports: + - 9200:9200 + wis2-grep-management: + volumes: + - wis2-grep-management-data:/data + - ./wis2-grep-management/wis2_grep:/app/wis2_grep diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 0000000..95a4594 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,25 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +services: + wis2-grep-api: + ports: + - 80:80 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..34e186f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,100 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +services: + wis2-grep-backend: + container_name: wis2-grep-backend + image: docker.elastic.co/elasticsearch/elasticsearch:8.6.2 + restart: always + environment: + - discovery.type=single-node + - discovery.seed_hosts=[] + - node.name=elasticsearch-01 + - bootstrap.memory_lock=true + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + - cluster.name=es-wis2-grep + - xpack.security.enabled=false + mem_limit: 1.5g + memswap_limit: 1.5g + volumes: + - wis2-grep-backend-data:/usr/share/elasticsearch/data:rw + # ulimits: + # nofile: + # soft: 524288 + # hard: 524288 + # memlock: + # soft: -1 + # hard: -1 + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9200"] + interval: 5s + retries: 100 + networks: + - wis2-grep-net + + wis2-grep-management: + container_name: wis2-grep-management + build: + context: ./wis2-grep-management/ + env_file: + - wis2-grep.env + environment: + - WIS2_GREP_API_URL_DOCKER=http://wis2-grep-api + depends_on: + wis2-grep-backend: + condition: service_healthy + healthcheck: + test: ["CMD", "curl", "-f", "http://wis2-grep-backend:9200/wis2-notification-messages"] + interval: 5s + retries: 3 + volumes: + - wis2-grep-management-data:/data + restart: always + command: ["pywis-pubsub", "subscribe", "--config", "/app/docker/pywis-pubsub.yml", "--verbosity", "DEBUG"] + networks: + - wis2-grep-net + + wis2-grep-api: + container_name: wis2-grep-api + build: + context: ./wis2-grep-api/ + image: geopython/pygeoapi:latest + depends_on: + wis2-grep-management: + condition: service_healthy + volumes: + - wis2-grep-management-data:/data + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost/conformance"] + interval: 5s + retries: 3 + env_file: + - wis2-grep.env + restart: unless-stopped + networks: + - wis2-grep-net + +volumes: + wis2-grep-backend-data: + wis2-grep-management-data: + +networks: + wis2-grep-net: diff --git a/docs/architecture/README.md b/docs/architecture/README.md new file mode 100644 index 0000000..81325e7 --- /dev/null +++ b/docs/architecture/README.md @@ -0,0 +1,11 @@ +# Architecture diagrams + +The architecture diagrams in this directory are designed using the [C4 model](https://c4model.com) for visualising software architecture. + +The diagrams are saved as an editable `.png` file, for easy default viewing on GitHub, showing the last active diagram when saved. Any PNG +viewer will also render the diagram in the same way. + +The diagrams can be updated using [diagrams.net](https://diagrams.net) in the following manner: + +- open files on this GitHub repository directly in diagrams.net +- clone this repository, edit/save using the diagrams.net desktop application ([download](https://github.com/jgraph/drawio-desktop/releases)), and commit/push files to GitHub diff --git a/docs/architecture/c4.container.png b/docs/architecture/c4.container.png new file mode 100644 index 0000000000000000000000000000000000000000..2713a31ef3142789cc6787189a71ab1564f742f1 GIT binary patch literal 154528 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�`rEOp=gV1GQU!t*Z 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 literal 0 HcmV?d00001 diff --git a/wis2-grep-api/Dockerfile b/wis2-grep-api/Dockerfile new file mode 100644 index 0000000..0ec43e0 --- /dev/null +++ b/wis2-grep-api/Dockerfile @@ -0,0 +1,38 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +FROM geopython/pygeoapi:latest + +LABEL maintainer="Tom Kralidis " + +ENV PYGEOAPI_CONFIG=/pygeoapi/local.config.yml +ENV PYGEOAPI_OPENAPI=/pygeoapi/local.openapi.yml + +RUN apt-get update && \ + apt-get install -y curl + +COPY ./app.py /pygeoapi/pygeoapi/app.py +COPY ./docker/wis2-grep-api.yml /pygeoapi/local.config.yml +COPY ./docker/entrypoint.sh /app/docker/wis2-grep-api/entrypoint.sh + +RUN chmod +x /app/docker/wis2-grep-api/entrypoint.sh + +ENTRYPOINT [ "/app/docker/wis2-grep-api/entrypoint.sh" ] diff --git a/wis2-grep-api/app.py b/wis2-grep-api/app.py new file mode 100644 index 0000000..3905bc0 --- /dev/null +++ b/wis2-grep-api/app.py @@ -0,0 +1,35 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +from flask import Flask +from pygeoapi.flask_app import BLUEPRINT as pygeoapi_blueprint + + +app = Flask(__name__, static_url_path='/static') +app.url_map.strict_slashes = False + +app.register_blueprint(pygeoapi_blueprint, url_prefix='/') + +try: + from flask_cors import CORS + CORS(app) +except ImportError: # CORS needs to be handled by upstream server + pass diff --git a/wis2-grep-api/docker/entrypoint.sh b/wis2-grep-api/docker/entrypoint.sh new file mode 100644 index 0000000..32855e0 --- /dev/null +++ b/wis2-grep-api/docker/entrypoint.sh @@ -0,0 +1,83 @@ +#!/bin/bash +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +# pygeoapi entry script + +echo "START /entrypoint.sh" + +set +e + +# gunicorn env settings with defaults +SCRIPT_NAME="/" +CONTAINER_NAME="wis2-grep-api" +CONTAINER_HOST=${CONTAINER_HOST:=0.0.0.0} +CONTAINER_PORT=${CONTAINER_PORT:=80} +WSGI_WORKERS=${WSGI_WORKERS:=4} +WSGI_WORKER_TIMEOUT=${WSGI_WORKER_TIMEOUT:=6000} +WSGI_WORKER_CLASS=${WSGI_WORKER_CLASS:=gevent} + +# What to invoke: default is to run gunicorn server +entry_cmd=${1:-run} + +# Shorthand +function error() { + echo "ERROR: $@" + exit -1 +} + +# Workdir +cd /pygeoapi + +# Lock all Python files (for gunicorn hot reload) +find . -type f -name "*.py" | xargs chmod -R 0444 + +echo "Trying to generate OpenAPI document" +pygeoapi openapi generate ${PYGEOAPI_CONFIG} --output-file ${PYGEOAPI_OPENAPI} + +[[ $? -ne 0 ]] && error "ERROR: OpenAPI document could not be generated" + +echo "openapi.yml generated continue to pygeoapi" + +case ${entry_cmd} in + # Run pygeoapi server + run) + # SCRIPT_NAME should not have value '/' + [[ "${SCRIPT_NAME}" = '/' ]] && export SCRIPT_NAME="" && echo "make SCRIPT_NAME empty from /" + + echo "Start gunicorn name=${CONTAINER_NAME} on ${CONTAINER_HOST}:${CONTAINER_PORT} with ${WSGI_WORKERS} workers and SCRIPT_NAME=${SCRIPT_NAME}" + exec gunicorn --workers ${WSGI_WORKERS} \ + --worker-class=${WSGI_WORKER_CLASS} \ + --timeout ${WSGI_WORKER_TIMEOUT} \ + --name=${CONTAINER_NAME} \ + --bind ${CONTAINER_HOST}:${CONTAINER_PORT} \ + --reload \ + --reload-extra-file ${PYGEOAPI_CONFIG} \ + pygeoapi.app:app \ + --access-logfile '-' + ;; + *) + error "unknown command arg: must be run (default)" + ;; +esac + +echo "END /entrypoint.sh" + diff --git a/wis2-grep-api/docker/wis2-grep-api.yml b/wis2-grep-api/docker/wis2-grep-api.yml new file mode 100644 index 0000000..33d00a0 --- /dev/null +++ b/wis2-grep-api/docker/wis2-grep-api.yml @@ -0,0 +1,101 @@ +server: + bind: + host: 0.0.0.0 + port: 5000 + url: ${WIS2_GREP_API_URL} + mimetype: application/json; charset=UTF-8 + encoding: utf-8 + language: en-US + cors: true + pretty_print: true + limit: 10 + # templates: /path/to/templates + map: + url: https://tile.openstreetmap.org/{z}/{x}/{y}.png + attribution: 'Map data © OpenStreetMap contributors' + +logging: + level: ${WIS2_GREP_LOGGING_LEVEL} + #logfile: /tmp/pygeoapi.log + +metadata: + identification: + title: WMO WIS2 Global Replay instance + description: WMO WIS2 Global Replay instance + keywords: + - wmo + - wis2 + - replay + - notifications + keywords_type: theme + terms_of_service: https://creativecommons.org/licenses/by/4.0 + url: https://github.com/wmo-im/wis2-grep + license: + name: CC-BY 4.0 license + url: https://creativecommons.org/licenses/by/4.0 + provider: + name: WIS2 Global Replay Service API provider name + url: https://github.com/wmo-im/wis2-grep + contact: + name: Firstname Lastname + position: Position name + address: Mailing Address + city: City + stateorprovince: Administrative Area + postalcode: Zip or Postal Code + country: Country + phone: +xx-xxx-xxx-xxxx + fax: +xx-xxx-xxx-xxxx + email: pygeoapi@lists.osgeo.org + url: https://github.com/wmo-im/wis2-grep + hours: Mo-Fr 08:00-17:00 + instructions: During hours of service. Off on weekends. + role: pointOfContact + +resources: + wis2-notification-messages: + type: collection + title: WIS2 notification messages + description: WIS2 notification messages + keywords: [wmo, wis2, notifications] + crs: + - CRS84 + links: + - type: application/geo+json + rel: items + title: Notifications from Météo-France, Global Broker Service + href: mqtts://everyone:everyone@globalbroker.meteo.fr:8883 + channel: 'origin/a/wis2/#' + length: -1 + - type: application/geo+json + rel: items + title: Notifications from China Meteorological Agency, Global Broker Service + href: mqtts://everyone:everyone@gb.wis.cma.cn:8883 + channel: 'origin/a/wis2/#' + length: -1 + - type: application/geo+json + rel: items + title: Notifications from National Oceanic and Atmospheric Administration, National Weather Service, Global Broker Service + href: mqtts://everyone:everyone@wis2globalbroker.nws.noaa.gov:8883 + channel: 'origin/a/wis2/#' + length: -1 + - type: application/geo+json + rel: items + title: Notifications from Instituto Nacional de Meteorologia (Brazil), Global Broker Service + href: mqtts://everyone:everyone@globalbroker.inmet.gov.br:8883 + channel: 'origin/a/wis2/#' + length: -1 + - type: text/html + rel: canonical + title: WMO Information System (WIS) | World Meteorological Organization + href: https://community.wmo.int/en/activity-areas/wis + extents: + spatial: + bbox: [-180, -90, 180, 90] + crs: http://www.opengis.net/def/crs/OGC/1.3/CRS84 + providers: + - type: feature + name: ${WIS2_GREP_BACKEND_TYPE} + data: ${WIS2_GREP_BACKEND_CONNECTION} + id_field: id + time_field: pubtime diff --git a/wis2-grep-management/Dockerfile b/wis2-grep-management/Dockerfile new file mode 100644 index 0000000..4d83ba7 --- /dev/null +++ b/wis2-grep-management/Dockerfile @@ -0,0 +1,51 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +FROM ubuntu:focal + +LABEL maintainer="tomkralidis@gmail.com" + +ENV TZ="Etc/UTC" \ + DEBIAN_FRONTEND="noninteractive" \ + DEBIAN_PACKAGES="bash cron curl git python3-pip python3-setuptools vim" + +# copy the app +COPY ./ /app + +# add to crontab +COPY ./docker/wis2-grep-management.cron /etc/cron.d/wis2-grep-management.cron + +RUN apt-get update -y && \ + # install dependencies + apt-get install -y ${DEBIAN_PACKAGES} && \ + pip3 install --no-cache-dir -r /app/requirements-backend.txt && \ + # install wis2-grep + cd /app && \ + pip3 install -e . && \ + chmod +x /app/docker/entrypoint.sh && \ + # cleanup + apt autoremove -y && \ + apt-get -q clean && \ + rm -rf /var/lib/apt/lists/* && \ + chmod 0644 /etc/cron.d/wis2-grep-management.cron && \ + crontab /etc/cron.d/wis2-grep-management.cron + +ENTRYPOINT [ "/app/docker/entrypoint.sh" ] diff --git a/wis2-grep-management/MANIFEST.in b/wis2-grep-management/MANIFEST.in new file mode 100644 index 0000000..b2cc4f5 --- /dev/null +++ b/wis2-grep-management/MANIFEST.in @@ -0,0 +1 @@ +include README.md LICENSE requirements.txt diff --git a/wis2-grep-management/README.md b/wis2-grep-management/README.md new file mode 100644 index 0000000..4fe4fbc --- /dev/null +++ b/wis2-grep-management/README.md @@ -0,0 +1,3 @@ +# wis2-grep -management + +Python package to perform WIS2 Global Replay Service management functions. diff --git a/wis2-grep-management/docker/entrypoint.sh b/wis2-grep-management/docker/entrypoint.sh new file mode 100755 index 0000000..89ce1cb --- /dev/null +++ b/wis2-grep-management/docker/entrypoint.sh @@ -0,0 +1,34 @@ +#!/bin/bash +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +# wis2-grep entry script + +echo "START /entrypoint.sh" + +echo "Caching WNM schema" +pywis-pubsub schema sync + +echo "Setting up notification message backend" +wis2-grep setup --yes + +echo "END /entrypoint.sh" +exec "$@" diff --git a/wis2-grep-management/docker/pywis-pubsub.yml b/wis2-grep-management/docker/pywis-pubsub.yml new file mode 100644 index 0000000..31b819c --- /dev/null +++ b/wis2-grep-management/docker/pywis-pubsub.yml @@ -0,0 +1,12 @@ +broker: ${WIS2_GREP_GB} + +subscribe_topics: + - ${WIS2_GREP_GB_TOPIC} + +qos: 1 + +verify_data: false + +validate_message: false + +hook: wis2_grep.hook.NotificationMessageHook diff --git a/wis2-grep-management/docker/wis2-grep-management.cron b/wis2-grep-management/docker/wis2-grep-management.cron new file mode 100644 index 0000000..2878605 --- /dev/null +++ b/wis2-grep-management/docker/wis2-grep-management.cron @@ -0,0 +1 @@ +19 * * * * su -c "wis2-grep clean" > /proc/1/fd/1 2>/proc/1/fd/2 diff --git a/wis2-grep-management/requirements-backend.txt b/wis2-grep-management/requirements-backend.txt new file mode 100644 index 0000000..c1cfe6b --- /dev/null +++ b/wis2-grep-management/requirements-backend.txt @@ -0,0 +1,2 @@ +elasticsearch +OWSLib diff --git a/wis2-grep-management/requirements-dev.txt b/wis2-grep-management/requirements-dev.txt new file mode 100644 index 0000000..ff3303f --- /dev/null +++ b/wis2-grep-management/requirements-dev.txt @@ -0,0 +1,3 @@ +flake8 +twine +wheel diff --git a/wis2-grep-management/requirements.txt b/wis2-grep-management/requirements.txt new file mode 100644 index 0000000..6963e06 --- /dev/null +++ b/wis2-grep-management/requirements.txt @@ -0,0 +1,2 @@ +click +pywis-pubsub diff --git a/wis2-grep-management/setup.py b/wis2-grep-management/setup.py new file mode 100644 index 0000000..c1f161d --- /dev/null +++ b/wis2-grep-management/setup.py @@ -0,0 +1,109 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +from pathlib import Path +import re +from setuptools import Command, find_packages, setup +import sys + + +class PyTest(Command): + user_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + import subprocess + errno = subprocess.call([sys.executable, 'tests/run_tests.py']) + raise SystemExit(errno) + + +def read(filename, encoding='utf-8'): + """read file contents""" + + fullpath = Path(__file__).resolve().parent / filename + + with fullpath.open() as fh: + contents = fh.read().strip() + return contents + + +def get_package_version(): + """get version from top-level package init""" + version_file = read('wis2_grep/__init__.py') + version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", + version_file, re.M) + if version_match: + return version_match.group(1) + raise RuntimeError('Unable to find version string.') + + +LONG_DESCRIPTION = read('README.md') + +DESCRIPTION = 'wis2-grep is a Reference Implementation of a WIS2 Global Replay Service' # noqa + +MANIFEST = Path('MANIFEST') + +if MANIFEST.exists(): + MANIFEST.unlink() + + +setup( + name='wis2-grep', + version=get_package_version(), + description=DESCRIPTION.strip(), + long_description=LONG_DESCRIPTION, + long_description_content_type='text/markdown', + license='Apache Software License', + platforms='all', + keywords=' '.join([ + 'WIS2', + 'Global Replace Service', + 'notifications' + ]), + author='Tom Kralidis', + author_email='tomkralidis@gmail.com', + maintainer='Tom Kralidis', + maintainer_email='tomkraldis@gmail.com', + url='https://github.com/wmo-im/wis2-grep', + install_requires=read('requirements.txt').splitlines(), + packages=find_packages(), + include_package_data=True, + entry_points={ + 'console_scripts': [ + 'wis2-grep=wis2_grep:cli' + ] + }, + classifiers=[ + 'Development Status :: 4 - Beta', + 'Environment :: Console', + 'Intended Audience :: Developers', + 'Intended Audience :: Science/Research', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: OS Independent', + 'Programming Language :: Python' + ], + cmdclass={'test': PyTest} +) diff --git a/wis2-grep-management/wis2_grep/__init__.py b/wis2-grep-management/wis2_grep/__init__.py new file mode 100644 index 0000000..72f2efd --- /dev/null +++ b/wis2-grep-management/wis2_grep/__init__.py @@ -0,0 +1,39 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +import click + +from wis2_grep.loader import load, setup, teardown + +__version__ = '0.1.dev0' + + +@click.group() +@click.version_option(version=__version__) +def cli(): + """WIS2 Replace Service management utilities""" + + pass + + +cli.add_command(setup) +cli.add_command(teardown) +cli.add_command(load) diff --git a/wis2-grep-management/wis2_grep/backend/__init__.py b/wis2-grep-management/wis2_grep/backend/__init__.py new file mode 100644 index 0000000..763e217 --- /dev/null +++ b/wis2-grep-management/wis2_grep/backend/__init__.py @@ -0,0 +1,29 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +from wis2_grep.backend.elastic import ElasticsearchBackend +from wis2_grep.backend.ogcapi_features import OGCAPIFeaturesBackend + + +BACKENDS = { + 'Elasticsearch': ElasticsearchBackend, + 'OGCAPIFeatures': OGCAPIFeaturesBackend +} diff --git a/wis2-grep-management/wis2_grep/backend/base.py b/wis2-grep-management/wis2_grep/backend/base.py new file mode 100644 index 0000000..26631de --- /dev/null +++ b/wis2-grep-management/wis2_grep/backend/base.py @@ -0,0 +1,77 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +from abc import ABC, abstractmethod +import logging + +LOGGER = logging.getLogger(__name__) + + +class BaseBackend(ABC): + def __init__(self, defs): + self.defs = defs + + @abstractmethod + def setup(self) -> None: + """ + Setup a backend + + :returns: `None` + """ + + raise NotImplementedError() + + @abstractmethod + def teardown(self) -> None: + """ + Tear down a backend + + :returns: `None` + """ + + raise NotImplementedError() + + @abstractmethod + def save(self, record: dict) -> None: + """ + Upsert a resource to a backend + + :param payload: `dict` of resource + + :returns: `None` + """ + + raise NotImplementedError() + + @abstractmethod + def exists(self, identifier: str) -> bool: + """ + Querying whether a record exists in a backend + + :param identifier: `str` of record identifier + + :returns: `bool` of whether record exists in backend + """ + + raise NotImplementedError() + + def __repr__(self): + return '' diff --git a/wis2-grep-management/wis2_grep/backend/elastic.py b/wis2-grep-management/wis2_grep/backend/elastic.py new file mode 100644 index 0000000..e7d0f0f --- /dev/null +++ b/wis2-grep-management/wis2_grep/backend/elastic.py @@ -0,0 +1,170 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +import logging +from urllib.parse import urlparse + +from elasticsearch import Elasticsearch, NotFoundError + +from wis2_grep.backend.base import BaseBackend + +LOGGER = logging.getLogger(__name__) + + +class ElasticsearchBackend(BaseBackend): + + from urllib.parse import urlparse + from elasticsearch import Elasticsearch + + def __init__(self, defs): + super().__init__(defs) + + # default index settings + self.ES_SETTINGS = { + 'settings': { + 'number_of_shards': 1, + 'number_of_replicas': 0 + }, + 'mappings': { + 'properties': { + 'id': { + 'type': 'text', + 'fields': { + 'raw': { + 'type': 'keyword' + } + } + }, + 'geometry': { + 'type': 'geo_shape' + }, + 'time': { + 'properties': { + 'interval': { + 'type': 'date', + 'null_value': '1850', + 'format': 'year||year_month||year_month_day||date_time||t_time||t_time_no_millis', # noqa + 'ignore_malformed': True + } + } + }, + 'properties': { + 'properties': { + 'type': { + 'type': 'text', + 'fields': { + 'raw': { + 'type': 'keyword' + } + } + }, + 'title': { + 'type': 'text', + 'fields': { + 'raw': { + 'type': 'keyword' + } + } + }, + 'description': { + 'type': 'text', + 'fields': { + 'raw': { + 'type': 'keyword' + } + } + }, + 'wmo:dataPolicy': { + 'type': 'text', + 'fields': { + 'raw': { + 'type': 'keyword' + } + } + } + } + } + } + } + } + + self.url_parsed = urlparse(self.defs.get('connection')) + self.index_name = self.url_parsed.path.lstrip('/') + + url2 = f'{self.url_parsed.scheme}://{self.url_parsed.netloc}' + + if self.url_parsed.port is None: + LOGGER.debug('No port found; trying autodetect') + port = None + if self.url_parsed.scheme == 'http': + port = 80 + elif self.url_parsed.scheme == 'https': + port = 443 + if port is not None: + url2 = f'{self.url_parsed.scheme}://{self.url_parsed.netloc}:{port}' # noqa + + if self.url_parsed.path.count('/') > 1: + LOGGER.debug('ES URL has a basepath') + basepath = self.url_parsed.path.split('/')[1] + self.index_name = self.url_parsed.path.split('/')[-1] + url2 = f'{url2}/{basepath}/' + + LOGGER.debug(f'ES URL: {url2}') + LOGGER.debug(f'ES index: {self.index_name}') + + settings = { + 'hosts': [url2], + 'retry_on_timeout': True, + 'max_retries': 10, + 'timeout': 30 + } + + if self.url_parsed.username and self.url_parsed.password: + settings['http_auth'] = ( + self.url_parsed.username, self.url_parsed.password) + + LOGGER.debug(f'Settings: {settings}') + self.es = Elasticsearch(**settings) + + def setup(self) -> None: + self.teardown() + LOGGER.debug(f'Creating index {self.index_name}') + self.es.indices.create(index=self.index_name, body=self.ES_SETTINGS) + + def teardown(self) -> None: + if self.es.indices.exists(index=self.index_name): + LOGGER.debug(f'Deleting index {self.index_name}') + self.es.indices.delete(index=self.index_name) + + def save(self, record: dict) -> None: + LOGGER.debug(f"Indexing record {record['id']}") + self.es.index(index=self.index_name, id=record['id'], body=record) + + def exists(self, identifier: str) -> bool: + LOGGER.debug(f'Querying Replay API for id {identifier}') + try: + _ = self.es.get(index=self.index_name, id=identifier) + return True + except NotFoundError: + return False + + def __repr__(self): + return '' diff --git a/wis2-grep-management/wis2_grep/backend/ogcapi_features.py b/wis2-grep-management/wis2_grep/backend/ogcapi_features.py new file mode 100644 index 0000000..8d05c38 --- /dev/null +++ b/wis2-grep-management/wis2_grep/backend/ogcapi_features.py @@ -0,0 +1,69 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +import logging +import json + +from owslib.ogcapi.features import Features + +from wis2_grep import env +from wis2_grep.backend.base import BaseBackend + +LOGGER = logging.getLogger(__name__) + + +class OGCAPIFeaturesBackend(BaseBackend): + + def __init__(self, defs): + super().__init__(defs) + + self.conn = Features(env.API_URL) + self.collection = 'notification-messsages' + + def save(self): + + ttype = 'create' + + try: + _ = self.conn.get_collection_item(self.metadata['id']) + ttype = 'update' + except Exception: + pass + + payload = json.dumps(self.metadata) + + if ttype == 'create': + LOGGER.debug('Adding new notification to collection') + _ = self.conn.get_collection_create(self.collection, payload) + elif ttype == 'update': + LOGGER.debug('Updating existing notification in collection') + _ = self.conn.get_collection_update(self.collection, payload) + + def exists(self, identifier: str) -> bool: + LOGGER.debug(f'Querying Replay API for id {identifier}') + try: + _ = self.conn.collection_item(self.collection, identifier) + return True + except RuntimeError: + return False + + def __repr__(self): + return '' diff --git a/wis2-grep-management/wis2_grep/env.py b/wis2-grep-management/wis2_grep/env.py new file mode 100644 index 0000000..46a160c --- /dev/null +++ b/wis2-grep-management/wis2_grep/env.py @@ -0,0 +1,58 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +import os +from typing import Any + + +def str2bool(value: Any) -> bool: + """ + helper function to return Python boolean + type (source: https://stackoverflow.com/a/715468) + + :param value: value to be evaluated + + :returns: `bool` of whether the value is boolean-ish + """ + + value2 = False + + if isinstance(value, bool): + value2 = value + else: + value2 = value.lower() in ('yes', 'true', 't', '1', 'on') + + return value2 + + +API_URL = os.environ.get('WIS2_GREP_API_URL') +API_URL_DOCKER = os.environ.get('WIS2_GREP_API_URL_DOCKER') +BACKEND_TYPE = os.environ.get('WIS2_GREP_BACKEND_TYPE') +BACKEND_CONNECTION = os.environ.get('WIS2_GREP_BACKEND_CONNECTION') +CENTRE_ID = os.environ.get('WIS2_GREP_CENTRE_ID') +GB = os.environ.get('WIS2_GREP_GB') +GB_TOPIC = os.environ.get('WIS2_GREP_GB_TOPIC') + +print(API_URL, API_URL_DOCKER, BACKEND_TYPE, BACKEND_CONNECTION, CENTRE_ID, GB, GB_TOPIC) + +if None in [API_URL, API_URL_DOCKER, BACKEND_TYPE, BACKEND_CONNECTION, + CENTRE_ID, GB, GB_TOPIC]: + raise EnvironmentError('Environment variables not set!') diff --git a/wis2-grep-management/wis2_grep/hook.py b/wis2-grep-management/wis2_grep/hook.py new file mode 100644 index 0000000..0553512 --- /dev/null +++ b/wis2-grep-management/wis2_grep/hook.py @@ -0,0 +1,39 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +import logging + +from pywis_pubsub.hook import Hook + +from wis2_grep.loader import Loader + +LOGGER = logging.getLogger(__name__) + + +class NotificationMessageHook(Hook): + def execute(self, topic: str, msg_dict: dict) -> None: + LOGGER.debug('Notification message hook execution begin') + loader = Loader() + loader.load(msg_dict, topic) + LOGGER.debug('Notification message hook execution end') + + def __repr__(self): + return '' diff --git a/wis2-grep-management/wis2_grep/loader.py b/wis2-grep-management/wis2_grep/loader.py new file mode 100644 index 0000000..1032bcd --- /dev/null +++ b/wis2-grep-management/wis2_grep/loader.py @@ -0,0 +1,145 @@ +############################################################################### +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +############################################################################### + +import json +import logging +from pathlib import Path +from typing import Union + +import click + +from pywis_pubsub import cli_options + +from wis2_grep.backend import BACKENDS +from wis2_grep.env import BACKEND_TYPE, BACKEND_CONNECTION + +LOGGER = logging.getLogger(__name__) + + +class Loader: + def __init__(self): + """ + Initializer + + :returns: `wis2_grep.loader.Loader` + """ + + self.backend = BACKENDS[BACKEND_TYPE]( + {'connection': BACKEND_CONNECTION}) + + def load(self, message: Union[dict, str], topic: str = None) -> None: + """ + Register a notification message + + :param message: `dict` or `str` of notification message + :param topic: `str` of incoming topic (default is `None`) + + :returns: `None` + """ + + if isinstance(message, dict): + LOGGER.debug('Notification message is already a dict') + self.message = message + elif isinstance(message, str): + LOGGER.debug('Notification message is a string; parsing') + try: + self.message = json.loads(message) + except json.decoder.JSONDecodeError as err: + LOGGER.warning(err) + return + + LOGGER.debug('Adding topic to message') + self.message['properties']['topic'] = topic + + LOGGER.debug(f'Notification message: {json.dumps(self.message, indent=4)}') # noqa + + LOGGER.info('Publishing notification message to backend') + self._publish() + + def _publish(self): + """ + Publish notification message from `wis2_grep.loader.Loader.message` + to backend + + :returns: `None` + """ + + LOGGER.info(f'Saving to {BACKEND_TYPE} ({BACKEND_CONNECTION})') + self.backend.save(self.message) + + def __repr__(self): + return '' + + +@click.command() +@click.pass_context +@click.option('--yes', '-y', 'bypass', is_flag=True, default=False, + help='Bypass permission prompts') +@cli_options.OPTION_VERBOSITY +def setup(ctx, bypass, verbosity='NOTSET'): + """Create Global Replay Service backend""" + + if not bypass: + if not click.confirm('Create Global Replay Service backend? This will overwrite existing collections', abort=True): # noqa + return + + backend = BACKENDS[BACKEND_TYPE]({'connection': BACKEND_CONNECTION}) + LOGGER.debug(f'Backend: {backend}') + backend.setup() + + +@click.command() +@click.pass_context +@click.option('--yes', '-y', 'bypass', is_flag=True, default=False, + help='Bypass permission prompts') +@cli_options.OPTION_VERBOSITY +def teardown(ctx, bypass, verbosity='NOTSET'): + """Delete Global Replay Service backend""" + + if not bypass: + if not click.confirm('Delete Global Replay Service backend? This will remove existing collections', abort=True): # noqa + return + + backend = BACKENDS[BACKEND_TYPE]({'connection': BACKEND_CONNECTION}) + LOGGER.debug(f'Backend: {backend}') + backend.teardown() + + +@click.command() +@click.pass_context +@click.argument( + 'path', type=click.Path(exists=True, dir_okay=True, file_okay=True)) +@cli_options.OPTION_VERBOSITY +def load(ctx, path, verbosity='NOTSET'): + """Load notification message""" + + p = Path(path) + + if p.is_file(): + wnms_to_process = [p] + else: + wnms_to_process = p.rglob('*.json') + + for w2p in wnms_to_process: + click.echo(f'Processing {w2p}') + with w2p.open() as fh: + r = Loader() + r.load(fh.read()) diff --git a/wis2-grep.env b/wis2-grep.env new file mode 100644 index 0000000..00a3502 --- /dev/null +++ b/wis2-grep.env @@ -0,0 +1,9 @@ +export WIS2_GREP_LOGGING_LEVEL=DEBUG +export WIS2_GREP_API_URL=http://localhost +export WIS2_GREP_API_URL_DOCKER=http://wis2-grep-api +export WIS2_GREP_BACKEND_TYPE=Elasticsearch +export WIS2_GREP_BACKEND_CONNECTION=http://wis2-grep-backend:9200/wis2-notification-messages +export WIS2_GREP_CENTRE_ID=ca-eccc-msc-global-replay +#export WIS2_GREP_GB=mqtts://everyone:everyone@wis2globalbroker.nws.noaa.gov:8883 +export WIS2_GREP_GB=mqtts://everyone:everyone@globalbroker.meteo.fr:8883 +export WIS2_GREP_GB_TOPIC=origin/a/wis2/#