Skip to content

Commit

Permalink
Ed 4224 config split (#53)
Browse files Browse the repository at this point in the history
* making configs module global
making configs import as dynamic aws
removing configs imports everywhere else

* support multi aws config sources, add tests

* updating config split for the rest of the envs

* linter
  • Loading branch information
StoyanD authored Oct 28, 2024
1 parent ce37e0f commit fd85f9a
Show file tree
Hide file tree
Showing 20 changed files with 158 additions and 57 deletions.
14 changes: 10 additions & 4 deletions config/default.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
export default {
aws: {
region: 'us-east-2',
secretID: 'eco-solver-secrets',
},
aws: [
{
region: 'us-east-2',
secretID: 'eco-solver-secrets-dev',
},
{
region: 'us-east-2',
secretID: 'eco-solver-configs-dev',
},
],
redis: {
options: {
single: {
Expand Down
15 changes: 11 additions & 4 deletions config/preproduction.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
export default {
aws: {
region: 'us-east-2',
secretID: 'eco-solver-secrets-pre-prod',
},
aws: [
{
region: 'us-east-2',
secretID: 'eco-solver-secrets-pre-prod',
},
{
region: 'us-east-2',
secretID: 'eco-solver-configs-pre-prod',
},
],
//don't add anything else here
}
14 changes: 10 additions & 4 deletions config/production.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
export default {
aws: {
region: 'us-east-2',
secretID: 'eco-solver-secrets-prod',
},
aws: [
{
region: 'us-east-2',
secretID: 'eco-solver-secrets-prod',
},
{
region: 'us-east-2',
secretID: 'eco-solver-configs-prod',
},
],
//don't add anything else here
}
15 changes: 11 additions & 4 deletions config/staging.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
export default {
aws: {
region: 'us-east-2',
secretID: 'eco-solver-secrets-staging',
},
aws: [
{
region: 'us-east-2',
secretID: 'eco-solver-secrets-staging',
},
{
region: 'us-east-2',
secretID: 'eco-solver-configs-staging',
},
],
//don't add anything else here
}
4 changes: 1 addition & 3 deletions src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { SolverModule } from './solver/solver.module'
imports: [
BalanceModule,
ChainMonitorModule,
EcoConfigModule,
EcoConfigModule.withAWS(),
EventEmitterModule.forRoot({
// the delimiter used to segment namespaces
delimiter: '.',
Expand All @@ -29,7 +29,6 @@ import { SolverModule } from './solver/solver.module'
SourceIntentModel,
ProcessorModule,
MongooseModule.forRootAsync({
imports: [EcoConfigModule],
inject: [EcoConfigService],
useFactory: async (configService: EcoConfigService) => {
const uri = configService.getMongooseUri()
Expand All @@ -54,7 +53,6 @@ function getPino() {
return EcoConfigService.getStaticConfig().logger.usePino
? [
LoggerModule.forRootAsync({
imports: [EcoConfigModule],
inject: [EcoConfigService],
useFactory: async (configService: EcoConfigService) => {
const loggerConfig = configService.getLoggerConfig()
Expand Down
3 changes: 1 addition & 2 deletions src/balance/balance.module.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import { Module } from '@nestjs/common'
import { EcoConfigModule } from '../eco-configs/eco-config.module'
import { BalanceService } from './balance.service'
import { initBullMQ } from '../bullmq/bullmq.helper'
import { QUEUES } from '../common/redis/constants'
import { BalanceWebsocketService } from './balance.ws.service'
import { TransactionModule } from '../transaction/transaction.module'

@Module({
imports: [EcoConfigModule, TransactionModule, initBullMQ(QUEUES.ETH_SOCKET)],
imports: [TransactionModule, initBullMQ(QUEUES.ETH_SOCKET)],
providers: [BalanceService, BalanceWebsocketService],
exports: [BalanceService],
})
Expand Down
2 changes: 0 additions & 2 deletions src/bullmq/bullmq.helper.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { BullModule } from '@nestjs/bullmq'
import { DynamicModule } from '@nestjs/common'
import { EcoConfigModule } from '../eco-configs/eco-config.module'
import { EcoConfigService } from '../eco-configs/eco-config.service'
import { RedisConnectionUtils } from '../common/redis/redis-connection-utils'
import { QueueInterface } from '../common/redis/constants'
Expand All @@ -13,7 +12,6 @@ import { QueueInterface } from '../common/redis/constants'
export function initBullMQ(queueInterface: QueueInterface): DynamicModule {
return BullModule.registerQueueAsync({
name: queueInterface.queue,
imports: [EcoConfigModule],
useFactory: async (configService: EcoConfigService) => {
return RedisConnectionUtils.getQueueOptions(queueInterface, configService.getRedis())
},
Expand Down
3 changes: 1 addition & 2 deletions src/chain-monitor/chain-monitor.module.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import { Module } from '@nestjs/common'
import { EcoConfigModule } from '../eco-configs/eco-config.module'
import { IntentModule } from '../intent/intent.module'
import { ChainSyncService } from './chain-sync.service'
import { TransactionModule } from '../transaction/transaction.module'

@Module({
imports: [EcoConfigModule, IntentModule, TransactionModule],
imports: [IntentModule, TransactionModule],
providers: [ChainSyncService],
exports: [ChainSyncService],
})
Expand Down
17 changes: 13 additions & 4 deletions src/eco-configs/aws-config.service.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { SecretsManager } from '@aws-sdk/client-secrets-manager'
import { AwsCredentials } from './eco-config.types'
import { AwsCredential } from './eco-config.types'
import { Injectable, Logger, OnModuleInit } from '@nestjs/common'
import * as config from 'config'
import { EcoLogMessage } from '../common/logging/eco-log-message'
import { ConfigSource } from './interfaces/config-source.interface'
import { EcoError } from '../common/errors/eco-error'
import { merge } from 'lodash'

/**
* Service to retrieve AWS secrets from AWS Secrets Manager
Expand Down Expand Up @@ -35,8 +36,16 @@ export class AwsConfigService implements OnModuleInit, ConfigSource {
message: `Initializing aws configs`,
}),
)
const awsCreds = config.get('aws') as AwsCredentials
this._awsConfigs = await this.getAwsSecrets(awsCreds)
let awsCreds = config.get('aws')
if (!Array.isArray(awsCreds)) {
awsCreds = [awsCreds]
}
const creds = await Promise.all(
awsCreds.map(async (cred: AwsCredential) => {
return await this.getAwsSecrets(cred)
}),
)
merge(this._awsConfigs, ...creds)
}

get awsConfigs(): Record<string, string> {
Expand All @@ -48,7 +57,7 @@ export class AwsConfigService implements OnModuleInit, ConfigSource {
* @param awsCreds the aws credentials
* @returns
*/
private async getAwsSecrets(awsCreds: AwsCredentials): Promise<Record<string, string>> {
private async getAwsSecrets(awsCreds: AwsCredential): Promise<Record<string, string>> {
const secretsManager = new SecretsManager({
region: awsCreds.region,
})
Expand Down
45 changes: 35 additions & 10 deletions src/eco-configs/eco-config.module.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,44 @@
import { Module } from '@nestjs/common'
import { DynamicModule, FactoryProvider, Global, Module, Provider } from '@nestjs/common'
import { EcoConfigService } from './eco-config.service'
import { AwsConfigService } from './aws-config.service'

@Global()
@Module({
providers: [
{
providers: [EcoConfigModule.createBaseProvider(), AwsConfigService],
exports: [EcoConfigService, AwsConfigService],
})
export class EcoConfigModule {
static withAWS(): DynamicModule {
return {
global: true,
module: EcoConfigModule,
providers: [EcoConfigModule.createAwsProvider()],
exports: [EcoConfigService],
}
}

static base(): DynamicModule {
return {
global: true,
module: EcoConfigModule,
providers: [EcoConfigModule.createBaseProvider()],
exports: [EcoConfigService],
}
}

static createAwsProvider(): Provider {
const dynamicConfig: FactoryProvider<EcoConfigService> = {
provide: EcoConfigService,
useFactory: async (awsConfigService: AwsConfigService) => {
await awsConfigService.initConfigs()
return new EcoConfigService(awsConfigService)
return new EcoConfigService([awsConfigService])
},
inject: [AwsConfigService],
},
AwsConfigService,
],
exports: [EcoConfigService, AwsConfigService],
})
export class EcoConfigModule {}
}
return dynamicConfig
}

static createBaseProvider(): Provider {
return EcoConfigService
}
}
9 changes: 6 additions & 3 deletions src/eco-configs/eco-config.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,14 @@ import { addressKeys } from '../common/viem/utils'
@Injectable()
export class EcoConfigService implements OnModuleInit {
private logger = new Logger(EcoConfigService.name)
private externalConfigs: any
private externalConfigs: any = {}
private ecoConfig: config.IConfig

constructor(private readonly configSource: ConfigSource) {
this.externalConfigs = configSource.getConfig()
constructor(private readonly sources: ConfigSource[]) {
this.sources.reduce((prev, curr) => {
return config.util.extendDeep(prev, curr.getConfig())
}, this.externalConfigs)

this.ecoConfig = config
this.initConfigs()
}
Expand Down
4 changes: 2 additions & 2 deletions src/eco-configs/eco-config.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export type EcoConfigType = {
}
pollingInterval: number
}
aws: AwsCredentials
aws: AwsCredential[]
database: {
auth: MongoAuthType
uriPrefix: string
Expand Down Expand Up @@ -75,7 +75,7 @@ export type RedisConfig = {
/**
* The config type for the aws credentials
*/
export type AwsCredentials = {
export type AwsCredential = {
region: string
secretID: string
}
Expand Down
52 changes: 52 additions & 0 deletions src/eco-configs/tests/aws-config.service.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
const mockConfigGet = jest.fn()
import { Test, TestingModule } from '@nestjs/testing'
import { AwsConfigService } from '../aws-config.service'
import { merge } from 'lodash'

jest.mock('config', () => {
return {
get: mockConfigGet,
}
})

describe('Aws Config Helper Tests', () => {
let awsConfigService: AwsConfigService
let mockLog: jest.Mock
let mockAwsGet: jest.Mock
const awsConfigSingle = { region: 'us-florida', secretID: 'secrets' }
const awsConfigSingleData = { key: 1, value: 'value1' }
const awsConfigArray = [awsConfigSingle, { region: 'us-california', secretID: 'configs' }]
const awsConfigArrayData = [awsConfigSingleData, { key: 3, value_second: 'value3' }]
beforeEach(async () => {
const configMod: TestingModule = await Test.createTestingModule({
providers: [AwsConfigService],
}).compile()

awsConfigService = configMod.get<AwsConfigService>(AwsConfigService)
mockLog = jest.fn()
mockAwsGet = jest.fn()
})

it('should read single aws credential', async () => {
mockConfigGet.mockReturnValue(awsConfigSingle)
awsConfigService['getAwsSecrets'] = mockAwsGet.mockResolvedValue(awsConfigSingleData)
await awsConfigService.initConfigs()
expect(awsConfigService.getConfig()).toEqual(awsConfigSingleData)
})

it('should read array of aws credentials', async () => {
mockConfigGet.mockReturnValue(awsConfigArray)
let index = 0
awsConfigService['getAwsSecrets'] = mockAwsGet.mockImplementation(() => {
return awsConfigArrayData[index++]
})
const me = {}
awsConfigArrayData.forEach((data) => {
merge(me, data)
})
merge({}, ...awsConfigArrayData)

await awsConfigService.initConfigs()
expect(awsConfigService.getConfig()).toEqual(me)
})
})
2 changes: 1 addition & 1 deletion src/eco-configs/tests/eco-config.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ describe('Eco Config Helper Tests', () => {
provide: EcoConfigService,
useFactory: async (awsConfigService: AwsConfigService) => {
await awsConfigService.initConfigs()
return new EcoConfigService(awsConfigService)
return new EcoConfigService([awsConfigService])
},
inject: [AwsConfigService],
},
Expand Down
3 changes: 1 addition & 2 deletions src/health/health.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@ import { BalanceHealthIndicator } from './indicators/balance.indicator'
import { RedisHealthModule } from '@liaoliaots/nestjs-redis-health'
import { EcoRedisHealthIndicator } from './indicators/eco-redis.indicator'
import { MongoDBHealthIndicator } from './indicators/mongodb.indicator'
import { EcoConfigModule } from '../eco-configs/eco-config.module'
import { PermissionHealthIndicator } from './indicators/permission.indicator'
import { TransactionModule } from '../transaction/transaction.module'
import { GitCommitHealthIndicator } from './indicators/git-commit.indicator'

@Module({
imports: [EcoConfigModule, TransactionModule, RedisHealthModule, TerminusModule],
imports: [TransactionModule, RedisHealthModule, TerminusModule],
controllers: [HealthController],
providers: [
HealthService,
Expand Down
2 changes: 0 additions & 2 deletions src/intent/intent.module.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { Module } from '@nestjs/common'
import { EcoConfigModule } from '../eco-configs/eco-config.module'
import { initBullMQ } from '../bullmq/bullmq.helper'
import { QUEUES } from '../common/redis/constants'
import { SourceIntentModel, SourceIntentSchema } from './schemas/source-intent.schema'
Expand All @@ -18,7 +17,6 @@ import { SolverModule } from '../solver/solver.module'
@Module({
imports: [
BalanceModule,
EcoConfigModule,
MongooseModule.forFeature([{ name: SourceIntentModel.name, schema: SourceIntentSchema }]),
ProverModule,
SolverModule,
Expand Down
3 changes: 1 addition & 2 deletions src/prover/prover.module.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { Module } from '@nestjs/common'
import { ProofService } from './proof.service'
import { TransactionModule } from '../transaction/transaction.module'
import { EcoConfigModule } from '../eco-configs/eco-config.module'

@Module({
imports: [TransactionModule, EcoConfigModule],
imports: [TransactionModule],
providers: [ProofService],
exports: [ProofService],
})
Expand Down
2 changes: 0 additions & 2 deletions src/sign/sign.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,12 @@ import { MongooseModule } from '@nestjs/mongoose'
import { Nonce, NonceSchema } from './schemas/nonce.schema'
import { initBullMQ } from '../bullmq/bullmq.helper'
import { QUEUES } from '../common/redis/constants'
import { EcoConfigModule } from '../eco-configs/eco-config.module'
import { SignerService } from './signer.service'
import { AtomicSignerService } from './atomic-signer.service'
import { NonceService } from './nonce.service'

@Module({
imports: [
EcoConfigModule,
MongooseModule.forFeature([{ name: Nonce.name, schema: NonceSchema }]),
initBullMQ(QUEUES.SIGNER),
],
Expand Down
Loading

0 comments on commit fd85f9a

Please sign in to comment.