Add script to publish dummy ApplicationDeploymentRecord (#72)

* Add script to publish application deployment record

* Refactor publish deploy records script

* Assert if name doesn't exist in package.json

* Disable import environment variables button

---------

Co-authored-by: neeraj <neeraj.rtly@gmail.com>
This commit is contained in:
Nabarun Gogoi 2024-02-16 15:05:52 +05:30 committed by GitHub
parent d29b29f161
commit b007286f4a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 102 additions and 19 deletions

View File

@ -37,6 +37,7 @@
"format": "prettier --write .", "format": "prettier --write .",
"format:check": "prettier --check .", "format:check": "prettier --check .",
"registry:init": "DEBUG=snowball:* ts-node ./test/initialize-registry.ts", "registry:init": "DEBUG=snowball:* ts-node ./test/initialize-registry.ts",
"registry:publish-deploy-records": "DEBUG=snowball:* ts-node ./test/publish-deploy-records.ts",
"db:load:fixtures": "DEBUG=snowball:* ts-node ./test/initialize-db.ts", "db:load:fixtures": "DEBUG=snowball:* ts-node ./test/initialize-db.ts",
"db:delete": "DEBUG=snowball:* ts-node ./test/delete-db.ts" "db:delete": "DEBUG=snowball:* ts-node ./test/delete-db.ts"
}, },

View File

