Skip to content

Commit ea5bff3

Browse files
authored
feat: support cls and mps trigger (#167)
* feat: support cls and mps trigger * test: update mps test
1 parent 2aaafa5 commit ea5bff3

File tree

19 files changed

+1143
-376
lines changed

19 files changed

+1143
-376
lines changed

__tests__/scf.test.js

Lines changed: 90 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ const { sleep } = require('@ygkit/request');
22
const { Scf, Cfs, Layer } = require('../src');
33

44
describe('Scf', () => {
5-
jest.setTimeout(300000);
6-
75
const credentials = {
86
SecretId: process.env.TENCENT_SECRET_ID,
97
SecretKey: process.env.TENCENT_SECRET_KEY,
@@ -14,8 +12,69 @@ describe('Scf', () => {
1412
subnetId: process.env.CFS_SUBNET_ID,
1513
};
1614

15+
const triggers = {
16+
timer: {
17+
timer: {
18+
name: 'timer',
19+
parameters: {
20+
cronExpression: '0 */6 * * * * *',
21+
enable: true,
22+
argument: 'mytest argument',
23+
},
24+
},
25+
},
26+
cos: {
27+
cos: {
28+
name: 'cos-trigger',
29+
parameters: {
30+
bucket: `${process.env.BUCKET}-${process.env.TENCENT_APP_ID}.cos.${process.env.REGION}.myqcloud.com`,
31+
enable: true,
32+
events: 'cos:ObjectCreated:*',
33+
filter: {
34+
prefix: 'aaaasad',
35+
suffix: '.zip',
36+
},
37+
},
38+
},
39+
},
40+
apigw: {
41+
apigw: {
42+
parameters: {
43+
serviceName: 'serverless_test',
44+
endpoints: [
45+
{
46+
path: '/',
47+
method: 'GET',
48+
},
49+
],
50+
},
51+
},
52+
},
53+
cls: {
54+
cls: {
55+
parameters: {
56+
topicId: '31d3ce01-228b-42f5-aab5-7f740cc2fb11',
57+
qualifier: '$DEFAULT',
58+
maxWait: 60,
59+
maxSize: 100,
60+
enable: true,
61+
},
62+
},
63+
},
64+
mps: {
65+
mps: {
66+
parameters: {
67+
qualifier: '$DEFAULT',
68+
type: 'EditMediaTask',
69+
enable: true,
70+
},
71+
},
72+
},
73+
};
74+
1775
const inputs = {
18-
name: `serverless-test-${Date.now()}`,
76+
// name: `serverless-test-${Date.now()}`,
77+
name: `serverless-test-1608035552006`,
1978
code: {
2079
bucket: process.env.BUCKET,
2180
object: 'express_code.zip',
@@ -40,45 +99,7 @@ describe('Scf', () => {
4099
},
41100
eip: true,
42101
vpcConfig: vpcConfig,
43-
events: [
44-
{
45-
timer: {
46-
name: 'timer',
47-
parameters: {
48-
cronExpression: '0 */6 * * * * *',
49-
enable: true,
50-
argument: 'mytest argument',
51-
},
52-
},
53-
},
54-
{
55-
cos: {
56-
name: 'cos-trigger',
57-
parameters: {
58-
bucket: `${process.env.BUCKET}-${process.env.TENCENT_APP_ID}.cos.${process.env.REGION}.myqcloud.com`,
59-
enable: true,
60-
events: 'cos:ObjectCreated:*',
61-
filter: {
62-
prefix: 'aaaasad',
63-
suffix: '.zip',
64-
},
65-
},
66-
},
67-
},
68-
{
69-
apigw: {
70-
parameters: {
71-
serviceName: 'serverless_test',
72-
endpoints: [
73-
{
74-
path: '/',
75-
method: 'GET',
76-
},
77-
],
78-
},
79-
},
80-
},
81-
],
102+
events: Object.entries(triggers).map(([, value]) => value),
82103
};
83104

84105
const cfsInputs = {
@@ -94,7 +115,7 @@ describe('Scf', () => {
94115
name: 'layer-test',
95116
bucket: process.env.BUCKET,
96117
object: 'node_modules.zip',
97-
description: 'Layer created by Serverless Component',
118+
description: 'Created by Serverless Component',
98119
runtimes: ['Nodejs10.15', 'Nodejs12.16'],
99120
};
100121

@@ -148,6 +169,9 @@ describe('Scf', () => {
148169
],
149170
},
150171
Handler: inputs.handler,
172+
AsyncRunEnable: 'FALSE',
173+
LogType: 'normal',
174+
TraceEnable: 'FALSE',
151175
UseGpu: 'FALSE',
152176
Role: inputs.role,
153177
CodeSize: 0,
@@ -186,11 +210,11 @@ describe('Scf', () => {
186210
{
187211
AddTime: expect.any(String),
188212
AvailableStatus: 'Available',
189-
CustomArgument: inputs.events[0].timer.parameters.argument,
213+
CustomArgument: triggers.timer.timer.parameters.argument,
190214
Enable: 1,
191215
ModTime: expect.any(String),
192-
TriggerDesc: `{"cron":"${inputs.events[0].timer.parameters.cronExpression}"}`,
193-
TriggerName: inputs.events[0].timer.name,
216+
TriggerDesc: `{"cron":"${triggers.timer.timer.parameters.cronExpression}"}`,
217+
TriggerName: triggers.timer.timer.name,
194218
Type: 'timer',
195219
BindStatus: '',
196220
ResourceId: '',
@@ -202,7 +226,7 @@ describe('Scf', () => {
202226
CustomArgument: '',
203227
Enable: 1,
204228
ModTime: expect.any(String),
205-
TriggerDesc: `{"bucketUrl":"${inputs.events[1].cos.parameters.bucket}","event":"${inputs.events[1].cos.parameters.events}","filter":{"Prefix":"${inputs.events[1].cos.parameters.filter.prefix}","Suffix":"${inputs.events[1].cos.parameters.filter.suffix}"}}`,
229+
TriggerDesc: `{"bucketUrl":"${triggers.cos.cos.parameters.bucket}","event":"${triggers.cos.cos.parameters.events}","filter":{"Prefix":"${triggers.cos.cos.parameters.filter.prefix}","Suffix":"${triggers.cos.cos.parameters.filter.suffix}"}}`,
206230
TriggerName: expect.stringContaining('cos_'),
207231
Type: 'cos',
208232
BindStatus: '',
@@ -229,6 +253,25 @@ describe('Scf', () => {
229253
},
230254
],
231255
},
256+
{
257+
enable: triggers.cls.cls.parameters.enable,
258+
namespace: inputs.namespace || 'default',
259+
functionName: inputs.name,
260+
maxSize: triggers.cls.cls.parameters.maxSize,
261+
maxWait: triggers.cls.cls.parameters.maxWait,
262+
qualifier: triggers.cls.cls.parameters.qualifier,
263+
topicId: triggers.cls.cls.parameters.topicId,
264+
},
265+
{
266+
enable: triggers.mps.mps.parameters.enable,
267+
namespace: inputs.namespace || 'default',
268+
functionName: inputs.name,
269+
qualifier: triggers.mps.mps.parameters.qualifier,
270+
type: triggers.mps.mps.parameters.type,
271+
resourceId: expect.stringContaining(
272+
`TriggerType/${triggers.mps.mps.parameters.type}Event`,
273+
),
274+
},
232275
],
233276
ClsLogsetId: '',
234277
ClsTopicId: '',

__tests__/triggers/cls.test.js

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
const { Cls, Scf } = require('../../src');
2+
const ClsTrigger = require('../../src/modules/triggers/cls');
3+
4+
describe('Cls', () => {
5+
const credentials = {
6+
SecretId: process.env.TENCENT_SECRET_ID,
7+
SecretKey: process.env.TENCENT_SECRET_KEY,
8+
};
9+
const client = new ClsTrigger({ credentials, region: process.env.REGION });
10+
const clsClient = new Cls(credentials, process.env.REGION);
11+
const scfClient = new Scf(credentials, process.env.REGION);
12+
13+
const data = {
14+
qualifier: '$DEFAULT',
15+
maxWait: 60,
16+
maxSize: 100,
17+
};
18+
19+
const functionName = 'serverless-unit-test';
20+
const namespace = 'default';
21+
22+
const clsInputs = {
23+
region: 'ap-guangzhou',
24+
name: 'cls-test',
25+
topic: 'cls-topic-test',
26+
period: 7,
27+
rule: {
28+
full_text: {
29+
case_sensitive: true,
30+
tokenizer: '!@#%^&*()_="\', <>/?|\\;:\n\t\r[]{}',
31+
},
32+
key_value: {
33+
case_sensitive: true,
34+
keys: ['SCF_RetMsg'],
35+
types: ['text'],
36+
tokenizers: [' '],
37+
},
38+
},
39+
};
40+
41+
let clsOutputs;
42+
43+
beforeAll(async () => {
44+
clsOutputs = await clsClient.deploy(clsInputs);
45+
data.topicId = clsOutputs.topicId;
46+
});
47+
48+
afterAll(async () => {
49+
await clsClient.remove(clsOutputs);
50+
});
51+
52+
test('should create trigger success', async () => {
53+
const res = await client.create({
54+
inputs: {
55+
namespace: namespace,
56+
functionName: functionName,
57+
parameters: data,
58+
},
59+
});
60+
expect(res).toEqual({
61+
namespace: namespace,
62+
functionName: functionName,
63+
maxSize: 100,
64+
maxWait: 60,
65+
qualifier: '$DEFAULT',
66+
topicId: clsOutputs.topicId,
67+
});
68+
});
69+
70+
test('should enable trigger success', async () => {
71+
data.enable = true;
72+
const res = await client.create({
73+
inputs: {
74+
namespace: namespace,
75+
functionName: functionName,
76+
parameters: data,
77+
},
78+
});
79+
expect(res).toEqual({
80+
enable: true,
81+
namespace: namespace,
82+
functionName: functionName,
83+
maxSize: 100,
84+
maxWait: 60,
85+
qualifier: '$DEFAULT',
86+
topicId: clsOutputs.topicId,
87+
});
88+
});
89+
90+
test('should disable trigger success', async () => {
91+
data.enable = false;
92+
const res = await client.create({
93+
inputs: {
94+
namespace: namespace,
95+
functionName: functionName,
96+
parameters: data,
97+
},
98+
});
99+
expect(res).toEqual({
100+
enable: false,
101+
namespace: namespace,
102+
functionName: functionName,
103+
maxSize: 100,
104+
maxWait: 60,
105+
qualifier: '$DEFAULT',
106+
topicId: clsOutputs.topicId,
107+
});
108+
});
109+
110+
test('should delete trigger success', async () => {
111+
const { Triggers = [] } = await scfClient.request({
112+
Action: 'ListTriggers',
113+
Namespace: namespace,
114+
FunctionName: functionName,
115+
Limit: 100,
116+
});
117+
const [exist] = Triggers.filter((item) => item.ResourceId.indexOf(`topic_id/${data.topicId}`));
118+
const res = await client.delete({
119+
scf: scfClient,
120+
inputs: {
121+
namespace: namespace,
122+
functionName: functionName,
123+
type: exist.Type,
124+
triggerDesc: exist.TriggerDesc,
125+
triggerName: exist.TriggerName,
126+
qualifier: exist.Qualifier,
127+
},
128+
});
129+
expect(res).toEqual({ requestId: expect.any(String), success: true });
130+
131+
const detail = await client.get({
132+
topicId: data.topicId,
133+
});
134+
expect(detail).toBeUndefined();
135+
});
136+
});

__tests__/triggers/mps.test.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
const { Scf } = require('../../src');
2+
const MpsTrigger = require('../../src/modules/triggers/mps');
3+
4+
describe('Mps', () => {
5+
const credentials = {
6+
SecretId: process.env.TENCENT_SECRET_ID,
7+
SecretKey: process.env.TENCENT_SECRET_KEY,
8+
};
9+
const client = new MpsTrigger({ credentials, region: process.env.REGION });
10+
const scfClient = new Scf(credentials, process.env.REGION);
11+
12+
const data = {
13+
qualifier: '$DEFAULT',
14+
type: 'EditMediaTask',
15+
};
16+
17+
const functionName = 'serverless-unit-test';
18+
const namespace = 'default';
19+
20+
test('should create trigger success', async () => {
21+
const res = await client.create({
22+
inputs: {
23+
namespace: namespace,
24+
functionName: functionName,
25+
parameters: data,
26+
},
27+
});
28+
expect(res).toEqual({
29+
namespace: namespace,
30+
functionName: functionName,
31+
qualifier: '$DEFAULT',
32+
type: data.type,
33+
resourceId: expect.stringContaining(`TriggerType/${data.type}`),
34+
});
35+
});
36+
37+
test('should delete trigger success', async () => {
38+
const { Triggers = [] } = await scfClient.request({
39+
Action: 'ListTriggers',
40+
Namespace: namespace,
41+
FunctionName: functionName,
42+
Limit: 100,
43+
});
44+
const [exist] = Triggers.filter((item) => item.ResourceId.indexOf(`TriggerType/${data.type}`));
45+
const res = await client.delete({
46+
scf: scfClient,
47+
inputs: {
48+
namespace: namespace,
49+
functionName: functionName,
50+
type: exist.Type,
51+
triggerDesc: exist.TriggerDesc,
52+
triggerName: exist.TriggerName,
53+
qualifier: exist.Qualifier,
54+
},
55+
});
56+
expect(res).toEqual({ requestId: expect.any(String), success: true });
57+
});
58+
});

0 commit comments

Comments
 (0)