예제 #1
0
    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()))
예제 #3
0
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)
예제 #4
0
 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)
예제 #5
0
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)
예제 #6
0
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."}]
예제 #7
0
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)
예제 #9
0
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))
예제 #10
0
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()