Skip to content

Commit 8a6ecc3

Browse files
Merge pull request #3517 from RedisInsight/be/feature/RI-5750_update_rdi
Be/feature/ri 5750 update rdi
2 parents ff8c8fb + 7f226b9 commit 8a6ecc3

File tree

15 files changed

+180
-88
lines changed

15 files changed

+180
-88
lines changed

redisinsight/api/src/modules/rdi/client/api.rdi.client.ts

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import axios, { AxiosInstance } from 'axios';
22
import { plainToClass } from 'class-transformer';
33
import { decode } from 'jsonwebtoken';
4-
import { Request } from 'express';
54

65
import { RdiClient } from 'src/modules/rdi/client/rdi.client';
76
import {
@@ -14,10 +13,10 @@ import {
1413
import {
1514
RdiDryRunJobDto,
1615
RdiDryRunJobResponseDto,
16+
RdiTemplateResponseDto,
1717
RdiTestConnectionsResponseDto,
1818
} from 'src/modules/rdi/dto';
1919
import {
20-
RdiPipelineDeployFailedException,
2120
RdiPipelineInternalServerErrorException,
2221
wrapRdiPipelineError,
2322
} from 'src/modules/rdi/exceptions';
@@ -29,8 +28,7 @@ import {
2928
} from 'src/modules/rdi/models';
3029
import { convertKeysToCamelCase } from 'src/utils/base.helper';
3130
import { RdiPipelineTimeoutException } from 'src/modules/rdi/exceptions/rdi-pipeline.timeout-error.exception';
32-
33-
const RDI_DEPLOY_FAILED_STATUS = 'failed';
31+
import * as https from 'https';
3432

3533
export class ApiRdiClient extends RdiClient {
3634
protected readonly client: AxiosInstance;
@@ -42,6 +40,9 @@ export class ApiRdiClient extends RdiClient {
4240
this.client = axios.create({
4341
baseURL: rdi.url,
4442
timeout: RDI_TIMEOUT,
43+
httpsAgent: new https.Agent({
44+
rejectUnauthorized: false,
45+
}),
4546
});
4647
}
4748

@@ -72,25 +73,32 @@ export class ApiRdiClient extends RdiClient {
7273
}
7374
}
7475

75-
async getTemplate(options: object): Promise<object> {
76+
async getConfigTemplate(pipelineType: string, dbType: string): Promise<RdiTemplateResponseDto> {
7677
try {
77-
const response = await this.client.get(RdiUrl.GetTemplate, { params: options });
78+
const response = await this.client.get(`${RdiUrl.GetConfigTemplate}/${pipelineType}/${dbType}`);
7879
return response.data;
7980
} catch (error) {
8081
throw wrapRdiPipelineError(error);
8182
}
8283
}
8384

84-
async deploy(pipeline: RdiPipeline): Promise<void> {
85-
let response;
85+
async getJobTemplate(pipelineType: string): Promise<RdiTemplateResponseDto> {
8686
try {
87-
response = await this.client.post(RdiUrl.Deploy, { ...pipeline });
87+
const response = await this.client.get(`${RdiUrl.GetJobTemplate}/${pipelineType}`);
88+
return response.data;
8889
} catch (error) {
89-
throw wrapRdiPipelineError(error, error.response.data.message);
90+
throw wrapRdiPipelineError(error);
9091
}
92+
}
9193

92-
if (response.data?.status === RDI_DEPLOY_FAILED_STATUS) {
93-
throw new RdiPipelineDeployFailedException(undefined, { error: response.data?.error });
94+
async deploy(pipeline: RdiPipeline): Promise<void> {
95+
try {
96+
const response = await this.client.post(RdiUrl.Deploy, { ...pipeline });
97+
const actionId = response.data.action_id;
98+
99+
return this.pollActionStatus(actionId);
100+
} catch (error) {
101+
throw wrapRdiPipelineError(error, error.response.data.message);
94102
}
95103
}
96104

@@ -103,21 +111,14 @@ export class ApiRdiClient extends RdiClient {
103111
}
104112
}
105113

106-
async testConnections(config: string, req: Request): Promise<RdiTestConnectionsResponseDto> {
114+
async testConnections(config: object): Promise<RdiTestConnectionsResponseDto> {
107115
try {
108-
const abortController = new AbortController();
109-
req.socket.on('close', () => {
110-
abortController.abort();
111-
});
112116
const response = await this.client.post(
113117
RdiUrl.TestConnections,
114118
config,
115-
{ signal: abortController.signal },
116119
);
117120

118-
const actionId = response.data.action_id;
119-
120-
return this.pollActionStatus(actionId, abortController.signal);
121+
return response.data;
121122
} catch (e) {
122123
throw wrapRdiPipelineError(e);
123124
}
@@ -147,7 +148,7 @@ export class ApiRdiClient extends RdiClient {
147148

148149
async getJobFunctions(): Promise<object> {
149150
try {
150-
const response = await this.client.post(RdiUrl.JobFunctions);
151+
const response = await this.client.get(RdiUrl.JobFunctions);
151152
return response.data;
152153
} catch (e) {
153154
throw wrapRdiPipelineError(e);
@@ -178,10 +179,10 @@ export class ApiRdiClient extends RdiClient {
178179
}
179180
}
180181

181-
private async pollActionStatus(actionId: string, abortSignal: AbortSignal): Promise<any> {
182+
private async pollActionStatus(actionId: string, abortSignal?: AbortSignal): Promise<any> {
182183
const startTime = Date.now();
183184
while (true) {
184-
if (abortSignal.aborted) {
185+
if (abortSignal?.aborted) {
185186
throw new RdiPipelineInternalServerErrorException();
186187
}
187188
if (Date.now() - startTime > MAX_POLLING_TIME) {

redisinsight/api/src/modules/rdi/client/rdi.client.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import { Request } from 'express';
21
import {
32
Rdi,
43
RdiClientMetadata, RdiPipeline, RdiStatisticsResult,
54
} from 'src/modules/rdi/models';
65
import {
7-
RdiDryRunJobDto, RdiDryRunJobResponseDto, RdiTestConnectionsResponseDto,
6+
RdiDryRunJobDto, RdiDryRunJobResponseDto, RdiTemplateResponseDto, RdiTestConnectionsResponseDto,
87
} from 'src/modules/rdi/dto';
98
import { IDLE_TRESHOLD } from 'src/modules/rdi/constants';
109

@@ -28,16 +27,17 @@ export abstract class RdiClient {
2827

2928
abstract getPipeline(): Promise<RdiPipeline>;
3029

31-
// TODO validate options and response
32-
abstract getTemplate(options: object): Promise<unknown>;
30+
abstract getConfigTemplate(pipelineType: string, dbType: string): Promise<RdiTemplateResponseDto>;
31+
32+
abstract getJobTemplate(pipelineType: string): Promise<RdiTemplateResponseDto>;
3333

3434
abstract getStrategies(): Promise<object>;
3535

3636
abstract deploy(pipeline: RdiPipeline): Promise<void>;
3737

3838
abstract dryRunJob(data: RdiDryRunJobDto): Promise<RdiDryRunJobResponseDto>;
3939

40-
abstract testConnections(config: string, req: Request): Promise<RdiTestConnectionsResponseDto>;
40+
abstract testConnections(config: object): Promise<RdiTestConnectionsResponseDto>;
4141

4242
abstract getStatistics(sections?: string): Promise<RdiStatisticsResult>;
4343

redisinsight/api/src/modules/rdi/constants/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ export enum RdiUrl {
22
GetSchema = 'api/v1/schemas',
33
GetPipeline = 'api/v1/pipelines',
44
GetStrategies = 'api/v1/pipelines/strategies',
5-
GetTemplate = 'deployments/templates',
5+
GetConfigTemplate = 'api/v1/pipelines/config/templates',
6+
GetJobTemplate = 'api/v1/pipelines/jobs/templates',
67
DryRunJob = 'api/v1/pipelines/jobs/dry-run',
78
JobFunctions = '/api/v1/pipelines/jobs/functions',
89
Deploy = 'api/v1/pipelines',

redisinsight/api/src/modules/rdi/dto/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export * from './update.rdi.dto';
33
export * from './rdi.dry-run.job.dto';
44
export * from './rdi.dry-run.job.response.dto';
55
export * from './rdi-test-connections.response.dto';
6+
export * from './rdi-template.response.dto';
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { ApiProperty } from '@nestjs/swagger';
2+
import { Expose } from 'class-transformer';
3+
4+
export class RdiTemplateResponseDto {
5+
@ApiProperty({
6+
description: 'Template for rdi file',
7+
type: String,
8+
})
9+
@Expose()
10+
template: string;
11+
}

redisinsight/api/src/modules/rdi/rdi-pipeline.controller.ts

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import {
22
Body,
33
ClassSerializerInterceptor, Controller, Get, Post, UseInterceptors, UsePipes, ValidationPipe,
4-
Query, Req,
4+
Req, Param,
55
} from '@nestjs/common';
66
import { Rdi, RdiPipeline, RdiClientMetadata } from 'src/modules/rdi/models';
77
import { ApiTags } from '@nestjs/swagger';
88
import { Request } from 'express';
99
import { ApiEndpoint } from 'src/decorators/api-endpoint.decorator';
1010
import { RdiPipelineService } from 'src/modules/rdi/rdi-pipeline.service';
1111
import { RequestRdiClientMetadata } from 'src/modules/rdi/decorators';
12-
import { RdiDryRunJobDto, RdiTestConnectionsResponseDto } from 'src/modules/rdi/dto';
12+
import { RdiDryRunJobDto, RdiTemplateResponseDto, RdiTestConnectionsResponseDto } from 'src/modules/rdi/dto';
1313
import { RdiDryRunJobResponseDto } from 'src/modules/rdi/dto/rdi.dry-run.job.response.dto';
1414

1515
@ApiTags('RDI')
@@ -73,11 +73,10 @@ export class RdiPipelineController {
7373
responses: [{ status: 200, type: RdiTestConnectionsResponseDto }],
7474
})
7575
async testConnections(
76-
@Req() req: Request,
77-
@RequestRdiClientMetadata() rdiClientMetadata: RdiClientMetadata,
78-
@Body() config: string,
76+
@RequestRdiClientMetadata() rdiClientMetadata: RdiClientMetadata,
77+
@Body() config: object,
7978
): Promise<RdiTestConnectionsResponseDto> {
80-
return this.rdiPipelineService.testConnections(rdiClientMetadata, config, req);
79+
return this.rdiPipelineService.testConnections(rdiClientMetadata, config);
8180
}
8281

8382
@Get('/strategies')
@@ -91,16 +90,29 @@ export class RdiPipelineController {
9190
return this.rdiPipelineService.getStrategies(rdiClientMetadata);
9291
}
9392

94-
@Get('/template')
93+
@Get('/job/template/:pipelineType')
9594
@ApiEndpoint({
96-
description: 'Get pipeline template for selected pipeline type',
97-
responses: [{ status: 200, type: Rdi }],
95+
description: 'Get job template for selected pipeline type',
96+
responses: [{ status: 200, type: RdiTemplateResponseDto }],
9897
})
99-
async getTemplate(
98+
async getJobTemplate(
10099
@RequestRdiClientMetadata() rdiClientMetadata: RdiClientMetadata,
101-
@Query() options: object,
102-
): Promise<unknown> {
103-
return this.rdiPipelineService.getTemplate(rdiClientMetadata, options);
100+
@Param('pipelineType') pipelineType: string,
101+
): Promise<RdiTemplateResponseDto> {
102+
return this.rdiPipelineService.getJobTemplate(rdiClientMetadata, pipelineType);
103+
}
104+
105+
@Get('/config/template/:pipelineType/:dbType')
106+
@ApiEndpoint({
107+
description: 'Get config template for selected pipeline and db types',
108+
responses: [{ status: 200, type: RdiTemplateResponseDto }],
109+
})
110+
async getConfigTemplate(
111+
@RequestRdiClientMetadata() rdiClientMetadata: RdiClientMetadata,
112+
@Param('pipelineType') pipelineType: string,
113+
@Param('dbType') dbType: string,
114+
): Promise<RdiTemplateResponseDto> {
115+
return this.rdiPipelineService.getConfigTemplate(rdiClientMetadata, pipelineType, dbType);
104116
}
105117

106118
@Get('/status')

redisinsight/api/src/modules/rdi/rdi-pipeline.service.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Injectable, Logger } from '@nestjs/common';
22
import { Request } from 'express';
33
import { RdiClientMetadata, RdiPipeline } from 'src/modules/rdi/models';
44
import { RdiClientProvider } from 'src/modules/rdi/providers/rdi.client.provider';
5-
import { RdiDryRunJobDto, RdiTestConnectionsResponseDto } from 'src/modules/rdi/dto';
5+
import { RdiDryRunJobDto, RdiTemplateResponseDto, RdiTestConnectionsResponseDto } from 'src/modules/rdi/dto';
66
import { RdiDryRunJobResponseDto } from 'src/modules/rdi/dto/rdi.dry-run.job.response.dto';
77
import { RdiPipelineAnalytics } from 'src/modules/rdi/rdi-pipeline.analytics';
88
import { wrapHttpError } from 'src/common/utils';
@@ -70,12 +70,12 @@ export class RdiPipelineService {
7070
}
7171
}
7272

73-
async testConnections(rdiClientMetadata: RdiClientMetadata, config: string, req: Request): Promise<RdiTestConnectionsResponseDto> {
73+
async testConnections(rdiClientMetadata: RdiClientMetadata, config: object): Promise<RdiTestConnectionsResponseDto> {
7474
this.logger.log('Trying to test connections');
7575

7676
const client = await this.rdiClientProvider.getOrCreate(rdiClientMetadata);
7777

78-
return await client.testConnections(config, req);
78+
return await client.testConnections(config);
7979
}
8080

8181
async getStrategies(rdiClientMetadata: RdiClientMetadata): Promise<object> {
@@ -85,12 +85,20 @@ export class RdiPipelineService {
8585
return await client.getStrategies();
8686
}
8787

88-
async getTemplate(rdiClientMetadata: RdiClientMetadata, options: object): Promise<unknown> {
89-
this.logger.log('Getting RDI pipeline template');
88+
async getConfigTemplate(rdiClientMetadata: RdiClientMetadata, pipelineType: string, dbType: string): Promise<RdiTemplateResponseDto> {
89+
this.logger.log('Getting RDI config template');
9090

9191
const client = await this.rdiClientProvider.getOrCreate(rdiClientMetadata);
9292

93-
return await client.getTemplate(options);
93+
return await client.getConfigTemplate(pipelineType, dbType);
94+
}
95+
96+
async getJobTemplate(rdiClientMetadata: RdiClientMetadata, pipelineType: string): Promise<RdiTemplateResponseDto> {
97+
this.logger.log('Getting RDI job template');
98+
99+
const client = await this.rdiClientProvider.getOrCreate(rdiClientMetadata);
100+
101+
return await client.getJobTemplate(pipelineType);
94102
}
95103

96104
async getPipelineStatus(rdiClientMetadata: RdiClientMetadata): Promise<unknown> {

redisinsight/ui/src/constants/api.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ enum ApiEndpoints {
143143
RDI_DEPLOY_PIPELINE = 'pipeline/deploy',
144144
RDI_TEST_CONNECTIONS = 'pipeline/test-connections',
145145
RDI_PIPELINE_STRATEGIES = 'pipeline/strategies',
146-
RDI_PIPELINE_TEMPLATE = 'pipeline/template',
146+
RDI_JOB_TEMPLATE = 'pipeline/job/template',
147+
RDI_CONFIG_TEMPLATE = 'pipeline/config/template',
147148
RDI_PIPELINE_JOB_FUNCTIONS = 'pipeline/job-functions',
148149
RDI_STATISTICS = 'statistics',
149150
RDI_PIPELINE_STATUS = 'pipeline/status',

redisinsight/ui/src/pages/rdi/pipeline-management/components/template-form/TemplateForm.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ import { useDispatch, useSelector } from 'react-redux'
1313
import { useParams } from 'react-router-dom'
1414
import cx from 'classnames'
1515

16-
import { fetchPipelineStrategies, fetchPipelineTemplate, rdiPipelineStrategiesSelector } from 'uiSrc/slices/rdi/pipeline'
16+
import {
17+
fetchPipelineStrategies,
18+
fetchJobTemplate,
19+
fetchConfigTemplate,
20+
rdiPipelineStrategiesSelector,
21+
} from 'uiSrc/slices/rdi/pipeline'
1722
import { RdiPipelineTabs } from 'uiSrc/slices/interfaces/rdi'
1823
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
1924
import { NO_TEMPLATE_VALUE, NO_OPTIONS, INGEST_OPTION } from './constants'
@@ -69,11 +74,12 @@ const TemplateForm = (props: Props) => {
6974
}
7075

7176
const handleApply = () => {
72-
const values = source === RdiPipelineTabs.Config
73-
? { dbType: selectedDbType, pipelineType: selectedPipelineType }
74-
: { pipelineType: selectedPipelineType }
75-
76-
dispatch(fetchPipelineTemplate(rdiInstanceId, values, onSuccess))
77+
if (source === RdiPipelineTabs.Config) {
78+
dispatch(fetchConfigTemplate(rdiInstanceId, selectedPipelineType, selectedDbType, onSuccess))
79+
}
80+
if (source === RdiPipelineTabs.Jobs) {
81+
dispatch(fetchJobTemplate(rdiInstanceId, selectedPipelineType, onSuccess))
82+
}
7783
sendEventTelemetry({
7884
event: TelemetryEvent.RDI_TEMPLATE_CLICKED,
7985
eventData: {

0 commit comments

Comments
 (0)