@ -127,9 +127,7 @@ export class Database {
} }
async getDeploymentsByProjectId (projectId: string): Promise<Deployment[]> { async getDeploymentsByProjectId (projectId: string): Promise<Deployment[]> {
const deploymentRepository = this.dataSource.getRepository(Deployment); const deployments = await this.getDeployments({
const deployments = await deploymentRepository.find({
relations: { relations: {
project: true, project: true,
domain: true, domain: true,
@ -148,6 +146,13 @@ export class Database {
return deployments; return deployments;
} }
async getDeployments (options: FindManyOptions<Deployment>): Promise<Deployment[]> {
const deploymentRepository = this.dataSource.getRepository(Deployment);
const deployments = await deploymentRepository.find(options);
return deployments;
}
async getDeployment (options: FindOneOptions<Deployment>): Promise<Deployment | null> { async getDeployment (options: FindOneOptions<Deployment>): Promise<Deployment | null> {
const deploymentRepository = this.dataSource.getRepository(Deployment); const deploymentRepository = this.dataSource.getRepository(Deployment);
const deployment = await deploymentRepository.findOne(options); const deployment = await deploymentRepository.findOne(options);
@ -166,12 +171,10 @@ export class Database {
const deploymentRepository = this.dataSource.getRepository(Deployment); const deploymentRepository = this.dataSource.getRepository(Deployment);
const id = nanoid(); const id = nanoid();
const url = `${data.project!.name}-${id}.${PROJECT_DOMAIN}`;
const updatedData = { const updatedData = {
...data, ...data,
id, id
url
}; };
const deployment = await deploymentRepository.save(updatedData); const deployment = await deploymentRepository.save(updatedData);

View File

@ -28,7 +28,7 @@ export enum DeploymentStatus {
export interface ApplicationRecord { export interface ApplicationRecord {
type: string; type: string;
version:string version:string
name?: string name: string
description?: string description?: string
homepage?: string homepage?: string
license?: string license?: string
@ -65,8 +65,8 @@ export class Deployment {
@Column('varchar') @Column('varchar')
commitMessage!: string; commitMessage!: string;
@Column('varchar') @Column('varchar', { nullable: true })
url!: string; url!: string | null;
@Column('varchar') @Column('varchar')
registryRecordId!: string; registryRecordId!: string;

View File

@ -36,6 +36,7 @@ export class Registry {
appType: string, appType: string,
repoUrl: string repoUrl: string
}): Promise<{registryRecordId: string, registryRecordData: ApplicationRecord}> { }): Promise<{registryRecordId: string, registryRecordData: ApplicationRecord}> {
assert(packageJSON.name, "name field doesn't exist in package.json");
// Use laconic-sdk to publish record // Use laconic-sdk to publish record
// Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts/publish-app-record.sh // Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts/publish-app-record.sh
// Fetch previous records // Fetch previous records
@ -58,7 +59,7 @@ export class Registry {
repository_ref: commitHash, repository_ref: commitHash,
repository: [repoUrl], repository: [repoUrl],
app_type: appType, app_type: appType,
...(packageJSON.name && { name: packageJSON.name }), name: packageJSON.name,
...(packageJSON.description && { description: packageJSON.description }), ...(packageJSON.description && { description: packageJSON.description }),
...(packageJSON.homepage && { homepage: packageJSON.homepage }), ...(packageJSON.homepage && { homepage: packageJSON.homepage }),
...(packageJSON.license && { license: packageJSON.license }), ...(packageJSON.license && { license: packageJSON.license }),
@ -79,7 +80,7 @@ export class Registry {
log('Application record data:', applicationRecord); log('Application record data:', applicationRecord);
// TODO: Discuss computation of CRN // TODO: Discuss computation of CRN
const crn = this.getCrn(packageJSON.name ?? ''); const crn = this.getCrn(packageJSON.name);
log(`Setting name: ${crn} for record ID: ${result.data.id}`); log(`Setting name: ${crn} for record ID: ${result.data.id}`);
await this.registry.setName({ cid: result.data.id, crn }, this.registryConfig.privateKey, this.registryConfig.fee); await this.registry.setName({ cid: result.data.id, crn }, this.registryConfig.privateKey, this.registryConfig.fee);

View File

@ -4,7 +4,7 @@
"domainIndex":0, "domainIndex":0,
"createdByIndex": 0, "createdByIndex": 0,
"id":"ffhae3zq", "id":"ffhae3zq",
"status": "Building", "status": "Ready",
"environment": "Production", "environment": "Production",
"isCurrent": true, "isCurrent": true,
"registryRecordId": "qbafyrehvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowoi", "registryRecordId": "qbafyrehvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowoi",
@ -34,7 +34,7 @@
"domainIndex":2, "domainIndex":2,
"createdByIndex": 0, "createdByIndex": 0,
"id":"qmgekyte", "id":"qmgekyte",
"status": "Error", "status": "Ready",
"environment": "Development", "environment": "Development",
"isCurrent": false, "isCurrent": false,
"registryRecordId": "ebafyreihvzya6ovp4yfpkqnddkui2iw7t6bhwq74lbqs7bhobvmfhrowoi", "registryRecordId": "ebafyreihvzya6ovp4yfpkqnddkui2iw7t6bhwq74lbqs7bhobvmfhrowoi",
@ -64,7 +64,7 @@
"domainIndex":3, "domainIndex":3,
"createdByIndex": 1, "createdByIndex": 1,
"id":"eO8cckxk", "id":"eO8cckxk",
"status": "Building", "status": "Ready",
"environment": "Production", "environment": "Production",
"isCurrent": true, "isCurrent": true,
"registryRecordId": "tbafyreihvzya6ovp4yfpqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowoi", "registryRecordId": "tbafyreihvzya6ovp4yfpqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowoi",
@ -94,7 +94,7 @@
"domainIndex":5, "domainIndex":5,
"createdByIndex": 1, "createdByIndex": 1,
"id":"hwwr6sbx", "id":"hwwr6sbx",
"status": "Error", "status": "Ready",
"environment": "Development", "environment": "Development",
"isCurrent": false, "isCurrent": false,
"registryRecordId": "ubafyreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvfhrowoi", "registryRecordId": "ubafyreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvfhrowoi",
@ -109,7 +109,7 @@
"domainIndex":9, "domainIndex":9,
"createdByIndex": 2, "createdByIndex": 2,
"id":"ndxje48a", "id":"ndxje48a",
"status": "Building", "status": "Ready",
"environment": "Production", "environment": "Production",
"isCurrent": true, "isCurrent": true,
"registryRecordId": "ibayreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowoi", "registryRecordId": "ibayreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowoi",
@ -139,7 +139,7 @@
"domainIndex":8, "domainIndex":8,
"createdByIndex": 2, "createdByIndex": 2,
"id":"b4bpthjr", "id":"b4bpthjr",
"status": "Error", "status": "Ready",
"environment": "Development", "environment": "Development",
"isCurrent": false, "isCurrent": false,
"registryRecordId": "pbafyreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowo", "registryRecordId": "pbafyreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowo",
@ -154,7 +154,7 @@
"domainIndex": 6, "domainIndex": 6,
"createdByIndex": 2, "createdByIndex": 2,
"id":"b4bpthjr", "id":"b4bpthjr",
"status": "Building", "status": "Ready",
"environment": "Production", "environment": "Production",
"isCurrent": true, "isCurrent": true,
"registryRecordId": "pbafyreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowo", "registryRecordId": "pbafyreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowo",

View File

@ -0,0 +1,77 @@
import debug from 'debug';
import { DataSource } from 'typeorm';
import path from 'path';
import { Registry } from '@cerc-io/laconic-sdk';
import { Config } from '../src/config';
import { DEFAULT_CONFIG_FILE_PATH, PROJECT_DOMAIN } from '../src/constants';
import { getConfig } from '../src/utils';
import { Deployment, DeploymentStatus } from '../src/entity/Deployment';
const log = debug('snowball:publish-deploy-records');
async function main () {
const { registryConfig, database } = await getConfig<Config>(DEFAULT_CONFIG_FILE_PATH);
const registry = new Registry(registryConfig.gqlEndpoint, registryConfig.restEndpoint, registryConfig.chainId);
const dataSource = new DataSource({
type: 'better-sqlite3',
database: database.dbPath,
synchronize: true,
entities: [path.join(__dirname, '../src/entity/*')]
});
await dataSource.initialize();
const deploymentRepository = dataSource.getRepository(Deployment);
const deployments = await deploymentRepository.find({
relations: {
project: true
},
where: {
status: DeploymentStatus.Building
}
});
for await (const deployment of deployments) {
const url = `${deployment.project.name}-${deployment.id}.${PROJECT_DOMAIN}`;
const applicationDeploymentRecord = {
type: 'ApplicationDeploymentRecord',
version: '0.0.1',
name: deployment.registryRecordData.name,
application: deployment.registryRecordId,
// TODO: Create DNS record
dns: 'bafyreihlymqggsgqiqawvehkpr2imt4l3u6q7um7xzjrux5rhsvwnuyewm',
// Using dummy values
meta: JSON.stringify({
config: 'da39a3ee5e6b4b0d3255bfef95601890afd80709',
so: '66fcfa49a1664d4cb4ce4f72c1c0e151'
}),
request: deployment.project.registryRecordId,
url
};
const result = await registry.setRecord(
{
privateKey: registryConfig.privateKey,
record: applicationDeploymentRecord,
bondId: registryConfig.bondId
},
'',
registryConfig.fee
);
log('Application deployment record data:', applicationDeploymentRecord);
log(`Application deployment record published: ${result.data.id}`);
}
}
main().catch((err) => {
log(err);
});

View File

@ -171,7 +171,8 @@ export const EnvironmentVariablesTabPanel = () => {
> >
+ Add variable + Add variable
</Button> </Button>
<Button variant="outlined" size="sm"> {/* TODO: Implement import environment varible functionality */}
<Button variant="outlined" size="sm" disabled>
^ Import .env ^ Import .env
</Button> </Button>
</div> </div>