11import logging
22import time
3-
43import jsonpatch
5- from globus_sdk import (ClientCredentialsAuthorizer , ConfidentialAppAuthClient ,
6- SearchClient )
4+
5+ from globus_sdk import (
6+ ClientCredentialsAuthorizer ,
7+ ConfidentialAppAuthClient ,
8+ SearchClient ,
9+ )
710from globus_sdk .scopes import SearchScopes
811from globus_sdk .services .search .errors import SearchAPIError
912
@@ -22,11 +25,25 @@ def __init__(self, credentials, search_index, error_producer):
2225 self .esgf_index = search_index
2326 self .error_producer = error_producer
2427
25- def convert_assets (self , assets ):
26- converted_assets = []
28+ def normalize_assets (self , assets ):
29+ normalized_assets = []
2730 for key , value in assets .items ():
28- converted_assets .append ({"name" : key } | value )
29- return converted_assets
31+ normalized_assets .append ({"name" : key } | value )
32+ for asset in normalized_assets :
33+ if "alternate" in asset and asset .get ("alternate" ):
34+ asset ["alternate" ] = self .normalize_assets (asset ["alternate" ])
35+ return normalized_assets
36+
37+ def denormalize_assets (self , assets ):
38+ denormalized_assets = {}
39+ for asset in assets :
40+ name = asset .pop ("name" )
41+ if "alternate" in asset :
42+ asset ["alternate" ] = self .denormalize_assets (asset ["alternate" ])
43+ else :
44+ asset ["alternate" ] = {}
45+ denormalized_assets [name ] = asset
46+ return denormalized_assets
3047
3148 def gmetaentry (self , item ):
3249 return {
@@ -70,12 +87,10 @@ def ingest(self, messages_data):
7087 def post (self , message_data ):
7188 item = message_data .get ("data" ).get ("payload" ).get ("item" )
7289 try :
73- globus_response = self .search_client .get_subject (
74- self .esgf_index , item .get ("id" )
75- )
90+ globus_response = self .search_client .get_subject (self .esgf_index , item .get ("id" ))
7691 except SearchAPIError as e :
7792 if e .http_status == 404 :
78- item ["assets" ] = self .convert_assets (item .get ("assets" ))
93+ item ["assets" ] = self .normalize_assets (item .get ("assets" ))
7994 gmeta_entry = self .gmetaentry (item )
8095 return gmeta_entry
8196
@@ -102,9 +117,11 @@ def json_patch(self, message_data):
102117 value = f"Item with ID { item_id } does not exist in the index." ,
103118 )
104119 return None
105- gmeta_entry = jsonpatch .apply_patch (
106- globus_response .data .get ("content" ), payload .get ("patch" )
107- )
120+ item = globus_response .data .get ("entries" )[0 ].get ("content" )
121+ item ["assets" ] = self .denormalize_assets (item .get ("assets" ))
122+ patched_item = jsonpatch .apply_patch (item , payload .get ("patch" ).get ("operations" ))
123+ patched_item ["assets" ] = self .normalize_assets (patched_item .get ("assets" ))
124+ gmeta_entry = self .gmetaentry (patched_item )
108125 return gmeta_entry
109126
110127 def delete (self , subject ):
@@ -131,8 +148,6 @@ def process_message(self, message_data):
131148 return self .put (message_data )
132149 if method == "JSON_PATCH" or method == "PATCH" :
133150 return self .json_patch (message_data )
134- if method == "MERGE_PATCH" :
135- return self .merge_patch (message_data )
136151 return None
137152 except Exception as e :
138153 logging .error (f"Error processing message data: { e } " )
0 commit comments