Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .buildkite/scripts/update-kibana-client.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ make build

echo "--- Starting Stack containers"
make docker-fleet
docker ps
sleep 30

echo "--- Collecting docker info"
docker ps
Expand Down
17 changes: 17 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
STACK_VERSION=9.1.5
ELASTICSEARCH_CONTAINER_NAME=terraform-elasticstack-es
ELASTICSEARCH_PASSWORD=password
ELASTICSEARCH_PORT=9200
ELASTICSEARCH_URL=http://localhost:${ELASTICSEARCH_PORT}
ELASTICSEARCH_JAVA_OPTS="-Xms128m -Xmx2g"
KIBANA_CONTAINER_NAME=terraform-elasticstack-kb
KIBANA_SETTINGS_CONTAINER_NAME=terraform-elasticstack-kb-settings
FLEET_SETTINGS_CONTAINER_NAME=terraform-elasticstack-fleet-settings
KIBANA_CERTS_CONTAINER_NAME=terraform-elasticstack-kb-certs
KIBANA_PORT=5601
KIBANA_PASSWORD=password
KIBANA_ENCRYPTION_KEY=GsRtLGKnnuvwVQ3lqSS5kGScdfpmgEDA
FLEET_CONTAINER_NAME=terraform-elasticstack-fleet
ACCEPTANCE_TESTS_CONTAINER_NAME=terraform-elasticstack-acceptance-tests
TOKEN_ACCEPTANCE_TESTS_CONTAINER_NAME=terraform-elasticstack-token-acceptance-tests
GOVERSION=1.25.1
155 changes: 20 additions & 135 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,22 @@ ACCTEST_COUNT = 1
TEST ?= ./...
SWAGGER_VERSION ?= 8.7

GOVERSION ?= $(shell grep -e '^go' go.mod | cut -f 2 -d ' ')

STACK_VERSION ?= 9.1.3
USE_TLS ?= 0
COMPOSE_FILE := docker-compose.yml
ifeq ($(USE_TLS),1)
COMPOSE_FILE := docker-compose.tls.yml
endif

ELASTICSEARCH_NAME ?= terraform-elasticstack-es
ELASTICSEARCH_ENDPOINTS ?= http://$(ELASTICSEARCH_NAME):9200
ELASTICSEARCH_USERNAME ?= elastic
ELASTICSEARCH_PASSWORD ?= password
ELASTICSEARCH_NETWORK ?= elasticstack-network
ELASTICSEARCH_MEM ?= 2048m

KIBANA_NAME ?= terraform-elasticstack-kb
KIBANA_ENDPOINT ?= http://$(KIBANA_NAME):5601
KIBANA_SYSTEM_USERNAME ?= kibana_system
KIBANA_SYSTEM_PASSWORD ?= password
KIBANA_API_KEY_NAME ?= kibana-api-key

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

SOURCE_LOCATION ?= $(shell pwd)

export GOBIN = $(shell pwd)/bin


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

# Retry command - first argument is how many attempts are required, second argument is the command to run
# Backoff starts with 1 second and double with next iteration
retry = until [ $$(if [ -z "$$attempt" ]; then echo -n "0"; else echo -n "$$attempt"; fi) -ge $(1) ]; do \
backoff=$$(if [ -z "$$backoff" ]; then echo "1"; else echo "$$backoff"; fi); \
sleep $$backoff; \
$(2) && break; \
attempt=$$((attempt + 1)); \
backoff=$$((backoff * 2)); \
done

# wait_until_healthy command - first argument is the container name
wait_until_healthy = $(call retry, 5, [ "$$(docker inspect -f '{{ .State.Health.Status }}' $(1))" == "healthy" ])

CURL_OPTS = -sS --retry 5 --retry-all-errors -X POST -u $(ELASTICSEARCH_USERNAME):$(ELASTICSEARCH_PASSWORD) -H "Content-Type: application/json"

