def test_add_algo_ko(self): url = reverse('substrapp:algo-list') # non existing associated objective data = { 'file': self.algo, 'description': self.data_description, 'json': json.dumps({ 'name': 'super top algo', 'objective_key': str(uuid.uuid4()), 'permissions': { 'public': True, 'authorized_ids': [], }, }), } extra = { 'HTTP_SUBSTRA_CHANNEL_NAME': 'mychannel', 'HTTP_ACCEPT': 'application/json;version=0.0', } with mock.patch.object(LedgerAlgoSerializer, 'create') as mcreate: mcreate.side_effect = LedgerError('Fail to add algo. Objective does not exist') response = self.client.post(url, data, format='multipart', **extra) r = response.json() self.assertIn('does not exist', r['message']) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) Objective.objects.create(description=self.objective_description, metrics=self.objective_metrics) # missing local storage field data = { 'name': 'super top algo', 'objective_key': self.objective_key, 'permissions': { 'public': True, 'authorized_ids': [], }, } response = self.client.post(url, data, format='json', **extra) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) # missing ledger field data = { 'file': self.algo, 'description': self.data_description, 'json': json.dumps({ 'objective_key': self.objective_key, }) } response = self.client.post(url, data, format='multipart', **extra) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_datamanager_retrieve_fail(self): url = reverse('substrapp:data_manager-list') # Key < 32 chars search_params = '12312323/' response = self.client.get(url + search_params, **self.extra) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) # Key not hexa search_params = 'X' * 32 + '/' response = self.client.get(url + search_params, **self.extra) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) with mock.patch('substrapp.views.datamanager.get_object_from_ledger') as mget_object_from_ledger: mget_object_from_ledger.side_effect = LedgerError('TEST') response = self.client.get(f'{url}{objective[0]["key"]}/', **self.extra) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_computeplan_retrieve_fail(self): url = reverse('substrapp:compute_plan-list') # Key < 32 chars search_params = '12312323/' response = self.client.get(url + search_params, **self.extra) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) # Key not hexa search_params = 'X' * 32 + '/' response = self.client.get(url + search_params, **self.extra) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) with mock.patch('substrapp.views.computeplan.get_object_from_ledger') as mget_object_from_ledger: mget_object_from_ledger.side_effect = LedgerError('TEST') search_params = computeplan[0]['key'] response = self.client.get(url + search_params + '/', **self.extra) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def _call_ledger(channel_name, call_type, fcn, args=None, kwargs=None): with get_hfc(channel_name) as (loop, client, user): if not args: args = [] else: args = [json.dumps(args, cls=UUIDEncoder)] chaincode_calls = { 'invoke': client.chaincode_invoke, 'query': client.chaincode_query, } all_peers = client._peers.keys() peers = { 'invoke': get_invoke_endorsing_peers(current_peer=settings.LEDGER_PEER_NAME, all_peers=all_peers), 'query': get_query_endorsing_peers(current_peer=settings.LEDGER_PEER_NAME, all_peers=all_peers), } params = { 'requestor': user, 'channel_name': channel_name, 'peers': peers[call_type], 'args': args, 'cc_name': settings.LEDGER_CHANNELS[channel_name]['chaincode']['name'], 'fcn': fcn } if kwargs is not None and isinstance(kwargs, dict): params.update(kwargs) try: response = loop.run_until_complete( chaincode_calls[call_type](**params)) except TimeoutError as e: raise LedgerTimeout(str(e)) except Exception as e: # TODO add a method to parse properly the base Exception raised by the fabric-sdk-py if hasattr(e, 'details') and 'access denied' in e.details(): raise LedgerForbidden(f'Access denied for {(fcn, args)}') if hasattr( e, 'details' ) and 'failed to connect to all addresses' in e.details(): logger.error( f'failed to reach all peers {all_peers}, current_peer is {settings.LEDGER_PEER_NAME}' ) raise LedgerUnavailable( f'Failed to connect to all addresses for {(fcn, args)}') for arg in e.args: if 'MVCC_READ_CONFLICT' in arg: logger.error(f'MVCC read conflict for {(fcn, args)}') raise LedgerMVCCError(arg) from e if 'PHANTOM_READ_CONFLICT' in arg: logger.error(f'PHANTOM read conflict for {(fcn, args)}') raise LedgerPhantomReadConflictError(arg) from e if 'ENDORSEMENT_POLICY_FAILURE' in arg: logger.error( f'ENDORSEMENT_POLICY_FAILURE for {(fcn, args)}') raise LedgerEndorsementPolicyFailure(arg) from e try: # get first failed response from list of protobuf ProposalResponse response = [r for r in e.args[0] if r.response.status != 200][0].response.message except Exception: raise LedgerError(str(e)) # Deserialize the stringified json try: response = json.loads(response) except json.decoder.JSONDecodeError: raise LedgerInvalidResponse(response) # Raise errors if status is not ok raise_for_status(response) return response