Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add .ci directory to run tests on CI #30

Merged
merged 9 commits into from Dec 4, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 9 additions & 0 deletions .ci/DockerFile
@@ -0,0 +1,9 @@
ARG RUST_VERSION=nightly
FROM rustlang/rust:${RUST_VERSION}

# create app directory
WORKDIR /usr/src/elasticsearch-rs

# install app dependencies
COPY ./elasticsearch .
RUN cargo build --tests
20 changes: 20 additions & 0 deletions .ci/certs/ca.crt
@@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDSTCCAjGgAwIBAgIUIwN+0zglsexRKwE1RGHvlCcmrdwwDQYJKoZIhvcNAQEL
BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
cmF0ZWQgQ0EwHhcNMTkwMjEzMDcyMjQwWhcNMjIwMjEyMDcyMjQwWjA0MTIwMAYD
VQQDEylFbGFzdGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANILs0JO0e7x29zeVx21qalK
XKdX+AMlGJPH75wWO/Jq6YHtxt1wYIg762krOBXfG6JsFSOIwIv5VrzGGRGjSPt9
OXQyXrDDiQvsBT3rpzLNdDs7KMl2tZswwv7w9ujgud0cYnS1MOpn81rfPc73DvMg
xuhplofDx6fn3++PjVRU2FNiIVWyEoaxRjCeGPMBubKZYaYbQA6vYM4Z+ByG727B
AyAER3t7xmvYti/EoO2hv2HQk5zgcj/Oq3AJKhnt8LH8fnfm3TnYNM1htvXqhN05
vsvhvm2PHfnA5qLlSr/3W0aI/U/PqfsFDCgyRV097sMIaKkmavb0Ue7aQ7lgtp0C
AwEAAaNTMFEwHQYDVR0OBBYEFDRKlCMowWR1rwxE0d1lTEQe5O71MB8GA1UdIwQY
MBaAFDRKlCMowWR1rwxE0d1lTEQe5O71MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
hvcNAQELBQADggEBAKbCJ95EBpeuvF70KEt6QU70k/SH1NRvM9YzKryV0D975Jvu
HOSm9HgSTULeAUFZIa4oYyf3QUfVoI+2T/aQrfXA3gfrJWsHURkyNmiHOFAbYHqi
xA6i249G2GTEjc1+le/M2N2CcDKAmurW6vSGK4upXQbPd6KmnhHREX74zkWjnOa+
+tibbSSOCT4Tmja2DbBxAPuivU9IB1g/hIUmbYQqKffQrBJA0658tz6w63a/Q7xN
pCvvbSgiMZ6qcVIcJkBT2IooYie+ax45pQECHthgIUcQAzfmIfqlU0Qfl8rDgAmn
0c1o6HQjKGU2aVGgSRuaaiHaSZjbPIZVS51sOoI=
-----END CERTIFICATE-----
20 changes: 20 additions & 0 deletions .ci/certs/ca.pem
@@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDSTCCAjGgAwIBAgIUIwN+0zglsexRKwE1RGHvlCcmrdwwDQYJKoZIhvcNAQEL
BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
cmF0ZWQgQ0EwHhcNMTkwMjEzMDcyMjQwWhcNMjIwMjEyMDcyMjQwWjA0MTIwMAYD
VQQDEylFbGFzdGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANILs0JO0e7x29zeVx21qalK
XKdX+AMlGJPH75wWO/Jq6YHtxt1wYIg762krOBXfG6JsFSOIwIv5VrzGGRGjSPt9
OXQyXrDDiQvsBT3rpzLNdDs7KMl2tZswwv7w9ujgud0cYnS1MOpn81rfPc73DvMg
xuhplofDx6fn3++PjVRU2FNiIVWyEoaxRjCeGPMBubKZYaYbQA6vYM4Z+ByG727B
AyAER3t7xmvYti/EoO2hv2HQk5zgcj/Oq3AJKhnt8LH8fnfm3TnYNM1htvXqhN05
vsvhvm2PHfnA5qLlSr/3W0aI/U/PqfsFDCgyRV097sMIaKkmavb0Ue7aQ7lgtp0C
AwEAAaNTMFEwHQYDVR0OBBYEFDRKlCMowWR1rwxE0d1lTEQe5O71MB8GA1UdIwQY
MBaAFDRKlCMowWR1rwxE0d1lTEQe5O71MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
hvcNAQELBQADggEBAKbCJ95EBpeuvF70KEt6QU70k/SH1NRvM9YzKryV0D975Jvu
HOSm9HgSTULeAUFZIa4oYyf3QUfVoI+2T/aQrfXA3gfrJWsHURkyNmiHOFAbYHqi
xA6i249G2GTEjc1+le/M2N2CcDKAmurW6vSGK4upXQbPd6KmnhHREX74zkWjnOa+
+tibbSSOCT4Tmja2DbBxAPuivU9IB1g/hIUmbYQqKffQrBJA0658tz6w63a/Q7xN
pCvvbSgiMZ6qcVIcJkBT2IooYie+ax45pQECHthgIUcQAzfmIfqlU0Qfl8rDgAmn
0c1o6HQjKGU2aVGgSRuaaiHaSZjbPIZVS51sOoI=
-----END CERTIFICATE-----
19 changes: 19 additions & 0 deletions .ci/certs/testnode.crt
@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDIjCCAgqgAwIBAgIUI4QU6jA1dYSCbdIA6oAb2TBEluowDQYJKoZIhvcNAQEL
BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
cmF0ZWQgQ0EwHhcNMTkwMjEzMDcyMzEzWhcNMjIwMjEyMDcyMzEzWjATMREwDwYD
VQQDEwhpbnN0YW5jZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJeT
yOy6EAScZxrULKjHePciiz38grivCrhFFV+dThaRCcl3DhDzb9Eny5q5iEw3WvLQ
Rqmf01jncNIhaocTt66VqveXaMubbE8O0LcG6e4kpFO+JtnVF8JTARTc+ux/1uD6
hO1VG/HItM7WQrQxh4hfB2u1AX2YQtoqEtXXEC+UHWfl4QzuzXjBnKCkO/L9/6Tf
yNFQWXxKnIiTs8Xm9sEhhSCBJPlLTQu+MX4vR2Uwj5XZmflDUr+ZTenl9qYxL6b3
SWhh/qEl4GAj1+tS7ZZOxE0237mUh3IIFYSWSaMm8K2m/BYHkLNWL5B1dMic0lsv
osSoYrQuCef4HQMCitsCAwEAAaNNMEswHQYDVR0OBBYEFFMg4l1GLW8lYbwASY+r
YeWYRzIiMB8GA1UdIwQYMBaAFDRKlCMowWR1rwxE0d1lTEQe5O71MAkGA1UdEwQC
MAAwDQYJKoZIhvcNAQELBQADggEBAEQrgh1xALpumQTzsjxFRGque/vlKTgRs5Kh
xtgapr6wjIbdq7dagee+4yNOKzS5lGVXCgwrJlHESv9qY0uumT/33vK2uduJ7NAd
fR2ZzyBnhMX+mkYhmGrGYCTUMUIwOIQYa4Evis4W+LHmCIDG03l7gLHfdIBe9VMO
pDZum8f6ng0MM49s8/rXODNYKw8kFyUhnfChqMi/2yggb1uUIfKlJJIchkgYjE13
zuC+fjo029Pq1jeMIdxugLf/7I/8NiW1Yj9aCXevUXG1qzHFEuKAinBXYOZO/vWS
LaEqOhwrzNynwgGpYAr7Rfgv4AflltYIIav4PZT03P7fbyAAf8s=
-----END CERTIFICATE-----
27 changes: 27 additions & 0 deletions .ci/certs/testnode.key
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAl5PI7LoQBJxnGtQsqMd49yKLPfyCuK8KuEUVX51OFpEJyXcO
EPNv0SfLmrmITDda8tBGqZ/TWOdw0iFqhxO3rpWq95doy5tsTw7Qtwbp7iSkU74m
2dUXwlMBFNz67H/W4PqE7VUb8ci0ztZCtDGHiF8Ha7UBfZhC2ioS1dcQL5QdZ+Xh
DO7NeMGcoKQ78v3/pN/I0VBZfEqciJOzxeb2wSGFIIEk+UtNC74xfi9HZTCPldmZ
+UNSv5lN6eX2pjEvpvdJaGH+oSXgYCPX61Ltlk7ETTbfuZSHcggVhJZJoybwrab8
FgeQs1YvkHV0yJzSWy+ixKhitC4J5/gdAwKK2wIDAQABAoIBAQCRFTJna/xy/WUu
59FLR4qAOj8++JgCwACpue4oU7/vl6nffSYokWoAr2+RzG4qTX2vFi3cpA8+dGCn
sLZvTi8tWzKGxBTZdg2oakzaMzLr74SeZ052iCGyrZJGbvF6Ny7srr1XEXSq6+os
ZCb6pMHOhO7saBdiKMAsY8MdjTl/33AduuE6ztqv+L92xTr2g4QlbT1KvWlEgppU
k4Gy7zdETkPBTSH/17ZwyGJoJICIAhbL4IpmOM4dPIg8nFkVPPpy6p0z4uGjtgnK
nreZ2EKMzCafBaHn7A77gpi0OrQdl6pe0fsGqv/323YjCJPbwwl5TsoNq44DzwiX
3M7XiVJxAoGBAOCne56vdN4uZmCgLVGT2JSUNVPOu4bfjrxWH6cslzrPT2Zhp3lO
M4axZ3gmcervV252YEZXntXDHHCSfrECllRN1WFD63XmyQ/CkhuvZkkeRHfzL1TE
EdqHOTqs4sRETZ7+RITFC81DZQkWWOKeyXMjyPBqd7RnThQHijB1c8Y5AoGBAKy6
CVKBx+zz5crVD0tz4UhOmz1wRNN0CL0l+FXRuFSgbzMIvwpfiqe25crgeLHe2M2/
TogdWbjZ2nUZQTzoRsSkQ6cKHpj+G/gWurp/UcHHXFVwgLSPF7c3KHDtiYq7Vqw0
bvmhM03LI6+ZIPRV7hLBr7WP7UmpAiREMF7tTnmzAoGBAIkx3w3WywFQxtblmyeB
qbd7F2IaE23XoxyjX+tBEQ4qQqwcoSE0v8TXHIBEwjceeX+NLVhn9ClJYVniLRq+
oL3VVqVyzB4RleJZCc98e3PV1yyFx/b1Uo3pHOsXX9lKeTjKwV9v0rhFGzPEgP3M
yOvXA8TG0FnM6OLUg/D6GX0JAoGAMuHS4TVOGeV3ahr9mHKYiN5vKNgrzka+VEod
L9rJ/FQOrfADpyCiDen5I5ygsXU+VM3oanyK88NpcVlxOGoMft0M+OYoQVWKE7lO
ZKYhBX6fGqQ7pfUJPXXIOgwfmni5fZ0sm+j63g3bg10OsiumKGxaQJgXhL1+3gQg
Y7ZwibUCgYEAlZoFFvkMLjpOSaHk1z5ZZnt19X0QUIultBwkumSqMPm+Ks7+uDrx
thGUCoz4ecr/ci4bIUY7mB+zfAbqnBOMxreJqCRbAIuRypo1IlWkTp8DywoDOfMW
NfzjVmzJ7EJu44nGmVAi1jw4Pbseivvi1ujMCoPgaE8I1uSh144bwN8=
-----END RSA PRIVATE KEY-----
252 changes: 252 additions & 0 deletions .ci/run-elasticsearch.ps1
@@ -0,0 +1,252 @@
# Launch one or more Elasticsearch nodes via the Docker image,
# to form a cluster suitable for running the REST API tests.
#
# Export the ELASTICSEARCH_VERSION variable, eg. 'elasticsearch:8.0.0-SNAPSHOT'.

