Skip to content

Commit b210a79

Browse files
authored
Merge pull request #491 from unity-sds/develop
release/9.4.1
2 parents 9d8a822 + 8c4537f commit b210a79

File tree

11 files changed

+122
-83
lines changed

11 files changed

+122
-83
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [9.4.1] - 2024-12-18
9+
### Fixed
10+
- [#489](https://github.com/unity-sds/unity-data-services/pull/489) fix: delete bug
11+
812
## [9.4.0] - 2024-12-16
913
### Changed
1014
- [#485](https://github.com/unity-sds/unity-data-services/pull/485) feat: delete granule endpoint

ci.cd/Makefile

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +0,0 @@
1-
export IMAGE_PREFIX ?= cae-artifactory.jpl.nasa.gov:16001/gov/nasa/jpl/unity
2-
export NAME ?= uds
3-
export VERSION ?= latest
4-
5-
6-
all: build_lambda upload_lambda update_lambda_function build_docker
7-
local: build_lambda upload_lambda
8-
build_docker:
9-
docker build --no-cache -t "$(IMAGE_PREFIX)/$(NAME):$(VERSION)" -f docker/Dockerfile_download_granules.jpl .
10-
11-
zip_docker:
12-
docker save "$(IMAGE_PREFIX)/$(NAME):$(VERSION)" | gzip > "$(NAME)__$(VERSION).tar.gz"
13-
14-
build_lambda:
15-
docker run --rm -v `PWD`:"/usr/src/app/cumulus_lambda_functions":z -w "/usr/src/app/cumulus_lambda_functions" cae-artifactory.jpl.nasa.gov:17001/python:3.9 ci.cd/create_s3_zip.sh
16-
17-
build_lambda_public:
18-
docker run --rm -v `PWD`:"/usr/src/app/cumulus_lambda_functions":z -w "/usr/src/app/cumulus_lambda_functions" python:3.9 ci.cd/create_s3_zip.sh
19-
20-
upload_lambda:
21-
aws --profile saml-pub s3 cp cumulus_lambda_functions_deployment.zip s3://am-uds-dev-cumulus-tf-state/unity_cumulus_lambda/
22-
23-
move:
24-
mv /Users/wphyo/Downloads/cumulus_lambda_functions-*.zip tf-module/unity-cumulus/build/cumulus_lambda_functions_deployment.zip
25-
26-
upload_lambda_mcp_dev:
27-
aws s3 cp tf-module/unity-cumulus/build/cumulus_lambda_functions_deployment.zip s3://uds-dev-cumulus-public/unity_cumulus_lambda/
28-
update_lambda_function_mcp_dev_6:
29-
aws lambda update-function-code --s3-key unity_cumulus_lambda/cumulus_lambda_functions_deployment.zip --s3-bucket uds-dev-cumulus-public --function-name arn:aws:lambda:us-west-2:237868187491:function:uds-dev-cumulus-metadata_s4pa_generate_cmr --publish &>/dev/null
30-
update_lambda_function_mcp_dev_7:
31-
aws lambda update-function-code --s3-key unity_cumulus_lambda/cumulus_lambda_functions_deployment.zip --s3-bucket uds-dev-cumulus-public --function-name arn:aws:lambda:us-west-2:237868187491:function:uds-dev-cumulus-metadata_stac_generate_cmr --publish &>/dev/null
32-
update_lambda_function_mcp_dev_auth_list:
33-
aws lambda update-function-code --s3-key unity_cumulus_lambda/cumulus_lambda_functions_deployment.zip --s3-bucket uds-dev-cumulus-public --function-name arn:aws:lambda:us-west-2:237868187491:function:uds-dev-cumulus-cumulus_auth_list --publish &>/dev/null
34-
update_lambda_function_mcp_dev_auth_add:
35-
aws lambda update-function-code --s3-key unity_cumulus_lambda/cumulus_lambda_functions_deployment.zip --s3-bucket uds-dev-cumulus-public --function-name arn:aws:lambda:us-west-2:237868187491:function:uds-dev-cumulus-cumulus_auth_add --publish &>/dev/null
36-
update_lambda_function_mcp_dev_auth_delete:
37-
aws lambda update-function-code --s3-key unity_cumulus_lambda/cumulus_lambda_functions_deployment.zip --s3-bucket uds-dev-cumulus-public --function-name arn:aws:lambda:us-west-2:237868187491:function:uds-dev-cumulus-cumulus_auth_delete --publish &>/dev/null
38-
39-
update_lambda_function_mcp_dev_uds_api:
40-
aws lambda update-function-code --s3-key unity_cumulus_lambda/cumulus_lambda_functions_deployment.zip --s3-bucket uds-dev-cumulus-public --function-name arn:aws:lambda:us-west-2:237868187491:function:uds-dev-cumulus-uds_api_1 --publish &>/dev/null
41-
42-
update_lambda_function_mcp_sbx_uds_api:
43-
aws lambda update-function-code --s3-key unity_cumulus_lambda/cumulus_lambda_functions_deployment.zip --s3-bucket uds-dev-cumulus-public --function-name arn:aws:lambda:us-west-2:237868187491:function:uds-sbx-cumulus-uds_api_1 --publish &>/dev/null
44-
45-
mcp_dev: upload_lambda_mcp_dev update_lambda_function_mcp_dev_auth_list update_lambda_function_mcp_dev_auth_add update_lambda_function_mcp_dev_auth_delete
46-
47-
mcp_dev_fastapi: upload_lambda_mcp_dev update_lambda_function_mcp_dev_uds_api
48-
49-
update_lambda_function_mcp_sbx_7:
50-
aws lambda update-function-code --s3-key unity_cumulus_lambda/cumulus_lambda_functions_deployment.zip --s3-bucket uds-dev-cumulus-public --function-name arn:aws:lambda:us-west-2:237868187491:function:uds-sbx-cumulus-metadata_stac_generate_cmr --publish &>/dev/null
51-
52-
update_lambda_function_mcp_sbx_8:
53-
aws lambda update-function-code --s3-key unity_cumulus_lambda/cumulus_lambda_functions_deployment.zip --s3-bucket uds-dev-cumulus-public --function-name arn:aws:lambda:us-west-2:237868187491:function:uds-sbx-cumulus-granules_to_es --publish &>/dev/null
54-
55-
56-
update_lambda_function_uds-sbx-cumulus-granules_cnm_response_writer:
57-
aws lambda update-function-code --s3-key unity_cumulus_lambda/cumulus_lambda_functions_deployment.zip --s3-bucket uds-dev-cumulus-public --function-name arn:aws:lambda:us-west-2:237868187491:function:uds-sbx-cumulus-granules_cnm_response_writer --publish &>/dev/null
58-
59-
update_lambda_function_mcp_sbx_ingester:
60-
aws lambda update-function-code --s3-key unity_cumulus_lambda/cumulus_lambda_functions_deployment.zip --s3-bucket uds-dev-cumulus-public --function-name arn:aws:lambda:us-west-2:237868187491:function:uds-sbx-cumulus-granules_cnm_ingester --publish &>/dev/null
61-
62-
mcp_sbx: upload_lambda_mcp_dev update_lambda_function_mcp_sbx_7 update_lambda_function_mcp_sbx_8
63-
64-
mcp_sbx_fastapi: upload_lambda_mcp_dev update_lambda_function_mcp_sbx_uds_api

cumulus_lambda_functions/cumulus_wrapper/query_granules.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,14 @@ def delete_entry(self, private_api_prefix: str, granule_id: str):
150150
"""
151151
{'statusCode': 200, 'body': '{"meta":{"name":"cumulus-api","stack":"am-uds-dev-cumulus","table":"granule","limit":3,"page":1,"count":0},"results":[]}', 'headers': {'x-powered-by': 'Express', 'access-control-allow-origin': '*', 'strict-transport-security': 'max-age=31536000; includeSubDomains', 'content-type': 'application/json; charset=utf-8', 'content-length': '120', 'etag': 'W/"78-YdHqDNIH4LuOJMR39jGNA/23yOQ"', 'date': 'Tue, 07 Jun 2022 22:30:44 GMT', 'connection': 'close'}, 'isBase64Encoded': False}
152152
"""
153+
LOGGER.debug(f'json query_result: {query_result}')
153154
if query_result['statusCode'] >= 500:
154-
LOGGER.error(f'server error status code: {query_result.statusCode}. details: {query_result}')
155+
LOGGER.error(f'server error status code: {query_result["statusCode"]}. details: {query_result}')
155156
return {'server_error': query_result}
156157
if query_result['statusCode'] >= 400:
157-
LOGGER.error(f'client error status code: {query_result.statusCode}. details: {query_result}')
158+
LOGGER.error(f'client error status code: {query_result["statusCode"]}. details: {query_result}')
158159
return {'client_error': query_result}
159160
query_result = json.loads(query_result['body'])
160-
LOGGER.info(f'json query_result: {query_result}')
161161
"""
162162
{
163163
"detail": "Record deleted"

cumulus_lambda_functions/granules_to_es/granules_indexer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ def start(self):
7373
result = JsonValidator(self.CUMULUS_SCHEMA).validate(incoming_msg)
7474
if result is not None:
7575
raise ValueError(f'input json has CUMULUS validation errors: {result}')
76+
if 'event' not in incoming_msg or incoming_msg['event'].upper() == 'DELETE':
77+
LOGGER.debug(f'missing event or it is DELETE event. Not inserting to ES')
78+
return
7679
self.__cumulus_record = incoming_msg['record']
7780
if len(self.__cumulus_record['files']) < 1:
7881
# TODO ingest updating stage?

cumulus_lambda_functions/lib/uds_db/granules_db_index.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,9 @@ def delete_entry(self, tenant: str, tenant_venue: str, doc_id: str, ):
210210
if result is None:
211211
raise ValueError(f"no such granule: {doc_id}")
212212
for each_granule in result['hits']['hits']:
213+
LOGGER.debug(f"deleting {each_granule['_id']} from {each_granule['_index']}")
213214
delete_result = self.__es.delete_by_query({
214-
'query': {'term': {'_id': each_granule['_id']}}
215+
'query': {'term': {'id': each_granule['_id']}}
215216
}, each_granule['_index'])
216217
LOGGER.debug(f'delete_result: {delete_result}')
217218
if delete_result is None:

cumulus_lambda_functions/uds_api/dapa/granules_dapa_query_es.py

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
import json
2+
import os
13
from copy import deepcopy
24

5+
from mdps_ds_lib.lib.aws.aws_lambda import AwsLambda
36
from pystac import Link
7+
from starlette.datastructures import URL
48

59
from cumulus_lambda_functions.daac_archiver.daac_archiver_logic import DaacArchiverLogic
610
from cumulus_lambda_functions.granules_to_es.granules_index_mapping import GranulesIndexMapping
@@ -17,6 +21,7 @@
1721

1822
class GranulesDapaQueryEs:
1923
def __init__(self, collection_id, limit, offset, input_datetime, filter_input, pagination_link_obj: PaginationLinksGenerator, base_url):
24+
self.__collection_cnm_lambda_name = os.environ.get('COLLECTION_CREATION_LAMBDA_NAME', '').strip()
2025
self.__pagination_link_obj = pagination_link_obj
2126
self.__input_datetime = input_datetime
2227
self.__collection_id = collection_id
@@ -149,6 +154,64 @@ def get_single_granule(self, granule_id):
149154
self.__restructure_each_granule_result(each_granules_query_result_stripped)
150155
return each_granules_query_result_stripped
151156

157+
def delete_facade(self, current_url: URL, bearer_token: str):
158+
actual_path = current_url.path
159+
actual_path = actual_path if actual_path.endswith('/') else f'{actual_path}/'
160+
actual_path = f'{actual_path}actual'
161+
LOGGER.info(f'sanity_check')
162+
163+
actual_event = {
164+
'resource': actual_path,
165+
'path': actual_path,
166+
'httpMethod': 'DELETE',
167+
'headers': {
168+
'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Authorization': bearer_token,
169+
'Host': current_url.hostname, 'User-Agent': 'python-requests/2.28.2',
170+
'X-Amzn-Trace-Id': 'Root=1-64a66e90-6fa8b7a64449014639d4f5b4', 'X-Forwarded-For': '44.236.15.58',
171+
'X-Forwarded-Port': '443', 'X-Forwarded-Proto': 'https'},
172+
'multiValueHeaders': {
173+
'Accept': ['*/*'], 'Accept-Encoding': ['gzip, deflate'], 'Authorization': [bearer_token],
174+
'Host': [current_url.hostname], 'User-Agent': ['python-requests/2.28.2'],
175+
'X-Amzn-Trace-Id': ['Root=1-64a66e90-6fa8b7a64449014639d4f5b4'],
176+
'X-Forwarded-For': ['127.0.0.1'], 'X-Forwarded-Port': ['443'], 'X-Forwarded-Proto': ['https']
177+
},
178+
'queryStringParameters': {},
179+
'multiValueQueryStringParameters': {},
180+
'pathParameters': {},
181+
'stageVariables': None,
182+
'requestContext': {
183+
'resourceId': '',
184+
'authorizer': {'principalId': '', 'integrationLatency': 0},
185+
'resourcePath': actual_path, 'httpMethod': 'PUT',
186+
'extendedRequestId': '', 'requestTime': '',
187+
'path': actual_path, 'accountId': '',
188+
'protocol': 'HTTP/1.1', 'stage': '', 'domainPrefix': '', 'requestTimeEpoch': 0,
189+
'requestId': '',
190+
'identity': {
191+
'cognitoIdentityPoolId': None, 'accountId': None, 'cognitoIdentityId': None, 'caller': None,
192+
'sourceIp': '127.0.0.1', 'principalOrgId': None, 'accessKey': None,
193+
'cognitoAuthenticationType': None,
194+
'cognitoAuthenticationProvider': None, 'userArn': None, 'userAgent': 'python-requests/2.28.2',
195+
'user': None
196+
},
197+
'domainName': current_url.hostname, 'apiId': ''
198+
},
199+
'body': json.dumps({}),
200+
'isBase64Encoded': False
201+
}
202+
LOGGER.info(f'actual_event: {actual_event}')
203+
response = AwsLambda().invoke_function(
204+
function_name=self.__collection_cnm_lambda_name,
205+
payload=actual_event,
206+
)
207+
LOGGER.debug(f'async function started: {response}')
208+
return {
209+
'statusCode': 202,
210+
'body': {
211+
'message': 'processing'
212+
}
213+
}
214+
152215
def start(self):
153216
try:
154217
granules_query_dsl = self.__generate_es_dsl()
@@ -164,7 +227,8 @@ def start(self):
164227
self_link = Link(rel='self', target=f'{self.__base_url}/{WebServiceConstants.COLLECTIONS}/{self.__collection_id}/items/{each_granules_query_result_stripped["id"]}', media_type='application/json', title=each_granules_query_result_stripped["id"]).to_dict(False)
165228
each_granules_query_result_stripped['links'].append(self_link)
166229
self.__restructure_each_granule_result(each_granules_query_result_stripped)
167-
pagination_link = '' if len(granules_query_result['hits']['hits']) < self.__limit else ','.join(granules_query_result['hits']['hits'][-1]['sort'])
230+
231+
pagination_link = '' if len(granules_query_result['hits']['hits']) < self.__limit else ','.join([k if isinstance(k, str) else str(k) for k in granules_query_result['hits']['hits'][-1]['sort']])
168232
return {
169233
'statusCode': 200,
170234
'body': {

cumulus_lambda_functions/uds_api/granules_api.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import json
22
import os
3+
from time import sleep
34
from typing import Union
45

5-
from mdps_ds_lib.lib.aws.aws_s3 import AwsS3
6-
from pystac import Item
6+
from starlette.responses import Response, JSONResponse
77

88
from cumulus_lambda_functions.cumulus_wrapper.query_granules import GranulesQuery
99

10-
from cumulus_lambda_functions.daac_archiver.daac_archiver_logic import DaacArchiverLogic
1110
from cumulus_lambda_functions.uds_api.dapa.daac_archive_crud import DaacArchiveCrud, DaacDeleteModel, DaacAddModel, \
1211
DaacUpdateModel
1312
from cumulus_lambda_functions.uds_api.dapa.granules_dapa_query_es import GranulesDapaQueryEs
@@ -26,7 +25,6 @@
2625

2726
from fastapi import APIRouter, HTTPException, Request
2827

29-
from cumulus_lambda_functions.uds_api.dapa.granules_dapa_query import GranulesDapaQuery
3028
from cumulus_lambda_functions.uds_api.dapa.pagination_links_generator import PaginationLinksGenerator
3129
from cumulus_lambda_functions.uds_api.web_service_constants import WebServiceConstants
3230

@@ -246,7 +244,7 @@ async def get_single_granule_dapa(request: Request, collection_id: str, granule_
246244

247245
@router.delete("/{collection_id}/items/{granule_id}")
248246
@router.delete("/{collection_id}/items/{granule_id}/")
249-
async def delete_single_granule_dapa(request: Request, collection_id: str, granule_id: str):
247+
async def delete_single_granule_dapa_actual(request: Request, collection_id: str, granule_id: str):
250248
authorizer: UDSAuthorizorAbstract = UDSAuthorizerFactory() \
251249
.get_instance(UDSAuthorizerFactory.cognito,
252250
es_url=os.getenv('ES_URL'),
@@ -285,11 +283,42 @@ async def delete_single_granule_dapa(request: Request, collection_id: str, granu
285283
# delete_result = s3.delete_multiple(s3_urls=s3_urls)
286284
# LOGGER.debug(f'delete_result for {each_granule.id} - delete_result: {delete_result}')
287285
except Exception as e:
288-
LOGGER.exception('failed during get_granules_dapa')
286+
LOGGER.exception('failed during delete_single_granule_dapa_actual')
289287
raise HTTPException(status_code=500, detail=str(e))
290288
return {}
291289

292290

291+
# @router.delete("/{collection_id}/items/{granule_id}")
292+
# @router.delete("/{collection_id}/items/{granule_id}/")
293+
# async def delete_single_granule_dapa_facade(request: Request, collection_id: str, granule_id: str, response: Response, response_class=JSONResponse):
294+
# authorizer: UDSAuthorizorAbstract = UDSAuthorizerFactory() \
295+
# .get_instance(UDSAuthorizerFactory.cognito,
296+
# es_url=os.getenv('ES_URL'),
297+
# es_port=int(os.getenv('ES_PORT', '443'))
298+
# )
299+
# auth_info = FastApiUtils.get_authorization_info(request)
300+
# collection_identifier = UdsCollections.decode_identifier(collection_id)
301+
# if not authorizer.is_authorized_for_collection(DBConstants.delete, collection_id,
302+
# auth_info['ldap_groups'],
303+
# collection_identifier.tenant,
304+
# collection_identifier.venue):
305+
# LOGGER.debug(f'user: {auth_info["username"]} is not authorized for {collection_id}')
306+
# raise HTTPException(status_code=403, detail=json.dumps({
307+
# 'message': 'not authorized to execute this action'
308+
# }))
309+
# try:
310+
# LOGGER.debug(f'deleting granule: {granule_id}')
311+
# granules_dapa_query = GranulesDapaQueryEs(collection_id, -1, -1, None, None, None, '')
312+
# delete_prep_result = granules_dapa_query.delete_facade(request.url, request.headers.get('Authorization', ''))
313+
# except Exception as e:
314+
# LOGGER.exception('failed during delete_single_granule_dapa')
315+
# raise HTTPException(status_code=500, detail=str(e))
316+
# if delete_prep_result['statusCode'] < 300:
317+
# response.status_code = delete_prep_result['statusCode']
318+
# return delete_prep_result['body']
319+
# raise HTTPException(status_code=delete_prep_result['statusCode'], detail=delete_prep_result['body'])
320+
321+
293322
@router.put("/{collection_id}/archive/{granule_id}")
294323
@router.put("/{collection_id}/archive/{granule_id}/")
295324
async def archive_single_granule_dapa(request: Request, collection_id: str, granule_id: str):

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
setup(
1414
name="cumulus_lambda_functions",
15-
version="9.4.0",
15+
version="9.4.1",
1616
packages=find_packages(),
1717
install_requires=install_requires,
1818
package_data={

tests/integration_tests/test_granules_deletion.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import base64
22
import json
33
import os
4+
from time import sleep
45
from unittest import TestCase
56

67
import requests
@@ -32,8 +33,8 @@ def setUp(self) -> None:
3233

3334
self.tenant = 'UDS_LOCAL_TEST_3' # 'uds_local_test' # 'uds_sandbox'
3435
self.tenant_venue = 'DEV' # 'DEV1' # 'dev'
35-
self.collection_name = 'CCC-04' # 'uds_collection' # 'sbx_collection'
36-
self.collection_version = '08'.replace('.', '') # '2402011200'
36+
self.collection_name = 'DDD-03' # 'uds_collection' # 'sbx_collection'
37+
# self.collection_version = '08'.replace('.', '') # '2402011200'
3738
return
3839

3940
def test_01_setup_permissions(self):
@@ -82,7 +83,7 @@ def test_delete_all(self):
8283
self.assertEqual(query_result.status_code, 200, f'wrong status code. {query_result.text}')
8384
response_json = json.loads(query_result.text)
8485
print(json.dumps(response_json, indent=4))
85-
86+
sleep(10)
8687
post_url = f'{self.uds_url}collections/{collection_id}/items/' # MCP Dev
8788
query_result = requests.get(url=post_url, headers=headers,)
8889
self.assertEqual(query_result.status_code, 200, f'wrong status code. {query_result.text}')

tests/integration_tests/test_stage_out_ingestion.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def setUp(self) -> None:
4242

4343
self.tenant = 'UDS_LOCAL_TEST_3' # 'uds_local_test' # 'uds_sandbox'
4444
self.tenant_venue = 'DEV' # 'DEV1' # 'dev'
45-
self.collection_name = 'CCC' # 'uds_collection' # 'sbx_collection'
45+
self.collection_name = 'DDD' # 'uds_collection' # 'sbx_collection'
4646
self.collection_version = '24.03.20.14.40'.replace('.', '') # '2402011200'
4747
return
4848

0 commit comments

Comments
 (0)