Implement http.#Wait to wait for a URL to be ready. It creates a dependency in the Cue tree

Signed-off-by: guillaume <guillaume.derouville@gmail.com>
This commit is contained in:
guillaume 2021-11-23 18:33:28 +01:00
parent b0f711e0eb
commit ec3c39aea0
5 changed files with 118 additions and 10 deletions

View File

@ -1,6 +1,10 @@
plan: plan:
package: ./http/tests package: ./http/tests
name: http name: http
inputs:
TestDockersocket:
socket:
unix: /var/run/docker.sock
sops: sops:
kms: [] kms: []
gcp_kms: [] gcp_kms: []
@ -16,8 +20,8 @@ sops:
NHkxc1VXWHBwZFN5WFNxamdPaGZLM3MKaZra2gWvKl7+pXSihV70/mQYel9697z2 NHkxc1VXWHBwZFN5WFNxamdPaGZLM3MKaZra2gWvKl7+pXSihV70/mQYel9697z2
eBSMuRPuZSjrg3JCBLhXTdIgUYxbMgWhILLpN5UqhTBVboUlRsURQA== eBSMuRPuZSjrg3JCBLhXTdIgUYxbMgWhILLpN5UqhTBVboUlRsURQA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
lastmodified: "2021-10-19T11:50:42Z" lastmodified: "2021-11-23T17:30:31Z"
mac: ENC[AES256_GCM,data:iG/JWnCk8UpThscQBqd9l7R7k1Xae1ED7WbYqPQmK5GRXhb7hIZGENnjn1aARnFjlCtEob6WvutWaZe7q1P90ZCirwXVBGewAeHchHqFA0KmUORRdtjMkZjnlRLMDKYu6CeNkaVK1al+B87CPlCBKz5UMeL9gnvug0k298AxWLY=,iv:RZEtSdbkxwgq5xEucnC+qyD2RCMk1DuaShjCh5Ihe5M=,tag:swW4R7ni0zoxOrc9lrV9Ww==,type:str] mac: ENC[AES256_GCM,data:R82VFQG+vtFoH/H4R3TGfFzcmEBLRWv81/pfbYIoWGTH3iFmVgfiCXuqF2O4suhG6mlmiGVDCFBBGPfFvOIBPSwbAqOoNQrM+pXPk3nrm3KY6RLSiByZX3yS1G2HHzGSbQVDuxlTBGyXhpJZs1ZgysZguHUqtunbrjSpD4+iWE8=,iv:LhTwB1QKXCXz9tu03d5NHIv/Jwrgg3LXQYafXykFz/o=,tag:h0mgHTyfxflAuv/uYuRibw==,type:str]
pgp: [] pgp: []
encrypted_suffix: secret encrypted_suffix: secret
version: 3.7.1 version: 3.7.1

View File

@ -1,2 +1,3 @@
# dagger universe # generated by dagger
alpha.dagger.io alpha.dagger.io
dagger.lock

View File

@ -6,6 +6,7 @@ import (
"alpha.dagger.io/alpine" "alpha.dagger.io/alpine"
"alpha.dagger.io/dagger" "alpha.dagger.io/dagger"
"alpha.dagger.io/dagger/op"
"alpha.dagger.io/os" "alpha.dagger.io/os"
) )
@ -84,3 +85,70 @@ import (
"statusCode": strconv.Atoi(statusCode) "statusCode": strconv.Atoi(statusCode)
} }
} }
// URL listener
// Creates a dependency on URL
#Wait: {
// URL to listen
url: string
// Waiting time between checks (sec.)
interval: int | *30
// Max amount of retries
retries: int | *3
// Max initialization time (sec.)
startPeriod: int | *0
// Time until timeout (sec.)
timeout: int | *30
#up: [
op.#Load & {
from: alpine.#Image & {
package: bash: "=~5.1"
package: curl: true
}
},
op.#Exec & {
args: ["/bin/bash", "-c",
#"""
# (f: str -> int)
nb_retries=$(($NB_RETRIES+0))
starting_period=$(($START_PERIOD+0))
status="0"
SECONDS=0
# START_PERIOD implementation
while [ $SECONDS -lt $starting_period ]; do
status="$(curl --connect-timeout 1 -s -o /dev/null -w ''%{http_code}'' $HEALTH_URL)"
if [ "$status" == "200" ]; then
exit 0;
fi
sleep 1;
done
# TIMEOUT, INTERVAL, INTERVAL implementation
for ((i=0;i<NB_RETRIES;i++)); do
status="$(curl --connect-timeout $TIMEOUT -s -o /dev/null -w ''%{http_code}'' $HEALTH_URL)"
if [ "$status" == "200" ]; then
exit 0;
fi
sleep "$INTERVAL";
done
exit 1;
"""#,
]
always: true
env: {
HEALTH_URL: url
INTERVAL: "\(interval)"
NB_RETRIES: "\(retries)"
START_PERIOD: "\(startPeriod)"
TIMEOUT: "\(timeout)"
}
},
]
}

View File

@ -2,13 +2,47 @@ package http
import ( import (
"alpha.dagger.io/alpine" "alpha.dagger.io/alpine"
"alpha.dagger.io/dagger"
"alpha.dagger.io/docker"
"alpha.dagger.io/os" "alpha.dagger.io/os"
"alpha.dagger.io/random"
) )
TestDockersocket: dagger.#Stream & dagger.#Input
TestSuffix: random.#String & {
seed: ""
}
TestRun: docker.#Run & {
name: "daggerci-test-wait-\(TestSuffix.out)"
ref: "nginx"
socket: TestDockersocket
ports: ["8080:80"]
}
// Waits for TestRun to finish initializing
Testhealth: #Wait & {
url: "http://localhost:8080/"
}
TestWait: {
query: os.#Container & {
image: alpine.#Image & {
package: bash: "=~5.1"
package: curl: true
}
command: #"""
test "$(curl -L --fail --silent --show-error --write-out "%{http_code}" "$URL" -o /dev/null)" = "200"
"""#
env: URL: Testhealth.url
}
}
TestRequest: { TestRequest: {
req: #Get & { req: #Get & {
url: "https://api.github.com/" url: Testhealth.url
request: header: Accept: "application/json"
} }
testRaw: os.#Container & { testRaw: os.#Container & {
@ -24,9 +58,8 @@ TestRequest: {
shell: args: ["--noprofile", "--norc", "-eo", "pipefail", "-c"] shell: args: ["--noprofile", "--norc", "-eo", "pipefail", "-c"]
command: #Command command: #Command
} }
}
#Command: #""" #Command: #"""
test "$(cat /content.json | jq -r .current_user_url)" = 'https://api.github.com/user' cat /content.json | grep -q nginx >/dev/null
test "$STATUS" = "200" test "$STATUS" = "200"
"""# """#
}

View File

@ -25,6 +25,8 @@ setup() {
@test "http" { @test "http" {
dagger -e http up dagger -e http up
CONTAINER=$(docker container ls -q --filter "name=daggerci-test-wait-*")
docker stop "$CONTAINER" && docker rm "$CONTAINER"
} }
@test "js/yarn" { @test "js/yarn" {