mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-12 07:57:32 +00:00
feat: add quotas (#4779)
adds possibilities to cap authenticated requests and execution seconds of actions on a defined intervall
This commit is contained in:
84
e2e/cypress/support/api/quota.ts
Normal file
84
e2e/cypress/support/api/quota.ts
Normal file
@@ -0,0 +1,84 @@
|
||||
import { Context } from 'support/commands';
|
||||
|
||||
export enum Unit {
|
||||
Unimplemented,
|
||||
AuthenticatedRequests,
|
||||
ExecutionSeconds,
|
||||
}
|
||||
|
||||
interface notification {
|
||||
percent: number;
|
||||
repeat?: boolean;
|
||||
callUrl: string;
|
||||
}
|
||||
|
||||
export function addQuota(
|
||||
ctx: Context,
|
||||
unit: Unit = Unit.AuthenticatedRequests,
|
||||
limit: boolean,
|
||||
amount: number,
|
||||
notifications?: Array<notification>,
|
||||
from: Date = (() => {
|
||||
const date = new Date();
|
||||
date.setMonth(0, 1);
|
||||
date.setMinutes(0, 0, 0);
|
||||
// default to start of current year
|
||||
return date;
|
||||
})(),
|
||||
intervalSeconds: string = `${315_576_000_000}s`, // proto max duration is 1000 years
|
||||
failOnStatusCode = true,
|
||||
): Cypress.Chainable<Cypress.Response<any>> {
|
||||
return cy.request({
|
||||
method: 'POST',
|
||||
url: `${ctx.system.baseURL}/instances/${ctx.instanceId}/quotas`,
|
||||
auth: {
|
||||
bearer: ctx.system.token,
|
||||
},
|
||||
body: {
|
||||
unit: unit,
|
||||
amount: amount,
|
||||
resetInterval: intervalSeconds,
|
||||
limit: limit,
|
||||
from: from,
|
||||
notifications: notifications,
|
||||
},
|
||||
failOnStatusCode: failOnStatusCode,
|
||||
});
|
||||
}
|
||||
|
||||
export function ensureQuotaIsAdded(
|
||||
ctx: Context,
|
||||
unit: Unit,
|
||||
limit: boolean,
|
||||
amount?: number,
|
||||
notifications?: Array<notification>,
|
||||
from?: Date,
|
||||
intervalSeconds?: string,
|
||||
): Cypress.Chainable<null> {
|
||||
return addQuota(ctx, unit, limit, amount, notifications, from, intervalSeconds, false).then((res) => {
|
||||
if (!res.isOkStatusCode) {
|
||||
expect(res.status).to.equal(409);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
export function removeQuota(ctx: Context, unit: Unit, failOnStatusCode = true): Cypress.Chainable<Cypress.Response<any>> {
|
||||
return cy.request({
|
||||
method: 'DELETE',
|
||||
url: `${ctx.system.baseURL}/instances/${ctx.instanceId}/quotas/${unit}`,
|
||||
auth: {
|
||||
bearer: ctx.system.token,
|
||||
},
|
||||
failOnStatusCode: failOnStatusCode,
|
||||
});
|
||||
}
|
||||
|
||||
export function ensureQuotaIsRemoved(ctx: Context, unit?: Unit): Cypress.Chainable<null> {
|
||||
return removeQuota(ctx, unit, false).then((res) => {
|
||||
if (!res.isOkStatusCode) {
|
||||
expect(res.status).to.equal(404);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user