Skip to content
Snippets Groups Projects
Commit 8a0e96d8 authored by Cresson Remi's avatar Cresson Remi
Browse files

Use api key

- [x] update dinamis sdk

See merge request !13
parent 2946872e
No related branches found
No related tags found
1 merge request!13Use api key
Pipeline #284263 passed
......@@ -29,4 +29,7 @@ Test API:
allow_failure: false
except: [main]
script:
- python tests/all.py
- python tests/all.py
- DINAMIS_SDK_ACCESS_KEY=${CI_VAR_DINAMIS_SDK_ACCESS_KEY}
DINAMIS_SDK_SECRET_KEY=${CI_VAR_DINAMIS_SDK_SECRET_KEY}
python tests/all.py
......@@ -12,7 +12,7 @@ dependencies = [
"setuptools",
"pystac",
"pystac_client",
"dinamis_sdk==0.3.4",
"dinamis_sdk>=0.4.0",
"requests",
"rio-cogeo",
]
......
......@@ -6,12 +6,17 @@ import tempfile
from datetime import datetime
import pystac
import pystac_client
import requests
from theia_dumper import stac
STAC_EP = "https://stacapi-cdos.apps.okd.crocc.meso.umontpellier.fr"
handler = stac.TransactionsHandler(
stac_endpoint="https://stacapi-cdos.apps.okd.crocc.meso.umontpellier.fr",
stac_endpoint=STAC_EP,
storage_endpoint="https://s3-data.meso.umontpellier.fr",
storage_bucket="sm1-gdc-tests",
assets_overwrite=True,
......@@ -32,6 +37,22 @@ with open(RASTER_FILE1, "wb") as f:
f.write(r.content)
shutil.copyfile(RASTER_FILE1, RASTER_FILE2)
COL_BBOX = [0, 0, 0, 0]
BBOX_ALL = [
3.6962018175925073,
43.547450099338604,
9.036414917971516,
48.75431706444037,
]
COORDS1 = [
[4.032730583418401, 43.547450099338604],
[4.036414917971517, 43.75162726634343],
[3.698685718905037, 43.75431706444037],
[3.6962018175925073, 43.55012996681564],
[4.032730583418401, 43.547450099338604],
]
COORDS2 = [[coord + 5 for coord in coords] for coords in COORDS1]
def clear():
"""Clear all test items and collection."""
......@@ -40,23 +61,32 @@ def clear():
handler.delete(col_id=COL_ID)
def check(expected_bbox):
"""Check collection extent."""
api = pystac_client.Client.open(STAC_EP)
extent = api.get_collection(COL_ID).extent.spatial.bboxes
print(f"extent.spatial: {extent}")
assert len(extent) == 1
assert tuple(extent[0]) == tuple(expected_bbox), (
f"expected BBOX: {expected_bbox}, got {extent[0]}"
)
def create_item(item_id: str):
"""Create a STAC item."""
coordinates = COORDS1 if item_id == "item_1" else COORDS2
item = pystac.Item(
id=item_id,
geometry={
"type": "Polygon",
"coordinates": [
[
[4.032730583418401, 43.547450099338604],
[4.036414917971517, 43.75162726634343],
[3.698685718905037, 43.75431706444037],
[3.6962018175925073, 43.55012996681564],
[4.032730583418401, 43.547450099338604],
]
],
"coordinates": [coordinates],
},
bbox=[0.954895, 43.562481, 4.443054, 44.791582],
bbox=[
min(coords[0] for coords in coordinates),
min(coords[1] for coords in coordinates),
max(coords[0] for coords in coordinates),
max(coords[1] for coords in coordinates),
],
datetime=datetime.now().replace(year=1999),
properties={},
assets={
......@@ -70,7 +100,7 @@ def create_item(item_id: str):
def create_collection():
"""Create an empty STAC collection."""
spat_extent = pystac.SpatialExtent([[0, 0, 2, 3]])
spat_extent = pystac.SpatialExtent([COL_BBOX])
temp_extent = pystac.TemporalExtent(intervals=[(None, None)])
col = pystac.Collection(
id=COL_ID,
......@@ -84,10 +114,10 @@ def create_collection():
return col
def create_items_and_collection(relative):
def create_items_and_collection(relative, items=None):
"""Create two STAC items attached to one collection."""
# Create items
items = [create_item(item_id=item_id) for item_id in items_ids]
items = items or [create_item(item_id=item_id) for item_id in items_ids]
# Attach items to collection
col = create_collection()
......@@ -101,9 +131,9 @@ def create_items_and_collection(relative):
return col, items
def generate_collection(root_dir, relative=True):
def generate_collection(root_dir, relative=True, items=None):
"""Generate and save a STAC collection in {root_dir}/collection.json."""
col, _ = create_items_and_collection(relative)
col, _ = create_items_and_collection(relative, items=items)
col.normalize_hrefs(root_dir)
col.save(
catalog_type=pystac.CatalogType.RELATIVE_PUBLISHED
......@@ -131,6 +161,7 @@ def test_item_collection():
with tempfile.NamedTemporaryFile() as tmp:
generate_item_collection(tmp.name, relative=relative)
handler.load_and_publish(tmp.name)
check(BBOX_ALL)
clear()
......@@ -141,9 +172,24 @@ def test_collection():
with tempfile.TemporaryDirectory() as tmpdir:
generate_collection(tmpdir, relative=relative)
handler.load_and_publish(os.path.join(tmpdir, "collection.json"))
check(BBOX_ALL)
clear()
def test_collection_multipart():
"""Test collection."""
for relative in [True, False]:
print(f"\nRelative: {relative}")
for item_id in items_ids:
with tempfile.TemporaryDirectory() as tmpdir:
generate_collection(
tmpdir, relative=relative, items=[create_item(item_id)]
)
handler.load_and_publish(os.path.join(tmpdir, "collection.json"))
check(BBOX_ALL)
clear()
def test_all():
"""Test all."""
# test collection
......@@ -152,5 +198,8 @@ def test_all():
# test item collection
test_item_collection()
# test collection (multi-part)
test_collection_multipart()
test_all()
"""STAC stuff."""
import os
from ast import literal_eval
from dataclasses import dataclass
from typing import List
from urllib.parse import urljoin
import dinamis_sdk
import dinamis_sdk.auth
import dinamis_sdk.settings
import pystac
import pystac_client
import requests
from pystac import Collection, Item, ItemCollection
from requests.adapters import HTTPAdapter, Retry
......@@ -58,25 +56,26 @@ def create_session():
def post_or_put(url: str, data: dict):
"""Post or put data to url."""
headers = {"Authorization": f"Bearer {dinamis_sdk.auth.get_access_token()}"}
headers = dinamis_sdk.get_headers()
sess = create_session()
resp = sess.post(url, json=data, headers=headers)
resp = sess.post(url, json=data, headers=headers, timeout=10)
if resp.status_code == 409:
# Exists, so update
resp = sess.put(
f"{url}/{data['id']}",
json=data,
headers=headers,
timeout=10,
)
# Unchanged may throw a 404
if not resp.status_code == 404:
resp.raise_for_status()
else:
try:
resp.raise_for_status()
except Exception as e:
logger.error(literal_eval(resp.content)["detail"])
raise e
try:
resp.raise_for_status()
except Exception as e:
logger.error("Server returned: %s", resp.text)
raise e
def load(obj_pth):
......@@ -110,7 +109,7 @@ def get_assets_root_dir(items: List[Item]) -> str:
def check_items_collection_id(items: List[Item]):
"""Check that items collection_id is unique."""
if len(set(item.collection_id for item in items)) != 1:
if len(set(item.collection_id for item in items)) > 1:
raise UnconsistentCollectionIDs("Collection ID must be the same for all items!")
......@@ -145,7 +144,7 @@ def delete_stac_obj(stac_endpoint: str, col_id: str, item_id: str | None = None)
url = f"{stac_endpoint}/collections/{col_id}"
resp = requests.delete(
url,
headers={"Authorization": f"Bearer {dinamis_sdk.auth.get_access_token()}"},
headers=dinamis_sdk.get_headers(),
timeout=5,
)
if resp.status_code != 200:
......@@ -200,13 +199,33 @@ class TransactionsHandler:
item.to_dict(transform_hrefs=False),
)
def update_collection_extent(self, collection_id: str):
"""Update collection extent."""
logger.info("Updating collection extent")
api = pystac_client.Client.open(self.stac_endpoint)
results = api.search(limit=1000, collections=[collection_id])
col = api.get_collection(collection_id)
col.extent = pystac.Extent.from_items(items=list(results.items()))
col.clear_links("items")
self.publish_collection(collection=col)
def publish_items(self, items: List[Item]):
"""Publish items."""
if not items:
logger.info("No item to publish.")
return
check_items_collection_id(items=items)
assets_root_dir = get_assets_root_dir(items=items)
logger.debug("Assets root directory: %s", assets_root_dir)
for item in items:
self.publish_item(item=item, assets_root_dir=assets_root_dir)
# Update collection extent
collection_id = items[0].collection_id
if not collection_id:
raise UnconsistentCollectionIDs(
f"Collection id is None for item {items[0].id}"
)
self.update_collection_extent(collection_id=collection_id)
def publish_collection(self, collection: Collection):
"""Publish an empty collection."""
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment