Skip to content

Commit 9da164f

Browse files
committed
feat: write results to s3
1 parent c70a1a0 commit 9da164f

2 files changed

Lines changed: 67 additions & 7 deletions

File tree

src/datasync/dms.py

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,16 @@
44
from pygeometa.schemas.iso19139 import ISO19139OutputSchema
55

66
from .libs.helpers import get_anytext
7-
from .settings import DMS_DATASETS_BASE, log
7+
from .settings import (
8+
DMS_ACCESS_KEY,
9+
DMS_AWS_ENDPOINT,
10+
DMS_BUCKET,
11+
DMS_CSW_PREFIX,
12+
DMS_DATASETS_BASE,
13+
DMS_GEOAPI_PREFIX,
14+
DMS_SECRET_KEY,
15+
log,
16+
)
817

918
app = typer.Typer()
1019

@@ -28,12 +37,31 @@ def to_iso19139(metadata: dict) -> str:
2837

2938

3039
@app.command()
31-
def generate_csw_metadata(base_url: str = DMS_DATASETS_BASE, lang="en"):
40+
def generate_csw_metadata(
41+
base_url: str = DMS_DATASETS_BASE,
42+
access_key=DMS_ACCESS_KEY,
43+
secret_key=DMS_SECRET_KEY,
44+
endpoint=DMS_AWS_ENDPOINT,
45+
bucket=DMS_BUCKET,
46+
prefix=DMS_CSW_PREFIX,
47+
lang="en",
48+
):
3249
# TODO: localize the output based on the language in input
3350

3451
conn = duckdb.connect()
3552
conn.sql("INSTALL yaml FROM community; LOAD yaml; Install spatial; load spatial")
3653

54+
conn.execute(f"""
55+
CREATE OR REPLACE SECRET secret (
56+
TYPE s3,
57+
REGION 'eu-west-1',
58+
KEY_ID '{access_key}',
59+
SECRET '{secret_key}',
60+
ENDPOINT '{endpoint.replace(r"https://", "")}',
61+
URL_STYLE 'path'
62+
);
63+
""").fetchall()
64+
3765
conn.create_function("to_iso19139", to_iso19139)
3866
conn.create_function("xml_bag", get_anytext)
3967

@@ -355,17 +383,40 @@ def generate_csw_metadata(base_url: str = DMS_DATASETS_BASE, lang="en"):
355383

356384
log.debug(csw)
357385

358-
csw.write_parquet("dms-metadata.parquet")
386+
csw.write_parquet(
387+
f"s3://{bucket}{prefix}",
388+
compression="zstd",
389+
overwrite=True,
390+
)
359391

360392

361393
@app.command()
362-
def generate_geoapi_config(base_url: str = DMS_DATASETS_BASE, lang="en"):
394+
def generate_geoapi_config(
395+
base_url: str = DMS_DATASETS_BASE,
396+
access_key=DMS_ACCESS_KEY,
397+
secret_key=DMS_SECRET_KEY,
398+
endpoint=DMS_AWS_ENDPOINT,
399+
bucket=DMS_BUCKET,
400+
prefix=DMS_GEOAPI_PREFIX,
401+
lang="en",
402+
):
363403
# TODO: localize the output based on the language in input
364404

365405
conn = duckdb.connect()
366406
conn.sql("Install spatial; load spatial")
367407
conn.create_function("guess_type", guess_type)
368408

409+
conn.execute(f"""
410+
CREATE OR REPLACE SECRET secret (
411+
TYPE s3,
412+
REGION 'eu-west-1',
413+
KEY_ID '{access_key}',
414+
SECRET '{secret_key}',
415+
ENDPOINT '{endpoint.replace(r"https://", "")}',
416+
URL_STYLE 'path'
417+
);
418+
""").fetchall()
419+
369420
datasets = conn.read_parquet(base_url + "datasets_dataset.parquet").filter(
370421
"json_keys(metadata) <> []"
371422
)
@@ -450,8 +501,9 @@ def generate_geoapi_config(base_url: str = DMS_DATASETS_BASE, lang="en"):
450501
""")
451502

452503
log.debug(geo_raster)
453-
conn.sql("copy geo_raster to 'dms-raster.json' (FORMAT json, ARRAY true)")
454-
504+
conn.sql(f"""
505+
COPY geo_raster to 's3://{bucket}{prefix}/dms-raster.json' (FORMAT json, ARRAY true)
506+
""") # noqa: E501
455507
descriptions = (
456508
(
457509
vectors.set_alias("r")
@@ -519,7 +571,9 @@ def generate_geoapi_config(base_url: str = DMS_DATASETS_BASE, lang="en"):
519571
""")
520572
log.debug(geo_vector)
521573

522-
conn.sql("copy geo_vector to 'dms-vector.json' (FORMAT json, ARRAY true)")
574+
conn.sql(f"""
575+
COPY geo_vector to 's3://{bucket}{prefix}/dms-vector.json' (FORMAT json, ARRAY true)
576+
""") # noqa: E501
523577

524578

525579
if __name__ == "__main__":

src/datasync/settings.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,9 @@
3939

4040
# DMS
4141
DMS_DATASETS_BASE = env("DMS_DATASETS_BASE", default="")
42+
DMS_ACCESS_KEY = env("DMS_ACCESS_KEY", default="")
43+
DMS_SECRET_KEY = env("DMS_SECRET_KEY", default="")
44+
DMS_AWS_ENDPOINT = env("DMS_AWS_ENDPOINT", default="")
45+
DMS_BUCKET = env("DMS_BUCKET", default="")
46+
DMS_GEOAPI_PREFIX = env("DMS_GEOAPI_PREFIX", default="/geoapi/")
47+
DMS_CSW_PREFIX = env("DMS_CSW_PREFIX", default="/csw/dms-metadata.parquet")

0 commit comments

Comments
 (0)