Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(server): impl bucket domain service #661

Merged
merged 1 commit into from
Jan 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions server/src/application/application-task.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { StorageService } from '../storage/storage.service'
import { DatabaseService } from '../database/database.service'
import { ClusterService } from 'src/region/cluster/cluster.service'
import { RegionService } from 'src/region/region.service'
import { GatewayService } from 'src/gateway/gateway.service'
import { FunctionDomainService } from 'src/gateway/function-domain.service'

@Injectable()
export class ApplicationTaskService {
Expand All @@ -18,7 +18,7 @@ export class ApplicationTaskService {
private readonly clusterService: ClusterService,
private readonly storageService: StorageService,
private readonly databaseService: DatabaseService,
private readonly gatewayService: GatewayService,
private readonly gatewayService: FunctionDomainService,
private readonly prisma: PrismaService,
) {}

Expand Down
4 changes: 2 additions & 2 deletions server/src/application/application.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import { ApplicationService } from './application.service'
import { FunctionService } from '../function/function.service'
import { StorageService } from 'src/storage/storage.service'
import { RegionService } from 'src/region/region.service'
import { GatewayService } from 'src/gateway/gateway.service'
import { FunctionDomainService } from 'src/gateway/function-domain.service'

@ApiTags('Application')
@Controller('applications')
Expand All @@ -37,7 +37,7 @@ export class ApplicationController {
private readonly appService: ApplicationService,
private readonly funcService: FunctionService,
private readonly regionService: RegionService,
private readonly gatewayService: GatewayService,
private readonly gatewayService: FunctionDomainService,
private readonly storageService: StorageService,
) {}

Expand Down
42 changes: 40 additions & 2 deletions server/src/gateway/apisix.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { HttpService } from '@nestjs/axios'
import { Injectable, Logger } from '@nestjs/common'
import { Region } from '@prisma/client'
import { GetApplicationNamespaceById } from 'src/utils/getter'
import { GetApplicationNamespaceById } from '../utils/getter'

@Injectable()
export class ApisixService {
Expand All @@ -27,7 +27,7 @@ export class ApisixService {
},
},
timeout: {
connect: 600,
connect: 60,
send: 600,
read: 600,
},
Expand All @@ -47,6 +47,44 @@ export class ApisixService {
return res
}

async createBucketRoute(region: Region, bucketName: string, domain: string) {
const host = domain

const minioUrl = new URL(region.storageConf.internalEndpoint)
const upstreamNode = minioUrl.host

const id = `bucket-${bucketName}`
const data = {
name: id,
uri: '/*',
hosts: [host],
priority: 9,
upstream: {
type: 'roundrobin',
nodes: {
[upstreamNode]: 1,
},
},
timeout: {
connect: 60,
send: 600,
read: 600,
},
plugins: {
cors: {},
},
}

const res = await this.putRoute(region, id, data)
return res
}

async deleteBucketRoute(region: Region, bucketName: string) {
const id = `bucket-${bucketName}`
const res = await this.deleteRoute(region, id)
return res
}

async putRoute(region: Region, id: string, data: any) {
const conf = region.gatewayConf
const api_url = `${conf.apiUrl}/routes/${id}`
Expand Down
79 changes: 79 additions & 0 deletions server/src/gateway/bucket-domain.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { Injectable, Logger } from '@nestjs/common'
import { StorageBucket } from '@prisma/client'
import { PrismaService } from '../prisma.service'
import { RegionService } from '../region/region.service'
import { ApisixService } from './apisix.service'
import * as assert from 'node:assert'

@Injectable()
export class BucketDomainService {
private readonly logger = new Logger(BucketDomainService.name)

constructor(
private readonly prisma: PrismaService,
private readonly regionService: RegionService,
private readonly apisixService: ApisixService,
) {}

async create(bucket: StorageBucket) {
const region = await this.regionService.findByAppId(bucket.appid)
assert(region, 'region not found')

const bucket_domain = `${bucket.name}.${region.storageConf.domain}`

// create route first
const route = await this.apisixService.createBucketRoute(
region,
bucket.name,
bucket_domain,
)

this.logger.debug('route created:', route)

// create domain in db
const doc = await this.prisma.bucketDomain.create({
data: {
appid: bucket.appid,
domain: bucket_domain,
bucket: {
connect: {
name: bucket.name,
},
},
state: 'Active',
},
})

return doc
}

async findOne(bucket: StorageBucket) {
const doc = await this.prisma.bucketDomain.findFirst({
where: {
bucket: {
name: bucket.name,
},
},
})

return doc
}

async delete(bucket: StorageBucket) {
// delete route first
const region = await this.regionService.findByAppId(bucket.appid)
assert(region, 'region not found')

const res = await this.apisixService.deleteBucketRoute(region, bucket.name)
this.logger.debug('route deleted:', res)

// delete domain in db
const doc = await this.prisma.bucketDomain.delete({
where: {
bucketName: bucket.name,
},
})

return doc
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import { RegionService } from '../region/region.service'
import { ApisixService } from './apisix.service'

@Injectable()
export class GatewayService {
private readonly logger = new Logger(GatewayService.name)
export class FunctionDomainService {
private readonly logger = new Logger(FunctionDomainService.name)

constructor(
private readonly prisma: PrismaService,
Expand Down
12 changes: 9 additions & 3 deletions server/src/gateway/gateway.module.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
import { Module } from '@nestjs/common'
import { GatewayService } from './gateway.service'
import { FunctionDomainService } from './function-domain.service'
import { ApisixService } from './apisix.service'
import { RegionModule } from 'src/region/region.module'
import { PrismaService } from 'src/prisma.service'
import { HttpModule } from '@nestjs/axios'
import { BucketDomainService } from './bucket-domain.service'

@Module({
imports: [RegionModule, HttpModule],
providers: [GatewayService, ApisixService, PrismaService],
exports: [GatewayService],
providers: [
FunctionDomainService,
ApisixService,
PrismaService,
BucketDomainService,
],
exports: [FunctionDomainService, BucketDomainService],
})
export class GatewayModule {}
2 changes: 1 addition & 1 deletion server/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ async function bootstrap() {
app.enableCors({
origin: '*',
methods: HTTP_METHODS,
credentials: true,
credentials: false,
allowedHeaders: ['Content-Type', 'Authorization'],
})

Expand Down
23 changes: 21 additions & 2 deletions server/src/storage/bucket.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Injectable, Logger } from '@nestjs/common'
import { Application, StorageBucket } from '@prisma/client'
import { PrismaService } from 'src/prisma.service'
import { RegionService } from 'src/region/region.service'
import { BucketDomainService } from 'src/gateway/bucket-domain.service'
import { PrismaService } from '../prisma.service'
import { RegionService } from '../region/region.service'
import { CreateBucketDto } from './dto/create-bucket.dto'
import { UpdateBucketDto } from './dto/update-bucket.dto'
import { MinioService } from './minio/minio.service'
Expand All @@ -14,6 +15,7 @@ export class BucketService {
private readonly minioService: MinioService,
private readonly regionService: RegionService,
private readonly prisma: PrismaService,
private readonly domainService: BucketDomainService,
) {}

/**
Expand Down Expand Up @@ -45,6 +47,10 @@ export class BucketService {
shortName: dto.shortName,
},
})

// create domain for bucket
await this.domainService.create(bucket)

return bucket
} catch (error) {
this.logger.error('create bucket in db failed: ', error)
Expand All @@ -63,6 +69,9 @@ export class BucketService {
appid,
name,
},
include: {
domain: true,
},
})

return bucket
Expand All @@ -73,6 +82,9 @@ export class BucketService {
where: {
appid,
},
include: {
domain: true,
},
})

return buckets
Expand Down Expand Up @@ -108,6 +120,13 @@ export class BucketService {
* @todo delete gateway route if exists
*/
async delete(bucket: StorageBucket) {
// delete bucket in minio
const region = await this.regionService.findByAppId(bucket.appid)
await this.minioService.deleteBucket(region, bucket.name)

// delete bucket domain
await this.domainService.delete(bucket)

const res = await this.prisma.storageBucket.delete({
where: {
name: bucket.name,
Expand Down
2 changes: 1 addition & 1 deletion server/src/storage/dto/create-bucket.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export class CreateBucketDto {
description: 'The short name of the bucket which not contain the appid',
})
@IsNotEmpty()
@Length(3, 32)
@Length(1, 32)
shortName: string

@ApiProperty({
Expand Down
3 changes: 2 additions & 1 deletion server/src/storage/storage.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import { PrismaService } from 'src/prisma.service'
import { ApplicationService } from 'src/application/application.service'
import { BucketService } from './bucket.service'
import { RegionModule } from 'src/region/region.module'
import { GatewayModule } from 'src/gateway/gateway.module'

@Module({
imports: [RegionModule],
imports: [RegionModule, GatewayModule],
controllers: [BucketController],
providers: [
MinioService,
Expand Down