Skip to content

Commit 845bcaa

Browse files
authored
Merge pull request #150 from unity-sds/develop
release/3.8.0
2 parents f43f6a5 + 76fee55 commit 845bcaa

File tree

34 files changed

+914
-405
lines changed

34 files changed

+914
-405
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@ 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+
## [3.8.0] - 2023-05-04
9+
### Added
10+
- [#149](https://github.com/unity-sds/unity-data-services/pull/149) feat: writing output content to a file if ENV is provided
11+
12+
## [3.7.1] - 2023-05-04
13+
### Changed
14+
- [#148](https://github.com/unity-sds/unity-data-services/pull/148) fix: use cas structure to generate metadata for stac
15+
16+
## [3.7.0] - 2023-04-25
17+
### Added
18+
- [#146](https://github.com/unity-sds/unity-data-services/pull/146) feat: Stac metadata extraction
19+
820
## [3.6.1] - 2023-04-24
921
### Changed
1022
- [#144](https://github.com/unity-sds/unity-data-services/pull/144) fix: downloaded stac to return local absolute path

ci.cd/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ update_lambda_function_mcp_dev_5:
4343
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_collections_creation_dapa_facade --publish &>/dev/null
4444
update_lambda_function_mcp_dev_6:
4545
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
46-
46+
update_lambda_function_mcp_dev_7:
47+
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
4748

4849
mcp_dev: upload_lambda_mcp_dev update_lambda_function_mcp_dev_1 update_lambda_function_mcp_dev_2 update_lambda_function_mcp_dev_4 update_lambda_function_mcp_dev_5
4950

cumulus_lambda_functions/docker_entrypoint/__main__.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,32 @@
44

55
from cumulus_lambda_functions.stage_in_out.catalog_granules_factory import CatalogGranulesFactory
66
from cumulus_lambda_functions.stage_in_out.download_granules_factory import DownloadGranulesFactory
7-
from cumulus_lambda_functions.stage_in_out.download_granules_s3 import DownloadGranulesS3
87
from cumulus_lambda_functions.stage_in_out.search_granules_factory import SearchGranulesFactory
8+
from cumulus_lambda_functions.stage_in_out.stage_in_out_utils import StageInOutUtils
99
from cumulus_lambda_functions.stage_in_out.upoad_granules_factory import UploadGranulesFactory
1010

1111

1212
def choose_process():
1313
if argv[1].strip().upper() == 'SEARCH':
1414
logging.info('starting SEARCH script')
15-
return SearchGranulesFactory().get_class(os.getenv('GRANULES_SEARCH_DOMAIN', 'MISSING_GRANULES_SEARCH_DOMAIN')).search()
15+
result_str = SearchGranulesFactory().get_class(os.getenv('GRANULES_SEARCH_DOMAIN', 'MISSING_GRANULES_SEARCH_DOMAIN')).search()
16+
StageInOutUtils.write_output_to_file(result_str)
17+
return result_str
1618
if argv[1].strip().upper() == 'DOWNLOAD':
1719
logging.info('starting DOWNLOAD script')
18-
return DownloadGranulesFactory().get_class(os.getenv('GRANULES_DOWNLOAD_TYPE', 'MISSING_GRANULES_DOWNLOAD_TYPE')).download()
20+
result_str = DownloadGranulesFactory().get_class(os.getenv('GRANULES_DOWNLOAD_TYPE', 'MISSING_GRANULES_DOWNLOAD_TYPE')).download()
21+
StageInOutUtils.write_output_to_file(result_str)
22+
return result_str
1923
if argv[1].strip().upper() == 'UPLOAD':
2024
logging.info('starting UPLOAD script')
21-
return UploadGranulesFactory().get_class(os.getenv('GRANULES_UPLOAD_TYPE', 'MISSING_GRANULES_UPLOAD_TYPE')).upload()
25+
result_str = UploadGranulesFactory().get_class(os.getenv('GRANULES_UPLOAD_TYPE', 'MISSING_GRANULES_UPLOAD_TYPE')).upload()
26+
StageInOutUtils.write_output_to_file(result_str)
27+
return result_str
2228
if argv[1].strip().upper() == 'CATALOG':
2329
logging.info('starting CATALOG script')
24-
return CatalogGranulesFactory().get_class(os.getenv('GRANULES_CATALOG_TYPE', 'MISSING_GRANULES_CATALOG_TYPE')).catalog()
30+
result_str = CatalogGranulesFactory().get_class(os.getenv('GRANULES_CATALOG_TYPE', 'MISSING_GRANULES_CATALOG_TYPE')).catalog()
31+
StageInOutUtils.write_output_to_file(result_str)
32+
return result_str
2533
raise ValueError(f'invalid argument: {argv}')
2634

2735

cumulus_lambda_functions/metadata_cas_generate_cmr/echo_metadata.py renamed to cumulus_lambda_functions/lib/metadata_extraction/echo_metadata.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
"""
7474
from copy import deepcopy
7575

76-
from cumulus_lambda_functions.metadata_cas_generate_cmr.l1a_input_metadata import L1AInputMetadata
76+
from cumulus_lambda_functions.lib.metadata_extraction.granule_metadata_props import GranuleMetadataProps
7777

7878
SAMPLE_METADATA = {
7979
"GranuleUR": "MYD13Q1.A2017297.h19v10.006.2017313221202",
@@ -141,11 +141,8 @@
141141

142142

143143
class EchoMetadata:
144-
def __init__(self, l1a_input_metadata: L1AInputMetadata, granule_id: str, collection_id: str, collection_version: str):
145-
self.__l1a_input_metadata = l1a_input_metadata
146-
self.__granule_id = granule_id
147-
self.__collection_id = collection_id
148-
self.__collection_version = collection_version
144+
def __init__(self, granules_metadata_props: GranuleMetadataProps):
145+
self.__granules_metadata_props = granules_metadata_props
149146
self.__echo_metadata = deepcopy(SAMPLE_METADATA)
150147

151148
@property
@@ -163,21 +160,24 @@ def echo_metadata(self, val):
163160

164161
def load(self):
165162
incomplete_metadata = {
166-
'GranuleUR': self.__granule_id,
163+
'GranuleUR': self.__granules_metadata_props.granule_id,
164+
# 'InsertTime': '', # conditionally add it after dict creation
167165
# 'LastUpdate': 'TODO',
168166
'Collection': {
169-
'ShortName': self.__collection_id,
170-
'VersionId': self.__collection_version,
167+
'ShortName': self.__granules_metadata_props.collection_name,
168+
'VersionId': self.__granules_metadata_props.collection_version,
171169
},
172170
'DataGranule': {
173-
'ProductionDateTime': self.__l1a_input_metadata.prod_dt,
171+
'ProductionDateTime': self.__granules_metadata_props.prod_dt,
174172
},
175173
'Temporal': {
176174
'RangeDateTime': {
177-
'BeginningDateTime': self.__l1a_input_metadata.beginning_dt,
178-
'EndingDateTime': self.__l1a_input_metadata.ending_dt,
175+
'BeginningDateTime': self.__granules_metadata_props.beginning_dt,
176+
'EndingDateTime': self.__granules_metadata_props.ending_dt,
179177
}
180178
}
181179
}
180+
if self.__granules_metadata_props.insert_dt is not None:
181+
incomplete_metadata['InsertTime'] = self.__granules_metadata_props.insert_dt
182182
self.__echo_metadata.update(incomplete_metadata)
183183
return self
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
class GranuleMetadataProps:
2+
def __init__(self):
3+
self.__beginning_dt = None
4+
self.__ending_dt = None
5+
self.__collection_name = None
6+
self.__collection_version = None
7+
self.__granule_id = None
8+
self.__prod_dt = None
9+
self.__insert_dt = None
10+
11+
@property
12+
def beginning_dt(self):
13+
return self.__beginning_dt
14+
15+
@beginning_dt.setter
16+
def beginning_dt(self, val):
17+
"""
18+
:param val:
19+
:return: None
20+
"""
21+
self.__beginning_dt = val
22+
return
23+
24+
@property
25+
def ending_dt(self):
26+
return self.__ending_dt
27+
28+
@ending_dt.setter
29+
def ending_dt(self, val):
30+
"""
31+
:param val:
32+
:return: None
33+
"""
34+
self.__ending_dt = val
35+
return
36+
37+
@property
38+
def collection_name(self):
39+
return self.__collection_name
40+
41+
@collection_name.setter
42+
def collection_name(self, val):
43+
"""
44+
:param val:
45+
:return: None
46+
"""
47+
self.__collection_name = val
48+
return
49+
50+
@property
51+
def collection_version(self):
52+
return self.__collection_version
53+
54+
@collection_version.setter
55+
def collection_version(self, val):
56+
"""
57+
:param val:
58+
:return: None
59+
"""
60+
self.__collection_version = val
61+
return
62+
63+
@property
64+
def granule_id(self):
65+
return self.__granule_id
66+
67+
@granule_id.setter
68+
def granule_id(self, val):
69+
"""
70+
:param val:
71+
:return: None
72+
"""
73+
self.__granule_id = val
74+
return
75+
76+
@property
77+
def prod_dt(self):
78+
return self.__prod_dt
79+
80+
@prod_dt.setter
81+
def prod_dt(self, val):
82+
"""
83+
:param val:
84+
:return: None
85+
"""
86+
self.__prod_dt = val
87+
return
88+
89+
@property
90+
def insert_dt(self):
91+
return self.__insert_dt
92+
93+
@insert_dt.setter
94+
def insert_dt(self, val):
95+
"""
96+
:param val:
97+
:return: None
98+
"""
99+
self.__insert_dt = val
100+
return

cumulus_lambda_functions/metadata_cas_generate_cmr/generate_cmr.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
from cumulus_lambda_functions.lib.aws.aws_s3 import AwsS3
88
from cumulus_lambda_functions.lib.json_validator import JsonValidator
99
from cumulus_lambda_functions.lib.lambda_logger_generator import LambdaLoggerGenerator
10+
from cumulus_lambda_functions.lib.metadata_extraction.echo_metadata import EchoMetadata
1011
from cumulus_lambda_functions.lib.time_utils import TimeUtils
11-
from cumulus_lambda_functions.metadata_cas_generate_cmr.echo_metadata import EchoMetadata
1212
from cumulus_lambda_functions.metadata_cas_generate_cmr.l1a_input_metadata import L1AInputMetadata
1313

1414
LOGGER = LambdaLoggerGenerator.get_logger(__name__, LambdaLoggerGenerator.get_level_from_env())
@@ -349,13 +349,13 @@ def start(self):
349349
"""
350350
self.__validate_input()
351351
LOGGER.error(f'input: {self.__event}')
352-
pds_metadata = L1AInputMetadata(xmltodict.parse(self.__read_pds_metadata_file())).load()
353-
granule_id = self.__event['cma']['event']['meta']['input_granules'][0]['granuleId']
354-
collection_name = self.__event['cma']['event']['meta']['collection']['name']
355-
collection_version = self.__event['cma']['event']['meta']['collection']['version']
356-
echo_metadata = EchoMetadata(pds_metadata, granule_id, collection_name, collection_version).load().echo_metadata
352+
granule_metadata_props = L1AInputMetadata(xmltodict.parse(self.__read_pds_metadata_file())).load()
353+
granule_metadata_props.granule_id = self.__event['cma']['event']['meta']['input_granules'][0]['granuleId']
354+
granule_metadata_props.collection_name = self.__event['cma']['event']['meta']['collection']['name']
355+
granule_metadata_props.collection_version = self.__event['cma']['event']['meta']['collection']['version']
356+
echo_metadata = EchoMetadata(granule_metadata_props).load().echo_metadata
357357
echo_metadata_xml_str = xmltodict.unparse(echo_metadata, pretty=True)
358-
self.__s3.target_key = os.path.join(os.path.dirname(self.__s3.target_key), f'{granule_id}.cmr.xml')
358+
self.__s3.target_key = os.path.join(os.path.dirname(self.__s3.target_key), f'{granule_metadata_props.granule_id}.cmr.xml')
359359
self.__s3.upload_bytes(echo_metadata_xml_str.encode())
360360
echo_metadata_md5 = hashlib.md5(echo_metadata_xml_str.encode()).hexdigest()
361361
returning_dict = deepcopy(self.__event['cma']['event'])
@@ -403,9 +403,9 @@ def start(self):
403403
returning_dict['payload'] = {
404404
"granules": [
405405
{
406-
"granuleId": granule_id,
407-
"dataType": collection_name,
408-
"version": collection_version,
406+
"granuleId": granule_metadata_props.granule_id,
407+
"dataType": granule_metadata_props.collection_name,
408+
"version": granule_metadata_props.collection_version,
409409
"files": self.__input_file_list + [self.__generate_output_dict(echo_metadata_md5)],
410410
# "files": self.__input_file_list,
411411
"sync_granule_duration": 20302,
Lines changed: 7 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
import json
2-
31
from cumulus_lambda_functions.lib.json_validator import JsonValidator
42
from cumulus_lambda_functions.lib.lambda_logger_generator import LambdaLoggerGenerator
5-
3+
from cumulus_lambda_functions.lib.metadata_extraction.granule_metadata_props import GranuleMetadataProps
64

75
LOGGER = LambdaLoggerGenerator.get_logger(__name__, LambdaLoggerGenerator.get_level_from_env())
86
L1A_INPUT_METADATA_SCHEMA = {
@@ -43,67 +41,11 @@ def __init__(self, input_l1a_metadata: dict):
4341
"""
4442
:param input_l1a_metadata: str - XML string
4543
"""
44+
self.__granule_metadata_props = GranuleMetadataProps()
4645
self.__input_l1a_metadata = input_l1a_metadata
4746
self.__l1a_metadata_dict = {}
4847
self.__mandatory_keys = ['EndDateTime', 'ProductName', 'ProductionDateTime', 'StartDateTime']
4948

50-
self.__beginning_dt = None
51-
self.__ending_dt = None
52-
self.__prod_dt = None
53-
self.__prod_name = None
54-
55-
@property
56-
def beginning_dt(self):
57-
return self.__beginning_dt
58-
59-
@beginning_dt.setter
60-
def beginning_dt(self, val):
61-
"""
62-
:param val:
63-
:return: None
64-
"""
65-
self.__beginning_dt = val
66-
return
67-
68-
@property
69-
def ending_dt(self):
70-
return self.__ending_dt
71-
72-
@ending_dt.setter
73-
def ending_dt(self, val):
74-
"""
75-
:param val:
76-
:return: None
77-
"""
78-
self.__ending_dt = val
79-
return
80-
81-
@property
82-
def prod_dt(self):
83-
return self.__prod_dt
84-
85-
@prod_dt.setter
86-
def prod_dt(self, val):
87-
"""
88-
:param val:
89-
:return: None
90-
"""
91-
self.__prod_dt = val
92-
return
93-
94-
@property
95-
def prod_name(self):
96-
return self.__prod_name
97-
98-
@prod_name.setter
99-
def prod_name(self, val):
100-
"""
101-
:param val:
102-
:return: None
103-
"""
104-
self.__prod_name = val
105-
return
106-
10749
def __validate_pds_metadata(self):
10850
result = JsonValidator(L1A_INPUT_METADATA_SCHEMA).validate(self.__input_l1a_metadata)
10951
if result is not None:
@@ -120,8 +62,8 @@ def __load_to_dict(self):
12062
def load(self):
12163
self.__validate_pds_metadata()
12264
self.__load_to_dict()
123-
self.beginning_dt = self.__l1a_metadata_dict['StartDateTime']
124-
self.ending_dt = self.__l1a_metadata_dict['EndDateTime']
125-
self.prod_dt = self.__l1a_metadata_dict['ProductionDateTime']
126-
self.prod_name = self.__l1a_metadata_dict['ProductName']
127-
return self
65+
self.__granule_metadata_props.beginning_dt = self.__l1a_metadata_dict['StartDateTime']
66+
self.__granule_metadata_props.ending_dt = self.__l1a_metadata_dict['EndDateTime']
67+
self.__granule_metadata_props.prod_dt = self.__l1a_metadata_dict['ProductionDateTime']
68+
# self.__granule_metadata_props.prod_name = self.__l1a_metadata_dict['ProductName'] # NOT in used at this moment.
69+
return self.__granule_metadata_props

0 commit comments

Comments
 (0)