Skip to content

Commit f23f081

Browse files
authored
Merge pull request #22 from PEM-Humboldt/adjustmentAuthInCommands
Adjustment auth in commands
2 parents 4958cc3 + 320ee02 commit f23f081

File tree

8 files changed

+191
-42
lines changed

8 files changed

+191
-42
lines changed

README.md

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,16 @@ Este paquete corresponde a la herramienta para cargar, editar y eliminar colecci
3333

3434
## Configuración
3535

36-
Antes de usar la herramienta segurese de realizar lo siguiente:
36+
Antes de usar la herramienta asegurese de realizar lo siguiente:
3737

3838
1. Crear un archivo .env réplica de env.sample y actualizar los valores de la variables existentes.
3939
```
4040
STAC_URL="" # URL del servidor del STAC
4141
ABS_STRING="" # Cadena de conexión a Azure Blob Storage
4242
ABS_CONTAINER="" # Nombre del contenedor en Azure Blob Storage
43+
AUTH_URL="" # Path de la ruta de la url para autenticar, la cual seria "/auth/token"
44+
USERNAME_AUTH:"" # Nombre de usuario para autenticación.
45+
PASSWORD_AUTH:"" # Contraseña para autenticación.
4346
```
4447
(Es posible que la variable de STAC_URL no reconozca la ruta: "localhost:8082", entonces se recomienda agregar la siguiente:STAC_URL="http://localhost:8082")
4548

@@ -64,42 +67,86 @@ Para crear una colección siga los siguientes pasos:
6467

6568
# Instrucciones de Uso
6669

70+
## Autenticación Configurada en Variables de Ambiente
71+
72+
La autenticación se realiza automáticamente utilizando las credenciales definidas en las variables de ambiente.
73+
74+
---
75+
6776
## Cargar una Colección
6877

6978
Para cargar una colección de capas, ejecuta el siguiente comando:
7079

7180
```
72-
python src/main.py create -f folder_name [-c collection_name] [-o]
81+
python src/main.py create -f folder_name [-c collection_name]
7382
```
7483

7584
### Parámetros:
7685
- `-f, --folder` (obligatorio): Directorio con el archivo collection.json y las capas.
77-
- `-c, --collection` (opcional): Nombre de la colección. Si no se proporciona, se tomará el id del archivo collection.json.
86+
- `-c, --collection` (opcional): Nombre de la colección. Si no se proporciona, se tomará el `id` del archivo collection.json.
7887

7988
### Ejemplo:
8089

81-
* Especificando un nombre de colección
90+
* Especificando un nombre de colección:
8291
```
8392
python src/main.py create -f my_folder -c MyCollection
8493
8594
o
8695
8796
python src/main.py create --folder my_folder --collection MyCollection
88-
8997
```
9098

91-
Este comando creará la colección `MyCollection` a partir de los archivos en el directorio `input/my_folder`
92-
93-
* Usando el id del archivo collection.json:
99+
Este comando creará la colección `MyCollection` a partir de los archivos en el directorio `input/my_folder`.
94100

101+
* Usando el `id` del archivo collection.json:
95102
```
96103
python src/main.py create -f my_folder
97104
98105
o
99106
100107
python src/main.py create --folder my_folder
108+
```
109+
---
110+
## Sobrescribir una Colección Existente
111+
112+
Para sobrescribir una colección existente, ejecuta el siguiente comando:
113+
114+
python src/main.py create -f folder_name [-c collection_name] [-o]
115+
116+
117+
### Parámetros:
118+
- `-f, --folder` (obligatorio): Directorio con el archivo `collection.json` y las capas.
119+
- `-c, --collection` (opcional): Nombre de la colección. Si no se proporciona, se tomará el `id` del archivo `collection.json`.
120+
- `-o, --overwrite` (obligatorio): Permite sobrescribir una colección existente si ya existe. Si no se proporciona, la colección no será sobrescrita.
121+
122+
### Ejemplo:
123+
124+
* Sobrescribiendo una colección existente:
125+
126+
```
127+
python src/main.py create -f my_folder -o
101128
129+
o
130+
131+
python src/main.py create --folder my_folder --overwrite
132+
```
133+
134+
135+
Este comando sobrescribirá la colección existente (si ya existe) usando los archivos en el directorio `input/my_folder`.
136+
137+
* Especificando un nombre de colección para sobrescribir:
138+
139+
```
140+
python src/main.py create -f my_folder -c MyCollection -o
141+
142+
o
143+
144+
python src/main.py create --folder my_folder --collection MyCollection --overwrite
102145
```
146+
147+
148+
Este comando sobrescribirá la colección `MyCollection` si ya existe, usando los archivos en el directorio `input/my_folder`.
149+
103150
---
104151

