from dataclasses import dataclass, field
from datetime import datetime
from enum import Enum
from typing import Any, Dict, List, Optional
from vs_common.model import FilesystemConfig, FilesystemType, LocalFilesystemConfig
[docs]class ResourceType(str, Enum):
STACAPI = "stacapi"
STACCatalog = "staccatalog"
FileMatcher = "filematcher"
OADS = "oads"
OpenSearch = "opensearch"
[docs]class PostprocessorType(str, Enum):
builtin = "builtin"
external = "external"
[docs]class OutputType(str, Enum):
console = "console"
queue = "queue"
[docs]@dataclass
class TimeConfig:
begin: str = datetime.now().isoformat()
end: str = datetime.now().isoformat()
[docs]@dataclass
class QueryConfig:
time: TimeConfig
bbox: str
collection: Optional[str] = None
extra_params: Dict[str, str] = field(default_factory=dict)
[docs]@dataclass
class STACAPIConfig:
url: str
query: QueryConfig
[docs]@dataclass
class JSONConfig:
property_mapping: Dict[str, str]
[docs]@dataclass
class ATOMXMLConfig:
pass
[docs]@dataclass
class STACCatalogConfig:
root_path: str
filesystem: str
collection_id: Optional[str] = None
deduplicate: bool = False
[docs]@dataclass
class FileMatcherConfig:
root_path: str
filesystem: str
asset_regex_map: Dict[str, str]
id_regex: str
datetime_regex: str
[docs]@dataclass
class OADSConfig:
url: str
use_oads_ext: bool = False
[docs]@dataclass
class OpenSearchConfig:
url: str
query: QueryConfig
format: FormatConfig
[docs]@dataclass
class ResourceConfig:
type: ResourceType
stacapi: Optional[STACAPIConfig] = None
staccatalog: Optional[STACCatalogConfig] = None
filematcher: Optional[FileMatcherConfig] = None
oads: Optional[OADSConfig] = None
opensearch: Optional[OpenSearchConfig] = None
[docs]@dataclass
class PostprocessorConfig:
type: PostprocessorType
process: str
kwargs: Dict[str, Any] = field(default_factory=dict)
[docs]@dataclass
class FilterConfig:
context: Dict = field(default_factory=dict)
expression: Dict = field(default_factory=dict)
[docs]@dataclass
class HarvesterConfig:
resource: ResourceConfig
filter: Optional[FilterConfig] = None
output: OutputType = OutputType.queue
queue: Optional[str] = None
postprocessors: Optional[List[PostprocessorConfig]] = None
[docs]@dataclass
class RedisConfig:
host: str = "vs-redis-master"
port: int = 6379
[docs]def default_filesystem():
return {
"local": FilesystemConfig(FilesystemType.file, local=LocalFilesystemConfig())
}
[docs]@dataclass
class HarvesterAppConfig:
harvesters: Dict[str, HarvesterConfig] = field(default_factory=dict)
redis: RedisConfig = RedisConfig()
filesystems: Dict[str, FilesystemConfig] = field(default_factory=default_filesystem)