# To run specific test (e.g. TestAccResourceActionConnector) execute `make docker-testacc TESTARGS='-run ^TestAccResourceActionConnector$$'`
# To enable tracing (or debugging), execute `make docker-testacc TF_LOG=TRACE`
.PHONY: docker-testacc
docker-testacc: docker-elasticsearch docker-kibana docker-fleet ## Run acceptance tests in the docker container
@ docker run --rm \
-e ELASTICSEARCH_ENDPOINTS="$(ELASTICSEARCH_ENDPOINTS)" \
-e KIBANA_ENDPOINT="$(KIBANA_ENDPOINT)" \
-e ELASTICSEARCH_USERNAME="$(ELASTICSEARCH_USERNAME)" \
-e ELASTICSEARCH_PASSWORD="$(ELASTICSEARCH_PASSWORD)" \
-e TF_LOG="$(TF_LOG)" \
--network $(ELASTICSEARCH_NETWORK) \
-w "/provider" \
-v "$(SOURCE_LOCATION):/provider" \
golang:$(GOVERSION) make testacc TESTARGS="$(TESTARGS)"
docker-testacc: docker-fleet ## Run acceptance tests in the docker container
@ docker compose -f $(COMPOSE_FILE) --profile acceptance-tests up --quiet-pull acceptance-tests

# To run specific test (e.g. TestAccResourceActionConnector) execute `make docker-testacc TESTARGS='-run ^TestAccResourceActionConnector$$'`
# To enable tracing (or debugging), execute `make docker-testacc TF_LOG=TRACE`
.PHONY: docker-testacc-with-token
docker-testacc-with-token:
@ docker run --rm \
-e ELASTICSEARCH_ENDPOINTS="$(ELASTICSEARCH_ENDPOINTS)" \
-e KIBANA_ENDPOINT="$(KIBANA_ENDPOINT)" \
-e ELASTICSEARCH_BEARER_TOKEN="$(ELASTICSEARCH_BEARER_TOKEN)" \
-e KIBANA_USERNAME="$(ELASTICSEARCH_USERNAME)" \
-e KIBANA_PASSWORD="$(ELASTICSEARCH_PASSWORD)" \
-e TF_LOG="$(TF_LOG)" \
--network $(ELASTICSEARCH_NETWORK) \
-w "/provider" \
-v "$(SOURCE_LOCATION):/provider" \
golang:$(GOVERSION) make testacc TESTARGS="$(TESTARGS)"
docker-testacc-with-token: docker-fleet
@ export ELASTICSEARCH_BEARER_TOKEN=$(shell $(MAKE) create-es-bearer-token | jq -r .access_token); \
docker compose -f $(COMPOSE_FILE) --profile token-acceptance-tests up --quiet-pull token-acceptance-tests;

.PHONY: docker-elasticsearch
docker-elasticsearch: docker-network ## Start Elasticsearch single node cluster in docker container
@ docker rm -f $(ELASTICSEARCH_NAME) &> /dev/null || true
@ docker run -d \
--memory $(ELASTICSEARCH_MEM) \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=true" \
-e "xpack.security.authc.api_key.enabled=true" \
-e "xpack.security.authc.token.enabled=true" \
-e "xpack.watcher.enabled=true" \
-e "xpack.license.self_generated.type=trial" \
-e "repositories.url.allowed_urls=https://example.com/*" \
-e "path.repo=/tmp" \
-e ELASTIC_PASSWORD=$(ELASTICSEARCH_PASSWORD) \
--name $(ELASTICSEARCH_NAME) \
--network $(ELASTICSEARCH_NETWORK) \
--health-cmd="curl http://localhost:9200/_cluster/health" \
--health-interval=10s --health-timeout=5s --health-retries=10 \
docker.elastic.co/elasticsearch/elasticsearch:$(STACK_VERSION)
@ $(call wait_until_healthy, $(ELASTICSEARCH_NAME))
docker-elasticsearch: ## Start Elasticsearch single node cluster in docker container
@ docker compose -f $(COMPOSE_FILE) up --quiet-pull -d elasticsearch

