Skip to content
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
9 changes: 6 additions & 3 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ aliases:
- oss-clu # OSS Cluster
- oss-clu-tls # OSS Cluster with TLS enabled
- oss-sent # OSS Sentinel
- oss-sent-tls-auth # OSS Sentinel with TLS auth
- re-st # Redis Enterprise with Standalone inside
- re-clu # Redis Enterprise with Cluster inside
- re-crdt # Redis Enterprise with active-active database inside
Expand All @@ -99,6 +100,7 @@ aliases:
- oss-st-6-tls-auth # OSS Standalone v6 with TLS auth required
- oss-clu-tls # OSS Cluster with TLS enabled
- re-crdt # Redis Enterprise with active-active database inside
- oss-sent-tls-auth # OSS Sentinel with TLS auth
guides-filter: &guidesFilter
filters:
branches:
Expand Down Expand Up @@ -894,10 +896,11 @@ workflows:
matrix:
alias: itest-code
parameters:
rte: *iTestsNamesShort
rte: *iTestsNames
# rte: *iTestsNamesShort
name: ITest - << matrix.rte >> (code)
requires:
- UTest - API
# requires:
# - UTest - API
# E2E tests for "e2e/feature" or "e2e/bugfix" branches only
e2e-tests:
jobs:
Expand Down
6 changes: 3 additions & 3 deletions redisinsight/api/config/ormconfig.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { DatabaseInstanceEntity } from 'src/modules/core/models/database-instance.entity';
import { ServerEntity } from 'src/modules/core/models/server.entity';
import { ServerEntity } from 'src/modules/server/entities/server.entity';
import { CommandExecutionEntity } from 'src/modules/workbench/entities/command-execution.entity';
import { PluginStateEntity } from 'src/modules/workbench/entities/plugin-state.entity';
import { NotificationEntity } from 'src/modules/notification/entities/notification.entity';
Expand All @@ -10,6 +9,7 @@ import { AgreementsEntity } from 'src/modules/settings/entities/agreements.entit
import { SettingsEntity } from 'src/modules/settings/entities/settings.entity';
import { CaCertificateEntity } from 'src/modules/certificate/entities/ca-certificate.entity';
import { ClientCertificateEntity } from 'src/modules/certificate/entities/client-certificate.entity';
import { DatabaseEntity } from 'src/modules/database/entities/database.entity';
import migrations from '../migration';
import * as config from '../src/utils/config';

Expand All @@ -24,7 +24,7 @@ const ormConfig = {
AgreementsEntity,
CaCertificateEntity,
ClientCertificateEntity,
DatabaseInstanceEntity,
DatabaseEntity,
ServerEntity,
SettingsEntity,
CommandExecutionEntity,
Expand Down
10 changes: 5 additions & 5 deletions redisinsight/api/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import * as fs from 'fs';
import {
MiddlewareConsumer, Module, NestModule, OnModuleInit,
} from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ServeStaticModule } from '@nestjs/serve-static';
import { EventEmitterModule } from '@nestjs/event-emitter';
import { RouterModule } from 'nest-router';
Expand All @@ -17,6 +16,8 @@ import { NotificationModule } from 'src/modules/notification/notification.module
import { BulkActionsModule } from 'src/modules/bulk-actions/bulk-actions.module';
import { ClusterMonitorModule } from 'src/modules/cluster-monitor/cluster-monitor.module';
import { DatabaseAnalysisModule } from 'src/modules/database-analysis/database-analysis.module';
import { ServerModule } from 'src/modules/server/server.module';
import { LocalDatabaseModule } from 'src/local-database.module';
import { SharedModule } from './modules/shared/shared.module';
import { InstancesModule } from './modules/instances/instances.module';
import { BrowserModule } from './modules/browser/browser.module';
Expand All @@ -25,17 +26,16 @@ import { RedisSentinelModule } from './modules/redis-sentinel/redis-sentinel.mod
import { ProfilerModule } from './modules/profiler/profiler.module';
import { CliModule } from './modules/cli/cli.module';
import { StaticsManagementModule } from './modules/statics-management/statics-management.module';
import { ServerInfoController } from './controllers/server-info.controller';
import { ExcludeRouteMiddleware } from './middleware/exclude-route.middleware';
import { routes } from './app.routes';
import { ormModuleOptions } from '../config/ormconfig';

