diff --git a/Makefile b/Makefile index 9069b7d76..ca63a790a 100644 --- a/Makefile +++ b/Makefile @@ -221,28 +221,31 @@ performance-test: ## Run performance tests $(CONTAINER_CLITOOL) run -v ${PWD}:/home/nginx/$(CONTAINER_VOLUME_FLAGS) --rm nginx-agent-benchmark:1.0.0 integration-test: - PACKAGES_REPO=${OSS_PACKAGES_REPO} INSTALL_FROM_REPO=${INSTALL_FROM_REPO} PACKAGE_NAME=${PACKAGE_NAME} BASE_IMAGE=${BASE_IMAGE} IMAGE_PATH=$(IMAGE_PATH) TAG=${IMAGE_TAG} \ - OS_VERSION=${OS_VERSION} OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} DOCKERFILE_PATH=$(DOCKERFILE_PATH) \ + PACKAGES_REPO=${OSS_PACKAGES_REPO} INSTALL_FROM_REPO=${INSTALL_FROM_REPO} PACKAGE_NAME=${PACKAGE_NAME} BASE_IMAGE=${BASE_IMAGE} IMAGE_PATH=${IMAGE_PATH} TAG=${IMAGE_TAG} \ + OS_VERSION=${OS_VERSION} OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} DOCKERFILE_PATH=${DOCKERFILE_PATH} \ ${GOTEST} -v ./test/integration/install - PACKAGES_REPO=${OSS_PACKAGES_REPO} INSTALL_FROM_REPO=${INSTALL_FROM_REPO} PACKAGE_NAME=${PACKAGE_NAME} BASE_IMAGE=${BASE_IMAGE} BUILD_TARGET="install-agent-local" IMAGE_PATH=$(IMAGE_PATH) TAG=${IMAGE_TAG} \ - OS_VERSION=${OS_VERSION} OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} DOCKERFILE_PATH=$(DOCKERFILE_PATH) \ + PACKAGES_REPO=${OSS_PACKAGES_REPO} INSTALL_FROM_REPO=${INSTALL_FROM_REPO} PACKAGE_NAME=${PACKAGE_NAME} BASE_IMAGE=${BASE_IMAGE} BUILD_TARGET="install-agent-local" IMAGE_PATH=${IMAGE_PATH} TAG=${IMAGE_TAG} \ + OS_VERSION=${OS_VERSION} OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} DOCKERFILE_PATH=${DOCKERFILE_PATH} \ ${GOTEST} -v ./test/integration/api - PACKAGES_REPO=${OSS_PACKAGES_REPO} INSTALL_FROM_REPO=${INSTALL_FROM_REPO} PACKAGE_NAME=${PACKAGE_NAME} BASE_IMAGE=${BASE_IMAGE} BUILD_TARGET="install-agent-local" IMAGE_PATH=$(IMAGE_PATH) TAG=${IMAGE_TAG} \ - OS_VERSION=${OS_VERSION} OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} DOCKERFILE_PATH=$(DOCKERFILE_PATH) \ + PACKAGES_REPO=${OSS_PACKAGES_REPO} INSTALL_FROM_REPO=${INSTALL_FROM_REPO} PACKAGE_NAME=${PACKAGE_NAME} BASE_IMAGE=${BASE_IMAGE} BUILD_TARGET="install-agent-local" IMAGE_PATH=${IMAGE_PATH} TAG=${IMAGE_TAG} \ + OS_VERSION=${OS_VERSION} OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} DOCKERFILE_PATH=${DOCKERFILE_PATH} \ ${GOTEST} -v ./test/integration/features - PACKAGES_REPO=${OSS_PACKAGES_REPO} INSTALL_FROM_REPO=${INSTALL_FROM_REPO} PACKAGE_NAME=${PACKAGE_NAME} BASE_IMAGE=${BASE_IMAGE} BUILD_TARGET="install-agent-local" IMAGE_PATH=$(IMAGE_PATH) TAG=${IMAGE_TAG} \ - OS_VERSION=${OS_VERSION} OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} DOCKERFILE_PATH=$(DOCKERFILE_PATH) \ + PACKAGES_REPO=${OSS_PACKAGES_REPO} INSTALL_FROM_REPO=${INSTALL_FROM_REPO} PACKAGE_NAME=${PACKAGE_NAME} BASE_IMAGE=${BASE_IMAGE} BUILD_TARGET="install-agent-local" IMAGE_PATH=${IMAGE_PATH} TAG=${IMAGE_TAG} \ + OS_VERSION=${OS_VERSION} OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} DOCKERFILE_PATH=${DOCKERFILE_PATH} \ ${GOTEST} -v ./test/integration/grpc + PACKAGES_REPO=${OSS_PACKAGES_REPO} INSTALL_FROM_REPO=${INSTALL_FROM_REPO} PACKAGE_NAME=${PACKAGE_NAME} BASE_IMAGE=${BASE_IMAGE} BUILD_TARGET="install-agent-local" IMAGE_PATH=${IMAGE_PATH} TAG=${IMAGE_TAG} \ + OS_VERSION=${OS_VERSION} OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} DOCKERFILE_PATH=${DOCKERFILE_PATH} \ + ${GOTEST} -v ./test/integration/upgrade official-image-integration-test: - PACKAGES_REPO=${OSS_PACKAGES_REPO} PACKAGE_NAME=${PACKAGE_NAME} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} BASE_IMAGE=${BASE_IMAGE} IMAGE_PATH=$(IMAGE_PATH) TAG=${TAG} ARCH=${OSARCH} OS_VERSION=${OS_VERSION} BUILD_TARGET="install" \ - OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} DOCKERFILE_PATH=$(OFFICIAL_IMAGE_DOCKERFILE_PATH) \ + PACKAGES_REPO=${OSS_PACKAGES_REPO} PACKAGE_NAME=${PACKAGE_NAME} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} BASE_IMAGE=${BASE_IMAGE} IMAGE_PATH=${IMAGE_PATH} TAG=${TAG} ARCH=${OSARCH} OS_VERSION=${OS_VERSION} BUILD_TARGET="install" \ + OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} DOCKERFILE_PATH=${OFFICIAL_IMAGE_DOCKERFILE_PATH} \ ${GOTEST} -v ./test/integration/features - PACKAGES_REPO=${OSS_PACKAGES_REPO} PACKAGE_NAME=${PACKAGE_NAME} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} BASE_IMAGE=${BASE_IMAGE} IMAGE_PATH=$(IMAGE_PATH) TAG=${TAG} ARCH=${OSARCH} OS_VERSION=${OS_VERSION} BUILD_TARGET="install" \ - OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} DOCKERFILE_PATH=$(OFFICIAL_IMAGE_DOCKERFILE_PATH) \ + PACKAGES_REPO=${OSS_PACKAGES_REPO} PACKAGE_NAME=${PACKAGE_NAME} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} BASE_IMAGE=${BASE_IMAGE} IMAGE_PATH=${IMAGE_PATH} TAG=${TAG} ARCH=${OSARCH} OS_VERSION=${OS_VERSION} BUILD_TARGET="install" \ + OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} DOCKERFILE_PATH=${OFFICIAL_IMAGE_DOCKERFILE_PATH} \ ${GOTEST} -v ./test/integration/grpc - PACKAGES_REPO=${OSS_PACKAGES_REPO} PACKAGE_NAME=${PACKAGE_NAME} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} BASE_IMAGE=${BASE_IMAGE} IMAGE_PATH=$(IMAGE_PATH) TAG=${TAG} ARCH=${OSARCH} OS_VERSION=${OS_VERSION} BUILD_TARGET="install" \ - OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} DOCKERFILE_PATH=$(OFFICIAL_IMAGE_DOCKERFILE_PATH) \ + PACKAGES_REPO=${OSS_PACKAGES_REPO} PACKAGE_NAME=${PACKAGE_NAME} CONTAINER_NGINX_IMAGE_REGISTRY=${CONTAINER_NGINX_IMAGE_REGISTRY} BASE_IMAGE=${BASE_IMAGE} IMAGE_PATH=${IMAGE_PATH} TAG=${TAG} ARCH=${OSARCH} OS_VERSION=${OS_VERSION} BUILD_TARGET="install" \ + OS_RELEASE=${OS_RELEASE} CONTAINER_OS_TYPE=${CONTAINER_OS_TYPE} DOCKERFILE_PATH=${OFFICIAL_IMAGE_DOCKERFILE_PATH} \ ${GOTEST} -v ./test/integration/api test-performance-run: ## Run benchmark performance tests diff --git a/scripts/workflow/generate_results.sh b/scripts/workflow/generate_results.sh index cd5dd9682..d5c6af5fa 100644 --- a/scripts/workflow/generate_results.sh +++ b/scripts/workflow/generate_results.sh @@ -32,20 +32,9 @@ DURATION=$(echo "$END_SECONDS - $START_SECONDS" | bc) MSG="" # individual test msg FAIL_MSG="" # msg for entire job run -RESULT="" HAS_FAILED=false IS_RUNNING=false -load_job_status(){ - if [ "$JOB_RESULT" == "success" ]; then - RESULT="pass" - elif [ "$JOB_RESULT" == "failure" ]; then - RESULT="fail" - else - RESULT="skip" - fi -} - format_logs_to_json(){ line="$1" json="{" @@ -110,6 +99,5 @@ format_results(){ # Main body of the script { - load_job_status format_results } diff --git a/test/docker/nginx-official-image/deb/Dockerfile b/test/docker/nginx-official-image/deb/Dockerfile index f8a9c9bb5..00869783b 100644 --- a/test/docker/nginx-official-image/deb/Dockerfile +++ b/test/docker/nginx-official-image/deb/Dockerfile @@ -13,9 +13,9 @@ ARG CONTAINER_OS_TYPE WORKDIR /agent COPY ./build/${PACKAGE_NAME}.${CONTAINER_OS_TYPE} /agent/build/${PACKAGE_NAME}.${CONTAINER_OS_TYPE} -RUN apt-get update \ - && apt install --no-install-recommends --no-install-suggests --allow-downgrades -y /agent/build/${PACKAGE_NAME}.${CONTAINER_OS_TYPE} \ - && rm /agent/build/${PACKAGE_NAME}.${CONTAINER_OS_TYPE} +RUN apt-get update \ + && apt install --no-install-recommends --no-install-suggests --allow-downgrades -y /agent/build/${PACKAGE_NAME}.${CONTAINER_OS_TYPE} \ + && rm /agent/build/${PACKAGE_NAME}.${CONTAINER_OS_TYPE} RUN unlink /var/log/nginx/access.log RUN unlink /var/log/nginx/error.log diff --git a/test/docker/nginx-oss/deb/Dockerfile b/test/docker/nginx-oss/deb/Dockerfile index 8fc77e7f4..5300a1efa 100644 --- a/test/docker/nginx-oss/deb/Dockerfile +++ b/test/docker/nginx-oss/deb/Dockerfile @@ -24,7 +24,6 @@ RUN set -x \ lsb-release \ procps \ nginx - # Setup nginx agent repository RUN curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null \ && printf "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://${PACKAGES_REPO}/nginx-agent/${OS_RELEASE}/ `lsb_release -cs` agent\n" > /etc/apt/sources.list.d/nginx-agent.list diff --git a/test/docker/nginx-oss/rpm/Dockerfile b/test/docker/nginx-oss/rpm/Dockerfile index fa4ec6b9b..9a32aae02 100644 --- a/test/docker/nginx-oss/rpm/Dockerfile +++ b/test/docker/nginx-oss/rpm/Dockerfile @@ -21,11 +21,15 @@ RUN if [ "$OS_VERSION" = "2" ] && [ "$OS_RELEASE" = "amazonlinux" ]; \ fi RUN if [ "$OS_RELEASE" = "amazonlinux" ]; \ - then yum install -y shadow-utils; \ + then yum install -y shadow-utils && yum install -y findutils; \ fi RUN if [ "$OS_RELEASE" = "centos" ] && [ "$OS_VERSION" = "7" ]; \ then yum install -y epel-release; \ + fi + +RUN if [ "$OS_RELEASE" = "rockylinux" ] && [ "$OS_VERSION" = "8" ]; \ + then yum install -y findutils; \ fi RUN if [ "$OS_RELEASE" = "redhatenterprise" ] && [ "$OS_VERSION" != "9" ]; \ @@ -87,7 +91,7 @@ FROM install-nginx as install-agent-local ARG PACKAGE_NAME -RUN yum localinstall -y /agent/build/${PACKAGE_NAME}.rpm +RUN yum localinstall -y /agent/build/$PACKAGE_NAME.rpm FROM install-nginx as install-agent-repo diff --git a/test/integration/upgrade/nginx-oss.conf b/test/integration/upgrade/nginx-oss.conf new file mode 100644 index 000000000..576c0591e --- /dev/null +++ b/test/integration/upgrade/nginx-oss.conf @@ -0,0 +1,49 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" ' + '"$bytes_sent" "$request_length" "$request_time" ' + '"$gzip_ratio" $server_protocol '; + + access_log /var/log/nginx/access.log main; + + sendfile on; + keepalive_timeout 65; + + server { + listen 8080; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + ## + # Enable Metrics + ## + location /api { + stub_status; + allow 127.0.0.1; + deny all; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } +} diff --git a/test/integration/upgrade/nginx-plus.conf b/test/integration/upgrade/nginx-plus.conf new file mode 100644 index 000000000..48ae54ecd --- /dev/null +++ b/test/integration/upgrade/nginx-plus.conf @@ -0,0 +1,49 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" ' + '"$bytes_sent" "$request_length" "$request_time" ' + '"$gzip_ratio" $server_protocol '; + + access_log /var/log/nginx/access.log main; + + sendfile on; + keepalive_timeout 65; + + server { + listen 8080; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + ## + # Enable Metrics + ## + location /api/ { + api write=on; + allow 127.0.0.1; + deny all; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } +} diff --git a/test/integration/upgrade/test_configs/nginx-agent.conf b/test/integration/upgrade/test_configs/nginx-agent.conf new file mode 100644 index 000000000..e5571b229 --- /dev/null +++ b/test/integration/upgrade/test_configs/nginx-agent.conf @@ -0,0 +1,57 @@ +# +# /etc/nginx-agent/nginx-agent.conf +# +# Configuration file for NGINX Agent. +# +# This file is to track NGINX Agent configuration values that are meant to be statically set. There +# are additional NGINX Agent configuration values that are set via the API and NGINX Agent install script +# which can be found in /var/lib/nginx-agent/agent-dynamic.conf. + +log: + # set log level (panic, fatal, error, info, debug, trace; default "info") + level: info + # set log path. if empty, don't log to file. + path: /var/log/nginx-agent/ +# data plane status message / 'heartbeat' +nginx: + # path of NGINX logs to exclude + exclude_logs: "" + socket: "unix:/var/run/nginx-agent/nginx.sock" + +server: + host: 127.0.0.1 + grpcPort: 9091 + token: "" +tls: + enable: true + skip_verify: true + +dataplane: + status: + # poll interval for data plane status - the frequency the NGINX Agent will query the dataplane for changes + poll_interval: 30s + # report interval for data plane status - the maximum duration to wait before syncing dataplane information if no updates have being observed + report_interval: 24h + +metrics: + # specify the size of a buffer to build before sending metrics + bulk_size: 20 + # specify metrics poll interval + report_interval: 1m + collection_interval: 15s + mode: aggregated + +# OSS NGINX default config path +# path to aux file dirs can also be added +config_dirs: "/etc/nginx:/usr/local/etc/nginx:/usr/share/nginx/modules:/etc/nms" + + # api: + # The port at which NGINX Agent accepts remote connections + # The API address and port allow for remote management of NGINX and NGINX Agent + # + # ~~~ WARNING ~~~ + # Set API address to allow remote management + # host: 127.0.0.1 + # + # Set this value to a secure port number to prevent information leaks. + # port: 8038 diff --git a/test/integration/upgrade/test_configs/valid-v3-nginx-agent.conf b/test/integration/upgrade/test_configs/valid-v3-nginx-agent.conf new file mode 100644 index 000000000..c4ccd0b76 --- /dev/null +++ b/test/integration/upgrade/test_configs/valid-v3-nginx-agent.conf @@ -0,0 +1,22 @@ +# /etc/nginx-agent/nginx-agent.conf + +log: + level: info + path: /var/log/nginx-agent/ + +allowed_directories: + - /etc/nginx + - /usr/local/etc/nginx + - /usr/share/nginx/modules + - /etc/nms + - /var/log/nginx + - /etc/app_protect + +command: + server: + host: 127.0.0.1 + port: 443 + auth: + token: + tls: + skip_verify: false diff --git a/test/integration/upgrade/upgrade_test.go b/test/integration/upgrade/upgrade_test.go new file mode 100644 index 000000000..c6dc04153 --- /dev/null +++ b/test/integration/upgrade/upgrade_test.go @@ -0,0 +1,184 @@ +package upgrade + +import ( + "bytes" + "context" + "io" + "os" + "regexp" + "strconv" + "strings" + "testing" + "time" + + "github.com/nginx/agent/test/integration/utils" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" +) + +const ( + maxFileSize = 70000000 // Max Size: 70 MB + maxUpgradeTime = 30 * time.Second +) + +var ( + osRelease = os.Getenv("OS_RELEASE") + serverHost = map[string]string{ + "NGINX_AGENT_SERVER_HOST": "127.0.0.1", + } + + expectedUpgradeLogMsgs = map[string]string{ + "UpgradeFoundNginxAgent": "Found nginx-agent /usr/bin/nginx-agent", + "UpgradeAgentSuccess": "NGINX Agent package has been successfully installed.", + "UpgradeAgentStartCmd": "sudo systemctl start nginx-agent", + } +) + +func TestUpgradeV2ToV3(t *testing.T) { + // skip alpine due to upgrade script issues until bug is resolved + if strings.Contains(osRelease, "alpine") { + t.Skip("Skipping test because of alpine upgrade issues") + } + + log.Info("testing agent upgrade to v3") + ctx := context.Background() + containerNetwork := utils.CreateContainerNetwork(ctx, t) + + nginxConf := "./nginx-oss.conf" + if os.Getenv("IMAGE_PATH") == "/nginx-plus/agent" { + nginxConf = "./nginx-plus.conf" + } + + params := &utils.Parameters{ + NginxAgentConfigPath: "./test_configs/nginx-agent.conf", + NginxConfigPath: nginxConf, + LogMessage: "NGINX Agent v", + ServerHost: serverHost, + } + + testContainer := utils.StartContainer( + ctx, + t, + containerNetwork, + params, + ) + + // upgrade the agent to v3, check the upgrade time and verify the logs + verifyAgentUpgrade(ctx, t, testContainer) + + // check the output of nginx-agent --version + verifyAgentVersion(ctx, t, testContainer) + + // check the size of the upgraded agent package + verifyAgentPackageSize(ctx, t, testContainer) + + // validate the nginx-agent config is upgraded and correct + verifyAgentConfigFile(ctx, t, testContainer) + + log.Info("finished testing agent upgrade to v3") +} + +func verifyAgentUpgrade(ctx context.Context, t *testing.T, testContainer testcontainers.Container) { + upgradeTime, cmdOut := upgradeAgent(ctx, t, testContainer) + + assert.LessOrEqual(t, upgradeTime, maxUpgradeTime) + t.Log("upgrade time:", upgradeTime) + + upgradeLog, err := io.ReadAll(cmdOut) + require.NoError(t, err) + t.Log("upgrade log:", string(upgradeLog)) + + for _, logMsg := range expectedUpgradeLogMsgs { + assert.Contains(t, string(upgradeLog), logMsg) + } +} + +func verifyAgentVersion(ctx context.Context, t *testing.T, testContainer testcontainers.Container) { + exitCode, agentVersionString, err := testContainer.Exec(ctx, []string{"nginx-agent", "--version"}) + require.NoError(t, err) + assert.Equal(t, 0, exitCode) + + agentVersion, err := io.ReadAll(agentVersionString) + require.NoError(t, err) + assert.Contains(t, string(agentVersion), "nginx-agent version v3.") + t.Log("agent version:", string(agentVersion)) +} + +func verifyAgentPackageSize(ctx context.Context, t *testing.T, testContainer testcontainers.Container) { + var packageSizeCmd []string + + if strings.Contains(osRelease, "ubuntu") || strings.Contains(osRelease, "debian") { + packageSizeCmd = []string{"dpkg-query", "-W", "--showformat=${Installed-Size}", "nginx-agent"} + } else if strings.Contains(osRelease, "alpine") { + packageSizeCmd = []string{"apk", "info", "-f", "nginx-agent", "--size"} + } else { + packageSizeCmd = []string{"rpm", "-q", "--queryformat", "%{SIZE}", "nginx-agent"} + } + + exitCode, packageSizeContent, err := testContainer.Exec(ctx, packageSizeCmd) + require.NoError(t, err) + assert.Equal(t, 0, exitCode) + + packageSizeBytes, err := io.ReadAll(packageSizeContent) + require.NoError(t, err) + + re := regexp.MustCompile(`\d+`) + packageSizeStr := re.Find(packageSizeBytes) + packageSize, err := strconv.Atoi(string(packageSizeStr)) + require.NoError(t, err) + + // convert apt package size from KB to bytes + if strings.Contains(osRelease, "ubuntu") || strings.Contains(osRelease, "debian") { + packageSize *= 1024 + } + + assert.LessOrEqual(t, packageSize, maxFileSize) + t.Log("package size:", packageSize) +} + +func verifyAgentConfigFile(ctx context.Context, t *testing.T, testContainer testcontainers.Container) { + agentConfigContent, err := testContainer.CopyFileFromContainer(ctx, "/etc/nginx-agent/nginx-agent.conf") + require.NoError(t, err) + + agentConfig, err := io.ReadAll(agentConfigContent) + require.NoError(t, err) + + expectedConfig, err := os.ReadFile("./test_configs/valid-v3-nginx-agent.conf") + require.NoError(t, err) + + expectedConfig = bytes.TrimSpace(expectedConfig) + agentConfig = bytes.TrimSpace(agentConfig) + + assert.Equal(t, string(expectedConfig), string(agentConfig)) + t.Log("agent config:", string(agentConfig)) +} + +func upgradeAgent(ctx context.Context, t *testing.T, testContainer testcontainers.Container) (time.Duration, io.Reader) { + var updatePkgCmd []string + var upgradeAgentCmd []string + + if strings.Contains(osRelease, "ubuntu") || strings.Contains(osRelease, "debian") { + updatePkgCmd = []string{"apt-get", "update"} + upgradeAgentCmd = []string{"apt-get", "install", "-y", "--only-upgrade", "nginx-agent", "-o", "Dpkg::Options::=--force-confold"} + } else if strings.Contains(osRelease, "alpine") { + updatePkgCmd = []string{"apk", "update"} + upgradeAgentCmd = []string{"apk", "add", "nginx-agent=3.2.1"} + } else { + updatePkgCmd = []string{"yum", "-y", "makecache"} + upgradeAgentCmd = []string{"yum", "update", "-y", "nginx-agent"} + } + + exitCode, _, err := testContainer.Exec(ctx, updatePkgCmd) + require.NoError(t, err) + assert.Equal(t, 0, exitCode) + + start := time.Now() + + exitCode, cmdOut, err := testContainer.Exec(ctx, upgradeAgentCmd) + require.NoError(t, err) + assert.Equal(t, 0, exitCode) + + return time.Since(start), cmdOut +} diff --git a/test/integration/utils/test_container_utils.go b/test/integration/utils/test_container_utils.go index 77031b3ac..8310ef5b0 100644 --- a/test/integration/utils/test_container_utils.go +++ b/test/integration/utils/test_container_utils.go @@ -29,6 +29,7 @@ type Parameters struct { NginxConfigPath string NginxAgentConfigPath string LogMessage string + ServerHost map[string]string } func StartContainer( @@ -73,6 +74,7 @@ func StartContainer( buildOptions.Target = buildTarget }, }, + Env: parameters.ServerHost, ExposedPorts: []string{"9091/tcp"}, WaitingFor: wait.ForLog(parameters.LogMessage), HostConfigModifier: func(hostConfig *container.HostConfig) {