.PHONY: docker-kibana
docker-kibana: docker-network docker-elasticsearch set-kibana-password ## Start Kibana node in docker container
@ docker rm -f $(KIBANA_NAME) &> /dev/null || true
@ docker run -d \
-p 5601:5601 \
-e SERVER_NAME=kibana \
-e ELASTICSEARCH_HOSTS=$(ELASTICSEARCH_ENDPOINTS) \
-e ELASTICSEARCH_USERNAME=$(KIBANA_SYSTEM_USERNAME) \
-e ELASTICSEARCH_PASSWORD=$(KIBANA_SYSTEM_PASSWORD) \
-e XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=a7a6311933d3503b89bc2dbc36572c33a6c10925682e591bffcab6911c06786d \
-e LOGGING_ROOT_LEVEL=debug \
--name $(KIBANA_NAME) \
--network $(ELASTICSEARCH_NETWORK) \
--health-cmd="curl http://localhost:5601/api/status" \
--health-interval=10s --health-timeout=5s --health-retries=10 \
docker.elastic.co/kibana/kibana:$(STACK_VERSION)
@ $(call wait_until_healthy, $(KIBANA_NAME))

.PHONY: docker-kibana-with-tls
docker-kibana-with-tls: docker-network docker-elasticsearch set-kibana-password
@ docker rm -f $(KIBANA_NAME) &> /dev/null || true
@ mkdir -p certs
@ CAROOT=certs mkcert localhost $(KIBANA_NAME)
@ mv localhost*.pem certs/
@ docker run -d \
-p 5601:5601 \
-v $(shell pwd)/certs:/certs \
-e SERVER_NAME=kibana \
-e ELASTICSEARCH_HOSTS=$(ELASTICSEARCH_ENDPOINTS) \
-e ELASTICSEARCH_USERNAME=$(KIBANA_SYSTEM_USERNAME) \
-e ELASTICSEARCH_PASSWORD=$(KIBANA_SYSTEM_PASSWORD) \
-e XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=a7a6311933d3503b89bc2dbc36572c33a6c10925682e591bffcab6911c06786d \
-e SERVER_SSL_CERTIFICATE=/certs/localhost+1.pem \
-e SERVER_SSL_KEY=/certs/localhost+1-key.pem \
-e SERVER_SSL_ENABLED=true \
-e LOGGING_ROOT_LEVEL=debug \
--name $(KIBANA_NAME) \
--network $(ELASTICSEARCH_NETWORK) \
--health-cmd="curl -k https://localhost:5601/api/status" \
--health-interval=10s --health-timeout=5s --health-retries=10 \
docker.elastic.co/kibana/kibana:$(STACK_VERSION)
@ $(call wait_until_healthy, $(KIBANA_NAME))
docker-kibana: ## Start Kibana node in docker container
@ docker compose -f $(COMPOSE_FILE) up --quiet-pull -d kibana

.PHONY: docker-fleet
docker-fleet: docker-network docker-elasticsearch docker-kibana setup-kibana-fleet ## Start Fleet node in docker container
@ docker rm -f $(FLEET_NAME) &> /dev/null || true
@ docker run -d \
-p 8220:8220 \
-e SERVER_NAME=fleet \
-e FLEET_ENROLL=1 \
-e FLEET_URL=$(FLEET_ENDPOINT) \
-e FLEET_INSECURE=true \
-e FLEET_SERVER_ENABLE=1 \
-e FLEET_SERVER_POLICY_ID=fleet-server \
-e FLEET_SERVER_ELASTICSEARCH_HOST=$(ELASTICSEARCH_ENDPOINTS) \
-e FLEET_SERVER_ELASTICSEARCH_INSECURE=true \
-e FLEET_SERVER_INSECURE_HTTP=true \
-e KIBANA_HOST=$(KIBANA_ENDPOINT) \
-e KIBANA_FLEET_SETUP=1 \
-e KIBANA_FLEET_USERNAME=$(ELASTICSEARCH_USERNAME) \
-e KIBANA_FLEET_PASSWORD=$(ELASTICSEARCH_PASSWORD) \
--name $(FLEET_NAME) \
--network $(ELASTICSEARCH_NETWORK) \
elastic/elastic-agent:$(STACK_VERSION)


