Skip to content

Commit

Permalink
adding optional compute provider
Browse files Browse the repository at this point in the history
  • Loading branch information
josepablofm78 committed Dec 9, 2022
1 parent 06b2478 commit 6c7f04a
Show file tree
Hide file tree
Showing 53 changed files with 906 additions and 880 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ The Nevermined Node reads the following environment variables allowing the confi
| **MINIO_PORT** | Port of the MinIO server. Requires ENABLE_COMPUTE = true | `9000`
| **MINIO_ACCESS_KEY** | Access Key for MinIO. Requires ENABLE_COMPUTE = true | `AKIAIOSFODNN7EXAMPLE`
| **MINIO_SECRET_KEY** | Secret Key for MinIO.Requires ENABLE_COMPUTE = true | `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY`
| **COMPUTE_PROVIDER_KEYFILE** | Path to a Compute Provider file. Optional, use only if you want to use a different provider for computing. Requires ENABLE_COMPUTE = true | `/mnt/credentials/compute_keyfile.json`
| **COMPUTE_PROVIDER_PASSWORD** | Password Compute Provider file. Optional, use only if you want to use a different provider for computing. Requires ENABLE_COMPUTE = true | `pass`

## Install and run:

Expand Down
4 changes: 3 additions & 1 deletion config/from-env.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ const keys = [
'MINIO_HOST',
'MINIO_PORT',
'MINIO_ACCESS_KEY',
'MINIO_SECRET_KEY'
'MINIO_SECRET_KEY',
'COMPUTE_PROVIDER_KEYFILE',
'COMPUTE_PROVIDER_PASSWORD'
]

const config = {}
Expand Down
36 changes: 18 additions & 18 deletions scripts/getdoc.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import { NestFactory } from '@nestjs/core'
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'
import { ApplicationModule } from '../src/app.module'
import * as path from 'path'
import { NestExpressApplication } from '@nestjs/platform-express'
import { writeFileSync } from 'fs'
import { readFileSync } from 'fs'
import { NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { ApplicationModule } from '../src/app.module';
import * as path from 'path';
import { NestExpressApplication } from '@nestjs/platform-express';
import { writeFileSync } from 'fs';
import { readFileSync } from 'fs';

const bootstrap = async () => {
const app = await NestFactory.create<NestExpressApplication>(ApplicationModule, { cors: true })
app.enable('trust proxy')
const app = await NestFactory.create<NestExpressApplication>(ApplicationModule, { cors: true });
app.enable('trust proxy');

const packageJsonPath = path.join(__dirname, '..', 'package.json')
const packageJsonString = readFileSync(packageJsonPath, 'utf8')
const packageJson = JSON.parse(packageJsonString) as { version: string }
const packageJsonPath = path.join(__dirname, '..', 'package.json');
const packageJsonString = readFileSync(packageJsonPath, 'utf8');
const packageJson = JSON.parse(packageJsonString) as { version: string };

const options = new DocumentBuilder()
.setTitle('Nevermined Node')
Expand All @@ -23,11 +23,11 @@ const bootstrap = async () => {
},
'Authorization',
)
.build()
const document = SwaggerModule.createDocument(app, options)
writeFileSync('docs/openapi.json', JSON.stringify(document), { encoding: 'utf8' })
.build();
const document = SwaggerModule.createDocument(app, options);
writeFileSync('docs/openapi.json', JSON.stringify(document), { encoding: 'utf8' });

await app.close()
}
await app.close();
};

bootstrap()
bootstrap();
106 changes: 53 additions & 53 deletions src/access/access.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,22 @@ import {
StreamableFile,
UploadedFile,
UseInterceptors,
} from '@nestjs/common'
import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'
import { Request } from '../common/helpers/request.interface'
import { Public } from '../common/decorators/auth.decorator'
import { FileInterceptor } from '@nestjs/platform-express'
import crypto from 'crypto'
import { aes_encryption_256 } from '@nevermined-io/nevermined-sdk-dtp/dist/utils'
import { ValidationParams } from '@nevermined-io/nevermined-sdk-js/dist/node/ddo/Service'
import BigNumber from '@nevermined-io/nevermined-sdk-js/dist/node/utils/BigNumber'
import { NeverminedService } from '../shared/nevermined/nvm.service'
import { Logger } from '../shared/logger/logger.service'
import { TransferDto } from './dto/transfer'
import { UploadDto } from './dto/upload'
import { UploadResult } from './dto/upload-result'
import { AgreementData } from '@nevermined-io/nevermined-sdk-js/dist/node/keeper/contracts/managers'
import { utils } from '@nevermined-io/nevermined-sdk-js'
} from '@nestjs/common';
import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { Request } from '../common/helpers/request.interface';
import { Public } from '../common/decorators/auth.decorator';
import { FileInterceptor } from '@nestjs/platform-express';
import crypto from 'crypto';
import { aes_encryption_256 } from '@nevermined-io/nevermined-sdk-dtp/dist/utils';
import { ValidationParams } from '@nevermined-io/nevermined-sdk-js/dist/node/ddo/Service';
import BigNumber from '@nevermined-io/nevermined-sdk-js/dist/node/utils/BigNumber';
import { NeverminedService } from '../shared/nevermined/nvm.service';
import { Logger } from '../shared/logger/logger.service';
import { TransferDto } from './dto/transfer';
import { UploadDto } from './dto/upload';
import { UploadResult } from './dto/upload-result';
import { AgreementData } from '@nevermined-io/nevermined-sdk-js/dist/node/keeper/contracts/managers';
import { utils } from '@nevermined-io/nevermined-sdk-js';

