Integrate SP auctions for app deployment #2

Merged
nabarun merged 42 commits from ng-integrate-auction into main 2024-10-18 12:37:01 +00:00
3 changed files with 39 additions and 26 deletions
Showing only changes of commit f374fa69ff - Show all commits

View File

@ -14,8 +14,9 @@ import {
ApplicationDeploymentRequest,
ApplicationDeploymentRemovalRequest
} from './entity/Deployment';
import { AppDeploymentRecord, AppDeploymentRemovalRecord, Auction, AuctionData, PackageJSON } from './types';
import { AppDeploymentRecord, AppDeploymentRemovalRecord, AuctionData, PackageJSON } from './types';
import { getConfig, sleep } from './utils';
import { Auction } from '@cerc-io/registry-sdk/dist/proto/cerc/auction/v1/auction';
const log = debug('snowball:registry');
@ -329,7 +330,7 @@ export class Registry {
};
}
async getAuctionWinners(
async getAuctionWinningDeployers(
auctionId: string
): Promise<string[]> {
const records = await this.registry.getAuctionsByIds([auctionId]);
@ -372,11 +373,12 @@ export class Registry {
true
);
// Filter records with ApplicationRecord ID and Deployment specific URL
// Filter records with ApplicationDeploymentRequestId ID and Deployment specific URL
return records.filter((record: AppDeploymentRecord) =>
deployments.some(
(deployment) =>
deployment.applicationDeploymentRequestId === record.attributes.request
deployment.applicationDeploymentRequestId === record.attributes.request &&
record.attributes.url.includes(deployment.id)
)
);
}

View File

@ -274,7 +274,7 @@ type Mutation {
): Project!
addProject(
organizationSlug: String!
data: AddProjectInput
data: AddProjectInput!
lrn: String
auctionData: AuctionData
): Project!

View File

@ -19,7 +19,6 @@ import {
AddProjectFromTemplateInput,
AppDeploymentRecord,
AppDeploymentRemovalRecord,
Auction,
AuctionData,
GitPushEventPayload,
PackageJSON,
@ -41,7 +40,7 @@ interface Config {
export class Service {
private db: Database;
private oauthApp: OAuthApp;
private registry: Registry;
private laconicRegistry: Registry;
private config: Config;
private deployRecordCheckTimeout?: NodeJS.Timeout;
@ -49,7 +48,7 @@ export class Service {
constructor(config: Config, db: Database, app: OAuthApp, registry: Registry) {
this.db = db;
this.oauthApp = app;
this.registry = registry;
this.laconicRegistry = registry;
this.config = config;
this.init();
}
@ -112,7 +111,7 @@ export class Service {
}
// Fetch ApplicationDeploymentRecord for deployments
const records = await this.registry.getDeploymentRecords(deployments);
const records = await this.laconicRegistry.getDeploymentRecords(deployments);
log(`Found ${records.length} ApplicationDeploymentRecords`);
// Update deployments for which ApplicationDeploymentRecords were returned
@ -145,7 +144,7 @@ export class Service {
// Fetch ApplicationDeploymentRemovalRecords for deployments
const records =
await this.registry.getDeploymentRemovalRecords(deployments);
await this.laconicRegistry.getDeploymentRemovalRecords(deployments);
log(`Found ${records.length} ApplicationDeploymentRemovalRecords`);
// Update deployments for which ApplicationDeploymentRemovalRecords were returned
@ -205,6 +204,11 @@ export class Service {
// Update deployment data for ApplicationDeploymentRecords
const deploymentUpdatePromises = records.map(async (record) => {
const deployment = recordToDeploymentsMap[record.attributes.request];
const project = await this.getProjectById(deployment.projectId)
assert(project)
const parts = record.attributes.url.replace('https://', '').split('.');
const baseDomain = parts.slice(1).join('.');
await this.db.updateDeploymentById(deployment.id, {
applicationDeploymentRecordId: record.id,
@ -273,6 +277,13 @@ export class Service {
);
await this.db.deleteDeploymentById(deployment.id);
const project = await this.db.getProjectById(deployment.projectId);
const updatedBaseDomains = project!.baseDomains!.filter(baseDomain => baseDomain !== deployment.baseDomain);
await this.db.updateProjectById(deployment.projectId, {
baseDomains: updatedBaseDomains
});
});
await Promise.all(deploymentUpdatePromises);
@ -294,7 +305,7 @@ export class Service {
const projects = allProjects.filter(project => project.deployments.length === 0);
const auctionIds = projects.map((project) => project.auctionId);
const completedAuctionIds = await this.registry.getCompletedAuctionIds(auctionIds);
const completedAuctionIds = await this.laconicRegistry.getCompletedAuctionIds(auctionIds);
if (completedAuctionIds) {
const projectsToBedeployed = projects.filter((project) =>
@ -302,12 +313,12 @@ export class Service {
);
for (const project of projectsToBedeployed) {
const deployerLrns = await this.registry.getAuctionWinners(project!.auctionId!);
const deployerLrns = await this.laconicRegistry.getAuctionWinningDeployers(project!.auctionId!);
// Update project with deployer LRNs
await this.db.updateProjectById(project.id!, {
deployerLrns
})
});
for (const deployer of deployerLrns) {
await this.createDeploymentFromAuction(project, deployer);
@ -619,7 +630,7 @@ export class Service {
// TODO: Set environment variables for each deployment (environment variables can`t be set in application record)
const { applicationRecordId, applicationRecordData } =
await this.registry.createApplicationRecord({
await this.laconicRegistry.createApplicationRecord({
appName: repo,
packageJSON,
appType: data.project!.template!,
@ -678,7 +689,7 @@ export class Service {
if (data.environment === Environment.Production) {
// On deleting deployment later, project DNS deployment is also deleted
// So publish project DNS deployment first so that ApplicationDeploymentRecord for the same is available when deleting deployment later
await this.registry.createApplicationDeploymentRequest({
await this.laconicRegistry.createApplicationDeploymentRequest({
deployment: newDeployment,
appName: repo,
repository: repoUrl,
@ -689,7 +700,7 @@ export class Service {
}
const { applicationDeploymentRequestId, applicationDeploymentRequestData } =
await this.registry.createApplicationDeploymentRequest({
await this.laconicRegistry.createApplicationDeploymentRequest({
deployment: newDeployment,
appName: repo,
repository: repoUrl,
@ -734,8 +745,8 @@ export class Service {
per_page: 1,
});
const lrn = this.registry.getLrn(repo);
const [record] = await this.registry.getRecordsByName(lrn);
const lrn = this.laconicRegistry.getLrn(repo);
const [record] = await this.laconicRegistry.getRecordsByName(lrn);
const applicationRecordId = record.id;
const applicationRecordData = record.attributes;
@ -787,7 +798,7 @@ export class Service {
if (deploymentData.environment === Environment.Production) {
// On deleting deployment later, project DNS deployment is also deleted
// So publish project DNS deployment first so that ApplicationDeploymentRecord for the same is available when deleting deployment later
await this.registry.createApplicationDeploymentRequest({
await this.laconicRegistry.createApplicationDeploymentRequest({
deployment: newDeployment,
appName: repo,
repository: repoUrl,
@ -800,7 +811,7 @@ export class Service {
const { applicationDeploymentRequestId, applicationDeploymentRequestData } =
// Create requests for all the deployers
await this.registry.createApplicationDeploymentRequest({
await this.laconicRegistry.createApplicationDeploymentRequest({
deployment: newDeployment,
appName: repo,
repository: repoUrl,
@ -908,7 +919,7 @@ export class Service {
};
if (auctionData) {
const { applicationDeploymentAuctionId } = await this.registry.createApplicationDeploymentAuction(repo, octokit, auctionData!, deploymentData);
const { applicationDeploymentAuctionId } = await this.laconicRegistry.createApplicationDeploymentAuction(repo, octokit, auctionData!, deploymentData);
await this.updateProject(project.id, { auctionId: applicationDeploymentAuctionId })
} else {
await this.createDeployment(user.id, octokit, deploymentData, lrn!);
@ -1127,7 +1138,7 @@ export class Service {
const currentDeploymentURL = `https://${(deployment.project.name).toLowerCase()}.${deployment.baseDomain}`;
const deploymentRecords =
await this.registry.getDeploymentRecordsByFilter({
await this.laconicRegistry.getDeploymentRecordsByFilter({
application: deployment.applicationRecordId,
url: currentDeploymentURL,
});
@ -1140,14 +1151,14 @@ export class Service {
return false;
}
await this.registry.createApplicationDeploymentRemovalRequest({
await this.laconicRegistry.createApplicationDeploymentRemovalRequest({
deploymentId: deploymentRecords[0].id,
deployerLrn: deployment.deployerLrn
});
}
const result =
await this.registry.createApplicationDeploymentRemovalRequest({
await this.laconicRegistry.createApplicationDeploymentRemovalRequest({
deploymentId: deployment.applicationDeploymentRecordId,
deployerLrn: deployment.deployerLrn
});
@ -1287,8 +1298,8 @@ export class Service {
async getAuctionData(
auctionId: string
): Promise<Auction> {
const auctions = await this.registry.getAuctionData(auctionId);
): Promise<any> {
const auctions = await this.laconicRegistry.getAuctionData(auctionId);
return auctions[0];
}
}