param(
[string]
$NODE_NAME,

[string]
$MASTER_NODE_NAME,

[string]
$CLUSTER_NAME,

[int]
$HTTP_PORT = 9200,

[string]
$ELASTIC_PASSWORD = "changeme",

[string]
$SSL_CERT = "$PWD/certs/testnode.crt",

[string]
$SSL_KEY = "$PWD/certs/testnode.key",

[string]
$SSL_CA = "$PWD/certs/ca.crt",

[switch]
$DETACH,

[switch]
$CLEANUP,

[string]
$NETWORK_NAME

)

trap {
cleanup
}

$ESC = [char]27

if ($null -eq $env:ELASTICSEARCH_VERSION) {
Write-Error "ERROR: Required environment variable [ELASTICSEARCH_VERSION] not set"
exit 1
}

$moniker = $env:ELASTICSEARCH_VERSION -replace "[^a-zA-Z\d]", "-"
$suffix = "rest-test"

if (!$NODE_NAME) {
$NODE_NAME = "${moniker}node1"
}

if (!$MASTER_NODE_NAME) {
$MASTER_NODE_NAME = $NODE_NAME
}

if (!$CLUSTER_NAME) {
$CLUSTER_NAME = "${moniker}${suffix}"
}

$volume_name = "${NODE_NAME}-${suffix}-data"

