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:
parent
d29b29f161
commit
b007286f4a
@ -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"
|
||||||
},
|
},
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
14
packages/backend/test/fixtures/deployments.json
vendored
14
packages/backend/test/fixtures/deployments.json
vendored
@ -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",
|
||||||
|
77
packages/backend/test/publish-deploy-records.ts
Normal file
77
packages/backend/test/publish-deploy-records.ts
Normal 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);
|
||||||
|
});
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user