diff --git a/CHANGELOG.md b/CHANGELOG.md index e69de29bb..c094d2168 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -0,0 +1 @@ +- Add support for more regions and memory for v2 functions (#1037). diff --git a/spec/runtime/loader.spec.ts b/spec/runtime/loader.spec.ts index 436d3ea62..11acb583f 100644 --- a/spec/runtime/loader.spec.ts +++ b/spec/runtime/loader.spec.ts @@ -122,7 +122,12 @@ describe('extractStack', () => { platform: 'gcfv1', eventTrigger: { eventType: 'google.pubsub.topic.publish', - eventFilters: { resource: 'projects/my-project/topics/my-topic' }, + eventFilters: [ + { + attribute: 'resource', + value: 'projects/my-project/topics/my-topic', + }, + ], retry: false, }, labels: {}, diff --git a/spec/v1/cloud-functions.spec.ts b/spec/v1/cloud-functions.spec.ts index 5dd0a8941..3405af695 100644 --- a/spec/v1/cloud-functions.spec.ts +++ b/spec/v1/cloud-functions.spec.ts @@ -62,9 +62,12 @@ describe('makeCloudFunction', () => { platform: 'gcfv1', eventTrigger: { eventType: 'mock.provider.mock.event', - eventFilters: { - resource: 'resource', - }, + eventFilters: [ + { + attribute: 'resource', + value: 'resource', + }, + ], retry: false, }, labels: {}, @@ -86,9 +89,12 @@ describe('makeCloudFunction', () => { platform: 'gcfv1', eventTrigger: { eventType: 'providers/provider/eventTypes/event', - eventFilters: { - resource: 'resource', - }, + eventFilters: [ + { + attribute: 'resource', + value: 'resource', + }, + ], retry: false, }, labels: {}, @@ -119,9 +125,12 @@ describe('makeCloudFunction', () => { serviceAccountEmail: 'foo@google.com', eventTrigger: { eventType: 'mock.provider.mock.event', - eventFilters: { - resource: 'resource', - }, + eventFilters: [ + { + attribute: 'resource', + value: 'resource', + }, + ], retry: false, }, secretEnvironmentVariables: [{ secret: 'MY_SECRET', key: 'MY_SECRET' }], @@ -143,9 +152,12 @@ describe('makeCloudFunction', () => { platform: 'gcfv1', eventTrigger: { eventType: 'mock.provider.mock.event', - eventFilters: { - resource: 'resource', - }, + eventFilters: [ + { + attribute: 'resource', + value: 'resource', + }, + ], retry: true, }, labels: {}, diff --git a/spec/v1/providers/analytics.spec.ts b/spec/v1/providers/analytics.spec.ts index ead39554f..1603fc280 100644 --- a/spec/v1/providers/analytics.spec.ts +++ b/spec/v1/providers/analytics.spec.ts @@ -72,9 +72,12 @@ describe('Analytics Functions', () => { expect(cloudFunction.__endpoint).to.deep.equal({ platform: 'gcfv1', eventTrigger: { - eventFilters: { - resource: 'projects/project1/events/first_open', - }, + eventFilters: [ + { + attribute: 'resource', + value: 'projects/project1/events/first_open', + }, + ], eventType: 'providers/google.firebase.analytics/eventTypes/event.log', retry: false, diff --git a/spec/v1/providers/auth.spec.ts b/spec/v1/providers/auth.spec.ts index 8659a1967..3f5913d2b 100644 --- a/spec/v1/providers/auth.spec.ts +++ b/spec/v1/providers/auth.spec.ts @@ -64,9 +64,12 @@ describe('Auth Functions', () => { return { platform: 'gcfv1', eventTrigger: { - eventFilters: { - resource: `projects/${project}`, - }, + eventFilters: [ + { + attribute: 'resource', + value: `projects/${project}`, + }, + ], eventType: `providers/firebase.auth/eventTypes/${eventType}`, retry: false, }, diff --git a/spec/v1/providers/database.spec.ts b/spec/v1/providers/database.spec.ts index f932dd871..21706b2d5 100644 --- a/spec/v1/providers/database.spec.ts +++ b/spec/v1/providers/database.spec.ts @@ -45,9 +45,12 @@ describe('Database Functions', () => { return { platform: 'gcfv1', eventTrigger: { - eventFilters: { - resource, - }, + eventFilters: [ + { + attribute: 'resource', + value: resource, + }, + ], eventType: `providers/google.firebase.database/eventTypes/${eventType}`, retry: false, }, diff --git a/spec/v1/providers/firestore.spec.ts b/spec/v1/providers/firestore.spec.ts index 3f9f07fbe..0317e69f0 100644 --- a/spec/v1/providers/firestore.spec.ts +++ b/spec/v1/providers/firestore.spec.ts @@ -107,9 +107,12 @@ describe('Firestore Functions', () => { return { platform: 'gcfv1', eventTrigger: { - eventFilters: { - resource, - }, + eventFilters: [ + { + attribute: 'resource', + value: resource, + }, + ], eventType: `providers/cloud.firestore/eventTypes/${eventType}`, retry: false, }, diff --git a/spec/v1/providers/pubsub.spec.ts b/spec/v1/providers/pubsub.spec.ts index 5547515ab..eddf6533c 100644 --- a/spec/v1/providers/pubsub.spec.ts +++ b/spec/v1/providers/pubsub.spec.ts @@ -108,9 +108,12 @@ describe('Pubsub Functions', () => { platform: 'gcfv1', eventTrigger: { eventType: 'google.pubsub.topic.publish', - eventFilters: { - resource: 'projects/project1/topics/toppy', - }, + eventFilters: [ + { + attribute: 'resource', + value: 'projects/project1/topics/toppy', + }, + ], retry: false, }, labels: {}, diff --git a/spec/v1/providers/remoteConfig.spec.ts b/spec/v1/providers/remoteConfig.spec.ts index f3fde2043..8dc310a7b 100644 --- a/spec/v1/providers/remoteConfig.spec.ts +++ b/spec/v1/providers/remoteConfig.spec.ts @@ -68,9 +68,12 @@ describe('RemoteConfig Functions', () => { platform: 'gcfv1', eventTrigger: { eventType: 'google.firebase.remoteconfig.update', - eventFilters: { - resource: 'projects/project1', - }, + eventFilters: [ + { + attribute: 'resource', + value: 'projects/project1', + }, + ], retry: false, }, labels: {}, diff --git a/spec/v1/providers/storage.spec.ts b/spec/v1/providers/storage.spec.ts index d96b131b9..d99a14baa 100644 --- a/spec/v1/providers/storage.spec.ts +++ b/spec/v1/providers/storage.spec.ts @@ -42,9 +42,12 @@ describe('Storage Functions', () => { return { platform: 'gcfv1', eventTrigger: { - eventFilters: { - resource: `projects/_/buckets/${bucket}`, - }, + eventFilters: [ + { + attribute: 'resource', + value: `projects/_/buckets/${bucket}`, + }, + ], eventType: `google.storage.object.${eventType}`, retry: false, }, diff --git a/spec/v1/providers/testLab.spec.ts b/spec/v1/providers/testLab.spec.ts index b3ba22d7f..968ccb079 100644 --- a/spec/v1/providers/testLab.spec.ts +++ b/spec/v1/providers/testLab.spec.ts @@ -50,9 +50,12 @@ describe('Test Lab Functions', () => { platform: 'gcfv1', eventTrigger: { eventType: 'google.testing.testMatrix.complete', - eventFilters: { - resource: 'projects/project1/testMatrices/{matrix}', - }, + eventFilters: [ + { + attribute: 'resource', + value: 'projects/project1/testMatrices/{matrix}', + }, + ], retry: false, }, labels: {}, diff --git a/spec/v2/providers/alerts/alerts.spec.ts b/spec/v2/providers/alerts/alerts.spec.ts index b63f567aa..4f53c41d2 100644 --- a/spec/v2/providers/alerts/alerts.spec.ts +++ b/spec/v2/providers/alerts/alerts.spec.ts @@ -16,9 +16,12 @@ describe('alerts', () => { labels: {}, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + ], retry: false, }, }); @@ -38,10 +41,16 @@ describe('alerts', () => { ...FULL_ENDPOINT, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - appId: APPID, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + { + attribute: 'appid', + value: APPID, + }, + ], retry: false, }, }); @@ -72,9 +81,12 @@ describe('alerts', () => { labels: {}, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + ], retry: false, }, }); @@ -87,9 +99,12 @@ describe('alerts', () => { ...FULL_ENDPOINT, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + ], retry: false, }, }); @@ -102,10 +117,16 @@ describe('alerts', () => { ...FULL_ENDPOINT, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - appId: APPID, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + { + attribute: 'appid', + value: APPID, + }, + ], retry: false, }, }); @@ -132,10 +153,16 @@ describe('alerts', () => { minInstances: 3, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - appId: APPID, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + { + attribute: 'appid', + value: APPID, + }, + ], retry: false, }, }); diff --git a/spec/v2/providers/alerts/appDistribution.spec.ts b/spec/v2/providers/alerts/appDistribution.spec.ts index 52fdfd3b9..2f8ea5c5a 100644 --- a/spec/v2/providers/alerts/appDistribution.spec.ts +++ b/spec/v2/providers/alerts/appDistribution.spec.ts @@ -19,10 +19,16 @@ describe('appDistribution', () => { labels: {}, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: appDistribution.newTesterIosDeviceAlert, - appId: APPID, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: appDistribution.newTesterIosDeviceAlert, + }, + { + attribute: 'appid', + value: APPID, + }, + ], retry: false, }, }); @@ -38,9 +44,12 @@ describe('appDistribution', () => { ...FULL_ENDPOINT, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: appDistribution.newTesterIosDeviceAlert, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: appDistribution.newTesterIosDeviceAlert, + }, + ], retry: false, }, }); @@ -56,10 +65,16 @@ describe('appDistribution', () => { ...FULL_ENDPOINT, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: appDistribution.newTesterIosDeviceAlert, - appId: APPID, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: appDistribution.newTesterIosDeviceAlert, + }, + { + attribute: 'appid', + value: APPID, + }, + ], retry: false, }, }); @@ -73,9 +88,12 @@ describe('appDistribution', () => { labels: {}, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: appDistribution.newTesterIosDeviceAlert, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: appDistribution.newTesterIosDeviceAlert, + }, + ], retry: false, }, }); diff --git a/spec/v2/providers/alerts/billing.spec.ts b/spec/v2/providers/alerts/billing.spec.ts index 71e695fc7..bc3fa6a9a 100644 --- a/spec/v2/providers/alerts/billing.spec.ts +++ b/spec/v2/providers/alerts/billing.spec.ts @@ -16,9 +16,12 @@ describe('billing', () => { labels: {}, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: billing.planUpdateAlert, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: billing.planUpdateAlert, + }, + ], retry: false, }, }); @@ -34,9 +37,12 @@ describe('billing', () => { ...FULL_ENDPOINT, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: billing.planUpdateAlert, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: billing.planUpdateAlert, + }, + ], retry: false, }, }); @@ -52,9 +58,12 @@ describe('billing', () => { labels: {}, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: billing.planAutomatedUpdateAlert, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: billing.planAutomatedUpdateAlert, + }, + ], retry: false, }, }); @@ -70,9 +79,12 @@ describe('billing', () => { ...FULL_ENDPOINT, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: billing.planAutomatedUpdateAlert, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: billing.planAutomatedUpdateAlert, + }, + ], retry: false, }, }); @@ -88,9 +100,12 @@ describe('billing', () => { labels: {}, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + ], retry: false, }, }); @@ -107,9 +122,12 @@ describe('billing', () => { ...FULL_ENDPOINT, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + ], retry: false, }, }); diff --git a/spec/v2/providers/alerts/crashlytics.spec.ts b/spec/v2/providers/alerts/crashlytics.spec.ts index 1d5c1a8b6..0ac00c5e0 100644 --- a/spec/v2/providers/alerts/crashlytics.spec.ts +++ b/spec/v2/providers/alerts/crashlytics.spec.ts @@ -8,437 +8,121 @@ const APPID = '123456789'; const myHandler = () => 42; describe('crashlytics', () => { - describe('onNewFatalIssuePublished', () => { - it('should create a function only handler', () => { - const func = crashlytics.onNewFatalIssuePublished(myHandler); - - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newFatalIssueAlert, - }, - retry: false, - }, - }); - }); - - it('should create a function with appId', () => { - const func = crashlytics.onNewFatalIssuePublished(APPID, myHandler); - - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newFatalIssueAlert, - appId: APPID, - }, - retry: false, - }, - }); - }); - - it('should create a function with base opts', () => { - const func = crashlytics.onNewFatalIssuePublished( - { ...FULL_OPTIONS }, - myHandler - ); - - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newFatalIssueAlert, - }, - retry: false, - }, - }); - }); - - it('should create a function with opts', () => { - const func = crashlytics.onNewFatalIssuePublished( - { ...FULL_OPTIONS, appId: APPID }, - myHandler - ); - - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newFatalIssueAlert, - appId: APPID, - }, - retry: false, - }, - }); - }); - }); - - describe('onNewNonfatalIssuePublished', () => { - it('should create a function only handler', () => { - const func = crashlytics.onNewNonfatalIssuePublished(myHandler); - - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newNonfatalIssueAlert, - }, - retry: false, - }, - }); - }); - - it('should create a function with appId', () => { - const func = crashlytics.onNewNonfatalIssuePublished(APPID, myHandler); - - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newNonfatalIssueAlert, - appId: APPID, - }, - retry: false, - }, - }); - }); - - it('should create a function with base opts', () => { - const func = crashlytics.onNewNonfatalIssuePublished( - { ...FULL_OPTIONS }, - myHandler - ); - - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newNonfatalIssueAlert, + const testcases = [ + { + method: 'onNewFatalIssuePublished', + event: crashlytics.newFatalIssueAlert, + }, + { + method: 'onNewNonfatalIssuePublished', + event: crashlytics.newNonfatalIssueAlert, + }, + { + method: 'onRegressionAlertPublished', + event: crashlytics.regressionAlert, + }, + { + method: 'onStabilityDigestPublished', + event: crashlytics.stabilityDigestAlert, + }, + { + method: 'onVelocityAlertPublished', + event: crashlytics.velocityAlert, + }, + { + method: 'onNewAnrIssuePublished', + event: crashlytics.newAnrIssueAlert, + }, + ]; + + for (const { method, event } of testcases) { + describe(method, () => { + it('should create a function only handler', () => { + const func = crashlytics[method](myHandler); + + expect(func.__endpoint).to.deep.equal({ + platform: 'gcfv2', + labels: {}, + eventTrigger: { + eventType: alerts.eventType, + eventFilters: [ + { + attribute: 'alerttype', + value: event, + }, + ], + retry: false, }, - retry: false, - }, + }); }); - }); - - it('should create a function with opts', () => { - const func = crashlytics.onNewNonfatalIssuePublished( - { ...FULL_OPTIONS, appId: APPID }, - myHandler - ); - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newNonfatalIssueAlert, - appId: APPID, + it('should create a function with appId', () => { + const func = crashlytics[method](APPID, myHandler); + + expect(func.__endpoint).to.deep.equal({ + platform: 'gcfv2', + labels: {}, + eventTrigger: { + eventType: alerts.eventType, + eventFilters: [ + { + attribute: 'alerttype', + value: event, + }, + { + attribute: 'appid', + value: APPID, + }, + ], + retry: false, }, - retry: false, - }, + }); }); - }); - }); - describe('onRegressionAlertPublished', () => { - it('should create a function only handler', () => { - const func = crashlytics.onRegressionAlertPublished(myHandler); - - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.regressionAlert, + it('should create a function with base opts', () => { + const func = crashlytics[method]({ ...FULL_OPTIONS }, myHandler); + + expect(func.__endpoint).to.deep.equal({ + ...FULL_ENDPOINT, + eventTrigger: { + eventType: alerts.eventType, + eventFilters: [ + { + attribute: 'alerttype', + value: event, + }, + ], + retry: false, }, - retry: false, - }, + }); }); - }); - - it('should create a function with appId', () => { - const func = crashlytics.onRegressionAlertPublished(APPID, myHandler); - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.regressionAlert, - appId: APPID, + it('should create a function with opts', () => { + const func = crashlytics[method]( + { ...FULL_OPTIONS, appId: APPID }, + myHandler + ); + + expect(func.__endpoint).to.deep.equal({ + ...FULL_ENDPOINT, + eventTrigger: { + eventType: alerts.eventType, + eventFilters: [ + { + attribute: 'alerttype', + value: event, + }, + { + attribute: 'appid', + value: APPID, + }, + ], + retry: false, }, - retry: false, - }, + }); }); }); - - it('should create a function with base opts', () => { - const func = crashlytics.onRegressionAlertPublished( - { ...FULL_OPTIONS }, - myHandler - ); - - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.regressionAlert, - }, - retry: false, - }, - }); - }); - - it('should create a function with opts', () => { - const func = crashlytics.onRegressionAlertPublished( - { ...FULL_OPTIONS, appId: APPID }, - myHandler - ); - - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.regressionAlert, - appId: APPID, - }, - retry: false, - }, - }); - }); - }); - - describe('onStabilityDigestPublished', () => { - it('should create a function only handler', () => { - const func = crashlytics.onStabilityDigestPublished(myHandler); - - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.stabilityDigestAlert, - }, - retry: false, - }, - }); - }); - - it('should create a function with appId', () => { - const func = crashlytics.onStabilityDigestPublished(APPID, myHandler); - - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.stabilityDigestAlert, - appId: APPID, - }, - retry: false, - }, - }); - }); - - it('should create a function with base opts', () => { - const func = crashlytics.onStabilityDigestPublished( - { ...FULL_OPTIONS }, - myHandler - ); - - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.stabilityDigestAlert, - }, - retry: false, - }, - }); - }); - - it('should create a function with opts', () => { - const func = crashlytics.onStabilityDigestPublished( - { ...FULL_OPTIONS, appId: APPID }, - myHandler - ); - - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.stabilityDigestAlert, - appId: APPID, - }, - retry: false, - }, - }); - }); - }); - - describe('onVelocityAlertPublished', () => { - it('should create a function only handler', () => { - const func = crashlytics.onVelocityAlertPublished(myHandler); - - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.velocityAlert, - }, - retry: false, - }, - }); - }); - - it('should create a function with appId', () => { - const func = crashlytics.onVelocityAlertPublished(APPID, myHandler); - - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.velocityAlert, - appId: APPID, - }, - retry: false, - }, - }); - }); - - it('should create a function with base opts', () => { - const func = crashlytics.onVelocityAlertPublished( - { ...FULL_OPTIONS }, - myHandler - ); - - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.velocityAlert, - }, - retry: false, - }, - }); - }); - - it('should create a function with opts', () => { - const func = crashlytics.onVelocityAlertPublished( - { ...FULL_OPTIONS, appId: APPID }, - myHandler - ); - - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.velocityAlert, - appId: APPID, - }, - retry: false, - }, - }); - }); - }); - - describe('onNewAnrIssuePublished', () => { - it('should create a function only handler', () => { - const func = crashlytics.onNewAnrIssuePublished(myHandler); - - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newAnrIssueAlert, - }, - retry: false, - }, - }); - }); - - it('should create a function with appId', () => { - const func = crashlytics.onNewAnrIssuePublished(APPID, myHandler); - - expect(func.__endpoint).to.deep.equal({ - platform: 'gcfv2', - labels: {}, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newAnrIssueAlert, - appId: APPID, - }, - retry: false, - }, - }); - }); - - it('should create a function with base opts', () => { - const func = crashlytics.onNewAnrIssuePublished( - { ...FULL_OPTIONS }, - myHandler - ); - - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newAnrIssueAlert, - }, - retry: false, - }, - }); - }); - - it('should create a function with opts', () => { - const func = crashlytics.onNewAnrIssuePublished( - { ...FULL_OPTIONS, appId: APPID }, - myHandler - ); - - expect(func.__endpoint).to.deep.equal({ - ...FULL_ENDPOINT, - eventTrigger: { - eventType: alerts.eventType, - eventFilters: { - alertType: crashlytics.newAnrIssueAlert, - appId: APPID, - }, - retry: false, - }, - }); - }); - }); + } describe('onOperation', () => { it('should create a function with alertType only', () => { @@ -449,9 +133,12 @@ describe('crashlytics', () => { labels: {}, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + ], retry: false, }, }); @@ -465,10 +152,16 @@ describe('crashlytics', () => { labels: {}, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - appId: APPID, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + { + attribute: 'appid', + value: APPID, + }, + ], retry: false, }, }); @@ -485,9 +178,12 @@ describe('crashlytics', () => { ...FULL_ENDPOINT, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + ], retry: false, }, }); @@ -504,10 +200,16 @@ describe('crashlytics', () => { ...FULL_ENDPOINT, eventTrigger: { eventType: alerts.eventType, - eventFilters: { - alertType: ALERT_TYPE, - appId: APPID, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: ALERT_TYPE, + }, + { + attribute: 'appid', + value: APPID, + }, + ], retry: false, }, }); diff --git a/spec/v2/providers/pubsub.spec.ts b/spec/v2/providers/pubsub.spec.ts index f48e10f72..303ffa1d7 100644 --- a/spec/v2/providers/pubsub.spec.ts +++ b/spec/v2/providers/pubsub.spec.ts @@ -12,9 +12,12 @@ const EVENT_TRIGGER = { const ENDPOINT_EVENT_TRIGGER = { eventType: 'google.cloud.pubsub.topic.v1.messagePublished', - eventFilters: { - topic: 'topic', - }, + eventFilters: [ + { + attribute: 'topic', + value: 'topic', + }, + ], retry: false, }; diff --git a/spec/v2/providers/storage.spec.ts b/spec/v2/providers/storage.spec.ts index 8c2e25576..cb612e561 100644 --- a/spec/v2/providers/storage.spec.ts +++ b/spec/v2/providers/storage.spec.ts @@ -12,9 +12,12 @@ const EVENT_TRIGGER = { const ENDPOINT_EVENT_TRIGGER = { eventType: 'event-type', - eventFilters: { - bucket: 'some-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'some-bucket', + }, + ], retry: false, }; @@ -116,9 +119,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_EVENT_TRIGGER, - eventFilters: { - bucket: 'default-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'default-bucket', + }, + ], }, region: ['us-west1'], }); @@ -268,9 +274,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_ARCHIVED_TRIGGER, - eventFilters: { - bucket: 'default-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'default-bucket', + }, + ], }, }); }); @@ -292,9 +301,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_ARCHIVED_TRIGGER, - eventFilters: { - bucket: 'my-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'my-bucket', + }, + ], }, }); }); @@ -320,9 +332,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_ARCHIVED_TRIGGER, - eventFilters: { - bucket: 'my-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'my-bucket', + }, + ], }, region: ['us-west1'], }); @@ -348,9 +363,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_ARCHIVED_TRIGGER, - eventFilters: { - bucket: 'default-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'default-bucket', + }, + ], }, region: ['us-west1'], }); @@ -395,9 +413,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_FINALIZED_TRIGGER, - eventFilters: { - bucket: 'default-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'default-bucket', + }, + ], }, }); }); @@ -419,9 +440,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_FINALIZED_TRIGGER, - eventFilters: { - bucket: 'my-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'my-bucket', + }, + ], }, }); }); @@ -447,9 +471,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_FINALIZED_TRIGGER, - eventFilters: { - bucket: 'my-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'my-bucket', + }, + ], }, region: ['us-west1'], }); @@ -478,9 +505,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_FINALIZED_TRIGGER, - eventFilters: { - bucket: 'default-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'default-bucket', + }, + ], }, region: ['us-west1'], }); @@ -525,9 +555,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_DELETED_TRIGGER, - eventFilters: { - bucket: 'default-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'default-bucket', + }, + ], }, }); @@ -551,9 +584,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_DELETED_TRIGGER, - eventFilters: { - bucket: 'my-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'my-bucket', + }, + ], }, }); }); @@ -579,9 +615,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_DELETED_TRIGGER, - eventFilters: { - bucket: 'my-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'my-bucket', + }, + ], }, region: ['us-west1'], }); @@ -607,9 +646,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_DELETED_TRIGGER, - eventFilters: { - bucket: 'default-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'default-bucket', + }, + ], }, region: ['us-west1'], }); @@ -654,9 +696,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_METADATA_TRIGGER, - eventFilters: { - bucket: 'default-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'default-bucket', + }, + ], }, }); @@ -680,9 +725,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_METADATA_TRIGGER, - eventFilters: { - bucket: 'my-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'my-bucket', + }, + ], }, }); }); @@ -708,9 +756,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_METADATA_TRIGGER, - eventFilters: { - bucket: 'my-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'my-bucket', + }, + ], }, region: ['us-west1'], }); @@ -739,9 +790,12 @@ describe('v2/storage', () => { labels: {}, eventTrigger: { ...ENDPOINT_METADATA_TRIGGER, - eventFilters: { - bucket: 'default-bucket', - }, + eventFilters: [ + { + attribute: 'bucket', + value: 'default-bucket', + }, + ], }, region: ['us-west1'], }); diff --git a/src/cloud-functions.ts b/src/cloud-functions.ts index ffe94e031..ab6fdb120 100644 --- a/src/cloud-functions.ts +++ b/src/cloud-functions.ts @@ -461,9 +461,12 @@ export function makeCloudFunction({ } else { endpoint.eventTrigger = { eventType: legacyEventType || provider + '.' + eventType, - eventFilters: { - resource: triggerResource(), - }, + eventFilters: [ + { + attribute: 'resource', + value: triggerResource(), + }, + ], retry: !!options.failurePolicy, }; } diff --git a/src/common/manifest.ts b/src/common/manifest.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/runtime/manifest.ts b/src/runtime/manifest.ts index aaaf87761..2b08385d5 100644 --- a/src/runtime/manifest.ts +++ b/src/runtime/manifest.ts @@ -19,6 +19,16 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +/** + * One or more event filters restrict the set of events delivered to an EventTrigger. + */ +interface EventFilter { + attribute: string; + value: string; + // if left unspecified, equality is used. + operator?: string; +} + /** * An definition of a function as appears in the Manifest. */ @@ -39,7 +49,7 @@ export interface ManifestEndpoint { labels?: Record; ingressSettings?: string; environmentVariables?: Record; - secretEnvironmentVariables?: { key: string; secret?: string }[]; + secretEnvironmentVariables?: Array<{ key: string; secret?: string }>; httpsTrigger?: { invoker?: string[]; @@ -48,7 +58,7 @@ export interface ManifestEndpoint { callableTrigger?: {}; eventTrigger?: { - eventFilters: Record; + eventFilters: EventFilter[]; eventType: string; retry: boolean; region?: string; @@ -75,7 +85,7 @@ export interface ManifestRequiredAPI { /** * An definition of a function deployment as appears in the Manifest. - **/ + */ export interface ManifestStack { specVersion: 'v1alpha1'; requiredAPIs: ManifestRequiredAPI[]; diff --git a/src/v2/providers/alerts/alerts.ts b/src/v2/providers/alerts/alerts.ts index b1501ed0e..902bd4232 100644 --- a/src/v2/providers/alerts/alerts.ts +++ b/src/v2/providers/alerts/alerts.ts @@ -91,14 +91,20 @@ export function getEndpointAnnotation( }, eventTrigger: { eventType, - eventFilters: { - alertType, - }, + eventFilters: [ + { + attribute: 'alerttype', + value: alertType, + }, + ], retry: !!opts.retry, }, }; if (appId) { - endpoint.eventTrigger.eventFilters.appId = appId; + endpoint.eventTrigger.eventFilters.push({ + attribute: 'appid', + value: appId, + }); } return endpoint; } diff --git a/src/v2/providers/pubsub.ts b/src/v2/providers/pubsub.ts index 2964af42d..01b731ccb 100644 --- a/src/v2/providers/pubsub.ts +++ b/src/v2/providers/pubsub.ts @@ -174,7 +174,7 @@ export function onMessagePublished( }, eventTrigger: { eventType: 'google.cloud.pubsub.topic.v1.messagePublished', - eventFilters: { topic }, + eventFilters: [{ attribute: 'topic', value: topic }], retry: false, }, }; diff --git a/src/v2/providers/storage.ts b/src/v2/providers/storage.ts index d5490317d..8e63ea45e 100644 --- a/src/v2/providers/storage.ts +++ b/src/v2/providers/storage.ts @@ -360,9 +360,7 @@ export function onOperation( }, eventTrigger: { eventType, - eventFilters: { - bucket, - }, + eventFilters: [{ attribute: 'bucket', value: bucket }], retry: false, }, };