Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
c50945e
Bumped product version to 0.20.1.
hc-github-team-es-release-engineering Sep 25, 2025
a8875a8
backport of commit b0b97ae71e0d18089ca3e107073f4916032fda3b (#6091)
hc-github-team-secure-boundary Sep 26, 2025
da8012b
backport of commit ab521f92c3214d2253709f68d0b8a82191306fea (#6099)
hc-github-team-secure-boundary Sep 30, 2025
27a9866
backport of commit e0ef9be90f27fd56fd8b60d4e3f70a8402a22d84 (#6100)
hc-github-team-secure-boundary Sep 30, 2025
f7ced86
backport of commit 3b9ac7b907de3f245a4b5491ffb2009fe6c05dca (#6105)
hc-github-team-secure-boundary Oct 1, 2025
68185d2
chore(e2e): Update framework to remove boundary_docker_image_name (#6…
hc-github-team-secure-boundary Oct 1, 2025
407f8ff
backport of commit 4a794abbc130254422f93ca4a4a4e84078157106 (#6124)
hc-github-team-secure-boundary Oct 7, 2025
88d9fd9
backport of commit 3e3cb39835a7508a8a12e9b47f071b3e7d808e1f (#6122)
hc-github-team-secure-boundary Oct 7, 2025
0595138
Docs: clarifies supported vault cred library templating parameters (#…
Dan-Heath Oct 9, 2025
baff85b
chore(errors): Add early disconnection error (#6126) (#6135)
AprilMay0 Oct 10, 2025
6284f54
chore(proxy): Reduce noisy error logs (#6136)
AprilMay0 Oct 10, 2025
f02f8bf
Merge pull request #6142 from hashicorp/am-manual-merge-release-0.20.x
AprilMay0 Oct 10, 2025
ac7c152
chore: Update version (#6141)
AprilMay0 Oct 10, 2025
93ac68e
backport of commit a3dadd8c9dd5db1d23b8f65fcd0d73096f236397 (#6147)
hc-github-team-secure-boundary Oct 13, 2025
0125e13
backport of commit 204d8ec011347a89a14cf6b2c28a0f554b327f48 (#6149)
hc-github-team-secure-boundary Oct 13, 2025
1aef0fa
docs: Fix version 0.19.x redirects (#6128) (#6158)
Dan-Heath Oct 15, 2025
5fcc7cf
backport of commit 3cde7d282153dcb8dec10d8d803e08779780112c (#6160)
hc-github-team-secure-boundary Oct 15, 2025
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
1 change: 0 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,6 @@ jobs:
artifact-name: "boundary_${{ needs.set-product-version.outputs.product-version }}_linux_amd64.zip"
go-version: ${{ needs.product-metadata.outputs.go-version }}
edition: ${{ needs.product-metadata.outputs.product-edition }}
docker-image-name: ${{ needs.build-docker.outputs.name }}
docker-image-file: "boundary_default_linux_amd64_${{ needs.set-product-version.outputs.product-version }}_${{ github.sha }}.docker.dev.tar"
secrets: inherit
bats:
Expand Down
4 changes: 0 additions & 4 deletions .github/workflows/enos-run.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@ on:
go-version:
required: true
type: string
docker-image-name:
required: false
type: string
docker-image-file:
required: false
type: string
Expand Down Expand Up @@ -96,7 +93,6 @@ jobs:
ENOS_VAR_crt_bundle_path: ./support/boundary.zip
ENOS_VAR_test_email: ${{ secrets.SERVICE_USER_EMAIL }}
ENOS_VAR_boundary_edition: ${{ inputs.edition }}
ENOS_VAR_boundary_docker_image_name: ${{ inputs.docker-image-name }}
ENOS_VAR_boundary_docker_image_file: ./support/boundary_docker_image.tar
ENOS_VAR_go_version: ${{ inputs.go-version }}
ENOS_VAR_gcp_project_id: ${{ secrets.GCP_PROJECT_ID_CI }}
Expand Down
2 changes: 2 additions & 0 deletions enos/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ following lines
127.0.0.1 localhost worker
127.0.0.1 localhost vault
```
### AWS Credentials
Copy the AWS Account credentials from doormat and set it in the terminal, where the enos commands are run.

## Executing Scenarios
From the `enos` directory:
Expand Down
2 changes: 1 addition & 1 deletion enos/enos-scenario-e2e-docker-base-plus.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ scenario "e2e_docker_base_plus" {
step.build_boundary_docker_image
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
network_name = [local.network_cluster]
database_network = local.network_cluster
postgres_address = step.create_boundary_database.address
Expand Down
2 changes: 1 addition & 1 deletion enos/enos-scenario-e2e-docker-base-with-gcp.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ scenario "e2e_docker_base_with_gcp" {
step.build_boundary_docker_image
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
network_name = [local.network_cluster]
database_network = local.network_cluster
postgres_address = step.create_boundary_database.address
Expand Down
2 changes: 1 addition & 1 deletion enos/enos-scenario-e2e-docker-base-with-vault.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ scenario "e2e_docker_base_with_vault" {
step.build_boundary_docker_image
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
network_name = [local.network_cluster]
database_network = local.network_cluster
postgres_address = step.create_boundary_database.address
Expand Down
4 changes: 2 additions & 2 deletions enos/enos-scenario-e2e-docker-base-with-worker.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ scenario "e2e_docker_base_with_worker" {
step.build_boundary_docker_image
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
network_name = [local.network_cluster, local.network_database]
database_network = local.network_database
postgres_address = step.create_boundary_database.address
Expand Down Expand Up @@ -143,7 +143,7 @@ scenario "e2e_docker_base_with_worker" {
step.create_boundary
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
boundary_license = var.boundary_edition != "oss" ? step.read_license.license : ""
config_file = "worker-config.hcl"
container_name = "worker"
Expand Down
2 changes: 1 addition & 1 deletion enos/enos-scenario-e2e-docker-base.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ scenario "e2e_docker_base" {
step.build_boundary_docker_image
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
network_name = [local.network_cluster]
database_network = local.network_cluster
postgres_address = step.create_boundary_database.address
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ scenario "e2e_docker_worker_registration_controller_led" {
step.build_boundary_docker_image
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
network_name = [local.network_cluster, local.network_database]
database_network = local.network_database
postgres_address = step.create_boundary_database.address
Expand All @@ -113,7 +113,7 @@ scenario "e2e_docker_worker_registration_controller_led" {
depends_on = [step.create_boundary]
variables {
address = step.create_boundary.address
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
network_name = local.network_cluster
login_name = step.create_boundary.login_name
password = step.create_boundary.password
Expand Down Expand Up @@ -157,7 +157,7 @@ scenario "e2e_docker_worker_registration_controller_led" {
step.create_boundary
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
boundary_license = var.boundary_edition != "oss" ? step.read_license.license : ""
config_file = "worker-config-controller-led.hcl"
container_name = "worker"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ scenario "e2e_docker_worker_registration_worker_led" {
step.build_boundary_docker_image
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
network_name = [local.network_cluster, local.network_database]
database_network = local.network_database
postgres_address = step.create_boundary_database.address
Expand Down Expand Up @@ -144,7 +144,7 @@ scenario "e2e_docker_worker_registration_worker_led" {
step.create_boundary
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
boundary_license = var.boundary_edition != "oss" ? step.read_license.license : ""
config_file = "worker-config-worker-led.hcl"
container_name = "worker"
Expand All @@ -165,7 +165,7 @@ scenario "e2e_docker_worker_registration_worker_led" {
]
variables {
address = step.create_boundary.address
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
network_name = local.network_cluster
login_name = step.create_boundary.login_name
password = step.create_boundary.password
Expand Down
4 changes: 2 additions & 2 deletions enos/enos-scenario-e2e-ui-docker.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ scenario "e2e_ui_docker" {
step.build_boundary_docker_image
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
network_name = [local.network_cluster]
database_network = local.network_cluster
postgres_address = step.create_boundary_database.address
Expand Down Expand Up @@ -124,7 +124,7 @@ scenario "e2e_ui_docker" {
step.create_boundary
]
variables {
image_name = matrix.builder == "crt" ? var.boundary_docker_image_name : step.build_boundary_docker_image.image_name
image_name = step.build_boundary_docker_image.image_name
boundary_license = var.boundary_edition != "oss" ? step.read_license.license : ""
config_file = "worker-config.hcl"
container_name = "worker"
Expand Down
6 changes: 0 additions & 6 deletions enos/enos-variables.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,6 @@ variable "enos_user" {
}

# Test configs
variable "boundary_docker_image_name" {
description = "Name:Tag of Docker image to use"
type = string
default = "docker.io/hashicorp/boundary:latest"
}

variable "boundary_docker_image_file" {
description = "Path to Boundary Docker image"
type = string
Expand Down
10 changes: 10 additions & 0 deletions enos/modules/aws_boundary/boundary-instances.tf
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ resource "aws_instance" "controller" {
encrypted = true
}

metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
}

tags = merge(local.common_tags,
{
Name = "${local.name_prefix}-boundary-controller-${count.index}-${split(":", data.aws_caller_identity.current.user_id)[1]}"
Expand Down Expand Up @@ -54,6 +59,11 @@ resource "aws_instance" "worker" {
encrypted = true
}

metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
}

tags = merge(local.common_tags,
{
Name = "${local.name_prefix}-boundary-worker-${count.index}-${split(":", data.aws_caller_identity.current.user_id)[1]}",
Expand Down
8 changes: 6 additions & 2 deletions enos/modules/aws_boundary/rds.tf
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,18 @@ resource "aws_db_subnet_group" "boundary" {
subnet_ids = data.aws_subnets.infra.ids
}

data "aws_rds_engine_version" "default" {
engine = var.db_engine
}

resource "aws_db_instance" "boundary" {
count = var.db_create == true ? 1 : 0
identifier = "boundary-db-${random_string.cluster_id.result}"
allocated_storage = var.db_storage
storage_type = var.db_storage_type
iops = var.db_storage_iops
engine = var.db_engine
engine_version = var.db_engine == "aurora-postgres" ? null : var.db_version
engine = data.aws_rds_engine_version.default.engine
engine_version = data.aws_rds_engine_version.default.version
instance_class = var.db_class
monitoring_interval = var.db_monitoring_interval
monitoring_role_arn = var.db_monitoring_role_arn
Expand Down
8 changes: 1 addition & 7 deletions enos/modules/aws_boundary/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -136,12 +136,6 @@ variable "db_class" {
default = "db.t4g.small"
}

variable "db_version" {
description = "AWS RDS DBS engine version (for postgres/mysql)"
type = string
default = "15.7"
}

variable "db_engine" {
description = "AWS RDS DB engine type"
type = string
Expand Down Expand Up @@ -406,4 +400,4 @@ variable "vault_transit_token" {
description = "vault token used for kms transit in the boundary config"
type = string
default = ""
}
}
1 change: 1 addition & 0 deletions enos/modules/aws_rdp_domain_controller/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@ resource "aws_instance" "domain_controller" {

metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
instance_metadata_tags = "enabled"
}
get_password_data = true
Expand Down
1 change: 1 addition & 0 deletions enos/modules/aws_rdp_member_server/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@ ${var.domain_admin_password}

metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
instance_metadata_tags = "enabled"
}
get_password_data = true
Expand Down
1 change: 1 addition & 0 deletions enos/modules/aws_rdp_member_server_with_worker/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,7 @@ ${var.domain_admin_password}

metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
instance_metadata_tags = "enabled"
}
get_password_data = true
Expand Down
7 changes: 6 additions & 1 deletion enos/modules/aws_target/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -126,13 +126,18 @@ resource "aws_instance" "target" {
"Type" : "target",
"Project" : "Enos",
"Project Name" : "qti-enos-boundary",
"Environment" : var.environment
"Environment" : var.environment,
"Enos User" : var.enos_user,
})

root_block_device {
encrypted = true
}

metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
}
}

resource "enos_remote_exec" "wait" {
Expand Down
5 changes: 5 additions & 0 deletions enos/modules/aws_vault/vault-instances.tf
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ resource "aws_instance" "vault_instance" {
Type = local.vault_cluster_tag
},
)

metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
}
}

resource "enos_remote_exec" "install_dependencies" {
Expand Down
1 change: 1 addition & 0 deletions enos/modules/aws_windows_client/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ resource "aws_instance" "client" {

metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
instance_metadata_tags = "enabled"
}
get_password_data = true
Expand Down
5 changes: 5 additions & 0 deletions enos/modules/aws_worker/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,11 @@ resource "aws_instance" "worker" {
Name = "${var.name_prefix}-boundary-worker-${split(":", data.aws_caller_identity.current.user_id)[1]}",
},
)

metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
}
}

resource "enos_bundle_install" "worker" {
Expand Down
15 changes: 15 additions & 0 deletions enos/modules/build_boundary_docker_crt/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,21 @@ resource "enos_local_exec" "load_docker_image" {
inline = ["docker load -i ${var.path}"]
}

locals {
boundary_docker_image_name = replace(
element(
split("\n", trimspace(enos_local_exec.load_docker_image.stdout)),
-1
),
"Loaded image: ",
""
)
}

output "cli_zip_path" {
value = var.cli_build_path
}

output "image_name" {
value = local.boundary_docker_image_name
}
10 changes: 9 additions & 1 deletion internal/daemon/worker/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,15 @@ func (w *Worker) handleProxy(listenerCfg *listenerutil.ListenerConfig, sessionMa
runProxy, err := handleProxyFn(ctx, ctx, decryptFn, cc, pDialer, acResp.GetConnectionId(), protocolCtx, w.recorderManager, proxyHandlers.WithLogger(w.logger))
if err != nil {
conn.Close(proxyHandlers.WebsocketStatusProtocolSetupError, "unable to setup proxying")
event.WriteError(ctx, op, err)

switch {
case errors.Match(errors.T(errors.WindowsRDPClientEarlyDisconnection), err):
// This is known behavior with Windows Remote Desktop clients and does not
// indicate a problem with the worker or the proxy.
// There is no need to log an error event here.
default:
event.WriteError(ctx, op, err)
}
return
}

Expand Down
3 changes: 3 additions & 0 deletions internal/errors/code.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ const (
InvalidListToken Code = 136 // InvalidListToken represents an error where the provided list token is invalid
Paused Code = 137 // Paused represents an error when an operation cannot be completed because the thing being operated on is paused

// Note: Currently unused in OSS
WindowsRDPClientEarlyDisconnection Code = 138 // WindowsRDPClientEarlyDisconnection represents an error when a Windows RDP client disconnects early, a known behavior with Windows Remote Desktop clients

AuthAttemptExpired Code = 198 // AuthAttemptExpired represents an expired authentication attempt
AuthMethodInactive Code = 199 // AuthMethodInactive represents an error that means the auth method is not active.

Expand Down
5 changes: 5 additions & 0 deletions internal/errors/code_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,11 @@ func TestCode_Both_String_Info(t *testing.T) {
c: Paused,
want: Paused,
},
{
name: "WindowsRDPClientEarlyDisconnection",
c: WindowsRDPClientEarlyDisconnection,
want: WindowsRDPClientEarlyDisconnection,
},
{
name: "ImmutableColumn",
c: ImmutableColumn,
Expand Down
4 changes: 4 additions & 0 deletions internal/errors/info.go
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,10 @@ var errorCodeInfo = map[Code]Info{
Message: "paused",
Kind: State,
},
WindowsRDPClientEarlyDisconnection: {
Message: "rdp client disconnected early",
Kind: State,
},
ExternalPlugin: {
Message: "plugin error",
Kind: External,
Expand Down
2 changes: 1 addition & 1 deletion internal/gen/controller.swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"info": {
"title": "Boundary controller HTTP API",
"description": "Welcome to the Boundary controller HTTP API documentation. This page provides a reference guide for using the Boundary controller API, a JSON-based HTTP API. The API implements commonly seen HTTP API patterns for status codes, paths, and errors. See the [API overview](https://developer.hashicorp.com/boundary/docs/api-clients/api) for more information.\n\nBefore you read this page, it is useful to understand Boundary's [domain model](https://developer.hashicorp.com/boundary/docs/concepts/domain-model) and to be aware of the terminology used here. To get started, search for the service you want to interact with in the sidebar to the left. Each resource in Boundary, such as accounts and credential stores, has its own service. Each service contains all the API endpoints for the resource.\n## Status codes\n- `2XX`: Boundary returns a code between `200` and `299` on success. Generally this is `200`, but implementations should be prepared to accept any `2XX` status code as indicating success. If a call returns a `2XX` code that is not `200`, it follows well-understood semantics for those status codes.\n- `400`: Boundary returns `400` when a command cannot be completed due to invalid user input, except for a properly-formatted identifier that does not map to an existing resource, which returns a `404` as discussed below.\n- `401`: Boundary returns `401` if no authentication token is provided or if the provided token is invalid. A valid token that simply does not have permission for a resource returns a `403` instead. A token that is invalid or missing, but where the anonymous user (`u_anon`) is able to successfully perform the action, will not return a `401` but instead will return the result of the action.\n- `403`: Boundary returns `403` if a provided token was valid but does not have the grants required to perform the requested action.\n- `404`: Boundary returns `404` if a resource cannot be found. Note that this happens _prior_ to authentication/authorization checking in nearly all cases as the resource information (such as its scope, available actions, etc.) is a required part of that check. As a result, an action against a resource that does not exist returns a `404` instead of a `401` or `403`. While this could be considered an information leak, since IDs are randomly generated and this only discloses whether an ID is valid, it's tolerable as it allows for far simpler and more robust client implementation.\n- `405`: Boundary returns a `405` to indicate that the method (HTTP verb or custom action) is not implemented for the given resource.\n- `429`: Boundary returns a `429` if any of the API rate limit quotas have been exhausted for the resource and action. It includes the `Retry-After` header so that the client knows how long to wait before making a new request.\n- `500`: Boundary returns `500` if an error occurred that is not (directly) tied to invalid user input. If a `500` is generated, information about the error is logged to Boundary's server log but is not generally provided to the client.\n- `503`: Boundary returns a `503` if it is unable to store a quota due to the API rate limit being exceeded. It includes the `Retry-After` header so that the client knows how long to wait before making a new request.\n## List pagination\nBoundary uses [API pagination](https://developer.hashicorp.com/boundary/docs/api-clients/api/pagination) to support searching and filtering large lists of results efficiently.",
"version": "0.20.0",
"version": "0.20.1",
"contact": {
"name": "HashiCorp Boundary",
"url": "https://www.boundaryproject.io/"
Expand Down
Loading