Skip to content

Commit

Permalink
Merge pull request #2041 from aziontech/dev
Browse files Browse the repository at this point in the history
DEPLOY 2024-12-20
  • Loading branch information
vinigfer authored Dec 20, 2024
2 parents ec17985 + f8e2c3c commit d2de51b
Show file tree
Hide file tree
Showing 12 changed files with 204 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/* eslint-disable cypress/no-unnecessary-waiting */
import generateUniqueName from '../../support/utils'
import selectors from '../../support/selectors'

let firewallName, ruleName

describe('Edge Firewall spec', { tags: ['@dev5'] }, () => {
beforeEach(() => {
cy.login()
firewallName = generateUniqueName('EdgeFirewall')
ruleName = generateUniqueName('EdgeFirewallRule')
})

it('should create an Edge Firewall and set a rate limit', () => {
cy.openProduct('Edge Firewall')

// Act - create Edge Firewall
cy.get(selectors.edgeFirewall.createButton).click()
cy.get(selectors.edgeFirewall.nameInput).clear()
cy.get(selectors.edgeFirewall.nameInput).type(firewallName)
cy.get(selectors.edgeFirewall.edgeFunctionSwitch).click()
cy.get(selectors.edgeFirewall.wafEnabledSwitch).click()
cy.get(selectors.edgeFirewall.saveButton).click()
cy.verifyToast('success', 'Your Edge Firewall has been created')

cy.get(selectors.edgeFirewall.rulesEngineTab).click()
cy.get(selectors.edgeFirewall.createRuleButton).click()
cy.get(selectors.edgeFirewall.ruleNameInput).click()
cy.get(selectors.edgeFirewall.ruleNameInput).type(ruleName)
cy.get(selectors.edgeFirewall.ruleDescriptionInput).clear()
cy.get(selectors.edgeFirewall.ruleDescriptionInput).type('My Rule Description')
cy.get(selectors.edgeFirewall.ruleCriteriaVariableDropdown).click()
cy.get(selectors.edgeFirewall.ruleCriteriaVariableDropdownHeaderAccept).click()
cy.get(selectors.edgeFirewall.ruleCriteriaOperatorDropdown).click()
cy.get(selectors.edgeFirewall.ruleCriteriaOperatorMatches).click()
cy.get(selectors.edgeFirewall.ruleCriteriaInput).clear()
cy.get(selectors.edgeFirewall.ruleCriteriaInput).type('test')

cy.get(selectors.edgeFirewall.ruleBehaviorDropdown).click()
cy.get(selectors.edgeFirewall.ruleBehaviorSetRateLimit).click()
cy.get(selectors.edgeFirewall.behaviorRateLimitType).click()
cy.get(selectors.edgeFirewall.behaviorRateLimitTypeFirstOption).click()
cy.get(selectors.edgeFirewall.behaviorAverageRateLimitInput).type('1')
cy.get(selectors.edgeFirewall.behaviorLimitBy).click()
cy.get(selectors.edgeFirewall.behaviorLimitByFirstOption).click()

cy.intercept('POST', '/api/v4/edge_firewall/firewalls/*/rules*').as('addEdgeFirewallRule')

cy.get(selectors.edgeFirewall.ruleSubmit).click()

cy.wait('@addEdgeFirewallRule').then((interception) => {
const requestBody = interception.request.body
expect(requestBody.criteria[0][0].operator).to.equal('matches')
})

cy.verifyToast('success', 'Rule Engine successfully created')

// Assert - Find the created rule
cy.get(selectors.edgeFirewall.rulesTableSearchInput).clear()
cy.get(selectors.edgeFirewall.rulesTableSearchInput).type(`${ruleName}{enter}`)
cy.get(selectors.edgeFirewall.rulesTableColumnName).should('have.text', ruleName)
cy.get(selectors.edgeFirewall.rulesTableColumnDescriptionShowMore).click()
cy.get(selectors.edgeFirewall.rulesTableColumnDescription).should(
'have.text',
'My Rule Description'
)

// Cleanup - Remove the created rule
cy.deleteEntityFromLoadedList().then(() => {
cy.verifyToast('Rules Engine successfully deleted')
})

// Assert - Find the created firewall
cy.get(selectors.edgeFirewall.mainSettingsTab).click()
cy.get(selectors.edgeFirewall.cancelButton).click()
cy.get(selectors.edgeFirewall.searchInput).clear()
cy.get(selectors.edgeFirewall.searchInput).type(`${firewallName}{enter}`)
cy.get(selectors.edgeFirewall.nameRow).should('have.text', firewallName)
cy.get(selectors.edgeFirewall.activeRow).should('have.text', 'Active')
})

afterEach(() => {
// Delete the firewall
cy.deleteEntityFromList({ entityName: firewallName, productName: 'Edge Firewall' }).then(() => {
cy.verifyToast('Edge Firewall successfully deleted')
})
})
})
8 changes: 7 additions & 1 deletion cypress/support/selectors/product-selectors/edge-firewall.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export default {
'[data-testid="edge-firewall-rules-form__network-list[0]__dropdown-filter-input"]',
ruleBehaviorDropdown: '[data-testid="edge-firewall-rules-form__behaviors[0]-dropdown__dropdown"]',
ruleBehaviorRunFunction: '#behaviors\\[0\\]\\.name_4',
ruleBehaviorSetRateLimit: '#behaviors\\[0\\]\\.name_2',
ruleBehaviorFirstOption: '#behaviors\\[0\\]\\.name_0',
rulesWafDropdown:
'[data-testid="edge-firewall-rule-form__behaviors[0]__waf__dropdown"] > .p-dropdown-label',
Expand All @@ -69,5 +70,10 @@ export default {
cancelButton: '[data-testid="form-actions-cancel-button"]',
searchInput: '[data-testid="data-table-search-input"]',
nameRow: '[data-testid="list-table-block__column__name__row"]',
activeRow: '[data-testid="list-table-block__column__status__row"] > .p-tag-value'
activeRow: '[data-testid="list-table-block__column__status__row"] > .p-tag-value',
behaviorRateLimitType: '#behaviors\\[0\\]\\.type > .p-dropdown-label',
behaviorRateLimitTypeFirstOption: '#behaviors\\[0\\]\\.type_1',
behaviorAverageRateLimitInput: '[data-testid="field-number__input"] > .p-inputtext',
behaviorLimitBy: '#behaviors\\[0\\]\\.limit_by > .p-dropdown-label',
behaviorLimitByFirstOption: '#behaviors\\[0\\]\\.limit_by_0',
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "azion-console-kit",
"version": "1.31.0",
"version": "1.31.1",
"private": false,
"type": "module",
"repository": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter'
import { makeEdgeApplicationV4BaseUrl } from '@/services/edge-application-services/v4/make-edge-application-v4-base-url'
import * as Errors from '@/services/axios/errors'
import { adaptBehavior } from './helper-behavior'
import { adaptCriteria } from './helper-criteria'
import { extractApiError } from '@/helpers/extract-api-error'

export const editRulesEngineService = async ({ id, payload, reorder = false }) => {
Expand All @@ -28,7 +29,7 @@ const adapt = (payload, reorder) => {
name,
phase: phase.content || phase,
behaviors: adaptBehavior(behaviors),
criteria,
criteria: adaptCriteria(criteria),
active: isActive,
description
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const isExistenceOperator = (operator) => ['exists', 'does_not_exist'].includes(operator)

const processCriteria = (criteria) => {
if (!isExistenceOperator(criteria.operator)) {
return criteria
}

// eslint-disable-next-line no-unused-vars
const { argument, ...processedCriteria } = criteria
return processedCriteria
}

export const adaptCriteria = (criterias) => {
return criterias.map((criteriaArray) => {
return criteriaArray.map(processCriteria)
})
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,19 @@ const parseBehaviors = (behaviors) => {
}
case 'set_rate_limit':
const typeToEnableBurstSize = 'second'
const burstSizeByType =
behavior.type === typeToEnableBurstSize ? behavior.maximum_burst_size : ''
const argument = {
type: behavior.type,
limit_by: behavior.limit_by,
average_rate_limit: Number(behavior.average_rate_limit)
}

if (behavior.type === typeToEnableBurstSize) {
argument.maximum_burst_size = Number(behavior.maximum_burst_size)
}

return {
name: behavior.name,
argument: {
type: behavior.type,
limit_by: behavior.limit_by,
average_rate_limit: `${behavior.average_rate_limit}`,
maximum_burst_size: `${burstSizeByType}`
}
argument
}
case 'set_custom_response':
return {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,19 @@ const parseBehaviors = (behaviors) => {
}
case 'set_rate_limit':
const typeToEnableBurstSize = 'second'
const burstSizeByType =
behavior.type === typeToEnableBurstSize ? behavior.maximum_burst_size : ''
const argument = {
type: behavior.type,
limit_by: behavior.limit_by,
average_rate_limit: Number(behavior.average_rate_limit)
}

if (behavior.type === typeToEnableBurstSize) {
argument.maximum_burst_size = Number(behavior.maximum_burst_size)
}

return {
name: behavior.name,
argument: {
type: behavior.type,
limit_by: behavior.limit_by,
average_rate_limit: `${behavior.average_rate_limit}`,
maximum_burst_size: `${burstSizeByType}`
}
argument
}
case 'set_custom_response':
return {
Expand Down
10 changes: 10 additions & 0 deletions src/templates/form-fields-inputs/fieldDropdownLazyLoader.vue
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,10 @@
enableWorkaroundLabelToDisabledOptions: {
type: Boolean,
default: false
},
disableEmitFirstRender: {
type: Boolean,
default: false
}
})
Expand All @@ -166,6 +170,7 @@
const page = ref(INITIAL_PAGE)
const search = ref('')
const focusSearch = ref(null)
const disableEmitInit = ref(props.disableEmitFirstRender)
onMounted(async () => {
await fetchData()
Expand Down Expand Up @@ -289,6 +294,11 @@
if (!optionExists) {
data.value = [newOption, ...data.value]
}
if (disableEmitInit.value) {
disableEmitInit.value = false
return
}
emitChange()
} finally {
loading.value = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter'
import * as Errors from '@/services/axios/errors'
import { editRulesEngineService } from '@/services/edge-application-rules-engine-services/v4'
import { describe, expect, it, vi } from 'vitest'
import { adaptCriteria } from '@/services/edge-application-rules-engine-services/v4/helper-criteria'

const fixtures = {
ruleEngineMock: {
Expand All @@ -17,15 +18,13 @@ const fixtures = {
}
],
criteria: [
{
entries: [
{
variable: 'remote_addr',
operator: 'is_equal',
value: '127.0.0.1'
}
]
}
[
{
variable: 'remote_addr',
operator: 'is_equal',
value: '127.0.0.1'
}
]
],
isActive: true,
description: 'Test rule description'
Expand Down Expand Up @@ -123,4 +122,48 @@ describe('EdgeApplicationRulesEngineServices', () => {

expect(promise).rejects.toBe('Bad Request Error')
})

it('should remove argument from criteria when operator is "exists" or "does_not_exist"', () => {
const criterias = [
[
{
variable: 'remote_addr',
operator: 'exists',
argument: '192.168.1.1'
},
{
variable: 'remote_addr',
operator: 'is_equal',
argument: '192.168.1.1'
},
{
variable: 'remote_addr',
operator: 'does_not_exist',
argument: '192.168.1.2'
},
]
]

const expectedCriterias = [
[
{
variable: 'remote_addr',
operator: 'exists'
},
{
variable: 'remote_addr',
operator: 'is_equal',
argument: '192.168.1.1'
},
{
variable: 'remote_addr',
operator: 'does_not_exist'
},
]
]

const result = adaptCriteria(criterias)

expect(result).toEqual(expectedCriterias)
})
})
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ describe('EdgeFirewallRulesEngineService', () => {
argument: {
type: 'second',
limit_by: 'ip',
average_rate_limit: '10',
maximum_burst_size: '20'
average_rate_limit: 10,
maximum_burst_size: 20
}
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@
:service="listEdgeFunctionsServiceDecorator"
:loadService="loadEdgeFunctionService"
:moreOptions="['args']"
disableEmitFirstRender
optionLabel="label"
optionValue="value"
:value="edgeFunctionID"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
const changeArgs = async (target) => {
if (target?.args) {
args.value = target?.args
args.value = target.args
}
}
Expand Down Expand Up @@ -109,6 +109,7 @@
:loadService="props.loadEdgeFunctionService"
:value="edgeFunctionID"
:moreOptions="['args']"
disableEmitFirstRender
@onSelectOption="changeArgs"
optionLabel="label"
optionValue="value"
Expand Down

0 comments on commit d2de51b

Please sign in to comment.