Merge pull request #1158 from grouville/http-wait
http.#Wait package implementation
This commit is contained in:
commit
399a7aba30
@ -3,6 +3,7 @@ package todoapp
|
|||||||
import (
|
import (
|
||||||
"alpha.dagger.io/dagger"
|
"alpha.dagger.io/dagger"
|
||||||
"alpha.dagger.io/docker"
|
"alpha.dagger.io/docker"
|
||||||
|
"alpha.dagger.io/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// docker local socket
|
// docker local socket
|
||||||
@ -24,10 +25,16 @@ registry: docker.#Run & {
|
|||||||
socket: dockerSocket
|
socket: dockerSocket
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// As we pushed the registry to our local docker
|
||||||
|
// we need to wait for the container to be up
|
||||||
|
wait: http.#Wait & {
|
||||||
|
url: "localhost:5042"
|
||||||
|
}
|
||||||
|
|
||||||
// push to our local registry
|
// push to our local registry
|
||||||
// this concrete value satisfies the string constraint
|
// this concrete value satisfies the string constraint
|
||||||
// we defined in the previous file
|
// we defined in the previous file
|
||||||
push: target: "localhost:5042/todoapp"
|
push: target: "\(wait.url)/todoapp"
|
||||||
|
|
||||||
// Application URL
|
// Application URL
|
||||||
appURL: "http://localhost:8080/" & dagger.#Output
|
appURL: "http://localhost:8080/" & dagger.#Output
|
||||||
|
@ -2,9 +2,9 @@ package todoapp
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"alpha.dagger.io/dagger"
|
"alpha.dagger.io/dagger"
|
||||||
"alpha.dagger.io/os"
|
|
||||||
"alpha.dagger.io/docker"
|
"alpha.dagger.io/docker"
|
||||||
"alpha.dagger.io/js/yarn"
|
"alpha.dagger.io/js/yarn"
|
||||||
|
"alpha.dagger.io/os"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Build the source code using Yarn
|
// Build the source code using Yarn
|
||||||
|
@ -72,3 +72,15 @@ _No input._
|
|||||||
| ------------- |:-------------: |:-------------: |
|
| ------------- |:-------------: |:-------------: |
|
||||||
|*statusCode* | `string` |- |
|
|*statusCode* | `string` |- |
|
||||||
|*body* | `string` |- |
|
|*body* | `string` |- |
|
||||||
|
|
||||||
|
## http.#Wait
|
||||||
|
|
||||||
|
URL listener Creates a dependency on URL
|
||||||
|
|
||||||
|
### http.#Wait Inputs
|
||||||
|
|
||||||
|
_No input._
|
||||||
|
|
||||||
|
### http.#Wait Outputs
|
||||||
|
|
||||||
|
_No output._
|
||||||
|
6
stdlib/.dagger/env/docker-pull/values.yaml
vendored
6
stdlib/.dagger/env/docker-pull/values.yaml
vendored
@ -3,7 +3,7 @@ plan:
|
|||||||
name: docker-pull
|
name: docker-pull
|
||||||
inputs:
|
inputs:
|
||||||
ref:
|
ref:
|
||||||
text: docker.io/daggerio/ci-test:pncdyzkdemof@sha256:b92cbbfef6b952befc38812cd88cf5c4c1012f6df2891595c226f56cc053334e
|
text: docker.io/daggerio/ci-test:tyrgcrtlasex@sha256:3b308dec2f3d4c563b9c71ce4ddc660e476b899d06fa37f3b9fef350c1062a1f
|
||||||
sops:
|
sops:
|
||||||
kms: []
|
kms: []
|
||||||
gcp_kms: []
|
gcp_kms: []
|
||||||
@ -19,8 +19,8 @@ sops:
|
|||||||
SG1raUVNTzZIWDltV1pOS3hySHlJeWcKg3blmstOGcxtPww513+mAEA0MWOXwNAT
|
SG1raUVNTzZIWDltV1pOS3hySHlJeWcKg3blmstOGcxtPww513+mAEA0MWOXwNAT
|
||||||
5ngRvG6MraW3g9dhIuUYOwjuJyz1Z07/DBEocSxnjSyw45ZCkM1/9Q==
|
5ngRvG6MraW3g9dhIuUYOwjuJyz1Z07/DBEocSxnjSyw45ZCkM1/9Q==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2021-08-31T10:10:02Z"
|
lastmodified: "2021-11-23T18:15:32Z"
|
||||||
mac: ENC[AES256_GCM,data:30qNlAVLJunPEboTzeIxcsZ06LcLiDiXXJLVqHE328hcezcOYGsvhlYTiGEzxtAsv78Mwxw54oSbiFZmCKoew9bTZFUyb6FcFVk4GG8z2I8pn7FkZlcnEknWinVf9Tc/h5R/g4/BBGzsBf2dr4fx4ADewwO2z1Df/8wdup0PD4E=,iv:KJcMdpLCfSU1LvvPMXitSPzm0JPwrDWdLncdvVFngNk=,tag:X2/D+RhEnyizZHXJWYnmmg==,type:str]
|
mac: ENC[AES256_GCM,data:+HpG1ZDND1Japu1hLgTVKF6CfEUbYp+sEBpv0WtsCHcHGYeYVkZT8ZJKajWlz8uFfikpKv76FkBw8XqKVXyPZYTQWuo9VvmPTF5HajiVE6kP5Ax3/5Sh7ecwfGdbqE3mQoj+jaQE8NBnGbCBljij/xFYW63fIaurqsyPWTQl2YI=,iv:fBPseUNueHO4ZUnlwDljfAwUvi4UyjGysXMTCmoAgYw=,tag:Pg4dGX4/05SahATlE6zrsA==,type:str]
|
||||||
pgp: []
|
pgp: []
|
||||||
encrypted_suffix: secret
|
encrypted_suffix: secret
|
||||||
version: 3.7.1
|
version: 3.7.1
|
||||||
|
8
stdlib/.dagger/env/http/values.yaml
vendored
8
stdlib/.dagger/env/http/values.yaml
vendored
@ -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
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
# dagger universe
|
# generated by dagger
|
||||||
alpha.dagger.io
|
alpha.dagger.io
|
||||||
|
dagger.lock
|
||||||
|
3
stdlib/cue.mod/pkg/.gitignore
vendored
3
stdlib/cue.mod/pkg/.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
# dagger universe
|
# generated by dagger
|
||||||
alpha.dagger.io
|
alpha.dagger.io
|
||||||
|
dagger.lock
|
||||||
|
@ -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)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
@ -2,13 +2,44 @@ 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: ["8088:80"]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Waits for TestRun to finish initializing
|
||||||
|
Testhealth: #Wait & {
|
||||||
|
url: "http://localhost:8088/"
|
||||||
|
}
|
||||||
|
|
||||||
|
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 +55,8 @@ TestRequest: {
|
|||||||
shell: args: ["--noprofile", "--norc", "-eo", "pipefail", "-c"]
|
shell: args: ["--noprofile", "--norc", "-eo", "pipefail", "-c"]
|
||||||
command: #Command
|
command: #Command
|
||||||
}
|
}
|
||||||
|
#Command: #"""
|
||||||
|
cat /content.json | grep -q nginx >/dev/null
|
||||||
|
test "$STATUS" = "200"
|
||||||
|
"""#
|
||||||
}
|
}
|
||||||
|
|
||||||
#Command: #"""
|
|
||||||
test "$(cat /content.json | jq -r .current_user_url)" = 'https://api.github.com/user'
|
|
||||||
test "$STATUS" = "200"
|
|
||||||
"""#
|
|
||||||
|
@ -24,7 +24,9 @@ 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" {
|
||||||
@ -86,7 +88,8 @@ setup() {
|
|||||||
@test "docker run: ports" {
|
@test "docker run: ports" {
|
||||||
dagger -e docker-run-ports up
|
dagger -e docker-run-ports up
|
||||||
CONTAINER=$(docker container ls -q --filter "name=daggerci-test-ports-*")
|
CONTAINER=$(docker container ls -q --filter "name=daggerci-test-ports-*")
|
||||||
until docker inspect --format "{{json .State.Status }}" "$CONTAINER" | grep -m 1 "running"; do sleep 1 ; done
|
SECONDS=0
|
||||||
|
while [[ "$(docker inspect --format '{{json .State.Status }}' todoapp | grep -m 1 'running')" != "running" && $SECONDS -lt 45 ]]; do sleep 1 ; done
|
||||||
run curl -f -LI http://localhost:8080
|
run curl -f -LI http://localhost:8080
|
||||||
assert_output --partial '200 OK'
|
assert_output --partial '200 OK'
|
||||||
docker stop "$CONTAINER" && docker rm "$CONTAINER"
|
docker stop "$CONTAINER" && docker rm "$CONTAINER"
|
||||||
|
Reference in New Issue
Block a user