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)
Exemple #4
0
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