if (!$NETWORK_NAME) {
$NETWORK_NAME= "${moniker}${suffix}"
}


function cleanup_volume {
param(
[string]
$Name
)

if ("$(docker volume ls --quiet --filter name="$Name")") {
Write-Output "$ESC[34;1mINFO:$ESC[0m Removing volume $Name$ESC[0m"
docker volume rm "$Name"
}
}
function cleanup_node {
param(
[string]
$Name
)

if ("$(docker ps --quiet --filter name="$Name")") {
Write-Output "$ESC[34;1mINFO:$ESC[0m Removing container $Name$ESC[0m"
docker container rm --force --volumes "$Name"
cleanup_volume "$Name-${suffix}-data"
}
}
function cleanup_network {
param(
[string]
$Name
)

if ("$(docker network ls --quiet --filter name="$Name")") {
Write-Output "$ESC[34;1mINFO:$ESC[0m Removing network ${Name}$ESC[0m"
docker network rm "$Name"
}
}

function cleanup {
param(
[switch]
$Cleanup
)

if ((-not $DETACH) -or $Cleanup) {
Write-Output "$ESC[34;1mINFO:$ESC[0m clean the node and volume on startup (1) OR on exit if not detached$ESC[0m"
cleanup_node "$NODE_NAME"
}
if (-not $DETACH) {
Write-Output "$ESC[34;1mINFO:$ESC[0m clean the network if not detached (start and exit)$ESC[0m"
cleanup_network "$NETWORK_NAME"
}
}