.PHONY: docker-network
docker-network: ## Create a dedicated network for ES and test runs
@ docker network inspect $(ELASTICSEARCH_NETWORK) >/dev/null 2>&1 || docker network create $(ELASTICSEARCH_NETWORK)
docker-fleet: ## Start Fleet node in docker container
@ docker compose -f $(COMPOSE_FILE) up --quiet-pull -d fleet

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

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

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

.PHONY: docs-generate
docs-generate: tools ## Generate documentation for the provider
Expand Down
117 changes: 117 additions & 0 deletions docker-compose.tls.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
services:
elasticsearch:
extends:
file: docker-compose.yml
service: elasticsearch

kibana_settings:
depends_on:
elasticsearch:
condition: service_healthy
extends:
file: docker-compose.yml
service: kibana_settings

kibana_certs:
image: alpine/mkcert:latest
container_name: ${KIBANA_CERTS_CONTAINER_NAME}
restart: 'no'
volumes:
- kibana-certs:/certs
environment:
CAROOT: /certs
entrypoint: ash
command: >
-c '
mkcert --cert-file=/certs/kibana.crt --key-file=/certs/kibana.key kibana ${KIBANA_CONTAINER_NAME} localhost;
chown 1000:1000 /certs/*;
'

kibana:
depends_on:
kibana_settings:
condition: service_completed_successfully
kibana_certs:
condition: service_completed_successfully
extends:
file: docker-compose.yml
service: kibana
volumes:
- dev-kibana:/usr/share/kibana/data
- kibana-certs:/certs:ro
environment:
SERVER_SSL_CERTIFICATE: /certs/kibana.crt
SERVER_SSL_KEY: /certs/kibana.key
SERVER_SSL_ENABLED: true
healthcheck:
test:
[
"CMD-SHELL",
"curl -s --cacert /certs/rootCA.pem -w \"%{http_code}\" https://kibana:5601 | grep -q '302'",
]
interval: 10s
timeout: 10s
retries: 30

fleet_settings:
depends_on:
kibana:
condition: service_healthy
extends:
file: docker-compose.yml
service: fleet_settings
volumes:
- kibana-certs:/certs:ro
environment:
CACERT: --cacert /certs/rootCA.pem
KIBANA_HOST: https://kibana:5601

fleet:
depends_on:
kibana:
condition: service_healthy
extends:
file: docker-compose.yml
service: fleet
volumes:
- dev-fleet:/usr/share/elastic-agent/data
- kibana-certs:/certs:ro
environment:
KIBANA_HOST: https://kibana:5601
KIBANA_CA: /certs/rootCA.pem

acceptance-tests:
profiles: ["acceptance-tests"]
depends_on:
fleet:
condition: service_started
extends:
file: docker-compose.yml
service: acceptance-tests
volumes:
- ./:/provider
- kibana-certs:/certs:ro
environment:
KIBANA_ENDPOINT: https://kibana:5601
KIBANA_CA_CERTS: /certs/rootCA.pem

token-acceptance-tests:
profiles: ["token-acceptance-tests"]
depends_on:
fleet:
condition: service_started
extends:
service: acceptance-tests
volumes:
- ./:/provider
- kibana-certs:/certs:ro
environment:
ELASTICSEARCH_BEARER_TOKEN: ${ELASTICSEARCH_BEARER_TOKEN:-}
KIBANA_USERNAME: elastic
KIBANA_PASSWORD: ${ELASTICSEARCH_PASSWORD}

volumes:
dev-elasticsearch:
dev-kibana:
dev-fleet:
kibana-certs:
Loading