Skip to content

Commit 2bfa4d5

Browse files
authored
fix(scf): support qualifier config of triggers (#144)
1 parent 3d18591 commit 2bfa4d5

File tree

3 files changed

+242
-213
lines changed

3 files changed

+242
-213
lines changed

src/modules/scf/index.js

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ const { strip } = require('../../utils');
55
const TagsUtils = require('../tag/index');
66
const ApigwUtils = require('../apigw/index');
77
const Cam = require('../cam/index');
8-
const { formatTrigger, formatFunctionInputs } = require('./utils');
8+
const { formatFunctionInputs } = require('./utils');
99
const CONFIGS = require('./config');
1010
const Apis = require('./apis');
11+
const Triggers = require('./triggers');
1112

1213
class Scf {
1314
constructor(credentials = {}, region) {
@@ -177,55 +178,41 @@ class Scf {
177178
const oldTriggers = funcInfo.Triggers || [];
178179
for (let tIdx = 0, len = oldTriggers.length; tIdx < len; tIdx++) {
179180
const curTrigger = oldTriggers[tIdx];
181+
const { Type } = curTrigger;
182+
const triggerClass = Triggers[Type];
180183

181-
if (curTrigger.Type === 'apigw') {
184+
if (Type === 'apigw') {
182185
// TODO: now apigw can not sync in SCF trigger list
183186
// await this.apigwClient.remove(curTrigger);
184187
} else {
185188
console.log(`Removing ${curTrigger.Type} triggers: ${curTrigger.TriggerName}.`);
186-
await this.request({
187-
Action: 'DeleteTrigger',
188-
FunctionName: funcInfo.FunctionName,
189-
Namespace: funcInfo.Namespace,
190-
Type: curTrigger.Type,
191-
TriggerDesc: curTrigger.TriggerDesc,
192-
TriggerName: curTrigger.TriggerName,
193-
});
189+
await triggerClass.delete(this, funcInfo, curTrigger);
194190
}
195191
}
196192

197193
// create all new triggers
198-
const deployTriggerResult = [];
194+
const triggerResult = [];
199195
for (let i = 0; i < inputs.events.length; i++) {
200196
const event = inputs.events[i];
201197
const eventType = Object.keys(event)[0];
202-
203-
if (eventType === 'apigw') {
204-
const { triggerInputs } = formatTrigger(
205-
eventType,
198+
const triggerClass = Triggers[eventType];
199+
if (!triggerClass) {
200+
throw TypeError('PARAMETER_SCF', `Unknow trigger type ${eventType}`);
201+
}
202+
try {
203+
const triggerOutput = await triggerClass.create(
204+
this,
206205
this.region,
207206
funcInfo,
208207
event[eventType],
209-
inputs.needSetTraffic,
210208
);
211-
try {
212-
const apigwOutput = await this.apigwClient.deploy(triggerInputs);
213-
214-
deployTriggerResult.push(apigwOutput);
215-
} catch (e) {
216-
throw e;
217-
}
218-
} else {
219-
const { triggerInputs } = formatTrigger(eventType, this.region, funcInfo, event[eventType]);
220-
221-
console.log(`Creating ${eventType} triggers: ${event[eventType].name}.`);
222-
const Response = await this.request(triggerInputs);
223209

224-
deployTriggerResult.push(Response.TriggerInfo);
210+
triggerResult.push(triggerOutput);
211+
} catch (e) {
212+
throw e;
225213
}
226214
}
227-
funcInfo.Triggers = deployTriggerResult;
228-
return deployTriggerResult;
215+
return triggerResult;
229216
}
230217

231218
// deploy tags
@@ -481,7 +468,7 @@ class Scf {
481468

482469
// create/update/delete triggers
483470
if (inputs.events) {
484-
await this.deployTrigger(funcInfo, inputs);
471+
outputs.Triggers = await this.deployTrigger(funcInfo, inputs);
485472
}
486473

487474
console.log(`Deploy function ${funcInfo.FunctionName} success.`);

src/modules/scf/triggers.js

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
const BaseTrigger = {
2+
async create(scf, region, funcInfo, inputs) {
3+
const { triggerInputs } = this.formatInputs(funcInfo, inputs);
4+
console.log(`Creating ${triggerInputs.Type} trigger ${triggerInputs.TriggerName}`);
5+
const { TriggerInfo } = await scf.request(triggerInputs);
6+
return TriggerInfo;
7+
},
8+
async delete(scf, funcInfo, inputs) {
9+
console.log(`Removing ${inputs.Type} trigger ${inputs.TriggerName}`);
10+
try {
11+
await scf.request({
12+
Action: 'DeleteTrigger',
13+
FunctionName: funcInfo.FunctionName,
14+
Namespace: funcInfo.Namespace,
15+
Type: inputs.Type,
16+
TriggerDesc: inputs.TriggerDesc,
17+
TriggerName: inputs.TriggerName,
18+
});
19+
return true;
20+
} catch (e) {
21+
console.log(e);
22+
return false;
23+
}
24+
},
25+
};
26+
27+
const TimerTrigger = {
28+
type: 'timer',
29+
formatInputs(funcInfo, inputs) {
30+
const { parameters, name } = inputs;
31+
const triggerInputs = {
32+
Action: 'CreateTrigger',
33+
FunctionName: funcInfo.FunctionName,
34+
Namespace: funcInfo.Namespace,
35+
};
36+
37+
triggerInputs.Type = 'timer';
38+
triggerInputs.Qualifier = parameters.qualifier || '$DEFAULT';
39+
triggerInputs.TriggerName = name;
40+
triggerInputs.TriggerDesc = parameters.cronExpression;
41+
triggerInputs.Enable = parameters.enable ? 'OPEN' : 'CLOSE';
42+
43+
if (parameters.argument) {
44+
triggerInputs.CustomArgument = parameters.argument;
45+
}
46+
const triggerKey = `${triggerInputs.Type}-${triggerInputs.TriggerName}`;
47+
48+
return {
49+
triggerInputs,
50+
triggerKey,
51+
};
52+
},
53+
async create(scf, region, funcInfo, inputs) {
54+
return BaseTrigger.create.bind(this)(scf, region, funcInfo, inputs);
55+
},
56+
async delete(scf, funcInfo, inputs) {
57+
return BaseTrigger.delete.bind(this)(scf, funcInfo, inputs);
58+
},
59+
};
60+
61+
const CosTrigger = {
62+
formatInputs(funcInfo, inputs) {
63+
const { parameters } = inputs;
64+
const triggerInputs = {
65+
Action: 'CreateTrigger',
66+
FunctionName: funcInfo.FunctionName,
67+
Namespace: funcInfo.Namespace,
68+
};
69+
70+
triggerInputs.Type = 'cos';
71+
triggerInputs.Qualifier = parameters.qualifier || '$DEFAULT';
72+
triggerInputs.TriggerName = parameters.bucket;
73+
triggerInputs.TriggerDesc = JSON.stringify({
74+
event: parameters.events,
75+
filter: {
76+
Prefix: parameters.filter && parameters.filter.prefix ? parameters.filter.prefix : '',
77+
Suffix: parameters.filter && parameters.filter.suffix ? parameters.filter.suffix : '',
78+
},
79+
});
80+
triggerInputs.Enable = parameters.enable ? 'OPEN' : 'CLOSE';
81+
const tempDest = JSON.stringify({
82+
bucketUrl: triggerInputs.TriggerName,
83+
event: JSON.parse(triggerInputs.TriggerDesc).event,
84+
filter: JSON.parse(triggerInputs.TriggerDesc).filter,
85+
});
86+
const triggerKey = `cos-${triggerInputs.TriggerName}-${tempDest}`;
87+
88+
return {
89+
triggerInputs,
90+
triggerKey,
91+
};
92+
},
93+
async create(scf, region, funcInfo, inputs) {
94+
return BaseTrigger.create.bind(this)(scf, region, funcInfo, inputs);
95+
},
96+
async delete(scf, funcInfo, inputs) {
97+
return BaseTrigger.delete.bind(this)(scf, funcInfo, inputs);
98+
},
99+
};
100+
101+
const CkafkaTrigger = {
102+
formatInputs(funcInfo, inputs) {
103+
const { parameters } = inputs;
104+
const triggerInputs = {
105+
Action: 'CreateTrigger',
106+
FunctionName: funcInfo.FunctionName,
107+
Namespace: funcInfo.Namespace,
108+
};
109+
110+
triggerInputs.Type = 'ckafka';
111+
triggerInputs.Qualifier = parameters.qualifier || '$DEFAULT';
112+
triggerInputs.TriggerName = `${parameters.name}-${parameters.topic}`;
113+
triggerInputs.TriggerDesc = JSON.stringify({
114+
maxMsgNum: parameters.maxMsgNum,
115+
offset: parameters.offset,
116+
retry: parameters.retry,
117+
});
118+
triggerInputs.Enable = parameters.enable ? 'OPEN' : 'CLOSE';
119+
const triggerKey = `${triggerInputs.Type}-${triggerInputs.TriggerName}`;
120+
121+
return {
122+
triggerInputs,
123+
triggerKey,
124+
};
125+
},
126+
async create(scf, region, funcInfo, inputs) {
127+
return BaseTrigger.create.bind(this)(scf, region, funcInfo, inputs);
128+
},
129+
async delete(scf, funcInfo, inputs) {
130+
return BaseTrigger.delete.bind(this)(scf, funcInfo, inputs);
131+
},
132+
};
133+
134+
const CmqTrigger = {
135+
formatInputs(funcInfo, inputs) {
136+
const { parameters } = inputs;
137+
const triggerInputs = {
138+
Action: 'CreateTrigger',
139+
FunctionName: funcInfo.FunctionName,
140+
Namespace: funcInfo.Namespace,
141+
};
142+
143+
triggerInputs.Type = 'cmq';
144+
triggerInputs.Qualifier = parameters.qualifier || '$DEFAULT';
145+
triggerInputs.TriggerName = parameters.name;
146+
triggerInputs.TriggerDesc = JSON.stringify({
147+
filterType: 1,
148+
filterKey: parameters.filterKey,
149+
});
150+
151+
triggerInputs.Enable = parameters.enable ? 'OPEN' : 'CLOSE';
152+
const triggerKey = `${triggerInputs.Type}-${triggerInputs.TriggerName}`;
153+
154+
return {
155+
triggerInputs,
156+
triggerKey,
157+
};
158+
},
159+
async create(scf, region, funcInfo, inputs) {
160+
return BaseTrigger.create.bind(this)(scf, region, funcInfo, inputs);
161+
},
162+
async delete(scf, funcInfo, inputs) {
163+
return BaseTrigger.delete.bind(this)(scf, funcInfo, inputs);
164+
},
165+
};
166+
167+
const ApigwTrigger = {
168+
formatInputs(region, funcInfo, inputs) {
169+
const { parameters, name } = inputs;
170+
const triggerInputs = {};
171+
triggerInputs.region = region;
172+
triggerInputs.protocols = parameters.protocols;
173+
triggerInputs.environment = parameters.environment;
174+
triggerInputs.serviceId = parameters.serviceId;
175+
triggerInputs.serviceName = parameters.serviceName || name;
176+
triggerInputs.serviceDesc = parameters.description;
177+
triggerInputs.serviceId = parameters.serviceId;
178+
179+
triggerInputs.endpoints = (parameters.endpoints || []).map((ep) => {
180+
ep.function = ep.function || {};
181+
ep.function.functionName = funcInfo.FunctionName;
182+
ep.function.functionNamespace = funcInfo.Namespace;
183+
ep.function.functionQualifier = ep.function.functionQualifier
184+
? ep.function.functionQualifier
185+
: '$DEFAULT';
186+
return ep;
187+
});
188+
if (parameters.netTypes) {
189+
triggerInputs.netTypes = parameters.netTypes;
190+
}
191+
return {
192+
triggerInputs,
193+
};
194+
},
195+
async create(scf, region, funcInfo, inputs) {
196+
const { triggerInputs } = this.formatInputs(region, funcInfo, inputs);
197+
const res = await scf.apigwClient.deploy(triggerInputs);
198+
return res;
199+
},
200+
async delete(scf, region, funcInfo, inputs) {
201+
const triggerInputs = this.formatInputs(region, funcInfo, inputs);
202+
try {
203+
await scf.apigwClient.remove({
204+
created: true,
205+
environment: triggerInputs.environment,
206+
serviceId: triggerInputs.serviceId,
207+
apiList: {},
208+
});
209+
return true;
210+
} catch (e) {
211+
console.log(e);
212+
return false;
213+
}
214+
},
215+
};
216+
217+
module.exports = {
218+
timer: TimerTrigger,
219+
cos: CosTrigger,
220+
apigw: ApigwTrigger,
221+
ckafka: CkafkaTrigger,
222+
cmq: CmqTrigger,
223+
};

0 commit comments

Comments
 (0)