Construtor de if / switch / class para iRules

Descreva uma decisão como regras e receba-a escrita como uma cadeia if / elseif, um switch e um class match com seus data groups em tmsh, e veja qual pool cada forma escolhe para um valor de teste. Mostra onde o primeiro casamento e o casamento mais longo divergem. Local, sem rede.

Redes

Regras, em ordem

  1. 1
  2. 2
  3. 3
Experimente

As formas discordam. Testado com /api/v2/users

  • if / elseif → api_pool
  • switch → api_pool
  • class match → api_v2_pool
  • A regra 2 nunca pode ser escolhida por if ou switch: a regra 1 vem antes e casa com todo valor que a regra 2 casa.
  • As regras usam mais de um tipo de comparação, então a forma class precisa de um data group por comparação, consultados na ordem em que as comparações aparecem pela primeira vez.
  • class match com starts_with ou ends_with devolve a entrada mais longa que casar, seja qual for a ordem das regras (referência de class da F5). if e switch pegam a primeira regra que casar, em ordem.

if / elseif

Escolheu para o valor de teste: api_pool

when HTTP_REQUEST priority 500 {
set value [string tolower [HTTP::path]]
if { ${value} starts_with "/api" } {
pool api_pool
} elseif { ${value} starts_with "/api/v2" } {
pool api_v2_pool
} elseif { ${value} eq "/login" } {
pool login_pool
} else {
pool web_pool
}
}

As condições são testadas de cima para baixo; vence a primeira verdadeira.

switch

Escolheu para o valor de teste: api_pool

when HTTP_REQUEST priority 500 {
switch -glob -- [string tolower [HTTP::path]] {
/api* {
pool api_pool
}
/api/v2* {
pool api_v2_pool
}
/login {
pool login_pool
}
default {
pool web_pool
}
}
}

Os padrões são testados de cima para baixo; vence o primeiro que casar. O -- impede que um valor começando com hífen seja lido como opção (F5 K15650046).

class match

Escolheu para o valor de teste: api_v2_pool

when HTTP_REQUEST priority 500 {
set value [string tolower [HTTP::path]]
set target [class match -value -- ${value} starts_with path_pools_starts_with]
if { ${target} eq "" } {
set target [class match -value -- ${value} equals path_pools_equals]
}
if { ${target} ne "" } {
pool ${target}
} else {
pool web_pool
}
}
Os data groups (tmsh)
ltm data-group internal path_pools_starts_with {
records {
/api {
data api_pool
}
/api/v2 {
data api_v2_pool
}
}
type string
}
ltm data-group internal path_pools_equals {
records {
/login {
data login_pool
}
}
type string
}

Cada consulta devolve o valor da entrada que casou, aqui o nome do pool. Os data groups precisam existir no BIG-IP; as definições em tmsh estão abaixo.

Endpoint da APIGEThttps://ronutz.com/api/v1/f5-irules-conditional-builderDocumentado, não servido. Abre a especificação.

Referências

Aparece nestes fluxos de trabalho