export enum UploadBackends {
IPFS = 'ipfs',
Expand Down Expand Up @@ -58,9 +58,9 @@ export class AccessController {
@Param('index') index: number,
): Promise<StreamableFile | string> {
if (!req.user.did) {
throw new BadRequestException('DID not specified')
throw new BadRequestException('DID not specified');
}
return await this.nvmService.downloadAsset(req.user.did, index, res, req.user.address)
return await this.nvmService.downloadAsset(req.user.did, index, res, req.user.address);
}

@Get('nft-access/:agreement_id/:index')
Expand All @@ -79,7 +79,7 @@ export class AccessController {
@Response({ passthrough: true }) res,
@Param('index') index: number,
): Promise<StreamableFile | string> {
return await this.nvmService.downloadAsset(req.user.did, index, res, req.user.address)
return await this.nvmService.downloadAsset(req.user.did, index, res, req.user.address);
}

@Post('nft-transfer')
Expand All @@ -96,32 +96,32 @@ export class AccessController {
@Body() transferData: TransferDto,
@Req() req: Request<unknown>,
): Promise<string> {
Logger.debug(`Transferring NFT with agreement ${transferData.agreementId}`)
const nevermined = this.nvmService.getNevermined()
let agreement: AgreementData
Logger.debug(`Transferring NFT with agreement ${transferData.agreementId}`);
const nevermined = this.nvmService.getNevermined();
let agreement: AgreementData;
try {
agreement = await nevermined.keeper.agreementStoreManager.getAgreement(
transferData.agreementId,
)
);
} catch (e) {
Logger.error(`Error resolving agreement ${transferData.agreementId}`)
throw new NotFoundException(`Agreement ${transferData.agreementId} not found`)
Logger.error(`Error resolving agreement ${transferData.agreementId}`);
throw new NotFoundException(`Agreement ${transferData.agreementId} not found`);
}
if (!agreement) {
Logger.error(`Agreement ${transferData.agreementId} not found`)
throw new NotFoundException(`Agreement ${transferData.agreementId} not found`)
Logger.error(`Agreement ${transferData.agreementId} not found`);
throw new NotFoundException(`Agreement ${transferData.agreementId} not found`);
}
const params: ValidationParams = {
consumer_address: transferData.nftReceiver,
did: agreement.did,
agreement_id: transferData.agreementId,
nft_amount: BigNumber.from(transferData.nftAmount || '0'),
buyer: (req.user || {}).buyer,
}
const plugin = nevermined.assets.servicePlugin['nft-sales']
const [from] = await nevermined.accounts.list()
await plugin.process(params, from, undefined)
return 'success'
};
const plugin = nevermined.assets.servicePlugin['nft-sales'];
const [from] = await nevermined.accounts.list();
await plugin.process(params, from, undefined);
return 'success';
}

@Get('download/:index')
Expand All @@ -141,9 +141,9 @@ export class AccessController {
@Param('index') index: number,
): Promise<StreamableFile | string> {
if (!req.user.did) {
throw new BadRequestException('DID not specified')
throw new BadRequestException('DID not specified');
}
return await this.nvmService.downloadAsset(req.user.did, index, res, req.user.address)
return await this.nvmService.downloadAsset(req.user.did, index, res, req.user.address);
}

@Post('upload/:backend')
Expand All @@ -162,36 +162,36 @@ export class AccessController {
@Param('backend') backend: UploadBackends,
@UploadedFile() file: Express.Multer.File,
): Promise<UploadResult> {
let data: Buffer
let fileName: string
let data: Buffer;
let fileName: string;
if (file) {
data = file.buffer
fileName = file.originalname
data = file.buffer;
fileName = file.originalname;
} else if (uploadData.message) {
data = Buffer.from(uploadData.message)
fileName = `fileUpload_${utils.generateId()}.data${uploadData.encrypt ? '.encrypted' : ''}`
data = Buffer.from(uploadData.message);
fileName = `fileUpload_${utils.generateId()}.data${uploadData.encrypt ? '.encrypted' : ''}`;
} else {
throw new BadRequestException('No file or message in request')
throw new BadRequestException('No file or message in request');
}
console.log(`Backend ${backend}`)
console.log(`Backend ${backend}`);
if (!Object.values(UploadBackends).includes(backend))
throw new BadRequestException(`Backend ${backend} not supported`)
throw new BadRequestException(`Backend ${backend} not supported`);
try {
let url: string
let url: string;
if (uploadData.encrypt) {
// generate password
Logger.debug(`Uploading with password, filename ${fileName}`)
const password = crypto.randomBytes(32).toString('base64url')
data = Buffer.from(aes_encryption_256(data, password), 'binary')
url = await this.nvmService.uploadToBackend(backend, data, fileName)
return { url, password }
Logger.debug(`Uploading with password, filename ${fileName}`);
const password = crypto.randomBytes(32).toString('base64url');
data = Buffer.from(aes_encryption_256(data, password), 'binary');
url = await this.nvmService.uploadToBackend(backend, data, fileName);
return { url, password };
}

url = await this.nvmService.uploadToBackend(backend, data, fileName)
return { url }
url = await this.nvmService.uploadToBackend(backend, data, fileName);
return { url };
} catch (error) {
Logger.error(`Error processing upload: ${error.message}`)
throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR)
Logger.error(`Error processing upload: ${error.message}`);
throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}

0 comments on commit 6c7f04a

Please sign in to comment.