nodejs test hyperledger composer v0.15 falla con Error: Tarjeta no encontrada: PeerAdmin @ hlfv1

Con la implementación de tarjetas en v0.15, las versiones anteriores de las rutinas de prueba que usaron perfiles (obviamente) no funcionarán. Sin embargo, no puedo encontrar un enfoque de SDK para crear las tarjetas necesarias para ejecutar pruebas. La sección ‘antes’ del código hasta v0.14 para mis pruebas se parece a la siguiente, que utiliza un perfil incorporado, crea una instancia temporal de la red y ejecuta las pruebas:

describe('Finance Network', () => { // let adminConnection; let businessNetworkConnection; before(() => { BrowserFS.initialize(new BrowserFS.FileSystem.InMemory()); const adminConnection = new AdminConnection({ fs: bfs_fs }); return adminConnection.createProfile('defaultProfile', { type: 'embedded' }) .then(() => { return adminConnection.connect('defaultProfile', adminID, adminPW); }) .then(() => { return BusinessNetworkDefinition.fromDirectory(path.resolve(__dirname, '..')); }) .then((businessNetworkDefinition) => { return adminConnection.deploy(businessNetworkDefinition); }) .then(() => { businessNetworkConnection = new BusinessNetworkConnection({ fs: bfs_fs }); return businessNetworkConnection.connect('defaultProfile', network, adminID, adminPW); }); }); 

Lo que estoy tratando de encontrar (y todavía no) en la documentación de nodejs es cómo crear las tarjetas necesarias para hacer que esto funcione, al mismo tiempo que utilizo este mismo enfoque.

Espero reemplazar las siguientes líneas de código con algo que crea las tarjetas necesarias:

  return adminConnection.createProfile('defaultProfile', { type: 'embedded' }) .then(() => { return adminConnection.connect('defaultProfile', adminID, adminPW); }) 

El único lugar donde veo la creación de la tarjeta es en el Registro de participantes compositores-clientes, pero es una situación Catch-22 donde tengo que estar conectado para crear la tarjeta, pero necesito una tarjeta para conectarme. ¿Cuál es el enfoque recomendado para escribir pruebas basadas en mocha como lo hemos estado haciendo en las últimas versiones de Hyperledger-Composer?

¡Gracias!

Supongo que sujeto a cierto refinamiento a medida que se establece la API basada en tarjeta, pero debería estar mirando algo como esto utilizando solo la API:

 // Embedded connection used for local testing const connectionProfile = { name: 'embedded', type: 'embedded' }; // Embedded connection does not need real credentials const credentials = { certificate: 'FAKE CERTIFICATE', privateKey: 'FAKE PRIVATE KEY' }; // PeerAdmin identity used with the admin connection to deploy business networks const deployerMetadata = { version: 1, userName: 'PeerAdmin', roles: [ 'PeerAdmin', 'ChannelAdmin' ] }; const deployerCard = new IdCard(deployerMetadata, connectionProfile); deployerCard.setCredentials(credentials); // In-memory card store for testing so cards are not persisted to the file system const cardStore = new MemoryCardStore(); const adminConnection = new AdminConnection({ cardStore: cardStore }); const deployerCardName = 'PeerAdmin'; const adminUserName = 'admin'; let adminCardName; let businessNetworkDefinition; return adminConnection.importCard(deployerCardName, deployerCard).then(() => { return adminConnection.connect(deployerCardName); }).then(() => { return BusinessNetworkDefinition.fromDirectory(path.resolve(__dirname, '..')); }).then(definition => { businessNetworkDefinition = definition; // Install the Composer runtime for the new business network return adminConnection.install(businessNetworkDefinition.getName()); }).then(() => { // Start the business network and configure an network admin identity const startOptions = { networkAdmins: [ { userName: adminUserName, enrollmentSecret: adminSecret } ] }; return adminConnection.start(businessNetworkDefinition, startOptions); }).then(adminCards => { // Import the network admin identity for us to use adminCardName = 'admin@' + businessNetworkDefinition.getName(); return adminConnection.importCard(adminCardName, adminCards.get(adminUserName)); }).then(() => { // Connect to the business network using the network admin identity businessNetworkConnection = new BusinessNetworkConnection({ cardStore: cardStore }); return businessNetworkConnection.connect(adminCardName); }); 

La advertencia a esto es que las tarjetas de administración de red que se devuelven desde la llamada a AdminConnection.start() están (mientras escribo ) en el proceso de agregarse en este problema: hyperledger / composer # 2753

Los comandos de la CLI ya registran la identidad de administrador de red y generan una tarjeta para este administrador que puede importar si desea usarla en lugar de entregarla a otra persona.

Después de un par de días de experimentación, he encontrado una manera de resolver este problema. La siguiente secuencia de código utiliza la tarjeta PeerAdmin creada como parte de la versión v0.15. Importe esa tarjeta y, después de adminConnect, actualizo el elemento businessNetwork en los metadatos de la tarjeta y luego, después de volver a importar la tarjeta, la implemento y me conecto a la red comercial.

 describe('Finance Network', function () { this.timeout(_timeout); let businessNetworkConnection; let peerName = 'PeerAdmin@hlfv1'; before(function () { const adminConnection = new AdminConnection(); let idPeer; return hlc_idCard.fromDirectory(_home+'/.composer/cards/'+peerName) .then ((_idPeer) => { idPeer = _idPeer; return adminConnection.importCard(peerName, idPeer); }) .then(() => { return adminConnection.connect(peerName); }) .then(() => { return BusinessNetworkDefinition.fromDirectory(path.resolve(__dirname, '..')); }) .then((businessNetworkDefinition) => { idPeer.metadata.businessNetwork = network; return adminConnection.importCard(peerName, idPeer) .then(() => { return adminConnection.deploy(businessNetworkDefinition,{'card': idPeer}); }); }) .then(() => { businessNetworkConnection = new BusinessNetworkConnection(); return businessNetworkConnection.connect(peerName); }); });