CI/bats: test remediation api via socket (#3052)

This commit is contained in:
mmetc 2024-06-04 15:09:19 +02:00 committed by GitHub
parent 9101de95d8
commit d614ecbdcf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 67 additions and 102 deletions

View file

@ -9,8 +9,6 @@ setup_file() {
./instance-crowdsec start
API_KEY=$(cscli bouncers add testbouncer -o raw)
export API_KEY
CROWDSEC_API_URL="http://localhost:8080"
export CROWDSEC_API_URL
}
teardown_file() {
@ -22,11 +20,6 @@ setup() {
if is_db_mysql; then sleep 0.3; fi
}
api() {
URI="$1"
curl -s -H "X-Api-Key: ${API_KEY}" "${CROWDSEC_API_URL}${URI}"
}
#----------
@test "cli - first decisions list: must be empty" {
@ -37,7 +30,7 @@ api() {
}
@test "API - first decisions list: must be empty" {
rune -0 api '/v1/decisions'
rune -0 lapi-get '/v1/decisions'
assert_output 'null'
}
@ -53,7 +46,7 @@ api() {
}
@test "API - all decisions" {
rune -0 api '/v1/decisions'
rune -0 lapi-get '/v1/decisions'
rune -0 jq -c '[ . | length, .[0].value ]' <(output)
assert_output '[1,"1.2.3.4"]'
}
@ -67,7 +60,7 @@ api() {
}
@test "API - decision for 1.2.3.4" {
rune -0 api '/v1/decisions?ip=1.2.3.4'
rune -0 lapi-get '/v1/decisions?ip=1.2.3.4'
rune -0 jq -r '.[0].value' <(output)
assert_output '1.2.3.4'
}
@ -78,7 +71,7 @@ api() {
}
@test "API - decision for 1.2.3.5" {
rune -0 api '/v1/decisions?ip=1.2.3.5'
rune -0 lapi-get '/v1/decisions?ip=1.2.3.5'
assert_output 'null'
}
@ -90,7 +83,7 @@ api() {
}
@test "API - decision for 1.2.3.0/24" {
rune -0 api '/v1/decisions?range=1.2.3.0/24'
rune -0 lapi-get '/v1/decisions?range=1.2.3.0/24'
assert_output 'null'
}
@ -101,7 +94,7 @@ api() {
}
@test "API - decisions where IP in 1.2.3.0/24" {
rune -0 api '/v1/decisions?range=1.2.3.0/24&contains=false'
rune -0 lapi-get '/v1/decisions?range=1.2.3.0/24&contains=false'
rune -0 jq -r '.[0].value' <(output)
assert_output '1.2.3.4'
}

View file

@ -9,8 +9,6 @@ setup_file() {
./instance-crowdsec start
API_KEY=$(cscli bouncers add testbouncer -o raw)
export API_KEY
CROWDSEC_API_URL="http://localhost:8080"
export CROWDSEC_API_URL
}
teardown_file() {
@ -22,11 +20,6 @@ setup() {
if is_db_mysql; then sleep 0.5; fi
}
api() {
URI="$1"
curl -s -H "X-Api-Key: ${API_KEY}" "${CROWDSEC_API_URL}${URI}"
}
#----------
@test "cli - first decisions list: must be empty" {
@ -48,7 +41,7 @@ api() {
}
@test "API - all decisions" {
rune -0 api "/v1/decisions"
rune -0 lapi-get "/v1/decisions"
rune -0 jq -r '.[].value' <(output)
assert_output '1111:2222:3333:4444:5555:6666:7777:8888'
}
@ -60,7 +53,7 @@ api() {
}
@test "API - decisions for ip 1111:2222:3333:4444:5555:6666:7777:888" {
rune -0 api '/v1/decisions?ip=1111:2222:3333:4444:5555:6666:7777:8888'
rune -0 lapi-get '/v1/decisions?ip=1111:2222:3333:4444:5555:6666:7777:8888'
rune -0 jq -r '.[].value' <(output)
assert_output '1111:2222:3333:4444:5555:6666:7777:8888'
}
@ -71,7 +64,7 @@ api() {
}
@test "API - decisions for ip 1211:2222:3333:4444:5555:6666:7777:888" {
rune -0 api '/v1/decisions?ip=1211:2222:3333:4444:5555:6666:7777:8888'
rune -0 lapi-get '/v1/decisions?ip=1211:2222:3333:4444:5555:6666:7777:8888'
assert_output 'null'
}
@ -81,7 +74,7 @@ api() {
}
@test "API - decisions for ip 1111:2222:3333:4444:5555:6666:7777:8887" {
rune -0 api '/v1/decisions?ip=1111:2222:3333:4444:5555:6666:7777:8887'
rune -0 lapi-get '/v1/decisions?ip=1111:2222:3333:4444:5555:6666:7777:8887'
assert_output 'null'
}
@ -91,7 +84,7 @@ api() {
}
@test "API - decisions for range 1111:2222:3333:4444:5555:6666:7777:8888/48" {
rune -0 api '/v1/decisions?range=1111:2222:3333:4444:5555:6666:7777:8888/48'
rune -0 lapi-get '/v1/decisions?range=1111:2222:3333:4444:5555:6666:7777:8888/48'
assert_output 'null'
}
@ -102,7 +95,7 @@ api() {
}
@test "API - decisions for ip/range in 1111:2222:3333:4444:5555:6666:7777:8888/48" {
rune -0 api '/v1/decisions?range=1111:2222:3333:4444:5555:6666:7777:8888/48&&contains=false'
rune -0 lapi-get '/v1/decisions?range=1111:2222:3333:4444:5555:6666:7777:8888/48&&contains=false'
rune -0 jq -r '.[].value' <(output)
assert_output '1111:2222:3333:4444:5555:6666:7777:8888'
}
@ -113,7 +106,7 @@ api() {
}
@test "API - decisions for range 1111:2222:3333:4444:5555:6666:7777:8888/64" {
rune -0 api '/v1/decisions?range=1111:2222:3333:4444:5555:6666:7777:8888/64'
rune -0 lapi-get '/v1/decisions?range=1111:2222:3333:4444:5555:6666:7777:8888/64'
assert_output 'null'
}
@ -124,7 +117,7 @@ api() {
}
@test "API - decisions for ip/range in 1111:2222:3333:4444:5555:6666:7777:8888/64" {
rune -0 api '/v1/decisions?range=1111:2222:3333:4444:5555:6666:7777:8888/64&&contains=false'
rune -0 lapi-get '/v1/decisions?range=1111:2222:3333:4444:5555:6666:7777:8888/64&&contains=false'
rune -0 jq -r '.[].value' <(output)
assert_output '1111:2222:3333:4444:5555:6666:7777:8888'
}

View file

@ -9,8 +9,6 @@ setup_file() {
./instance-crowdsec start
API_KEY=$(cscli bouncers add testbouncer -o raw)
export API_KEY
CROWDSEC_API_URL="http://localhost:8080"
export CROWDSEC_API_URL
}
teardown_file() {
@ -22,11 +20,6 @@ setup() {
if is_db_mysql; then sleep 0.3; fi
}
api() {
URI="$1"
curl -s -H "X-Api-Key: ${API_KEY}" "${CROWDSEC_API_URL}${URI}"
}
#----------
@test "cli - first decisions list: must be empty" {
@ -48,7 +41,7 @@ api() {
}
@test "API - all decisions" {
rune -0 api '/v1/decisions'
rune -0 lapi-get '/v1/decisions'
rune -0 jq -r '.[0].value' <(output)
assert_output '4.4.4.0/24'
}
@ -62,7 +55,7 @@ api() {
}
@test "API - decisions for ip 4.4.4." {
rune -0 api '/v1/decisions?ip=4.4.4.3'
rune -0 lapi-get '/v1/decisions?ip=4.4.4.3'
rune -0 jq -r '.[0].value' <(output)
assert_output '4.4.4.0/24'
}
@ -73,7 +66,7 @@ api() {
}
@test "API - decisions for ip contained in 4.4.4." {
rune -0 api '/v1/decisions?ip=4.4.4.4&contains=false'
rune -0 lapi-get '/v1/decisions?ip=4.4.4.4&contains=false'
assert_output 'null'
}
@ -83,7 +76,7 @@ api() {
}
@test "API - decisions for ip 5.4.4." {
rune -0 api '/v1/decisions?ip=5.4.4.3'
rune -0 lapi-get '/v1/decisions?ip=5.4.4.3'
assert_output 'null'
}
@ -93,7 +86,7 @@ api() {
}
@test "API - decisions for range 4.4.0.0/1" {
rune -0 api '/v1/decisions?range=4.4.0.0/16'
rune -0 lapi-get '/v1/decisions?range=4.4.0.0/16'
assert_output 'null'
}
@ -104,7 +97,7 @@ api() {
}
@test "API - decisions for ip/range in 4.4.0.0/1" {
rune -0 api '/v1/decisions?range=4.4.0.0/16&contains=false'
rune -0 lapi-get '/v1/decisions?range=4.4.0.0/16&contains=false'
rune -0 jq -r '.[0].value' <(output)
assert_output '4.4.4.0/24'
}
@ -118,7 +111,7 @@ api() {
}
@test "API - decisions for range 4.4.4.2/2" {
rune -0 api '/v1/decisions?range=4.4.4.2/28'
rune -0 lapi-get '/v1/decisions?range=4.4.4.2/28'
rune -0 jq -r '.[].value' <(output)
assert_output '4.4.4.0/24'
}
@ -129,6 +122,6 @@ api() {
}
@test "API - decisions for range 4.4.3.2/2" {
rune -0 api '/v1/decisions?range=4.4.3.2/28'
rune -0 lapi-get '/v1/decisions?range=4.4.3.2/28'
assert_output 'null'
}

View file

@ -9,8 +9,6 @@ setup_file() {
./instance-crowdsec start
API_KEY=$(cscli bouncers add testbouncer -o raw)
export API_KEY
CROWDSEC_API_URL="http://localhost:8080"
export CROWDSEC_API_URL
}
teardown_file() {
@ -22,11 +20,6 @@ setup() {
if is_db_mysql; then sleep 0.3; fi
}
api() {
URI="$1"
curl -s -H "X-Api-Key: ${API_KEY}" "${CROWDSEC_API_URL}${URI}"
}
#----------
@test "cli - first decisions list: must be empty" {
@ -48,7 +41,7 @@ api() {
}
@test "API - all decisions (2)" {
rune -0 api '/v1/decisions'
rune -0 lapi-get '/v1/decisions'
rune -0 jq -r '.[].value' <(output)
assert_output 'aaaa:2222:3333:4444::/64'
}
@ -62,7 +55,7 @@ api() {
}
@test "API - decisions for ip aaaa:2222:3333:4444:5555:6666:7777:8888" {
rune -0 api '/v1/decisions?ip=aaaa:2222:3333:4444:5555:6666:7777:8888'
rune -0 lapi-get '/v1/decisions?ip=aaaa:2222:3333:4444:5555:6666:7777:8888'
rune -0 jq -r '.[].value' <(output)
assert_output 'aaaa:2222:3333:4444::/64'
}
@ -73,7 +66,7 @@ api() {
}
@test "API - decisions for ip aaaa:2222:3333:4445:5555:6666:7777:8888" {
rune -0 api '/v1/decisions?ip=aaaa:2222:3333:4445:5555:6666:7777:8888'
rune -0 lapi-get '/v1/decisions?ip=aaaa:2222:3333:4445:5555:6666:7777:8888'
assert_output 'null'
}
@ -83,7 +76,7 @@ api() {
}
@test "API - decisions for ip aaa1:2222:3333:4444:5555:6666:7777:8887" {
rune -0 api '/v1/decisions?ip=aaa1:2222:3333:4444:5555:6666:7777:8887'
rune -0 lapi-get '/v1/decisions?ip=aaa1:2222:3333:4444:5555:6666:7777:8887'
assert_output 'null'
}
@ -96,7 +89,7 @@ api() {
}
@test "API - decisions for range aaaa:2222:3333:4444:5555::/80" {
rune -0 api '/v1/decisions?range=aaaa:2222:3333:4444:5555::/80'
rune -0 lapi-get '/v1/decisions?range=aaaa:2222:3333:4444:5555::/80'
rune -0 jq -r '.[].value' <(output)
assert_output 'aaaa:2222:3333:4444::/64'
}
@ -108,7 +101,7 @@ api() {
}
@test "API - decisions for range aaaa:2222:3333:4441:5555::/80" {
rune -0 api '/v1/decisions?range=aaaa:2222:3333:4441:5555::/80'
rune -0 lapi-get '/v1/decisions?range=aaaa:2222:3333:4441:5555::/80'
assert_output 'null'
}
@ -118,7 +111,7 @@ api() {
}
@test "API - decisions for range aaa1:2222:3333:4444:5555::/80" {
rune -0 api '/v1/decisions?range=aaa1:2222:3333:4444:5555::/80'
rune -0 lapi-get '/v1/decisions?range=aaa1:2222:3333:4444:5555::/80'
assert_output 'null'
}
@ -130,7 +123,7 @@ api() {
}
@test "API - decisions for range aaaa:2222:3333:4444:5555:6666:7777:8888/48" {
rune -0 api '/v1/decisions?range=aaaa:2222:3333:4444:5555:6666:7777:8888/48'
rune -0 lapi-get '/v1/decisions?range=aaaa:2222:3333:4444:5555:6666:7777:8888/48'
assert_output 'null'
}
@ -141,7 +134,7 @@ api() {
}
@test "API - decisions for ip/range in aaaa:2222:3333:4444:5555:6666:7777:8888/48" {
rune -0 api '/v1/decisions?range=aaaa:2222:3333:4444:5555:6666:7777:8888/48&contains=false'
rune -0 lapi-get '/v1/decisions?range=aaaa:2222:3333:4444:5555:6666:7777:8888/48&contains=false'
rune -0 jq -r '.[].value' <(output)
assert_output 'aaaa:2222:3333:4444::/64'
}
@ -152,7 +145,7 @@ api() {
}
@test "API - decisions for ip/range in aaaa:2222:3333:4445:5555:6666:7777:8888/48" {
rune -0 api '/v1/decisions?range=aaaa:2222:3333:4445:5555:6666:7777:8888/48'
rune -0 lapi-get '/v1/decisions?range=aaaa:2222:3333:4445:5555:6666:7777:8888/48'
assert_output 'null'
}
@ -170,7 +163,7 @@ api() {
}
@test "API - decisions for ip in bbbb:db8:0000:0000:0000:6fff:ffff:ffff" {
rune -0 api '/v1/decisions?ip=bbbb:db8:0000:0000:0000:6fff:ffff:ffff'
rune -0 lapi-get '/v1/decisions?ip=bbbb:db8:0000:0000:0000:6fff:ffff:ffff'
rune -0 jq -r '.[].value' <(output)
assert_output 'bbbb:db8::/81'
}
@ -181,7 +174,7 @@ api() {
}
@test "API - decisions for ip in bbbb:db8:0000:0000:0000:8fff:ffff:ffff" {
rune -0 api '/v1/decisions?ip=bbbb:db8:0000:0000:0000:8fff:ffff:ffff'
rune -0 lapi-get '/v1/decisions?ip=bbbb:db8:0000:0000:0000:8fff:ffff:ffff'
assert_output 'null'
}

View file

@ -9,8 +9,6 @@ setup_file() {
./instance-crowdsec start
API_KEY=$(cscli bouncers add testbouncer -o raw)
export API_KEY
CROWDSEC_API_URL="http://localhost:8080"
export CROWDSEC_API_URL
}
teardown_file() {
@ -24,11 +22,6 @@ setup() {
#----------
api() {
URI="$1"
curl -s -H "X-Api-Key:${API_KEY}" "${CROWDSEC_API_URL}${URI}"
}
output_new_decisions() {
jq -c '.new | map(select(.origin!="CAPI")) | .[] | del(.id) | (.. | .duration?) |= capture("(?<d>[[:digit:]]+h[[:digit:]]+m)").d' <(output) | sort
}
@ -62,7 +55,7 @@ output_new_decisions() {
}
@test "test startup" {
rune -0 api "/v1/decisions/stream?startup=true"
rune -0 lapi-get "/v1/decisions/stream?startup=true"
rune -0 output_new_decisions
assert_output - <<-EOT
{"duration":"2h59m","origin":"test","scenario":"crowdsecurity/test","scope":"Ip","type":"ban","value":"127.0.0.2"}
@ -71,7 +64,7 @@ output_new_decisions() {
}
@test "test startup with scenarios containing" {
rune -0 api "/v1/decisions/stream?startup=true&scenarios_containing=ssh_bf"
rune -0 lapi-get "/v1/decisions/stream?startup=true&scenarios_containing=ssh_bf"
rune -0 output_new_decisions
assert_output - <<-EOT
{"duration":"2h59m","origin":"another_origin","scenario":"crowdsecurity/ssh_bf","scope":"Ip","type":"ban","value":"127.0.0.1"}
@ -80,7 +73,7 @@ output_new_decisions() {
}
@test "test startup with multiple scenarios containing" {
rune -0 api "/v1/decisions/stream?startup=true&scenarios_containing=ssh_bf,test"
rune -0 lapi-get "/v1/decisions/stream?startup=true&scenarios_containing=ssh_bf,test"
rune -0 output_new_decisions
assert_output - <<-EOT
{"duration":"2h59m","origin":"another_origin","scenario":"crowdsecurity/ssh_bf","scope":"Ip","type":"ban","value":"127.0.0.1"}
@ -89,12 +82,12 @@ output_new_decisions() {
}
@test "test startup with unknown scenarios containing" {
rune -0 api "/v1/decisions/stream?startup=true&scenarios_containing=unknown"
rune -0 lapi-get "/v1/decisions/stream?startup=true&scenarios_containing=unknown"
assert_output '{"deleted":null,"new":null}'
}
@test "test startup with scenarios containing and not containing" {
rune -0 api "/v1/decisions/stream?startup=true&scenarios_containing=test&scenarios_not_containing=ssh_bf"
rune -0 lapi-get "/v1/decisions/stream?startup=true&scenarios_containing=test&scenarios_not_containing=ssh_bf"
rune -0 output_new_decisions
assert_output - <<-EOT
{"duration":"2h59m","origin":"test","scenario":"crowdsecurity/test","scope":"Ip","type":"ban","value":"127.0.0.2"}
@ -103,7 +96,7 @@ output_new_decisions() {
}
@test "test startup with scenarios containing and not containing 2" {
rune -0 api "/v1/decisions/stream?startup=true&scenarios_containing=longest&scenarios_not_containing=ssh_bf,test"
rune -0 lapi-get "/v1/decisions/stream?startup=true&scenarios_containing=longest&scenarios_not_containing=ssh_bf,test"
rune -0 output_new_decisions
assert_output - <<-EOT
{"duration":"4h59m","origin":"test","scenario":"crowdsecurity/longest","scope":"Ip","type":"ban","value":"127.0.0.1"}
@ -111,7 +104,7 @@ output_new_decisions() {
}
@test "test startup with scenarios not containing" {
rune -0 api "/v1/decisions/stream?startup=true&scenarios_not_containing=ssh_bf"
rune -0 lapi-get "/v1/decisions/stream?startup=true&scenarios_not_containing=ssh_bf"
rune -0 output_new_decisions
assert_output - <<-EOT
{"duration":"2h59m","origin":"test","scenario":"crowdsecurity/test","scope":"Ip","type":"ban","value":"127.0.0.2"}
@ -120,7 +113,7 @@ output_new_decisions() {
}
@test "test startup with multiple scenarios not containing" {
rune -0 api "/v1/decisions/stream?startup=true&scenarios_not_containing=ssh_bf,test"
rune -0 lapi-get "/v1/decisions/stream?startup=true&scenarios_not_containing=ssh_bf,test"
rune -0 output_new_decisions
assert_output - <<-EOT
{"duration":"4h59m","origin":"test","scenario":"crowdsecurity/longest","scope":"Ip","type":"ban","value":"127.0.0.1"}
@ -128,7 +121,7 @@ output_new_decisions() {
}
@test "test startup with origins parameter" {
rune -0 api "/v1/decisions/stream?startup=true&origins=another_origin"
rune -0 lapi-get "/v1/decisions/stream?startup=true&origins=another_origin"
rune -0 output_new_decisions
assert_output - <<-EOT
{"duration":"1h59m","origin":"another_origin","scenario":"crowdsecurity/test","scope":"Ip","type":"ban","value":"127.0.0.2"}
@ -137,7 +130,7 @@ output_new_decisions() {
}
@test "test startup with multiple origins parameter" {
rune -0 api "/v1/decisions/stream?startup=true&origins=another_origin,test"
rune -0 lapi-get "/v1/decisions/stream?startup=true&origins=another_origin,test"
rune -0 output_new_decisions
assert_output - <<-EOT
{"duration":"2h59m","origin":"test","scenario":"crowdsecurity/test","scope":"Ip","type":"ban","value":"127.0.0.2"}
@ -146,7 +139,7 @@ output_new_decisions() {
}
@test "test startup with unknown origins" {
rune -0 api "/v1/decisions/stream?startup=true&origins=unknown"
rune -0 lapi-get "/v1/decisions/stream?startup=true&origins=unknown"
assert_output '{"deleted":null,"new":null}'
}

View file

@ -9,8 +9,6 @@ setup_file() {
./instance-crowdsec start
API_KEY=$(cscli bouncers add testbouncer -o raw)
export API_KEY
CROWDSEC_API_URL="http://localhost:8080"
export CROWDSEC_API_URL
}
teardown_file() {
@ -23,11 +21,6 @@ setup() {
#----------
api() {
URI="$1"
curl -s -H "X-Api-Key: ${API_KEY}" "${CROWDSEC_API_URL}${URI}"
}
@test "adding decisions for multiple scopes" {
rune -0 cscli decisions add -i '1.2.3.6'
assert_stderr --partial 'Decision successfully added'
@ -36,28 +29,28 @@ api() {
}
@test "stream start (implicit ip scope)" {
rune -0 api "/v1/decisions/stream?startup=true"
rune -0 lapi-get "/v1/decisions/stream?startup=true"
rune -0 jq -r '.new' <(output)
assert_output --partial '1.2.3.6'
refute_output --partial 'toto'
}
@test "stream start (explicit ip scope)" {
rune -0 api "/v1/decisions/stream?startup=true&scopes=ip"
rune -0 lapi-get "/v1/decisions/stream?startup=true&scopes=ip"
rune -0 jq -r '.new' <(output)
assert_output --partial '1.2.3.6'
refute_output --partial 'toto'
}
@test "stream start (user scope)" {
rune -0 api "/v1/decisions/stream?startup=true&scopes=user"
rune -0 lapi-get "/v1/decisions/stream?startup=true&scopes=user"
rune -0 jq -r '.new' <(output)
refute_output --partial '1.2.3.6'
assert_output --partial 'toto'
}
@test "stream start (user+ip scope)" {
rune -0 api "/v1/decisions/stream?startup=true&scopes=user,ip"
rune -0 lapi-get "/v1/decisions/stream?startup=true&scopes=user,ip"
rune -0 jq -r '.new' <(output)
assert_output --partial '1.2.3.6'
assert_output --partial 'toto'

View file

@ -9,8 +9,6 @@ setup_file() {
./instance-crowdsec start
API_KEY=$(cscli bouncers add testbouncer -o raw)
export API_KEY
CROWDSEC_API_URL="http://localhost:8080"
export CROWDSEC_API_URL
}
teardown_file() {
@ -23,11 +21,6 @@ setup() {
#----------
api() {
URI="$1"
curl -s -H "X-Api-Key: ${API_KEY}" "${CROWDSEC_API_URL}${URI}"
}
@test "adding decisions for multiple ips" {
rune -0 cscli decisions add -i '1111:2222:3333:4444:5555:6666:7777:8888'
assert_stderr --partial 'Decision successfully added'
@ -38,7 +31,7 @@ api() {
}
@test "stream start" {
rune -0 api "/v1/decisions/stream?startup=true"
rune -0 lapi-get "/v1/decisions/stream?startup=true"
if is_db_mysql; then sleep 3; fi
rune -0 jq -r '.new' <(output)
assert_output --partial '1111:2222:3333:4444:5555:6666:7777:8888'
@ -49,7 +42,7 @@ api() {
@test "stream cont (add)" {
rune -0 cscli decisions add -i '1.2.3.5'
if is_db_mysql; then sleep 3; fi
rune -0 api "/v1/decisions/stream"
rune -0 lapi-get "/v1/decisions/stream"
rune -0 jq -r '.new' <(output)
assert_output --partial '1.2.3.5'
}
@ -57,13 +50,13 @@ api() {
@test "stream cont (del)" {
rune -0 cscli decisions delete -i '1.2.3.4'
if is_db_mysql; then sleep 3; fi
rune -0 api "/v1/decisions/stream"
rune -0 lapi-get "/v1/decisions/stream"
rune -0 jq -r '.deleted' <(output)
assert_output --partial '1.2.3.4'
}
@test "stream restart" {
rune -0 api "/v1/decisions/stream?startup=true"
rune -0 lapi-get "/v1/decisions/stream?startup=true"
api_out=${output}
rune -0 jq -r '.deleted' <(output)
assert_output --partial '1.2.3.4'

View file

@ -276,3 +276,17 @@ rune() {
run --separate-stderr "$@"
}
export -f rune
# call the lapi through unix socket with an API_KEY (authenticates as a bouncer)
lapi-get() {
[[ -z "$1" ]] && { fail "lapi-get: missing path"; }
[[ -z "$API_KEY" ]] && { fail "lapi-get: missing API_KEY"; }
local socket
socket=$(config_get '.api.server.listen_socket')
[[ -z "$socket" ]] && { fail "lapi-get: missing .api.server.listen_socket"; }
# curl needs a fake hostname when using a unix socket
curl -s -f -H "X-Api-Key: $API_KEY" --unix-socket "$socket" "http://lapi$1"
}
export -f lapi-get