def _load(self, zk: KazooClient, user_id: str, service_id: str) -> ServiceEntity: raw, stat = zk.get(self._path(user_id=user_id, service_id=service_id)) data = json.loads(raw.decode('utf-8')) if "metadata" in data: metadata = ServiceMetadata.from_dict(data["metadata"]) api_version = data["api_version"] elif "specification" in data: # Old style metadata metadata = ServiceMetadata( id=service_id, process={ "process_graph": data["specification"]["process_graph"] }, type=data["specification"]["type"], configuration={}, url="n/a", enabled=True, attributes={}, created=datetime.utcfromtimestamp(stat.created)) api_version = "0.4.0" else: raise ValueError( "Failed to load metadata (keys: {k!r})".format(k=data.keys())) return ServiceEntity(metadata, api_version)
def _load_metadata(self, zk: KazooClient, service_id: str) -> ServiceMetadata: try: raw, _ = zk.get(self._path(service_id)) except NoNodeError: raise ServiceNotFoundException(service_id) data = json.loads(raw.decode('utf-8')) if "metadata" in data: return ServiceMetadata.from_dict(data["metadata"]) elif "specification" in data: # Old style metadata return ServiceMetadata( id=service_id, process={"process_graph": data["specification"]["process_graph"]}, type=data["specification"]["type"], url="n/a", enabled=True, attributes={} ) else: raise ValueError("Failed to load metadata (keys: {k!r})".format(k=data.keys()))
def test_service_metadata_from_dict_created_date(): service = ServiceMetadata.from_dict({ "id": "badcafe", "process": {"id": "ndvi", "process_graph": {}}, "url": "https://oeo.test/srv/f00b67", "type": "WMTS", "enabled": True, "configuration": {}, "attributes": {}, "created": "2020-05-18T12:34:56Z", }) assert service.created == datetime.datetime(2020, 5, 18, 12, 34, 56)
def _persist(self, zk: KazooClient, user_id: str, metadata: ServiceMetadata, api_version: str): data = { "metadata": metadata.prepare_for_json(), "api_version": api_version } raw = json.dumps(data).encode("utf-8") zk.create(self._path(user_id=user_id, service_id=metadata.id), raw, makepath=True)
def _jsonable_service_metadata(metadata: ServiceMetadata, full=True) -> dict: """API-version-aware conversion of service metadata to jsonable dict""" d = metadata.prepare_for_json() if not full: d.pop("process") d.pop("attributes") if requested_api_version().below("1.0.0"): d["process_graph"] = d.pop("process", {}).get("process_graph") d["parameters"] = d.pop("configuration", None) or ({} if full else None) d["submitted"] = d.pop("created", None) return dict_no_none(**d)
class DummySecondaryServices(SecondaryServices): _registry = [ ServiceMetadata(id="wmts-foo", process={ "process_graph": { "foo": { "process_id": "foo", "arguments": {} } } }, url='https://oeo.net/wmts/foo', type="WMTS", enabled=True, configuration={"version": "0.5.8"}, attributes={}, title="Test service", created=datetime(2020, 4, 9, 15, 5, 8)) ] def _create_service(self, user_id: str, process_graph: dict, service_type: str, api_version: str, configuration: dict) -> str: service_id = 'c63d6c27-c4c2-4160-b7bd-9e32f582daec' return service_id def service_types(self) -> dict: return { "WMTS": { "title": "Web Map Tile Service", "configuration": { "version": { "type": "string", "description": "The WMTS version to use.", "default": "1.0.0", "enum": ["1.0.0"] } }, "process_parameters": [ # TODO: we should at least have bbox and time range parameters here ], "links": [], } } def list_services(self, user_id: str) -> List[ServiceMetadata]: return self._registry def service_info(self, user_id: str, service_id: str) -> ServiceMetadata: return next(s for s in self._registry if s.id == service_id) def get_log_entries(self, service_id: str, user_id: str, offset: str) -> List[dict]: return [{"id": 3, "level": "info", "message": "Loaded data."}]
def test_service_metadata_from_dict_basic(): service = ServiceMetadata.from_dict({ "id": "badcafe", "process": {"id": "ndvi", "process_graph": {}}, "url": "https://oeo.test/srv/f00b67", "type": "WMTS", "enabled": True, "configuration": {}, "attributes": {}, "flavor": "strawberry", }) assert service.id == "badcafe" assert service.process == {"id": "ndvi", "process_graph": {}} assert service.url == "https://oeo.test/srv/f00b67" assert service.type == "WMTS" assert service.enabled is True
def _persist_metadata(self, zk: KazooClient, metadata: ServiceMetadata): data = {"metadata": metadata.prepare_for_json()} raw = json.dumps(data).encode("utf-8") zk.create(self._path(service_id=metadata.id), raw)
import json from unittest import mock from kazoo.exceptions import NoNodeError import pytest from openeo_driver.backend import ServiceMetadata from openeo_driver.errors import ServiceNotFoundException import openeogeotrellis.service_registry from openeogeotrellis.service_registry import InMemoryServiceRegistry, SecondaryService, ZooKeeperServiceRegistry dummy_process_graph = {"foo": {"process_id": "foo", "arguments": {}}} dummy_service_metadata = ServiceMetadata( id='s1234', process={"process_graph": dummy_process_graph}, url="http://oeo.net/s/1234", type="WMTS", enabled=True, attributes={} ) class TestInMemoryServiceRegistry: def test_get_metadata(self): reg = InMemoryServiceRegistry() server = mock.Mock() reg.register(SecondaryService(service_metadata=dummy_service_metadata, host='oeo.net', port=5678, server=server)) assert reg.get_metadata('s1234') == dummy_service_metadata assert reg.get_metadata_all() == {'s1234': dummy_service_metadata} def test_stop_service(self): reg = InMemoryServiceRegistry() server = mock.Mock() reg.register(SecondaryService(service_metadata=dummy_service_metadata, host='oeo.net', port=5678, server=server))
import json from unittest import mock from kazoo.exceptions import NoNodeError import pytest from datetime import datetime from openeo_driver.backend import ServiceMetadata from openeo_driver.errors import ServiceNotFoundException import openeogeotrellis.service_registry from openeogeotrellis.service_registry import InMemoryServiceRegistry, SecondaryService, ZooKeeperServiceRegistry dummy_process_graph = {"foo": {"process_id": "foo", "arguments": {}}} dummy_service_metadata = ServiceMetadata( id='s1234', process={"process_graph": dummy_process_graph}, configuration={"version": "0.1.5"}, url="http://oeo.net/s/1234", type="WMTS", enabled=True, attributes={}, created=datetime(1981, 4, 24, 3, 0, 0) ) class TestInMemoryServiceRegistry: def test_get_metadata(self): reg = InMemoryServiceRegistry() reg.persist(user_id='u9876', metadata=dummy_service_metadata, api_version="0.4.0") assert reg.get_metadata('u9876', 's1234') == dummy_service_metadata assert reg.get_metadata_all('u9876') == {'s1234': dummy_service_metadata} def test_stop_service(self): reg = InMemoryServiceRegistry() server = mock.Mock()