105152
## Validar una Colección
@@ -112,17 +159,15 @@ python src/main.py validate -f folder_name [-c collection_name]
112159

113160
### Parámetros:
114161
- `-f, --folder` (obligatorio): Directorio que contiene los archivos de la colección.
115-
- `-c, --collection` (opcional): Nombre de la colección para validar. Si no se proporciona, se tomará el id del archivo collection.json.
162+
- `-c, --collection` (opcional): Nombre de la colección para validar. Si no se proporciona, se tomará el `id` del archivo collection.json.
116163

117164
### Ejemplo:
118-
119165
```
120166
python src/main.py validate -f my_folder
121167
122168
o
123169
124170
python src/main.py validate --folder my_folder
125-
126171
```
127172

128173
Este comando validará los archivos de la colección en el directorio `input/my_folder` sin cargarlos.
@@ -138,18 +183,15 @@ python src/main.py remove --collection collection_name
138183
```
139184

140185
### Parámetros:
141-
142186
- `-c, --collection` (obligatorio): Nombre de la colección a eliminar.
143187

144188
### Ejemplo:
145-
146189
```
147190
python src/main.py remove -c my_collection
148191
149192
o
150193
151194
python src/main.py remove --collection my_collection
152-
153195
```
154196

155197
Este comando eliminará la colección `my_collection` del sistema.
@@ -168,7 +210,6 @@ Para hacer formateo de estilos automático se utiliza el paquete black. Al ejecu
168210

169211
```
170212
black src
171-
172213
```
173214

174215
## Documentación

env.sample

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
STAC_URL=""
22
ABS_STRING=""
33
ABS_CONTAINER=""
4+
AUTH_URL=""
5+
USERNAME_AUTH=""
6+
PASSWORD_AUTH=""

src/collection.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,7 @@ def create_collection(self, collection_name, collection_data):
9595
extent=pystac.Extent(
9696
spatial=spatial_extent, temporal=temporal_extent
9797
),
98-
extra_fields={
99-
"metadata": collection_data["metadata"]
100-
},
98+
extra_fields={"metadata": collection_data["metadata"]},
10199
)
102100

103101
self.stac_collection.validate()
@@ -156,13 +154,13 @@ def remove_collection(self, collection_name=None):
156154
logger.info(f"Attempting to remove collection {collection_id}")
157155

158156
try:
159-
items_collection = stac_rest.get(f"{collection_url}/items").json()
160-
for item in items_collection["features"]:
157+
items_response = stac_rest.get(f"{collection_url}/items")
158+
items = items_response.json().get("features", [])
159+
160+
for item in items:
161161
for asset_key, asset_value in item["assets"].items():
162162
url = asset_value["href"]
163-
logger.info(
164-
f"Deleting file: {url} from Azure Blob Storage"
165-
)
163+
logger.info(f"Deleting file {url} from Azure Blob Storage")
166164
self.storage.remove_file(url)
167165

168166
stac_rest.delete(collection_url)
@@ -201,6 +199,7 @@ def upload_collection(self):
201199
logger.info(
202200
f"Item upload response: {item_response.status_code}"
203201
)
202+
204203
except Exception as e:
205204
logger.error(f"Error uploading collection: {e}")
206205
raise RuntimeError(f"Error uploading collection: {e}")

src/config.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,16 @@ class Settings(BaseSettings):
66
stac_url: str = "http://localhost:8082"
77
abs_string: str = ""
88
abs_container: str = "cog-test"
9+
auth_url: str = "/auth/token"
10+
username_auth: str = "admin"
11+
password_auth: str = "admin"
12+
token: str = ""
913

1014
model_config = SettingsConfigDict(env_file=".env")
1115

16+
def set_token(self, token: str):
17+
self.token = token
18+
1219

1320
@lru_cache
1421
def get_settings():

src/main.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from utils.logging_config import logger
44
from utils import spec
5+
from utils.auth import authenticate
56
from collection import Collection
67
from json import load
78
from sys import exit as sysexit
@@ -28,12 +29,8 @@ def create_collection_local(collection, input_folder, collection_name):
2829

2930

3031
def main():
31-
"""
32-
Read arguments and start data validation.
33-
"""
34-
35-
parser = ArgumentParser()
36-
sub_parsers = parser.add_subparsers(dest="command")
32+
parser = ArgumentParser(description="STAC Collection Manager")
33+
sub_parsers = parser.add_subparsers(dest="command", help="Commands")
3734

3835
create_parser = sub_parsers.add_parser(
3936
"create", help="Create a new collection"
@@ -92,38 +89,37 @@ def main():
9289

9390
args = parser.parse_args()
9491

92+
authenticate()
93+
collection = Collection()
94+
9595
if args.command == "create":
96-
collection = Collection()
9796
input_folder = f"input/{args.folder}"
9897
create_collection_local(collection, input_folder, args.collection)
9998

10099
if collection.check_collection(args.overwrite):
101100
collection.remove_collection()
102-
sysexit("Previous collection removed successfully.")
101+
logger.info("Previous collection removed.")
103102

104103
output_dir = f"{getcwd()}/output/{args.folder}"
105104
collection.convert_layers(input_folder, output_dir)
106105
logger.info("Layers converted successfully.")
107106

108107
collection.upload_layers(output_dir)
109108
logger.info("Layers uploaded successfully.")
110-
111109
collection.upload_collection()
112110
logger.info("Collection uploaded successfully.")
113111

114112
sysexit("Process completed successfully.")
115113

116114
elif args.command == "validate":
117-
collection = Collection()
118115
create_collection_local(
119116
collection, f"input/{args.folder}", args.collection
120117
)
121118
sysexit("Validation successful.")
122119

123120
elif args.command == "remove":
124-
collection = Collection()
125121
collection.remove_collection(args.collection)
126-
sysexit("Collection successfully removed.")
122+
sysexit("Collection removed successfully.")
127123

128124
else:
129125
sysexit("No command used. Type -h for help")

src/utils/auth.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import requests
2+
from utils.logging_config import logger
3+
from sys import exit as sysexit
4+
from config import get_settings
5+
6+
from utils.url import build_url
7+
8+
9+
settings = get_settings()
10+
11+
12+
def authenticate():
13+
"""
14+
Authenticate against the authentication service and retrieve a token.
15+
"""
16+
try:
17+
username = settings.username_auth
18+
password = settings.password_auth
19+
stac_url = settings.stac_url
20+
auth_url = settings.auth_url
21+
22+
auth_data = {"username": username, "password": password}
23+
24+
url = build_url(stac_url, auth_url, args_dict={})
25+
response = requests.post(url, data=auth_data)
26+
response.raise_for_status()
27+
28+
new_token = response.json().get("access_token")
29+
30+
if new_token:
31+
settings.set_token(new_token)
32+
logger.info("Token updated successfully.")
33+
else:
34+
logger.error("Authentication failed: No token received.")
35+
sysexit("Authentication failed: No token received.")
36+
37+
except requests.HTTPError as http_err:
38+
error_detail = None
39+
40+
status_code = (
41+
response.status_code if response is not None else "Unknown"
42+
)
43+
44+
if (
45+
response is not None
46+
and response.headers.get("Content-Type") == "application/json"
47+
):
48+
try:
49+
error_response = response.json()
50+
error_detail = error_response.get("description", str(http_err))
51+
52+
except ValueError:
53+
error_detail = str(http_err)
54+
55+
error_message = f"HTTP {status_code}: {error_detail or str(http_err)}"
56+
sysexit(f"Authentication error: {error_message}")
57+
58+
except requests.RequestException as req_err:
59+
sysexit(f"Request error: {req_err}")

0 commit comments

Comments
 (0)