Skip to content

Commit e92ba5a

Browse files
authored
Support for functions failure policies (#1858)
1 parent 2b6fa69 commit e92ba5a

File tree

5 files changed

+47
-5
lines changed

5 files changed

+47
-5
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
- Fixes issue where all database functions triggered on the default namespace (#2501)
44
- Fixes issue where rules paths were not normalized before reading (#2544)
55
- Functions emulator waits for all functions to finish before exiting (#1813)
6+
- Adds support for deploying functions with a failure policy.

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@
173173
"eslint-plugin-prettier": "^3.1.0",
174174
"firebase": "^7.14.0",
175175
"firebase-admin": "^8.9.0",
176-
"firebase-functions": "^3.8.0",
176+
"firebase-functions": "^3.10.0",
177177
"mocha": "^7.1.1",
178178
"nock": "^9.3.3",
179179
"nyc": "^15.0.1",

src/deploy/functions/release.js

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,47 @@ module.exports = function(context, options, payload) {
152152
var deleteReleaseNames;
153153
var existingScheduledFunctions;
154154

155+
// Collect all the functions that have a retry policy
156+
var failurePolicyFunctions = functionsInfo.filter((fn) => {
157+
return !!fn.failurePolicy;
158+
});
159+
160+
var failurePolicyFunctionLabels = failurePolicyFunctions.map((fn) => {
161+
return helper.getFunctionLabel(_.get(fn, "name"));
162+
});
163+
var retryMessage =
164+
"The following functions will be retried in case of failure: " +
165+
clc.bold(failurePolicyFunctionLabels.join(", ")) +
166+
". " +
167+
"Retried executions are billed as any other execution, and functions are retried repeatedly until they either successfully execute or the maximum retry period has elapsed, which can be up to 7 days. " +
168+
"For safety, you might want to ensure that your functions are idempotent; see https://firebase.google.com/docs/functions/retries to learn more.";
169+
170+
utils.logLabeledWarning("functions", retryMessage);
171+
172+
let proceedPrompt = Promise.resolve(true);
173+
if (options.nonInteractive && !options.force) {
174+
throw new FirebaseError("Pass the --force option to deploy functions with a failure policy", {
175+
exit: 1,
176+
});
177+
} else if (!options.nonInteractive) {
178+
proceedPrompt = promptOnce({
179+
type: "confirm",
180+
name: "confirm",
181+
default: false,
182+
message: "Would you like to proceed with deployment?",
183+
});
184+
}
185+
155186
delete payload.functions;
156-
return Promise.resolve(context.existingFunctions)
187+
188+
return proceedPrompt
189+
.then((proceed) => {
190+
if (!proceed) {
191+
throw new FirebaseError("Deployment canceled.", { exit: 1 });
192+
}
193+
194+
return Promise.resolve(context.existingFunctions);
195+
})
157196
.then(function(existingFunctions) {
158197
var pluckName = function(functionObject) {
159198
return _.get(functionObject, "name"); // e.g.'projects/proj1/locations/us-central1/functions/func'

src/functionsDeployHelper.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,10 @@ function getFunctionTrigger(functionInfo) {
123123
return _.pick(functionInfo, "httpsTrigger");
124124
} else if (functionInfo.eventTrigger) {
125125
var trigger = functionInfo.eventTrigger;
126+
trigger.failurePolicy = functionInfo.failurePolicy;
126127
return { eventTrigger: trigger };
127128
}
129+
128130
logger.debug("Unknown trigger type found in:", functionInfo);
129131
return new FirebaseError("Could not parse function trigger, unknown trigger type.");
130132
}

0 commit comments

Comments
 (0)