if ($CLEANUP) {
#trap - EXIT
if ("$(docker network ls --quiet --filter name=${NETWORK_NAME})" -eq "") {
Write-Output "$ESC[34;1mINFO:$ESC[0m $NETWORK_NAME is already deleted$ESC[0m"
exit 0
}
$containers = $(docker network inspect --format '{{ range $key, $value := .Containers }}{{ printf "%s\n" .Name}}{{ end }}' ${NETWORK_NAME})

foreach($container in $containers) {
cleanup_node "$container"
}

cleanup_network "$NETWORK_NAME"
Write-Output "$ESC[32;1mSUCCESS:$ESC[0m Cleaned up and exiting$ESC[0m"
exit 0
}

Write-Output "$ESC[34;1mINFO:$ESC[0m Making sure previous run leftover infrastructure is removed$ESC[0m"
cleanup -Cleanup

Write-Output "$ESC[34;1mINFO:$ESC[0m Creating network $NETWORK_NAME if it does not exist already$ESC[0m"

docker network inspect "$NETWORK_NAME" | Out-Null
if ($LASTEXITCODE -ne 0) {
docker network create "$NETWORK_NAME"
}

$environment = @(
"--env", "node.name=`"$NODE_NAME`"",
"--env", "cluster.name=`"$CLUSTER_NAME`"",
"--env", "cluster.initial_master_nodes=`"$MASTER_NODE_NAME`"",
"--env", "discovery.seed_hosts=`"$MASTER_NODE_NAME`"",
"--env", "cluster.routing.allocation.disk.threshold_enabled=false",
"--env", "bootstrap.memory_lock=true",
"--env", "node.attr.testattr=test",
"--env", "path.repo=/tmp",
"--env", "repositories.url.allowed_urls=http://snapshot.test*"
)

