From ceab38a8bdc9f9bb436bc1284c01c37e5455ab87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Tue, 30 Jun 2026 17:20:04 +0300 Subject: [PATCH 01/24] feat(helm): add minimal docker-compose-aligned eoapi umbrella chart MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds charts/eoapi-workshop/, a thin umbrella over the upstream eoapi chart (0.13.1) that deploys only the workshop's compose-aligned components — pgstac database, stac, raster, vector, stac-browser, and stac-auth-proxy + mock-oidc — with no observability/monitoring stack (multidim, docServer, eoapi-notifier, knative, prometheus/grafana/metrics-server, and autoscaling are all disabled). Why an umbrella rather than a values profile: it is self-contained and versioned in this repo, installable with one `helm install`, and pins the upstream chart version via Chart.lock. Auth mirrors docker-compose: stac-auth-proxy with DEFAULT_PUBLIC=true (public reads, protected writes), fronted by a mock OIDC server. Discovery is split into an external OIDC_DISCOVERY_URL (matching the token issuer) and an in-cluster OIDC_DISCOVERY_INTERNAL_URL for JWKS fetching, so token validation works from a pod. The internal URL is pinned to the `eoapi-mock-oidc-server.eoapi` Service DNS, so the release name and namespace must both be `eoapi`. README documents the deployment procedure (ingress-nginx + Crunchy PGO prerequisites), a 5-step auth test flow, and the known /vector empty-data gap (loadSamples seeds STAC items, not the compose features-loader ecoregions layer). Verified via helm lint + helm template rendering (enabled components present, disabled ones absent, auth env vars resolve correctly). Not yet run on a live cluster. Co-Authored-By: Claude Opus 4.8 --- .gitignore | 5 + charts/eoapi-workshop/.helmignore | 10 ++ charts/eoapi-workshop/Chart.lock | 6 + charts/eoapi-workshop/Chart.yaml | 21 +++ charts/eoapi-workshop/README.md | 227 +++++++++++++++++++++++++ charts/eoapi-workshop/values.yaml | 266 ++++++++++++++++++++++++++++++ 6 files changed, 535 insertions(+) create mode 100644 charts/eoapi-workshop/.helmignore create mode 100644 charts/eoapi-workshop/Chart.lock create mode 100644 charts/eoapi-workshop/Chart.yaml create mode 100644 charts/eoapi-workshop/README.md create mode 100644 charts/eoapi-workshop/values.yaml diff --git a/.gitignore b/.gitignore index 5fea259..36dc738 100644 --- a/.gitignore +++ b/.gitignore @@ -178,3 +178,8 @@ cdk.context.json node_modules/ config.yaml + +# Helm: pulled chart dependencies (rebuilt with `helm dependency update`). +# Chart.lock IS tracked for reproducible builds. +charts/*/charts/ +charts/**/*.tgz diff --git a/charts/eoapi-workshop/.helmignore b/charts/eoapi-workshop/.helmignore new file mode 100644 index 0000000..69067cd --- /dev/null +++ b/charts/eoapi-workshop/.helmignore @@ -0,0 +1,10 @@ +# Patterns to ignore when building Helm packages. +.DS_Store +.git/ +.gitignore +*.tmproj +*.swp +*.bak +*.orig +.idea/ +.vscode/ diff --git a/charts/eoapi-workshop/Chart.lock b/charts/eoapi-workshop/Chart.lock new file mode 100644 index 0000000..6289b6c --- /dev/null +++ b/charts/eoapi-workshop/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: eoapi + repository: https://developmentseed.org/eoapi-k8s/ + version: 0.13.1 +digest: sha256:d779692bc842571128c0a8e3f0e7dfdf0a8344db4f3385ee5945921fc2343621 +generated: "2026-06-30T17:09:54.770014+03:00" diff --git a/charts/eoapi-workshop/Chart.yaml b/charts/eoapi-workshop/Chart.yaml new file mode 100644 index 0000000..dafcbcd --- /dev/null +++ b/charts/eoapi-workshop/Chart.yaml @@ -0,0 +1,21 @@ +apiVersion: v2 +name: eoapi-workshop +description: Minimal, docker-compose-aligned eoAPI deployment for the workshop (no observability/monitoring stack) +type: application +version: 0.1.0 +# appVersion tracks the eoAPI application shipped by the eoapi dependency below. +appVersion: "6.3.1" +icon: https://eoapi.dev/img/eoAPI.png +home: https://github.com/developmentseed/eoapi-workshop +sources: + - https://github.com/developmentseed/eoapi-workshop + - https://github.com/developmentseed/eoapi-k8s +dependencies: + # Upstream eoAPI chart. Its packaged .tgz vendors its own subcharts + # (postgrescluster, stac-auth-proxy, prometheus, grafana, knative, ...). + # Disabled components are turned off via values; their `condition` flags + # keep them from rendering, so only the workshop services are deployed. + # NOTE: devseed.com/eoapi-k8s/ 301-redirects to developmentseed.org/eoapi-k8s/. + - name: eoapi + version: 0.13.1 + repository: https://developmentseed.org/eoapi-k8s/ diff --git a/charts/eoapi-workshop/README.md b/charts/eoapi-workshop/README.md new file mode 100644 index 0000000..d35dc3f --- /dev/null +++ b/charts/eoapi-workshop/README.md @@ -0,0 +1,227 @@ +# eoapi-workshop Helm chart + +A **minimal, docker-compose-aligned** Helm deployment of [eoAPI](https://eoapi.dev) +for the workshop. It is a thin *umbrella* chart that depends on the upstream +[`eoapi`](https://github.com/developmentseed/eoapi-k8s) chart and ships a trimmed +`values.yaml` enabling only the components the workshop's `docker-compose.yml` +runs — **no observability/monitoring stack**. + +## What gets deployed + +| docker-compose service | This chart | +|---|---| +| database (pgstac) | ✅ `postgrescluster` | +| stac-fastapi | ✅ `stac` → `/stac` | +| titiler-pgstac | ✅ `raster` → `/raster` | +| tipg | ✅ `vector` → `/vector` | +| stac-browser | ✅ `browser` | +| stac-auth-proxy | ✅ `stac-auth-proxy` (fronts `/stac`) | +| mock-oidc | ✅ `testing.mockOidcServer` → `/mock-oidc` | +| features-loader | ⚠️ no equivalent — see [Known limitations](#known-limitations) | +| jupyterhub | ➖ out of scope (notebook env, not an eoAPI service) | + +**Disabled** (unlike upstream `experimental.yaml`): `multidim`, `docServer`, +`eoapi-notifier`, `knative`, `monitoring.*` (metrics-server / Prometheus / +adapter), `observability.grafana`, and autoscaling (fixed 1 replica per service). + +## ⚠️ Release-name contract — read this first + +The chart wires `stac-auth-proxy` to the mock OIDC server using the **internal +Service DNS name** `eoapi-mock-oidc-server.eoapi.svc.cluster.local`. That name is +derived from the Helm **release name** and **namespace**, so you **must** install +with release name `eoapi` in namespace `eoapi`: + +```bash +helm install eoapi ./charts/eoapi-workshop -n eoapi --create-namespace +``` + +Any other release name or namespace breaks the proxy's OIDC discovery. If you +need a different name/namespace, also update `eoapi.stac-auth-proxy.env.OIDC_DISCOVERY_URL` +in `values.yaml` accordingly. + +## ⚠️ Test-only auth + +`stac-auth-proxy` is fronted by a **mock OIDC server** with hard-coded +`test-client` / `test-secret` credentials, and reads are left public +(`DEFAULT_PUBLIC=true`) so the notebooks work without tokens. **This is for the +workshop only — do not use it in production.** + +## Prerequisites + +A Kubernetes cluster (1.23+) with: + +1. **An NGINX ingress controller** (`ingressClassName: nginx`). For example: + ```bash + helm upgrade --install ingress-nginx ingress-nginx \ + --repo https://kubernetes.github.io/ingress-nginx \ + --namespace ingress-nginx --create-namespace + ``` +2. **The Crunchy Postgres Operator (PGO)** — **hard requirement**. The + `postgrescluster` component renders a `PostgresCluster` custom resource that + only reconciles into a running database if the operator (and its CRDs) are + already installed. Without it the chart installs but the database never comes + up. Install it once per cluster, e.g.: + ```bash + helm upgrade --install pgo oci://registry.developers.crunchydata.com/crunchydata/pgo \ + --namespace postgres-operator --create-namespace + ``` +3. **Helm 3.8+** (Helm 4 works). Tested with Helm v4. + +Local clusters (kind / minikube / k3s) are fine as long as the two operators +above are installed and the ingress is reachable on `localhost`. + +## Deploy + +```bash +# From the repo root. + +# 1. Fetch the upstream `eoapi` chart dependency (writes Chart.lock + charts/*.tgz). +# Use `update` the first time (no lock yet); `build` on later runs to honor the lock. +helm dependency update ./charts/eoapi-workshop + +# 2. (optional) Sanity-check the rendered manifests without a cluster. +helm lint ./charts/eoapi-workshop +helm template eoapi ./charts/eoapi-workshop -n eoapi | less + +# 3. Install — release name and namespace MUST be `eoapi` (see contract above). +helm install eoapi ./charts/eoapi-workshop -n eoapi --create-namespace + +# 4. Watch the rollout. +kubectl -n eoapi get pods -w +``` + +The pgstac database is created asynchronously by the operator and the +`pgstacBootstrap` job seeds sample STAC data, so the API pods may restart a few +times before they become `Ready` — this is expected on first install. + +## Verify + +```bash +# All pods Ready? +kubectl -n eoapi get pods + +# Endpoints (through the NGINX ingress on localhost): +curl -s http://localhost/stac/healthz # STAC API (via auth proxy) +curl -s http://localhost/raster/healthz # Raster (titiler) +curl -s http://localhost/vector/healthz # Vector (tipg) +curl -s http://localhost/stac/collections # sample collections loaded by pgstacBootstrap +# STAC Browser + mock OIDC are served at: +# http://localhost/ (browser) +# http://localhost/mock-oidc/.well-known/openid-configuration +``` + +If `localhost` is not where your ingress is exposed (e.g. minikube), use +`kubectl -n eoapi port-forward svc/ 8080:80` or the cluster's +ingress IP/hostname instead. + +## Testing the auth mechanism + +`stac-auth-proxy` fronts `/stac`. With `DEFAULT_PUBLIC=true`, **reads (GET) are +open** and **mutations (POST/PUT/DELETE) require a bearer token**. Tokens come +from the bundled **mock OIDC server**. The commands below assume the ingress is +reachable on `http://localhost` (adjust the host otherwise) and that `jq` is +installed. + +How it's wired (mirrors `docker-compose.yml`): + +- The mock server issues tokens whose `iss` is its `ISSUER`, `http://localhost/mock-oidc`. +- The proxy advertises that same external URL via `OIDC_DISCOVERY_URL`, but + fetches the OIDC config + JWKS in-cluster via `OIDC_DISCOVERY_INTERNAL_URL` + (`http://eoapi-mock-oidc-server.eoapi.svc.cluster.local:8080/...`), because a + pod cannot resolve the `localhost` ingress host. + +### 1. Discovery endpoint is reachable + +```bash +curl -s http://localhost/mock-oidc/.well-known/openid-configuration | jq .issuer +# expect: "http://localhost/mock-oidc" +``` + +### 2. Public reads work *without* a token + +```bash +curl -s -o /dev/null -w '%{http_code}\n' http://localhost/stac/collections +# expect: 200 +``` + +### 3. A protected (write) request is *rejected without* a token + +```bash +curl -s -o /dev/null -w '%{http_code}\n' \ + -X POST http://localhost/stac/collections \ + -H 'Content-Type: application/json' -d '{}' +# expect: 401 (blocked by the proxy before reaching STAC) +``` + +### 4. Mint a token from the mock OIDC server + +The server mints a signed JWT via a POST to its root endpoint. Request the +`stac:write` scope (enabled via the `SCOPES` env var on the server): + +```bash +TOKEN=$(curl -s http://localhost/mock-oidc/ \ + --data-raw 'username=testuser&scopes=openid+stac:read+stac:write' \ + -H 'Accept: application/json' | jq -r .token) + +# Inspect the decoded claims (the server also returns them as token_body): +echo "$TOKEN" | cut -d. -f2 | base64 -d 2>/dev/null | jq . +``` + +### 5. The same request now passes the auth gate *with* the token + +```bash +curl -s -o /dev/null -w '%{http_code}\n' \ + -X POST http://localhost/stac/collections \ + -H "Authorization: Bearer $TOKEN" \ + -H 'Content-Type: application/json' -d '{}' +# expect: NOT 401 — the proxy forwards the request upstream. (You'll get a 4xx +# such as 400/422 from STAC for the empty body; send a valid Collection to get 201.) +``` + +The key signal is step 3 vs step 5: **401 without a token, non-401 with one**. +That proves the proxy is enforcing auth and validating tokens against the mock +OIDC server's keys. + +> **Note:** these steps are validated against the rendered chart config and +> mirror the proven `docker-compose` auth setup; run them against your live +> cluster after deploy to confirm end-to-end. If step 5 still returns 401, +> check the proxy logs (`kubectl -n eoapi logs deploy/eoapi-stac-auth-proxy`) — +> the most common cause is a release name/namespace other than `eoapi`, which +> breaks `OIDC_DISCOVERY_INTERNAL_URL`. + +## Upgrade / uninstall + +```bash +helm dependency update ./charts/eoapi-workshop # if the dependency version changed +helm upgrade eoapi ./charts/eoapi-workshop -n eoapi + +helm uninstall eoapi -n eoapi +# PersistentVolumeClaims (Postgres data) are retained by design — delete manually if desired: +kubectl -n eoapi delete pvc --all +``` + +## Configuration + +All upstream `eoapi` values are configurable under the top-level `eoapi:` key +(this chart is an umbrella, so the subchart's values are nested). See +[`values.yaml`](./values.yaml) for the trimmed set and the upstream +[chart values](https://github.com/developmentseed/eoapi-k8s/blob/main/charts/eoapi/values.yaml) +for everything available. To override: + +```bash +helm install eoapi ./charts/eoapi-workshop -n eoapi --create-namespace \ + --set eoapi.postgrescluster.instances[0].dataVolumeClaimSpec.resources.requests.storage=10Gi +``` + +## Known limitations + +- **`/vector` starts empty.** The docker-compose `features-loader` loads the + NA CEC Level III Ecoregions shapefile into a `features` schema that tipg + serves. This chart enables `pgstacBootstrap.loadSamples`, which loads STAC + sample *items* (for `/stac` and `/raster`) but **not** that vector layer. The + `05-tipg` notebook will have no data until the layer is loaded separately + (e.g. an `ogr2ogr` Job against the cluster database — a possible follow-up). +- **Not production-ready.** Test-only auth (mock OIDC), single 1-replica + database with 5Gi storage, no TLS, no monitoring. This mirrors the local + docker-compose workflow, not the CDK/AWS production stack documented in + [`DEPLOYMENT.md`](../../DEPLOYMENT.md). diff --git a/charts/eoapi-workshop/values.yaml b/charts/eoapi-workshop/values.yaml new file mode 100644 index 0000000..2fcf5f5 --- /dev/null +++ b/charts/eoapi-workshop/values.yaml @@ -0,0 +1,266 @@ +# Minimal, docker-compose-aligned values for the eoAPI workshop. +# +# Derived from the upstream `experimental.yaml` profile, trimmed to the +# components the workshop's docker-compose.yml actually runs: +# database (pgstac), stac, raster (titiler), vector (tipg), stac-browser, +# stac-auth-proxy + mock-oidc. +# Everything heavy is OFF: multidim, docServer, eoapi-notifier, knative, +# monitoring (metrics-server/prometheus/adapter), observability (grafana), +# and autoscaling. +# +# !!! RELEASE-NAME CONTRACT !!! +# The proxy's OIDC_DISCOVERY_INTERNAL_URL below is hard-pinned to the Service +# DNS name `eoapi-mock-oidc-server.eoapi.svc.cluster.local`. That name is +# derived from the Helm *release name* and *namespace*. You MUST install as: +# helm install eoapi ./charts/eoapi-workshop -n eoapi --create-namespace +# Using any other release name or namespace breaks stac-auth-proxy's OIDC +# discovery. See README.md. +# +# All values are nested under `eoapi:` because eoapi is a subchart. +eoapi: + ###################### + # DATABASE (pgstac) + ###################### + postgresql: + type: "postgrescluster" + + postgrescluster: + enabled: true + postgresVersion: 16 + postGISVersion: "3.4" + pgBouncerReplicas: 1 + monitoring: false + instances: + - name: eoapi + replicas: 1 + dataVolumeClaimSpec: + accessModes: + - "ReadWriteOnce" + resources: + requests: + storage: "5Gi" + resources: {} + users: + - name: postgres + databases: + - eoapi + - postgres + options: "SUPERUSER" + - name: eoapi + databases: + - eoapi + - postgres + options: "CREATEDB CREATEROLE" + password: + type: AlphaNumeric + + ###################### + # PGSTAC BOOTSTRAP + ###################### + pgstacBootstrap: + enabled: true + settings: + # Loads STAC sample *items* so /stac has data out of the box. + # NOTE: this does NOT load the ecoregions vector layer that the + # docker-compose `features-loader` seeds for tipg — /vector starts + # empty. See README "Known limitations". + loadSamples: true + pgstacSettings: + queue_timeout: "10 minutes" + use_queue: "false" + update_collection_extent: "true" + resources: {} + + ###################### + # CORE API SERVICES + ###################### + stac: + enabled: true + ingress: + enabled: true + path: "/stac" + autoscaling: + enabled: false + settings: + resources: {} + envVars: + HOST: "0.0.0.0" + PORT: "8080" + WEB_CONCURRENCY: "4" + ENABLE_TRANSACTIONS_EXTENSIONS: "true" + # JSON-array form (matches upstream core.yaml; safest for stac-fastapi). + STAC_FASTAPI_CORS_ORIGINS: '["*"]' + + raster: + enabled: true + ingress: + enabled: true + path: "/raster" + autoscaling: + enabled: false + settings: + resources: {} + envVars: + # GDAL performance settings + GDAL_CACHEMAX: "200" + GDAL_DISABLE_READDIR_ON_OPEN: "EMPTY_DIR" + GDAL_INGESTED_BYTES_AT_OPEN: "32768" + GDAL_HTTP_MERGE_CONSECUTIVE_RANGES: "YES" + GDAL_HTTP_MULTIPLEX: "YES" + GDAL_HTTP_VERSION: "2" + PYTHONWARNINGS: "ignore" + VSI_CACHE: "TRUE" + VSI_CACHE_SIZE: "5000000" + # Uvicorn settings + HOST: "0.0.0.0" + PORT: "8080" + WEB_CONCURRENCY: "4" + + vector: + enabled: true + ingress: + enabled: true + path: "/vector" + autoscaling: + enabled: false + settings: + resources: {} + envVars: + TIPG_CATALOG_TTL: "300" + HOST: "0.0.0.0" + PORT: "8080" + WEB_CONCURRENCY: "4" + + ###################### + # UI: STAC Browser + ###################### + browser: + enabled: true + settings: + resources: {} + # External URL (reached from the user's browser through the ingress). + oidcDiscoveryUrl: "http://localhost/mock-oidc/.well-known/openid-configuration" + + ###################### + # DISABLED COMPONENTS + ###################### + multidim: + enabled: false + docServer: + enabled: false + eoapi-notifier: + enabled: false + knative: + enabled: false + monitoring: + metricsServer: + enabled: false + prometheus: + enabled: false + prometheusAdapter: + enabled: false + observability: + grafana: + enabled: false + autoscaling: + enabled: false + + ###################### + # INGRESS + ###################### + ingress: + enabled: true + className: "nginx" + pathType: "Prefix" + host: "localhost" + tls: + enabled: false + + ###################### + # AUTH (docker-compose parity) + ###################### + # TEST-ONLY auth. stac-auth-proxy fronts /stac; the mock OIDC server below + # provides discovery. DEFAULT_PUBLIC keeps reads open so the workshop + # notebooks work without tokens. DO NOT use this setup in production. + stac-auth-proxy: + enabled: true + image: + tag: "v1.1.0" + env: + # Allow unauthenticated reads (workshop notebooks have no token). + DEFAULT_PUBLIC: "true" + # External discovery URL — must match the token issuer (mock-oidc ISSUER, + # reached by clients through the ingress). Depends on the ingress host. + OIDC_DISCOVERY_URL: "http://localhost/mock-oidc/.well-known/openid-configuration" + # Internal discovery URL — the proxy fetches the OIDC config + JWKS from + # here, in-cluster (the external host above is not resolvable from a pod). + # Depends on release name `eoapi` + namespace `eoapi`. + OIDC_DISCOVERY_INTERNAL_URL: "http://eoapi-mock-oidc-server.eoapi.svc.cluster.local:8080/.well-known/openid-configuration" + # Health-check paths include the /stac ROOT_PATH the proxy serves under. + startupProbe: + httpGet: + path: /stac/healthz + port: http + periodSeconds: 2 + failureThreshold: 30 + livenessProbe: + httpGet: + path: /stac/healthz + port: http + periodSeconds: 60 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /stac/healthz + port: http + periodSeconds: 5 + failureThreshold: 3 + + ###################### + # TESTING: mock OIDC server (DO NOT USE IN PRODUCTION) + ###################### + testing: + mockOidcServer: + enabled: true + replicaCount: 1 + image: + repository: ghcr.io/alukach/mock-oidc-server + tag: latest + pullPolicy: IfNotPresent + port: 8888 + clientId: "test-client" + clientSecret: "test-secret" + extraEnv: + - name: ISSUER + value: "http://localhost/mock-oidc" + # Extra scopes the server will issue (matches docker-compose), so you + # can mint tokens with stac:write to exercise protected transactions. + - name: SCOPES + value: "stac:read,stac:write" + service: + type: ClusterIP + port: 8080 + ingress: + enabled: true + path: "/mock-oidc" + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 50m + memory: 64Mi + + ###################### + # MISC + ###################### + service: + port: 8080 + serviceAccount: + create: true + name: "" + automount: true + database: + enabled: true + connectionPooling: + enabled: false From 04dacfebf2b54fac24968ad4a09b67354b795756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Wed, 1 Jul 2026 01:07:42 +0300 Subject: [PATCH 02/24] feat(helm): make eoapi-workshop chart deployable on remote clusters Fix three issues that blocked a working deploy of the umbrella chart on a real (non-localhost) Kubernetes cluster, and add reproducible tooling. Chart fixes (values.yaml + new templates/passthrough-ingress.yaml): - Set stac-auth-proxy UPSTREAM_URL to the in-cluster STAC Service (http://eoapi-stac:8080). The upstream chart leaves it at the unreachable localhost:8080 default, so the proxy crash-loops. - Route /stac and /browser through a dedicated, rewrite-free Ingress. The upstream chart's global rewrite-target: /$2 strips the prefix that both stac-auth-proxy (ROOT_PATH=/stac) and the prefixed stac-browser image require, returning 404. Disable their upstream ingress paths and serve them via passthrough-ingress.yaml instead. - Treat the external host as a deploy-time input: localhost is now only a documented local-dev fallback; nothing cluster-specific is committed. Tooling: - deploy.sh: idempotent, reproducible deploy/verify/teardown. Installs prerequisites (ingress-nginx + PGO), auto-discovers the ingress LoadBalancer host (.nip.io) or honors $INGRESS_HOST, generates gitignored overrides, installs, waits for rollout, and verifies the endpoints plus the auth flow. - .gitignore / .helmignore: keep generated overrides and tooling out of git and out of the packaged chart. Also relocate the chart from charts/ to infrastructure/charts/. Verified by three full teardown+rebuild cycles (each got a different LB IP, handled automatically); all services return 200 and writes are auth-enforced (401 without a token, 201 with one). Co-Authored-By: Claude Opus 4.8 --- .../charts/eoapi-workshop/.gitignore | 2 + .../charts}/eoapi-workshop/.helmignore | 3 + .../charts}/eoapi-workshop/Chart.lock | 0 .../charts}/eoapi-workshop/Chart.yaml | 0 .../charts}/eoapi-workshop/README.md | 97 ++++++++- .../eoapi-workshop/charts/eoapi-0.13.1.tgz | Bin 0 -> 286334 bytes .../charts/eoapi-workshop/deploy.sh | 195 ++++++++++++++++++ .../templates/passthrough-ingress.yaml | 68 ++++++ .../charts}/eoapi-workshop/values.yaml | 31 ++- 9 files changed, 394 insertions(+), 2 deletions(-) create mode 100644 infrastructure/charts/eoapi-workshop/.gitignore rename {charts => infrastructure/charts}/eoapi-workshop/.helmignore (56%) rename {charts => infrastructure/charts}/eoapi-workshop/Chart.lock (100%) rename {charts => infrastructure/charts}/eoapi-workshop/Chart.yaml (100%) rename {charts => infrastructure/charts}/eoapi-workshop/README.md (68%) create mode 100644 infrastructure/charts/eoapi-workshop/charts/eoapi-0.13.1.tgz create mode 100755 infrastructure/charts/eoapi-workshop/deploy.sh create mode 100644 infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml rename {charts => infrastructure/charts}/eoapi-workshop/values.yaml (79%) diff --git a/infrastructure/charts/eoapi-workshop/.gitignore b/infrastructure/charts/eoapi-workshop/.gitignore new file mode 100644 index 0000000..b106b4b --- /dev/null +++ b/infrastructure/charts/eoapi-workshop/.gitignore @@ -0,0 +1,2 @@ +# Host-specific install overrides generated by deploy.sh — never committed. +.deploy/ diff --git a/charts/eoapi-workshop/.helmignore b/infrastructure/charts/eoapi-workshop/.helmignore similarity index 56% rename from charts/eoapi-workshop/.helmignore rename to infrastructure/charts/eoapi-workshop/.helmignore index 69067cd..f6bf03f 100644 --- a/charts/eoapi-workshop/.helmignore +++ b/infrastructure/charts/eoapi-workshop/.helmignore @@ -8,3 +8,6 @@ *.orig .idea/ .vscode/ +# Local tooling / generated artifacts — not part of the packaged chart. +deploy.sh +.deploy/ diff --git a/charts/eoapi-workshop/Chart.lock b/infrastructure/charts/eoapi-workshop/Chart.lock similarity index 100% rename from charts/eoapi-workshop/Chart.lock rename to infrastructure/charts/eoapi-workshop/Chart.lock diff --git a/charts/eoapi-workshop/Chart.yaml b/infrastructure/charts/eoapi-workshop/Chart.yaml similarity index 100% rename from charts/eoapi-workshop/Chart.yaml rename to infrastructure/charts/eoapi-workshop/Chart.yaml diff --git a/charts/eoapi-workshop/README.md b/infrastructure/charts/eoapi-workshop/README.md similarity index 68% rename from charts/eoapi-workshop/README.md rename to infrastructure/charts/eoapi-workshop/README.md index d35dc3f..6bc4959 100644 --- a/charts/eoapi-workshop/README.md +++ b/infrastructure/charts/eoapi-workshop/README.md @@ -72,6 +72,34 @@ above are installed and the ingress is reachable on `localhost`. ## Deploy +### Recommended: `deploy.sh` (handles prerequisites + host + verify) + +For most clusters — especially remote ones — use the bundled script. It installs +the prerequisites, **discovers the ingress host automatically**, generates the +host overrides, installs the release, and verifies it end to end. It is +idempotent (safe to re-run) and reproducible (re-creates everything on a fresh +cluster): + +```bash +cd infrastructure/charts/eoapi-workshop + +./deploy.sh deploy # prerequisites + chart + verify +./deploy.sh verify # re-run the endpoint/auth checks +./deploy.sh teardown # remove the release (add --all to also remove operators) +``` + +The host is resolved in this order: `INGRESS_HOST` env var → the ingress +LoadBalancer IP as `.nip.io` → a LoadBalancer hostname. Pin it explicitly for +a custom domain or a local cluster: + +```bash +INGRESS_HOST=eoapi.example.com ./deploy.sh deploy # custom DNS +INGRESS_HOST=localhost ./deploy.sh deploy # kind/minikube/k3s +SKIP_PREREQS=1 ./deploy.sh deploy # operators already installed +``` + +### Manual + ```bash # From the repo root. @@ -84,6 +112,7 @@ helm lint ./charts/eoapi-workshop helm template eoapi ./charts/eoapi-workshop -n eoapi | less # 3. Install — release name and namespace MUST be `eoapi` (see contract above). +# On a remote cluster, also pass the host overrides (see "Remote clusters"). helm install eoapi ./charts/eoapi-workshop -n eoapi --create-namespace # 4. Watch the rollout. @@ -94,6 +123,72 @@ The pgstac database is created asynchronously by the operator and the `pgstacBootstrap` job seeds sample STAC data, so the API pods may restart a few times before they become `Ready` — this is expected on first install. +### Remote clusters (non-`localhost` host) + +The default `values.yaml` is pinned to `localhost` (the docker-compose workflow). +On a remote cluster the NGINX ingress is exposed via a LoadBalancer with its own +IP/hostname, so the ingress host **and** the externally-reachable auth URLs must +point at that host instead. Kubernetes `Ingress` rejects a bare IP as a host, so +use a DNS name — [`nip.io`](https://nip.io) wildcard DNS (`.nip.io`) works +out of the box. + +Keep `values.yaml` environment-agnostic — pass the host in a **separate overrides +file** (`-f`) rather than editing the chart. An overrides file is more robust than +`--set` here because `mockOidcServer.extraEnv` is a YAML *list*: `--set` on a +single list index silently replaces the whole element (dropping `ISSUER`/`SCOPES`), +and the comma in `stac:read,stac:write` trips `--set` parsing. (`stac-auth-proxy.env` +is a *map* and deep-merges fine.) The **internal** OIDC URL stays in-cluster and is +left untouched. + +```bash +# Discover the LoadBalancer IP the ingress controller was assigned. +INGRESS_HOST="$(kubectl -n ingress-nginx get svc ingress-nginx-controller \ + -o jsonpath='{.status.loadBalancer.ingress[0].ip}').nip.io" + +# Generate an overrides file for this host (kept out of the chart). +cat > eoapi-remote.yaml <Dc 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Ð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 m|4o!N-v9EE>ao|iE!(m!+p;a?<$nSI0RR6%.nip.io), so a torn-down/rebuilt cluster that +# gets a new LB IP just works. Override with INGRESS_HOST for a fixed DNS name, +# or INGRESS_HOST=localhost for a local cluster (kind/minikube/k3s). +# +# Usage: +# ./deploy.sh deploy # prerequisites + chart + verify (idempotent) +# ./deploy.sh verify # re-run endpoint/auth checks only +# ./deploy.sh teardown # remove the eoapi release, PVCs and namespace +# ./deploy.sh teardown --all # also remove ingress-nginx + PGO (full reset) +# +# Env: +# RELEASE Helm release name (default: eoapi) -- see OIDC contract below +# NAMESPACE target namespace (default: eoapi) -- see OIDC contract below +# INGRESS_HOST pin the host (default: auto .nip.io) +# SKIP_PREREQS=1 skip the ingress-nginx + PGO install +# +# !!! OIDC CONTRACT !!! The proxy's OIDC_DISCOVERY_INTERNAL_URL is pinned to the +# Service DNS name eoapi-mock-oidc-server.eoapi.svc.cluster.local, derived from +# RELEASE + NAMESPACE. Both MUST stay "eoapi" or in-cluster OIDC discovery breaks. +set -euo pipefail + +RELEASE="${RELEASE:-eoapi}" +NAMESPACE="${NAMESPACE:-eoapi}" +CHART_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +log() { printf '\n\033[1;34m==> %s\033[0m\n' "$*" >&2; } + +install_prereqs() { + if [[ "${SKIP_PREREQS:-0}" == "1" ]]; then + log "Skipping prerequisites (SKIP_PREREQS=1)" + return + fi + # Don't touch an externally-managed ingress controller: a bare + # `helm upgrade --install` with no values could revert its configuration. + if kubectl get ingressclass nginx >/dev/null 2>&1; then + log "An 'nginx' ingressclass already exists — leaving ingress-nginx untouched" + else + log "Installing NGINX ingress controller" + helm upgrade --install ingress-nginx ingress-nginx \ + --repo https://kubernetes.github.io/ingress-nginx \ + --namespace ingress-nginx --create-namespace --wait --timeout 5m + fi + + log "Installing Crunchy Postgres Operator (PGO)" + helm upgrade --install pgo oci://registry.developers.crunchydata.com/crunchydata/pgo \ + --namespace postgres-operator --create-namespace --wait --timeout 5m + + # Wait for the LoadBalancer only if we can see the controller Service (we may + # have skipped the install above for a differently-named, external controller). + if kubectl -n ingress-nginx get svc ingress-nginx-controller >/dev/null 2>&1; then + log "Waiting for the ingress LoadBalancer to be assigned" + kubectl -n ingress-nginx wait --for=jsonpath='{.status.loadBalancer.ingress}' \ + svc/ingress-nginx-controller --timeout=300s || true + fi +} + +# Resolve the externally-reachable ingress host (echoed to stdout). +discover_host() { + if [[ -n "${INGRESS_HOST:-}" ]]; then echo "${INGRESS_HOST}"; return; fi + local ip host + ip="$(kubectl -n ingress-nginx get svc ingress-nginx-controller \ + -o jsonpath='{.status.loadBalancer.ingress[0].ip}' 2>/dev/null || true)" + if [[ -n "${ip}" ]]; then echo "${ip}.nip.io"; return; fi + # Some clouds hand out a hostname instead of an IP. + host="$(kubectl -n ingress-nginx get svc ingress-nginx-controller \ + -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' 2>/dev/null || true)" + if [[ -n "${host}" ]]; then echo "${host}"; return; fi + echo "ERROR: could not resolve the ingress host. Set INGRESS_HOST explicitly." >&2 + exit 1 +} + +# Write per-host overrides for $1=host to the file path $2. localhost matches the +# committed defaults; any other host needs the ingress + external auth URLs moved. +# (The internal OIDC URL is in-cluster DNS and is intentionally left untouched.) +write_overrides() { + local host="$1" file="$2" + cat > "${file}" </dev/null || true + kubectl -n "${NAMESPACE}" delete pvc --all 2>/dev/null || true + kubectl delete namespace "${NAMESPACE}" --timeout=180s 2>/dev/null || true + if [[ "${1:-}" == "--all" ]]; then + log "Removing prerequisites (ingress-nginx + PGO)" + helm uninstall ingress-nginx -n ingress-nginx 2>/dev/null || true + helm uninstall pgo -n postgres-operator 2>/dev/null || true + kubectl delete namespace ingress-nginx postgres-operator --timeout=180s 2>/dev/null || true + fi +} + +case "${1:-deploy}" in + deploy) install_prereqs; deploy_chart; verify ;; + verify) verify ;; + teardown) teardown "${2:-}" ;; + *) echo "Usage: $0 {deploy|verify|teardown [--all]}" >&2; exit 2 ;; +esac diff --git a/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml b/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml new file mode 100644 index 0000000..7c94a73 --- /dev/null +++ b/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml @@ -0,0 +1,68 @@ +{{/* +Dedicated passthrough Ingress for services that must keep their path prefix. + +Why this exists: the upstream eoapi ingress applies a cluster-wide +`nginx.ingress.kubernetes.io/rewrite-target: /$2` to every path. That is correct +for the API services (raster/vector strip their prefix and serve at root), but +WRONG for two components that need the prefix preserved: + + * stac-auth-proxy — runs with ROOT_PATH=/stac and serves under /stac. + * browser (stac-browser) — the custom image is built with the /browser + pathPrefix baked in and only serves content under /browser/. + +A single ingress-wide rewrite cannot do both, so `eoapi.stac.ingress.enabled` +and `eoapi.browser.ingress.enabled` are turned off (dropping their broken, +rewritten paths from the upstream ingress) and the prefixes are routed here with +NO rewrite annotation. + +Host / className / paths / TLS all come from the same upstream `eoapi.*` values, +so this stays in sync with the rest of the deployment and hardcodes nothing. +*/}} +{{- $eoapi := .Values.eoapi -}} +{{- $sap := index $eoapi "stac-auth-proxy" -}} +{{- $port := $eoapi.service.port | default 8080 -}} +{{- $paths := list -}} +{{- if and $sap $sap.enabled -}} + {{- $paths = append $paths (dict "path" ($eoapi.stac.ingress.path | default "/stac") "service" (printf "%s-stac-auth-proxy" .Release.Name) "port" $port) -}} +{{- end -}} +{{- if and $eoapi.browser $eoapi.browser.enabled -}} + {{- $bport := $eoapi.browser.service.port | default 8080 -}} + {{- $paths = append $paths (dict "path" ($eoapi.browser.ingress.path | default "/browser") "service" (printf "%s-browser" .Release.Name) "port" $bport) -}} +{{- end -}} +{{- if and $eoapi.ingress.enabled $paths }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ .Release.Name }}-passthrough-ingress + labels: + app: {{ .Release.Name }}-passthrough-ingress + {{- with $eoapi.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if $eoapi.ingress.className }} + ingressClassName: {{ $eoapi.ingress.className }} + {{- end }} + rules: + - {{- if $eoapi.ingress.host }} + host: {{ $eoapi.ingress.host }} + {{- end }} + http: + paths: + {{- range $paths }} + - path: {{ .path }} + pathType: Prefix + backend: + service: + name: {{ .service }} + port: + number: {{ .port }} + {{- end }} + {{- if and $eoapi.ingress.tls.enabled $eoapi.ingress.host }} + tls: + - hosts: + - {{ $eoapi.ingress.host }} + secretName: {{ $eoapi.ingress.tls.secretName }} + {{- end }} +{{- end }} diff --git a/charts/eoapi-workshop/values.yaml b/infrastructure/charts/eoapi-workshop/values.yaml similarity index 79% rename from charts/eoapi-workshop/values.yaml rename to infrastructure/charts/eoapi-workshop/values.yaml index 2fcf5f5..e71c52c 100644 --- a/charts/eoapi-workshop/values.yaml +++ b/infrastructure/charts/eoapi-workshop/values.yaml @@ -16,6 +16,15 @@ # Using any other release name or namespace breaks stac-auth-proxy's OIDC # discovery. See README.md. # +# !!! HOST IS A DEPLOY-TIME INPUT !!! +# The externally-reachable host appears in four places below (ingress.host plus +# three auth URLs) and defaults to `localhost` — a LOCAL-ONLY fallback for kind/ +# minikube/k3s, matching the docker-compose workflow. On a remote cluster you do +# NOT edit these: deploy with `./deploy.sh` (or set INGRESS_HOST), which discovers +# the ingress LoadBalancer host and overrides all four at install time. Keeping +# the cluster-specific host out of this file is deliberate — it stays portable. +# See README.md "Remote clusters". +# # All values are nested under `eoapi:` because eoapi is a subchart. eoapi: ###################### @@ -77,7 +86,14 @@ eoapi: stac: enabled: true ingress: - enabled: true + # Disabled on purpose. The upstream eoapi ingress applies a global + # `nginx.ingress.kubernetes.io/rewrite-target: /$2` to ALL paths, but the + # /stac path it emits for stac-auth-proxy has no capture group, so /stac/* + # rewrites to "/" — stripping the prefix the proxy needs (ROOT_PATH=/stac). + # This chart instead ships a dedicated passthrough Ingress for /stac + # (templates/passthrough-ingress.yaml). `path` is still consumed by the + # stac Deployment's --root-path, so it stays defined here. + enabled: false path: "/stac" autoscaling: enabled: false @@ -136,6 +152,15 @@ eoapi: ###################### browser: enabled: true + # Disabled for the same reason as stac (see above): the custom stac-browser + # image is built with the /browser pathPrefix baked in and only serves under + # /browser/, but the upstream ingress rewrite-target: /$2 strips that prefix + # (404). /browser is routed via the dedicated passthrough Ingress instead + # (templates/passthrough-ingress.yaml). `path` stays defined (used by the + # browser's OIDC redirect_uri). + ingress: + enabled: false + path: "/browser" settings: resources: {} # External URL (reached from the user's browser through the ingress). @@ -189,6 +214,10 @@ eoapi: env: # Allow unauthenticated reads (workshop notebooks have no token). DEFAULT_PUBLIC: "true" + # Upstream STAC API the proxy fronts. REQUIRED on k8s: the proxy image + # defaults to http://localhost:8080 (docker-compose parity), but in-cluster + # STAC is a separate Service. Derived from the release-name contract `eoapi`. + UPSTREAM_URL: "http://eoapi-stac:8080" # External discovery URL — must match the token issuer (mock-oidc ISSUER, # reached by clients through the ingress). Depends on the ingress host. OIDC_DISCOVERY_URL: "http://localhost/mock-oidc/.well-known/openid-configuration" From d525404d9120f2b1aab910bb606f0fd3d03b6d2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Wed, 1 Jul 2026 17:18:45 +0300 Subject: [PATCH 03/24] ci(workshop): publish JupyterLab image to GHCR Adds a workflow that builds Dockerfile.local (the workshop conda env + baked-in docs notebooks) and pushes it to ghcr.io//eoapi-workshop:{latest,sha,branch}. The Helm chart's per-participant Labs consume this image (values key `jupyter.image`); until now the image was only built locally by docker-compose, so a K8s deployment had nothing to pull. Image name is derived from github.repository_owner so it stays correct in forks. Runs on push to main (Dockerfile/env/docs changes) and via manual workflow_dispatch (to build from the workshop branch). Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/publish-workshop-image.yml | 52 ++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/publish-workshop-image.yml diff --git a/.github/workflows/publish-workshop-image.yml b/.github/workflows/publish-workshop-image.yml new file mode 100644 index 0000000..7122199 --- /dev/null +++ b/.github/workflows/publish-workshop-image.yml @@ -0,0 +1,52 @@ +name: Publish workshop image + +# Builds the JupyterLab workshop image (Dockerfile.local + environment.yml) and +# pushes it to GHCR. Consumed by the Helm chart's per-participant Labs +# (infrastructure/charts/eoapi-workshop, values key `jupyter.image`). +on: + push: + branches: + - main + paths: + - Dockerfile.local + - environment.yml + - docs/** + - .github/workflows/publish-workshop-image.yml + workflow_dispatch: {} # manual run — e.g. to build from the workshop branch + +jobs: + publish: + name: Build and push + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v5 + + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Image metadata + id: meta + uses: docker/metadata-action@v5 + with: + # Portable: resolves to ghcr.io/developmentseed/eoapi-workshop in this repo. + images: ghcr.io/${{ github.repository_owner }}/eoapi-workshop + tags: | + type=raw,value=latest,enable={{is_default_branch}} + type=sha,format=long + type=ref,event=branch + + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + file: Dockerfile.local + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} From e6fb0b252d21bc7e23d77051e45b4c637acdcb96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Wed, 1 Jul 2026 17:25:40 +0300 Subject: [PATCH 04/24] feat(helm): per-participant JupyterLab environments Adds templates/jupyter.yaml: one isolated JupyterLab Deployment+Service+PVC per entry in values `jupyter.participants` (default 5), served at /lab/ through the existing no-rewrite passthrough ingress (extended here). Each pod: - runs the published GHCR workshop image via `args` only, preserving the image ENTRYPOINT that activates the conda env; - gets its own RWO PVC at /home/jovyan, seeded once from the image by an initContainer so the empty volume doesn't shadow the baked-in notebooks; - uses strategy Recreate (RWO can't roll) and TCP probes (JupyterLab exposes no unauthenticated HTTP health endpoint), with a generous startupProbe for the large first image pull; - injects the same eoAPI endpoints as the docker-compose jupyterhub service (in-cluster Service DNS) plus DB creds from the PGO secret eoapi-pguser-eoapi using the DIRECT primary keys (not pgbouncer-*, whose transaction pooling breaks 02-database's DDL/COPY). Tokens are injected per participant by deploy.sh (next commit); a bare helm install leaves them empty. Adds tests/render-checks.sh as the chart's render-level regression suite. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../eoapi-workshop/templates/jupyter.yaml | 138 ++++++++++++++++++ .../templates/passthrough-ingress.yaml | 6 + .../eoapi-workshop/tests/render-checks.sh | 53 +++++++ .../charts/eoapi-workshop/values.yaml | 27 ++++ 4 files changed, 224 insertions(+) create mode 100644 infrastructure/charts/eoapi-workshop/templates/jupyter.yaml create mode 100755 infrastructure/charts/eoapi-workshop/tests/render-checks.sh diff --git a/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml b/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml new file mode 100644 index 0000000..a5902cd --- /dev/null +++ b/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml @@ -0,0 +1,138 @@ +{{/* +Per-participant JupyterLab environments (one isolated Deployment+Service+PVC +each) served at /lab/. Routed by templates/passthrough-ingress.yaml (the +prefix must be preserved to match --ServerApp.base_url). Endpoints + DB creds +are injected to mirror the docker-compose `jupyterhub` service so the workshop +notebooks run unchanged. +*/}} +{{- if .Values.jupyter.enabled }} +{{- $root := . }} +{{- $j := .Values.jupyter }} +{{- $host := .Values.eoapi.ingress.host | default "localhost" }} +{{- range $j.participants }} +{{- $name := .name }} +{{- $token := .token | default "" }} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ $root.Release.Name }}-{{ $name }} + labels: + app: {{ $root.Release.Name }}-{{ $name }} + app.kubernetes.io/component: workshop-jupyterlab +spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: {{ $j.storage.size | quote }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ $root.Release.Name }}-{{ $name }} + labels: + app: {{ $root.Release.Name }}-{{ $name }} + app.kubernetes.io/component: workshop-jupyterlab +spec: + selector: + app: {{ $root.Release.Name }}-{{ $name }} + ports: + - name: http + port: 8888 + targetPort: 8888 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ $root.Release.Name }}-{{ $name }} + labels: + app: {{ $root.Release.Name }}-{{ $name }} + app.kubernetes.io/component: workshop-jupyterlab +spec: + replicas: 1 + strategy: + type: Recreate # RWO PVC: the new pod can't mount until the old one releases it + selector: + matchLabels: + app: {{ $root.Release.Name }}-{{ $name }} + template: + metadata: + labels: + app: {{ $root.Release.Name }}-{{ $name }} + spec: + securityContext: + fsGroup: 1000 # jovyan GID — makes the PVC writable by the notebook user + # Seed the PVC-backed home from the image ONCE. Mounting the (initially + # empty) PVC at /home/jovyan would otherwise shadow the baked-in notebooks; + # the .seeded marker keeps a later restart from clobbering a participant's work. + initContainers: + - name: seed-home + image: "{{ $j.image.repository }}:{{ $j.image.tag }}" + imagePullPolicy: {{ $j.image.pullPolicy }} + command: ["bash", "-c", "test -e /mnt/home/.seeded || { cp -a /home/jovyan/. /mnt/home/ && touch /mnt/home/.seeded; }"] + volumeMounts: + - name: home + mountPath: /mnt/home + containers: + - name: jupyterlab + image: "{{ $j.image.repository }}:{{ $j.image.tag }}" + imagePullPolicy: {{ $j.image.pullPolicy }} + # args only (NO command): keep the image ENTRYPOINT (/entrypoint.sh + # activates the conda env) and just override the launch command. + args: + - jupyter + - lab + - --ServerApp.base_url=/lab/{{ $name }} + - --ServerApp.token={{ $token }} + - --ip=0.0.0.0 + - --port=8888 + - --no-browser + ports: + - name: http + containerPort: 8888 + env: + # eoAPI endpoints (in-cluster) — mirrors the docker-compose jupyterhub service. + - { name: STAC_API_ENDPOINT, value: "http://{{ $root.Release.Name }}-stac-auth-proxy:8080" } + - { name: STAC_AUTH_PROXY_ENDPOINT, value: "http://{{ $root.Release.Name }}-stac-auth-proxy:8080" } + - { name: TITILER_PGSTAC_API_ENDPOINT, value: "http://{{ $root.Release.Name }}-raster:8080" } + - { name: TIPG_API_ENDPOINT, value: "http://{{ $root.Release.Name }}-vector:8080" } + - { name: MOCK_OIDC_ENDPOINT, value: "http://{{ $root.Release.Name }}-mock-oidc-server:8080" } + - { name: STAC_BROWSER_ENDPOINT, value: "http://{{ $host }}/browser" } + # DB creds from the PGO-generated secret, using the DIRECT primary keys + # (host/port) — NOT pgbouncer-*, whose transaction pooling breaks the + # DDL/COPY in 02-database.ipynb. Secret name is release-derived + # (release/namespace contract: both must be "eoapi"). + - name: PGHOST + valueFrom: { secretKeyRef: { name: {{ $root.Release.Name }}-pguser-eoapi, key: host } } + - name: PGPORT + valueFrom: { secretKeyRef: { name: {{ $root.Release.Name }}-pguser-eoapi, key: port } } + - name: PGDATABASE + valueFrom: { secretKeyRef: { name: {{ $root.Release.Name }}-pguser-eoapi, key: dbname } } + - name: PGUSER + valueFrom: { secretKeyRef: { name: {{ $root.Release.Name }}-pguser-eoapi, key: user } } + - name: PGPASSWORD + valueFrom: { secretKeyRef: { name: {{ $root.Release.Name }}-pguser-eoapi, key: password } } + volumeMounts: + - name: home + mountPath: /home/jovyan + # JupyterLab has no unauthenticated HTTP health endpoint → probe TCP. + # Generous startupProbe so the first (large) image pull doesn't trip liveness. + startupProbe: + tcpSocket: { port: 8888 } + periodSeconds: 10 + failureThreshold: 30 + readinessProbe: + tcpSocket: { port: 8888 } + periodSeconds: 10 + livenessProbe: + tcpSocket: { port: 8888 } + periodSeconds: 30 + failureThreshold: 3 + resources: + {{- toYaml $j.resources | nindent 12 }} + volumes: + - name: home + persistentVolumeClaim: + claimName: {{ $root.Release.Name }}-{{ $name }} +{{- end }} +{{- end }} diff --git a/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml b/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml index 7c94a73..97ceddb 100644 --- a/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml +++ b/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml @@ -29,6 +29,12 @@ so this stays in sync with the rest of the deployment and hardcodes nothing. {{- $bport := $eoapi.browser.service.port | default 8080 -}} {{- $paths = append $paths (dict "path" ($eoapi.browser.ingress.path | default "/browser") "service" (printf "%s-browser" .Release.Name) "port" $bport) -}} {{- end -}} +{{/* Per-participant JupyterLabs also keep their prefix (--ServerApp.base_url=/lab/). */}} +{{- if and .Values.jupyter .Values.jupyter.enabled -}} + {{- range .Values.jupyter.participants -}} + {{- $paths = append $paths (dict "path" (printf "/lab/%s" .name) "service" (printf "%s-%s" $.Release.Name .name) "port" 8888) -}} + {{- end -}} +{{- end -}} {{- if and $eoapi.ingress.enabled $paths }} apiVersion: networking.k8s.io/v1 kind: Ingress diff --git a/infrastructure/charts/eoapi-workshop/tests/render-checks.sh b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh new file mode 100755 index 0000000..3d1cb6f --- /dev/null +++ b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +# +# Render-level tests for the eoapi-workshop chart (the "unit tests" for Helm: +# assert what `helm template` produces). Run after `helm dependency build`. +# +# ./tests/render-checks.sh +# +# Exits non-zero on any failed assertion. +set -uo pipefail + +CHART_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REL=eoapi +NS=eoapi +fail=0 + +# Render a single template file in isolation (keeps assertions unambiguous). +show() { helm template "$REL" "$CHART_DIR" -n "$NS" --show-only "$1" "${@:2}" 2>/dev/null; } + +check_count() { # + local n; n=$(printf '%s\n' "$1" | grep -cE "$2") + if [[ "$n" == "$3" ]]; then printf ' ok %-52s %s\n' "$4" "$n" + else printf ' FAIL %-52s expected %s got %s\n' "$4" "$3" "$n"; fail=1; fi +} +check_has() { # + if printf '%s\n' "$1" | grep -qE "$2"; then printf ' ok %s\n' "$3" + else printf ' FAIL %s (pattern: %s)\n' "$3" "$2"; fail=1; fi +} +check_absent() { # + if printf '%s\n' "$1" | grep -qE "$2"; then printf ' FAIL %s (should be absent: %s)\n' "$3" "$2"; fail=1 + else printf ' ok %s\n' "$3"; fi +} + +echo "== Jupyter (templates/jupyter.yaml) ==" +J="$(show templates/jupyter.yaml)" +check_count "$J" '^kind: Deployment' 5 "5 Lab Deployments" +check_count "$J" '^kind: Service' 5 "5 Lab Services" +check_count "$J" '^kind: PersistentVolumeClaim' 5 "5 Lab PVCs" +check_has "$J" 'type: Recreate' "Deployment strategy Recreate (RWO PVC safe)" +check_has "$J" 'tcpSocket:' "TCP probe (no auth endpoint)" +check_has "$J" 'ServerApp.base_url=/lab/lab-01' "base_url set per participant" +check_has "$J" 'name: eoapi-pguser-eoapi' "PG creds from PGO secret" +check_has "$J" 'key: host' "PG direct-primary host key" +check_absent "$J" 'key: pgbouncer' "does NOT use pgbouncer secret keys (DDL/COPY safe)" +check_has "$J" 'eoapi-stac-auth-proxy:8080' "STAC endpoint injected" +J_OFF="$(show templates/jupyter.yaml --set jupyter.enabled=false)" +check_count "$J_OFF" '^kind: Deployment' 0 "jupyter.enabled=false renders nothing" + +echo "== Passthrough ingress (templates/passthrough-ingress.yaml) ==" +I="$(show templates/passthrough-ingress.yaml)" +check_count "$I" 'path: /lab/lab-0[1-5]' 5 "5 /lab/ ingress paths" + +if [[ "$fail" == 0 ]]; then echo "ALL CHECKS PASSED"; else echo "SOME CHECKS FAILED"; fi +exit "$fail" diff --git a/infrastructure/charts/eoapi-workshop/values.yaml b/infrastructure/charts/eoapi-workshop/values.yaml index e71c52c..f70733e 100644 --- a/infrastructure/charts/eoapi-workshop/values.yaml +++ b/infrastructure/charts/eoapi-workshop/values.yaml @@ -293,3 +293,30 @@ eoapi: enabled: true connectionPooling: enabled: false + +################################################################## +# WORKSHOP JUPYTERLABS (top-level — this chart's own templates) +################################################################## +# One isolated JupyterLab per participant at /lab/, each with its own +# PVC (persistent home) and access token. COUNT = length of `participants` +# (default 5). Tokens are filled in by deploy.sh at deploy time and live only +# in the gitignored .deploy/overrides.yaml — a direct `helm install` (without +# deploy.sh) leaves tokens empty, i.e. the Labs are UNAUTHENTICATED. Use +# deploy.sh for any real deployment. +jupyter: + enabled: true + image: + repository: ghcr.io/developmentseed/eoapi-workshop + tag: "latest" + pullPolicy: IfNotPresent + storage: + size: "2Gi" # per-participant PVC mounted at /home/jovyan + resources: + requests: { cpu: "250m", memory: "1Gi" } + limits: { cpu: "2", memory: "4Gi" } + participants: # COUNT = length of this list; tokens set by deploy.sh + - { name: lab-01 } + - { name: lab-02 } + - { name: lab-03 } + - { name: lab-04 } + - { name: lab-05 } From 51b12f0bd3a7215c4eae8e660236d5e2f38a62b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Wed, 1 Jul 2026 17:33:00 +0300 Subject: [PATCH 05/24] feat(helm): add stac-manager UI (routed at /manager) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Declares the published stac-manager chart (1.0.3, https://stac-manager.ds.io/) as a dependency and wires it to the workshop STAC API + mock OIDC: - fullnameOverride pins the Service to `eoapi-stac-manager` so the passthrough ingress can reference it by a stable name; - stacApi/publicUrl/stacBrowser/oidc default to the localhost paths (deploy.sh rewrites the host at deploy time); - resources raised (1-4Gi) because the container runs a build at startup; - /manager added to the passthrough ingress (prefix preserved, PUBLIC_URL=/manager). Also fixes a false-negative in tests/render-checks.sh: with `set -o pipefail`, `printf | grep -q` reports failure on large inputs because grep short-circuits and printf takes SIGPIPE — switched the check helpers to here-strings. NOTE: stac-manager OIDC login uses PKCE (needs a secure context), so editing works on localhost but requires TLS on a remote http host. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../charts/eoapi-workshop/Chart.lock | 7 ++++-- .../charts/eoapi-workshop/Chart.yaml | 6 +++++ .../templates/passthrough-ingress.yaml | 6 +++++ .../eoapi-workshop/tests/render-checks.sh | 19 ++++++++++++--- .../charts/eoapi-workshop/values.yaml | 24 +++++++++++++++++++ 5 files changed, 57 insertions(+), 5 deletions(-) diff --git a/infrastructure/charts/eoapi-workshop/Chart.lock b/infrastructure/charts/eoapi-workshop/Chart.lock index 6289b6c..63780a7 100644 --- a/infrastructure/charts/eoapi-workshop/Chart.lock +++ b/infrastructure/charts/eoapi-workshop/Chart.lock @@ -2,5 +2,8 @@ dependencies: - name: eoapi repository: https://developmentseed.org/eoapi-k8s/ version: 0.13.1 -digest: sha256:d779692bc842571128c0a8e3f0e7dfdf0a8344db4f3385ee5945921fc2343621 -generated: "2026-06-30T17:09:54.770014+03:00" +- name: stac-manager + repository: https://stac-manager.ds.io/ + version: 1.0.3 +digest: sha256:c266058775f9745e48df835657208d23f5785875904049c880093faa5a7886bd +generated: "2026-07-01T17:27:13.34478+03:00" diff --git a/infrastructure/charts/eoapi-workshop/Chart.yaml b/infrastructure/charts/eoapi-workshop/Chart.yaml index dafcbcd..ea356bc 100644 --- a/infrastructure/charts/eoapi-workshop/Chart.yaml +++ b/infrastructure/charts/eoapi-workshop/Chart.yaml @@ -19,3 +19,9 @@ dependencies: - name: eoapi version: 0.13.1 repository: https://developmentseed.org/eoapi-k8s/ + # stac-manager: STAC collection/item editing UI (deployed the EOEPCA way — + # its published chart). Routed at /manager via the passthrough ingress. + - name: stac-manager + version: 1.0.3 + repository: https://stac-manager.ds.io/ + condition: stac-manager.enabled diff --git a/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml b/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml index 97ceddb..f7a0b3a 100644 --- a/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml +++ b/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml @@ -35,6 +35,12 @@ so this stays in sync with the rest of the deployment and hardcodes nothing. {{- $paths = append $paths (dict "path" (printf "/lab/%s" .name) "service" (printf "%s-%s" $.Release.Name .name) "port" 8888) -}} {{- end -}} {{- end -}} +{{/* stac-manager keeps its prefix too (built with PUBLIC_URL=/manager). Service + name is pinned by fullnameOverride; port 80 per stac-manager chart 1.0.3. */}} +{{- $sm := index .Values "stac-manager" -}} +{{- if and $sm $sm.enabled -}} + {{- $paths = append $paths (dict "path" "/manager" "service" "eoapi-stac-manager" "port" 80) -}} +{{- end -}} {{- if and $eoapi.ingress.enabled $paths }} apiVersion: networking.k8s.io/v1 kind: Ingress diff --git a/infrastructure/charts/eoapi-workshop/tests/render-checks.sh b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh index 3d1cb6f..414922d 100755 --- a/infrastructure/charts/eoapi-workshop/tests/render-checks.sh +++ b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh @@ -16,17 +16,21 @@ fail=0 # Render a single template file in isolation (keeps assertions unambiguous). show() { helm template "$REL" "$CHART_DIR" -n "$NS" --show-only "$1" "${@:2}" 2>/dev/null; } +# NOTE: use here-strings (<<<), not `printf | grep`. Under `set -o pipefail`, +# `grep -q` short-circuits on a match and closes the pipe, so printf dies with +# SIGPIPE and pipefail reports the pipeline as failed → false negatives on large +# inputs. Here-strings have no pipe, so no SIGPIPE. check_count() { # - local n; n=$(printf '%s\n' "$1" | grep -cE "$2") + local n; n=$(grep -cE "$2" <<<"$1") || true if [[ "$n" == "$3" ]]; then printf ' ok %-52s %s\n' "$4" "$n" else printf ' FAIL %-52s expected %s got %s\n' "$4" "$3" "$n"; fail=1; fi } check_has() { # - if printf '%s\n' "$1" | grep -qE "$2"; then printf ' ok %s\n' "$3" + if grep -qE "$2" <<<"$1"; then printf ' ok %s\n' "$3" else printf ' FAIL %s (pattern: %s)\n' "$3" "$2"; fail=1; fi } check_absent() { # - if printf '%s\n' "$1" | grep -qE "$2"; then printf ' FAIL %s (should be absent: %s)\n' "$3" "$2"; fail=1 + if grep -qE "$2" <<<"$1"; then printf ' FAIL %s (should be absent: %s)\n' "$3" "$2"; fail=1 else printf ' ok %s\n' "$3"; fi } @@ -45,9 +49,18 @@ check_has "$J" 'eoapi-stac-auth-proxy:8080' "STAC endpoint injected" J_OFF="$(show templates/jupyter.yaml --set jupyter.enabled=false)" check_count "$J_OFF" '^kind: Deployment' 0 "jupyter.enabled=false renders nothing" +echo "== stac-manager (subchart) ==" +ALL="$(helm template "$REL" "$CHART_DIR" -n "$NS" 2>/dev/null)" +check_has "$ALL" 'name: eoapi-stac-manager' "Service/Deployment named eoapi-stac-manager (fullnameOverride)" +check_has "$ALL" 'REACT_APP_STAC_API' "STAC API env wired" +check_has "$ALL" 'REACT_APP_OIDC_AUTHORITY' "OIDC authority env wired" +ALL_OFF="$(helm template "$REL" "$CHART_DIR" -n "$NS" --set 'stac-manager.enabled=false' 2>/dev/null)" +check_absent "$ALL_OFF" 'name: eoapi-stac-manager' "stac-manager.enabled=false renders nothing" + echo "== Passthrough ingress (templates/passthrough-ingress.yaml) ==" I="$(show templates/passthrough-ingress.yaml)" check_count "$I" 'path: /lab/lab-0[1-5]' 5 "5 /lab/ ingress paths" +check_count "$I" 'path: /manager' 1 "/manager passthrough path" if [[ "$fail" == 0 ]]; then echo "ALL CHECKS PASSED"; else echo "SOME CHECKS FAILED"; fi exit "$fail" diff --git a/infrastructure/charts/eoapi-workshop/values.yaml b/infrastructure/charts/eoapi-workshop/values.yaml index f70733e..d7b201c 100644 --- a/infrastructure/charts/eoapi-workshop/values.yaml +++ b/infrastructure/charts/eoapi-workshop/values.yaml @@ -320,3 +320,27 @@ jupyter: - { name: lab-03 } - { name: lab-04 } - { name: lab-05 } + +################################################################## +# STAC-MANAGER (subchart — STAC editing UI, EOEPCA-style) +################################################################## +# Served at /manager (routed by the passthrough ingress; the app's own ingress +# is disabled). The host in the URLs below defaults to localhost and is +# rewritten by deploy.sh at deploy time. OIDC is wired to the mock server so +# editing works — NOTE: browser OIDC (PKCE) needs a secure context, so +# login/editing works on localhost but requires TLS on a remote http host. +stac-manager: + enabled: true + fullnameOverride: "eoapi-stac-manager" # pin the Service name for the passthrough route + ingress: + enabled: false + publicUrl: "http://localhost/manager" + stacApi: "http://localhost/stac" + stacBrowser: "http://localhost/browser" + appTitle: "eoAPI Workshop STAC Manager" + oidc: + authority: "http://localhost/mock-oidc" + clientId: "test-client" + resources: # the container BUILDS at startup — needs headroom + requests: { cpu: "500m", memory: "1Gi" } + limits: { cpu: "2", memory: "4Gi" } From 839fa624c163e88ee3b8c7c69ddac5a7cc5f522d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Wed, 1 Jul 2026 17:46:36 +0300 Subject: [PATCH 06/24] feat(helm): subdomain-per-service routing (*.eoapi-workshop.ds.io) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Switches the workshop stack from path-based to host-based routing: every service is served at the ROOT of its own subdomain under a wildcard domain (requires *. DNS → ingress LB). - new templates/subdomain-ingress.yaml owns all routing; removes the path-based templates/passthrough-ingress.yaml and disables the upstream eoapi ingress (eoapi.ingress.enabled=false); - new top-level `routing` values block (baseDomain, className, tls); - stac/raster/vector served at root (ingress.path="" → --root-path=); - stac-auth-proxy ROOT_PATH="" with /healthz probes; - browser swapped to the root-serving radiantearth/stac-browser image (the upstream custom image bakes a /browser prefix that breaks at a subdomain root) and pointed at stac.; - mock-oidc ISSUER + all cross-service URLs (proxy discovery, browser, stac-manager stacApi/publicUrl/stacBrowser/oidc) moved to subdomains; - JupyterLabs drop --ServerApp.base_url and serve at lab-NN. root. Hosts: stac. raster. vector. browser. manager. mock-oidc. lab-01..05. Tests updated to assert the subdomain hosts/backends and absence of rewrites. Known limit: browser OIDC redirect_uri still derives from the apex host; and OIDC login (PKCE) needs TLS. Read/browse works over http. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../charts/stac-manager-1.0.3.tgz | Bin 0 -> 3874 bytes .../eoapi-workshop/templates/jupyter.yaml | 6 +- .../templates/passthrough-ingress.yaml | 80 ---------- .../templates/subdomain-ingress.yaml | 69 +++++++++ .../eoapi-workshop/tests/render-checks.sh | 14 +- .../charts/eoapi-workshop/values.yaml | 140 ++++++++++-------- 6 files changed, 156 insertions(+), 153 deletions(-) create mode 100644 infrastructure/charts/eoapi-workshop/charts/stac-manager-1.0.3.tgz delete mode 100644 infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml create mode 100644 infrastructure/charts/eoapi-workshop/templates/subdomain-ingress.yaml diff --git a/infrastructure/charts/eoapi-workshop/charts/stac-manager-1.0.3.tgz b/infrastructure/charts/eoapi-workshop/charts/stac-manager-1.0.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..25bad18d91d0506626d5b04dfaf8378ee43ff50b GIT binary patch literal 3874 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 literal 0 HcmV?d00001 diff --git a/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml b/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml index a5902cd..431e579 100644 --- a/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml +++ b/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml @@ -8,7 +8,7 @@ notebooks run unchanged. {{- if .Values.jupyter.enabled }} {{- $root := . }} {{- $j := .Values.jupyter }} -{{- $host := .Values.eoapi.ingress.host | default "localhost" }} +{{- $base := .Values.routing.baseDomain }} {{- range $j.participants }} {{- $name := .name }} {{- $token := .token | default "" }} @@ -79,10 +79,10 @@ spec: imagePullPolicy: {{ $j.image.pullPolicy }} # args only (NO command): keep the image ENTRYPOINT (/entrypoint.sh # activates the conda env) and just override the launch command. + # Served at the root of . — no base_url prefix. args: - jupyter - lab - - --ServerApp.base_url=/lab/{{ $name }} - --ServerApp.token={{ $token }} - --ip=0.0.0.0 - --port=8888 @@ -97,7 +97,7 @@ spec: - { name: TITILER_PGSTAC_API_ENDPOINT, value: "http://{{ $root.Release.Name }}-raster:8080" } - { name: TIPG_API_ENDPOINT, value: "http://{{ $root.Release.Name }}-vector:8080" } - { name: MOCK_OIDC_ENDPOINT, value: "http://{{ $root.Release.Name }}-mock-oidc-server:8080" } - - { name: STAC_BROWSER_ENDPOINT, value: "http://{{ $host }}/browser" } + - { name: STAC_BROWSER_ENDPOINT, value: "http://browser.{{ $base }}" } # DB creds from the PGO-generated secret, using the DIRECT primary keys # (host/port) — NOT pgbouncer-*, whose transaction pooling breaks the # DDL/COPY in 02-database.ipynb. Secret name is release-derived diff --git a/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml b/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml deleted file mode 100644 index f7a0b3a..0000000 --- a/infrastructure/charts/eoapi-workshop/templates/passthrough-ingress.yaml +++ /dev/null @@ -1,80 +0,0 @@ -{{/* -Dedicated passthrough Ingress for services that must keep their path prefix. - -Why this exists: the upstream eoapi ingress applies a cluster-wide -`nginx.ingress.kubernetes.io/rewrite-target: /$2` to every path. That is correct -for the API services (raster/vector strip their prefix and serve at root), but -WRONG for two components that need the prefix preserved: - - * stac-auth-proxy — runs with ROOT_PATH=/stac and serves under /stac. - * browser (stac-browser) — the custom image is built with the /browser - pathPrefix baked in and only serves content under /browser/. - -A single ingress-wide rewrite cannot do both, so `eoapi.stac.ingress.enabled` -and `eoapi.browser.ingress.enabled` are turned off (dropping their broken, -rewritten paths from the upstream ingress) and the prefixes are routed here with -NO rewrite annotation. - -Host / className / paths / TLS all come from the same upstream `eoapi.*` values, -so this stays in sync with the rest of the deployment and hardcodes nothing. -*/}} -{{- $eoapi := .Values.eoapi -}} -{{- $sap := index $eoapi "stac-auth-proxy" -}} -{{- $port := $eoapi.service.port | default 8080 -}} -{{- $paths := list -}} -{{- if and $sap $sap.enabled -}} - {{- $paths = append $paths (dict "path" ($eoapi.stac.ingress.path | default "/stac") "service" (printf "%s-stac-auth-proxy" .Release.Name) "port" $port) -}} -{{- end -}} -{{- if and $eoapi.browser $eoapi.browser.enabled -}} - {{- $bport := $eoapi.browser.service.port | default 8080 -}} - {{- $paths = append $paths (dict "path" ($eoapi.browser.ingress.path | default "/browser") "service" (printf "%s-browser" .Release.Name) "port" $bport) -}} -{{- end -}} -{{/* Per-participant JupyterLabs also keep their prefix (--ServerApp.base_url=/lab/). */}} -{{- if and .Values.jupyter .Values.jupyter.enabled -}} - {{- range .Values.jupyter.participants -}} - {{- $paths = append $paths (dict "path" (printf "/lab/%s" .name) "service" (printf "%s-%s" $.Release.Name .name) "port" 8888) -}} - {{- end -}} -{{- end -}} -{{/* stac-manager keeps its prefix too (built with PUBLIC_URL=/manager). Service - name is pinned by fullnameOverride; port 80 per stac-manager chart 1.0.3. */}} -{{- $sm := index .Values "stac-manager" -}} -{{- if and $sm $sm.enabled -}} - {{- $paths = append $paths (dict "path" "/manager" "service" "eoapi-stac-manager" "port" 80) -}} -{{- end -}} -{{- if and $eoapi.ingress.enabled $paths }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ .Release.Name }}-passthrough-ingress - labels: - app: {{ .Release.Name }}-passthrough-ingress - {{- with $eoapi.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if $eoapi.ingress.className }} - ingressClassName: {{ $eoapi.ingress.className }} - {{- end }} - rules: - - {{- if $eoapi.ingress.host }} - host: {{ $eoapi.ingress.host }} - {{- end }} - http: - paths: - {{- range $paths }} - - path: {{ .path }} - pathType: Prefix - backend: - service: - name: {{ .service }} - port: - number: {{ .port }} - {{- end }} - {{- if and $eoapi.ingress.tls.enabled $eoapi.ingress.host }} - tls: - - hosts: - - {{ $eoapi.ingress.host }} - secretName: {{ $eoapi.ingress.tls.secretName }} - {{- end }} -{{- end }} diff --git a/infrastructure/charts/eoapi-workshop/templates/subdomain-ingress.yaml b/infrastructure/charts/eoapi-workshop/templates/subdomain-ingress.yaml new file mode 100644 index 0000000..56b2aa7 --- /dev/null +++ b/infrastructure/charts/eoapi-workshop/templates/subdomain-ingress.yaml @@ -0,0 +1,69 @@ +{{/* +Subdomain-per-service ingress. Each enabled service is exposed at +

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Ð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 m|4o!N-v9EE>ao|iE!(m!+p;a?<$nSI0RR6%Dc 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 diff --git a/infrastructure/charts/eoapi-workshop/deploy.sh b/infrastructure/charts/eoapi-workshop/deploy.sh index 73c426f..109780e 100755 --- a/infrastructure/charts/eoapi-workshop/deploy.sh +++ b/infrastructure/charts/eoapi-workshop/deploy.sh @@ -20,6 +20,9 @@ # NAMESPACE target namespace (default: eoapi) -- see OIDC contract below # BASE_DOMAIN wildcard base domain (default: eoapi-workshop.ds.io) # SKIP_PREREQS=1 skip the ingress-nginx + PGO install +# GHCR_TOKEN token with read:packages → create an imagePullSecret so the +# cluster can pull a PRIVATE workshop image (with GHCR_USER). +# Omit if the GHCR package is public. # # !!! OIDC CONTRACT !!! The proxy's OIDC_DISCOVERY_INTERNAL_URL is pinned to the # Service DNS name eoapi-mock-oidc-server.eoapi.svc.cluster.local, derived from @@ -104,12 +107,37 @@ write_overrides() { mv "$tmp" "$OVERRIDES" } +# Optional: let the cluster pull a PRIVATE workshop image. Set GHCR_TOKEN (a +# token with read:packages) + GHCR_USER to create an imagePullSecret and attach +# it to the namespace's default ServiceAccount (which the Labs use). Must run +# BEFORE the Lab pods are created so the secret is injected at creation time. +# Not needed if the GHCR package is public. +setup_pull_secret() { + if [[ -z "${GHCR_TOKEN:-}" ]]; then + log "No GHCR_TOKEN set — assuming the workshop image is public (skipping pull secret)" + return + fi + log "Creating GHCR pull secret + attaching it to the default ServiceAccount" + kubectl create namespace "$NAMESPACE" --dry-run=client -o yaml | kubectl apply -f - >/dev/null + kubectl -n "$NAMESPACE" create secret docker-registry ghcr-pull \ + --docker-server=ghcr.io --docker-username="${GHCR_USER:-$USER}" --docker-password="$GHCR_TOKEN" \ + --dry-run=client -o yaml | kubectl apply -f - >/dev/null + kubectl -n "$NAMESPACE" patch serviceaccount default \ + -p '{"imagePullSecrets":[{"name":"ghcr-pull"}]}' >/dev/null +} + deploy_chart() { log "Building chart dependencies" + # Register the dependency repos so `helm dependency build` can resolve them + # from Chart.lock on a fresh machine (the vendored .tgz are gitignored). + helm repo add eoapi https://developmentseed.org/eoapi-k8s/ --force-update >/dev/null 2>&1 || true + helm repo add stac-manager https://stac-manager.ds.io/ --force-update >/dev/null 2>&1 || true + helm repo update eoapi stac-manager >/dev/null 2>&1 || true helm dependency build "$CHART_DIR" >/dev/null log "Writing host overrides for ${BASE_DOMAIN} (tokens preserved across re-deploys)" write_overrides echo " overrides: ${OVERRIDES}" + setup_pull_secret # before helm upgrade, so new Lab pods inherit the secret log "Deploying release '${RELEASE}' in namespace '${NAMESPACE}'" helm upgrade --install "$RELEASE" "$CHART_DIR" \ -n "$NAMESPACE" --create-namespace -f "$OVERRIDES" diff --git a/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml b/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml index 902169d..caa81c9 100644 --- a/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml +++ b/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml @@ -1,8 +1,9 @@ {{/* Per-participant JupyterLab environments (one isolated Deployment+Service+PVC -each) served at /lab/. Routed by templates/passthrough-ingress.yaml (the -prefix must be preserved to match --ServerApp.base_url). Endpoints + DB creds -are injected to mirror the docker-compose `jupyterhub` service so the workshop +each), served at the ROOT of . and routed by +templates/subdomain-ingress.yaml (no path prefix, no base_url). Notebooks come +from the image; only /home/jovyan/work is persisted. Endpoints + DB creds are +injected to mirror the docker-compose `jupyterhub` service so the workshop notebooks run unchanged. */}} {{- if .Values.jupyter.enabled }} diff --git a/infrastructure/charts/eoapi-workshop/values.yaml b/infrastructure/charts/eoapi-workshop/values.yaml index 5c92f3e..7bbf462 100644 --- a/infrastructure/charts/eoapi-workshop/values.yaml +++ b/infrastructure/charts/eoapi-workshop/values.yaml @@ -311,9 +311,11 @@ eoapi: # WORKSHOP JUPYTERLABS (top-level — this chart's own templates) ################################################################## # One isolated JupyterLab per participant at . (served at -# root), each with its own PVC (persistent home) and access token. COUNT = -# length of `participants` (default 5). Tokens are filled in by deploy.sh at -# deploy time and live only in the gitignored .deploy/overrides.yaml — a direct +# root) and an access token. Notebooks come FRESH from the image on every start; +# only /home/jovyan/work is a persistent PVC (edits to the provided notebooks +# reset on restart — save work under work/). COUNT = length of `participants` +# (default 5). Tokens are filled in by deploy.sh at deploy time and live only +# in the gitignored .deploy/overrides.yaml — a direct # `helm install` (without deploy.sh) leaves tokens empty, i.e. the Labs are # UNAUTHENTICATED. Use deploy.sh for any real deployment. jupyter: From e865816d022dedf256940f82dc3ef41490ff40a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Wed, 1 Jul 2026 19:44:31 +0300 Subject: [PATCH 15/24] ci(helm)+chore: validate chart in CI and print URLs via NOTES.txt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Best-practices pass (/ai-engineering: test at every boundary, own the change): - ci.yml: add a `helm` job that registers the dependency repos, builds dependencies, runs `helm lint`, and executes tests/render-checks.sh — so the chart's render invariants (subdomain hosts/backends, in-cluster OIDC URL, PG direct-primary keys, no base_url) are enforced automatically on every PR. - templates/NOTES.txt: after install/upgrade, print each service subdomain and the per-participant JupyterLab URLs (with tokens when deployed via deploy.sh), plus a pointer to `./deploy.sh verify`. Verified: NOTES renders correctly; helm lint + render-checks pass; ci.yml parses. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 17 +++++++++++ .../charts/eoapi-workshop/templates/NOTES.txt | 29 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 infrastructure/charts/eoapi-workshop/templates/NOTES.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 01d7190..39743c0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,3 +17,20 @@ jobs: run: uv run ruff check - name: Format run: uv run ruff format --check + + helm: + name: Helm chart + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: azure/setup-helm@v4 + - name: Register dependency repos + run: | + helm repo add eoapi https://developmentseed.org/eoapi-k8s/ + helm repo add stac-manager https://stac-manager.ds.io/ + - name: Build chart dependencies + run: helm dependency build infrastructure/charts/eoapi-workshop + - name: Lint + run: helm lint infrastructure/charts/eoapi-workshop + - name: Render checks + run: ./infrastructure/charts/eoapi-workshop/tests/render-checks.sh diff --git a/infrastructure/charts/eoapi-workshop/templates/NOTES.txt b/infrastructure/charts/eoapi-workshop/templates/NOTES.txt new file mode 100644 index 0000000..f5709cf --- /dev/null +++ b/infrastructure/charts/eoapi-workshop/templates/NOTES.txt @@ -0,0 +1,29 @@ +eoAPI workshop — release {{ .Release.Name }} in namespace {{ .Release.Namespace }}. + +Every service is served at the root of its own subdomain under +*.{{ .Values.routing.baseDomain }} (requires a wildcard DNS record pointing at +the ingress LoadBalancer): + + STAC API http://stac.{{ .Values.routing.baseDomain }} + Raster http://raster.{{ .Values.routing.baseDomain }} + Vector http://vector.{{ .Values.routing.baseDomain }} + Browser http://browser.{{ .Values.routing.baseDomain }} +{{- $sm := index .Values "stac-manager" }} +{{- if and $sm $sm.enabled }} + Manager http://manager.{{ .Values.routing.baseDomain }} +{{- end }} + Mock OIDC http://mock-oidc.{{ .Values.routing.baseDomain }} (test-only auth) + +{{- if .Values.jupyter.enabled }} + +Participant JupyterLabs: +{{- range .Values.jupyter.participants }} + {{ .name }} http://{{ .name }}.{{ $.Values.routing.baseDomain }}/lab{{ if .token }}?token={{ .token }}{{ end }} +{{- end }} +{{- if not (first .Values.jupyter.participants).token }} + (tokens are empty — deploy with ./deploy.sh so each Lab gets an access token) +{{- end }} +{{- end }} + +Verify endpoints + auth and (re)print the Lab URLs: + ./deploy.sh verify From bc9a8f88be75c02d6d04e46f1ba2252e55e698a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Wed, 1 Jul 2026 19:53:12 +0300 Subject: [PATCH 16/24] =?UTF-8?q?docs(helm):=20simplify=20README=20(~230?= =?UTF-8?q?=E2=86=92152=20lines)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove duplication (wildcard DNS, TLS-for-editing, and test-only-auth each appeared in 2-3 places) and tighten prose: merge the read-first contracts, condense the routing/verify/JupyterLabs sections, and trim the auth-test walkthrough to the essential steps. No facts dropped. --- .../charts/eoapi-workshop/README.md | 274 +++++++----------- 1 file changed, 99 insertions(+), 175 deletions(-) diff --git a/infrastructure/charts/eoapi-workshop/README.md b/infrastructure/charts/eoapi-workshop/README.md index 345305a..a51b2b8 100644 --- a/infrastructure/charts/eoapi-workshop/README.md +++ b/infrastructure/charts/eoapi-workshop/README.md @@ -1,228 +1,152 @@ # eoapi-workshop Helm chart -A **docker-compose-aligned** Helm deployment of [eoAPI](https://eoapi.dev) for the -workshop. It is an *umbrella* chart over the upstream -[`eoapi`](https://github.com/developmentseed/eoapi-k8s) chart plus the published -[`stac-manager`](https://github.com/developmentseed/stac-manager) chart, and adds -per-participant **JupyterLab** environments — **no observability/monitoring stack**. +A docker-compose-aligned Helm deployment of [eoAPI](https://eoapi.dev) for the +workshop: an *umbrella* chart over the upstream +[`eoapi`](https://github.com/developmentseed/eoapi-k8s) and +[`stac-manager`](https://github.com/developmentseed/stac-manager) charts, plus +per-participant **JupyterLab** environments — no observability/monitoring stack. -Every service is exposed at the **root of its own subdomain** under a wildcard +Every service is served at the **root of its own subdomain** under a wildcard domain (`*.`, default `eoapi-workshop.ds.io`). ## What gets deployed -| Component | Subdomain (default) | Notes | +| Component | Subdomain of `eoapi-workshop.ds.io` | Notes | |---|---|---| -| STAC API (via stac-auth-proxy) | `stac.eoapi-workshop.ds.io` | pgstac + stac-fastapi, fronted by the auth proxy | -| Raster (titiler-pgstac) | `raster.eoapi-workshop.ds.io` | | -| Vector (tipg) | `vector.eoapi-workshop.ds.io` | starts empty — see [Known limitations](#known-limitations) | -| STAC Browser | `browser.eoapi-workshop.ds.io` | root-serving `radiantearth/stac-browser` | -| STAC Manager (editing UI) | `manager.eoapi-workshop.ds.io` | `stac-manager` chart 1.0.3 | -| Mock OIDC server | `mock-oidc.eoapi-workshop.ds.io` | **test-only** auth | -| JupyterLab × N | `lab-01.…lab-05.eoapi-workshop.ds.io` | one isolated pod + PVC + token each | -| Database (pgstac) | — (in-cluster only) | Crunchy `PostgresCluster` | - -**Disabled** (unlike upstream `experimental.yaml`): `multidim`, `docServer`, +| STAC API (via stac-auth-proxy) | `stac.` | pgstac + stac-fastapi, fronted by the auth proxy | +| Raster (titiler-pgstac) | `raster.` | | +| Vector (tipg) | `vector.` | starts empty — see [Limitations](#limitations) | +| STAC Browser | `browser.` | root-serving `radiantearth/stac-browser` | +| STAC Manager (editing UI) | `manager.` | `stac-manager` chart 1.0.3 | +| Mock OIDC server | `mock-oidc.` | test-only auth | +| JupyterLab × N | `lab-01.`…`lab-05.` | one isolated pod + PVC + token each | +| Database (pgstac) | in-cluster only | Crunchy `PostgresCluster` | + +Disabled (unlike upstream `experimental.yaml`): `multidim`, `docServer`, `eoapi-notifier`, `knative`, `monitoring.*`, `observability.grafana`, autoscaling. -## ⚠️ Read first +## Contracts (read first) -**1. Wildcard DNS is required.** A record `*.` must point at the -ingress LoadBalancer IP. Verify: -```bash -dig +short stac.eoapi-workshop.ds.io # → your ingress LB IP -``` - -**2. Release name + namespace must both be `eoapi`.** The proxy's -`OIDC_DISCOVERY_INTERNAL_URL` is pinned to the in-cluster Service DNS -`eoapi-mock-oidc-server.eoapi.svc.cluster.local`, which is derived from the Helm -release name and namespace. Deploy as `eoapi`/`eoapi` (the `deploy.sh` default). - -**3. Test-only auth.** The mock OIDC server ships hard-coded `test-client` / -`test-secret`, and reads are public (`DEFAULT_PUBLIC=true`) so notebooks work -without tokens. **Not for production.** - -**4. HTTP by default → STAC Manager *editing* needs TLS.** STAC Manager login -uses OIDC/PKCE, which browsers only allow in a **secure context** (HTTPS). Over -plain `http` the UI loads and browses read-only; enable `routing.tls` (a wildcard -cert / cert-manager) for authenticated editing. +- **Wildcard DNS required** — `*.` must A-record to the ingress + LoadBalancer IP (check: `dig +short stac.eoapi-workshop.ds.io`). +- **Release name and namespace must both be `eoapi`** — the proxy's in-cluster + OIDC URL (`eoapi-mock-oidc-server.eoapi.svc…`) is derived from them. `deploy.sh` + defaults to this. +- **Test-only auth, http by default** — the mock OIDC ships `test-client` / + `test-secret` and reads are public (`DEFAULT_PUBLIC=true`). STAC Manager (and + Browser) *login/editing* needs a secure context, so enable `routing.tls` for + HTTPS; over http the UIs are browse/read-only. Not for production. ## Prerequisites -A Kubernetes cluster (1.23+) with: - -1. **Wildcard DNS** `*.` → the ingress LB IP (see above). -2. **NGINX ingress controller** (`ingressClassName: nginx`). -3. **Crunchy Postgres Operator (PGO)** — *hard requirement*; the `postgrescluster` - resource only reconciles into a running DB if the operator/CRDs are installed. -4. **Helm 3.8+** (Helm 4 works). - -`deploy.sh` installs #2 and #3 for you (unless `SKIP_PREREQS=1`). +Kubernetes 1.23+ with an **NGINX ingress controller**, the **Crunchy Postgres +Operator (PGO)** (hard requirement — `postgrescluster` only reconciles if PGO/CRDs +are installed), Helm 3.8+, and the wildcard DNS above. `deploy.sh` installs the +two operators for you (unless `SKIP_PREREQS=1`). ## Deploy -### Recommended: `deploy.sh` - -Installs prerequisites, generates host overrides (per-subdomain URLs + a stable -per-participant token), installs the release, waits for rollouts, and verifies -end to end. Idempotent — participant tokens/URLs stay stable across re-runs. +`deploy.sh` installs prerequisites, generates host overrides (per-subdomain URLs + +a stable per-participant token), installs the release, waits for rollouts, and +verifies end-to-end. Idempotent — tokens/URLs stay stable across re-runs. ```bash cd infrastructure/charts/eoapi-workshop - -./deploy.sh deploy # prerequisites + chart + verify -./deploy.sh verify # re-run endpoint/auth checks + print Lab URLs -./deploy.sh urls # just print the participant Lab URLs (+ tokens) -./deploy.sh overrides # (re)generate + print .deploy/overrides.yaml only -./deploy.sh teardown [--all] # remove the release (--all also removes operators) +./deploy.sh deploy # prerequisites + chart + verify +./deploy.sh verify # re-run endpoint/auth checks, print Lab URLs +./deploy.sh urls # print participant Lab URLs (+ tokens) +./deploy.sh teardown [--all] # remove release (--all also removes operators) ``` -Environment: -```bash -BASE_DOMAIN=eoapi-workshop.ds.io # wildcard base domain (default) -SKIP_PREREQS=1 # operators already installed -# RELEASE / NAMESPACE must stay "eoapi" (see contract above) -``` +Env vars: `BASE_DOMAIN` (default `eoapi-workshop.ds.io`), `SKIP_PREREQS=1`, +`GHCR_USER`+`GHCR_TOKEN` (pull secret for a private image — see +[Participant JupyterLabs](#participant-jupyterlabs)). `RELEASE`/`NAMESPACE` must +stay `eoapi`. -The pgstac DB is created asynchronously by PGO and `pgstacBootstrap` seeds sample -STAC data, so API pods may restart a few times before `Ready` on first install. +The pgstac DB is created asynchronously by PGO and seeded with sample STAC data, +so API pods may restart a few times before `Ready` on first install. -### Manual - -```bash -helm dependency update ./infrastructure/charts/eoapi-workshop # first time (writes Chart.lock) -helm lint ./infrastructure/charts/eoapi-workshop -helm template eoapi ./infrastructure/charts/eoapi-workshop -n eoapi | less -# For a domain other than the default, generate overrides first: -BASE_DOMAIN=my.domain.io ./infrastructure/charts/eoapi-workshop/deploy.sh overrides -helm install eoapi ./infrastructure/charts/eoapi-workshop -n eoapi --create-namespace \ - -f ./infrastructure/charts/eoapi-workshop/.deploy/overrides.yaml -``` +To install without `deploy.sh`: `helm dependency update`, then `helm install eoapi +. -n eoapi --create-namespace` with a `-f` overrides file (generate one for a +non-default domain via `BASE_DOMAIN=… ./deploy.sh overrides`). -## Routing model +## Routing -All routing lives in **`templates/subdomain-ingress.yaml`**: one NGINX `Ingress` -with a host rule per service, each serving at path `/` with **no rewrite**. The -upstream eoapi path-based ingress is disabled (`eoapi.ingress.enabled=false`), and -each app is configured to serve at its subdomain root: - -- stac/raster/vector: `ingress.path=""` → uvicorn `--root-path=` (empty); -- stac-auth-proxy: `ROOT_PATH=""`, health at `/healthz`; -- browser: root-serving `radiantearth/stac-browser` (the upstream custom image - bakes a `/browser` prefix that breaks at a subdomain root), `catalogUrl` → the - stac subdomain; -- JupyterLabs: no `--ServerApp.base_url` (served at `lab-NN.` root). - -The base domain and all per-subdomain URLs default to `eoapi-workshop.ds.io` in -`values.yaml`; `deploy.sh` rewrites them for a different `BASE_DOMAIN` via the -gitignored `.deploy/overrides.yaml` (never committed). +All routing is one Ingress (`templates/subdomain-ingress.yaml`): a host rule per +service, each serving at `/` with no rewrite. The upstream path-based ingress is +off and each app serves at its subdomain root — stac/raster/vector with +`--root-path=`, proxy `ROOT_PATH=""`, browser via the root-serving +`radiantearth/stac-browser`, Labs without `--ServerApp.base_url`. Per-subdomain +URLs default to the workshop domain in `values.yaml`; `deploy.sh` rewrites them for +another `BASE_DOMAIN` via the gitignored `.deploy/overrides.yaml`. ## Verify +`./deploy.sh verify` checks every service subdomain, runs the auth test, and prints +the Lab URLs. Manually: + ```bash kubectl -n eoapi get pods - -curl -s http://stac.eoapi-workshop.ds.io/healthz # STAC API (via auth proxy) -curl -s http://raster.eoapi-workshop.ds.io/healthz # Raster -curl -s http://vector.eoapi-workshop.ds.io/healthz # Vector -curl -s http://stac.eoapi-workshop.ds.io/collections # sample collections -# UIs: -# http://browser.eoapi-workshop.ds.io/ -# http://manager.eoapi-workshop.ds.io/ -# http://mock-oidc.eoapi-workshop.ds.io/.well-known/openid-configuration +curl -s http://stac.eoapi-workshop.ds.io/healthz # also raster. / vector. +curl -s http://stac.eoapi-workshop.ds.io/collections # sample items +# UIs: browser. manager. mock-oidc./.well-known/openid-configuration ``` -`./deploy.sh verify` runs all of the above plus the auth check and prints the -participant Lab URLs. - ## Participant JupyterLabs -`jupyter.participants` (default `lab-01`…`lab-05`) → one Deployment + Service + -RWO PVC each, at `.`. Each pod runs the GHCR workshop image -(`ghcr.io/developmentseed/eoapi-workshop`, published by -`.github/workflows/publish-workshop-image.yml`, `imagePullPolicy: Always`), gets -the eoAPI endpoints + DB creds injected (from the `eoapi-pguser-eoapi` PGO secret, -direct-primary keys), and a per-participant access token. - -**Persistence model:** the notebooks live in the image at `/home/jovyan/docs` and -come **fresh on every start**, so image/notebook updates always appear. Only -`/home/jovyan/work` is a persistent PVC. Trade-off: edits to the *provided* -notebooks reset on a pod restart — participants should save work under `work/`. - -**Private image:** GHCR packages default to private, so the cluster needs pull -access. Two options: -- **Make the package public** (simplest) — then nothing else is needed. -- **Use a pull secret** — pass `GHCR_USER` + `GHCR_TOKEN` (a token with - `read:packages`) to `deploy.sh`; it creates the `ghcr-pull` secret and attaches - it to the namespace's default ServiceAccount before the Labs start: - ```bash - GHCR_USER= GHCR_TOKEN= ./deploy.sh deploy - ``` +`jupyter.participants` (default `lab-01`…`lab-05`; edit for any N) → one Deployment ++ Service + PVC each at `.`, running the GHCR image +`ghcr.io/developmentseed/eoapi-workshop` (built by +`.github/workflows/publish-workshop-image.yml`). Each Lab gets the eoAPI endpoints ++ DB creds injected (from the `eoapi-pguser-eoapi` PGO secret) and an access token +(`./deploy.sh urls` prints them). -```bash -./deploy.sh urls -# lab-01 http://lab-01.eoapi-workshop.ds.io/lab?token= -# … -``` +- **Persistence:** notebooks come fresh from the image (`/home/jovyan/docs`) on + every start, so updates always appear; only `/home/jovyan/work` persists (save + work there — edits to the provided notebooks reset on restart). +- **Private image:** GHCR packages are private by default. Either make the package + public, or pass a pull token — `GHCR_USER= GHCR_TOKEN= + ./deploy.sh deploy` creates the `ghcr-pull` secret and wires it to the default + ServiceAccount before the Labs start. -Change the headcount by editing the `jupyter.participants` list (any N). +## Testing auth -## Testing the auth mechanism - -`stac-auth-proxy` fronts STAC at `stac.`. `DEFAULT_PUBLIC=true` → -**GET is open, mutations require a bearer token**. Tokens come from the mock OIDC -server (`iss` = its `ISSUER` = `http://mock-oidc.`). The proxy fetches -JWKS in-cluster via `OIDC_DISCOVERY_INTERNAL_URL` (pods can't resolve the external -host). Needs `jq`. +`stac-auth-proxy` fronts STAC at `stac.`: **GET is public, mutations +need a bearer token** from the mock OIDC server (`jq` required). ```bash b=eoapi-workshop.ds.io - -# 1. discovery reachable -curl -s http://mock-oidc.$b/.well-known/openid-configuration | jq .issuer # "http://mock-oidc.eoapi-workshop.ds.io" - -# 2. public read works without a token -curl -s -o /dev/null -w '%{http_code}\n' http://stac.$b/collections # 200 - -# 3. protected write rejected without a token -curl -s -o /dev/null -w '%{http_code}\n' -X POST http://stac.$b/collections \ - -H 'Content-Type: application/json' -d '{}' # 401 - -# 4. mint a token (stac:write scope) +curl -s -o/dev/null -w '%{http_code}\n' http://stac.$b/collections # 200 (public read) +curl -s -o/dev/null -w '%{http_code}\n' -X POST http://stac.$b/collections \ + -H 'Content-Type: application/json' -d '{}' # 401 (no token) TOKEN=$(curl -s http://mock-oidc.$b/ \ --data-raw 'username=testuser&scopes=openid+stac:read+stac:write' \ -H 'Accept: application/json' | jq -r .token) - -# 5. same write now passes the auth gate -curl -s -o /dev/null -w '%{http_code}\n' -X POST http://stac.$b/collections \ +curl -s -o/dev/null -w '%{http_code}\n' -X POST http://stac.$b/collections \ -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' -d '{}' # NOT 401 ``` -Key signal: **401 without a token, non-401 with one**. If step 5 stays 401, check -`kubectl -n eoapi logs deploy/eoapi-stac-auth-proxy` — the usual cause is a -release/namespace other than `eoapi` (breaks `OIDC_DISCOVERY_INTERNAL_URL`). +**401 without a token, non-401 with one** = working. If it stays 401, check +`kubectl -n eoapi logs deploy/eoapi-stac-auth-proxy` (usual cause: release/namespace +not `eoapi`). ## Upgrade / uninstall ```bash -./deploy.sh deploy # idempotent re-deploy (tokens preserved) -helm uninstall eoapi -n eoapi # or ./deploy.sh teardown -kubectl -n eoapi delete pvc --all # PVCs (DB + Lab homes) are retained by design +./deploy.sh deploy # idempotent re-deploy (tokens preserved) +helm uninstall eoapi -n eoapi # or ./deploy.sh teardown +kubectl -n eoapi delete pvc --all # PVCs (DB + Lab work) are retained by design ``` -## Known limitations - -- **`/vector` starts empty.** The compose `features-loader` seeds a `features` - schema for tipg; this chart's `pgstacBootstrap.loadSamples` loads STAC *items* - only, not that vector layer. The `05-tipg` notebook has no data until it's - loaded separately (an `ogr2ogr` Job — possible follow-up). -- **STAC Manager editing needs TLS.** OIDC/PKCE requires a secure context; over - http the UI is read-only. Enable `routing.tls`. -- **Browser OIDC login** — the browser's OIDC `redirect_uri` still derives from - the apex host in the upstream template; browsing works, browser-side login is a - follow-up (and also needs TLS). -- **Capacity.** N always-on Labs at `limit 2 CPU / 4Gi` each (default 5 ≈ up to - 10 CPU / 20Gi), plus stac-manager's startup build (~4Gi) and the eoAPI backend. - Size nodes accordingly. -- **Not production-ready.** Test-only auth, single 1-replica DB (5Gi), http. - For production use the CDK/AWS stack in [`DEPLOYMENT.md`](../../../DEPLOYMENT.md). +## Limitations + +- **`/vector` starts empty** — `pgstacBootstrap.loadSamples` loads STAC items, not + the compose `features-loader` vector layer, so the `05-tipg` notebook needs it + loaded separately (an `ogr2ogr` Job — follow-up). +- **UI login needs TLS** — STAC Manager / Browser OIDC login uses PKCE (needs + HTTPS); over http they're read-only. Enable `routing.tls`. (Browser's + `redirect_uri` also still derives from the apex host upstream.) +- **Capacity** — N always-on Labs at `limit 2 CPU / 4Gi` (default 5 ≈ ≤10 CPU / + 20Gi) + stac-manager's ~4Gi startup build + the backend. Size nodes to N. +- **Not production** — test auth, single 1-replica DB (5Gi), http. For production + use the CDK/AWS stack in [`DEPLOYMENT.md`](../../../DEPLOYMENT.md). From f20d0731a0164bdc44bd38a19830291d746d8e8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Thu, 2 Jul 2026 00:01:20 +0300 Subject: [PATCH 17/24] fix(helm): make workshop notebooks 03/05 run in-cluster (data + tipg schema) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Running the notebooks in a Lab surfaced two cluster-only failures (compose was fine). Both fixed with chart/data changes only — no notebook edits, so compose is untouched: - 03: `pgstacBootstrap.loadSamples` is now false. The upstream sample collection `noaa-emergency-response` is stored without a STAC `type` field, which breaks pystac_client's get_all_collections(). The notebooks create their own STAC data, and compose ships no STAC sample loader either. - 05: add templates/features-loader-job.yaml — a post-install/upgrade hook Job (k8s equivalent of the compose features-loader) that loads the NA CEC Level III Ecoregions shapefile into features.ecoregions (idempotent, superuser secret, grants read to all). Also set tipg TIPG_DB_SCHEMAS=["features","public"] so it serves the layer. 04 needed no change: titiler-pgstac 3.0.0's /searches/register returns `id` (what the notebook reads) and collections carry `extent`; its only failure was the empty username widget under headless execution. Verified live: applied to the cluster and re-ran 03/04/05 headless → all PASS (0 errors); features.ecoregions is served by tipg. render-checks + lint pass. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../charts/eoapi-workshop/README.md | 16 +++-- .../templates/features-loader-job.yaml | 63 +++++++++++++++++++ .../eoapi-workshop/tests/render-checks.sh | 9 +++ .../charts/eoapi-workshop/values.yaml | 29 +++++++-- 4 files changed, 107 insertions(+), 10 deletions(-) create mode 100644 infrastructure/charts/eoapi-workshop/templates/features-loader-job.yaml diff --git a/infrastructure/charts/eoapi-workshop/README.md b/infrastructure/charts/eoapi-workshop/README.md index a51b2b8..b0d906f 100644 --- a/infrastructure/charts/eoapi-workshop/README.md +++ b/infrastructure/charts/eoapi-workshop/README.md @@ -15,7 +15,7 @@ domain (`*.`, default `eoapi-workshop.ds.io`). |---|---|---| | STAC API (via stac-auth-proxy) | `stac.` | pgstac + stac-fastapi, fronted by the auth proxy | | Raster (titiler-pgstac) | `raster.` | | -| Vector (tipg) | `vector.` | starts empty — see [Limitations](#limitations) | +| Vector (tipg) | `vector.` | serves `features.ecoregions` (loaded by the features-loader Job) | | STAC Browser | `browser.` | root-serving `radiantearth/stac-browser` | | STAC Manager (editing UI) | `manager.` | `stac-manager` chart 1.0.3 | | Mock OIDC server | `mock-oidc.` | test-only auth | @@ -138,11 +138,17 @@ helm uninstall eoapi -n eoapi # or ./deploy.sh teardown kubectl -n eoapi delete pvc --all # PVCs (DB + Lab work) are retained by design ``` -## Limitations +## Notebook data + +The workshop notebooks (`docs/00`–`06`) run in the Labs against this deployment: +- `pgstacBootstrap.loadSamples` is **off** — the upstream sample collection + `noaa-emergency-response` is stored without a STAC `type` field and breaks + `pystac_client` (notebook 03). The notebooks create their own STAC data. +- the **features-loader Job** (`featuresLoader.enabled`) loads the NA CEC Level III + Ecoregions into `features.ecoregions`, and tipg is configured with + `TIPG_DB_SCHEMAS=["features","public"]`, so notebook 05 has vector data. -- **`/vector` starts empty** — `pgstacBootstrap.loadSamples` loads STAC items, not - the compose `features-loader` vector layer, so the `05-tipg` notebook needs it - loaded separately (an `ogr2ogr` Job — follow-up). +## Limitations - **UI login needs TLS** — STAC Manager / Browser OIDC login uses PKCE (needs HTTPS); over http they're read-only. Enable `routing.tls`. (Browser's `redirect_uri` also still derives from the apex host upstream.) diff --git a/infrastructure/charts/eoapi-workshop/templates/features-loader-job.yaml b/infrastructure/charts/eoapi-workshop/templates/features-loader-job.yaml new file mode 100644 index 0000000..ae804e0 --- /dev/null +++ b/infrastructure/charts/eoapi-workshop/templates/features-loader-job.yaml @@ -0,0 +1,63 @@ +{{/* +k8s equivalent of the docker-compose `features-loader`: load the NA CEC Level III +Ecoregions shapefile into features.ecoregions so notebook 05 (tipg) has data. +Runs as a post-install/post-upgrade hook, idempotently (skips if the table +exists). Uses the PGO superuser secret to CREATE SCHEMA and grants read to all +users so tipg can serve it. Loads into the `eoapi` database (what tipg queries). +*/}} +{{- if .Values.featuresLoader.enabled }} +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ .Release.Name }}-features-loader + labels: + app: {{ .Release.Name }}-features-loader + app.kubernetes.io/component: workshop-features-loader + annotations: + helm.sh/hook: post-install,post-upgrade + helm.sh/hook-weight: "10" # after the DB / pgstac bootstrap + helm.sh/hook-delete-policy: before-hook-creation +spec: + backoffLimit: 3 + template: + metadata: + labels: + app: {{ .Release.Name }}-features-loader + spec: + restartPolicy: Never + containers: + - name: features-loader + image: {{ .Values.featuresLoader.image | quote }} + command: + - bash + - -c + - | + set -euo pipefail + apt-get update -qq && apt-get install -y -qq postgresql-client >/dev/null + for _ in $(seq 1 60); do pg_isready -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -d "$PGDATABASE" && break; echo "waiting for database..."; sleep 5; done + if psql -tAc "select 1 from information_schema.tables where table_schema='features' and table_name='ecoregions'" | grep -q 1; then + echo "features.ecoregions already present — skipping load."; exit 0 + fi + psql -v ON_ERROR_STOP=1 -c "CREATE SCHEMA IF NOT EXISTS features;" + ogr2ogr -f PostgreSQL "PG:dbname=$PGDATABASE host=$PGHOST port=$PGPORT user=$PGUSER password=$PGPASSWORD" \ + {{ .Values.featuresLoader.shapefileUrl | quote }} \ + -nln features.ecoregions -t_srs EPSG:4326 \ + -lco GEOMETRY_NAME=geom -lco FID=id -lco PRECISION=NO -nlt PROMOTE_TO_MULTI + psql -v ON_ERROR_STOP=1 -c "GRANT USAGE ON SCHEMA features TO PUBLIC; GRANT SELECT ON ALL TABLES IN SCHEMA features TO PUBLIC;" + echo "features.ecoregions loaded." + env: + # Superuser creds (needed for CREATE SCHEMA); DB is pinned to `eoapi` + # (what tipg queries), not the secret's dbname. + - name: PGDATABASE + value: "eoapi" + - name: PGHOST + valueFrom: { secretKeyRef: { name: {{ .Release.Name }}-pguser-postgres, key: host } } + - name: PGPORT + valueFrom: { secretKeyRef: { name: {{ .Release.Name }}-pguser-postgres, key: port } } + - name: PGUSER + valueFrom: { secretKeyRef: { name: {{ .Release.Name }}-pguser-postgres, key: user } } + - name: PGPASSWORD + valueFrom: { secretKeyRef: { name: {{ .Release.Name }}-pguser-postgres, key: password } } + resources: + {{- toYaml .Values.featuresLoader.resources | nindent 12 }} +{{- end }} diff --git a/infrastructure/charts/eoapi-workshop/tests/render-checks.sh b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh index c473089..2d209c7 100755 --- a/infrastructure/charts/eoapi-workshop/tests/render-checks.sh +++ b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh @@ -72,5 +72,14 @@ check_has "$I" 'name: eoapi-stac-auth-proxy' "stac subdomain → auth-proxy ba check_has "$I" 'name: eoapi-stac-manager' "manager subdomain → stac-manager backend" check_absent "$I" 'rewrite-target' "no path rewrite (root serving)" +echo "== features loader + tipg schema ==" +FA="$(helm template "$REL" "$CHART_DIR" -n "$NS" 2>/dev/null)" +check_has "$FA" 'name: eoapi-features-loader' "features-loader Job renders" +check_has "$FA" 'features\.ecoregions' "loader targets features.ecoregions" +check_has "$FA" 'name: eoapi-pguser-postgres' "loader uses the superuser secret" +check_has "$FA" 'TIPG_DB_SCHEMAS' "tipg exposes the features schema" +FA_OFF="$(helm template "$REL" "$CHART_DIR" -n "$NS" --set featuresLoader.enabled=false 2>/dev/null)" +check_absent "$FA_OFF" 'name: eoapi-features-loader' "featuresLoader.enabled=false renders nothing" + if [[ "$fail" == 0 ]]; then echo "ALL CHECKS PASSED"; else echo "SOME CHECKS FAILED"; fi exit "$fail" diff --git a/infrastructure/charts/eoapi-workshop/values.yaml b/infrastructure/charts/eoapi-workshop/values.yaml index 7bbf462..1c28e3e 100644 --- a/infrastructure/charts/eoapi-workshop/values.yaml +++ b/infrastructure/charts/eoapi-workshop/values.yaml @@ -80,11 +80,12 @@ eoapi: pgstacBootstrap: enabled: true settings: - # Loads STAC sample *items* so /stac has data out of the box. - # NOTE: this does NOT load the ecoregions vector layer that the - # docker-compose `features-loader` seeds for tipg — /vector starts - # empty. See README "Known limitations". - loadSamples: true + # loadSamples is OFF: the upstream sample collection `noaa-emergency-response` + # is stored without a STAC `type` field, which breaks pystac_client + # (`get_all_collections()` in notebook 03). The workshop notebooks create + # their own collections/items, and docker-compose ships no STAC sample + # loader either — so this matches compose. + loadSamples: false pgstacSettings: queue_timeout: "10 minutes" use_queue: "false" @@ -150,6 +151,10 @@ eoapi: resources: {} envVars: TIPG_CATALOG_TTL: "300" + # Expose the `features` schema (holds ecoregions, loaded by the + # features-loader Job) so notebook 05 can query features.ecoregions — + # mirrors the docker-compose tipg `TIPG_DB_SCHEMAS`. `public` is kept too. + TIPG_DB_SCHEMAS: '["features", "public"]' HOST: "0.0.0.0" PORT: "8080" WEB_CONCURRENCY: "4" @@ -358,3 +363,17 @@ stac-manager: resources: # the container BUILDS at startup — needs headroom requests: { cpu: "500m", memory: "1Gi" } limits: { cpu: "2", memory: "4Gi" } + +################################################################## +# FEATURES LOADER (top-level — this chart's own template) +################################################################## +# k8s equivalent of the docker-compose `features-loader`: a post-install/upgrade +# Job that loads the NA CEC Level III Ecoregions shapefile into features.ecoregions +# so notebook 05 (tipg) has data. Idempotent — skips if the table already exists. +featuresLoader: + enabled: true + image: ghcr.io/osgeo/gdal:ubuntu-small-latest + shapefileUrl: "/vsizip/vsicurl/https://dmap-prod-oms-edc.s3.us-east-1.amazonaws.com/ORD/Ecoregions/cec_na/NA_CEC_Eco_Level3.zip/NA_CEC_Eco_Level3.shp" + resources: + requests: { cpu: "200m", memory: "512Mi" } + limits: { cpu: "1", memory: "2Gi" } From 1c0452fe05c796fe2b0d7f2a30a4e7590eee7215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Thu, 2 Jul 2026 01:53:32 +0300 Subject: [PATCH 18/24] fix(helm)+docs: hand browser-reachable URLs to the notebook IFrame cells MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In-cluster, the Lab pod and the participant's browser need different URLs: the pod can only reach in-cluster Service DNS, the browser only the external subdomains — so display cells built from the server-side *_ENDPOINT vars handed the browser unreachable addresses. Inject STAC_API_BROWSER_URL / TITILER_BROWSER_URL / TIPG_BROWSER_URL (derived from routing.baseDomain) into the Lab pods and use them in the IFrame/viewer cells only, falling back to the previous .replace() behaviour when unset (docker-compose, 2i2c). Server-side httpx cells are untouched. Notebook 02 now prefers the stack's own STAC Browser (native #/collections route — both compose and the chart point SB_catalogUrl at this API), avoiding the mixed-content block of the public https browser over an http API. Co-Authored-By: Claude Fable 5 --- docs/02-database.ipynb | 12 ++++++++++-- docs/03-stac_fastapi_pgstac.ipynb | 2 +- docs/04-titiler_pgstac.ipynb | 15 +++++++++------ docs/05-tipg.ipynb | 11 +++++++---- .../charts/eoapi-workshop/templates/jupyter.yaml | 7 +++++++ .../charts/eoapi-workshop/tests/render-checks.sh | 3 +++ 6 files changed, 37 insertions(+), 13 deletions(-) diff --git a/docs/02-database.ipynb b/docs/02-database.ipynb index ca7897c..340c399 100644 --- a/docs/02-database.ipynb +++ b/docs/02-database.ipynb @@ -325,10 +325,18 @@ "source": [ "from IPython.display import IFrame\n", "\n", - "stac_api_endpoint = os.getenv(\"STAC_API_ENDPOINT\").replace(\"stac-auth-proxy:8000\", \"localhost:8084\")\n", + "# Use the stack's own STAC Browser when deployed (its catalog is already this\n", + "# STAC API); otherwise fall back to the public STAC Browser in external mode.\n", + "stac_browser_endpoint = os.getenv(\"STAC_BROWSER_ENDPOINT\")\n", + "\n", + "if stac_browser_endpoint:\n", + " browser_url = f\"{stac_browser_endpoint}/#/collections/{my_collection.id}\"\n", + "else:\n", + " browser_stac_url = os.getenv(\"STAC_API_ENDPOINT\").replace(\"stac-auth-proxy:8000\", \"localhost:8084\")\n", + " browser_url = f\"https://radiantearth.github.io/stac-browser/#/external/{browser_stac_url}/collections/{my_collection.id}\"\n", "\n", "IFrame(\n", - " f\"https://radiantearth.github.io/stac-browser/#/external/{stac_api_endpoint}/collections/{my_collection.id}\",\n", + " browser_url,\n", " 1200,\n", " 800,\n", ")" diff --git a/docs/03-stac_fastapi_pgstac.ipynb b/docs/03-stac_fastapi_pgstac.ipynb index 4ebe046..9c9abda 100644 --- a/docs/03-stac_fastapi_pgstac.ipynb +++ b/docs/03-stac_fastapi_pgstac.ipynb @@ -194,7 +194,7 @@ "source": [ "from IPython.display import IFrame\n", "\n", - "local_stac_api_endpoint = stac_api_endpoint.replace(\"stac-auth-proxy:8000\", \"localhost:8084\")\n", + "local_stac_api_endpoint = os.getenv(\"STAC_API_BROWSER_URL\") or stac_api_endpoint.replace(\"stac-auth-proxy:8000\", \"localhost:8084\")\n", "api_docs = (\n", " f\"{local_stac_api_endpoint}/api.html#/default/Get_Collections_collections_get\"\n", ")\n", diff --git a/docs/04-titiler_pgstac.ipynb b/docs/04-titiler_pgstac.ipynb index 95a9bb9..8e0b325 100644 --- a/docs/04-titiler_pgstac.ipynb +++ b/docs/04-titiler_pgstac.ipynb @@ -73,7 +73,10 @@ "titiler_pgstac_endpoint = os.getenv(\"TITILER_PGSTAC_API_ENDPOINT\").replace(\n", " \"titiler-pgstac\", \"localhost\"\n", ")\n", - "api_docs = f\"{titiler_pgstac_endpoint}/api.html\"\n", + "# browser-facing URL for the IFrame/map cells (the user's browser can't reach\n", + "# the server-side endpoint above when running on Kubernetes)\n", + "titiler_browser_endpoint = os.getenv(\"TITILER_BROWSER_URL\") or titiler_pgstac_endpoint\n", + "api_docs = f\"{titiler_browser_endpoint}/api.html\"\n", "print(api_docs)\n", "\n", "IFrame(\n", @@ -167,7 +170,7 @@ "outputs": [], "source": [ "IFrame(\n", - " f\"{titiler_pgstac_endpoint}/collections/{collection_id}/WebMercatorQuad/map?{urlencode(params, doseq=True)}\",\n", + " f\"{titiler_browser_endpoint}/collections/{collection_id}/WebMercatorQuad/map?{urlencode(params, doseq=True)}\",\n", " 1200,\n", " 800,\n", ")" @@ -267,7 +270,7 @@ ")\n", "\n", "IFrame(\n", - " f\"{titiler_pgstac_endpoint}/searches/{search_id}/WebMercatorQuad/map?{urlencode(params, doseq=True)}\",\n", + " f\"{titiler_browser_endpoint}/searches/{search_id}/WebMercatorQuad/map?{urlencode(params, doseq=True)}\",\n", " 1200,\n", " 800,\n", ")" @@ -310,7 +313,7 @@ ")\n", "\n", "IFrame(\n", - " f\"{titiler_pgstac_endpoint}/searches/{search_id}/WebMercatorQuad/map?{urlencode(params, doseq=True)}\",\n", + " f\"{titiler_browser_endpoint}/searches/{search_id}/WebMercatorQuad/map?{urlencode(params, doseq=True)}\",\n", " 1200,\n", " 800,\n", ")" @@ -517,7 +520,7 @@ "\n", "\n", "IFrame(\n", - " map_request.url,\n", + " str(map_request.url).replace(titiler_pgstac_endpoint, titiler_browser_endpoint),\n", " 1200,\n", " 800,\n", ")" @@ -551,7 +554,7 @@ "\n", "\n", "IFrame(\n", - " map_request.url,\n", + " str(map_request.url).replace(titiler_pgstac_endpoint, titiler_browser_endpoint),\n", " 1200,\n", " 800,\n", ")" diff --git a/docs/05-tipg.ipynb b/docs/05-tipg.ipynb index 800f0e8..288aebc 100644 --- a/docs/05-tipg.ipynb +++ b/docs/05-tipg.ipynb @@ -60,6 +60,9 @@ "import httpx\n", "\n", "tipg_endpoint = os.getenv(\"TIPG_API_ENDPOINT\")\n", + "# browser-facing URL for the IFrame/viewer cells (the user's browser can't\n", + "# reach the server-side endpoint above when running on Kubernetes)\n", + "tipg_browser_endpoint = os.getenv(\"TIPG_BROWSER_URL\") or tipg_endpoint.replace(\"tipg\", \"localhost\")\n", "\n", "collections_request = httpx.get(f\"{tipg_endpoint}/collections\")\n", "\n", @@ -261,7 +264,7 @@ " },\n", ")\n", "\n", - "local_url = str(bbox_filtered_request.url).replace(\"tipg\", \"localhost\")\n", + "local_url = str(bbox_filtered_request.url).replace(tipg_endpoint, tipg_browser_endpoint)\n", "\n", "IFrame(\n", " local_url,\n", @@ -285,7 +288,7 @@ "metadata": {}, "outputs": [], "source": [ - "local_tipg_endpoint = tipg_endpoint.replace(\"tipg\", \"localhost\")\n", + "local_tipg_endpoint = tipg_browser_endpoint\n", "IFrame(\n", " f\"{local_tipg_endpoint}/api.html#OGC Features API/items_collections__collectionId__items_get\",\n", " width=1200,\n", @@ -378,7 +381,7 @@ ")\n", "\n", "IFrame(\n", - " str(viewer_request.url).replace(\"tipg\", \"localhost\"),\n", + " str(viewer_request.url).replace(tipg_endpoint, tipg_browser_endpoint),\n", " width=1200,\n", " height=800,\n", ")" @@ -407,7 +410,7 @@ ")\n", "\n", "IFrame(\n", - " str(filtered_viewer_request.url).replace(\"tipg\", \"localhost\"),\n", + " str(filtered_viewer_request.url).replace(tipg_endpoint, tipg_browser_endpoint),\n", " width=1200,\n", " height=800,\n", ")" diff --git a/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml b/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml index caa81c9..ea8ace4 100644 --- a/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml +++ b/infrastructure/charts/eoapi-workshop/templates/jupyter.yaml @@ -92,6 +92,13 @@ spec: - { name: TIPG_API_ENDPOINT, value: "http://{{ $root.Release.Name }}-vector:8080" } - { name: MOCK_OIDC_ENDPOINT, value: "http://{{ $root.Release.Name }}-mock-oidc-server:8080" } - { name: STAC_BROWSER_ENDPOINT, value: "http://browser.{{ $base }}" } + # Browser-facing API URLs (external subdomains) — the notebooks' IFrame/ + # viewer cells hand these to the user's browser, which cannot reach the + # in-cluster Service DNS above. Server-side httpx calls keep the *_ENDPOINT + # vars; absent these (compose/2i2c) the notebooks fall back to .replace(). + - { name: STAC_API_BROWSER_URL, value: "http://stac.{{ $base }}" } + - { name: TITILER_BROWSER_URL, value: "http://raster.{{ $base }}" } + - { name: TIPG_BROWSER_URL, value: "http://vector.{{ $base }}" } # DB creds from the PGO-generated secret, using the DIRECT primary keys # (host/port) — NOT pgbouncer-*, whose transaction pooling breaks the # DDL/COPY in 02-database.ipynb. Secret name is release-derived diff --git a/infrastructure/charts/eoapi-workshop/tests/render-checks.sh b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh index 2d209c7..080f229 100755 --- a/infrastructure/charts/eoapi-workshop/tests/render-checks.sh +++ b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh @@ -47,6 +47,9 @@ check_has "$J" 'key: host' "PG direct-primary host key" check_absent "$J" 'key: pgbouncer' "does NOT use pgbouncer secret keys (DDL/COPY safe)" check_has "$J" 'eoapi-stac-auth-proxy:8080' "STAC endpoint injected" check_has "$J" 'browser\.eoapi-workshop\.ds\.io' "browser endpoint → subdomain" +check_has "$J" 'STAC_API_BROWSER_URL.*stac\.eoapi-workshop\.ds\.io' "browser-facing STAC API URL injected" +check_has "$J" 'TITILER_BROWSER_URL.*raster\.eoapi-workshop\.ds\.io' "browser-facing titiler URL injected" +check_has "$J" 'TIPG_BROWSER_URL.*vector\.eoapi-workshop\.ds\.io' "browser-facing tipg URL injected" J_OFF="$(show templates/jupyter.yaml --set jupyter.enabled=false)" check_count "$J_OFF" '^kind: Deployment' 0 "jupyter.enabled=false renders nothing" From 78300d6e77cfeec8580f5065937220285f38936a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Thu, 2 Jul 2026 01:53:56 +0300 Subject: [PATCH 19/24] fix(compose)+docs+helm: run the same service versions everywhere MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The chart (via eoapi-k8s 6.3.1) deploys titiler-pgstac 3.0.0 / tipg 1.4.0 / stac-fastapi-pgstac 6.2.2, but compose pinned 1.9.0 / 1.1.2 / 6.0.2 — and the notebooks bake in routes that changed between those releases, so they could only be correct in one environment. Align compose to the chart's versions and update the notebooks to the current routes: - /collections|searches/…/{tms}/map → …/map.html (titiler-pgstac 3.x) - /collections/…/tiles/{tms}/viewer → …/map.html (tipg 1.4) - NDVI map cell: expression now requires explicit assets= (titiler 3.x) Enable TITILER_PGSTAC_API_ENABLE_EXTERNAL_DATASET_ENDPOINTS in the chart (compose already had it) for notebook 04 §4.4, and add a lockstep render check that asserts the chart runs the exact image:tag pinned in docker-compose.yml so the versions cannot drift apart again. Also run stac-manager under amd64 emulation (no arm64 manifest published). Co-Authored-By: Claude Fable 5 --- docker-compose.yml | 8 +++++--- docs/04-titiler_pgstac.ipynb | 20 ++++++++++--------- docs/05-tipg.ipynb | 8 ++++---- .../eoapi-workshop/tests/render-checks.sh | 12 +++++++++++ .../charts/eoapi-workshop/values.yaml | 2 ++ 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8e2a8b5..2281f95 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -60,7 +60,7 @@ services: stac-fastapi: - image: ghcr.io/stac-utils/stac-fastapi-pgstac:6.0.2 + image: ghcr.io/stac-utils/stac-fastapi-pgstac:6.2.2 ports: - 8081:8081 environment: @@ -107,7 +107,7 @@ services: titiler-pgstac: platform: linux/amd64 - image: ghcr.io/stac-utils/titiler-pgstac:1.9.0 + image: ghcr.io/stac-utils/titiler-pgstac:3.0.0 ports: - 8082:8082 environment: @@ -146,7 +146,7 @@ services: bash -c "uvicorn titiler.pgstac.main:app --host 0.0.0.0 --port 8082" tipg: - image: ghcr.io/developmentseed/tipg:1.1.2 + image: ghcr.io/developmentseed/tipg:1.4.0 ports: - 8083:8083 environment: @@ -178,6 +178,8 @@ services: - database stac-manager: + # no arm64 manifest published — run the amd64 image under emulation + platform: linux/amd64 image: ghcr.io/developmentseed/stac-manager:1.0.3 ports: - 8086:8080 diff --git a/docs/04-titiler_pgstac.ipynb b/docs/04-titiler_pgstac.ipynb index 8e0b325..cbcdfa9 100644 --- a/docs/04-titiler_pgstac.ipynb +++ b/docs/04-titiler_pgstac.ipynb @@ -155,7 +155,7 @@ " - Leaflet\n", " - Mapbox\n", "\n", - "For now you can take a shortcut to view the map directly in this notebook using the `/map` endpoint which will generate an HTML file with a Leaflet map that can be rendered directly in the notebook.\n", + "For now you can take a shortcut to view the map directly in this notebook using the `/map.html` endpoint which will generate an HTML file with a Leaflet map that can be rendered directly in the notebook.\n", "\n", "

\n", "It may take a while to render tiles for the full view because the titiler-pgstac container is downloading data from S3 in order to render the images - zoom in to have a better browsing experience. This performance can be improved when deploying your own eoAPI through careful preparation of data and sourcing of hardware resources, the demo runs on a very small server.\n", @@ -170,7 +170,7 @@ "outputs": [], "source": [ "IFrame(\n", - " f\"{titiler_browser_endpoint}/collections/{collection_id}/WebMercatorQuad/map?{urlencode(params, doseq=True)}\",\n", + " f\"{titiler_browser_endpoint}/collections/{collection_id}/WebMercatorQuad/map.html?{urlencode(params, doseq=True)}\",\n", " 1200,\n", " 800,\n", ")" @@ -183,8 +183,8 @@ "source": [ "### How does it work?\n", "\n", - "- titiler-pgstac is running as a Lambda (serverless) function in AWS that started up when you made the request for the `/map` endpoint.\n", - "- The `/map` endpoint returns an HTML file that is pre-populated with some map code that includes the layer that you specified with the request parameters\n", + "- titiler-pgstac is running as a Lambda (serverless) function in AWS that started up when you made the request for the `/map.html` endpoint.\n", + "- The `/map.html` endpoint returns an HTML file that is pre-populated with some map code that includes the layer that you specified with the request parameters\n", "- As you browse the map, the map is sending XYZ tile requests to titiler-pgstac function in AWS\n", "- Each request contains the information titiler-pgstac needs to search for items in the pgstac database and how to construct an image from the items' assets\n", " - `collection_id`: by specifying the collection ID in the request path you are instructing titiler-pgstac to search for items from a specific STAC collection. Unless otherwise specified, pgstac will retrieve the STAC items in descending order by datetime and it will stop returning results when a tile's geometry is completely covered.\n", @@ -250,7 +250,7 @@ "source": [ "The response comes back with an `id` which uniquely identifies this search and a handful of useful links associated with our newly registered search.\n", "\n", - "Now you can browse the results of this search with the `/map` endpoint like you did earlier." + "Now you can browse the results of this search with the `/map.html` endpoint like you did earlier." ] }, { @@ -270,7 +270,7 @@ ")\n", "\n", "IFrame(\n", - " f\"{titiler_browser_endpoint}/searches/{search_id}/WebMercatorQuad/map?{urlencode(params, doseq=True)}\",\n", + " f\"{titiler_browser_endpoint}/searches/{search_id}/WebMercatorQuad/map.html?{urlencode(params, doseq=True)}\",\n", " 1200,\n", " 800,\n", ")" @@ -306,6 +306,8 @@ "outputs": [], "source": [ "params = (\n", + " (\"assets\", \"nir\"),\n", + " (\"assets\", \"red\"),\n", " (\"asset_as_band\", \"True\"),\n", " (\"expression\", \"(nir - red) / (nir + red)\"),\n", " (\"colormap_name\", \"viridis\"),\n", @@ -313,7 +315,7 @@ ")\n", "\n", "IFrame(\n", - " f\"{titiler_browser_endpoint}/searches/{search_id}/WebMercatorQuad/map?{urlencode(params, doseq=True)}\",\n", + " f\"{titiler_browser_endpoint}/searches/{search_id}/WebMercatorQuad/map.html?{urlencode(params, doseq=True)}\",\n", " 1200,\n", " 800,\n", ")" @@ -509,7 +511,7 @@ "outputs": [], "source": [ "map_request = httpx.get(\n", - " f\"{titiler_pgstac_endpoint}/external/WebMercatorQuad/map\",\n", + " f\"{titiler_pgstac_endpoint}/external/WebMercatorQuad/map.html\",\n", " params={\n", " \"url\": cog_href,\n", " \"maxsize\": 2048,\n", @@ -544,7 +546,7 @@ "outputs": [], "source": [ "map_request = httpx.get(\n", - " f\"{titiler_pgstac_endpoint}/collections/glad-global-forest-change-1.11/WebMercatorQuad/map\",\n", + " f\"{titiler_pgstac_endpoint}/collections/glad-global-forest-change-1.11/WebMercatorQuad/map.html\",\n", " params={\n", " \"assets\": \"lossyear\",\n", " \"colormap\": json.dumps({i: rgb for i, rgb in colormap.items()}),\n", diff --git a/docs/05-tipg.ipynb b/docs/05-tipg.ipynb index 288aebc..7dbcd14 100644 --- a/docs/05-tipg.ipynb +++ b/docs/05-tipg.ipynb @@ -79,9 +79,9 @@ "- `/collections/{collection_id}/items`: where features can be accessed\n", "- `/collections/{collection_id}/tiles`: list of tile matrix set IDs that are available for tile requests\n", "- `/collections/{collection_id}/tiles/{tileMatrixSetId}`: returns a tilejson for a vector tile layer\n", - "- `/collections/{collection_id}/tiles/{tileMatrixSetId}/viewer`: interactive map of the collection\n", + "- `/collections/{collection_id}/tiles/{tileMatrixSetId}/map.html`: interactive map of the collection\n", "\n", - "The `/items`, `/tiles/{tileMatrixSetId}`, and `/tiles/{tileMatrixSetId}/viewer` endpoints will all accept field filters in the form of `{queryable}={value}` where `queryable` is one of the fields listed in the `/queryables` response for that collection." + "The `/items`, `/tiles/{tileMatrixSetId}`, and `/tiles/{tileMatrixSetId}/map.html` endpoints will all accept field filters in the form of `{queryable}={value}` where `queryable` is one of the fields listed in the `/queryables` response for that collection." ] }, { @@ -377,7 +377,7 @@ "outputs": [], "source": [ "viewer_request = httpx.get(\n", - " f\"{tipg_endpoint}/collections/{collection_id}/tiles/WebMercatorQuad/viewer\",\n", + " f\"{tipg_endpoint}/collections/{collection_id}/tiles/WebMercatorQuad/map.html\",\n", ")\n", "\n", "IFrame(\n", @@ -403,7 +403,7 @@ "outputs": [], "source": [ "filtered_viewer_request = httpx.get(\n", - " f\"{tipg_endpoint}/collections/{collection_id}/tiles/WebMercatorQuad/viewer\",\n", + " f\"{tipg_endpoint}/collections/{collection_id}/tiles/WebMercatorQuad/map.html\",\n", " params={\n", " \"na_l2name\": \"MEDITERRANEAN CALIFORNIA\",\n", " },\n", diff --git a/infrastructure/charts/eoapi-workshop/tests/render-checks.sh b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh index 080f229..ba7b75d 100755 --- a/infrastructure/charts/eoapi-workshop/tests/render-checks.sh +++ b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh @@ -61,6 +61,18 @@ check_has "$ALL" 'REACT_APP_OIDC_AUTHORITY' "OIDC authority env wired" ALL_OFF="$(helm template "$REL" "$CHART_DIR" -n "$NS" --set 'stac-manager.enabled=false' 2>/dev/null)" check_absent "$ALL_OFF" 'name: eoapi-stac-manager' "stac-manager.enabled=false renders nothing" +echo "== compose/chart version lockstep ==" +# The notebooks bake in service routes, which change between releases +# (e.g. /map → /map.html in titiler-pgstac 3.x). Both environments must run the +# SAME versions or the notebooks can only be correct in one of them. Assert the +# rendered chart uses the exact image:tag pinned in docker-compose.yml. +COMPOSE="${CHART_DIR}/../../../docker-compose.yml" +for svc in titiler-pgstac tipg stac-fastapi-pgstac; do + img=$(grep -oE "image: \S*/${svc}:\S+" "$COMPOSE" | head -1 | awk '{print $2}') + check_has "$ALL" "$(sed 's/[.[]/\\&/g' <<<"$img")" "chart runs compose's ${img##*/}" +done +check_has "$ALL" 'TITILER_PGSTAC_API_ENABLE_EXTERNAL_DATASET_ENDPOINTS' "raster external-dataset endpoints enabled (notebook 04 §4.4)" + echo "== auth wiring ==" # The proxy fetches JWKS from OIDC_DISCOVERY_URL's origin, so it MUST be the # in-cluster URL — an external LB URL hairpins from the pod (401). If someone diff --git a/infrastructure/charts/eoapi-workshop/values.yaml b/infrastructure/charts/eoapi-workshop/values.yaml index 1c28e3e..721b48b 100644 --- a/infrastructure/charts/eoapi-workshop/values.yaml +++ b/infrastructure/charts/eoapi-workshop/values.yaml @@ -125,6 +125,8 @@ eoapi: settings: resources: {} envVars: + # Notebook 04 §4.4 uses /external/* (needs this flag, as in docker-compose) + TITILER_PGSTAC_API_ENABLE_EXTERNAL_DATASET_ENDPOINTS: "True" # GDAL performance settings GDAL_CACHEMAX: "200" GDAL_DISABLE_READDIR_ON_OPEN: "EMPTY_DIR" From 025de8e82621c8ea0596efe069cfbe79f825699a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Thu, 2 Jul 2026 01:54:16 +0300 Subject: [PATCH 20/24] feat(data): load the glad STAC collection in compose and the chart MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Notebook 04 §4.5 renders glad-global-forest-change-1.11, but only the 2i2c deploy workflow loaded it — in compose and on Kubernetes the collection was missing (404). Mirror that deploy step in both environments: - chart: add a stac-loader container to the features-loader Job (idempotent, pypgstac upsert from stac.maap-project.org, pinned to the deployed pgstac version 0.9.10) - compose: add an equivalent one-shot stac-loader service (script shared via a compose config), and bump the pgstac image v0.9.8 → v0.9.10 to match - both: set AWS_NO_SIGN_REQUEST=YES on the raster service — the glad assets are s3:// URIs in a public bucket and GDAL refuses unsigned reads otherwise Co-Authored-By: Claude Fable 5 --- docker-compose.yml | 64 ++++++++++++++++- .../templates/features-loader-job.yaml | 69 +++++++++++++++++-- .../eoapi-workshop/tests/render-checks.sh | 3 + .../charts/eoapi-workshop/values.yaml | 12 ++++ 4 files changed, 141 insertions(+), 7 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2281f95..8678592 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ services: database: - image: ghcr.io/stac-utils/pgstac:v0.9.8 + image: ghcr.io/stac-utils/pgstac:v0.9.10 environment: - POSTGRES_USER=username - POSTGRES_PASSWORD=password @@ -59,6 +59,32 @@ services: start_period: 120s + # Load a public STAC collection from the MAAP STAC into pgstac so notebook 04 + # §4.5 has data — mirrors the 2i2c deploy step and the Helm chart's + # features-loader Job (stac-loader container). Idempotent: skips if present. + stac-loader: + image: python:3.12-slim + depends_on: + database: + condition: service_started + environment: + - PGHOST=database + - PGUSER=username + - PGPASSWORD=password + - PGDATABASE=postgis + - PGPORT=5432 + restart: "no" + command: > + bash -c ' + set -euo pipefail && + pip install -q "pypgstac[psycopg]==0.9.10" && + sleep 5 && + python3 /opt/load_stac.py + ' + configs: + - source: load_stac + target: /opt/load_stac.py + stac-fastapi: image: ghcr.io/stac-utils/stac-fastapi-pgstac:6.2.2 ports: @@ -134,9 +160,11 @@ services: # TiTiler Config - MOSAIC_CONCURRENCY=1 - TITILER_PGSTAC_API_ENABLE_EXTERNAL_DATASET_ENDPOINTS=True - # AWS S3 endpoint config + # AWS S3 endpoint config — the workshop's s3:// assets (glad collection) + # are in public buckets; read unsigned unless real credentials are provided - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} + - AWS_NO_SIGN_REQUEST=${AWS_NO_SIGN_REQUEST:-YES} depends_on: database: condition: service_started @@ -217,6 +245,38 @@ services: - STAC_BROWSER_ENDPOINT=http://localhost:8080 - STAC_MANAGER_ENDPOINT=http://localhost:8086 +configs: + # same loader as the Helm chart's stac-loader container — keep in sync + load_stac: + content: | + import json + import sys + import urllib.request + + from pypgstac.db import PgstacDB + from pypgstac.load import Loader, Methods + + SRC = "https://stac.maap-project.org" + COLLECTION = "glad-global-forest-change-1.11" + LIMIT = 100 + + db = PgstacDB() + if db.query_one("select 1 from pgstac.collections where id=%s", [COLLECTION]): + print(f"{COLLECTION} already present -- skipping load.") + sys.exit(0) + + urllib.request.urlretrieve(f"{SRC}/collections/{COLLECTION}", "/tmp/collection.json") + with urllib.request.urlopen(f"{SRC}/search?collections={COLLECTION}&limit={LIMIT}") as r: + features = json.load(r)["features"] + with open("/tmp/items.ndjson", "w") as f: + for feat in features: + f.write(json.dumps(feat) + "\n") + + loader = Loader(db=db) + loader.load_collections("/tmp/collection.json", Methods.upsert) + loader.load_items("/tmp/items.ndjson", Methods.upsert) + print(f"{COLLECTION}: collection + {len(features)} items loaded.") + volumes: pgdata: feature-loader-state: diff --git a/infrastructure/charts/eoapi-workshop/templates/features-loader-job.yaml b/infrastructure/charts/eoapi-workshop/templates/features-loader-job.yaml index ae804e0..f0442d1 100644 --- a/infrastructure/charts/eoapi-workshop/templates/features-loader-job.yaml +++ b/infrastructure/charts/eoapi-workshop/templates/features-loader-job.yaml @@ -1,9 +1,11 @@ {{/* -k8s equivalent of the docker-compose `features-loader`: load the NA CEC Level III -Ecoregions shapefile into features.ecoregions so notebook 05 (tipg) has data. -Runs as a post-install/post-upgrade hook, idempotently (skips if the table -exists). Uses the PGO superuser secret to CREATE SCHEMA and grants read to all -users so tipg can serve it. Loads into the `eoapi` database (what tipg queries). +k8s equivalent of the docker-compose `features-loader` + `stac-loader`: load +the NA CEC Level III Ecoregions shapefile into features.ecoregions (notebook +05 / tipg) and the glad STAC collection from the MAAP STAC into pgstac +(notebook 04 §4.5 / titiler). Runs as a post-install/post-upgrade hook, +idempotently (each container skips if its data is already present). Uses the +PGO superuser secret to CREATE SCHEMA and grants read to all users so tipg can +serve it. Loads into the `eoapi` database (what tipg and pgstac serve). */}} {{- if .Values.featuresLoader.enabled }} apiVersion: batch/v1 @@ -60,4 +62,61 @@ spec: valueFrom: { secretKeyRef: { name: {{ .Release.Name }}-pguser-postgres, key: password } } resources: {{- toYaml .Values.featuresLoader.resources | nindent 12 }} + - name: stac-loader + image: {{ .Values.featuresLoader.stac.image | quote }} + command: + - bash + - -c + - | + set -euo pipefail + pip install -q "pypgstac[psycopg]=={{ .Values.featuresLoader.stac.pypgstacVersion }}" + python3 - <<'PY' + import json + import sys + import urllib.request + + from pypgstac.db import PgstacDB + from pypgstac.load import Loader, Methods + + SRC = {{ .Values.featuresLoader.stac.source | quote }} + COLLECTION = {{ .Values.featuresLoader.stac.collection | quote }} + LIMIT = {{ .Values.featuresLoader.stac.itemLimit }} + + db = PgstacDB() + if db.query_one( + "select 1 from pgstac.collections where id=%s", [COLLECTION] + ): + print(f"{COLLECTION} already present -- skipping load.") + sys.exit(0) + + urllib.request.urlretrieve( + f"{SRC}/collections/{COLLECTION}", "/tmp/collection.json" + ) + with urllib.request.urlopen( + f"{SRC}/search?collections={COLLECTION}&limit={LIMIT}" + ) as r: + features = json.load(r)["features"] + with open("/tmp/items.ndjson", "w") as f: + for feat in features: + f.write(json.dumps(feat) + "\n") + + loader = Loader(db=db) + loader.load_collections("/tmp/collection.json", Methods.upsert) + loader.load_items("/tmp/items.ndjson", Methods.upsert) + print(f"{COLLECTION}: collection + {len(features)} items loaded.") + PY + env: + - name: PGDATABASE + value: "eoapi" + - name: PGHOST + valueFrom: { secretKeyRef: { name: {{ .Release.Name }}-pguser-postgres, key: host } } + - name: PGPORT + valueFrom: { secretKeyRef: { name: {{ .Release.Name }}-pguser-postgres, key: port } } + - name: PGUSER + valueFrom: { secretKeyRef: { name: {{ .Release.Name }}-pguser-postgres, key: user } } + - name: PGPASSWORD + valueFrom: { secretKeyRef: { name: {{ .Release.Name }}-pguser-postgres, key: password } } + resources: + requests: { cpu: "100m", memory: "256Mi" } + limits: { cpu: "500m", memory: "1Gi" } {{- end }} diff --git a/infrastructure/charts/eoapi-workshop/tests/render-checks.sh b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh index ba7b75d..91c261c 100755 --- a/infrastructure/charts/eoapi-workshop/tests/render-checks.sh +++ b/infrastructure/charts/eoapi-workshop/tests/render-checks.sh @@ -72,6 +72,7 @@ for svc in titiler-pgstac tipg stac-fastapi-pgstac; do check_has "$ALL" "$(sed 's/[.[]/\\&/g' <<<"$img")" "chart runs compose's ${img##*/}" done check_has "$ALL" 'TITILER_PGSTAC_API_ENABLE_EXTERNAL_DATASET_ENDPOINTS' "raster external-dataset endpoints enabled (notebook 04 §4.4)" +check_has "$ALL" 'AWS_NO_SIGN_REQUEST' "raster reads public s3:// assets unsigned (glad collection)" echo "== auth wiring ==" # The proxy fetches JWKS from OIDC_DISCOVERY_URL's origin, so it MUST be the @@ -93,6 +94,8 @@ check_has "$FA" 'name: eoapi-features-loader' "features-loader Job renders" check_has "$FA" 'features\.ecoregions' "loader targets features.ecoregions" check_has "$FA" 'name: eoapi-pguser-postgres' "loader uses the superuser secret" check_has "$FA" 'TIPG_DB_SCHEMAS' "tipg exposes the features schema" +check_has "$FA" 'glad-global-forest-change-1\.11' "loader ingests the glad STAC collection (notebook 04 §4.5)" +check_has "$FA" 'pypgstac\[psycopg\]==0\.9\.10' "pypgstac pinned to the deployed pgstac version" FA_OFF="$(helm template "$REL" "$CHART_DIR" -n "$NS" --set featuresLoader.enabled=false 2>/dev/null)" check_absent "$FA_OFF" 'name: eoapi-features-loader' "featuresLoader.enabled=false renders nothing" diff --git a/infrastructure/charts/eoapi-workshop/values.yaml b/infrastructure/charts/eoapi-workshop/values.yaml index 721b48b..2769323 100644 --- a/infrastructure/charts/eoapi-workshop/values.yaml +++ b/infrastructure/charts/eoapi-workshop/values.yaml @@ -127,6 +127,9 @@ eoapi: envVars: # Notebook 04 §4.4 uses /external/* (needs this flag, as in docker-compose) TITILER_PGSTAC_API_ENABLE_EXTERNAL_DATASET_ENDPOINTS: "True" + # The workshop's s3:// assets (glad collection) live in public buckets; + # read them unsigned — no AWS credentials in this deployment. + AWS_NO_SIGN_REQUEST: "YES" # GDAL performance settings GDAL_CACHEMAX: "200" GDAL_DISABLE_READDIR_ON_OPEN: "EMPTY_DIR" @@ -379,3 +382,12 @@ featuresLoader: resources: requests: { cpu: "200m", memory: "512Mi" } limits: { cpu: "1", memory: "2Gi" } + # STAC data for notebook 04 §4.5: mirror of the 2i2c deploy step that loads a + # public collection from the MAAP STAC into pgstac. + stac: + image: python:3.12-slim + source: "https://stac.maap-project.org" + collection: "glad-global-forest-change-1.11" + itemLimit: 100 + # keep in lockstep with the pgstac version the eoapi subchart migrates to + pypgstacVersion: "0.9.10" From 431d8352006e8c25b0a13c05e5e8f7bef8f593b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Thu, 2 Jul 2026 01:54:16 +0300 Subject: [PATCH 21/24] fix(docs): prefill notebook 04's username from the catalog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The username widget defaulted to None, so notebook 04 only worked if a human retyped the exact username used in notebook 02 — and headless runs always failed (collection "None-sentinel-2-c1-l2a" → KeyError on 'extent'). Prefill the widget with the username of the most recent *-sentinel-2-c1-l2a collection in the STAC catalog; participants can still overwrite it. Co-Authored-By: Claude Fable 5 --- docs/04-titiler_pgstac.ipynb | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/04-titiler_pgstac.ipynb b/docs/04-titiler_pgstac.ipynb index cbcdfa9..110593a 100644 --- a/docs/04-titiler_pgstac.ipynb +++ b/docs/04-titiler_pgstac.ipynb @@ -38,11 +38,27 @@ "metadata": {}, "outputs": [], "source": [ + "import os\n", + "\n", + "import httpx\n", "import ipywidgets as widgets\n", "from IPython.display import display\n", "\n", + "# Prefill with the username of the most recent sentinel-2 collection in the\n", + "# catalog (created in notebook 02) — replace it with your own if it differs.\n", + "_collections = (\n", + " httpx.get(f\"{os.getenv('STAC_API_ENDPOINT')}/collections\", timeout=30)\n", + " .json()\n", + " .get(\"collections\", [])\n", + ")\n", + "_usernames = [\n", + " c[\"id\"].removesuffix(\"-sentinel-2-c1-l2a\")\n", + " for c in _collections\n", + " if c[\"id\"].endswith(\"-sentinel-2-c1-l2a\")\n", + "]\n", + "\n", "username_input = widgets.Text(\n", - " value=None,\n", + " value=_usernames[-1] if _usernames else None,\n", " placeholder=\"Enter your username\",\n", " description=\"username:\",\n", " disabled=False,\n", From 35f93136c3778a68f7b0665e1db4919466d7d1e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Thu, 2 Jul 2026 08:23:52 +0300 Subject: [PATCH 22/24] fix(docs): prefill notebook 03's username from the catalog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same failure mode as notebook 04 (431d835): the username widget defaulted to None and notebook 02 generates a random Haikunator username, so the collection search always came back empty — and silently, since the cell displayed nothing on no match. Re-running the widget cell also wiped anything the user had typed. Prefill the widget with the username of the most recent *-sentinel-2-c1-l2a collection in the STAC catalog, and print the searched value plus available collection ids when the filter matches nothing. Co-Authored-By: Claude Fable 5 --- docs/03-stac_fastapi_pgstac.ipynb | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/docs/03-stac_fastapi_pgstac.ipynb b/docs/03-stac_fastapi_pgstac.ipynb index 9c9abda..ece6f24 100644 --- a/docs/03-stac_fastapi_pgstac.ipynb +++ b/docs/03-stac_fastapi_pgstac.ipynb @@ -238,8 +238,24 @@ "import ipywidgets as widgets\n", "from IPython.display import display\n", "\n", + "# Prefill with the username of the most recent sentinel-2 collection in the\n", + "# catalog (created in notebook 02). If you picked your own username there,\n", + "# replace the value below - but keep in mind that notebook 02 generates a\n", + "# random default (e.g. \"quiet-surf-4719\"), so what you type here must match\n", + "# the collection id that actually exists in the catalog (see section 3.2.1).\n", + "_collections = (\n", + " httpx.get(f\"{stac_api_endpoint}/collections\", timeout=30)\n", + " .json()\n", + " .get(\"collections\", [])\n", + ")\n", + "_usernames = [\n", + " c[\"id\"].removesuffix(\"-sentinel-2-c1-l2a\")\n", + " for c in _collections\n", + " if c[\"id\"].endswith(\"-sentinel-2-c1-l2a\")\n", + "]\n", + "\n", "username_input = widgets.Text(\n", - " value=None,\n", + " value=_usernames[-1] if _usernames else None,\n", " placeholder=\"Enter your username\",\n", " description=\"username:\",\n", " disabled=False,\n", @@ -264,7 +280,13 @@ "\n", "if results:\n", " my_collection = results[0]\n", - " display(my_collection)" + " display(my_collection)\n", + "else:\n", + " all_ids = [c.id for c in client.get_all_collections()]\n", + " print(\n", + " f\"No collections matched {username_input.value!r}. \"\n", + " f\"Collection ids in the catalog: {all_ids}\"\n", + " )" ], "execution_count": null, "outputs": [], From a1c4fee5a16b467646649af0f319aa200ebe3030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Thu, 2 Jul 2026 08:27:27 +0300 Subject: [PATCH 23/24] fix(compose)+docs: make the notebooks run inside the compose jupyterhub container MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Running the notebooks in the compose jupyterhub service (rather than a host-side Jupyter) exposed three issues: - titiler-pgstac 3.x dropped the POSTGRES_* settings for PG* / DATABASE_URL; compose still passed the old names, so the service crashed at startup (quote_from_bytes(None)). Rename the env vars. - notebook 04 rewrote its server-side endpoint to localhost at definition time, breaking every in-container httpx call. Keep the server endpoint as-is and apply the localhost rewrite only in the browser-URL fallback. - notebook 04 cells 21/23 used httpx's 5s default timeout for remote-COG info/preview — too short under emulation or on slow networks. Use timeout=None like the sibling cells. Verified: notebooks 02-05 execute with 0 errors inside the compose jupyterhub container (03's catalog-prefill from the previous commit supplies a coherent username headless); all rendered IFrame URLs use the host-reachable localhost ports. Co-Authored-By: Claude Fable 5 --- docker-compose.yml | 12 ++++++------ docs/04-titiler_pgstac.ipynb | 10 ++++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8678592..f6a1b63 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -137,12 +137,12 @@ services: ports: - 8082:8082 environment: - # Postgres connection - - POSTGRES_USER=username - - POSTGRES_PASS=password - - POSTGRES_DBNAME=postgis - - POSTGRES_HOST=database - - POSTGRES_PORT=5432 + # Postgres connection — titiler-pgstac 3.x reads PG* (POSTGRES_* was dropped) + - PGUSER=username + - PGPASSWORD=password + - PGDATABASE=postgis + - PGHOST=database + - PGPORT=5432 - DB_MIN_CONN_SIZE=1 - DB_MAX_CONN_SIZE=10 # - DB_MAX_QUERIES=10 diff --git a/docs/04-titiler_pgstac.ipynb b/docs/04-titiler_pgstac.ipynb index 110593a..5bcb3cf 100644 --- a/docs/04-titiler_pgstac.ipynb +++ b/docs/04-titiler_pgstac.ipynb @@ -86,12 +86,12 @@ "\n", "from IPython.display import IFrame, Image\n", "\n", - "titiler_pgstac_endpoint = os.getenv(\"TITILER_PGSTAC_API_ENDPOINT\").replace(\n", + "titiler_pgstac_endpoint = os.getenv(\"TITILER_PGSTAC_API_ENDPOINT\")\n", + "# browser-facing URL for the IFrame/map cells (the user's browser can't reach\n", + "# the server-side endpoint above when running on Kubernetes or docker-compose)\n", + "titiler_browser_endpoint = os.getenv(\"TITILER_BROWSER_URL\") or titiler_pgstac_endpoint.replace(\n", " \"titiler-pgstac\", \"localhost\"\n", ")\n", - "# browser-facing URL for the IFrame/map cells (the user's browser can't reach\n", - "# the server-side endpoint above when running on Kubernetes)\n", - "titiler_browser_endpoint = os.getenv(\"TITILER_BROWSER_URL\") or titiler_pgstac_endpoint\n", "api_docs = f\"{titiler_browser_endpoint}/api.html\"\n", "print(api_docs)\n", "\n", @@ -387,6 +387,7 @@ " params={\n", " \"url\": cog_href,\n", " },\n", + " timeout=None,\n", ")\n", "\n", "print(json.dumps(cog_info_request.json(), indent=2))" @@ -415,6 +416,7 @@ " \"url\": cog_href,\n", " \"maxsize\": 2048,\n", " },\n", + " timeout=None,\n", ")\n", "\n", "Image(preview_request.content)" From 55ca7c7ee803e7d9f8b1f72724a37a245048e1dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Thu, 2 Jul 2026 08:40:55 +0300 Subject: [PATCH 24/24] style: ruff-format the notebooks and stac_auth helper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Run the repo-pinned ruff (0.11.5) over the notebooks so CI's 'ruff format --check' passes. No behavioural change — notebooks 02-05 re-verified green in the compose jupyterhub container after formatting. Co-Authored-By: Claude Fable 5 --- docs/02-database.ipynb | 8156 ++++++- docs/03-stac_fastapi_pgstac.ipynb | 28335 ++++++++++++++++++++++++- docs/04-titiler_pgstac.ipynb | 6 +- docs/05-tipg.ipynb | 4 +- docs/06-stac_transactions_auth.ipynb | 18 +- docs/stac_auth.py | 4 +- 6 files changed, 35934 insertions(+), 589 deletions(-) diff --git a/docs/02-database.ipynb b/docs/02-database.ipynb index 340c399..fd8e138 100644 --- a/docs/02-database.ipynb +++ b/docs/02-database.ipynb @@ -39,10 +39,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "68in9iet0cb", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✓ Database credentials already configured\n" + ] + } + ], "source": [ "from workshop_setup import setup, get_random_point\n", "\n", @@ -61,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "196e7c1d-b82b-4d66-bf96-4942cd02392c", "metadata": { "editable": true, @@ -72,7 +80,50 @@ "hide-input" ] }, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "76374355631d418bb25463a889f3f999", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Text(value='dark-dream-2670', description='username:', placeholder='Enter your username')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fe5330f700de4ef09602fdb283341537", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "BoundedFloatText(value=-33.17, description='latitude:', max=90.0, min=-90.0)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6b7dd0353648444c9e4aaffe3fd54172", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "BoundedFloatText(value=135.72, description='longitude:', max=180.0, min=-180.0)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "import os\n", "\n", @@ -122,10 +173,273 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "1a09b4e5-1727-4ee2-96ef-e0772267829d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "
\n", + "
\n", + " <Collection id=dark-dream-2670-sentinel-2-c1-l2a>\n", + "
\n", + "\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "import pystac_client\n", "from pystac import Collection, Extent, SpatialExtent, TemporalExtent\n", @@ -165,7 +479,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "0536d319-0b51-40b4-8fe2-4ceb3ceacfec", "metadata": {}, "outputs": [], @@ -186,7 +500,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "7ae2471c-8164-466f-a56d-745213cb7316", "metadata": {}, "outputs": [], @@ -204,10 +518,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "7d71b6b1-70c3-4e5d-9444-f1dddb4e98c3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[('dark-dream-2670-sentinel-2-c1-l2a',)]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "list(db.query(f\"SELECT id from collections where id = '{my_collection.id}';\"))" ] @@ -226,10 +551,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "6a858a2d-57b7-40e9-8235-2c341f43a8de", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "948\n" + ] + } + ], "source": [ "source_client = pystac_client.Client.open(\"https://earth-search.aws.element84.com/v1\")\n", "\n", @@ -255,10 +588,7713 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "a410af0b-6d3c-4a8a-87ee-b16265afcd6a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "
\n", + "
\n", + " <Item id=S2B_T53HLB_20250416T010240_L2A>\n", + "
\n", + "\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# override the collection id to match your new collection\n", "for item in items:\n", @@ -277,7 +8313,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "82443eb2-0d59-46b2-9178-25acb3d0593e", "metadata": {}, "outputs": [], @@ -295,10 +8331,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "48133d14-e301-45b4-973d-1b846a6c503a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "there are 948 items\n" + ] + } + ], "source": [ "n_items = db.query_one(\n", " f\"SELECT COUNT(*) FROM items where collection = '{my_collection.id}';\"\n", @@ -318,10 +8362,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "ba5f6278-4d92-4386-af1d-94ca5aed6c30", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from IPython.display import IFrame\n", "\n", @@ -332,7 +8399,9 @@ "if stac_browser_endpoint:\n", " browser_url = f\"{stac_browser_endpoint}/#/collections/{my_collection.id}\"\n", "else:\n", - " browser_stac_url = os.getenv(\"STAC_API_ENDPOINT\").replace(\"stac-auth-proxy:8000\", \"localhost:8084\")\n", + " browser_stac_url = os.getenv(\"STAC_API_ENDPOINT\").replace(\n", + " \"stac-auth-proxy:8000\", \"localhost:8084\"\n", + " )\n", " browser_url = f\"https://radiantearth.github.io/stac-browser/#/external/{browser_stac_url}/collections/{my_collection.id}\"\n", "\n", "IFrame(\n", @@ -356,7 +8425,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "4c6782bf-b043-49a0-a338-7676ff52d005", "metadata": {}, "outputs": [], @@ -370,10 +8439,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "d3030aa7-4aaa-4ead-8589-b88759968f99", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "now there are 947 items\n" + ] + } + ], "source": [ "new_n_items = db.query_one(\n", " f\"SELECT COUNT(*) FROM items where collection = '{my_collection.id}';\"\n", @@ -383,7 +8460,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "dd34e829-0fc7-4abd-88ed-6fce8e73d1bf", "metadata": {}, "outputs": [], @@ -404,12 +8481,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "7137a06e-135c-478a-a79f-d7134bd48d3d", "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"type\":\"FeatureCollection\",\"links\":[{\"rel\":\"root\",\"href\":\".\",\"type\":\"application/json\"},{\"rel\":\"self\",\"href\":\"./search\",\"type\":\"application/json\"},{\"rel\":\"next\",\"href\":\"./search?token=next:dark-dream-2670-sentinel-2-c1-l2a:S2B_T53HLB_20250416T010240_L2A\",\"type\":\"application/geo+json\",\"method\":\"GET\"}],\"features\":[{\"id\":\"S2B_T53HLB_20250416T010240_L2A\",\"bbox\":[132.986678,-35.327182,134.019373,-34.329311],\"type\":\"Feature\",\"links\":[{\"rel\":\"self\",\"href\":\"https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T53HLB_20250416T010240_L2A\",\"type\":\"application/geo+json\"},{\"rel\":\"canonical\",\"href\":\"s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/S2B_T53HLB_20250416T010240_L2A.json\",\"type\":\"application/json\"},{\"rel\":\"via\",\"href\":\"s3://sentinel-s2-l2a/tiles/53/H/LB/2025/4/16/0/metadata.xml\",\"type\":\"application/xml\",\"title\":\"Granule Metadata in Sinergize RODA Archive\"},{\"rel\":\"parent\",\"href\":\"https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a\",\"type\":\"application/json\"},{\"rel\":\"root\",\"href\":\"https://earth-search.aws.element84.com/v1\",\"type\":\"application/json\",\"title\":\"Earth Search by Element 84\"},{\"rel\":\"thumbnail\",\"href\":\"https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T53HLB_20250416T010240_L2A/thumbnail\"},{\"rel\":\"collection\",\"type\":\"application/json\"}],\"assets\":{\"aot\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/AOT.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\"],\"title\":\"Aerosol optical thickness (AOT)\",\"file:size\":273323,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.001,\"nodata\":0,\"offset\":0,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"12204952da596a5c851876f3cd466e374f1f29cc6da8a69d863d2228966972539891\",\"proj:transform\":[20,0,300000,0,-20,6200020]},\"nir\":{\"gsd\":10,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B08.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"NIR 1 - 10m\",\"eo:bands\":[{\"name\":\"B08\",\"common_name\":\"nir\",\"center_wavelength\":0.842,\"full_width_half_max\":0.145}],\"file:size\":133559679,\"proj:shape\":[10980,10980],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":10}],\"file:checksum\":\"1220554285286e6dc529d78438689e81762a9aee8595b3cf80c7424e8154c6cb5a84\",\"proj:transform\":[10,0,300000,0,-10,6200020]},\"red\":{\"gsd\":10,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B04.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Red - 10m\",\"eo:bands\":[{\"name\":\"B04\",\"common_name\":\"red\",\"center_wavelength\":0.665,\"full_width_half_max\":0.038}],\"file:size\":133807213,\"proj:shape\":[10980,10980],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":10}],\"file:checksum\":\"1220c430e71e9c3ac487660cbf5b4f5a5151ef0a9a53cb3964143394386e5e6696ee\",\"proj:transform\":[10,0,300000,0,-10,6200020]},\"scl\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/SCL.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\"],\"title\":\"Scene classification map (SCL)\",\"file:size\":1195551,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":20}],\"file:checksum\":\"12201803d9dedbdcf77cfa05815bf082381857ca898ccd2fb98370387a8287361e6f\",\"proj:transform\":[20,0,300000,0,-20,6200020]},\"wvp\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/WVP.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\"],\"title\":\"Water Vapour (WVP)\",\"file:size\":186898,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"unit\":\"cm\",\"scale\":0.001,\"nodata\":0,\"offset\":0,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"1220fa2cbfb26c752d559b1b568e507c4ee8367fd1bd8aa638add4ed021cf5401d10\",\"proj:transform\":[20,0,300000,0,-20,6200020]},\"blue\":{\"gsd\":10,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B02.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Blue - 10m\",\"eo:bands\":[{\"name\":\"B02\",\"common_name\":\"blue\",\"center_wavelength\":0.49,\"full_width_half_max\":0.098}],\"file:size\":139809856,\"proj:shape\":[10980,10980],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":10}],\"file:checksum\":\"12208f0dcac15d931e1a916f60f956926425ef868510ebaca4d9c6299a0f7a25c4e4\",\"proj:transform\":[10,0,300000,0,-10,6200020]},\"snow\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/SNW_20m.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"snow-ice\"],\"title\":\"Snow Probabilities\",\"file:size\":53931,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":20}],\"file:checksum\":\"1220a2e0bc57410a89813d86952206c620f6b0c29e580ea1b602a31a9f8f18b3f204\",\"proj:transform\":[20,0,300000,0,-20,6200020]},\"cloud\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/CLD_20m.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"cloud\"],\"title\":\"Cloud Probabilities\",\"file:size\":3905464,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":20}],\"file:checksum\":\"12203b479cd7a439ec4de573b5d80748eb7e8535ce7815e33f749c20d92f1e7f3b62\",\"proj:transform\":[20,0,300000,0,-20,6200020]},\"green\":{\"gsd\":10,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B03.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Green - 10m\",\"eo:bands\":[{\"name\":\"B03\",\"common_name\":\"green\",\"center_wavelength\":0.56,\"full_width_half_max\":0.045}],\"file:size\":136213923,\"proj:shape\":[10980,10980],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":10}],\"file:checksum\":\"12203c216da945d32b1e2175ae1d17ab5bb2c163fa88a205e83dfb674383a0da7f58\",\"proj:transform\":[10,0,300000,0,-10,6200020]},\"nir08\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B8A.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"NIR 2 - 20m\",\"eo:bands\":[{\"name\":\"B8A\",\"common_name\":\"nir08\",\"center_wavelength\":0.865,\"full_width_half_max\":0.033}],\"file:size\":35952693,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"1220a6fc63bf322fc11ce9ac689970bd8e88d01d09efc4107eca2b7df9b99aec6f81\",\"proj:transform\":[20,0,300000,0,-20,6200020]},\"nir09\":{\"gsd\":60,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B09.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"NIR 3 - 60m\",\"eo:bands\":[{\"name\":\"B09\",\"common_name\":\"nir09\",\"center_wavelength\":0.945,\"full_width_half_max\":0.026}],\"file:size\":4399445,\"proj:shape\":[1830,1830],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":60}],\"file:checksum\":\"12209778a02fd1bd25ca48b3397d6783d71165b741a577aa0a5386de7e10b78a9a3a\",\"proj:transform\":[60,0,300000,0,-60,6200020]},\"swir16\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B11.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"SWIR 1.6μm - 20m\",\"eo:bands\":[{\"name\":\"B11\",\"common_name\":\"swir16\",\"center_wavelength\":1.61,\"full_width_half_max\":0.143}],\"file:size\":35152883,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"122006417729758845a7f6bae55f5fd3b67e9039157d90fc0aedef4080ec5840ba78\",\"proj:transform\":[20,0,300000,0,-20,6200020]},\"swir22\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B12.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"SWIR 2.2μm - 20m\",\"eo:bands\":[{\"name\":\"B12\",\"common_name\":\"swir22\",\"center_wavelength\":2.19,\"full_width_half_max\":0.242}],\"file:size\":35968600,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"12206c533c7371eded58f9e85b640cbbda9f69be10bb4dce7144b2843a4eae92e92c\",\"proj:transform\":[20,0,300000,0,-20,6200020]},\"visual\":{\"gsd\":10,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/TCI.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"visual\"],\"title\":\"True color image\",\"eo:bands\":[{\"name\":\"B04\",\"common_name\":\"red\",\"center_wavelength\":0.665,\"full_width_half_max\":0.038},{\"name\":\"B03\",\"common_name\":\"green\",\"center_wavelength\":0.56,\"full_width_half_max\":0.045},{\"name\":\"B02\",\"common_name\":\"blue\",\"center_wavelength\":0.49,\"full_width_half_max\":0.098}],\"file:size\":134313884,\"proj:shape\":[10980,10980],\"raster:bands\":[{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":10},{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":10},{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":10}],\"file:checksum\":\"1220d594a4d8fbae5afcde075c02868b80ddf94049f832b427cad44c2bc2ec48cea1\",\"proj:transform\":[10,0,300000,0,-10,6200020]},\"coastal\":{\"gsd\":60,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B01.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Coastal - 60m\",\"eo:bands\":[{\"name\":\"B01\",\"common_name\":\"coastal\",\"center_wavelength\":0.443,\"full_width_half_max\":0.027}],\"file:size\":4041730,\"proj:shape\":[1830,1830],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":60}],\"file:checksum\":\"1220bf8b9d3d17783c45ba128c64da4b821f121a817b769615894279df9307f408aa\",\"proj:transform\":[60,0,300000,0,-60,6200020]},\"preview\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/L2A_PVI.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"overview\"],\"title\":\"True color preview\",\"eo:bands\":[{\"name\":\"B04\",\"common_name\":\"red\",\"center_wavelength\":0.665,\"full_width_half_max\":0.038},{\"name\":\"B03\",\"common_name\":\"green\",\"center_wavelength\":0.56,\"full_width_half_max\":0.045},{\"name\":\"B02\",\"common_name\":\"blue\",\"center_wavelength\":0.49,\"full_width_half_max\":0.098}],\"file:size\":143296,\"file:checksum\":\"1220a6d5e1e1df4e2decbcb1d180295019e3c23a3c650cd3a25c5397b09ac541199c\"},\"rededge1\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B05.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Red Edge 1 - 20m\",\"eo:bands\":[{\"name\":\"B05\",\"common_name\":\"rededge\",\"center_wavelength\":0.704,\"full_width_half_max\":0.019}],\"file:size\":36112592,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"1220d7ed056f05d925711c31aa1eceb4bf339b9db4c4c0591c4058a62b9b785062e2\",\"proj:transform\":[20,0,300000,0,-20,6200020]},\"rededge2\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B06.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Red Edge 2 - 20m\",\"eo:bands\":[{\"name\":\"B06\",\"common_name\":\"rededge\",\"center_wavelength\":0.74,\"full_width_half_max\":0.018}],\"file:size\":35889857,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"12206511a70a2f30a4b168533c1c8c70bcce53836d19e19cd29d941ac689b0540c44\",\"proj:transform\":[20,0,300000,0,-20,6200020]},\"rededge3\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/B07.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Red Edge 3 - 20m\",\"eo:bands\":[{\"name\":\"B07\",\"common_name\":\"rededge\",\"center_wavelength\":0.783,\"full_width_half_max\":0.028}],\"file:size\":36093258,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"12208ba064ff4d4d2f65903a1c3d9084a2b82e5a848b4b39e8ea9e8b9a409fc33069\",\"proj:transform\":[20,0,300000,0,-20,6200020]},\"thumbnail\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/L2A_PVI.jpg\",\"type\":\"image/jpeg\",\"roles\":[\"thumbnail\"],\"title\":\"Thumbnail of preview image\",\"file:size\":28745,\"file:checksum\":\"12209e0e170b9f5c28771c86eb8c35b3ade75e847b0eee99747c939044eeb0ae71d6\"},\"granule_metadata\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/metadata.xml\",\"type\":\"application/xml\",\"roles\":[\"metadata\"],\"file:size\":375533,\"file:checksum\":\"1220703c9620d14c017a8cb80af8c19b53d94287f0c202b2ec5e05db23be749c6957\"},\"product_metadata\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/product_metadata.xml\",\"type\":\"application/xml\",\"roles\":[\"metadata\"],\"file:size\":54893,\"file:checksum\":\"12204173b8a9029b04fa726763c0051e84654f5e1780840107bd37f79633391ef702\"},\"tileinfo_metadata\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/53/H/LB/2025/4/S2B_T53HLB_20250416T010240_L2A/tileInfo.json\",\"type\":\"application/json\",\"roles\":[\"metadata\"],\"file:size\":1521,\"file:checksum\":\"1220e35fa9e4140350903268c9db4cb83c5582827bd26ea1eea7e61b52041c50ab50\"}},\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[133.2986412494336,-34.329310504040116],[132.98667821085152,-35.31448967467239],[134.00756378262122,-35.32718167573166],[134.0193728890354,-34.33720451171367],[133.2986412494336,-34.329310504040116]]]},\"collection\":\"dark-dream-2670-sentinel-2-c1-l2a\",\"properties\":{\"created\":\"2025-04-16T03:28:24.759Z\",\"updated\":\"2025-04-16T03:28:24.759Z\",\"datetime\":\"2025-04-16T01:07:00.210000Z\",\"platform\":\"sentinel-2b\",\"grid:code\":\"MGRS-53HLB\",\"proj:code\":\"EPSG:32753\",\"s2:tile_id\":\"S2B_OPER_MSI_L2A_TL_2BPS_20250416T023215_A042356_T53HLB_N05.11\",\"instruments\":[\"msi\"],\"view:azimuth\":104.01898444691977,\"constellation\":\"sentinel-2\",\"mgrs:utm_zone\":53,\"proj:centroid\":{\"lat\":-34.85543,\"lon\":133.5735},\"eo:cloud_cover\":36.831665,\"s2:datatake_id\":\"GS2B_20250416T005709_042356_N05.11\",\"s2:product_uri\":\"S2B_MSIL2A_20250416T005709_N0511_R002_T53HLB_20250416T023215.SAFE\",\"storage:region\":\"us-west-2\",\"s2:datastrip_id\":\"S2B_OPER_MSI_L2A_DS_2BPS_20250416T023215_S20250416T010240_N05.11\",\"s2:product_type\":\"S2MSI2A\",\"mgrs:grid_square\":\"LB\",\"s2:datatake_type\":\"INS-NOBS\",\"storage:platform\":\"AWS\",\"view:sun_azimuth\":37.707085408929,\"mgrs:latitude_band\":\"H\",\"s2:generation_time\":\"2025-04-16T02:32:15.000000Z\",\"view:sun_elevation\":36.9090104766897,\"processing:software\":{\"sentinel-2-c1-l2a-to-stac\":\"v2024.02.01\"},\"s2:water_percentage\":63.167995,\"view:incidence_angle\":8.65244882282184,\"earthsearch:payload_id\":\"roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/28166453882f488743e2ffeb07d3f531\",\"s2:processing_baseline\":\"05.11\",\"s2:snow_ice_percentage\":0,\"storage:requester_pays\":false,\"s2:vegetation_percentage\":0.000348,\"s2:thin_cirrus_percentage\":0.000658,\"s2:cloud_shadow_percentage\":0,\"s2:nodata_pixel_percentage\":27.439335,\"s2:unclassified_percentage\":0,\"s2:not_vegetated_percentage\":0,\"s2:degraded_msi_data_percentage\":0.0099,\"s2:high_proba_clouds_percentage\":25.317863,\"s2:reflectance_conversion_factor\":0.995650530204258,\"s2:medium_proba_clouds_percentage\":11.513144,\"s2:saturated_defective_pixel_percentage\":0},\"stac_version\":\"1.1.0\",\"stac_extensions\":[\"https://stac-extensions.github.io/eo/v1.1.0/schema.json\",\"https://stac-extensions.github.io/file/v2.1.0/schema.json\",\"https://stac-extensions.github.io/grid/v1.1.0/schema.json\",\"https://stac-extensions.github.io/mgrs/v1.0.0/schema.json\",\"https://stac-extensions.github.io/processing/v1.1.0/schema.json\",\"https://stac-extensions.github.io/projection/v2.0.0/schema.json\",\"https://stac-extensions.github.io/raster/v1.1.0/schema.json\",\"https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json\",\"https://stac-extensions.github.io/storage/v1.0.0/schema.json\",\"https://stac-extensions.github.io/view/v1.0.0/schema.json\"]}],\"numberReturned\":1}\n" + ] + } + ], "source": [ "search_results = db.search(query={\"collections\": [my_collection.id], \"limit\": 1})\n", "\n", @@ -428,10 +8513,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "81f8addb-d890-434f-984e-b4ea591e94ef", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('quiet-surf-4719-sentinel-2-c1-l2a', 2521)\n", + "('glad-global-forest-change-1.11', 100)\n", + "('super-mouse-3144-sentinel-2-c1-l2a', 12)\n", + "('dark-dream-2670-sentinel-2-c1-l2a', 948)\n" + ] + } + ], "source": [ "summary_query = db.query(\n", " \"SELECT collection, COUNT(*) as count FROM items GROUP BY collection;\"\n", @@ -442,7 +8538,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "a9438ee2-50ee-48e6-907f-4b7e6c6ac151", "metadata": {}, "outputs": [], @@ -475,7 +8571,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.11" + "version": "3.12.13" } }, "nbformat": 4, diff --git a/docs/03-stac_fastapi_pgstac.ipynb b/docs/03-stac_fastapi_pgstac.ipynb index ece6f24..548cefa 100644 --- a/docs/03-stac_fastapi_pgstac.ipynb +++ b/docs/03-stac_fastapi_pgstac.ipynb @@ -1,575 +1,27820 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3. The STAC API: stac-fastapi-pgstac\n", - "\n", - "The STAC API provided by eoAPI is [stac-fastapi-pgstac](https://github.com/stac-utils/stac-fastapi-pgstac): a stac-fastapi application with a pgstac backend.\n", - "stac-fastapi-pgstac translates STAC API requests into pgstac queries and returns the results to the requester.\n", - "\n", - "The stac-fastapi-pgstac STAC API can be accessed using any HTTP client but STAC API clients like `pystac-client` provide a more intuitive interface. In this tutorial you will learn how to use HTTP requests via `httpx` as well as `pystac-client` methods." - ], - "id": "7f4f9109-ac1f-473b-b30b-c35294ae426d" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3.1 stac-fastapi-pgstac structure\n", - "\n", - "A standard eoAPI deployment will run an unmodified version of the FastAPI application defined in `stac_fastapi.pgstac.app:app` ([source](https://github.com/stac-utils/stac-fastapi-pgstac/blob/main/stac_fastapi/pgstac/app.py)). Unless otherwise specified, all of the extensions except the `transaction` and `bulk-transaction` extensions will be enabled but be sure to double check this in your own deployment.\n", - "\n", - "
\n", - "Warning: Do not turn on the transaction or bulk transactions extensions for a public-facing STAC API without some kind of auth layer enabled! Enabling the transactions extensions enables users to POST collections or items to the database via stac-fastapi-pgstac.\n", - "
\n", - "\n", - "stac-fastapi-pgstac implements a pgstac client that is capable of serving the routes defined by stac-fastapi's base `StacApi` factory class ([source](https://github.com/stac-utils/stac-fastapi/blob/main/stac_fastapi/api/stac_fastapi/api/app.py)). The pgstac client's methods contain the logic for translating API requests into pgstac database queries.\n", - "\n", - "For example, a search request for items in the \"amazing\" collection where the item bounding box intersects (0, 0, 10, 10) would get converted to a PostgreSQL query like this pseudo-sql:\n", - "```sql\n", - "SELECT * FROM items\n", - "WHERE \n", - " collection = 'amazing' AND\n", - " ST_Intersects(bbox, ST_MakeEnvelope(0, 0, 10, 10));\n", - "```\n", - "stac-fastapi-pgstac transforms the search results into the format expected in the API response and return it to the user. If you want to see how the actual SQL queries look in `pgstac`, check out the [pgstac source code](https://github.com/stac-utils/pgstac/tree/main/src/pgstac/sql).\n", - "\n", - "### 3.1.1 Customization\n", - "There are several options in the default stac-fastapi-pgstac application that are configurable at run time via environment variables (using [pydantic's settings features](https://docs.pydantic.dev/latest/concepts/pydantic_settings/)):\n", - "- the `ENABLED_EXTENSIONS` environment variable controls which extensions are enabled\n", - "- `pgstac` database credentials are set by `POSTGRES_*` environment variables ([source](https://github.com/stac-utils/stac-fastapi-pgstac/blob/main/stac_fastapi/pgstac/config.py))\n", - "- take a look at [stac_fastapi/pgstac/config.py](https://github.com/stac-utils/stac-fastapi-pgstac/blob/main/stac_fastapi/pgstac/config.py) for the settings module.\n", - "\n", - "Any other modifications to the default application will require a custom runtime in your eoAPI deployment. If you do this you will need to provide the full custom runtime (application code and handler) via a Dockerfile. Check out [eoapi-devseed](https://github.com/developmentseed/eoapi-devseed) for an example of building custom runtimes for eoAPI services.\n", - "\n", - "### 3.1.2 Authentication\n", - "stac-fastapi-pgstac does not contain any authentication mechanism out-of-the-box, meaning your STAC API will be accessible to anyone if it is deployed to a public web address. If you want to make your STAC API accessible only with a username/password or token, check out the [FastAPI docs](https://fastapi.tiangolo.com/tutorial/security) for examples of how to add them to the application in a custom runtime.\n", - "\n", - "There is a new project called [stac-auth-proxy](https://github.com/developmentseed/stac-auth-proxy) that can provide fine-grained access controls to a STAC API by adding a proxy layer between users and the actual STAC API. In this workshop stack, the STAC API is exposed through stac-auth-proxy at `http://localhost:8084`.\n", - "\n", - "See [6. STAC Transactions with Authentication](06-stac_transactions_auth.ipynb) for a hands-on exercise with authenticated writes.\n", - "\n", - "### 3.1.3 STAC API interface\n", - "Once your STAC API is up and running, its capabilities will be described in the `/conformance` endpoint response:" - ], - "id": "c8ec4c5b-1156-4608-8ab9-b2cdcbcc47e1" - }, - { - "cell_type": "code", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "import json\n", - "import os\n", - "\n", - "import httpx\n", - "\n", - "stac_api_endpoint = os.getenv(\"STAC_API_ENDPOINT\")\n", - "\n", - "conformance_response = httpx.get(f\"{stac_api_endpoint}/conformance\").json()\n", - "\n", - "print(stac_api_endpoint)\n", - "print(json.dumps(conformance_response, indent=2))" - ], - "execution_count": null, - "outputs": [], - "id": "3d4e7fe4-c21b-45c8-a56c-9b649f9f4924" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is hard (for a human) to read, but these conformance classes help client applications (like `pystac-client` or STAC Browser) understand the API's capabilities. The list will change as you enable/disable various extensions or endpoints.\n", - "\n", - "
\n", - "Note: If you visit the urls listed in the conformance classes you may get a 404 - this is expected\n", - "
" - ], - "id": "94af52ad-87b1-461c-8d74-fc0158e488e5" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3.2 Collections\n", - "\n", - "The `/collections` endpoint is useful for finding collections in the catalog. To retrieve all collections in the catalog you can simply send a GET request to the `/collections` endpoint. This will return a paginated list (length of each page is set by the `limit` parameter) of all of the collections in the catalog." - ], - "id": "09e419d9-42e8-4b4b-9fdc-8d118bcc87c1" - }, - { - "cell_type": "code", - "metadata": { - "scrolled": true - }, - "source": [ - "collections_response = httpx.get(\n", - " f\"{stac_api_endpoint}/collections\", params={\"limit\": 2}\n", - ").json()\n", - "\n", - "print(json.dumps(collections_response, indent=2))" - ], - "execution_count": null, - "outputs": [], - "id": "ca0033ed-4898-4c21-8aa9-aaf79fc8d570" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.2.1 All Collections\n", - "You can retrieve all of a catalog's collection using the `get_all_collections` method from `pystac-client`:" - ], - "id": "ad74c861-7b4b-491e-9e17-82bcafd1cec4" - }, - { - "cell_type": "code", - "metadata": {}, - "source": [ - "import pystac_client\n", - "\n", - "client = pystac_client.Client.open(stac_api_endpoint)\n", - "\n", - "collections = list(client.get_all_collections())\n", - "for collection in collections:\n", - " print(collection.id)" - ], - "execution_count": null, - "outputs": [], - "id": "48664f4b-453d-47b8-9e3b-24a13c11cfcd" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.2.2 Collection Search Query\n", - "Some APIs contain many many collections so, if the `collection-search` extension is enabled, it can be helpful to apply filters using the available query parameters like:\n", - "- `q`: free-text search parameter\n", - "- `datetime`: temporal filters\n", - "- `bbox`: spatial filters\n", - "- `filter`: cql2-text filters\n", - "\n", - "To check if any STAC API has the `collection-search` extension enabled, you can look for it in the `/conformance` endpoint response." - ], - "id": "c066ffe0-5506-4268-be8b-26329b4e70fd" - }, - { - "cell_type": "code", - "metadata": { - "scrolled": true - }, - "source": [ - "for conformance_class in conformance_response[\"conformsTo\"]:\n", - " if \"collection-search\" in conformance_class:\n", - " print(conformance_class)" - ], - "execution_count": null, - "outputs": [], - "id": "6a463071-ade7-4baf-bba5-500a9304d145" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since the `collection-search` base conformance class is listed that means we can pass the `bbox` and `datetime` parameters to the `/collections` endpoint. Additional parameters are unlocked by the various extensions that are implemented alongside the `collection-search` extension. For example, you can also see `https://api.stacspec.org/v1.0.0-rc.1/collection-search#filter` which means we can use the `filter` parameter in requests to the `/collections` endpoint!\n", - "\n", - "
\n", - "stac-fastapi-pgstac ships with the `collection-search` extension paired with the `free-text` extension which enables simple text searches against the collection title, description, and keywords fields.\n", - "
\n", - "\n", - "For a nice view of the available query parameters for the `/collections` endpoint, check out the spiffy API documentation that the `stac-fastapi-pgstac` application generates using `FastAPI`." - ], - "id": "b03ff54f-0548-443c-86f0-1f064f3fe7cf" - }, - { - "cell_type": "code", - "metadata": {}, - "source": [ - "from IPython.display import IFrame\n", - "\n", - "local_stac_api_endpoint = os.getenv(\"STAC_API_BROWSER_URL\") or stac_api_endpoint.replace(\"stac-auth-proxy:8000\", \"localhost:8084\")\n", - "api_docs = (\n", - " f\"{local_stac_api_endpoint}/api.html#/default/Get_Collections_collections_get\"\n", - ")\n", - "print(api_docs)\n", - "\n", - "IFrame(\n", - " api_docs,\n", - " 1200,\n", - " 800,\n", - ")" - ], - "execution_count": null, - "outputs": [], - "id": "8201551a-b51d-4ee5-b238-4fd79547afe1" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Try applying the `filter` parameter to do a cql2-text query on the id field to find the collection you created in the `database` exercies.\n", - "\n", - "
\n", - "\n" - ], - "id": "5a9f5c87-ef5b-49d3-b6b8-e8fdca6cef1e" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you didn't run Part 2 on Databases, you can either go back to make a username or you can copy one from section 3.2.1 collection ids." - ], - "id": "fb94fe39-5091-41c1-8c2c-a227eb1b5c3c" - }, - { - "cell_type": "code", - "metadata": {}, - "source": [ - "import ipywidgets as widgets\n", - "from IPython.display import display\n", - "\n", - "# Prefill with the username of the most recent sentinel-2 collection in the\n", - "# catalog (created in notebook 02). If you picked your own username there,\n", - "# replace the value below - but keep in mind that notebook 02 generates a\n", - "# random default (e.g. \"quiet-surf-4719\"), so what you type here must match\n", - "# the collection id that actually exists in the catalog (see section 3.2.1).\n", - "_collections = (\n", - " httpx.get(f\"{stac_api_endpoint}/collections\", timeout=30)\n", - " .json()\n", - " .get(\"collections\", [])\n", - ")\n", - "_usernames = [\n", - " c[\"id\"].removesuffix(\"-sentinel-2-c1-l2a\")\n", - " for c in _collections\n", - " if c[\"id\"].endswith(\"-sentinel-2-c1-l2a\")\n", - "]\n", - "\n", - "username_input = widgets.Text(\n", - " value=_usernames[-1] if _usernames else None,\n", - " placeholder=\"Enter your username\",\n", - " description=\"username:\",\n", - " disabled=False,\n", - ")\n", - "\n", - "display(username_input)" - ], - "execution_count": null, - "outputs": [], - "id": "30844f03-1834-4e93-9494-a59abdc4f651" - }, - { - "cell_type": "code", - "metadata": {}, - "source": [ - "# using pystac-client\n", - "my_collection_search = client.collection_search(\n", - " filter=f\"id LIKE '%{username_input.value}%'\"\n", - ")\n", - "\n", - "results = my_collection_search.collection_list()\n", - "\n", - "if results:\n", - " my_collection = results[0]\n", - " display(my_collection)\n", - "else:\n", - " all_ids = [c.id for c in client.get_all_collections()]\n", - " print(\n", - " f\"No collections matched {username_input.value!r}. \"\n", - " f\"Collection ids in the catalog: {all_ids}\"\n", - " )" - ], - "execution_count": null, - "outputs": [], - "id": "8d9d740d-1e2d-45c4-8fcc-1c7cb31a19cc" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Note: If your collection did not appear, try adjusting your collection search terms!\n", - "
" - ], - "id": "1d7fe9b0-f05c-4e0b-a24a-e8040b9d09c4" + "cells": [ + { + "cell_type": "markdown", + "id": "7f4f9109-ac1f-473b-b30b-c35294ae426d", + "metadata": {}, + "source": [ + "# 3. The STAC API: stac-fastapi-pgstac\n", + "\n", + "The STAC API provided by eoAPI is [stac-fastapi-pgstac](https://github.com/stac-utils/stac-fastapi-pgstac): a stac-fastapi application with a pgstac backend.\n", + "stac-fastapi-pgstac translates STAC API requests into pgstac queries and returns the results to the requester.\n", + "\n", + "The stac-fastapi-pgstac STAC API can be accessed using any HTTP client but STAC API clients like `pystac-client` provide a more intuitive interface. In this tutorial you will learn how to use HTTP requests via `httpx` as well as `pystac-client` methods." + ] + }, + { + "cell_type": "markdown", + "id": "c8ec4c5b-1156-4608-8ab9-b2cdcbcc47e1", + "metadata": {}, + "source": [ + "## 3.1 stac-fastapi-pgstac structure\n", + "\n", + "A standard eoAPI deployment will run an unmodified version of the FastAPI application defined in `stac_fastapi.pgstac.app:app` ([source](https://github.com/stac-utils/stac-fastapi-pgstac/blob/main/stac_fastapi/pgstac/app.py)). Unless otherwise specified, all of the extensions except the `transaction` and `bulk-transaction` extensions will be enabled but be sure to double check this in your own deployment.\n", + "\n", + "
\n", + "Warning: Do not turn on the transaction or bulk transactions extensions for a public-facing STAC API without some kind of auth layer enabled! Enabling the transactions extensions enables users to POST collections or items to the database via stac-fastapi-pgstac.\n", + "
\n", + "\n", + "stac-fastapi-pgstac implements a pgstac client that is capable of serving the routes defined by stac-fastapi's base `StacApi` factory class ([source](https://github.com/stac-utils/stac-fastapi/blob/main/stac_fastapi/api/stac_fastapi/api/app.py)). The pgstac client's methods contain the logic for translating API requests into pgstac database queries.\n", + "\n", + "For example, a search request for items in the \"amazing\" collection where the item bounding box intersects (0, 0, 10, 10) would get converted to a PostgreSQL query like this pseudo-sql:\n", + "```sql\n", + "SELECT * FROM items\n", + "WHERE \n", + " collection = 'amazing' AND\n", + " ST_Intersects(bbox, ST_MakeEnvelope(0, 0, 10, 10));\n", + "```\n", + "stac-fastapi-pgstac transforms the search results into the format expected in the API response and return it to the user. If you want to see how the actual SQL queries look in `pgstac`, check out the [pgstac source code](https://github.com/stac-utils/pgstac/tree/main/src/pgstac/sql).\n", + "\n", + "### 3.1.1 Customization\n", + "There are several options in the default stac-fastapi-pgstac application that are configurable at run time via environment variables (using [pydantic's settings features](https://docs.pydantic.dev/latest/concepts/pydantic_settings/)):\n", + "- the `ENABLED_EXTENSIONS` environment variable controls which extensions are enabled\n", + "- `pgstac` database credentials are set by `POSTGRES_*` environment variables ([source](https://github.com/stac-utils/stac-fastapi-pgstac/blob/main/stac_fastapi/pgstac/config.py))\n", + "- take a look at [stac_fastapi/pgstac/config.py](https://github.com/stac-utils/stac-fastapi-pgstac/blob/main/stac_fastapi/pgstac/config.py) for the settings module.\n", + "\n", + "Any other modifications to the default application will require a custom runtime in your eoAPI deployment. If you do this you will need to provide the full custom runtime (application code and handler) via a Dockerfile. Check out [eoapi-devseed](https://github.com/developmentseed/eoapi-devseed) for an example of building custom runtimes for eoAPI services.\n", + "\n", + "### 3.1.2 Authentication\n", + "stac-fastapi-pgstac does not contain any authentication mechanism out-of-the-box, meaning your STAC API will be accessible to anyone if it is deployed to a public web address. If you want to make your STAC API accessible only with a username/password or token, check out the [FastAPI docs](https://fastapi.tiangolo.com/tutorial/security) for examples of how to add them to the application in a custom runtime.\n", + "\n", + "There is a new project called [stac-auth-proxy](https://github.com/developmentseed/stac-auth-proxy) that can provide fine-grained access controls to a STAC API by adding a proxy layer between users and the actual STAC API. In this workshop stack, the STAC API is exposed through stac-auth-proxy at `http://localhost:8084`.\n", + "\n", + "See [6. STAC Transactions with Authentication](06-stac_transactions_auth.ipynb) for a hands-on exercise with authenticated writes.\n", + "\n", + "### 3.1.3 STAC API interface\n", + "Once your STAC API is up and running, its capabilities will be described in the `/conformance` endpoint response:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "3d4e7fe4-c21b-45c8-a56c-9b649f9f4924", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" }, + "tags": [] + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "scrolled": true - }, - "source": [ - "# using http client\n", - "print(\n", - " json.dumps(\n", - " httpx.get(\n", - " f\"{stac_api_endpoint}/collections\",\n", - " params={\"filter\": f\"id LIKE '%{username_input.value}%'\"},\n", - " ).json(),\n", - " indent=2,\n", - " )\n", - ")" - ], - "execution_count": null, - "outputs": [], - "id": "5f75438e-cca6-4447-b9cb-f3349ae04c76" - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "http://stac-auth-proxy:8000\n", + "{\n", + " \"conformsTo\": [\n", + " \"http://www.opengis.net/spec/cql2/1.0/conf/basic-cql2\",\n", + " \"http://www.opengis.net/spec/cql2/1.0/conf/cql2-json\",\n", + " \"http://www.opengis.net/spec/cql2/1.0/conf/cql2-text\",\n", + " \"http://www.opengis.net/spec/ogcapi-common-2/1.0/conf/simple-query\",\n", + " \"http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/core\",\n", + " \"http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/geojson\",\n", + " \"http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/oas30\",\n", + " \"http://www.opengis.net/spec/ogcapi-features-3/1.0/conf/features-filter\",\n", + " \"http://www.opengis.net/spec/ogcapi-features-3/1.0/conf/filter\",\n", + " \"https://api.stacspec.org/v1.0.0-rc.1/collection-search\",\n", + " \"https://api.stacspec.org/v1.0.0-rc.1/collection-search#fields\",\n", + " \"https://api.stacspec.org/v1.0.0-rc.1/collection-search#filter\",\n", + " \"https://api.stacspec.org/v1.0.0-rc.1/collection-search#free-text\",\n", + " \"https://api.stacspec.org/v1.0.0-rc.1/collection-search#query\",\n", + " \"https://api.stacspec.org/v1.0.0-rc.1/collection-search#sort\",\n", + " \"https://api.stacspec.org/v1.0.0-rc.2/item-search#filter\",\n", + " \"https://api.stacspec.org/v1.0.0/collections\",\n", + " \"https://api.stacspec.org/v1.0.0/collections/extensions/transaction\",\n", + " \"https://api.stacspec.org/v1.0.0/core\",\n", + " \"https://api.stacspec.org/v1.0.0/item-search\",\n", + " \"https://api.stacspec.org/v1.0.0/item-search#fields\",\n", + " \"https://api.stacspec.org/v1.0.0/item-search#query\",\n", + " \"https://api.stacspec.org/v1.0.0/item-search#sort\",\n", + " \"https://api.stacspec.org/v1.0.0/ogcapi-features\",\n", + " \"https://api.stacspec.org/v1.0.0/ogcapi-features#fields\",\n", + " \"https://api.stacspec.org/v1.0.0/ogcapi-features#query\",\n", + " \"https://api.stacspec.org/v1.0.0/ogcapi-features#sort\",\n", + " \"https://api.stacspec.org/v1.0.0/ogcapi-features/extensions/transaction\"\n", + " ]\n", + "}\n" + ] + } + ], + "source": [ + "import json\n", + "import os\n", + "\n", + "import httpx\n", + "\n", + "stac_api_endpoint = os.getenv(\"STAC_API_ENDPOINT\")\n", + "\n", + "conformance_response = httpx.get(f\"{stac_api_endpoint}/conformance\").json()\n", + "\n", + "print(stac_api_endpoint)\n", + "print(json.dumps(conformance_response, indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "94af52ad-87b1-461c-8d74-fc0158e488e5", + "metadata": {}, + "source": [ + "The result is hard (for a human) to read, but these conformance classes help client applications (like `pystac-client` or STAC Browser) understand the API's capabilities. The list will change as you enable/disable various extensions or endpoints.\n", + "\n", + "
\n", + "Note: If you visit the urls listed in the conformance classes you may get a 404 - this is expected\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "09e419d9-42e8-4b4b-9fdc-8d118bcc87c1", + "metadata": {}, + "source": [ + "## 3.2 Collections\n", + "\n", + "The `/collections` endpoint is useful for finding collections in the catalog. To retrieve all collections in the catalog you can simply send a GET request to the `/collections` endpoint. This will return a paginated list (length of each page is set by the `limit` parameter) of all of the collections in the catalog." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "ca0033ed-4898-4c21-8aa9-aaf79fc8d570", + "metadata": { + "scrolled": true + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that you found your collection, you have what you need to do an effective item search within your collection! " - ], - "id": "7eae366c-977d-45af-bf19-275e67ee8058" - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"links\": [\n", + " {\n", + " \"rel\": \"next\",\n", + " \"type\": \"application/geo+json\",\n", + " \"method\": \"GET\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections?limit=2&offset=2\"\n", + " },\n", + " {\n", + " \"rel\": \"root\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/\"\n", + " },\n", + " {\n", + " \"rel\": \"self\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections?limit=2\"\n", + " }\n", + " ],\n", + " \"collections\": [\n", + " {\n", + " \"id\": \"dark-dream-2670-sentinel-2-c1-l2a\",\n", + " \"type\": \"Collection\",\n", + " \"links\": [\n", + " {\n", + " \"rel\": \"items\",\n", + " \"type\": \"application/geo+json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/dark-dream-2670-sentinel-2-c1-l2a/items\"\n", + " },\n", + " {\n", + " \"rel\": \"parent\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/\"\n", + " },\n", + " {\n", + " \"rel\": \"root\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/\"\n", + " },\n", + " {\n", + " \"rel\": \"self\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/dark-dream-2670-sentinel-2-c1-l2a\"\n", + " },\n", + " {\n", + " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/queryables\",\n", + " \"type\": \"application/schema+json\",\n", + " \"title\": \"Queryables\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/dark-dream-2670-sentinel-2-c1-l2a/queryables\"\n", + " }\n", + " ],\n", + " \"extent\": {\n", + " \"spatial\": {\n", + " \"bbox\": [\n", + " [\n", + " 133.72,\n", + " -35.17,\n", + " 137.72,\n", + " -31.17\n", + " ]\n", + " ]\n", + " },\n", + " \"temporal\": {\n", + " \"interval\": [\n", + " [\n", + " \"2025-01-01T00:00:00Z\",\n", + " \"2025-04-18T00:00:00Z\"\n", + " ]\n", + " ]\n", + " }\n", + " },\n", + " \"license\": \"other\",\n", + " \"description\": \"dark-dream-2670's personal Sentinel-2 L2A collection\",\n", + " \"stac_version\": \"1.1.0\"\n", + " },\n", + " {\n", + " \"id\": \"glad-global-forest-change-1.11\",\n", + " \"type\": \"Collection\",\n", + " \"links\": [\n", + " {\n", + " \"rel\": \"items\",\n", + " \"type\": \"application/geo+json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/glad-global-forest-change-1.11/items\"\n", + " },\n", + " {\n", + " \"rel\": \"parent\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/\"\n", + " },\n", + " {\n", + " \"rel\": \"root\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/\"\n", + " },\n", + " {\n", + " \"rel\": \"self\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/glad-global-forest-change-1.11\"\n", + " },\n", + " {\n", + " \"rel\": \"license\",\n", + " \"href\": \"https://creativecommons.org/licenses/by/4.0/\",\n", + " \"type\": \"text/html\",\n", + " \"title\": \"CC-BY-4.0 license\"\n", + " },\n", + " {\n", + " \"rel\": \"cite-as\",\n", + " \"href\": \"https://doi.org/10.1126/science.1244693\"\n", + " },\n", + " {\n", + " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/queryables\",\n", + " \"href\": \"https://stac.maap-project.org/collections/glad-global-forest-change-1.11/queryables\",\n", + " \"type\": \"application/schema+json\",\n", + " \"title\": \"Queryables\"\n", + " },\n", + " {\n", + " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/queryables\",\n", + " \"href\": \"https://stac.maap-project.org/collections/glad-global-forest-change-1.11/queryables\",\n", + " \"type\": \"application/schema+json\",\n", + " \"title\": \"Queryables\"\n", + " },\n", + " {\n", + " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/queryables\",\n", + " \"href\": \"https://stac.maap-project.org/collections/glad-global-forest-change-1.11/queryables\",\n", + " \"type\": \"application/schema+json\",\n", + " \"title\": \"Queryables\"\n", + " },\n", + " {\n", + " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/queryables\",\n", + " \"href\": \"https://stac.maap-project.org/collections/glad-global-forest-change-1.11/queryables\",\n", + " \"type\": \"application/schema+json\",\n", + " \"title\": \"Queryables\"\n", + " },\n", + " {\n", + " \"rel\": \"tilejson\",\n", + " \"href\": \"https://titiler-pgstac.maap-project.org/collections/glad-global-forest-change-1.11/WebMercatorQuad/tilejson.json?colormap=%7B%220%22%3A+%5B0%2C+0%2C+0%5D%2C+%221%22%3A+%5B255%2C+255%2C+0%5D%2C+%222%22%3A+%5B255%2C+243%2C+0%5D%2C+%223%22%3A+%5B255%2C+230%2C+0%5D%2C+%224%22%3A+%5B255%2C+217%2C+0%5D%2C+%225%22%3A+%5B255%2C+204%2C+0%5D%2C+%226%22%3A+%5B255%2C+192%2C+0%5D%2C+%227%22%3A+%5B255%2C+179%2C+0%5D%2C+%228%22%3A+%5B255%2C+166%2C+0%5D%2C+%229%22%3A+%5B255%2C+153%2C+0%5D%2C+%2210%22%3A+%5B255%2C+140%2C+0%5D%2C+%2211%22%3A+%5B255%2C+128%2C+0%5D%2C+%2212%22%3A+%5B255%2C+116%2C+0%5D%2C+%2213%22%3A+%5B255%2C+105%2C+0%5D%2C+%2214%22%3A+%5B255%2C+93%2C+0%5D%2C+%2215%22%3A+%5B255%2C+81%2C+0%5D%2C+%2216%22%3A+%5B255%2C+70%2C+0%5D%2C+%2217%22%3A+%5B255%2C+58%2C+0%5D%2C+%2218%22%3A+%5B255%2C+46%2C+0%5D%2C+%2219%22%3A+%5B255%2C+35%2C+0%5D%2C+%2220%22%3A+%5B255%2C+23%2C+0%5D%2C+%2221%22%3A+%5B255%2C+12%2C+0%5D%2C+%2222%22%3A+%5B255%2C+0%2C+0%5D%2C+%2223%22%3A+%5B0%2C+255%2C+255%5D%7D&assets=lossyear\",\n", + " \"title\": \"TileJSON link for lossyear visualization\"\n", + " },\n", + " {\n", + " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/queryables\",\n", + " \"href\": \"https://stac.maap-project.org/collections/glad-global-forest-change-1.11/queryables\",\n", + " \"type\": \"application/schema+json\",\n", + " \"title\": \"Queryables\"\n", + " },\n", + " {\n", + " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/queryables\",\n", + " \"type\": \"application/schema+json\",\n", + " \"title\": \"Queryables\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/glad-global-forest-change-1.11/queryables\"\n", + " }\n", + " ],\n", + " \"title\": \"GLAD: Global Forest Change 2000-2023 v1.11\",\n", + " \"extent\": {\n", + " \"spatial\": {\n", + " \"bbox\": [\n", + " [\n", + " -180.0,\n", + " -90.0,\n", + " 180.0,\n", + " 90.0\n", + " ]\n", + " ]\n", + " },\n", + " \"temporal\": {\n", + " \"interval\": [\n", + " [\n", + " \"2000-01-01T00:00:00Z\",\n", + " \"2023-12-31T23:59:59Z\"\n", + " ]\n", + " ]\n", + " }\n", + " },\n", + " \"license\": \"CC-BY-4.0\",\n", + " \"renders\": {\n", + " \"gain\": {\n", + " \"assets\": [\n", + " \"gain\"\n", + " ],\n", + " \"colormap\": {\n", + " \"0\": [\n", + " 0,\n", + " 0,\n", + " 0\n", + " ],\n", + " \"1\": [\n", + " 0,\n", + " 0,\n", + " 255\n", + " ]\n", + " }\n", + " },\n", + " \"lossyear\": {\n", + " \"assets\": [\n", + " \"lossyear\"\n", + " ],\n", + " \"colormap\": {\n", + " \"0\": [\n", + " 0,\n", + " 0,\n", + " 0\n", + " ],\n", + " \"1\": [\n", + " 255,\n", + " 255,\n", + " 0\n", + " ],\n", + " \"2\": [\n", + " 255,\n", + " 243,\n", + " 0\n", + " ],\n", + " \"3\": [\n", + " 255,\n", + " 230,\n", + " 0\n", + " ],\n", + " \"4\": [\n", + " 255,\n", + " 217,\n", + " 0\n", + " ],\n", + " \"5\": [\n", + " 255,\n", + " 204,\n", + " 0\n", + " ],\n", + " \"6\": [\n", + " 255,\n", + " 192,\n", + " 0\n", + " ],\n", + " \"7\": [\n", + " 255,\n", + " 179,\n", + " 0\n", + " ],\n", + " \"8\": [\n", + " 255,\n", + " 166,\n", + " 0\n", + " ],\n", + " \"9\": [\n", + " 255,\n", + " 153,\n", + " 0\n", + " ],\n", + " \"10\": [\n", + " 255,\n", + " 140,\n", + " 0\n", + " ],\n", + " \"11\": [\n", + " 255,\n", + " 128,\n", + " 0\n", + " ],\n", + " \"12\": [\n", + " 255,\n", + " 116,\n", + " 0\n", + " ],\n", + " \"13\": [\n", + " 255,\n", + " 105,\n", + " 0\n", + " ],\n", + " \"14\": [\n", + " 255,\n", + " 93,\n", + " 0\n", + " ],\n", + " \"15\": [\n", + " 255,\n", + " 81,\n", + " 0\n", + " ],\n", + " \"16\": [\n", + " 255,\n", + " 70,\n", + " 0\n", + " ],\n", + " \"17\": [\n", + " 255,\n", + " 58,\n", + " 0\n", + " ],\n", + " \"18\": [\n", + " 255,\n", + " 46,\n", + " 0\n", + " ],\n", + " \"19\": [\n", + " 255,\n", + " 35,\n", + " 0\n", + " ],\n", + " \"20\": [\n", + " 255,\n", + " 23,\n", + " 0\n", + " ],\n", + " \"21\": [\n", + " 255,\n", + " 12,\n", + " 0\n", + " ],\n", + " \"22\": [\n", + " 255,\n", + " 0,\n", + " 0\n", + " ],\n", + " \"23\": [\n", + " 0,\n", + " 255,\n", + " 255\n", + " ]\n", + " }\n", + " },\n", + " \"treecover2000\": {\n", + " \"assets\": [\n", + " \"treecover2000\"\n", + " ],\n", + " \"colormap\": {\n", + " \"0\": [\n", + " 0,\n", + " 0,\n", + " 0\n", + " ],\n", + " \"1\": [\n", + " 0,\n", + " 2,\n", + " 0\n", + " ],\n", + " \"2\": [\n", + " 0,\n", + " 5,\n", + " 0\n", + " ],\n", + " \"3\": [\n", + " 0,\n", + " 7,\n", + " 0\n", + " ],\n", + " \"4\": [\n", + " 0,\n", + " 10,\n", + " 0\n", + " ],\n", + " \"5\": [\n", + " 0,\n", + " 12,\n", + " 0\n", + " ],\n", + " \"6\": [\n", + " 0,\n", + " 15,\n", + " 0\n", + " ],\n", + " \"7\": [\n", + " 0,\n", + " 17,\n", + " 0\n", + " ],\n", + " \"8\": [\n", + " 0,\n", + " 20,\n", + " 0\n", + " ],\n", + " \"9\": [\n", + " 0,\n", + " 22,\n", + " 0\n", + " ],\n", + " \"10\": [\n", + " 0,\n", + " 25,\n", + " 0\n", + " ],\n", + " \"11\": [\n", + " 0,\n", + " 28,\n", + " 0\n", + " ],\n", + " \"12\": [\n", + " 0,\n", + " 30,\n", + " 0\n", + " ],\n", + " \"13\": [\n", + " 0,\n", + " 33,\n", + " 0\n", + " ],\n", + " \"14\": [\n", + " 0,\n", + " 35,\n", + " 0\n", + " ],\n", + " \"15\": [\n", + " 0,\n", + " 38,\n", + " 0\n", + " ],\n", + " \"16\": [\n", + " 0,\n", + " 40,\n", + " 0\n", + " ],\n", + " \"17\": [\n", + " 0,\n", + " 43,\n", + " 0\n", + " ],\n", + " \"18\": [\n", + " 0,\n", + " 45,\n", + " 0\n", + " ],\n", + " \"19\": [\n", + " 0,\n", + " 48,\n", + " 0\n", + " ],\n", + " \"20\": [\n", + " 0,\n", + " 51,\n", + " 0\n", + " ],\n", + " \"21\": [\n", + " 0,\n", + " 53,\n", + " 0\n", + " ],\n", + " \"22\": [\n", + " 0,\n", + " 56,\n", + " 0\n", + " ],\n", + " \"23\": [\n", + " 0,\n", + " 58,\n", + " 0\n", + " ],\n", + " \"24\": [\n", + " 0,\n", + " 61,\n", + " 0\n", + " ],\n", + " \"25\": [\n", + " 0,\n", + " 63,\n", + " 0\n", + " ],\n", + " \"26\": [\n", + " 0,\n", + " 66,\n", + " 0\n", + " ],\n", + " \"27\": [\n", + " 0,\n", + " 68,\n", + " 0\n", + " ],\n", + " \"28\": [\n", + " 0,\n", + " 71,\n", + " 0\n", + " ],\n", + " \"29\": [\n", + " 0,\n", + " 73,\n", + " 0\n", + " ],\n", + " \"30\": [\n", + " 0,\n", + " 76,\n", + " 0\n", + " ],\n", + " \"31\": [\n", + " 0,\n", + " 79,\n", + " 0\n", + " ],\n", + " \"32\": [\n", + " 0,\n", + " 81,\n", + " 0\n", + " ],\n", + " \"33\": [\n", + " 0,\n", + " 84,\n", + " 0\n", + " ],\n", + " \"34\": [\n", + " 0,\n", + " 86,\n", + " 0\n", + " ],\n", + " \"35\": [\n", + " 0,\n", + " 89,\n", + " 0\n", + " ],\n", + " \"36\": [\n", + " 0,\n", + " 91,\n", + " 0\n", + " ],\n", + " \"37\": [\n", + " 0,\n", + " 94,\n", + " 0\n", + " ],\n", + " \"38\": [\n", + " 0,\n", + " 96,\n", + " 0\n", + " ],\n", + " \"39\": [\n", + " 0,\n", + " 99,\n", + " 0\n", + " ],\n", + " \"40\": [\n", + " 0,\n", + " 102,\n", + " 0\n", + " ],\n", + " \"41\": [\n", + " 0,\n", + " 104,\n", + " 0\n", + " ],\n", + " \"42\": [\n", + " 0,\n", + " 107,\n", + " 0\n", + " ],\n", + " \"43\": [\n", + " 0,\n", + " 109,\n", + " 0\n", + " ],\n", + " \"44\": [\n", + " 0,\n", + " 112,\n", + " 0\n", + " ],\n", + " \"45\": [\n", + " 0,\n", + " 114,\n", + " 0\n", + " ],\n", + " \"46\": [\n", + " 0,\n", + " 117,\n", + " 0\n", + " ],\n", + " \"47\": [\n", + " 0,\n", + " 119,\n", + " 0\n", + " ],\n", + " \"48\": [\n", + " 0,\n", + " 122,\n", + " 0\n", + " ],\n", + " \"49\": [\n", + " 0,\n", + " 124,\n", + " 0\n", + " ],\n", + " \"50\": [\n", + " 0,\n", + " 127,\n", + " 0\n", + " ],\n", + " \"51\": [\n", + " 0,\n", + " 130,\n", + " 0\n", + " ],\n", + " \"52\": [\n", + " 0,\n", + " 132,\n", + " 0\n", + " ],\n", + " \"53\": [\n", + " 0,\n", + " 135,\n", + " 0\n", + " ],\n", + " \"54\": [\n", + " 0,\n", + " 137,\n", + " 0\n", + " ],\n", + " \"55\": [\n", + " 0,\n", + " 140,\n", + " 0\n", + " ],\n", + " \"56\": [\n", + " 0,\n", + " 142,\n", + " 0\n", + " ],\n", + " \"57\": [\n", + " 0,\n", + " 145,\n", + " 0\n", + " ],\n", + " \"58\": [\n", + " 0,\n", + " 147,\n", + " 0\n", + " ],\n", + " \"59\": [\n", + " 0,\n", + " 150,\n", + " 0\n", + " ],\n", + " \"60\": [\n", + " 0,\n", + " 153,\n", + " 0\n", + " ],\n", + " \"61\": [\n", + " 0,\n", + " 155,\n", + " 0\n", + " ],\n", + " \"62\": [\n", + " 0,\n", + " 158,\n", + " 0\n", + " ],\n", + " \"63\": [\n", + " 0,\n", + " 160,\n", + " 0\n", + " ],\n", + " \"64\": [\n", + " 0,\n", + " 163,\n", + " 0\n", + " ],\n", + " \"65\": [\n", + " 0,\n", + " 165,\n", + " 0\n", + " ],\n", + " \"66\": [\n", + " 0,\n", + " 168,\n", + " 0\n", + " ],\n", + " \"67\": [\n", + " 0,\n", + " 170,\n", + " 0\n", + " ],\n", + " \"68\": [\n", + " 0,\n", + " 173,\n", + " 0\n", + " ],\n", + " \"69\": [\n", + " 0,\n", + " 175,\n", + " 0\n", + " ],\n", + " \"70\": [\n", + " 0,\n", + " 178,\n", + " 0\n", + " ],\n", + " \"71\": [\n", + " 0,\n", + " 181,\n", + " 0\n", + " ],\n", + " \"72\": [\n", + " 0,\n", + " 183,\n", + " 0\n", + " ],\n", + " \"73\": [\n", + " 0,\n", + " 186,\n", + " 0\n", + " ],\n", + " \"74\": [\n", + " 0,\n", + " 188,\n", + " 0\n", + " ],\n", + " \"75\": [\n", + " 0,\n", + " 191,\n", + " 0\n", + " ],\n", + " \"76\": [\n", + " 0,\n", + " 193,\n", + " 0\n", + " ],\n", + " \"77\": [\n", + " 0,\n", + " 196,\n", + " 0\n", + " ],\n", + " \"78\": [\n", + " 0,\n", + " 198,\n", + " 0\n", + " ],\n", + " \"79\": [\n", + " 0,\n", + " 201,\n", + " 0\n", + " ],\n", + " \"80\": [\n", + " 0,\n", + " 204,\n", + " 0\n", + " ],\n", + " \"81\": [\n", + " 0,\n", + " 206,\n", + " 0\n", + " ],\n", + " \"82\": [\n", + " 0,\n", + " 209,\n", + " 0\n", + " ],\n", + " \"83\": [\n", + " 0,\n", + " 211,\n", + " 0\n", + " ],\n", + " \"84\": [\n", + " 0,\n", + " 214,\n", + " 0\n", + " ],\n", + " \"85\": [\n", + " 0,\n", + " 216,\n", + " 0\n", + " ],\n", + " \"86\": [\n", + " 0,\n", + " 219,\n", + " 0\n", + " ],\n", + " \"87\": [\n", + " 0,\n", + " 221,\n", + " 0\n", + " ],\n", + " \"88\": [\n", + " 0,\n", + " 224,\n", + " 0\n", + " ],\n", + " \"89\": [\n", + " 0,\n", + " 226,\n", + " 0\n", + " ],\n", + " \"90\": [\n", + " 0,\n", + " 229,\n", + " 0\n", + " ],\n", + " \"91\": [\n", + " 0,\n", + " 232,\n", + " 0\n", + " ],\n", + " \"92\": [\n", + " 0,\n", + " 234,\n", + " 0\n", + " ],\n", + " \"93\": [\n", + " 0,\n", + " 237,\n", + " 0\n", + " ],\n", + " \"94\": [\n", + " 0,\n", + " 239,\n", + " 0\n", + " ],\n", + " \"95\": [\n", + " 0,\n", + " 242,\n", + " 0\n", + " ],\n", + " \"96\": [\n", + " 0,\n", + " 244,\n", + " 0\n", + " ],\n", + " \"97\": [\n", + " 0,\n", + " 247,\n", + " 0\n", + " ],\n", + " \"98\": [\n", + " 0,\n", + " 249,\n", + " 0\n", + " ],\n", + " \"99\": [\n", + " 0,\n", + " 252,\n", + " 0\n", + " ],\n", + " \"100\": [\n", + " 0,\n", + " 255,\n", + " 0\n", + " ]\n", + " }\n", + " }\n", + " },\n", + " \"version\": \"1.11\",\n", + " \"keywords\": [\n", + " \"forest\",\n", + " \"change\",\n", + " \"deforestation\"\n", + " ],\n", + " \"providers\": [\n", + " {\n", + " \"url\": \"https://glad.umd.edu/\",\n", + " \"name\": \"UMD/GLAD\",\n", + " \"roles\": [\n", + " \"producer\",\n", + " \"processor\",\n", + " \"licensor\"\n", + " ],\n", + " \"description\": \"University of Maryland Global Land Analysis & Discovery laboratory (GLAD)\"\n", + " },\n", + " {\n", + " \"url\": \"https://maap-project.org\",\n", + " \"name\": \"NASA/MAAP\",\n", + " \"roles\": [\n", + " \"processor\",\n", + " \"host\"\n", + " ],\n", + " \"description\": \"The ESA-NASA Multi-Mission Algorithm and Analysis Platform\"\n", + " }\n", + " ],\n", + " \"description\": \"Results from time-series analysis of Landsat images in characterizing global forest extent and change from 2000 through 2023. For additional information about these results, please see the associated journal article (Hansen et al., Science 2013).\\n\\nWeb-based visualizations of these results are also available at our main site:\\n\\n> https://glad.earthengine.app/view/global-forest-change\\n\\nPlease use that URL when linking to this dataset.\\n\\nWe anticipate releasing updated versions of this dataset. To keep up to date with the latest updates, and to help us better understand how these data are used, please [register as a user](https://docs.google.com/a/google.com/forms/d/1AkAUb4kfF7pUTOADPGEW7Do2oRhdDUPYb2mzIr8OIx4/viewform) . Thanks! \",\n", + " \"item_assets\": {\n", + " \"gain\": {\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\"\n", + " ],\n", + " \"title\": \"Global forest cover gain 2000-2012\",\n", + " \"description\": \"Forest gain during the period 2000-2012, defined as the inverse of loss, or a non-forest to forest change entirely within the study period. Encoded as either 1 (gain) or 0 (no gain).\",\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 1.0,\n", + " \"offset\": 0.0,\n", + " \"sampling\": \"area\",\n", + " \"data_type\": \"uint8\"\n", + " }\n", + " ],\n", + " \"classification:classes\": [\n", + " {\n", + " \"name\": \"no-gain\",\n", + " \"value\": 0,\n", + " \"color_hint\": \"000000\",\n", + " \"description\": \"no forest gain between 2000 and 2012\"\n", + " },\n", + " {\n", + " \"name\": \"gain\",\n", + " \"value\": 1,\n", + " \"color_hint\": \"0000ff\",\n", + " \"description\": \"forest loss between 2000 and 2023\"\n", + " }\n", + " ]\n", + " },\n", + " \"datamask\": {\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\"\n", + " ],\n", + " \"title\": \"Data mask\",\n", + " \"description\": \"Three values representing areas of no data (0), mapped land surface (1), and persistent water bodies (2) based on 2000-2012.\",\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 1.0,\n", + " \"offset\": 0.0,\n", + " \"sampling\": \"area\",\n", + " \"data_type\": \"uint8\"\n", + " }\n", + " ],\n", + " \"classification:classes\": [\n", + " {\n", + " \"name\": \"nodata\",\n", + " \"value\": 0,\n", + " \"nodata\": true,\n", + " \"description\": \"no data\"\n", + " },\n", + " {\n", + " \"name\": \"maaped-land-surface\",\n", + " \"value\": 1,\n", + " \"description\": \"mapped land survace\"\n", + " },\n", + " {\n", + " \"name\": \"persistent-water-bodies\",\n", + " \"value\": 2,\n", + " \"description\": \"persistent water bodies\"\n", + " }\n", + " ]\n", + " },\n", + " \"lossyear\": {\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\"\n", + " ],\n", + " \"title\": \"Year of gross forest cover loss event\",\n", + " \"description\": \"Forest loss during the period 2000-2023, defined as a stand-replacement disturbance, or a change from a forest to non-forest state. Encoded as either 0 (no loss) or else a value in the range 1-20, representing loss detected primarily in the year 2001-2023, respectively.\",\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 1.0,\n", + " \"offset\": 0.0,\n", + " \"sampling\": \"area\",\n", + " \"data_type\": \"uint8\"\n", + " }\n", + " ],\n", + " \"classification:classes\": [\n", + " {\n", + " \"name\": \"no-loss\",\n", + " \"value\": 0,\n", + " \"description\": \"no loss\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2001\",\n", + " \"value\": 1,\n", + " \"color_hint\": \"ffff00\",\n", + " \"description\": \"forest lost in 2001\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2002\",\n", + " \"value\": 2,\n", + " \"color_hint\": \"fff300\",\n", + " \"description\": \"forest lost in 2002\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2003\",\n", + " \"value\": 3,\n", + " \"color_hint\": \"ffe600\",\n", + " \"description\": \"forest lost in 2003\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2004\",\n", + " \"value\": 4,\n", + " \"color_hint\": \"ffd900\",\n", + " \"description\": \"forest lost in 2004\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2005\",\n", + " \"value\": 5,\n", + " \"color_hint\": \"ffcc00\",\n", + " \"description\": \"forest lost in 2005\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2006\",\n", + " \"value\": 6,\n", + " \"color_hint\": \"ffc000\",\n", + " \"description\": \"forest lost in 2006\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2007\",\n", + " \"value\": 7,\n", + " \"color_hint\": \"ffb300\",\n", + " \"description\": \"forest lost in 2007\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2008\",\n", + " \"value\": 8,\n", + " \"color_hint\": \"ffa600\",\n", + " \"description\": \"forest lost in 2008\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2009\",\n", + " \"value\": 9,\n", + " \"color_hint\": \"ff9900\",\n", + " \"description\": \"forest lost in 2009\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2010\",\n", + " \"value\": 10,\n", + " \"color_hint\": \"ff8c00\",\n", + " \"description\": \"forest lost in 2010\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2011\",\n", + " \"value\": 11,\n", + " \"color_hint\": \"ff8000\",\n", + " \"description\": \"forest lost in 2011\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2012\",\n", + " \"value\": 12,\n", + " \"color_hint\": \"ff7400\",\n", + " \"description\": \"forest lost in 2012\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2013\",\n", + " \"value\": 13,\n", + " \"color_hint\": \"ff6900\",\n", + " \"description\": \"forest lost in 2013\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2014\",\n", + " \"value\": 14,\n", + " \"color_hint\": \"ff5d00\",\n", + " \"description\": \"forest lost in 2014\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2015\",\n", + " \"value\": 15,\n", + " \"color_hint\": \"ff5100\",\n", + " \"description\": \"forest lost in 2015\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2016\",\n", + " \"value\": 16,\n", + " \"color_hint\": \"ff4600\",\n", + " \"description\": \"forest lost in 2016\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2017\",\n", + " \"value\": 17,\n", + " \"color_hint\": \"ff3a00\",\n", + " \"description\": \"forest lost in 2017\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2018\",\n", + " \"value\": 18,\n", + " \"color_hint\": \"ff2e00\",\n", + " \"description\": \"forest lost in 2018\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2019\",\n", + " \"value\": 19,\n", + " \"color_hint\": \"ff2300\",\n", + " \"description\": \"forest lost in 2019\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2020\",\n", + " \"value\": 20,\n", + " \"color_hint\": \"ff1700\",\n", + " \"description\": \"forest lost in 2020\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2021\",\n", + " \"value\": 21,\n", + " \"color_hint\": \"ff0c00\",\n", + " \"description\": \"forest lost in 2021\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2022\",\n", + " \"value\": 22,\n", + " \"color_hint\": \"ff0000\",\n", + " \"description\": \"forest lost in 2022\"\n", + " },\n", + " {\n", + " \"name\": \"forest-lost-2023\",\n", + " \"value\": 23,\n", + " \"color_hint\": \"00ffff\",\n", + " \"description\": \"forest lost in 2023\"\n", + " }\n", + " ]\n", + " },\n", + " \"treecover2000\": {\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\"\n", + " ],\n", + " \"title\": \"Tree canopy cover for year 2000\",\n", + " \"description\": \"Tree cover in the year 2000, defined as canopy closure for all vegetation taller than 5m in height. Encoded as a percentage per output grid cell, in the range 0-100.\",\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 1.0,\n", + " \"offset\": 0.0,\n", + " \"sampling\": \"area\",\n", + " \"data_type\": \"uint8\"\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " \"stac_version\": \"1.1.0\",\n", + " \"stac_extensions\": [\n", + " \"https://stac-extensions.github.io/version/v1.2.0/schema.json\",\n", + " \"https://stac-extensions.github.io/scientific/v1.0.0/schema.json\",\n", + " \"https://stac-extensions.github.io/raster/v1.1.0/schema.json\",\n", + " \"https://stac-extensions.github.io/render/v2.0.0/schema.json\",\n", + " \"https://stac-extensions.github.io/web-map-links/v1.3.0/schema.json\"\n", + " ],\n", + " \"sci:publications\": [\n", + " {\n", + " \"doi\": \"10.1126/science.1244693\",\n", + " \"citation\": \"Hansen, M. C., P. V. Potapov, R. Moore, M. Hancher, S. A. Turubanova, A. Tyukavina, D. Thau, S. V. Stehman, S. J. Goetz, T. R. Loveland, A. Kommareddy, A. Egorov, L. Chini, C. O. Justice, and J. R. G. Townshend. 2013. High-Resolution Global Maps of 21st-Century Forest Cover Change. Science 342 (15 November): 850-53. Data available on-line from: https://glad.earthengine.app/view/global-forest-change.\"\n", + " }\n", + " ]\n", + " }\n", + " ],\n", + " \"numberMatched\": 4,\n", + " \"numberReturned\": 2,\n", + " \"stac_extensions\": [\n", + " \"https://stac-extensions.github.io/authentication/v1.1.0/schema.json\"\n", + " ],\n", + " \"auth:schemes\": {\n", + " \"oidc\": {\n", + " \"type\": \"openIdConnect\",\n", + " \"openIdConnectUrl\": \"http://localhost:8085/.well-known/openid-configuration\"\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "collections_response = httpx.get(\n", + " f\"{stac_api_endpoint}/collections\", params={\"limit\": 2}\n", + ").json()\n", + "\n", + "print(json.dumps(collections_response, indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "ad74c861-7b4b-491e-9e17-82bcafd1cec4", + "metadata": {}, + "source": [ + "### 3.2.1 All Collections\n", + "You can retrieve all of a catalog's collection using the `get_all_collections` method from `pystac-client`:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "48664f4b-453d-47b8-9e3b-24a13c11cfcd", + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3.3 Items\n", - "\n", - "Once you have the collection ID there are several ways to perform an effective item search:\n", - "- GET request to `/collections/{collection_id}/items`\n", - "- GET or POST request to `/search`\n", - "\n", - "There are not any particular advantages to either approach unless you want to search for items using an intersection with a geometry in which case you should use a POST request to `/search` with the `intersects` parameter in the request body (instead of url-encoding a geojson!).\n", - "\n", - "Item search request responses will be returned in pages with `{limit}` results. If your search returns more than a single page of results, the next page will be retrievable via the `next` link in the list of `links`." - ], - "id": "56657240-5905-4ddf-a76a-afd2a28959b0" - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "dark-dream-2670-sentinel-2-c1-l2a\n", + "glad-global-forest-change-1.11\n", + "quiet-surf-4719-sentinel-2-c1-l2a\n", + "super-mouse-3144-sentinel-2-c1-l2a\n" + ] + } + ], + "source": [ + "import pystac_client\n", + "\n", + "client = pystac_client.Client.open(stac_api_endpoint)\n", + "\n", + "collections = list(client.get_all_collections())\n", + "for collection in collections:\n", + " print(collection.id)" + ] + }, + { + "cell_type": "markdown", + "id": "c066ffe0-5506-4268-be8b-26329b4e70fd", + "metadata": {}, + "source": [ + "### 3.2.2 Collection Search Query\n", + "Some APIs contain many many collections so, if the `collection-search` extension is enabled, it can be helpful to apply filters using the available query parameters like:\n", + "- `q`: free-text search parameter\n", + "- `datetime`: temporal filters\n", + "- `bbox`: spatial filters\n", + "- `filter`: cql2-text filters\n", + "\n", + "To check if any STAC API has the `collection-search` extension enabled, you can look for it in the `/conformance` endpoint response." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6a463071-ade7-4baf-bba5-500a9304d145", + "metadata": { + "scrolled": true + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.3.1 Item Search\n", - "\n", - "Use the `/search` endpoint to find all items in your collection with a timestamp after April 4, 2025" - ], - "id": "74d1fb0b-e830-4fb0-8619-f9cfd3019111" - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "https://api.stacspec.org/v1.0.0-rc.1/collection-search\n", + "https://api.stacspec.org/v1.0.0-rc.1/collection-search#fields\n", + "https://api.stacspec.org/v1.0.0-rc.1/collection-search#filter\n", + "https://api.stacspec.org/v1.0.0-rc.1/collection-search#free-text\n", + "https://api.stacspec.org/v1.0.0-rc.1/collection-search#query\n", + "https://api.stacspec.org/v1.0.0-rc.1/collection-search#sort\n" + ] + } + ], + "source": [ + "for conformance_class in conformance_response[\"conformsTo\"]:\n", + " if \"collection-search\" in conformance_class:\n", + " print(conformance_class)" + ] + }, + { + "cell_type": "markdown", + "id": "b03ff54f-0548-443c-86f0-1f064f3fe7cf", + "metadata": {}, + "source": [ + "Since the `collection-search` base conformance class is listed that means we can pass the `bbox` and `datetime` parameters to the `/collections` endpoint. Additional parameters are unlocked by the various extensions that are implemented alongside the `collection-search` extension. For example, you can also see `https://api.stacspec.org/v1.0.0-rc.1/collection-search#filter` which means we can use the `filter` parameter in requests to the `/collections` endpoint!\n", + "\n", + "
\n", + "stac-fastapi-pgstac ships with the `collection-search` extension paired with the `free-text` extension which enables simple text searches against the collection title, description, and keywords fields.\n", + "
\n", + "\n", + "For a nice view of the available query parameters for the `/collections` endpoint, check out the spiffy API documentation that the `stac-fastapi-pgstac` application generates using `FastAPI`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "8201551a-b51d-4ee5-b238-4fd79547afe1", + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "metadata": {}, - "source": [ - "from datetime import datetime, UTC\n", - "\n", - "search = client.search(\n", - " collections=[my_collection.id],\n", - " datetime=[datetime(2025, 1, 4), None],\n", - ")\n", - "\n", - "items = search.item_collection()\n", - "\n", - "print(f\"found {len(items)} items\")\n", - "items[0]" - ], - "execution_count": null, - "outputs": [], - "id": "e73a9ef7-d8f8-407d-965e-c549f112899c" + "name": "stdout", + "output_type": "stream", + "text": [ + "http://localhost:8084/api.html#/default/Get_Collections_collections_get\n" + ] }, { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The same query can be made with an HTTP client:" + "data": { + "text/html": [ + "\n", + " \n", + " " ], - "id": "3e504a62-0c1e-4f00-aa54-e286252c493b" - }, + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import IFrame\n", + "\n", + "local_stac_api_endpoint = os.getenv(\n", + " \"STAC_API_BROWSER_URL\"\n", + ") or stac_api_endpoint.replace(\"stac-auth-proxy:8000\", \"localhost:8084\")\n", + "api_docs = (\n", + " f\"{local_stac_api_endpoint}/api.html#/default/Get_Collections_collections_get\"\n", + ")\n", + "print(api_docs)\n", + "\n", + "IFrame(\n", + " api_docs,\n", + " 1200,\n", + " 800,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "5a9f5c87-ef5b-49d3-b6b8-e8fdca6cef1e", + "metadata": {}, + "source": [ + "Try applying the `filter` parameter to do a cql2-text query on the id field to find the collection you created in the `database` exercies.\n", + "\n", + "
\n", + "Tip: Try out the CQL2 Playground to learn how to write cql2-text or cql2-json queries\n", + "
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "fb94fe39-5091-41c1-8c2c-a227eb1b5c3c", + "metadata": {}, + "source": [ + "If you didn't run Part 2 on Databases, you can either go back to make a username or you can copy one from section 3.2.1 collection ids." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "30844f03-1834-4e93-9494-a59abdc4f651", + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "metadata": { - "scrolled": true + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "37bee02111a6435f86b44e27a42b2683", + "version_major": 2, + "version_minor": 0 }, - "source": [ - "datetime_string = datetime(2025, 1, 4, tzinfo=UTC).isoformat()\n", - "\n", - "item_search_request = httpx.get(\n", - " f\"{stac_api_endpoint}/search\",\n", - " params={\n", - " \"collections\": my_collection.id,\n", - " \"datetime\": f\"{datetime_string}/..\", # open interval from 2025-04-04 forward\n", - " \"limit\": 1, # one result per page for brevity in this example\n", - " },\n", - ")\n", - "\n", - "print(json.dumps(item_search_request.json(), indent=2))" - ], - "execution_count": null, - "outputs": [], - "id": "57405533-6bbf-402c-9b26-99b97ab234ec" - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "stac-fastapi-pgstac constructs the `next` link using a token that it can pass to a `pgstac` query to retrieve the next page of results from this search. STAC API clients like `pystac-client` use these links to concatenate paginated results without any additional input from the user." - ], - "id": "3625785f-8aca-4465-93bc-3c1370c0e2fb" - }, + "text/plain": [ + "Text(value='super-mouse-3144', description='username:', placeholder='Enter your username')" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import ipywidgets as widgets\n", + "from IPython.display import display\n", + "\n", + "# Prefill with the username of the most recent sentinel-2 collection in the\n", + "# catalog (created in notebook 02). If you picked your own username there,\n", + "# replace the value below - but keep in mind that notebook 02 generates a\n", + "# random default (e.g. \"quiet-surf-4719\"), so what you type here must match\n", + "# the collection id that actually exists in the catalog (see section 3.2.1).\n", + "_collections = (\n", + " httpx.get(f\"{stac_api_endpoint}/collections\", timeout=30)\n", + " .json()\n", + " .get(\"collections\", [])\n", + ")\n", + "_usernames = [\n", + " c[\"id\"].removesuffix(\"-sentinel-2-c1-l2a\")\n", + " for c in _collections\n", + " if c[\"id\"].endswith(\"-sentinel-2-c1-l2a\")\n", + "]\n", + "\n", + "username_input = widgets.Text(\n", + " value=_usernames[-1] if _usernames else None,\n", + " placeholder=\"Enter your username\",\n", + " description=\"username:\",\n", + " disabled=False,\n", + ")\n", + "\n", + "display(username_input)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "8d9d740d-1e2d-45c4-8fcc-1c7cb31a19cc", + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now limit the search to items where `eo:cloud_cover` is less than 10" + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "
\n", + "
\n", + " <Collection id=dark-dream-2670-sentinel-2-c1-l2a>\n", + "
\n", + "\n", + "
" ], - "id": "87cf6d06-94f7-4925-8652-79008ad0e0d3" - }, + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# using pystac-client\n", + "my_collection_search = client.collection_search(\n", + " filter=f\"id LIKE '%{username_input.value}%'\"\n", + ")\n", + "\n", + "results = my_collection_search.collection_list()\n", + "\n", + "if results:\n", + " my_collection = results[0]\n", + " display(my_collection)\n", + "else:\n", + " all_ids = [c.id for c in client.get_all_collections()]\n", + " print(\n", + " f\"No collections matched {username_input.value!r}. \"\n", + " f\"Collection ids in the catalog: {all_ids}\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "1d7fe9b0-f05c-4e0b-a24a-e8040b9d09c4", + "metadata": {}, + "source": [ + "
\n", + "Note: If your collection did not appear, try adjusting your collection search terms!\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "5f75438e-cca6-4447-b9cb-f3349ae04c76", + "metadata": { + "scrolled": true + }, + "outputs": [ { - "cell_type": "code", - "metadata": {}, - "source": [ - "search = client.search(\n", - " collections=[my_collection.id],\n", - " filter={\n", - " \"op\": \"lt\",\n", - " \"args\": [\n", - " {\"property\": \"eo:cloud_cover\"},\n", - " 10,\n", - " ],\n", - " },\n", - " max_items=10,\n", - ")\n", - "\n", - "items = search.item_collection()\n", - "\n", - "print(f\"found {len(items)} items\")\n", - "items[-1]" - ], - "execution_count": null, - "outputs": [], - "id": "e117cea2-8bf2-49cf-9d36-aba3e709d819" - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"links\": [\n", + " {\n", + " \"rel\": \"root\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/\"\n", + " },\n", + " {\n", + " \"rel\": \"self\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections?filter=id+LIKE+%27%25super-mouse-3144%25%27\"\n", + " }\n", + " ],\n", + " \"collections\": [\n", + " {\n", + " \"id\": \"super-mouse-3144-sentinel-2-c1-l2a\",\n", + " \"type\": \"Collection\",\n", + " \"links\": [\n", + " {\n", + " \"rel\": \"items\",\n", + " \"type\": \"application/geo+json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/super-mouse-3144-sentinel-2-c1-l2a/items\"\n", + " },\n", + " {\n", + " \"rel\": \"parent\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/\"\n", + " },\n", + " {\n", + " \"rel\": \"root\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/\"\n", + " },\n", + " {\n", + " \"rel\": \"self\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/super-mouse-3144-sentinel-2-c1-l2a\"\n", + " },\n", + " {\n", + " \"rel\": \"http://www.opengis.net/def/rel/ogc/1.0/queryables\",\n", + " \"type\": \"application/schema+json\",\n", + " \"title\": \"Queryables\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/super-mouse-3144-sentinel-2-c1-l2a/queryables\"\n", + " }\n", + " ],\n", + " \"extent\": {\n", + " \"spatial\": {\n", + " \"bbox\": [\n", + " [\n", + " 71.01,\n", + " -86.82,\n", + " 75.01,\n", + " -82.82\n", + " ]\n", + " ]\n", + " },\n", + " \"temporal\": {\n", + " \"interval\": [\n", + " [\n", + " \"2025-01-01T00:00:00Z\",\n", + " \"2025-04-18T00:00:00Z\"\n", + " ]\n", + " ]\n", + " }\n", + " },\n", + " \"license\": \"other\",\n", + " \"description\": \"super-mouse-3144's personal Sentinel-2 L2A collection\",\n", + " \"stac_version\": \"1.1.0\"\n", + " }\n", + " ],\n", + " \"numberMatched\": 1,\n", + " \"numberReturned\": 1,\n", + " \"stac_extensions\": [\n", + " \"https://stac-extensions.github.io/authentication/v1.1.0/schema.json\"\n", + " ],\n", + " \"auth:schemes\": {\n", + " \"oidc\": {\n", + " \"type\": \"openIdConnect\",\n", + " \"openIdConnectUrl\": \"http://localhost:8085/.well-known/openid-configuration\"\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "# using http client\n", + "print(\n", + " json.dumps(\n", + " httpx.get(\n", + " f\"{stac_api_endpoint}/collections\",\n", + " params={\"filter\": f\"id LIKE '%{username_input.value}%'\"},\n", + " ).json(),\n", + " indent=2,\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "7eae366c-977d-45af-bf19-275e67ee8058", + "metadata": {}, + "source": [ + "Now that you found your collection, you have what you need to do an effective item search within your collection! " + ] + }, + { + "cell_type": "markdown", + "id": "56657240-5905-4ddf-a76a-afd2a28959b0", + "metadata": {}, + "source": [ + "## 3.3 Items\n", + "\n", + "Once you have the collection ID there are several ways to perform an effective item search:\n", + "- GET request to `/collections/{collection_id}/items`\n", + "- GET or POST request to `/search`\n", + "\n", + "There are not any particular advantages to either approach unless you want to search for items using an intersection with a geometry in which case you should use a POST request to `/search` with the `intersects` parameter in the request body (instead of url-encoding a geojson!).\n", + "\n", + "Item search request responses will be returned in pages with `{limit}` results. If your search returns more than a single page of results, the next page will be retrievable via the `next` link in the list of `links`." + ] + }, + { + "cell_type": "markdown", + "id": "74d1fb0b-e830-4fb0-8619-f9cfd3019111", + "metadata": {}, + "source": [ + "### 3.3.1 Item Search\n", + "\n", + "Use the `/search` endpoint to find all items in your collection with a timestamp after April 4, 2025" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e73a9ef7-d8f8-407d-965e-c549f112899c", + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.3.2 All Items\n", - "\n", - "The API `/collections/{collection_id}/items` endpoint will get you all items in a collection.\n", - "\n", - "You can also run the same search but instead of passing `collections` as a query parameter you can include `collection_id` as a path parameter in the request URL itself. All of the other query parameters for the `/search` GET request will be available." - ], - "id": "61d01f82-94f8-4071-b398-2508bc84c56a" + "name": "stdout", + "output_type": "stream", + "text": [ + "found 10 items\n" + ] }, { - "cell_type": "code", - "metadata": {}, - "source": [ - "datetime_string = datetime(2025, 1, 4, tzinfo=UTC).isoformat()\n", - "\n", - "item_search_request = httpx.get(\n", - " f\"{stac_api_endpoint}/collections/{my_collection.id}/items\",\n", - " params={\n", - " \"datetime\": f\"{datetime_string}/..\", # open interval from 2025-04-04 forward\n", - " \"limit\": 1000,\n", - " \"filter\": \"eo:cloud_cover < 10\", # less than 10% cloud cover\n", - " },\n", - ")\n", - "response = item_search_request.json()\n", - "print(f\"found {len(response['features'])} items\")" + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "
\n", + "
\n", + " <Item id=S2B_T43CEJ_20250129T232126_L2A>\n", + "
\n", + "\n", + "
" ], - "execution_count": null, - "outputs": [], - "id": "2bfec9f1-5bd6-4ea9-90bf-66a2ddf90f36" - }, + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from datetime import datetime, UTC\n", + "\n", + "search = client.search(\n", + " collections=[my_collection.id],\n", + " datetime=[datetime(2025, 1, 4), None],\n", + ")\n", + "\n", + "items = search.item_collection()\n", + "\n", + "print(f\"found {len(items)} items\")\n", + "items[0]" + ] + }, + { + "cell_type": "markdown", + "id": "3e504a62-0c1e-4f00-aa54-e286252c493b", + "metadata": {}, + "source": [ + "The same query can be made with an HTTP client:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "57405533-6bbf-402c-9b26-99b97ab234ec", + "metadata": { + "scrolled": true + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.3.3 Single Item by ID\n", - "\n", - "To retrieve a specific item from the catalog, you can use the `/collections/{collection_id}/items/{item_id}` endpoint." - ], - "id": "a1de0ea6-51b5-4b12-88e0-67c2d49012bb" - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"type\": \"FeatureCollection\",\n", + " \"links\": [\n", + " {\n", + " \"rel\": \"root\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/\"\n", + " },\n", + " {\n", + " \"rel\": \"self\",\n", + " \"type\": \"application/geo+json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/search\"\n", + " },\n", + " {\n", + " \"rel\": \"next\",\n", + " \"type\": \"application/geo+json\",\n", + " \"method\": \"GET\",\n", + " \"href\": \"http://stac-auth-proxy:8000/search?collections=super-mouse-3144-sentinel-2-c1-l2a&datetime=2025-01-04T00%3A00%3A00%2B00%3A00%2F..&limit=1&token=next%3Asuper-mouse-3144-sentinel-2-c1-l2a%3AS2B_T43CEJ_20250129T232126_L2A\"\n", + " }\n", + " ],\n", + " \"features\": [\n", + " {\n", + " \"id\": \"S2B_T43CEJ_20250129T232126_L2A\",\n", + " \"bbox\": [\n", + " 74.998637,\n", + " -82.829004,\n", + " 76.476391,\n", + " -81.953754\n", + " ],\n", + " \"type\": \"Feature\",\n", + " \"links\": [\n", + " {\n", + " \"rel\": \"collection\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/super-mouse-3144-sentinel-2-c1-l2a\"\n", + " },\n", + " {\n", + " \"rel\": \"parent\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/super-mouse-3144-sentinel-2-c1-l2a\"\n", + " },\n", + " {\n", + " \"rel\": \"root\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/\"\n", + " },\n", + " {\n", + " \"rel\": \"self\",\n", + " \"type\": \"application/geo+json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/super-mouse-3144-sentinel-2-c1-l2a/items/S2B_T43CEJ_20250129T232126_L2A\"\n", + " },\n", + " {\n", + " \"rel\": \"canonical\",\n", + " \"href\": \"s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/S2B_T43CEJ_20250129T232126_L2A.json\",\n", + " \"type\": \"application/json\"\n", + " },\n", + " {\n", + " \"rel\": \"via\",\n", + " \"href\": \"s3://sentinel-s2-l2a/tiles/43/C/EJ/2025/1/29/1/metadata.xml\",\n", + " \"type\": \"application/xml\",\n", + " \"title\": \"Granule Metadata in Sinergize RODA Archive\"\n", + " },\n", + " {\n", + " \"rel\": \"thumbnail\",\n", + " \"href\": \"https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T43CEJ_20250129T232126_L2A/thumbnail\"\n", + " }\n", + " ],\n", + " \"assets\": {\n", + " \"aot\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/AOT.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\"\n", + " ],\n", + " \"title\": \"Aerosol optical thickness (AOT)\",\n", + " \"file:size\": 144362,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.001,\n", + " \"nodata\": 0,\n", + " \"offset\": 0,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12207e6fe3a9869218db7dbac14cbcfbc7b7b3278f508589e8f2800cd6399eddb4ff\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 900040\n", + " ]\n", + " },\n", + " \"nir\": {\n", + " \"gsd\": 10,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B08.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"NIR 1 - 10m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B08\",\n", + " \"common_name\": \"nir\",\n", + " \"center_wavelength\": 0.842,\n", + " \"full_width_half_max\": 0.145\n", + " }\n", + " ],\n", + " \"file:size\": 27234331,\n", + " \"proj:shape\": [\n", + " 10980,\n", + " 10980\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 10\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220dc7fd081c4f715e34d263a1ba65fe5364dc33ad5e4ddf0b8ca3040afc3e28b33\",\n", + " \"proj:transform\": [\n", + " 10,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -10,\n", + " 900040\n", + " ]\n", + " },\n", + " \"red\": {\n", + " \"gsd\": 10,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B04.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Red - 10m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B04\",\n", + " \"common_name\": \"red\",\n", + " \"center_wavelength\": 0.665,\n", + " \"full_width_half_max\": 0.038\n", + " }\n", + " ],\n", + " \"file:size\": 26188526,\n", + " \"proj:shape\": [\n", + " 10980,\n", + " 10980\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 10\n", + " }\n", + " ],\n", + " \"file:checksum\": \"122013838a1c4909487be8c047f95162861620f252878eb7120c37c66f9917cf1171\",\n", + " \"proj:transform\": [\n", + " 10,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -10,\n", + " 900040\n", + " ]\n", + " },\n", + " \"scl\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/SCL.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\"\n", + " ],\n", + " \"title\": \"Scene classification map (SCL)\",\n", + " \"file:size\": 204389,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"122068060b58a8450ef80f55b6866bc20481512d83c1091b9e2f6c3042ac9bf34749\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 900040\n", + " ]\n", + " },\n", + " \"wvp\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/WVP.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\"\n", + " ],\n", + " \"title\": \"Water Vapour (WVP)\",\n", + " \"file:size\": 2402873,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"unit\": \"cm\",\n", + " \"scale\": 0.001,\n", + " \"nodata\": 0,\n", + " \"offset\": 0,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"122092f3ad25ed396943c4c12a60d346bff4e8b81afb6c79dfa5a93d6d9b4960630f\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 900040\n", + " ]\n", + " },\n", + " \"blue\": {\n", + " \"gsd\": 10,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B02.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Blue - 10m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B02\",\n", + " \"common_name\": \"blue\",\n", + " \"center_wavelength\": 0.49,\n", + " \"full_width_half_max\": 0.098\n", + " }\n", + " ],\n", + " \"file:size\": 25522677,\n", + " \"proj:shape\": [\n", + " 10980,\n", + " 10980\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 10\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220569c69f6ccc05d007a28c0aada66ce751b614e46f5218d5cf7e0dd79e216f796\",\n", + " \"proj:transform\": [\n", + " 10,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -10,\n", + " 900040\n", + " ]\n", + " },\n", + " \"snow\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/SNW_20m.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"snow-ice\"\n", + " ],\n", + " \"title\": \"Snow Probabilities\",\n", + " \"file:size\": 195641,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12201f7ee663d311aa0bf2c63ff5a2071988188f918f1b2b5d859df8381f7df0c257\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 900040\n", + " ]\n", + " },\n", + " \"cloud\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/CLD_20m.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"cloud\"\n", + " ],\n", + " \"title\": \"Cloud Probabilities\",\n", + " \"file:size\": 187672,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220ade4f35896e65b165267fcfd8082a5c320471ff319eaa26006555920c3ab437b\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 900040\n", + " ]\n", + " },\n", + " \"green\": {\n", + " \"gsd\": 10,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B03.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Green - 10m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B03\",\n", + " \"common_name\": \"green\",\n", + " \"center_wavelength\": 0.56,\n", + " \"full_width_half_max\": 0.045\n", + " }\n", + " ],\n", + " \"file:size\": 25854114,\n", + " \"proj:shape\": [\n", + " 10980,\n", + " 10980\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 10\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12203c82c4a91c05a8514d11dad105280eaef375096cea35ea11b0390fe14eb23378\",\n", + " \"proj:transform\": [\n", + " 10,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -10,\n", + " 900040\n", + " ]\n", + " },\n", + " \"nir08\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B8A.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"NIR 2 - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B8A\",\n", + " \"common_name\": \"nir08\",\n", + " \"center_wavelength\": 0.865,\n", + " \"full_width_half_max\": 0.033\n", + " }\n", + " ],\n", + " \"file:size\": 8974769,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"122064cf5894c15636b1337eeaa0732cfec31f89e730f72583c726716f8e7a9342ec\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 900040\n", + " ]\n", + " },\n", + " \"nir09\": {\n", + " \"gsd\": 60,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B09.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"NIR 3 - 60m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B09\",\n", + " \"common_name\": \"nir09\",\n", + " \"center_wavelength\": 0.945,\n", + " \"full_width_half_max\": 0.026\n", + " }\n", + " ],\n", + " \"file:size\": 1034798,\n", + " \"proj:shape\": [\n", + " 1830,\n", + " 1830\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 60\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12206c9f352ad396fa0e5aef97d89c643fc32dbe2505e69abdcff49e9329878be8dc\",\n", + " \"proj:transform\": [\n", + " 60,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -60,\n", + " 900040\n", + " ]\n", + " },\n", + " \"swir16\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B11.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"SWIR 1.6\\u03bcm - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B11\",\n", + " \"common_name\": \"swir16\",\n", + " \"center_wavelength\": 1.61,\n", + " \"full_width_half_max\": 0.143\n", + " }\n", + " ],\n", + " \"file:size\": 7220773,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12203a21f6087fa74dc41617215fae038da3d2c89723ab9ed8693bbeeadcb68da54f\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 900040\n", + " ]\n", + " },\n", + " \"swir22\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B12.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"SWIR 2.2\\u03bcm - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B12\",\n", + " \"common_name\": \"swir22\",\n", + " \"center_wavelength\": 2.19,\n", + " \"full_width_half_max\": 0.242\n", + " }\n", + " ],\n", + " \"file:size\": 7342247,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"122077b4b06c2edf7892340f4eb95afe2e5f7e97bd555d89bf22a84ee1ed7f20e999\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 900040\n", + " ]\n", + " },\n", + " \"visual\": {\n", + " \"gsd\": 10,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/TCI.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"visual\"\n", + " ],\n", + " \"title\": \"True color image\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B04\",\n", + " \"common_name\": \"red\",\n", + " \"center_wavelength\": 0.665,\n", + " \"full_width_half_max\": 0.038\n", + " },\n", + " {\n", + " \"name\": \"B03\",\n", + " \"common_name\": \"green\",\n", + " \"center_wavelength\": 0.56,\n", + " \"full_width_half_max\": 0.045\n", + " },\n", + " {\n", + " \"name\": \"B02\",\n", + " \"common_name\": \"blue\",\n", + " \"center_wavelength\": 0.49,\n", + " \"full_width_half_max\": 0.098\n", + " }\n", + " ],\n", + " \"file:size\": 586020,\n", + " \"proj:shape\": [\n", + " 10980,\n", + " 10980\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 10\n", + " },\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 10\n", + " },\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 10\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220d55f6c195f7b5d6fae0b1794d03c0fbda5d0cd8bf1dd4e27c8d456bf3d9a505a\",\n", + " \"proj:transform\": [\n", + " 10,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -10,\n", + " 900040\n", + " ]\n", + " },\n", + " \"coastal\": {\n", + " \"gsd\": 60,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B01.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Coastal - 60m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B01\",\n", + " \"common_name\": \"coastal\",\n", + " \"center_wavelength\": 0.443,\n", + " \"full_width_half_max\": 0.027\n", + " }\n", + " ],\n", + " \"file:size\": 1022784,\n", + " \"proj:shape\": [\n", + " 1830,\n", + " 1830\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 60\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220c2d452409df7803b66cf99e8fbd9acd64a1ef0a465208740a4d0dddcdb5589c0\",\n", + " \"proj:transform\": [\n", + " 60,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -60,\n", + " 900040\n", + " ]\n", + " },\n", + " \"preview\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/L2A_PVI.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"overview\"\n", + " ],\n", + " \"title\": \"True color preview\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B04\",\n", + " \"common_name\": \"red\",\n", + " \"center_wavelength\": 0.665,\n", + " \"full_width_half_max\": 0.038\n", + " },\n", + " {\n", + " \"name\": \"B03\",\n", + " \"common_name\": \"green\",\n", + " \"center_wavelength\": 0.56,\n", + " \"full_width_half_max\": 0.045\n", + " },\n", + " {\n", + " \"name\": \"B02\",\n", + " \"common_name\": \"blue\",\n", + " \"center_wavelength\": 0.49,\n", + " \"full_width_half_max\": 0.098\n", + " }\n", + " ],\n", + " \"file:size\": 5582,\n", + " \"file:checksum\": \"1220d384769e22f70ae6b676c30396bf38056fbc13fb83b5e186f0914105c0d9b17e\"\n", + " },\n", + " \"rededge1\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B05.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Red Edge 1 - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B05\",\n", + " \"common_name\": \"rededge\",\n", + " \"center_wavelength\": 0.704,\n", + " \"full_width_half_max\": 0.019\n", + " }\n", + " ],\n", + " \"file:size\": 8927582,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220b7081230c8a4811d340b2db6d031679f30b3b1e9fca297e508b9fa93ca6f89c7\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 900040\n", + " ]\n", + " },\n", + " \"rededge2\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B06.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Red Edge 2 - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B06\",\n", + " \"common_name\": \"rededge\",\n", + " \"center_wavelength\": 0.74,\n", + " \"full_width_half_max\": 0.018\n", + " }\n", + " ],\n", + " \"file:size\": 8943424,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220324f5c66fecabe6161d09bde40a5aef4e1b8c26b0390f0789020f66d833be1d0\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 900040\n", + " ]\n", + " },\n", + " \"rededge3\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/B07.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Red Edge 3 - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B07\",\n", + " \"common_name\": \"rededge\",\n", + " \"center_wavelength\": 0.783,\n", + " \"full_width_half_max\": 0.028\n", + " }\n", + " ],\n", + " \"file:size\": 8923378,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"122047533eecbdb7ef5f2bd8144449e599499bf5e60c4c1c0708c06737179cdc0081\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 900040\n", + " ]\n", + " },\n", + " \"thumbnail\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/L2A_PVI.jpg\",\n", + " \"type\": \"image/jpeg\",\n", + " \"roles\": [\n", + " \"thumbnail\"\n", + " ],\n", + " \"title\": \"Thumbnail of preview image\",\n", + " \"file:size\": 3576,\n", + " \"file:checksum\": \"12201ab9d91d8e86bc48302fab736121f8a86588b5f7a6edbc67d550804665faa384\"\n", + " },\n", + " \"granule_metadata\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/metadata.xml\",\n", + " \"type\": \"application/xml\",\n", + " \"roles\": [\n", + " \"metadata\"\n", + " ],\n", + " \"file:size\": 344855,\n", + " \"file:checksum\": \"1220edd5bd5fa6235f1a96682d5804ff162541d55f791141c3231871ded4cc41f1b2\"\n", + " },\n", + " \"product_metadata\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/product_metadata.xml\",\n", + " \"type\": \"application/xml\",\n", + " \"roles\": [\n", + " \"metadata\"\n", + " ],\n", + " \"file:size\": 55392,\n", + " \"file:checksum\": \"1220b87a0742b4aca28a2be5081d68db0c3b8ef075488608d49b992e397bf137925d\"\n", + " },\n", + " \"tileinfo_metadata\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/43/C/EJ/2025/1/S2B_T43CEJ_20250129T232126_L2A/tileInfo.json\",\n", + " \"type\": \"application/json\",\n", + " \"roles\": [\n", + " \"metadata\"\n", + " ],\n", + " \"file:size\": 1771,\n", + " \"file:checksum\": \"1220174722f463c1aabcacfdb9888c7de0ed40c1f57610e8fab5770defa955fa7ef0\"\n", + " }\n", + " },\n", + " \"geometry\": {\n", + " \"type\": \"Polygon\",\n", + " \"coordinates\": [\n", + " [\n", + " [\n", + " 74.99878374283573,\n", + " -81.95639085890919\n", + " ],\n", + " [\n", + " 74.99863740990479,\n", + " -82.82513944666067\n", + " ],\n", + " [\n", + " 76.07398049288716,\n", + " -82.82900375273907\n", + " ],\n", + " [\n", + " 76.2054060931808,\n", + " -82.59361541363332\n", + " ],\n", + " [\n", + " 76.27657124570325,\n", + " -82.5917114984714\n", + " ],\n", + " [\n", + " 76.30097560235568,\n", + " -82.52864714405649\n", + " ],\n", + " [\n", + " 76.29319356693986,\n", + " -82.35754146790732\n", + " ],\n", + " [\n", + " 76.37236705276067,\n", + " -82.14201868935132\n", + " ],\n", + " [\n", + " 76.43421609158189,\n", + " -82.14068493795945\n", + " ],\n", + " [\n", + " 76.47639068984915,\n", + " -81.95375433709442\n", + " ],\n", + " [\n", + " 74.99878374283573,\n", + " -81.95639085890919\n", + " ]\n", + " ]\n", + " ]\n", + " },\n", + " \"collection\": \"super-mouse-3144-sentinel-2-c1-l2a\",\n", + " \"properties\": {\n", + " \"created\": \"2025-01-30T01:00:51.795Z\",\n", + " \"updated\": \"2025-01-30T01:00:51.795Z\",\n", + " \"datetime\": \"2025-01-29T23:21:31.918000Z\",\n", + " \"platform\": \"sentinel-2b\",\n", + " \"grid:code\": \"MGRS-43CEJ\",\n", + " \"proj:code\": \"EPSG:32743\",\n", + " \"s2:tile_id\": \"S2B_OPER_MSI_L2A_TL_2BPS_20250129T235902_A041268_T43CEJ_N05.11\",\n", + " \"instruments\": [\n", + " \"msi\"\n", + " ],\n", + " \"view:azimuth\": 184.13570996684024,\n", + " \"constellation\": \"sentinel-2\",\n", + " \"mgrs:utm_zone\": 43,\n", + " \"proj:centroid\": {\n", + " \"lat\": -82.36988,\n", + " \"lon\": 75.65354\n", + " },\n", + " \"eo:cloud_cover\": 28.13631,\n", + " \"s2:datatake_id\": \"GS2B_20250129T232129_041268_N05.11\",\n", + " \"s2:product_uri\": \"S2B_MSIL2A_20250129T232129_N0511_R058_T43CEJ_20250129T235902.SAFE\",\n", + " \"storage:region\": \"us-west-2\",\n", + " \"s2:datastrip_id\": \"S2B_OPER_MSI_L2A_DS_2BPS_20250129T235902_S20250129T232126_N05.11\",\n", + " \"s2:product_type\": \"S2MSI2A\",\n", + " \"mgrs:grid_square\": \"EJ\",\n", + " \"s2:datatake_type\": \"INS-NOBS\",\n", + " \"storage:platform\": \"AWS\",\n", + " \"view:sun_azimuth\": 116.171761867649,\n", + " \"mgrs:latitude_band\": \"C\",\n", + " \"s2:generation_time\": \"2025-01-29T23:59:02.000000Z\",\n", + " \"view:sun_elevation\": 14.427876039008694,\n", + " \"processing:software\": {\n", + " \"sentinel-2-c1-l2a-to-stac\": \"v2024.02.01\"\n", + " },\n", + " \"s2:water_percentage\": 0,\n", + " \"view:incidence_angle\": 7.893555169805119,\n", + " \"earthsearch:payload_id\": \"roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/10bf4270276e9ff9f1e9066d5d480b8e\",\n", + " \"s2:processing_baseline\": \"05.11\",\n", + " \"s2:snow_ice_percentage\": 71.863687,\n", + " \"storage:requester_pays\": false,\n", + " \"s2:vegetation_percentage\": 0,\n", + " \"s2:thin_cirrus_percentage\": 0,\n", + " \"s2:cloud_shadow_percentage\": 0,\n", + " \"s2:nodata_pixel_percentage\": 84.266186,\n", + " \"s2:unclassified_percentage\": 0,\n", + " \"s2:not_vegetated_percentage\": 0,\n", + " \"s2:degraded_msi_data_percentage\": 0.0219,\n", + " \"s2:high_proba_clouds_percentage\": 0,\n", + " \"s2:reflectance_conversion_factor\": 1.0316374930781,\n", + " \"s2:medium_proba_clouds_percentage\": 28.13631,\n", + " \"s2:saturated_defective_pixel_percentage\": 0\n", + " },\n", + " \"stac_version\": \"1.1.0\",\n", + " \"stac_extensions\": [\n", + " \"https://stac-extensions.github.io/eo/v1.1.0/schema.json\",\n", + " \"https://stac-extensions.github.io/file/v2.1.0/schema.json\",\n", + " \"https://stac-extensions.github.io/grid/v1.1.0/schema.json\",\n", + " \"https://stac-extensions.github.io/mgrs/v1.0.0/schema.json\",\n", + " \"https://stac-extensions.github.io/processing/v1.1.0/schema.json\",\n", + " \"https://stac-extensions.github.io/projection/v2.0.0/schema.json\",\n", + " \"https://stac-extensions.github.io/raster/v1.1.0/schema.json\",\n", + " \"https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json\",\n", + " \"https://stac-extensions.github.io/storage/v1.0.0/schema.json\",\n", + " \"https://stac-extensions.github.io/view/v1.0.0/schema.json\"\n", + " ]\n", + " }\n", + " ],\n", + " \"numberReturned\": 1,\n", + " \"stac_extensions\": [\n", + " \"https://stac-extensions.github.io/authentication/v1.1.0/schema.json\"\n", + " ],\n", + " \"auth:schemes\": {\n", + " \"oidc\": {\n", + " \"type\": \"openIdConnect\",\n", + " \"openIdConnectUrl\": \"http://localhost:8085/.well-known/openid-configuration\"\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "datetime_string = datetime(2025, 1, 4, tzinfo=UTC).isoformat()\n", + "\n", + "item_search_request = httpx.get(\n", + " f\"{stac_api_endpoint}/search\",\n", + " params={\n", + " \"collections\": my_collection.id,\n", + " \"datetime\": f\"{datetime_string}/..\", # open interval from 2025-04-04 forward\n", + " \"limit\": 1, # one result per page for brevity in this example\n", + " },\n", + ")\n", + "\n", + "print(json.dumps(item_search_request.json(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "3625785f-8aca-4465-93bc-3c1370c0e2fb", + "metadata": {}, + "source": [ + "stac-fastapi-pgstac constructs the `next` link using a token that it can pass to a `pgstac` query to retrieve the next page of results from this search. STAC API clients like `pystac-client` use these links to concatenate paginated results without any additional input from the user." + ] + }, + { + "cell_type": "markdown", + "id": "87cf6d06-94f7-4925-8652-79008ad0e0d3", + "metadata": {}, + "source": [ + "Now limit the search to items where `eo:cloud_cover` is less than 10" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e117cea2-8bf2-49cf-9d36-aba3e709d819", + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "metadata": { - "scrolled": true - }, - "source": [ - "item_id = response[\"features\"][0][\"id\"]\n", - "item_request = httpx.get(\n", - " f\"{stac_api_endpoint}/collections/{my_collection.id}/items/{item_id}\"\n", - ")\n", - "print(json.dumps(item_request.json(), indent=2))" - ], - "execution_count": null, - "outputs": [], - "id": "fc47ce1f-68ac-42f2-a9f3-becddb5e2683" + "name": "stdout", + "output_type": "stream", + "text": [ + "found 6 items\n" + ] }, { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`pystac-client` can do the same thing" + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "
\n", + "
\n", + " <Item id=S2B_T42CWN_20250102T233129_L2A>\n", + "
\n", + "\n", + "
" ], - "id": "13efb26d-e63e-45ed-ab55-5af00e77fbeb" - }, + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "search = client.search(\n", + " collections=[my_collection.id],\n", + " filter={\n", + " \"op\": \"lt\",\n", + " \"args\": [\n", + " {\"property\": \"eo:cloud_cover\"},\n", + " 10,\n", + " ],\n", + " },\n", + " max_items=10,\n", + ")\n", + "\n", + "items = search.item_collection()\n", + "\n", + "print(f\"found {len(items)} items\")\n", + "items[-1]" + ] + }, + { + "cell_type": "markdown", + "id": "61d01f82-94f8-4071-b398-2508bc84c56a", + "metadata": {}, + "source": [ + "### 3.3.2 All Items\n", + "\n", + "The API `/collections/{collection_id}/items` endpoint will get you all items in a collection.\n", + "\n", + "You can also run the same search but instead of passing `collections` as a query parameter you can include `collection_id` as a path parameter in the request URL itself. All of the other query parameters for the `/search` GET request will be available." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2bfec9f1-5bd6-4ea9-90bf-66a2ddf90f36", + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "metadata": {}, - "source": [ - "collection_client = client.get_collection(my_collection.id)\n", - "\n", - "collection_client.get_item(item_id)" - ], - "execution_count": null, - "outputs": [], - "id": "ba409044-3f40-4d53-9256-f21aaa4b9da0" - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "found 5 items\n" + ] + } + ], + "source": [ + "datetime_string = datetime(2025, 1, 4, tzinfo=UTC).isoformat()\n", + "\n", + "item_search_request = httpx.get(\n", + " f\"{stac_api_endpoint}/collections/{my_collection.id}/items\",\n", + " params={\n", + " \"datetime\": f\"{datetime_string}/..\", # open interval from 2025-04-04 forward\n", + " \"limit\": 1000,\n", + " \"filter\": \"eo:cloud_cover < 10\", # less than 10% cloud cover\n", + " },\n", + ")\n", + "response = item_search_request.json()\n", + "print(f\"found {len(response['features'])} items\")" + ] + }, + { + "cell_type": "markdown", + "id": "a1de0ea6-51b5-4b12-88e0-67c2d49012bb", + "metadata": {}, + "source": [ + "### 3.3.3 Single Item by ID\n", + "\n", + "To retrieve a specific item from the catalog, you can use the `/collections/{collection_id}/items/{item_id}` endpoint." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "fc47ce1f-68ac-42f2-a9f3-becddb5e2683", + "metadata": { + "scrolled": true + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "That's it! You have taken a full tour of the stac-fastapi-pgstac STAC API. Here is a look at the full API documentation for the deployed API:" - ], - "id": "7795389e-2007-4e79-b1ef-a788ac259694" - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"id\": \"S2B_T42CWN_20250129T232126_L2A\",\n", + " \"bbox\": [\n", + " 74.401618,\n", + " -82.829135,\n", + " 76.092082,\n", + " -82.80145\n", + " ],\n", + " \"type\": \"Feature\",\n", + " \"links\": [\n", + " {\n", + " \"rel\": \"collection\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/super-mouse-3144-sentinel-2-c1-l2a\"\n", + " },\n", + " {\n", + " \"rel\": \"parent\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/super-mouse-3144-sentinel-2-c1-l2a\"\n", + " },\n", + " {\n", + " \"rel\": \"root\",\n", + " \"type\": \"application/json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/\"\n", + " },\n", + " {\n", + " \"rel\": \"self\",\n", + " \"type\": \"application/geo+json\",\n", + " \"href\": \"http://stac-auth-proxy:8000/collections/super-mouse-3144-sentinel-2-c1-l2a/items/S2B_T42CWN_20250129T232126_L2A\"\n", + " },\n", + " {\n", + " \"rel\": \"canonical\",\n", + " \"href\": \"s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/S2B_T42CWN_20250129T232126_L2A.json\",\n", + " \"type\": \"application/json\"\n", + " },\n", + " {\n", + " \"rel\": \"via\",\n", + " \"href\": \"s3://sentinel-s2-l2a/tiles/42/C/WN/2025/1/29/0/metadata.xml\",\n", + " \"type\": \"application/xml\",\n", + " \"title\": \"Granule Metadata in Sinergize RODA Archive\"\n", + " },\n", + " {\n", + " \"rel\": \"thumbnail\",\n", + " \"href\": \"https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T42CWN_20250129T232126_L2A/thumbnail\"\n", + " }\n", + " ],\n", + " \"assets\": {\n", + " \"aot\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/AOT.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\"\n", + " ],\n", + " \"title\": \"Aerosol optical thickness (AOT)\",\n", + " \"file:size\": 97290,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.001,\n", + " \"nodata\": 0,\n", + " \"offset\": 0,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220786825f52e35b66b8bc070f835e601325bbcf2f6f45af203187291f247f69371\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 800020\n", + " ]\n", + " },\n", + " \"nir\": {\n", + " \"gsd\": 10,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B08.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"NIR 1 - 10m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B08\",\n", + " \"common_name\": \"nir\",\n", + " \"center_wavelength\": 0.842,\n", + " \"full_width_half_max\": 0.145\n", + " }\n", + " ],\n", + " \"file:size\": 1021169,\n", + " \"proj:shape\": [\n", + " 10980,\n", + " 10980\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 10\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12206a5c2546eaaa78ca2d65b089510cbb4d18fb511a3691a4c91441591c7afbe177\",\n", + " \"proj:transform\": [\n", + " 10,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -10,\n", + " 800020\n", + " ]\n", + " },\n", + " \"red\": {\n", + " \"gsd\": 10,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B04.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Red - 10m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B04\",\n", + " \"common_name\": \"red\",\n", + " \"center_wavelength\": 0.665,\n", + " \"full_width_half_max\": 0.038\n", + " }\n", + " ],\n", + " \"file:size\": 985898,\n", + " \"proj:shape\": [\n", + " 10980,\n", + " 10980\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 10\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12203163d3c2dfcc1a7019d7868e82e9d0d4295d6356b851780b51e6323f5fe46f96\",\n", + " \"proj:transform\": [\n", + " 10,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -10,\n", + " 800020\n", + " ]\n", + " },\n", + " \"scl\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/SCL.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\"\n", + " ],\n", + " \"title\": \"Scene classification map (SCL)\",\n", + " \"file:size\": 55281,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220c2cbf485c1fcb193b34dd3ef5f2b42357fb5e499eae719fa3e4290179e30730d\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 800020\n", + " ]\n", + " },\n", + " \"wvp\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/WVP.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\"\n", + " ],\n", + " \"title\": \"Water Vapour (WVP)\",\n", + " \"file:size\": 183850,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"unit\": \"cm\",\n", + " \"scale\": 0.001,\n", + " \"nodata\": 0,\n", + " \"offset\": 0,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220a54a7d41990b2612b6dd0c5830a365ffa2a7d2d9f1b5e9464bff3f350829e86e\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 800020\n", + " ]\n", + " },\n", + " \"blue\": {\n", + " \"gsd\": 10,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B02.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Blue - 10m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B02\",\n", + " \"common_name\": \"blue\",\n", + " \"center_wavelength\": 0.49,\n", + " \"full_width_half_max\": 0.098\n", + " }\n", + " ],\n", + " \"file:size\": 958799,\n", + " \"proj:shape\": [\n", + " 10980,\n", + " 10980\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 10\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12207119e632a28411b979a318ff8b5b936ecab85378229848f90d0d1fc3f29c6ce0\",\n", + " \"proj:transform\": [\n", + " 10,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -10,\n", + " 800020\n", + " ]\n", + " },\n", + " \"snow\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/SNW_20m.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"snow-ice\"\n", + " ],\n", + " \"title\": \"Snow Probabilities\",\n", + " \"file:size\": 55796,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220861dad31e60aca91d848cf402b043beb094ca878071007fc90a5f848b19de524\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 800020\n", + " ]\n", + " },\n", + " \"cloud\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/CLD_20m.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"cloud\"\n", + " ],\n", + " \"title\": \"Cloud Probabilities\",\n", + " \"file:size\": 53931,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220af3f56aeb8c3e1558b6fe1e7413158b3204e33f17a9b46047c2bfe4dcea97100\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 800020\n", + " ]\n", + " },\n", + " \"green\": {\n", + " \"gsd\": 10,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B03.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Green - 10m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B03\",\n", + " \"common_name\": \"green\",\n", + " \"center_wavelength\": 0.56,\n", + " \"full_width_half_max\": 0.045\n", + " }\n", + " ],\n", + " \"file:size\": 976749,\n", + " \"proj:shape\": [\n", + " 10980,\n", + " 10980\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 10\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220d0f99f6735633e741883aad9a0b3839ab1f93aad2d0884c2e92637d18b7ef69f\",\n", + " \"proj:transform\": [\n", + " 10,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -10,\n", + " 800020\n", + " ]\n", + " },\n", + " \"nir08\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B8A.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"NIR 2 - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B8A\",\n", + " \"common_name\": \"nir08\",\n", + " \"center_wavelength\": 0.865,\n", + " \"full_width_half_max\": 0.033\n", + " }\n", + " ],\n", + " \"file:size\": 321172,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"122094b86882e31cd0e4daa393d762c6bdd6a991dc503a8eae5ebaac79660d3a4ccf\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 800020\n", + " ]\n", + " },\n", + " \"nir09\": {\n", + " \"gsd\": 60,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B09.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"NIR 3 - 60m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B09\",\n", + " \"common_name\": \"nir09\",\n", + " \"center_wavelength\": 0.945,\n", + " \"full_width_half_max\": 0.026\n", + " }\n", + " ],\n", + " \"file:size\": 46582,\n", + " \"proj:shape\": [\n", + " 1830,\n", + " 1830\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 60\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12201ce66972bf52b27b1603281e1bada703282a44386519a34ff84999b383276c3c\",\n", + " \"proj:transform\": [\n", + " 60,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -60,\n", + " 800020\n", + " ]\n", + " },\n", + " \"swir16\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B11.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"SWIR 1.6\\u03bcm - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B11\",\n", + " \"common_name\": \"swir16\",\n", + " \"center_wavelength\": 1.61,\n", + " \"full_width_half_max\": 0.143\n", + " }\n", + " ],\n", + " \"file:size\": 289791,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12205930e99f68fc4cc913cd2d7480fd942b36bc042226257a691c2a4516715389cb\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 800020\n", + " ]\n", + " },\n", + " \"swir22\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B12.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"SWIR 2.2\\u03bcm - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B12\",\n", + " \"common_name\": \"swir22\",\n", + " \"center_wavelength\": 2.19,\n", + " \"full_width_half_max\": 0.242\n", + " }\n", + " ],\n", + " \"file:size\": 292540,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"122028203f2b1cccc5e85cb91ad9e0b2c85032fd3918fe81118ec627455921f1fe8f\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 800020\n", + " ]\n", + " },\n", + " \"visual\": {\n", + " \"gsd\": 10,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/TCI.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"visual\"\n", + " ],\n", + " \"title\": \"True color image\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B04\",\n", + " \"common_name\": \"red\",\n", + " \"center_wavelength\": 0.665,\n", + " \"full_width_half_max\": 0.038\n", + " },\n", + " {\n", + " \"name\": \"B03\",\n", + " \"common_name\": \"green\",\n", + " \"center_wavelength\": 0.56,\n", + " \"full_width_half_max\": 0.045\n", + " },\n", + " {\n", + " \"name\": \"B02\",\n", + " \"common_name\": \"blue\",\n", + " \"center_wavelength\": 0.49,\n", + " \"full_width_half_max\": 0.098\n", + " }\n", + " ],\n", + " \"file:size\": 517940,\n", + " \"proj:shape\": [\n", + " 10980,\n", + " 10980\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 10\n", + " },\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 10\n", + " },\n", + " {\n", + " \"nodata\": 0,\n", + " \"data_type\": \"uint8\",\n", + " \"spatial_resolution\": 10\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12204405a14f7113a9de2187d0ace792de98ff1745100ce42ac4f270319db51c8cf6\",\n", + " \"proj:transform\": [\n", + " 10,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -10,\n", + " 800020\n", + " ]\n", + " },\n", + " \"coastal\": {\n", + " \"gsd\": 60,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B01.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Coastal - 60m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B01\",\n", + " \"common_name\": \"coastal\",\n", + " \"center_wavelength\": 0.443,\n", + " \"full_width_half_max\": 0.027\n", + " }\n", + " ],\n", + " \"file:size\": 45968,\n", + " \"proj:shape\": [\n", + " 1830,\n", + " 1830\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 60\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220ea28e3476a036f55ccd70923db085351ab06924b5e0df10aade68b2e6be2a9e1\",\n", + " \"proj:transform\": [\n", + " 60,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -60,\n", + " 800020\n", + " ]\n", + " },\n", + " \"preview\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/L2A_PVI.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"overview\"\n", + " ],\n", + " \"title\": \"True color preview\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B04\",\n", + " \"common_name\": \"red\",\n", + " \"center_wavelength\": 0.665,\n", + " \"full_width_half_max\": 0.038\n", + " },\n", + " {\n", + " \"name\": \"B03\",\n", + " \"common_name\": \"green\",\n", + " \"center_wavelength\": 0.56,\n", + " \"full_width_half_max\": 0.045\n", + " },\n", + " {\n", + " \"name\": \"B02\",\n", + " \"common_name\": \"blue\",\n", + " \"center_wavelength\": 0.49,\n", + " \"full_width_half_max\": 0.098\n", + " }\n", + " ],\n", + " \"file:size\": 4728,\n", + " \"file:checksum\": \"12208baf394b6c39139ff869369f0b4bb2ab8189d53ed6a718690d4ebf8fc57cc526\"\n", + " },\n", + " \"rededge1\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B05.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Red Edge 1 - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B05\",\n", + " \"common_name\": \"rededge\",\n", + " \"center_wavelength\": 0.704,\n", + " \"full_width_half_max\": 0.019\n", + " }\n", + " ],\n", + " \"file:size\": 319661,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220e36385e16d9117946b3c89266353c4f02459aef6489d447780ab391cf27e0a55\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 800020\n", + " ]\n", + " },\n", + " \"rededge2\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B06.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Red Edge 2 - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B06\",\n", + " \"common_name\": \"rededge\",\n", + " \"center_wavelength\": 0.74,\n", + " \"full_width_half_max\": 0.018\n", + " }\n", + " ],\n", + " \"file:size\": 320120,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"12208810f6ea7a551e6cbefa9f1868085b9564d41b8303d5cdb4a4a3d12bb1549a7b\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 800020\n", + " ]\n", + " },\n", + " \"rededge3\": {\n", + " \"gsd\": 20,\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/B07.tif\",\n", + " \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\",\n", + " \"roles\": [\n", + " \"data\",\n", + " \"reflectance\"\n", + " ],\n", + " \"title\": \"Red Edge 3 - 20m\",\n", + " \"eo:bands\": [\n", + " {\n", + " \"name\": \"B07\",\n", + " \"common_name\": \"rededge\",\n", + " \"center_wavelength\": 0.783,\n", + " \"full_width_half_max\": 0.028\n", + " }\n", + " ],\n", + " \"file:size\": 319859,\n", + " \"proj:shape\": [\n", + " 5490,\n", + " 5490\n", + " ],\n", + " \"raster:bands\": [\n", + " {\n", + " \"scale\": 0.0001,\n", + " \"nodata\": 0,\n", + " \"offset\": -0.1,\n", + " \"data_type\": \"uint16\",\n", + " \"spatial_resolution\": 20\n", + " }\n", + " ],\n", + " \"file:checksum\": \"1220e25efa4a7007f9161c25f8bc767cdb6e1d237a7c1f648ea0afded714c326f7fa\",\n", + " \"proj:transform\": [\n", + " 20,\n", + " 0,\n", + " 499980,\n", + " 0,\n", + " -20,\n", + " 800020\n", + " ]\n", + " },\n", + " \"thumbnail\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/L2A_PVI.jpg\",\n", + " \"type\": \"image/jpeg\",\n", + " \"roles\": [\n", + " \"thumbnail\"\n", + " ],\n", + " \"title\": \"Thumbnail of preview image\",\n", + " \"file:size\": 2919,\n", + " \"file:checksum\": \"122098b8cedb52c6653bd3af9dd9ca1030b0e0c7d9333fe9cb20f82df266d15a5704\"\n", + " },\n", + " \"granule_metadata\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/metadata.xml\",\n", + " \"type\": \"application/xml\",\n", + " \"roles\": [\n", + " \"metadata\"\n", + " ],\n", + " \"file:size\": 100326,\n", + " \"file:checksum\": \"1220eb0b5891af76377240867bc7acb8be589ab533db9749348a1d1b6f51ea15a5da\"\n", + " },\n", + " \"product_metadata\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/product_metadata.xml\",\n", + " \"type\": \"application/xml\",\n", + " \"roles\": [\n", + " \"metadata\"\n", + " ],\n", + " \"file:size\": 54454,\n", + " \"file:checksum\": \"122046d99e0679f5615bde4c82bbc8e501ccffd2f58c98e2e814f6159a5603843e01\"\n", + " },\n", + " \"tileinfo_metadata\": {\n", + " \"href\": \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/42/C/WN/2025/1/S2B_T42CWN_20250129T232126_L2A/tileInfo.json\",\n", + " \"type\": \"application/json\",\n", + " \"roles\": [\n", + " \"metadata\"\n", + " ],\n", + " \"file:size\": 1567,\n", + " \"file:checksum\": \"12201050d1b5306817aae5dbf90388de067253fec2342e29847f7d9e7debf7ba2cee\"\n", + " }\n", + " },\n", + " \"geometry\": {\n", + " \"type\": \"Polygon\",\n", + " \"coordinates\": [\n", + " [\n", + " [\n", + " 75.34511242157045,\n", + " -82.82696622572307\n", + " ],\n", + " [\n", + " 76.06609450832383,\n", + " -82.82913498215767\n", + " ],\n", + " [\n", + " 76.09208230786994,\n", + " -82.8014501300728\n", + " ],\n", + " [\n", + " 74.40161757155647,\n", + " -82.82206660762367\n", + " ],\n", + " [\n", + " 75.34511242157045,\n", + " -82.82696622572307\n", + " ]\n", + " ]\n", + " ]\n", + " },\n", + " \"collection\": \"super-mouse-3144-sentinel-2-c1-l2a\",\n", + " \"properties\": {\n", + " \"created\": \"2025-01-30T00:47:19.713Z\",\n", + " \"updated\": \"2025-01-30T00:47:19.713Z\",\n", + " \"datetime\": \"2025-01-29T23:21:30.814000Z\",\n", + " \"platform\": \"sentinel-2b\",\n", + " \"grid:code\": \"MGRS-42CWN\",\n", + " \"proj:code\": \"EPSG:32742\",\n", + " \"s2:tile_id\": \"S2B_OPER_MSI_L2A_TL_2BPS_20250129T235902_A041268_T42CWN_N05.11\",\n", + " \"instruments\": [\n", + " \"msi\"\n", + " ],\n", + " \"view:azimuth\": 9.509084113642079,\n", + " \"constellation\": \"sentinel-2\",\n", + " \"mgrs:utm_zone\": 42,\n", + " \"proj:centroid\": {\n", + " \"lat\": -82.81782,\n", + " \"lon\": 75.51218\n", + " },\n", + " \"eo:cloud_cover\": 0,\n", + " \"s2:datatake_id\": \"GS2B_20250129T232129_041268_N05.11\",\n", + " \"s2:product_uri\": \"S2B_MSIL2A_20250129T232129_N0511_R058_T42CWN_20250129T235902.SAFE\",\n", + " \"storage:region\": \"us-west-2\",\n", + " \"s2:datastrip_id\": \"S2B_OPER_MSI_L2A_DS_2BPS_20250129T235902_S20250129T232126_N05.11\",\n", + " \"s2:product_type\": \"S2MSI2A\",\n", + " \"mgrs:grid_square\": \"WN\",\n", + " \"s2:datatake_type\": \"INS-NOBS\",\n", + " \"storage:platform\": \"AWS\",\n", + " \"view:sun_azimuth\": 121.297984565818,\n", + " \"mgrs:latitude_band\": \"C\",\n", + " \"s2:generation_time\": \"2025-01-29T23:59:02.000000Z\",\n", + " \"view:sun_elevation\": 14.264799050438398,\n", + " \"processing:software\": {\n", + " \"sentinel-2-c1-l2a-to-stac\": \"v2024.02.01\"\n", + " },\n", + " \"s2:water_percentage\": 0,\n", + " \"view:incidence_angle\": 11.886886391067208,\n", + " \"earthsearch:payload_id\": \"roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/ade38bf372145bb11c132565da8879da\",\n", + " \"s2:processing_baseline\": \"05.11\",\n", + " \"s2:snow_ice_percentage\": 100,\n", + " \"storage:requester_pays\": false,\n", + " \"s2:vegetation_percentage\": 0,\n", + " \"s2:thin_cirrus_percentage\": 0,\n", + " \"s2:cloud_shadow_percentage\": 0,\n", + " \"s2:nodata_pixel_percentage\": 99.621159,\n", + " \"s2:unclassified_percentage\": 0,\n", + " \"s2:not_vegetated_percentage\": 0,\n", + " \"s2:degraded_msi_data_percentage\": 0,\n", + " \"s2:high_proba_clouds_percentage\": 0,\n", + " \"s2:reflectance_conversion_factor\": 1.0316374930781,\n", + " \"s2:medium_proba_clouds_percentage\": 0,\n", + " \"s2:saturated_defective_pixel_percentage\": 0,\n", + " \"auth:schemes\": {\n", + " \"oidc\": {\n", + " \"type\": \"openIdConnect\",\n", + " \"openIdConnectUrl\": \"http://localhost:8085/.well-known/openid-configuration\"\n", + " }\n", + " }\n", + " },\n", + " \"stac_version\": \"1.1.0\",\n", + " \"stac_extensions\": [\n", + " \"https://stac-extensions.github.io/eo/v1.1.0/schema.json\",\n", + " \"https://stac-extensions.github.io/file/v2.1.0/schema.json\",\n", + " \"https://stac-extensions.github.io/grid/v1.1.0/schema.json\",\n", + " \"https://stac-extensions.github.io/mgrs/v1.0.0/schema.json\",\n", + " \"https://stac-extensions.github.io/processing/v1.1.0/schema.json\",\n", + " \"https://stac-extensions.github.io/projection/v2.0.0/schema.json\",\n", + " \"https://stac-extensions.github.io/raster/v1.1.0/schema.json\",\n", + " \"https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json\",\n", + " \"https://stac-extensions.github.io/storage/v1.0.0/schema.json\",\n", + " \"https://stac-extensions.github.io/view/v1.0.0/schema.json\",\n", + " \"https://stac-extensions.github.io/authentication/v1.1.0/schema.json\"\n", + " ]\n", + "}\n" + ] + } + ], + "source": [ + "item_id = response[\"features\"][0][\"id\"]\n", + "item_request = httpx.get(\n", + " f\"{stac_api_endpoint}/collections/{my_collection.id}/items/{item_id}\"\n", + ")\n", + "print(json.dumps(item_request.json(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "13efb26d-e63e-45ed-ab55-5af00e77fbeb", + "metadata": {}, + "source": [ + "`pystac-client` can do the same thing" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "ba409044-3f40-4d53-9256-f21aaa4b9da0", + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "metadata": {}, - "source": [ - "api_docs = f\"{local_stac_api_endpoint}/api.html\"\n", - "print(api_docs)\n", - "IFrame(api_docs, 1200, 800)" + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "
\n", + "
\n", + " <Item id=S2B_T42CWN_20250129T232126_L2A>\n", + "
\n", + "\n", + "
" ], - "execution_count": null, - "outputs": [], - "id": "5972eaaf-d6b3-4bcf-b2fd-f7d451100581" - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.11" + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" } + ], + "source": [ + "collection_client = client.get_collection(my_collection.id)\n", + "\n", + "collection_client.get_item(item_id)" + ] + }, + { + "cell_type": "markdown", + "id": "7795389e-2007-4e79-b1ef-a788ac259694", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "That's it! You have taken a full tour of the stac-fastapi-pgstac STAC API. Here is a look at the full API documentation for the deployed API:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5972eaaf-d6b3-4bcf-b2fd-f7d451100581", + "metadata": {}, + "outputs": [], + "source": [ + "api_docs = f\"{local_stac_api_endpoint}/api.html\"\n", + "print(api_docs)\n", + "IFrame(api_docs, 1200, 800)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/04-titiler_pgstac.ipynb b/docs/04-titiler_pgstac.ipynb index 5bcb3cf..2c92037 100644 --- a/docs/04-titiler_pgstac.ipynb +++ b/docs/04-titiler_pgstac.ipynb @@ -89,9 +89,9 @@ "titiler_pgstac_endpoint = os.getenv(\"TITILER_PGSTAC_API_ENDPOINT\")\n", "# browser-facing URL for the IFrame/map cells (the user's browser can't reach\n", "# the server-side endpoint above when running on Kubernetes or docker-compose)\n", - "titiler_browser_endpoint = os.getenv(\"TITILER_BROWSER_URL\") or titiler_pgstac_endpoint.replace(\n", - " \"titiler-pgstac\", \"localhost\"\n", - ")\n", + "titiler_browser_endpoint = os.getenv(\n", + " \"TITILER_BROWSER_URL\"\n", + ") or titiler_pgstac_endpoint.replace(\"titiler-pgstac\", \"localhost\")\n", "api_docs = f\"{titiler_browser_endpoint}/api.html\"\n", "print(api_docs)\n", "\n", diff --git a/docs/05-tipg.ipynb b/docs/05-tipg.ipynb index 7dbcd14..b3b9b90 100644 --- a/docs/05-tipg.ipynb +++ b/docs/05-tipg.ipynb @@ -62,7 +62,9 @@ "tipg_endpoint = os.getenv(\"TIPG_API_ENDPOINT\")\n", "# browser-facing URL for the IFrame/viewer cells (the user's browser can't\n", "# reach the server-side endpoint above when running on Kubernetes)\n", - "tipg_browser_endpoint = os.getenv(\"TIPG_BROWSER_URL\") or tipg_endpoint.replace(\"tipg\", \"localhost\")\n", + "tipg_browser_endpoint = os.getenv(\"TIPG_BROWSER_URL\") or tipg_endpoint.replace(\n", + " \"tipg\", \"localhost\"\n", + ")\n", "\n", "collections_request = httpx.get(f\"{tipg_endpoint}/collections\")\n", "\n", diff --git a/docs/06-stac_transactions_auth.ipynb b/docs/06-stac_transactions_auth.ipynb index f0e4dc9..f2e6ee3 100644 --- a/docs/06-stac_transactions_auth.ipynb +++ b/docs/06-stac_transactions_auth.ipynb @@ -32,7 +32,7 @@ "source": [ "## 6.1 Get an access token\n", "\n", - "To write to the API you need to prove who you are. The stack runs a small [mock OIDC server](https://github.com/alukach/mock-oidc-server) that stands in for a real identity provider (like Auth0, Keycloak, or Cognito). You ask it for a token and it hands one back \u2014 no password required, since it is only for local testing.\n", + "To write to the API you need to prove who you are. The stack runs a small [mock OIDC server](https://github.com/alukach/mock-oidc-server) that stands in for a real identity provider (like Auth0, Keycloak, or Cognito). You ask it for a token and it hands one back — no password required, since it is only for local testing.\n", "\n", "The `stac_auth` helper module wraps that exchange so the notebook stays focused on STAC:\n", "\n", @@ -95,7 +95,7 @@ "source": [ "## 6.2 Confirm the transactions extension is enabled\n", "\n", - "The transactions endpoints only exist if the API was deployed with the extension turned on. As with any STAC capability, you can check the `/conformance` response before relying on it \u2014 look for conformance classes containing `transaction`.\n", + "The transactions endpoints only exist if the API was deployed with the extension turned on. As with any STAC capability, you can check the `/conformance` response before relying on it — look for conformance classes containing `transaction`.\n", "\n", "
\n", "Warning: Never enable the transactions extension on a public API without an auth layer. Doing so lets anyone write to your catalog. That is exactly why this deployment sits behind stac-auth-proxy.\n", @@ -130,8 +130,8 @@ "\n", "We `POST` the same collection twice:\n", "\n", - "1. **Without a token** \u2014 the proxy rejects it with `401`/`403`\n", - "2. **With our bearer token** \u2014 the write succeeds with `201`\n", + "1. **Without a token** — the proxy rejects it with `401`/`403`\n", + "2. **With our bearer token** — the write succeeds with `201`\n", "\n", "Then we `GET` the collection back with no token, confirming reads stay public." ] @@ -256,7 +256,9 @@ "updated_item = httpx.put(item_url, headers=write_headers, json=stored_item, timeout=10)\n", "print(f\"PUT item with token -> {updated_item.status_code} (updated)\")\n", "assert updated_item.status_code == 200, updated_item.text\n", - "assert updated_item.json()[\"properties\"][\"description\"] == \"Updated by authenticated PUT\"" + "assert (\n", + " updated_item.json()[\"properties\"][\"description\"] == \"Updated by authenticated PUT\"\n", + ")" ] }, { @@ -298,7 +300,7 @@ "\n", "Finally, delete the temporary collection so we leave the catalog as we found it. Deleting a collection is a write too, so it also needs the token.\n", "\n", - "You have now exercised the full transaction life cycle \u2014 create, read, update, delete \u2014 and seen the auth proxy enforce the read/write boundary at every step." + "You have now exercised the full transaction life cycle — create, read, update, delete — and seen the auth proxy enforce the read/write boundary at every step." ] }, { @@ -311,7 +313,9 @@ "collection_url = f\"{stac_api_endpoint}/collections/{collection_id}\"\n", "\n", "denied_collection_delete = httpx.delete(collection_url, timeout=10)\n", - "print(f\"DELETE collection without token -> {denied_collection_delete.status_code} (rejected)\")\n", + "print(\n", + " f\"DELETE collection without token -> {denied_collection_delete.status_code} (rejected)\"\n", + ")\n", "assert denied_collection_delete.status_code in (401, 403)\n", "\n", "deleted_collection = httpx.delete(collection_url, headers=write_headers, timeout=10)\n", diff --git a/docs/stac_auth.py b/docs/stac_auth.py index eee7c70..27be225 100644 --- a/docs/stac_auth.py +++ b/docs/stac_auth.py @@ -13,9 +13,7 @@ import httpx -_TOKEN_PATTERN = re.compile( - r']*id="token"[^>]*>(.*?)', re.S -) +_TOKEN_PATTERN = re.compile(r']*id="token"[^>]*>(.*?)', re.S) def stac_endpoint() -> str:
\n", - "Tip: Try out the CQL2 Playground to learn how to write cql2-text or cql2-json queries\n", - "