const SERVER_CONFIG = config.get('server');
const PATH_CONFIG = config.get('dir_path');

@Module({
imports: [
TypeOrmModule.forRoot(ormModuleOptions),
LocalDatabaseModule,
ServerModule.register(),
RouterModule.forRoutes(routes),
SharedModule,
InstancesModule,
Expand Down Expand Up @@ -80,7 +80,7 @@ const PATH_CONFIG = config.get('dir_path');
}),
StaticsManagementModule,
],
controllers: [ServerInfoController],
controllers: [],
providers: [],
})
export class AppModule implements OnModuleInit, NestModule {
Expand Down
12 changes: 1 addition & 11 deletions redisinsight/api/src/app.routes.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { Routes } from 'nest-router';
import { InstancesModule } from 'src/modules/instances/instances.module';
import { BrowserModule } from 'src/modules/browser/browser.module';
import { RedisEnterpriseModule } from 'src/modules/redis-enterprise/redis-enterprise.module';
import { RedisSentinelModule } from 'src/modules/redis-sentinel/redis-sentinel.module';
import { CliModule } from 'src/modules/cli/cli.module';
import { WorkbenchModule } from 'src/modules/workbench/workbench.module';
import { SlowLogModule } from 'src/modules/slow-log/slow-log.module';
Expand All @@ -12,7 +10,7 @@ import { DatabaseAnalysisModule } from 'src/modules/database-analysis/database-a

export const routes: Routes = [
{
path: '/instance',
path: '/databases',
module: InstancesModule,
children: [
{
Expand Down Expand Up @@ -45,12 +43,4 @@ export const routes: Routes = [
},
],
},
{
path: '/redis-enterprise',
module: RedisEnterpriseModule,
},
{
path: '/sentinel',
module: RedisSentinelModule,
},
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { applyDecorators } from '@nestjs/common';
import { Transform } from 'class-transformer';

export function DataAsJsonString() {
return applyDecorators(
Transform((object) => JSON.stringify(object), { toClassOnly: true }),
Transform((string) => {
try {
return JSON.parse(string);
} catch (e) {
return undefined;
}
}, { toPlainOnly: true }),
);
}
2 changes: 1 addition & 1 deletion redisinsight/api/src/common/decorators/default.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ import { Transform } from 'class-transformer';
import { cloneDeep } from 'lodash';

export function Default(defaultValue: unknown): PropertyDecorator {
return Transform((value: unknown) => value ?? cloneDeep(defaultValue))
return Transform((value: unknown) => value ?? cloneDeep(defaultValue));
}
1 change: 1 addition & 0 deletions redisinsight/api/src/common/decorators/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './redis-string';
export * from './zset-score';
export * from './default';
export * from './data-as-json-string.decorator';
4 changes: 4 additions & 0 deletions redisinsight/api/src/common/models/common.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export enum ActionStatus {
Success = 'success',
Fail = 'fail',
}
26 changes: 26 additions & 0 deletions redisinsight/api/src/common/models/endpoint.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsInt, IsNotEmpty, IsString } from 'class-validator';
import { Type } from 'class-transformer';

export class Endpoint {
@ApiProperty({
description:
'The hostname of your Redis database, for example redis.acme.com.'
+ ' If your Redis server is running on your local machine, you can enter either 127.0.0.1 or localhost.',
type: String,
default: 'localhost',
})
@IsNotEmpty()
@IsString({ always: true })
host: string;

@ApiProperty({
description: 'The port your Redis database is available on.',
type: Number,
default: 6379,
})
@IsNotEmpty()
@IsInt({ always: true })
@Type(() => Number)
port: number;
}
2 changes: 2 additions & 0 deletions redisinsight/api/src/common/models/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './common';
export * from './endpoint';
2 changes: 1 addition & 1 deletion redisinsight/api/src/decorators/api-endpoint.decorator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { applyDecorators, HttpCode } from '@nestjs/common';
import { ApiExcludeEndpoint, ApiOperation, ApiResponse } from '@nestjs/swagger';
import { ApiResponseOptions } from '@nestjs/swagger/dist/decorators/api-response.decorator';
import config from 'src/utils/config';
import { BuildType } from 'src/modules/core/models/server-provider.interface';
import { BuildType } from 'src/modules/server/models/server';

const SERVER_CONFIG = config.get('server');

Expand Down
14 changes: 14 additions & 0 deletions redisinsight/api/src/local-database.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Global, Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type';
import { ormModuleOptions } from '../config/ormconfig';

@Global()
@Module({
imports: [
TypeOrmModule.forRoot(ormModuleOptions),
TypeOrmModule.forFeature(ormModuleOptions.entities as EntityClassOrSchema[]),
],
exports: [TypeOrmModule],
})
export class LocalDatabaseModule {}
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,23 @@ import {
import { NextFunction, Request, Response } from 'express';
import ERROR_MESSAGES from 'src/constants/error-messages';
import { RedisService } from 'src/modules/core/services/redis/redis.service';
import { InstancesBusinessService } from 'src/modules/shared/services/instances-business/instances-business.service';
import { DatabaseService } from 'src/modules/database/database.service';

@Injectable()
export class RedisConnectionMiddleware implements NestMiddleware {
private logger = new Logger('RedisConnectionMiddleware');

constructor(
private redisService: RedisService,
private instancesBusinessService: InstancesBusinessService,
private databaseService: DatabaseService,
) {}

async use(req: Request, res: Response, next: NextFunction): Promise<any> {
const { instanceIdFromReq } = RedisConnectionMiddleware.getConnectionConfigFromReq(req);
if (!instanceIdFromReq) {
this.throwError(req, ERROR_MESSAGES.UNDEFINED_INSTANCE_ID);
}
const existDatabaseInstance = await this.instancesBusinessService.exists(instanceIdFromReq);
const existDatabaseInstance = await this.databaseService.exists(instanceIdFromReq);
if (!existDatabaseInstance) {
throw new NotFoundException(ERROR_MESSAGES.INVALID_DATABASE_INSTANCE_ID);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ import {
IFindRedisClientInstanceByOptions,
RedisService,
} from 'src/modules/core/services/redis/redis.service';
import { InstancesBusinessService } from 'src/modules/shared/services/instances-business/instances-business.service';
import { EndpointDto } from 'src/modules/instances/dto/database-instance.dto';
import { BrowserToolCommands } from 'src/modules/browser/constants/browser-tool-commands';
import { ClusterNodeNotFoundError } from 'src/modules/cli/constants/errors';
import ERROR_MESSAGES from 'src/constants/error-messages';
import { getRedisPipelineSummary } from 'src/utils/cli-helper';
import { getConnectionName } from 'src/utils/redis-connection-helper';
import { DatabaseService } from 'src/modules/database/database.service';

export interface IExecCommandFromClusterNode {
host: string;
Expand All @@ -26,9 +26,9 @@ export class BrowserToolClusterService extends RedisConsumerAbstractService {

constructor(
protected redisService: RedisService,
protected instancesBusinessService: InstancesBusinessService,
protected databaseService: DatabaseService,
) {
super(AppTool.Browser, redisService, instancesBusinessService);
super(AppTool.Browser, redisService, databaseService);
}

async execCommand(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,20 @@ import {
RedisService,
} from 'src/modules/core/services/redis/redis.service';
import { RedisConsumerAbstractService } from 'src/modules/shared/services/base/redis-consumer.abstract.service';
import { InstancesBusinessService } from 'src/modules/shared/services/instances-business/instances-business.service';
import { BrowserToolCommands } from 'src/modules/browser/constants/browser-tool-commands';
import { getRedisPipelineSummary } from 'src/utils/cli-helper';
import { getConnectionName } from 'src/utils/redis-connection-helper';
import { DatabaseService } from 'src/modules/database/database.service';

@Injectable()
export class BrowserToolService extends RedisConsumerAbstractService {
private logger = new Logger('BrowserToolService');

constructor(
protected redisService: RedisService,
protected instancesBusinessService: InstancesBusinessService,
protected databaseService: DatabaseService,
) {
super(AppTool.Browser, redisService, instancesBusinessService);
super(AppTool.Browser, redisService, databaseService);
}

async execCommand(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,16 @@ import {
} from 'src/modules/browser/dto';
import { BrowserToolKeysCommands } from 'src/modules/browser/constants/browser-tool-commands';
import { IFindRedisClientInstanceByOptions } from 'src/modules/core/services/redis/redis.service';
import { InstancesBusinessService } from 'src/modules/shared/services/instances-business/instances-business.service';
import { BrowserToolService } from 'src/modules/browser/services/browser-tool/browser-tool.service';
import {
BrowserToolClusterService,
} from 'src/modules/browser/services/browser-tool-cluster/browser-tool-cluster.service';
import { ConnectionType } from 'src/modules/core/models/database-instance.entity';
import { ConnectionType } from 'src/modules/database/entities/database.entity';
import { Scanner } from 'src/modules/browser/services/keys-business/scanner/scanner';
import { RedisString } from 'src/common/constants';
import { plainToClass } from 'class-transformer';
import { SettingsService } from 'src/modules/settings/settings.service';
import { DatabaseService } from 'src/modules/database/database.service';
import { StandaloneStrategy } from './scanner/strategies/standalone.strategy';
import { ClusterStrategy } from './scanner/strategies/cluster.strategy';
import { KeyInfoManager } from './key-info-manager/key-info-manager';
Expand Down Expand Up @@ -57,7 +57,7 @@ export class KeysBusinessService {
private keyInfoManager;

constructor(
private instancesBusinessService: InstancesBusinessService,
private readonly databaseService: DatabaseService,
private browserTool: BrowserToolService,
private browserToolCluster: BrowserToolClusterService,
private settingsService: SettingsService,
Expand Down Expand Up @@ -123,7 +123,7 @@ export class KeysBusinessService {
try {
this.logger.log('Getting keys with details.');
// todo: refactor. no need entire entity here
const databaseInstance = await this.instancesBusinessService.getOneById(
const databaseInstance = await this.databaseService.get(
clientOptions.instanceId,
);
const scanner = this.scanner.getStrategy(databaseInstance.connectionType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@ import {
import { BulkAction } from 'src/modules/bulk-actions/models/bulk-action';
import { CreateBulkActionDto } from 'src/modules/bulk-actions/dto/create-bulk-action.dto';
import { AppTool } from 'src/models';
import { RedisService } from 'src/modules/core/services/redis/redis.service';
import { InstancesBusinessService } from 'src/modules/shared/services/instances-business/instances-business.service';
import { Socket } from 'socket.io';
import { BulkActionStatus, BulkActionType } from 'src/modules/bulk-actions/contants';
import {
DeleteBulkActionSimpleRunner,
} from 'src/modules/bulk-actions/models/runners/simple/delete.bulk-action.simple.runner';
import { DeleteBulkActionSimpleRunner } from 'src/modules/bulk-actions/models/runners/simple/delete.bulk-action.simple.runner';
import { DatabaseConnectionService } from 'src/modules/database/database-connection.service';

@Injectable()
export class BulkActionsProvider {
Expand All @@ -19,8 +16,7 @@ export class BulkActionsProvider {
private logger: Logger = new Logger('BulkActionsProvider');

constructor(
private readonly redisService: RedisService,
private readonly instancesBusinessService: InstancesBusinessService,
private readonly databaseConnectionService: DatabaseConnectionService,
) {}

/**
Expand All @@ -37,7 +33,10 @@ export class BulkActionsProvider {

this.bulkActions.set(dto.id, bulkAction);

const client = await this.getClient(dto.databaseId);
const client = await this.databaseConnectionService.getOrCreateClient({
databaseId: dto.databaseId,
namespace: AppTool.Common,
});

await bulkAction.prepare(client, BulkActionsProvider.getSimpleRunnerClass(dto));

Expand Down Expand Up @@ -111,22 +110,4 @@ export class BulkActionsProvider {

return aborted;
}

/**
* Get or create redis "common" client
*
* @private
* @param instanceId
*/
private async getClient(instanceId: string) {
const tool = AppTool.Common;

const commonClient = this.redisService.getClientInstance({ instanceId, tool })?.client;

if (commonClient && this.redisService.isClientConnected(commonClient)) {
return commonClient;
}

return this.instancesBusinessService.connectToInstance(instanceId, tool, true);
}
}
Loading