$volumes = @(
"--volume", "${volume_name}:/usr/share/elasticsearch/data"
)

if (-not $env:ELASTICSEARCH_VERSION -contains "oss") {
$environment += @(
"--env", "ELASTIC_PASSWORD=`"$ELASTIC_PASSWORD`"",
"--env", "xpack.license.self_generated.type=trial",
"--env", "xpack.security.enabled=true",
"--env", "xpack.security.http.ssl.enabled=true",
"--env", "xpack.security.http.ssl.verification_mode=certificate",
"--env", "xpack.security.http.ssl.key=certs/testnode.key",
"--env", "xpack.security.http.ssl.certificate=certs/testnode.crt",
"--env", "xpack.security.http.ssl.certificate_authorities=certs/ca.crt",
"--env", "xpack.security.transport.ssl.enabled=true",
"--env", "xpack.security.transport.ssl.key=certs/testnode.key",
"--env", "xpack.security.transport.ssl.certificate=certs/testnode.crt",
"--env", "xpack.security.transport.ssl.certificate_authorities=certs/ca.crt"
)

$volumes += @(
"--volume", "`"${SSL_CERT}`":/usr/share/elasticsearch/config/certs/testnode.crt",
"--volume", "`"${SSL_KEY}`":/usr/share/elasticsearch/config/certs/testnode.key",
"--volume", "`"${SSL_CA}`":/usr/share/elasticsearch/config/certs/ca.crt"
)
}

$url="http://$NODE_NAME"
if (-not $env:ELASTICSEARCH_VERSION -contains "oss") {
$url="https://elastic:$ELASTIC_PASSWORD@$NODE_NAME"
}

Write-Output "$ESC[34;1mINFO:$ESC[0m Starting container $NODE_NAME $ESC[0m"

if ($DETACH) {
$d = "true"
} else {
$d = "false"
}

docker run `
--name "`"$NODE_NAME`"" `
--network "`"$NETWORK_NAME`"" `
--env ES_JAVA_OPTS=-"`"Xms1g -Xmx1g`"" `
$environment `
$volumes `
--publish ${HTTP_PORT}:9200 `
--ulimit nofile=65536:65536 `
--ulimit memlock=-1:-1 `
--detach="$d" `
--health-cmd="`"curl --silent --fail ${url}:9200/_cluster/health || exit 1`"" `
--health-interval=2s `
--health-retries=20 `
--health-timeout=2s `
--rm docker.elastic.co/elasticsearch/"$($env:ELASTICSEARCH_VERSION)"


if ($DETACH) {
while("$(docker inspect -f '{{.State.Health.Status}}' ${NODE_NAME})" -eq "starting") {
Start-Sleep 2;
Write-Output ""
Write-Output "$ESC[34;1mINFO:$ESC[0m waiting for node $NODE_NAME to be up$ESC[0m"
}

# Always show the node getting started logs, this is very useful both on CI as well as while developing
docker logs "$NODE_NAME"

if ("$(docker inspect -f '{{.State.Health.Status}}' ${NODE_NAME})" -ne "healthy") {
cleanup -Cleanup
Write-Output ""
Write-Output "$ESC[31;1mERROR:$ESC[0m Failed to start $($env:ELASTICSEARCH_VERSION) in detached mode beyond health checks$ESC[0m"
Write-Output "$ESC[31;1mERROR:$ESC[0m dumped the docker log before shutting the node down$ESC[0m"
exit 1
} else {
Write-Output ""
Write-Output "$ESC[32;1mSUCCESS:$ESC[0m Detached and healthy: ${NODE_NAME} on docker network: ${NETWORK_NAME}$ESC[0m"
$es_host = $url
if (!$es_host) {
$es_host = $NODE_NAME
}
if (!$es_host) {
$es_host = "localhost"
}

Write-Output "$ESC[32;1mSUCCESS:$ESC[0m Running on: ${es_host}:${HTTP_PORT}$ESC[0m"
exit 0
}
}