Skip to content

Commit 574fcd2

Browse files
authored
Move local environment to docker compose managed services (#1384)
* Move local environment to docker compose managed services * PR feedback
1 parent 91ba80b commit 574fcd2

File tree

6 files changed

+313
-138
lines changed

6 files changed

+313
-138
lines changed

.buildkite/scripts/update-kibana-client.sh

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ make build
1212

1313
echo "--- Starting Stack containers"
1414
make docker-fleet
15-
docker ps
16-
sleep 30
1715

1816
echo "--- Collecting docker info"
1917
docker ps

.env

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
STACK_VERSION=9.1.5
2+
ELASTICSEARCH_CONTAINER_NAME=terraform-elasticstack-es
3+
ELASTICSEARCH_PASSWORD=password
4+
ELASTICSEARCH_PORT=9200
5+
ELASTICSEARCH_URL=http://localhost:${ELASTICSEARCH_PORT}
6+
ELASTICSEARCH_JAVA_OPTS="-Xms128m -Xmx2g"
7+
KIBANA_CONTAINER_NAME=terraform-elasticstack-kb
8+
KIBANA_SETTINGS_CONTAINER_NAME=terraform-elasticstack-kb-settings
9+
FLEET_SETTINGS_CONTAINER_NAME=terraform-elasticstack-fleet-settings
10+
KIBANA_CERTS_CONTAINER_NAME=terraform-elasticstack-kb-certs
11+
KIBANA_PORT=5601
12+
KIBANA_PASSWORD=password
13+
KIBANA_ENCRYPTION_KEY=GsRtLGKnnuvwVQ3lqSS5kGScdfpmgEDA
14+
FLEET_CONTAINER_NAME=terraform-elasticstack-fleet
15+
ACCEPTANCE_TESTS_CONTAINER_NAME=terraform-elasticstack-acceptance-tests
16+
TOKEN_ACCEPTANCE_TESTS_CONTAINER_NAME=terraform-elasticstack-token-acceptance-tests
17+
GOVERSION=1.25.1

Makefile

Lines changed: 20 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,22 @@ ACCTEST_COUNT = 1
1313
TEST ?= ./...
1414
SWAGGER_VERSION ?= 8.7
1515

16-
GOVERSION ?= $(shell grep -e '^go' go.mod | cut -f 2 -d ' ')
17-
18-
STACK_VERSION ?= 9.1.3
16+
USE_TLS ?= 0
17+
COMPOSE_FILE := docker-compose.yml
18+
ifeq ($(USE_TLS),1)
19+
COMPOSE_FILE := docker-compose.tls.yml
20+
endif
1921

20-
ELASTICSEARCH_NAME ?= terraform-elasticstack-es
21-
ELASTICSEARCH_ENDPOINTS ?= http://$(ELASTICSEARCH_NAME):9200
2222
ELASTICSEARCH_USERNAME ?= elastic
2323
ELASTICSEARCH_PASSWORD ?= password
24-
ELASTICSEARCH_NETWORK ?= elasticstack-network
25-
ELASTICSEARCH_MEM ?= 2048m
2624

27-
KIBANA_NAME ?= terraform-elasticstack-kb
28-
KIBANA_ENDPOINT ?= http://$(KIBANA_NAME):5601
2925
KIBANA_SYSTEM_USERNAME ?= kibana_system
3026
KIBANA_SYSTEM_PASSWORD ?= password
3127
KIBANA_API_KEY_NAME ?= kibana-api-key
3228

3329
FLEET_NAME ?= terraform-elasticstack-fleet
3430
FLEET_ENDPOINT ?= https://$(FLEET_NAME):8220
3531

36-
SOURCE_LOCATION ?= $(shell pwd)
37-
3832
export GOBIN = $(shell pwd)/bin
3933

4034

@@ -60,143 +54,32 @@ testacc: ## Run acceptance tests
6054
test: ## Run unit tests
6155
go test -v $(TEST) $(TESTARGS) -timeout=5m -parallel=4
6256

63-
# Retry command - first argument is how many attempts are required, second argument is the command to run
64-
# Backoff starts with 1 second and double with next iteration
65-
retry = until [ $$(if [ -z "$$attempt" ]; then echo -n "0"; else echo -n "$$attempt"; fi) -ge $(1) ]; do \
66-
backoff=$$(if [ -z "$$backoff" ]; then echo "1"; else echo "$$backoff"; fi); \
67-
sleep $$backoff; \
68-
$(2) && break; \
69-
attempt=$$((attempt + 1)); \
70-
backoff=$$((backoff * 2)); \
71-
done
72-
73-
# wait_until_healthy command - first argument is the container name
74-
wait_until_healthy = $(call retry, 5, [ "$$(docker inspect -f '{{ .State.Health.Status }}' $(1))" == "healthy" ])
75-
7657
CURL_OPTS = -sS --retry 5 --retry-all-errors -X POST -u $(ELASTICSEARCH_USERNAME):$(ELASTICSEARCH_PASSWORD) -H "Content-Type: application/json"
7758

7859
# To run specific test (e.g. TestAccResourceActionConnector) execute `make docker-testacc TESTARGS='-run ^TestAccResourceActionConnector$$'`
7960
# To enable tracing (or debugging), execute `make docker-testacc TF_LOG=TRACE`
8061
.PHONY: docker-testacc
81-
docker-testacc: docker-elasticsearch docker-kibana docker-fleet ## Run acceptance tests in the docker container
82-
@ docker run --rm \
83-
-e ELASTICSEARCH_ENDPOINTS="$(ELASTICSEARCH_ENDPOINTS)" \
84-
-e KIBANA_ENDPOINT="$(KIBANA_ENDPOINT)" \
85-
-e ELASTICSEARCH_USERNAME="$(ELASTICSEARCH_USERNAME)" \
86-
-e ELASTICSEARCH_PASSWORD="$(ELASTICSEARCH_PASSWORD)" \
87-
-e TF_LOG="$(TF_LOG)" \
88-
--network $(ELASTICSEARCH_NETWORK) \
89-
-w "/provider" \
90-
-v "$(SOURCE_LOCATION):/provider" \
91-
golang:$(GOVERSION) make testacc TESTARGS="$(TESTARGS)"
62+
docker-testacc: docker-fleet ## Run acceptance tests in the docker container
63+
@ docker compose -f $(COMPOSE_FILE) --profile acceptance-tests up --quiet-pull acceptance-tests
9264

9365
# To run specific test (e.g. TestAccResourceActionConnector) execute `make docker-testacc TESTARGS='-run ^TestAccResourceActionConnector$$'`
9466
# To enable tracing (or debugging), execute `make docker-testacc TF_LOG=TRACE`
9567
.PHONY: docker-testacc-with-token
96-
docker-testacc-with-token:
97-
@ docker run --rm \
98-
-e ELASTICSEARCH_ENDPOINTS="$(ELASTICSEARCH_ENDPOINTS)" \
99-
-e KIBANA_ENDPOINT="$(KIBANA_ENDPOINT)" \
100-
-e ELASTICSEARCH_BEARER_TOKEN="$(ELASTICSEARCH_BEARER_TOKEN)" \
101-
-e KIBANA_USERNAME="$(ELASTICSEARCH_USERNAME)" \
102-
-e KIBANA_PASSWORD="$(ELASTICSEARCH_PASSWORD)" \
103-
-e TF_LOG="$(TF_LOG)" \
104-
--network $(ELASTICSEARCH_NETWORK) \
105-
-w "/provider" \
106-
-v "$(SOURCE_LOCATION):/provider" \
107-
golang:$(GOVERSION) make testacc TESTARGS="$(TESTARGS)"
68+
docker-testacc-with-token: docker-fleet
69+
@ export ELASTICSEARCH_BEARER_TOKEN=$(shell $(MAKE) create-es-bearer-token | jq -r .access_token); \
70+
docker compose -f $(COMPOSE_FILE) --profile token-acceptance-tests up --quiet-pull token-acceptance-tests;
10871

10972
.PHONY: docker-elasticsearch
110-
docker-elasticsearch: docker-network ## Start Elasticsearch single node cluster in docker container
111-
@ docker rm -f $(ELASTICSEARCH_NAME) &> /dev/null || true
112-
@ docker run -d \
113-
--memory $(ELASTICSEARCH_MEM) \
114-
-p 9200:9200 -p 9300:9300 \
115-
-e "discovery.type=single-node" \
116-
-e "xpack.security.enabled=true" \
117-
-e "xpack.security.authc.api_key.enabled=true" \
118-
-e "xpack.security.authc.token.enabled=true" \
119-
-e "xpack.watcher.enabled=true" \
120-
-e "xpack.license.self_generated.type=trial" \
121-
-e "repositories.url.allowed_urls=https://example.com/*" \
122-
-e "path.repo=/tmp" \
123-
-e ELASTIC_PASSWORD=$(ELASTICSEARCH_PASSWORD) \
124-
--name $(ELASTICSEARCH_NAME) \
125-
--network $(ELASTICSEARCH_NETWORK) \
126-
--health-cmd="curl http://localhost:9200/_cluster/health" \
127-
--health-interval=10s --health-timeout=5s --health-retries=10 \
128-
docker.elastic.co/elasticsearch/elasticsearch:$(STACK_VERSION)
129-
@ $(call wait_until_healthy, $(ELASTICSEARCH_NAME))
73+
docker-elasticsearch: ## Start Elasticsearch single node cluster in docker container
74+
@ docker compose -f $(COMPOSE_FILE) up --quiet-pull -d elasticsearch
13075

13176
.PHONY: docker-kibana
132-
docker-kibana: docker-network docker-elasticsearch set-kibana-password ## Start Kibana node in docker container
133-
@ docker rm -f $(KIBANA_NAME) &> /dev/null || true
134-
@ docker run -d \
135-
-p 5601:5601 \
136-
-e SERVER_NAME=kibana \
137-
-e ELASTICSEARCH_HOSTS=$(ELASTICSEARCH_ENDPOINTS) \
138-
-e ELASTICSEARCH_USERNAME=$(KIBANA_SYSTEM_USERNAME) \
139-
-e ELASTICSEARCH_PASSWORD=$(KIBANA_SYSTEM_PASSWORD) \
140-
-e XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=a7a6311933d3503b89bc2dbc36572c33a6c10925682e591bffcab6911c06786d \
141-
-e LOGGING_ROOT_LEVEL=debug \
142-
--name $(KIBANA_NAME) \
143-
--network $(ELASTICSEARCH_NETWORK) \
144-
--health-cmd="curl http://localhost:5601/api/status" \
145-
--health-interval=10s --health-timeout=5s --health-retries=10 \
146-
docker.elastic.co/kibana/kibana:$(STACK_VERSION)
147-
@ $(call wait_until_healthy, $(KIBANA_NAME))
148-
149-
.PHONY: docker-kibana-with-tls
150-
docker-kibana-with-tls: docker-network docker-elasticsearch set-kibana-password
151-
@ docker rm -f $(KIBANA_NAME) &> /dev/null || true
152-
@ mkdir -p certs
153-
@ CAROOT=certs mkcert localhost $(KIBANA_NAME)
154-
@ mv localhost*.pem certs/
155-
@ docker run -d \
156-
-p 5601:5601 \
157-
-v $(shell pwd)/certs:/certs \
158-
-e SERVER_NAME=kibana \
159-
-e ELASTICSEARCH_HOSTS=$(ELASTICSEARCH_ENDPOINTS) \
160-
-e ELASTICSEARCH_USERNAME=$(KIBANA_SYSTEM_USERNAME) \
161-
-e ELASTICSEARCH_PASSWORD=$(KIBANA_SYSTEM_PASSWORD) \
162-
-e XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=a7a6311933d3503b89bc2dbc36572c33a6c10925682e591bffcab6911c06786d \
163-
-e SERVER_SSL_CERTIFICATE=/certs/localhost+1.pem \
164-
-e SERVER_SSL_KEY=/certs/localhost+1-key.pem \
165-
-e SERVER_SSL_ENABLED=true \
166-
-e LOGGING_ROOT_LEVEL=debug \
167-
--name $(KIBANA_NAME) \
168-
--network $(ELASTICSEARCH_NETWORK) \
169-
--health-cmd="curl -k https://localhost:5601/api/status" \
170-
--health-interval=10s --health-timeout=5s --health-retries=10 \
171-
docker.elastic.co/kibana/kibana:$(STACK_VERSION)
172-
@ $(call wait_until_healthy, $(KIBANA_NAME))
77+
docker-kibana: ## Start Kibana node in docker container
78+
@ docker compose -f $(COMPOSE_FILE) up --quiet-pull -d kibana
17379

17480
.PHONY: docker-fleet
175-
docker-fleet: docker-network docker-elasticsearch docker-kibana setup-kibana-fleet ## Start Fleet node in docker container
176-
@ docker rm -f $(FLEET_NAME) &> /dev/null || true
177-
@ docker run -d \
178-
-p 8220:8220 \
179-
-e SERVER_NAME=fleet \
180-
-e FLEET_ENROLL=1 \
181-
-e FLEET_URL=$(FLEET_ENDPOINT) \
182-
-e FLEET_INSECURE=true \
183-
-e FLEET_SERVER_ENABLE=1 \
184-
-e FLEET_SERVER_POLICY_ID=fleet-server \
185-
-e FLEET_SERVER_ELASTICSEARCH_HOST=$(ELASTICSEARCH_ENDPOINTS) \
186-
-e FLEET_SERVER_ELASTICSEARCH_INSECURE=true \
187-
-e FLEET_SERVER_INSECURE_HTTP=true \
188-
-e KIBANA_HOST=$(KIBANA_ENDPOINT) \
189-
-e KIBANA_FLEET_SETUP=1 \
190-
-e KIBANA_FLEET_USERNAME=$(ELASTICSEARCH_USERNAME) \
191-
-e KIBANA_FLEET_PASSWORD=$(ELASTICSEARCH_PASSWORD) \
192-
--name $(FLEET_NAME) \
193-
--network $(ELASTICSEARCH_NETWORK) \
194-
elastic/elastic-agent:$(STACK_VERSION)
195-
196-
197-
.PHONY: docker-network
198-
docker-network: ## Create a dedicated network for ES and test runs
199-
@ docker network inspect $(ELASTICSEARCH_NETWORK) >/dev/null 2>&1 || docker network create $(ELASTICSEARCH_NETWORK)
81+
docker-fleet: ## Start Fleet node in docker container
82+
@ docker compose -f $(COMPOSE_FILE) up --quiet-pull -d fleet
20083

20184
.PHONY: set-kibana-password
20285
set-kibana-password: ## Sets the ES KIBANA_SYSTEM_USERNAME's password to KIBANA_SYSTEM_PASSWORD. This expects Elasticsearch to be available at localhost:9200
@@ -218,9 +101,11 @@ setup-kibana-fleet: ## Creates the agent and integration policies required to ru
218101

219102
.PHONY: docker-clean
220103
docker-clean: ## Try to remove provisioned nodes and assigned network
221-
@ docker rm -f $(ELASTICSEARCH_NAME) $(KIBANA_NAME) $(FLEET_NAME) || true
222-
@ docker network rm $(ELASTICSEARCH_NETWORK) || true
104+
@ docker compose -f $(COMPOSE_FILE) down
223105

106+
.PHONY: copy-kibana-ca
107+
copy-kibana-ca: ## Copy Kibana CA certificate to local machine
108+
@ docker compose -f $(COMPOSE_FILE) cp kibana:/certs/rootCA.pem ./kibana-ca.pem
224109

225110
.PHONY: docs-generate
226111
docs-generate: tools ## Generate documentation for the provider

docker-compose.tls.yml

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
services:
2+
elasticsearch:
3+
extends:
4+
file: docker-compose.yml
5+
service: elasticsearch
6+
7+
kibana_settings:
8+
depends_on:
9+
elasticsearch:
10+
condition: service_healthy
11+
extends:
12+
file: docker-compose.yml
13+
service: kibana_settings
14+
15+
kibana_certs:
16+
image: alpine/mkcert:latest
17+
container_name: ${KIBANA_CERTS_CONTAINER_NAME}
18+
restart: 'no'
19+
volumes:
20+
- kibana-certs:/certs
21+
environment:
22+
CAROOT: /certs
23+
entrypoint: ash
24+
command: >
25+
-c '
26+
mkcert --cert-file=/certs/kibana.crt --key-file=/certs/kibana.key kibana ${KIBANA_CONTAINER_NAME} localhost;
27+
chown 1000:1000 /certs/*;
28+
'
29+
30+
kibana:
31+
depends_on:
32+
kibana_settings:
33+
condition: service_completed_successfully
34+
kibana_certs:
35+
condition: service_completed_successfully
36+
extends:
37+
file: docker-compose.yml
38+
service: kibana
39+
volumes:
40+
- dev-kibana:/usr/share/kibana/data
41+
- kibana-certs:/certs:ro
42+
environment:
43+
SERVER_SSL_CERTIFICATE: /certs/kibana.crt
44+
SERVER_SSL_KEY: /certs/kibana.key
45+
SERVER_SSL_ENABLED: true
46+
healthcheck:
47+
test:
48+
[
49+
"CMD-SHELL",
50+
"curl -s --cacert /certs/rootCA.pem -w \"%{http_code}\" https://kibana:5601 | grep -q '302'",
51+
]
52+
interval: 10s
53+
timeout: 10s
54+
retries: 30
55+
56+
fleet_settings:
57+
depends_on:
58+
kibana:
59+
condition: service_healthy
60+
extends:
61+
file: docker-compose.yml
62+
service: fleet_settings
63+
volumes:
64+
- kibana-certs:/certs:ro
65+
environment:
66+
CACERT: --cacert /certs/rootCA.pem
67+
KIBANA_HOST: https://kibana:5601
68+
69+
fleet:
70+
depends_on:
71+
kibana:
72+
condition: service_healthy
73+
extends:
74+
file: docker-compose.yml
75+
service: fleet
76+
volumes:
77+
- dev-fleet:/usr/share/elastic-agent/data
78+
- kibana-certs:/certs:ro
79+
environment:
80+
KIBANA_HOST: https://kibana:5601
81+
KIBANA_CA: /certs/rootCA.pem
82+
83+
acceptance-tests:
84+
profiles: ["acceptance-tests"]
85+
depends_on:
86+
fleet:
87+
condition: service_started
88+
extends:
89+
file: docker-compose.yml
90+
service: acceptance-tests
91+
volumes:
92+
- ./:/provider
93+
- kibana-certs:/certs:ro
94+
environment:
95+
KIBANA_ENDPOINT: https://kibana:5601
96+
KIBANA_CA_CERTS: /certs/rootCA.pem
97+
98+
token-acceptance-tests:
99+
profiles: ["token-acceptance-tests"]
100+
depends_on:
101+
fleet:
102+
condition: service_started
103+
extends:
104+
service: acceptance-tests
105+
volumes:
106+
- ./:/provider
107+
- kibana-certs:/certs:ro
108+
environment:
109+
ELASTICSEARCH_BEARER_TOKEN: ${ELASTICSEARCH_BEARER_TOKEN:-}
110+
KIBANA_USERNAME: elastic
111+
KIBANA_PASSWORD: ${ELASTICSEARCH_PASSWORD}
112+
113+
volumes:
114+
dev-elasticsearch:
115+
dev-kibana:
116+
dev-fleet:
117+
kibana-certs:

0 commit comments

Comments
 (0)