66from rest_framework .decorators import action
77from rest_framework .permissions import IsAuthenticated
88import os
9- import tempfile , shutil , tarfile , json
9+ import tempfile
10+ import shutil
11+ import tarfile
12+ import json
1013
1114from drf_yasg .utils import swagger_auto_schema
1215from api .config import FABRIC_CHAINCODE_STORE
3538import hashlib
3639import logging
3740
41+
3842LOG = logging .getLogger (__name__ )
3943
44+
4045class ChainCodeViewSet (viewsets .ViewSet ):
4146 """Class represents Channel related operations."""
4247 permission_classes = [IsAuthenticated , ]
@@ -52,13 +57,19 @@ def _read_cc_pkg(self, pk, filename, ccpackage_path):
5257 meta_path = os .path .join (ccpackage_path , "metadata.json" )
5358 # extract metadata file
5459 with tarfile .open (os .path .join (ccpackage_path , filename )) as tared_file :
55- metadata_file = tared_file .getmember ("metadata.json" )
56- tared_file .extract (metadata_file , path = ccpackage_path )
57-
58- with open (meta_path , 'r' ) as f :
59- metadata = json .load (f )
60- language = metadata ["type" ]
61- label = metadata ["label" ]
60+ metadata_file = None
61+ for member in tared_file .getmembers ():
62+ if member .name .endswith ("metadata.json" ):
63+ metadata_file = member
64+ break
65+
66+ if metadata_file is not None :
67+ # Extract the metadata file
68+ metadata_content = tared_file .extractfile (
69+ metadata_file ).read ().decode ("utf-8" )
70+ metadata = json .loads (metadata_content )
71+ language = metadata ["type" ]
72+ label = metadata ["label" ]
6273
6374 if os .path .exists (meta_path ):
6475 os .remove (meta_path )
@@ -70,6 +81,7 @@ def _read_cc_pkg(self, pk, filename, ccpackage_path):
7081 chaincode .save ()
7182
7283 except Exception as e :
84+ LOG .exception ("Could not read Chaincode Package" )
7385 raise e
7486
7587 @swagger_auto_schema (
@@ -110,7 +122,10 @@ def list(self, request):
110122 ]
111123 response = ChaincodeListResponse (
112124 {"data" : chanincodes_list , "total" : chaincodes .count ()})
113- return Response (data = ok (response .data ), status = status .HTTP_200_OK )
125+ return Response (
126+ data = ok (
127+ response .data ),
128+ status = status .HTTP_200_OK )
114129 except Exception as e :
115130 return Response (
116131 err (e .args ), status = status .HTTP_400_BAD_REQUEST
@@ -144,22 +159,23 @@ def package(self, request):
144159 if member .name .endswith ("metadata.json" ):
145160 metadata_file = member
146161 break
147-
162+
148163 if metadata_file is not None :
149164 # Extract the metadata file
150- metadata_content = tar .extractfile (metadata_file ).read ().decode ("utf-8" )
165+ metadata_content = tar .extractfile (
166+ metadata_file ).read ().decode ("utf-8" )
151167 metadata = json .loads (metadata_content )
152168 label = metadata .get ("label" )
153169 else :
154170 return Response (
155- err ("Metadata file not found in the chaincode package." ), status = status . HTTP_400_BAD_REQUEST
156- )
171+ err ("Metadata file not found in the chaincode package." ),
172+ status = status . HTTP_400_BAD_REQUEST )
157173
158174 org = request .user .organization
159175 # qs = Node.objects.filter(type="peer", organization=org)
160176 # if not qs.exists():
161177 # return Response(
162- # err("at least 1 peer node is required for the chaincode package upload."),
178+ # err("at least 1 peer node is required for the chaincode package upload."),
163179 # status=status.HTTP_400_BAD_REQUEST
164180 # )
165181 # peer_node = qs.first()
@@ -168,7 +184,7 @@ def package(self, request):
168184 # return_code, content = peer_channel_cli.lifecycle_calculatepackageid(temp_cc_path)
169185 # if (return_code != 0):
170186 # return Response(
171- # err("calculate packageid failed for {}.".format(content)),
187+ # err("calculate packageid failed for {}.".format(content)),
172188 # status=status.HTTP_400_BAD_REQUEST
173189 # )
174190 # packageid = content.strip()
@@ -184,7 +200,7 @@ def package(self, request):
184200 cc = ChainCode .objects .filter (package_id = packageid )
185201 if cc .exists ():
186202 return Response (
187- err ("package with id {} already exists." .format (packageid )),
203+ err ("package with id {} already exists." .format (packageid )),
188204 status = status .HTTP_400_BAD_REQUEST
189205 )
190206
@@ -205,9 +221,11 @@ def package(self, request):
205221
206222 # start thread to read package meta info, update db
207223 try :
208- threading .Thread (target = self ._read_cc_pkg ,
209- args = (uuid , file .name , ccpackage_path )).start ()
224+ threading .Thread (
225+ target = self ._read_cc_pkg ,
226+ args = (uuid , file .name , ccpackage_path )).start ()
210227 except Exception as e :
228+ LOG .exception ("Failed Threading" )
211229 raise e
212230
213231 return Response (
@@ -229,6 +247,8 @@ def package(self, request):
229247 @action (detail = False , methods = ['post' ])
230248 def install (self , request ):
231249 chaincode_id = request .data .get ("id" )
250+ # Get the selected node ID from request
251+ node_id = request .data .get ("node" )
232252 try :
233253 cc_targz = ""
234254 file_path = os .path .join (FABRIC_CHAINCODE_STORE , chaincode_id )
@@ -237,16 +257,31 @@ def install(self, request):
237257 break
238258
239259 org = request .user .organization
240- qs = Node .objects .filter (type = "peer" , organization = org )
241- if not qs .exists ():
242- raise ResourceNotFound
243- peer_node = qs .first ()
260+
261+ # If node_id is provided, get that specific node
262+ if node_id :
263+ try :
264+ peer_node = Node .objects .get (
265+ id = node_id , type = "peer" , organization = org )
266+ except Node .DoesNotExist :
267+ return Response (
268+ err ("Selected peer node not found or not authorized." ),
269+ status = status .HTTP_404_NOT_FOUND
270+ )
271+ else :
272+ # Fallback to first peer if no node selected
273+ qs = Node .objects .filter (type = "peer" , organization = org )
274+ if not qs .exists ():
275+ raise ResourceNotFound
276+ peer_node = qs .first ()
244277
245278 envs = init_env_vars (peer_node , org )
246279 peer_channel_cli = PeerChainCode (** envs )
247280 res = peer_channel_cli .lifecycle_install (cc_targz )
248281 if res != 0 :
249- return Response (err ("install chaincode failed." ), status = status .HTTP_400_BAD_REQUEST )
282+ return Response (
283+ err ("install chaincode failed." ),
284+ status = status .HTTP_400_BAD_REQUEST )
250285 except Exception as e :
251286 return Response (
252287 err (e .args ), status = status .HTTP_400_BAD_REQUEST
@@ -267,7 +302,7 @@ def query_installed(self, request):
267302 org = request .user .organization
268303 qs = Node .objects .filter (type = "peer" , organization = org )
269304 if not qs .exists ():
270- raise ResourceNotFound
305+ raise ResourceNotFound ( "Peer Does Not Exist" )
271306 peer_node = qs .first ()
272307 envs = init_env_vars (peer_node , org )
273308
@@ -297,7 +332,7 @@ def get_installed_package(self, request):
297332 org = request .user .organization
298333 qs = Node .objects .filter (type = "peer" , organization = org )
299334 if not qs .exists ():
300- raise ResourceNotFound
335+ raise ResourceNotFound ( "Peer Does Not Exist" )
301336 peer_node = qs .first ()
302337 envs = init_env_vars (peer_node , org )
303338
@@ -336,13 +371,13 @@ def approve_for_my_org(self, request):
336371 org = request .user .organization
337372 qs = Node .objects .filter (type = "orderer" , organization = org )
338373 if not qs .exists ():
339- raise ResourceNotFound
374+ raise ResourceNotFound ( "Orderer Does Not Exist" )
340375 orderer_node = qs .first ()
341376 orderer_url = orderer_node .name + "." + org .name .split ("." , 1 )[1 ] + ":" + str (7050 )
342377
343378 qs = Node .objects .filter (type = "peer" , organization = org )
344379 if not qs .exists ():
345- raise ResourceNotFound
380+ raise ResourceNotFound ( "Peer Does Not Exist" )
346381 peer_node = qs .first ()
347382 envs = init_env_vars (peer_node , org )
348383
@@ -371,7 +406,7 @@ def query_approved(self, request):
371406 org = request .user .organization
372407 qs = Node .objects .filter (type = "peer" , organization = org )
373408 if not qs .exists ():
374- raise ResourceNotFound
409+ raise ResourceNotFound ( "Peer Does Not Exist" )
375410 peer_node = qs .first ()
376411 envs = init_env_vars (peer_node , org )
377412
@@ -414,7 +449,7 @@ def check_commit_readiness(self, request):
414449 org = request .user .organization
415450 qs = Node .objects .filter (type = "orderer" , organization = org )
416451 if not qs .exists ():
417- raise ResourceNotFound
452+ raise ResourceNotFound ( "Orderer Does Not Exist" )
418453 orderer_node = qs .first ()
419454
420455 orderer_tls_dir = "{}/{}/crypto-config/ordererOrganizations/{}/orderers/{}/msp/tlscacerts" \
@@ -428,7 +463,7 @@ def check_commit_readiness(self, request):
428463
429464 qs = Node .objects .filter (type = "peer" , organization = org )
430465 if not qs .exists ():
431- raise ResourceNotFound
466+ raise ResourceNotFound ( "Peer Does Not Exist" )
432467 peer_node = qs .first ()
433468 envs = init_env_vars (peer_node , org )
434469
@@ -470,7 +505,7 @@ def commit(self, request):
470505 org = request .user .organization
471506 qs = Node .objects .filter (type = "orderer" , organization = org )
472507 if not qs .exists ():
473- raise ResourceNotFound
508+ raise ResourceNotFound ( "Orderer Does Not Exist" )
474509 orderer_node = qs .first ()
475510
476511 orderer_tls_dir = "{}/{}/crypto-config/ordererOrganizations/{}/orderers/{}/msp/tlscacerts" \
@@ -483,7 +518,7 @@ def commit(self, request):
483518
484519 qs = Node .objects .filter (type = "peer" , organization = org )
485520 if not qs .exists ():
486- raise ResourceNotFound
521+ raise ResourceNotFound ( "Peer Does Not Exist" )
487522 peer_node = qs .first ()
488523 envs = init_env_vars (peer_node , org )
489524
@@ -530,7 +565,7 @@ def query_committed(self, request):
530565 org = request .user .organization
531566 qs = Node .objects .filter (type = "peer" , organization = org )
532567 if not qs .exists ():
533- raise ResourceNotFound
568+ raise ResourceNotFound ( "Peer Does Not Exist" )
534569 peer_node = qs .first ()
535570 envs = init_env_vars (peer_node , org )
536571 peer_channel_cli = PeerChainCode (** envs )
@@ -539,6 +574,7 @@ def query_committed(self, request):
539574 if code != 0 :
540575 return Response (err ("query committed failed." ), status = status .HTTP_400_BAD_REQUEST )
541576 except Exception as e :
577+ LOG .exception ("Could Not Commit Query" )
542578 return Response (
543579 err (e .args ), status = status .HTTP_400_BAD_REQUEST
544580 )
0 commit comments